简介

关于大量小文件的优化策略

默认情况下TextInputFormat对任务的切片机制是按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个maptask,这样如果有大量小文件,就会产生大量的maptask,处理效率极其低下

方法

  1. 最好的办法,在数据处理系统的最前端(预处理/采集),将小文件先合并成大文件,再上传到HDFS做后续分析
  2. 补救措施:如果已经是大量小文件在HDFS中了,可以使用另一种InputFormat来做切片(CombineTextInputFormat),他的切片逻辑跟TextFileInputFormat不同,他可以将多个小文件从逻辑规划到一个切片中.这样多个小文件可以交给一个maptask
  3. 优先满足最小切片大小,不超过最大切片大小
  1. CombineTextInputFormat.setMaxInputSplitSize(job, 4194304); //4m
  2. CombineTextInputFormat.setMinInputSplitSize(job, 2097152); //2m

举例: 0.5m+1m+0.3m+5m=2m+4.8m=2m+4m+0.8m

实现步骤

  1. Import org.apache.hadoop.mapreduce.lib.input
  1. //如果不设置InputFormat,他默认用的是TextInputFormat.class
  2. job.setInputFormatClass(CombineTextInputFormat.class);
  3. CombineTextInputFormat.setMaxInputSplitSize(job, 4194304); //4m
  4. CombineTextInputFormat.setMinInputSplitSize(job, 2097152); //2m

观察切片数

image.png

分析

他这个输入还是按照文件来的,如果一个文件小于设置的最小值,他会累加文件,如果累加的文件大于设置的最大值就会切片