Hadoop大量小文件问题

  Hadoop中,大量小文件会严重影响性能。

HDFS上的小文件问题

  HDFS 中任何一个文件,目录或者数据块在 NameNode 节点内存中均以一个对象形式表示(元数据),每个元数据对象约占 150 byte,所以如果有1千万个小文件,则 NameNode 大约需要2G空间。如果存储1亿个文件,则 NameNode 需要20G空间,这毫无疑问1亿个小文件是不可取的。
  访问大量小文件经常会导致大量的 seek,以及不断的在 DataNode 间跳跃去检索小文件。这不是一个很有效的访问模式,严重影响性能。

解决方式

  • Hadoop本身提供了一些文件压缩的方案。
  • 系统层面改变现有HDFS存在的问题,小文件的合并,建立比较快速的索引。
Hadoop自带小文件解决方案
  • Hadoop Archive:

  HAR熟称Hadoop归档文件,文件以.har结尾。归档的意思就是将多个小文件归档为一个文件,归档文件中包含元数据信息和小文件内容,即从一定程度上将Namenode管理的元数据信息下沉到Datanode上的归档文件中,避免元数据的膨胀,减少namenode内存使用的。

  • Sequence file:

  SequenceFile本质上是一种二进制文件格式,key-value存储,key为小文件名,value为文件内容,则可以将大批小文件压缩合并成一个大文件。

  • CombineFileInputFormat:

  通过CombineFileInputFormat类将多个文件分别打包到一个split中,每个mapper处理一个split, 提高并发处理效率,对于有大量小文件的场景,通过这种方式能快速将小文件进行整合。

JVM重用

  一个map运行一个JVM,重用的话,支持在一个 JVM 中运行多个 Map 任务,以此来减少 JVM 的启动开销。