一、背景
NM:集群缩容,要下线一台部署 NodeManager 的机器,这台 NM 上还跑着 Flink 流任务常驻 TM 容器/常驻 Flink 任务(两种模式Yarn Session/Per-Job),YARN 不会自动杀掉长驻 TM 容器。
直接下线 NM,会导致 Flink 任务异常。必须先处理 Flink 任务,释放 YARN 容器,再做 NM 退役
常驻TM与常驻Flink容器:Yarn 常驻TM 容器与常驻Flink 任务-CSDN博客
二、完整操作步骤
第一步:先查看当前 YARN 上的 Flink 应用
# 列出yarn上所有正在运行的application
yarn application -list
找到 Flink 任务,识别类型:
- Per-Job:每个任务单独一个 AM
- Yarn Session:一个 Session AM,多个 Flink job 跑在同一个 session 集群
ApplicationType 是 Apache Flink,记下 applicationId,例如 application_1756xxxx_0001
第二步:对 Flink 任务执行 savepoint 并停止任务(核心)
savepoint:保存任务状态,后续可以恢复,保证数据不丢不重复
# 停止任务,触发savepoint
flink stop -p hdfs:///flink/savepoints/ <applicationId>
- -p:指定 savepoint 保存到 HDFS 路径,记住返回的 savepoint 路径,恢复任务要用
✅ stop:优雅停止,会先触发 savepoint,处理完数据再关闭 TM 容器(推荐生产)
❌ 不要直接 flink cancel:cancel 默认不生成 savepoint,会丢状态
如果是 Yarn Session 集群(长驻 session)
Session 里面有多个 Flink Job:
flink cancel <session_applicationId>
第三步:确认 Flink 的 TM 容器全部释放
# 查看该NM节点上还有没有运行中的容器
yarn node -list
# 查看指定节点详情,看Containers数量
yarn node -status node01:8041
目标:该 NM 节点上 Containers:0,没有任何 running 容器。 也可以去 YARN WebUI:Nodes 页面,看这个 NM,running containers=0
第四步:NM 退役(YARN 层面下线 NodeManager)
YARN 没有像 HDFS 那样原生 decommission 黑名单,两种方案:
方案 1(优雅推荐,临时停止 NM,不影响 RM)
# 对应你的集群启停脚本
yarn-daemon.sh stop nodemanager
新任务不会调度到这台机器;已经没有容器,不会影响正在运行的任务。
方案 2(YARN 黑名单,禁止新任务调度上来,适合提前隔离)
修改 yarn-site.xml,配置 yarn.resourcemanager.nodes.exclude-path,写入 exclude 文件,文件填写要下线节点主机名。
<property>
<name>yarn.resourcemanager.nodes.exclude-path</name>
<value>/etc/hadoop/conf/yarn_exclude_hosts</value>
</property>
生效:
yarn rmadmin -refreshNodes
效果:新 container 不再分配到该 NM,但已存在的容器继续跑。👉所以必须先停 Flink 释放容器,再执行这个。 容器全部跑完之后,再停 NM 进程。
第五步:确认 HDFS DN 退役完成(并行做)
DN 退役和处理 Flink 任务可以并行:
# 查看DN退役进度
hdfs dfsadmin -report
等待 DN 状态 Decommissioned,块全部迁移完成。
第六步:节点下线,关机 / 下架机器
任务恢复(后续需要重新启动 Flink)
从刚才的 savepoint 恢复任务
flink run -s hdfs:///flink/savepoints/savepoint-xxxx your-flink.jar
三、重点坑
- flink stop:优雅停止 + savepoint(流任务首选)
- flink cancel:取消任务,默认不保存状态
四、补充:应急场景(任务不重要,不需要保留状态)
业务允许丢失状态,可以直接 cancel 任务释放容器:
flink cancel <applicationId>






