当前位置: 首页 > news >正文

Apache Dolphinscheduler - 无需重启 Master-Server 停止疯狂刷日志解决方案

记录的是一个 3.0 比较难搞的问题,相信不少使用过 3.0 的用户都遇到过 Master 服务中存在一些工作流或者任务流一直不停的死循环的问题,导致疯狂刷日志。不过本人到现在也没找到最关键的触发原因,只是看到一些连锁反应带来的结果……

影响因素

CPU飙高:每个工作流的运行在 Master 中都是一个线程,当这个线程一直没有结束时,是会占用CPU资源的,当服务中存在大量的线程死循环时,可想而知,服务器的资源压力有多大。

磁盘打满:循环的线程内存在日志打印,当大量的线程无时无刻在打印日志时,日志文件会迅速堆积,磁盘的大小是固定的,当磁盘使用率超过一定的阀值时,其他的程序也会因为磁盘可用空间不足而受影响。有些人设置了 Logback 等日志框架配置,限定了日志文件的总大小,但是这样也会引发日志快速覆盖问题,无法找到可用的日志。

数据库压力:每个循环里面都有相关的数据库查询操作,大量的查询会造成数据库压力短期内迅速增大,如果数据库性能不能很好的话,可能数据库就会先挂了。

异常分类

工作流异常:经过排查,大概率发现工作流 state = 4 状态的实例会刷日志

任务流异常:经过排查,大概率发现任务流 state = 6 状态的实例会刷日志

状态枚举异常:工作流、任务流一些异常状态会集中到一个异常状态集合里,监听该异常状态集合时,导致会刷日志

以上 3 种情况也分别对应代码里 3 个关键实体类:ProcessInstanceExecCacheManagerImpl、StreamTaskInstanceExecCacheManagerImpl、StateEventHandlerManager

我们见名知意可知,这 3 个实体类分别对应以上 3 种异常分类,而且都属于 Java 缓存级别管理类!

解决思路

基本的 master 服务处理工作流的一个事件流程,工作流的线程类(WorkflowExecuteRunnable)被放到缓存中,缓存的 key 是工作流实例的 ID,同时每一个工作流都有对应的事件,事件中存储工作流实例的 ID,每次执行事件时都会从缓存中获取线程类,当线程类执行失败时便重新创建一个事件加入事件队列中执行,依次往复,除非缓存中的数据被清除了,才会结束循环。具体流程如下图

  1. 清空异常的工作流或任务流实例(数据库),否则重启又会重新读取问题流实例数据,又开始刷……
  2. 清空以上相关的 Java 缓存(重点看异常分类的 3 个关键类),这一步是关键不重启也可解决刷日志问题,否则需要重启来替代清空缓存的操作(不优雅)

具体操作

1、进入 Master-Server 的日志目录

2、通过 grep 筛选日志中存在的问题流实例 ID(工作流实例、任务流实例)

# 工作流实例
cat dolphinscheduler-master.log |grep "ERROR" | awk -F 'WorkflowInstance-' '{print $2}'
| awk -F']' '{print $1}' | sort | uniq# 任务流实例
cat dolphinscheduler-master.log |grep "ERROR" | awk -F 'TaskInstance-' '{print $2}'
| awk -F']' '{print $1}' | sort | uniq

Tips:这里有一点要注意,如果筛选出来有『0』的实例ID,这个经排查并没用,猜测属于系统默认ID(无视即可),而且发现规律:在日志中,如果 A 或 B 等于 0 或都等于 0,其实只要关心有正常业务值实例ID一方即可,意味着每次业务主要问题是由他(工作流实例或任务流实例)引起,如果都有正常值,那么属于任务流实例问题引起

……[WorkflowInstance-A][TaskInstance-B]……

3、分别在 Api-Server 和 Master-Server 搭建 Arthas 框架,将筛选出来的实例 ID 替换 OGNL 调用函数参数

  • Arthas 快速入门见文档:快速入门 | arthas

4、删除工作流实例、任务流实例数据库数据(Api-Server 执行)

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.SpringApplicationContext@applicationContext.getBean("processServiceImpl").deleteWorkTaskInstanceByProcessInstanceId("工作流实例ID")'

如果不想清空数据库实例,我们刚讲过主要也是因为 state = 4 引起的问题,可以通过改工作流数据库状态也是可以的

UPDATE t_ds_process_instance SET state = 5 WHERE state = 4 AND id = 工作流实例ID;

5、清空 Java 缓存(Master-Server 执行)

# 工作流实例缓存
ognl  '@org.apache.dolphinscheduler.service.bean.SpringApplicationContext@applicationContext.getBean("processInstanceExecCacheManagerImpl").removeByProcessInstanceId("工作流实例ID")'# 任务流实例缓存
ognl  '@org.apache.dolphinscheduler.service.bean.SpringApplicationContext@applicationContext.getBean("streamTaskInstanceExecCacheManagerImpl").removeByTaskInstanceId("任务流实例ID")'# 异常枚举缓存
ognl  '@org.apache.dolphinscheduler.server.master.event.StateEventHandlerManager@stateEventHandlerMap.clear()'

Tips:最后一步因为一刀切可能会误伤正常业务状态,所以最好等到只剩这些异常业务的时候再执行,也可进一步做一些定位异常业务的工作流实例ID进行精准清空(后续更新……)

附加

  • ​​​​​​Arthas - Can not read arthas version from: https://arthas.aliyun.com/api/latest_version
  • Arthas - Unable to open socket file: target process not responding or HotSpot VM not loaded
  • 近期在跟社区的沟通中,3.1.9 和 3.2.0 版本都有涉及过该 BUG 的代码修复,使得该问题已经得到解决,感兴趣可以了解最新版本

相关文章:

Apache Dolphinscheduler - 无需重启 Master-Server 停止疯狂刷日志解决方案

记录的是一个 3.0 比较难搞的问题,相信不少使用过 3.0 的用户都遇到过 Master 服务中存在一些工作流或者任务流一直不停的死循环的问题,导致疯狂刷日志。不过本人到现在也没找到最关键的触发原因,只是看到一些连锁反应带来的结果…… 影响因素…...

竞争优势:大型语言模型 (LLM) 如何重新定义业务策略

人工智能在内容创作中的突破 在当今快节奏的商业环境中,像 GPT-4 这样的大型语言模型 (LLM) 不再只是一种技术新颖性; 它们已成为重新定义跨行业业务战略的基石。 从增强客户服务到推动创新,法学硕士提供了企业不容忽视的竞争优势。 1. 加强…...

Spring AOP和AspectJ AOP区别

Spring AOP(Aspect-Oriented Programming)和 AspectJ AOP 是两种不同的 AOP 实现方式,它们在实现上有一些区别。下面是它们之间的主要区别: 基于代理 vs 字节码增强: Spring AOP: Spring AOP 是基于代理的…...

FREERTOS信号量详解

信号量是操作系统中重要的一部分,信号量一般用来进行资源管理和任务同步,资源管理其实就是用变量来标记现有资源的数量,任务同步其实就是用标志位来控制任务的先后执行顺序,这些概念在操作系统中以及裸机开发中都有所涉及。 FreeR…...

每天学习一个Linux命令之vim

每天学习一个Linux命令之vim Vim是一款功能强大的文本编辑器,在Linux系统中广泛使用。本篇博客将介绍一些常用的Vim命令及其选项,帮助您更好地使用Vim进行文本编辑。 命令及选项 以下是Vim的常用命令及其可用选项: 1. 打开文件 $ vim fi…...

linux环境部署

war包环境 在Linux系统上部署准备war包环境 查看linux当前版本和系统类型 [rootlocalhost ~]# uname -a Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linuxlinux 打包文件夹 使用tar命令&#xff1…...

上位机图像处理和嵌入式模块部署(qmacvisual图像预处理)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 不管大家是在读书的时候学习的图像处理,还是在后来的工作中,重新学习了图像处理,相信大家对图像预处理的概念并…...

C语言内存函数详解

文章目录 前言一、memcpy函数(内存拷贝函数)二、memmove重叠拷贝函数三.memset内存设置函数四.memcmp内存比较函数总结 前言 我们之前按学习了C语言标准库中提供了一系列的字符和字符串库函数,接下来我们就学习一下关于内存相关的一些函数。…...

详解Redis的持久化RDB和AOF

Redis的持久化是将内存中的数据同步到硬盘的过程 具体来说,Redis支持两种主要的持久化方式:RDB 和 AOF。 RDB(Redis Database) 简介 默认持久化方式 RDB会将内存中的数据快照保存到磁盘上的一个二进制文件中。这个文件包含了…...

详细分析Js中的Promise.all基本知识(附Demo)

目录 1. 基本知识2. Demo3. 实战 1. 基本知识 Promise.all 是 JavaScript 中的一个方法,它接受一个由 Promise 对象组成的数组作为参数,并在所有 Promise 对象都变为 resolved(已完成)状态时才返回一个新的 Promise 对象&#xf…...

const,static深度总结——c++穿透式分析

前言;c类和对象的知识点中除了几种默认函数, 比较重要的还有使用const和static修饰成员相关知识点。const在c中特性很简单。 但是在使用中, 比较容易疏忽大意出现问题。 static特性也很简单, 但是比起const来要直接的多。 在使用中…...

快速搭建一个一元二次方程flask应用

新建flask_service目录、templates子目录 flask_service —— app.py —— templates —— —— index.html app.py from flask import Flask, request, jsonify, render_template import random import matplotlib.pyplot as plt from io import BytesIO import base64app F…...

O2OA红头文件流转与O2OA版式公文编辑器基本使用

O2OA开发平台在流程管理中,提供了符合国家党政机关公文格式标准(GB/T 9704—2012)的公文编辑组件,可以让用户在包含公文管理的项目实施过程中,轻松地实现标准化公文格式的在线编辑、痕迹保留、手写签批等功能。并且可以…...

软件测试:C++ Google Test单元测试框架GTest

目录 编译和安装框架使用AssertionsGoogle TestingGoogle MockingMatchersActions 运行结果 最近在写项目的时候,学到了许多关于软件测试的知识,也不断的使用新的测试框架和测试工具,每次总是机械式的拼接其他人的代码,代码发生错…...

大数据面试题 —— HBase

目录 什么是HBase简述HBase 的数据模型HBase 的读写流程HBase 在写的过程中的region的split的时机HBase 和 HDFS 各自的使用场景HBase 的存储结构HBase 中的热现象(数据倾斜)是怎么产生的,以及解决办法有哪些HBase rowkey的设计原则HBase 的列…...

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…...

SpringMVC的执行原理

SpringMVC的执行原理可以简单地概括为以下几个步骤: 客户端发送请求:客户端(一般是浏览器)发送HTTP请求到服务器,请求特定的URL资源。 前端控制器(DispatcherServlet)接收请求:在Sp…...

Qt + HTTP 线程交互类封装

介绍 QT的HTTP模块封装的交互类&#xff0c;线程运行。使用时添加自己的业务逻辑即可 代码 头文件 /*** file httpcontroller.h* brief 云台相机的协议交互类* author xintong-zhou* date 2024-03-13*/#ifndef HTTPCONTROLLER_H #define HTTPCONTROLLER_H#include <QNet…...

GitHub Copilot+ESP开发实战-串口

上篇文章讲了GitHub Copilot在应用中可能遇到的问题&#xff0c;接下来小启就简单介绍下GitHub Copilot在ESP32开发中C语言实现串口功能&#xff0c;感兴趣的可以看看。 一、向Copilot提问&#xff1a; 1. ESP32用C语言实现串口初始化&#xff1b; 2.配置uart为1&#xff0c…...

C# 使用ffmpeg将图片保存为mp4视频

使用 FFmpeg 这个强大的多媒体处理工具&#xff0c;可以轻松地将一系列图片转换为一个 MP4 视频文件。以下是一个基本的命令行示例来完成这个任务&#xff1a; ffmpeg -framerate 25 -i image-%03d.jpg -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4 命令参数说明&#xf…...

5分钟掌握开源自动化神器:零基础快速上手指南

5分钟掌握开源自动化神器&#xff1a;零基础快速上手指南 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo 还在为重复的鼠标…...

Rust的匹配中的编译器行为

Rust的匹配机制以其强大的安全性和灵活性著称&#xff0c;而编译器在背后的行为更是其精髓所在。匹配不仅是语法糖&#xff0c;更是编译器进行静态分析、优化和错误检查的核心工具。通过深入理解编译器如何处理匹配表达式&#xff0c;开发者可以写出更高效、更安全的代码。本文…...

KNIME Server值不值得买?中小团队协作与自动化部署的深度体验报告

KNIME Server值不值得买&#xff1f;中小团队协作与自动化部署的深度体验报告 当你的数据分析团队从三五人扩展到十几人&#xff0c;每天早上的第一件事不再是喝咖啡&#xff0c;而是处理各种工作流版本冲突、手动执行定时任务、反复解释流程逻辑时&#xff0c;KNIME Server这个…...

**发散创新:用Python构建高效率基因序列比对分析工具**在生物信息学领域,**基因序列比对

发散创新&#xff1a;用Python构建高效率基因序列比对分析工具 在生物信息学领域&#xff0c;基因序列比对是核心任务之一。无论是研究人类疾病突变、进化关系&#xff0c;还是开发个性化医疗方案&#xff0c;准确高效的比对算法都至关重要。本文将带你从零开始&#xff0c;使…...

CANoe测试模块怎么选?XML vs CAPL Test Module,我用700人投票结果告诉你

CANoe测试模块选择指南&#xff1a;XML与CAPL的深度对比与实战建议 在汽车电子测试领域&#xff0c;CANoe作为行业标杆工具&#xff0c;其测试模块的选择往往让新手工程师感到困惑。最近一项针对700名工程师的调研显示&#xff0c;70%的受访者倾向于使用XML Test Module&#x…...

STM32 DAP 烧录报错-最终解决方法的原理和操作逻辑

STM32 DAP 烧录报错&#xff08;SWD/JTAG Communication Failure / Flash Download failed&#xff09;最终解决方法的原理和操作逻辑针对遇到的 SWD/JTAG Communication Failure、Flash Download failed - Target DLL has been cancelled、Flash Download failed - "Cort…...

从Java老手到Rust新手:我在IntelliJ IDEA里踩过的那些‘环境坑’及填坑记录

从Java老手到Rust新手&#xff1a;我在IntelliJ IDEA里踩过的那些‘环境坑’及填坑记录 第一次在IntelliJ IDEA里创建Rust项目时&#xff0c;我下意识地点击了"New Project"——就像过去十年里创建Java项目那样自然。然而接下来的半小时&#xff0c;我的表情从困惑变…...

Proteus仿真+实物调试:手把手教你搞定STC单片机数码管动态显示的‘鬼影’与亮度不均

STC单片机数码管动态显示实战&#xff1a;从仿真到实物的‘鬼影’消除指南 数码管动态显示是嵌入式开发中的经典课题&#xff0c;但许多开发者在Proteus仿真完美运行后&#xff0c;烧录到STC89C51RC等实物单片机时却遭遇了"鬼影"、亮度不均等棘手问题。本文将带你深入…...

2025届最火的五大降重复率神器解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 用于极大助力写作的辅助工具一键论文生成器&#xff0c;借助先进智能算法与自然语言处理技术…...

5步恢复B站经典界面:Bilibili-Old完整实施手册

5步恢复B站经典界面&#xff1a;Bilibili-Old完整实施手册 【免费下载链接】Bilibili-Old 恢复旧版Bilibili页面&#xff0c;为了那些念旧的人。 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Old 你是否厌倦了B站新版界面的复杂设计&#xff1f;每次打开视频…...