在mapreduce中重用可写对象

l2osamch  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(377)

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

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

wb1gzix01#

问题是哪一个是性能瓶颈,或者哪一个对性能影响更大,是可重用的intvariable还是io。
重用变量理论上更好,但基于阿姆达尔定律http://en.wikipedia.org/wiki/amdahl%27s_law,改善甚至可能不明显。

f0brbegy

f0brbegy2#

这不是什么大事,原因有二:
你知道吗 IO 这很慢,所以在每个输入行中创建几个新对象并让它被垃圾收集并不是什么大事。
最有可能的是,你有一个非常低的内存占用。因此,如果创建对象,只要超过某个内存阈值,它们就会存储在堆内存中。因此,您的另一个解决方案可能比另一个解决方案占用更多的堆内存。如果现在降低堆内存,则 Garbage Collector 必须更频繁地运行,因为阈值超出的频率更高。如果你打开它,你会在gc日志中看到这个。
另一个原因可能是你测量时间的方式,一个 Map task 在后面涉及大量的rpc通信,因此您不能总是100%确定您的数据没有受到网络拥塞或其他环境影响的影响。

相关问题