1

我开始使用 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进程吗?如果分区器仅将某些经过洗牌的键值对发送到某些缩减器,这些缩减函数如何得出一个单一的答案?

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

4

2 回答 2

2

基本上,所有具有相同键的值都转到一个减速器。所以即使有多个reducer,每个reducer都拥有一个key所需的所有数据。

于 2013-01-16T06:24:03.660 回答
0

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

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

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

于 2013-06-23T19:26:09.637 回答