Flink 調度
Flink-執行邏輯
文章目錄
- 一.角色作用
- 二.任務提交流程
- 1.1 Standlone
- 1.2 Yarn
- 三.TaskManager和slots原理
- 3.1 作用與關系
- 3.2 共享機制
一.角色作用
Client
Client 為提交 Job 的客戶端,可以是運行在任何機器上(與 JobManager 環境連通即可),提交 Job 后,Client 可以結束行程(Streaming的任務),也可以不結束并等待結果回傳,
JobManager
JobManager 具有許多與協調 Flink 應用程式的分布式執行有關的職責:它決定何時調度下一個 task(或一組 task)、對完成的 task 或執行失敗做出反應、協調 checkpoint、并且協調從失敗中恢復等等,這個行程由三個不同的組件組成:
- ResourceManager 負責 Flink 集群中的資源提供、回收、分配 - 它管理 task slots,這是 Flink 集群中資源調度的單位,Flink 為不同的環境和資源提供者(例如 YARN、Mesos、Kubernetes 和 standalone 部署)實作了對應的 ResourceManager,在 standalone 設定中,ResourceManager 只能分配可用 TaskManager 的 slots,而不能自行啟動新的 TaskManager,
- Dispatcher 提供了一個 REST 介面,用來提交 Flink 應用程式執行,并為每個提交的作業啟動一個新的 JobMaster,它還運行 Flink WebUI 用來提供作業執行資訊,
- JobMaster 負責管理單個JobGraph的執行,Flink 集群中可以同時運行多個作業,每個作業都有自己的 JobMaster,
始終至少有一個 JobManager,高可用(HA)設定中可能有多個 JobManager,其中一個始終是 leader,其他的則是 standby,
TaskManager
TaskManager 在啟動的時候就設定好了槽位數(Slot),每個 slot 能啟動一個 Task,Task 為執行緒,從 JobManager 處接收需要部署的 Task,部署啟動后,與自己的上游建立連接,接收資料并處理,
Slot
Flink 集群是由 JobManager(JM)、TaskManager(TM)兩大組件組成的,每個 JM/TM 都是運行在一個獨立的 JVM 行程中,JM 相當于 Master,是集群的管理節點,TM 相當于 Worker,是集群的作業節點,每個 TM 最少持有 1 個 Slot,Slot 是 Flink 執行 Job 時的最小資源分配單位,在 Slot 中運行著具體的 Task 任務,
二.任務提交流程
1.1 Standlone

- APP程式通過RestFul介面提交給Dispatcher(介面是跨平臺,并且可以直接穿過防火墻,不考慮攔截),
- Dispatcher把JobManager行程啟動,把應用交給JobManager,
- JobManager拿到應用后,向ResourceManager申請資源(slots),ResourceManager會啟動對應的TaskManager行程,TaskManager空閑的slots會向ResourceManager注冊,
- ResourceManager會根據JobManager申請的資源數量,向TaskManager發出指令(這些slots由你提供給JobManager),
- TaskManager可以直接和JobManager通信了(它們之間會有心跳包的連接),TaskManager向JobManager提供slots,JobManager向TaskManager分配在slots中執行的任務,
- 最后,在執行任務程序中,不同的TaskManager會有資料之間的交換,
1.2 Yarn

- 提交App之前,先上傳Flink的Jar包和配置到HDFS,以便JobManager和TaskManager共享HDFS的資料,
- 客戶端向ResourceManager提交Job,ResouceManager接到請求后,先分配container資源,然后通知NodeManager啟動ApplicationMaster,
- ApplicationMaster會加載HDFS的配置,啟動對應的JobManager,然后JobManager會分析當前的作業圖,將它轉化成執行圖(包含了所有可以并發執行的任務),從而知道當前需要的具體資源,
- 接著,JobManager會向ResourceManager申請資源,ResouceManager接到請求后,繼續分配container資源,然后通知ApplictaionMaster啟動更多的TaskManager(先分配好container資源,再啟動TaskManager),container在啟動TaskManager時也會從HDFS加載資料,
- 最后,TaskManager啟動后,會向JobManager發送心跳包,JobManager向TaskManager分配任務,
三.TaskManager和slots原理
每個 worker(TaskManager)都是一個 JVM 行程,可以在單獨的執行緒中執行一個或多個 subtask,為了控制一個 TaskManager 中接受多少個 task,就有了所謂的 task slots(至少一個),
3.1 作用與關系

- Flink 中每一個 TaskManager 都是一個JVM行程,它可能會在獨立的執行緒上執行一個或多個 subtask,
- 為了控制一個 TaskManager 能接收多少個 task, TaskManager 通過 task slot 來進行控制(一個 TaskManager 至少有一個 slot)
- 每個task slot表示TaskManager擁有資源的一個固定大小的子集,假如一個TaskManager有三個slot,那么它會將其管理的記憶體分成三份給各個slot(注:這里不會涉及CPU的隔離,slot僅僅用來隔離task的受管理記憶體)
- 可以通過調整task slot的數量去自定義subtask之間的隔離方式,如一個TaskManager一個slot時,那么每個task group運行在獨立的JVM中,而當一個TaskManager多個slot時,多個subtask可以共同享有一個JVM,而在同一個JVM行程中的task將共享TCP連接和心跳訊息,也可能共享資料集和資料結構,從而減少每個task的負載,
3.2 共享機制

- 默認情況下,Flink 允許子任務共享 slot,即使它們是不同任務的子任務(前提是它們來自同一個job), 這樣的結果是,一個 slot 可以保存作業的整個管道,
- Task Slot 是靜態的概念,是指 TaskManager 具有的并發執行能力,可以通過引數taskmanager.numberOfTaskSlots進行配置;而并行度parallelism是動態概念,即TaskManager運行程式時實際使用的并發能力,可以通過引數parallelism.default進行配置,
- 舉例:如果總共有3個TaskManager,每一個TaskManager中分配了3個TaskSlot,也就是每個TaskManager可以接收3個task,這樣我們總共可以接收9個TaskSot,但是如果我們設定parallelism.default=1,那么當程式運行時9個TaskSlot將只有1個運行,8個都會處于空閑狀態,所以要學會合理設定并行度!
slot 是指 taskmanager 的并發執行能力

每一個 taskmanager 中的分配 3 個 TaskSlot, 3 個 taskmanager 一共有 9 個 TaskSlot,
parallelism 是指 taskmanager 實際使用的并發能力

parallelism.default:1
運行程式默認的并行度為 1,9 個 TaskSlot 只用了 1 個,有 8 個空閑,設定合適的并行度才能提高效率,
parallelism 是可配置、可指定的

每個算子設定的并行度是 2,

每個算子設定的并行度是 9,
parallelism 是可配置、可指定的,引入Sink
除了 sink 是設定的并行度為 1,其他算子設定的并行度都是 9,
注意:如果設定的并行度 parallelism 超過了 Task Manager 能提供的最大 slot 數量,程式會拋例外資訊,


參考
https://ci.apache.org/projects/flink/flink-docs-release-1.12/zh/concepts/flink-architecture.html#taskmanagers
https://www.slideshare.net/robertmetzger1/apache-flink-hands-on
公眾號

微信號:bigdata_limeng
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/259702.html
標籤:其他
