Hadoop:堆空间和gc问题



我目前正在进行一个项目,该项目需要为我的映射任务提供内存结构。我已经做了一些计算,我可以说,我不需要超过600MB的内存为每个地图任务。但问题是,过了一段时间,我遇到了java堆空间问题或gc开销限制。我不知道这怎么可能。

以下是一些详细信息。我有两个四核系统,内存为12GB。这意味着我可以同时运行多达8个地图任务。我正在构建一棵树,所以我有一个迭代算法,它为每一个树级别做地图缩减工作。我的算法适用于小型数据集,但对于中型数据集则存在堆空间问题。我的算法达到了某个树级别,然后超出了堆空间,或者有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不能很好地工作呢?

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

我建议你试试

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

将最大内存设置为8GB。


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

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

我建议您使用-XX:+HeapDumpOnOutOfMemoryError进行堆转储,并在探查器(例如VisualVM)中读取它,看看它为什么使用这么多内存。

最新更新