
# SQL作业运行慢如何定位
作业运行慢可以通过以下步骤进行排查处理。
#### 可能原因1：FullGC原因导致作业运行慢
**判断当前作业运行慢是否是FullGC导致：**
1. 登录DLI控制台，单击"作业管理 \> SQL作业"。
2. 在SQL作业页面，在对应作业的"操作"列，单击"更多 \> 归档日志"。
   图1归档日志   
   ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001299464186.png) 
3. 在OBS目录下，获取归档日志文件夹，详细如下。
   - Spark SQL作业：
     查看带有"driver"或者为"container_*xxx* _000001"的日志文件夹则为需要查看的Driver日志目录。
     图2带有driver的归档日志文件夹名示例   
     ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001299953666.png)
     图3container_*xxx* _000001归档日志文件夹示例   
     ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001352353813.png) 
   
   - Spark Jar作业：
     Spark Jar作业的归档日志文件夹以"batch"开头。
     图4Spark Jar作业归档日志文件夹名示例   
     ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001299465966.png "点击放大") 
    
4. 进入归档日志文件目录，在归档日志文件目录下，下载"gc.log.\*"日志。
5. 打开已下载的"gc.log.\*"日志，搜索"Full GC"关键字，查看日志中是否有时间连续，并且频繁出现"Full GC"的日志信息。
   图5Full GC日志   
   ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001352626265.png "点击放大")
   
   
**FullGC问题原因定位和解决：**
**原因1 小文件过多** ：当一个表中的小文件过多时，可能会造成Driver内存FullGC。
1. 登录DLI控制台，选择SQL编辑器，在SQL编辑器页面选择问题作业的队列和数据库。
2. 执行以下语句，查看作业中表的文件数量。"*表名* "替换为具体问题作业中的表名称。
   ```
   select count(distinct fn)  FROM
   (select input_file_name() as fn from 表名) a
   ```
   
3. 如果小文件过多，则可以参考[如何合并小文件](https://support.huaweicloud.com/dli_faq/dli_03_0086.html)来进行处理。
 
**原因2 广播表**：广播也可能会造成Driver内存的FullGC。
1. 登录DLI控制台，单击"作业管理 \> SQL作业"。
2. 在SQL作业页面，在对应作业所在行，单击![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001299472334.png)按钮，查看作业详情，获取作业ID。
   图6获取作业ID   
   ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001352432425.png "点击放大") 
3. 在对应作业的"操作"列，单击"Spark UI"，进入"Spark UI"页面。
4. 在"Spark UI"页面，在上方菜单栏选择"SQL"。参考下图，根据作业ID，单击Description中的超链接。
   图7单击作业链接   
   ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001299473718.png "点击放大") 
5. 查看对应作业的DAG图，判断是否有BroadcastNestedLoopJoin节点。
   图8作业的DAG图。   
   ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001352514025.png "点击放大") 
6. 如果存在广播，则参考[SQL作业中存在join操作，因为自动广播导致内存不足，作业一直运行中](https://support.huaweicloud.com/dli_faq/dli_03_0182.html)处理。
 
#### 可能原因2：数据倾斜
**判断当前作业运行慢是否是数据倾斜导致：**
1. 登录DLI控制台，单击"作业管理 \> SQL作业"。
2. 在SQL作业页面，在对应作业所在行，单击![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001299478654.png)按钮，查看作业详情信息，获取作业ID。
   图9获取作业ID   
   ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001299798446.png "点击放大") 
3. 在对应作业的"操作"列，单击"Spark UI"，进入到Spark UI页面。
4. 在"Spark UI"页面，在上方菜单栏选择"Jobs"。参考下图，根据作业ID，单击链接。 ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001299475238.png "点击放大")
   
5. 根据Active Stage可以看到当前正在运行的Stage运行情况，单击Description中的超链接。 ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001299635390.png "点击放大")
   
6. 在Stage中，可以看到每一个Task开始运行时间"Launch Time"，以及Task运行耗时时间"Duration"。
7. 单击"Duration"，可以根据耗时进行排序，排查是否存在单个Task耗时过长导致整体作业时间变长问题。
   参考[图10]可以看到数据倾斜时，单个任务的shuffle数据远大于其他Task的数据，导致该任务耗时时间变长。
   图10数据倾斜示例图   
   ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001299958066.png "点击放大") 
**数据倾斜原因和解决：**
Shuffle的数据倾斜基本是由于join中的key值数量不均衡导致。
1. 对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的数量远大于其他值的数量。
   图11示例数据统计演示   
   ![](https://support.huaweicloud.com/dli_faq/zh-cn_image_0000001442479149.png "点击放大") 
2. 考虑在对应key值上添加concat(cast(round(rand() \* 999999999) as string)随机数进行打散。
3. 如果确实因为单个key值倾斜严重且不可对key值拼接随机值打散，则参考[执行SQL作业时产生数据倾斜怎么办？](https://support.huaweicloud.com/dli_faq/dli_03_0093.html)处理。
 
