hive常用参数优化及说明
一、常用参数优化
-
开启任务并行执行
set hive.exec.parallel=true; -
同一个sql允许并行任务的最大线程数
set hive.exec.parallel.thread.number=8; -
若读取小文件较多,则设置在map端进行小文件合并参数
set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set hive.hadoop.supports.splittable.combineinputformat = true;
set mapreduce.input.fileinputformat.split.maxsize = 256000000;
set mapreduce.input.fileinputformat.split.minsize.per.node=256000000;
set mapreduce.input.fileinputformat.split.minsize.per.rack=256000000; -
配置MR任务结束后进行文件合并
在只有map的作业结束时合并小文件,默认开启true:
set hive.merge.mapfiles = true;
在一个map/reduce作业结束后合并小文件,默认不开启false:
set hive.merge.mapredfiles = true;
作业结束时合并文件的大小,默认256MB
set hive.merge.size.per.task = 256000000;
在作业输出文件小于该值时,起一个额外的map/reduce作业将小文件合并为大文件,小文件的基本阈值,设置大点可以减少小文件个数,需要mapfiles和mapredfiles为true,默认值是16MB:
set hive.merge.smallfiles.avgsize=256000000; -
动态分区无Reduce产生小文件处理
在设置动态分区后,map数量:m,分区数量:n,中间会产生m*n个文件。大多数情况下,我们想让大部分数据在一个reduce中处理,但是有些hql不会产生reduce,这时,我们可以使用distribute by rand()的方式保证数据进行一次reduce操作,实现文件的合并:
两种处理方式参数设置如下:
1) 设置reduce个数:
set mapred.reduce.tasks=50;
insert into table tableA
select
*
from
tableB
distribute by rand();
注解:set设置的是最终生成的文件个数,distribute by rand()能够保证数据随机分配到50个文件中。2) 设置每个reducer处理的数据
set hive.exec.reducers.bytes.per.reducer=2560000000; insert into table tableA select * from tableB distribute by rand(); 注解:set设置的输出每个文件大小,distribute by rand()保证数据的平均大小是256Mb。
-
普通join转化为mapjoin(适用于大表关联小表)
set hive.auto.convert.join=true;
二、常用参数说明
7. hive.exec.compress.output:
控制hive的查询结果输出是否进行压缩,压缩方式在hadoop的mapred.output.compress中配置,默认不压缩false;一个查询的最后一个map/reduce任务输出是否被压缩的标志,默认为false,但是一般会开启为true,好处的话,节省空间不说,在不考虑cpu压力的时候会提高io。使用方式:
set mapred.output.compress=true;
set hive.exec.compress.output=true;
8. hive.exec.dynamic.partition:是否支持动态分区,默认false;
hive.exec.dynamic.partition.mode:默认strict,在strict模式下,动态分区的使用必须在一个静态分区确认的情况下,其他分区可以是动态;
hive.exec.max.dynamic.partitions:动态分区的上限,默认1000;
hive.exec.max.dynamic.partitions.pernode:每个mapper/reducer节点可以创建的最大动态分区数,默认100;
9. hive.exec.reducers.bytes.per.reducer:
每个reducer的大小,默认是1G,输入文件如果是10G,那么就会起10个reducer;
10. hive.groupby.skewindata:
group by操作是否允许数据倾斜,默认是false,当设置为true时,执行计划会生成两个map/reduce作业,第一个MR中会将map的结果随机分布到reduce中,达到负载均衡的目的来解决数据倾斜
11. map个数控制及性能调优,请参考另一个老哥的
https://blog.youkuaiyun.com/qq_26442553/article/details/99438121