You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MapReduce作业启动触发OOM错误求助(Hadoop 2.6.0-cdh5.16.1)

MapReduce作业MRAppMaster启动OOM问题排查与疑问

问题描述

在MapReduce作业中向FileInputFormat传入逗号分隔的文件名,处理30GB的Snappy压缩ORC文件。作业启动30秒后因OOM错误失败,错误日志显示MRAppMaster启动时Java堆内存不足。已调整map、reduce及ApplicationMaster的内存参数,但问题未解决。同时想了解:MapReduce是加载全部输入数据到内存还是逐文件执行?使用Hadoop版本:Hadoop 2.6.0-cdh5.16.1。

错误日志

2024-07-31 00:59:02,572 FATAL [main] org.apache.hadoop.mapreduce.v2.app.MRAppMaster: Error starting MRAppMaster
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
at java.lang.StringBuffer.append(StringBuffer.java:270)
at org.apache.xerces.dom.DeferredDocumentImpl.getNodeValueString(Unknown Source)
at org.apache.xerces.dom.DeferredDocumentImpl.getNodeValueString(Unknown Source)
at org.apache.xerces.dom.DeferredTextImpl.synchronizeData(Unknown Source)
at org.apache.xerces.dom.CharacterDataImpl.getData(Unknown Source)
at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:2775)
at org.apache.hadoop.conf.Configuration.loadResources(Configuration.java:2663)
at org.apache.hadoop.conf.Configuration.getProps(Configuration.java:2559)
at org.apache.hadoop.conf.Configuration.get(Configuration.java:1340)
at org.apache.hadoop.mapreduce.v2.util.MRWebAppUtil.initialize(MRWebAppUtil.java:51)
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.main(MRAppMaster.java:1498)

已尝试的参数

mapreduce.reduce.memory.mb=15360
mapreduce.map.memory.mb=10240
mapreduce.reduce.java.opts=-Xms14g -Xmx14g -Djava.net.preferIPv4Stack=true -XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbose:gc
mapreduce.map.java.opts=-Xms9g -Xmx9g -Djava.net.preferIPv4Stack=true -XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbose:gc
yarn.app.mapreduce.am.resource.mb=81920
yarn.app.mapreduce.am.command-opts=-Xms77g -Xmx77g -Djava.net.preferIPv4Stack=true -XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbose:gc

问题分析与解决

1. MRAppMaster OOM原因

从错误栈可见,OOM发生在MRAppMaster加载配置文件的阶段,和业务数据处理无关。核心问题是你传入的逗号分隔文件名数量过多:这些文件名会被封装到mapreduce.input.fileinputformat.inputdir配置项中,当MRAppMaster启动解析XML配置时,超长的配置值会占用大量堆内存,即便你把AM堆设到77G,只要文件名总长度超过堆内存阈值,就会触发OOM。

2. 解决办法

  • 改用目录作为输入源:将需要处理的ORC文件放到同一个HDFS目录下,直接指定该目录作为FileInputFormat的输入,让Hadoop自动遍历目录内的文件,避免把所有文件名塞进配置项。
  • 使用文件列表间接指定输入:若必须选择特定文件,可将文件名列表写入一个HDFS文本文件,通过自定义InputFormat或CombineFileInputFormat读取这个列表文件,再加载对应的数据文件。
  • 验证堆内存配置并分析转储:添加-XX:+HeapDumpOnOutOfMemoryError到yarn.app.mapreduce.am.command-opts,生成堆转储文件后分析内存占用,确认是否为配置项导致的溢出。

3. MapReduce数据加载方式

MapReduce不会一次性加载全部输入数据到内存,采用分块、逐批处理的模式:

  • HDFS将大文件分割为固定大小的数据块(默认128MB),每个块对应一个Map任务。
  • Map任务读取对应的数据块,ORC作为列式存储格式,会按列批量解析记录,但不会一次性加载整个块到内存。
  • Map处理结果先写入本地环形缓冲区,满后溢写到磁盘,不会长期占用内存。
  • Reduce任务从各Map节点拉取数据,按Key排序合并,同样分批处理,不会一次性加载所有Map输出。

因此本次OOM与业务数据加载无关,完全是配置加载阶段的问题。

内容的提问来源于stack exchange,提问作者Nikhil Lingam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:47:06