我开始学习使用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()
我理解这个算法通常如何工作,组合器(不需要运行)的功能,以及减速器如何在映射器和组合器的混洗和排序值上运行。
但是,我不明白减速器如何提出单一值。群集的不同节点上是否有不同的减少进程?如果分区器只将某些改组的键值对发送到某些减速器,那么这些减少函数如何得出一个答案?
我想我对各种减速器的输出如何组合成一个答案感到困惑。
答案 0 :(得分:2)
基本上,具有相同键的所有值都转到单个reducer。因此,即使有多个reducer,每个reducer也只有一个单独的密钥所需的所有数据。
答案 1 :(得分:0)
简短的回答是他们没有。正如您所注意到的,所有结果都必须发送到单个reducer,以获得单个结果。
通常应该对map-reduce作业的输出进行一些后期处理。这项工作可以完成繁重的工作,但每个减速器都会输出单独的结果。
您通常会在不同的环境中进行处理,但通常情况下,我最终会添加一个额外的作业(将第一个作业的输出作为输入)与身份映射器(没有处理数据)将所有内容发送到单个reducer(映射器发出的所有值共享相同的键)。然后,此缩减器可以对结果进行最终聚合。这可能并不总是获得聚合结果的有效且快速的解决方案,但有时,开销足够小,以便将所有内容保存在1 mrjob类中更容易。