本篇希望對flink的架構有一個概念上的認識,角色之間是如何互動的。
文章目錄
- 一. 整體架構模型
- 二. 架構成員
-
- 1. Jobmanager
- 2. TaskManager
- 3.Client
- 三. 什麼是JobGraph
-
- 1. 使用者程式轉換為JobGraph
- 2. jobGraph
一. 整體架構模型
flink運作時有兩種類型的程序組成:一個JobManager和若幹個TaskManager,也是典型的主從架構。
高可用(HA)設定中可能有多個 JobManager,其中一個始終是 leader,其他的則是 standby。
角色 | 職責 |
---|---|
Jobmanager | 管理叢集的計算資源、job的管理與排程執行、checkpoint的協調 |
taskmanager | 提供計算資源供job運作 |
Client | 解析job為JobGraph對象,然後送出到Jobmanager運作,并監控Job運作的狀态 |
一個job被送出到叢集的過程
客戶将flink jar送出到client端,client将job解析為JobGraph執行個體,然後将jar和JobGraph一起通過RPC送出到jobmanager,送出成功後Jobmanager傳回JobClient給client,用于job的通訊,可以用來擷取job的狀态。jobmanager将job拆分成不同的task并送出到TaskManagr開始作業的運作。
二. 架構成員
1. Jobmanager
jobmanager程序有三個元件組成
元件 | 作用 |
---|---|
ResourceManager | 1. 資源管理:管理task slots。slots資源排程的機關 2. Flink 為不同的環境和資源提供者(例如 YARN、Mesos、Kubernetes 和 standalone)實作了對應的 ResourceManager 3. standalone模式中,ResourceManager 隻能配置設定可用 TaskManager 的 slots,不能啟動新的。 |
Dispatcher | 1. 提供了一個 REST 接口,用來送出 Flink 應用程式執行,并為每個作業啟動一個新的JobMaster。 2. 運作 Flink WebUI 用來提供作業執行資訊。 |
JobMaster | 管理單個JobGraph的執行。 |
Jobmanager的作用:
- 将jobGraph轉換成Execution Graph:jobGraph隻是描述了邏輯圖,Execution Graph會将Graph拆分成不同的執行單元(task),送出到taskmanager不同的slot上。
- 網絡通訊:jobmanager、client、taskmanager之間通過Akka(rpc通訊)實作通訊。其中Akka的核心元件Actor System實作了遠端通訊。
- job的接收與分發
- TaskManager的注冊:當taskmanager啟動時,它會通過akka向jobmanager進行注冊,将自己的資訊交給Jobmanager讓它維護。而且和taskmanager之間進行heartbeat操作。
2. TaskManager
作用 | 描述 |
---|---|
作業執行 | 一個taskmanager中對應多個slot,對于JVM程序,一個slot其實就是一個線程,slot集其實就是線程池。 |
Shuffle Environment管理 | 當有一些算子執行需要shuffle時,需要Data Exchange。 |
Memory Management記憶體管理 | 當task在執行時,會有資料到來,這需要申請一些記憶體單元,管理這些資料,例如序列化反序列化。 |
Rpc通訊 | 通過Akka的核心實作Actor System,進行網路通訊。 |
Network Management網絡資料交換 | 通過netty實作taskmanager之間進行資料互動(上下遊或shuffle) |
接受Jobmanager的資源申請 | jobmanager資源的申請,taskmanager傳回申請的結果給jobmanager。 |
3.Client
client用于生成執行環境,進入使用者的main方法生成jobGraph對象,然後送出任務,将jobGraph和作業所依賴的包送出到jobmanager的dispacher。
三. 什麼是JobGraph
1. 使用者程式轉換為JobGraph
通過DataStream、DataSet API、Flink SQl、Table API等方式可以實作Flink job jar,執行flink run将job送出到Flink。
client接收到jar後,執行器通過反射找到指定類的main方法并執行,執行有本地執行,遠端執行,或在yarn上執行。
調用execute将程式轉換為steamGraph,接着轉換成JobGraph,然後送出到Dispatcher中。
2. jobGraph
使用者的程式不管是通過那種方式實作,Executor都會将抽象為streamGraph,streamGraph隻是Dataflow的一個表達,沒有描述具體執行時算子并發的操作。
JobGraph進一步描述了具體執行時算子的并發、算子之間的互動關系。同樣通過DAG的方式表達了(不同Flink接口實作的)使用者程式。JobGraph描述了job的詳情,是用戶端與叢集之間的job載體。
參考:
https://time.geekbang.org/course/detail/100058801-278258