如何批量杀死 Apache DolphinScheduler 运行中的工作流?
关键词: 大数据、数据调度、工作流、批量停止
整体说明
在调研了 DolphinScheduler 之后,在项目上实际使用了一段时间,遇到了任务过多僵死的问题,解决思路分享如下。
问题背景
- 任务依赖很多:从下图可以看出,有些任务的后续依赖很多,一旦失败,后续任务都得等待。这样就很容易导致后续任务被堵死。
- 循环任务很多,有很多任务本身是循环调用的其他任务的任务,会不停生成任务,循环任务本身也是任务,这就有可能导致任务堵死。
问题现象
就是很多任务,都在运行中的状态,但是就是不执行,因为他们占用了各自任务组的上限,导致卡死。当任务积累到一定程度,手工去杀死,太慢了,而且真的很累。
问题分析
我们现在就是要杀死这些任务,但是有一些要注意的点:
- 任务是全量任务,杀死不丢失数据: 只有全量任务,今天才能随意的去杀死,如果是增量的,就需要手工单独处理
- 下游任务今日不生成数据,不影响展示结果:下游的任务,或者说给客户展示的数据,这种高风险数据,不会因为今天的任务被杀死,而影响展示效果,数据一天不更新,不影响最终结果
解决方案
- 调用API批量杀死工作流:DolphinScheduler 是自带了很多的 API 接口的,可以批量新建或者停止工作流
- Python脚本:所以写了个脚本来完成这个事
脚本名称:dolpschedule-kill.py
# -*- coding: utf-8 -*- import requests # 项目环境,没法安装 python3 ,所以这个是 python2.7 的代码 # 配置信息 BASE_URL = "http://XXX.XXX.XXX.XXX:12345/dolphinscheduler" # 项目编码 # 查询后台数据库,或者页面F12 - 项目管理 - 项目列表 - 项目编码 PROJECT_CODE = "12194663850176" # 1. 获取 Token # 登录页面 - 安全中心 - 令牌管理 - 创建令牌 token = "6bff15e17667d95fdffceda08a19cc6c" # 2. 获取正在运行任务列表 def get_running_tasks(token, pageNo=1, pageSize=10): headers = {"token": token} task_list_url = "{0}/projects/{1}/process-instances?pageNo={2}&pageSize={3}&stateType=RUNNING_EXECUTION".format( BASE_URL, PROJECT_CODE, pageNo, pageSize) resp = requests.get(task_list_url, headers=headers) return [item['id'] for item in resp.json()['data']['totalList']] # 3. 批量停止任务 def batch_stop_tasks(token, task_ids): headers = {"token": token} for task_id in task_ids: stop_url = "{0}/projects/{1}/executors/execute?processInstanceId={2}&executeType=STOP".format( BASE_URL, PROJECT_CODE, task_id) resp = requests.post(stop_url, headers=headers) print("Task {0} stopped: {1}".format(task_id, resp.status_code)) # 主流程 if __name__ == "__main__": # 每次执行,杀死 100 个任务,可调整 running_tasks_ids = get_running_tasks(token, pageNo=1, pageSize=100) print("Found {0} running tasks".format(len(running_tasks_ids))) batch_stop_tasks(token, running_tasks_ids)
-
脚本执行
python dolpschedule-kill.py
-
执行效果
每个任务返回 200 ,说明执行任务成功
最终解决
最终,僵死的工作流全部被我杀死了,不过有时候会有一些僵死的任务实例(不是工作流)存在,这个没法用接口杀死。只能在后台修改,可以看我之前的文章 《DolphinScheduler 6 个高频 SQL 操作技巧》 解决无法被杀死的僵死任务实例。
原文链接:https://blog.csdn.net/pengpenhhh/article/details/149134569

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java ORM 代码量和性能对比:DoytoQuery vs SpringDataJPA/SpringJdbc/jOOQ/MyBatis-plus
TL;DR 代码量: DoytoQuery << SpringDataJPA/MyBatis-plus < jOOQ << SpringJdbc 查询性能:SpringJdbc > DoytoQuery > jOOQ >>> SpringDataJPA > MyBatis-plus 测试代码:https://github.com/f0rb/java-orm-comparison 介绍 本文基于几个常用的动态查询场景对比了基于对象查询映射(Object Query Mapping, OQM)方法的框架DoytoQuery与常用ORM框架(Spring Data JPA、Spring JDBC、jOOQ、MyBatis-plus)的代码量和查询性能。 实验设计 本实验旨在评估 DoytoQuery 与其他主流ORM框架在处理典型动态查询任务时的开发成本和运行效率。 实验对象 数据集来自Kaggle提供的工资数据 Data Science Salaries,共计 136,757 条记录。每条记录包含工作岗位、薪资、经验、工作类...
- 下一篇
TypeScript 进阶必备!5 个实用工具类型,帮你写出更健壮的前端代码
TypeScript 作为 JavaScript 的超集,凭借强大的类型系统让代码更健壮、更易维护。在日常开发中,自定义工具类型往往能帮我们高效解决类型安全问题。本文就分享 5 个实用的 TypeScript 自定义工具类型,或许能帮你规避常见坑点,甚至启发你打造专属工具类型来应对业务难题。 1. 用Process优雅处理状态流转 开发中你是否写过这样的状态定义? type State = { loading: boolean; error: string | null; data: User | null; }; const state: State = { loading: true, error: "", data: null, }; 这种写法的问题很明显:后续判断状态时需要叠加多个条件,代码冗余且易出错,比如: if (loading && !error && data) {} // 条件判断越来越复杂 解决方案:用"区分联合类型"优化 通过status字段作为"区分标志",明确状态的唯一可能性,避免多条件叠加: type State = | {...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8编译安装MySQL8.0.19
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境