Flink的八种分区策略源码分析

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"; 

    } 

相关文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注