Hadoop小文件问题以及优化

247 阅读2分钟

1、小文件问题

  • 1、寻址时间可能会大于读取数据的时间,不划算。 进行数据访问的时候首先会寻找元数据。元数据是和block对应的,1个block对应一条元数据,假设有1000万个1kb的小文件,会存1000万块block,对应1000万个元数据。在进行数据访问的时候可能只花了1s时间寻找元数据,并访问到数据存储的位置,但是读取时间的速度可能只花了1ms,总体上不划算。
  • 2、造成元数据存储量过大,增加NameNode压力过大。 在HDSF中元数据存储一般情况下,一条元数据150byte左右。1000万条元数据-----10000000 * 150 = 1.5G

2、解决方案

  • 1、Hadoop Archive:是一个高效的将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样可以缓解大量小文件消耗NameNode内存的问题。

  • 2、Sequence File:Sequence File由一些列的二进制keu/value组成,如果key为小文件名,value为文件内容,可以将大批小文件合并成一个大文件,在InputFormat和OutputFormat中设置。

  • 3、CombinerFileInputFormat:CombinerFileInputFormat是一种新的InputFormat,用于将多个小文件合并成一个单独的split,另外,它会考虑数据的存储位置。

  • 4、开启JVM重用:Hadoop中有个参数是:mapred.job.reuse.jvm.num.tasks,默认是1,表示一个JVM最多上最多可以顺序执行的task数目(属于同一个job)是1。也就是说一个task开启一个jvm。

    **注意:**JVM重用不是指用一个job的两个或者两个以上的task可以同时运行于同一个JVM上,而是按队列顺序执行。