回收站机制:
HDFS会为每一个用户创建一个回收站目录:/user/${user.name}/.Trash。用户删除文件时,文件并不是彻底地消失了,而是mv到了/user/${user.name}/.Trash这个文件下。注意:如果用户的回收站中已经存在了用户当前删除的文件/目录,则HDFS会将这个当前被删除的文件/目录重命名,命名规则很简单就是在这个被删除的文件/目录名后面紧跟一个编号(从1开始直到没有重名为止)
定期删除机制:
在HDFS内部的具体实现就是在NameNode中开启了一个后台线程Emptier,这个线程专门管理和监控系统回收站下面的所有文件/目录,对于已经超过生命周期的文件/目录,这个线程就会自动的删除它们,不过这个管理的粒度很大,只针对/user/${user.name}/.Trash/下的第一级子目录
生命周期控制参数:
<!--回收站数据保存周期(分钟)。当值为0,代表不开启回收站功能会永久删除数据-->
<!--生产环境下必须开启至少一天的时间-->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<!--垃圾回收检查间隔(分钟)。应该小于或等于fs.trash.interval。
如果是0,值等同于fs.trash.interval。每次检查器运行,会创建新的检查点-->
<property>
<name>fs.trash.checkpoint.interval</name>
<value>60</value>
</property>
<!-- 从参数看,被用户用命令删除的文件最多可在其回收站中保存2*interval分钟,
最少可保存interval分钟-->
示例图片:
恢复误删除文件:
#只需要将误删除的文件移出来即可
hdfs dfs -mv /user/root/.Trash/Current/xxx /data/hdfs/
强制删除不进入回收站:
#强制hdfs立即删除文件并跳过垃圾箱
hadoop fs -rmr -skipTrash /data/hdfs/xxx
手动删除回收站文件:
hadoop fs -rm -r /user/root/.Trash/Current/xxx
清空HDFS的回收站:
#expunge命令
#第一次执行hadoop fs -expunge时,HDFS会新建一个checkpoint并把最近删除存放在Trash中的文件移至checkpoint下;在下一次hadoop fs -expunge执行时(注意,如果你在core-site.xml文件中配置了fs.trash.checkpoint.interval属性,该命令会在达到指定的时间后自动执行,手动执行无效),该checkpoint下的所有文件会被永久删除
#执行完之后会打一个checkpoint,并不会立即执行,稍后会执行清空回收站操作
hdfs dfs -expunge
特别注意:
调用hdfs delete API执行删除时,不会将删除数据移动到回收站中,必须自己实现Transh类:
val hdfs = FileSystem.get(sc.hadoopConfiguration)
hdfs.delete(new Path("**"), true) //直接删除不可找回
val hfsTrash = new Trash(hdfs, sc.hadoopConfiguration)
hdfsTrash.moveToTrash(new Path("**")) //移动到回收站