Flink 任务部署模式详解:Session、Per-Job、Application 的区别与选型
说实话,很多刚接触 Flink 的同学,上来就被这三种部署模式搞晕了。Session 是什么?Per-Job 又是什么?Application 模式跟它们到底有啥区别?
我在早期做实时数仓项目时,也踩过不少坑。有一次线上 Session 集群突然 OOM,排查了半天才发现是某个同事提交的作业把共享资源吃光了。嗯,从那以后,我对部署模式的选型就格外谨慎。
今天咱们就把这三种模式掰开揉碎了讲清楚。你想想看,搞懂了它们,你就能根据业务场景做出最合适的选择。
1. Session 模式:共享集群,随用随提
Session 模式,说白了就是先启动一个 Flink 集群(JobManager + TaskManager),然后多个作业共享这个集群的资源。
它的工作流程是这样的:
- 先启动一个常驻的 Flink 集群
- 客户端通过 REST API 或 CLI 提交作业
- 作业在已有的 TaskManager 上运行
- 作业结束后,资源释放回集群
核心特点:集群生命周期与作业生命周期分离。集群一直在,作业来了就跑,跑了就完事。
我在项目中遇到过这样的情况:团队里有 5-6 个实时 ETL 任务,数据量都不大,每个任务单独起一个集群太浪费。这时候 Session 模式就很合适,大家共享一个集群,资源利用率高。
适用场景:
- 短时间运行的测试作业
- 小规模、低负载的批处理任务
- 开发调试环境,频繁提交作业
避坑指南:我曾经因为 Session 集群资源隔离性差吃过亏。一个作业的背压导致整个集群 TaskManager 挂掉,所有作业都受影响。生产环境建议严格控制提交权限,或者给每个作业设置资源上限。
2. Per-Job 模式:一作业一集群
Per-Job 模式,每个作业启动一个独立的 Flink 集群。作业提交时,YARN 或 Kubernetes 会为它单独分配资源,作业结束后集群自动销毁。
它的流程是这样的:
- 客户端提交作业时,同时申请集群资源
- 资源管理器(YARN/K8s)启动 JobManager 和 TaskManager
- 作业运行在专属集群中
- 作业完成后,整个集群资源释放
核心特点:集群生命周期与作业生命周期绑定。作业启动,集群创建;作业结束,集群销毁。
我记得有一次做金融风控项目,要求作业之间完全隔离,不能互相影响。Per-Job 模式就是最佳选择。每个作业独享资源,一个作业出问题不会波及到其他作业。
适用场景:
- 生产环境的关键作业,需要强隔离性
- 资源需求差异大的作业,避免互相争抢
- 作业运行时间较长,需要稳定资源保障
注意:Per-Job 模式在 YARN 上已经标记为 deprecated,Flink 1.15 之后官方推荐使用 Application 模式。如果你还在用 Per-Job,建议尽快迁移。
3. Application 模式:主方法在集群端执行
Application 模式是 Flink 1.11 引入的新模式。它跟 Per-Job 最大的区别是:main 方法在集群端执行,而不是在客户端。
你想想看,这意味着什么?
- 客户端只需要提交一个 Jar 包,不需要执行 main 方法
- 集群端启动 Application 入口,解析作业图
- 资源申请、作业提交都在集群内部完成
- 作业结束后,集群自动销毁
核心特点:客户端轻量化,main 方法在集群端执行。解决了 Per-Job 模式下客户端需要一直保持连接的问题。
我建议在 Kubernetes 环境中优先使用 Application 模式。为什么呢?因为 K8s 的 Pod 启动快,资源隔离好,Application 模式可以充分利用这些优势。我在一个日志实时分析项目中,用 Application 模式部署了 20 多个作业,管理起来非常方便。
适用场景:
- Kubernetes 环境下的生产作业
- 需要客户端轻量化的 CI/CD 流程
- 大规模作业部署,需要统一管理
4. 三种模式对比:一张表看懂
| 对比维度 | Session 模式 | Per-Job 模式 | Application 模式 |
|---|---|---|---|
| 集群生命周期 | 常驻,独立于作业 | 与作业绑定 | 与作业绑定 |
| 资源隔离性 | 差,共享资源 | 好,独享资源 | 好,独享资源 |
| 启动速度 | 快,无需创建集群 | 慢,需创建集群 | 中等,需创建集群 |
| 客户端负载 | 轻,只需提交作业 | 重,需执行 main 方法 | 轻,只需提交 Jar |
| 适用环境 | 开发测试、小作业 | YARN 生产环境(已弃用) | K8s、YARN 生产环境 |
| 官方推荐 | 测试环境 | 不推荐 | 生产环境 |
5. 选型建议:我一般这么选
在实际项目中,我个人的选型原则是这样的:
- 开发测试环境:用 Session 模式。方便快捷,改完代码直接提交,不用等集群启动。
- YARN 生产环境:用 Application 模式。Per-Job 已经 deprecated,别用了。
- Kubernetes 生产环境:必须用 Application 模式。这是官方推荐,也是最佳实践。
- 短时间批处理任务:Session 模式就够了。比如每天跑一次的报表任务,用 Session 省资源。
- 长时间流处理任务:Application 模式。资源隔离好,稳定性高。
我的经验:如果你刚开始搭建 Flink 生产环境,直接上 Application 模式。别走弯路,别在 Session 和 Per-Job 上浪费时间。Application 模式是 Flink 的未来方向。
6. 三种模式的核心逻辑图
下面这张图展示了三种模式的本质区别。你看一眼就明白了:
从这张图可以看得很清楚:Session 模式是「共享单车」,谁来了都能骑;Per-Job 和 Application 是「私家车」,一人一辆,互不干扰。而 Application 模式又把「开车」这件事从客户端挪到了集群端,更符合云原生的理念。
7. 总结一下
三种模式没有的好坏,关键看场景。我个人建议:
- 别纠结:生产环境直接上 Application 模式
- 别偷懒:Session 模式虽然方便,但生产环境慎用
- 别守旧:Per-Job 模式该迁移就迁移
记住一句话:选型不是选最好的,而是选最合适的。搞清楚了这三种模式的区别,你就能根据业务需求做出正确的选择。