Hadoop存档是特殊格式的存档。Hadoop归档文件映射到文件系统目录。Hadoop归档文件始终具有* .har扩展名。Hadoop存档目录包含元数据(以_index和_masterindex的形式)和数据(part- *)文件。_index文件包含作为存档一部分的文件的名称以及该部分文件中的位置。
用法:hadoop存档-archiveName名称-p <parent> [-r <复制因子>] <src> * <dest>
-archiveName是您要创建的档案的名称。例如foo.har。名称应带有* .har扩展名。parent参数用于指定文件应归档到的相对路径。例如:
-p / foo / bar a / b / ce / f / g
/ foo / bar是父路径,而a / b / c,e / f / g是父路径。请注意,这是一个创建存档的Map / Reduce作业。您将需要一个map reduce集群来运行它。有关详细示例,请参见后面的部分。
-r表示所需的复制因子;如果未指定此可选参数,则将使用3的复制因子。
如果您只想归档一个目录/ foo / bar,则可以使用
hadoop存档-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存档-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存档-archiveName foo.har -p / user / hadoop dir1 dir2 / user / zoo
如果我们将命令更改为:
hadoop存档-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存档就像指定一个不同于默认文件系统的输入文件系统一样容易。如果您有一个hadoop存档存储在/user/zoo/foo.har的HDFS中,则为了将此存档用于MapReduce输入,您所需要做的就是将输入目录指定为har:///user/zoo/foo.har。由于Hadoop存档是作为文件系统公开的,因此MapReduce将能够使用Hadoop存档中的所有逻辑输入文件作为输入。