Java 一个减速机与多个减速机的比较,具有用于计算字数和排序的后处理功能。哪一个更高效、更可扩展?
我在一个MapReduce作业中使用排序(按值)进行字数计算。实现这一目标的两种方法:Java 一个减速机与多个减速机的比较,具有用于计算字数和排序的后处理功能。哪一个更高效、更可扩展?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我在一个MapReduce作业中使用排序(按值)进行字数计算。实现这一目标的两种方法: 在reduce函数中使用一个reducer并将所有内容保存在HashMap中,在cleanUp函数中按值对所有内容进行排序,然后将所有内容写入文件 在MapReduce作业之后,使用多个缩减器并在HDFS中保存字数。在MR之后,使用Java对所有内容进行排序 哪种解决方案在效率和可扩展性方面更好 第二种变体不提供全局排序,例如,如果您有两个还原器,则结果文件可能是 part-r-00000 word1
哪种解决方案在效率和可扩展性方面更好 第二种变体不提供全局排序,例如,如果您有两个还原器,则结果文件可能是
part-r-00000
word1 1
word2 3
part-r-00001
word3 2
word4 5
即使按值对每个文件进行排序,也很难按降序迭代单词word4-word2-word3-word1
。不过,你可以在阅读的同时做一些技巧
另一方面,单个减速器的执行速度较慢,因为它必须处理所有数据。此外,您可能没有足够的内存来保存JVM堆中的所有数据
如果可能的话,我会选择单个减速机。对于一般化的工作负载(包括字数),使用一个减速机不是一个好主意,因为它是一个明显的瓶颈(即,所有多个映射器输出都会用到它)。因此,选项2更可取
另外,请注意,reducer输出是经过排序的,因此“HashMap”、“cleanUp”在选项1中是多余的。在第二个变体中,排序可以通过Java Collection.sort()完成,方法是访问每个文件(part-r-00000、part-r-00001等),获取值并将其存储在HashMap中。hashmap的每个条目都可以添加到列表中,并可以使用Collection.sort()进行排序。你认为如果我们处理的是大文件,这可能吗?@HamzaMalik如果你能在一个减速机中做同样的事情,那么在MR作业之后用java程序读取所有文件有什么意义呢?因为在一个MR作业中,我只能找到单词的频率(我的减速机将所有最终频率相加),然后写回HDFS。我还想对输出的键值按值排序,但按关键字排序。@HamzaMalik你不明白我的意思。我说,在reducer cleanup中使用按值排序的变体1与在java程序中读取所有reducer文件并按值排序是一样的。好的,您认为在性能方面是一样的吗?所谓排序,我指的是按值排序,也有问题地进行了更新。