3.1 运行时的整体架构

3.1.1 运行时整体架构概览

我们先来看运行时的整体架构,如图3-1所示。

在图3-1中可以看出,Flink运行时包含了Dispatcher、ResourceManager、JobManager和TaskManager等主要组件,下面介绍每个组件的主要功能。

1.Dispatcher

Dispatcher主要负责接收客户端提交的JobGraph对象,例如CLI客户端或Flink Web UI提交的任务最终都会发送至Dispatcher组件,由Dispatcher组件对JobGraph进行分发和执行,其中就包含根据JobGraph对象启动JobManager服务,专门用于管理整个任务的生命周期。

图3-1 Flink运行时整体流程图

2.ResourceManager

ResourceManager主要负责管理Flink集群中的计算资源,其中计算资源主要来自TaskManager组件。ResourceManager主要接收来自JobManager的SlotRequest。如果集群采用Native模式部署,则ResourceManager会动态地向集群资源管理器申请Container并启动TaskManager,例如Hadoop Yarn、Kubernetes等。对于不同的集群资源管理器,ResourceManager的实现也会有所不同。

3.JobManager

Dispatcher会根据接收的JobGraph对象为任务创建JobManager服务,其中JobManager服务管理了整个任务的生命周期,同时负责将JobGraph转换成ExecutionGraph结构。JobManager通过内部调度程序对ExecutionGraph中的ExecutionVertex节点进行调度和执行,最终会向指定的TaskManager提交和运行Task实例,同时监控各个Task的运行状况,直到整个作业中所有的Task都执行完毕或停止。和Dispatcher组件一样,JobManager组件本身也是RPC服务,因此具备RPC通信的能力,可以与ResourceManager进行RPC通信,申请任务的计算资源。当任务执行完毕后,JobManager服务也会关闭,同时释放任务占用的计算资源。

4.TaskManager

TaskManager负责向整个集群提供Slot计算资源,同时管理了JobManager提交的Task任务。TaskManager会向JobManager服务提供从ResourceManager中申请和分配的Slot计算资源,JobManager最终会根据分配到的Slot计算资源将Task提交到TaskManager上运行。

接下来我们看整个集群中各个主要组件的启动流程。这里我们以Session类型的集群为例进行说明。从图3-1中可以看出,Flink Session集群的启动流程主要包含如下步骤。

·用户通过客户端命令启动Session Cluster,此时会触发整个集群服务的启动过程,客户端会向集群资源管理器申请Container计算资源以启动运行时中的管理节点。

·ClusterManagement会为运行时集群分配Application主节点需要的资源并启动主节点服务,例如在Hadoop Yarn资源管理器中会分配并启动Flink管理节点对应的Container。

·客户端将用户提交的应用程序代码经过本地运行生成JobGraph结构,然后通过ClusterClient将JobGraph提交到集群运行时中运行。

·此时集群运行时中的Dispatcher服务会接收到ClusterClient提交的JobGraph对象,然后根据JobGraph启动JobManager RPC服务。JobManager是每个提交的作业都会单独创建的作业管理服务,生命周期和整个作业的生命周期一致。

·当JobManager RPC服务启动后,下一步就是根据JobGraph配置的计算资源向ResourceManager服务申请运行Task实例需要的Slot计算资源。

·此时ResourceManager接收到JobManager提交的资源申请后,先判断集群中是否有足够的Slot资源满足作业的资源申请,如果有则直接向JobManager分配计算资源,如果没有则动态地向外部集群资源管理器申请启动额外的Container以提供Slot计算资源。

·如果在集群资源管理器(例如Hadoop Yarn)中有足够的Container计算资源,就会根据ResourceManager的命令启动指定的TaskManager实例。

·TaskManager启动后会主动向ResourceManager注册Slot信息,即其自身能提供的全部Slot资源。ResourceManager接收到TaskManager中的Slot计算资源时,就会立即向该TaskManager发送Slot资源申请,为JobManager服务分配提交任务所需的Slot计算资源。

·当TaskManager接收到ResourceManager的资源分配请求后,TaskManager会对符合申请条件的SlotRequest进行处理,然后立即向JobManager提供Slot资源。

·此时JobManager会接收到来自TaskManager的offerslots消息,接下来会向Slot所在的TaskManager申请提交Task实例。TaskManager接收到来自JobManager的Task启动申请后,会在已经分配的Slot卡槽中启动Task线程。

·TaskManager中启动的Task线程会周期性地向JobManager汇报任务运行状态,直到完成整个任务运行。

以上就是运行时集群的启动过程,包括对集群中主要组件的初始化和启动以及用户作业提交和执行的全部流程。因为涉及的过程非常多,所以我们对这两个部分进行拆解,本章我们先重点了解运行时中核心组件的创建和初始化,在第4章我们再重点学习作业提交并执行在集群运行时环境上的过程。