欢迎投稿

今日深度:

Hive的优化,

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优化走就可以

附一张网图



www.htsjk.Com true http://www.htsjk.com/hive/39531.html NewsArticle Hive的优化, hive优化 1)多表join优化代码结构:   select .. from JOINTABLES (A,B,C) WITH KEYS (A.key, B.key, C.key) where .... 关联条件相同多表join会优化成一个job 2)LeftSemi-Join是可以高效实现...
相关文章
    暂无相关文章
评论暂时关闭