JobMaster调用resetAndStartScheduler方法开始,接着创建了DefaultScheduler,在创建的同时,将JobGraph结构转换为ExecutionGraph,用于task的调度。然后通过DefaultScheduler处理ExecutionGraph
在创建和初始化SchedulerNG的过程中,会在SchedulerNG中同步创建ExecutionGraph对象,代码如下。
this.executionGraph = createAndRestoreExecutionGraph(jobManagerJobMetricGroup,
checkNotNull(shuffleMaster), checkNotNull(partitionTracker));
1.ExecutionGraph的核心概念
如图一所示, 相比
JobGraph,ExecutionGraph是一个并行版本的jobGraph。同时,ExecutionGraph是Server端产生的
-
ExecutionJobVertex:
对于每一个JobVertex,会转换成ExecutionJobVertex.ExecutionJobVertex的数量代表了该JobVertex的并行度。如果一个算子的并行度为100,则拥有100个ExecutionVertices。每一个ExecutionVertex主要用于追踪一个子任务的执行。因此一个ExecutionJobVertex中的所有ExecutionVertex节点组合起来能够完成一个 Operator的执行。每个ExecutionVertex都具备Execution变量,Execution负责向TaskExecutor中提交相应的Task到TaskManager。 -
IntermediateResult:
主要是ExecutionJobVertex上游算子的中间数据集,每个IntermediateResult包含多个IntermdiateResultParitition。IntermdiateResultParitition的个数等于JobVertex的并发度。也叫算子的并行度 -
Execution:
代表单个节点的一次执行,该类主要是用于维护和保留一个节点的单次执行的状态以及相关的资源。Execution是对ExecutionVertex的一次执行,通过ExecutionAttemptId来唯一标识。JobManager和TaskManager对于Task的部署以及执行状态都是通过ExecutionAttemptId来标识。有故障或者重算的情况下,ExecutionVertex会有多个ExecutionAttemptId。ExecutionVertex节点中对应的执行单元,ExecutionVertex可以被执行多次,如recovery、re-computation和re-configuration等操作都会导致ExecutionVertex重新启动和执行,此时就会通过Execution记录每次执行的操作,Execution提供了向TaskExecutor提交Task的方法。 -
ExecutionEdge:
ExecutionEdge是ExecutionVertex的输入,同时连接了IntermediateResult和ExecutionEdge。同时,ExecutionEdge的具体连接方式是通过JobEdge的DistributionPattern来构建的。有POINTWISE和ALL_TO_ALL两种形式。主要是用来连接当前ExecutionVertex与上游的IntermediateResultPartition。首先,每一个ExecutionVertex对应一个IntermediateResultPartition,POINTWISE代表IntermediateResultPartition只对应于下游的一个. 而ALL_TO_ALL方式代表数据正在Shuffle
2.ExecutionGraph相关总结
- 1
JobVertex-> 1ExetuionJobVertex - 1
ExetuionJobVertex-> nExecutionVertex, n为Task的并行度 - 1
ExecutionVertex-> 1IntermediateResultPartition,ExecutionVertex为生产者 - 1
IntermediateResultPartition-> (1或者n)ExecutionVertex,ExecutionVertex为消费者。 1个IntermediateResultPartition至少被1个ExecutionVertex消费,也有可能被多个ExecutionVertex消费,取决IntermediateResultPartition和ExecutionVertex的个数,以及ExecutionEdge的连接方式。
3. Execution重要方法
Execution.deploy
用于部署Execution的相关任务SchedulerBase.createAndRestoreExecutionGraph
SchedulerBase实现SchedulerNG,该方法用于生成ExecutionGraph
4. 参考文献
flink设计与实现:核心原理与源码解析