一、Partitioner分区位置
从MapRedece框架原理里面我们发现在进入环形缓冲区有一个分区的操作,如图
二、Partitioner分区机制
源码默认采用HashPartitioner,源码如下
public class HashPartitioner<K2, V2> implements Partitioner<K2, V2> {
public void configure(JobConf job) {}
/** Use {@link Object#hashCode()} to partition. */
public int getPartition(K2 key, V2 value,
int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
默 认分区是根据key的hashCode对ReduceTasks个数取模得到的。用户没法控制哪个key存储到哪个分区。
三、自定义Partitioner分区
3.1 重点步骤:
(1)自定义类继承Partitioner,重写getPartition()方法
(2)在Job驱动中,设置自定义Partitioner
(3)自定义Partition后,要根据自定义Partitioner的逻辑设置相应数量的ReduceTask
3.2 Partitio