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扫描数据
C、Sorted Group by 对已排序的字段做Group by可以不再额外提交一次MR过程。这种情况下可以提高执行效率。
4)次性pv uv计算框架
A、多个mr任务批量提交
B、一次性计算框架,结合multi group by
如果少量数据多个union会优化成一个job;
反之计算量过大可以开启批量mr任务提交减少计算压力;
利用两次group by 解决count distinct 数据倾斜问题
5)控制hive中的map和reduce数
A、合并小文件
B、耗时任务增大map数
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用空字符串代替
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优化走就可以
附一张网图
以上内容均为作者个人笔记,如有错误欢迎指正...
关注CSDN博客 Zonzereal,更多大数据笔记等你...
领取专属 10元无门槛券
私享最新 技术干货