本系列文章是 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的更多相关文章

  1. Spark性能调优之解决数据倾斜

    Spark性能调优之解决数据倾斜 数据倾斜七种解决方案 shuffle的过程最容易引起数据倾斜 1.使用Hive ETL预处理数据    • 方案适用场景:如果导致数据倾斜的是Hive表.如果该Hiv ...

  2. mysql 数据库缓存调优之解决The total number of locks exceeds the lock table size错误

    环境: mysql5.6.2  主从同步(备注:需操作主库和从库) 一.InnoDB表执行大批量数据的更新,插入,删除操作时会出现这个问题,需要调整InnoDB全局的innodb_buffer_poo ...

  3. kube-scheduler 调度调优

    文章转载自:https://www.kuboard.cn/learning/k8s-advanced/schedule/tuning.html kube-scheduler 是 Kubernetes ...

  4. 系统性能调优CPU与内存

    CPU相关术语 处理器:插到系统插槽或者处理器版上的物理芯片,以核或者硬件线程的方式包含了一块或者多块CPU. 核:一颗多核处理器上的一个独立CPU实例.核的使用时处理器扩展的一种方式,有称为芯片级多 ...

  5. 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. ...

  6. 如何合理的规划一次jvm性能调优

    https://blog.csdn.net/miracle_8/article/details/78347172 摘要: JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的 ...

  7. 如何合理的规划jvm性能调优

    JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松.为了更好的理解本篇所介绍的内 ...

  8. jvm调优原则

    合理规划jvm性能调优 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松.为了 ...

  9. 【java虚拟机】jvm调优原则

    转自:https://www.cnblogs.com/xiaopaipai/p/10522794.html 合理规划jvm性能调优 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考 ...

  10. mapreduce的调度算法和job调优

    调度算法: mapreduce当有很多的作业在执行的时候,是按照什么顺序去执行的? 调度算法顺序需要关注: 1.提高作业的吞吐量. 2.要考虑优先级. 三种调度器:如果作业跑不完,并且机器资源利用率比 ...

随机推荐

  1. 关于Lecture2建立一个Git远程仓库的补充

    Smiling & Weeping ---- 心之何如,有似万丈迷津, 遥亘千里. 其中并无舟子可渡人, 除了自渡,他人爱莫能助. Git 远程仓库(Github) Git 并不像 SVN 那 ...

  2. Kubernetes(八)安全认证

    安全认证 本章主要介绍Kubernetes的安全认证机制. 1. 访问控制概述 Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务.所谓的安全性其实就是保证对Kube ...

  3. uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系

    按各地址起作用的顺序,uboot引导linux内核启动涉及到以下地址: load address: entry point: 这两个地址是mkimage时指定的 bootm address:bootm ...

  4. Profinet IO从站数据 转EtherCAT项目案例

    目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 使用PRONETA软件获取PROFINET IO从站的配置信息 2 5 设置网关采集PROFINETIO从站设备数据 5 ...

  5. 【论文阅读】ICML2020: Can Autonomous Vehicles Identify, Recover From, and Adapt to Distribution Shifts?

    Column: January 6, 2022 7:18 PM Last edited time: January 30, 2022 12:14 AM Sensor/组织: Oxford Status ...

  6. SpringBoot读取配置文件的几种方式

    示例 user: name: zhaotian age: 18 sex: 男 @Value注解 @Value注解是Spring框架提供的用于注入配置属性值的注解,它可用于类的成员变量.方法参数和构造函 ...

  7. Unable to start web server; nested exception is org.springframework.context.ApplicationContextException

    项目报错:Unable to start web server; nested exception is org.springframework.context.ApplicationContextE ...

  8. windows 安装fvm 安装使用FVM,管理多版本flutter

    背景:win10 1,先用clash代理powershell命令,解决网络问题 2.使用dart 安装FVM dart pub global activate fvm 3.安装后检查系统环境变量 3. ...

  9. 透视开源生态,OSGraph——GitHub全域数据图谱的智能洞察工具

    "透视开源生态,OSGraph--GitHub全域数据图谱的智能洞察工具 OSGraph (Open Source Graph) 是一个开源图谱关系洞察工具,基于GitHub开源数据全域图谱 ...

  10. PowerBuilder现代编程方法X11:PB程序完全跨平台方案

    PB可能要支持Windows.macOS.Linux.iOS.Android与鸿蒙操作系统和X86.ARM.RISC-V与国产龙芯CPU的原生应用了! PowerBuilder现代编程方法X11:PB ...