原因

  • 80%的流量来自20%的任务,遵循二八原则
  • 大多数大数据引擎默认的哈希分区算法,都无法使数据分散均匀
  • 某些记录存在异常,如null
  • 真正决定作业执行快慢的是最长的任务

解决思路

  1. Map端聚合

例如:将groupByKey改为reduceByKey
不可根治,但可适量减少

  1. 聚合多个列

例如:select * from … group by city_id, street_id, area_id
可帮助散列均匀

  1. 增加reduce个数

比较大的reducer里,key模100比模10更散

  1. Map Join

若表一大一小,则可以将小表broadcast,从而完全避免shuffle

  1. 获取倾斜的记录进行两轮join

a. 单个或几个key倾斜
Screen Shot 2022-05-14 at 11.43.33.png
b. 多个key倾斜,或未知key倾斜
对倾斜的key打上随机数,right side需要与随机数对应起来(replica/reproduce)
Screen Shot 2022-05-14 at 11.43.47.png

Spark解决数据倾斜的方法

对倾斜端进行切割,对right side进行replica
Screen Shot 2022-05-14 at 11.44.47.png