Zzreal的大数据笔记-HiveDay10

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,更多大数据笔记等你...

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171215G02QNO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券