2_Flink 運行架構 -講師:武晟然


文章來源與《尚硅谷2021最新Java版Flink(武老師清華碩士,原IBM-CDL負責人)》
https://www.bilibili.com/video/BV1qy4y1q728

主要內容

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

image

作業管理器(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),TaskManger 插槽是Flink中定義的處理資源單元。
• Flink為不同的環境和資源管理工具提供了不同資源管理器,比如YARN、Mesos、K8s,以及standalone部署。
• 當JobManager申請插槽資源時,ResourceManager會將有空閑插槽的TaskManager分配給JobManager。如果ResourceManager沒有足夠的插槽來滿足JobManager的請求,它還可以向資源提供平台發起會話,以提供啟動TaskManager進程的容器。

分發器(Dispatcher)

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

任務提交流程

image

任務提交流程(YARN)

image

任務調度原理

image

思考

• 怎樣實現並行計算?
• 並行的任務,需要占用多少slot? 
• 一個流處理程序,到底包含多少個任務?

並行度(Parallelism)

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

TaskManager 和 Slots

image

• Flink 中每一個 TaskManager 都是一個JVM進程,它可能會在獨立的線程上執行一個或多個子任務。
• 為了控制一個 TaskManager 能接收多少個 task, TaskManager 通過 task slot 來進行控制(一個 TaskManager 至少有一個 slot)。

image
• 默認情況下,Flink 允許子任務共享 slot,即使它們是不同任務的子任務。 這樣的結果是,一個 slot 可以保存作業的整個管道。
• Task Slot 是靜態的概念,是指 TaskManager 具有的並發執行能力。

程序與數據流(DataFlow)

image

• 所有的Flink程序都是由三部分組成的: Source 、Transformation 和 Sink。 
• Source 負責讀取數據源,Transformation 利用各種算子進行處理加工,Sink 負責輸出。

程序與數據流(DataFlow)

• 在運行時,Flink上運行的程序會被映射成“邏輯數據流”(dataflows),它包含了這三部分。
• 每一個dataflow以一個或多個sources開始以一個或多個sinks結束。dataflow類似於任意的有向無環圖(DAG)。
• 在大部分情況下,程序中的轉換運算(transformations)跟dataflow中的算子(operator)是一一對應的關系。

image

執行圖(ExecutionGraph)

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

image

數據傳輸形式

• 一個程序中,不同的算子可能具有不同的並行度
• 算子之間傳輸數據的形式可以是 one-to-one (forwarding) 的模式也可以是redistributing 的模式,具體是哪一種形式,取決於算子的種類
➢ One-to-one:stream維護着分區以及元素的順序(比如source和map之間)。 這意味着map 算子的子任務看到的元素的個數以及順序跟 source 算子的子任務生產的元素的個數、順序相同。map、fliter、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 操作,兩個條件缺一不可

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM