flink任务提交与执行4-ExecutionGraph的调度与执行

1,005 阅读2分钟

JobMaster调用resetAndStartScheduler方法开始,接着创建了DefaultScheduler,在创建的同时,将JobGraph结构转换为ExecutionGraph,用于task的调度。然后通过DefaultScheduler处理ExecutionGraph

在创建和初始化SchedulerNG的过程中,会在SchedulerNG中同步创建ExecutionGraph对象,代码如下。

this.executionGraph = createAndRestoreExecutionGraph(jobManagerJobMetricGroup, 
   checkNotNull(shuffleMaster), checkNotNull(partitionTracker));

1.ExecutionGraph的核心概念

如图一所示, 相比JobGraphExecutionGraph是一个并行版本的jobGraph。同时,ExecutionGraph是Server端产生的

  1. ExecutionJobVertex:
    对于每一个JobVertex,会转换成ExecutionJobVertex.ExecutionJobVertex的数量代表了该JobVertex的并行度。如果一个算子的并行度为100,则拥有100个ExecutionVertices。每一个ExecutionVertex主要用于追踪一个子任务的执行。因此一个ExecutionJobVertex中的所有ExecutionVertex节点组合起来能够完成一个 Operator的执行。每个ExecutionVertex都具备Execution变量,Execution负责向TaskExecutor中提交相应的TaskTaskManager

  2. IntermediateResult:
    主要是ExecutionJobVertex上游算子的中间数据集,每个IntermediateResult包含多个IntermdiateResultParititionIntermdiateResultParitition的个数等于JobVertex的并发度。也叫算子的并行度

  3. Execution:
    代表单个节点的一次执行,该类主要是用于维护和保留一个节点的单次执行的状态以及相关的资源。Execution 是对 ExecutionVertex 的一次执行,通过 ExecutionAttemptId 来唯一标识。JobManagerTaskManager对于Task的部署以及执行状态都是通过ExecutionAttemptId来标识。有故障或者重算的情况下,ExecutionVertex会有多个ExecutionAttemptIdExecutionVertex节点中对应的执行单元,ExecutionVertex可以被执行多次,如recoveryre-computationre-configuration等操作都会导致ExecutionVertex重新启动和执行,此时就会通过Execution记录每次执行的操作,Execution提供了向TaskExecutor提交Task的方法。

  4. ExecutionEdge:
    ExecutionEdgeExecutionVertex的输入,同时连接了IntermediateResultExecutionEdge。同时,ExecutionEdge的具体连接方式是通过JobEdgeDistributionPattern来构建的。有POINTWISEALL_TO_ALL两种形式。主要是用来连接当前ExecutionVertex与上游的IntermediateResultPartition。首先,每一个ExecutionVertex对应一个IntermediateResultPartitionPOINTWISE代表IntermediateResultPartition只对应于下游的一个. 而 ALL_TO_ALL方式代表数据正在Shuffle

executionGraphi.png

图一

2.ExecutionGraph相关总结

  • 1 JobVertex -> 1 ExetuionJobVertex
  • 1 ExetuionJobVertex -> n ExecutionVertex , n为Task的并行度
  • 1 ExecutionVertex -> 1 IntermediateResultPartition ,ExecutionVertex为生产者
  • 1 IntermediateResultPartition -> (1或者n) ExecutionVertex , ExecutionVertex为消费者。 1个IntermediateResultPartition至少被1个ExecutionVertex消费,也有可能被多个ExecutionVertex消费,取决IntermediateResultPartitionExecutionVertex的个数,以及ExecutionEdge的连接方式。

3. Execution重要方法

  1. Execution.deploy
    用于部署Execution的相关任务
  2. SchedulerBase.createAndRestoreExecutionGraph
    SchedulerBase实现SchedulerNG,该方法用于生成ExecutionGraph

4. 参考文献

flink设计与实现:核心原理与源码解析