部署模式

Flink的部署模式主要有以下三种:

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

集群的生命周期以及资源的分配方式;以及应用的 main 方法到底在哪里执行——客户端(Client)还是 JobManager。

会话模式(Session Mode)

首先需要启动一个集群,建立并保持一个会话,在这个会话中通过客户端提交作业

Flink yarn session 关闭 flink session模式_生命周期


优势:只需要一个集群,所有作业提交之后都进集群处理,集群的生命周期是超越作业上的,作业结束释放资源,集群继续运行。

缺点:因为资源是共享的,当资源不足时,提交新的作业会失败,另外,同一个taskmanager上可能运行了很多作业,如果其中一个发生故障导致taskmanager宕机,所有作业都将会受到影响。

总结:适合单个规模小,执行时间短的大量作业。单作业模式(Per-Job Mode)

为了更好的隔离资源,为每个提交的作业启动一个集群

Flink yarn session 关闭 flink session模式_应用程序_02


由客户端运行应用程序,然后启动集群,作业被提交给 JobManager,进而分发给 TaskManager 执行。作业作业完成后,集群就会关闭,所有资源也会释放。这样一来,每个作业都有自己的jobmanager管理,占用独享的资源,即使发生故障,也不会影响其他作业。

总结:在生产环境中更加稳定,成为实际应用中的首选,但单作业模式一般需要借助一个资源管理框架来启动集群,Yarn,k8s等。

应用模式(Application Mode)

前两种模式应用代码都是在客户端运行,然后由客户端提交给jobmanager的,这种方式的弊端是:需要占用大量网络带宽,去下载依赖和把二进制数据发送给jobmanager,将会加重客户端资源消耗。

所以Application Mode的解决办法是:不需要客户端,直接把应用提交到jobmanager上运行,这意味着要为每个提交的应用单独启动一个jobmanager,也就是创建一个集群,jobmanager执行完自己的应用将会关闭

Flink yarn session 关闭 flink session模式_flink_03


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

总结:

会话模式下,集群的生命周期独立于集群上运行的任何作业的生命周期,并

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

实际应用:

独立模式(Standalone):

优点:独立运行,不依赖任何外部资源管理平台

缺点:如果资源不足或出现故障,没有自动扩展和资源重分配的保障,必须手动处理

适用于:开发测试和作业很少的场景下

高可用:对于Flink来说,一般有多个taskmanager,即使运行出现故障,只需重启故障节点,但是针对一个作业来说,管理的jobmanager只有一个,可能会出现单点故障,为了高可用性,需要对jobmanager做主备冗余,通过配置,让集群在任何时候都有一个主 JobManager 和多个备用 JobManagers。

Flink yarn session 关闭 flink session模式_生命周期_04

YARN模式:
部署过程:客户端把 Flink 应用提交给 Yarn 的 ResourceManager, Yarn 的 ResourceManager 会向 Yarn 的 NodeManager 申请容器。在这些容器上,Flink 会部署JobManager 和 TaskManager 的实例,从而启动集群。Flink 会根据运行在 JobManger 上的作业所需要的 Slot 数量动态分配 TaskManager 资源。
高可用:
YARN 的高可用是只启动一个 Jobmanager, 当这个 Jobmanager 挂了之后, YARN 会再次启动一个, 所以其实是利用的 YARN 的重试次数来实现的高可用。