flink的执行计划分为四层:
通过Stream API提交的文件,首先会被翻译成StreamGraph。StreamGraph的生成的逻辑是在StreamGraphGenerate类的generate方法。而这个generate的方法又会在StreamExecutionEnvironment.execute方法被调用。
首先生成StreamGraph的方法如下:
这个方法遍历了每一个Transformation。这里的Transformation要解释一下。Transformation是描述了一个或者多个DataStream转换成其他DataStream的操作。比如DataStream的map方法:
DataStream的map、flatmap、filter、union方法都是利用transform来描述这种转换的关系。比如我们来看map:
map被包装成了StreamMap类型,让我们继续跟进这个transform方法:
这里将转换后的resultTransform放到了一个List。
现在我们再回去看之前StreamGraphGenerate类的generateInternal方法。这个方法遍历了每一个transformation,并对其调用transform方法。根据不同的类型,调用transformXXXX
看下transformSink这个方法
首先会递归遍历他的每一个上游input,保证上游全部处理完毕。然后添加Edge(input->sink)。
这篇文章分析了transformOnInputTransform(transform)
再看一个select的逻辑,这里没有创建任何Edge,只是新建一个虚节点。
而在addEdge的逻辑里,对于select是如此处理的,利用虚id获得真正的上游id,然后进行绑定:
而最终的Edge的建立是在这段代码之后,如果partition为空,并且入节点和出节点的并发度相同则使用FowardPartition否则使用ReblancePartitioner,然后分别构建入度和出度: