执行SQL作业时产生数据倾斜怎么办?
什么是数据倾斜?
数据倾斜是在SQL作业执行中常见的问题,当数据分布不均匀的情况下,一部分计算节点处理的数据量远大于其他节点,从而影响整个计算过程的处理效率。
例如观察到SQL执行时间较长,进入SparkUI查看对应SQL的执行状态,如图1所示,查看到一个stage运行时间超过20分钟且只剩余一个task在运行,即为数据倾斜的情况。
常见数据倾斜场景
Group By数据倾斜解决方案
取部分数据执行select count(*) as sum,Key from tbl group by Key order by sum desc查询具体是哪些key引起的数据倾斜。
然后对于倾斜Key单独做处理,加盐让其先将他分为多个task分别统计,最后再对分开统计结果进行结合统计。
例如:如下SQL示例,假设已知倾斜key为'Key01',导致单个task处理大量数据,做如下处理:
SELECT a.Key, SUM(a.sum) AS Cnt FROM ( SELECT Key, count(*) AS sum FROM tbl GROUP BY Key, CASE WHEN KEY = 'Key01' THEN floor(random () * 200) ELSE 0 END ) a GROUP BY a.Key;
JOIN数据倾斜解决方案
- 登录数据湖探索管理控制台,选择“SQL作业”,在要修改的作业所在行的“操作”列,单击“编辑”进入SQL编辑器界面。
- 在SQL编辑器界面,单击“设置”,在“配置项”尝试添加以下几个Spark参数进行解决。
参数项如下,冒号前是配置项,冒号后是配置项的值。
spark.sql.enableToString:false spark.sql.adaptive.join.enabled:true spark.sql.adaptive.enabled:true spark.sql.adaptive.skewedJoin.enabled:true spark.sql.adaptive.enableToString:false spark.sql.adaptive.skewedPartitionMaxSplits:10
spark.sql.adaptive.skewedPartitionMaxSplits表示倾斜拆分力度,可不加,默认为5,最大为10。
- 单击“执行”重新运行作业,查看优化效果。
运维指导 所有常见问题
- SQL作业运行慢如何定位
- 查看DLI SQL日志
- 查看DLI的执行SQL记录
- 执行SQL作业时产生数据倾斜怎么办?
- DLI控制台中无法查询到对应表
- OBS表压缩率较高
- 如何避免字符码不一致导致的乱码
- 删除表后再重新创建同名的表,需要对操作该表的用户和项目重新赋权
- DLI分区内表导入的文件不包含分区列的数据,导致数据导入完成后查询表数据失败
- 创建OBS外表,因为OBS文件中的某字段存在回车换行符导致表字段数据错误
- SQL作业中存在join操作,因为自动广播导致内存不足,作业一直运行中
- join表时没有添加on条件,造成笛卡尔积查询,导致队列资源爆满,作业运行失败
- 手动在OBS表的分区目录下添加了数据,但是无法查询到该部分数据
- 为什么insert overwrite覆盖分区表数据的时候,覆盖了全量数据?
- 为什么SQL作业一直处于“提交中”?
- 跨源连接RDS表中create_date字段类型是datetime,为什么dli中查出来的是时间戳呢?
- SQL作业执行完成后,修改表名导致datasize修改失败怎么办?
- 从DLI导入数据到OBS,为什么数据量出现差异?
more