在mapreduce中重用可写对象

时间:2012-12-28 00:47:51

标签: hadoop mapreduce

我试图在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));
  }
}

2 个答案:

答案 0 :(得分:1)

这有两个原因:

  1. 你做IO ,所以每个输入行创建一些新对象并让它被垃圾收集不会有什么大不了的。
  2. 最有可能的是,你的内存占用量非常低。因此,如果您创建对象,只要超过某个内存阈值,它们就会存储在堆内存中。因此,您的其他解决方案可能需要比另一个更多的堆内存。如果现在降低堆内存,Garbage Collector必须更频繁地运行,因为阈值会更频繁地超过。如果你打开它,你会在GC日志中看到这个。
  3. 另一个原因可能是您测量时间的方式,Map task涉及后面的大量RPC通信,因此您无法始终100%确定您的数据不会被网络扭曲拥堵或其他环境影响。

答案 1 :(得分:0)

问题在于这里的性能瓶颈,或影响性能的更多,可重复使用的IntVariable或IO。

重用变量在理论上更好,但根据Amdahl定律http://en.wikipedia.org/wiki/Amdahl%27s_law,改进可能甚至不明显。