1.Hadoop归档文件
每个文件以块方式存储,块的元数据存储在名称节点的内存里,此时存储一些小的文件,HDFS会比较低效。因此,大量的小文件会耗尽名称节点的大部分内存(注意,相较于存储文件原始内容所需要的磁盘空间,小文件所需要的空间不会更多。例如,一个1MB的文件以大小为128MB的块存储,使用的是1MB的磁盘空间,而不是128MB)。
Hadoop Archives或HAR文件,是一个更高效地将文件放入HDFS块中的文件存档设备,在减少名称节点内存使用的同时,仍然允许对文件进行透明地访问。具体说来,Hadoop Ar-chives可以被用作MapReduce的输入。
2.使用Hadoop Archives
Hadoop Archives通过使用archive工具根据一个文件集合创建而来。这些工具运行一个MapReduce作业来并行处理输入文件,因此我们需要一个MapReduce集群去运行使用它。HDFS中有一些我们希望归档的文件:hadoop fs-lsr/my/files,即
% hadoop fs-lsr/my/files
-rw-r--r-- 1 tom supergroup 1 2009-04-09 19∶13
/my/files/a
drwxr-xr-x -tom supergroup 0 2009-04-09 19∶13
/my/files/dir
-rw-r--r-- 1 tom supergroup 1 2009-04-09 19∶13
/my/files/dir/b
现在我们可以运行archive指令:hadoop archive-archiveName files.har/my/files/my。
第一个选项是归档文件名称,这里是file.har。HAR文件总是有一个.har扩展名,这是必需的,具体理由将在后面描述。接下来把文件放入归档文件。这里只归档一个源树,即HDFS下/my/files中的文件,但事实上,该工具接受多个源树。最后一个参数是HAR文件的输出目录。下面看看这个归档文件是怎么创建的:hadoop fs-ls/my,即
% hadoop fs -ls/my
Found 2 items
Hadoop fs-ls/my/files.har,即
drwxr-xr-x -tom supergroup 0 2009-04-09 19∶13/my/files
drwxr-xr-x -tom supergroup 0 2009-04-09 19∶13
/my/files.har
%hadoop fs-ls/my/files.har
Found 3 items
-rw-r--r-- 10 tom supergroup 165 2009-04-09 19∶13
/my/files.har/_index
-rw-r--r-- 10 tom supergroup 23 2009-04-09 19∶13(www.xing528.com)
/my/files.har/_masterindex
-rw-r--r-- 1 tom supergroup 22 009-04-09 19∶13
/my/files.har/part-0
这个目录列表展示了一个HAR文件的组成部分:两个索引文件和部分文件的集合(本例中只有一个)。这些部分文件包括已经链接在一起的大量原始文件的内容,并且索引使我们可以查找那些包含归档文件的部分文件,包括它的起始点和长度。但所有这些细节对于使用har URI方案与HAR文件交互的应用都是隐藏的,HAR文件系统是建立在基础文件系统上的(本例中是HDFS)。以下命令以递归方式列出了归档文件中的文件:hadoop fs-lsr har:///my/files.har,即
% hadoop fs-lsr har:///my/files.har
drw-r--r-- -tom supergroup 0 2009-04-09 19∶13
/my/files.har/my
drw-r--r-- -tom supergroup 0 2009-04-09 19∶13
/my/files.har/my/files
rw-r--r-- 10 tom supergroup 1 2009-04-09 19∶13
/my/files.har/my/files/a
drw-r--r-- -tom supergroup 0 2009-04-09 19∶13
/my/files.har/my/files/dir
-rw-r--r-- 10 tom supergroup 1 2009-04-09 19∶13
/my/files.har/my/files/dir/b
如果HAR文件所在的文件系统是默认的文件系统,这就非常直观易懂。但如果想使用在其他文件系统中的HAR文件,就需要使用一个不同于正常情况的URI路径格式。以下两个指令作用相同,例如:
%hadoop fs-lsr har:///my/files.har/my/files/dir
%hadoop fs-lsr har://hdfs-localhost:8020/my/files.har/my/files/dir
注意第二个格式,仍以har方案表示一个HAR文件系统,但是是由hdfs指定基础的文件系统方案,后面加上一个横杠和HDFS host(localhost)和端口(8020)。现在算是明白为什么HAR文件必须要有.har扩展名了。通过查看权限和路径及.har扩展名的组成HAR文件系统将har URI转换成为一个基础文件系统的URI。在本例中是hdfs:/localhost:8020/user/tom/files.har。路径的剩余部分是文件在归档文件中的路径:/user/tom/files/dir。
要想删除一个HAR文件,需要使用删除的递归格式,因为对于基础文件系统来说,HAR文件是一个目录:hadoop fs-rmr/my/files.har。
3.不足
对于HAR文件,还需要了解它的一些不足。创建一个归档文件会创建原始文件的一个副本,因此需要与要归档(尽管创建了归档文件后可以删除原始文件)的文件同样大小的磁盘空间。虽然归档的文件能被压缩(HAR文件在这方面像tar文件),但是目前还不支持档案压缩。
一旦创建,archives便不可改变。要增加或移除文件必须新创建归档文件。事实上,这对那些写后便不能改的文件来说不是问题,因为它们可以定期成批归档,比如每日或每周。如前所述,HAR文件可以用作MapReduce的输入。然而,没有归档InputFormat可以打包多个文件到一个单一的MapReduce,所以即使在HAR文件中处理许多小文件,也仍然低效。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。