Flink 架構概覽
Flink 架構概覽–Job
用戶通過 DataStream API、DataSet API、SQL 和 Table API 編寫 Flink 任務,它會生成一個JobGraph。JobGraph 是由 source、map()、keyBy()/window()/apply() 和 Sink 等算子組成的。當 JobGraph 提交給 Flink 集群后,能夠以 Local、Standalone、Yarn 和 Kubernetes 四種模式運行。
Flink 架構概覽–JobManager
JobManager的功能主要有:
-
將 JobGraph 轉換成 Execution Graph,最終將 Execution Graph 拿來運行;
-
Scheduler 組件負責 Task 的調度;
-
Checkpoint Coordinator 組件負責協調整個任務的 Checkpoint,包括 Checkpoint 的開始和完成;
-
通過 Actor System 與 TaskManager 進行通信;
-
其它的一些功能,例如 Recovery Metadata,用於進行故障恢復時,可以從 Metadata 里面讀取數據。
Flink 架構概覽–TaskManager
TaskManager 是負責具體任務的執行過程,在 JobManager 申請到資源之后開始啟動。TaskManager 里面的主要組件有:
-
Memory & I/O Manager,即內存 I/O 的管理;
-
Network Manager,用來對網絡方面進行管理;
-
Actor system,用來負責網絡的通信;
TaskManager 被分成很多個 TaskSlot,每個任務都要運行在一個 TaskSlot 里面,TaskSlot 是調度資源里的最小單位。
在介紹 Yarn 之前先簡單的介紹一下 Flink Standalone 模式。
-
在 Standalone 模式下,Master 和 TaskManager 可以運行在同一台機器上,也可以運行在不同的機器上。
-
在 Master 進程中,Standalone ResourceManager 的作用是對資源進行管理。當用戶通過 Flink Cluster Client 將 JobGraph 提交給 Master 時,JobGraph 先經過 Dispatcher。
-
當 Dispatcher 收到客戶端的請求之后,生成一個 JobManager。接着 JobManager 進程向 Standalone ResourceManager 申請資源,最終再啟動 TaskManager。
-
TaskManager 啟動之后,會有一個注冊的過程,注冊之后 JobManager 再將具體的 Task 任務分發給這個 TaskManager 去執行。
以上就是一個 Standalone 任務的運行過程。
Flink 運行時相關組件
接下來總結一下 Flink 的基本架構和它在運行時的一些組件,具體如下:
-
Client:用戶通過 SQL 或者 API 的方式進行任務的提交,提交后會生成一個 JobGraph。
-
JobManager:JobManager 接受到用戶的請求之后,會對任務進行調度,並且申請資源啟動 TaskManager。
-
TaskManager:它負責一個具體 Task 的執行。TaskManager 向 JobManager 進行注冊,當 TaskManager 接收到 JobManager 分配的任務之后,開始執行具體的任務。
Flink on Yarn 原理及實踐
Yarn 架構原理–總覽
Yarn 模式在國內使用比較廣泛,基本上大多數公司在生產環境中都使用過 Yarn 模式。首先介紹一下 Yarn 的架構原理,因為只有足夠了解 Yarn 的架構原理,才能更好的知道 Flink 是如何在 Yarn 上運行的。
Yarn 的架構原理如上圖所示,最重要的角色是 ResourceManager,主要用來負責整個資源的管理,Client 端是負責向 ResourceManager 提交任務。
用戶在 Client 端提交任務后會先給到 Resource Manager。Resource Manager 會啟動 Container,接着進一步啟動 Application Master,即對 Master 節點的啟動。當 Master 節點啟動之后,會向 Resource Manager 再重新申請資源,當 Resource Manager 將資源分配給 Application Master 之后,Application Master 再將具體的 Task 調度起來去執行。
Yarn 架構原理–組件
Yarn 集群中的組件包括:
-
ResourceManager (RM):ResourceManager (RM)負責處理客戶端請求、啟動/監控 ApplicationMaster、監控 NodeManager、資源的分配與調度,包含 Scheduler 和 Applications Manager。
-
ApplicationMaster (AM):ApplicationMaster (AM)運行在 Slave 上,負責數據切分、申請資源和分配、任務監控和容錯。
-
NodeManager (NM):NodeManager (NM)運行在 Slave 上,用於單節點資源管理、AM/RM通信以及匯報狀態。
-
Container:Container 負責對資源進行抽象,包括內存、CPU、磁盤,網絡等資源。
Yarn 架構原理–交互
以在 Yarn 上運行 MapReduce 任務為例來講解下 Yarn 架構的交互原理:
-
首先,用戶編寫 MapReduce 代碼后,通過 Client 端進行任務提交。
-
ResourceManager 在接收到客戶端的請求后,會分配一個 Container 用來啟動 ApplicationMaster,並通知 NodeManager 在這個 Container 下啟動 ApplicationMaster。
-
ApplicationMaster 啟動后,向 ResourceManager 發起注冊請求。接着 ApplicationMaster 向 ResourceManager 申請資源。根據獲取到的資源,和相關的 NodeManager 通信,要求其啟動程序。
-
一個或者多個 NodeManager 啟動 Map/Reduce Task。
-
NodeManager 不斷匯報 Map/Reduce Task 狀態和進展給 ApplicationMaster。
-
當所有 Map/Reduce Task 都完成時,ApplicationMaster 向 ResourceManager 匯報任務完成,並注銷自己。
Flink on Yarn–Per Job
Flink on Yarn 中的 Per Job 模式是指每次提交一個任務,然后任務運行完成之后資源就會被釋放。在了解了 Yarn 的原理之后,Per Job 的流程也就比較容易理解了,具體如下:
-
首先 Client 提交 Yarn App,比如 JobGraph 或者 JARs。
-
接下來 Yarn 的 ResourceManager 會申請第一個 Container。這個 Container 通過 Application Master 啟動進程,Application Master 里面運行的是 Flink 程序,即 Flink-Yarn ResourceManager 和 JobManager。
-
最后 Flink-Yarn ResourceManager 向 Yarn ResourceManager 申請資源。當分配到資源后,啟動 TaskManager。TaskManager 啟動后向 Flink-Yarn ResourceManager 進行注冊,注冊成功后 JobManager 就會分配具體的任務給 TaskManager 開始執行。
Flink on Yarn–Session
在 Per Job 模式中,執行完任務后整個資源就會釋放,包括 JobManager、TaskManager 都全部退出。而 Session 模式則不一樣,它的 Dispatcher 和 ResourceManager 是可以復用的。Session 模式下,當 Dispatcher 在收到請求之后,會啟動 JobManager(A),讓 JobManager(A) 來完成啟動 TaskManager,接着會啟動 JobManager(B) 和對應的 TaskManager 的運行。當 A、B 任務運行完成后,資源並不會釋放。Session 模式也稱為多線程模式,其特點是資源會一直存在不會釋放,多個 JobManager 共享一個 Dispatcher,而且還共享 Flink-YARN ResourceManager。
Session 模式和 Per Job 模式的應用場景不一樣。Per Job 模式比較適合那種對啟動時間不敏感,運行時間較長的任務。Seesion 模式適合短時間運行的任務,一般是批處理任務。若用 Per Job 模式去運行短時間的任務,那就需要頻繁的申請資源,運行結束后,還需要資源釋放,下次還需再重新申請資源才能運行。顯然,這種任務會頻繁啟停的情況不適用於 Per Job 模式,更適合用 Session 模式。
Yarn 模式特點
Yarn 模式的優點有:
-
資源的統一管理和調度。Yarn 集群中所有節點的資源(內存、CPU、磁盤、網絡等)被抽象為 Container。計算框架需要資源進行運算任務時需要向 Resource Manager 申請 Container,Yarn 按照特定的策略對資源進行調度和進行 Container 的分配。Yarn 模式能通過多種任務調度策略來利用提高集群資源利用率。例如 FIFO Scheduler、Capacity Scheduler、Fair Scheduler,並能設置任務優先級。
-
資源隔離。Yarn 使用了輕量級資源隔離機制 Cgroups 進行資源隔離以避免相互干擾,一旦 Container 使用的資源量超過事先定義的上限值,就將其殺死。
-
自動 failover 處理。例如 Yarn NodeManager 監控、Yarn ApplicationManager 異常恢復。
Yarn 模式雖然有不少優點,但是也有諸多缺點,例如運維部署成本較高,靈活性不夠。
Flink on Yarn 實踐
關於 Flink on Yarn 的實踐在社區官網上面有很多課程,例如:《Flink 安裝部署、環境配置及運行應用程序》 和 《客戶端操作》都是基於 Yarn 進行講解的,這里就不再贅述。
社區官網: https://ververica.cn/developers/flink-training-course1/