Flink on Hadoop YARN 从 0 到可上线的 Session / Application 部署指南

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

当 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(默认按字典序)、FIRSTLAST

当你遇到 "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 范围
相关推荐
小五传输2 小时前
国产FTP服务器软件 如何构建自主可控的文件传输架构?
大数据·运维·安全
硕博计算机毕设指导2 小时前
【大数据毕设全套源码+文档】Django基于大数据技术的智慧居家养老服务平的设计与实现(丰富项目+远程调试+讲解+定制)
大数据·python·信息可视化·django·毕业设计·课程设计
B站计算机毕业设计超人2 小时前
计算机毕业设计Python+Django考研院校推荐系统 考研分数线预测系统 大数据毕业设计 (代码+LW文档+PPT+讲解视频)
大数据·人工智能·hive·python·django·毕业设计·课程设计
what丶k2 小时前
SQL三大核心查询语法(WHERE/ORDER BY/GROUP BY)综合运用指南
大数据·数据库·sql·mysql·面试
阳艳讲ai3 小时前
九尾狐AI智能矩阵:重构企业获客新引擎
大数据·人工智能
Eugene Jou3 小时前
Dinky+Flink SQL达梦数据库实时同步到Doris简单实现
数据库·sql·flink
萤丰信息3 小时前
四大核心技术领航,智慧园区重构产业生态新范式
java·大数据·人工智能·智慧城市·智慧园区
秃了也弱了。3 小时前
elasticSearch之API:文本分词,分词器的使用(中)
大数据·elasticsearch
H7998742423 小时前
2026动态捕捉推荐:8款专业产品全方位测评
大数据·前端·人工智能