让我们考虑map reduce作业的基本单词计数示例和以下输入:
word1
word2
word1
word2
word3
对于我们的处理,我们认为我们有三个映射器和三个还原器。
对于映射,数据处理如下:
MAP1: (word1,1), (word2,1)
MAP2: (word1,1), (word2,1)
MAP3: (word3,1)
现在,洗牌阶段开始。word1
键需要在一起,word2
键和word3
键也需要在一起。
shuffle阶段可以决定将word1
发送到reducer1
,将word2
发送到reducer2
,将word3
发送到reducer3
,或将word1
发送到reducer2等。
如何决定每个键将被洗牌到哪个reducer ?
在reduce步骤之前,hadoop使用Partitioner
的实现来确定key应该发送到哪里。默认为HashPartitioner
,方法:
public int getPartition(K key, V value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
如果您的作业需要一些额外的逻辑,您可以使用自定义实现:
job.setPartitionerClass(YourPartitioner.class)