Apache DolphinScheduler Worker Task执行原理解析

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

file

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

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

项目介绍

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

file

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

主要特性

简单易用
  • 可视化DAG操作:用户可以在页面上通过拖拉拽来编排不同的组件,形成DAG(有向无环图)。
  • 插件化体系:包括任务插件、数据源插件、告警插件、存储插件、注册中心插件和定时任务插件等。用户可以根据需要方便地进行插件扩展,以适应自己的业务需求。
丰富的使用场景
  • 静态配置:包括工作流定时配置、上线下线操作、版本管理和补数功能。
  • 运行态操作:提供了暂停、停止、恢复和参数替换等功能。
  • 依赖类型:支持丰富的依赖选项和策略,适应更多场景。
  • 参数传递:支持工作流级别的启动参数、全局参数、任务级别的本地参数和动态传参。
高可靠性
  • 去中心化设计:各个服务均为无状态,可以水平扩展节点,提高系统的吞吐能力。
  • 过载保护和实例容错
    • 过载保护:在运行过程中,master和worker会检测自身的CPU和内存使用情况,以及任务量。如果过载,会暂停本轮工作流/任务的处理分发,等恢复后再继续处理。
    • 实例容错:当master/worker节点挂掉时,注册中心会感知服务节点下线,并对工作流实例或任务实例进行容错处理,尽量保证系统的自恢复能力。

整体设计背景

项目架构

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

file

从架构图中我们可以看到,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的交互过程如下:

file

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

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

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

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

Worker接收任务

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

file

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

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

file

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中,我们支持多种类型的任务,每种任务类型适用于不同的场景和需求。下面我们详细介绍几大类任务类型及其具体组件。

file

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

  • 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中,任务类型被抽象成多种不同的处理模式,以适应各种不同的运行环境和需求。

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

file

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

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

不同的数据源可能需要不同的适配处理。针对SQL和存储过程任务,我们做了面向不同数据源的抽象。

例如,MySQL、PostgreSQL、AWS Redshift等。通过这种抽象,可以灵活地适配和扩展不同的数据库类型。

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

任务执行

file

日志收集

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

  • 本地进程:监听进程的输出,记录日志。
  • 远程任务:定期检查远程集群(如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感兴趣,并希望为开源社区做贡献,欢迎参考我们的贡献指南。社区非常欢迎大家积极贡献,包括但不限于:

file

  • 提出使用过程中的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系统中的实时任务实例界面。可以看到界面提供了详细的数据和面板,帮助用户更好地管理和监控任务。

file

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

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

本文由 白鲸开源科技 提供发布支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python3网络爬虫开发实战(3)网页数据的解析提取

文章目录 一、XPath1. 选取节点2. 查找某个特定的节点或者包含某个指定的值的节点3. XPath 运算符4. 节点轴5. 利用 lxml 使用 XPath 二、CSS三、Beautiful Soup1. 信息提取2. 嵌套选择3. 关联选择4. 方法选择器5. css 选择器 四、PyQuery1. 初始化2. css 选择器3. 信息提取4. …

一步步理清开源路径规划导航引擎GraphHopper

一步步理清开源路径规划导航引擎GraphHopper,学习应用 GraphHopper简介 源码用 Java 编写,开发人员可以通过 Maven 轻松上手。可以用作** Java 库**来计算两个或多个点之间路线的距离、时间、逐向指示和许多道路属性。可以用作独立的 Web 服务器来计算…

计算R velocity的方法和流程(CellRank2)

愿武艺晴小朋友一定得每天都开心 第一步:拿到cellranger count的文件夹; 运行cellranger count(这个得提前准备:R1和R2的fastq.gz文件 & 鼠的参考基因组文件) wget https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-mm10-2020-A.tar.gz 最后会出现这个:Pipes…

C++简单实现消息队列

简介 消息队列是一种应用间的通讯方式,消息发送后可以立即放回,由消息系统来确保消息的可靠传递。消息发布者只需要将消息发布到消息队列中,而不需要管谁来取。消息使用者只管从消息队列中取消息而不管谁发布的。这样发布者和使用者都不同知…

21.发布确认模式-高级

问题 生产环境中由于一些不明原因,导致rabbitmq重启,在重启的期间生产者消息投递失败,导致消息丢失,需要手动处理恢复。那么如何才能进行rabbitmq的消息可靠性投递?特别是在极端的情况,rabbitmq集群不可用…

Python 教程(六):函数式编程

目录 专栏列表前言函数定义参数返回值 示例函数类型普通函数空函数匿名函数(Lambda 函数)嵌套函数函数装饰器高阶函数 函数参数位置参数默认参数可变位置参数可变关键字参数 函数属性和方法__name____doc__func.__dict__func.__defaults__func.__annotat…

黑马头条Day11- 实时计算热点文章、KafkaStream

一、今日内容 1. 定时计算与实时计算 2. 今日内容 KafkaStream 什么是流式计算KafkaStream概述KafkaStream入门案例SpringBoot集成KafkaStream 实时计算 用户行为发送消息KafkaStream聚合处理消息更新文章行为数量替换热点文章数据 二、实时流式计算 1. 概念 一般流式计…

4、Python+MySQL+Flask的文件管理系统【附源码,运行简单】

4、PythonMySQLFlask的文件管理系统【附源码,运行简单】 总览 1、《文件管理系统》1.1 方案设计说明书设计目标工具列表 2、详细设计2.1 登录2.2 注册2.3 个人中心界面2.4 文件上传界面2.5 其他功能贴图 3、下载 总览 自己做的项目,禁止转载&#xff0c…

UART 通信协议

文章目录 一 简介二 电平标准三 引脚定义四 数据格式五 波特率 一 简介 ​ UART (Universal Asynchronous Receiver/Transmitter),通用异步收发器,是一种串行、异步、全双工通信协议。 串行:利用一条传输线,将数据一位一位地传送…

【七】Hadoop3.3.4基于ubuntu24的分布式集群安装

文章目录 1. 下载和准备工作1.1 安装包下载1.2 前提条件 2. 安装过程STEP 1: 解压并配置Hadoop选择环境变量添加位置的原则检查环境变量是否生效 STEP 2: 配置Hadoop2.1. 修改core-site.xml2.2. 修改hdfs-site.xml2.3. 修改mapred-site.xml2.4. 修改yarn-site.xml2.5. 修改hado…

引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。

vue3 报错: 引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。 解决: 进入对应的 json 文件: 修改: "noEmit": false 当 noEmit 设置为 false 时,TypeScript 编译器将根据项目配置生成相应的输出文…

基于Java的微博传播分析系统的设计与实现

1 项目介绍 1.1 摘要 本文致力于展示一项创新的微博传播分析系统设计与应用研究,该系统基于Java技术,巧妙利用大数据环境下的社交媒体——微博的庞大用户群及高度活跃特性,旨在深度探索信息传播的内在逻辑与社会影响机制。研究开篇明确定了…

OpenCV 灰度直方图

一 直方图的定义,意义和特征 1 定义 在统计学中,直方图是一种对数据分布情况的图形表示,是一种二维统计图表,他的两个坐标分别是统计样本(图像、视频帧)和样本的某种属性(亮度,像素…

bugku-web-cookies

进来以后看到一个巨长的字符串, 源码同样,发现url后面是base64编码解码得keys.txt 还有一个line参数,修改并没有发生任何变化。我想不到要改keys.txt成index.php(base64加密格式:aW5kZXgucGhw) line1时: line2时&…

AcWing 802. 区间和

var说明add存储了插入操作,在指定 x x x下标所在位置 a [ x ] c a[x]c a[x]cquery是求 [ L , R ] [L,R] [L,R]区间和用到的数组,最后才用到alls 是存储离散化之后的值 , 对于会访问到的每个下标,统统丢到 a l l s 里面 ,会把 x 和 [ L , R …

【Golang 面试 - 基础题】每日 5 题(七)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…

数据结构----算法复杂度

1.数据结构前言 数据是杂乱无章的,我们要借助结构将数据管理起来 1.1 数据结构 数据结构(Data Structure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所…

查看路由表 netstat -r

“Kernel IP routing table” 是Linux系统中用于展示和配置IP路由的表。它告诉操作系统如何将数据包从一个网络接口发送到另一个网络或主机。下面是对您给出的路由表条目的解释: Destination:目的地地址,可以是具体的IP地址,也可…

ctfshow解题方法

171 172 爆库名->爆表名->爆字段名->爆字段值 -1 union select 1,database() ,3 -- //返回数据库名 -1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema库名 -- //获取数据库里的表名 -1 union select 1,group_concat(…

Python爬虫入门02:Fiddler下载使用教程

文章目录 手机抓包全攻略:Fiddler 工具深度解析引言Fiddler 工具简介为什么选择 Fiddler? 安装与配置 Fiddler步骤一:下载与安装步骤二:配置浏览器代理步骤三:安装 HTTPS 证书 配置手机以使用 Fiddler步骤一&#xff1…