Spark数据倾斜

什么是数据倾斜

当某个任务相较于其他任务来说,迟迟执行不完时,很可能就是产生了数据倾斜。

比如,绝大部分任务十几秒中就执行完成了,而个别任务一小时甚至更久还没有执行完成。spark任务执行结束取决于最晚结束执行的stage。

stage的划分可以简单的理解为:遇到宽依赖是当前stage的结束,也是下一个stage的开始。

宽依赖(Wide Depencency,也称为Shuffle Depencency):子任务需要依赖父任务的全部分区。

窄依赖(narrow dependency):父RDD的一个分区只对应一个子RDD分区。

Spark数据倾斜产生的几种原因

  1. 空值导致的数据倾斜
  2. join的key类型不同导致的数据倾斜
  3. 大文件无法拆分导致的数据倾斜
  4. shuffle过程导致的数据倾斜

数据倾斜解决方案

  1. 过滤掉值为null,或者不符合业务场景的脏数据
  2. 检查所有的查询都预先过滤掉不需要的数据,保证对最小的数据集做处理
  3. ETL预先聚合一部分数据,再到spark做处理
  4. reduce join改为map join,map join会将小表进行广播,避免shuffle操作
  5. 曾加shuffle并行度
  6. 使用随机key实现双重聚合(groupByKey、reduceByKey比较适合使用这种方式),先给key新增随机前缀,变成多个不同的key,分到不同的task上做处理,做局本部聚合,后面再去除前缀重新聚合

 

 

 

 

 

 

 

 

 

 

 

 


版权声明:本文为sinat_24296421原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。