第一种:从数据产生的途径上进行解决。 1)尽量用sequencefile (SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File)。),减少使用textfile (文本文件),从一定程度上能减少小文件的产生。 2)可以减少reduce的个数, 3)少用动态表,多用distribute by 分区
第二种:对于已经存在的小文件进行解决方案。
1)可以用hadoop achieve 归档命令,对文件进行归档。 2)重建表,重建表的时候来设置减少reduce的数量。 3)设置map/reduce 的参数
设置map输入合并小文件的相关参数:
每个map最大输入大小(这个值决定 了合并后文件的数量)
set mapred.max.split.size = 256000000;
一个节点上的split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)
set mapred.min.split.size.per.node = 100000000;
一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并)
set mapred.min.split.size.per.rack = 100000000;
执行Map前进行小文件合并
set hive.input.format = org.apache.hadoop.hive.ql.io.CombinHiveInput;
设置map输出和reduce输出进行合并的相关参数:
设置map端输出进行合并,默认为true
set hive.merge.mapfiles = true;
设置reduce端输出进行合并,默认为false
set hive.merge.mapredfiles = true;
设置合并文件的大小
set hive.merge.size.per.task = 256*1000*1000;
当输出文件的平均数小于该值师,启动一个独立的Mapreduce任务进行文件merge.
set hive.merge.smailfiles.avgsize = 16000000;
|