Hive参数设置及优化

1.动静态分区属性设置

HiveSQL调优 hive调优与参数设置_hadoop

2.Set hive.map.aggr=true 通过设置属性hive.map.aggr值为true来提高聚合的性能,这个设置会触发在map阶段进行的‘顶级’聚合过程。(非顶级的聚合过程会在执行一个GROUP BY后进行。)不过,这个设置需要更多的内存

3.本地模式设置
大多数情况下查询都会触发一个MapReduce任务(job),hive中某些情况的查询可以不必使用MapReduce,也就是所谓的本地模式。
例如:SELECT * FROM employees;
在这种情况下,hive可以简单的读取employees对应的存储目录下的文件,然后输出格式化后的内容到控制台。
Set hive.exec.mode.local.auto=true 通过设置属性hive.exec.mode.local.auto值为true,hive会尝试使用本地模式执行其他的操作,可以避免触发一些MapReduce任务(job)
注:最好将set hive.exec.mode.local.auto=true;这个设置增加到你的$HOME/.hiverc配置文件中

4.Set hive.auto.convert.join=true;设置为true时hive会在必要的时候启动这个优化,即在map阶段进行join操作,从而省略掉常规连接操作所需要的reduce过程,提高执行效率,当然执行这个优化有个前提条件是两个表做join时其中有一张表是小表可以加载到内存中进行操作。此外该优化常和hive.mapjoin.smalltable.filesize=25000000配置连用
此配置是设置支持自动map join时小表的大小范围默认是25M

5.分桶表的配置优化
set hive.optimize.bucketmapJOIN=true;开启为true时才支持一张表的一个分桶数据与另一张表每个分桶进行匹配连接,当然前提条件是表中的数据必须按照ON语句的键进行分桶才行,而且其中一张表的分桶个数必须是另一张表的若干倍。

6.严格模式配置(防止用户执行那些可能产生意想不到的不好影响的查询)
Set hive.mapred.mode=strict; 开启严格模式,在严格模式下hive要求(1.order by语句查询时必须加有limit;2.分区表查询必须加where分区查询;3.限制笛卡尔积的查询)设置为nonstrict为非严格模式

7.并行执行
当一个job任务由多个阶段组成(MR阶段,抽样阶段,合并阶段,limit阶段等),且多个阶段间并非完全相互依赖,可以并行执行,那么这时候就可以开启并行执行,可以提高job的运行效率
配置参数:hive.exec.parallel=true;开启并行执行
8.调整mapper和reducer个数
确定mapper个数和reducer个数取决于多个变量,如输入的数据量大小及对这些数据执行的操作类型等如果开启的mapper和reducer任务太多会导致启动阶段、调度和运行job过程中产生过多的开销,而如果设置的数量太少则可能没有充分利用好集群内的并行性。
Hive里我们可以通过dfs-count命令来查看计算输入量大小,而Linux中可以通过du-s命令。
[root@hadoop02 hadoop]# hdfs dfs -count /park/1.txt
20/03/10 06:48:15 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
0 1 25 /park/1.txt
文件夹数 文件数 文件大小 文件地址
关于mapper和reducer数量配置:
hive.exec.reducers.bytes.reducer的默认值是1G,也就是说默认每个reducer默认处理最大1G数据量,我们可以通过改变这个配置数据量来改变reducer的个数
hive.exec.reducers.tasks=3设置job任务的初始reducer个数hive的默认reducer个数是3
hive.exec.reducers.max= ; 设定job任务最大启用reducer的个数,在集群中为了控制资源利用情况,这个设置显得非常重要。
配置的位置集群中配置的位置 $ HIVE_HOME/conf/hive-site.xml文件中
建议设置值=(集群总reduce槽位个数*1.5)/(执行中查询的平均个数)
1.5是经验系数,用于防止未充分利用集群的情况

9.JVM重用

运用场景:当有大量小文件时可以开启JVM重用

在Hadoop的mapred-site.xml文件(位于$Hadoop_HOME/conf目录下)中进行设置:

HiveSQL调优 hive调优与参数设置_并行执行_02

10.创建索引

11.推测执行

HiveSQL调优 hive调优与参数设置_HiveSQL调优_03

12.开启中间压缩(注意选择一个合适的编/解码器)
对中间数据进行压缩可以减少job中map和reduce task间的数据传输量
但是数据压缩会增加cup的开销,选择一个低CPU开销的编/解码器要比选择一个压缩率高的编/解码器要重要得多。
hive.exec.compress.intermediate=false;默认是false不开启

13.最终输出结果压缩
hive.exec.compress.output=false;默认为false

14.set mapred.job.name = tdm_small_routine_stat_d(${hivevar:statis_date}); 设置任务名

15.-- 每个map最大输入大小
set mapred.max.split.size = 60000000;

16.-- 每个map最小输入大小
set mapred.min.split.size = 30000000;

17.-- 执行map前进行小文件合并
set hive.input.format = org.apache.hadoop.hive.ql.io.combinehiveinputformat;

18.-- hive自动根据sql,选择使用common join或者map join
set hive.auto.convert.join = false;

19.-- 在map-only的任务结束时合并小文件
set hive.merge.mapfiles = true;

20.-- 在map-reduce的任务结束时不合并小文件
set hive.merge.mapredfiles = true;

21.-- 合并文件的大小
set hive.merge.size.per.task = 128000000;

22.–每个reduce处理的最大数据量
set hive.exec.reducers.bytes.per.reducer=120000000;

23.JOIN过程倾斜
set hive.skewjoin.key=1000000; --这个是join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.optimize.skewjoin=true;–如果是join 过程出现倾斜 应该设置为true

24.GROUP过程倾斜
set hive.groupby.mapaggr.checkinterval=1000000 ;–这个是group的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.groupby.skewindata=true; --如果是group by过程出现倾斜 应该设置为true

25.Hive 使用过多变量转换 调优参数(可以防止FAILED: IllegalStateException Variable substitution depth too large: 40 报错)
hive.variable.substitute 控制是否打开Substitution功能,默认是true

hive.variable.substitute.depth=40;(默认是40)