概况

因为最近公司,要计划做数据中台,而我们要负责做一个 数据开发这一部分,主要功能是将数据加工,因为产品要加入一些业务上定制化的东西,所以目前是将dolphinscheduler进行一个二次开发。下面我会分享dolphinscheduler的整体架构,和一个核心流程。


下面主要会分为三部分:

1 主要架构

2 代码结构

3 任务执行过程的核心流程


版本:

Dolphinscheduler-1.3.8-release

主要架构

dolphinscheduler sub_process 租户 dolphinscheduler详解_spring



上图是从官网直接copy过来,是ds的架构图,ds的架构我觉得主要的几点是:

1 master,worker,api 主要运行时容器是 spring boot

2 服务间的主要通信是通过netty完成的

3 分布式调度,主要是用zk的选举策略


代码结构

dolphinscheduler sub_process 租户 dolphinscheduler详解_流程图_02


1 Alert

提供告警支持,目前应该只实现了邮件和企业微信该服务是以 在线程内不断遍历数据库,获取待告警的信息驱动的



2 Api

给界面提供接口,是一个spring boot服务



3 Common

抽取出一些功能配置



4 Dao

数据库的操作



5 Dist

一些打包配置



6 Plugin-api

告警插件接口,实体等



7 Remote

Netty 的客户端,服务端,编解码器,handler等 , woker, master, api服务都会用到

8 Server

Master 和 worker 服务,是spring boot应用 和 内部启动了一个netty server



9 Service

抽象了一些公共服务,如日志,权限,zk操作等

10 UI

前端页面


任务执行过程的核心流程

我们来从 界面上 点击 执行按钮 开始分析, 其中会经过 api server — master server – workder server



主要调用链路是:

Api server —>

ExecutorController.startProcessInstance()

—execService.execProcessInstance

—this.createCommand()

— processService.createCommand(command);

— result = commandMapper.insert(command);

1 界面上点击执行按钮,会调用 exectorController 的 startProcessInstance 方法

2 该方法主要的功能是根据 project 配置,初始化出command 插入数据库


MasterServer—>

this.masterSchedulerService.start();—>

Command command = processService.findOneCommand();—>

ProcessInstance processInstance = processService.handleCommand---->

masterExecService.execute(new MasterExecThread());—>

executeProcess();-

1 masterServer初始化的时候,会初始化 masterSchedulerService

2 masterSchedulerService 会不断从数据库 遍历 api server 存进来的 command

3 然后给 masterExecService executeProcess() 进行调度

其中

executeProcess() 有三个子方法,prepareProcess,runProcess, endProcess

1 其中 prepareProcess构建DAG 流程图和初始化一系列队列

2 运行DAG流程图, 将DAG里的task 分发到 worker节点

3 EndProcess(); 更新流程完成状态,发送告警通知等


runProcess主要做了 将 DAG里面的队列 放到 readyToSubmitTaskQueue 队列,然后放到

TaskPriorityQueue,TaskPriorityQueue 队列 会由TaskPriorityQueueConsumer不断消费使用netty发送给 worker


wokerServer
1 初始化 nettyServer,接到 master发来的 command之后,主要处理命令的类 在 NettyServerHandler----

2 如果是流程图的任务就会是 由 TaskExecuteProcessor.process()

3 process 会调用 TaskExecuteThread -->task.handle()