MapReduce中大量小文件是如何产生的?如何优化?

在分布式的架构中,分布式文件系统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个文件去

猜你喜欢

转载自blog.csdn.net/Aying_seeyou/article/details/106281979