hive上亿级别的表关联如何调优

18次阅读
没有评论

这篇文章主要介绍了 hive 上亿级别的表关联如何调优,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

环境:公司决定使用宽表,将 10 个相关的大表进行全量关联

(1 个上亿级别的表,5 个上千万的表,剩下的表都不到百万的表)

花了两天的时间研究,测试

例如:a~g 这几个表中,a 表为上亿级别的表,5 个上千万的表,剩下为表都百万的表

select a.uesrid,b.citycode,b.register_num, ... ,g.active_num 
(select userid,citycode from a)
left outer join
(select userid,register_num from b)
on (a.userid=b.userid)
left outer join
(select userid,active_num from g)
on (a.userid=b.userid)

你会发现
最后一个 job 异常慢,并且 reduce 为 1。

也多人会说,你傻逼呀,设置 reduce 数呀,对这是一个好办法,但是结果如何呢?

# 设置传输格式
set mapred.output.compress=true; 
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
#设置 200 个 reduces
set mapred.reduce.tasks=200; 
#设置并行(甚至还。。。设置并行) 
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=16; // 同一个 sql 允许最大并行度,默认为 8 

草,我就是按照网上各种教程,测试了一整天,还是最后一个 reduce 为 1;(我可是上亿级别噢!!!)

hive 自动分配 reduce 的计算方法

1. hive.exec.reducers.bytes.per.reducer(默认为 1000^3)

2. hive.exec.reducers.max(默认为 999)

计算 reducer 数的公式很简单:

N=min(参数 2,总输入数据量 / 参数 1)

然后查询得知:

reduce 为 1,是因为:

没有使用 group by

使用了 order by

笛卡尔积

我 TM 都使了一遍,还是 reduce=1,我当时很无语,就尼玛不能再做清楚一点吗?(我可是小白呀!!!)

时间:3 个小时都没跑完,一直都是 83%

所以 hadoop,看到了这个语句,就会分配一个 reduce

如何欺骗 hive 分配 reduce 呢?

然后修改脚本(当然上面的   设置 reduce 数   这个不能少噢)

#  如何欺骗 hive 多分配 reduce
select a.uesrid,b.citycode,sum(b.register_num), ... ,sum(g.active_num) #  求聚合函数
(select userid,citycode from x) # x,y 表示这几个表中最小的一个表
full outer join
(select userid,unregister from y) # x,y 表示这几个表中最小的一个表
on (x.userid=y.userid) # (可交替的设置  y.userid=b.userid)full outer join 
(select userid,register_num from b)
on (x.userid=b.userid) #  关联条件,都用小表进行关联
right outer join
(select userid,active_num from a) #  最大的表放在最后
on (y.userid=a.userid) # (可交替的设置  y.userid=b.userid)group by a.userid,b.citycode; #  最后进行 group by

使用聚合函数,加 group by

然后小表放在前面(有人说:我 TM 要所有的信息,那你就用全连接呗)

然后大表一般就往后排,从小到大,一顺排下来就行

这样就能欺骗 hive 分配多个 reduce,达到调优的效果

时间:15 分钟不到,兴奋到高潮了吗?哈哈

缺点:

生成 200 个文件,比较麻烦

设置并行,对性能要求有点高,所以适度设置并行数量就行

并行参数,仅做参考

当参数为 false 的时候, 三个 job 是顺序的执行  

set hive.exec.parallel=false;

但是可以看出来其实两个子查询中的 sql 并无关系, 可以并行的跑

set hive.exec.parallel=true;

hive set hive.exec.parallel.thread.number;  (如果机器一般,可以并行设置 3,感觉比较合理)

hive.exec.parallel.thread.number=8     默认并行数为 8

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“hive 上亿级别的表关联如何调优”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!