剖析Flink運行時的整體架構 | 附流程圖

「數倉寶貝庫」,帶你學數據!

導讀:本文我們瞭解Flink運行時的整體架構。



作爲Flink整個架構體系最底層的基礎模塊,運行時提供了不同Flink作業運行過程依賴的基礎執行環境。Flink客戶端會將作業轉換爲JobGraph結構並提交至集羣的運行時中,此時運行時會對作業進行調度並拆分成Task繼續調度和執行。運行時中的核心組件和服務會分工並協調合作,最終完成整個Job的調度和執行。接下來我們重點了解Flink運行時的整體架構。


我們先來看運行時的整體架構,如下圖所示。

Flink運行時整體流程圖


上圖中可以看出,Flink運行時包含了Dispatcher、ResourceManager、

JobManager和TaskManager等主要組件,下面介紹每個組件的主要功能。



0 1
Dispatcher


Dispatcher主要負責接收客戶端提交的JobGraph對象,例如CLI客戶端或Flink Web UI提交的任務最終都會發送至Dispatcher組件,由Dispatcher組件對JobGraph進行分發和執行,其中就包含根據JobGraph對象啓動JobManager服務,專門用於管理整個任務的生命週期。



02
ResourceManager


ResourceManager主要負責管理Flink集羣中的計算資源,其中計算資源主要來自TaskManager組件。ResourceManager主要接收來自JobManager的SlotRequest。如果集羣採用Native模式部署,則ResourceManager會動態地向集羣資源管理器申請Container並啓動TaskManager,例如Hadoop Yarn、Kubernetes等。對於不同的集羣資源管理器,Resource-Manager的實現也會有所不同。



03
JobManager


Dispatcher會根據接收的JobGraph對象爲任務創建JobManager服務,其中JobManager服務管理了整個任務的生命週期,同時負責將JobGraph轉換成ExecutionGraph結構。JobManager通過內部調度程序對ExecutionGraph中的ExecutionVertex節點進行調度和執行,最終會向指定的TaskManager提交和運行Task實例,同時監控各個Task的運行狀況,直到整個作業中所有的Task都執行完畢或停止。和Dispatcher組件一樣,JobManager組件本身也是RPC服務,因此具備RPC通信的能力,可以與ResourceManager進行RPC通信,申請任務的計算資源。當任務執行完畢後,JobManager服務也會關閉,同時釋放任務佔用的計算資源。



04
TaskManager


TaskManager負責向整個集羣提供Slot計算資源,同時管理了JobManager提交的Task任務。TaskManager會向JobManager服務提供從ResourceManager中申請和分配的Slot計算資源,JobManager最終會根據分配到的Slot計算資源將Task提交到TaskManager上運行。


接下來我們看整個集羣中各個主要組件的啓動流程。這裏我們以Session類型的集羣爲例進行說明。從Flink運行時整體流程圖中可以看出Flink Session集羣的啓動流程主要包含如下步驟。

  • 用戶通過客戶端命令啓動Session Cluster,此時會觸發整個集羣服務的啓動過程,客戶端會向集羣資源管理器申請Container計算資源以啓動運行時中的管理節點。

  • ClusterManagement會爲運行時集羣分配Application主節點需要的資源並啓動主節點服務,例如在Hadoop Yarn資源管理器中會分配並啓動Flink管理節點對應的Container。

  • 客戶端將用戶提交的應用程序代碼經過本地運行生成JobGraph結構,然後通過ClusterClient將JobGraph提交到集羣運行時中運行。

  • 此時集羣運行時中的Dispatcher服務會接收到ClusterClient提交的JobGraph對象,然後根據JobGraph啓動JobManager RPC服務。JobManager是每個提交的作業都會單獨創建的作業管理服務,生命週期和整個作業的生命週期一致。

  • 當JobManager RPC服務啓動後,下一步就是根據JobGraph配置的計算資源向ResourceManager服務申請運行Task實例需要的Slot計算資源。

  • 此時ResourceManager接收到JobManager提交的資源申請後,先判斷集羣中是否有足夠的Slot資源滿足作業的資源申請,如果有則直接向JobManager分配計算資源,如果沒有則動態地向外部集羣資源管理器申請啓動額外的Container以提供Slot計算資源。

  • 如果在集羣資源管理器(例如Hadoop Yarn)中有足夠的Container計算資源,就會根據ResourceManager的命令啓動指定的TaskManager實例。

  • TaskManager啓動後會主動向ResourceManager註冊Slot信息,即其自身能提供的全部Slot資源。ResourceManager接收到TaskManager中的Slot計算資源時,就會立即向該TaskManager發送Slot資源申請,爲JobManager服務分配提交任務所需的Slot計算資源。

  • 當TaskManager接收到ResourceManager的資源分配請求後,TaskManager會對符合申請條件的SlotRequest進行處理,然後立即向JobManager提供Slot資源。

  • 此時JobManager會接收到來自TaskManager的offerslots消息,接下來會向Slot所在的TaskManager申請提交Task實例。TaskManager接收到來自JobManager的Task啓動申請後,會在已經分配的Slot卡槽中啓動Task線程。

  • TaskManager中啓動的Task線程會週期性地向JobManager彙報任務運行狀態,直到完成整個任務運行。


以上就是運行時集羣的啓動過程,包括對集羣中主要組件的初始化和啓動以及用戶作業提交和執行的全部流程。


- END -


本文摘編於《Flink設計與實現:核心原理與源碼解析》,經出版方授權發佈。

推薦閱讀:Flink貢獻者/第四範式AI數據平臺架構師張利兵撰寫,源碼剖析Flink設計思想、架構原理以及各模塊實現原理,大量架構圖、UML圖。


6個方面揭祕數據倉庫面試標準

零售業電商標籤從0到1的構建方法

一文肝會炫酷圖表利器Pyecharts!

七夕到了,用Python給女朋友比心表白

數倉治理:數據地圖長什麼樣?

DataStream API 應用實例

終於有人將Seaborn可視化講明白了

兩大步驟,29行代碼學會數據清洗


本文分享自微信公衆號 - 大數據流動(RealtimeBigdata)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章