在Hadoop .20 datanode上“超出了GC开销限制”

时间:2012-04-11 15:56:34

标签: garbage-collection hadoop

由于超出了GC开销限制,我搜索过并且没有找到与Hadoop Datanode进程相关的大量信息,所以我想我会发一个问题。

我们正在运行一个测试,我们需要确认我们的Hadoop集群可以处理其上存储了大约300万个文件(目前是一个4节点集群)。我们使用的是64位JVM,我们已经为namenode分配了8g。但是,当我的测试程序将更多文件写入DFS时,datanode开始因此错误而消失: 线程“DataNode:[/ var / hadoop / data / hadoop / data]”中的异常“java.lang.OutOfMemoryError:超出GC开销限制

我看到一些关于某些选项的帖子(并行GC?)我想这可以在hadoop-env.sh中设置但是我不太确定语法而且我是一个新手,所以我没有'我觉得它是如何完成的。 感谢您的帮助!

4 个答案:

答案 0 :(得分:8)

尝试使用以下方法增加datanode的内存:(需要hadoop restart才能工作)

export HADOOP_DATANODE_OPTS="-Xmx10g"

这会将堆设置为10gb ......您可以根据需要增加堆。

您也可以在$HADOOP_CONF_DIR/hadoop-env.sh文件的开头粘贴此内容。

答案 1 :(得分:0)

如果从命令行运行map reduce作业,则可以使用参数-D 'mapreduce.map.java.opts=-Xmx1024m'和/或-D' mapreduce.reduce.java.opts = -Xmx1024m'来增加堆。 。例如:

hadoop --config /etc/hadoop/conf jar /usr/lib/hbase-solr/tools/hbase-indexer-mr-*-job.jar --conf /etc/hbase/conf/hbase-site.xml -D 'mapreduce.map.java.opts=-Xmx1024m' --hbase-indexer-file $HOME/morphline-hbase-mapper.xml --zk-host 127.0.0.1/solr --collection hbase-collection1 --go-live --log4j /home/cloudera/morphlines/log4j.properties

请注意,在某些Cloudera文档中,他们仍使用旧参数mapred.child.java.optsmapred.map.child.java.optsmapred.reduce.child.java.opts。这些参数不再适用于Hadoop 2(请参阅What is the relation between 'mapreduce.map.memory.mb' and 'mapred.map.child.java.opts' in Apache Hadoop YARN?)。

答案 2 :(得分:0)

post为我解决了这个问题。

所以,关键是“ Prepend that environment variable ”(第一次看到这个linux命令语法:))

HADOOP_CLIENT_OPTS="-Xmx10g" hadoop jar "your.jar" "source.dir" "target.dir"

答案 3 :(得分:-2)

GC开销限制表示您的(微小)堆已满。

当你处理大量数据时,这是MapReduce操作中经常发生的事情。试试这个:

< property >

  < name > mapred.child.java.opts < /name >

   < value > -Xmx1024m -XX:-UseGCOverheadLimit < /value >

< /property >

另外,请尝试以下方法:

使用合并器,减速器不应该获得长于地图数量的一小部分的任何列表

同时,您可以从OOME生成堆转储并使用YourKit等进行分析并分析它