携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
在实际生产应用总难免会遇到一些小文件,而对于任何一个文件块来说,无论块本身的大小如何,他们的元数据都会在内存中占用150个字节,如果系统中存储了大量的小文件,那么就会造成较大的资源浪费,所以我们会对小文件进行归档,使多个小文件当作一个文件去占用内存中的150个字节。实现如下:
- 启动yarn
该过程背后实际上是MapReduce在操作,所以要确保yarn进程是启动的。
[root@hadoop302 sbin]# ./start-yarn.sh
- 上传多个测试小文件
[root@hadoop301 hadoop-3.1.3]# cd testdata/;ll
total 32
-rw-r--r--. 1 root root 43 Jul 30 08:39 dept.txt
-rw-r--r--. 1 root root 78 Jul 30 08:38 employee.txt
-rw-r--r--. 1 root root 72 Jul 24 08:36 testcombine1.txt
-rw-r--r--. 1 root root 88 Jul 24 08:37 testcombine2.txt
-rw-r--r--. 1 root root 24 Jul 24 08:37 testcombine3.txt
-rw-r--r--. 1 root root 351 Jul 24 08:38 testcombine4.txt
-rw-r--r--. 1 root root 381 Jul 24 08:39 testcombine5.txt
-rw-r--r--. 1 root root 69 Jul 29 09:22 testorder.txt
[root@hadoop301 testdata]# pwd
/usr/local/wyh/software/hadoop-3.1.3/testdata
[root@hadoop301 testdata]# hdfs dfs -mkdir /testmultiplefile
[root@hadoop301 testdata]# hdfs dfs -put testcombine*.txt /testmultiplefile
- 归档小文件
[root@hadoop301 testdata]# hadoop archive -archiveName multipleinput.har -p /testmultiplefile /multipleoutput
#multipleinput.har表示多个文件归档后的名字
#/testmultiplefile表示要归档的文件目录
#/multipleoutput表示归档后文件输出的目录
- 查看归档后的文件
查看part-0文件时,会发现此时我们能查看到的是各个小文件合并在一起的内容:
可以使用har协议头查看具体的各个小文件:
[root@hadoop301 testdata]# hdfs dfs -ls har:///multipleoutput/multipleinput.har
这样,当我们需要使用这些小文件时,可以将他们拷贝到指定目录下:
[root@hadoop301 testdata]# hdfs dfs -cp har:///multipleoutput/multipleinput.har/testcombine2.txt /
这样就简单地实现了HDFS中小文件的归档。