这个问题其实比较严重,提前说一下结论,能恢复的只有执行删除后未删除的数据,已经删除的数据无法恢复。
什么叫执行删除后未删除的数据呢,因为hadoop执行删除时是在edits文件中添加一个标记,然后慢慢删除,这其中有个过程,假如你只删除一个文件,那我估计这种方式是无法恢复的,这个办法只能恢复标记删除而未删除的记录。
停止Hadoop集群
停止集群这一步的时间,决定了你能恢复数据的多少,假如停止过慢,Hadoop已经删除完毕,那么不可恢复,不用看下去了,假如你停止的及时,那你还有机会,继续向下看
修改edits
修改这个目录下的edits文件
dfs.namenode.shared.edits.dir#这个参数配置了启用edits目录机器
然后查找journal的目录所在位置
/app/data1/hadoop/journal/node/local/data/iptvcluster/current/
我的如图所示,由于我在测试过程中关闭的及时,所以我的日志在edits_inprogress_0000000000183143068这个文件中
然后,执行指令将文件转为XML
hdfs oev -i edits_inprogress_0000000000183139685 -o edits_inprogress_0000000000183139685.xml
然后在文件中搜索被误删除的文件或者文件夹,将
<PATH>/spark/historyserverforSpark/application_1554216958673_5470.inprogress</PATH>改为不存在目录
再然后
hdfs oev -p binary -i edits_inprogress_0000000000183139685.xml -o edits_inprogress_0000000000183139685 binary
将修改过的文件转回edits文件,并且拷贝到dfs.namenode.shared.edits.dir下所有节点,保证文件一致
查询fsimage中是否还保留元数据
进入dfs.namenode.name.dir配置的目录,然后通过如下指令打开元数据信息查询Api
hdfs oiv -i fsimage_0000000000183129308 -addr 127.0.0.1:5978
然后通过
hdfs dfs -ls webhdfs:/127.0.0.1:5978/datawarehouse/
查看元数据是否还在,若还在即可启动,若不在只能考虑回退了,这个暂时只能看有没有副本了,我这里还在,就讲解不了了