从集群任务中剖析:
JobManager
负责整个
Flink
集群任务的调度以及资源的管理,从客户端中获取提交的应用,然后根据集群中 TaskManager
上
TaskSlot
的使用情况,为提交的应用分配相应的TaskSlot 资源并命令
TaskManager
启动从客户端中获取的应用。
JobManager
相当于整个集 群的 Master
节点,且整个集群有且只有一个活跃的
JobManager
,负责整个集群的任务管理和资源管理。JobManager
和
TaskManager
之间通过
Actor System
进行通信,获取任务执行的情况并通过 Actor System
将应用的任务执行情况发送给客户端。同时在任务执行的过程中,Flink JobManager
会触发
Checkpoint
操作,每个
TaskManager
节点 收到Checkpoint 触发指令后,完成
Checkpoint
操作,所有的
Checkpoint
协调过程都是在
Flink JobManager 中完成。当任务完成后,
Flink
会将任务执行的信息反馈给客户端,并且释放掉TaskManager 中的资源以供下一次提交任务使用。
TaskManager
相当于整个集群的
Slave
节点,负责具体的任务执行和对应任务在每个节点上的资源申请和管理。客户端通过将编写好的 Flink
应用编译打包,提交到 JobManager,然后
JobManager
会根据已注册在
JobManager
中
TaskManager
的资源情况,
将任务分配给有资源的
TaskManager
节点,然后启动并运行任务。
TaskManager
从 JobManager 接收需要部署的任务,然后使用
Slot
资源启动
Task
,建立数据接入的网络连接,接收数据并开始数据处理。同时 TaskManager
之间的数据交互都是通过数据流的方式进行的。可以看出,Flink
的任务运行其实是采用多线程的方式,这和
MapReduce
多
JVM 进行的方式有很大的区别,Flink
能够极大提高
CPU
使用效率,在多个任务和
Task
之间通过 TaskSlot
方式共享系统资源,每个
TaskManager
中通过管理多个
TaskSlot
资源池对资源进行有效管理。
从集群启动过程剖析:
JobManager
的职责主要是接收
Flink
作业,调度
Task
,收集作业状态和管理
TaskManager
。
它包含一个
Actor
,并且做如下操作:
- RegisterTaskManager: 它由想要注册到 JobManager 的 TaskManager 发送。注册成功会通过 AcknowledgeRegistration 消息进行 Ack。
- SubmitJob: 由提交作业到系统的 Client 发送。提交的信息是 JobGraph 形式的作业描述信息。
- CancelJob: 请求取消指定 id 的作业。成功会返回 CancellationSuccess,否则返回 CancellationFailure。
- UpdateTaskExecutionState: 由 TaskManager 发送,用来更新执行节点(ExecutionVertex) 的状态。成功则返回 true,否则返回 false。
- RequestNextInputSplit: TaskManager 上的Task请求下一个输入split , 成功则返 回 NextInputSplit,否则返回 null。
- JobStatusChanged: 它意味着作业的状态(RUNNING, CANCELING, FINISHED,等)发生 变化。这个消息由 ExecutionGraph 发送。
TaskManager的启动流程较为简单:
启动类:org.apache.flink.runtime.taskmanager.TaskManager 的核心启动方法SelectNetworkInterfaceAndRunTaskManager启动后直接向JobManager注册自己,注册完成后,进行部分模块的初始化。