原由:node
最近仓库里面新建了一张分区表,数据量大约是12亿行,分区比较多,从2008年7月开始 一天一个分区。apache
配置了一个任务oop
对这个表进行group by 的时候 发现启动了2800多个maps .spa
执行的时间也高大10分钟。orm
而后我在hdfs文件里面看到 这个表的每一个分区里面都有20多个小文件,每一个文件都不大 300KB--1MBhadoop
以前的hive的参数:
hive.merge.mapfiles=true
hive.merge.mapredfiles=false
hive.merge.rcfile.block.level=true
hive.merge.size.per.task=256000000
hive.merge.smallfiles.avgsize=16000000input
hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormatit
mapred.max.split.size=256000000
mapred.min.split.size=1
mapred.min.split.size.per.node=1
mapred.min.split.size.per.rack=1io
hive.merge.mapredfiles 这个指的是 在Map-Reduce的任务结束时合并小文件form
解决办法:
1.修改参数hive.merge.mapredfiles=true
2.经过map_reduece的办法生成一张新的表 此时生成的文件变成了每一个分区一个文件
再次执行group by 发现效率获得了大大的提高。
小结:
正确处理hive小文件 是 控制map数的一个重要环节
处理的很差 会大大影响任务的执行效率