当前默认的 HDFS 块放置策略可确保块的 3 个副本将放置在至少 2 个机架上。具体来说,在写入管道期间,一个副本放置在一个机架上,而另外两个副本放置在另一个机架上。这是机架多样性和写入管道效率之间的一个很好的折衷方案。请注意,随后的负载平衡或机器成员资格更改可能会导致块的 3 个副本分布在 3 个不同的机架上。因此,不同机架中的任何 3 个数据节点都可以存储块的 3 个副本。
但是,默认放置策略会影响我们如何执行数据节点滚动升级。HDFS 滚动升级文档解释了如何在不中断服务的情况下以滚动方式升级数据节点。由于不同机架中的任何 3 个数据节点都可以存储块的所有副本,因此重要的是一次顺序重启数据节点,以最大程度地减少对数据可用性和读/写操作的影响。一次升级一个机架是另一个选择;但是,如果在升级期间另一个机架发生机器故障,这将增加数据不可用的可能性。
这种顺序数据节点滚动升级策略的副作用是升级持续时间较长,尤其对于较大的集群。
为了解决滚动升级中块放置策略的限制,通过新的块放置策略将升级域的概念添加到 HDFS 中。这个想法是除了现有的基于机架的分组之外,在称为升级域的新维度中对数据节点进行分组。例如,我们可以将任何机架的第一个位置中的所有数据节点分配给升级域 ud_01,将第二个位置中的节点分配给升级域 ud_02,依此类推。
除了默认块放置策略之外,NameNode 提供 BlockPlacementPolicy 接口来支持任何自定义块放置。基于此接口的新的升级域块放置策略在 HDFS 中可用。它将确保任何给定块的副本分布在来自不同升级域的机器上。默认情况下,任何给定块的 3 个副本都放置在 3 个不同的升级域上。这意味着属于特定升级域的所有数据节点都不会存储任何块的两个以上的副本。
通过升级域块放置策略,我们可以同时升级属于一个升级域的所有数据节点,而不会影响数据可用性。只有在完成一个升级域的升级后,我们才会移动到下一个升级域,直到所有升级域都已升级。此过程将确保任何给定块的两个副本不会同时升级。这意味着我们可以同时为大型集群升级许多机器。随着集群继续扩展,新机器将被添加到现有的升级域,而不会影响升级的并行性。
对于具有默认块放置策略的现有集群,在切换到新的升级域块放置策略后,任何新创建的块都将符合新策略。基于旧策略分配的旧块需要迁移到新策略。您可以使用迁移工具。有关详细信息,请参阅 HDFS-8789。
要在集群上启用升级域,请按照以下步骤操作
数据节点如何映射到升级域 ID 由管理员定义,并且特定于集群布局。一种常见的方法是使用机器的机架位置作为其升级域 ID。
要配置从主机名到其升级域 ID 的映射,我们需要使用基于 json 的主机配置文件。通过在 hdfs-default.xml 中说明的设置以下属性。
设置 | 值 |
---|---|
dfs.namenode.hosts.provider.classname |
org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager |
dfs.hosts |
json 主机文件的路径 |
json 主机文件定义了所有主机的属性。在以下示例中,2 个机架中有 4 个数据节点;机架位置 01 处的机器属于升级域 01;机架位置 02 处的机器属于升级域 02。
[ { "hostName": "dcArackA01", "upgradeDomain": "01" }, { "hostName": "dcArackA02", "upgradeDomain": "02" }, { "hostName": "dcArackB01", "upgradeDomain": "01" }, { "hostName": "dcArackB02", "upgradeDomain": "02" } ]
为每个数据节点分配升级域 ID 后,下一步是启用升级域块放置策略,配置如下,如 hdfs-default.xml 中所述。
设置 | 值 |
---|---|
dfs.block.replicator.classname |
org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyWithUpgradeDomain |
在重新启动 NameNode 后,新策略将用于任何新的块分配。
如果您更改现有集群的块放置策略,您需要确保在块放置策略更改之前分配的块符合新的块放置策略。
HDFS-8789 提供了客户端迁移工具的初始草稿补丁。在提交该工具后,我们将能够描述如何使用该工具。
在集群管理期间,我们可能需要重新启动数据节点以获取新配置、新的 Hadoop 发行版或 JVM 版本等。在启用升级域且集群上的所有块都符合新策略的情况下,我们现在可以一次一个升级域地分批重新启动数据节点。无论是手动过程还是通过自动化,步骤如下
升级域是 NameNode 的 JMX 的一部分。如 HDFSCommands.html 中所述,您还可以使用以下命令验证升级域。
使用 dfsadmin
检查集群级别的升级域。
hdfs dfsadmin -report
使用 fsck
检查存储特定路径数据的升级域。
hdfs fsck <path> -files -blocks -upgradedomains