文档章节

007.hive上亿级别的表关联 调优

片刻
 片刻
发布于 2014/06/13 11:40
字数 900
阅读 1K
收藏 3

环境:公司决定使用宽表,将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技术的进步,不就是这样相互交流共享学习吗?

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


© 著作权归作者所有

片刻
粉丝 107
博文 271
码字总数 308453
作品 0
海淀
高级程序员
私信 提问
007.hive调优:大数据倾斜

-----成王败寇(陈小春) 原文章地址:http://www.tbdata.org/archives/2109 hive大数据倾斜总结 在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显。主要...

片刻
2014/01/17
574
0
加速你的Hibernate引擎(上)

1.引言 Hibernate是最流行的对象关系映射(ORM)引擎之一,它提供了数据持久化和查询服务。 在你的项目中引入Hibernate并让它跑起来是很容易的。但是,要让它跑得好却是需要很多时间和经验的...

红薯
2010/11/03
957
1
生产环境大型sql语句调优实战第一篇(一)

在生产环境中有一条sql语句的性能极差,在早晨非高峰时段运行抽取数据,平均要花费40分钟,有时候竟然要跑10个多小时。 sql语句比较长,需要点耐心往下看。我对表的数据量都做了简单的说明。...

青夜之衫
2017/12/04
0
0
Oracle调优之no_unnest和unnest用法简介

Oracle调优之no_unnest和unnest用法简介 本博客介绍Oracle SQL调优的一种常用也是很实用的方法,也即和,介绍Oracle 的 、 之前,先介绍一下Hint。 Hint对于开发人员来说,可能不是很熟悉,但...

smileNicky
01/12
0
0
阿里规定超过3张表,禁止join,凭啥?

     来源:http://blog.itpub.net/30393770/viewspace-2650450   一、 问题提出 《阿里巴巴JAVA开发手册》里面写超过三张表禁止join,这是为什么? 二、问题分析 对这个结论,你是否有...

java进阶架构师
2019/11/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊artemis的maxDeliveryAttempts

序 本文主要研究一下artemis的maxDeliveryAttempts maxDeliveryAttempts activemq-artemis-2.11.0/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/AddressSe......

go4it
43分钟前
37
0
heroku - 如何查看所有日志

我在heroku上有一个小应用程序。 每当我想看日志时,我都会去命令行做 heroku logs 这只能让我看到大约100行。 有没有办法在heroku上查看我们的应用程序的完整日志? #1楼 对于雪松堆栈,请...

javail
50分钟前
37
0
Spring AOP 创建增强类

AOP联盟为增强定义了org.aopalliance.aop.Advice接口,Spring支持5种类型的增强: 1)前置增强:org.springframework.aop.BeforeAdvice 代表前置增强,因为Spring 只支持方法级的增强,所有M...

onedotdot
53分钟前
41
0
将.apply()与'new'运算符配合使用。 这可能吗?

在JavaScript中,我想创建一个对象实例(通过new运算符),但是将任意数量的参数传递给构造函数。 这可能吗? 我想做的是这样的(但是下面的代码不起作用): function Something(){ //...

技术盛宴
今天
74
0
世界最大双发客机 波音777X成功首飞

  据外媒报道,美国当地时间 1 月 25 日, 世界上最大的双引擎喷气客机波音 777X 完成首飞,全程 3 小时 51 分钟,从西雅图艾弗雷特佩恩机场起飞,降落在波音机场。   本次飞行将检验飞机...

水果黄瓜
今天
114
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部