HDFS小文件过多危害与解决方法

危害:

  • Hadoop上大量HDFS元数据信息存储在NameNode内存中,因此过多的小文件必定会压垮NameNode的内存
    (每个元数据对象约占150b,所以如果有一千万个小文件,每个文件占用一个block,则NameNode大约需要2G空间。如果存储一亿个文件,则NameNode需要20G空间。)
  • 索引文件过大使得索引检索的速度变慢。

解决方法:

合并小文件,可以选择在客户端上传是执行一定的策略先合并,或者是使用hadoop的CombineFileInputFormat实现小文件的合并。

1)Hadoop Archive

Hadoop Archive或者HAR,是一个高效地将小文件放入HDFS块中的文档存储工具,它能够以将多个小文件打包成一个HAR文件,这样在减少namenode内存使用的同时,仍然对文件进行透明的访问。

2)Sequence file

sequence file由一系列二进制key/value组成,如果key为小文件名,value为文件内容,则可以将大批小文件合并成一个大文件。

3)CombineFileInputFormat

用于将多个文件合并成单独的Split,另外它会考虑数据的存储位置。

4)开启JVM重用

一个Map运行在一个JVM上,开启重用,该map在JVM运行完毕之后,JVM继续运行其它Map(mapreduce.job.jvm.numtasks)。对于大量小文件的Job,可以减少45%的运行时间。

你可能感兴趣的:(Hadoop,hdfs,hadoop,大数据)