【Flink】部署模式

目录

在一些应用场景中,对于集群资源分配和占用的方式,可能会有特定的需求。Flink为各种场景提供了不同的部署模式,主要有以下三种:会话模式,单作业模式,应用模式

它们的区别主要在于:集群的生命周期(什么时候创建的集群、什么时候停止的集群)以及资源的分配方式(独享还是共享);以及应用的main方法到底在哪里执行------客户端还是JobManager

会话模式

我们需要先启动一个集群,保持一个会话,在这个会话中通过客户端提交作业,集群启动时所有资源就都已经确定,所以所有提交的作业会竞争集群中的资源

会话模式可能出现的问题:

可能出现的问题如下:

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

单作业模式

会话模式因为资源共享会导致很多问题,所以为了更好地隔离资源,我们可以考虑为每个提交的作业启动一个集群,这就是所谓的单作业(Per-Job)模式

作业完成后,集群就会关闭,所有资源也会释放

这些特性使得单作业模式在生产环境运行更加稳定,所以是实际应用的首选模式

需要注意的是,Flink本身无法直接这样运行,所以单作业模式一般需要借助一些资源管理框架来启动集群,比如YARN、Kubernetes

优点:

  1. 资源隔离性好:每个作业都有独立的 JobManager 和 TaskManager, 资源分配只针对单个作业。不同作业之间不会出现资源竞争问题,一个作业占用大量资源不会影响其他作业运行,也避免了因某个作业异常(如内存溢出、死锁)导致整个集群崩溃,进而影响其他作业的情况 。
  2. 灵活的资源配置:可以根据每个作业的具体需求,定制化配置集群资源。比如,对于计算密集型作业,可以分配更多 CPU 资源;对于处理大量数据的作业,可以配置更多内存和更多的 TaskManager , 从而提高资源利用率。

应用模式

上面两种模式,应用代码都是在客户端上执行,然后由客户端提交给JobManager的,但是这种方式客户端需要占用大量网络带宽,去下载依赖和把二进制数据发送给JobManager;加上很多情况下我们提交作业用的是同一个客户端,就会加重客户端所在节点的资源消耗

所以解决办法就是,我们不要客户端了,直接把应用提交到JobManager上运行,而这也就代表着,我们需要为每一个提交的应用单独启动一个JobManager,也就是创建一个集群,这个JM只为执行这一个应用而存在,执行结束之后JM也就关闭了,这就是所谓的应用模式

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

相关推荐
csudata4 小时前
十年磨一剑,中启乘数CData数据库一体机重新定义企业级数据库解决方案
数据库·数据库开发
TDengine (老段)5 小时前
TDengine IDMP 应用场景:工业锅炉监控
大数据·数据库·物联网·信息可视化·时序数据库·tdengine
鼠鼠我捏,要死了捏6 小时前
深入解析Java NIO多路复用原理与性能优化实践指南
java·性能优化·nio
ningqw6 小时前
SpringBoot 常用跨域处理方案
java·后端·springboot
superlls6 小时前
(Redis)主从哨兵模式与集群模式
java·开发语言·redis
dreams_dream7 小时前
Django的Settings 配置文件详解
数据库·django·sqlite
叫我阿柒啊8 小时前
Java全栈工程师面试实战:从基础到微服务的深度解析
java·redis·微服务·node.js·vue3·全栈开发·电商平台
遇见你的雩风8 小时前
【MySQL】CRUD基础详解
数据库·mysql
hqxstudying9 小时前
mybatis过渡到mybatis-plus过程中需要注意的地方
java·tomcat·mybatis