当前的默认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之后,新策略将用于任何新的块分配。
在集群管理期间,我们可能需要重新启动数据节点以获取新配置,新的hadoop版本或JVM版本等。启用升级域并且集群中的所有块均符合新策略后,我们现在可以批量重新启动数据节点,一次一次升级一个域。无论是手动过程还是通过自动化,步骤如下:
升级域是namenode的JMX的一部分。如HDFSCommands.html中所述,您还可以使用以下命令来验证升级域。
使用dfsadmin在群集级别检查升级域。
hdfs dfsadmin-报告
使用fsck检查在特定路径下存储数据的数据节点的升级域。
hdfs fsck <路径>-文件-块-upgradedomains