Apache DolphinScheduler Worker Task执行原理解析

news2024/11/19 6:40:47

大家好,我是蔡顺峰,是白鲸开源的高级数据工程师,同时也是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.coloradmin.cn/o/1955295.html

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

相关文章

数据结构——二叉树定义

一、二叉树概念 二叉树是一种树形数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。每个子节点本身又可以是一个二叉树。二叉树在计算机科学中有着广泛的应用,例如在搜索算法、排序算法等领域 二叉树(Binary Tree)是n(n…

告别繁琐,2024年PDF合并神器搜罗

有时候我们下载得到的PDF文件可能是被拆分成多份文档,这样对于我们查看文件就会造成一定的困扰。这时候如果把他们合并为一份文件就能方便很多。这次我就介绍几款pdf合并工具来解决这个问题吧。 第一款EIDTOR 福昕PDF 链接:https://editor.foxitsoftwar…

C++ STL 容器之deque

deque与vector同属C STL容器,二者有些相似。deque 采用动态数组来管理元素,提供随机存取,它与vector 几乎一摸一样的接口。不同的是:deque的动态数组头尾都开放,能在头尾两端进行快速安插和散出。下面是deque与vector的…

android前台服务

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 未经允许不得转载 目录 一、导读二、使用2.1 添加权限2.2 新建…

nginx 版本升级

Nginx 的版本最开始使用的是 Nginx-1.18.0 , 由于服务升级,需要将 Nginx 的版本升级到 Nginx-1.19.7 ,要求 Nginx 不能中断提供服务。 为了应对上述的需求,提供两种解决方案: 方案1: make upgrade 完成升…

(二十四)进阶算法

文章目录 (一)埃氏筛法1. 原理2. 代码3. 特点 (二)欧拉筛法1. 原理2. 代码3. 特点 (三)分解质因数1. 原理2. 代码 (四)斐波那契数列1. 递推式2. 代码(1) 方法1(2) 方法2 经过12天的“…

[240728] Wikidata 介绍 | 微软与 Lumen 合作提升人工智能算力

目录 Wikidata 介绍微软与 Lumen 合作提升人工智能算力 Wikidata 介绍 中文: 文言: 粤语: 来源: https://www.wikidata.org/wiki/Wikidata:Introduction/zh 微软与 Lumen 合作提升人工智能算力 为了满足人工智能工作负载不断增长的需求&am…

(2024,通用逼近定理(UAT),函数逼近,Kolmogorov–Arnold定理(KAT),任意深度/宽度的网络逼近)综述

A Survey on Universal Approximation Theorems 公和众与号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 1. 简介 2. 神经网络(NN) 3. 通用逼近定理&#xff0…

openssh服务升级到最新版本OpenSSH-9.8p1完全手册---- (只适用于centos6)

[年] 在centos6下编译openssh-9.8p1的rpm包 1、创建用于rpm编译的目录 mkdir -p /root/rpmbuild/SPEC mkdir -p /root/rpmbuild/SOURCES 2、安装rpmbuild和一些其它的基本依赖 yum install gcc gcc-c rpm-build -y 3、上传openssh-9.8p1.tar.gz 这个源码包到centos6服务器上&am…

一篇文章教你如何读懂 JMeter聚合报告参数!

在进行性能测试时,JMeter是一款备受推崇的开源工具。而其中的聚合报告(Aggregate Report)是我们分析测试结果、了解系统性能的重要依据。今天,我们就来深入探讨如何读懂JMeter聚合报告中的各项参数。 面对复杂的聚合报告&#xf…

MySQL创建表完全指南-从零开始学习数据库设计

MySQL创建表快速指南 在大数据时代,掌握数据库技能至关重要。无论你是刚入门的开发者,还是经验丰富的数据分析师,了解如何创建MySQL表格都是必备技能。本文将为你详细讲解MySQL创建表格的全过程,帮助你快速上手数据库设计。 1. 连接到MySQL服务器 首先,确保你已经安装了MyS…

Linux 的超级记事本(代码编辑器) —— vim

Linux 的超级记事本(代码编辑器) —— vim 关于 vimvim 的使用入门级使用——多模式基础使用——多模式插入模式(Insert mode)理解 命令模式(command mode)理解命令集 底行模式(last line mode&…

Logback 快速入门

一、简介 Java 开源日志框架,以继承改善 log4j 为目的而生,是 log4j 创始人 Ceki Glc 的开源产品。 它声称有极佳的性能,占用空间更小,且提供其他日志系统缺失但很有用的特性。 其一大特色是,在 logback-classic 中本…

5G 基站特有的 5 个关键同步挑战

随着 5G 的推出和 O-RAN 联盟等举措,移动设备领域正在遭遇相当大的颠覆,这当然适用于基站和移动回程。 从手机到物联网设备,设备数量呈爆炸式增长,再加上移动视频流、工业物联网和汽车应用等新应用,给移动网络带来了容…

自学JavaScript(放假在家自学第一天)

目录 JavaScript介绍分为以下几点 1.1 JavaScript 是什么 1.2JavaScript书写位置 1.3 Javascript注释 1.4 Javascript结束符 1.5 Javascript输入输出语法 JavaScript(是什么?) 是一种运行在客户端(浏览器)的编程语言,实现人机交互效果。 2.作用(做什么?)网…

算法-插入排序

插入排序步骤 前面文章分享了两种排序算法:冒泡排序和选择排序。虽然它们的效率都是O(N2),但其实选择排序比冒泡排序快一倍。现在来学第三种排序算法——插入排序。你会发现,顾及最坏情况以外的场景将是多么有用。 插入排序包括以下步骤。 …

从0开始搭建vue + flask 旅游景点数据分析系统(一):创建前端项目

根据前面的爬虫课程,我们重新开一个坑,就是基于爬取到的数据,搭建一个vueflask的前后端分离的数据分析系统 1 通过这个系列教程可以学习到什么? 从0开始搭建一个 vue flask 的数据分析系统;了解系统的整体架构&…

BSPTool工具

BSPTool工具 链接:https://pan.baidu.com/s/1UxMPjJtCHHkadFwnOfLqww?pwd1234 提取码:1234 1.使用方式 下载下来后,双击exe即可 2.MTK常用工具 2.1 MTK导出日志功能 2.2 导fulldump日志 2.3 .合并日志: 2.4 ADB指令集合 2.5 Fastboot指…

传统自然语言处理(NLP)与大规模语言模型(LLM)详解

自然语言处理(NLP)和大规模语言模型(LLM)是理解和生成人类语言的两种主要方法。本文将介绍传统NLP和LLM的介绍、运行步骤以及它们之间的比较,帮助新手了解这两个领域的基础知识。 传统自然语言处理(NLP&…

指针!!C语言(第三篇)

目录 一. 二维数组传参的本质 二. 函数指针变量和函数指针数组 三. typedef关键字 四. 转移表 五. 回调函数以及qsort使用举例 一. 二维数组传参的本质 🍟首先我们先回顾一下二维数组是怎样传参的?我们需要传入数组名以及行数和列数,这…