Hadoop分布式文件系统(HDFS)的namenode维护所有datanode的状态。状态分为两种类型。第一种类型描述datanode的活动性,表明节点是活跃、死亡还是陈旧。第二种类型描述管理状态,表明节点是处于服务中、已退役还是维护中。
当管理员停用一个数据节点时,该数据节点将首先进入DECOMMISSION_INPROGRESS
状态。待该节点上所有数据块都根据各自的复制因子在其他位置完成复制后,该数据节点将转为DECOMMISSIONED
状态。此后,管理员可关闭该节点以进行可能持续数天或数周的长期维修维护。待机器修复完成后,可将其重新加入集群。
有时管理员只需让数据节点下线几分钟/小时以执行短期维修/维护。在这种情况下,HDFS块复制因退役而产生的开销可能并非必要,此时需要一个轻量级流程。这正是维护状态的用途所在。当管理员将数据节点置于维护状态时,该节点会首先过渡到ENTERING_MAINTENANCE
状态。只要属于该节点的所有数据块在其他位置都至少有一个副本,该节点就会立即转为IN_MAINTENANCE
状态。维护完成后,管理员可使节点退出维护状态。此外,维护状态支持超时机制,允许管理员配置数据节点可停留在维护状态的最长时间。超时后,HDFS将在无需人工干预的情况下自动使数据节点退出维护状态。
总之,datanode管理操作包括以下内容:
数据节点管理状态包括以下几种:
NORMAL
节点处于服务状态。DECOMMISSIONED
该节点已被下线。DECOMMISSION_INPROGRESS
该节点正在过渡到DECOMMISSIONED状态。IN_MAINTENANCE
节点处于维护状态。ENTERING_MAINTENANCE
节点正在转换到维护状态。要执行任何数据节点管理操作,需要两个步骤。
更新主机级别的配置文件以指示目标数据节点的期望管理状态。配置文件支持两种格式。
运行以下命令使namenode重新加载主机级别的配置文件。hdfs dfsadmin [-refreshNodes]
这是NameNode使用的默认配置。它仅支持节点退役和重新启用;不支持与维护状态相关的管理操作。按照hdfs-default.xml中的说明使用dfs.hosts
和dfs.hosts.exclude
。
在以下示例中,host1
和host2
需要处于服务状态。host3
和host4
需要处于退役状态。
dfs.hosts 文件
host1 host2 host3 host4
dfs.hosts.exclude 文件
host3 host4
基于JSON的格式是一种新的配置格式,支持数据节点上的通用属性。按照hdfs-default.xml中的说明,设置以下配置以启用基于JSON的格式。
设置 | 值 |
---|---|
dfs.namenode.hosts.provider.classname |
org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager |
dfs.hosts |
the path of the json hosts file |
以下是HDFS当前支持的属性列表。
属性 | 描述 |
---|---|
hostName |
Required. The host name of the datanode. |
upgradeDomain |
Optional. The upgrade domain id of the datanode. |
adminState |
Optional. The expected admin state. The default value is NORMAL ; DECOMMISSIONED for decommission; IN_MAINTENANCE for maintenance state. |
port |
Optional. the port number of the datanode |
maintenanceExpireTimeInMS |
Optional. The epoch time in milliseconds until which the datanode will remain in maintenance state. The default value is forever. |
在以下示例中,host1
和host2
需要处于服务状态。host3
需要处于退役状态。host4
需要处于维护状态。
dfs.hosts 文件
[ { "hostName": "host1" }, { "hostName": "host2", "upgradeDomain": "ud0" }, { "hostName": "host3", "adminState": "DECOMMISSIONED" }, { "hostName": "host4", "upgradeDomain": "ud2", "adminState": "IN_MAINTENANCE" } ]
有几个与数据节点管理相关的集群级设置。对于常见使用场景,您应依赖默认值。请参阅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
原始的退役算法在具有大量数据块的DataNode被退役时存在问题,例如
HDFS-14854 引入了新的下线监控机制以缓解这些问题。该功能目前标记为实验性质,默认禁用。您可以通过在hdfs-site.xml中将dfs.namenode.decommission.monitor.class
的值设置为org.apache.hadoop.hdfs.server.blockmanagement.DatanodeAdminBackoffMonitor
来启用此功能。
相关配置属性如下表所示。有关描述和默认值,请参阅hdfs-default.xml。
属性 |
---|
dfs.namenode.decommission.monitor.class |
dfs.namenode.decommission.backoff.monitor.pending.limit |
dfs.namenode.decommission.backoff.monitor.pending.blocks.per.lock |
Admin states are part of the namenode’s webUI and JMX. As explained in HDFSCommands.html, you can also verify admin states using the following commands.
使用dfsadmin
检查集群级别的管理状态。
hdfs dfsadmin -report
使用fsck
检查存储特定路径数据的datanodes的管理状态。为了向后兼容,需要特殊标志才能返回维护状态。
hdfs fsck <path> // only show decommission state hdfs fsck <path> -maintenance // include maintenance state