Apache Flink - 架構和拓撲


Flink結構:

    1. flink cli 解析本地環境配置,啟動 ApplicationMaster
    2. 在 ApplicationMaster 中啟動 JobManager
    3. 在 ApplicationMaster 中啟動YarnFlinkResourceManager
    4. YarnFlinkResourceManagerJobManager發送注冊信息
    5. YarnFlinkResourceManager注冊成功后,JobManagerYarnFlinkResourceManager發送注冊成功信息
    6. YarnFlinkResourceManage知道自己注冊成功后像ResourceManager申請和TaskManager數量對等的 container
    7. 在container中啟動TaskManager
    8. TaskManager將自己注冊到JobManager

    接下來便是程序的提交和運行。

  • 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的輸出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM