一文搞懂Hadoop Archive

【概述】


在HDFS存储体系中,可存储的文件数量受限于NN的内存大小。因为在NN内存中,存储了所有文件的block信息。

因此,对于大量小文件问题,可通过联邦(Federation)和归档(Archive)来解决。

联邦是通过在集群中增加NN,不同的NN位于不同的命名空间,从而增大了内存空间,使其可以存储更多的文件。

而归档则是将一部分小文件打包到一个或多个大文件中,减少小文件的block数,达到存储更多文件的目的。

本文就来聊聊归档的相关知识。

【归档的使用】


从官方文档中可以了解到,归档文件是一个特殊格式的文件,并且具有".har"的扩展名

通过如下命令可以对指定目录进行归档

hadoop archive -archiveName name -p <parent> [-r <replication factor>] <src>* <dest>

# -archiveName name: 指定归档文件的名称(带.har扩展名)
# -p <parent>: 指定一个或多个待归档目录的(共同)父目录
# <src>: 指定一个或多个待归档的目录,注意:这里实际填写的是相对上面父目录的相对路径
# <dst>: 指定归档文件的存放路径
# -r <replication factor>: 指定归档文件的副本数

例如:对/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文件中的起始偏移位置,原始文件的大小,以及文件的相关属性。

索引文件内容以文本格式存储,具体格式如下图所示:

e20cd42c8d5c7d998a81a5c257dd4890.png

这里有几点要说明:

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命令对目录文件进行归档,同时通过分析归档文件的组成及其格式,以及如何产生的,来解释归档是如何做到处理大量小文件问题的。

好了,本文就介绍到这里,原创不易,点赞,在看,分享是最好的支持, 谢谢~

2a81fab80ebc3432665fedb5a1885897.png

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值