04 .fink在yarn模式上面启动的两种方式

Flink on YARN 提供了两种截然不同的作业提交模式,它们分别对应了不同的业务场景和运维策略。理解它们的底层区别,对于设计稳健的实时数据处理系统(如之前探讨的日志处理模块)至关重要。
1. 核心概念对比
模式一:Session 模式(多 Job 共用)
这种模式类似于“合租公寓”。首先在 YARN 上启动一个常驻的 Flink 集群(称为 YARN Session),这个集群拥有固定的 JobManager 和一定量的 TaskManager 资源。之后提交的所有 Flink 作业(Job)都共享这个集群的资源。
模式二:Per-Job 模式(单独任务 / Application Mode)
这种模式类似于“独栋别墅”。每次提交一个作业,都会向 YARN 申请一个全新的、独立的 Flink 集群。这个集群仅供当前作业使用,作业执行完毕后,整个集群(包括 JobManager 和 TaskManager)都会被销毁。
2. 详细维度剖析
|
维度 |
Session 模式 (Session Cluster) |
Per-Job 模式 (Per-Job Cluster) |
|---|---|---|
|
资源隔离 |
弱。所有作业共享资源,如果一个作业发生内存泄漏或背压严重,可能会抢占其他作业资源,导致连锁反应。 |
强。作业之间完全隔离,互不影响。一个作业崩溃不会导致其他作业资源受损。 |
|
资源利用率 |
高。TaskManager 常驻内存,适合频繁提交短小作业,避免了频繁启停的开销。 |
相对较低。每次都要经历申请容器、启动 JVM、销毁容器的全过程,存在一定的启动延迟和资源碎片。 |
|
故障影响 |
大。如果运行 JobManager 的 YARN Container 宕机,该 Session 下的所有作业都会失败并重启。 |
小。单个作业的故障仅限于自身集群,不会影响其他正在运行的独立作业。 |
|
运维管理 |
适合开发测试或小规模内部任务,管理简单(只需维护一个 Session)。 |
适合生产环境的核心业务(如交易监控、核心日志分析),便于独立扩缩容和精准监控。 |
3. 结合“实时日志处理”场景的选型建议
在构建基于 Flink SQL 的实时日志处理或 APM 监控系统时,这两种模式的选择尤为关键:
- 开发测试阶段:首选 Session 模式
在功能验证和代码调试阶段,频繁的启停作业是常态。使用yarn-session.sh启动一个后台常驻集群,然后通过flink run -t yarn-session ...提交 SQL 任务,可以极大提升开发迭代效率,减少等待集群启动的时间。 - 生产环境核心链路:强烈推荐 Per-Job 模式(或 Application Mode)
生产环境的日志/链路数据通常是企业的重要资产,要求极高的稳定性和隔离性。- 避免雪崩效应:假设某一天某个服务的日志格式突然异常,导致 Flink 的解析 SQL 产生严重的数据倾斜或异常报错。如果该作业使用 Per-Job 模式,它只会耗尽自己申请的那份资源而崩溃;如果使用 Session 模式,它可能会占满整个共享集群的内存,导致同集群内其他正常的业务监控作业(如支付成功率监控)也跟着挂掉。
- 灵活扩缩容:在流量高峰期(如电商大促),可以为核心的日志分析作业单独申请更大的资源配额,而不影响其他非核心作业。
4. 总结
在实际的大数据平台建设中,通常会采用混合策略:
- 使用 Session 模式 搭建一个公共的 Flink 开发测试环境。
- 使用 Per-Job 模式 部署线上的生产作业,以确保核心业务的稳定性。此外,Flink 1.11 之后引入的 Application Mode 进一步优化了 Per-Job 模式,它将用户代码(JAR 包)分发和依赖解析的逻辑放在了 JobManager 端执行,进一步提升了大作业的提交性能和隔离性。
Flink on YARN 的三种模式(Session / Per-Job Cluster / Application)在 Flink 1.11 之后统一通过 -t 参数指定部署目标,配合 flink-conf.yaml 与命令行 -D 动态参数完成配置。下面按"前置环境 → 公共配置 → 三种模式命令 → 选型建议"的顺序给出可直接落地的配置方案。
一、前置环境配置(三种模式通用)
在提交任何模式前,必须确保 Flink 客户端能识别 YARN / HDFS:
# 1. 设置 Hadoop 配置目录(关键,否则 Flink 找不到 YARN RM)
export HADOOP_CONF_DIR=/etc/hadoop/conf
# 或
export YARN_CONF_DIR=/etc/hadoop/conf
# 2. 设置 Hadoop classpath(Flink 1.11+ 推荐方式)
export HADOOP_CLASSPATH=$(hadoop classpath)
# 3. 将 flink-shaded-hadoop 包放到 $FLINK_HOME/lib/ 下
cp flink-shaded-hadoop-2-uber-2.8.3-7.0.jar $FLINK_HOME/lib/
⚠️ 如果使用 Hadoop 3.x 集群,必须使用对应的
flink-shaded-hadoop-3-uber-*版本,否则会出现NoSuchMethodError。
二、flink-conf.yaml 关键配置
# 资源配置
jobmanager.memory.process.size: 2048m
taskmanager.memory.process.size: 4096m
taskmanager.numberOfTaskSlots: 4
# 高可用(生产必配)
high-availability: zookeeper
high-availability.storageDir: hdfs:///flink/ha
high-availability.zookeeper.quorum: zk1:2181,zk2:2181,zk3:2181
# YARN 相关
yarn.application.queue: root.production # 指定 YARN 队列
yarn.provided.lib.dirs: "hdfs:///flink/lib" # Application 模式轻量化提交(可选)
# 容错
state.backend: rocksdb
state.checkpoints.dir: hdfs:///flink/checkpoints
execution.checkpointing.interval: 60s
yarn.provided.lib.dirs 是 Application 模式优化的核心——把 Flink 的 lib 包预传到 HDFS,提交时客户端不再上传几百 MB 的 jar,极大降低带宽开销。
三、三种模式的配置与提交命令
模式一:Session 模式(会话模式)
Step 1:启动一个常驻 YARN Session 集群
./bin/yarn-session.sh \
-jm 2048m \ # JobManager 内存
-tm 4096m \ # 每个 TaskManager 内存
-s 4 \ # 每个 TM 的 slot 数
-nm "flink-session-prod" \ # YARN 应用名称
-qu root.production \ # YARN 队列
-d # 后台 detached 模式
执行后会输出 YARN Application ID: application_1616633166424_0024,记录下来。
Step 2:向 Session 提交作业
./bin/flink run \
-t yarn-session \
-Dyarn.application.id=application_1616633166424_0024 \
-c com.example.MyJob \
./my-job.jar
💡 如果不指定
-Dyarn.application.id,Flink 客户端会读取/tmp/.yarn-properties-<username>文件自动发现 Session 集群。
停止 Session:
echo "stop" | ./bin/yarn-session.sh -id application_1616633166424_0024
# 或
yarn application -kill application_1616633166424_0024
模式二:Per-Job Cluster 模式
每个作业独立启动一个 Flink 集群,作业结束自动释放:
./bin/flink run \
-t yarn-per-job \
-d \
-nm "my-flink-job" \
-p 4 \
-ys 2 \
-ytm 4096m \
-yjm 2048m \
-qu root.production \
-c com.example.MyJob \
./my-job.jar
参数说明:
-t yarn-per-job:指定部署模式-nm:YARN 上显示的应用名-p:作业并行度-ys:每个 TaskManager 的 slot 数-ytm/-yjm:TM / JM 内存-qu:YARN 队列
📌 在 Cloudera 发行版中 Per-Job 模式仍然受支持,但 Apache Flink 社区已将其标记为 deprecated,新项目建议直接用 Application 模式。
模式三:Application 模式(Flink 1.11+ 推荐)
核心特点:main() 方法在 JobManager 上执行,客户端只负责提交,极大减轻客户端压力。
基础提交:
./bin/flink run-application \
-t yarn-application \
-d \
-Djobmanager.memory.process.size=2048m \
-Dtaskmanager.memory.process.size=4096m \
-Dtaskmanager.numberOfTaskSlots=4 \
-Dyarn.application.name="my-flink-app" \
-c com.example.MyJob \
./my-job.jar
轻量化提交(生产推荐):
提前把 Flink lib 和作业 jar 传到 HDFS:
hdfs dfs -put $FLINK_HOME/lib hdfs:///flink/lib
hdfs dfs -put my-job.jar hdfs:///flink/jars/my-job.jar
然后提交:
./bin/flink run-application \
-t yarn-application \
-d \
-Djobmanager.memory.process.size=2048m \
-Dtaskmanager.memory.process.size=4096m \
-Dyarn.provided.lib.dirs="hdfs:///flink/lib" \
hdfs:///flink/jars/my-job.jar
这种方式客户端不再上传任何 jar 包,JobManager 直接从 HDFS 拉取依赖,提交速度从分钟级降到秒级。
查看作业状态:
./bin/flink list -t yarn-application -Dyarn.application.id=application_XXXX_YY
停止作业:
yarn application -kill application_XXXX_YY
四、三种模式配置对比与选型
|
维度 |
Session |
Per-Job Cluster |
Application |
|---|---|---|---|
|
提交命令 |
|
|
|
|
main() 执行位置 |
客户端 |
客户端 |
JobManager(集群内) |
|
集群生命周期 |
长驻,需手动停止 |
作业结束自动释放 |
应用结束自动释放 |
|
资源隔离 |
弱,作业间共享 |
强,每作业独立 |
强,每应用独立 |
|
客户端开销 |
中 |
大(传 jar + 生成 JobGraph) |
极小(仅传命令) |
|
启动速度 |
快(集群已就绪) |
慢 |
慢 |
|
配置复杂度 |
两步(先启 Session 再提交) |
一步,参数较多 |
一步,支持 HDFS 远程依赖 |
|
适用场景 |
开发测试、短作业频繁提交 |
较长作业(社区已废弃) |
生产环境首选 |
选型决策树
需要频繁提交短作业、追求低延迟启动?
└─ 是 → Session 模式
└─ 否 → 生产环境、追求隔离性?
└─ 是 → Application 模式(推荐)
└─ 否 → Per-Job 模式(仅老版本兼容)
五、生产环境最佳实践配置
针对你之前提到的实时日志处理模块,推荐 Application 模式 + HDFS 远程依赖的组合:
# 1. 预上传 Flink lib 到 HDFS(一次性)
hdfs dfs -mkdir -p hdfs:///flink/lib
hdfs dfs -put $FLINK_HOME/lib/* hdfs:///flink/lib/
# 2. 每次发布新版本作业时,上传作业 jar
hdfs dfs -put -f log-processing-1.0.0.jar hdfs:///flink/jars/
# 3. 提交作业
./bin/flink run-application \
-t yarn-application \
-d \
-Dyarn.application.name="realtime-log-processing" \
-Dyarn.application.queue="root.log" \
-Djobmanager.memory.process.size=4096m \
-Dtaskmanager.memory.process.size=8192m \
-Dtaskmanager.numberOfTaskSlots=8 \
-Dstate.backend=rocksdb \
-Dstate.checkpoints.dir=hdfs:///flink/checkpoints/log-processing \
-Dexecution.checkpointing.interval=60s \
-Dyarn.provided.lib.dirs="hdfs:///flink/lib" \
hdfs:///flink/jars/log-processing-1.0.0.jar
这套配置的优势:
- 客户端零 jar 上传:
yarn.provided.lib.dirs让 JobManager 直接从 HDFS 拉依赖 - 强隔离:每个日志处理应用独占 YARN 容器
- HA 保障:checkpoint 存 HDFS,作业失败可从 savepoint 恢复
- 资源可控:通过
-D参数精细控制 JM/TM 内存和 slot 数
⚠️ 注意:Flink 1.11 之后,
-n/-yn等旧参数已被废弃,统一使用-t指定 target 配合-Dkey=value动态传参。如果看到老教程用flink run -m yarn-cluster或yarn-session.sh -n 2,那是 Flink 1.10 之前的写法,在新版本中不推荐使用。
posted on 2026-08-19 14:20 luzhouxiaoshuai 阅读(12) 评论(0) 收藏 举报
浙公网安备 33010602011771号