HDFS 小文件存储

1. HDFS 存储小文件的弊端

HDFS中每个文件、目录、数据块的元数据存储大约占150字节,不管文件是大是小,因此HDFS存储小文件会非常低效。存储大量小文件会耗尽NameNode中的大部分内存。

但注意,存储小文件所需要的磁盘容量和数据块的大小无关。例如,一个1MB的文件设置为128MB的块存储,实际使用的是1MB的磁盘空间,而不是128MB。

2. 优化小文件存储

2.1. 解决方法1:小文件归档

HDFS存档文件(HAR文件),是HDFS2.X的新特性,是一个更高效的文件存档工具,它将文件存入HDFS块,在减少NameNode内存使用的同时,允许对文件进行透明的访问。

具体说来,HDFS存档文件对内还是个一个独立文件,对NameNode而言却是个整体,减少了 NameNode的内存。

例如:将1.txt、2.txt、3.txt归档成一个har文件。对于NameNode而言只有一个har文件。但是client还是可以访问其中一个单独的文件

2.1.1. 启动HDFS和YARN

归档是一个MapReduce程序,如果已经配置了MapReduce运行在YARN上,就要启动YARN

1
2
start-dfs.sh
start-yarn.sh

2.1.2. 执行归档操作

1
2
# 将/input作为输入目录,/output作为输出目录,打包的文件名为input.har(强制要求以har为后缀)
hadoop archive -archiveName input.har -p /input /output

查看结果目录。用har协议才能查看har归档的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ hdfs dfs -ls /output          # 生成一个input.har目录,就是归档
Found 1 items
drwxr-xr-x - root supergroup 0 2019-02-25 13:41 /output/input.har

$ hdfs dfs -ls /output/input.har # 查看归档中的内容,看不到原来的各个文件
Found 4 items
-rw-r--r-- 3 root supergroup 0 2019-02-25 13:41 /output/input.har/_SUCCESS
-rw-r--r-- 5 root supergroup 252 2019-02-25 13:41 /output/input.har/_index
-rw-r--r-- 5 root supergroup 23 2019-02-25 13:41 /output/input.har/_masterindex
-rw-r--r-- 3 root supergroup 342 2019-02-25 13:41 /output/input.har/part-0

$ hdfs dfs -ls har:///output/input.har # 必须用har协议,才能看到input.har归档中的内容
Found 3 items
-rw-r--r-- 3 root supergroup 280 2019-02-25 13:40 har:///output/input.har/1.txt
-rw-r--r-- 3 root supergroup 58 2019-02-25 13:40 har:///output/input.har/2.txt
-rw-r--r-- 3 root supergroup 4 2019-02-25 13:40 har:///output/input.har/3.txt
panchaoxin wechat
关注我的公众号
支持一下