Apache DolphinScheduler 2.X保姆级源码解析
点击上方蓝色字体,选择“设为星标”
回复"面试"获取更多惊喜
八股文教给我,你们专心刷题和面试
Hi,我是王知无,一个大数据领域的原创作者。
放心关注我,获取更多行业的一手消息。
在大数据领域,越来越多的企业拥抱开源软件,在这个背景下,我们针对数据调度工具如何正确选型?
中国移动云能力中心软件开发工程师徐海辉表示:古语云“工欲善其事必先利其器”,如果你正处于观望/不知如何下手/即将参与开源项目的小伙伴,我建议可以先从一个优秀的开源社区源代码的入手,我在中国移动目前主要负责数据服务,这次在 Apache DolphinScheduler 4月 Meetup 上为大家带来DolphinScheduler源码2.X解析,希望你有所收获。
“
本次演讲主要包含四个部分:
开篇与源码环境准备
服务启动流程
任务执行流程
个人思考与总结
Apache DolphinScheduler
徐海辉
中国移动云能力中心 软件开发工程师。从事大数据基础平台开发,主要负责中国移动Hadoop大数据平台组件Ranger 、移动云Lake House 产品的研发
关键词:Apache DolphinScheduler源码2.X解析、源码环境准备、服务启动、任务执行
P.S.
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源码执行过程,观察一些关键变量的值
整合总结:所有功能点的源码都分析完后,回到主流程图再梳理一遍,争取把自己画的所有图都在脑袋里做一个整合。
如果这个文章对你有帮助,不要忘记 「在看」 「点赞」 「收藏」 三连啊喂!
2022年全网首发|大数据专家级技能模型与学习指南(胜天半子篇)
互联网最坏的时代可能真的来了
我在B站读大学,大数据专业
我们在学习Flink的时候,到底在学习什么?
193篇文章暴揍Flink,这个合集你需要关注一下
Flink生产环境TOP难题与优化,阿里巴巴藏经阁YYDS
Flink CDC我吃定了耶稣也留不住他!| Flink CDC线上问题小盘点
我们在学习Spark的时候,到底在学习什么?
在所有Spark模块中,我愿称SparkSQL为最强!
硬刚Hive | 4万字基础调优面试小总结
数据治理方法论和实践小百科全书
标签体系下的用户画像建设小指南
4万字长文 | ClickHouse基础&实践&调优全视角解析
【面试&个人成长】2021年过半,社招和校招的经验之谈
大数据方向另一个十年开启 |《硬刚系列》第一版完结
我写过的关于成长/面试/职场进阶的文章
当我们在学习Hive的时候在学习什么?「硬刚Hive续集」
Apache DolphinScheduler 2.X保姆级源码解析相关推荐
- Apache DolphinScheduler 2.X保姆级源码解析,中国移动工程师揭秘服务调度启动全流程...
2022年1月,科学技术部高新技术司副司长梅建平在"第六届中国新金融高峰论坛"上表示,当前数据量已经大大超过了处理能力的上限,若信息技术仍然是渐进式发展,则数据处理能力的提升将远远 ...
- Apache Kafka-Spring Kafka生产消费@KafkaListener源码解析
文章目录 概述 Spring-kafka生产者源码流程 Spring-kafka消费者源码流程(`@EnableKafka`和`@KafkaListener` ) Flow KafkaListener ...
- OidProducer保姆级铺码教程(教你如何自制点读书)
软件介绍: 1.OidProducer(铺码用软件) 2.Adobe Acrobat DC(打印用软件,打印时一定要选择实际大小,不能放大缩小文件) 步骤简介: 1.先设置(必须认真设置好才开始铺码, ...
- 基于PHP+MySQL+Apache在线考试管理系统(附源码)
作者:BSXY_陈永跃 BSXY_信息学院 注:未经允许禁止转发任何内容 基于PHP+MySQL+Apache在线考试管理系统 项目体验 1.前言 1.1.编写目的 1.2.项目需求 1.3.项目环境 ...
- Apache Sedona(GeoSpark) spatial join 源码解析
文章目录 Apache Sedona(GeoSpark) Spatial Join Range join Distance join 源码解析 SedonSQLRegistrator.register ...
- LRU算法,以及Apache LRUMap源码解析
1. 什么是LRU LRU(least recently used) : 最近最少使用 LRU就是一种经典的算法,在容器中,对元素定义一个最后使用时间,当新的元素写入的时候,如果容器已满,则淘汰最近最 ...
- Apache IoTDB源码解析(0.11.2版本):Session的源码解析
1. 声明 当前内容主要为解析Apache IoTDB 0.11.2版本的Session的源码解析 通过前面的Apache Thrift的Demo,可以发现iotdb中的server是使用了thrif ...
- Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析
Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...
- mybatis源码解析(一)
Mybatis 源码解析 (一) 一. ORM框架的作用 实际开发系统时,我们可通过JDBC完成多种数据库操作.这里以传统JDBC编程过程中的查询操作为例进行说明,其主要步骤如下: (1)注册数据库驱 ...
- Spring源码深度解析(郝佳)-学习-源码解析-创建AOP静态代理实现(八)
继上一篇博客,我们继续来分析下面示例的 Spring 静态代理源码实现. 静态 AOP使用示例 加载时织入(Load -Time WEaving,LTW) 指的是在虚拟机载入字节码时动态织入 Aspe ...
最新文章
- R语言plotly可视化:plotly可视化分组归一化直方图(historgram)并在直方图中添加密度曲线kde、并在直方图的底部部边缘使用geom_rug函数添加边缘轴须图
- 启动ipython_ipython,_ipython 启动错误,ipython - phpStudy
- LeetCode Trips and Users(关联、分组,聚合)
- 为什么matlab生成的exe文件只能在matlab中打开,在电脑的其他地方打不开?
- 前端学习(3308):redux项目创建和概况
- 机械指挥官——全国领先的工程机械管理平台
- keybd_event、SendInput笔记
- 《FilthyRichClients》读书笔记(一)-SwingのEDT
- 应用机器学习(六):决策树
- vector常用操作
- 雷达波形样式_雷达技术的发展趋势概述
- 大气数据计算机仿真算法,自适应光学系统中大气湍流的模型分析与计算机仿真...
- CentOS设置SSH Key登录
- 计算机出现蓝屏怎么解决,电脑开机出现蓝屏怎么解决?
- 华硕电脑锁定计算机,华硕笔记本电脑的BIOS怎么设置
- 撰写论文时常用的研究方法有哪些?
- android 电池检测软件,电池寿命检测软件下载-电池寿命检测 安卓版v2.7.0-PC6安卓网...
- 68.qq号索引结构体写入内存,并实现快速排序
- iPhone12全面曝光10月上市 iPhone12是5g双卡双待手机
- J-Link下载烧录提示Failed to read back RAMCode for verification