HDFS Block损坏恢复

1,201 阅读2分钟

实例

  • fsck检查(fsck是用来检测hdfs文件和block信息):

    • -bash-4.2$ hdfs fsck / 
      ...............................................................................Status: HEALTHY
       Total size:    23863424 B
       Total dirs:    286
       Total files:   791
       Total symlinks:                0
       Total blocks (validated):      642 (avg. block size 23863424 B)
       Minimally replicated blocks:   642 (100.0 %)
       Over-replicated blocks:        0 (0.0 %)
       Under-replicated blocks:       1 (0.10080645 %)
       Mis-replicated blocks:         0 (0.0 %)
       Default replication factor:    3
       Average block replication:     2.998992
       Corrupt blocks:                0
       Missing replicas:              1 (0.033602152 %)
       Number of data-nodes:          3
       Number of racks:               1
      The filesystem under path '/' is HEALTHY
      
  • 参数解释:

    • status:代表这次hdfs上block检测的结果
    • Total size: 代表/目录下文件总大小
    • Total dirs:代表检测的目录下总共有多少个目录
    • Total files:代表检测的目录下总共有多少文件
    • Total symlinks:代表检测的目录下有多少个符号连接
    • Total blocks(validated):代表检测的目录下有多少个block块是有效的
    • Minimally replicated blocks:代表拷贝的最小block块数
    • Over-replicated blocks:指的是副本数大于指定副本数的block数量
    • Under-replicated blocks:指的是副本数小于指定副本数的block数量
    • Mis-replicated blocks:指丢失的block块数量
    • Default replication factor: 3 指默认的副本数是3份(自身一份,需要拷贝两份)
    • Missing replicas:丢失的副本数
    • Number of data-nodes:有多少个节点
    • Number of racks:有多少个机架
  • 报错显示:

    • 副本数丢失一份

手动修复

  • 删除损坏的块和meta文件:
    • rm -rf blk_XXX blk_XXX_YYYY.meta
  • 修复命令:
    • hdfs debug recoverLease -path /XXX/文件 -retries 10 recoverLease SUCCEEDED on /XXX/文件
  • 检查:
    • 查看各个datanode节点的block文件和meta文件是否恢复:
    • 路径:/XXX/tmp/dfs/data/current/BPXXXXX/current/finalized/subdir0/subdir0

自动修复

  • 当数据块损坏后,datanode节点执行directoryscan操作之前,都不会发现损坏,directoryscan操作间隔6h,依据:(单位:s)
    • dfs.datanode.directoryscan.interval : 21600
  • 在datanode节点向namenode节点进行blockreport前,都不会进行恢复数据块的操作,blockreport操作间隔6h,依据:(单位:ms)
    • dfs.blockreport.intervalMsec : 21600000
  • 只有当namenode节点收到blockreport才会进行恢复操作。

汇总

  • 自动修复时间太长,建议使用手动修复方式,但是前提要手动删除损坏的block块,而且注意是删除损坏block文件和meta文件,不是删除hdfs文件。或者直接先把文件get下载,然后hdfs删除,再对应上传。
  • 注意删除不要执行: hdfs fsck / -delete这是删除损坏的文件,会造成数据丢失。