您的位置:首页 > 数据库

Hive SQL 数据倾斜总结

2017-01-05 00:00 239 查看
在海量数据下的数据查询中,数据倾斜是一个很恐怖的场景。常常看似很普通的数据查询,运行了几个小时也没有结果,其原因往往是发生了数据倾斜。如果真对数据倾斜采取相应的解决方法,那么查询效率将会大大提高。所以,分析数据倾斜是一件相当有意义的任务。本文总结不同情况下的数据倾斜,并分别给出解决方法。

数据倾斜

数据倾斜的实质,是hadoop在mr过程中,对key分发不均匀,导致某些节点上的任务明显比其他节点多,结果就是hadoop的多数节点空闲,而少数节点不停在运行。这样就大大降低了任务执行的效率,延长了执行时间。

数据倾斜主要由两种原因造成。一种是数据本身热点和非热点差异很大,存在长尾。比如10亿条的数据,大部分都属于少量的key,而其他大部分key都只占很少的数据量。这样在分发key的过程中,大量相同key的数据将会被集中到少量节点,从而造成数据倾斜。这种情况下,需要提前确定热点数据和非热点数据,分开处理。

另外一种造成数据倾斜的原因,是在join过程中,表之间的关联的key造成的。下面重点分析这种情况.

Join中的数据倾斜

有两种情况的join会造成数据倾斜,最常见的是大表和小表(作为从表)的join,这种情况下,大表中大量的key因为找不到小表中的匹配而分发不均匀。这种情况下,需对小表使用Mapjoin,将小表提前写入内存,并将join操作提前到map端执行,从而避免数据倾斜。

select /*+mapjoin(b)*/
a.c2,
b.c3
from
(select c1, c2 from t_large)a
left join
(select c1, c3 from t_small)b
on a.c1 = b.c1

另一种情况是当表中空值过多,在分发key的时候,空值聚集造成长尾。这种情况可以将空值处理成随机值,避免被分发至一处。

select ...
from
(select * from t_large_1)a
left join
(select * from t_large_2)b
on coalsece(a.id, rang()*9999) = b.id
-- coalsece方法处理a.id为null的情况
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: