1

当我学习 mapreduce 时,其中一个关键组件是组合器。这是 mapper 和 reducer 之间的一个步骤,它本质上是在 map 阶段结束时运行 reducer,以减少 mapper 输出的数据行数。随着我需要处理的数据大小的增加(在数 TB 级),reduce 步骤变得异常缓慢。我和我的一个朋友谈过,他说这也是他的经验,他没有使用组合器,而是使用哈希函数对他的 reduce 键进行分区,这减少了 reduce 步骤中每个键的值的数量. 我试过了,它奏效了。有没有其他人有过这种组合器步骤不能很好地扩展的经验,为什么我找不到这个问题的任何文档以及解决方法?我'

[编辑] 这是我朋友建议的解决方法的一个示例,它比组合器工作得快得多:

而不是输出word, count

映射器输出(word, hash(timestamp) % 1024), count

然后有2个reduce步骤来合并mapper的结果。

4

1 回答 1

0

我认为这些是不同的事情,没有解决方法。

  • 组合器是仅当所讨论的计算允许部分归约时,Combiner 才从键的部分元组发出中间结果,并使用归约步骤组合中间结果。使用组合器可以轻松地求和或求平均值,而其他算法则不然。

  • Reduce步骤的性能(可扩展性)很大程度上取决于键分区函数将唯一映射输出键映射到 reducer 槽的程度。一个好的 partitioner 应该为每个 reducer worker 分配相同的工作量。

随着我需要处理的数据大小的增加(在数 TB 级),reduce 步骤变得异常缓慢

MR 范式没有什么固有的东西使 Reduce 步骤无法扩展。不过,您的算法可能无法很好地映射到 MapReduce。如果您可以提供有关您具体在做什么的更多信息,我们可以帮助您弄清楚。

他使用散列函数对他的reduce键进行分区,该函数减少了reduce步骤中每个键的值的数量

这对我来说没有意义。在键上使用散列函数只能增加进入每个桶的值的数量。

于 2014-09-03T04:59:46.093 回答