Flink基本架构

2022/02/23

Tags: Flink

摘要: 鸟瞰 Flink 架构,分析 Flink 内部组件工作机制。


Flink架构图

一个完整的 Flink 集群由一个 Jobmanager 和若干个 Taskmanager 组成,Jobmanager 主要负责调度 task 以及 协调 Checkpoint。Taskmanager 则负责具体的 task 执行,以及数据流的交换。

可以通过多种方式启动 JobManager 和 TaskManager:直接在机器上作为standalone 集群启动、在容器中启动、或者通过YARN等资源框架管理并启动。TaskManager 连接到 JobManagers,宣布自己可用,并被分配工作。

提交作业流程

以一个作业提交的流程来说明 Flink 各个组件是如何交互和工作的:

提交作业流程

Flink 集群类型一般有以下几种:

JobManager

在 Flink 集群中,JobManager 负责协调、调度 Task ,以及作业快照、从快照中恢复等功能。

Jobmanager 核心组件:

  1. ResourceManager

    ResourceManager 负责 Flink 集群中的资源分配、回收,并管理 task slot。

  2. Dispatcher

    Dispatcher 提供了一个 REST 接口,用来提交 Flink 应用程序执行,并为每个提交的作业启动一个新的 JobMaster。它还运行 Flink WebUI 用来提供作业执行信息。

  3. JobMaster

    JobMaster 负责管理单个JobGraph的执行。Flink 集群中可以同时运行多个作业,每个作业都有自己的 JobMaster。

一个 Flink 集群中,至少有一个 Jobmanager ,可以设定多个 Jobmanager ,leader 只有一个,其他 Jobmanager 为 standby。

Taskmanager

Taskmanager 负责具体 task 的执行,以及数据流的交换。 同时, Taskmanager 需要将资源状态向 Jobmanager 汇报。

算子链

假设 Flink 算子并行度为2,该算子的 subTask 有两个,Flink 会将算子的 subtasks 链接成 tasks。每个 tasks 由一个线程执行。将算子链接成 task 是个有用的优化:它减少线程间切换、缓冲的开销,并且减少延迟的同时增加整体吞吐量,此时一个线程将会执行多个 subTask。

链行为是可以配置的,如果想对整个作业禁用算子链,可以调用 StreamExecutionEnvironment.disableOperatorChaining()

slot和算子的关系

Slot

task slot 代表 Taskmanager 中的可用资源(不包括CPU)的集合,例如,如果一个 Taskmanager 有3个 slot,那每个 slot 将会平分 Taskmanager 的内存资源,当第四个 task 提交过来时,task 将进入 SCHEDULE 状态,需要等待其他 task 执行完成,才能执行下一个 task。

slot共享:

默认情况下,Flink 允许 subtask 共享 slot,即便它们是不同的 task 的 subtask,只要是来自于同一作业即可。算子最大并行度和 slot 数量一致,算子之间的数据交换会根据不同的策略进行。

每一个 subtasks 算子链由一个线程执行,在 slot 中的执行情况如下:

slot和算子的关系

task 数据交换策略

数据交换策略定义了在物理执行流图中如何将数据分配给任务,

数据交换策略

参考:

https://nightlies.apache.org/flink/flink-docs-release-1.14/zh/docs/concepts/flink-architecture/

https://www.jianshu.com/p/3898dd13f079

https://confucianzuoyuan.github.io/flink-tutorial/book/chapter02-01-03-%E6%95%B0%E6%8D%AE%E4%BA%A4%E6%8D%A2%E7%AD%96%E7%95%A5.html