flink1.10版local模式提交job流程分析
阿新 • • 發佈:2020-11-19
1、WordCount程式例項
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119193833769-1741975195.png)
2、本地監聽9000埠後測試結果
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119194034717-1491200514.png)
3、job提交流程
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119194153161-390492296.jpg)
4、local模式執行StreamGraph任務
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119194244457-124213266.jpg)
5、流程分析
flink job提交流程個人理解可以大致分為定義和提交兩個環節:以下以WordCount程式為例進行分析
5.1 定義流程
流程定義包含執行環境構建和演算法流程定義:
5.1.1 執行環境構建
執行環境是整個flink程式執行的上下文,記錄其相關配置,並提供一系列方法,如讀取輸入流等,同時提供execute真正開啟提交計算的入口。
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119200020303-759146891.png)
下面具體來看getExecutionEnvironment方法
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119200056043-2143402953.png)
本地執行時,其實執行的是createStreamExecutionEnvironment方法
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119200121129-308159638.png)
繼續往下看發現不斷過載createLocalEnvironment方法,最終new了一個LocalStreamEnvironment物件,並設定其並行度等於當前機器的CPU核心數
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119200145455-1018671546.png)
至此執行環境構建完畢,返回一個LocalStreamEnvironment物件
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119200310314-623556026.png)
5.1.2 演算法流程定義
演算法流程簡單來說通常包含三個部分:定義source、operator和sink,對應到示例程式為socketTextStream、(flatMap、keyBy、sum)和print三部分
首先:socketTextStream其本質是向執行環境中添加了SocketTextStreamFunction作為source
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119201640519-41787865.png)
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119201654453-13937520.png)
其次:faltMap、keyBy和sum其本質是向執行環境中新增FlatMapFunction、KeySelector和AggregationFunction三種運算元
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119201019362-368747967.png)
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119201051432-257104240.png)
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119201107180-1434863862.png)
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119201155295-114802492.png)
下面分別為keyBy和sum的關鍵細節
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119201433443-1229028435.png)
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119201554994-215241994.png)
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119201612592-1448641850.png)
最後:print其本質是向執行環境中新增PrintSinkFunction作為sink
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119201719424-1635835169.png)
5.2 提交任務
提交任務個人理解又包含client提交作業和Executor提交作業兩部分
5.2.1 第一個環節client根據流程定義提交作業如job提交流程圖所示
這個過程其實又可以可以分為兩部分:生成StreamGraph和executeAsync兩部分:
首先看生成StreamGraph部分,這一部分比較簡單,將執行環境中定義好的流程引數構建出StreamGraph即可,核心細節如下:
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119203229301-1151549209.png)
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119203258607-1822396902.png)
executeAsync部分其實就是載入一個PipelineExecutor提交StreamGraph,細節如下:
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119204025944-1776584252.png)
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119204115764-1605877189.png)
5.2.2 第二個環節Executor提交作業部分原始碼如下:
![](https://img2020.cnblogs.com/blog/2204822/202011/2204822-20201119204242880-1142692463.png)
本地模式主要包含了以下環節:
1> 由StreamGraph生成JobGraph
2> 建立啟動miniCluster叢集,啟動JobMaster等等
3> 提交任務到Jo