我在一个mapreduce作业中使用排序(按值)进行字数计算。实现这一点的两种方法:使用一个减速机,在reduce函数中保存hashmap中的所有内容,在cleanup函数中按值对所有内容进行排序,然后将所有内容写入文件。在mapreduce作业之后使用多个reducer并在hdfs中保存字数。在mr使用java对所有东西进行排序之后。哪种解决方案在效率和可扩展性方面更好。
3okqufwl1#
对于一个通用的工作负载(包括字数),使用一个reducer不是一个好主意,因为它是一个明显的瓶颈(即,所有多个mapper输出都指向它)。因此,方案2更可取。另外,请注意,reducer输出是经过排序的,因此“hashmap”、“cleanup”在选项1中是多余的。
bybem2ql2#
第二种变体不提供全局排序,例如,如果您有2个缩减器,则结果文件可能是
part-r-00000 word1 1 word2 3 part-r-00001 word3 2 word4 5
即使您按值对每个文件进行排序,也很难按降序遍历单词 word4-word2-word3-word1 . 不过,你可以在阅读时耍些小把戏。另一方面,单个reducer执行速度较慢,因为它必须处理所有数据。还有可能您没有足够的内存来保存jvm堆中的所有数据。如果可能的话,我会选择单减速机。
word4-word2-word3-word1
2条答案
按热度按时间3okqufwl1#
对于一个通用的工作负载(包括字数),使用一个reducer不是一个好主意,因为它是一个明显的瓶颈(即,所有多个mapper输出都指向它)。因此,方案2更可取。
另外,请注意,reducer输出是经过排序的,因此“hashmap”、“cleanup”在选项1中是多余的。
bybem2ql2#
第二种变体不提供全局排序,例如,如果您有2个缩减器,则结果文件可能是
即使您按值对每个文件进行排序,也很难按降序遍历单词
word4-word2-word3-word1
. 不过,你可以在阅读时耍些小把戏。另一方面,单个reducer执行速度较慢,因为它必须处理所有数据。还有可能您没有足够的内存来保存jvm堆中的所有数据。
如果可能的话,我会选择单减速机。