Spark数据倾斜和Hive数据倾斜理解
Spark数据倾斜出现的现象,原因,方案
现象:
- 单个或者某几个task拖延整个任务运行时间,导致整体耗时过大
- 单个task处理数据过多,很容易导致oom
原因:
(1)数据的问题:本身Key的分布不均,这里面含有null值,无效数据,有效数据
解决的方案是对前两点可以直接对数据过滤;对有效数据可以进行隔离操作,将异常的key单独处理,处理好后和正常数据进行union操作,也可以向添加随机值,进行操作后,去掉随机值,再执行一次操作;使用reduceByKey 代替 groupByKey
df.select(“key”).sample(false,0.1).map(k=>(k,1)).reduceBykey(_+_).map(k=>(k._2,k._1)).sortByKey(false).take(10)
(2)spark的使用问题:
解决方案:提高shuffle并行度,rdd和dataframe以及spark sql都可以进行相应参数上的设置;使用map join 代替reduce join(主要考虑的是小表不是很大的情况下,避免shuffle的过程)
Hive数据倾斜出现的原因,方案
1.key分布不均 空值产生的数据倾斜
过滤空值:select * from userid where user_id is not null
赋予空值添加随机值:select * from log a left join user b on case when a.user_id is null then concat(‘hive’,rand()) else a.user_id =b.user_id
2.把不同的数据类型进行关联也会出现数据倾斜
把int类型id转换成为string类型的id
select * from user a left join log b on b.user_id=cast(a.user_id as string)
3.大小表关联查询产生数据倾斜
使用map join来解决小表关联大表的数据倾斜问题。在hive0.11版本后可以设置mapjoin优化开关。