hdfs的归档-archive

HDFS并不擅长存储小文件,因为每个文件最少一个block,每个block的元数据都会在NameNode占用内存,如果存在大量的小文件,它们会吃掉NameNode节点的大量内存。
Hadoop Archives可以有效的处理以上问题,它可以把多个文件归档成为一个文件,归档成一个文件后还可以透明的访问每一个文件。

1.如何创建Archive

hadoop archive -archiveName name -p <parent> <src>* <dest>
  • 其中-archiveName是指要创建的存档的名称。比如test.har,archive的名字的扩展名应该是*.har。 -p参数指定文件存档文件(src)的相对路径。
    例如:如果你只想存档一个目录/config下的所有文件:
hadoop archive -archiveName test.har -p /config /outputdir

这样就会在/outputdir目录下创建一个名为test.har的存档文件。

2.如何查看Archive

首先我们来看下创建好的har文件。使用如下的命令:

hadoop fs -ls /outputdir/test.har

这里可以看到har文件包括:两个索引文件,多个part文件(本例只有一个)以及一个标识成功与否的文件。part文件是多个原文件的集合,根据index文件去找到原文件。
例如上述的/input目录下有很多小的xml文件。进行archive操作之后,这些小文件就归档到test.har里的part-0一个文件里。

hadoop fs -cat /outputdir/test.har/part-0

archive作为文件系统层暴露给外界。

所以所有的fs shell命令都能在archive上运行,但是要使用不同的URI。

Hadoop Archives的URI是:

har://scheme-hostname:port/archivepath/fileinarchive   

scheme-hostname格式为hdfs-域名:端口,如果没有提供scheme-hostname,它会使用默认的文件系统。这种情况下URI是这种形式:

har:///archivepath/fileinarchive   

如果用har uri去访问的话,索引、标识等文件就会隐藏起来,只显示创建档案之前的原文件:
查看归档文件中的小文件,使用har uri

hadoop fs -ls har://hdfs-node1:8020/outputdir/test.har

查看归档文件中的小文件,不使用har uri

hadoop fs -ls har:///outputdir/test.har 

查看har归档文件中小文件的内容

hadoop fs -cat har:///outputdir/test.har/core-site.xml

3.如何解压Archive

hadoop fs -mkdir /config2
hadoop fs -cp har:///outputdir/test.har/*    /config2

查看HDFS页面,发现/config2目录中已经有解压后的小文件了

4.Archive注意事项

  • 1.Hadoop archives是特殊的档案格式。一个Hadoop archive对应一个文件系统目录。Hadoop archive的扩展名是*.har;
  • 2.创建archives本质是运行一个Map/Reduce任务,所以应该在Hadoop集群上运行创建档案的命令,要提前启动Yarn集群;
  • 3.创建archive文件要消耗和原文件一样多的硬盘空间;
  • 4.archive文件不支持压缩,尽管archive文件看起来像已经被压缩过;
  • 5.archive文件一旦创建就无法改变,要修改的话,需要创建新的archive文件。事实上,一般不会再对存档后的文件进行修改,因为它们是定期存档的,比如每周或每日;
  • 6.当创建archive时,源文件不会被更改或删除;

5 java api操作

FileSystem fileSystem = FileSystem.get(new URI("hdfs://node1:8020"), new Configuration());
       HarFileSystem harFileSystem = new HarFileSystem(fileSystem);
        harFileSystem.initialize(new URI("har://hdfs-node1:/output/archive/config.har"), new Configuration());
        FileStatus[] iterator = harFileSystem.listStatus(new Path("/part-0"));
        for (FileStatus fileStatus : iterator) {
            System.out.println(fileStatus.getPath());
        }

        fileSystem.close();
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小手追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值