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

image

 

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

提交命令

yarn-session.sh + flink run -t yarn-session

flink run -t yarn-per-job

flink run-application -t yarn-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

这套配置的优势:

  1. 客户端零 jar 上传yarn.provided.lib.dirs 让 JobManager 直接从 HDFS 拉依赖
  2. 强隔离:每个日志处理应用独占 YARN 容器
  3. HA 保障:checkpoint 存 HDFS,作业失败可从 savepoint 恢复
  4. 资源可控:通过 -D 参数精细控制 JM/TM 内存和 slot 数

⚠️ 注意:Flink 1.11 之后,-n / -yn 等旧参数已被废弃,统一使用 -t 指定 target 配合 -Dkey=value 动态传参。如果看到老教程用 flink run -m yarn-clusteryarn-session.sh -n 2,那是 Flink 1.10 之前的写法,在新版本中不推荐使用。

posted on 2026-08-19 14:20  luzhouxiaoshuai  阅读(12)  评论(0)    收藏  举报

导航