SQL作业运行慢如何定位
作业运行慢可以通过以下步骤进行排查处理。
可能原因1:FullGC原因导致作业运行慢
判断当前作业运行慢是否是FullGC导致:
- 登录DLI控制台,单击“作业管理 > SQL作业”。
- 在SQL作业页面,在对应作业的“操作”列,单击“更多 > 归档日志”。
图1 归档日志
- 在OBS目录下,获取归档日志文件夹,详细如下。
- Spark SQL作业:
图3 container_xxx_000001归档日志文件夹示例
- Spark Jar作业:
- Spark SQL作业:
- 进入归档日志文件目录,在归档日志文件目录下,下载“gc.log.*”日志。
- 打开已下载的“gc.log.*”日志,搜索“Full GC”关键字,查看日志中是否有时间连续,并且频繁出现“Full GC”的日志信息。
图5 Full GC日志
FullGC问题原因定位和解决:
- 登录DLI控制台,选择SQL编辑器,在SQL编辑器页面选择问题作业的队列和数据库。
- 执行以下语句,查看作业中表的文件数量。“表名”替换为具体问题作业中的表名称。
select count(distinct fn) FROM (select input_file_name() as fn from 表名) a
- 如果小文件过多,则可以参考如何合并小文件来进行处理。
原因2 广播表:广播也可能会造成Driver内存的FullGC。
- 登录DLI控制台,单击“作业管理 > SQL作业”。
- 在SQL作业页面,在对应作业所在行,单击按钮,查看作业详情,获取作业ID。
图6 获取作业ID
- 在对应作业的“操作”列,单击“Spark UI”,进入“Spark UI”页面。
- 在“Spark UI”页面,在上方菜单栏选择“SQL”。参考下图,根据作业ID,单击Description中的超链接。
图7 单击作业链接
- 查看对应作业的DAG图,判断是否有BroadcastNestedLoopJoin节点。
图8 作业的DAG图。
- 如果存在广播,则参考SQL作业中存在join操作,因为自动广播导致内存不足,作业一直运行中处理。
可能原因2:数据倾斜
判断当前作业运行慢是否是数据倾斜导致:
- 登录DLI控制台,单击“作业管理 > SQL作业”。
- 在SQL作业页面,在对应作业所在行,单击按钮,查看作业详情信息,获取作业ID。
图9 获取作业ID
- 在对应作业的“操作”列,单击“Spark UI”,进入到Spark UI页面。
- 在“Spark UI”页面,在上方菜单栏选择“Jobs”。参考下图,根据作业ID,单击链接。
- 根据Active Stage可以看到当前正在运行的Stage运行情况,单击Description中的超链接。
- 在Stage中,可以看到每一个Task开始运行时间“Launch Time”,以及Task运行耗时时间“Duration”。
- 单击“Duration”,可以根据耗时进行排序,排查是否存在单个Task耗时过长导致整体作业时间变长问题。
数据倾斜原因和解决:
- 对join连接条件进行group by 和count,统计每个连接条件的key值的数量。示例如下:
lefttbl表和righttbl表进行join关联,其中lefttbl表的num为连接条件的key值。则可以对lefttbl.num进行group by和count统计。
SELECT * FROM lefttbl a LEFT join righttbl b on a.num = b.int2; SELECT count(1) as count,num from lefttbl group by lefttbl.num ORDER BY count desc;
从图11可以看出,num为1的数量远大于其他值的数量。 - 考虑在对应key值上添加concat(cast(round(rand() * 999999999) as string)随机数进行打散。
- 如果确实因为单个key值倾斜严重且不可对key值拼接随机值打散,则参考执行SQL作业时产生数据倾斜怎么办?处理。
运维指导 所有常见问题
- 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