1. 问题描述有任务平时跑20min今天1h21min延迟很严重2.现象描述排查了application 执行情况是数据倾斜stage 14执行耗时1.1h最大的task处理量 2.0 GB / 50336205 rows /12.2 GB昨天最大task 369.8MB/ 2980873 rows /1127.4 MB# 3.原因分析红框可以看出是数据倾斜task间处理数据量悬殊3. 问题排查3.1 关联key及主表维表数据量查看4. 问题原因上游表加字段数据量增大导致Spark执行计划发生了变化新的执行计划中有shuffle遇到了数据倾斜导致任务耗时增加具体情况如下在 2023-07-31 17:59:47上游表app_ea_dim_vender_info_map_d新增了4个字段同时加工任务也修改了修改后表每天的量由180MB增加到230MB引发spark执行计划变化之前spark预估的broadcast量是28.5MB小于设置的32MB走broadcastjoin模式类似于hive的mapjoin没有shuffle表增大后系统预估的broadcast量发为35.6MB大于设置的32MB走sortmergejoin模式这种模式会有多个shuffle其中一个shuffle出现了严重的数据倾斜。5.问题解决倾斜一般有两种解法非侵入式倾斜参数优化–conf spark.sql.autoBroadcastJoinThreshold67108864 ##改之前32MB调整为64MB侵入式业务逻辑处理也就是处理热点key下面详细展开数据倾斜的问题优先从数据源解决以下方法是辅助缓解 1spark-sql任务可以尝试distribute by()某个字段 2参考文档调优 https://blog.csdn.net/lsshlsw/article/details/52025949 3数据倾斜的定位方法 选取key对数据进行抽样统计出现的次数根据出现次数大小排序取出前几个 df.select(key).sample(false,0.1).(k(k,1)).reduceBykey(__).map(k(k._2,k._1)).sortByKey(false).take(10)经过分析倾斜的数据主要有以下三种情况: null空值或是一些无意义的信息()之类的,大多是这个原因引起。 无效数据大量重复的测试数据或是对结果影响不大的有效数据。 有效数据业务导致的正常数据分布。 4解决办法 第12种情况直接对数据进行过滤即可。 第3种情况则需要进行一些特殊操作常见的有以下几种做法。 隔离执行将异常的key过滤出来单独处理最后与正常数据的处理结果进行union操作。 对key先添加随机值进行操作后去掉随机值再进行一次操作。 5请注意SQL中Join关联key使用rand()可能导致数据重复丢失问题 建议认真阅读参考资料 http://www.jasongj.com/spark/skew/ https://www.iteblog.com/archives/1671.html https://blog.csdn.net/lsshlsw/article/details/52025949