什么是数据倾斜
当某个任务相较于其他任务来说,迟迟执行不完时,很可能就是产生了数据倾斜。
比如,绝大部分任务十几秒中就执行完成了,而个别任务一小时甚至更久还没有执行完成。spark任务执行结束取决于最晚结束执行的stage。
stage的划分可以简单的理解为:遇到宽依赖是当前stage的结束,也是下一个stage的开始。
宽依赖(Wide Depencency,也称为Shuffle Depencency):子任务需要依赖父任务的全部分区。
窄依赖(narrow dependency):父RDD的一个分区只对应一个子RDD分区。
Spark数据倾斜产生的几种原因
- 空值导致的数据倾斜
- join的key类型不同导致的数据倾斜
- 大文件无法拆分导致的数据倾斜
- shuffle过程导致的数据倾斜
数据倾斜解决方案
- 过滤掉值为null,或者不符合业务场景的脏数据
- 检查所有的查询都预先过滤掉不需要的数据,保证对最小的数据集做处理
- ETL预先聚合一部分数据,再到spark做处理
- reduce join改为map join,map join会将小表进行广播,避免shuffle操作
- 曾加shuffle并行度
- 使用随机key实现双重聚合(groupByKey、reduceByKey比较适合使用这种方式),先给key新增随机前缀,变成多个不同的key,分到不同的task上做处理,做局本部聚合,后面再去除前缀重新聚合