【Flink】基礎二、本地與遠端啟動
一、本地模式下的excute
根據程式碼生成streamGraph,再生成jobGraph,傳送給Flink生成task,將JobGraph和配置交給flink叢集去執行,啟動任務。
二、遠端模式下excute
第一步仍然是獲取StreamGraph,然後呼叫executeRemotely方法進行遠端執行。client生成jobGarph,交個jobClient,與JobManage通過atcor通訊。
三、本地啟動
minicluster,呼叫submitJob方法
到dispatcher接受job之後,啟動一個jobmanageRunner,啟動job,再交給jobMaster去處理,使用executionGraph啟動整個執行圖,任務就啟動了。
四、三層圖結構
最後的物理執行圖並非flink的資料結構,而是程式開始執行後,各個task分佈在不同的節點上,所形成的物理上的關係。
StreamGraph和JobGraph,還有一種是ExecutionGraph,是用於排程的基本資料結構。
五、operator chain
多個操作運算元放在一個執行緒執行,減少執行緒切換,減少訊息的序列化/反序列化,減少資料在緩衝區的交換,減少了延遲的同時提高整體的吞吐量
六、jobGraph
JobManager的actor接收到來自client端的請求後,會執行一個submitJob方法,主要做以下事情:
- 向BlobLibraryCacheManager註冊該Job;
- 構建ExecutionGraph物件;
- 對JobGraph中的每個頂點進行初始化;
- 將DAG拓撲中從source開始排序,排序後的頂點集合附加到Exec> - utionGraph物件;
- 獲取檢查點相關的配置,並將其設定到ExecutionGraph物件;
- 向ExecutionGraph註冊相關的listener;
- 執行恢復操作或者將JobGraph資訊寫入SubmittedJobGraphStore以在後續用於恢復目的;
- 響應給客戶端JobSubmitSuccess訊息;
- 對ExecutionGraph物件進行排程執行;
最後,JobManger會返回訊息給JobClient,通知該任務是否提交成功。
七、ExecutionGraph
在jobmanage端生成,只是改動了JobGraph的每個節點
八、任務排程
Flink 叢集啟動後,首先會啟動一個 JobManger 和多個的 TaskManager。JobManager 再把來自不同使用者的任務發給 不同的TaskManager 去執行,每個TaskManager管理著多個task,task是執行計算的最小結構。TaskManager 之間以流的形式進行資料的傳輸。TaskManager和job並非一一對應的關係。flink排程的最小單元是task而非TaskManager,也就是說,來自不同job的不同task可能運行於同一個TaskManager的不同執行緒上。
Task slot是一個TaskManager內資源分配的最小載體,每個TaskManager會將其所佔有的資源平分給它的slot。每個 TaskManager 有一個slot,也就意味著每個task執行在獨立的 JVM 中。每個 TaskManager 有多個slot的話,也就是說多個task執行在同一個JVM中。同一個JVM程序中的task,可以共享TCP連線(基於多路複用)和心跳訊息,可以減少資料的網路傳輸,也能共享一些資料結構,一定程度上減少了每個task的消耗。每個slot可以接受單個task,也可以接受多個連續task組成的pipeline。
為了達到共用slot的目的,除了可以以chain的方式pipeline運算元,我們還可以允許SlotSharingGroup。
可以把不能被chain成一條的兩個操作如flatmap和key&sink放在一個TaskSlot裡執行,這樣做可以獲得以下好處:
- 共用slot使得我們不再需要計算每個任務需要的總task數目,直接取最高運算元的並行度即可
- 對計算資源的利用率更高。例如,通常的輕量級操作map和重量級操作Aggregate不再分別需要一個執行緒,而是可以在同一個執行緒內執行,而且對於slot有限的場景,我們可以增大每個task的並行度了。 接下來我們還是用官網的圖來說明flink是如何重用slot的: