在mapreduce中,"shuffle step"如何决定每个键应该放在哪里?



让我们考虑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)

最新更新