本文汇总了HDFS使用时的常见问题。

为什么NameNode重启特别慢?

  • 问题现象:NameNode原先正常,重启NameNode过程中非常慢,并且NameNode重启未完成,十几分钟后自动重启了。观察日志时发现正在加载FsImage和EditsLog。
  • 问题原因:因为NameNode启动过程中加载FsImage和EditsLog会消耗较多的内存。
  • 解决方法:建议调大NameNode HeapSize,详情请参见调整NameNode JVM内存大小

为什么NameNode无法响应?

  • 问题现象:NameNode节点长时间满负载,所在节点CPU达到100%,NameNode无法响应。
  • 问题原因:因为NameNode的内存容量已经无法承担太多的文件,进程在频繁发生FULL GC。
  • 解决方法:建议调大NameNode HeapSize,详情请参见调整NameNode JVM内存大小

为什么会有大量的Editslog文件?

  • 问题现象:NameNode节点数据目录占用磁盘空间大,发现有大量的Editslog文件。
  • 问题原因:查看Secondary NameNode(非HA集群)或Standby NameNode(HA集群)的健康状态,发现Secondary NameNode或Standby NameNode服务不正常,导致了Editslog文件没有及时合并。服务不正常很可能是内存不够导致的。
  • 解决方法:适当调节NameNode的HeapSize,使其正常启动,详情请参见调整NameNode JVM内存大小

为什么有大量的Under Replicated Blocks?

  • 问题现象:使用fsck命令查看,发现有大量Under Replicated Blocks。
  • 问题原因:由于Decommission或节点(磁盘)异常下线后,副本数恢复较慢。
  • 解决方法:需要恢复副本数,您可以在EMR控制台的HDFS服务的配置页面,在搜索区域,搜索下表参数并调大参数值。
    参数 描述
    dfs.namenode.replication.work.multiplier.per.iteration 默认值100。建议调大为200,但不超过500。

    该参数影响NameNode下发给每个DataNode进行副本复制作业任务的并发度,即任务调度速度。

    该参数是系数值,实际下发任务数为该系数值乘以集群节点个数。

    dfs.namenode.replication.max-streams 建议设置为100。

    该参数负责调节低优先级的块的复制任务的执行并发度。

    dfs.namenode.replication.max-streams-hard-limit 默认值100。建议调大为200,但不超过500。

    该参数负责调节所有优先级的块的复制任务的执行并发度,包含最高优先级的块。

如何处理Missing Blocks或Corrupted Blocks问题?

  • 问题现象:使用fsck命令查看,提示Missing Blocks或Corrupted Blocks。
  • 问题原因:可能是DataNode停止了服务,或者是磁盘损坏或异常操作导致数据丢失。
  • 解决方法:如果之前DataNode停止了服务,请将DataNode重新启动下。 如果是磁盘损坏或异常操作导致数据丢失,需要人工恢复,您可以通过hdfs fsck / -files命令扫描损坏的文件,导出文件列表,删除后重新上传。

如何处理EditsLog不连续导致NameNode启动失败的问题?

  • 问题现象:在JournalNode节点断电,数据目录磁盘占满,网络异常时,重启NameNode失败。
  • 问题原因:可能是JournalNode上的EditsLog不连续。
  • 解决方法:某台NameNode EditsLog损坏的情况下,需要手工恢复。
    操作方法如下:
    1. 备份NameNode节点元数据的整个目录/mnt/disk1/hdfs,以防误操作的风险。
    2. 观察NameNode启动日志,记录加载失败的EditsLog的txid。
    3. 登录另外一台NameNode节点,找到并复制相同txid的EditsLog文件,覆盖本节点的同名文件。
    4. 重启NameNode,观察是否成功。
      说明 如果还是失败,请 提交工单