一、背景
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:每个任务单独一个 AMYarn 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 stop停止 session 内所有 job(详细可参考:xxxxxxxxxxxxx) -
全部 job 停完后,关闭 Yarn Session,释放整个 session 的 NM 容器
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)
-
停止 NodeManager 进程
对应你的集群启停脚本
yarn-daemon.sh stop nodemanager
-
RM 会检测到 NM 失联,一段时间后标记为 Lost。
新任务不会调度到这台机器;已经没有容器,不会影响正在运行的任务。
方案 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
三、重点坑
- 只 exclude NM,不会杀死正在运行的 Flink TM 容器!YARN exclude 只是禁止新任务调度,存量容器继续运行。所以必须手动 savepoint stop flink 任务。
- 区分:
flink stop:优雅停止 + savepoint(流任务首选)flink cancel:取消任务,默认不保存状态
- 操作顺序口诀:停 Flink (savepoint) → 确认容器释放 → NM 黑名单 / 停 NM 进程 → 等待 DN 退役完成 → 下架机器
- 顺序不能反:如果先停 NM,Flink TM 直接被杀,任务崩溃,状态丢失。
四、补充:应急场景(任务不重要,不需要保留状态)
业务允许丢失状态,可以直接 cancel 任务释放容器:
flink cancel <applicationId>