当我学习mapreduce时,其中一个关键组件是组合器。它是Map器和reducer之间的一个步骤,基本上是在Map阶段结束时运行reducer,以减少Map器输出的数据行数。随着我需要处理的数据大小的增加(以多TB的规模),reduce步骤变得非常慢。我和我的一个朋友谈过,他说这也是他的经历,他没有使用组合器,而是使用一个哈希函数来划分reduce键,这个哈希函数减少了reduce步骤中每个键的值的数量。我试过这个,效果很好。有没有其他人有过合并器步骤伸缩性不好的经验,为什么我找不到关于这个问题以及解决方法的任何文档?我宁愿不使用一个变通办法,如果有一个办法,使合并步骤的规模。
[编辑]下面是我朋友建议的解决方法的一个例子,它比组合器快得多:
而不是输出 word, count
Map器输出 (word, hash(timestamp) % 1024), count
然后有两个reduce步骤来合并Map器的结果。
1条答案
按热度按时间egmofgnx1#
我认为这些是不同的东西,没有解决办法。
只有当所讨论的计算允许部分归约时,组合器才适用,即,从键的部分元组发出中间结果,并使用归约步骤来组合中间结果。用组合器求和或求平均值很容易,其他算法则不然。
reduce步骤的性能(可伸缩性)在很大程度上取决于key partition函数如何将惟一的map输出键Map到reducer插槽。一个好的分区人员应该为每个reducer工作者分配相同的工作负载。
随着我需要处理的数据大小的增加(以多TB的规模),reduce步骤变得非常慢
mr范式没有内在的东西使得reduce步骤不是scale。不过,您的算法可能无法很好地Map到mapreduce。如果你能提供更多关于你具体在做什么的信息,我们可以帮你弄清楚。
他使用一个哈希函数来划分reduce键,这个哈希函数减少了reduce步骤中每个键的值的数量
这对我来说毫无意义。对键使用哈希函数只能增加每个bucket的值的数量。