默认情况下,HDFS 支持 BlockPlacementPolicyDefault。其中一个块位于本地,副本位于同一远程机架的 2 个不同节点上。除此之外,HDFS 还支持多种不同的可插入块放置策略。用户可以根据其基础设施和用例选择策略。本文档详细介绍了策略类型及其用例和配置信息。
BlockPlacementPolicyRackFaultTolerant 可用于将块放置在多个机架上。默认情况下,使用 3 个副本的 BlockPlacementPolicyDefault 会将一个副本放在本地计算机上(如果写入器位于数据节点上),否则会放在与写入器位于同一机架中的随机数据节点上,另一个副本放在不同(远程)机架中的节点上,最后一个副本放在同一远程机架中的不同节点上。因此,总共会使用 2 个机架,在 2 个机架同时出现故障的情况下,会造成数据不可用,而使用 BlockPlacementPolicyRackFaultTolerant 将有助于将 3 个块放置在 3 个不同的机架上。
有关更多详细信息,请查看 HDFS-7891
配置
<property> <name>dfs.block.replicator.classname</name> <value>org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyRackFaultTolerant</value> </property>
借助新的 3 层分层拓扑,引入了节点组级别,它很好地映射到基于虚拟化环境的基础设施上。在虚拟化环境中,多个虚拟机将托管在同一物理机上。同一物理主机上的虚拟机受同一硬件故障的影响。因此,将物理主机映射到节点组,此块放置可确保它绝不会在同一节点组(物理主机)上放置多个副本,在节点组出现故障的情况下,最多只会丢失一个副本。
配置
<property> <name>net.topology.impl</name> <value>org.apache.hadoop.net.NetworkTopologyWithNodeGroup</value> </property> <property> <name>net.topology.nodegroup.aware</name> <value>true</value> </property>
<property> <name>dfs.block.replicator.classname</name> <value> org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyWithNodeGroup </value> </property>
拓扑脚本与上述示例相同,唯一的区别是,脚本应返回 /{rack}/{nodegroup},而不是仅返回 /{rack}。以下是拓扑映射表的示例
192.168.0.1 /rack1/nodegroup1 192.168.0.2 /rack1/nodegroup1 192.168.0.3 /rack1/nodegroup2 192.168.0.4 /rack1/nodegroup2 192.168.0.5 /rack2/nodegroup3 192.168.0.6 /rack2/nodegroup3
有关更多详细信息,请查看 HDFS-8468
为了解决滚动升级中块放置策略的局限性,通过新的块放置策略将升级域的概念添加到 HDFS 中。除了基于机架的现有分组之外,其理念是在一个称为升级域的新维度中对数据节点进行分组。例如,我们可以将任何机架中第一个位置的所有数据节点分配给升级域 ud_01,将第二个位置的节点分配给升级域 ud_02,依此类推。它将确保任何给定块的副本分布在来自不同升级域的计算机上。默认情况下,任何给定块的 3 个副本都放置在 3 个不同的升级域上。这意味着属于特定升级域的所有数据节点合起来不会存储任何块的多个副本。
有关更多详细信息,请查看 HDFS-9006
有关配置的详细信息,请参见升级域策略
AvailableSpaceBlockPlacementPolicy 是一种空间平衡块放置策略。它类似于 BlockPlacementPolicyDefault,但会为新块选择使用率较低的数据节点,可能性稍高。
配置
<property> <name>dfs.block.replicator.classname</name> <value>org.apache.hadoop.hdfs.server.blockmanagement.AvailableSpaceBlockPlacementPolicy</value> </property> <property> <name>dfs.namenode.available-space-block-placement-policy.balanced-space-preference-fraction</name> <value>0.6</value> <description> Special value between 0 and 1, noninclusive. Increases chance of placing blocks on Datanodes with less disk space used. </description> </property> <property> <name>dfs.namenode.available-space-block-placement-policy.balanced-space-tolerance</name> <value>5</value> <description> Special value between 0 and 20, inclusive. if the value is set beyond the scope, this value will be set as 5 by default, Increases tolerance of placing blocks on Datanodes with similar disk space used. </description> </property> <property> <name> dfs.namenode.available-space-block-placement-policy.balance-local-node </name> <value>false</value> <description> If true, balances the local node too. </description> </property>
有关更多详细信息,请查看HDFS-8131
AvailableSpaceRackFaultTolerantBlockPlacementPolicy 是一种空间平衡块放置策略,类似于 AvailableSpaceBlockPlacementPolicy。它扩展了 BlockPlacementPolicyRackFaultTolerant,并将块分布在尽可能多的机架中,同时会尝试以高概率选择使用率较低的数据节点。
配置
<property> <name>dfs.block.replicator.classname</name> <value>org.apache.hadoop.hdfs.server.blockmanagement.AvailableSpaceRackFaultTolerantBlockPlacementPolicy</value> </property> <property> <name>dfs.namenode.available-space-rack-fault-tolerant-block-placement-policy.balanced-space-preference-fraction</name> <value>0.6</value> <description> Only used when the dfs.block.replicator.classname is set to org.apache.hadoop.hdfs.server.blockmanagement.AvailableSpaceRackFaultTolerantBlockPlacementPolicy. Special value between 0 and 1, noninclusive. Increases chance of placing blocks on Datanodes with less disk space used. More the value near 1 more are the chances of choosing the datanode with less percentage of data. Similarly as the value moves near 0, the chances of choosing datanode with high load increases as the value reaches near 0. </description> </property> <property> <name>dfs.namenode.available-space-rack-fault-tolerant-block-placement-policy.balanced-space-tolerance</name> <value>5</value> <description> Only used when the dfs.block.replicator.classname is set to org.apache.hadoop.hdfs.server.blockmanagement.AvailableSpaceRackFaultTolerantBlockPlacementPolicy. Special value between 0 and 20, inclusive. if the value is set beyond the scope, this value will be set as 5 by default, Increases tolerance of placing blocks on Datanodes with similar disk space used. </description> </property>
有关更多详细信息,请查看HDFS-15288