Mapreduce 所有的减速机如何得出一个单一的答案?

Mapreduce 所有的减速机如何得出一个单一的答案?,mapreduce,mrjob,Mapreduce,Mrjob,我开始学习使用mrjob python包的MapReduce。mrjob文档将以下代码段作为示例MapReduce脚本列出 """The classic MapReduce job: count the frequency of words. """ from mrjob.job import MRJob import re WORD_RE = re.compile(r"[\w']+") class MRWordFreqCount(MRJob): def mapper(self,

我开始学习使用mrjob python包的MapReduce。mrjob文档将以下代码段作为示例MapReduce脚本列出

"""The classic MapReduce job: count the frequency of words.
"""
from mrjob.job import MRJob
import re

WORD_RE = re.compile(r"[\w']+")


class MRWordFreqCount(MRJob):

    def mapper(self, _, line):
        for word in WORD_RE.findall(line):
            yield (word.lower(), 1)

    def combiner(self, word, counts):
        yield (word, sum(counts))

    def reducer(self, word, counts):
        yield (word, sum(counts))


 if __name__ == '__main__':
     MRWordFreqCount.run()
我了解该算法通常是如何工作的,组合器(不需要运行)是做什么的,以及还原器如何在映射器和组合器中的无序和排序值上运行

然而,我不明白减速机是如何得出一个值的。在集群的不同节点上不存在不同的reduce进程吗?如果分区程序只将某些混洗键值对发送给特定的reducer,那么这些reduce函数如何给出一个答案


我想我对如何将来自不同减速机的输出组合成一个答案感到困惑。

基本上,所有具有相同键的值都会被分配到一个减速机。因此,即使有多个减速机,每个减速机都有一个键所需的所有数据。

简单的回答是它们没有。正如您正确地注意到的,所有结果都必须发送到单个减速器,才能获得单个结果

您通常应该期望对map reduce作业的输出进行一些后处理。这项工作完成了繁重的chruncing,但每个reducer都会输出单独的结果

您通常会在不同的环境中进行处理,但通常情况下,我只是添加了一个额外的作业(将第一个作业的输出作为输入),并使用标识映射器(不处理数据),该映射器将所有内容发送到单个还原器(映射器发出的所有值共享同一个键)。然后,此缩减器可以对结果进行最终聚合。对于获得聚合结果来说,这可能并不总是一个高效、快速的解决方案,但有时,开销足够小,因此更容易将所有内容都保存在1 mrjob类中