Hive的优化
hive优化
1)多表join优化代码结构:
select .. from JOINTABLES (A,B,C) WITH KEYS (A.key, B.key, C.key) where ....
关联条件相同多表join会优化成一个job
2)LeftSemi-Join是可以高效实现IN/EXISTS子查询的语义
SELECT a.key,a.value FROM a WHERE a.key in (SELECT b.key FROM b);
A、未实现Left Semi-Join之前,Hive实现上述语义的语句是:
SELECT t1.key, t1.value FROM a t1left outer join (SELECT distinctkey from b) t2 on t1.id = t2.id where t2.id is not null;
B、可被替换为Left Semi-Join如下:
SELECT a.key, a.valFROM a LEFT SEMI JOIN b on (a.key = b.key)
这一实现减少至少1次MR过程,注意Left Semi-Join的Join条件必须是等值
3)预排序减少map join和group by扫描数据
A、重要报表预排序,打开hive.enforce.sorting选项即可
B、如果MapJoin中的表都是有序的,这一特性使得Join操作无需扫描整个表,这将大大加速Join操作。可通过hive.optimize.bucketmapjoin.sortedmerge=true开启这个功能,获得高的性能提升。
C、Sorted Group by 对已排序的字段做Group by可以不再额外提交一次MR过程。这种情况下可以提高执行效率。
4)次性pv uv计算框架
A、多个mr任务批量提交
hive.exec.parallel[=false] -->当你的select语句产生的job有的job没有相关联的时候可以开启
hive.exec.parallel.thread.number[=8] -->最大同时执行的job数量
B、一次性计算框架,结合multi group by
如果少量数据多个union会优化成一个job;
反之计算量过大可以开启批量mr任务提交减少计算压力;
利用两次group by 解决count distinct 数据倾斜问题
5)控制hive中的map和reduce数
A、合并小文件
set mapred.max.split.size=100000000;
set mapred.min.split.size.per.node=100000000;
set mapred.min.split.size.per.rack=100000000;
set hive.input.format= org.apache.Hadoop.hive.ql.io.CombineHiveInputFormat;
hive.input.format=……表示合并小文件。大于文件块大小128m的,按照128M来分隔,小于128M,大于100M的,按照100M来分隔,把那些小于100M的(包括小文件和分隔大文件剩下的),进行合并,最终生成了74个块
B、耗时任务增大map数
setmapred.reduce.tasks=10;
6)利用随机数减少数据倾斜
大表之间join容易因为空值产生数据倾斜
select a.uid
from big_table_a a
left outer join big_table_b b
on b.uid = case when a.uid is null or length(a.uid)=0
then concat('rd_sid',rand()) else a.uid end;
小技巧
1.空值处理, 结果表\N用空字符串代替
ALTER TABLE a SETSERDEPROPERTIES('serialization.null.format' = '');
2. 避免暴力扫描分区
3. 利用动态分区减少任务执行时间
4.通过JobTracker 源数据找出低效代码
a. On条件没写或者扫描过多分区情况
Uv计算参考一次性pv uv计算框架解决方案,on或者分区条件没写去掉即可
b. 同一个脚本相同单表被扫描多次
尽量把所需要的数据一次性读出来
c. Job数过多
尽量一次性读取所需数据
才有union方式合并任务
Left outer join on条件相同会合并成一个job
d. From表个数过多(节点入度过高)
5. Job倾斜情况
空值处理方法:
a.直接过滤掉
b.空值加上随机数分散到不同的reduce
6. 相同输入字节数的任务抽取与合并
数据源相同的任务,抽取相同的job进行合并
7. 多个任务只有一个共同的父任务
Hive的优化说白了就是MR的优化,优化思路基本按照MR优化走就可以
附一张网图