优化

1.fetch抓取

全局查找,字段查找,limit查找都不走mapreduce
set hive.fetch.task.conversion=more;

2.本地模式

小数据集查询,为查询触发执行任务消耗的时间可能会比实际job执行时间大得多
set hive.exec.mode.local.auto=true;

设置local mr的最大输入数据量,默认为128M
SET hive.exec.mode.local.auto.inputbytes.max=xxx;

设置local mr最大输入文件个数,默认为4
set hive.exec.mode.local.auto.input.files.max=4;

3.表的优化

(1)小表大表join(小表在左边)
新版hive已优化,所以小表放左边还是右边没有分别
(2)大表join大表
1.过滤空key
2.空key转换
有时虽然某个key为空对应的数据量很多,但不是异常数据,必须包含在join结果中,此时可疑为表中的key为空的字段赋予一个随机值,使得数据均匀分布在不同的reduce
set mapreduce.job.reduce=5;

select * from nullidtable n
join ori o
on
case when n.id is null then concat("hive",rand()) else n.id end =o.id

3.mapjoin
如果不指定mapjoin或者不符合mapjoin条件,hive解析器会将join转换为combine join,即在reduce端完成join,容易发生数据倾斜
set hive.auto.convert.join=true;
大表小表的阈值设置(小表默认为25M)
SET hive.mapjoin.smalltable.filesizes=xxx;

4.group by

并不是所有的聚合操作都是在reduce端完成,很多聚合操作可以在map端部分聚合,最后在reduce端得出最终结果
开启map端聚合参数的设置.默认为true
set hive.map.aggr=true
设置在map端聚合操作的条目数目
set hive.groupby.mapaggr.checkinterval=xxx
有数据倾斜的时候进行负载均衡
set hive.groupby.skewindata=true

5.count(distinct)

先group by

6.join

先条件过滤后join

7.并行执行

hive会将一个查询转换为多个阶段,可以是mapreduce阶段,抽样阶段,合并阶段,或者limit阶段
默认情况下,hive一次只会执行一个阶段
job的这些阶段并非完全依赖,可以并行执行
set hive.exec.parallel=true
set hive.exec.parallel.thread.number=16


8.严格模式

set hive.mapred.mode=strict

(1) cartesian product
(2)no partition being picked up for a query
(3)comparing bigints and strings
(4)comparing bigints and doubles
(5)order by without limit

9jvm重用

小文件

10.推测执行

有些任务的执行速度明显慢于其他任务,hadoop采用推测执行(speculative execution)机制,根据一定的法则推测出“拖后腿”的任务,被开启备份任务,
让该任务和原始任务同时处理同一份数据,最终选择最先完成任务的计算结果作为最终结果

11.执行计划 explain

posted on 2020-12-19 17:50  happygril3  阅读(155)  评论(0)    收藏  举报

导航