在Flink的運行架構中,有兩大比較重要的組件:作業管理器(JobManager)和任務管理器(TaskManager)。
Flink的作業提交與任務處理時的系統如下圖所示。
其中,客戶端并不是處理系統的一部分,只是負責作業提交,在作業提交之后,可選擇與JobManager斷開連接。接下來,重點介紹一下JobManager和TaskManager在整個過程中所扮演的角色。
JobManager
JobManager是Flink集群中一個任務管理和調度的核心,是控制應用執行的主進程,每一個應用都應該被唯一的JM控制執行。在高可用的場景下,可能會出現多個JM,但是也只有一個正在運行的Leader節點,其余都是備用。JM又包含三個組件:JobMaster、ResourceManager、Dispatcher。
JobMaster
我們把對數據進行處理的操作統稱為任務(task),多個任務按照一定的先后順序連接起來,就構成了作業(job)。而JobMaster是負責處理單獨的作業,因此JobMaster和具體的job是一一對應的。
也就是說,多個job是可以運行在一個Flink集群上的,而每一個job則都有一個自己的JobMaster。
JobMaster在接收到客戶端提交的應用后,會把作業圖轉換成一個物理層面的數據流圖,也就是執行圖,它包含了所有可以并發執行的任務。JobMaster會向資源管理器發出請求,申請執行任務必要的資源,一旦獲取了足夠資源,就會將執行圖分發到真正運行他們的TaskManager上。
ResourceManager
ResourceManager主要負責資源的分配和管理,在Flink集群中只有一個。這里的資源是指TaskManager的任務槽(slot),它包含了機器用來執行計算的一組CPU和內存。每個任務都需要被分配到一個任務槽中執行。
這里的ResourceManager其實是Flink內置的,注意和其他資源管理平臺區分開,比如K8S、YARN等。
TaskManager中的任務槽都會向ResourceManager注冊的,當ResourceManager沒有足夠的任務槽時,它可以向資源管理平臺發起會話,請求提供啟動TaskManager進程的容器。
Dispatcher
Dispatcher主要負責提供一個REST接口,用來與集群進行交互和管理,負責為每一個新提交的作業啟動一個新的JobMaser組件,以及啟動一個WebUI用于展示和監控作業執行信息。
TaskManager
每個TaskManager都包含了一定數量的任務槽,任務槽是資源調度的最小單位,其數量限制了TaskManager能夠并發處理的任務數量。
TaskManager啟動之后,會向ResourceManager注冊它的任務槽,收到指令后,TaskManager就會將一個或者多個任務槽提供給JobMaster用于分配任務的調用。