4 ExecutionGraph 在 JobManager生成
client 生成 JobGraph 之后,就通过 submitJob 提交给 JobManager,JobManager 会根据JobGraph 生成对应的 ExecutionGraph。
ExecutionGraph 是 Flink 作业调度时使用到的核Ṩ数据结构,它包含每一个并ᒦ的 task、每⇿个 intermediate stream 以及它们之间的关系。
以 per-job 模式为例,分析 ExecutionGraph 的生成逻辑:
接 1.3.6,在 Dispacher 创建 JobManagerRunner 时,调用 createJobManagerRunner:
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210312213012377-1486993619.png)
下面是源码详细的跳转过程,可以直接略过,看后面 buildGraph()方法的分析:
Dispatcher.java
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210312213119557-16243214.png)
DefaultJobManagerRunnerFactory.java
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210312213141614-103095187.png)
JobManagerRunnerImpl.java
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210312213213366-1883049839.png)
DefaultJobManagerRunnerFactory.java
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210312213241652-2130714706.png)
JobMaster.java
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210312213328204-1598438515.png)
DefaultSchedulerFactory.java
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210312213415857-446142730.png)
SchedulerBase.java
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210312213500019-37708769.png)
接下来,分析生成 ExecutionGraph 的核心逻辑:
ExecutionGraphBuilder.java
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210312213651275-242497514.png)
看这个方法之前,需要知道,ExecutionVertex 的 inputEdges 变量,是一个二维数据。它表示了这个 ExecutionVertex 上每一个 input 所包含的 ExecutionEdge 列表。
即,如果 ExecutionVertex 有两个不同的输入:输入 A 和 B。其中输入 A 的 partition=1,输 入 B 的 partition=8 , 那 么 这 个 二 维 数 组 inputEdges 如 下 ( 以 irp 代 替IntermediateResultPartition)
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210312214309350-1606360386.png)
到这里为止,ExecutionJobGraph 就创建完成了。