核心原理:HDFS 支持优雅退役 (decommission) 下线 DN,不是直接关机。
执行退役后,NameNode 会把该 DN 上所有数据块,复制迁移到其他存活 DataNode,数据多副本保证不丢失。
迁移完成后,再正式把节点从集群剔除。
说明:DataNode是HDFS 存储节点,管理块数据。
一、完整操作步骤(Hadoop2 / CDH / Hadoop3 通用)
1. 准备退役配置
1)修改 NameNode 节点 hdfs‑site.xml 新增配置 dfs.hosts.exclude,指定退役节点列表文件
<property>
<name>dfs.hosts.exclude</name>
<value>/etc/hadoop/conf/exclude_hosts</value>
</property>
dfs.hosts(白名单):允许加入集群主机列表;不配置代表允许所有dfs.hosts.exclude(黑名单):要退役 / 拒绝的节点列表,一行写一个主机名 / IP
2)在 NN 机器创建文件 exclude_hosts,写入需要下线的 DataNode 主机名/IP
dn‑07
dn‑08
# 也可以写IP
192.168.1.1
如果一台机器同时部署 DataNode + NodeManager,主机名也要同步加到 YARN 的退役列表。
2. 加载配置,开始 DataNode 退役
不需要重启 NameNode,刷新配置生效
hdfs dfsadmin -refreshNodes
执行之后,NameNode 开始把待退役 DN 上的数据块,迁移复制到其他正常 DN。
3. 观察退役进度(重点,必须等退役完成,不能直接关机)
# 查看所有DataNode状态,Decommissioning → 正在迁移;Decommissioned → 退役完成
hdfs dfsadmin -report
状态说明:
1)Decommissioning:正在迁移数据块,此时节点还在工作,不要关机。 NameNode 把该节点上所有 block 复制到其他 DN。副本数保持配置副本数(一般 3 副本)。
数据量大的时候,迁移时间会很久,几小时都有可能;看磁盘数据总量、网络带宽。
2)Decommissioned:退役完成,所有块全部迁移完毕,可以下线节点。
⚠️重要提醒: 退役期间集群磁盘 IO、网络带宽上涨,业务 HDFS 读写会有轻微压力;业务高峰尽量避开缩容操作。
4. 如果该机器同时跑 NodeManager(YARN 计算节点)
机器上同时有 DN+NM,除了 HDFS 退役,YARN 也要做 NM 优雅退役,避免节点上的 Flink/Spark 容器直接被杀,任务故障。
1)修改 yarn‑site.xml,配置 yarn.resourcemanager.nodes.exclude‑path
<property>
<name>yarn.resourcemanager.nodes.exclude-path</name>
<value>/etc/hadoop/conf/yarn_exclude_hosts</value>
</property>
2)文件写入待下线主机名,刷新RM
yarn rmadmin -refreshNodes
- NM 进入
DECOMMISSIONING状态:等待本机运行的 Container 跑完;
❗如果 NM 上跑长驻任务(Flink TaskManager),容器不会自动结束。
👉Flink 任务要先 stop/savepoint 释放容器,否则 NM 无法完成退役。
-
NM 状态变为
DECOMMISSIONED:NM 退役完成。 -
查看单个 NM 节点详细状态
# 格式 yarn node -status <nodeId> # nodeId = hostname:8041,YARN 识别节点的唯一标识 # 8041 是 NM 内部 RPC 通信端口,**RM 和 NM 之间通信、AM 和 NM 通信,走这个端口;负责容器管理(ContainerManager):申请容器、启停容器、上报容器状态 yarn node -status dn-07:8041 示例输出关键信息: ``` Node-State : RUNNING Containers : 0 Memory-Used : 0MB Memory-Capacity : 16384MB CPU-Used : 0 vcores CPU-Capacity : 8 vcores ``` 👉Containers : 0 代表该节点没有任何容器(Flink TM 已经全部释放,满足缩容条件)
5. 节点全部退役完成后
1)确认 DN 状态 Decommissioned、NM 状态DECOMMISSIONED。
2)停止节点服务
systemctl stop hadoop‑hdfs‑datanode
systemctl stop hadoop‑yarn‑nodemanager
3)物理关机,从集群移除
6. 清理配置(可选)
确认节点不再接入集群,保留 exclude 文件,适合场景:机器已经下架、物理机搬走,永久不再复用这台机器,就一直保留在 exclude 文件;
如果后续不再需要该列表,可以把主机名从 exclude_hosts 删除,再次 refreshNodes,适合场景:节点只是临时下线,后续还要复用这台机器,重新加入 HDFS 集群;
二、关键风险点
- 不要直接关机 DataNode! 直接关机,还没完成块迁移,如果副本数不足,HDFS 进入安全模式;会触发块复制,加重集群压力;极端情况数据丢失。必须走 decommission 退役流程。
- 退役速度慢怎么办?
- 调整参数
dfs.datanode.max.transfer.threads,增加 DN 传输线程; - 避开业务高峰执行缩容;
- 不要一次性大批量节点同时退役,分批下线。
👉缩容前先算剩余节点数 ≥ 副本数
- HDFS 副本数问题:集群剩余 DataNode 数量 ≥ block 副本数。比如副本 3,集群至少保留 3 台 DN;如果缩容完只剩 2 台,块副本无法满足,会一直处于 Decommissioning 无法完成。
- DN 退役完成,但 NM 一直 DECOMMISSIONING 状态。
机器上还有 Flink/Spark 长运行任务的 Container。
NM 退役只会等待任务自然结束,不会杀容器。
需要手动处理任务释放容器。
退役过程 HDFS 进入安全模式 ,一般是副本不足导致,不要手动强制退出安全模式;等待块复制完成;
三、Hadoop3 新特性
Hadoop3 支持DataNode 内部磁盘退役,可以只下线单块磁盘,不需要下线整个 DataNode 节点。
四、精简版
Hadoop 缩容下线 DataNode,要走优雅退役 decommission 流程,不能直接关机。
- 在 hdfs‑site 配置
dfs.hosts.exclude,填写待下线节点主机列表。执行hdfs dfsadmin ‑refreshNodes触发退役。- NameNode 会把待退役 DN 上所有数据块迁移复制到其他 DataNode;通过
hdfs dfsadmin ‑report观察状态,等待状态变为Decommissioned才算完成。迁移期间节点继续提供服务,数据量大迁移耗时久。- 如果机器同时部署 NodeManager,YARN 也要配置 exclude 列表做 NM 退役。NM 退役不会 kill 正在运行的容器;如果有 Flink 这类长驻任务,需要先 stop 任务释放容器,否则 NM 无法完成退役。
- 确认 DN、NM 全部退役完成,再停止服务、关机。
- 注意集群剩余 DN 数量必须大于等于 HDFS 副本数;否则块副本无法满足,退役永远完成不了;避开业务高峰缩容,防止网络 IO 压力。
五、高频Q&A
Q:decommissioning 一直不变,是什么原因?
- 集群剩余 DataNode 数量小于副本数,没有足够节点存放副本;
- 集群网络带宽打满,块复制速度慢;
- 待退役节点数据量巨大。
Q:NM 退役和 DN 退役区别?
DN 退役:NN 主动迁移数据块;
NM 退役:RM 不分配新容器到该节点,但是不会杀掉正在运行的容器,已有任务跑完才完成退役。长运行 Flink 任务不会自动结束,需要人工干预。
Q:直接关机 DataNode 会怎么样?
节点离开集群,该节点上的数据块副本丢失。NameNode 检测后会启动块复制,集群压力上升;如果副本数不足,集群进入安全模式,读写受限。
