
# 内存不足导致HDFS NameNode启动失败
#### 问题描述
场景一：重启HDFS服务后，HDFS的状态为Bad，且NameNode实例状态异常，并且很久没有退出安全模式。
场景二：NameNode启动时，启动超时后启动失败，原生页面无法打开。
#### 原因分析
1. 在NameNode运行日志（/var/log/Bigdata/hdfs/nn/hadoop-omm-namenode-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-namenode-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页面，选择"集群 \> 服务 \> HDFS \> 配置 \> 全部配置"，搜索查看NameNode的GC_OPTS参数配置如下：
   图1查看NameNode的GC_OPTS参数配置   
   ![](https://support.huaweicloud.com/trouble-mrs/zh-cn_image_0269262603.png "点击放大") 
4. NameNode内存配置和数据量对应关系参考[表1]。
    表1NameNode内存配置和数据量对应关系 
   | **文件对象数量**  | **参考值**                                                |
   |:---|:---|
   | 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. 按照[表1]规格修改NameNode的内存参数，例如有3600万Block（Block个数≈文件对象数量），将内存参数调整为"-Xms32G -Xmx32G -XX:NewSize=2G -XX:MaxNewSize=3G"。
2. 重启一个NameNode，确认该NameNode可以正常启动。
3. 重启另一个NameNode，确认页面状态恢复。
 
