源码解析-- DolphinScheduler master server流程执行过程分析

海豚调度dolphinscheduler目前是 Apache 顶级项目,作为国内优秀的开源项目,它的架构设计理念会有很多值得我们学习和借鉴。

海豚调度dolphinscheduler是分布式易扩展的可视化DAG工作流任务调度系统

本文会包含如下内容:

  • master server 流程执行过程分析

本篇文章适合人群:架构师、技术专家以及对任务调度非常感兴趣的高级工程师

本文以海豚1.3.5的源代码进行分析。

1. 相关概念

相关概念部分请看官方文档

流程定义:通过拖拽任务节点并建立任务节点的关联所形成的可视化DAG

流程实例:流程实例是流程定义的实例化,可以通过手动启动或定时调度生成,流程定义每运行一次,产生一个流程实例

任务实例:任务实例是流程定义中任务节点的实例化,标识着具体的任务执行状态

任务类型: 目前支持有SHELL、SQL、SUB_PROCESS(子流程)、PROCEDURE、MR、SPARK、PYTHON、DEPENDENT(依赖)、,同时计划支持动态插件扩展,注意:其中子 SUB_PROCESS 也是一个单独的流程定义,是可以单独启动执行的

执行命令:命令表是t_ds_command,针对执行的流程定义、节点依赖类型、失败策略、告警策略、工作组等进行封装的对象。所有流程的执行先需要先封装成command,然后插入到命令表中

命令类型支持:启动工作流、从当前节点开始执行、恢复被容错的工作流、恢复暂停流程、从失败节点开始执行、补数、定时、重跑、暂停、停止、恢复等待线程。其中 恢复被容错的工作流 和 恢复等待线程 两种命令类型是由调度内部控制使用,外部无法调用

目前增加命令有三种途径,如下:

  1. 定时调度:通过 quartz 分布式调度器,根据流程配置的定时管理策略,进行调度。由ProcessScheduleJob产生command实例并插入命令表
  2. 手动触发:手工在WEB界面点击执行、重跑、恢复等按钮,触发流程的执行
  3. 系统内部:恢复被容错的工作流恢复等待线程、流程定义中的子流程的触发 等命令类型是由调度内部控制使用,外部无法调用

2. 流程执行过程

  1. 提供了三种途径增加命令,命令被写到数据库中的命令表
  2. master server在启动时,会启动MasterSchedulerService线程,此线程是一个扫描线程:在while循环中,扫描命令表是否存在新的命令,扫描流程详见下图
  3. 如果有新的命令,则将命令先转化为流程实例,然后包装成MasterExecThread的实例,提交到Master-Exec-Thread线程池中运行【线程池大小默认是100个,由参数master.exec.threads控制】
  4. MasterExecThread在运行时,首先判断是否是补数,如果是,则按配置的补数规则进行补数,如果否,则执行此流程实例
  5. 流程实例的执行,依次运行三个方法:prepareProcess(); runProcess(); endProcess();
  6. prepareProcess主要是根据流程定义,构建流程DAG及初始化任务队列
  7. runProcess方法首先提交没有父节点的任务,这些任务提交后,会增加到activeTaskNode集合中
  8. 然后循环判断流程实例是否结束,如果没有结束,则执行如下逻辑:
  9. 针对activeTaskNode集合中的任务实例进行循环,针对每个任务实例,如果执行完成,则提交此任务实例在流程DAG中后面的任务【submitPostNode(task.getName())】,否则执行任务失败逻辑(如失败重试、条件分支等)
  10. 根据master server的当前资源使用情况,判断是否可以提供任务,如果可以,则提交任务
  11. 休眠1秒
  12. 更新流程实例信息

提交任务的流程如下:

  1. 根据任务类型,创建了MasterBaseTaskExecThread子类实例,然后提交到Master-Task-Exec-Thread线程池运行【线程池大小默认是20个,由参数master.exec.task.num控制】
  2. MasterBaseTaskExecThread是Callable接口的实现类,在执行call方法时,会执行MasterBaseTaskExecThread子类的submitWaitComplete方法
  3. 在submitWaitComplete方法中,不同的子类实现逻辑不同。

不同子类实现逻辑功能主要如下:

MasterTaskExecThread: 将任务实例下发到worker节点执行,并在waitTaskQuit方法中循环等待任务实例执行完成,任务完成后则即出
SubProcessTaskExecThread: 任务实例不会下发到worker节点执行,在submitTask(TaskInstance taskInstance)方法中,针对子流程,会增加一条子流程实例命令,然后在waitTaskQuit方法中循环等待子流程执行完成。
DependentTaskExecThread:任务实例不会下发到worker节点执行,在waitTaskQuit方法中循环等所有依赖的任务是否执行完成【allDependentTaskFinish()】
ConditionsTaskExecThread:任务实例不会下发到worker节点执行,在waitTaskQuit方法中循环判断依赖的任务项集合是否满足条件【相关代码没有完全看明白,针对条件在界面好像不能配置依赖任务

源码解析-- DolphinScheduler master server流程执行过程分析_第1张图片

你可能感兴趣的:(源码解析,调度系统,JAVA基础,java,分布式)