问题概述
CREATE TABLE answer as
select * from a
left join b
on a.model_id=b.model_id
left join c
on a.model_id=c.model_id;
- 其中表a四千万行,b,c仅仅百万行,但是这个结果的reduce阶段却跑了12个小时,原本2GB的数据,生成了2T数据,150亿行数据。这是为什么呢???
分析
理解这个问题前游戏要了解一下hive join 的mr 原理join原理浅析
- 那怎们确定是数据倾斜呢,其实你看每个reduce的运行时间即可得知。
- 然后进一步的我研究了数据源 a,b,c关联键 model_id的特征
首先求一下每个model_id的个数,并排个序
model_id
72786
72786
70511
70511
69580
69580
68087
68087
67032
由此可见关联键重复严重,并且三张表的关联键都有不同程度的重复,然后在根据mr的join的原理,你就很容易理解为啥这么慢,为啥2G生成2T。
问题解决
因为是reduce 的压力大,
- 所以增加reduce的个数,
- 去重distinct,因为reduce慢的原因无非就是疯狂的写磁盘(因为生成了151亿条数据),而这些个本身就有很多的重复,所以去重后就会减少磁盘io
- join前对model_id去重。