HDFS元数据损坏恢复方法
HDFS JournalNode 编辑目录(dfs.journalnode.edits.dir)下数据损坏(单节点损坏或所有节点数据损坏),如何恢复 HDFS?
单节点损坏
a) 停止HDFS服务。
b) 确认editlog没有损坏的JournalNode。
JournalNode的运行日志中无java.io.IOException: Can't scan a pre-transactional edit log错误日志,则为editlog没有损坏。
c) 拷贝正常JournalNode上的editlog到损坏的JournalNode节点上。
d) 查看dfs.journalnode.edits.dir的值,获取JournalNode上editlog的存储目录
e) 备份editlog损坏的JournalNode节点上的editlog。
f) 拷贝正常节点的editlog到异常节点。
g) 在异常节点修改拷贝后的文件属组。
h) 重启HDFS服务,启动成功。
所有节点损坏:
a) 找到重启前的主NameNode,进入其数据目录(查看配置项“dfs.namenode.name.dir”可获取),得到最新的FSImage文件的序号。一般如下:
b) 查看各JournalNode的数据目录(查看配置项“dfs.journalnode.edits.dir”可获取),查看序号从第一部获取到的序号开始的edits文件,看是否有不连续的情况(即前一个edits文件的最后一个序号 和 后一个edits文件的第一个序号 不是连续的,如下图中的edits_0000000000013259231-0000000000013259237就和后一个edits_0000000000013259239-0000000000013259246就是不连续的)。
c) 如果有这种不连续的edits文件,则需要查看其它的JournalNode的数据目录或NameNode数据目录中,有没有连续的该序号相关的连续的edits文件。
d) 如果找不到连续的edits文件,需要查看fsimage文件后的编号后的editslog文件是否连续,如连续则说明丢失的未合并部分的数据(数据较新),如以合并则需要恢复至上一个fsimage周期,此周期后的数据需要重新入