小文件指的是那些size比HDFS的block size(默认64M)小的多的文件。
任何一个文件,目录和block,在HDFS中都会被表示为一个object存储在namenode的内存中,
每一个object占用150 bytes的内存空间。所以,如果有10million个文件,每一个文件对应一个block,
那么就将要消耗namenode 3G的内存来保存这些block的信息。
如果规模再大一些,那么将会超出现阶段计算机硬件所能满足的极限
解决hadoop集群小文件过多的方式:
1.使用程序直接将待上传的小文件合并成一个文件,前提是这些小文件是同种类型,比如日志类的
2.使用hadoop archive 命令将hdfs中指定目录中的小文件打包成har文件
打包命令 hadoop archive -archiveName XXX.har -p /src /dest -p指递归内部文件
可以使用hadoop fs -lsr har:///dest/XXX.har 查看内部目录信息
可以使用hadoop fs -lsr /dest/XXX.har 查看内部结构信息
可以使用hadoop fs -text har:///dest/XXX.har/*** 直接查看har包里指定文件的内容
3.使用SequenceFile
使用fileName作为key,file contents作为value。写一个小程序将10000个100kb的小文件写入到一个SequenceFile中去,和har不同的是,支持压缩,可以按block压缩,也可以按recode压缩。
4.使用MapFile
MapFile是排序后的SequenceFile,通过观察其目录结构可以看到MapFile由两部分组成,分别是data和index。
需注意的是,MapFile并不会把所有Record都记录到index中去,默认情况下每隔128条记录存储一个索引映射。当
然,记录间隔可人为修改,通过MapFIle.Writer的setIndexInterval()方法,或修改io.map.index.interval属性;