【概述】
在HDFS存储体系中,可存储的文件数量受限于NN的内存大小。因为在NN内存中,存储了所有文件的block信息。
因此,对于大量小文件问题,可通过联邦(Federation)和归档(Archive)来解决。
联邦是通过在集群中增加NN,不同的NN位于不同的命名空间,从而增大了内存空间,使其可以存储更多的文件。
而归档则是将一部分小文件打包到一个或多个大文件中,减少小文件的block数,达到存储更多文件的目的。
本文就来聊聊归档的相关知识。
【归档的使用】
从官方文档中可以了解到,归档文件是一个特殊格式的文件,并且具有".har"的扩展名
通过如下命令可以对指定目录进行归档
hadoop archive -archiveName name -p [-r ] *
# -archiveName name: 指定归档文件的名称(带.har扩展名)
# -p : 指定一个或多个待归档目录的(共同)父目录
# : 指定一个或多个待归档的目录,注意:这里实际填写的是相对上面父目录的相对路径
# : 指定归档文件的存放路径
# -r : 指定归档文件的副本数
例如:对/hncscwc目录下的config、tar、sbin三个目录进行归档,归档文件存放到/test/har目录下,归档文件的名称为demo.har,对应命令如下所示:
hadoop archive -archiveName demo.har -p /hncscwc config tar sbin /test/har
执行完上面的命令后,就已经完成对指定目录进行归档了。
由于归档文件本身是对HDFS文件系统目录进行映射,即可以理解为是一个抽象的文件系统。因此,对文件查看对相关命令仍旧可以使用,只不过文件的URL有变化,具体为:
har:///schema-hostname:port/archivePath/archiveFile
# 通常不需要指定schema-hostname:port,因此可以简化为
har:///archivePath/archiveFile
例如:查看上面归档后的文件
hdfs dfs -ls har:///test/har/demo.har/
Found 3 items
drwxr-xr-x - root supergroup 0 2021-11-05 15:46 har:///test/har/demo.har/config
drwxr-xr-x - root supergroup 0 2021-11-05 15:45 har:///test/har/demo.har/sbin
drwxr-xr-x - root supergroup 0 2021-11-05 15:44 har:///test/har/demo.har/tar
# 近一步查看 tar 目录下的内容
hdfs dfs -ls har:///test/har/demo.har/tar
Found 10 items
-rw-r--r-- 3 root supergroup 334692032 2021-11-05 11:01 har:///test/har/demo.har/tar/rancheretcd.tar
-rw-r--r-- 3 root supergroup 154733056 2021-11-05 11:01 har:///test/har/demo.har/tar/ranchergrana.tar
-rw-r--r-- 3 root supergroup 1867114496 2021-11-05 11:03 har:///test/har/demo.har/tar/rancherk8s.tar
-rw-r--r-- 3 root supergroup 343598080 2021-11-05 11:02 har:///test/har/demo.har/tar/rancherk8sagent.tar
-rw-r--r-- 3 root supergroup 302129664 2021-11-05 11:02 har:///test/har/demo.har/tar/rancherk8sauto.tar
-rw-r--r-- 3 root supergroup 122310656 2021-11-05 11:02 har:///test/har/demo.har/tar/rancherk8sdashboard.tar
-rw-r--r-- 3 root supergroup 249991168 2021-11-05 11:03 har:///test/har/demo.har/tar/rancherk8ssetchost.tar
-rw-r--r-- 3 root supergroup 490426368 2021-11-05 11:12 har:///test/har/demo.har/tar/rancherkubectld.tar
-rw-r--r-- 3 root supergroup 502795776 2021-11-05 11:12 har:///test/har/demo.har/tar/rancherlbserver.tar
-rw-r--r-- 3 root supergroup 1103052800 2021-11-05 11:14 har:///test/har/demo.har/tar/rancherserver.tar
【归档文件】
在深入归档原理之前,首先来看下归档文件具体都包括哪些文件,这些文件里面又分别写了些什么内容。
归档文件在hdfs中实际上是以一个目录形式存在的,在该目录下又包含了多个文件,这些文件可以分为两类:一类是元数据文件,通常又称为索引文件;一类是数据文件,也就是待归档目录下文件的真实数据。
通过命令查看上面归档后的文件(demo.har)
hdfs dfs -ls /test/har/demo.har
Found 6 items
-rw-r--r-- 3 root supergroup 0 2021-11-05 15:50 /test/har/demo.har/_SUCCESS
-rw-r--r-- 3 root supergroup 3937 2021-11-05 15:50 /test/har/demo.har/_index
-rw-r--r-- 3 root supergroup 24 2021-11-05 15:50 /test/har/demo.har/_masterindex
-rw-r--r-- 3 root supergroup 1103092478 2021-11-05 15:49 /test/har/demo.har/part-0
-rw-r--r-- 3 root supergroup 2701957824 2021-11-05 15:49 /test/har/demo.har/part-1
-rw-r--r-- 3 root supergroup 1667653632 2021-11-05 15:49 /test/har/demo.har/part-2
(1)_index文件
待归档文件的索引信息,该文件只有1个,里面存储了原始文件的相关信息,例如文件的路径,存储在哪个part数据文件中,在part文件中的起始偏移位置,原始文件的大小,以及文件的相关属性。
索引文件内容以文本格式存储,具体格式如下图所示:
这里有几点要说明:
1. index文件中以行为单位记录每个目录、文件的信息。即每个信息都单独写一行。
2. 每行中的各个部分都以空格来分隔
3. 目录/文件路径以UTF-8格式写入,因此"/"会转义为%2F
4. 目录的标示固定为"dir",文件的标示固定为"file"
5. 由于目录并未真实写入到part数据文件中,因此没有写入的part文件名,同样,在part文件中的起始偏移,文件长度均固定为0
6. 目录信息中会记录该目录下的文件列表
7. 属性信息由最后修改时间、权限转换后的整数、文件所属的用户、文件所属的用户组这几个部分组成,中间以"+"相连。
实际例子如下所示:
%2F dir 1636098388324+493+root+supergroup 0 0 sbin tar config
%2Ftar dir 1636098266576+493+root+supergroup 0 0 rancheretcd.tar ranchergrana.tar rancherk8s.tar rancherk8sagent.tar rancherk8sauto.tarrancherk8sdashboard.tar rancherk8ssetchost.tar rancherkubectld.tar rancherlbserver.tar rancherserver.tar
%2Fsbin%2Fmapred-env.sh file part-0 1103062411 1383 1636078798378+420+root+supergroup
%2Ftar%2Francherserver.tar file part-0 0 1103052800 1636082069207+420+root+supergroup
#... 省略 ...
(2)_masterindex
该文件的格式就比较简单,记录index文件的索引信息。
同样以行为单位,以文本形式写入;在index文件中每1000行信息,在该文件中记录为一行。
文件的首行为版本信息,随后的每一行均为索引信息。
每一行索引信息又由四部分组成,起始索引、结束索引、在index文件中的起始偏移位置,在index文件中的结束偏移位置。
例如:上面归档文件中_masterindex文件内容为:
cat _masterindex
3
0 2108565014 0 3937
(3)part-$N
从0开始的一个或多个数据文件,即原始待归档的文件内容依次写入了数据文件中。
【原理】
从上面讲到的归档文件及其格式中可以看出,归档实际上是将多个小文件写入到一个大文件中,并构造相应的索引文件记录文件属性,层级关系等。
归档命令具体是通过MR任务来完成的,其中有一个或多个map任务,具体个数根据待归档目录文件的总大小决定。每个map任务负责将一部分待归档的文件写入到数据文件(part)中,同时将归档文件写入的数据文件名,在数据文件中的起始偏移位置,文件长度等信息汇总给reduce任务。
仅有的一个reduce任务,则将上述归档的文件信息,目录信息写入到_index,_masterindex文件中。
注意:归档命令执行完成后,其原始文件仍旧还在,需要手动删除才能真正做到释放小文件在NN中对应存储的block信息。另外,由于小文件的内容被打包写入到了数据文件中,因此磁盘空间并没有因此减少,相反还增加了索引文件(��索引文件长度一般都比不大)。
【总结】
小结一下,本文主要讲述了如何使用archive命令对目录文件进行归档,同时通过分析归档文件的组成及其格式,以及如何产生的,来解释归档是如何做到处理大量小文件问题的。