【郑州校区】大数据离线阶段Day9之Hoop Archivesad HDFS并不擅长存储小文件,因为每个文件最少一个block,每个block的元数据都会在NameNode占用内存,如果存在大量的小文件,它们会吃掉NameNode节点的大量内存。 Hadoop Archives可以有效的处理以上问题,它可以把多个文件归档成为一个文件,归档成一个文件后还可以透明的访问每一个文件。 1. 使用方法1.1. 如何创建Archives(档案)Usage: hadoop archive -archiveName name -p <parent> <src>* <dest> 其中-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 2. Archive注意事项1. Hadoop archives是特殊的档案格式。一个Hadoop archive对应一个文件系统目录。Hadoop archive的扩展名是*.har; 2. 创建archives本质是运行一个Map/Reduce任务,所以应该在Hadoop集群上运行创建档案的命令; 3. 创建archive文件要消耗和原文件一样多的硬盘空间; 4. archive文件不支持压缩,尽管archive文件看起来像已经被压缩过; 5. archive文件一旦创建就无法改变,要修改的话,需要创建新的archive文件。事实上,一般不会再对存档后的文件进行修改,因为它们是定期存档的,比如每周或每日; 6. 当创建archive时,源文件不会被更改或删除; 7. 虽然HAR文件可以作为MR的输入,但是由于InputFormat类并不知道文件已经存档,所以即使在HAR文件里处理许多小文件,仍然低效。 传智播客·黑马程序员郑州校区地址 河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
|