Flink包含8中分区策略,这8中分区策略(分区器)分别如下面所示,本文将从源码的角度一一解读每个分区器的实现方式。
- GlobalPartitioner
- ShufflePartitioner
- RebalancePartitioner
- RescalePartitioner
- BroadcastPartitioner
- ForwardPartitioner
- KeyGroupStreamPartitioner
- CustomPartitionerWrapper
继承关系图
接口
名称
ChannelSelector
实现
- public interface ChannelSelector<T extends IOReadableWritable> {
- /**
- * 初始化channels数量,channel可以理解为下游Operator的某个实例(并行算子的某个subtask).
- */
- void setup(int numberOfChannels);
- /**
- *根据当前的record以及Channel总数,
- *决定应将record发送到下游哪个Channel。
- *不同的分区策略会实现不同的该方法。
- */
- int selectChannel(T record);
- /**
- *是否以广播的形式发送到下游所有的算子实例
- */
- boolean isBroadcast();
- }
抽象类
名称
StreamPartitioner
实现
- public abstract class StreamPartitioner<T> implements
- ChannelSelector<SerializationDelegate<StreamRecord<T>>>, Serializable {
- private static final long serialVersionUID = 1L;
- protected int numberOfChannels;
- @Override
- public void setup(int numberOfChannels) {
- this.numberOfChannels = numberOfChannels;
- }
- @Override
- public boolean isBroadcast() {
- return false;
- }
- public abstract StreamPartitioner<T> copy();
- }
继承关系图
GlobalPartitioner
简介
该分区器会将所有的数据都发送到下游的某个算子实例(subtask id = 0)
源码解读
- /**
- * 发送所有的数据到下游算子的第一个task(ID = 0)
- * @param <T>
- */
- @Internal
- public class GlobalPartitioner<T> extends StreamPartitioner<T> {
- private static final long serialVersionUID = 1L;
- @Override
- public int selectChannel(SerializationDelegate<StreamRecord<T>> record) {
- //只返回0,即只发送给下游算子的第一个task
- return 0;
- }
- @Override
- public StreamPartitioner<T> copy() {
- return this;
- }
- @Override
- public String toString() {
- return "GLOBAL";
- }
- }