更新时间:2024-11-29 GMT+08:00

内存不足导致HDFS启动失败

问题背景与现象

重启HDFS后,HDFS的状态是Bad,且NameNode实例状态常常异常,并且花很久没有退出安全模式。

原因分析

  1. 在NameNode运行日志(/var/log/Bigdata/hdfs/nn/hadoop-omm-namendoe-XXX.log)中搜索“WARN”,可以看到有大量时间在垃圾回收,如下例中耗时较长63s。
    2017-01-22 14:52:32,641 | WARN  | org.apache.hadoop.util.JvmPauseMonitor$Monitor@1b39fd82 | Detected pause in JVM or host machine (eg GC): pause of approximately 63750ms
    GC pool 'ParNew' had collection(s): count=1 time=0ms
    GC pool 'ConcurrentMarkSweep' had collection(s): count=1 time=63924ms | JvmPauseMonitor.java:189
  2. 分析NameNode日志“/var/log/Bigdata/hdfs/nn/hadoop-omm-namendoe-XXX.log”,可以看到NameNode在等待块上报,且总的Block个数过多,如下例中是3629万。
    2017-01-22 14:52:32,641 | INFO  | IPC Server handler 8 on 25000 | STATE* Safe mode ON. 
    The reported blocks 29715437 needs additional 6542184 blocks to reach the threshold 0.9990 of total blocks 36293915.
  3. 打开Manager页面,查看NameNode的GC_OPTS参数配置如下:
    图1 查看NameNode的GC_OPTS参数配置
  4. NameNode内存配置和数据量对应关系参考表1
    表1 NameNode内存配置和数据量对应关系

    文件对象数量

    参考值

    10,000,000

    “-Xms6G -Xmx6G -XX:NewSize=512M -XX:MaxNewSize=512M”

    20,000,000

    “-Xms12G -Xmx12G -XX:NewSize=1G -XX:MaxNewSize=1G”

    50,000,000

    “-Xms32G -Xmx32G -XX:NewSize=2G -XX:MaxNewSize=3G”

    100,000,000

    “-Xms64G -Xmx64G -XX:NewSize=4G -XX:MaxNewSize=6G”

    200,000,000

    “-Xms96G -Xmx96G -XX:NewSize=8G -XX:MaxNewSize=9G”

    300,000,000

    “-Xms164G -Xmx164G -XX:NewSize=12G -XX:MaxNewSize=12G”

解决办法

  1. 按照规格修改NameNode的内存参数,如这里3600万block,将内存参数调整为“-Xms32G -Xmx32G -XX:NewSize=2G -XX:MaxNewSize=3G”。
  2. 重启一个NameNode,确认该NameNode可以正常启动。
  3. 重启另一个NameNode,确认页面状态恢复。