HDFS 并不擅长存储小文件,因为每个文件最少一个 block,每个 block 的元数据都会在 NameNode 占用内存,如果存在大量的小文件,它们会吃掉 NameNode 节点的大量内存。

Hadoop Archives 可以有效的处理以上问题,它可以把多个文件归档成为一个文件,归档成一个文件后还可以透明的访问每一个文件。


数据准备:

1、创建目录

hdfs dfs -mkdir /input

2、在本机创建多个文件

vi 1.txt

vi 2.txt

vi 3.txt

vi 4.txt

1.txt内容如下:

1

2.txt内容如下:

2

3.txt内容如下:

3

4.txt内容如下:

4

5、将1.txt、2.txt、3.txt、4.txt文件上传到集群/input目录下

hdfs dfs -put *.txt /input

Archive创建:

语法:
hadoop archive -archiveName name -p <parent> <src>* <dest>
  • -archiveName 是指要创建的存档的名称。比如 test.har,archive 的名字的扩展名应该是 *.har

  • -p 参数指定文件存档文件(src)的相对路径

案例1:将 /input 路径下的所有小文件归档

hadoop archive -archiveName test.har -p /input  /output

Archive 归档是通过 MapReduce 程序完成的,需要启动 Yarn 集群

归档文件查看:

语法:

hadoop fs -ls path
案例1:查看归档文件
hadoop fs -ls /output/test.har


test.har 文件包括:两个索引文件,多个 part 文件(本例只有一个)以及一个标识成功与否的文件。part 文件是多个原文件的集合, 通过 index 文件可以去找到原文件。

案例2:查看归档中数据汇总文件

hadoop fs -cat /output/test.har/part-0


归档协议访问:

在查看 har 文件的时候,如果没有指定访问协议,默认使用的就是 hdfs://,此时所能看到的就是归档之后的样子。Archive 还提供了自己的 har uri 访问协议。如果用 har uri 去访问的话,索引、标识等文件就会隐藏起来,只显示创建档案之前的原文件:

Hadoop Archives 的 URI 是:

har://scheme-hostname:port/archivepath/fileinarchive   
  • scheme-hostname格式为hdfs-域名:端口

案例1:基于归档协议访问归档文件

hadoop fs -ls har://hdfs-192.168.174.136:9000/output/test.har/

hadoop fs -ls har:///output/test.har/


案例2:查看归档下的具体某个文件

hadoop fs -cat har:///output/test.har/1.txt


归档提取:

案例1:按顺序解压存档(串行)

hadoop fs -cp har:///output/test.har/*  hdfs:/user/briup
案例2:并行解压存档,使用DistCp,对应大的归档文件可以提高效率
hadoop distcp  har:///output/test.har/*  hdfs:/user/briup

归档注意事项:

  • Hadoop archives 是特殊的档案格式。一个 Hadoop archive 对应一个文件系统目录。Hadoop archive 的扩展名是 *.har

  • 创建 archives 本质是运行一个 Map/Reduce 任务,所以应该在 Hadoop 集群上运行创建档案的命令

  • 创建 archive 文件要消耗和原文件一样多的硬盘空间

  • archive 文件不支持压缩,尽管 archive 文件看起来像已经被压缩过

  • archive 文件一旦创建就无法改变,要修改的话,需要创建新的 archive 文件。事实上,一般不会再对存档后的文件进行修改,因为它们是定期存档的,比如每周或每日

  • 当创建 archive 时,源文件不会被更改或删除


最后修改: 2023年12月27日 星期三 17:28