Yarn NM 常驻Flink任务下线:stop/savepoint 释放容器

一、背景

NM:集群缩容,要下线一台部署 NodeManager 的机器,这台 NM 上还跑着 Flink 流任务常驻 TM 容器/常驻 Flink 任务(两种模式Yarn Session/ Per-Job),YARN 不会自动杀掉长驻 TM 容器。

直接下线 NM,会导致 Flink 任务异常。必须先处理 Flink 任务,释放 YARN 容器,再做 NM 退役

常驻TM与常驻Flink容器:Yarn 常驻TM 容器与常驻Flink 任务-CSDN博客

二、完整操作步骤

复制代码
# 列出yarn上所有正在运行的application
yarn application -list

找到 Flink 任务,识别类型:

  • Per-Job:每个任务单独一个 AM
  • Yarn Session:一个 Session AM,多个 Flink job 跑在同一个 session 集群

ApplicationType 是 Apache Flink,记下 applicationId,例如 application_1756xxxx_0001

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:

  1. 先逐个 flink stop 停止 session 内所有 job(详细可参考:xxxxxxxxxxxxx)

  2. 全部 job 停完后,关闭 Yarn Session,释放整个 session 的 NM 容器

    flink cancel <session_applicationId>

复制代码
# 查看该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)

  1. 停止 NodeManager 进程

    对应你的集群启停脚本

    yarn-daemon.sh stop nodemanager

  2. 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

三、重点坑

  1. 只 exclude NM,不会杀死正在运行的 Flink TM 容器!YARN exclude 只是禁止新任务调度,存量容器继续运行。所以必须手动 savepoint stop flink 任务。
  2. 区分:
    • flink stop:优雅停止 + savepoint(流任务首选)
    • flink cancel:取消任务,默认不保存状态
  3. 操作顺序口诀:停 Flink (savepoint) → 确认容器释放 → NM 黑名单 / 停 NM 进程 → 等待 DN 退役完成 → 下架机器
  4. 顺序不能反:如果先停 NM,Flink TM 直接被杀,任务崩溃,状态丢失。

四、补充:应急场景(任务不重要,不需要保留状态)

业务允许丢失状态,可以直接 cancel 任务释放容器:

复制代码
flink cancel <applicationId>
相关推荐
TLA技术3 小时前
LogMiner vs 裸日志解析(三):Oracle日志解析中的“前镜像”和“后镜像”,到底怎么用?
数据库·oracle·flink·dba·迁移学习
starzy19903 小时前
Flink Session Window 详解及代码实现:从用户会话切割到窗口合并机制
java·flink
starzy19902 天前
Flink Window 详解及代码实现:从滚动窗口到迟到数据处理
大数据·flink
Thomas21432 天前
flink pekko OversizedPayloadException 异常排查记录
flink
平顶山大师3 天前
datalink下载安装
flink·微软
用户3610588626123 天前
从 chroot 到 LXC:四代容器隔离技术演进,Namespace 与 Cgroups 原理拆解
大数据·flink
Msshu1233 天前
什么是PD快充诱骗取电芯片,PD快充取电芯片如何选型
flink·rabbitmq·ambari·mariadb·storm·talkingdata
用户3610588626125 天前
Flink高级之侧输出流Side Output原理及代码实现:从OutputTag到多流分发
大数据·flink
用户3610588626126 天前
Flink高级之富函数类深度剖析:执行时序、状态注册与序列化陷阱
大数据·flink