回收站机制:

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回收站的配置使用 hdfs回收站机制_HDFS

恢复误删除文件:

#只需要将误删除的文件移出来即可
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("**"))    //移动到回收站