网站首页 > 开源技术 正文
海豚调度dolphinscheduler目前是 Apache 顶级项目,作为国内优秀的开源项目,它的架构设计理念会有很多值得我们学习和借鉴。
海豚调度dolphinscheduler是分布式易扩展的可视化DAG工作流任务调度系统
本文会包含如下内容:
- master server 流程执行过程分析
本篇文章适合人群:架构师、技术专家以及对任务调度非常感兴趣的高级工程师
本文以海豚1.3.5的源代码进行分析。
1. 相关概念
相关概念部分请看官方文档 https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/architecture-design.html
流程定义:通过拖拽任务节点并建立任务节点的关联所形成的可视化DAG
流程实例:流程实例是流程定义的实例化,可以通过手动启动或定时调度生成,流程定义每运行一次,产生一个流程实例
任务实例:任务实例是流程定义中任务节点的实例化,标识着具体的任务执行状态
任务类型: 目前支持有SHELL、SQL、SUB_PROCESS(子流程)、PROCEDURE、MR、SPARK、PYTHON、DEPENDENT(依赖)、,同时计划支持动态插件扩展,注意:其中子 SUB_PROCESS 也是一个单独的流程定义,是可以单独启动执行的
执行命令:命令表是t_ds_command,针对执行的流程定义、节点依赖类型、失败策略、告警策略、工作组等进行封装的对象。所有流程的执行先需要先封装成command,然后插入到命令表中。
命令类型支持:启动工作流、从当前节点开始执行、恢复被容错的工作流、恢复暂停流程、从失败节点开始执行、补数、定时、重跑、暂停、停止、恢复等待线程。其中 恢复被容错的工作流 和 恢复等待线程 两种命令类型是由调度内部控制使用,外部无法调用
目前增加命令有三种途径,如下:
- 定时调度:通过 quartz 分布式调度器,根据流程配置的定时管理策略,进行调度。由ProcessScheduleJob产生command实例并插入命令表
- 手动触发:手工在WEB界面点击执行、重跑、恢复等按钮,触发流程的执行
- 系统内部:恢复被容错的工作流、恢复等待线程、流程定义中的子流程的触发 等命令类型是由调度内部控制使用,外部无法调用
2. 流程执行过程
- 提供了三种途径增加命令,命令被写到数据库中的命令表
- master server在启动时,会启动MasterSchedulerService线程,此线程是一个扫描线程:在while循环中,扫描命令表是否存在新的命令,扫描流程详见下图
- 如果有新的命令,则将命令先转化为流程实例,然后包装成MasterExecThread的实例,提交到Master-Exec-Thread线程池中运行【线程池大小默认是100个,由参数master.exec.threads控制】
- MasterExecThread在运行时,首先判断是否是补数,如果是,则按配置的补数规则进行补数,如果否,则执行此流程实例
- 流程实例的执行,依次运行三个方法:prepareProcess(); runProcess(); endProcess();
- prepareProcess主要是根据流程定义,构建流程DAG及初始化任务队列
- runProcess方法首先提交没有父节点的任务,这些任务提交后,会增加到activeTaskNode集合中
- 然后循环判断流程实例是否结束,如果没有结束,则执行如下逻辑:
- 针对activeTaskNode集合中的任务实例进行循环,针对每个任务实例,如果执行完成,则提交此任务实例在流程DAG中后面的任务【submitPostNode(task.getName())】,否则执行任务失败逻辑(如失败重试、条件分支等)
- 根据master server的当前资源使用情况,判断是否可以提供任务,如果可以,则提交任务
- 休眠1秒
- 更新流程实例信息
提交任务的流程如下:
- 根据任务类型,创建了MasterBaseTaskExecThread子类实例,然后提交到Master-Task-Exec-Thread线程池运行【线程池大小默认是20个,由参数master.exec.task.num控制】
- MasterBaseTaskExecThread是Callable接口的实现类,在执行call方法时,会执行MasterBaseTaskExecThread子类的submitWaitComplete方法
- 在submitWaitComplete方法中,不同的子类实现逻辑不同。
不同子类实现逻辑功能主要如下:
MasterTaskExecThread: 将任务实例下发到worker节点执行,并在waitTaskQuit方法中循环等待任务实例执行完成,任务完成后则即出
SubProcessTaskExecThread: 任务实例不会下发到worker节点执行,在submitTask(TaskInstance taskInstance)方法中,针对子流程,会增加一条子流程实例命令,然后在waitTaskQuit方法中循环等待子流程执行完成。
DependentTaskExecThread:任务实例不会下发到worker节点执行,在waitTaskQuit方法中循环等所有依赖的任务是否执行完成【allDependentTaskFinish()】
ConditionsTaskExecThread:任务实例不会下发到worker节点执行,在waitTaskQuit方法中循环判断依赖的任务项集合是否满足条件【相关代码没有完全看明白,针对条件在界面好像不能配置依赖任务】
猜你喜欢
- 2024-09-12 盘点 12 月份爆火的 GitHub 项目(github排行榜)
- 2024-09-12 DolphinScheduler海豚调度器删除历史日志问题
- 2024-09-12 数据质量管理(数据质量管理平台目前支持通过扫描)
- 2024-09-12 dolphin scheduler多数据库存储(hibernate多数据库支持)
- 2024-09-12 海豚DolphinScheduler系统调度操作分析
- 2024-09-12 源码解析-- 如何做到不同Task的日志输出到不同的日志文件
- 2024-09-12 运维实战:DolphinScheduler 生产环境升级
- 2024-09-12 任务调度工具(任务调度工具怎么用)
- 2024-09-12 dolphinscheduler集成数据质量任务
- 2024-09-12 大数据组件部署——dolphinscheduler集群部署
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)