Hadoop archives是一种特殊格式的归档,一个归档往往映射到文件系统的目录,一个Hadoop archive通常是*.har的扩展文件。其映射的目录里面存放着元数据(形式如:_index, _masterindex)和数据(part-*)文件。_index文件指定了归档内各个分块文件的文件名和存放地址。
1. 创建归档
hadoop archive -archiveName name -p <parent> [-r <replication factor>] <src>* <dest>
-archiveName指定创建归档的名称,如:foo.har,也就是说需要在归档名称后面添加一个*.har的扩展
-p 指定需归档的文件的相对路径,如:-p /foo/bar a/b/c e/f/g,/foo/bar是根目录,a/b/c,e/f/g是相对根目录的相对路径
-r 指定所需的复制因子,如果未被指定,默认为3
如果仅仅是想要归档一个单纯的/foo/bar目录,可以这样使用:
hadoop archive -archiveName zoo.har -p /foo/bar -r 3 /outputdir
如果指定了位于加密区域中的源文件,他们将被解密,然后被写入归档。如果har文件不在加密区域中,则它将以明文存储。
2. 查看归档中的文件
归档对外的身份是文件系统层,所以只需更换为操作归档的URI,就可以使用fs的shell命令。此外,需要注意的是,归档是不可变的,所以,名称更换,删除和创建等操作均会产生错误,归档的URI形如:
har://scheme-hostname:port/archivepath/fileinarchive
如果没有提供scheme,则URI形如:
har:///archivepath/fileinarchive
3. 反归档
类比于归档操作的fs shell命令,反归档要解决的仅为将归档文件复制到hdfs的问题
# 逐个反归档
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
4. 删除归档
删除har文件必须使用rmr命令,不能使用rm命令。
hdfs dfs -rmr /outputdir/part-00000.har
5.归档与MapReduce
在MapReduce中使用Hadoop归档文件,就像指定一个不同于默认文件系统的输入文件系统一样简单。假设有一个归档,存储在HDFS在/user/zoo/foo。然后为了使用MapReduce输入这个归档文件,可以指定输入目录为har:///user/zoo/foo.har。由于Hadoop Archives对外表现为一个文件系统,MapReduce将能够使用Hadoop Archives中的所有逻辑输入文件作为输入。