Flink 運行時的組件
- 作業管理器(JobManager)
- 資源管理器(ResourceManager)
- 任務管理器(TaskManager)
- 分發器(Dispatch)
JobManager
- 控制一個應用程序執行的主進程,也就是說,每個應用程序都會被一個不同的 JobManager 所控制執行;
- JobManager 會先接收到要執行的應用程序,這個應用程序,這個應用程序包括作業圖(JobGraph)、邏輯數據流圖(logical dataflow graph)和打包了所有類、庫和其他資源的JAR包;
- JobManager 會把 JobGraph 轉換成一個物理層面的數據流圖,這個圖叫做執行圖(ExecutionGraph),包含了所有可以并發執行的任務;
- JobManager 會向 ResourceManager 請求執行任務必要的資源,也就是 TaskManager 上的 slot 。一旦它獲取到了足夠的資源,就會將執行圖分發到真正運行它們的 TaskManager 上。而在運行過程中,JobManager 會負責所有需要中央協調的操作,比如所 checkpoint 的協調;
ResourceManager
- 主要負責管理 TaskManager 和 slot;
- Flink 為不同環境和資源管理工具提供了不同的 ResourceManager,比如Yarn、Mesos、K8s,以及 standalone部署;
- 當 JobManager 申請 slot 資源時,ResourceManager 會將有空閑 slot 的 TaskManager 分配給 JobManager。如果 ResourceManager 沒有足夠的 slot 來滿足 JobManager 的請求,它還可以向資源提供平臺發起會話,以提供啟動 TaskManager 進程的容器;
TaskManager
- Flink 中的工作進程。通常在 Flink 中會有多個 TaskManager 運行,每一個 TaskManager 都包含一定數量的 slot 。slot 的數量限制了 TaskManager 能夠執行的任務數量(并行度);
- 啟動之后,TaskManager 會向 ResourceManager 注冊它的 slot ;收到 ResourceManager 的指令后,TaskManager 就會將一個或者多個 slot 提供給 JobManager 調用。JobManager 就可以向 slot 分配任務來執行了;
- 在執行過程中,一個 TaskManager 可以跟其他運行同一應用程序的 TaskManager 交換數據;
Dispatcher
- 可以跨作業運行,它為應用提交提供了 REST 接口;
- 當一個應用被提交時,Dispatcher 就會啟動并將應用移交給一個 JobManager;
- Dispatcher 也會啟動一個 Web UI,用來方便地展示和監控作業執行的信息;
- Dispatcher 在架構中可能并不是必需的,這取決于應用提交的方式;
Flink 任務提交流程
- 當程序執行 execute() 方法時,Client 會將程序編譯成一個 DAG(有向無環圖),這個圖被稱為 JobGraph ,JobGraph 描述了程序的數據流和操作;
- Dispatcher 將 JobGraph 提交給 JobManager;
- JobManager 接收到 JobGraph 后會將其解析,并創建一個 ExecutionGraph,ExecutionGraph 描述了如何在集群中并行執行 JobGraph 中定義的數據流;
- JobManager 根據 ExecutionGraph 的需求向 ResourceManager 請求資源;
- 一旦資源被分配,JobManager 會將作業分解成一系列的 Task ,然后將這些 Task 分配給集群中 TaskManager ,每個 TaskManager 執行一個或多個 Task;
- TaskManager 接收到 Task 后會在本地執行它們;
- TaskManager 會定期保存狀態快照,并向 JobManager 報告任務的進度和狀態;
- 當所有 Task 都成功執行完畢,JobManager 會標記作業為完成,并且釋放所有分配的資源;
以上是從一個較為高級的視角,來看應用中各組件的交互協作。如果部署的集群環境不同,其中一些步驟可以省略,或是有些組件會運行在同一個 JVM 進程中。
下面以具體部署到 Yarn 上為例:
- Flink 提交任務后,Client 向 HDFS 上傳 Flink 的 Jar 包和配置;
- Client 向 ResourceManager 提交任務,ResourceManager 分配 Container 資源并通知對應的 NodeManager 啟動 ApplicationMaster,ApplicationMaster 啟動后加載 Flink 的 Jar 包和配置構建環境,然后啟動 JobManager;
- ApplicationMaster 向 ResouceManager 申請資源啟動 TaskManager;
- ResourceManager 分配 Container 資源后,由 ApplicationMaster 通知資源所在節點的 NodeManager 啟動 TaskManager;
- TaskManager 加載 Flink 的 Jar包和配置構建環境并啟動 TaskManager;
- TaskManager 啟動后向 JobManager 發送心跳包,并等待 JobManager 向其分配任務;