1. Flink on YARN 是怎么工作的
Flink 提交到 YARN 后,会发生这些事:
- Flink 把 JobManager (在 YARN 里通常是 AM 角色)和 TaskManager 都跑进 YARN 容器
- YARN 的 ResourceManager 负责分配容器,NodeManager 负责拉起容器进程
- JobManager 会根据 slot 需求 动态申请/释放 TaskManager(尤其是 Session 模式多作业场景)
理解这点很关键:你调的不是"Flink 集群机器",而是 YARN 的"容器资源配额"。
2. 准备工作:别跳过这三步
2.1 YARN 环境要求
- 建议从成熟发行版/托管服务开始(EMR / Dataproc / Cloudera 等)
- 本地手动搭一套 YARN 跟着教程跑,不推荐(坑多、与生产差异大)
2.2 检查 YARN 是否正常
bash
yarn top
确保不报错,能看到集群资源视图。
2.3 必须配置 HADOOP_CLASSPATH
这是 Flink 在 YARN 上最常见的"第一坑"。
bash
export HADOOP_CLASSPATH=`hadoop classpath`
echo $HADOOP_CLASSPATH
如果你在生产里用的是 Hadoop 配置目录方式,也要确保 HADOOP_CONF_DIR 指向包含 core-site.xml、hdfs-site.xml、yarn-site.xml 等的目录。
3. 先跑通:启动 YARN Session 集群并提交示例作业
3.1 启动 Session(推荐 detached)
bash
export HADOOP_CLASSPATH=`hadoop classpath`
./bin/yarn-session.sh --detached
启动后终端会打印 Web UI 地址(也可以从 YARN RM Web UI 里进入 Flink 的入口)。
3.2 提交作业到 Session
bash
./bin/flink run ./examples/streaming/TopSpeedWindowing.jar
3.3 停止 Session
拿到 session 对应的 YARN application id(启动日志里有),然后:
bash
echo "stop" | ./bin/yarn-session.sh -id application_XXXXX_XXX
补充:Session 模式会在 /tmp/.yarn-properties-<username> 写一个隐藏属性文件,用于 CLI 自动发现 YARN session(这也是为什么你在同一用户下提交作业会"自动找到集群")。
4. 生产推荐:YARN Application Mode(更强隔离)
在生产环境,官方更推荐 Application Mode,因为它天然提供应用级隔离:一个应用一个 Flink 集群,作业结束集群自动退出。
4.1 一条命令启动 Application Cluster 并跑作业
bash
./bin/flink run -t yarn-application ./examples/streaming/TopSpeedWindowing.jar
4.2 在 Application Mode 下常用运维命令
bash
# 查看集群上的作业
./bin/flink list -t yarn-application -Dyarn.application.id=application_XXXX_YY
# 取消作业(注意:取消会停止整个 Application Cluster)
./bin/flink cancel -t yarn-application -Dyarn.application.id=application_XXXX_YY <jobId>
4.3 提升提交速度:yarn.provided.lib.dirs + 预上传
如果每次提交都要把 Flink 依赖和你的 jar "随客户端打包上传",网络和客户端开销会很大。更好的方式是:
- 把 Flink 发行包依赖、你的应用 jar 预放到 所有节点可访问的远端目录(通常 HDFS)
- 提交时只引用远端路径
示例(思路是"客户端轻量化"):
bash
./bin/flink run -t yarn-application \
-Dyarn.provided.lib.dirs="hdfs://myhdfs/my-remote-flink-dist-dir" \
hdfs://myhdfs/jars/my-application.jar
5. Session 的 attached vs detached:别用错
Session 有两种运行方式:
- attached(默认):
yarn-session.sh会一直挂着跟踪集群状态;你把客户端进程关掉,可能会触发集群退出 - detached(-d/--detached):提交后客户端退出,集群继续跑;需要你再用 yarn 工具或 re-attach 去停
重新 attach:
bash
./bin/yarn-session.sh -id application_XXXX_YY
显式指定目标 session 提交作业(不依赖隐藏 properties 文件):
bash
./bin/flink run -t yarn-session \
-Dyarn.application.id=application_XXXX_YY \
./examples/streaming/TopSpeedWindowing.jar
6. 资源与伸缩:slot、vcores、容器重启语义
6.1 TaskManager 动态伸缩
- Session 下,JobManager 会在你提交更多作业时自动申请更多 TM
- 没用上的 TM 会在超时后释放(避免长期占资源)
6.2 vcores 的默认逻辑
默认情况下,YARN 上报的 VCores 数量 = 每个 TaskManager 配置的 slots 数 。
如果你要覆盖它,用:
yarn.containers.vcores(前提:YARN 开启 CPU scheduling)
6.3 容器失败与重试
-
TaskManager / JobManager 容器失败会被 YARN 替换
-
JobManager(AM)重试次数受两个参数共同约束:
- Flink:
yarn.application-attempts - YARN:
yarn.resourcemanager.am.max-attempts
- Flink:
当 attempts 耗尽,YARN Application 会失败。
7. 高可用(HA)要点:cluster-id 不要手动乱改
在 YARN 上做 HA 是"YARN 重启 JobManager + 外部 HA 服务(如 ZooKeeper)"的组合。
关键注意事项:
- Flink 在 YARN 上会管理
high-availability.cluster-id,默认用 YARN application id - 你不应该在 HA 部署时手动覆盖它,否则多个 YARN 集群可能会在同一个 HA 后端里互相影响,出现"串集群"的严重事故
另外,YARN 版本不同对"AM 挂掉后 TM 是否保活"的语义也不同(历史上 2.4~2.6 之间差异很大),生产建议至少用修复了关键重启问题的版本(你贴的内容也提示了相关 bug 与建议版本)。
8. Classpath 与用户 Jar:最容易引发依赖冲突的地方
8.1 Session Mode 的 user-jars
- Session 下:只有启动命令里指定的 jar 会被当成 user-jars 进入 user classpath
8.2 Application Mode 的 user-jars
- Application 下:启动指定的 jar +
usrlib/下所有 jar 都会作为 user-jars
8.3 yarn.classpath.include-user-jar:冲突时的救命开关
默认 Application Mode 会把 user-jars 放进 system classpath (更"全局")。
你可以用 yarn.classpath.include-user-jar 控制行为:
DISABLED:把 jar 放到 user classpath(更隔离,通常更不容易污染)- 也可以调顺序:
ORDER(默认按字典序)、FIRST、LAST
当你遇到 "Flink 自带依赖 vs 业务依赖版本不一致" 的 ClassNotFound / NoSuchMethodError,这个配置经常是关键解法之一。
9. 防火墙场景:rest.bind-port 预留端口范围
一些企业 YARN 集群在集群网络与外网之间有防火墙,导致你在外部提交作业/访问 REST 不稳定。
Flink 允许你为 REST endpoint 配置端口或端口范围:
- 单端口:
50010 - 范围:
50000-50025 - 组合:
50010,50011,50020-50025
配置项是:
rest.bind-port
提前把范围在防火墙上放行,能省掉大量"线上偶现提交失败"的排查时间。
10. 上线前检查清单
-
环境
yarn top正常HADOOP_CLASSPATH正确(或HADOOP_CONF_DIR可用)
-
模式选择
- 多作业共享:Session(注意隔离和资源竞争)
- 强隔离/关键链路:Application(推荐)
-
提交效率
- 使用
yarn.provided.lib.dirs+ 预上传,降低客户端开销
- 使用
-
依赖冲突
- 评估
yarn.classpath.include-user-jar=DISABLED与 jar 顺序
- 评估
-
HA
- HA 后端配置正确
- 不要覆盖
high-availability.cluster-id
-
网络
- 防火墙环境提前配好
rest.bind-port范围
- 防火墙环境提前配好