什么是Flink網(wǎng)絡棧?
什么是Flink網(wǎng)格線
Flink網(wǎng)絡棧是Flink中的核心組件,是flink-runtime模塊的一部分。它連接了所有TaskManager中獨立的工作單元(subtask)。這是數(shù)據(jù)交換的核心部分,任務的吞吐量和延遲都與它息息相關,可以說Flink的網(wǎng)絡棧決定了Flink框架本身性能的好壞。
不同于TaskManager、JobManager之間通信所使用的Akka RPC框架,F(xiàn)link網(wǎng)絡棧采用了更底層的網(wǎng)絡API,使用的是Netty框架。
它抽象了以下三個概念的不同設置。
(1)Subtask output type (ResultPartitionType):工作單元的輸出類型。
- pipelined (bounded or unbounded):上游一產(chǎn)生數(shù)據(jù),就一條條地往下游發(fā)送,作為有界或無界的數(shù)據(jù)流。
- blocking:直到上游的全部結(jié)果就緒才向下游發(fā)送數(shù)據(jù)。
(2)Scheduling type
- all at once (eager):同時部署所有的工作單元(流式應用采用這種模式)。
- next stage on first output (lazy):當上游的生產(chǎn)者開始有輸出結(jié)果的時候,才開始部署下游的工作單元,是一種lazy模式。
- next stage on complete output:在上游的數(shù)據(jù)全部就緒之后才開始部署下游的工作單元。
(3)Transport?
- high throughput:不采用一條條地發(fā)送數(shù)據(jù)的模式,F(xiàn)link緩存一批數(shù)據(jù)到網(wǎng)絡緩存中,攢批發(fā)送。這種方式減少了網(wǎng)絡開銷的單條邊際成本,帶來了高吞吐量。
- low latency via buffer timeout:通過調(diào)低發(fā)送數(shù)據(jù)的間隔,犧牲一定的吞吐量以獲得更低的延遲。
工作單元的輸出類型和調(diào)度類型是緊密交織在一起的,兩者的特定組合才有效。Pipelined result partition是流式的輸出,流式輸出需要將數(shù)據(jù)發(fā)送到一個正在工作的工作單元,因此目標任務就需要在上游結(jié)果下發(fā)之前或者在任務啟動之初完成部署。批作業(yè)產(chǎn)出有限的結(jié)果,而流式作業(yè)產(chǎn)出無限的結(jié)果。
為了理解真實的數(shù)據(jù)流轉(zhuǎn),我們假想一個有4個并發(fā)的任務,部署在兩個分別有2個Slot的TaskManager上。在Flink中,不同的任務可能會共享同一個Slot, 通過Slot 共享組機制,一個TaskManager可以提供多個Slot來運行一個任務的多個工作單元。
TaskManager 1 運行工作單元A.1、A.2、B.1 和 B.2, 而TaskManager 2 運行工作單元A.3、A.4、B.3和B.4。假設A和B之間的shuffle方式是keyBy(), 這樣在每一個TaskManager上都有2×4個邏輯連接,有些走本地傳輸,有些是通過網(wǎng)絡傳輸,如圖1所示。
▲圖1 工作單元部署
不同任務之間的每個(遠程)網(wǎng)絡連接都將在Flink網(wǎng)絡棧中獲得自己的TCP通道,如果同一個任務的不同工作單元被調(diào)度到同一個TaskManager上,那么它們將復用TCP連接用于連接遠程TM(多路復用)。在我們的例子中,A.1 → B.3、A.1 → B.4 以及A.2 → B.3、A.2 → B.4將會復用一個TCP連接,如圖2所示。
▲圖2 數(shù)據(jù)交換
每個工作單元的輸出被稱作ResultPartition,每個ResultPartition又根據(jù)下游輸出結(jié)果的不同分區(qū)被細分為ResultSubPartition,與下游的inputChannel一一對應。在這個階段,F(xiàn)link已經(jīng)不再單獨處理每條記錄了,而是將一組序列化完的數(shù)據(jù)打包并復制到NetworkBuffer中,然后經(jīng)由Netty傳輸?shù)较掠嗡阕印?/p>
本文摘編于《Flink技術(shù)內(nèi)幕:架構(gòu)設計與實現(xiàn)原理》,經(jīng)出版方授權(quán)發(fā)布。(書號:9787111696292)轉(zhuǎn)載請保留文章來源。?