当前位置:网站首页>Apache DolphinScheduler 2.X保姆级源码解析,中国移动工程师揭秘服务调度启动全流程
Apache DolphinScheduler 2.X保姆级源码解析,中国移动工程师揭秘服务调度启动全流程
2022-07-26 07:12:00 【DolphinScheduler社区】

2022年1月,科学技术部高新技术司副司长梅建平在“第六届中国新金融高峰论坛”上表示,当前数据量已经大大超过了处理能力的上限,若信息技术仍然是渐进式发展,则数据处理能力的提升将远远落后于指数级增长的数据量。因此,在一段时期内,数据处理能力与效率的提升仍将是大数据发展要面对的技术难点。
随着5G、物联网等网络信息技术的快速发展以及应用的快速增长,数据量也呈指数级增长,纵观运营商整个大数据开发的链路上,在各个环节都会出现各种严峻的问题,随着数据任务调度量级日益增大,阻碍数据正确且高效地发挥价值,对运营商数据团队提出严峻挑战。
在大数据领域,越来越多的企业拥抱开源软件,在这个背景下,我们针对数据调度工具如何正确选型?
中国移动云能力中心软件开发工程师徐海辉表示:古语云“工欲善其事必先利其器”,如果你正处于观望/不知如何下手/即将参与开源项目的小伙伴,我建议可以先从一个优秀的开源社区源代码的入手,我在中国移动目前主要负责数据服务,这次在 Apache DolphinScheduler 4月 Meetup 上为大家带来DolphinScheduler源码2.X解析,希望你有所收获。
本次演讲主要包含四个部分:
开篇与源码环境准备
服务启动流程
任务执行流程
个人思考与总结

徐海辉
中国移动云能力中心 软件开发工程师。从事大数据基础平台开发,主要负责中国移动Hadoop大数据平台组件Ranger 、移动云Lake House 产品的研发
关键词:Apache DolphinScheduler源码2.X解析、源码环境准备、服务启动、任务执行
Apache DolphinScheduler 源码下载链接:
https://dolphinscheduler.apache.org/zh-cn/download/download.html
01 开篇与源码环境准备
Apache DolphinScheduler是一个基于java开发的开源分布式工作流调度系统。致力于可视化操作任务及工作流之间的依赖关系,并可视化整个数据流过程;解决数据处理流程中错综复杂的依赖关系。
01 入手DolphinScheduler需要考虑的问题
开源分布式的工作原理?
工具可视化是体现在哪里?
Master和Worker之间如何通信?
怎么体现工作流之间的依赖关系?
“Show me the code”
其实在这个过程中需要考虑的问题有很多,我们不妨从官方给的架构图先简单梳理一下,然后通过实际的使用,再去研究源码,一套组合拳下来就差不多了。
02 DolphinScheduler架构图
话不多说,开撸!
4个由源码启动的服务是:UI、MasterServer、WorkServer、AlertServer(还有LoggerServer图里面没有体现)

MasterServer & WorkServer依赖于Zookeeper协调服务中心注册
MasterServer & WorkServer 1-N组成集群,分别是单独的服务和进程
执行任务支持的插件:Flink、Shell、Subflow、SQL、Procedure、Python、MR、Spark、Dependent等等
03 预先必备知识
- Netty
一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端
- Zookeeper
一个分布式的,开放源码的分布式应用程序协调服务,它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
- 分布式锁
为了解决单机部署情况下的并发控制锁策略失效这个问题,需要一种跨机器的互斥机制来控制共享资源的访问
- Quartz
定时自动执行任务
- 多线程
很多小伙伴不明白Master和Worker之间是怎么通信的,DolphinScheduler是基于Netty框架来实现的。这里可以拓展一下,服务器之间的通信还有很多方式:
- HTTP
HTTP:http其实是一种网络传输协议,基于TCP,规定了数据传输的格式。
- REST API
REST API通信是通过JSON格式的字符串进行数据传输的,而字符串是可以在网络中穿透防火墙的。也就是说,REST API可以穿透防火墙。同时字符串也可以不用受开发语言的限制,可以同时完成后端与WEB,后端与APP(Android,IOS)之间的通信。
- RPC
RPC通信又称远程过程调用,在内网中速度非常快,效率高。
如下图是准备相关环境的部署,并且我还提供了一个远程Debug的方式,这个不难理解,比如你想调试API,在启动过程中,它肯定会调用脚本,你只需要在脚本里面添加 Debug启动的一些参数,就可以进行一个远程的Debug。

像框框里面的数字实际上是服务的端口号,如果跟本地服务/其他组件端口之间有冲突的话,对它可以进行一个修改。
02 服务启动流程
01 Master启动流程
MasterServer采用分布式无中心设计理念,基于Netty提供监听服务。
MasterServer服务启动时向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进行容错处理。
MasterServer主要负责 DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态。
启动步骤
启动Netty 服务端服务
注册到Zookeeper
启动Event处理器
启动scheduler定时任务
启动StateWheel处理器
↓↓↓源码一览↓↓↓

对应路径里面存放了MasterServer.java的类,里面有对应的main方法

执行完构造函数后,会启动run方法及其各个组件

这里会提前构造参数

调用start方法启动

注册元数据信息到Zookeeper上面,值得一提的是这里采用的是临时路径,比如说在过程中服务断开了或者session过期,临时路径过一段时间会自己去Delete掉。

启动调度服务

启动Quartz框架,启动完之后相当于是一个独立的服务.
小结:
第一步是注册这个Netty
第二步是向Zookeeper注册数据信息。
第三步是启动相关组件和调度任务
第四步是启动Quartz框架
02 Worker启动流程
WorkerServer采用分布式无中心设计理念,WorkerServer基于Netty提供监听服务。
WorkerServer主要负责任务的执行和提供日志服务。WorkerServer服务启动时向Zookeeper注册临时节点,并维持心跳。
拓展:防止出现断开、关闭等突发状况,这里会选择注册临时节点做出Delete动作。
启动步骤
启动Netty 服务端服务
注册到Zookeeper
维护workserver节点状态
启动TaskExecuteThread
启动RetryReportTaskStatusThread
↓↓↓源码一览↓↓↓

找到WorkServer.java中的main方法,进程代码也位于DolphinScheduler-Server模块下面

启动Netty服务,过程中也会提供一些端口,以便和其他进程交互

向Zookeeper注册信息,其中WorkerregistryClient调用了Zookeeper的代码

主要是处理和创建一些节点

启动组件,WorkerManagerThread主要是管理Master发过来的任务

启动组件,RetryReportTaskStatus主要是给Master反馈信息
03 任务执行流程
首先我们可以从UI界面具体分析一些工作流是如何运行的?

DolphinScheduler-api : ExecutorController.java → startProcessInstance() → createCommand() →写入表 t_ds_command
然后通过代码的跟踪去看一下

位于DolphinScheduler-API模块下的controller里面

Start-process-instance会调用ExecProcessInstance方法

通过一系列的执行,最终会解析一些参数

解析完之后会生成一条记录(Create Command)
接下来MasterServer会不定时扫描表里面的记录,然后拉取出来,最后构建流程的实例
定时任务轮询获取
Dolphinscheduler-server: MasterSchedulerService.java → scheduleProcess() → findOneCommand() → 创建ProcessInstance
构建DAG并分发到worker
WorkflowExecuteThread.java → startProcess() → buildFlowDag() → submitPostNode() → submitStandByTask() → submitTaskExec()
TaskProcessor.java → dispatchTask() → 放入TaskPriorityQueue
TaskPriorityQueueConsumer.java: → dispatch()
ExecutorDispatcher.java → dispatch()
NettyExecutorManager.java → execute() →build command → doExecute() → ettyRemotingClient.send()

Master启动完之后会不停拉取命令,然后解析完之后分发给Worker

可以看一下它的run方法

Scheduleprocess方法去找一条命令→Findonecommand,找到之后对它进行解析,创建工作流实例

交给WorkflowExecuteThread线程执行

WorkflowExecuteThread run方法启动之后提交一个节点

放到优先级队列里面,构造处理的一些参数,通过Netty分发
Worker接收任务并执行
NettyClientHandler.java → channelRead() → processReceived() → TaskExecuteProcessor.java → process() → workerExecuteQueue.offer()
WorkerManagerThread.java → workerExecuteQueue.take()
TaskExecuteThread.java → build taskRequest → taskChannel.create(taskRequest) →AbstractTask init() → handle()

通过taskExcutethread执行

通过代码跟踪,我们发现是调用队列里面的offer方法

通过channelRead方法接收Master发过来的信息,然后放在队列里面

通过while循环不停的处理队列里的任务

任务执行的参数都放在taskExcutiontext里面

TaskChannel主要识别脚本任务类型(Flink、Shell、Python等脚本)

任务执行完之后,通过ResponseCommand收集完信息反馈给Master
04思考与总结
01 优化返回方式
我们看源码的过程当中发现,比如说在DolphinSchedulerr-api跟前端交互接口的时候,请求参数返回的时候,它没有用bean来进行处理,什么意思呢?就是说它参数比较混乱,比如说自己的一些恶应用要接入 DolphinScheduler,或者说后续社区要提供一些SDK,有bean的方式进行参数传递是比较好的。

02 表格式统一
还有一个在调研的过程当中,这个表的命名还有优化空间,表的命名格式有一些不同,比如说一些关系表,它后面加了 relation,然后有一些是加在前面的。

03 命名不友好

在看源码的过程当中,发现它的一些命名是不太友好的,如上图
05拥抱开源
你如果从事软件开发,你有可能会想花时间去打造一下属于你自己的IP,比如说你负责具体某个组件,成为核心开发者。
01 我们为什么要去学习开源?
1、提升技术功底:学习源码里的优秀设计思想,比如疑难问题的解决思路,一些优秀的设计模式,整体提升自己的技术功底,比如说在DS里面,用了大量的线程去处理一些Event,然后使用了去中心化,还有使用队列,优先级队列等等
2、深度掌握技术框架:源码看多了,对于一个新技术或框架的掌握速度会有大幅提升,比如说你要去学习 DS或者对它进行一个二次开发,你肯定要去了解一下其他知识,比如说Netty,还有Zookeeper
3、快速定位线上问题:遇到线上问题,特别是框架源码里的问题(比如bug),能够快速定位
4、拥抱开源社区:参与到开源项目的研发,结识更多大牛,积累更多优质人脉看源码
02 在开源社区的学习方法
先使用:先看官方文档快速掌握框架的基本使用
抓主线:找一个demo入手,顺藤摸瓜快速看一遍框架的主线源码,画出源码主流程图,切勿一开始就陷入源码的细枝末节,否则会把自己绕晕,凭经验猜
画图做笔记:总结框架的一些核心功能点,从这些功能点入手深入到源码的细节,边看源码边画源码走向图,并对关键源码的理解做笔记,把源码里的闪光点都记录下来,后续借鉴到工作项目中,理解能力强的可以直接看静态源码,也可以边看源码边debug源码执行过程,观察一些关键变量的值
整合总结:所有功能点的源码都分析完后,回到主流程图再梳理一遍,争取把自己画的所有图都在脑袋里做一个整合
参与贡献
随着国内开源的迅猛崛起,Apache DolphinScheduler 社区迎来蓬勃发展,为了做更好用、易用的调度,真诚欢迎热爱开源的伙伴加入到开源社区中来,为中国开源崛起献上一份自己的力量,让本土开源走向全球。
参与 DolphinScheduler 社区有非常多的参与贡献的方式,包括:

贡献第一个PR(文档、代码) 我们也希望是简单的,第一个PR用于熟悉提交的流程和社区协作以及感受社区的友好度。
社区汇总了以下适合新手的问题列表:https://github.com/apache/dolphinscheduler/issues/5689
非新手问题列表:https://github.com/apache/dolphinscheduler/issues?q=is%3Aopen+is%3Aissue+label%3A"volunteer+wanted"
如何参与贡献链接:https://dolphinscheduler.apache.org/zh-cn/docs/development/contribute.html
来吧,DolphinScheduler开源社区需要您的参与,为中国开源崛起添砖加瓦吧,哪怕只是小小的一块瓦,汇聚起来的力量也是巨大的。
参与开源可以近距离与各路高手切磋,迅速提升自己的技能,如果您想参与贡献,我们有个贡献者种子孵化群,可以添加社区小助手微信(Leonard-ds) ,手把手教会您( 贡献者不分水平高低,有问必答,关键是有一颗愿意贡献的心 )。
添加小助手微信时请说明想参与贡献。
来吧,开源社区非常期待您的参与。
边栏推荐
- redis-migrate-tool迁移报错。
- Opencv learn resize and crop
- [romance understood by technical talents] tidb community has prepared a gift for your partner for the "Tanabata Festival". Reply: if I want to challenge, I can participate in the activity!
- [yiku] wonderful! This library organization NPM script is simply explosive!
- IDEA——使用@Slf4j打印日志
- 倒计时2日!基于 Apache DolphinScheduler&TiDB 的交叉开发实践,从编写到调度让你大幅提升效率
- 【QT】详解 *.pro、*.pri、*.prf、*.prl文件
- [QT] how to obtain the number of rows and columns of qtableview and qtablewidget
- Airiot IOT platform enables the container industry to build a welding station information monitoring system
- Manifest merger failed with multiple errors, see logs
猜你喜欢

IDEA——使用@Slf4j打印日志

NPM command

Rectification ideas for the previous article
![From scratch, we will completely develop an online chess game [Gobang] Based on websocket, and only use dozens of lines of code to complete all the logic.](/img/38/24c2e7cfcf794d09fd4d7b86b53728.png)
From scratch, we will completely develop an online chess game [Gobang] Based on websocket, and only use dozens of lines of code to complete all the logic.

20220725 compensator in automatic control principle

Pycharm的相关配置:改字体样式和大小、更改图片背景、更改控制台输出的字体颜色

倒计时2日!基于 Apache DolphinScheduler&TiDB 的交叉开发实践,从编写到调度让你大幅提升效率

Yolov5 improvements: add attention mechanism (video tutorial)

Yolov6 target detection practice: training your own data set (video tutorial)

成为 Apache 贡献者,So easy!
随机推荐
How regular expressions write variables
What to pay attention to when using German chicks for the first time
怎样在win10家庭版中使用Hyper-V
Solve the problem that Chrome browser is tampered with by drug bullies
MySQL table read lock
[romance understood by technical talents] tidb community has prepared a gift for your partner for the "Tanabata Festival". Reply: if I want to challenge, I can participate in the activity!
JIT中的IR工具与JITWatch的下载,编译及使用
常用的cmd指令
Rectification ideas for the previous article
Summer Challenge harmonyos - hamster game based on arkui (JS)
问题:Can‘t download sh shellcheck. Please install it manually及shell脚本的一些命令使用
Difference between shape and size ()
How to delete a statement audit log?
Realization of LED water lamp based on C51
Yolov5 improvements: add attention mechanism (video tutorial)
Now the metauniverse is no longer an existence that is only applied to the social field
成为 Apache 贡献者,So easy!
敏捷整洁之道
< II> ObjectARX development: create and edit basic graphic objects
Orthogonality of 20220724 trigonometric function system