【问题标题】:"GC Overhead limit exceeded" on Hadoop .20 datanodeHadoop .20 数据节点上的“超出 GC 开销限制”
【发布时间】:2012-04-23 23:20:25
【问题描述】:

我已经搜索并没有找到太多与 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 中设置,但我不太确定语法,而且我是新手,所以我没有不太了解它是如何完成的。 感谢您的帮助!

【问题讨论】:

  • 这里只是为人们提供的更新:@dfs 中的 150 万个文件,当我的 64 位 JVM 为 1g(默认)时,数据节点开始因此错误而死亡。当我将它提高到 2g 时,它消失了,直到我得到大约 300 万个文件。我想知道这种内存膨胀是否是一个已知问题,如果是,我可以尝试解决哪些其他建议?
  • 就像 Tejas Patil 提到的,默认的块大小是 64MB。 Hadoop 每次运行时都会将每个文件的元数据加载到内存中。您拥有的文件越多,占用的内存就越多。如果这些文件远小于默认块大小并且您可以选择这样做,请尝试将文件组合成更大的文件以存储到 HDFS。只是一个想法:)

标签: garbage-collection hadoop


【解决方案1】:

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

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

< property >

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

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

< /property >

另外,请尝试以下操作:

使用组合器,reducer 获取的列表长度不应超过映射数量的小倍数

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

【讨论】:

  • @ThomasJungblut +1。 mapred.child.java.opts 可用于控制堆,用于生成的 hadoop 作业,而不是数据节点。
  • 好吧,我没有检查但是,实际上他的问题有两种:(1)数据节点内存限制(2)在步骤之间排序等。所以,我的意思是我们不能盲目地增加数据节点堆大小 t0 10 GB,20 GB 这样,如果我们可以调整参数(如上所述)并使用组合器,我认为解决方案会很好。
【解决方案2】:

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

export HADOOP_DATANODE_OPTS="-Xmx10g"

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

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

【讨论】:

  • 这基本上解决了它,但我也了解到,当您在一个小集群上存储大量文件时,DataNode 的使用量会迅速攀升,因为复制可以发生的位置有限。如果我们添加节点,那么数据节点内存不应该增长得那么快(所以我听到了!)。
  • @hatrickpatrick HDFS 使用 64 MB 块来存储文件……如果文件很小,则会浪费大量内存,甚至 namenode 也必须跟踪这些内存。拥有少量但庞大的文件比拥有许多小文件要好。
  • -Xmx 的默认 HADOOP_DATANODE_OPTS 是什么
  • 默认为200m
【解决方案3】:

如果您从命令行运行 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?)。

【讨论】:

    【解决方案4】:

    这个post 为我解决了这个问题。

    所以,关键是“预置那个环境变量”(第一次看到这个 linux 命令语法 :))

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-21
      • 2017-12-27
      • 2013-07-13
      • 2018-03-29
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多