问题描述
启动NameNode时候出现下面异常信息,启动失败
![ef3c6cd58f799d5cc52cc5fc58c52a90.png](https://img-blog.csdnimg.cn/img_convert/ef3c6cd58f799d5cc52cc5fc58c52a90.png)
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.当前集群服务正常
![8467e7f5bccf1b6b13f2960fe063a2d4.png](https://img-blog.csdnimg.cn/img_convert/8467e7f5bccf1b6b13f2960fe063a2d4.png)
2.2重现过程
1.移走集群中所有JournalNode节点目录下的同一个edits文件,比如下面图片中的文件 edits_0000000000001904836-0000000000001904904
![7c600357b75204936a60075de4a55573.png](https://img-blog.csdnimg.cn/img_convert/7c600357b75204936a60075de4a55573.png)
![83031b2b817b37ae0bf972a33ee2bf0c.png](https://img-blog.csdnimg.cn/img_convert/83031b2b817b37ae0bf972a33ee2bf0c.png)
![e3abf7cb97cc191f478e5e2e3dd768a2.png](https://img-blog.csdnimg.cn/img_convert/e3abf7cb97cc191f478e5e2e3dd768a2.png)
2.重启NameNode,重现启动失败的异常
![5eca336cd36b244a16f1c0eb21c2a6cc.png](https://img-blog.csdnimg.cn/img_convert/5eca336cd36b244a16f1c0eb21c2a6cc.png)
3.查看NameNode启动日志,可以看到下面的报错和上文的一样
![a5f5c285113e13f3b3af5041e5e306b3.png](https://img-blog.csdnimg.cn/img_convert/a5f5c285113e13f3b3af5041e5e306b3.png)
![0608b5bcb0683a2d4ab50c5ff9f5161c.png](https://img-blog.csdnimg.cn/img_convert/0608b5bcb0683a2d4ab50c5ff9f5161c.png)
问题分析
从上面的异常日志可以看到“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/
![897648f4116d9c7805bfa4e0b8557177.png](https://img-blog.csdnimg.cn/img_convert/897648f4116d9c7805bfa4e0b8557177.png)
2.重启NameNode,服务正常
![2cdfe2639d7431ddf7a9714dfc6220f7.png](https://img-blog.csdnimg.cn/img_convert/2cdfe2639d7431ddf7a9714dfc6220f7.png)
![776b04def8671ca117542685f83c554e.png](https://img-blog.csdnimg.cn/img_convert/776b04def8671ca117542685f83c554e.png)
3.进行HDFS验证,服务正常
进行文件上传和查看均正常。
![c6a4c96fab93efd1560c267ff7e93ec0.png](https://img-blog.csdnimg.cn/img_convert/c6a4c96fab93efd1560c267ff7e93ec0.png)
总结
1.NameNode启动时的fsimage是直接从本地获取,而edits是从JournalNode上获取的。根据日志的异常提示,edits文件不同步,所以需要去JournalNode节点上确认是否缺失了日志提示的文件块。
2.在NameNode的数据目录中,保存有edits log文件,由于JournalNode数据目录的文件丢失,所以可以从NameNode节点的数据目录找到丢失的文件,复制到JournalNode的数据目录下,再重启NameNode即可。
3.在所有的JournalNode的数据目录中,只需要任意一个目录edits log文件是完整的,NameNode即可正常启动。否则就需要从别处拷贝完整的回来。