每个文件均按块存储,每个块的元数据存储在namenode的内存中,因此hadoop存储小文件会非常低效。因为大量的小文件会耗尽namenode中的大部分内存。但注意,存储小文件所需要的磁盘容量和存储这些文件原始内容所需要的磁盘空间相比也不会增多。例如,一个1MB的文件以大小为128MB的块存储,使用的是1MB的磁盘空间,而不是128MB。
Hadoop存档文件或HAR文件,是一个更高效的文件存档工具,它将文件存入HDFS块,在减少namenode内存使用的同时,允许对文件进行透明的访问。具体说来,Hadoop存档文件可以用作MapReduce的输入。
一、要启动yarn进程
归档的过程其实是在跑MapReduce,所以必须要开启YARN:
[root@hadoop102 hadoop-2.7.2]# sbin/start-yarn.sh
二、归档文件
归档成一个叫做xxx.har的文件夹,该文件夹下有相应的数据文件。xxx.har目录是一个整体,该目录看成是一个归档文件即可。
shell脚本:bin/hadoop archive -archiveName 归档名 -p 要归档的目录 归档后存储的路径
举例:
[root@hadoop102 hadoop-2.7.2]# bin/hadoop archive -archiveName myhar.har -p /user/atguigu /user/my
三、查看归档
[root@hadoop102 hadoop-2.7.2]# hadoop fs -lsr /user/my/myhar.har
[root@hadoop102 hadoop-2.7.2]# hadoop fs -lsr har:///myhar.har
也可以从har中将文件拷贝出来(拷贝到/user/my):
[root@hadoop102 hadoop-2.7.2]# hadoop fs -cp har:///myhar.har/文件名 /user/my
四、解归档文件
[root@hadoop102 hadoop-2.7.2]# hadoop fs -cp har:/// user/my/myhar.har /* /user/atguigu