news 2026/2/4 18:04:34

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink on Hadoop YARN 从 0 到可上线的 Session / Application 部署指南

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 是否正常

yarntop

确保不报错,能看到集群资源视图。

2.3 必须配置 HADOOP_CLASSPATH

这是 Flink 在 YARN 上最常见的“第一坑”。

exportHADOOP_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)

exportHADOOP_CLASSPATH=`hadoop classpath`./bin/yarn-session.sh --detached

启动后终端会打印 Web UI 地址(也可以从 YARN RM Web UI 里进入 Flink 的入口)。

3.2 提交作业到 Session

./bin/flink run ./examples/streaming/TopSpeedWindowing.jar

3.3 停止 Session

拿到 session 对应的 YARN application id(启动日志里有),然后:

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 并跑作业

./bin/flink run -t yarn-application ./examples/streaming/TopSpeedWindowing.jar

4.2 在 Application Mode 下常用运维命令

# 查看集群上的作业./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)
  • 提交时只引用远端路径

示例(思路是“客户端轻量化”):

./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:

./bin/yarn-session.sh -id application_XXXX_YY

显式指定目标 session 提交作业(不依赖隐藏 properties 文件):

./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范围
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/1 9:40:15

用Qwen3-0.6B做的聊天机器人,效果远超预期

用Qwen3-0.6B做的聊天机器人&#xff0c;效果远超预期 一句话说清价值&#xff1a;不用GPU服务器、不配环境、不写复杂代码&#xff0c;打开Jupyter就能跑起一个反应快、有逻辑、会思考的轻量级聊天机器人——Qwen3-0.6B不是“能用”&#xff0c;而是“好用得让人意外”。 你有…

作者头像 李华
网站建设 2026/2/2 3:00:47

游戏外包开发的流程

游戏外包开发的流程与传统软件开发相比&#xff0c;更加强调艺术表现力与技术稳定性的平衡。在 2026 年&#xff0c;随着 AI 辅助工具&#xff08;如 AIGC 资产生成&#xff09;的介入&#xff0c;流程变得更加高效&#xff0c;但核心的协作逻辑依然遵循以下标准阶段。 一、 需…

作者头像 李华
网站建设 2026/2/3 8:06:25

盲盒潮玩抽赏玩法开发全解析:技术实现与风控合规

潮玩抽赏赛道持续爆发&#xff0c;2025年国内市场规模突破500亿元&#xff0c;一番赏、无限赏等玩法成为小程序核心变现引擎。但超70%开发者因概率失控、高并发卡顿、合规违规三大痛点折戟&#xff0c;某头部IP抽赏小程序凭借精准算法与稳健架构&#xff0c;单月流水破千万元&a…

作者头像 李华
网站建设 2026/2/4 7:55:12

SGLang与传统推理对比,性能优势一目了然

SGLang与传统推理对比&#xff0c;性能优势一目了然 你是否遇到过这样的场景&#xff1a;模型明明已经加载进显存&#xff0c;但批量处理10个请求时&#xff0c;吞吐量却卡在2.3 req/s&#xff0c;GPU利用率忽高忽低&#xff0c;CPU却持续飙到95%&#xff1f;调试日志里反复出…

作者头像 李华
网站建设 2026/2/4 14:16:35

导师严选2026最新!9款一键生成论文工具测评:专科生毕业论文必备

导师严选2026最新&#xff01;9款一键生成论文工具测评&#xff1a;专科生毕业论文必备 2026年专科生论文写作工具测评&#xff1a;高效选题与写作的必备指南 随着高等教育的普及&#xff0c;越来越多专科生面临毕业论文写作的压力。从选题到成文&#xff0c;每一个环节都可能…

作者头像 李华
网站建设 2026/2/3 4:25:33

OCR模型导出ONNX后大小多少?科哥实测800x800为120MB

OCR模型导出ONNX后大小多少&#xff1f;科哥实测800x800为120MB 1. 为什么ONNX模型大小这么关键&#xff1f; 你有没有遇到过这样的情况&#xff1a;在边缘设备上部署OCR服务时&#xff0c;模型一加载就报内存溢出&#xff1f;或者在嵌入式设备上发现800MB的PyTorch模型根本塞…

作者头像 李华