一、问题引入
依赖同事的一个表,发现今天任务产出特别晚,查询运行日志发现,运行了5个多小时
二、问题排查
1、查看SQL
SQL由多个JOIN组成,且较复杂,先猜测是数据倾斜造成的,但是改造后效果不理想。
2、查看日志,但在同一个作业里写了多段SQL,日志并不明显。
3、将SQL复制出来单独执行,并且与线上日志对比
本地执行时,发现卡在此处。对比线上日志,
耗时较长的task相同。
对比本地执行时的缩略图,大概能看出来是在执行哪一段SQL。
对应SQL
猜测是由不等值联结造成的,改造SQL,如下
AND substr(t1.day_str,1,10) = date_sub(t3.day_str,1)
再次执行,时间直接缩短到3分钟
4、小插曲:
在排查的过程中,有一个表用了开发环境数据(注:开发环境的数据少,可能影响测试的结果),在与同事对问题的时候发现了,但是改过来之后,还是在几分钟中执行完了。
三、问题总结:
1、任务要配置超时监控,像这种运行5个小时的任务要及时发现
2、在JOIN时,尽量不要写不等值联结。
3、排查问题的时候,不要在查询窗口执行,发现速度还可以就跳过,查询窗口有足够多的数据的时候就会返回,并不能反应真实的问题,如果想模拟线上的相同操作(会执行全部数据,反应出问题)