点击上方蓝色字体,选择“设为星标”

回复"面试"获取更多惊喜

八股文教给我,你们专心刷题和面试

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的健康状态。

启动步骤

  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源码执行过程,观察一些关键变量的值

  • 整合总结:所有功能点的源码都分析完后,回到主流程图再梳理一遍,争取把自己画的所有图都在脑袋里做一个整合。

如果这个文章对你有帮助,不要忘记 「在看」 「点赞」 「收藏」 三连啊喂!

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保姆级源码解析相关推荐

  1. Apache DolphinScheduler 2.X保姆级源码解析,中国移动工程师揭秘服务调度启动全流程...

    2022年1月,科学技术部高新技术司副司长梅建平在"第六届中国新金融高峰论坛"上表示,当前数据量已经大大超过了处理能力的上限,若信息技术仍然是渐进式发展,则数据处理能力的提升将远远 ...

  2. Apache Kafka-Spring Kafka生产消费@KafkaListener源码解析

    文章目录 概述 Spring-kafka生产者源码流程 Spring-kafka消费者源码流程(`@EnableKafka`和`@KafkaListener` ) Flow KafkaListener ...

  3. OidProducer保姆级铺码教程(教你如何自制点读书)

    软件介绍: 1.OidProducer(铺码用软件) 2.Adobe Acrobat DC(打印用软件,打印时一定要选择实际大小,不能放大缩小文件) 步骤简介: 1.先设置(必须认真设置好才开始铺码, ...

  4. 基于PHP+MySQL+Apache在线考试管理系统(附源码)

    作者:BSXY_陈永跃 BSXY_信息学院 注:未经允许禁止转发任何内容 基于PHP+MySQL+Apache在线考试管理系统 项目体验 1.前言 1.1.编写目的 1.2.项目需求 1.3.项目环境 ...

  5. Apache Sedona(GeoSpark) spatial join 源码解析

    文章目录 Apache Sedona(GeoSpark) Spatial Join Range join Distance join 源码解析 SedonSQLRegistrator.register ...

  6. LRU算法,以及Apache LRUMap源码解析

    1. 什么是LRU LRU(least recently used) : 最近最少使用 LRU就是一种经典的算法,在容器中,对元素定义一个最后使用时间,当新的元素写入的时候,如果容器已满,则淘汰最近最 ...

  7. Apache IoTDB源码解析(0.11.2版本):Session的源码解析

    1. 声明 当前内容主要为解析Apache IoTDB 0.11.2版本的Session的源码解析 通过前面的Apache Thrift的Demo,可以发现iotdb中的server是使用了thrif ...

  8. Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析

    Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...

  9. mybatis源码解析(一)

    Mybatis 源码解析 (一) 一. ORM框架的作用 实际开发系统时,我们可通过JDBC完成多种数据库操作.这里以传统JDBC编程过程中的查询操作为例进行说明,其主要步骤如下: (1)注册数据库驱 ...

  10. Spring源码深度解析(郝佳)-学习-源码解析-创建AOP静态代理实现(八)

    继上一篇博客,我们继续来分析下面示例的 Spring 静态代理源码实现. 静态 AOP使用示例 加载时织入(Load -Time WEaving,LTW) 指的是在虚拟机载入字节码时动态织入 Aspe ...

最新文章

  1. R语言plotly可视化:plotly可视化分组归一化直方图(historgram)并在直方图中添加密度曲线kde、并在直方图的底部部边缘使用geom_rug函数添加边缘轴须图
  2. 启动ipython_ipython,_ipython 启动错误,ipython - phpStudy
  3. LeetCode Trips and Users(关联、分组,聚合)
  4. 为什么matlab生成的exe文件只能在matlab中打开,在电脑的其他地方打不开?
  5. 前端学习(3308):redux项目创建和概况
  6. 机械指挥官——全国领先的工程机械管理平台
  7. keybd_event、SendInput笔记
  8. 《FilthyRichClients》读书笔记(一)-SwingのEDT
  9. 应用机器学习(六):决策树
  10. vector常用操作
  11. 雷达波形样式_雷达技术的发展趋势概述
  12. 大气数据计算机仿真算法,自适应光学系统中大气湍流的模型分析与计算机仿真...
  13. CentOS设置SSH Key登录
  14. 计算机出现蓝屏怎么解决,电脑开机出现蓝屏怎么解决?
  15. 华硕电脑锁定计算机,华硕笔记本电脑的BIOS怎么设置
  16. 撰写论文时常用的研究方法有哪些?
  17. android 电池检测软件,电池寿命检测软件下载-电池寿命检测 安卓版v2.7.0-PC6安卓网...
  18. 68.qq号索引结构体写入内存,并实现快速排序
  19. iPhone12全面曝光10月上市 iPhone12是5g双卡双待手机
  20. J-Link下载烧录提示Failed to read back RAMCode for verification

热门文章

  1. 操作系统与内核的关系
  2. Codeforces Round #459 (Div. 1) B. MADMAX(dp+博弈)
  3. 无源贴片晶振四角引脚_从贴片晶振脚位你看出什么信息?
  4. java提取富文本文字_富文本中文字部分提取
  5. chromium双核浏览器实现
  6. JAVA实现ECC加密 eclipse
  7. eclipse debug 多线程
  8. 游戏主机系统,破旧老电脑秒变高性能儿时复古游戏主机
  9. 模仿QQ侧滑样式,借鉴了张鸿洋的最简单侧滑
  10. C语言每日一练——第50天:八进制转十进制