Hadoop分布式文件系统(HDFS)名称节点维护所有数据节点的状态。有两种类型的状态。第一种类型描述了datanode的活跃性,指示节点是活的,死的还是陈旧的。第二种类型描述了管理状态,指示节点是在服务中,退役还是在维护中。
当管理员停用datanode时,datanode将首先转换为DECOMMISSION_INPROGRESS状态。在属于该datanode的所有块已根据每个块的复制因子完全复制到其他位置之后。datanode将转换为DECOMMISSIONED状态。之后,管理员可以关闭节点以执行可能需要数天或数周的长期维修和维护。机器修好后,机器可以重新调试回集群。
有时管理员只需要将数据节点缩短几分钟/小时即可执行短期维修/维护。在这种情况下,退役引起的HDFS块复制开销可能不是必需的,并且需要轻量级过程。这就是维护状态的用途。当管理员将datanode置于维护状态时,datanode将首先转换为ENTERING_MAINTENANCE状态。只要属于该datanode的所有块都在其他地方进行了最低限度的复制,datanode将立即转换为IN_MAINTENANCE州。维护完成后,管理员可以使datanode退出维护状态。此外,维护状态支持超时,允许管理员配置允许datanode保持维护状态的最长持续时间。超时后,数据节点将由HDFS自动转换为维护状态,无需人工干预。
总之,datanode管理操作包括以下内容:
- 退役
- Recommission
- Decommission . 退役
- Recommission . 重新挂载
- Putting nodes in maintenance state . 将节点置于维护状态
- Taking nodes out of maintenance state . 使节点退出维护状态
datanode管理员状态包括以下内容:
- NORMAL 节点正在使用中。
- DECOMMISSIONED 节点已退役。
- DECOMMISSION_INPROGRESS 节点正在转换为 DECOMMISSIONED 状态。
- IN_MAINTENANCE 节点处于维护状态。
- ENTERING_MAINTENANCE 节点正在转换为维护状态。
主机级设置
要执行任何datanode管理操作,有两个步骤。
-
更新主机级配置文件以指示目标数据节点的所需管理状态。配置文件有两种支持的格式。
<ul><li><span style="color:#000000;">仅限主机名配置。每行包括datanode的 </span>hostname/ip <span style="color:#000000;">。这是默认格式。</span></li> <li><span style="color:#000000;">基于JSON的配置。配置采用JSON格式。每个元素映射到一个datanode,每个datanode可以有多个属性。将datanode置于维护状态需要此格式。</span></li> </ul></li> <li> <p><span style="color:#000000;"><span style="color:#000000;">运行以下命令让namenode重新加载主机级配置文件。hdfs dfsadmin [-refreshNodes]</span></span></p> </li>
Host-level 配置
这是namenode使用的默认配置。它只支持节点退役和重新启动; 它不支持与维护状态相关的管理操作。使用dfs.hosts和dfs.hosts.exclude,如hdfs-default.xml中所述。
在以下示例中,host1和host2需要在服务中。host3和host4需要处于退役状态。
dfs.hosts文件
host1
host2
host3
host4
dfs.hosts.exclude文件
host3
host4
基于JSON的配置
基于JSON的格式是支持datanode上的通用属性的新配置格式。设置以下配置以启用基于JSON的格式,如hdfs-default.xml中所述。
设置 | 值 |
---|---|
dfs.namenode.hosts.provider.classname | org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager |
dfs.hosts | json主机文件的路径 |
以下是HDFS当前支持的属性列表。
属性 | 描述 |
---|---|
hostName | 需要。datanode的主机名。 |
upgradeDomain | 可选的。datanode的升级域ID。 |
adminState | 可选的。预期的管理状态。默认值为NORMAL ; 退役的退役; IN_MAINTENANCE用于维护状态。 |
port | 可选的。datanode的端口号 |
maintenanceExpireTimeInMS | 可选的。以毫秒为单位的纪元时间,直到datanode保持维护状态。默认值是永久的。 |
在以下示例中,host1和host2需要服务。host3需要处于退役状态。host4需要处于维护状态。
dfs.hosts文件
[
{
"hostName": "host1"
},
{
"hostName": "host2",
"upgradeDomain": "ud0"
},
{
"hostName": "host3",
"adminState": "DECOMMISSIONED"
},
{
"hostName": "host4",
"upgradeDomain": "ud2",
"adminState": "IN_MAINTENANCE"
}
]
群集级别设置
有几个与datanode管理相关的集群级设置。对于常见用例,您应该依赖于默认值。有关说明和默认值,请参阅hdfs-default.xml。
dfs.namenode.maintenance.replication.min
dfs.namenode.decommission.interval
dfs.namenode.decommission.blocks.per.interval
dfs.namenode.decommission.max.concurrent.tracked.nodes
度量
管理状态是namenode的webUI和JMX的一部分。如HDFSCommands.html中所述,您还可以使用以下命令验证管理状态。
使用dfsadmin检查群集级别的管理状态。
hdfs dfsadmin -report
使用fsck检查存储特定路径数据的datanode的管理状态。为了向后兼容,需要特殊标志来返回维护状态。
hdfs fsck <path> // only show decommission state
hdfs fsck <path> -maintenance // include maintenance state