一个减速机与多个减速机,用于计算单词和排序的后处理哪一个更高效和可扩展?

hc8w905p  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(268)

我在一个mapreduce作业中使用排序(按值)进行字数计算。实现这一点的两种方法:
使用一个减速机,在reduce函数中保存hashmap中的所有内容,在cleanup函数中按值对所有内容进行排序,然后将所有内容写入文件。
在mapreduce作业之后使用多个reducer并在hdfs中保存字数。在mr使用java对所有东西进行排序之后。
哪种解决方案在效率和可扩展性方面更好。

3okqufwl

3okqufwl1#

对于一个通用的工作负载(包括字数),使用一个reducer不是一个好主意,因为它是一个明显的瓶颈(即,所有多个mapper输出都指向它)。因此,方案2更可取。
另外,请注意,reducer输出是经过排序的,因此“hashmap”、“cleanup”在选项1中是多余的。

bybem2ql

bybem2ql2#

第二种变体不提供全局排序,例如,如果您有2个缩减器,则结果文件可能是

part-r-00000
word1    1
word2    3

part-r-00001
word3    2
word4    5

即使您按值对每个文件进行排序,也很难按降序遍历单词 word4-word2-word3-word1 . 不过,你可以在阅读时耍些小把戏。
另一方面,单个reducer执行速度较慢,因为它必须处理所有数据。还有可能您没有足够的内存来保存jvm堆中的所有数据。
如果可能的话,我会选择单减速机。

相关问题