我开始学习hadoop,对mapreduce有点困惑。对于结果本机是键值对列表的任务,一切似乎都很清楚。但我不明白我该如何解决结果是一个单一值(比如,输入小数的平方和,或输入点的质心)的问题。
一方面,我可以把所有的结果Map到同一个键。但据我所知,在这种情况下,唯一的减速机将管理整个数据集(计算总和,或平均坐标)。这看起来不是个好办法。
另一个我可以成像的是分组Map结果。例如,处理示例0-999的Map器将生成等于0的键,1000-1999将生成等于1的键,依此类推。只要还原剂仍有多个结果,就有必要构建还原剂链(将重复还原,直到只剩下一个结果)。它看起来更有效,但是有点复杂。
我仍然希望hadoop有现成的工具,可以执行还原器的叠加,以最大限度地将整个数据还原为单个值。虽然我没找到。
解决结果是单一值的任务的最佳实践是什么?
3条答案
按热度按时间7fhtutme1#
依我看,你从错误的Angular 来处理这个问题。
如果您需要计算输入的平方和,那么假设您有许多大型文本输入文件,每行由一个数字组成。
理想情况下,你需要在Map器中并行求和,然后在减缩器中求和。
例如:
在Map的末尾,您将使用全局键发出每个Map器的临时总和。
在reduce阶段,基本上从Map器中得到所有的和,然后求和,注意相对于庞大的输入文件,这是相当小的(n乘以一个整数,其中n是Map器的数量),因此单个reducer实际上不是可伸缩性瓶颈。
您希望降低Map器和reducer之间的通信成本,而不是将所有数据代理到一个reducer并在那里读取,这样就不会并行化任何东西。
t8e9dugd2#
我认为你对你提出的具体用例的分析是正确的。这些用例仍然属于hadoop所能做的一个相当包容的范围,当然还有其他hadoop所不能处理的事情。如果我必须解决同样的问题,我会遵循你的第一种方法,除非我知道数据太大,然后我会遵循你的两步方法。
eivnm1vs3#
如果你能够重新制定你的任务在交换减少方面,你应该看看组合器。不管您应该以什么方式查看它,它都可以显著减少要洗牌的数据量。