这次文章是记录一下数据恢复。
上周五在调试Spark数据的时候发现了一个问题,就是一直显示No lease的问题,我们的实时处理程序升级之后,处理的数据量在一个小时内暴增1T。我们的小时程序Spark,有的单个key数据重复导致value值增大,程序运行卡住,根据网上查的参数进行调整。
Hadoop
在调整前,将Hadoop进行关闭 .
stop-all.sh 进行关闭
现在开始说下怎么弄,当然这个方案会丢失一部分数据,这也是没有办法的事情。幸好丢失的数据还可以通过原先的数据跑回来。万幸。
数据恢复。
1. 在Hadoop中,我们可以看到有三个关注的地方
三步操作,把集群中这三个 namespaceID还有ClusterID 保持一致,这个一致时建立在namenode节点上的,并且 是有数据的namenode,否则设置错误会导致数据全部丢失。
2. 上面三个都修改完之后 ,开始进行数据的操作,我们知道在集群出问题之后可能出现两个namenode里面保存的不一致的情况,那么我们需要把这部分数据进行一致操作。
* 在数据盘里面的name版本文件里面 存在edit 信息,这个是保存的数据节点目录,上面修改完毕后,直接启动hadoop会出现
org.apache.hadoop.hdfs.server.namenode.NameNode: Exception in namenode join
java.io.IOException: There appears to be a gap in the edit log. We expected txid 1, but got txid 52.
at org.apache.hadoop.hdfs.server.namenode.MetaRecoveryContext.editLogLoaderPrompt(MetaRecoveryContext.java:94)
at org.apache.hadoop.hdfs.server.namenode.FSEditLogLoader.loadEditRecords(FSEditLogLoader.java:184)
at org.apache.hadoop.hdfs.server.namenode.FSEditLogLoader.loadFSEdits(FSEditLogLoader.java:112)
at org.apache.hadoop.hdfs.server.namenode.FSImage.loadEdits(FSImage.java:733)
at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:647)
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:264)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:787)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:568)
at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:443)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:491)
at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:684)
at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:669)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1254)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1320)
这样的错误,我们根据 不需要的edit 其实就是损坏的数据删掉即可就能恢复系统了
总结
从上面步骤就可以把误操作的format 数据恢复过来,但是前提是两个namenode 其中一个没有被格式化。还保存着最新的数据留存。如果两个都被格式化了。。。基本无解了