由于超出了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中设置但是我不太确定语法而且我是一个新手,所以我没有'我觉得它是如何完成的。 感谢您的帮助!
答案 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.opts
,mapred.map.child.java.opts
和mapred.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等进行分析并分析它