4

我试图找到重用可写对象与在 wordcount mapreduce 程序中创建新对象的性能优势。然而,无论输入数据有多大,这两个版本几乎都需要相同的时间来完成。

我还尝试通过更改为任务提供较低的堆空间,

<property>
    <name>mapred.child.java.opts</name>
    <value>-Xmx120m</value>
</property>

但是与更高的堆空间相比,这两个版本的运行速度都慢了一点。我永远无法获得重用可写文件以更好地执行的程序。我在这里错过了什么吗?

我修改的字数部分,

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));
  }
}
4

2 回答 2

1

这不是什么大问题,原因有两个:

  1. 你这样做IO,所以在每个输入行创建一些新对象并让它被垃圾收集并不是什么大不了的事。
  2. 最有可能的是,无论如何,您的内存占用量非常低。所以如果你创建对象,只要超过一定的内存阈值,它们就会被存储在堆内存中。因此,您的其他解决方案可能比其他解决方案占用更多的堆内存。如果您现在降低堆内存,则Garbage Collector必须更频繁地运行,因为阈值超出的频率更高。如果你打开它,你会在 GC 日志中看到它。

另一个原因可能是您测量时间的方式,aMap task涉及到大量的 RPC 通信在后面,因此您不能总是 100% 确定您的数据没有受到网络拥塞或其他环境影响的影响。

于 2012-12-28T09:27:34.467 回答
0

问题是这里的性能瓶颈,或者哪个对性能的影响更大,可重用的 IntVariable 或 IO。

重用变量理论上更好,但基于阿姆达尔定律http://en.wikipedia.org/wiki/Amdahl%27s_law,改进可能甚至不明显。

于 2012-12-28T01:01:35.120 回答