【譯】A Deep-Dive into Flink's Network Stack(2)
- 2019 年 10 月 4 日
- 筆記
本篇翻譯接上一篇
對於下圖所示的示例,我們將假設4的並行性和具有兩個任務管理器的部署,每個任務管理器提供2個插槽。 TaskManager 1執行子任務A.1,A.2,B.1和B.2,TaskManager 2執行子任務A.3,A.4,B.3和B.4。 在任務A和任務B之間的隨機類型連接中,例如從keyBy(),在每個TaskManager上有2×4個邏輯連接,其中一些是本地的,一些是遠程的:

不同任務之間的每個(遠程)網路連接將在Flink的網路堆棧中獲得自己的TCP通道。 但是,如果同一任務的不同子任務被安排到同一個TaskManager,則它們與同一個TaskManager的網路連接將被多路復用並共享一個TCP信道以減少資源使用。 在我們的例子中,這適用於A.1→B.3,A.1→B.4,以及A.2→B.3和A.2→B.4,如下圖所示:

每個子任務的結果稱為ResultPartition,每個子結果分成單獨的ResultSubpartitions – 每個邏輯通道一個。 在堆棧的這一點上,Flink不再處理單個記錄,而是將一組序列化記錄組裝到網路緩衝區中。 每個子任務可用於其自己的本地緩衝池中的緩衝區數量(每個發送方和接收方各一個)最多限制為一個
#channels * buffers-per-channel + floating-buffers-per-gate