第7章 数据倾斜优化
7.1 数据倾斜说明
数据倾斜问题,通常是指参与计算的数据分布不均,即某个key或者某些key的数据量远超其他key,导致在shuffle阶段,大量相同key的数据被发往一个Reduce,进而导致该Reduce所需的时间远超其他Reduce,成为整个任务的瓶颈。
Hive中的数据倾斜常出现在分组聚合和join操作的场景中,下面分别介绍在上述两种场景下的优化思路。
7.2 分组聚合导致的数据倾斜
示例SQL语句如下:
select
province_id,
count(*)
from dwd_trade_order_detail_inc
where dt='2020-06-16'
group by province_id;
7.2.1 优化前执行计划
7.2.2 优化思路
由分组聚合导致的数据倾斜问题主要有以下两种优化思路:
1)启用map-side聚合
相关参数如下:
--启用map-side聚合
set hive.map.aggr=true;
--hash map占用map端内存的最大比例
set hive.map.aggr.hash.percentmemory=0.5;
启用map-side聚合后的执行计划如下图所示:
2)启用skew groupby优化
其原理是启动两个MR任务,第一个MR按照随机数分区,将数据分散发送到Reduce,完成部分聚合,第二个MR按照分组字段分区,完成最终聚合。
相关参数如下:
--启用分组聚合数据倾斜优化
set hive.groupby.skewindata=true;
启用skew groupby优化后的执行计划如下图所示:
7.3 join导致的数据倾斜
示例SQL语句如下。
select
*
from
(
select
*
from dwd_trade_order_detail_inc
where dt='2020-06-16'
)fact
join
(
select
*
from dim_province_full
where dt='2020-06-16'
)dim
on fact.province_id=dim.id;
7.3.1 优化前的执行计划
7.3.2 优化思路
由join导致的数据倾斜问题主要有以下两种优化思路:
1)使用map join
相关参数如下:
--启用map join自动转换
set hive.auto.convert.join=true;
--common join转map join小表阈值
set hive.auto.convert.join.noconditionaltask.size
使用map join优化后执行计划如下图。
2)启用skew join优化
其原理如下图:
相关参数如下:
--启用skew join优化
set hive.optimize.skewjoin=true;
--触发skew join的阈值,若某个key的行数超过该参数值,则触发
set hive.skewjoin.key=100000;
需要注意的是,skew join只支持Inner Join。
启动skew join优化后的执行计划如下图所: