温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
Fayson的github:
https://github.com/fayson/cdhproject
提示:代码块部分可以左右滑动查看噢
1
文档编写目的
前两天客户问了一个问题,HDFS上删除的数据还能不能恢复?碰到这个问题第一反应“在执行命令的这个用户下垃圾回收站找到恢复不就的了?”,用户删除数据发现操作失误的时间并不长也没有超过垃圾回收站的清空时间,但是无论怎么找也找不到被删除的数据,这次真的玩儿大了。。。
经沟通发现用户是在MapReduce作业里面调用了HDFS的API进行删除操作,那这个删除与我们命令行使用hadoop fs -rmr删除有什么区别?
内容概述
1.源码分析
2.总结
测试环境
1.CM和CDH版本为5.15.0
2
API与命令行操作验证
Fayson在本地进行测试,通过调用HDFS的API接口进行delete操作,删除的文件或目录确实在HDFS上无法找回。
1.确认HDFS的Trash清理时间
2.测试目录/tmp/kafka-data
3.查看Fayson用户下.Trash内容
当前用户的垃圾回收站没有任何内容
4.通过HDFS的API接口调用delete删除目录
执行删除操作,删除/tmp/ kafka-data目录
5.删除成功后在fayson用户的回收站下查看是否能找到删除的目录
无论是在操作用户的回收站还是所有用户目录下均找不到被删除的kafka-data目录。
6.接下来再使用命令行进行操作,先将数据目录put到/tmp目录下
在命令行执行删除操作
可以看到命令行操作,提示将/tmp/kafka-data目录move到了操作用户的.Trash/Current/tmp/kafka-data目录下,因此可以在fayson用户的垃圾回收站找到被删除的数据。
3
源码分析
于是Fayson又查看了下HDFS的源码找到了命令行操作与直接调用HDFS API的区别,如下是两种操作方式区别:
未指定skipTrash,调用Trash.moveToAppropriateTrash方法,该方法最终调用org.apache.hadoop.fs.TrashPolicyDefault.moveTrash方法
最终也就看到了命令行删除操作打印的日志“Moved:…”
通过上述代码分析可以看到,在命令行只有指定skipTrash才会直接调用FileSystem的delete方法,因此在代码中直接调用HDFS API是会直接跳过回收站将指定的文件或目录删除,以至于我们在回收站是找不到被删除的文件或目录。
4
总结
删除数据需谨慎!!!
提示:代码块部分可以左右滑动查看噢
为天地立心,为生民立命,为往圣继绝学,为万世开太平。
温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
领取专属 10元无门槛券
私享最新 技术干货