Flink中批處理優(yōu)化器的作用以及流程調(diào)試(一)

以批處理程序中的wordCount為例,調(diào)試一下Plan的生成以及對于優(yōu)化計劃OptimizedPlan的轉(zhuǎn)化過程。至于如何進入Execute接口的上述過程將要 放到以后進行說明,直接從生成批處理計劃Plan開始:


LocalExecutor類的一個方法

我們可以見到當用戶使用env.ecxecute()的時候,進入Localexecutor類生成Plan,Plan p來接收createProgramPlan的返回值,傳遞的參數(shù)僅為jobName,jobName一般是創(chuàng)建這個作業(yè)的日期和時間。下面我們就進入這個方法createProargamoPlan中??梢栽趀xecutionEnvironment類中找到兩個名字相同的方法createProgramPlan,這是java函數(shù)的重載。通過jobName進入第一個,第一個返回第二個方法的bool值,默認為真,代表重建一個作業(yè)的sink執(zhí)行,即一個新階段的作業(yè)的執(zhí)行:

ExecutionEnvironment類中的第一個創(chuàng)建方法



同名類下的第二個創(chuàng)建方法

可以看到算子翻譯器OperatorTranslation()對批處理程序中的算子進行翻譯轉(zhuǎn)換。跳轉(zhuǎn)進入到這個方法中可以發(fā)現(xiàn)通過從sink節(jié)點開始遍歷,將遇到的算子轉(zhuǎn)換成Plan的形式,使用一個translate的方法。translate負責將flink中的算子獲取并且注冊。如何實現(xiàn)算子的翻譯以及注冊為Operator類型可以見下面的博客,該博客介紹了從批處理程序生成優(yōu)化計劃的過程:

https://blog.csdn.net/yanghua_kobe/article/details/55224512?locationNum=5&fps=1

對應源代碼,生成Plan主是通過下面的這個語句:


生成計劃

那么是怎么進入到計劃優(yōu)化,即PanOptimizer class里面的呢?還是通過LocalExecutor中的execute方法生成的,返回類型為jobExecutionResult。關(guān)鍵的兩句如下:


生成優(yōu)化計劃以及編譯這個計劃

通過第一句可以進入到Optimizer類中,這個Optimizer類它接受用戶指定的程序計劃并創(chuàng)建一個優(yōu)化計劃,其中包含有關(guān)如何進行物理執(zhí)行的準確描述。 它首先將用戶程序轉(zhuǎn)換為內(nèi)部優(yōu)化程序表示,然后在運輸策略和本地策略的不同備選方案之間進行選擇。進入到Optimizer類下面后可以看到兩個名為compile的方法,返回類

缺省OptimizerPostPass postPasser參數(shù)的compile方法

型均為OptimizedPlan。話說flink中很喜歡如下操作,首先當用戶未給出另一形參的時候先通過一個方法從第一個參數(shù)中得到另一個類型的返回值,在通過return調(diào)用重載函數(shù)。上圖中的OptimizedPostPass得到以后,調(diào)用下面的compile方法。


真正的compile Plan的方法

此步驟執(zhí)行以下操作:

1)它為每個運算符創(chuàng)建一個優(yōu)化器計劃節(jié)點

2)它通過通道連接它們

3)它查找有關(guān)本地策略和頻道類型的提示相應地設置類型和策略

4)它估算數(shù)據(jù)源的數(shù)據(jù)量和通過計劃傳播這些估算值

首先確定dataSink節(jié)點,若有多個就通過上述遍歷的方式確定一個root節(jié)點。之后通過BranchVisitor進行分支定界,估算PlanNode的成本,具體的成本估算方式我之后會給出介紹。首先跳過以上步驟,optimizer包下的costs包可以進行成本估算。內(nèi)涵默認的成本估算以及根據(jù)PlanNode之間的數(shù)據(jù)傳輸策略進行估算,選取最優(yōu)的執(zhí)行計劃作為bestPlan。通過bestPlan的隊首節(jié)點可以找到sink或者sink節(jié)點的集合。根據(jù)這個bestPlanRoot進行下面的操作:


使用PlanFinalizer類創(chuàng)建優(yōu)化計劃


PlanFinalizer類通過計算每個PlanNode的代價、權(quán)重之后,返回Optimizer類型的結(jié)果。

OptimizedPlan主要封裝了如下這些屬性:

dataSources:SourcePlanNode集合;

dataSinks:SinkPlanNode集合;

allNodes:優(yōu)化后計劃中的所有PlanNode節(jié)點集合;

originalProgram:最初未被優(yōu)化的Plan對象

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容