1. Flink 架构图
1.1 JobManager
- JobManager(作业管理器)控制一个应用程序执行的主进程,也就是说,每个Flink程序都会被对应的 JobManager 控制执行。
- JobManager 会先接收到要执行的应用程序,这个应用程序包括图作业(JobGraph)逻辑数据流图(logical dataflow graph)和打包了所有类及其依赖的 jar 文件
- JobManager 会将 JobGraph 转换成一个物理层面的数据流图,这个图被称为执行图(ExecutioGraph),包含了所有可以并发执行的任务。
- JobManager 会向 ResourceManager 请求执行任务必要的资源(也就是任务管理器(TaskManager)上的插槽(slot)),一旦获取到足够的资源,就会将执行图分发到真正执行任务的TaskManager 上,而运行过程中JobManager 会负责所有需要中央协调的操作,比如检查点(CheckPoint)的协调。
1.2 TaskManager
- TaskManager(任务管理器)是Flink 的工作进程(JVM 进程),Flink 集群中会运行多个 TaskManager ,每个 TaskManager 都包含了一定数量的 slot(插槽),slot 的数量限制了 TaskManager 能够执行任务的数量。
- TaskManager 启动之后会向资源管理器注册它的 slot。
- TaskManager 收到资源管理器资源需求的指令后,会将所需的 slot 提交 JobManager 调用,JobManager 就可以向 slot 分配 task(任务)执行任务了
- TaskManager 在执行过程中可以和其他运行同一任务的 TaskManager 交换数据。
- TaskManager 是 JVM 进程,它可能会在独立的线程上执行一个或多个 subtask。
- TaskManager 通过task slot来进行控制能接收到多少个 task,(一个 TaskManager 至少有一个slot)
1.3 ResourceManager
ResourceManager(资源调度器)主要负责管理 TaskManager 的 slot,Flink 为不同环境和资源管理工具供了不同的资源管理器,如YARN、Mesos、K8s以及standalone 部署模式。
当 JobManager 申请 slot 时,ResourceManager 会将有空闲 slot 的 TaskManager 分配给 JobManager ,如果 ResourceManager 没有足够的 slot 来满足 JobManager 的需求,那么需要向资源平台发起会话,以提供启动 TaskManager 进程的容器。
1.4 slots
- slot 为 Flink 集群中可使用资源的单元,相当于所有资源的子集。
- slot 是一个静态概念,是指 TaskManager 具有的并发执行的能力。
- slot 可以看做是对资源进行隔离,主要进行内存的隔离,不同的 slot 使用的 CPU 是可以共享的。
- 为了避免不同 slot 共享 CPU,可以按照 CPU 的核心数量设置 slot 数量,默认的 slot 数量就是CPU核心数量。
- 默认情况下,Flink 允许共享 slot 即使它们是不同任务的子任务,这样一个slot 就可以保存作业的整个管道。
1.5 Dispacher:分发器
还有一个组件在架构图中没有展示出来,就是Dispacher(分发器)。
- Dispacher 可以跨作业运行,它为作业提供了 REST 接口。
- Dispacher 可以在应用被提交执行时,启动并将应用移交给一个 JobManage。
- Dispacher 会启动一个 WebUI,用来方便地展示和监控作业执行的信息。
- Dispacher 在架构中不是必须的,这取决于应用提交运行的方式。
4. 执行图
- Flink 中的执行图可以分为四层:StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图
- StreamGraph: 根据用户通过StreamAPI 编写的代码生成的最初的图,用来表示程序的拓扑结构
- JobGraph: StreamGraph经过优化后生成了 JobGraph,提交给 JobManager的数据结构,主要的优化为将多个符合条件的节点chain在一起作为一个节点。
- ExecutionGraph: JobManager 根据 JobGraph 生成 ExecutionGraph, ExecutionGraph 是JobGraph 的并行化版本, 是调度层最核心的数据结构。
- 物理执行图: JobManager 根据ExecutionGraph对 job进行并行调度后,在各个TaskManager 上部署task 后形成的 “图”,并不是一个具体的数据结构
5. 并行度
- 一个特定的算子的子任务(subtask)的个数被称之为其并行度(parallelism)
- 不同的算子可能有不同的并行度
- 一个 Stream 的并行度,可以认为就是其所有算子的最大并行度