HDFS DataNode 管理指南

概述

Hadoop 分布式文件系统 (HDFS) 名称节点维护所有数据节点的状态。有两种类型的状态。第一种类型描述数据节点的活动状态,指示节点是活动、死亡还是过时。第二种类型描述管理状态,指示节点处于服务中、已停用或正在维护中。

当管理员停用数据节点时,数据节点将首先转换为 DECOMMISSION_INPROGRESS 状态。在属于该数据节点的所有块都根据每个块的复制因子在其他地方完全复制后,数据节点将转换为 DECOMMISSIONED 状态。之后,管理员可以关闭节点以执行可能需要数天或数周的长期修复和维护。在机器修复后,可以将机器重新纳入集群。

有时,管理员只需要将数据节点关闭几分钟/小时来执行短期修复/维护。在这种情况下,由停用引起 HDFS 块复制开销可能没有必要,并且需要一个轻量级进程。这就是维护状态的用途。当管理员将数据节点置于维护状态时,数据节点将首先转换为ENTERING_MAINTENANCE状态。只要属于该数据节点的所有块在其他地方至少复制了一次,数据节点将立即转换为IN_MAINTENANCE状态。维护完成后,管理员可以将数据节点移出维护状态。此外,维护状态支持超时,允许管理员配置数据节点允许停留在维护状态中的最长时间。超时后,数据节点将由 HDFS 自动退出维护状态,而无需人工干预。

总之,数据节点管理操作包括以下内容

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

数据节点管理状态包括以下内容

  • 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 json 主机文件的路径

以下是 HDFS 当前支持的属性列表。

属性 说明
hostName 必需。数据节点的主机名。
upgradeDomain 可选。数据节点的升级域 ID。
adminState 可选。预期的管理状态。默认值为 NORMALDECOMMISSIONED 表示已退役;IN_MAINTENANCE 表示维护状态。
port 可选。数据节点的端口号
maintenanceExpireTimeInMS 可选。数据节点保持在维护状态的时间(以毫秒为单位)。默认值是永久。

在以下示例中,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

退役监视器 (实验性)

当包含大量块的数据节点被退役时,原始退役算法会出现问题,例如

  • 为了排队重新复制,NameNode 中的写锁可能会被长时间持有。
  • 如果有多个正在退役的数据节点,则重新复制工作将逐个节点进行。

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

指标

管理状态是 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