HDFS 升级域
Posted 程序猿码码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS 升级域相关的知识,希望对你有一定的参考价值。
Apache Hadoop 2.9.0
原文:
http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsUpgradeDomain.html
(如果转发,请标明出处)
引入
目前默认的HDFS块放置策略是保证一个块的3个副本放到至少2个机架上。具体而言,在写入管道期间,一个副本放置在一个机架上,另两个副本放置在另一个机架上,这是机架多样性和写入流水线效率之间的良好折衷。需要注意的是,随后的负载平衡或机器成员资格更改可能会导致块的3个副本分布在3个不同的机架上,因此,不同机架中的任意3个datanodes 都可以存储块的3个副本。
但是,默认的放置策略会影响我们实施datanode滚动升级的方式。HDFS滚动升级文档说明了如何以滚动方式升级datanodes而不停机。由于不同机架中的任意3个datanodes都可以存储块的所有副本,因此必须一次一个地执行数据节点的顺序重启,以便将对数据可用性和读/写操作的影响降至最低。另一种选择是一次升级一个机架;但如果在升级过程中另一机架出现机器故障,则这将增加数据不可用的机会。
datanode 按顺序依次滚动升级策略的副作用是较大集群的升级持续时间会很长。
架构
为了解决滚动升级时块放置策略的局限性,引入一种新的块放置策略:在HDFS中添加了升级域的概念。其思想是在现有的基于机架的分组之外,在称为升级域的新维度中对datanode进行分组。例如,我们可以将任何机架第一位置的所有datanodes 分配给升级域ud_01,将第二位置的节点分配给升级域ud_02,依此类推。
namenode 提供BlockPlacementPolicy 接口,以支持除默认块放置策略之外的任何自定义块放置。在HDFS中可以基于此接口的来实现新升级域块放置策略,它将确保任何给定块的副本分布在不同升级域的机器上。默认情况下,任何给定块的3个副本放置在3个不同的升级域上。这意味着属于特定升级域的所有datanodes 都不会存储任何块的多个副本。
有了升级域数据块放置策略,我们可以同时升级属于一个升级域的所有datanodes ,而不会影响数据可用性。只有在升级完一个升级域后,我们才会升级下一个升级域,直到升级完所有升级域。此过程将确保不会同时升级任何给定块的两个副本。这意味着我们可以同时为大型集群同时升级许多机器。随着集群继续扩展,新机器将添加到现有升级域,而不会影响升级的并行性。
对于具有默认数据块放置策略的现有集群,切换到新的升级域块放置策略后,任何新创建的块都将符合新策略。基于旧策略分配的旧块需要迁移到新策略,迁移可以使用迁移器工具,有关详细信息,请查看HDFS-8789 。
设置
在集群中为了使升级域可用,需要执行以下步骤:
① 将datanodes 分配给各个升级域组。
② 启用升级域块放置策略。
③ 将基于旧块放置策略分配的块迁移到新升级域策略。
upgrade domain id分配
datanode映射到upgrade domain id的方式由管理员定义,具体取决于集群布局。使用机器机架位置作为其upgrade domain id是常用的方法。
映射主机名和upgrade domain id,我们需要json格式的配置文件。如 hdfs-default.xml所述那样设置如下参数:
Setting |
Value |
dfs.namenode.hosts.provider.classname |
org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager |
dfs.hosts |
json 格式主机名路径 |
Json主机名文件定义了所有主机的属性,下面的例子中,4个datanodes分布在2个机架,机器位置01的机器属于upgrade domain 01,机架位置02的机器属于upgrade domain 02。
[
{
"hostName": "dcArackA01",
"upgradeDomain": "01"
},
{
"hostName": "dcArackA02",
"upgradeDomain": "02"
},
{
"hostName": "dcArackB01",
"upgradeDomain": "01"
},
{
"hostName": "dcArackB02",
"upgradeDomain": "02"
}
]
启用更新域块放置策略
在每个datanode都被分配upgrade domain id之后,下一个步骤是如 hdfs-default.xml描述的那样配置以下参数来启用更新域块放置策略。
Setting |
Value |
dfs.block.replicator.classname |
org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyWithUpgradeDomain |
重启namenode之后,新的放置策略将用于新的块分配。
迁移
如果更改了已经存在集群的块放置策略,那么就需要将按照之前分配策略分配的块迁移到新的分配策略上。
HDFS - 8789提供了客户端迁移工具的初始草稿修补程序。工具committed后,我们将能够描述如何使用该工具。
基于升级域的滚动重启
在集群管理期间,我们可能需要重新启动datanodes 以获取新配置,新的Hadoop版本或JVM版本等。启用升级域并且集群上的所有数据块都符合新策略后,我们现在可以批量重新启动datanodes ,一次一个升级域。无论是手动过程还是通过自动化,步骤都是如下:
1) 根据dfsadmin或JMX的datanode 信息按升级域对datanode 进行分组。
2) 针对每个升级域:
① (可选)将升级域的所有节点转成维护状态(请查看HDFS DataNode 管理指南)。
② 重启这些节点。
③ 检验所有节点重启后是否正常运行,不正常节点将被退役。
④ (可选)将所有节点退出维护状态。
Metrics
更新域是namenode JMX的一部分,如 HDFSCommands.html中解释的那样,可以通过下面的命令来验证更新域。
使用dfsadmin 在集群层次检查升级域
hdfs dfsadmin -report
使用fsck检查在特定路径上存储数据的datanodes 的升级域。
hdfs fsck <path> -files -blocks -upgradedomains
------------- 全文完 ----------------------------
升级域:upgrade domain
被退役:decommissioned
以上是关于HDFS 升级域的主要内容,如果未能解决你的问题,请参考以下文章