Hadoop归档文件是一种特殊格式的存档。一个Hadoop归档对应一个文件系统目录。Hadoop归档文件总是以*.har为扩展名。Hadoop归档目录包含元数据文件(以_index和_masterindex形式存在)和数据文件(part-*)。_index文件包含了归档内各文件的名称以及在part文件中的位置信息。
Usage: hadoop archive -archiveName name -p
-archiveName 是您想要创建的归档文件的名称。例如可以是 foo.har。名称应带有 *.har 扩展名。parent 参数用于指定文件应归档到的相对路径。示例如下:
-p /foo/bar a/b/c e/f/g
这里 /foo/bar 是父路径,而 a/b/c 和 e/f/g 是相对于父路径的相对路径。请注意,这是一个创建归档文件的 Map/Reduce 作业。您需要一个 map reduce 集群来运行此作业。详细示例请参阅后续章节。
-r 表示期望的副本因子;如果未指定此可选参数,则将使用默认的副本因子3。
如果您只想归档单个目录 /foo/bar,那么可以直接使用
hadoop archive -archiveName zoo.har -p /foo/bar -r 3 /outputdir
如果您指定的源文件位于加密区域,它们将被解密并写入归档文件。如果har文件不在加密区域内,则文件将以明文(解密)形式存储。如果har文件位于加密区域内,则文件将以加密形式存储。
归档文件以文件系统层的形式呈现。因此,归档中的所有文件系统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能够将归档文件中的所有逻辑输入文件用作输入。