HDFS trash操作实战

HDFS会早每一个用户目录下创建一个回收站目录,即:/user/username/.Trash。每一个被删除的文件和目录,都会有一个回收周期(fs.trash.interval)。在这个回收周期内,文件实际上会被移动到这个回收站目录下面,可以被用户手动进行恢复。当回收周期到达时,HDFS就会将这个文件/目录彻底删除。
在每个节点的core-site.xml上配置为1天:

在HDFS内部的具体实现就是在NameNode中开启了一个后台线程Emptier(默认是org.apache.hadoop.fs.TrashPolicyDefault.Emptier,也可以通过fs.trash.classname指定TrashPolicy类),这个线程专门管理和监控系统回收站下面的所有文件/目录,对于已经超过生命周期的文件/目录,这个线程就会自动的删除它们,不过这个管理的粒度很大。另外,用户也可以手动清空回收站(通过hdfs dfs -expunge),也可以使用rm清空回收站,此时,不会再触发回收站操作。Emptier每隔fs.trash.interval分钟就清空一次用户回收站。即先检查每个用户回收站目录,然后删除寿命超过fs.trash.interval的目录,最后将当前存放删除的文件/目录的回收站目录/user/用户名/.Trash/current重命名为一个/user/用户名/.Trash/yyMMddHHmm。也就是从理论上说,在回收站里的目录会保留fs.trash.interval – 2*fs.trash.interval时间区间。
如果使用rm命令时,启用trash的fs.trash.interval参数不用重启后台进程。但要求在/user目录下需要有对应用户的home目录,否则会因为创建目录失败报错。
rmr: Failed to move to trash: hdfs://test1:9000/tmp: Permission denied: user=root, access=WRITE, inode=”/user”:hdfs:supergroup:drwxr-xr-x
成功删除会提示mv到trash目录下。

Posted in BigData, Hadoop, Ops.