
# 为什么NameNode UI上显示有一些块缺失
#### 问题
回滚成功后，为什么NameNode UI上显示有一些块缺失？
#### 回答
**原因：**具有新id/genstamps的块可能存在于DataNode上。DataNode中的块文件可能具有与NameNode的回滚image中不同的生成标记和长度，所以NameNode会拒绝DataNode中的这些块，并将文件标记为已损坏。
场景如下：
1. 升级前： 客户端A - \>将一些数据写入文件X（假设已写入"A"字节）
   

2. 升级过程中： 客户端A - \>仍然将数据写入文件X（现在文件中的数据是"A + B"字节）
   

3. 升级完成： 客户端A - \>完成写入文件。最终数据为"A + B"字节。
   

4. 回滚开始： 将回滚到步骤1（升级前）的状态。因此，NameNode中的文件X将具有"A"字节，但DataNode中的块文件将具有"A + B"字节。
   
**恢复步骤：**
1. 从NameNode Web UI中获取已损坏的文件列表，或者通过下面的命令获取。 **hdfs fsck** *\<filepath\>* **-list-corruptfileblocks**
   
2. 对于不需要的文件，请使用以下命令删除文件。 **hdfs fsck** *\<corrupt file path\>* **- delete**
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   删除文件为高危操作，在执行操作前请务必确认对应文件是否不再需要。
   
3. 对于所需的文件，执行fsck命令来获取块列表和块的顺序。
   - 在fsck中给出的块序列表中，使用块ID搜索DataNode中的数据目录，并从DataNode下载相应的块。
   
   - 按照序列以追加的方式写入所有这样的块文件，并构造成原始文件。 例如：
     File 1--\> blk_1, blk_2, blk_3
     通过组合来自同一序列的所有三个块文件的内容来创建文件。
     
   
   - 从HDFS中删除旧文件并重写新构建的文件。
    
 
