副本的放置:第一个创世块
对于HDFS的数据块,原文标题是Replica Placement: The First Baby Steps,在这里我翻译为创世块,以前我研究“区块链”,里面有“创世块”的说法,就是第一个块,这样拿来就用,虽然不够准确但是足够我现在应急了(笑)。
副本的放置对HDFS的可靠性和性能至关重要。 优化副本放置将HDFS与大多数其他分布式文件系统区分开来。 这是一个需要大量调整和经验的功能。 机架感知机制对于复制品放置的策略提高数据可靠性、可用性和网络带宽利用率。
大型HDFS集群运行在通常分布在多个机架上的计算机上。 不同机架中的两个节点之间的通信必须经过交换机。 在大多数情况下,同一机架中的机器之间的网络带宽大于不同机架中的机器之间的网络带宽。
NameNode通过Hadoop Rack Awareness中概述的过程确定每个DataNode所属的机架标识。一个简单但不是最佳的策略是将副本放在单独的机架上。 这可以防止整个机架出现故障时丢失数据,并允许在读取数据时使用多个机架的带宽。 此策略在集群中均匀分配副本,以便轻松平衡组件故障的负载。 但是,此策略会增加写入成本,原因就是写入需要将块传输到多个机架。
对于常见的情况,当复制因子为3时,HDFS的放置策略是在本地机器上放置一个副本(如果写入器位于datanode上),否则随机放置在datanode上,另一个副本放置在相同机架上的datanode节点,最后一个在同一个机房不同机架的datanode节点上。 这个策略削减了不同机架间写入流量,这通常会提高写入性能。 机架故障的几率远远小于节点故障的几率; 此政策不影响数据可靠性和可用性保证。 但是,它确实降低了读取数据时使用的网络带宽总和,因为块只能放在两个唯一的机架上,而不是三个。 使用此策略,文件的副本不会均匀分布在机架上。 三分之一的副本在一个节点上,三分之二的副本在一个机架上,另外三分之一在其余机架上均匀分布。 此策略可提高写入性能,而不会影响数据可靠性或读取性能。
如果复制因子大于3,则第四和以下副本的放置是随机确定的,同时保持每个机架的复制数量低于上限(基本上(副本- 1)/机架+ 2)。
由于NameNode不允许同一个DataNode具有同一个块的多个副本,因此创建的最大副本数是当时的DataNode总数。
将对“ 存储类型和存储策略”的支持添加到HDFS之后,除了上述的机架认知之外,NameNode还将副本放置的策略考虑在内。 NameNode首先选择基于机架感知的节点,然后检查候选节点是否具有与该文件关联的策略所需的存储。 如果候选节点不具有存储类型,则NameNode会查找另一个节点。 如果在第一个路径中找不到足够的节点来放置副本,NameNode会在第二个路径中回退查找具有存储类型的节点。
副本选择
为了尽量减少全局带宽消耗和读取延迟,HDFS会尝试发送满足最接近读请求点的副本。 如果在与读请求节点相同的机架上存在副本,则该副本优选地满足读取请求。 如果HDFS群集跨越多个数据中心,则驻留在本地数据中心的副本优先于任何远程副本。
安全模式
在启动时,NameNode进入一个称为Safemode的特殊状态。 当NameNode处于安全模式状态时,不会发生数据块的复制。 NameNode接收来自DataNode的Heartbeat和Blockreport消息。 Blockreport包含DataNode托管的数据块列表。 每个块都有一个指定的最小数量的副本。 当该数据块的最小副本数与NameNode签入时,将认为该块被安全地复制。 在安全复制数据块的可配置百分比检入NameNode(再加上30秒)之后,NameNode退出安全模式状态。 然后确定仍然少于指定副本数量的数据块列表(如果有的话)。 NameNode然后将这些块复制到其他DataNode。
=======拓展=======
Hadoop Rack Awareness
hadoop机架意识
Hadoop组件能够感知机架。 例如,HDFS块放置将通过将块副本放置在不同的机架上来进行容错。 这提高了在群集发生网络交换机故障或分区时的数据可用性。
Hadoop主守护进程通过调用配置文件指定的外部脚本或Java类来获取集群中datanode的机架标识。使用java类或外部脚本进行拓扑,输出必须遵循java的org.apache.hadoop.net.DNSToSwitchMapping接口。 接口需要维护一对一的对应关系,拓扑信息的格式为“/ myrack / myhost”,其中“/”是拓扑分隔符,“myrack”是机架标识符,“myhost”是个人主机。 假设每个机架上只有一个 “/24”的子网,则可以使用“/192.168.100.0/192.168.100.5”的格式作为唯一的机架式主机拓扑映射(在哪个机架上,在那个主机上用“/”分隔)。
要使用java类进行拓扑映射,类名由配置文件中的net.topology.node.switch.mapping.impl参数指定。有个例子,NetworkTopology.java包含在hadoop发行版中,可以由Hadoop管理员自定义。 使用Java类而不是外部脚本具有性能方面的好处,即在新的工作节点注册自己时,Hadoop无需分叉外部进程。
如果实现外部脚本,将使用配置文件中的net.topology.script.file.name参数进行指定。 与java类不同,外部拓扑脚本不包含在Hadoop发行版中,由管理员自己提供。 在分支拓扑脚本时,Hadoop将向ARGV发送多个IP地址。 发送到拓扑脚本的IP地址数量由net.topology.script.number.args控制,默认值为100。如果将net.topology.script.number.args更改为1,则会为每个拓扑脚本分配一个IP由DataNode或NodeManagers提交。
如果没有设置net.topology.script.file.name或net.topology.node.switch.mapping.impl ,则为任何通过的IP地址返回机架标识“/ default-rack”。 虽然这种行为似乎是可取的,但它可能会导致HDFS数据块复制出现问题,因为默认行为是将一个复制数据块从机架上写下来,并且无法这样做,因为只有一个名为“/ default-rack”的机架。
存储类型和存储策略
介绍
“档案存储”是将增长的存储容量与计算容量分离的解决方案。 节点密度高,存储成本低,计算能力低,可用作集群中的冷存储器。 将更多节点添加到冷存储可以增加独立于群集中计算容量的存储。
“异构存储”和“存档存储”提供的框架将HDFS架构概括为包括SSD和内存等其他类型的存储介质。 用户可以选择将其数据存储在SSD或内存中以获得更好的性能。
存储类型:ARCHIVE,DISK,SSD和RAM_DISK
异构存储(HDFS-2832)的第一阶段将数据节点存储模型从可能对应于多个物理存储介质的单个存储改变为每个存储对应于物理存储介质的存储集合。 它还添加了存储类型DISK和SSD的概念,其中DISK是默认存储类型。
为了支持档案存储,增加了具有高存储密度(PB级别存储)但计算能力很小的新存储类型ARCHIVE 。
另一种新的存储类型RAM_DISK被添加用于支持在存储器中写入单个副本文件。
存储策略:Hot,Warm,Cold,All_SSD,One_SSD和Lazy_Persist
引入了一个新的存储策略概念,以允许根据存储策略将文件存储在不同的存储类型中。
我们有以下存储策略:
- 热 - 存储和计算。 流行并仍在使用的数据将保留在此策略中。 当一个块很热时,所有的副本都存储在磁盘中。
- 冷 - 仅限于计算有限的存储。 不再使用的数据或需要归档的数据将从热存储转移到冷存储。 当一个块很冷时,所有的副本都存储在ARCHIVE中。
- 温暖 - 部分热和部分冷。 当一个块变热时,其一些副本被存储在DISK中,其余的副本被存储在ARCHIVE中。
- All_SSD - 用于将所有副本存储在SSD中。
- One_SSD - 用于将其中一个副本存储在SSD中。 剩余的副本存储在磁盘中。
- Lazy_Persist - 用于在内存中写入具有单个副本的块。 副本首先写入RAM_DISK,然后在DISK中持久化。
存储策略更正式地包含以下字段:
- 策略ID
- 策略名称
- 块放置的存储类型列表
- 文件创建的回退存储类型列表
- 用于复制的回退存储类型的列表
当有足够的空间时,根据#3中指定的存储类型列表存储块副本。 当列表#3中的部分存储类型空间不足时,将使用#4和#5中指定的回退存储类型列表分别替换用于文件创建和复制的空间不足存储类型。
存储策略解决方案
当创建文件或目录时,其存储策略是未指定的 。 存储策略可以使用“ storagepolicies -setStoragePolicy ”命令指定。 文件或目录的有效存储策略由以下规则解决。
- 如果文件或目录指定了存储策略,请将其返回。
- 对于未指定的文件或目录,如果是根目录,则返回默认存储策略 。 否则,返回父级的有效存储策略。
有效的存储策略可以通过“ storagepolicies -getStoragePolicy ”命令检索。
组态
- dfs.storage.policy.enabled - 用于启用/禁用存储策略功能。 默认值是true 。
- dfs.datanode.data.dir - 在每个数据节点上,逗号分隔的存储位置应使用其存储类型进行标记。 这允许存储策略根据策略将块放置在不同的存储类型上。 例如:
- DISK上的datanode存储位置/ grid / dn / disk0应该配置为[DISK] file:/// grid / dn / disk0
- SSD上的datanode存储位置/ grid / dn / ssd0可以配置为[SSD] file:/// grid / dn / ssd0
- ARCHIVE上的datanode存储位置/ grid / dn / archive0应该配置为[ARCHIVE] file:/// grid / dn / archive0
- RAM_DISK上的datanode存储位置/ grid / dn / ram0应该配置为[RAM_DISK] file:/// grid / dn / ram0
如果datanode存储位置的默认存储类型没有显式标记存储类型,则它将是DISK。
移动器 - 一种新的数据迁移工具
添加了一个新的数据迁移工具来存档数据。 该工具类似于平衡器。 它定期扫描HDFS中的文件以检查块放置是否满足存储策略。 对于违反存储策略的块,它会将副本移动到不同的存储类型以满足存储策略要求。 请注意,只要有可能,它总是尝试在同一节点内移动块副本。 如果这是不可能的(例如,当一个节点没有目标存储类型时),那么它将通过网络将块副本复制到另一个节点。
- 命令:
hdfs mover [-p <files/dirs> | -f <local file name>]
- 参数:
| -p <文件/目录> | 指定要迁移的HDFS文件/目录的空格分隔列表。 |
| -f <本地文件> | 指定包含要迁移的HDFS文件/目录列表的本地文件。 |
请注意,如果省略-p和-f选项,则默认路径是根目录。
存储策略命令
设置存储策略
将存储策略设置为文件或目录。
- 命令:
hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy> - 参数:
| -path <path> | 路径引用目录或文件。 |
| -policy <policy> | 存储策略的名称。 |
文章评论