1.分区和默认的分区类HashPartitioner
MapReduce过程中,每个map task处理完数据后,Shuffle机制通过分区类Partitioner决定每条记录应该送往哪个Reducer节点,默认使用的是HashPartitioner,使用Hash方式把(key,value)对均匀的分发到各个对应编号的Reduce Task节点上,以均衡Reduce Task节点的计算负载,其核心代码如下:
public class HashPartitioner<K, V> extends Partitioner<K, V> {
//key:输出的键值对中的键,numReduceTasks:reducer的数量
public int getPartition(K key, V value,int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
对于HashPartitioner的理解
1)一句不是很重要但总是被忽视的的废话
如果Reducer的数量为1,则所有Key经过分区函数都是0,即只有一个Reducer的情况下所有Key-Value都会被发送到这个Reducer上。
2)HashPartition