点击上方蓝色字体,选择“设为星标”
回复”面试”获取更多惊喜
八股文教给我,你们专心刷题和面试
关键词:Apache DolphinScheduler源码2.X解析、源码环境准备、服务启动、任务执行
P.S.
Apache DolphinScheduler 源码下载链接:
https://dolphinscheduler.apache.org/zh-cn/download/download.html
01
开篇与源码环境准备
Apache DolphinScheduler是一个基于java开发的开源分布式工作流调度系统。致力于可视化操作任务及工作流之间的依赖关系,并可视化整个数据流过程;解决数据处理流程中错综复杂的依赖关系。
01
入手DolphinScheduler需要考虑的问题
-
开源分布式的工作原理p>
工具可视化是体现在哪里p>
Master和Worker之间如何通信p>
怎么体现工作流之间的依赖关系p>
“Show me the code”
其实在这个过程中需要考虑的问题有很多,我们不妨从官方给的架构图先简单梳理一下,然后通过实际的使用,再去研究源码,一套组合拳下来就差不多了。
02
DolphinScheduler架构图
话不多说,开撸!
4个由源码启动的服务是:UI、MasterServer、WorkServer、AlertServer(还有LoggerServer图里面没有体现)
像框框里面的数字实际上是服务的端口 ,如果跟本地服务/其他组件端口之间有冲突的话,对它可以进行一个修改。
02
服务启动流程
01
Master启动流程
-
MasterServer采用分布式无中心设计理念,基于Netty提供监听服务。
-
MasterServer服务启动时向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进行容错处理。
-
MasterServer主要负责 DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态。
启动步骤
-
启动Netty 服务端服务
-
注册到Zookeeper
-
启动Event处理器
-
启动scheduler定时任务
-
启动StateWheel处理器
↓↓↓源码一览↓↓↓
执行完构造函数后,会启动run方法及其各个组件
调用start方法启动
启动调度服务
找到WorkServer.java中的main方法,进程代码也位于DolphinScheduler-Server模块下面
向Zookeeper注册信息,其中WorkerregistryClient调用了Zookeeper的代码
启动组件,WorkerManagerThread主要是管理Master发过来的任务
DolphinScheduler-api : ExecutorController.java → startProcessInstance() → createCommand() →写入表 t_ds_command
然后通过代码的跟踪去看一下
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()
可以看一下它的run方法
交给WorkflowExecuteThread线程执行
放到优先级队列里面,构造处理的一些参数,通过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()
通过代码跟踪,我们发现是调用队列里面的offer方法
通过while循环不停的处理队列里的任务
TaskChannel主要识别脚本任务类型(Flink、Shell、Python等脚本)
02
表格式统一
还有一个在调研的过程当中,这个表的命名还有优化空间,表的命名格式有一些不同,比如说一些关系表,它后面加了 relation,然后有一些是加在前面的。
在看源码的过程当中,发现它的一些命名是不太友好的,如上图
05
拥抱开源
你如果从事软件开发,你有可能会想花时间去打造一下属于你自己的IP,比如说你负责具体某个组件,成为核心开发者。
01
我们为什么要去学习开源p>
1、提升技术功底:学习源码里的优秀设计思想,比如疑难问题的解决思路,一些优秀的设计模式,整体提升自己的技术功底,比如说在DS里面,用了大量的线程去处理一些Event,然后使用了去中心化,还有使用队列,优先级队列等等
2、深度掌握技术框架:源码看多了,对于一个新技术或框架的掌握速度会有大幅提升,比如说你要去学习 DS或者对它进行一个二次开发,你肯定要去了解一下其他知识,比如说Netty,还有Zookeeper
3、快速定位线上问题:遇到线上问题,特别是框架源码里的问题(比如bug),能够快速定位
4、拥抱开源 区:参与到开源项目的研发,结识更多大牛,积累更多优质人脉看源码
02
在开源 区的学习方法
-
先使用:先看官方文档快速掌握框架的基本使用
-
抓主线:找一个demo入手,顺藤摸瓜快速看一遍框架的主线源码,画出源码主流程图,切勿一开始就陷入源码的细枝末节,否则会把自己绕晕,凭经验猜
-
画图做笔记:总结框架的一些核心功能点,从这些功能点入手深入到源码的细节,边看源码边画源码走向图,并对关键源码的理解做笔记,把源码里的闪光点都记录下来,后续借鉴到工作项目中,理解能力强的可以直接看静态源码,也可以边看源码边debug源码执行过程,观察一些关键变量的值
-
整合总结:所有功能点的源码都分析完后,回到主流程图再梳理一遍,争取把自己画的所有图都在脑袋里做一个整合。
如果这个文章对你有帮助,不要忘记 「在看」 「点赞」 「收藏」 三连啊喂!
互联 最坏的时代可能真的来了
我在B站读大学,大数据专业
我们在学习Flink的时候,到底在学习什么p>
193篇文章暴揍Flink,这个合集你需要关注一下
Flink生产环境TOP难题与优化,阿里巴巴藏经阁YYDS
Flink CDC我吃定了耶稣也留不住他!| Flink CDC线上问题小盘点
我们在学习Spark的时候,到底在学习什么p>
在所有Spark模块中,我愿称SparkSQL为最强!
硬刚Hive | 4万字基础调优面试小总结
数据治理方法论和实践小百科全书
标签体系下的用户画像建设小指南
【面试&个人成长】2021年过半, 招和校招的经验之谈
大数据方向另一个十年开启 |《硬刚系列》第一版完结
我写过的关于成长/面试/职场进阶的文章
当我们在学习Hive的时候在学习什么刚Hive续集」
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92452 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!