文档章节

hive上亿级别的表关联 调优

开拓者-2017
 开拓者-2017
发布于 2014/07/05 14:28
字数 940
阅读 94
收藏 0

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

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


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

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

select a.uesrid,b.citycode,b.register_num,  ...  ,g.active_num 
from
(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,是因为:

  1. 没有使用group by

  2. 使用了order by

  3. 笛卡尔积

我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)  # 求聚合函数
from
(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


  1. 使用聚合函数,加 group by

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

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

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


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


缺点:

  1. 生成200个文件,比较麻烦

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


并行参数,仅做参考

当参数为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



太高兴了,作为一个程序员,要求不高:电脑高配,做的事情有挑战,并且花几天时间能调通,就满足勒

乐于分享交流,希望能帮到像我一样遇到此困难的人,呵呵

it技术的进步,不就是这样相互交流共享学习吗?

呵呵,那么。。。你做到吗?


© 著作权归作者所有

开拓者-2017
粉丝 38
博文 150
码字总数 301555
作品 0
大兴
程序员
私信 提问
007.hive上亿级别的表关联 调优

环境:公司决定使用宽表,将10个相关的大表进行全量关联 (1个上亿级别的表,5个上千万的表,剩下的表都不到百万的表) 花了两天的时间研究,测试 例如: a~g这几个表中,a表为上亿级别的表,...

片刻
2014/06/13
1K
0
Hive SQL数据倾斜及优化

1数据倾斜的原因 1.1操作: 关键词 情形 后果 Join 其中一个表较小, 但是key集中 分发到某一个或几个Reduce上的数据远高于平均值 大表与大表,但是分桶的判断字段0值或空值过多 这些空值都由...

张欢19933
2016/09/19
967
0
设定数据仓库平台Hive的参数

开发Hive应用时,不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率,或帮助定位问题。然而实践 中经常遇到的一个问题是,为什么设定的参数没有起作用? 这通常是错误...

红薯
2010/06/09
1.4K
0
hbase和hive关联,怎么利用StartRow、StopRow的特性来提高检索效率?

hbase和hive关联,hbase表大约10亿+的数据量,和hive关联后方便做批量处理,但是怎么利用hbase的StartRow、StopRow的特性来在hive提高检索效率?

sandyfog
2014/05/14
683
0
阿里数据处理平台 - Blink

Blink 最初是阿里巴巴内部的 Apache Flink 版本代号,基于阿里的场景做了大量的优化和稳定性改造工作。在经过一些讨论之后,我们决定将Blink的所有代码捐赠给Flink社区,并将其开源从而成为F...

匿名
2013/04/09
2W
0

没有更多内容

加载失败,请刷新页面

加载更多

处理CSV文件中的逗号

我正在寻找有关如何处理正在创建的csv文件的建议,然后由我们的客户上传,并且该值可能带有逗号(例如公司名称)。 我们正在研究的一些想法是:带引号的标识符(值“,”值“,”等)或使用|...

javail
45分钟前
21
0
如何克隆一个Date对象?

将Date变量分配给另一个变量会将引用复制到同一实例。 这意味着更改一个将更改另一个。 如何实际克隆或复制Date实例? #1楼 简化版: Date.prototype.clone = function () { return new ...

技术盛宴
今天
58
0
计算一个数的数位之和

计算一个数的数位之和 例如:128 :1+2+8 = 11 public int numSum(int num) { int sum = 0; do { sum += num % 10; } while ((num = num / 10) > 0); return sum;......

SongAlone
今天
67
0
为什么图片反复压缩后普遍会变绿,而不是其他颜色?

作者:Lion Yang 链接:https://www.zhihu.com/question/29355920/answer/119088684 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 业余版概要:安卓的...

shzwork
今天
47
0
每天AC系列(二):最接近的三数之和

1 题目 leetcode第16题,给定一个数组与一个目标数,找出数组中其中的三个数,这三个数的和要与目标数最接近。 2 暴力 按惯例先来一次O(n3)的暴力: int temp = nums[0]+nums[1]+nums[2];fo...

Blueeeeeee
今天
46
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部