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. 选型建议:我一般这么选

在实际项目中,我个人的选型原则是这样的:

  1. 开发测试环境:用 Session 模式。方便快捷,改完代码直接提交,不用等集群启动。
  2. YARN 生产环境:用 Application 模式。Per-Job 已经 deprecated,别用了。
  3. Kubernetes 生产环境:必须用 Application 模式。这是官方推荐,也是最佳实践。
  4. 短时间批处理任务:Session 模式就够了。比如每天跑一次的报表任务,用 Session 省资源。
  5. 长时间流处理任务:Application 模式。资源隔离好,稳定性高。

我的经验:如果你刚开始搭建 Flink 生产环境,直接上 Application 模式。别走弯路,别在 Session 和 Per-Job 上浪费时间。Application 模式是 Flink 的未来方向。

6. 三种模式的核心逻辑图

下面这张图展示了三种模式的本质区别。你看一眼就明白了:

Flink 三种部署模式对比 Flink 三种部署模式核心逻辑对比 Session 模式 常驻集群(JobManager + TaskManager) 作业提交 → 共享资源运行 作业结束 → 资源释放回集群 Per-Job 模式 客户端执行 main 方法 申请资源 → 创建专属集群 作业结束 → 集群销毁 Application 模式 客户端提交 Jar 包 集群端执行 main 方法 作业结束 → 集群自动销毁 关键差异说明 1. 集群生命周期:Session 常驻,Per-Job 和 Application 与作业绑定 2. 资源隔离:Session 共享资源,Per-Job 和 Application 独享资源 3. main 方法执行位置:Session 和 Per-Job 在客户端,Application 在集群端 4. 客户端负载:Session 和 Application 轻量,Per-Job 需要保持连接 5. 官方推荐:生产环境优先使用 Application 模式,Session 仅用于测试 注:Per-Job 模式在 YARN 上已标记为 deprecated,Flink 1.15+ 推荐使用 Application 模式

从这张图可以看得很清楚:Session 模式是「共享单车」,谁来了都能骑;Per-Job 和 Application 是「私家车」,一人一辆,互不干扰。而 Application 模式又把「开车」这件事从客户端挪到了集群端,更符合云原生的理念。

7. 总结一下

三种模式没有的好坏,关键看场景。我个人建议:

  • 别纠结:生产环境直接上 Application 模式
  • 别偷懒:Session 模式虽然方便,但生产环境慎用
  • 别守旧:Per-Job 模式该迁移就迁移

记住一句话:选型不是选最好的,而是选最合适的。搞清楚了这三种模式的区别,你就能根据业务需求做出正确的选择。