flink的执行计划——StreamGraph

flink的执行计划分为四层:

flink的执行计划——StreamGraph_第1张图片

通过Stream API提交的文件,首先会被翻译成StreamGraph。StreamGraph的生成的逻辑是在StreamGraphGenerate类的generate方法。而这个generate的方法又会在StreamExecutionEnvironment.execute方法被调用。

首先生成StreamGraph的方法如下:

flink的执行计划——StreamGraph_第2张图片

这个方法遍历了每一个Transformation。这里的Transformation要解释一下。Transformation是描述了一个或者多个DataStream转换成其他DataStream的操作。比如DataStream的map方法:

flink的执行计划——StreamGraph_第3张图片

DataStream的map、flatmap、filter、union方法都是利用transform来描述这种转换的关系。比如我们来看map:

flink的执行计划——StreamGraph_第4张图片

map被包装成了StreamMap类型,让我们继续跟进这个transform方法:

flink的执行计划——StreamGraph_第5张图片

这里将转换后的resultTransform放到了一个List。

flink的执行计划——StreamGraph_第6张图片

现在我们再回去看之前StreamGraphGenerate类的generateInternal方法。这个方法遍历了每一个transformation,并对其调用transform方法。根据不同的类型,调用transformXXXX

flink的执行计划——StreamGraph_第7张图片

看下transformSink这个方法


flink的执行计划——StreamGraph_第8张图片

首先会递归遍历他的每一个上游input,保证上游全部处理完毕。然后添加Edge(input->sink)。

这篇文章分析了transformOnInputTransform(transform)

再看一个select的逻辑,这里没有创建任何Edge,只是新建一个虚节点。

flink的执行计划——StreamGraph_第9张图片

而在addEdge的逻辑里,对于select是如此处理的,利用虚id获得真正的上游id,然后进行绑定:

flink的执行计划——StreamGraph_第10张图片

而最终的Edge的建立是在这段代码之后,如果partition为空,并且入节点和出节点的并发度相同则使用FowardPartition否则使用ReblancePartitioner,然后分别构建入度和出度:

flink的执行计划——StreamGraph_第11张图片

你可能感兴趣的:(flink的执行计划——StreamGraph)