【问题标题】:How do all the reducers come up with a single answer?所有的减速器如何得出一个单一的答案?
【发布时间】:2013-06-24 03:32:47
【问题描述】:

我开始使用 mrjob python 包学习 MapReduce。 mrjob 文档列出了以下 sn-p 作为示例 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 函数如何得出一个单一的答案?

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

【问题讨论】:

    标签: mapreduce mrjob


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2022-11-21
        • 1970-01-01
        • 2018-01-25
        • 1970-01-01
        • 2017-07-03
        • 2021-10-13
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        相关资源
        最近更新 更多