Ubuntu 上 Hadoop 内存不足的定位与解决
一、先快速定位内存不足的类型
- 查看组件日志与控制台报错:到 $HADOOP_HOME/logs 目录查看 NameNode/DataNode/ResourceManager/NodeManager 日志,或在作业控制台观察是否为 Java heap space / GC overhead limit exceeded 等典型内存异常。
- 区分是“堆内存不足”还是“物理内存/磁盘不足”:
- 堆内存不足常见报错为 Java heap space,需增大 JVM 堆 或优化任务内存使用。
- 物理内存/磁盘不足常见现象是 NameNode 处于 Safe mode,多因 磁盘空间不足 导致,需要扩容磁盘或清理空间。
- 快速检查命令示例:
- 查看磁盘与内存:df -h、free -m
- 实时看日志:tail -f hadoop--nodemanager-.log
- 查看 NameNode Web UI(默认 50070 端口)的 DFS 剩余空间 与安全模式状态。
二、按组件调整内存配置
- YARN 容器与调度层(控制每个容器能拿到多少内存)
- 在 yarn-site.xml 调整节点可分配内存与调度上下限,并确保上限不超过节点物理内存:
- yarn.nodemanager.resource.memory-mb:节点可分配给容器的总内存(如 8192 MB)
- yarn.scheduler.minimum-allocation-mb:单个容器最小内存(如 512 MB)
- yarn.scheduler.maximum-allocation-mb:单个容器最大内存(如 4096 MB)
- 在 mapred-site.xml 设置每个 Map/Reduce 容器的内存请求:
- mapreduce.map.memory.mb / mapreduce.reduce.memory.mb(如各 2048 MB)
- 在 yarn-env.sh 调整守护进程堆:
- YARN_HEAPSIZE(如 1024–2048 MB)
- MapReduce 任务堆(实际执行任务的 JVM)
- 在 mapred-site.xml 设置任务 JVM 最大堆(Hadoop 2+ 使用):
- mapreduce.map.java.opts / mapreduce.reduce.java.opts(如 -Xmx1600m,需小于对应容器内存并预留开销)
- HDFS 守护进程堆(NameNode/DataNode/SecondaryNameNode)
- 在 hadoop-env.sh 设置:
- HADOOP_NAMENODE_OPTS(如 -Xmx4096m -Xms2048m)
- HADOOP_DATANODE_OPTS(如 -Xmx2048m -Xms1024m)
- HADOOP_SECONDARYNAMENODE_OPTS(如 -Xmx2048m -Xms1024m)
- 配置生效与验证
- 重启集群:stop-yarn.sh && start-yarn.sh;stop-dfs.sh && start-dfs.sh
- 用 jps 检查进程是否起来,查看日志确认无内存相关报错。
三、常见场景与对应处理
| 场景 |
典型现象 |
处理要点 |
| 作业报 Java heap space |
任务失败,日志含 “Java heap space” |
增大 mapreduce.{map |
| NameNode 处于 Safe mode |
写入失败,Web UI 提示空间不足 |
用 df -h 检查磁盘,清理或扩容;空间恢复后执行 hadoop dfsadmin -safemode leave 退出安全模式 |
| 容器申请被拒或调度失败 |
作业卡住、无法获取容器 |
检查 yarn.scheduler.maximum-allocation-mb 与容器请求是否匹配;确认 yarn.nodemanager.resource.memory-mb 足够且未超物理内存 |
| 系统频繁交换或 OOM |
节点响应慢、进程被杀 |
减少容器并发与堆大小,避免内存超卖;必要时增加物理内存或启用/扩容 Swap(仅缓解,非根本方案) |
四、作业与数据层面的优化建议
- 合理并行度:避免过多并发导致每个容器内存吃紧;必要时减少 map/reduce 任务数,或按数据规模调整。
- 中间数据压缩:开启 mapreduce.map.output.compress / mapreduce.output.fileoutputformat.compress,减少磁盘 I/O 与网络传输。
- 调整块大小:按数据量与访问模式设置 dfs.blocksize(如 256 MB),减少任务数或提升顺序读效率。
- 数据倾斜治理:合理 分区/Combiner,避免少数任务处理过多数据而内存吃紧。
五、配置示例与注意事项
- 示例(请根据节点内存与业务规模微调):
- yarn-site.xml
- yarn.nodemanager.resource.memory-mb:8192
- yarn.scheduler.minimum-allocation-mb:512
- yarn.scheduler.maximum-allocation-mb:4096
- mapred-site.xml
- mapreduce.map.memory.mb:2048;mapreduce.reduce.memory.mb:2048
- mapreduce.map.java.opts:-Xmx1600m;mapreduce.reduce.java.opts:-Xmx1600m
- hadoop-env.sh
- HADOOP_HEAPSIZE(ResourceManager):2048
- YARN_HEAPSIZE(NodeManager):1024
- HADOOP_NAMENODE_OPTS:-Xmx4096m -Xms2048m;HADOOP_DATANODE_OPTS:-Xmx2048m -Xms1024m
- 注意事项
- 容器内存(如 2048 MB)应大于任务堆(如 1600 MB),为 JVM 开销/本地内存 预留空间。
- 单节点所有容器内存请求之和不应超过 yarn.nodemanager.resource.memory-mb,并预留系统与其他进程内存。
- 修改配置后按顺序重启 YARN 与 HDFS,并通过 jps 与日志验证。