转载:https://blog.csdn.net/sunnyyoona/article/details/78869778

我们在删除一个文件时,遇到如下问题,提示我们不能删除文件放回回收站:

sudo -uxiaosi hadoop fs -rm -r tmp/data_group/test/employee/employee_salary.txt
17/12/06 16:34:48 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 72000000 minutes, Emptier interval = 0 minutes.
17/12/06 16:34:48 WARN fs.TrashPolicyDefault: Can't create trash directory: hdfs://cluster/user/xiaosi/.Trash/Current/user/xiaosi/tmp/data_group/test/employee
rm: Failed to move to trash: hdfs://cluster/user/xiaosi/tmp/data_group/test/employee/employee_salary.txt. Consider using -skipTrash option

去回收站对应目录下观察一下,得出的结论是:无法创建目录employee,因为employee文件已经存在,自然导致employee_salary.txt文件不能放回收回站:

-rw-r--r--   3 xiaosi xiaosi  352 2017-12-06 16:18 hdfs://cluster/user/xiaosi/.Trash/Current/user/xiaosi/tmp/data_group/test/employee

跟如下是同样的道理:

xiaosi@yoona:~$ ll employee
-rw-rw-r-- 1 xiaosi xiaosi 0 12月 6 16:56 employee
xiaosi@yoona:~$
xiaosi@yoona:~$
xiaosi@yoona:~$ mkdir employee
mkdir: 无法创建目录"employee": 文件已存在

借此机会,详细研究了一下HDFSTrash回收站机制。

1. 配置

HDFS的回收站就像Windows操作系统中的回收站一样。它的目的是防止你无意中删除某些东西。你可以通过设置如下属性来启用此功能(默认是不开启的):

<property>  
<name>fs.trash.interval</name>
<value>1440</value>
<description>Number of minutes after which the checkpoint gets deleted. If zero, the trash feature is disabled.</description>
</property> <property>
<name>fs.trash.checkpoint.interval</name>
<value>0</value>
<description>Number of minutes between trash checkpoints. Should be smaller or equal to fs.trash.interval. If zero, the value is set to the value of fs.trash.interval.</description>
</property>
属性 说明
fs.trash.interval 分钟数,当超过这个分钟数后检查点会被删除。如果为零,回收站功能将被禁用。
fs.trash.checkpoint.interval 检查点创建的时间间隔(单位为分钟)。其值应该小于或等于fs.trash.interval。如果为零,则将该值设置为fs.trash.interval的值。

2. Trash

启用回收站功能后,使用rm命令从HDFS中删除某些内容时,文件或目录不会立即被清除,它们将被移动到回收站Current目录中(/user/${username}/.Trash/current)。如果检查点已经启用,会定期使用时间戳重命名Current目录。.Trash中的文件在用户可配置的时间延迟后被永久删除。回收站中的文件和目录可以简单地通过将它们移动到.Trash目录之外的位置来恢复:

sudo -uxiaosi hadoop fs -rm tmp/data_group/test/employee/employee_salary.txt
17/12/06 17:24:32 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 72000000 minutes, Emptier interval = 0 minutes.
Moved: 'hdfs://cluster/user/xiaosi/tmp/data_group/test/employee/employee_salary.txt' to trash at: hdfs://cluster/user/xiaosi/.Trash/Current

说明:

  • Deletion interval表示检查点删除时间间隔(单位为分钟)。这里是fs.trash.interval的值。NameNode运行一个线程来定期从文件系统中删除过期的检查点。
  • Emptier interval表示在运行线程来管理检查点之前,NameNode需要等待多长时间(以分钟为单位),即检查点创建时间间隔。NameNode删除超过fs.trash.interval的检查点,并为/user/${username}/.Trash/Current创建一个新的检查点。该频率由fs.trash.checkpoint.interval的值确定,且不得大于Deletion interval。这确保了在emptier窗口内回收站中有一个或多个检查点。

例如,可以设置如下:

fs.trash.interval = 360 (deletion interval = 6 hours)
fs.trash.checkpoint.interval = 60 (emptier interval = 1 hour)

这导致NameNodeCurrent目录下的垃圾文件每小时创建一个新的检查点,并删除已经存在超过6个小时的检查点。

在回收站生命周期结束后,NameNodeHDFS命名空间中删除该文件。删除文件会导致与文件关联的块被释放。请注意,用户删除文件的时间与HDFS中相应增加可用空间的时间之间可能存在明显的时间延迟,即用户删除文件,HDFS可用空间不会立马增加,中间有一定的延迟。

3. 检查点

检查点仅仅是用户回收站下的一个目录,用于存储在创建检查点之前删除的所有文件或目录。如果你想查看回收站目录,可以在/user/${username}/.Trash/{timestamp_of_checkpoint_creation}处看到:

hadoop fs -ls hdfs://cluster/user/xiaosi/.Trash/
Found 3 items
drwx------ - xiaosi xiaosi 0 2017-12-05 08:00 hdfs://cluster/user/xiaosi/.Trash/171205200038
drwx------ - xiaosi xiaosi 0 2017-12-06 01:00 hdfs://cluster/user/xiaosi/.Trash/171206080038
drwx------ - xiaosi xiaosi 0 2017-12-06 08:00 hdfs://cluster/user/xiaosi/.Trash/Current

最近删除的文件被移动到回收站Current目录,并且在可配置的时间间隔内,HDFS会为在Current回收站目录下的文件创建检查点/user/${username}/.Trash/<日期>,并在过期时删除旧的检查点。

4. 清空回收站

首先想到的是只要删除整个回收站目录,将会清空回收站。诚然,这是一个选择。但是我们有更好的选择。HDFS提供了一个命令行工具来完成这个工作:

hadoop fs -expunge

该命令使NameNode永久删除回收站中比阈值更早的文件,而不是等待下一个emptier窗口。它立即从文件系统中删除过期的检查点。

5. 注意点

回收站功能默认是禁用的。对于生产环境,建议启用回收站功能以避免意外的删除操作。启用回收站提供了从用户操作删除或用户意外删除中恢复数据的机会。但是为fs.trash.intervalfs.trash.checkpoint.interval设置合适的值也是非常重要的,以使垃圾回收以你期望的方式运作。例如,如果你需要经常从HDFS上传和删除文件,则可能需要将fs.trash.interval设置为较小的值,否则检查点将占用太多空间。

当启用垃圾回收并删除一些文件时,HDFS容量不会增加,因为文件并未真正删除。HDFS不会回收空间,除非文件从回收站中删除,只有在检查点过期后才会发生。

回收站功能默认只适用于使用Hadoop shell删除的文件和目录。使用其他接口(例如WebHDFSJava API)以编程的方式删除的文件或目录不会移动到回收站,即使已启用回收站,除非程序已经实现了对回收站功能的调用。

有时你可能想要在删除文件时临时禁用回收站,也就是删除的文件或目录不用放在回收站而直接删除,在这种情况下,可以使用-skipTrash选项运行rm命令。例如:

sudo -uxiaosi hadoop fs -rm -skipTrash tmp/data_group/test/employee/employee_salary.txt

这会绕过垃圾回收站并立即从文件系统中删除文件。

资料:

https://developer.ibm.com/hadoop/2015/10/22/hdfs-trash/

https://my.oschina.net/cloudcoder/blog/179381

http://debugo.com/hdfs-trash/

http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#File_Deletes_and_Undeletes

Hadoop Trash回收站使用指南的更多相关文章

  1. Hadoop之回收站

    一.回收站简介: 在HDFS里,删除文件时,不会真正的删除,其实是放入回收站/trash,回收站里的文件可以快速恢复. 可以设置一个时间阀值,当回收站里文件的存放时间超过这个阀值或是回收站被清空时,文 ...

  2. hadoop 设置回收站

    我的问题是:hadoop回收站为什么会保留多个过期时间的数据   我们知道hadoop的回收站是在我们删除数据后能恢复的目录,但是我们并不希望在回收站保存太久的数据,我们可以使用如下参数进行配置.   ...

  3. HDFS的Trash回收站功能

    文件的删除和恢复 和Linux系统的回收站设计一样,HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/,每一个被用户通过Shell删除的文件/目录,在系统回收站中都一个周期, ...

  4. HDFS 的Trash回收站

    1)在core-site.xml文件中添加这个配置 在每个节点(不仅仅是主节点)上添加配置 core-site.xml,增加如下内容 <property> <name>fs.t ...

  5. Hadoop分布式文件系统使用指南

    原文地址:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_user_guide.html 目的 概述 先决条件 Web接口 Shell命令 DFSAdmin命 ...

  6. Hadoop的Python框架指南

    http://www.oschina.NET/translate/a-guide-to-Python-frameworks-for-Hadoop 最近,我加入了Cloudera,在这之前,我在计算生物 ...

  7. Windows下Hadoop编程环境配置指南

    刘勇    Email: lyssym@sina.com 本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣! 简介 鉴于最近在研究 ...

  8. Hadoop回收站及fs.trash参数详解

    前言: Linux系统里,个人觉得最大的不方便之一就是没有回收站的概念.rm -rf很容易造成极大的损失.而在Hadoop或者说HDFS里面,有trash(回收站)的概念,可以使得数据被误删以后,还可 ...

  9. Hadoop 回收站

    一.回收站简介: 在HDFS里,删除文件时,不会真正的删除,其实是放入回收站/trash,回收站里的文件可以快速恢复. 可以设置一个时间阀值,当回收站里文件的存放时间超过这个阀值或是回收站被清空时,文 ...

随机推荐

  1. Linux下的两个经典宏定义【转】

    转自:http://www.linuxidc.com/Linux/2015-07/120014.htm 本文首先介绍Linux下的经典宏定义,感受极客的智慧,然后根据该经典定义为下篇文章作铺垫. of ...

  2. linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】

    转自:http://blog.csdn.net/goodluckwhh/article/details/9005585 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 一每 ...

  3. 【bzoj1086】王室联邦

    我以为树分块什么的必有高论,结果居然是个暴力…… 方法也很简单,我看下每个节点dfs的时候是否已经大于k个,大于的话我就新开一块. 注意dfs的时候当前节点不能放进子树的块中. #include< ...

  4. Winform 中panel的mousewheel鼠标滚轮事件触发

    如果将窗体或容器控件(如Panel控件)的AutoScroll属性设置为True时,那么当窗体或Panel容不下其中的子控件时就会出现 滚动条,通过移动滚动条可以上下显示出窗体或Panel中的全部内容 ...

  5. redis设置慢查询日志

    Redis 的慢查询日志功能用于记录执行时间超过给定时长的命令请求, 用户可以通过这个功能产生的日志来监视和优化查询速度. 1.redis生命周期 慢查询发生在第3阶段 2.两个配置 2.1.slow ...

  6. redis特性与使用场景

    一.8大特性 1.速度快 数据存储在内存,可达到10万OPS 2.可持久化,断电不丢数据 所有数据保存在内存中,对数据的更新异步的保存在硬盘中 3.多种数据结构 字符串.哈希.列表.集合.有序集 合位 ...

  7. docker的存储结构,和以前有了很大不同

    在网上学习这一块知识点时,有一个URL讲得很详细, docker 镜像与容器存储目录结构精讲 http://blog.csdn.net/wanglei_storage/article/details/ ...

  8. 线段树【p2706】贪婪大陆

    Background 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败--人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前方是变异了的超 ...

  9. 20、Flask实战第20天:Flask上下文

    Local线程隔离对象 我们知道通过request可以获取表单中的数据.如果是多个用户同时在用网站,而全局request就只有一个,那么Flask是如何分辨哪用户对应哪个请求呢? 这种情况下,就会用到 ...

  10. HDU 6315: Naive Operations

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...