1. 程式人生 > 其它 >【Flink】基礎二、本地與遠端啟動

【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的: