项目场景:
需求是一个作业,需要运行一组sql,所有sql运行完成,更新作业进度为100%,状态为完成。sql需要是在大数据平台,通过yarn调度,异步执行。 kafka监听每个sql的执行状态,所有sql执行完成,更新作业进度和状态。系统运行一段时间之后,突然频繁出现作业进度不能更新到100%。
这个系统部署了多个项目现场,稳定运行多年。出问题的这个项目也已经运行2年,突然出现了问题。同时运行10个作业,每个作业有50多个sql,有些作业可以回写状态100%,有些不能。任务不能正确回写到进度100%,比较随机。
目前的实现 方案:有一个任务表rwxx(id,zt…….), 一个字表rwxx_xq(id,rw_id,sql_id,sql,zt,…..), rwxx_xq表记录每个sql以及sql的状态。每个sql执行完成之后,会回写更新rwxx_xq的zt信息。统计rwxx_xq表这个rw_id状态都是完成状态,更新rwxx状态为完成,进度为100%
原因分析:
功能稳定运行了2年多,突然出问题,第一反应是不是项目现场环境问题,如磁盘空间不足,服务器内存不够,mysql服务器空间等等问题。排除一圈,发现现场环境稳定,平台别的功能正常,就我们子平台异常。
2、怀疑sql没有执行完成
子平台服务器、mysql等服务器排除之后,想着任务都会提交到yarn执行。所以去yarn上,查询这个任务对应的多个子sql,是不是任务运行完成。 结果那作业id,去yarn上查询,发现任务下面的sql都已经执行完成。
3、怀疑kafka消息没有发送或者没有接收
sql都执行完成了,但是rwxx_xq表没有更新状态。怀疑是不是执行完成之后,大数据平台没有成功给子平台发送kafka消息,或者发送了kafka消息,子平台没有接收到。
通过查询kafka,发现大数据平台正常发送了kafka消息,通过查询自己的日志,发现确实收到了kafka消息。
通过以上3步,基本判断环境没什么问题。就只能再审查相关的代码。说实话,因为多个项目正常运行多年的滤镜,是一点也不觉得代码有问题。
1、去线上服务器,down下了最近2天的运行日志,因为是kafka异步消息,当时做需求的时候,出于谨慎,收到消息都会打印日志。每运行一步,可能出错的地方都打印了日志。 因为是多服务器,运行又是多线程,看日志也非常复杂。
2、 通过日志,发现没更新rwxx_xq表的原因,居然是通过sql_id、和rw_id居然没在rwxx_xq表找到数据,所以跳过,没往下更新状态。
问题虽然定位到了,但是就很诡异,因为在rwxx_xq表有记录。然后就想着,难道是mysql部署了多台,数据不同步??
问题又陷入困顿,不知道问题在哪里了。 求助组内同学,大家一起头脑风暴。有个同事说,现在实现方案是
1、目前是先组装sql数据,提交任务给大数据平台执行。 大数据有定时任务,10秒去redis拉sql执行。
2、把sql任务写rwxx_xq表。
他说怀疑是提交大数据平台,sql很快执行成功,rwxx_xq表还有没写数据,导致了问题。顺着他的思路,比对了rwxx_xq表数据创建时间和kafka消息回写时间,确实是这个问题。
分析问题根因:
正常情况步骤1调接口成功之后,至少10秒+sql执行的时间,可能是20秒左右,数据才会开始回写。如果sql任务写到rwxx_xq表时间小于20秒,都不会出现问题。
但是项目现场运行多年,rwxx_xq累积到百万数据。往rwxx_xq一条条插入数据,50个数据,居然花了60秒。所以就导致了这个问题。
解决方案:
原文地址:https://blog.csdn.net/s07aser123/article/details/134612634
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_1839.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!