Flink部署模式详解:Standalone、YARN会话、单作业与应用模式

前言

学完Flink基础之后,部署是绕不开的一关。Flink支持多种部署模式,不同模式适用于不同场景。本文结合尚硅谷Flink1.17教程,梳理Standalone和YARN三种运行模式的原理与使用方式,帮助你真正搞清楚它们的区别。


一、部署模式概览

Flink的部署模式分两个维度来理解:

按资源管理方式

  • Standalone:Flink自己管理资源,不依赖外部资源框架
  • YARN:把资源管理交给Hadoop YARN

按作业提交方式(以YARN为例,分三种)

  • Session模式(会话模式):先启动集群,再提交作业
  • Per-Job模式(单作业模式):每个作业单独启动一个集群(Flink1.17已废弃,了解即可)
  • Application模式(应用模式):main方法在集群端执行

下面逐一讲解。


二、Standalone模式

原理

Standalone是Flink最基础的部署方式,不依赖任何外部资源管理框架,由Flink自己的JobManager和TaskManager组成集群。

架构如下:

  • JobManager:负责作业调度、资源协调、Checkpoint协调
  • TaskManager:负责实际的Task执行,提供Slot资源

启动方式

启动集群

# 进入Flink安装目录
cd $FLINK_HOME

# 启动集群
bin/start-cluster.sh

# 查看进程
jps
# 应该看到:StandaloneSessionClusterEntrypoint(JobManager)、TaskManagerRunner(TaskManager)

提交作业

bin/flink run -c com.xxx.WordCount ./xxx.jar

停止集群

bin/stop-cluster.sh

特点

优点 缺点
部署简单,不依赖外部组件 资源固定,无法动态扩缩容
适合开发测试 不适合生产环境大规模使用

三、YARN模式

YARN模式把资源管理交给Hadoop YARN,Flink只负责作业逻辑。这是企业生产环境最常用的部署方式。

前置条件

需要配置好HADOOP_HOMEHADOOP_CLASSPATH环境变量:

export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

3.1 Session模式(会话模式)

原理

先在YARN上申请资源,启动一个长期运行的Flink集群,然后往这个集群里提交多个作业。

多个作业共享同一个JobManager和TaskManager资源池。
在这里插入图片描述

流程图:

客户端                     YARN                    Flink集群
  |                          |                         |
  |-- 启动Session集群 ------->|                         |
  |                          |-- 分配JobManager资源 -->|
  |                          |-- 分配TaskManager资源 ->|
  |<-------- 集群启动成功 ----|                         |
  |                                                     |
  |-- 提交作业A --------------------------------------->|
  |-- 提交作业B --------------------------------------->|
  |-- 提交作业C --------------------------------------->|
使用方式

步骤一:启动Session集群

bin/yarn-session.sh -nm test

常用参数:

-nm, --name          # ApplicationName,集群名称
-jm, --jobManagerMemory  # JobManager内存,默认1024MB
-tm, --taskManagerMemory  # TaskManager内存,默认1024MB
-s, --slots          # 每个TaskManager的Slot数
-d                   # 后台运行(detached模式)

示例:

# 后台启动,JobManager 1G,每个TM 2G,2个Slot
bin/yarn-session.sh -d -jm 1024 -tm 2048 -s 2 -nm my-session

步骤二:提交作业

# 方式一:指定ApplicationId
bin/flink run -t yarn-session \
  -Dyarn.application.id=application_1234567890_0001 \
  -c com.xxx.WordCount ./xxx.jar

# 方式二:通过环境变量(启动session后自动设置)
bin/flink run -c com.xxx.WordCount ./xxx.jar

停止集群

# 通过YARN杀死Application
yarn application -kill application_1234567890_0001
适用场景

适合作业数量多、单个作业运行时间短的场景,比如频繁提交的小任务,因为集群常驻,省去了每次启动集群的开销。


3.2 Per-Job模式(单作业模式)

注意:Flink 1.15开始废弃,1.17中已移除,仅作了解。

原理

每提交一个作业,就在YARN上单独启动一个Flink集群,作业结束后集群销毁。作业之间资源完全隔离。
在这里插入图片描述

# 提交时指定模式(1.15以前)
bin/flink run -t yarn-per-job -c com.xxx.WordCount ./xxx.jar

为什么废弃?因为Application模式更好地解决了同样的问题(见下)。


3.3 Application模式(应用模式)

原理

这是理解难点,也是重点,需要和Session模式对比来理解。

Session/Per-Job模式的问题:main方法(用户代码)在客户端执行,然后由客户端提交给JobManager。当客户端机器性能差或网络带宽低时,会成为瓶颈。

Application模式的改进:main方法在JobManager端执行,客户端只负责提交,不做任何计算。
在这里插入图片描述

对比如下:

对比项 Session模式 Application模式
main方法执行位置 客户端 JobManager(集群端)
集群生命周期 长期运行 随作业启动和销毁
资源隔离 多作业共享 每个Application独立
客户端压力
使用方式
bin/flink run-application \
  -t yarn-application \
  -c com.xxx.StreamWordCount \
  ./xxx.jar

常用参数:

-t yarn-application   # 指定模式
-c                    # 指定主类
-jm                   # JobManager内存
-tm                   # TaskManager内存
-p                    # 并行度

查看作业状态

# 列出所有作业
bin/flink list -t yarn-application -Dyarn.application.id=application_xxx

# 取消作业
bin/flink cancel -t yarn-application \
  -Dyarn.application.id=application_xxx \
  <job-id>
适用场景

适合生产环境中的大作业,或者需要强资源隔离的场景。每个Application有独立的JobManager,互不干扰。


四、三种YARN模式对比总结

特性 Session Per-Job(已废弃) Application
集群共享 ✅ 共享 ❌ 独立 ❌ 独立
main执行位置 客户端 客户端 JobManager
资源隔离
启动速度 快(集群已存在)
适用场景 小作业多、频繁提交 大作业、生产环境

五、如何选择部署模式

是否有Hadoop环境?
├── 否 → Standalone(适合开发测试)
└── 是 → YARN
         ├── 作业多且小、需要快速提交 → Session模式
         └── 作业大、需要资源隔离、生产环境 → Application模式

小结

  • Standalone:Flink自己管资源,简单,适合开发测试
  • YARN Session:集群常驻,多作业共享,main在客户端,适合小作业频繁提交
  • YARN Application:每个作业独立集群,main在集群端,适合生产大作业
  • Per-Job:已废弃,了解即可

理解这几种模式的核心在于抓住两个关键问题:资源谁来管?main方法在哪执行? 搞清楚这两点,部署模式就不难了。

更多推荐