天天看點

流計算架構Flink的運作架構

一、Flink運作時的元件

流計算架構Flink的運作架構

1、作業管理器(JobManager)

1)控制一個應用程式執行的主程序,也就是說,每個應用程式都會被一個不同的JobManager所控制執行。

2)JobManager會先接收到要執行的應用程式,這個應用程式會包括:作業圖(JobGraph)、邏輯資料流圖(logical dataflow graph)和打包了所有的類、庫和其他資源的JAR包。

3)JobManager會把JobGraph轉換成一個實體層面的資料流圖,這個圖被叫做“執行圖”(ExecutionGraph),包含了所有可以并發執行的任務。

4)JobManager會向資料總管(ResourceManager)請求執行任務必要的資源,也就是任務管理器(TaskManager)上的插槽(slot)。一旦它擷取到了足夠的資源,就會将執行圖分發到真正運作它們的TaskManager上。而在運作過程中,JobManager會負責所有需要中央協調的操作,比如說檢查點(checkpoints)的協調。

2、任務管理器(TaskManager)

1)Flink中的工作程序,通常在Flink中會有多個TaskManager運作,每一個TaskManager都包含了一定數量的插槽(slots)。插槽的數量限制了TaskManager能夠執行的任務數量。

2)啟動之後,TaskManager會向資料總管注冊它的插槽;收到資料總管的指令後,TaskManager就會将一個或者多個插槽提供給JobManager調用。JobManager就可以向插槽配置設定任務(tasks)來執行了。

3)在執行過程中,一個TaskManager可以跟其它運作同一應用程式的TaskManager交換資料。

3、資料總管(ResourceManager)

1)主要負責管理任務管理器(TaskManager)的插槽(slot),TaskManager插槽是Flink中定義的處理資源單元;

2)Flink為不同的環境和資源管理工具提供了不同資料總管,比如YARN、Mesos、K8s,以及standalone部署。

3)當JobManager申請插槽資源時,ResourceManager會将有空閑插槽的TaskManager配置設定給JobManager。如果ResourceManager沒有足夠的插槽來滿足JobManager的請求,它還可以向資源提供平台發起會話,以提供啟動TaskManager程序的容器。

4、分發器(Dispatcher)

1)可以跨作業運作,它為應用送出提供了REST接口;

2)當一個應用被送出執行時,分發器就會啟動并将應用移交給一個JobManager;

3)Dispatcher也會啟動一個Web UI,用來友善地展示和監控作業執行的資訊;

4)Dispatcher在架構中可能并不是必需的,這取決與應用送出運作的方式;

二、任務送出流程

流計算架構Flink的運作架構

 1)基于YARN的任務送出流程

流計算架構Flink的運作架構

三、任務排程原理

流計算架構Flink的運作架構

1、TaskManager和Slots

流計算架構Flink的運作架構

1)Flink中每一個TaskManager都是一個JVM程序,它可能會在獨立的線程上執行一個或多個子任務;

2)為了控制一個TaskManager能夠接收多少個task,TaskManager通過task slot來進行控制(一個TaskManager至少有一個slot)

流計算架構Flink的運作架構

3)預設情況下,Flink允許子任務共享slot,即使它們是不同任務的子任務,這樣的結果是,一個slot可以儲存作業的整個管道;

4)Task Slot是靜态的概念,是指TaskManager具有的并發執行能力;

流計算架構Flink的運作架構
流計算架構Flink的運作架構

2、程式與資料流(DataFlow)

流計算架構Flink的運作架構

1)所有的Flink程式都是由三部分組成的:Source、Transformation和Sink。

2)Source負責讀取資料源,Transformation利用各種算子進行處理加工,Sink負責輸出;

3)在運作時,Flink上運作的程式會被映射成“邏輯資料流”(dataflows).它包含了這三部分;

4)每一個dataflow以一個或多個sources開始以一個或多個sinks結束,dataflow類似于任意的有向無環圖(DAG)

5)在大部分情況下,程式中的轉換運算(Transformation)跟dataflow中的算子(operator)是一一對應的關系;

流計算架構Flink的運作架構

3、執行圖(ExecutionGraph)

1)Flink中的執行圖可以分成四層:StreamGraph——>JobGraph——>ExecutionGraph——>實體執行圖;

2)StreamGraph:是根據使用者通過Stream API編寫的代碼生成的最初的圖。用來表示程式的拓撲結構;

3)JobGraph:StreamGraph經過優化後生成了JobGraph,送出給JobManager的資料結構。主要的有華為,将多個符合條件的節點chain在一起作為一個節點;

4)ExecutionGraph:JobManager根據JobGraph生成ExecutionGraph。ExecutionGraph是JobGraph的并行化版本,是排程層最核心的資料結構;

5)實體執行圖:JobManager根據ExecutionGraph對Job進行排程後,在各個TaskManager上部署Task後形成的“圖”,并不是一個具體的資料結構。

流計算架構Flink的運作架構

4、并行度(Parallelism)

流計算架構Flink的運作架構

1)一個特定算子的子任務(subtask)的個數被稱之為其并行度(parallellism)。一般情況下,一個stream的并行度,可以認為就是其所有算子中最大的并行度。

流計算架構Flink的運作架構

2)一個程式中,不同的算子可能有不同的并行度;

3)算子之間傳輸資料的形式可以是one-to-one(forwarding)的模式也可以是redistributing的模式,具體是哪一種形式,取決于算子的種類;

4)one-to-one:stream維護着分區以及元素的順序(比如source和map之間)。這意味着map算子的子任務看到的元素的個數以及順序跟source算子的子任務生産的元素的個數、順序相同。map、fliter、flatmap等算子都是one-to-one的對應關系。

5)Reditributing:stream的分區會發生改變。每一個算子的子任務依據所選擇的transformation發送資料到不同的目标任務。例如,keyBy基于hashCode重分區、而broadcast和rebalance會随機重新分區,這些算子都會引起redistribute過程,而redistribute過程就類似于Spark中的shuffle過程。

5、任務鍊(Operator Chains)

1)Flink采用了一種稱為任務鍊的優化技術,可以在特定條件下減少本地通信的開銷。為了滿足任務鍊的要求,必須将兩個或多個算子設為相同的并行度,并通過本地轉發(local forward)的方式進行連接配接;

2)相同并行度的one-to-one操作,Flink這樣相連的算子連結在一起形成一個task,原來的算子成為裡面的subtask;

3)并行度相同、并且是one-to-one操作,兩個條件缺一不可;

流計算架構Flink的運作架構

繼續閱讀