Flink 中的 Session Cluster(会话集群) 和 Per-Job Cluster(单作业集群) 是两种不同的集群部署模式,主要区别在于集群的生命周期、资源管理方式以及适用场景,具体如下:
1. 集群生命周期与作业关系
-
Session Cluster(会话集群)
- 集群是预先启动的,生命周期独立于作业,可长时间运行。
- 一个集群可以同时运行多个作业,所有作业共享集群的资源(TaskManager、Slot 等)。
- 当所有作业结束后,集群仍可保留,等待接收新作业。
-
Per-Job Cluster(单作业集群)
- 集群的生命周期与单个作业绑定:作业提交时自动创建集群,作业结束后集群立即销毁。
- 一个集群只运行一个作业,资源完全为该作业独占。
2. 资源管理方式
-
Session Cluster
- 资源(如内存、CPU)是预先分配的,所有作业共享固定的资源池。
- 优点:启动作业时无需等待集群创建,响应速度快。
- 缺点:资源竞争可能导致作业互相影响(如一个作业占用过多资源,导致其他作业资源不足);若集群崩溃,所有运行中的作业都会受影响。
-
Per-Job Cluster
- 资源是动态分配的,作业提交时根据需求申请资源,作业结束后资源立即释放。
- 优点:资源隔离性好,单个作业的失败或资源问题不会影响其他作业;资源利用率更高(按需分配)。
- 缺点:每个作业都需要启动新集群,存在额外的启动开销(如申请 YARN 资源、启动 TaskManager 等)。
3. 适用场景
-
Session Cluster 适用场景
- 短期、小批量作业(如频繁的 SQL 查询、小数据量处理)。
- 对作业启动速度要求高的场景(无需等待集群创建)。
- 资源需求稳定、作业之间互不干扰的场景。
-
Per-Job Cluster 适用场景
- 长期运行的大规模作业(如 24/7 流式处理任务)。
- 资源需求差异大的作业(避免资源竞争)。
- 对稳定性和隔离性要求高的场景(如生产环境核心任务)。
4. 部署方式差异
-
Session Cluster
-
需先手动启动集群(如通过
yarn-session.sh
在 YARN 上启动一个会话集群),再提交多个作业到该集群。 -
示例:
bash# 启动 YARN 会话集群 ./bin/yarn-session.sh -n 3 -tm 4096 # 3个TaskManager,每个4GB内存 # 提交作业到已启动的会话集群 ./bin/flink run -m yarn-cluster ./examples/streaming/WordCount.jar
-
-
Per-Job Cluster
-
无需预先启动集群,作业提交时自动创建集群,直接通过
flink run
命令指定-m yarn-cluster
即可。 -
示例:
bash# 提交作业,自动创建单作业集群 ./bin/flink run -m yarn-cluster ./examples/streaming/WordCount.jar
-
总结对比表
特性 | Session Cluster | Per-Job Cluster |
---|---|---|
集群生命周期 | 独立于作业,长期运行 | 与单个作业绑定,作业结束即销毁 |
作业数量 | 多个作业共享集群 | 一个集群只运行一个作业 |
资源管理 | 预先分配,共享资源池 | 动态分配,资源独占 |
启动开销 | 无(集群已预先启动) | 有(需创建新集群) |
隔离性 | 差(作业共享资源) | 好(资源独占) |
适用场景 | 短期、小批量、快速响应的作业 | 长期、大规模、高隔离性的作业 |
选择哪种模式需根据作业特性、资源需求和稳定性要求决定。生产环境中,Per-Job Cluster 因隔离性好更常用于核心任务;Session Cluster 则适合开发调试或轻量作业。