调度系统揭秘(上):调度系统设计思想

前言

在互联网领域中,几乎所有企业需要调度系统,主要原因是企业需要处理大量的数据,并且这些数据需要在不同的系统之间进行传输和处理。一部分是为了满足业务的需要,例如BI决策分析、图表展示、机器学习、数据挖掘;一部分是帮助这些企业协调和管理整个数据处理流程,从而提高整个系统的效率和可靠性。

故在大数据领域,调度系统是非常重要的,因为它能够管理和协调整个数据处理流程,确保任务按照正确的顺序和时间完成,从而支撑上游服务及产品的稳定性,可以说调度系统是企业产品中不可或缺的一部分。

一、调度系统发展史

在早期的大数据处理中,任务调度通常是手动进行的,需要人工监控和管理整个处理流程。这种方式非常耗时、容易出错,限制了大数据处理的规模和效率。

随着大数据技术的不断发展,人们开始意识到自动化调度的重要性,并开发了一些工具来简化调度流程。其中比较有代表性的是Apache Oozie,它是一种基于XML的工作流引擎,能够自动分配任务和资源,协调整个大数据处理流程。Oozie的出现极大地提高了大数据处理的效率和可靠性,也为后来的任务调度系统提供了重要的参考。

随着大数据技术的不断发展,任务调度系统也不断升级和完善。比较有代表性的任务调度系统包括Apache Airflow、Apache Falcon、国内的DolphinScheduler等。这些任务调度系统都具有高效、可靠、可扩展等特点,能够满足不同规模和复杂度的大数据处理需求。

此外,随着云计算的兴起,越来越多的企业开始将大数据处理任务迁移到云端,云厂商也开始提供各种大数据处理服务。例如,亚马逊的AWS Batch、谷歌的Cloud Scheduler和微软的Azure Scheduler等,这些服务通常都包含了强大的任务调度系统,能够帮助企业轻松地进行大数据处理。

据我了解国内的互联网公司一半选择开源项目、一半选择自研调度系统来支撑业务,关于为何选择自研,一方面是出于定制化考虑,一方面是出于2B企业用来提高产品竞争力从而选择自研,例如我所任职的公司便是自研调度系统用来提高商业产品的竞争力;但无论哪种方式调度系统已然成为了大数据处理的核心组件之一,为企业提供了高效、可靠和可扩展的数据处理服务。

二、调度系统常见分类

虽然市面上的调度系统有很多,但其核心的设计模式可以根据任务调度的粒度不同分为两种:

  1. DAG粒度调度
  2. 事件粒度调度

三、DAG调度

DAG粒度的调度是一种基于DAG任务依赖关系的调度方式,通常将任务组织成一个DAG工作流,通过定义工作流中任务的依赖关系,再通过广度或深度优先算法计算出任务的执行顺序,自动化地调度和执行。这种调度方式通常用于大规模数据处理流程中,例Spark的RDD任务调度,国内的DolphinScheduler便是基于这种设计思想实现。

在DAG粒度的调度中,任务的调度粒度是基于整个DAG图,即将整个DAG看作一个整体进行调度。这种调度方式可以最大程度地减少任务之间的依赖关系,提高整个系统的并行度和效率,如下图:
在这里插入图片描述

3.1、特点

在DAG调度中,任务的调度粒度通常是整个DAG图,而不是单个节点或者任务,故其血缘关系分为两种:

  1. DAG任务依赖
  2. DAG依赖

3.1.1、DAG任务依赖:

在这里插入图片描述

3.1.2、DAG依赖:

在这里插入图片描述

3.2、不足之处

首先,DAG调度系统具有更加静态的特点,DAG图中任务之间的依赖关系是固定的,所以调度粒度不够灵活;在DAG调度中,任务的调度粒度通常是整个DAG图,而不是单个节点或者任务,故以下两种场景无法支持:

  1. 任务触发DAG
  2. 任务触发DAG中的任务

3.2.1、任务触发DAG

DAG中某个任务触发另一个DAG,如下图:
在这里插入图片描述

3.2.2、任务触发DAG中的任务

DAG中某个任务触发另一个DAG中的任务并触发下游,如下图:
在这里插入图片描述

3.3、适用场景

基于DAG的调度系统适用于许多不同的场景和应用。以下是一些常见的使用场景:

  1. 数据处理:基于工作流的调度系统适用于大规模数据处理任务,例如ETL、数据仓库、数据分析等。这些任务通常需要对大量的数据进行处理,而且任务之间存在复杂的依赖关系,需要使用工作流来管理和调度任务。
  2. 机器学习:基于工作流的调度系统也适用于机器学习任务,例如深度学习、神经网络等。这些任务通常需要对大量数据进行训练和优化,而且任务之间存在复杂的依赖关系,需要使用工作流来管理和调度任务。
  3. 流程管理:基于工作流的调度系统也适用于流程管理任务,例如工作流程、业务流程等。这些任务通常需要对多个步骤进行管理和调度,而且任务之间存在复杂的依赖关系,需要使用工作流来管理和调度任务。
  4. 业务应用:基于工作流的调度系统也适用于许多业务应用场景,例如定时任务、报表生成、邮件发送等。这些任务通常需要按照一定的周期或者条件进行调度和执行,需要使用工作流来管理和调度任务。

3.4、数据库实现

DAG调度系统核心通常是6张表:

  1. DAG:DAG表
  2. DAG_RALANTION:DAG依赖关系表
  3. DAG_INSTANCE:DAG实例表
  4. TASK:任务表
  5. TASK_RELANTION:任务依赖关系表
  6. TASK_INSTANCE:任务实例表

3.5、总结

总之,DAG调度虽然具有很多优点,但也存在一些缺点。在实际应用中,需要根据具体业务需求和场景选择最合适的调度方式和算法。

四、事件调度

基于事件的调度是指以单个任务为基础进行调度,每个任务都独立执行,并且可以根据需要动态调整任务的执行顺序和优先级。这种调度模式的优点是可以灵活扩展至下游任务,根据任务的执行情况动态调整调度策略,提高任务的可扩展性。

4.1、特点

基于事件调度的调度系统灵活性更高,可以根据具体需求对任务节点进行调度和管理,实现动态调整和优化,可以解决DAG调度中不支持的两种场景,如下图各个任务之间相互依赖形成以点到面的发散状执行,可以任意扩展和添加,如下图:
在这里插入图片描述

4.2、适用场景

基于事件调度的调度系统常见于BI领域,如在BI产品中表的上下游依赖关系中,如下图:

  1. A,B,C系列总共8张表都是数仓中的物理表
  2. A表存在100条数据,A1表根据A表进行数据过滤生成A1表,A2表又根据A1表进行数据过滤生成A2表
  3. B系列以此类推
  4. C表则是根据A、B两种表Join生成,同时C1表根据C表数据过滤生成C1表。

在这里插入图片描述

按照上图需求,当A表数据发生变更后应该立即触发A1表和C表,从而保证A1、C表数据的准确性;如果我们使用DAG调度系统会出现三个DAG,如下:

在这里插入图片描述

在DAG调度系统中调度粒度是DAG,此时A表发生数据更改则只会触发DAG1,无法触发DAG3;
当然我们可以将C表加入到DAG1、DAG2中,如下图:
在这里插入图片描述

但这样设计会对其他DAG造成很强的侵入性,如果C表依赖10张表,则需要修改10张DAG;
而基于事件调度系统可以很好的支撑此场景,如下图:

在这里插入图片描述

A表执行结束后会根据下游依赖关系自动触发下游事件,依次执行保证了数据的实时性和准确性;

4.3、不足之处

  1. 处理复杂依赖关系时的效率问题:当任务之间存在复杂的依赖关系时,基于事件的调度系统可能会导致执行效率降低。
  2. 可重现性差:由于任务之间的执行顺序和优先级是动态调整的,因此在两次执行同一个作业时可能会得到不同的结果。
  3. 资源管理困难:由于每个任务都是独立的,需要单独调度和执行,可能会占用大量的计算资源,从而影响其他作业的正常执行。

4.4、数据库实现

基于事件调度系统的核心一般是三张表:

  1. TASK:任务表
  2. TASK_RELATION:任务依赖关系表
  3. TASK_INSTANCE:任务实例表

4.5、总结

基于事件调度虽然具有一些优点,但也存在一些不足之处,在选择调度系统时需要根据自己的业务需求和技术栈进行选择和权衡,以实现最优化的数据处理流程。

五、各自优劣

DAG调度系统的优劣

优势

  1. 明确的任务依赖关系:DAG调度系统通过将任务组织成有向无环图,使任务之间的依赖关系更加直观和明确。
  2. 可重现的执行结果:由于任务按照固定顺序执行,DAG调度系统能够保证执行结果的一致性和可重现性。
  3. 可控的作业调度:DAG调度系统能够更好地管理作业调度,提高作业的可控性和稳定性。

劣势

  1. 缺乏灵活性:DAG图中任务之间的依赖关系是固定的,执行过程中无法进行动态调整。
  2. 静态的特点:DAG调度系统不太适合处理动态变化和复杂的依赖关系。
  3. 限制可扩展性:当需要增加新任务时,可能需要重新设计整个DAG图,从而影响整个作业的执行效率。

基于事件调度系统的优劣

优势

  1. 灵活的任务调度:在基于事件的调度系统中,每个任务都是独立的,可以根据需要动态调整任务的执行顺序和优先级。
  2. 动态特性:基于事件的调度系统更适合处理动态变化和复杂的依赖关系,能够灵活地处理新任务和依赖关系。
  3. 较为简单:基于事件的调度系统较为直接和简单,不需要复杂的图算法计算。

劣势

  1. 处理复杂依赖关系时的效率问题:当任务之间存在复杂依赖关系时,基于事件的调度系统可能导致执行效率降低。
  2. 可重现性差:由于任务的执行顺序和优先级是动态调整的,两次执行同一个作业时可能会得到不同的结果。
  3. 资源管理困难:每个任务都是独立的,需要单独调度和执行,可能占用大量计算资源,影响其他作业的正常执行。

综述

DAG调度系统和基于事件的调度系统各有优缺点。在实际应用中,需要根据作业的特点和需求综合考虑,选择合适的调度系统。如果作业具有固定的任务依赖关系,并且需要精确控制和管理,则DAG调度系统可能是更好的选择;如果作业具有动态变化和复杂的任务依赖关系,并且需要更加灵活的调度方式,则基于事件的调度系统可能更为合适。

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

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

相关文章

排序题目:第三大的数

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 解法三思路和算法代码复杂度分析 题目 标题和出处 标题:第三大的数 出处:414. 第三大的数 难度 2 级 题目描述 要求 …

从几个角度分析chatgpt、chatglm、通义千问之间的实际使用差距

第一个问题 chatglm作为经济实力最弱的一家无法实现平峰的使用体验,在很多时候会出现因为网络问题、集群计算上限问题导致的客户体验较差,无法快速返回用户所期待的内容。 在日常生活中因为本人是一名程序员,在方案、代码纠错、自然语言转代码…

P3842 [TJOI2007] 线段

[TJOI2007] 线段 题目描述 在一个 n n n \times n nn 的平面上,在每一行中有一条线段,第 i i i 行的线段的左端点是 ( i , L i ) (i, L_{i}) (i,Li​),右端点是 ( i , R i ) (i, R_{i}) (i,Ri​)。 你从 ( 1 , 1 ) (1,1) (1,1) 点出发…

前端项目打包部署

打包 vue-cli脚手架的前端项目,点击npm脚本中的第二条编译命令,即可将项目编译,生成一个dist的文件夹,里面存放的就是编译好的前端项目文件,没有脚手架就在终端敲击npm run build命令编译前端项目 部署 Nginx 介绍:…

IsotonicRegression、LinearRegression、RandomForestRegressor与FMRegressor

IsotonicRegression 核心原理: 保序回归(Isotonic Regression)是一种非参数回归方法,适用于处理有序数据。它试图在保持数据顺序的同时,拟合出一个单调非减或非增的函数。 数学表达式: 保序回归的目标是找…

Python使用总结之Python-docx操作Word文件(添加、编辑和删除文档内容,在文档中插入图片)

Python使用总结之Python-docx操作Word文件(添加、编辑和删除文档内容,在文档中插入图片) python-docx 是一个用于创建和修改 Microsoft Word (.docx) 文件的Python库。本文将详细介绍如何使用 python-docx 创建、编辑、删除Word文件,以及如何添加、编辑和…

linux配置用户

一,安装sudo与确保在管理员用户下 apt update apt install sudo -y 切换用户:密码不会显示,一个个输入然后回车。//图中是zfxt-->Stable用户切换 su root //root为用户名 以其他用户执行命令: su root ping baidu.com //su…

如何在pandas创建一个seris结构?

创建一个Series结构在pandas库中是非常简单的。Series是一个一维的、大小可变的、可以存储任何数据类型的数组,并且有一个与之关联的标签序列(索引)。 以下是如何创建一个Series的基本步骤: 导入pandas库: 首先&#…

人工智能--制造业和农业

欢迎来到 Papicatch的博客 文章目录 🍉人工智能在制造业中的应用 🍈 应用场景及便利 🍍生产线自动化 🍍质量控制 🍍预测性维护 🍍供应链优化 🍈 技术实现及核心 🍍机器学习和…

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】感知器

感知器是一种非常早期的线性分类模型,作为一种简单的神经网络模型被提出。感知器是一种模拟生物神经元行为的机器,有与生物神经元相对应的部件,如权重(突触)、偏置(阈值)及激活函数(…

Vue3.0:前端开发的新纪元,核心特性全览

随着 Vue 3.0 的发布,它带来了许多令人兴奋的新特性,这些特性不仅提升了框架的性能,还简化了开发流程。在这篇文章中,我们将一起探讨 Vue 3.0 的一些关键新特性,并通过一些直观小例子来说明它们是如何工作的。 1. 响应…

C# —— 异常捕获

通过对异常进行补捕获 可以避免掉代码运行错误时 程序直接卡死 基本语法 try : 试 try { // 希望进行异常捕获的代码 // 放到try中 // 如果try中的代码报错 程序也不会卡死 } catch : 捕获 catch { // try中代码出错 会执行 catch中的代码块 来捕…

CobaltStrike权限传递MSF

一、测试环境 操作系统: 1.VMware17 2.kali 6.1.0-kali5-amd64 3.Win10x64 软件: 1.cs4.0 2.metasploit v6.3.4-dev 二、测试思路 1.cs是一款渗透测试工具,但没有漏洞利用的模块,我们可以在拿到目标主机的权限后,将…

高速直线导轨驱动与控制,精准稳定的运动核心元件

直线导轨在工业生产中,精度和稳定性是至关重要的。而在各种机械设备中,高精度直线导轨是提高设备运动控制精度和平稳性的核心部件,当我们考虑高速运动时,直线导轨的精度和稳定性是非常重要的因素。 直线导轨系统中如何确保高速运动…

DeepSeek-V2-Chat多卡推理(不考虑性能)

TOC 本文演示了如何使用accelerate推理DeepSeek-V2-Chat(裁剪以后的模型,仅演示如何将权值拆到多卡) 代码 import torch from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig from accelerate import init_empty_weights import sys from acce…

Mysql的null值处理

开源项目SDK:https://github.com/mingyang66/spring-parent 个人文档:https://mingyang66.github.io/raccoon-docs/#/ 在Mysql中,null用于标识缺失的或未知的数据,处理null值需要特别小心,因为在数据库中塔可能会导致不…

怎么更快捷的修改图片大小?压缩图片jpg、png、gif的快捷方法

jpg作为最常用的一种图片格式,在遇到图片太大问题时,该如何操作能够快速在压缩图片jpg的大小呢?图片太大无法上传时目前常见的一个使用问题,只有将图片处理到合适的大小才可以正常在平台上传使用,一般情况下想要快速解…

LLM大模型开发的一般流程

何谓大模型开发? 将开发以大语言模型为功能核心、通过大语言模型的强大理解能力和生成能力、结合特殊的数据或业务逻辑来提供独特功能的应用称为大模型开发。 主要功能点: 调用工具prompt engineering数据工程业务逻辑拆分 一般开发流程:…

API安全性的重要性及实施策略

在当今日益互联的世界中,API(应用程序编程接口)成为连接不同软件系统的关键桥梁。随着API的使用越来越广泛,其安全性问题也日益凸显。一个不安全的API可能会使企业数据和用户信息面临严重的风险。因此,确保API的安全性…

Perl语言入门学习

引言 Perl是一种功能强大的编程语言,广泛用于文本处理、系统管理和Web开发。它以其灵活性和强大的正则表达式处理能力著称。本篇博客将介绍Perl的基础知识,并通过多个例子帮助初学者快速上手。 1. 安装Perl 在开始学习Perl之前,您需要确保…