深入浅出 Apache DolpinScheduler 补数功能

点击蓝字,关注我们🔼

fe446243229e437c6a5725465cbb5f65.png

引言

大家好,我叫侯世涛,是个人开发者,也是 Apache DolphinScheduler 社区的贡献者,目前在社区参与开发已经有两年时间,欢迎大家跟我交流。本次分享将深入探讨 DolphinScheduler 的自动化补数功能,将详细介绍如何使用补数功能,摆脱手动执行脚本修复数据的繁琐过程,实现数据处理的全自动化。

|侯世涛

编辑整理 曾辉

讲师介绍

c6b94f379910413a13f6ee5b4b623913.jpeg

侯世涛

DolphinScheduler 贡献者

我今天分享的内容分为4个部分

  • Apache DolphinScheduler概览

  • Apache DolphinScheduler架构

  • Apache DolphinScheduler补数介绍

  • Apache DolphinScheduler源码讲解

  • 遇到的问题和参与开源

01

 Apache DolphinScheduler概览

Apache DolphinScheduler是一个可扩展的开源分布式工作流平台。开源意味着它能够被许多公司用于二次开发,这尤其适用于那些不希望使用商业版本,但又不想自行编写某些功能的公司,它们可以利用开源项目提供的功能。

8fbbb53154b3dc6cca921f1f35ef71af.png

Apache DolphinScheduler采用了DAG(有向无环图)工作流,它通过可视化图形来展示任务之间的上下游依赖关系,这样的依赖关系可以轻松调整。

此外,Apache DolphinScheduler能有效处理复杂的ETL依赖问题,这在许多行业,如金融和工业等,都非常实用。因为在这些行业中,数据或任务经常会有复杂的上下游依赖关系。

例如,一个sale节点可能需要依赖上游的sale节点,或者依赖于MySQL、Postgresql、Flink等节点。这种复杂的依赖关系在实际使用过程中可能会引发各种问题,比如系统卡死等,这是我们在实际生产中常常遇到的问题。

最后,Apache DolphinScheduler还提供了监控和告警模块。在任务调度过程中,我们需要知道每个任务的当前状态。如果任务失败了,我们需要得到告警,并及时进行人工处理。另外,如果任务失败,我们可能会尝试重试,但是通常情况下,如果任务失败了,即使重试3次,也可能仍然无法成功,这时就需要人工介入,所以告警功能在这里非常重要。

部署模式

给大家介绍下 Apache DolphinScheduler 四种部署模式。

b5f8767904af07ba2c375aa3bf62902f.png

首先,有单机模式,也被称为Standalone模式。这种模式主要用于测试环境,但在生产环境中并不适用。虽然它的运行环境简单,但由于所有组件都在一个机器上运行,因此其性能和扩展性有限。

其次,伪集群模式,也是一种比较基础的部署方式。在此模式下,所有服务,包括master、worker、API server以及alert server等,都部署在同一台机器上。这种模式相比单机模式,能够更好的模拟分布式环境,但仍不适合在生产环境中使用。我个人并不推荐在生产环境中使用这种模式,因为它并没有真正的高可用和负载均衡。

在生产环境中,集群模式和K8S模式是最常用的部署方式。集群模式,或者说 cluster 模式,可以有多个 master 和多个 worker,这样可以实现负载均衡和容错。例如,可以有两个 master 或者更多的 worker。这种部署方式可以满足大规模,高并发的工作负载。

K8S 模式,也就是 Kubernetes 模式,是当前最先进的部署方式。现在的技术趋势更多的是虚拟化和容器化,因此,K8S 模式在许多生产环境中得到了广泛应用。它具有良好的管理能力,可以轻松地打包和打镜像,然后直接上传到 K8S 进行部署。它实现了整个容器的运行调度以及资源隔离。这些都是由 K8S 自动管理的,大大降低了运维难度和成本。

如果比较集群模式和K8S模式,K8S模式无疑更为高效和易于管理。例如,如果我们有100台机器,使用集群模式,我们需要在每台机器上手动部署服务,这就需要大量的人工操作和时间。但在K8S模式下,这些部署工作都可以自动完成,大大提高了效率。

功能特性

Apache DolphinScheduler 具有许多显著特性,可以大致分为以下六个方面:

简单易用:Apache DolphinScheduler 主要面向非开发人员,更多地关注业务层面,如 SQL 编写等。因此,它的可视化界面非常友好,用户可以通过简单的拖放操作完成工作流的创建和调整。

模块化操作:模块化操作有助于定制和维护,包括我们之前提到的 master、worker、alert 以及 API 等组件。

丰富的组件支持:DolphinScheduler 支持许多常用组件,如 Shell、MapReduce、Spark、Flink、SQL、DataX、Jupiter 等,满足了各种业务场景的需求。

灵活的工作流操作:DolphinScheduler 支持暂停、定时、恢复和停止等工作流操作。

相比于 Airflow 和 Oozie 等其他工作流工具,DolphinScheduler 的暂停操作功能更加强大。

高可靠性:DolphinScheduler 采用去中心化设计,具有原生的高可用性和任务队列支持,能够提供过载容错能力。

这些特点确保了 DolphinScheduler 能够提供高度稳健的运行环境。

高扩展性:DolphinScheduler 可以轻松实现动态扩展。例如,当资源不足时,可以从 10 台机器扩展到 20 台机器,系统会自动识别并处理这些新加入的机器。

此外,它还支持多租户和在线资源管理,能够稳定地运行每天 10 万个数据任务

02

 Apache DolphinScheduler架构

在理解架构设计时,首先需要了解架构的元数据情况。


8b31ca9b595d8cc2509810612df91100.png

Apache DolphinScheduler架构中有多个层级关系:

租户与用户:在一个租户下,可以有多个用户,形成租户与用户的一对多关系。

用户与项目:在一个用户下,可以存在多个项目,因此也是一对多关系。

项目与工作流:每个项目下可以定义多个工作流,但是每个工作流只能属于一个项目。

比如,工作流a只能属于项目a,而工作流b可能就被定义在项目b中,而不属于项目a。项目和工作流之间存在一种隔离关系。

租户与工作流:租户可以被多个工作流定义使用,每个工作流必须且只能选择一个租户。在实际运行中,运行工作流的形式是以租户的身份进行,而不是用户。

工作流与定时:每个工作流可以定义一个或者多个定时。这意味着同一个工作流可以在不同的时间点被触发执行,比如凌晨1点和早上9点,以满足不同的业务需求。

工作流定义与任务定义:一个工作流定义可以对应多个任务定义。也就是说,每次运行工作流,都可能产生一个任务定义。因此,一个工作流可以同时产生多个任务定义。

工作流定义与工作流实例:每个工作流定义可以产生一个工作流实例。在DolphinScheduler的web页面的左边菜单,有工作流定义和任务定义按钮,以及工作流实例菜单按钮。

工作流实例与任务实例:每个工作流实例可以对应一个或者多个任务实例。这也是一种一对多的关系。

关键组件

Apache DolphinScheduler的整体架构包括多个关键组件,这些组件通过协同工作来提供强大的调度功能。

UI(用户界面):这是系统的前端页面,为用户提供了一系列可视化操作界面。

API(应用程序接口):这一层是API服务器,主要负责处理前端UI层的请求。该服务统一提供RESTful API向外部提供请求服务,包括工作流的创建、定义、查询、修改、发布、下线、手动启动、停止、暂停、恢复,以及从指定节点开始执行等等。对Apache DolphinScheduler进行二次开发时,我们通常会在这一层进行代码编写,实现产品对接。

MasterServer:MasterServer主要负责DAG任务的切分、任务提交监控,并同时监听其他MasterServer和WorkerServer的健康状态。启动时,MasterServer向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进行容错处理。

WorkerServer:WorkerServer主要负责任务的执行和提供日志服务。类似于MasterServer,WorkerServer在启动时也会向Zookeeper注册临时节点,并维持心跳。

Registry(注册中心):系统中的MasterServer和WorkerServer节点通过注册中心进行集群管理和容错。此外,系统还基于注册中心进行事件监听和分布式锁。

Alert(告警模块):Alert模块提供告警相关功能,仅支持单机服务。此模块支持自定义告警插件,负责收集告警信息,并将这些信息存储到数据库中。

Database(数据库):数据库存储了一些元数据信息,包括工作流定义信息、任务定义信息和工作流实例信息等。

Zookeeper:Zookeeper在整个架构中起到了非常关键的作用,它监听了一些心跳容错,以及一些注册等信息。

03

 补数介绍

首先,让我们理解一下什么是补数。

补数,简单来说,就是当我们的数据处理失败后,需要重新处理那些失败的数据。在过去,我们需要手动执行这个操作,但是现在,通过我们的操作界面,可以直接找到失败的任务,选择补数功能,设定对应的时间即可。

补数的主要策略是生成对应的工作流,包括串行补数和并行补数。

串行补数

3e888ec9a0a641903eb992ce6f97dd39.jpeg

指定时间范围内

从开始日期至结束日期依次执行补数,依次生成多条流程实例;点击运行工作流,选择串行补数模式:例如从7月 9号到7月10号依次执行,依次在流程实例页面生成两条流程实例。

在web页面上,这个日期是可以选的,会弹出来一个日历的形式,选这个日期就 OK 了。另外一种就是一种手输的方式,就是 enter data,可以手动把日期格式、日期的时间输进去。最多只能输 100 个,超过就不行了。

并行补数

27c8c942a8780218cfbd2bc85d086ffb.jpeg

指定时间范围内,同时进行多天的补数,同时生成多条流程实例。

手动输入日期:手动输入以逗号分割日期格式为 yyyy-MM-dd HH:mm:ss 的日期。点击运行工作流,选择并行补数模式:例如同时执行7月9号到7月10号的工作流定义,同时在流程实例页面生成两条流程实例(执行策略为串行时流程实例按照策略执行)

并行度

指在并行补数的模式下,最多并行执行的实例数。例如同时执行7月6号到7月10号的工作流定义,并行度为2

1aaa0d977dcaa41730200e9f032495c6.jpeg

换句话就是说页面每次运行,我最多运行多少个工作流实例,这叫并行度。我们在页面上是可输入的,可控制的。

45b9c9258afcbaf0c8c5c9b7b9bb21cd.jpeg

比如并行都是2,但是我每次就是说运行的时候是两条产生的,直到这所有的任务运行完成。但最后我有 11 条,每两条能产生 6 批,最后一批是一个。

日期选择

a7eb35a95aa7df7ba9f91e01adabe15c.jpeg

日期选择刚才说的 select date,它是可弹窗进行日历的选择, enter date 是以横杠分隔的日期格式进行输入,然后进行执行。

c7da425939652d317a831baccdc7277a.jpeg

补数与定时配置的关系

1127bbc2b43058b028cf5bd1eee847ca.jpeg

未配置定时或已配置定时并定时状态下线

根据所选的时间范围结合定时默认配置(每天0点)进行补数,比如该工作流调度日期为7月7号到7月10号。

8de5b33752249eeac36cf536e33606c7.jpeg

已配置定时并定时状态上线

根据所选的时间范围结合定时配置进行补数,比如该工作流调度日期为7月7号到7月10号,配置了定时(每日凌晨5点运行)

4d6168eb62beba0a5d7f5c9272882465.jpeg

04

 源码解读

补数执行流程

串行流程

start-process-instance->createCommand->RUN_MODE_SERIAL->insertCommand->MasterSchedulerBootstrap:findCommands->WorkflowExecuteRunnable:handleEvents->processComplementData->needComplementProcess->finish

并行流程

start-process-instance->createCommand->RUN_MODE_PARALLEL->insertCommand->MasterSchedulerBootstrap:findCommands->WorkflowExecuteRunnable:handleEvents->processComplementData->needComplementProcess->finish

DolphinScheduler-ExecutorController

请求参数

Select Date

373457eb4e99162dba77f18e6fc85739.png

Enter Date

7432065f96502f9c2e88bc765c18fd6a.png

串行补数

RUN_MODE_SERIAL

178ec7e335b224ba3f2ef482e35d9791.png

并行补数

RUN_MODE_PARALLEL

65e16006bbc9a0546c923d70595718f0.png

44c4474a0b7b5f88d19d884aa7117a09.png

DolphinScheduler-MasterSchedulerBootstrap

MasterSchedulerBootstrap:findCommands监听ds_t_command获取表中的命令,构造ProcessInstance

1bbbcbb9063b3abba39c1ccd166a33d0.png

58fedbb44b2751835748fc01b0d5571e.png

fcfe52e393bda74bee356174570ac1e0.png

DolphinScheduler-WorkflowExecuteRunnable

WorkflowExecuteRunnable:initTaskQueue-初始化补数对应的时间参数

5257f10e35adbc83a9b8cb3db1feca33.png

WorkflowExecuteRunnable:processComplementData-通过需要补数的时间构造command

0ceb35be704077d887fa236b03477610.png

WorkflowExecuteRunnable:createComplementDataCommand-创建下一次需要执行的comand,insert command

d9f6a9304286d062005c40003f882b6e.png

 05  

遇到的问题及参与开源

接下来将分享一下我是如何参与开源项目的,以及我所遇到的一些问题和开源带来的好处。

我在使用Apache DolphinScheduler时遇到的两个主要问题。

第一个问题是在资源管理方面,举例来说,假设我有10个任务,这些任务都依赖于同一个jar包。如果这个jar包被我更改了,那我就需要下线任务,然后重新上线,并重新关联这个任务。我觉得这个操作过于复杂,尤其是对于实时任务,这样的切换操作就更加困难了。这是一个当前的问题,我相信很多公司可能也会遇到这个问题。

第二个问题是任务阻塞。我们的任务数量达到了几百个,任务之间的依赖非常多,这就导致了任务容易出现阻塞,有时候页面上的任务无法取消,我们只能清空数据库来解决这个问题。

现在,我想讨论一下参与开源的好处

可以提升开发者的技术水平。因为在公司,我们写的代码和开源代码的质量差距很大。当我提交一个PR(Pull Request)到开源项目时,很多高手会进行代码审查,并给出建议。这对于我们自身的技术提升是非常有帮助的。

其次,参与开源项目可以提高我们的代码质量。如果我们只在公司内部写代码,可能没有严格的代码审查和管理,但是在开源项目中,你所接触到的代码都是有一定规范的。

第三,通过参与开源项目,我们能够获取到一些项目经验。在开源项目中,很多功能都是来自全球各地的开发者的思想和想法,我们可以学习他们的思考方式,并且可以在项目平台上提出我们的问题,与大家进行交流。

第四,参与开源可以帮助我们建立更广阔的人脉关系。在工作中,我们的人脉可能比较单一,主要是公司内部的同事。但在开源社区中,我们能够认识到更多专注于技术的人,这对于我们的成长是非常有帮助的。

最后,关于如何参与开源,方式其实有很多种。对于我们程序员来说,通过提交代码应该是最快的方式。

当然,非代码贡献也很重要,我们可以在社区中审查代码、回答问题、互动交流,或者在博客上发布自己的文章等,感兴趣的可以联系社区运营同学 18819063834。

参与贡献

随着国内开源的迅猛崛起,Apache DolphinScheduler 社区迎来蓬勃发展,为了做更好用、易用的调度,真诚欢迎热爱开源的伙伴加入到开源社区中来,为中国开源崛起献上一份自己的力量,让本土开源走向全球。

57862ffcb6336fca615157cb32669574.png

参与 DolphinScheduler 社区有非常多的参与贡献的方式,包括:

40aa068d3d631a2dbebc2eb5326985d6.png

贡献第一个PR(文档、代码) 我们也希望是简单的,第一个PR用于熟悉提交的流程和社区协作以及感受社区的友好度。

社区汇总了以下适合新手的问题列表:https://github.com/apache/dolphinscheduler/issues/5689

非新手问题列表:https://github.com/apache/dolphinscheduler/issues?q=is%3Aopen+is%3Aissue+label%3A%22volunteer+wanted%22

如何参与贡献链接:https://dolphinscheduler.apache.org/zh-cn/community/development/contribute.html

来吧,DolphinScheduler开源社区需要您的参与,为中国开源崛起添砖加瓦吧,哪怕只是小小的一块瓦,汇聚起来的力量也是巨大的。

参与开源可以近距离与各路高手切磋,迅速提升自己的技能,如果您想参与贡献,我们有个贡献者种子孵化群,可以添加社区小助手微信(Leonard-ds) ,手把手教会您( 贡献者不分水平高低,有问必答,关键是有一颗愿意贡献的心 )。

ebd9f4c133dd58e319dd4e11ddf64be2.jpeg

添加社区小助手微信(Leonard-ds) 

添加小助手微信时请说明想参与贡献。

来吧,开源社区非常期待您的参与。

< 🐬🐬 >

更多精彩推荐

Apache DolphinScheduler 3.0.6 发布,或将是最后一个 3.0.X 版本

☞优秀用户案例有奖征集 | 活动火热开启,快来投稿!

用一杯星巴克的钱,训练自己私有化的ChatGPT

☞运维实战:Apache DolphinScheduler 生产环境升级

☞去年办了这么多场Meetup都没有你,2023年赶紧安排起来!

☞企业级应用如何用 Apache DolphinScheduler 有针对性地进行告警插件开发?

CommunityOverCode Asia 2023 强势来袭!15 大专题议题征集 6 月 6 日截止

我知道你在看87500bfd344bb7a2627f176525ca31c7.png

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DolphinScheduler社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值