Hadoop Archives档案

HDFS 并不擅长存储小文件,因为每个文件最少一个 block,每个 block 的元数据都会在 NameNode 占用内存,如果存在大量的小文件,它们会吃掉NameNode 节点的大量内存。

Hadoop Archives 可以有效的处理以上问题,它可以把多个文件归档成为一个文件,归档成一个文件后还可以透明的访问每一个文件。

使用方法

创建 Archives(档案)

Usage: hadoop archive -archiveName name -p <parent> <src>* <dest>

  其中-archiveName 是指要创建的存档的名称。比如 test.har,archive 的名字的扩展名应该是*.har。 -p 参数指定文件存档文件(src)的相对路径。

  举个例子:-p /foo/bar a/b/c e/f/g

  这里的/foo/bar 是 a/b/c 与 e/f/g 的父路径,所以完整路径为/foo/bar/a/b/c 与/foo/bar/e/f/g

  例如:如果你只想存档一个目录/input 下的所有文件:

hadoop archive -archiveName test.har –p /input /outputdir

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

查看 Archives

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

hadoop fs -ls /outputdir/test.har

  这里可以看到 har 文件包括:两个索引文件,多个 part 文件(本例只有一个)以及一个标识成功与否的文件。part 文件是多个原文件的集合,根据index 文件去找到原文件。

  例如上述的三个小文件 1.txt 2.txt 3.txt 内容分别为 1,2,3。进行archive 操作之后,三个小文件就归档到 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 去访问的话,索引、标识等文件就会隐藏起来,只显示创建档案之前的原文件:

解压 Archives

  按顺序解压存档(串行):

hadoop fs -cp har:///user/zoo/foo.har/dir1 hdfs:/user/zoo/newdir

  要并行解压存档,请使用 DistCp:

hadoop distcp har:///user/zoo/foo.har/dir1 hdfs:/user/zoo/newdir

har文档结构

Archive 注意事项

  1. Hadoop archives 是特殊的档案格式。一个 Hadoop archive 对应一个文件系统目录。Hadoop archive 的扩展名是*.har;

  2. 创建 archives 本质是运行一个 Map/Reduce 任务,所以应该在 Hadoop集群上运行创建档案的命令;

  3. 创建 archive 文件要消耗和原文件一样多的硬盘空间;

  4. archive 文件不支持压缩,尽管 archive 文件看起来像已经被压缩过;

  5. archive 文件一旦创建就无法改变,要修改的话,需要创建新的archive 文件。事实上,一般不会再对存档后的文件进行修改,因为它们是定期存档的,比如每周或每日;

  6. 当创建 archive 时,源文件不会被更改或删除;

  7. 虽然 HAR 文件可以作为 MR 的输入,但是由于 InputFormat 类并不知道文件已经存档,所以即使在 HAR 文件里处理许多小文件,仍然低效。

原文地址:https://www.cnblogs.com/jifengblog/p/9306013.html