调度框架之海豚调度

787 阅读3分钟

1.dolphinscheduler的整体调用架构图:

image.png

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

97c92df79c4d397c2936a7ba9ddf0797.png

4.模块介绍

模块描述
dolphinscheduler-alert告警模块,提供 AlertServer 服务。
dolphinscheduler-apiweb应用模块,提供 ApiServer 服务。
dolphinscheduler-common通用的常量枚举、工具类、数据结构或者基类
dolphinscheduler-dao提供数据库访问等操作。
dolphinscheduler-remote基于 netty 的客户端、服务端
dolphinscheduler-serverMasterServer 和 WorkerServer 服务
dolphinscheduler-serviceservice模块,包含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线程是如何被事件驱动的。

  1. master为每个process创建WorkflowExecuteThread,并缓存到processInstanceExecMaps中
  2. TaskResponseService和StateEventResponseService将接收到的事件分发到WorkflowExecuteThread的StateEventQueue队列中
  3. EventExecuteService则不断地提交执行事件大于0的WorkflowExecuteThread,执行handleEvent()方法
  4. 不断重复2、3,实现WorkflowExecuteThread事件驱动