flink的執(zhí)行計劃分為四層:
通過Stream API提交的文件骏全,首先會被翻譯成StreamGraph锻梳。StreamGraph的生成的邏輯是在StreamGraphGenerate類的generate方法。而這個generate的方法又會在StreamExecutionEnvironment.execute方法被調(diào)用。
首先生成StreamGraph的方法如下:
這個方法遍歷了每一個Transformation。這里的Transformation要解釋一下。Transformation是描述了一個或者多個DataStream轉(zhuǎn)換成其他DataStream的操作辖众。比如DataStream的map方法:
DataStream的map、flatmap和敬、filter赵辕、union方法都是利用transform來描述這種轉(zhuǎn)換的關(guān)系。比如我們來看map:
map被包裝成了StreamMap類型概龄,讓我們繼續(xù)跟進(jìn)這個transform方法:
這里將轉(zhuǎn)換后的resultTransform放到了一個List还惠。
現(xiàn)在我們再回去看之前StreamGraphGenerate類的generateInternal方法。這個方法遍歷了每一個transformation私杜,并對其調(diào)用transform方法蚕键。根據(jù)不同的類型,調(diào)用transformXXXX
看下transformSink這個方法
首先會遞歸遍歷他的每一個上游input衰粹,保證上游全部處理完畢锣光。然后添加Edge(input->sink)。
這篇文章分析了transformOnInputTransform(transform)
再看一個select的邏輯铝耻,這里沒有創(chuàng)建任何Edge誊爹,只是新建一個虛節(jié)點。
而在addEdge的邏輯里瓢捉,對于select是如此處理的频丘,利用虛id獲得真正的上游id,然后進(jìn)行綁定:
而最終的Edge的建立是在這段代碼之后泡态,如果partition為空搂漠,并且入節(jié)點和出節(jié)點的并發(fā)度相同則使用FowardPartition否則使用ReblancePartitioner,然后分別構(gòu)建入度和出度: