`
乡里伢崽
  • 浏览: 109110 次
  • 性别: 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的Trash回收站功能的配置和使用

    HDFS是Hadoop分布式计算的存储基础。HDFS具有高容错性,可以部署在通用硬件设备上,适合数据密集型应用,并且提供对数据读写的高吞 吐量。HDFS能 够提供对数据的可扩展访问,通过简单地往集群里添加节点就可以解决...

    大数据场景化解决方案.pdf

    HDFS适合:⼤⽂件存储与访问 流式数据访问 HDFS不适合:⼤量⼩⽂件存储 随机写⼊ 低延迟读取 HDFS回收站机制: 在HDFS⾥,删除⽂件时,不会真正的删除,其实是放⼊回收站,回收站⾥的⽂件可以⽤来快速恢复误删⽂件...

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

    12、HDFS Trash垃圾桶回收介绍与示例 网址:https://blog.csdn.net/chenwewi520feng/article/details/130359929 本文主要介绍HDFS Trash垃圾桶回收。 前提依赖:hadoop可以正常使用。 本文分为三部分,即介绍、配置...

    hdfsbackup:在HDFS和S3之间移动数据的工具,具有强大的数据完整性检查

    hdfsbackup 通过数据完整性验证在HDFS和S3之间移动备份数据的工具。 该项目包括几个工具: s3copy通过MD5校验和验证在HDFS和S3之间复制数据。... cleanup-dir从HDFS目录中删除旧文件以回收HDFS空间。

    浅析HDFS架构和设计

    hdfs是hadoop的分布式文件系统,即...目录使用HDFS的场景HDFS的工作模式文件系统命名空间(namespace)数据复制文件系统元数据的持久化通讯协议健壮性数据组织可访问性存储空间回收HDFS适合于以流式数据访问模式来存

    13_尚硅谷大数据之HDFS 2.X新特性1

    7.1 集群间数据拷贝 7.3 快照管理 7.4 回收站

    五分钟学大数据-Hadoop企业级调优手册1

    1.3 开启回收站配置 6 2.1 测试 HDFS 写性能 9 2.2 测试 HDFS 读性能 11 3.3 集群数据均衡之磁盘间数据均衡13 4.1 添加白名

    HBase中Coprocessor的介绍以及实际业务场景中的使用.pdf

    同时在hbase与hdfs的基础上,和团队一起研发了大数据存储与分析相关系统,如blobstore、bitbase等。 内容概要:(1)讲解hbase coprocessor的原理以及使用场景,(2) coprocessor整个流程实战,包括开发,加载,运行...

    “高频面经”之大数据研发篇

    2.Java虚拟机、垃圾回收机制 3.TCP “三次握手”、 “四次挥手 4.大数据常见组件 5.HDFS存储机制 6.MapReduce基本流程 7.Hadoop Shffule原理 8.Hadoop常用命令 9.Hadoop优化 10.Hadoop分片、分区 11.Hive常用高阶...

    Hadoop实战中文版

    7.3 划分为多个输出文件 7.4 以数据库作为输入输出 7.5 保持输出的顺序 7.6 小结 第8章 管理Hadoop 8.1 为实际应用设置特定参数值 8.2 系统体检 8.3 权限设置 8.4 配额管理 8.5 启用回收站 8.6 删减...

    【容器系统】之大数据容器化-基于Kubernetes构建现代大数据系统.pdf

    任务执⾏完成后,Executor Pod会被销毁, ⽽Driver Pod会持久化相关⽇志,并保持在'completed'状态,直到⽤户⼿清理或被K8s集群的 垃圾回收机制回收. Spark原⽣⽀持K8s的好处也是很明显的:可以更好的利⽤K8s的集群资源...

    王者荣耀java源码-TechnicalArticles:技术文章

    讨论垃圾回收器ZGC 架构 数据库业务设计 大数据 小米HDFS设计 大数据 分析数据增长 测试 自研AB测试系统 JVM 堆外缓存实例 NFS NFS Soket 游戏层面讨论SOKET 搜索 Elasticsearch 大数据 NLP语言处理呼叫中心录音 JVM...

    Hadoop实战

    1518.5 启用回收站 1528.6 删减DataNode 1528.7 增加DataNode 1538.8 管理NameNode和SNN 1538.9 恢复失效的NameNode 1558.10 感知网络布局和机架的设计 1568.11 多用户作业的调度 1578.11.1 多个JobTracker 1588.11....

    Hadoop实战(陆嘉恒)译

    管理Hadoop8.1 为实际应用设置特定参数值8.2 系统体检8.3 权限设置8.4 配额管理8.5 启用回收站8.6 删减DataNode8.7 增加DataNode8.8 管理NameNode 和SNN8.9 恢复失效的NameNode8.10 感知网络布局和机架的设计8.11 多...

    elastic-compose

    项目基于k8s与docker基础上, 实现动态节点计算功能, 可随时增减计算节点,用于外部任务计算, 可利用服务器或个人的电脑空闲资源再利用,二次回收,使其变废为宝,提供共享充足的计算资源. 由于涉及程序入口, 计算容器及...

    大数据-Inceptor技术白皮书.pdf

    稳定性:由于代码质量问题,Spark长时间运行会经常出错,在架构方面,由于大量数据被缓存在内存中, Java垃圾回收缓慢的现象严重,导致Spark的性能不稳定,在复杂场景SQL的性能甚至不如现有Map/Reduce。 不能处理...

    Hadoop实战中文版.PDF

    1387.4 以数据库作为输入输出 1437.5 保持输出的顺序 1457.6 小结 146第8章 管理Hadoop 1478.1 为实际应用设置特定参数值 1478.2 系统体检 1498.3 权限设置 1518.4 配额管理 1518.5 启用回收站 ...

    网站架构技术

    站内搜索 lucene nutch 分词器 no-sql库 mongodb hadoop 业务拆分 web service restful 分布式服务 大型网站架构演化的价值观 核心价值:随网站所需灵活应对 驱动力量:...

Global site tag (gtag.js) - Google Analytics