小文件太多的问题:
hdfs上每个文件都要在namenode上建立索引,索引大小大约为150byte。所以大量小文件会产生很多索引,占用大量namenode内存,而且索引太多导致检索速度变慢。
小文件解决方案:
1、hadoop自身提供一些文件压缩方案
2、从系统层面改变现有hdfs存在的问题,其实还是小文件的合并,然后建立比较快速的索引
下面分别对这两种解决方案做一些解析
1、hadoop自身提供一些文件压缩方案
hadoop对每个压缩格式的支持,详细见下表:
压缩格式 | 工具 | 算法 | 文件扩展名 | 多文件 | 可分割性 |
DEFLATE | 无 | DEFLATE | .deflate | 不 | 不 |
gzip | gzip | DEFLATE | .gz | 不 | 不 |
ZIP | zip | DEFLATE | .zip | 是 | 是,在文件范围内 |
bzip2 | bzip2 | bzip2 | .bz2 | 不 | 是 |
LZO | lzop | LZO | .lzo | 不 | 否 |
hadoop下各种压缩算法的压缩比,压缩时间,解压时间见下表:
压缩算法 | 原始文件大小 | 压缩后的文件大小 | 压缩速度 | 解压缩速度 |
gzip | 8.3GB | 1.8GB | 17.5MB/s | 58MB/s |
bzip2 | 8.3GB | 1.1GB | 2.4MB/s | 9.5MB/s |
LZO-bset | 8.3GB | 2GB | 4MB/s | 60.6MB/s |
LZO |