hadoop之hdfs数据块损坏及修复

损坏的原因

HDFS在机器断电或意外崩溃的情况下,有可能出现正在写的数据丢失的问题。再次重启HDFS后,发现hdfs无法启动,查看日志后发现,一直处于安全模式。

1、场景一:断电导致HDFS服务不正常或显示块损坏

模拟损坏效果:

直接的datanode上删除文件一个block的三副本

node-1:rm -rf 数据块 元数据
node-2:rm -rf 数据块 元数据
node-3:rm -rf 数据块 元数据

检查hdfs文件系统健康:hdfs fsck /path

输出损坏的块及其所属的文件列表:hdfs fsck /path -list-corruptfileblocks

定位文件的哪些块分布在哪些机器:

  • -file 文件分块信息
  • -blocks 在带 -files 参数后才显示block信息
  • -locations 在带-blocks参数后才显示block块所在datanode的具体ip位置
  • -racks 在带-files参数后显示机架位置

hdfs fsck / -delete 直接删除损坏的文件

-files -locations -blocks -racks 号文件显示 坏文件不显示

hdfs debug recoverLease -path 文件位置 -retries 重试次数 #修复指定路径的hdfs文件,尝试多次

自动修复

hdfs自动修复损坏的数据块,当数据块损坏后,DN节点执行directoryscan(datanode进行内存和磁盘那数据集块校验)操作之前,都不会发现损坏。

dfs.datanode.directoryscan.interval:21600

在DN向NN进行blockreport前,都不会恢复数据块

dfs.blockreport.intervalMesc:21600

最终当NN收到blockreport才会进行恢复操作

生产中倾向于使用手动修复的方法去修复损坏的数据块。