2012-03-14 50 views
4

我目前正在研究一个项目,我需要为我的地图任务建立一个内存结构。我做了一些计算,我可以说,我不需要每个地图任务超过600MB的内存。 但事情是,过了一段时间,我有Java堆空间问题或GC开销限制。我不知道这怎么可能。Hadoop:堆空间和gc问题

这里是一些更多的细节。我有两个四核系统,内存为12GB。这意味着我最多可以同时运行8个地图任务。我正在构建一棵树,所以我有一个迭代算法,为每个树级执行map-reduce作业。我的算法适用于小数据集,但对于中等数据集有堆空间问题。我的算法达到某个树级别,然后它离开堆空间,或者有gc开销问题。在那一点上,我做了一些计算,我看到每个任务都不需要超过100MB的内存。所以对于8个任务,我使用了大约800MB的内存。我不知道发生了什么事。我甚至用这些行更新了我的hadoop-env.sh文件:

export HADOOP_HEAPSIZE=8000 
    export HADOOP_OPTS=-XX:+UseParallelGC 

什么问题?这些行甚至会覆盖我的系统的java选项吗?使用parallelGC是我在互联网上看到的东西,在有多个内核时推荐使用。

 edits 

确定这里有一些编辑后,监视堆空间和总内存。 同时运行6个任务时,我消耗了大约3500MB的RAM。这意味着jobtracker,tasktracker,namenode,datanode,secondary namenode我的操作系统和6个任务都使用3500个RAM,这是一个非常合理的大小。那么,为什么我得到一个gc开销限制? 我对每个树级都遵循相同的算法。唯一改变的是每个树级的节点数量。在树级别有许多节点,不会为我的算法增加太多开销。那么为什么gc不能很好地工作?

+0

请问您可以发布您的地图并减少方法吗? – darijan 2012-03-14 14:04:09

+0

我可以,但他们有点复杂。在这里发布我的代码会很混乱。如果你仍然想看到它,请再次问我 – jojoba 2012-03-14 14:08:14

回答

5

如果最大内存大小没有变化,它将是主内存的1/4,即大约3 GB,另外一些非堆使用的开销可能是3.5 GB。

我建议你尝试

export HADOOP_OPTS="-XX:+UseParallelGC -Xmx8g" 

最大内存设置为8 GB。


默认情况下,最大堆大小是内存的1/4(除非在Windows上运行32位JVM)。所以如果最大堆大小被忽略,它仍然是3 GB。

无论您使用一个GC还是另一个GC,当内存不足时都不会有太大的区别。

我建议你用-XX:+HeapDumpOnOutOfMemoryError进行堆转储,并在一个分析器中读取这个数据。 VisualVM看看为什么它使用了这么多的内存。

+0

我使用的是Fedora 12 consantine 64位。我把这个命令放在HADOOP_OPTS中? – jojoba 2012-03-14 14:10:50

+0

是的,你这样做...... – 2012-03-14 14:13:45

+0

也可以在程序运行时运行VisualVM来查看正在使用多少内存。 – 2012-03-14 14:14:25