HDFS 的Trash回收站功能的配置、使用
文件的删除和恢复
和Linux系统的回收站设计一样,HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/,每一个被用户通过Shell删除的文件/目录,在系统回收站中都一个周期,也就是当系统回收站中的文件/目录在一段时间之后没有被用户回复的话,HDFS就会自动的把这个文件/目录彻底删除,之后,用户就永远也找不回这个文件/目录了。在HDFS内部的具体实现就是在NameNode中开启了一个后台线程Emptier,这个线程专门管理和监控系统回收站下面的所有文件/目录,对于已经超过生命周期的文件/目录,这个线程就会自动的删除它们,不过这个管理的粒度很大。另外,用户也可以手动清空回收站,清空回收站的操作和删除普通的文件目录是一样的,只不过HDFS会自动检测这个文件目录是不是回收站,如果是,HDFS当然不会再把它放入用户的回收站中了
根据上面的介绍,用户通过命令行即HDFS的shell命令删除某个文件,这个文件并没有立刻从HDFS中删除。相反,HDFS将这个文件重命名,并转移到操作用户的回收站目录中(如/user/hdfs/.Trash/Current, 其中hdfs是操作的用户名)。如果用户的回收站中已经存在了用户当前删除的文件/目录,则HDFS会将这个当前被删除的文件/目录重命名,命名规则很简单就是在这个被删除的文件/目录名后面紧跟一个编号(从1开始知道没有重名为止)。
当文件还在/user/hdfs/.Trash/Current目录时,该文件可以被迅速地恢复。文件在/user/hdfs/.Trash/Current中保存的时间是可配置的,当超过这个时间,Namenode就会将该文件从namespace中删除。 文件的删除,也将释放关联该文件的数据块。注意到,在文件被用户删除和HDFS空闲的增加之间会有一个等待时间延迟。
当被删除的文件还保留在/user/hdfs/.Trash/Current目录中的时候,如果用户想恢复这个文件,可以检索浏览/user/hdfs/.Trash/Current目录并检索该文件。/user/hdfs/.Trash/Current目录仅仅保存被删除 文件的最近一次拷贝。/user/dfs/.Trash/Current目录与其他文件目录没有什么不同,除了一点:HDFS在该目录上应用了一个特殊的策略来自动删除文件,目前的默认策略是 删除保留超过6小时的文件,这个策略以后会定义成可配置的接口。
还有,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分钟,过了这个有效期,用户删除的文件就永远也不可能恢复了
配置
在每个节点(不仅仅是主节点)上添加配置 /etc/hadoop/conf/core-site.xml,增加如下内容
<property> <name>fs.trash.interval</name> <value>1440</value> </property>
注意:当用户写程序调用HDFS的API时,NameNode并不会把删除的文件或目录放入回收站Trash中,而是需要自己实现相关的回收站逻辑,见如下的代码
import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.Trash; public class RMFile { private final static Log log = LogFactory.getLog(RMFile.class); private final static Configuration conf = new Configuration(); /** * Delete a file/directory on hdfs * * @param path * @param recursive * @return * @throws IOException */ public static boolean rm(FileSystem fs, Path path, boolean recursive) throws IOException { log.info("rm: " + path + " recursive: " + recursive); boolean ret = fs.delete(path, recursive); if (ret) log.info("rm: " + path); return ret; } /** * Delete a file/directory on hdfs,and move a file/directory to Trash * @param fs * @param path * @param recursive * @param skipTrash * @return * @throws IOException */ public static boolean rm(FileSystem fs, Path path, boolean recursive, boolean skipTrash) throws IOException { log.info("rm: " + path + " recursive: " + recursive+" skipTrash:"+skipTrash); if (!skipTrash) { Trash trashTmp = new Trash(fs, conf); if (trashTmp.moveToTrash(path)) { log.info("Moved to trash: " + path); return true; } } boolean ret = fs.delete(path, recursive); if (ret) log.info("rm: " + path); return ret; } public static void main(String[] args) throws IOException { conf.set("fs.default.name", "hdfs://data2.kt:8020/"); FileSystem fs = FileSystem.get(conf); RMFile.rm(fs,new Path("hdfs://data2.kt:8020/test/testrm"),true,false); } }
执行程序后,发现使用程序删除的文件,也到了用户的回收站目录中,见红框内

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
MapReduce的数据流程、执行流程
MapReduce的数据流程: 预先加载本地的输入文件 经过MAP处理产生中间结果 经过shuffle程序将相同key的中间结果分发到同一节点上处理 Recude处理产生结果输出 将结果输出保存在hdfs上 MAP 在map阶段,使用job.setInputFormatClass定义的InputFormat将输入的数据集分割成小数据块splites, 同时InputFormat提供一个RecordReder的实现。默认的是TextInputFormat, 他提供的RecordReder会将文本的一行的偏移量作为key,这一行的文本作为value。 这就是自定义Map的输入是<LongWritable, Text>的原因。 然后调用自定义Map的map方法,将一个个<LongWritable, Text>对输入给Map的map方法。 最终是按照自定义的MAP的输出key类,输出class类生成一个List<MapOutputKeyClass, MapOutputValueClass>。 Partitioner 在map阶段的最后,会先调用job.set...
- 下一篇
mapreduce中counter的使用
MapReduce Counter为提供我们一个窗口:观察MapReduce job运行期的各种细节数据。MapReduce自带了许多默认Counter。 Counter有"组group"的概念,用于表示逻辑上相同范围的所有数值。MapReduce job提供的默认Counter分为三个组 Map-Reduce Frameword Map input records,Map skipped records,Map input bytes,Map output records,Map output bytes,Combine input records,Combine output records,Reduce input records,Reduce input groups,Reduce output records,Reduce skipped groups,Reduce skipped records,Spilled records File Systems FileSystem bytes read,FileSystem bytes written Job Counters L...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7设置SWAP分区,小内存服务器的救世主
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装