问题
  回滚成功后,为什么NameNode UI上显示有一些块缺失?
  
 
  回答
  原因:具有新id/genstamps的块可能存在于DataNode上。DataNode中的块文件可能具有与NameNode的回滚image中不同的生成标记和长度,所以NameNode会拒绝DataNode中的这些块,并将文件标记为已损坏。
  场景如下:
  
   - 升级前
    
客户端A - >将一些数据写入文件X(假设已写入“A”字节)
 
  
  
   - 升级开始了
    
客户端A - >仍然将数据写入文件X(现在文件中的数据是“A + B”字节)
 
  
  
   - 升级完成
    
客户端A - >完成写入文件。最终数据为“A + B”字节。
 
  
  
   - 回滚开始
    
将回滚到步骤1(升级前)的状态。因此,NameNode中的文件X将具有“A”字节,但DataNode中的块文件将具有“A + B”字节。
 
  
  恢复步骤:
  
   - 从NameNode Web UI中获取已损坏的文件列表,或者通过下面的命令获取。
    
hdfs fsck <filepath> -list-corruptfileblocks
 
   - 对于不需要的文件,请使用以下命令删除文件。
    
hdfs fsck <corrupt file path> - delete
    
     
 
     
      删除文件为高危操作,在执行操作前请务必确认对应文件是否不再需要。
      
      
   - 对于所需的文件,执行fsck命令来获取块列表和块的顺序。
    
     - 在fsck中给出的块序列表中,使用块id搜索DataNode中的数据目录,并从DataNode下载相应的块。
 
     - 按照序列以追加的方式写入所有这样的块文件,并构造成原始文件。
      
例如:
      File 1--> blk_1, blk_2, blk_3
      通过组合来自同一序列的所有三个块文件的内容来创建文件。
 
     - 从HDFS中删除旧文件并重写新构建的文件。