Hadoop。将结果缩减为单个值

Hadoop。将结果缩减为单个值,hadoop,mapreduce,Hadoop,Mapreduce,我开始学习Hadoop,对MapReduce有点困惑。对于结果本机是键值对列表的任务,一切似乎都很清楚。但我不明白当结果是一个值(比如,输入小数的平方和,或者输入点的质心)时,我应该如何解决这个问题 一方面,我可以将mapper的所有结果放在同一个键上。但据我所知,在本例中,唯一的减速机将管理整个数据集(计算总和或平均坐标)。这看起来不是一个好的解决方案 另一个我可以成像的方法是对映射器结果进行分组。例如,处理示例0-999的映射器将生成等于0的键,1000-1999将生成等于1的键,依此类推。

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

一方面,我可以将mapper的所有结果放在同一个键上。但据我所知,在本例中,唯一的减速机将管理整个数据集(计算总和或平均坐标)。这看起来不是一个好的解决方案

另一个我可以成像的方法是对映射器结果进行分组。例如,处理示例0-999的映射器将生成等于0的键,1000-1999将生成等于1的键,依此类推。只要减速机仍有多个结果,就有必要构建减速机链(将重复减速机,直到只剩下一个结果)。它看起来计算效率更高,但有点复杂

我仍然希望Hadoop有一个现成的工具,可以执行简化程序的叠加,以最大限度地将整个数据简化为单个值。虽然我没有找到一个


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

我认为您对您提出的特定用例的分析非常准确。这些用例仍然属于使用hadoop可以做的事情的一个相当广泛的范围,当然还有其他一些事情hadoop没有设计来处理。如果我必须解决同样的问题,我会遵循你的第一种方法,除非我知道数据太大,然后我会遵循你的两步方法。

在我看来,你从错误的角度解决问题

如果您需要对输入的平方进行求和,那么假设您有许多大型文本输入文件,每行由一个数字组成

理想情况下,您希望在映射器中并行化求和,然后在减缩器中求和

e、 G:

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

在reduce阶段,您基本上从映射器中获取所有的总和,并对总和进行求和,请注意,相对于庞大的输入文件而言,这相当小(n倍于单个整数,其中n是映射器的数量),因此单个reducer实际上不是可伸缩性瓶颈


您希望降低映射器和reducer之间的通信成本,而不是将所有数据代理到单个reducer并在其中读取,这不会使任何内容并行化。

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

非常感谢您的回答。但另外两个答案中的方法似乎更方便、更有效。
map: (input "x", temporary sum "s") -> s+=(x*x)