在写这篇文章之前,笔者已经大致的描述过关于hadoop的mapreduce的处理数据的过程。在这边,笔者主要来介绍一下在map阶段和reduce阶段之间进行的一些数据处理。
在map读取并处理完数据后,会把数据发送到partitioner,由partitioner来决定每一个键值对送往那个reduce节点。默认使用HashPartitioner,其核心方法是getPartition(),具体代码如下:
public int getPartition(K2 key, V2 value,int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
其中key和value就是mapper的输出值,然后根据key的hashcode来判断被分到哪个reducer节点上.如果numReduceTasks值为1说明只有一个分区。当然这个算法也可能造成结果不均匀。这时候就可以根据自己的需要设计出优秀的hash算法。
补充:reducer的个数可以通过job.setNumReduceTasks();来设置