更新时间:2024-08-16 GMT+08:00

为什么NameNode UI上显示有一些块缺失

问题

回滚成功后,为什么NameNode UI上显示有一些块缺失?

回答

原因:具有新id/genstamps的块可能存在于DataNode上。DataNode中的块文件可能具有与NameNode的回滚image中不同的生成标记和长度,所以NameNode会拒绝DataNode中的这些块,并将文件标记为已损坏。

场景如下:

  1. 升级前:

    客户端A - >将一些数据写入文件X(假设已写入“A”字节)

  1. 升级过程中:

    客户端A - >仍然将数据写入文件X(现在文件中的数据是“A + B”字节)

  1. 升级完成:

    客户端A - >完成写入文件。最终数据为“A + B”字节。

  1. 回滚开始:

    将回滚到步骤1(升级前)的状态。因此,NameNode中的文件X将具有“A”字节,但DataNode中的块文件将具有“A + B”字节。

恢复步骤:

  1. 从NameNode Web UI中获取已损坏的文件列表,或者通过下面的命令获取。

    hdfs fsck <filepath> -list-corruptfileblocks

  2. 对于不需要的文件,请使用以下命令删除文件。

    hdfs fsck <corrupt file path> - delete

    删除文件为高危操作,在执行操作前请务必确认对应文件是否不再需要。

  3. 对于所需的文件,执行fsck命令来获取块列表和块的顺序。
    • 在fsck中给出的块序列表中,使用块ID搜索DataNode中的数据目录,并从DataNode下载相应的块。
    • 按照序列以追加的方式写入所有这样的块文件,并构造成原始文件。

      例如:

      File 1--> blk_1, blk_2, blk_3

      通过组合来自同一序列的所有三个块文件的内容来创建文件。

    • 从HDFS中删除旧文件并重写新构建的文件。