flink:JobGraph生成过程分析
1、JobGraph是由StreamGraph转换而来,当client将StreamGraph提交后,job启动前会先完成转换,统一的转换入口如下:
2、StreamingJobGraphGenerator类
StreamingJobGraphGenerator的职责就是将StreamGraph转换成JobGraph,在转换的过程中要根据StreamGraph中的节点及边的对应关系进行算子链的合并,同时将一些其他与任务执行相关联的信息复制过来,接下来主要需要关注其中的构造方法、转换方法、判断能否合并的逻辑、算子合并的方法、StreamNode转换为JobVertex等几个核心方法即可梳理清楚其转换的业务
2.1、构造方法
其构造方法中主要包含三个内容,保存了StreamGraph、构造了JobGraph、同时new了一系列的集合容器用于存储转换的中间态
2.2、转换方法createJobGraph
createJobGraph方法中逻辑很清晰,除了合并算子就是复制一些其他执行参数
2.3、setChaining和createChain方法
在这两处完成了算子的合并核心逻辑,其实就是根据能否chain的判定进行不同的处理,其步骤可以归纳为:
a、因为在StreamGraph中已经形成了完整的DAG图,此处直接遍历source节点,从source节点往后挨个去createChain
b,createChain时先拿到当前节点的下游节点,然后递归处理,构建出整个的传递链
c、在构造JobVertex时,如果从前面传递过来的两个节点ID相同,则证明是头结点,则生成一个JobVertex,并将传递链中的后续算子connect起来,如果不是则表示应当是被合并的算子,则仅维护StreamConfig即可
d、于此同时也维护好对应的执行资源数据、格式化数据等
2.4、能否chain成链的判断逻辑
判断很简洁明了,不再赘述
2.5、createJobVertex
如果是头结点时就将头节点转化为一个JobVertex,此处有InputOutputFormatVertex和JobVertex的区别
2.6 connect
此处就是根据不同的策略,将传递链上的对应关系维护到一个JobEdge中去。
最后,总的来看由于在StreamGraph中已经构建好了DAG的关系和映射,在StreamingJobGraphGenerator将这个映射关系再次优化而已,在此过程中还涉及到JobGraph、JobVertex、JobEdge等对象,这些可以对比StreamGraph、StreamNode和StreamEdge更容易理解。