news 2026/4/16 16:44:31

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/4/16 13:40:36

LED数码管驱动译码器:实战接线指南

以下是对您提供的博文内容进行 深度润色与工程化重构后的版本 。整体风格更贴近一位有十年嵌入式硬件开发经验的工程师在技术博客中自然、扎实、略带温度的分享—— 去AI腔、强实践感、重逻辑流、轻教条气 &#xff0c;同时严格遵循您提出的全部优化要求&#xff08;如&…

作者头像 李华
网站建设 2026/4/16 16:12:19

一句话搞定部署!Unsloth命令行使用技巧

一句话搞定部署&#xff01;Unsloth命令行使用技巧 你是否还在为大模型微调的漫长等待和显存爆满而头疼&#xff1f;下载、安装、环境配置、依赖冲突……光是准备阶段就耗掉半天时间。其实&#xff0c;用Unsloth训练自己的模型&#xff0c;根本不需要写几十行脚本、不需手动编…

作者头像 李华
网站建设 2026/4/16 12:26:31

Speech Seaco Paraformer跨平台部署:Windows/Linux兼容性测试

Speech Seaco Paraformer跨平台部署&#xff1a;Windows/Linux兼容性测试 1. 为什么需要跨平台兼容性验证&#xff1f; 语音识别不是实验室里的玩具&#xff0c;而是要真正跑在办公室电脑、客户服务器、甚至开发者的笔记本上。Speech Seaco Paraformer 这个基于阿里 FunASR 的…

作者头像 李华
网站建设 2026/4/16 13:00:11

unet image Face Fusion广告创意应用?个性化海报生成实战

unet image Face Fusion广告创意应用&#xff1f;个性化海报生成实战 1. 这不是普通换脸&#xff0c;而是广告人的新画笔 你有没有遇到过这样的场景&#xff1a;电商团队要赶在节日大促前上线20款商品海报&#xff0c;每张都要把模特换成品牌代言人&#xff1b;设计部门接到需…

作者头像 李华
网站建设 2026/4/16 12:46:36

升级Z-Image-Turbo后,我的AI绘画效率翻倍了

升级Z-Image-Turbo后&#xff0c;我的AI绘画效率翻倍了 以前做AI绘画&#xff0c;我总在“等”字上耗掉大半时间&#xff1a;等模型加载、等提示词调试、等8步变50步、等一张图出完再改下一句描述——直到我把本地部署的Z-Image换成了Z-Image-Turbo。不是参数更多、不是显卡升…

作者头像 李华
网站建设 2026/4/16 16:24:40

小白也能懂的Z-Image-Turbo部署教程:浏览器访问即可生成图片

小白也能懂的Z-Image-Turbo部署教程&#xff1a;浏览器访问即可生成图片 你是不是也遇到过这些情况&#xff1f; 想用AI画张图&#xff0c;却卡在“安装依赖”“配置环境”“编译报错”的环节&#xff1b; 试了几个在线工具&#xff0c;又担心输入的提示词被存下来、图片被上传…

作者头像 李华