海豚调度调优 | 如何解决任务被禁用出现的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.要考虑优先级. 三种调度器:如果作业跑不完,并且机器资源利用率比 ...
随机推荐
- url编码和解码分析URLEncoder.encode和URLDecoder.decode
url编码和解码分析 1.Get请求会将参数做默认的url解码操作,接口接收到的值是Get解码后的值.2.可以将Get操作修改成Post操作,这样不会url解码.可以在接口中做url解码.3.在多次传 ...
- 字符数组转换及数字求和 java8 lambda表达式 demo
public static void main(String[] args) throws IllegalAccessException { //字符串转换为数字且每个加上100,输出. String ...
- echo输出带颜色的字
文章目录 格式 所有颜色 字体样式 示例 格式 \033[A;F;Bm #放在文本的左边,可以影响后面所有字体的样式 解释: F代表字体颜色值(Font),颜色编号30~37. B代表背景颜色值(Ba ...
- 【论文阅读】RAL2020: UFOMap An Efficient Probabilistic 3D Mapping Framework That Embraces the Unknown
Last edited time: March 31, 2023 1:30 PM Reference and prenotes Paper link:https://ieeexplore.ieee.o ...
- xlookup与vlookup的区别
区别还是很大的,vlookup暂时扔不了.
- MSSQL慢查询查询与统计
查询MSSQL慢查询: SELECT TOP 20 TEXT AS 'SQL Statement',last_execution_time AS 'Last Execution Time' ,(tot ...
- 写给rust初学者的教程(一):枚举、特征、实现、模式匹配
这系列RUST教程一共三篇.这是第一篇,介绍RUST语言的入门概念,主要有enum\trait\impl\match等语言层面的东西. 安装好你的rust开发环境,用cargo创建一个空项目,咱们直接 ...
- Spring5.X bean自动装配Autowire属性
属性注入 set方法.构造函数.POJO.list.map.ref,属于手工注入,点我直达 Spring自动注入 使用<bean>元素的autowire属性为一个bean定义指定自动装配模 ...
- HBase 在统一内容平台业务的优化实践
作者:来自 vivo 互联网服务器团队-Leng Jianyu.Huang Haitao HBase是一款开源高可靠性.扩展性.高性能和灵活性的分布式非关系型数据库,本文围绕数据库选型以及使用HBas ...
- 解决方案 | MiKTex SSL connect error code 35
可能是:你的网络屏蔽了需要连接的网站,更换手机流量热点即可解决