Hadoop 归档是特殊格式的归档。Hadoop 归档映射到文件系统目录。Hadoop 归档始终具有 *.har 扩展名。Hadoop 归档目录包含元数据(以 _index 和 _masterindex 的形式)和数据(part-)文件。_index 文件包含作为归档一部分的文件的名称以及在 part 文件中的位置。
用法:hadoop archive -archiveName name -p <parent> [-r <replication factor>] <src>* <dest>
-archiveName 是您要创建的归档的名称。一个示例是 foo.har。该名称应具有 *.har 扩展名。父参数用于指定应将文件归档到的相对路径。示例为
-p /foo/bar a/b/c e/f/g
此处 /foo/bar 是父路径,a/b/c、e/f/g 是相对于父的相对路径。请注意,这是一个创建归档的 Map/Reduce 作业。您需要一个 MapReduce 集群来运行此作业。有关详细示例,请参阅后面的部分。
-r 指示所需的复制因子;如果未指定此可选参数,将使用复制因子 3。
如果您只想归档单个目录 /foo/bar,则只需使用
hadoop archive -archiveName zoo.har -p /foo/bar -r 3 /outputdir
如果您指定了位于加密区域中的源文件,则这些文件将被解密并写入归档文件。如果 har 文件未位于加密区域中,则它们将以明文(已解密)形式存储。如果 har 文件位于加密区域中,则它们将以加密形式存储。
归档文件将自身显示为文件系统层。因此,归档文件中的所有 fs shell 命令都可以使用,但 URI 不同。此外,请注意归档文件是不可变的。因此,重命名、删除和创建操作将返回错误。Hadoop 归档文件的 URI 为
har://scheme-hostname:port/archivepath/fileinarchive
如果未提供方案,则假定为底层文件系统。在这种情况下,URI 将如下所示
har:///archivepath/fileinarchive
由于归档文件中的所有 fs shell 命令都可以透明地使用,因此解压缩只是复制的问题。
顺序解压缩
hdfs dfs -cp har:///user/zoo/foo.har/dir1 hdfs:/user/zoo/newdir
并行解压缩,请使用 DistCp
hadoop distcp har:///user/zoo/foo.har/dir1 hdfs:/user/zoo/newdir
hadoop archive -archiveName foo.har -p /user/hadoop -r 3 dir1 dir2 /user/zoo
上述示例使用 /user/hadoop 作为相对归档目录来创建归档文件。目录 /user/hadoop/dir1 和 /user/hadoop/dir2 将归档到以下文件系统目录中 – /user/zoo/foo.har。归档不会删除输入文件。如果您想在创建归档文件后删除输入文件(以减少命名空间),则必须自己执行此操作。在此示例中,由于指定了 -r 3
,因此将使用复制因子 3。
在 Hadoop 归档文件中查找文件就像在文件系统上执行 ls 一样简单。在您将目录 /user/hadoop/dir1 和 /user/hadoop/dir2 归档如上例所示之后,要查看归档文件中的所有文件,您只需运行
hdfs dfs -ls -R har:///user/zoo/foo.har/
为了理解 -p 参数的重要性,让我们再次浏览上述示例。如果您仅使用以下命令对 Hadoop 归档文件执行 ls(而非 lsr)
hdfs dfs -ls har:///user/zoo/foo.har
输出应为
har:///user/zoo/foo.har/dir1 har:///user/zoo/foo.har/dir2
正如您所记得的,归档文件是使用以下命令创建的
hadoop archive -archiveName foo.har -p /user/hadoop dir1 dir2 /user/zoo
如果我们要将命令更改为
hadoop archive -archiveName foo.har -p /user/ hadoop/dir1 hadoop/dir2 /user/zoo
那么使用以下命令对 hadoop 存档执行 ls
hdfs dfs -ls har:///user/zoo/foo.har
会得到
har:///user/zoo/foo.har/hadoop/dir1 har:///user/zoo/foo.har/hadoop/dir2
请注意,已归档的文件已相对于 /user/ 而不是 /user/hadoop 归档。
在 MapReduce 中使用 Hadoop 存档与指定与默认文件系统不同的输入文件系统一样简单。如果你在 HDFS 中的 /user/zoo/foo.har 中存储了一个 hadoop 存档,那么要将此存档用于 MapReduce 输入,你只需要将输入目录指定为 har:///user/zoo/foo.har。由于 Hadoop 存档作为文件系统公开,因此 MapReduce 将能够使用 Hadoop 存档中的所有逻辑输入文件作为输入。