Flink結構:
-
- flink cli 解析本地環境配置,啟動
ApplicationMaster
- 在
ApplicationMaster
中啟動JobManager
- 在
ApplicationMaster
中啟動YarnFlinkResourceManager
YarnFlinkResourceManager
給JobManager
發送注冊信息YarnFlinkResourceManager
注冊成功后,JobManager
給YarnFlinkResourceManager
發送注冊成功信息YarnFlinkResourceManage
知道自己注冊成功后像ResourceManager
申請和TaskManager
數量對等的 container- 在container中啟動
TaskManager
TaskManager
將自己注冊到JobManager
中
接下來便是程序的提交和運行。
- flink cli 解析本地環境配置,啟動
JobManager
負責接收 flink 的作業,調度 task,收集 job 的狀態、jar 包管理,checkpoint 的協調和發起,管理 TaskManagers。- 算子:flink 的一個 operator 代表一個最頂級的 API接口。對於streaming,在 DataStream 上做諸如 map/reduce/keyBy 等操作均會生成一個算子。
- TaskManager 在 Flink 中也被叫做一個 Instance,統一管理該物理節點上的所有Flink job的task運行,它的功能包括了task的啟動銷毀、內存管理、磁盤IO、網絡傳輸管理等等。
- 下方是 Flink 集群啟動后架構圖:
Graph:
- Flink 中的執行圖可以分成四層:StreamGraph -> JobGraph -> ExecutionGraph -> 物理執行圖。
- StreamGraph:是根據用戶通過 Stream API 編寫的代碼生成的最初的圖。用來表示程序的拓撲結構。
- JobGraph:StreamGraph經過優化后生成了 JobGraph,提交給 JobManager 的數據結構。主要的優化為,將多個符合條件的節點 chain 在一起作為一個節點,這樣可以減少數據在節點之間流動所需要的序列化/反序列化/傳輸消耗。
- ExecutionGraph:JobManager 根據 JobGraph 生成ExecutionGraph。方便調度和監控和跟蹤各個 tasks 的狀態。ExecutionGraph是JobGraph的並行化版本,是調度層最核心的數據結構。
- 物理執行圖:JobManager 根據 ExecutionGraph 對 Job 進行調度后,在各個TaskManager 上部署 Task 后形成的“圖”,並不是一個具體的數據結構。
- 2個並發度(Source為1個並發度)的
SocketTextStreamWordCount
四層執行圖的演變過程:- StreamGraph:根據用戶通過 Stream API 編寫的代碼生成的最初的圖。
- StreamNode:用來代表 operator 的類,並具有所有相關的屬性,如並發度、入邊和出邊等。
- StreamEdge:表示連接兩個StreamNode的邊。
- JobGraph:StreamGraph經過優化后生成了 JobGraph,提交給 JobManager 的數據結構。
- JobVertex:經過優化后符合條件的多個StreamNode可能會chain在一起生成一個JobVertex,即一個JobVertex包含一個或多個operator,JobVertex的輸入是JobEdge,輸出是IntermediateDataSet。
- IntermediateDataSet:表示JobVertex的輸出,即經過operator處理產生的數據集。producer是JobVertex,consumer是JobEdge。
- JobEdge:代表了job graph中的一條數據傳輸通道。source 是 IntermediateDataSet,target 是 JobVertex。即數據通過JobEdge由IntermediateDataSet傳遞給目標JobVertex。
- ExecutionGraph:JobManager 根據 JobGraph 生成ExecutionGraph。ExecutionGraph是JobGraph的並行化版本,是調度層最核心的數據結構。
- ExecutionJobVertex:和JobGraph中的JobVertex一一對應。每一個ExecutionJobVertex都有和並發度一樣多的 ExecutionVertex。
- ExecutionVertex:表示ExecutionJobVertex的其中一個並發子任務,輸入是ExecutionEdge,輸出是IntermediateResultPartition。
- IntermediateResult:和JobGraph中的IntermediateDataSet一一對應。一個IntermediateResult包含多個IntermediateResultPartition,其個數等於該operator的並發度。
- IntermediateResultPartition:表示ExecutionVertex的一個輸出分區,producer是ExecutionVertex,consumer是若干個ExecutionEdge。
- ExecutionEdge:表示ExecutionVertex的輸入,source是IntermediateResultPartition,target是ExecutionVertex。source和target都只能是一個。
- Execution:是執行一個 ExecutionVertex 的一次嘗試。當發生故障或者數據需要重算的情況下 ExecutionVertex 可能會有多個 ExecutionAttemptID。一個 Execution 通過 ExecutionAttemptID 來唯一標識。JM和TM之間關於 task 的部署和 task status 的更新都是通過 ExecutionAttemptID 來確定消息接受者。
- 物理執行圖:JobManager 根據 ExecutionGraph 對 Job 進行調度后,在各個TaskManager 上部署 Task 后形成的“圖”,並不是一個具體的數據結構。
- Task:Execution被調度后在分配的 TaskManager 中啟動對應的 Task。Task 包裹了具有用戶執行邏輯的 operator。
- ResultPartition:代表由一個Task的生成的數據,和ExecutionGraph中的IntermediateResultPartition一一對應。
- ResultSubpartition:是ResultPartition的一個子分區。每個ResultPartition包含多個ResultSubpartition,其數目要由下游消費 Task 數和 DistributionPattern 來決定。
- InputGate:代表Task的輸入封裝,和JobGraph中JobEdge一一對應。每個InputGate消費了一個或多個的ResultPartition。
- InputChannel:每個InputGate會包含一個以上的InputChannel,和ExecutionGraph中的ExecutionEdge一一對應,也和ResultSubpartition一對一地相連,即一個InputChannel接收一個ResultSubpartition的輸出。
- StreamGraph:根據用戶通過 Stream API 編寫的代碼生成的最初的圖。