Hive 高级应用(二)之 Hive 数据倾斜
1、数据倾斜
由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点。
1.2、Hadoop 框架的特性
(1)不怕数据大,怕数据倾斜;
(2)Jobs 数比较多的作业运行效率相对比较低,如子查询比较多;
(3)sum、count、max、min 等聚集函数,通常不会有数据倾斜问题。
1.3、主要表现
任务进度长时间维持在 99% 或者 100% 的附近,查看任务监控页面,发现只有少量 reduce 子任务未完成,因为其处理的数据量和其他的 reduce 差异过大。单一 reduce 处理的记录数和平均记录数相差太大,通常达到好几倍之多,最长时间远大于平均时长。
1.4、容易数据倾斜情况
hive 中查询操作:
关键字 | 情形 | 后果 |
---|---|---|
join(1) | 其中一个表较小,但是 key 集中。 | 分发到某一个或几个 reduce 上的数据远高于平均值 |
join(2) | 大表与大表关联,但是分桶的判断字段 0 值或空值过多 | 这些空值都由一个 reduce 处理,非常慢。 |
group by | group by 的维度过小,某值的数量过多。 | 处理某值的 reduce 非常耗时。 |
count distinct | 某特殊值过多。 | 处理此特殊值的 reduce 耗时。 |
A、group by 不和聚集函数搭配使用的时候;
B、count(distinct),在数据量大的情况下,容易数据倾斜,因为 count(distinct)是按 group by 字段分组,按 distinct 字段排序;
C、 小表关联超大表 join。
1.5、产生数据倾斜的原因
(1)key 分布不均匀;
(2)业务数据本身的特性;
(3)建表考虑不周全;
(4)某些 HQL 语句本身就存在数据倾斜。
1.6、业务场景
1.6.1、空值产生的数据倾斜
(1)场景说明:在日志中,常会有信息丢失的问题,比如日志中的 user_id,如果取其中的 user_id 和用户表中的 user_id 相关联,就会碰到数据倾斜的问题。
(2)解决方案 1:user_id 为空的不参与关联
select * from log a join user b on a.user_id is not null and a