2

我开始学习 Hadoop,对 MapReduce 有点困惑。对于结果本身是键值对列表的任务,一切似乎都很清楚。但我不明白我应该如何解决结果是单个值的任务(例如,输入小数平方和,或输入点的质心)。

一方面,我可以将映射器的所有结果放到同一个键上。但据我所知,在这种情况下,唯一的 reducer 将管理整个数据集(计算总和或平均坐标)。这看起来不是一个好的解决方案。

我可以成像的另一个是对映射器结果进行分组。比如说,处理示例 0-999 的映射器将产生等于 0 的键,1000-1999 将产生等于 1 的键,依此类推。只要reducer 仍然会有多个结果,就需要建立reducer 链(reducing 将重复直到只剩下一个结果)。它看起来更有效的计算,但有点复杂。

我仍然希望 Hadoop 有现成的工具来执行 reducer 的叠加,以最大限度地提高将整个数据归约为单个值的效率。虽然我没找到。

解决结果为单个值的任务的最佳实践是什么?

4

3 回答 3

1

如果您能够根据可交换减少重新制定您的任务,您应该查看Combiners。无论您以何种方式查看它,它都可以显着减少要洗牌的数据量。

于 2012-10-10T16:50:27.200 回答
1

从我的角度来看,您从错误的角度解决问题。

请参阅需要对输入的平方求和的问题,假设您有许多大型文本输入文件,每行由一个数字组成。

然后理想情况下,您希望在映射器中并行化您的总和,然后在化简器中总结总和。

例如:

map: (input "x", temporary sum "s") -> s+=(x*x)

在映射结束时,您将使用全局键发出每个映射器的临时总和。

在 reduce 阶段,您基本上从映射器中获取所有总和并将总和相加,请注意,与您的巨大输入文件和因此,单个 reducer 确实不是可伸缩性瓶颈。

您想减少映射器和减速器之间的通信成本,而不是将所有数据代理到单个减速器并在那里读取它,这不会并行化任何东西。

于 2012-10-10T15:47:08.763 回答
0

我认为你对你提出的具体用例的分析是正确的。这些用例仍然属于您可以使用 hadoop 执行的相当广泛的范围,而且肯定还有其他一些事情是 hadoop 无法处理的。如果我必须解决同样的问题,除非我知道数据太大,否则我会遵循您的第一种方法,然后我会遵循您的两步方法。

于 2012-10-10T15:25:55.790 回答