1
概述
Flink 整個系統主要由兩個元件組成,分别為 JobManager 和 TaskManager,Flink 架構也遵循 Master - Slave 架構設計原則,JobManager 為 Master 節點,TaskManager 為 Worker (Slave)節點。
所有元件之間的通信都是借助于 Akka Framework,包括任務的狀态以及 Checkpoint 觸發等資訊。

2
Client 用戶端
用戶端負責将任務送出到叢集,與 JobManager 建構 Akka 連接配接,然後将任務送出到 JobManager,通過和 JobManager 之間進行互動擷取任務執行狀态。
用戶端送出任務可以采用 CLI 方式或者通過使用 Flink WebUI 送出,也可以在應用程式中指定 JobManager 的 RPC 網絡端口建構 ExecutionEnvironment 送出 Flink 應用。

3
JobManager
JobManager 負責整個 Flink 叢集任務的排程以及資源的管理,從用戶端中擷取送出的應用,然後根據叢集中 TaskManager 上 TaskSlot 的使用情況,為送出的應用配置設定相應的 TaskSlot 資源并指令 TaskManager 啟動從用戶端中擷取的應用。
JobManager 相當于整個叢集的 Master 節點,且整個叢集有且隻有一個活躍的 JobManager ,負責整個叢集的任務管理和資源管理。
JobManager 和 TaskManager 之間通過 Actor System 進行通信,擷取任務執行的情況并通過 Actor System 将應用的任務執行情況發送給用戶端。
同時在任務執行的過程中,Flink JobManager 會觸發 Checkpoint 操作,每個 TaskManager 節點 收到 Checkpoint 觸發指令後,完成 Checkpoint 操作,所有的 Checkpoint 協調過程都是在 Fink JobManager 中完成。
當任務完成後,Flink 會将任務執行的資訊回報給用戶端,并且釋放掉 TaskManager 中的資源以供下一次送出任務使用。

4
TaskManager
TaskManager 相當于整個叢集的 Slave 節點,負責具體的任務執行和對應任務在每個節點上的資源申請和管理。
用戶端通過将編寫好的 Flink 應用編譯打包,送出到 JobManager,然後 JobManager 會根據已注冊在 JobManager 中 TaskManager 的資源情況,将任務配置設定給有資源的 TaskManager節點,然後啟動并運作任務。
TaskManager 從 JobManager 接收需要部署的任務,然後使用 Slot 資源啟動 Task,建立資料接入的網絡連接配接,接收資料并開始資料處理。同時 TaskManager 之間的資料互動都是通過資料流的方式進行的。
可以看出,Flink 的任務運作其實是采用多線程的方式,這和 MapReduce 多 JVM 進行的方式有很大的差別,Flink 能夠極大提高 CPU 使用效率,在多個任務和 Task 之間通過 TaskSlot 方式共享系統資源,每個 TaskManager 中通過管理多個 TaskSlot 資源池進行對資源進行有效管理。