4.3 HadoopArchives
HDFS 并不擅长存储小文件,因为每个文件最少一个 block,每个 block 的 元数据都会在 NameNode 占用内存,如果存在 大量的小文件,它们会吃掉NameNode 节点的大量内存 。
Hadoop Archives 可以有效的处理以上问题,它 可以把多个文件归档成为 一个文件,归档成一个文件后还可以透明的访问每一个文件。
- 使用方法
1.1. 如何创建 Archives(档案)
Usage: hadoop archive -archiveName name -p
其中-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 的存档文件。
1.2. 如何查看 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 去访问的话,索引、标识等文件就会隐藏起来,只显示创建 档案之前的原文件:
1.3. 如何解压 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
Archive 注意事项
- Hadoop archives 是特殊的档案格式。一个 Hadoop archive 对应一个文 件系统目录。Hadoop archive 的扩展名是*.har;
- 创建 archives 本质是运行一个 Map/Reduce 任务,所以应该在Hadoop集群上运行创建档案的命令;
创建archive文件要消耗和原文件一样多的硬盘空间;
archive文件不支持压缩,尽管archive文件看起来像已经被压缩过;
archive 文件一旦创建就无法改变,要修改的话,需要创建新的 archive 文件。事实上,一般不会再对存档后的文件进行修改,因为它们是定期存档的,比如每周或每日;
当创建 archive 时,源文件不会被更改或删除;