当我被教导关于mapreduce时,其中一个关键组件是组合器。它是映射器和reducer之间的一个步骤,它基本上在map阶段结束时运行reducer,以减少mapper输出的数据行数。随着我需要处理的数据大小的增加(以多兆比特为单位),减少步骤变得非常慢。我跟我的一个朋友聊过,他说这也是他的经验,而不是使用合并器,他使用散列函数对reduce键进行分区,这减少了reduce步骤中每个键的值的数量。我试过这个并且它有效。有没有其他人在组合器步骤中有这种经验不能很好地扩展,为什么我找不到这个问题的任何文档以及解决方法?如果有办法使组合器步长缩放,我宁愿不使用变通方法。
[编辑] 以下是我的朋友建议的解决方法示例,其工作速度比合并器快得多:
而不是输出word, count
映射器输出(word, hash(timestamp) % 1024), count
然后有2个简化步骤来合并映射器的结果。
答案 0 :(得分:0)
我认为这些是截然不同的事情,没有解决方法。
如果有问题的计算允许部分缩减,即从密钥的部分元组中发出中间结果,组合器仅适用于 ,并使用reduce步骤来组合中间结果。使用组合器很容易求和或平均值,其他算法则不然。
Reduce 步骤的性能(可伸缩性)在很大程度上取决于密钥分区功能将唯一映射输出键映射到reducer slot的程度。一个好的分区程序应该为每个reducer worker分配相同的工作负载。
随着我需要处理的数据大小的增加(以多兆比特为单位),减少步骤变得过于缓慢
MR范式没有什么固有的东西使Reduce步骤不规模化。但是,您的算法可能无法很好地映射到MapReduce。如果您能提供更多有关您正在做的事情的信息,我们可以帮您弄清楚。
他使用哈希函数对reduce键进行分区,该函数减少了reduce步骤中每个键的值的数量
这对我没有意义。在密钥上使用哈希函数只能增加每个桶的值的数量。