Flink基礎02-Flink運行架構

目錄:
Flink運行時的組件
任務提交流程
任務調度原理

在這裏插入圖片描述
作業管理器(JobManager)
控制一個應用程序執行的主進程,即每個應用程序都會被一個不同的JobManager所控制執行
JobManager會先接收到要執行的應用程序,這個應用程序會包括:作業圖(JobGraph)、邏輯數據流圖(logical dataflow graph)和打包了所有的類、庫和其他資源的JAR包
JobManager會把JobGraph轉換成一個物理層面的數據流圖,這個圖被叫做“執行圖”(ExecutionGraph),包含了所有可以併發執行的任務
JobManager會向資源管理器(ResourceManager)請求執行任務必要的資源,也就是任務管理器(TaskManager)上的插槽(slot)。一旦它獲取到了足夠的資源,就會將執行圖分發到真正運行它們的TaskManager上。而在運行過程中,JobManager會負責所有需要中央協調的操作,比如說檢查點(checkpoints)的協調

任務管理器(TaskManager)
Flink中的工作進程。通常在Flink中會有多個TaskManager運行,每一個TaskManager都包含了一定數量的插槽(slots)。插槽的數量限制了TaskManager能夠執行的任務數量
啓動之後,TaskManager會向資源管理器註冊它的插槽;收到資源管理器的指令後,TaskManager就會將一個或者多個插槽提供給JobManager調用。JobManager就可以向插槽分配任務(tasks)來執行了
在執行過程中,一個TaskManager可以跟其他運行同一應用程序的TaskManager交換數據

資源管理器(ResourceManager)
主要負責管理任務管理器(TaskManager)的插槽(slot),TaskManager插槽是Flink中定義的處理資源單元。
Flink爲不同的環境和資源管理工具提供了不同資源管理器,比如YARN、Mesos、K8s,以及standalone部署
當JobManager申請插槽資源時,ResourceManager會將空閒插槽的TaskManager分配給JobManager。如果ResourceManager沒有足夠的插槽來滿足JobManager的請求,它還可以向資源提供平臺發起會話,以提供啓動TaskManager進程的容器。

分發器(Dispatcher)
可以跨作業運行,它爲應用提交提供了REST接口
當一個應用被提交執行時,分發器就會啓動並將應用移交給一個JobManager
Dispatcher也會啓動一個Web UI,用來方便地展示和監控作業執行的信息
Dispatcher在架構中可能並不是必需的,這取決於應用提交運行的方式。

任務提交流程在這裏插入圖片描述

任務提交流程(YARN)
在這裏插入圖片描述
任務調度原理
在這裏插入圖片描述
TaskManager和Slots
在這裏插入圖片描述
Flink中每一個TaskManager都是一個JVM進程,它可能會在獨立的線程上執行一個或多個subtask(子任務)
爲了控制一個TaskManager能接受多少個task,taskManager通過task slot來進行控制(一個TaskManager至少有一個Slot)
在這裏插入圖片描述
默認情況下,Flink允許子任務共享slot,即使他們是不同任務的子任務。這樣的結果是,一個slot可以保存作業的整個管道
Task Slot是靜態的概念,是指TaskManager具有併發執行能力
在這裏插入圖片描述

在這裏插入圖片描述

程序與數據流(DataFlow)
在這裏插入圖片描述
所有的Flink程序都是由三部分組成的:Source、Transformation和Sink
Source負責讀取數據源,Transformation利用各種算子進行處理加工,Sink負責輸出
在運行時,Flink上運行的程序會被映射成“邏輯數據流”(dataflows),它包含了這三部分
每一個dataflow以一個或多個sources開始以一個或多個sinks結束。dataflow類似於任意的有向無環圖(DAG)
在大部分情況下,程序中的轉換運算(transformations)跟dataflow中的算子(operator)是一一對應的關係

在這裏插入圖片描述
執行圖(ExecutionGraph)
Flink中的執行圖可以分成四層:StreamGraph -> JobGraph ->ExecutionGraph ->物理執行圖
StreamGraph: 是根據用戶通過Stream API編寫的代碼生成的最初的圖。用來表示程序的拓撲結構
JobGraph: StreamGraph經過優化後生成了JobGraph,提交給JobManager的數據結構。主要的優化爲,將多個符合條件的節點chain在一起作爲一個節點
ExecutionGraph: JobManager根據JobGraph生成ExecutionGraph。ExecutionGraph是JobGraph的並行化版本,是調度層最核心的數據結構。
物理執行圖: JobManager根據ExecutionGraph對Job進行調度後,在各個TaskManager上部署Task後形成的“圖”,並不是一個具體的數據結構。
在這裏插入圖片描述

並行度(Parallelism)
在這裏插入圖片描述
一個特定算子的子任務(subtask)的個數被稱之爲其並行度(parallelism)
一般情況下,一個stream的並行度,可以認爲就是其所有算子中最大的並行度
一個程序中,不同的算子可能具有不同的並行度
算子之間傳輸數據的形式可以是one-to-one(forwarding)的模式也可以是redistributing的模式,具體是哪一種,取決於算子的種類
One-to-one:stream維護着分區以及元素的順序(比如source和map之間)。着意味着map算子的子任務看到的元素的個數以及順序跟source算子的只任務生產的元素的個數、順序相同。map、filter、flatMap等算子都是one-to-one的對應關係。
Redistributing:stream的分區會發生改變。每一個算子的子任務一句所選擇的transformation發送數據到不同的目標任務。例如,keyBy基於hashCode重分區、而broadcast和rebalance會隨機重新分區,這些算子都會引起redistribute過程,而redistribute過程就類似於Spark中的shuffle過程。

任務鏈(Operator Chains)
Flink採用了一種稱爲任務鏈的優化技術,可以在 特定條件下減少本地通信的開銷。爲了滿足任務鏈的要求,必須將兩個或多個算子設爲相同的並行度,並通過本地轉發(local forward)的方式進行連接
相同並行度的one-to-one操作,Flink這樣相連的算子鏈接在一起形成一個task,原來的算子成爲裏面的subtask
並行度相同、並且是one-to-one操作,兩個條件缺一不可
在這裏插入圖片描述附思維導圖:
在這裏插入圖片描述

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