Flink 集群內部節點之間的通信是用 Akka 實現,比如 JobManager 和 TaskManager 之間的通信。而 operator 之間的數據傳輸是用 Netty 實現。
RPC 框架是 Flink 任務運行的基礎,Flink 整個 RPC 框架基于 Akka 實現。
一、相關概念
RPC(Remote Procedure Call)
概念
-
定義:遠程過程調用協議,允許程序像調用本地方法一樣調用遠程服務,隱藏底層網絡通信細節。
-
作用:在分布式系統中,實現跨節點的控制指令傳遞(如任務調度、狀態同步等)。
-
Flink 中的應用:
-
JobManager 與 TaskManager 之間的通信(任務部署、心跳檢測、故障通知等)。
-
Checkpoint 協調、資源申請等分布式操作。
-
核心特點
-
同步/異步調用:支持阻塞式調用或異步回調。
-
序列化:參數和返回值需要序列化傳輸(如 Flink 使用
TypeSerializer
)。 -
容錯:通過重試機制或超時處理保證可靠性。
Akka
概念
-
定義:基于 Actor 模型的并發框架,提供高性能、分布式的消息驅動編程模型。
-
Actor 模型:每個 Actor 是獨立執行單元,通過異步消息傳遞通信,天然支持分布式和容錯。
-
Flink 中的應用:
-
早期版本(≤1.14):Flink 的 RPC 層基于 Akka 實現,JobManager 和 TaskManager 的通信通過 Akka Actor 完成。
-
核心場景:任務調度、資源管理、Checkpoint 協調等控制層面的通信。
-
核心特點
-
異步非阻塞:天然支持高并發和低延遲。
-
容錯機制:通過監督策略(Supervision)處理 Actor 故障。
-
分布式擴展:Actor 可跨節點部署,形成分布式系統。
Netty
概念
-
定義:基于 NIO 的高性能網絡通信框架,專注于 TCP/UDP 數據傳輸。
-
作用:提供可擴展的網絡層實現,支持高吞吐量和低延遲的數據傳輸。
-
Flink 中的應用:
-
數據傳輸層:TaskManager 之間的數據交換(如 Shuffle、廣播數據)。
-
替代 Akka:從 Flink 1.15 開始,Netty 成為默認的 RPC 實現,逐步取代 Akka。
-
核心特點
-
零拷貝:通過
ByteBuf
減少內存復制開銷。 -
事件驅動:基于 Channel 和 EventLoop 的高效 IO 處理。
-
可插拔協議:支持 HTTP、WebSocket 等多種協議。
三者的關系
協作模式
-
RPC 是通信協議:
-
定義了分布式節點間的交互方式(如方法調用、參數傳遞)。
-
Akka 或 Netty 是實現 RPC 的底層框架:
-
在早期版本,Flink 使用 Akka Actor 實現 RPC。
-
新版本中,Flink 基于 Netty 實現 RPC(更輕量、無依賴)。
-
-
-
Akka vs. Netty 的角色演變:
-
Akka:早期負責控制流(任務調度、心跳)和 RPC。
-
Netty:始終負責數據流(Shuffle 數據傳輸);新版本接管 RPC 層。
-
-
分工與協同:
-
控制流(RPC):協調作業生命周期(如啟動、停止)、資源管理。
-
數據流(Netty):處理實際數據交換(如算子間的 Record 傳輸)。
-
架構演進
-
Flink 1.15+:為了減少對 Akka 的依賴(避免版本沖突),Flink 逐步將 RPC 層遷移到基于 Netty 的自研實現(
flink-rpc
模塊)。 -
當前狀態:
-
控制流:Netty-based RPC。
-
數據流:Netty 網絡棧(替代了早期的 Netty + Akka 混合模式)
-
二、Akka 與 Actor 模型
Akka 是 Actor Model 的一個實現,在 Actor 模型中,所有的實體被認為是獨立的 actors。actor 和其他 actor 通過發送異步消息通信。每個 actor 有一個郵箱(mailbox),它收到的消息存儲在里面。每個 actor 維護自身單獨的狀態。
下面是一個 Actors 網絡:
每個 actor 是一個單一的線程,它不斷地從它的郵箱中 poll 消息,并且不斷地處理。對于已經處理過的消息的結果,actor 可以改變它自身的內部狀態或者發送一個新消息或者孵化一個新的 actor。盡管單個的 actor 是