和Linux系统的回收站设计一样,HDFS会为每一个用户创建一个回收站目录: /user/用户名/.Trash/
每一个被用户通过Shell删除的文件或目录,在系统回收站中都有一个周期,也就是当系统回收站中的文件或目录在一段时间之后没有被用户恢复的话,HDFS就会自动的把这个文件或目录彻底删除,之后,用户就永远也找不回这个文件或目录了。
在HDFS内部的具体实现就是在NameNode中开启了一个后台线程Emptier,这个线程专门管理和监控系统回收站下面的所有文件/目录,对于已经超过生命周期的文件/目录,这个线程就会自动的删除它们,不过这个管理的粒度很大。另外,用户也可以手动清空回收站,清空回收站的操作和删除普通的文件目录是一样的,只不过HDFS会自动检测这个文件目录是不是回收站,如果是,HDFS当然不会再把它放入用户的回收站中了。
hdfs会为每个用户都建一个回收站,用户删除文件时,文件并不是彻底地消失了,而是mv到了 /user/用户名/.Trash/Current
这个目录下
默认的删除策略是保留 6 个小时, 超过 6 小时将会被删除. 具体配置如下所示
<!-- file: core-site.xml -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
<description>Number of minutes between trash checkpoints. If zero, the trash feature is disabled. 单位:分钟</description>
</property>
NameNode是通过后台线程(默认是org.apache.hadoop.fs.TrashPolicyDefault.Emptier,也可以通过fs.trash.classname指定TrashPolicy类)来定时清空所有用户回收站中的文件/目录的,它每隔interval分钟就清空一次用户回收站。
具体的操作步骤是,先检查用户回收站目录/user/用户名/.Trash下的所有yyMMddHHmm形式的目录,然后删除寿命超过interval的目录,最后将当前存放删除的文件/目录的回收站目录/user/用户名/.Trash/current重命名为一个/user/用户名/.Trash/yyMMddHHmm.
从这个回收线程(Emptier)的实现可以看出,被用户用命令删除的文件最多可在其回收站中保存 2*interval 分钟,最少可保存 interval 分钟,过了这个有效期,用户删除的文件就永远也不可能恢复了。