Flink 運行時的組建
- 作業管理器: JobManager
- 任務管理器: TaskManager
- 資源管理器:ResourceManager
- 分發器:Dispacher
作業管理器(JobManager)
- 控制一個應用程序執行的主進程,也就是說,每個應用程序都會被不同的JobManager所控制
- jobManager 會先接受到要執行的應用程序,這個應用程序會包括:作業圖(JobGraph),邏輯數據圖(logical dataflow graph)和打包了所有的類庫和其他資源的JAR包。
- JobManager 會向資源管理器請求執行任務必要的資源,也就是任務管理器上的插槽(slot),一旦他獲得足夠的資源,就會將執行圖分發到真正運行他們的TaskManager上,而運行過程中,jobManager會負責所需要的中央協調的操縱,比如說檢查點(checkpoints)協調。
任務管理器 (TaskManager)
- Flink 的工作進程。通常在Flink中會有多個TaskManager 運行,每個TaskManager會包含一定數量的插槽(slots).插槽的數量限制了TaskManager能夠執行的數量。
- 啟動后,TaskManager會向資源管理器注冊他的插槽,收到資源管理的指令后,TaskManager 就會將一個或者多個插槽提供給JobManager調用,JobManager就可以向插槽分配任務(tasks)來執行了。
- 在執行中,一個taskManager 可以跟其他運行同一個應用程序的TaskManager 交換數據。
資源管理(ResourceManager)
- 主要負責管理 ,任務管理器的插槽(slot),TaskManager插槽是Flink中定義的處理資源單元。
- Flink 為不同的環境和資源管理工具提供了不同的資源管理器,比如 YARN,K8s,以及 Standalone部署。
分發起(Dispatcher)
- 可以跨作業運行,他為應用提供了REST接口,
- 當一個應用被提交執行的時候,他就會啟動并將應用移交給一個JobManager.
- 他會啟動一個 Web UI,方便展示信息
任務提交流程
任務提交流程.png
任務提交流程 (Yarn)
任務提交流程(Yarn).png
任務提交原理
任務調度原理.png
并行度
一個特定算子的子任務的個數被稱為其并行度。一般情況下,
一個stream的并行度,可認為就是其所有算子中最大的并行度
并行度.png
TaskManager 和 Slots
- Flink 中每個TaskManager 都是JVM進程,
它可能會在獨立的線程上執行一個或多個子任務 - 為了控制一個TaskManager 能接受多少個Task,TaskManager通過
task slot 來進行控制(一個TaskManager 至少有一個slot)
taskManager和slot.png
TaskManager和slot(2).png
設置 slot 共享組
.slotSharingGroup("red")
結果: 默認的共享組是"default",設置不同的共享組后,整個計算任務會 ,比之前會占多個slot
例如:
并行子任務的分配.png
flink 子任務的分配
flink子任務分配.png
flink子任務分配2.png
flink 的執行步驟圖
flink執行步驟圖.png
數據傳輸形式
一個程序中,不同的算子可能具有不同的并行度
算子之間的傳輸數據的形式可以是 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過程。
任務鏈
任務鏈0.png
任務鏈.png