问题
回滚成功后,为什么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中删除旧文件并重写新构建的文件。