乐趣区

关于workflow:Apache-DolphinScheduler-2X保姆级源码解析中国移动工程师揭秘服务调度启动全流程

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 的衰弱状态。

启动步骤

  1. 启动 Netty 服务端服务
  2. 注册到 Zookeeper
  3. 启动 Event 处理器
  4. 启动 scheduler 定时工作
  5. 启动 StateWheel 处理器

↓↓↓源码一览↓↓↓

对应门路外面寄存了 MasterServer.java 的类,外面有对应的 main 办法

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

这里会提前结构参数

调用 start 办法启动

注册元数据信息到 Zookeeper 下面,值得一提的是这里采纳的是长期门路,比如说在过程中服务断开了或者 session 过期,长期门路过一段时间会本人去 Delete 掉。

启动调度服务

启动 Quartz 框架,启动完之后相当于是一个独立的服务.

小结:

  • 第一步是注册这个 Netty
  • 第二步是向 Zookeeper 注册数据信息。
  • 第三步是启动相干组件和调度工作
  • 第四步是启动 Quartz 框架

02 Worker 启动流程

  • WorkerServer 采纳分布式无核心设计理念,WorkerServer 基于 Netty 提供监听服务。
  • WorkerServer 次要负责工作的执行和提供日志服务。WorkerServer 服务启动时向 Zookeeper 注册长期节点,并维持心跳。

拓展:防止出现断开、敞开等突发状况,这里会抉择注册长期节点做出 Delete 动作。

启动步骤

  1. 启动 Netty 服务端服务
  2. 注册到 Zookeeper
  3. 保护 workserver 节点状态
  4. 启动 TaskExecuteThread
  5. 启动 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),手把手教会您(贡献者不分程度高下,有问必答,要害是有一颗违心奉献的心)。

增加小助手微信时请阐明想参加奉献。

来吧,开源社区十分期待您的参加。

退出移动版