目前Flink支持8種分區策略:
- GlobalPartitioner: 數據會被分發到下游算子的第一個實例中進行處理。
- ShufflePartitioner :數據會被隨機分發到下游算子的每一個實例中進行。
- RebalancePartitioner: 數據會被循環發送到下游的每一個實例中進行處理。
- RescalePartitioner :這種分區器會根據上下游算子的並行度,循環的方式輸出到下游算子的每個實例。這裏有點難以理解,假設上游並行度爲 2,編號爲 A 和 B。下游並行度爲 4,編號爲 1,2,3,4。那麼 A 則把數據循環發送給 1 和 2,B 則把數據循環發送給 3 和 4。假設上游並行度爲 4,編號爲 A,B,C,D。下游並行度爲 2,編號爲 1,2。那麼 A 和 B 則把數據發送給 1,C 和 D 則把數據發送給 2。
- BroadcastPartitioner :廣播分區會將上游數據輸出到下游算子的每個實例中。適合於大數據集和小數據集做Jion的場景。
- ForwardPartitioner:用於將記錄輸出到下游本地的算子實例。它要求上下游算子並行度一樣。簡單的說,ForwardPartitioner用來做數據的控制檯打印。
- KeyGroupStreamPartitioner :Hash 分區器。會將數據按Key的Hash值輸出到下游算子實例中。
- CustomPartitionerWrapper:用戶自定義分區器。需要用戶自己實現 Partitioner 接口,來定義自己的分區邏輯。
static class CustomPartitioner implements Partitioner<String> {
@Override
public int partition(String key, int numPartitions) {
switch (key){
case "1": return 1;
case "2": return 2;
case "3": return 3;
default : return 4;
}
}
}