相信使用flink作为分布式数据计算框架的朋友们都知道我们在flink中处理批处理作业和流计算作业是分两套API进行的,而其中批处理作业都会转换为Plan,并且声称优化计划OptimizedPlan,之后会通过编译的形式生成jobGraph。首先是根据execute创建Plan类型的计划。调用createProgramPlan进行创建,返回类型为Plan。在ExecutionEnvironment类中生成计划,之后会调用翻译算子的方法进入算子翻译器。具体语句如下:
对这个算子进行翻译,生成计划进入到TranslateToPlan方法中,就是以下的代码段,逊汗提中递归的翻译了算子,从sink开始进行前向遍历,之后都进入translate方法中
算子翻译
transalate方法分为对于sink节点的翻译以及对于非sink节点的翻译,通过sink.getDataSet进行翻译,得到前驱,之后讨论前驱是属于什么类型的算子,可以看到标注的那一行,递归地在tranbslate方法中调用自身,接着连接自己的前驱,并且通过这个链式的链接方法设置资源分配:
算子翻译中的递归方法通过这种递归一定要找到整个数据起点才可以继续进行,也就是DataSource,此时在进入下一条语句getName方法,由于DataSet前驱为空值,因此这条语句输出为空。再之后通过获取的OPerator类型为操作符进行赋值操作,通过java定义好的map类中的put方法进行赋值,再将其与后继节点进行连接。
算子类型的赋值通过put方法后返回一个Operator类型作为翻译的结果,再之后通过tanslateToDataFlow方法,进入特定的类中,例如本例子中operator类型是flatMap,因此进入FlatMapOperatorBase方法中去建立FaltMap算子与input的链接关系。input作为整个plan的入口进行链接。通过translateToDataFlow类中的setInput方法将FlatMap算子与输入端的数据源连到一起。
建立连接的方法经过以上步骤已将算子连接起来,生成一个执行计划,之后会阐述计划是如何进行优化的。
网友评论