问题描述
启动NameNode时候出现下面异常信息,启动失败
Encountered exception loading fsimagejava.io.IOException: There appears to be a gap in the edit log. We expected txid 2638640356, but got txid 2638864045. at org.apache.hadoop.hdfs.server.namenode.MetaRecoveryContext.editLogLoaderPrompt(MetaRecoveryContext.java:94) at org.apache.hadoop.hdfs.server.namenode.FSEditLogLoader.loadEditRecords(FSEditLogLoader.java:212) at org.apache.hadoop.hdfs.server.namenode.FSEditLogLoader.loadFSEdits(FSEditLogLoader.java:140) at org.apache.hadoop.hdfs.server.namenode.FSImage.loadEdits(FSImage.java:846) at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:701) at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:292) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:1081) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:778) at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:613) at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:675) at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:843) at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:822) at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1543) at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1611)Failed to start namenode.java.io.IOException: There appears to be a gap in the edit log. We expected txid 2638640356, but got txid 2638864045. at org.apache.hadoop.hdfs.server.namenode.MetaRecoveryContext.editLogLoaderPrompt(MetaRecoveryContext.java:94) at org.apache.hadoop.hdfs.server.namenode.FSEditLogLoader.loadEditRecords(FSEditLogLoader.java:212) at org.apache.hadoop.hdfs.server.namenode.FSEditLogLoader.loadFSEdits(FSEditLogLoader.java:140) at org.apache.hadoop.hdfs.server.namenode.FSImage.loadEdits(FSImage.java:846) at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:701)
这问题重现
2.1当前集群状态
1.集群版本是5.16.2
2.集群HDFS服务启用了高可用
3.当前集群服务正常
2.2重现过程
1.移走集群中所有JournalNode节点目录下的同一个edits文件,比如下面图片中的文件 edits_0000000000001904836-0000000000001904904
2.重启NameNode,重现启动失败的异常
3.查看NameNode启动日志,可以看到下面的报错和上文的一样
问题分析
从上面的异常日志可以看到“We expected txid 1904836, but got txid 1904905”是edits log日志有丢失,预期的txid是1904836,但是当前的txid为1904905。
我们手动移走的文件为edits_0000000000001904836-0000000000001904904,ID与报错信息吻合,在启动NameNode的时候,合并edits log文件,找不到我们移走的文件,导致合并失败,就造成了启动NameNode失败。
问题解决
根据上文的分析,我们需要把丢失的edits文件拷贝回去。
1.这里可以从Active NameNode或者Standby NameNode的数据目录中去拷贝回来丢失的edits文件
[root@cdp2 current]# pwd/dfs/nn/current[root@cdp2 current]# mv edits_0000000000001904836-0000000000001904904 /dfs/jn/dd/current/
2.重启NameNode,服务正常
3.进行HDFS验证,服务正常
进行文件上传和查看均正常。
总结
1.NameNode启动时的fsimage是直接从本地获取,而edits是从JournalNode上获取的。根据日志的异常提示,edits文件不同步,所以需要去JournalNode节点上确认是否缺失了日志提示的文件块。
2.在NameNode的数据目录中,保存有edits log文件,由于JournalNode数据目录的文件丢失,所以可以从NameNode节点的数据目录找到丢失的文件,复制到JournalNode的数据目录下,再重启NameNode即可。
3.在所有的JournalNode的数据目录中,只需要任意一个目录edits log文件是完整的,NameNode即可正常启动。否则就需要从别处拷贝完整的回来。