0
点赞
收藏
分享

微信扫一扫

Flink部署模式介绍(session,per-job,application)

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

  • 会话模式(Session Mode)
  • 单作业模式(Per-Job Mode)
  • 应用模式(Application Mode)

它们的区别主要在于:集群的生命周期以及资源的分配方式; 以及应用的 main 方法到底 在哪里执行——客户端(Client)还是 JobManager。接下来我们就做一个展开说明。

1.会话模式(Session Mode)

会话模式其实最符合常规思维。我们需要先启动一个集群, 保持一个会话, 在这个会话中通过客户端提交作业,如图所示。集群启动时所有资源就都已经确定, 所以所有提交的作业会竞争集群中的资源。
Flink部署模式介绍(session,per-job,application)_kubernetes
这样的好处很明显, 我们只需要一个集群, 就像一个大箱子, 所有的作业提交之后都塞进 去; 集群的生命周期是超越于作业之上的, 铁打的营盘流水的兵, 作业结束了就释放资源, 集 群依然正常运行。当然缺点也是显而易见的: 因为资源是共享的, 所以资源不够了, 提交新的作业就会失败。另外, 同一个 TaskManager 上可能运行了很多作业, 如果其中一个发生故障导 致 TaskManager 宕机, 那么所有作业都会受到影响。

会话模式比较适合于单个规模小、执行时间短的大量作业

会话模式特点

  • 集群生命周期:独立于任务,任务的开始、结束等不影响集群的生命周期。
  • 集群的资源隔离:所有任务都运行在一个集群上面,所以隔离性差。Flink的Slot仅能隔离内存,并不能隔离CPU资源。而且一个任务如果把TaskManager搞挂了,那上面的其它任务也会受牵连。
  • ​main()​​方法在Client侧执行。

2.单作业模式(Per-Job Mode)

会话模式因为资源共享会导致很多问题, 所以为了更好地隔离资源, 我们可以考虑为每个提交的作业启动一个集群,这就是所谓的单作业(Per-Job)模式, 如图所示。
Flink部署模式介绍(session,per-job,application)_kubernetes_02
单作业模式也很好理解, 就是严格的一对一, 集群只为这个作业而生。同样由客户端运行应用程序, 然后启动集群,作业被提交给 JobManager,进而分发给 TaskManager 执行。作业完成后, 集群就会关闭, 所有资源也会释放。这样一来, 每个作业都有它自己的JobManager 管理, 占用独享的资源, 即使发生故障, 它的TaskManager 宕机也不会影响其他作业。

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

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

  • 集群生命周期:与任务生命周期同步,随任务运行而创建,随任务结束而消亡。
  • 集群的资源隔离:任务独占集群,隔离性最好。
  • ​main()​​方法在Client侧执行。

3.应用模式(Application Mode)

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

所以解决办法就是, 我们不要客户端了, 直接把应用提交到JobManger上运行。而这也就代表着, 我们需要为每一个提交的应用单独启动一个 JobManager,也就是创建一个集群。这个 JobManager 只为执行这一个应用而存在, 执行结束之后 JobManager 也就关闭了, 这就是所谓的应用模式, 如图所示。
Flink部署模式介绍(session,per-job,application)_客户端_03
一个Application指包含一个或多个任务(Job)的程序,也就是包含多个execute或executeAsync。该模式下,一个Application动态创建一个属于自己专有的集群,Application内的所有任务共享该集群,很显然这是一种介于Session Cluster和Job Cluster之间的模式:不同Application之间是完全隔离的,类似Job Cluster;但一个Application内的任务是不隔离的,类似于Session Cluster。此时:

  • 集群生命周期:与Application生命周期同步,随Application运行而创建,随Application结束而消亡。
  • 集群的资源隔离:Application之间隔离,Application内的所有任务共享集群,隔离性一般。
  • ​main()​​方法在集群侧执行。

应用模式与单作业模式, 都是提交作业之后才创建集群

  • 单作业模式是通过客户端来提交的,客户端解析出的每一个作业对应一个集群;
  • 应用模式下,是直接由JobManager执行应用程序的, 并且即使应用包含了多个作业,也只创建一个集群。

4.总结

  • 会话模式:集群的生命周期独立于集群上运行的任何作业的生命周期, 并且提交的所有作业共享资源。
  • 单作业模式:为每个提交的作业创建一个集群,带来了更好的资源隔离,这时集群的生命周期与作业的生命周期绑定。
  • 应用模式:为每个应用程序创建一个会话集群,在 JobManager上直接调用应用程序的main()方法。

Flink也支持一些第三方的集群管理框架,当使用这些框架时,集群的资源管理都会交给这些框架。目前支持:

  • ​Standalone​​:即不使用第三方集群管理框架,Flink自己管理集群。此时支持的运行模式包括:Session Cluster(Session Mode)、Application Cluster(Application Moe)。当容器化部署时(比如在Docker、K8s上面),也只支持这2种模式,不支持Job Cluster(Per-job mode)。
  • ​Native Kubernetes​​:即使用K8s作为集群管理框架,Flink 1.12版本中已经正式可用。 需要注意该方式和在k8s上面部署Standalone集群是不一样的:Native Kubernetes是深度集成,将集群资源管理交给了k8s;而Standalone on K8s只是容器化部署而已,集群管理还是完全由Flink自己做的。该模式也不支持Job Cluster(Per-job mode),其它2种都支持。
  • ​YARN​​:Hadoop生态最常用的资管管理、任务调度框架,功能很强大,一般在Hadoop生态部署Flink的,都会使用YARN管理Flink集群。Flink的3种运行模式在YARN上面都支持,且一般生产环境比较推荐Job Cluster(Per-job Mode)和Application Cluster(Application Mode)。
  • ​Mesos​​:一个“古老”、强大且被广泛使用的集群管理器,与Flink集成时,不支持Application Cluster(Application Moe),其它2种都支持。

-

Session Cluster

Job Cluster

Application Cluster

Standalone(包括on Docker,on K8s)

支持

不支持

支持

Native Kubernetes

支持

不支持

支持

YARN

支持

支持

支持

Mesos

支持

支持

不支持


举报

相关推荐

0 条评论