1.Map执行前合并小文件 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat 说明: 在Map执行前合并小文件,减少Map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能。
2.map-reduce阶段合并小文件 hive.merge.mapfiles = true; – 默认true,在map-only任务结束时合并小文件hive.merge.mapredfiles = true; – 默认false,在map-reduce任务结束时合并小文件 hive.merge.size.per.task = 268435456; – 默认256M,合并文件的大小 hive.merge.smallfiles.avgsize = 16777216; – 当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
3.启用mapjoin优化 set hive.auto.convert.join.noconditionaltask=true; set hive.auto.convert.join.noconditionaltask.size=比较大的值 说明: 开启map端join设置,这样可以将小表加载到内存,在map阶段完成join操作。 如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。
4.out of memory和GC问题 解决内存溢出和GC问题,设置后运行时间缩短一倍 set mapreduce.map.memory.mb=4096; set mapreduce.reduce.memory.mb=4096; set mapreduce.map.java.opts=-Xmx3276M -Djava.net.preferIPv4Stack=true; set mapreduce.reduce.java.opts=-Xmx3276M -Djava.net.preferIPv4Stack=true; 说明:mapreduce内存默认为2g,堆外内存不超过map,reduce内存80%
5.参数汇总 set hive.auto.convert.join=false; set hive.optimize.skewjoin=true; set hive.skewjoin.key=1000000; set mapred.map.tasks=20; set mapred.reduce.tasks=20; set hive.merge.mapredfiles=false; set hive.exec.parallel=true; set hive.groupby.skewindata=true; set mapreduce.map.memory.mb=8192; set mapreduce.reduce.memory.mb=4096; set mapreduce.map.java.opts=-Xmx6144M -Djava.net.preferIPv4Stack=true; set mapreduce.reduce.java.opts=-Xmx3276M -Djava.net.preferIPv4Stack=true;