1.什么是数据倾斜?
就是由于某个或者某几个 key对应的数据量过大 从而导致对应的task处理非常慢 或者运行报错
2.导致的原因?
1.只有shuffle才有可能导致数据倾斜
join、groupby 、count(distinct)
3.解决方法:
1.由group by 导致的数据倾斜
解决法1.通过更改hive 参数来解决
hive.groupby.skewindata => sql处于数据倾斜是 会优化 groupby
hive.map.aggr => map端开启一个聚合
解决法二2.不通过参数,用户自己定义的 udf函数
思想:加前缀(add_suffix) 减前缀(pre_suffix )
eg:
select
pre_suffix(n_deptno) as pre_deptno,
sum(cnt) as cnt_sum
from
(
select
add_suffix(deptno) as n_deptno,
count(1) as cnt
from emp
group by add_suffix(deptno)
) as as
group by pre_suffix(n_deptno);
2.由count(distinct) 导致的数据倾斜
select count(distinct deptno) from emp_tmp ;
distinct => job只有一个 task 只有一个reduce task来完成 =》 必然导致数据倾斜问题
设置reduce 个数 是没有用的
去重: distinct 性能不行
解决: 通过 group by 进行去重
3由join导致的数据倾斜
1.shuffle join/ mapreduce join 普通join
2.map join =》 不会导致数据倾斜
1).由普通join 导致数据倾斜 如何解决? 工作遇到了 可能low怎么解决
1. 直接抽取 skew数据
sql:
2个sql :
1sql =》 skew key join
2sql =》 no skew key join
a 表
b 表
得有一个表是小表
2).由map join导致数据倾斜 如何解决?:
解决法1.参数设置
set hive.auto.convert.join=true;
set hive.auto.convert.join=false;
select
a.*,
b.*
from user_click as a left join product_info as b
on a.product_id=b.product_id
limit 2;
解决法2.hints写法: sparksql 也有这种写法 好用的
set hive.auto.convert.join=true;
select /*+ MAPJOIN(product_info) */
a.*,
b.*
from user_click as a left join product_info as b
on a.product_id=b.product_id
limit 2;