1、处理方式
数据倾斜的问题优先从数据源解决,以下方法是辅助缓解:
- spark-sql任务,可以尝试distribute by () 某个字段
- 参考文档调优: https://blog.csdn.net/lsshlsw/article/details/52025949
- 数据倾斜的定位方法:
选取key,对数据进行抽样,统计出现的次数,根据出现次数大小排序取出前几个
df.select("key")
.sample(false,0.1)
.(k=>(k,1))
.reduceBykey(_+_)
.map(k=>(k._2,k._1))
.sortByKey(false)
.take(10)
2、数据倾斜情况
- null(空值)或是一些无意义的信息()之类的,大多是这个原因引起。
- 无效数据,大量重复的测试数据或是对结果影响不大的有效数据。
- 有效数据,业务导致的正常数据分布。
3、解决办法
- 第1,2种情况,直接对数据进行过滤即可。
- 第3种情况则需要进行一些特殊操作,常见的有以下几种做法。隔离执行,将异常的key过滤出来单独处理,最后与正常数据的处理结果进行union操作。对key先添加随机值,进行操作后,去掉随机值,再进行一次操作。
4、注意事项
SQL中Join关联key使用rand()可能导致数据重复(丢失)问题
5、参考资料
建议认真阅读参考资料: