我试图在wordcount mapreduce程序中找到重用writeables和创建新对象的性能优势。然而,两个版本几乎完成相同的时间来完成输入数据。
我还尝试通过更改
为任务提供更低的堆空间<property>
<name>mapred.child.java.opts</name>
<value>-Xmx120m</value>
</property>
但与更高的堆空间相比,这两个版本运行速度稍慢。我从来没有能够得到重写可写的程序来更好地执行。我在这里错过了什么吗?
我修改过的wordcount部分,
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
context.write(new Text(itr.nextToken()), new IntWritable(1));
}
}
答案 0 :(得分:1)
这有两个原因:
IO
慢,所以每个输入行创建一些新对象并让它被垃圾收集不会有什么大不了的。Garbage Collector
必须更频繁地运行,因为阈值会更频繁地超过。如果你打开它,你会在GC日志中看到这个。另一个原因可能是您测量时间的方式,Map task
涉及后面的大量RPC通信,因此您无法始终100%确定您的数据不会被网络扭曲拥堵或其他环境影响。
答案 1 :(得分:0)
问题在于这里的性能瓶颈,或影响性能的更多,可重复使用的IntVariable或IO。
重用变量在理论上更好,但根据Amdahl定律http://en.wikipedia.org/wiki/Amdahl%27s_law,改进可能甚至不明显。