更新时间:2022-09-29 GMT+08:00
SQL作业中存在join操作,因为自动广播导致内存不足,作业一直运行中
问题现象
SQL作业中存在join操作,作业提交后状态一直是运行中,没有结果返回。
问题根因
Spark SQL作业存在join小表操作时,会触发自动广播所有executor,使得join快速完成。但同时该操作会增加executor的内存消耗,如果executor内存不够时,导致作业运行失败。
解决措施
- 排查执行的SQL中是否有使用“/*+ BROADCAST(u) */”强制做broadcastjoin。如果有,则需要去掉该标识。
- 设置spark.sql.autoBroadcastJoinThreshold=-1,具体操作如下:
- 登录DLI管理控制台,单击“作业管理 > SQL作业”,在对应报错作业的“操作”列,单击“编辑”进入到SQL编辑器页面。
- 单击“设置”,在参数设置中选择“spark.sql.autoBroadcastJoinThreshold”参数,其值设置为“-1”。
- 重新单击“执行”,运行该作业,观察作业运行结果。
父主题: 运维指导
运维指导 所有常见问题
- 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