一.DAG图的总体架构:
Flink框架引擎把执行计划抽象为四个层次的数据结构,分别是API层、静态topology、JobGraph、ExecutionGraph等。
具体的结构入下图:
二. 流作业DAG图分析
API层
用户通过StreamApI或是BatchAPI描述Job的逻辑,并通过调用链把作业逻辑操作串联起来,对于用户而言,业务抽象的是一个一个的有特定功能的Operator(操作算子),通过Operator的组合来来描述一个作业的对数据的处理过程。
- 对于流作业:
用户程序通过调用StreamExecutionEnvironment.execute触发StreamGraphGenerator生成StreamGraph。 - .对于批作业:
用户程序通过OptimizerPlanEnvironment.execute触发Optimizer生成OptimizerPlan
静态Graph层
- StreamGraph
首先StreamGraph的核心是一个StreamNode的拓扑图,StreamNode之间是通过StreamEdge连接。
该拓扑图是通过翻译transformations的链表而来,用户的userFunction最终被flink框架封装成StreamTransformation的调用链,然后再翻译成StreamGraph。普通的Operator会通过图生成器( StreamGraphGenerator)的transform方法来生成对于的StreamNode,而实现分流功能的Select操作以及实现分区的分区选择器则被翻译成虚拟节点并加入到StreamGraph中。
下面是的transforms转换成StreamNode的核心代码:
Collection<Integer> transformedIds;
if (transform instanceof OneInputTransformation<?, ?>) {
transformedIds = transformOneInputTransform((OneInputTransformation<?, ?>) transform);
} else if (transform instanceof TwoInputTransformation<?, ?, ?>) {
transformedIds = transformTwoInputTransform((TwoInputTransformation<?, ?, ?>) transform);
} else if (transform instanceof SourceTransformation<?>) {
transformedIds = transformSource((SourceTransformation<?>) transform);
} else if (transform instanceof SinkTransformation<?>) {
transformedIds = transformSink((Sink