所有减速器如何提出单一答案?

时间:2012-09-17 14:22:21

标签: 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, _, 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()

我理解这个算法通常如何工作,组合器(不需要运行)的功能,以及减速器如何在映射器和组合器的混洗和排序值上运行。

但是,我不明白减速器如何提出单一值。群集的不同节点上是否有不同的减少进程?如果分区器只将某些改组的键值对发送到某些减速器,那么这些减少函数如何得出一个答案?

我想我对各种减速器的输出如何组合成一个答案感到困惑。

2 个答案:

答案 0 :(得分:2)

基本上,具有相同键的所有值都转到单个reducer。因此,即使有多个reducer,每个reducer也只有一个单独的密钥所需的所有数据。

答案 1 :(得分:0)

简短的回答是他们没有。正如您所注意到的,所有结果都必须发送到单个reducer,以获得单个结果。

通常应该对map-reduce作业的输出进行一些后期处理。这项工作可以完成繁重的工作,但每个减速器都会输出单独的结果。

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