9

我已经搜索并没有找到很多与 Hadoop Datanode 进程因超过 GC 开销限制而死亡相关的信息,所以我想我会发布一个问题。

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

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

4

4 回答 4

9

尝试通过使用这个来增加datanode的内存:(需要重启hadoop才能工作)

export HADOOP_DATANODE_OPTS="-Xmx10g"

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

您也可以将其粘贴到$HADOOP_CONF_DIR/hadoop-env.sh文件的开头。

于 2012-04-11T20:09:17.077 回答
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.opts,mapred.map.child.java.optsmapred.reduce.child.java.opts. 这些参数不再适用于 Hadoop 2(请参阅What is the relationship between 'mapreduce.map.memory.mb' and 'mapred.map.child.java.opts' in Apache Hadoop YARN?)。

于 2017-01-10T14:07:21.373 回答
0

这篇文章为我解决了这个问题。

因此,关键是“预先设置该环境变量”(第一次看到这个 linux 命令语法 :))

HADOOP_CLIENT_OPTS="-Xmx10g" hadoop jar "your.jar" "source.dir" "target.dir"
于 2017-12-24T02:00:54.363 回答
-2

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

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

< property >

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

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

< /property >

另外,请尝试以下操作:

使用组合器,reducer 获取的列表不应超过 map 数量的一小部分

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

于 2012-04-11T19:09:00.427 回答