flink系列(6)-流分區器partition分析

  • 2019 年 10 月 4 日
  • 筆記

流分區器,在流進行轉換後,flink通過分區器精確控制數據的流向,下圖是flink提供的所有的所有的分區器

可以發現所有的partition都需要實現StreamPartitioner介面和ChannelSelector的介面

其中ForwardPartitioner和GlobalPartitioner兩個實現器基本一樣,是將記錄轉發給在本地運行的下游的(歸屬於subtask)的operation

ShufflePartitioner是隨機選擇一個channel

RebalancePartitioner實現了一個輪詢分區演算法

BroadcastPartitioner是將數據發往下游所有節點

RescalPartitioner是通過輪詢的方式發往下游

針對這個進行一些說明:

上游操作所發送的元素被分區到下游操作的哪些子集,依賴於上游和下游操作的並行度。例如,如果上游操作的並行度為2,而下游操作的並行度為4,那麼一個上游操作會分發元素給兩個下游操作,同時另一個上游操作會分發給另兩個下游操作。相反的,如果下游操作的並行度為2,而上游操作的並行度為4,那麼兩個上游操作會分發數據給一個下游操作,同時另兩個上游操作會分發數據給另一個下游操作。在上下游的並行度不是呈倍數關係的情況下,下游操作會有數量不同的來自上游操作的輸入 KeyGroupStreamPartitioner:通過記錄的數據值獲得分區key,通過如下公式

keyGroupId * parallelism / maxParallelism

計算出最終的channel

CustomPartitionerWrapper:是自定義分區器