我在一个MapReduce作业中通过排序(按值)进行字数统计。实现这一目标的两种方法:
使用一个reducer并在HashMap中保存reduce函数,并在cleanUp函数中按值排序,然后将所有内容写入文件。
在MapReduce作业后使用多个Reducer并在HDFS中保存字数。在MR使用Java对所有内容进行排序后。
从效率和可扩展性的角度来看,哪种解决方案更好。
答案 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 中是多余的。