上一篇,我们利用三台虚拟机配置了Hadoop 3.0集群,配置的过程步骤很"繁琐",但是不难,由于后续我要针对Hadoop的文件系统FileSystem(Java API)整合一个工具,该工具涉及到获取文件系统指定目录下的文件状态、创建dir、删除dir、文件或目录重命名、文件移动、copy、还会涉及到回收站的功能,比如:清空回收站、恢复回收站里面的某个文件等...etc,因此,本篇有必要先开启一下Hadoop的回收站功能,为后续HdfsApi工具类提供回收站功能模块的demo支持,先放张图,功能还在完善,还在测试(敬请期待):
方法列表展示(部分功能,还在完善.....)
一、Hadoop 删除文件
用惯了Windows系统的用户,在误删除一个文件或者文件夹的时候,如果在不清空垃圾回收站的前提下,是可以进行补救的,回收站有个还原功能,选择还原便可以恢复我们误删除的文件或者文件夹,但是,在Hadoop的HDFS文件系统中使用删除命令rm,删除一个文件或者目录,那就真的是删除了,不是因为Hadoop没有回收站功能,而是,默认情况下,在core-site-xml通用配置文件里面没有配置Trash功能:
上述是core-site.xml的配置,只配置了两个必须配置的属性,在没有开启回收站功能之前,我们看一下,利用fs文件系统进行文件的删除,会是什么样
在NameNode主机上,使用命令,查看当前文件系统的根目录“/”下有哪些文件和目录(dir文件列表展示)
hadoop fs -s /
对应Hadoop的web管理界面(http://namenode主机名或IP:50070)上的hdfs的文件浏览功能的结果如下:
现在我们使用 -rmr(递归删除data目录,虽然里面没有任何文件 == ,为了演示我创建了个空的目录)
hadoop fs -rmr /data
小插曲:竟然提示我-rmr是被弃用的,建议我下次使用-rm -r,好吧,诉我无知,不过不影响data目录已经被干掉了!
注意,是真的被干掉了,假如我data目录下面放了各种资源的MV文件,比如什么欧美的啊,什么日韩小清新啊(),但是就在刚才,被我nc的用-rm给删除了,而且还是-r 彻底的、一干二净的删除,我那个啊,那可是我冒着中病毒的风险熬夜下载的啊,这时候,我就在想,如果当初配置Hadoop的时候,开启了回收站功能该多好啊,就不用这么无助了。
二、Hadoop 开启回收站功能
(1)HDFS的文件删除
和Linux的回收站设计的一样,HDFS会为每一个用户创建一个回收站目录,其Path为:/user/$UserName/.Trash,每一个被用户删除的文件或者目录,都会被存放在回收站中,而且这种存放可以是永久的也可以是有生命周期的,如果回收站“垃圾文件”过多的堆积,会占用HDFS的文件块空间,因此,最好的做法就是设置存放在回收站里面的文件或目录的生命周期(fs.trash.interval),比如,指定1一个小时(value = 60),由NameNode后台开启一个线程,检测回收站里面的所有文件或目录,如果检测到XX文件存放已经到1小时了,就把它从回收站里面请出来(彻底清除,并释放和文件关联的块空间),当然,回收站也是可以手动清除的(和Windows的回收站一样,手动清空),
(2)HDFS的文件恢复
文件的删除是将文件放到(移动到 moveto ==>.Trash)回收站里面,反过来,文件的恢复实际上就是把回收站里面的文件或者目录拿出来(移动到一个安全的Path,)
(3)给HDFS开启回收站功能,core-site.xml添加如下
<property> <name>fs.trash.interval</name> <value>60</value> </property> <property> <name>fs.trash.checkpoint.interval</name> <value>0</value> </property> |
fs.trash.interval | 分钟数,当超过这个分钟数后检查点会被删除。如果为零,回收站功能将被禁用。60 = 1小时 |
fs.trash.checkpoint.interval | 检查点创建的时间间隔(单位为分钟)。其值应该小于或等于 |
(3)配置好后,重启Hadoop集群
先停止: stop-all.sh
再开启: start-all.sh
(4)删除目录,**回收站功能(/user/root/.Trash 目录会被创建)
先列出来根目录下啊的文件列表
这次我选择大胆的删除mydir目录来验证trash功能,因为其下面是有文件的
come on,我们 -rm -r一下
hadoop fs -rm -r /mydir
哎哟,居然告诉我,mydir目录被移动到了 /user/root/.Trash/Current目录下,是不是没删除呢,我们查看一把验证下
hadoop fs -ls /user/root/.Trash/Current/mydir
三、HDFS文件恢复
由于我们开启了时间检测点,因此,刚才的Current目录会重命名为检测点创建的时间戳,如下
Current
目录。.Trash
中的文件在用户可配置的时间延迟后被永久删除)
hadoop fs -mv /user/root/.Trash/180626210000/mydir /
清空回收站有两种方式:
A: 直接暴力删除.Trash目录
B: 使用-expunge命令行工具 删除掉过期的(old checkpoint)检查点 (推荐选用这一种)
对应Trash.class类中的expunge方法
hadoop fs -expunge ==> 实际上是立即执行了一次清理trash的checkpoint
删除旧的检查点(把当前新的检查点前面的检查点删除),并创建新的检查点(新删除的文件或目录放进来继续监测)
执行后我们再来看一下,回收站里面是否还有文件