大数跨境

Apache DolphinScheduler Worker Task执行原理解析

Apache DolphinScheduler Worker Task执行原理解析 海豚调度
2024-07-24
1
导读:Worker会判断自身是否过载,如果过载会拒收任务。Master接收到任务分发失败的返回后,会根据分发策略继续选择其他Worker进行任务分发。

大家好,我是蔡顺峰,是白鲸开源的高级数据工程师,同时也是Apache DolphinScheduler社区的Committer和PMC Member。今天我要分享的主题是《Worker Task执行原理》。

整个分享会分为三个章节:

  1. Apache DolphinScheduler的介绍
  2. Apache DolphinScheduler的整体设计背景
  3. Worker任务的具体执行过程

项目介绍

Apache DolphinScheduler是一个分布式、易扩展的可视化工作流调度开源系统,适用于企业级场景。

它提供了以下主要功能,通过可视化操作,提供了工作流和任务全生命周期的数据处理解决方案。

主要特性

简单易用

  • 可视化DAG操作:用户可以在页面上通过拖拉拽来编排不同的组件,形成DAG(有向无环图)。
  • 插件化体系:包括任务插件、数据源插件、告警插件、存储插件、注册中心插件和定时任务插件等。用户可以根据需要方便地进行插件扩展,以适应自己的业务需求。

丰富的使用场景

  • 静态配置:包括工作流定时配置、上线下线操作、版本管理和补数功能。
  • 运行态操作:提供了暂停、停止、恢复和参数替换等功能。
  • 依赖类型:支持丰富的依赖选项和策略,适应更多场景。
  • 参数传递:支持工作流级别的启动参数、全局参数、任务级别的本地参数和动态传参。

高可靠性

  • 去中心化设计:各个服务均为无状态,可以水平扩展节点,提高系统的吞吐能力。
  • 过载保护和实例容错
    • 过载保护:在运行过程中,master和worker会检测自身的CPU和内存使用情况,以及任务量。如果过载,会暂停本轮工作流/任务的处理分发,等恢复后再继续处理。
    • 实例容错:当master/worker节点挂掉时,注册中心会感知服务节点下线,并对工作流实例或任务实例进行容错处理,尽量保证系统的自恢复能力。

整体设计背景

项目架构

下面介绍一下整体的设计背景,以下是官网提供的设计架构图。

从架构图中我们可以看到,Apache DolphinScheduler由几个主要组件构成:

  1. API组件:API服务主要负责元数据管理,通过API服务与UI交互,或通过API接口调用来创建工作流任务,以及工作流所需的各种资源。
  2. Master组件:Master是工作流实例的掌管者,负责消费命令并转换为工作流实例,进行DAG的切分,按顺序提交任务,并将任务分发给worker。
  3. Worker组件:Worker是具体的任务执行者。收到任务后,按不同任务类型进行处理,并与Master交互,回传任务状态。值得一提的是,Worker服务不与数据库交互,只有API、Master和Alert这三个服务与数据库交互。
  4. 告警服务:告警服务通过不同的告警插件发送告警信息。这些服务会注册到注册中心,Master和Worker会定期上报心跳和当前状态,确保能正常接收任务。

Master和Worker的交互过程

Master和Worker的交互过程如下:

任务提交:Master完成DAG切分后,将任务提交到数据库,并根据不同的分发策略选择合适的Worker分组进行任务分发。

任务接收:Worker接收到任务后,查看自身情况决定是否接收任务。接收成功或失败都会有反馈。

任务执行:Worker处理任务,并将状态更新为running,回馈给Master。Master更新任务的状态和启动时间等信息到数据库。

任务完成:任务执行完毕后,Worker发送finish事件通知Master,Master返回ACK确认。如果没有ACK,Worker会不断重试,确保任务事件不丢失。

Worker接收任务

Worker接收任务时会进行以下操作:

  1. 填充自己的host信息。
  2. 生成Worker机器上的日志路径。
  3. 生成Worker Task Executor,将其提交到线程池中等待执行。

Worker会判断自身是否过载,如果过载会拒收任务。Master接收到任务分发失败的返回后,会根据分发策略继续选择其他Worker进行任务分发。

Worker 执行过程

Worker任务的具体执行过程包括以下几个步骤:

  1. 任务初始化:初始化任务所需的环境和依赖。
  2. 任务执行:执行具体的任务逻辑。
  3. 任务完成:任务执行完成后,向Master节点汇报任务的执行结果。

接下来我们详细讲解任务的具体执行过程。

在任务执行开始之前,首先会初始化一个上下文(context)。此时会设置任务的开始时间(start time)。为了保证任务的准确性,需要确保Master和Worker之间的时间同步,避免时间漂移。

随后,将任务状态设置为running,并回馈给Master,告知任务开始运行。

由于大部分任务运行在Linux操作系统上,因此需要进行租户和文件的处理:

  • 租户处理:首先判断租户是否存在。如果不存在,则根据配置决定是否自动创建租户。这需要部署用户具有sudo权限,以便在执行任务时切换到指定租户。
  • 特定用户:对于某些场景,不需要切换租户,只需使用特定用户执行任务。此种情况下,系统同样支持。

处理完租户后,Worker会创建具体的执行目录。执行目录的根目录是可配置的,并需要进行相应的授权。默认情况下,目录的权限设置为755。

任务在执行过程中可能需要使用各种资源文件,例如从AWS S3或HDFS集群中拉取文件。系统会将这些文件下载到Worker的临时目录中,供后续任务使用。

在Apache DolphinScheduler中,支持对参数变量进行替换。主要包括以下两类:

  • 内置参数:主要涉及时间和日期相关的参数替换。
  • 用户自定义参数:用户在工作流或任务中设置的参数变量,也会进行相应的替换。

通过上述步骤,任务的执行环境和所需资源都已准备就绪,接下来便可正式开始任务的执行。

不同类型的任务

在Apache DolphinScheduler中,我们支持多种类型的任务,每种任务类型适用于不同的场景和需求。下面我们详细介绍几大类任务类型及其具体组件。

这些组件常用于执行脚本文件,适用于各种脚本语言和协议:

  • Shell:执行Shell脚本。
  • Python:执行Python脚本。
  • SQL:执行SQL语句。
  • 存储过程:执行数据库存储过程。
  • HTTP:进行HTTP请求。

其商业版还支持通过执行JAR包来运行Java应用程序。

逻辑任务组件

这些组件用于实现任务的逻辑控制和流程管理:

  • Switch:条件控制任务。
  • Dependent:依赖任务。
  • SubProcess:子任务。
  • NextLoop(商业版):适用于金融场景的循环控制任务。
  • Trigger组件:用于监听文件、数据是否存在。
大数据组件

这些组件主要用于大数据处理和分析:

  • SeaTunnel:对应着商业版WhaleTunnel,用于大数据集成处理。
  • AWS EMR:Amazon EMR集成。
  • HiveCli:Hive命令行任务。
  • Spark:Spark任务。
  • Flink:Flink任务。
  • DataX:数据同步任务。
容器组件

这些组件用于在容器环境中运行任务:

  • K8S:Kubernetes任务。
数据质量组件

用于确保数据质量:

  • DataQuality:数据质量检查任务。
交互组件

这些组件用于与数据科学和机器学习环境进行交互:

  • Jupyter:Jupyter Notebook任务。
  • Zeppelin:Zeppelin Notebook任务。
机器学习组件

这些组件用于机器学习任务的管理和执行:

  • Kubeflow:Kubeflow任务。
  • MlFlow:MlFlow任务。
  • Dvc:Data Version Control任务。

整体来看,Apache DolphinScheduler支持三四十个组件,涵盖了从脚本执行、大数据处理到机器学习等多个领域。如果有兴趣了解更多,请访问官网查看详细文档。

任务类型的抽象

在Apache DolphinScheduler中,任务类型被抽象成多种不同的处理模式,以适应各种不同的运行环境和需求。

下面我们详细介绍任务类型的抽象和执行过程。

Worker是一个JVM服务,部署在某个服务器上。对于一些脚本组件(如Shell、Python)和本地运行的任务(如Spark Local),它们会起一个单独的进程运行。

此时,Worker与这些任务的交互通过进程ID(PID)进行。

不同的数据源可能需要不同的适配处理。针对SQL和存储过程任务,我们做了面向不同数据源的抽象。例如MySQL、PostgreSQL、AWS Redshift等。通过这种抽象,可以灵活地适配和扩展不同的数据库类型。

远程任务指的是在远程集群上运行的任务,如AWS EMR、SeaTunnel集群、Kubernetes集群等。Worker不会在本地执行这些任务,而是向远程集群提交任务,并监听其状态和消息。这种模式适用于云环境的扩展。

任务执行

日志收集

不同插件会走不同的处理模式,因此日志收集也有所不同:

  • 本地进程:监听进程的输出,记录日志。
  • 远程任务:定期检查远程集群(如AWS EMR)的任务状态和输出,将其记录到本地的任务日志中。
参数变量替换

系统会扫描任务日志,查找需要动态替换的参数变量。例如,DAG中的任务A可能会生成一些输出参数,这些参数需要传递给下游的任务B。

在此过程中,系统会读取日志并替换参数变量。

获取任务ID
  • 本地进程:获取进程ID(PID)。
  • 远程任务:获取远程任务的ID(如AWS EMR任务ID)。

持有这些任务ID,可以进行更多的数据查询和远程任务操作。例如,在工作流停止时,可以通过任务ID调用对应的取消接口,停止正在运行的任务。

容错处理
  • 本地进程:如果Worker节点挂掉,本地进程将无法感知,需要重新提交任务。
  • 远程任务:如果任务运行在远程集群(如AWS),则可以通过任务ID检查远程任务的状态,并尝试接管任务。如果能接管,则无需重新提交任务,节省时间成本。

执行结束

当任务执行完毕后,需要进行一系列结束动作:

任务完成后,系统会检查是否需要发送告警。例如,对于SQL任务,如果查询结果需要发送告警,系统会通过RPC与告警服务(alert)交互发送告警信息。

Worker会将任务的完成事件(finish事件)回馈给Master。Master更新任务状态到数据库,并进行DAG状态流转。Worker会将任务开始时创建的上下文从内存中移除。清理任务执行过程中生成的文件路径。如果处于调试模式(开发模式),这些文件不会被清理,保留以便调试失败任务。

通过上述步骤,任务实例的整个执行流程就完成了。

社区贡献

如果您对Apache DolphinScheduler感兴趣,并希望为开源社区做贡献,欢迎参考我们的贡献指南。社区非常欢迎大家积极贡献,包括但不限于:

  • 提出使用过程中的issue
  • 提交文档和代码PR
  • 补充单元测试(UT)
  • 添加代码注释
  • 修复bug或添加新特性
  • 撰写技术文章或进行讲座

新手贡献者指南

对于新手贡献者,可以在社区的GitHub issue中搜索标签为good first issue的问题。这些问题通常比较简单,适合初次贡献的用户。

白鲸开源 DataOPS 介绍

白鲸开源是一家开源原生的 DataOPS 商业公司,由多个Apache基金会成员创立。公司主要参与贡献了两个Apache开源项目,一个是Apache DolphinScheduler,另一个是Apache SeaTunnel。基于这两个项目,我们打造了一个商业产品——WhaleStudio。

WhaleStudio 介绍

WhaleStudio是一个分布式云原生并且带有强大可视化界面的 DataOPS 系统,增强了商业客户所需的企业级特性。它结合了调度和数据同步的可视化,能够无缝衔接,并低代码实现企业大数据操作系统和高速公路。

主要特性

  1. 调度和数据同步可视化结合

    • 无缝衔接,低代码实现企业大数据操作系统和高速公路。
  2. 集成工具支持

    • 商业版对接了GitLab等集成工具,完善了DataOPS流程。
  3. 丰富的数据源对接

    • 支持更多的数据源和传统ETL数据组件,如Informatica。
  4. 完善的权限控制

    • 提供细粒度的角色和权限分配和控制。
  5. 审计系统和新创环境适配

    • 提高安全性和可观测性。
  6. 工作流和任务实例操作优化

    • 提高操作性能和数据完整性,增强运维能力。

产品界面

下图展示了我们DataOps系统中的实时任务实例界面。可以看到界面提供了详细的数据和面板,帮助用户更好地管理和监控任务。

通过今天的分享,我们了解了Apache DolphinScheduler的项目介绍、整体设计背景以及Worker任务的具体执行过程。

希望这些内容能够帮助大家更好地理解和使用Apache DolphinScheduler。如果大家有任何问题,欢迎随时与我交流。谢谢大家!

联系方式

公司网站: www.whaleops.com
联系邮箱: zenghui@whaleops.com

活动推荐

🌟 联通数科与 DolphinScheduler 构建数据研发运营一体化能力 🌟
各位技术爱好者们,7月30日晚上7:00,我们将邀请联通数科的王兴杰老师进行线上分享,探讨联通数科如何基于 DolphinScheduler 构建数据研发、治理、运营一体化平台,介绍在 DataOps 领域的平台工具建设经验与感悟。这是一次了解前沿技术、交流实践经验的绝佳机会,欢迎大家积极报名参与!💻💡


<🐬🐬 >

推荐阅读

用户实践案例
奇富科技  蜀海供应链 联通数科 拈花云科
蔚来汽车 长城汽车 集度 长安汽车
思科网讯 生鲜电商 联通医疗 联想
新网银行 消费金融  腾讯音乐 自如
有赞 伊利 当贝大数据
联想 传智教育 Bigo
通信行业  作业帮 太美医疗

迁移实践
Azkaban   Ooize   
Airflow (有赞案例) Air2phin(迁移工具)
Airflow迁移实践
Apache DolphinScheduler 3.0.0 升级到 3.1.8 教程

新手入门
选择Apache DolphinScheduler的10个理由
Apache DolphinScheduler 3.1.8 保姆级教程【安装、介绍、项目运用、邮箱预警设置】轻松拿捏!
Apache DolphinScheduler 如何实现自动化打包+单机/集群部署?
Apache DolphinScheduler-3.1.3 版本安装部署详细教程
Apache DolphinScheduler 在大数据环境中的应用与调优

< 🐬🐬 >
参与社区

参与Apache 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开源社区需要您的参与,为中国开源崛起添砖加瓦吧,哪怕只是小小的一块瓦,汇聚起来的力量也是巨大的!

【声明】内容源于网络
0
0
海豚调度
Apache DolphinScheduler是一个分布式、去中心化、易扩展的可视化DAG工作流任务调度系统,其致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。
内容 667
粉丝 0
海豚调度 Apache DolphinScheduler是一个分布式、去中心化、易扩展的可视化DAG工作流任务调度系统,其致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。
总阅读167
粉丝0
内容667