蜂巢调优总结



一、查看执行计划
解释扩展hql;可以看到扫描数据的hdfs路径

二,蜂巢表优化

分区(不同文件夹):
动态分区开启:
设置hive.exec.dynamic.partition=true;
设置hive.exec.dynamic.partition.mode=nonstrict;

,,,


分桶(不同文件):
设置hive.enforce.bucketing=true;
设置hive.enforce.sorting=true;开启强制排序,插数据到表中会进行强制排序,默认假;


三,蜂巢SQL优化




hive.groupby.skewindata=https://www.yisu.com/zixun/true;(多起一个工作)1.加入优化

(1)数据倾斜
hive.optimize.skewjoin=true;
如果是加入过程出现倾斜,应该设置为真正的
设置hive.skewjoin.key=100000;
这个是加入的键对应的记录条数超过这个值则会进行优化
简单说就是一个工作变为两个工作执行HQL

(2) mapjoin (map端执行加入)
启动方式一:(自动判断)
set.hive.auto.convert.join=true;
hive.mapjoin.smalltable。文件大小默认值是25 mb
小表小于25 mb自动启动mapjoin 
启动方式二:(手动)
选择//范围内,f。从A t加入f(范围=t.a)

mapjoin支持不等值条件
reducejoin不支持在上条件中不等值判断

(3) bucketjoin(数据访问可以精确到桶级别)
使用条件:1。两个表以相同方式划分桶

例子:
create table命令(cid int,价格浮动)集群(cid),,, 32桶;
创建表customer (int id,第一个字符串)集群(id),,,到32/64桶;

选择价格从订单t加入客户年代t.cid=s.id;

(4)条件优化
优化前(关系数据库不用考虑会自动优化):
选择m.cid, u。从订单id m加入客户u m。cid=u。id, m.dt=' 2013-12-12 ';

优化后(条件在地图端执行而不是在减少端执行):
选择m.cid, u。从(select * from订单id dt=' 2013-12-12 ') m加入客户u m。cid=u.id;

(5) group by优化
hive.groupby.skewindata=https://www.yisu.com/zixun/true;
如果group by过程出现倾斜应该设置为真正的
设置hive.groupby.mapaggr.checkinterval=100000;
这个是集团的键对应的记录条数超过这个值则会进行优化

也是一个工作变为两个工作
(6)计数明显优化
优化前(只有一个减少,先去重再计算负担比较大):
从表选择计数(不同的id),
优化后(启动两个工作,一个工作负责子查询(可以有多个减少),另一个工作负责计数(1)):
select count(1)从(从表选择不同的id) tmp;

select count(1)从(从表选择id组通过id) tmp;

设置mapred.reduce.tasks=3;

, (7)
优化前:
选择一个,和(b),计数(不同的c),计数(不同d)从测试组的;

优化后:
选择一个,和(b)是b,计数(c), c,数(d)的d
(
选择0 b, c, d从测试组的零,c
union all
选择,0 b, null作为c, d从测试组,d
union all
选择a, b, null作为c,零维从测试)tmp集团的;


四,蜂巢工作优化

1。并行化执行
蜂巢默认工作是顺序进行的,一个HQL拆分成多个工作,工作之间无依赖关系也没有相互影响可以并行执行
设置hive.exec.parallel=true;

设置hive.exec.parallel.thread.number=8;
就是控制对于同一个sql来说同时可以运行的工作的最大值,该参数默认为8。此时最大可以同时运行8个工作

2。本地化执行(在存放数据的节点上执行)

设置hive.exec.mode.local.auto=true;

本地化执行必须满足条件:
(1)工作的输入数据大小必须小于参数
hive.exec.mode.local.auto.inputbytes。max(默认128 mb)
(2)工作的地图数必须小于参数:
hive.exec.mode.local.auto.tasks。max(默认为4)太多没有足够的插槽
(3)工作的减少数必须为0或1


3。合工作并输入小文件
设置hive.input.format=org.apache.hadoop.hive.ql.io。CombineHiveInputFormat
多合个分裂成一个,合并分裂数由mapred.max.split。大小限制的大小决定

4。合工作并输出小文件(为后续工作优化做准备)
设置hive.merge.smallfiles.avgsize=256000000;当输出文件平均大小小于该值,启动合新工作并文件

设置hive.merge.size.per.task=64000000;合并之后的每个文件大小

5。JVM重利用
设置mapred.job.reuse.jvm.num.tasks=20;

JVM重利用可以使工作长时间保留位置,直到作业结束。
6。压缩数据(多个工作)
(1)中间压缩处理蜂巢查询的多个工作之间的数据,对于中间压缩,最好选择一个节省cpu耗时的压缩方式
设置hive.exec.compress.intermediate=true;
设置hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

蜂巢调优总结