Apache Dolphinscheduler如何不重启解决Master服务死循环
个人建议
Apache Dolphinscheduler作为一个开源的调度平台,目前已经更新到了3.X版本,4.0版本也已经呼之欲出。3.0版本作为尝鲜版本,新添加了许多的功能,同时也存在非常多的隐患,本人使用3.0版本作为生产调度也踩了很多坑,到现在依然存在很多难以解决的问题,所以建议小伙伴们尽量使用2.x版本,相对稳定一些。
近期在跟社区的沟通中,最新3.2.0版本,该问题已经得到解决!感兴趣可以了解最新版本。
下面主要记录的是一个3.0比较难搞的问题,相信不少使用过3.0的用户都遇到过Master服务中存在一些工作流一直不停的死循环的问题,本人到现在也没找到触发的原因,但是通过与同事的摸索,暂时找到了一个可以借助Arthas解决死循环的方法。
死循环的影响
CPU飙高:每个工作流的运行在Master中都是一个线程,当这个线程一直没有结束时,是会占用CPU资源的,当服务中存在大量的线程死循环时,可想而知,服务器的资源压力有多大。
磁盘打满:循环的线程内存在日志打印,当大量的线程无时无刻在打印日志时,日志文件会迅速堆积,磁盘的大小是固定的,当磁盘使用率超过一定的阀值时,其他的程序也会因为磁盘可用空间不足而受影响。有些人设置了Logback等日志框架配置,限定了日志文件的总大小,但是这样也会引发日志快速覆盖问题,无法找到可用的日志。
数据库压力:每个循环里面都有相关的数据库查询操作,大量的查询会造成数据库压力短期内迅速增大,如果数据库性能不能很好的话,可能数据库就会先挂了。
解决思路
1.首先我们需要判断循环类型,是内存性死循环还是数据库性死循环,因为内存性死循环,我们大部分可以通过修改数据库来解决,但是内存性死循环,我们就必须借助某些工具,去内存中修改。
2.通过日志查看,循环代码,并找到循环数据的来源。
3.通过查看日志,发现每次出现循环时都会出现“Start workflow error”、"Failed to submit the workflow instance"报错,当工作流出现问题时,程序会将工作流事件重新放回到执行队列中,等待下次执行,这样就变成了无限循环报错。
4.通过“Failed to submit the workflow instance”,我们在项目里全局搜索,查看报错的逻辑是什么,是如何将报错的工作流处理事件重新添加到处理队列中的。
5.从上面被红框圈出来的关键处代理,我们可以梳理出一个基本的master服务处理工作流的一个事件流程,工作流的线程类(WorkflowExecuteRunnable)被放到缓存中,缓存的key是工作流实例的ID,同时每一个工作流都有对应的事件,事件中存储工作流实例的ID,每次执行事件时都会从缓存中获取线程类,当线程类执行失败时便重新创建一个事件加入事件队列中执行,依次往复,除非缓存中的数据被清除了,才会结束循环。具体流程如下图:
通过清理内存中的工作流线程即可解决循环问题。
三、实际操作
1.进入Master服务的日志目录
2.通过日志查找所有在循环中的工作流实例的id
grep WorkflowInstance dolphinscheduler-master.log|grep "Start workflow error" |awk -F 'WorkflowInstance-' '{print $2}'| awk -F']' '{print $1}' |sort |uniq
4.安装Arthas,启动Arthas,选择API-Server服务,先使用API服务物理删除循环的工作流实例相关的数据库数据,防止下次重启后依然循环。
5.在Arthas中调用下面的方法
ognl '@org.apache.dolphinscheduler.service.bean.SpringApplicationContext@applicationContext.getBean("processServiceImpl").deleteWorkProcessInstanceById("工作流实例id")' ognl '@org.apache.dolphinscheduler.service.bean.SpringApplicationContext@applicationContext.getBean("processServiceImpl").deleteAllSubWorkProcessByParentId("工作流实例id")' ognl '@org.apache.dolphinscheduler.service.bean.SpringApplicationContext@applicationContext.getBean("processServiceImpl").deleteWorkProcessMapByParentId("工作流实例id")' ognl '@org.apache.dolphinscheduler.service.bean.SpringApplicati onContext@applicationContext.getBean("processServiceImpl").deleteWorkTaskInstanceByProcessInstanceId("工作流实例id")'
7.ognl表达式参考这个链接 https://arthas.aliyun.com/doc/ognl.html
8.通过Arthas进入master-server 调用ognl清除工作流缓存
ognl '@org.apache.dolphinscheduler.service.bean.SpringApplicationContext@applicationContext.getBean("processInstanceExecCacheManagerImpl").removeByProcessInstanceId("工作流实例id")'
本文由 白鲸开源科技 提供发布支持!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
浅谈搜索展现层场景化技术-tanGo实践
作者 | 搜索技术平台 导读 本文为搜索展现层相关技术,主线会先通过介绍搜索阿拉丁的产品形态,让读者初步了解什么是阿拉丁,及相关展现概念。之后会聚焦场景化产品,场景化是搜索构建沉浸式完美体验(重新组合整页阿拉丁和自然结果)的方案之一,相关检索技术繁多,不能完全覆盖到,本文主要介绍下背后的开发框架支撑 tanGo,会详细介绍下建设过程中的思考、遇到的问题及对应的解决方案。希望读者读完本文,有所收获。 全文4412字,预计阅读时间12分钟。 01 相关背景介绍 了解下什么是阿拉丁,阿拉丁是百度搜索推出的垂直化产品,用户使用搜索的过程中,提到的如百科、天气、POI、影视、体育、股票、汉语、翻译等等 Query 需求(如下示例了部分产品),都在不同程度的召回阿拉丁产品。 上面是搜索对单需求,需求簇(相同需求的多个单结果聚合)的满足样式,对于更复杂的场景,如高考、奥运会等大事件场景,搜索需要能进行场景的识别,进而召回不同的需求簇。 另技术上垂类部分业务也在做 PHP 迁移 Go,在这样的产品和技术背景下,搜索产研团队孵化设计了 tanGo 业务框架,下面会从需求分析->业务抽象->整...
- 下一篇
软件研发的道德情操
同理心 现代社会流行 ”同理心“(或称”共情“) 这个词,这个词用英文来表达是 _empathy_,例如我们在街上看到一对久别重聚的恋人,他们快乐的笑容,能够让我们会心一笑;而当我们看到有人因为罹患重病而一筹莫展的时候,我们也会发自内心地感到伤感。 当然,我们共情他人的快乐、悲伤、愤怒,除了因为这个人表现出来的情绪之外,还因为理解他表现情绪的动机,并且其动机是合理的。例如,如果某人因为被不小心撞了下,就愤怒地拿出刀来要去刺那个撞他的人,那么我们就绝不会共情这种愤怒;但是如果某人的妻女被人强奸,而他愤怒地拿出刀来要去刺那个伤害他家人的罪犯,我们都是能理解并认可这种愤怒的。 虽然人都有共情的能力,但能体验到的他人的快乐和悲伤的程度,相比自己的切身体验,往往是很弱的。一个病危的人的无助和孤独,陌生人即便在当场观察良久,能体验得到无助,恐怕还不到十一;一个中彩票的人的狂喜,旁人所能有的快乐体验也是很弱的,有的甚至还可能会有妒忌的情绪。 作为情绪的感受者和表现者,当我们的快乐、悲伤、愤怒等情绪,被周围的人所认可,那么我们的快乐会加倍,我们的悲伤亦能得到缓解,我们的愤怒亦能被认可是正当的,进而得到...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路