在分布式的架构中,分布式文件系统HDFS,和分布式运算程序编程框架mapreduce。
问题:
HDFS:不怕大文件,怕很多小文件
mapreduce :怕数据倾斜
那么mapreduce是如果解决多个小文件的问题呢?
mapreduce关于大量小文件的优化策略
(1) 默认情况下,TextInputFormat对任务的切片机制是按照文件规划切片,不管有多少个小文件,都会是单独的切片,都会交给一个maptask,这样,如果有大量的小文件
就会产生大量的maptask,处理效率极端底下
(2)优化策略
最好的方法:在数据处理的最前端(预处理、采集),就将小文件合并成大文件,在上传到HDFS做后续的分析
补救措施:如果已经是大量的小文件在HDFS中了,可以使用另一种inputformat来做切片(CombineFileInputformat),它的切片逻辑跟FIleinputformat不同:
它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个maptask了
//如果不设置InputFormat,它默认的用的是TextInputFormat.class
/*CombineTextInputFormat为系统自带的组件类
* setMinInputSplitSize 中的2048是表示n个小文件之和不能大于2048
* setMaxInputSplitSize 中的4096是当满足setMinInputSplitSize中的2048情况下
* 在满足n+1个小文件之和不能大于4096
*/
job.setInputFormatClass(CombineTextInputFormat.class);
CombineTextInputFormat.setMinInputSplitSize(job, 2048);
CombineTextInputFormat.setMaxInputSplitSize(job, 4096);
补充:当n+1大于最大值时候,大文件会被切开,放到n个文件去