1.dolphinscheduler的整体调用架构图:
2.通过阅读源码个人的简要理解
海豚调度 个人简单理解:是api 提供执行调度脚本的接口,比如发布一个调度脚本任务,首先会将调度的command 持久化到db中;masterServer会不断扫描扫描表t_ds_command中的命令将其和masterAddress封装成processInstance转化成WorkflowExecuteRunnable ,放入到processInstanceExecCacheManager中,然后masterSchedulerBootstrap下的workflowEventLooper会将从processInstanceExecCacheManager获取到WorkflowExecuteRunnable 进行DAG split 转化成task 放入到TaskPriorityQueue; 然后 TaskConsumer从TaskPriorityQueue中拉取TaskPriority分发task,将task封装成ExecutionContext 然后用NettyExecutorManager将command发送到worker来执行任务。具体细节需要进行更多的源码分析。
3调度单元
海豚的调度粒度。海豚里有process和task两个定义,一个process有多个task,依赖关系是task级别的,而真正调度是process级别的,也就是每次调度都是调度整个process。
目前海豚是master和worker架构,分工也很明确:
master负责整个process生命周期,包括task的dag图构建,task的dag执行,选择提交worker,操作DB等;
worker负责task执行,是真正的执行器。这里需要注意,worker不操作DB
4.模块介绍
| 模块 | 描述 |
|---|---|
| dolphinscheduler-alert | 告警模块,提供 AlertServer 服务。 |
| dolphinscheduler-api | web应用模块,提供 ApiServer 服务。 |
| dolphinscheduler-common | 通用的常量枚举、工具类、数据结构或者基类 |
| dolphinscheduler-dao | 提供数据库访问等操作。 |
| dolphinscheduler-remote | 基于 netty 的客户端、服务端 |
| dolphinscheduler-server | MasterServer 和 WorkerServer 服务 |
| dolphinscheduler-service | service模块,包含Quartz、Zookeeper、日志客户端访问服务,便于server模块和api模块调用 |
| dolphinscheduler-ui | 前端模块 |
5.Command解耦
海豚还有个应用层API服务,和master主要通过command解耦。比如正常调度(start_process),重跑(repeat_running)等
但是,终止(stop)、暂停(pause)等还是通过netty直连master。
6.Process的事件驱动实现原理
再讲整个流程之前,必须先搞明白master如何管理process整个生命周期的所有操作。
process内有会有多个task,task会按照dag从上往下执行,整个执行时间会很长,如果为每个process开启单独线程同步执行,管理process的所有操作,这样会导致并发数受限,处理能力下降,浪费资源。
海豚则引入了事件,用于驱动线程执行。下面讲解原理(上图中事件驱动相关已经框起来了)
WorkflowExecuteThread:Master每处理一个process,都会对应实例化一个线程类。内部重要组成有(黄色框)
StateEventQueue队列:用于接收存放事件
handleEvent()方法:用户处理事件,主要有PROCESS_STATE_CHANGE,TASK_STATE_CHANGE等事件
processInstanceExecMaps:存放master端所有的WorkflowExecuteThread,key为prcocessInstacneId(红色框)
TaskResponseService和StateEventResponseService:主要有两个操作,1.接收master端所有事件;2.内置定时轮询执行线程,将事件分发到相应process对应的WorkflowExecuteThread线程StateEventQueue队列中(蓝色框)
EventExecuteService:扫描、过滤所有processInstanceExecMaps内事件大于0的WorkflowExecuteThread线程,并内置提交WorkflowExecuteThread的线程池,处理事件(绿色框)
根据以上核心组成,来梳理下每个WorkflowExecuteThread线程是如何被事件驱动的。
- master为每个process创建WorkflowExecuteThread,并缓存到processInstanceExecMaps中
- TaskResponseService和StateEventResponseService将接收到的事件分发到WorkflowExecuteThread的StateEventQueue队列中
- EventExecuteService则不断地提交执行事件大于0的WorkflowExecuteThread,执行handleEvent()方法
- 不断重复2、3,实现WorkflowExecuteThread事件驱动