我开始学习Hadoop,并且对MapReduce感到有点困惑。对于结果本身就是键值对列表的任务,一切看起来都很清楚。但是我不明白我应该如何解决结果是单个值的任务(比如输入小数的平方和,或输入点的质心)。
一方面,我可以将mapper的所有结果放在同一个键上。但据我所知,在这种情况下,唯一的减速器将管理整组数据(计算总和或平均坐标)。它看起来不是一个好的解决方案。
我可以成像的另一个是分组映射器结果。比如,处理示例0-999的映射器将产生密钥等于0,1000-1999将产生密钥等于1,依此类推。至于还有多个减速器的结果,有必要建立减速器链(减少将重复,直到只剩下一个结果)。它看起来更有计算效果,但有点复杂。
我仍然希望Hadoop拥有现成的工具,可以执行reducers的叠加,从而最大限度地提高将整个数据减少到单个值的效率。虽然我找不到一个。
解决结果为单一值的任务的最佳做法是什么?
答案 0 :(得分:1)
从我的角度来看,你是从错误的角度解决问题。
看到你需要对输入的平方求和的问题,我们假设你有很多大文本输入文件,每行包含一个数字。
然后理想情况下,您希望在映射器中并行化您的总和,然后只计算减速器中的总和。
e.G:
map: (input "x", temporary sum "s") -> s+=(x*x)
在地图的末尾,您将使用全局密钥发出每个映射器的临时总和。
在reduce阶段,你基本上可以从你的地图制作者那里得到所有的总和并总结总和,注意这相对于你的巨大而言相当小(n倍于一个整数,其中n是映射器的数量)输入文件,因此单个reducer实际上不是可伸缩性瓶颈。
您希望降低映射器和reducer之间的通信成本,而不是将所有数据代理到单个reducer并在那里读取,这样就不会并行化。
答案 1 :(得分:1)
如果你能够根据交换减少重新制定你的任务,你应该看看Combiners。你应该以任何方式看一下它,它可以显着减少数据量以便随机播放。
答案 2 :(得分:0)
我认为您对所提出的具体用例的分析是正确的。这些用例仍然属于你可以用hadoop做的相当包容的范围,并且肯定还有其他的东西只是没有设计来处理。如果我必须解决同样的问题,我会按照你的第一种方法,除非我知道数据太大,然后我会按照你的两步法。