您的位置:首页 > 其它

Hive-hive.groupby.skewindata配置相关问题调研

2017-09-07 20:34 274 查看
使用Hive的过程中,我们习惯性用set hive.groupby.skewindata=true来避免因数据倾斜造成的计算效率问题,但是每个设置都是把双刃剑,最近调研了下相关问题,现总结如下:
从下表可以看出,skewindata配置真正发生作用,只会在以下三种情况下,能够将1个job转化为2个job: 
select count distinct ... from ...

select a,count(*) from ... group by a

select count(*),count(distinct ...) from


其中,该设置下会出现的错误的是:
select a,count(*),count(distinct...) from ... group by a
1
1

解决方案,需要将语句修改为:
select a,sum(1),count(distinct ...) from ... group by a
1
1
不同语句在是否进行该设置下的执行对比
语句 Set hive.groupby.skewindata=true Set hive.groupby.skewindata=false
 job数Groupby modejob数Groupby mode
count1final1mergepartitial
count distinct2partitials+final1mergepartitial
count * … group by2partitials+final1mergepartitial
count distinct … group by1complete1mergepartitial
count *,count distinct2partitials+final1mergepartitial
count *,count distinct … group by1complete1mergepartitial
sum(1),count distinct … group by1complete1mergepartitial
为了方便解释以上逻辑,现将UDAF相关mode解释如下:
UDAF MODE说明
completeiterate,terminate(从原始数据直接到最终汇聚结果)
partitial1iterate,terminatePartitial(从原始数据直接到部分汇聚结果)
partitial2merge,terminate(从部分汇聚直接到最终汇聚结果)
finaliterate,terminate(从原始数据直接到最终汇聚结果)
- Group by过程中设置MODE是在UDAF的mode基础上做了一层封装,具体如下:
Groupby mode说明
complete同UDAF的complete
partitial1同UDAF的partitial1
partitial2同UDAF的partitial2
partitialsnon-distinct: partitial1;

distinct:partitial2
final同UDAF的final
mergepartitialnon-distinct:final;

distinct:complete
由以上两张表可看出,hive.groupby.skewindata就是根据distinct/non-distinct的选择,直接将mode从mergepartitial设置成对应的确定形式,但是当distinct和non-distinct同时存在时,选择就会出问题。
TODO: 
虽然在 Count*,count distinct … group by 中,我们可以通过将count* 替换为sum(1)来解决问题,但是具体原因还需要通过调研两个不同的UDAF的实现方式进行进一步调研。
如何将一个select a,count(distinct b) from tbl group by a的形式改写成map-reduce的形式?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hive