在 Linux 环境下使用 Hadoop 时出现“内存溢出(OOM,Out Of Memory)”是非常常见的问题,但它通常不是“Hadoop 本身的 bug”,而是资源规划、配置或数据处理方式不合理导致的。下面从原因分类 + 常见场景 + 解决思路系统说明。
Hadoop 内存溢出一般出现在以下几类进程中:
现象
Container killed by YARN for exceeding memory limits
原因
mapreduce.map.memory.mb / mapreduce.reduce.memory.mb 太小解决
mapreduce.map.memory.mb=2048
mapreduce.reduce.memory.mb=4096
同时调整 JVM 堆:
mapreduce.map.java.opts=-Xmx1600m
mapreduce.reduce.java.opts=-Xmx3500m
✅ 经验:
java.opts ≈ memory.mb * 0.8
现象
原因
解决
mapreduce.job.reduces=50
现象
原因
解决
现象
原因
mapreduce.reduce.shuffle.memory.limit解决
mapreduce.reduce.shuffle.parallelcopies=10
mapreduce.reduce.shuffle.input.buffer.percent=0.6
现象
原因
-XX:MaxDirectMemorySize解决
现象
dmesg 中有:Out of memory: Kill process xxx (java)
原因
解决
free -h
dmesg | grep oom
✅ 控制:
总 container 内存 < 物理内存 * 0.8
yarn logs -applicationId xxx
关键词:
java.lang.OutOfMemoryErrorContainer killedGC overhead limit exceeded| 类型 | 特征 |
|---|---|
| Heap OOM | Java 堆满 |
| Container OOM | YARN 杀进程 |
| Native OOM | 堆不满但进程死 |
| System OOM | Linux 杀进程 |
Hadoop 内存溢出,90% 不是 Hadoop 的问题,而是:
- 内存配小了
- 数据倾斜了
- 小文件太多了
- 机器被压满了
如果你愿意,可以贴:
我可以直接帮你定位是哪一类 OOM,并给出精确参数。