`
乡里伢崽
  • 浏览: 111951 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

hdfs的回收站

    博客分类:
  • hdfs
 
阅读更多
  在Linux操作系统下面,如果用户删除了某一个文件或者是某一个文件目录,操作系统并不会把这文件从文件系统中真正删除,而是先把它放入回收站中,这样在用户误操作的情况下还能找回原文件,以防止给用户造成中大损失。实际上,HDFS也为用户提供了类似这样的一个功能,但是这样的功能只限于用户在客户端的脚本操作,也就是HDFS的shell命令,而当用户写程序调用HDFS的API时,NameNode并不会把删除的文件或目录放入回收站Trash中,所以这一点请用户们要注意了。下面就来具体的谈谈HDFS是如何来实现这个回收站的功能的吧。
      首先,HDFS在客户端为用户提供了对文件系统的命令行操作,这个命令行操作是通过FsShell来实现的。当用户通过命令-rm/-rmr删除文件系统中的一个文件或者是目录的时候,HDFS并没有真正的删除这个文件或目录,而是把这个文件/目录移动到HDFS的系统回收站目录下。和Linux系统的回收站设计一样,HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/。这里就有一个问题了,经过长时间之后,删除的文件/目录占用了该文件系统大量的存储空间,而这些删除文件/目录确实已经真的对用户来说没有任何用处,那么HDFS是如何处理这个问题的呢?
      对于上面的问题,HDFS给出的一个解决方案是:每一个被用户通过Shell删除的文件/目录,在系统回收站中都一个周期,也就是当系统回收站中的文件/目录在一段时间之后没有被用户回复的话,HDFS就会自动的把这个文件/目录彻底删除,之后,用户就永远也找不回这个文件/目录了。在HDFS内部的具体实现就是在NameNode中开启了一个后台线程Emptier,这个线程专门管理和监控系统回收站下面的所有文件/目录,对于已经超过生命周期的文件/目录,这个线程就会自动的删除它们,不过这个管理的粒度很大。另外,用户也可以手动清空回收站,清空回收站的操作和删除普通的文件目录是一样的,只不过HDFS会自动检测这个文件目录是不是回收站,如果是,HDFS当然不会再把它放入用户的回收站中了。
   在HDFS中,用户的回收站用类org.apache.hadoop.fs.Trash来表示,这个类主要包含四个属性:

fs:当前用户使用的文件系统;
trash:用户的回收站目录(/user/用户名/.Trash);
current:存放被用户删除的文件/目录的路径(/user/用户名/.Trash/current);
interval:被用户删除的文件/目录在回收站中的生命期;
    在默认的情况下,interval的被Hadoop设置为0,即关闭了用户的回收站,所以我强烈的建议用户在读完本文之后赶紧在配置文件中设置fs.trash.interval的值(单位是minute),同时这个设置只与客户端和NameNode节点都相关,但是在客户端设置这个值,只能说明是开启了用户的回收站功能,而不能决定删除的文件/目录在回收站中的生命期,在NameNode节点设置这个值只能说是开启了自动清空所有用户回收站的功能。所以当某一个用户删除一个文件/目录时,HDFS就把这个待删除的文件/目录移动到该用户对应的回收站目录/user/用户名/.Trash/current中。另外,如果用户的回收站中已经存在了用户当前删除的文件/目录,则HDFS会将这个当前被删除的文件/目录重命名,命名规则很简单就是在这个被删除的文件/目录名后面紧跟一个编号(从1开始知道没有重名为止)。
    还有,NameNode是通过后台线程(org.apache.hadoop.fs.Trash.Emptier)来定时清空所有用户回收站中的文件/目录的,它每隔interval分钟就清空一次用户回收站。具体的操作步骤是,先检查用户回收站目录/user/用户名/.Trash下的所有yyMMddHHmm形式的目录,然后删除寿命超过interval的目录,最后将当前存放删除的文件/目录的回收站目录/user/用户名/.Trash/current重命名为一个/user/用户名/.Trash/yyMMddHHmm,相关的源代码是:
[java] view plaincopy
/** Create a trash checkpoint. */ 
  public void checkpoint() throws IOException { 
    if (!fs.exists(current))                      // no trash, no checkpoint 
      return; 
 
    Path checkpoint; 
    synchronized (CHECKPOINT) { 
      checkpoint = new Path(trash, CHECKPOINT.format(new Date())); 
    } 
 
    if (fs.rename(current, checkpoint)) { 
      LOG.info("Created trash checkpoint: "+checkpoint.toUri().getPath()); 
    } else { 
      throw new IOException("Failed to checkpoint trash: "+checkpoint); 
    } 
  } 
 
  /** Delete old checkpoints. */ 
  public void expunge() throws IOException { 
    FileStatus[] dirs = fs.listStatus(trash);            // scan trash sub-directories 
    if( dirs == null) return; 
    long now = System.currentTimeMillis(); 
    for (int i = 0; i < dirs.length; i++) { 
      Path path = dirs[i].getPath(); 
      String dir = path.toUri().getPath(); 
      String name = path.getName(); 
      if (name.equals(CURRENT.getName()))  continue;      // skip current         
 
      long time; 
      try { 
        synchronized (CHECKPOINT) { 
          time = CHECKPOINT.parse(name).getTime(); 
        } 
      } catch (ParseException e) { 
        LOG.warn("Unexpected item in trash: "+dir+". Ignoring."); 
        continue; 
      } 
 
      if ((now - interval) > time) { 
        if (fs.delete(path, true)) LOG.info("Deleted trash checkpoint: "+dir); 
        else LOG.warn("Couldn't delete checkpoint: "+dir+" Ignoring."); 
      } 
    } 
  } 
 
 
private static final PathHOMES = new Path("/user/"); 
public void run() { 
      if (interval == 0)  return;    // trash disabled 
       
      long now = System.currentTimeMillis(); 
      long end; 
      while (true) { 
        end = ceiling(now, interval); 
        try {                                     // sleep for interval 
          Thread.sleep(end - now); 
        } catch (InterruptedException e) { 
          return;                                 // exit on interrupt 
        }     
        try { 
          now = System.currentTimeMillis(); 
          if (now >= end) { 
            FileStatus[] homes = null; 
            try { 
              homes = fs.listStatus(HOMES);         // list all home dirs 
            } catch (IOException e) { 
              LOG.warn("Trash can't list homes: "+e+" Sleeping."); 
              continue; 
            } 
            if (homes == null) continue; 
            for (FileStatus home : homes) {         // dump each trash 
              if (!home.isDir()) continue; 
              try { 
                Trash trash = new Trash(home.getPath(), conf); 
                trash.expunge(); 
                trash.checkpoint(); 
              } catch (IOException e) { 
                LOG.warn("Trash caught: "+e+". Skipping "+home.getPath()+"."); 
              } 
            } 
          } 
        } catch (Exception e) { 
          LOG.warn("RuntimeException during Trash.Emptier.run() " + StringUtils.stringifyException(e)); 
        } 
      } 
    } 
      从这个回收线程(Emptier)的实现可以看出,被用户用命令删除的文件最多可在其回收站中保存2*interval分钟,最少可保存interval分钟,过了这个有效期,用户删除的文件就永远也不可能恢复了。
分享到:
评论

相关推荐

    hdfs命令大全

    - **功能描述**:清空HDFS回收站中的文件。 - **示例**: ```bash hadoop fs -expunge ``` ##### 11. `get` - **命令格式**:`hadoop fs -get [ignorecrc] [crc] &lt;src&gt; &lt;localdst&gt;` - **功能描述**:从HDFS复制...

    大数据技术基础实验报告-HDFS常用操作命令.doc

    6. `hdfs dfs -rm` 和 `-rmr`: 删除单个文件或递归删除整个目录,`-skipTrash`参数跳过回收站直接删除。 7. `hdfs dfs -put`: 将本地文件或目录上传到HDFS,`-f`参数强制覆盖目标。 8. `hdfs dfs -get`: 从HDFS...

    12、HDFS Trash垃圾桶回收介绍与示例

    在HDFS中,文件删除操作默认是不可逆的,但通过启用Trash功能,HDFS引入了一个类似操作系统级别的回收站机制,使得误删的文件和目录可以在一段时间内被找回。这个功能对于大数据处理环境尤为重要,因为数据的丢失...

    Hadoop操作命令

    - **示例**:`hadoop fs -expunge` 清空HDFS回收站中的所有文件。 #### 五、文件上传和下载 ##### 5.1 `-put &lt;localsrc&gt; &lt;dst&gt;` - **功能**:将本地文件上传到HDFS。 - **命令格式**:`hadoop fs -put &lt;localsrc&gt; ...

    HDFS可靠性策略

    * 回收站:删除文件时,其实是放入回收站/trash,回收站里的文件可以快速恢复;可以设置一个时间阈值,当回收站里文件的存放时间超过这个阈值,就被彻底删除,并且释放占用的数据块。 HDFS 的高可靠性是通过多种...

    HDFS实验手册.pdf

    - **fs.trash.interval**: 定义了HDFS Trash(回收站)的清理周期(单位为分钟)。默认值通常设置为360分钟。 - **hadoop.security.authentication**: 指定Hadoop的安全认证机制,默认为`simple`,表示使用简单的...

    《Hadoop 数据分析平台》课程毕业测试题

    - **知识点**: 通过设置`core-site.xml`中的`fs.trash.interval`为0来禁用HDFS回收站。 - **解释**: 为了防止误删除,HDFS提供了回收站功能。如果需要完全禁用此功能,可以通过设置`fs.trash.interval`为0来实现。...

    hadoop源码分析-HDFS部分

    NameNode负责文件系统的命名空间操作,如打开、关闭、重命名文件或目录,以及块的分配与回收;DataNode则负责数据的存储和传输。 Hadoop源码分析涉及以下几个关键模块: 1. **fs**: 这是文件系统接口层,提供了一...

    分布式文件系统HDFS原理与操作

    HDFS的可靠性机制包括冗余副本策略、机架策略、心跳机制、安全模式、校验和、回收站、元数据保护和快照机制等。冗余副本策略允许在hdfs-site.xml文件中设置复制因子以指定副本数量,确保所有数据块都有多个副本存储...

    Hadoop框架之HDFS的shell操作

    `-skipTrash`选项可以跳过回收站,直接删除。 **put** 和 **copyFromLocal**:这两个命令用于将本地文件系统(Linux)上的文件或多个文件上传到HDFS。 **moveFromLocal**:与`put`类似,但会从本地删除源文件。 *...

    Hadoop回收站trash-恢复删除的文件

    为了解决这一问题,Hadoop引入了回收站(Trash)机制,通过设置`fs.trash.interval`参数来实现对已删除数据的临时保留,从而提供了恢复误删数据的可能性。 ### Hadoop回收站trash机制详解 #### 配置回收站功能 ...

    Hadoop HDFS_Shell命令详解.pdf

    在HDFS中删除文件并不会立即释放磁盘空间,而是将文件放入回收站。`expunge` 命令用于清空回收站,释放磁盘空间。 #### 其他常用命令 ##### get **使用方法**: `hadoop fs -get URI &lt;localdst&gt;` 该命令用于从 HDFS...

    HDFS技术原理深入理解.pptx

    HDFS的Trash回收站是为了解决删除文件后,如何快速恢复删除的文件的问题。Trash回收站目录为/user/用户名/.Trash/,每一个被用户通过Shell删除的文件/目录,fs.trash.interval是指在这个回收周期之内,文件实际上是...

    云计算之HDFS.ppt

    HDFS的空间回收机制更为保守,文件删除后数据不立即清除,便于误删后的恢复。 【HDFS API】 HDFS提供了一系列API供用户与系统交互,如`hdfs.copyFromLocalFile()`方法用于将本地文件上传到HDFS。开发者可以利用...

    HDFS技术原理深入理解.pdf

    5. **Trash回收站**:类似于本地操作系统的回收站,HDFS为每个用户创建了一个回收站目录,删除的文件在指定时间间隔内会被移到回收站,而不是立即删除。回收间隔可以通过`core-site.xml`中的`fs.trash.interval`属性...

    hdfs_design.pdf

    HDFS支持空间回收,包括文件的删除与撤销删除操作,以及减少副本因子以优化存储空间。HDFS具有良好的可移植性,能够适应异构的硬件和软件平台。 综上所述,HDFS是一个为高性能、可扩展的分布式计算设计的文件系统。...

    hadoop之HDFS

    HDFS提供了一个回收站功能,允许用户恢复意外删除的文件。 11. **get命令**: `hadoop fs -get [-ignorecrc] [-crc] &lt;src&gt; &lt;localdst&gt;`用于从HDFS下载文件到本地。`-ignorecrc`和`-crc`选项同上。 了解这些基本...

    HDFS官方设计文档

    HDFS提供了空间回收机制,用于释放不再需要的存储空间: 1. **文件删除与撤销删除**:允许用户删除文件,同时也提供了撤销删除的功能,以便误删后能够恢复数据。 2. **减少复制因子**:允许管理员调整数据块的复制...

    HDFS Design

    #### 十一、空间回收 **11.1 文件删除与还原** HDFS支持文件删除和还原操作,用户可以删除文件或将已删除的文件还原回来。 **11.2 减少复制因子** 用户可以根据需要调整文件的复制因子,从而减少数据的冗余度,...

Global site tag (gtag.js) - Google Analytics