目录
在一些应用场景中,对于集群资源分配和占用的方式,可能会有特定的需求。Flink为各种场景提供了不同的部署模式,主要有以下三种:会话模式,单作业模式,应用模式
它们的区别主要在于:集群的生命周期(什么时候创建的集群、什么时候停止的集群)以及资源的分配方式(独享还是共享);以及应用的main方法到底在哪里执行------客户端还是JobManager
会话模式
我们需要先启动一个集群,保持一个会话,在这个会话中通过客户端提交作业,集群启动时所有资源就都已经确定,所以所有提交的作业会竞争集群中的资源

会话模式可能出现的问题:
可能出现的问题如下:
- 资源竞争与隔离性差
所有作业共享集群的资源(内存、CPU、网络等),当某个作业占用过多资源(比如数据量突增、逻辑复杂导致计算密集),会挤压其他作业的资源,导致性能下降甚至超时失败。
缺乏严格的资源隔离,一个作业出现异常(如 OOM、死锁)可能影响整个集群的稳定性,甚至导致所有作业崩溃。 - 集群生命周期与作业绑定弱
会话集群是长期运行的,即使所有作业都结束,集群仍会保持运行(除非手动停止),可能造成资源浪费。
若集群因故障重启,所有提交到该集群的作业都需要重新提交,无法自动恢复,增加运维成本。 - 资源配置不灵活
集群启动时需要预先分配固定的资源(如 TaskManager 数量、每个 TM 的 slots 数),难以根据作业的实际需求动态调整。
对于资源需求差异大的作业(比如一个需要大量内存,另一个需要高 CPU),很难通过固定配置同时满足,容易出现资源利用率低或资源不足的问题。
单作业模式
会话模式因为资源共享会导致很多问题,所以为了更好地隔离资源,我们可以考虑为每个提交的作业启动一个集群,这就是所谓的单作业(Per-Job)模式

作业完成后,集群就会关闭,所有资源也会释放
这些特性使得单作业模式在生产环境运行更加稳定,所以是实际应用的首选模式
需要注意的是,Flink本身无法直接这样运行,所以单作业模式一般需要借助一些资源管理框架来启动集群,比如YARN、Kubernetes
优点:
- 资源隔离性好:每个作业都有独立的 JobManager 和 TaskManager, 资源分配只针对单个作业。不同作业之间不会出现资源竞争问题,一个作业占用大量资源不会影响其他作业运行,也避免了因某个作业异常(如内存溢出、死锁)导致整个集群崩溃,进而影响其他作业的情况 。
- 灵活的资源配置:可以根据每个作业的具体需求,定制化配置集群资源。比如,对于计算密集型作业,可以分配更多 CPU 资源;对于处理大量数据的作业,可以配置更多内存和更多的 TaskManager , 从而提高资源利用率。
应用模式
上面两种模式,应用代码都是在客户端上执行,然后由客户端提交给JobManager的,但是这种方式客户端需要占用大量网络带宽,去下载依赖和把二进制数据发送给JobManager;加上很多情况下我们提交作业用的是同一个客户端,就会加重客户端所在节点的资源消耗
所以解决办法就是,我们不要客户端了,直接把应用提交到JobManager上运行,而这也就代表着,我们需要为每一个提交的应用单独启动一个JobManager,也就是创建一个集群,这个JM只为执行这一个应用而存在,执行结束之后JM也就关闭了,这就是所谓的应用模式

应用模式与单作业模式,都是提交作业之后才创建集群;单作业模式是通过客户端来提交的,客户端解析出的每一个作业对应一个集群;而应用模式下,是直接由JobManager执行应用程序的