hive HQL优化

在有限资源下,提高执行效率
常见问题:
数据倾斜,
map数设置
reduce数设置

hive执行,HQL>JOB>MAP/REDUCE
查看执行计划
explain 【extended】 hql

hive查询操作优化
join优化
hive.optimize.skewjoin=true;如果是join过程出现倾斜,应该设置为true
set hive.skewjoin.key=100000;这个是join的键对应的记录的条数,超过这个值会进行优化
mapjoin
set hive.auto.convert,join=true;
hive.mapjoin.smalltable.filesize默认值是25mb(其中一个表大小小于25mb时,自动启用mapjoin)
select /+mapjoin(A)/f.a,f.b from A a join B f on (f.a=t.a);
简单总结一下,mapjoin的使用场景
关联操作中有一张表非常小
不等值的连接操作

bucket join
连个表以相同方式划分桶;
两个表的桶个数是倍数关系

join优化
优化前
select m.cid,u.id form order m join customer u on m.cid=u.id where m.dt=’20160801’;
会先执行join
优化后
select m.cid,u.id from (select cid from order where dt=’20160801’)m
join customer u on m.cid = u.id

group by 优化
hive.groupby.skewindata=true;如果group by过程出现倾斜,应该设置为true

count distinct 优化
优化前
select count(distinct id )from tablename
优化后
select count(1) from (select distinct id from tablename)tmp;
select count(1) from (select id from tablename group by id)tmp;

hive job优化
并行化执行
每个查询被hive转化为多个阶段,有些阶段关联性不大,则可以并行化执行,减少执行时间
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8;

本地化执行
set hive.exec.mode.local.auto=true;
当一个job满足如下条件才能真正使用本地模式:
1.job的输入数据大小不小于参数:
hive.exec.mode.local.auto.inputbytes.max(默认是128m)
2.job的map数必须小于参数:
hive.exec.mode.local.auto.tasks.max(默认为4)
3.job的reduce必须为0或者1

job合并输入小文件
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
合并文件数有mapred.max.split.size限制的大小

job合并输出小文件
set hive.merge.smallfiles.avgsize=256000000;当输出文件平均大小小于改值时,启动新job合并文件
set hive.merge.size.per.task=6400000000;合并之后的文件大小

jvm重利用
set mapred.job.reuse.jvm.num.tasks=20;
jvm重利用可以使job长时间保留slot,直到作业结束,

压缩数据

map、reduce优化

你可能感兴趣的:(#,hive)