Flink - Flink集群的3种部署方式

1,346 阅读6分钟

Flink集群的3种部署方式

简要介绍一下Flink集群的组成部分、Flink集群的目的、以及可用的实现。
如果只想尝试在本地启用Flink,推荐按照Flink Standalone方式部署。

Standalone模式:Standalone模式很好理解,其实就是单节点Flink集群 --> 在同一台机器,不同的进程中运行Flink集群的组件进程

Flink集群组件协作流程

Client把Flink应用的代码转成JobGraph提交到JobManager,然后JobManagerTaskManager分配任务,最终TaskManager执行计算相关的一系列操作。

1671178218963.png

flink cluster构成部分

Flink集群各个组件的作用

1. Client

Client目的是把批/流应用编译成数据流图,然后提交到JobManager。

Client多种不同的实现方式

2. JobManager

JobManager是在Flink集群中协调工作的重要组件,它为不同的资源提供者(YARN/K8S等)提供了不同的实现,以便能够和这些资源提供者进行交互。这些资源提供者在高可用、资源分配方式、作业提交模式方面有所不同。

JobManager有三种作业提交的方式:

  1. 应用模式(Application mode)
  2. 单作业模式(Per-Job mode) (已废弃)
  3. 会话模式(Session mode)

JobManager多种不同的实现方式:

3. TaskManager

TaskManager在整个Flink集群中,是真正执行Job的组件。(天选打工仔,不然怎么每个TaskManager都要被JobManager分配task呢)

外部组件

除了以上Flink集群自身的必要组件之外,为了在Flink的基础之上能够创建更庞大且功能更全面的计算集群,Flink还可以利用一些外部的组件来作为支持。

1. 高可用服务

Flink集群能够被部署成高可用的分布式系统,实现JobManager的错误恢复机制,为了更快地进行故障转移,可以启动多个备用 JobManager 作为备份。

Flink集群高可用的实现方式:

2. 文件系统和持久化

为了实现Job的错误恢复机制,Flink需要额外的文件系统来作为支持。

3. 资源管理器(K8S/YARN)

通过K8S/YARN来对Flink集群的资源进行管理和分配。

4. 指标存储

Flink 组件报告内部指标,Flink 作业也可以报告额外的、特定于作业的指标。

5. 应用程序级数据源和接收器

虽然应用程序级数据源和接收器在技术上不是 Flink 集群组件部署的一部分,但在规划新的 Flink 生产部署时应该考虑它们。 使用 Flink 托管常用数据可以带来显著的性能优势。

可重复的资源清理

当一个Job完成/失败/取消之后,与该任务相关的外部组件的资源会被清理掉,如果清理失败,Flink将会尝试重新清理,可以自定义清理策略。达到用户自定义的清理失败的最大阈值时,将会使未被清理掉的作业处于脏状态,需要手动清理。

重新启动相同的作业,将会导致重新启动清理,而无需再次运行该作业。

3种部署模式(本博文重点喔)

  1. 应用模式
  2. 会话模式
  3. Per-Job模式(已废弃)

三种模式的不同点:

  • 集群生命周期和资源隔离保证不同
  • main()在Client/Cluster端运行

1671372487024.png

在应用模式中,main()方法在JobManager中执行(cluster端);在另外两种模式中,应用的main()方法都是在Client端执行。

Client端执行的过程(Per-Job/Session Mode在Client端运行):

  1. 在本地下载Flink应用的依赖项
  2. 执行main()函数,提取一个Flink能够理解的代表(JobGraph)
  3. 将下载的依赖项以及JobGraph传送到Flink集群

main()方法在Client端执行,利用大量的网络带宽下载资源且传输到集群中、cpu循环执行main()方法,造成了大量资源的消耗。当Client跨用户共享时,这个问题会更加严重。

1. 应用模式

应用模式为每一个提交的Flink应用构建了一个Flink集群,也就是说在用户使用应用模式来提交一个Flink应用的时候,一个新的Flink集群将会随着应用创建而被创建,随着应用结束而结束。main()方法被JobManager执行。

应用模式下,Flink要求提交的Flink应用中,应用相关的依赖包也同应用一起打包,能够被JobManager,TaskManager访问。应用模式使得Flink应用能够快速部署/恢复,不必像其他两种模式需要通过RPC将用户的jars发送给Flink的其他组件。

相比于Per-Job模式,Application Mode允许用户在一个应用中包含多个JobApplication Mode使用execute()建立多个作业的执行顺序。

应用模式下,当运行多个Job的Flink应用取消的时候,所有作业都将会被取消,JobManager将会被关闭。

应用模式下,允许应用可以有multi-execute();如果Flink集群部署成高可用系统,则只支持single-execute()

Flink应用模式生命周期
这种模式下,任务的提交是一步式的,不需要先启动一个Flink集群,再提交任务到启动的Flink集群上,而是打包应用程序和所需依赖到一个可执行的JobJar,集群的入口点(ApplicationClusterEntryPoint)用来负责调用main()方法来执行这个Job

一个新的Flink集群将会随着应用创建而被创建,随着应用结束而结束。

Flink应用模式资源隔离
在Flink应用模式中,ResourceManagerDispatcher被限定在单个Flink应用中,相比于Flink会话集群,其对资源隔离的更好的关注。

2. 会话模式

在会话模式下,需要先部署一个Flink的集群,用来执行任何提交的Flink应用。在同一(会话)集群中执行的应用程序使用/竞争相同的资源。

Flink会话模式生命周期
客户端连接到一个预先存在的长连接且可以提交多个任务的Flink会话集群,Flink会话集群(JobManager)需要通过手动关闭。

Flink会话模式资源隔离
TaskManager的slot(槽)是在提交任务的时候通过资源管理器分配的,且任务完成的时候被释放掉。因为所有的Job共享集群的资源,所以会有一些资源竞争的存在,比如提交作业阶段的网络带宽。这种设置带来的一个限制是:某个TaskManager一旦崩溃,所有Job运行在这个TaskManager上的task将会失败。同样的道理,如果JobManager出了问题,那么整个集群的Job都将会失败。

其他注意事项
拥有一个预先存在的集群可以节省大量申请资源和启动 TaskManager 的时间,希望作业使用现有资源快速计算。

3. Per-Job模式

Per-Job模式只能被YARN集群支持,并且从Flink1.15被废弃。
为了提供更好的资源隔离保证,Per-Job 模式使用YARN为每个提交的作业启动一个集群,集群只对提交的作业有用,Flink集群随着作业生而生,随着作业亡而亡。