概况
因为最近公司,要计划做数据中台,而我们要负责做一个 数据开发这一部分,主要功能是将数据加工,因为产品要加入一些业务上定制化的东西,所以目前是将dolphinscheduler进行一个二次开发。下面我会分享dolphinscheduler的整体架构,和一个核心流程。
下面主要会分为三部分:
1 主要架构
2 代码结构
3 任务执行过程的核心流程
版本:
Dolphinscheduler-1.3.8-release
主要架构
上图是从官网直接copy过来,是ds的架构图,ds的架构我觉得主要的几点是:
1 master,worker,api 主要运行时容器是 spring boot
2 服务间的主要通信是通过netty完成的
3 分布式调度,主要是用zk的选举策略
代码结构
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()