一个reducer vs多个reducer,后处理用于计算单词和排序。哪一个更有效和可扩展?

时间:2017-02-18 21:09:50

标签: java hadoop mapreduce

我在一个MapReduce作业中通过排序(按值)进行字数统计。实现这一目标的两种方法:

  1. 使用一个reducer并在HashMap中保存reduce函数,并在cleanUp函数中按值排序,然后将所有内容写入文件。

  2. 在MapReduce作业后使用多个Reducer并在HDFS中保存字数。在MR使用Java对所有内容进行排序后。

  3. 从效率和可扩展性的角度来看,哪种解决方案更好。

2 个答案:

答案 0 :(得分:0)

第二种变体不提供全局排序,例如如果你有2个reducer,结果文件可能是

part-r-00000
word1    1
word2    3

part-r-00001
word3    2
word4    5

即使您按值对每个文件进行排序,也很难按降序word4-word2-word3-word1迭代这些单词。你可以制作一些技巧并行阅读。

另一方面,单个reducer执行速度较慢,因为它必须处理所有数据。此外,您可能无法获得足够的内存来将所有数据保存在reducer JVM堆中。

如果可能,我会选择单个减速机。

答案 1 :(得分:0)

对于具有一个reducer的广义工作负载(包括字数)不是一个好主意,因为它是一个明显的瓶颈(即,所有多个映射器输出都转到它)。所以选项2 更可取。

另外,请注意缩减器输出是如此排序,以便' HashMap'' cleanUp'在选项1 中是多余的。