温馨提示×

如何解决 Ubuntu Hadoop 内存不足

小樊
35
2025-12-08 21:39:03
栏目: 智能运维

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,并预留系统与其他进程内存。
    • 修改配置后按顺序重启 YARNHDFS,并通过 jps 与日志验证。

0