小文件在HDFS中
HDFS块大小默认是128m(hadoop2.x默认是128),若是存储了很多这种小文件每个小文件占了一个block而每个block的文件,目录在namenode里以对像(元数据)形式存储,
就会造成namenode内存占用严重,同时 阅读小文件通常会导致从一个DataNode到DataNode检索每个小文件检索效率极低
在MapReduce中小文件问题
一个Map任务每次能处理一个块的输入,多个小文件对应多个block就需要大量的map任务
解决方法:Hadoop本身提供了几个解决方案,分别为:Hadoop Archive,Sequence file和CombineFileInputFormat
(1) Hadoop Archive
Hadoop Archive或者HAR,是一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样在减少namenode内存使用的同时,仍然允许对文件进行透明的访问。
对某个目录/foo/bar下的所有小文件存档成/outputdir/ zoo.har:
hadoop archive -archiveName zoo.har -p /foo/bar /outputdir
当然,也可以指定HAR的大小(使用-Dhar.block.size)。
HAR是在Hadoop file system之上的一个文件系统,因此所有fs shell命令对HAR文件均可用,只不过是文件路径格式不一样,HAR的访问路径可以是以下两种格式:
har://scheme-hostname:port/archivepath/fileinarchive
har:///archivepath/fileinarchive(本节点)