海豚调度调优 | 如何解决任务被禁用出现的Bug
本系列文章是 DolphinScheduler 由浅入深的教程,涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。
祝开卷有益。
本系列教程基于 DolphinScheduler 2.0.5 做的优化。(稳定版推荐使用3.1.9)
上篇回顾:海豚调度调优 | 正在运行的工作流(DAG)如何重新拉起失败的任务(Task)
最近调度稳定运行一段时间了,有时间分享一下我们在使用海豚调度过程中遇到的问题和使用经验,希望可以帮到大家。
今天分享的是任务被禁用出现的 Bug,包含两个相关联的问题。
已有的功能:在一个 DAG(工作流)中,存在节点被禁用的情况,表示该节点不会执行,执行到这个节点的时候,可以跳过这个节点继续执行下游节点。
问题1[1]:在 Version 2.0.1 中,存在一个 BUG,如下图所示,有 6 个节点,其中 test1_stop 和 test2_stop 节点是被禁用的。
从上图可以看出,test3 依赖 test1_stop 和 test2_stop。但是执行的时候,发现 test2 节点还在运行呢,test3 就已经执行了,并没有等待所有上游节点运行结束。
上述问题如何解决呢?
新增一个递归向上查找间接依赖的方法(如果是上游节点被禁用了,继续向上查找)
新增 setIndirectDepList 方法,如果该节点的上游被禁用了,则继续寻找上游。最终把所有的上游加到 indirectDepCodeList 这里。
/**
* This function is specially used to handle the dependency situation where the parent node is a prohibited node.
* When the parent node is a forbidden node, the dependency relationship should continue to be traced
*
* @param taskCode taskCode
* @param indirectDepCodeList All indirectly dependent nodes
*/
private void setIndirectDepList(String taskCode, List<String> indirectDepCodeList) {
TaskNode taskNode = dag.getNode(taskCode);
List<String> depCodeList = taskNode.getDepList();
for (String depsNode : depCodeList) {
if (forbiddenTaskMap.containsKey(depsNode)) {
setIndirectDepList(depsNode, indirectDepCodeList);
} else {
indirectDepCodeList.add(depsNode);
}
}
}
在 isTaskDepsComplete 方法中,引用这个 list ,遍历。
好的,问题1[1]到这里就结束了,修复之后,test3 的直接上游节点 test2_stop 被禁用时,会继续往上找到 test2, 如果 test2 还在运行,test3 不会立刻运行。
**负杂的系统,随着不断迭代,总会伴随着小"惊喜"。继续往下看 **
上述新增的逻辑,带来了问题2[2],请看下图:运行test_del_node 节点,选择向后执行,按照正常的逻辑,会运行 test_del_node 和 test_del_node_36j 这两个节点。但是 test_del_node_36j 一直不执行。
查看 Master 日志发现,在提交 test_del_node_36j 这个节点的时候,出现了submit standby task error这个错误,拿到本地 debug 之后,发现在 setIndirectDepList 中出现了 NPE。最后定位到下面两行代码:
TaskNode taskNode = dag.getNode(taskCode);
List<String> depCodeList = taskNode.getDepList();
通过分析,最后发现是因为test_del_node_36j的节点的直接上游节点被禁用了,按照 setIndirectDepList 里面的逻辑,存在被禁用的节点,是会继续往上找的,找到间接依赖。
dag 在工作流启动的时候,根据 startNode 生成了关系图(dag),dag 里面只有两个节点: test_del_node 和 test_del_node_36j 。此时递归查找test_del_node_36j的上游节点的上游节点的时候,报了 NEP。
处理方式也比较简单,加一个 null 的判断。
这样,问题2[2]就解决了。
总结
问题1 在 2.0.3-release 中得到修复。
问题2 在 3.0.5-release 中得到修复。
如果不想升级的小伙伴,可以自行根据自己的版本,进行修改。
需要注意的是:
2.x 版本,对应的代码文件是 WorkflowExecuteThread.java
3.x 版本,对应的代码文件是 WorkflowExecuteRunnable.java
以上就是任务被禁用出现的Bug关联的两个问题的分享,如果有任何疑问,都可以与我交流,同样社区也推荐大家使用3.1.9版本,这是相对比较稳定的版本,上文中,还提到了 dag 的生成,下次接着讲,希望可以帮到你。
本文由 白鲸开源 提供发布支持!
海豚调度调优 | 如何解决任务被禁用出现的Bug的更多相关文章
- Spark性能调优之解决数据倾斜
Spark性能调优之解决数据倾斜 数据倾斜七种解决方案 shuffle的过程最容易引起数据倾斜 1.使用Hive ETL预处理数据 • 方案适用场景:如果导致数据倾斜的是Hive表.如果该Hiv ...
- mysql 数据库缓存调优之解决The total number of locks exceeds the lock table size错误
环境: mysql5.6.2 主从同步(备注:需操作主库和从库) 一.InnoDB表执行大批量数据的更新,插入,删除操作时会出现这个问题,需要调整InnoDB全局的innodb_buffer_poo ...
- kube-scheduler 调度调优
文章转载自:https://www.kuboard.cn/learning/k8s-advanced/schedule/tuning.html kube-scheduler 是 Kubernetes ...
- 系统性能调优CPU与内存
CPU相关术语 处理器:插到系统插槽或者处理器版上的物理芯片,以核或者硬件线程的方式包含了一块或者多块CPU. 核:一颗多核处理器上的一个独立CPU实例.核的使用时处理器扩展的一种方式,有称为芯片级多 ...
- Cloudera Hadoop 5& Hadoop高阶管理及调优课程(CDH5,Hadoop2.0,HA,安全,管理,调优)
1.课程环境 本课程涉及的技术产品及相关版本: 技术 版本 Linux CentOS 6.5 Java 1.7 Hadoop2.0 2.6.0 Hadoop1.0 1.2.1 Zookeeper 3. ...
- 如何合理的规划一次jvm性能调优
https://blog.csdn.net/miracle_8/article/details/78347172 摘要: JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的 ...
- 如何合理的规划jvm性能调优
JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松.为了更好的理解本篇所介绍的内 ...
- jvm调优原则
合理规划jvm性能调优 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松.为了 ...
- 【java虚拟机】jvm调优原则
转自:https://www.cnblogs.com/xiaopaipai/p/10522794.html 合理规划jvm性能调优 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考 ...
- mapreduce的调度算法和job调优
调度算法: mapreduce当有很多的作业在执行的时候,是按照什么顺序去执行的? 调度算法顺序需要关注: 1.提高作业的吞吐量. 2.要考虑优先级. 三种调度器:如果作业跑不完,并且机器资源利用率比 ...
随机推荐
- idea编译报错 静态Map初始化报错java.lang.ExceptionInInitializerError
idea编译报错 静态Map初始化报错java.lang.ExceptionInInitializerError package cc.mrbird.utils; import java.util.H ...
- python3读csv文件,出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 0: invalid con
使用csv.reader(file)读csv文件时,出现如下错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in positio ...
- DHorse v1.5.1 发布,基于 k8s 的发布平台
版本说明 新增特性 支持k8s的v1.30.x版本: 优化特性 优化回滚功能: 修复注册来源的回滚问题: 新增和修改应用时校验应用名: 升级kubernetes-client至v6.13.0: 调整部 ...
- 在 Visual Studio 2022 (Visual C++ 17) 中使用 Visual Leak Detector
1 问题描述 1.1 内存泄漏的困扰和解决之道 在C/C++程序开发过程中,开发者受益于C/C++的强大,与此同时也承受着C/C++程序开发的额外风险.像Java.C#这类带GC(内存垃圾回收)的编程 ...
- 关于 Jupyter Nbconvert 自定义 LaTeX 模板,中文兼容与格式设置,从 Notebook 构建 LaTeX PDF 文档
目录 为什么会有这篇随笔的内容? 简述一下我遇到的问题 Nbconvert 转换 .ipynb 文件的基本方法 Jupyter Nbconvert 构建中文 \(\LaTeX\) 文档的痛点 Jupy ...
- 【Playwright+Python】系列教程(二)手把手带你写一个脚本
一.如何使用代理方式打开网页 在 playwright.chromium.launch() 中传入 proxy 参数即可,示例代码如下: 1.同步写法: from playwright.sync_ap ...
- 我又学会了使用Range实现网络文件下载的断点续传
目录 前言 1.Range请求头 1.1.概述 1.2.使用限制 1.3.范围请求 1.4.预防资源变更 2.断点续传下载实现 2.1.流程设计 2.2.代码实现 2.3.运行结果 3.RandomA ...
- mysql+redis点赞功能剖析
最近在一个应用上需要用到点赞的功能,因为点赞的功能比较常用,很多人看到了大拇指就点了上去,如果单单采用mysql的方式的话可以会对数据库造成很大的压力. 我看了下网上一些博主的提供的解决方案,主要以m ...
- 个人团队兼职开发app(社交,语聊1v1,视频直播)
如果您有意向创业,意向社交类产品,如语聊,及时通信,视频直播,1v1等,又苦无没有人力资源. 我们岁数都是30+,在互联网行业摸爬滚打十年有余. 后端,前端,客户端,运维,四个人. 我们共事很长一段时 ...
- arm 移植 lighttpd + CGI 配置
--- title: arm 移植 lighttpd + CGI 配置 EntryName: porting-lighttpd-on-arm-and-make-cgi-config date: 202 ...