1.常用的数据结构定义

Flink中,JobManager内部维护了多个数据结构,用于存储和管理作业的元数据信息。以下是JobManager中常用的数据结构:

JobGraph:JobGraph是Flink作业的执行计划,它描述了作业中各个算子之间的依赖关系,以及算子的并行度、数据分配等信息。JobGraph是由客户端提交作业时生成的,并由JobManager进行解析和管理。

ExecutionGraph:ExecutionGraph是JobGraph的执行实例,它描述了作业在集群中的具体执行情况,包括所有算子的执行状态、任务的调度顺序、数据流的分区等信息。ExecutionGraph是由JobManager在作业提交后生成的,并不断更新和维护,以保证作业的正确执行。

CheckpointCoordinator:CheckpointCoordinator是Flink作业的检查点协调器,它负责协调各个算子之间的数据快照,以保证作业在出现故障时可以快速恢复。CheckpointCoordinator维护了作业的检查点状态、任务的状态等信息,并与TaskManager进行通信,以触发和确认检查点操作。

JobStatus:JobStatus是作业的状态枚举类型,包括CREATED、RUNNING、FINISHED、CANCELED、FAILED等状态。JobManager维护了作业的当前状态,以及作业状态的转换规则。

JobResult:JobResult是作业执行结果的封装,包括作业的执行状态、作业的结束时间、作业的异常信息等。JobManager在作业执行结束后,会生成JobResult并返回给客户端。

综上所述,JobManager内部维护了多个数据结构,用于存储和管理作业的元数据信息。这些数据结构共同协作,构成了Flink作业的执行引擎,保证了作业的正确性和可靠性。

2.数据结构间工作原理剖析

在作业执行期间,JobManager 会持续跟踪各个 task,决定何时调度下一个或一组 task,处理已完成的 task 或执行失败的情况。

JobManager 会接收到一个 JobGraph ,用来描述由多个算子顶点 ( JobVertex ) 组成的数据流图,以及中间结果数据 ( IntermediateDataSet )。每个算子都有自己的可配置属性,比如并行度和运行的代码。除此之外,JobGraph 还包含算子代码执行所必须的依赖库。

JobManager 会将 JobGraph 转换成 ExecutionGraph 。可以将 ExecutionGraph 理解为并行版本的 JobGraph,对于每一个顶点 JobVertex,它的每个并行子 task 都有一个 ExecutionVertex 。一个并行度为 100 的算子会有 1 个 JobVertex 和 100 个 ExecutionVertex。ExecutionVertex 会跟踪子 task 的执行状态。 同一个 JobVertex 的所有 ExecutionVertex 都通过 ExecutionJobVertex 来持有,并跟踪整个算子的运行状态。ExecutionGraph 除了这些顶点,还包含中间数据结果和分片情况 IntermediateResult 和 IntermediateResultPartition 。前者跟踪中间结果的状态,后者跟踪每个分片的状态。

每个 ExecutionGraph 都有一个与之相关的作业状态信息,用来描述当前的作业执行状态。

Flink 作业刚开始会处于 created 状态,然后切换到 running 状态,当所有任务都执行完之后会切换到 finished 状态。如果遇到失败的话,作业首先切换到 failing 状态以便取消所有正在运行的 task。如果所有 job 节点都到达最终状态并且 job 无法重启, 那么 job 进入 failed 状态。如果作业可以重启,那么就会进入到 restarting 状态,当作业彻底重启之后会进入到 created 状态。

如果用户取消了 job 话,它会进入到 cancelling 状态,并取消所有正在运行的 task。当所有正在运行的 task 进入到最终状态的时候,job 进入 cancelled 状态。

Finished、canceled 和 failed 会导致全局的终结状态,并且触发作业的清理。跟这些状态不同,suspended 状态只是一个局部的终结。局部的终结意味着作业的执行已经被对应的 JobManager 终结,但是集群中另外的 JobManager 依然可以从高可用存储里获取作业信息并重启。因此一个处于 suspended 状态的作业不会被彻底清理掉。

 

 

在整个 ExecutionGraph 执行期间,每个并行 task 都会经历多个阶段,从 created 状态到 finished 或 failed。下图展示了各种状态以及他们之间的转换关系。由于一个 task 可能会被执行多次(比如在异常恢复时),ExecutionVertex 的执行是由 Execution 来跟踪的,每个 ExecutionVertex 会记录当前的执行,以及之前的执行。

 

 

文章来源

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。