点击蓝字,关注我们🔼
引言
大家好,我叫侯世涛,是个人开发者,也是 Apache DolphinScheduler 社区的贡献者,目前在社区参与开发已经有两年时间,欢迎大家跟我交流。本次分享将深入探讨 DolphinScheduler 的自动化补数功能,将详细介绍如何使用补数功能,摆脱手动执行脚本修复数据的繁琐过程,实现数据处理的全自动化。
文|侯世涛
编辑整理| 曾辉
讲师介绍
侯世涛
DolphinScheduler 贡献者
我今天分享的内容分为4个部分
Apache DolphinScheduler概览
Apache DolphinScheduler架构
Apache DolphinScheduler补数介绍
Apache DolphinScheduler源码讲解
遇到的问题和参与开源
01
Apache DolphinScheduler概览
Apache DolphinScheduler是一个可扩展的开源分布式工作流平台。开源意味着它能够被许多公司用于二次开发,这尤其适用于那些不希望使用商业版本,但又不想自行编写某些功能的公司,它们可以利用开源项目提供的功能。
Apache DolphinScheduler采用了DAG(有向无环图)工作流,它通过可视化图形来展示任务之间的上下游依赖关系,这样的依赖关系可以轻松调整。
此外,Apache DolphinScheduler能有效处理复杂的ETL依赖问题,这在许多行业,如金融和工业等,都非常实用。因为在这些行业中,数据或任务经常会有复杂的上下游依赖关系。
例如,一个sale节点可能需要依赖上游的sale节点,或者依赖于MySQL、Postgresql、Flink等节点。这种复杂的依赖关系在实际使用过程中可能会引发各种问题,比如系统卡死等,这是我们在实际生产中常常遇到的问题。
最后,Apache DolphinScheduler还提供了监控和告警模块。在任务调度过程中,我们需要知道每个任务的当前状态。如果任务失败了,我们需要得到告警,并及时进行人工处理。另外,如果任务失败,我们可能会尝试重试,但是通常情况下,如果任务失败了,即使重试3次,也可能仍然无法成功,这时就需要人工介入,所以告警功能在这里非常重要。
部署模式
给大家介绍下 Apache DolphinScheduler 四种部署模式。
首先,有单机模式,也被称为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架构
在理解架构设计时,首先需要了解架构的元数据情况。
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
补数介绍
首先,让我们理解一下什么是补数。
补数,简单来说,就是当我们的数据处理失败后,需要重新处理那些失败的数据。在过去,我们需要手动执行这个操作,但是现在,通过我们的操作界面,可以直接找到失败的任务,选择补数功能,设定对应的时间即可。
补数的主要策略是生成对应的工作流,包括串行补数和并行补数。
串行补数
指定时间范围内
从开始日期至结束日期依次执行补数,依次生成多条流程实例;点击运行工作流,选择串行补数模式:例如从7月 9号到7月10号依次执行,依次在流程实例页面生成两条流程实例。
在web页面上,这个日期是可以选的,会弹出来一个日历的形式,选这个日期就 OK 了。另外一种就是一种手输的方式,就是 enter data,可以手动把日期格式、日期的时间输进去。最多只能输 100 个,超过就不行了。
并行补数
指定时间范围内,同时进行多天的补数,同时生成多条流程实例。
手动输入日期:手动输入以逗号分割日期格式为 yyyy-MM-dd HH:mm:ss 的日期。点击运行工作流,选择并行补数模式:例如同时执行7月9号到7月10号的工作流定义,同时在流程实例页面生成两条流程实例(执行策略为串行时流程实例按照策略执行)
并行度
指在并行补数的模式下,最多并行执行的实例数。例如同时执行7月6号到7月10号的工作流定义,并行度为2
换句话就是说页面每次运行,我最多运行多少个工作流实例,这叫并行度。我们在页面上是可输入的,可控制的。
比如并行都是2,但是我每次就是说运行的时候是两条产生的,直到这所有的任务运行完成。但最后我有 11 条,每两条能产生 6 批,最后一批是一个。
日期选择
日期选择刚才说的 select date,它是可弹窗进行日历的选择, enter date 是以横杠分隔的日期格式进行输入,然后进行执行。
补数与定时配置的关系
未配置定时或已配置定时并定时状态下线
根据所选的时间范围结合定时默认配置(每天0点)进行补数,比如该工作流调度日期为7月7号到7月10号。
已配置定时并定时状态上线
根据所选的时间范围结合定时配置进行补数,比如该工作流调度日期为7月7号到7月10号,配置了定时(每日凌晨5点运行)
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
Enter Date
串行补数
RUN_MODE_SERIAL
并行补数
RUN_MODE_PARALLEL
DolphinScheduler-MasterSchedulerBootstrap
MasterSchedulerBootstrap:findCommands监听ds_t_command获取表中的命令,构造ProcessInstance
DolphinScheduler-WorkflowExecuteRunnable
WorkflowExecuteRunnable:initTaskQueue-初始化补数对应的时间参数
WorkflowExecuteRunnable:processComplementData-通过需要补数的时间构造command
WorkflowExecuteRunnable:createComplementDataCommand-创建下一次需要执行的comand,insert command
05
遇到的问题及参与开源
接下来将分享一下我是如何参与开源项目的,以及我所遇到的一些问题和开源带来的好处。
我在使用Apache DolphinScheduler时遇到的两个主要问题。
第一个问题是在资源管理方面,举例来说,假设我有10个任务,这些任务都依赖于同一个jar包。如果这个jar包被我更改了,那我就需要下线任务,然后重新上线,并重新关联这个任务。我觉得这个操作过于复杂,尤其是对于实时任务,这样的切换操作就更加困难了。这是一个当前的问题,我相信很多公司可能也会遇到这个问题。
第二个问题是任务阻塞。我们的任务数量达到了几百个,任务之间的依赖非常多,这就导致了任务容易出现阻塞,有时候页面上的任务无法取消,我们只能清空数据库来解决这个问题。
现在,我想讨论一下参与开源的好处。
可以提升开发者的技术水平。因为在公司,我们写的代码和开源代码的质量差距很大。当我提交一个PR(Pull Request)到开源项目时,很多高手会进行代码审查,并给出建议。这对于我们自身的技术提升是非常有帮助的。
其次,参与开源项目可以提高我们的代码质量。如果我们只在公司内部写代码,可能没有严格的代码审查和管理,但是在开源项目中,你所接触到的代码都是有一定规范的。
第三,通过参与开源项目,我们能够获取到一些项目经验。在开源项目中,很多功能都是来自全球各地的开发者的思想和想法,我们可以学习他们的思考方式,并且可以在项目平台上提出我们的问题,与大家进行交流。
第四,参与开源可以帮助我们建立更广阔的人脉关系。在工作中,我们的人脉可能比较单一,主要是公司内部的同事。但在开源社区中,我们能够认识到更多专注于技术的人,这对于我们的成长是非常有帮助的。
最后,关于如何参与开源,方式其实有很多种。对于我们程序员来说,通过提交代码应该是最快的方式。
当然,非代码贡献也很重要,我们可以在社区中审查代码、回答问题、互动交流,或者在博客上发布自己的文章等,感兴趣的可以联系社区运营同学 18819063834。
参与贡献
随着国内开源的迅猛崛起,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%22volunteer+wanted%22
如何参与贡献链接:https://dolphinscheduler.apache.org/zh-cn/community/development/contribute.html
来吧,DolphinScheduler开源社区需要您的参与,为中国开源崛起添砖加瓦吧,哪怕只是小小的一块瓦,汇聚起来的力量也是巨大的。
参与开源可以近距离与各路高手切磋,迅速提升自己的技能,如果您想参与贡献,我们有个贡献者种子孵化群,可以添加社区小助手微信(Leonard-ds) ,手把手教会您( 贡献者不分水平高低,有问必答,关键是有一颗愿意贡献的心 )。
添加社区小助手微信(Leonard-ds)
添加小助手微信时请说明想参与贡献。
来吧,开源社区非常期待您的参与。
< 🐬🐬 >
更多精彩推荐
☞Apache DolphinScheduler 3.0.6 发布,或将是最后一个 3.0.X 版本
☞优秀用户案例有奖征集 | 活动火热开启,快来投稿!
☞用一杯星巴克的钱,训练自己私有化的ChatGPT
☞运维实战:Apache DolphinScheduler 生产环境升级
☞去年办了这么多场Meetup都没有你,2023年赶紧安排起来!
☞企业级应用如何用 Apache DolphinScheduler 有针对性地进行告警插件开发?
☞CommunityOverCode Asia 2023 强势来袭!15 大专题议题征集 6 月 6 日截止
我知道你在看哟