HDFS DataNode 管理员指南

概述

Hadoop分布式文件系统(HDFS)的namenode维护所有datanode的状态。状态分为两种类型。第一种类型描述datanode的活动性,表明节点是活跃、死亡还是陈旧。第二种类型描述管理状态,表明节点是处于服务中、已退役还是维护中。

当管理员停用一个数据节点时,该数据节点将首先进入DECOMMISSION_INPROGRESS状态。待该节点上所有数据块都根据各自的复制因子在其他位置完成复制后,该数据节点将转为DECOMMISSIONED状态。此后,管理员可关闭该节点以进行可能持续数天或数周的长期维修维护。待机器修复完成后,可将其重新加入集群。

有时管理员只需让数据节点下线几分钟/小时以执行短期维修/维护。在这种情况下,HDFS块复制因退役而产生的开销可能并非必要,此时需要一个轻量级流程。这正是维护状态的用途所在。当管理员将数据节点置于维护状态时,该节点会首先过渡到ENTERING_MAINTENANCE状态。只要属于该节点的所有数据块在其他位置都至少有一个副本,该节点就会立即转为IN_MAINTENANCE状态。维护完成后,管理员可使节点退出维护状态。此外,维护状态支持超时机制,允许管理员配置数据节点可停留在维护状态的最长时间。超时后,HDFS将在无需人工干预的情况下自动使数据节点退出维护状态。

总之,datanode管理操作包括以下内容:

  • 下线
  • 重新启用
  • 将节点置于维护状态
  • 将节点移出维护状态

数据节点管理状态包括以下几种:

  • NORMAL 节点处于服务状态。
  • DECOMMISSIONED 该节点已被下线。
  • DECOMMISSION_INPROGRESS 该节点正在过渡到DECOMMISSIONED状态。
  • IN_MAINTENANCE 节点处于维护状态。
  • ENTERING_MAINTENANCE 节点正在转换到维护状态。

主机级设置

要执行任何数据节点管理操作,需要两个步骤。

  • 更新主机级别的配置文件以指示目标数据节点的期望管理状态。配置文件支持两种格式。

    • 仅主机名配置。每行包含一个数据节点的主机名/IP地址。这是默认格式。
    • 基于JSON的配置。配置采用JSON格式。每个元素对应一个数据节点,每个数据节点可以拥有多个属性。这种格式用于将数据节点设置为维护状态。
  • 运行以下命令使namenode重新加载主机级别的配置文件。hdfs dfsadmin [-refreshNodes]

仅主机名配置

这是NameNode使用的默认配置。它仅支持节点退役和重新启用;不支持与维护状态相关的管理操作。按照hdfs-default.xml中的说明使用dfs.hostsdfs.hosts.exclude

在以下示例中,host1host2需要处于服务状态。host3host4需要处于退役状态。

dfs.hosts 文件

host1
host2
host3
host4

dfs.hosts.exclude 文件

host3
host4

基于JSON的配置

基于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.

在以下示例中,host1host2需要处于服务状态。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被退役时存在问题,例如

  • NameNode中的写锁可能会因排队重新复制而被长时间持有。
  • 如果有多个正在退役的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