Hadoop 3.0 开启回收站(Trash)功能

     上一篇,我们利用三台虚拟机配置了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

检查点创建的时间间隔(单位为分钟)。其值应该小于或等于fs.trash.interval。如果为零,则将该值设置为fs.trash.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文件恢复



    (1)    接着上面的讲,由于我们设置了回收站里面文件的回收周期为60分钟,因此,在我打下这段文字的时候,显然,回收站里面的目录mydir是不会被清空的,因为,一个小时还是挺长的,除非你是真想删除一个文件或者目录,不然,给你1个小时的后悔时间还是来得及的。

        恢复刚才删除的mydir目录,其实就是把它从回收站trash里“解救出来”,其实就是文件的移动(-mv),我们可以这么做:

        由于我们开启了时间检测点,因此,刚才的Current目录会重命名为检测点创建的时间戳,如下



      


       ( 如果检查点已经启用,会定期使用时间戳重命名Current目录。.Trash中的文件在用户可配置的时间延迟后被永久删除)

 
       180626 210000 == 2018年6月26号21点0分0秒  

       
        由于检测点设置的时间和回收站清除检查点的时间都是60分钟,因此,当22:00:00的时候,时间戳会变成180626 220000


(2)    我们看下180626210000 目录下是否有之前我们删除的mydir目录

     

 


        


(3)    恢复mydir目录,将其从trash里面移动到文件系统的根目录下"/"


  hadoop fs -mv /user/root/.Trash/180626210000/mydir /






(4)    清空回收站 

清空回收站有两种方式:


A: 直接暴力删除.Trash目录

B: 使用-expunge命令行工具 删除掉过期的(old checkpoint)检查点  (推荐选用这一种)


对应Trash.class类中的expunge方法





hadoop fs -expunge               ==>  实际上是立即执行了一次清理trash的checkpoint



删除旧的检查点(把当前新的检查点前面的检查点删除),并创建新的检查点(新删除的文件或目录放进来继续监测)





执行后我们再来看一下,回收站里面是否还有文件






猜你喜欢

转载自blog.csdn.net/appleyk/article/details/80825398
今日推荐