使用Hive有一段时间了,目前发现需要进行优化的较多出现在出现join、distinct的情况下,而且一般都是reduce过程较慢。
Reduce过程比较慢的现象又可以分为两类:
情形一:map已经达到100%,而reduce阶段一直是99%,属于数据倾斜
情形二:使用了count(distinct)或者group by的操作,现象是reduce有进度但是进度缓慢,31%-32%-34%...一个附带的提示是使用reduce个数很可能是1
下面,笔者将以亲身经历的两次优化过程为例,给大家说明下笔者优化的思路及过程:
情形二(distinct):
示例sql:
select count(distinct A),count(B),count(distinct C) from T;
T的数据量峰值时候大概在2亿左右,文件大小约10G+,优化的思路:
1. 问题产生的RC是需要在大数据集下做多个字段的distinct,而且还是多个字段,所以最先需要设置set hive.groupby.skewindata=true
打散去重字段,但是目前hive不支持在一个sql中去重几个不同字段需要拆分后join;
2. 因为T是外部装载进入hive的,文件比较散乱,考虑先使用合并小文件,确保Map过程中不会因为资源不足而持续append状态;
3. 适当减少每个reduce处理的数据量,默认1G
综上,调整的参数如下:
set mapreduce.job.queuename=root.mapreduce.hourlyetl;
set mapred.min.split.size=128000000;
set mapred.min.split.size.per.node=128000000;
set mapred.min.split.size.per.rack=128000000;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set hive.exec.reducers.bytes.per.reducer=100000000;
set hive.groupby.skewindata=true;
代码调整为
select t1.a,t2.c
from
(
select count(distinct A) as a from T
)t1 join
(
select count(distinct C) as c from T
)t2
;
Job执行时间从13min缩减到5min(同一数据量下的T)
参考文章:
1.浅析hadoop中的数据倾斜:http://my.oschina.net/leejun2005/blog/100922
2.数据倾斜总结:http://www.alidata.org/archives/2109
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐