百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

基于DAG的分布式任务调度平台-Maat

ccwgpt 2024-10-12 02:50 75 浏览 0 评论

背景

什么是Maat

  • Maat是一个基于开源项目Airflow的流程调度系统,它支持用户自定义地组装流程节点,流程可以在用户指定的时间触发(支持crontab格式),或由用户手动触发。
  • Maat的所有节点分布式地运行在Hippo上,由Drogo调度。用户可以创建自己的调度节点和执行节点,达到资源隔离的目的。
  • 用户可以通过配置的方式安装自己执行节点的运行环境,也可以配置执行节点的副本数。
  • 下图展示了一个任务的一次调度流程:

为什么要做Maat

我们在项目的开发过程中,经常遇到一些流程化调度的需求,如上线发布流程、分析任务流程等。对于这些流程化的调度任务,我们尝试过自己开发了一套流程调度系统,也尝试过接入集团的工作流,但难免会遇到一些问题:

  • 业务代码和调度代码耦合严重,修改流程基本需要入侵到代码级别
  • 对于定时触发的任务流程,没有一个统一管控的系统
  • 多分支的复杂流程不能很好支持
  • 缺少可视化的UI,不能很好追踪流程进度

技术选型

定时任务&流程任务的调度是一个通用的需求,集团内的产品如D2、工作流,开源的产品如airflow、Quartz等。

D2

D2是基于ODPS生态的一套流程调度系统,承载集团基于ODPS数据产出的任务调度系统。支持用户自定义编写脚本,支持定时任务触发和手动触发(补运行的方式),适合基于数据状态的任务流程调度(如根据数据的产出执行任务流),由D2团队专门维护,有较好的UI。

但它有一些不足:

  • D2的DAG调度是一张大图,每天需要运行的每个节点及拓扑关系是根据前一天的全局的拓扑关系计算得出的,所以你新创建/修改的任务理论上只能第二天生效,如果想立即生效需要采用补运行的方式。业务上经常会有任务的变动(如任务配置或调度时间),或手动触发一个调度的场景(如随时的上线流程、全量流程),使用D2对业务不是很灵活,也不符合D2的使用场景。
  • 不支持流程上下文的传递,业务上对上下文的传递比较强烈,经常有上个节点产出某个值,下个节点需要使用。
  • 缺乏对搜索生态的支持。搜索技术部整个底层架构有自己的一套生态,如调度(Hippo,Drago)、报警(Kmon)。使用D2,不能充分享受搜索技术生态带来的好处,对于之后的单元化部署也会带来问题。

工作流

集团工作流是集团审批流程的一个通用调度引擎,很多产品的审批流程都是基于集团工作流的,同时它也可以作为一个简易的任务调度流程使用,我们在Maat之前也使用集团工作流作为我们流程任务的调度引擎。它支持手动触发,支持以HSF的方式调用外部系统,支持上下文传递。但它在配置上较为复杂,且支持外部系统的调用方式有限。

Quartz

Quartz是Java开源的任务调度框架。它支持分布式调度、支持任务持久化、支持定时任务,但不支持流程调度,且任务配置需要耦合在调度系统中,任务的热加载需要做一些改造。

Airflow

开源项目Airflow是一套分布式的流程调度系统,它的优势如下:

  • 业务代码和调度系统解耦,每个业务的流程代码以独立的Python脚本描述,里面定义了流程化的节点来执行业务逻辑,支持任务的热加载
  • 完全支持crontab定时任务格式,可以通过crontab格式指定任务何时进行
  • 支持复杂的分支条件,每个节点单独设定触发时机,如父节点全部成功时执行、任意父节点成功时执行
  • 有一套完整的UI,可视化展现所有任务的状态及历史信息
  • 外部依赖较少,搭建容易,仅依赖DB和rabbitmq
  • 有同学问到Luigi与Airflow的对比,个人感觉都是基于pipline的一个任务调度系统,功能也大同小异,Airflow更强大一下,找到一篇同类产品的对比

经过一段时间的调研,我们选用Airflow作为我们的原型开发一套分布式任务调度系统,它的功能全面,基本满足业务需求,在功能上扩展相对方便,外部依赖较少,和搜索生态对接相对容易。

原生Airflow的问题

airflow可以解决流程调度中面临的许多问题,但直接将原生的airflow用于生产,仍面临一些问题:

  • 原生airflow虽然支持分布式,但由于依赖本地状态,不能直接部署在drogo上
  • 缺乏合适的监控手段,需要结合kmon完善监控和报警设施
  • 缺乏用户友好的编辑手段,用户需要了解airflow的原理和细节
  • 大量任务运行时,调度的性能急剧下降
  • 分布式模式下,原生airflow存在一些bug

Maat架构

maat架构:

业务层

任何流程式调度及定时触发的需求均可以通过maat创建应用,maat提供了可视化编辑页面及丰富的api,用户可以方便地创建编辑流程模板,设置复杂的分支逻辑,maat会在调度时按照运行时的状态决定流程的流转路径。

目前接入maat的应用场景包括Tisplus、Hawkeye、Kmon、容量平台、离线组件平台

管控层

由于原生Airflow的管控比较简单,是基于描述任务流程dag的Python脚本调度,用户要进行任务的创建、更新、运行需要深入学习airflow原理才能上手,并且之后维护只能基于文件操作,非常不便。因此maat在外层封装一层管控系统Maat Console,降低运维及用户学习的成本。

下图是Maat管控系统Aflow的操作界面

模板管理

在任务流程调度的场景中,常见的情况是:不同任务执行的流程基本一致,只有个别参数不同。因此Maat提出了基于模板管理的任务流程,用户在模板管理中定义一个流程的运行模板,对于其中未确定的部分用变量表示。当生成具体任务时,由具体变量和模板渲染出具体的任务。当模板修改时,可以将模板生效到所有依赖该模板的任务。

模板管理预设了集中任务节点,用户可以自由选择不同的任务节点组装模板流程。

应用管理

管理所有具体的流程调度任务,包括任务使用的模板、变量的值、报警信息、任务触发crontab等,用户在通过模板创建应用后,后续可以通过应用管理继续维护任务的运行。

队列管理

由于Maat上运行的任务所属应用各不相同,不同应用运行环境也不相同,另外不同应用也希望达到集群隔离的目的。为了实现这个功能Maat提供了队列的管理,指定队列的任务节点会被调度到相应队列的机器上,相应队列的机器也只会运行指定队列的任务节点。

另外,队列上也可以指定并发数,表示当前队列上最多同时有多少个任务运行,确保机器上同时运行的任务不会太多导致负载过高,超出并发的任务会被挂起直到资源释放。

核心模块

Maat核心模块完成了任务调度的整个流程。核心模块的每个节点都独立运行在机器上,启动上互相不依赖,所有消息通信通过DB(数据库)和MQ(消息队列)完成。

Web Api Service

Web Api Service提供了丰富的与外部交互的Api,包括任务增删改、历史任务状态、任务状态修改、任务的触发、任务的重试等接口。

另外原生airflow提供的web展示功能也是由该角色完成。

Scheduler

scheduler是maat关键角色,它决定了所有开启运行的流程何时可以触发一次运行,也决定一次任务运行中,哪些节点可以被执行。被判定执行的节点会被scheduler通过mq发送给worker执行。

随着任务的增多,单一的scheduler负载过高导致调度周期增长,为了减轻scheduler的压力,maat将scheduler按照队列拆分。不同队列的任务有独立的scheduler负责调度,将任务分发给对应队列的worker执行。

目前每个队列仅有一个scheduler负责调度,之后会改造为每个队列多scheduler的实现方式。

Worker

worker为具体执行任务的角色,worker会接受scheduler发出的任务,在worker上执行节点中描述的具体任务。worker角色有多个,任务会在任意一个对等的worker上机器,当worker资源不足时,可以动态扩容。

由于不同队列任务所需的基础环境不同,如Python、Java、Hadoop、zk等,不同队列的worker角色启动参数有配置上的差异,不同队列的worker启动时会按照配置中描述的资源完成部署安装。

worker上任务完成后会回写db,scheduler察觉到当前任务状态变化后会继续任务的调度。

Distributers

任务分发层负责将scheduler需要调度的任务发送到指定的Worker上。

MQ:原生Airflow使用MQ完成scheduler到worker的消息传递,底层由celery+Rabbitmq实现。scheduler将需要运行的任务发送到MQ中,发送到MQ中包含任务对应的队列信息。worker从MQ获取消息时,仅获取相应队列任务,拉取到对应worker上执行。MQ在maat中以rabbitmq实现,MQ和其他角色一样,也是独立部署的。

FaaS:FaaS(Function as a Service)是基于搜索生态实现的ServerLess框架,Maat将其作为执行器。Maat的所有任务都抽象成function,任务执行时则调用相应的function,完成后返回任务状态。目前已完成与FaaS的初步对接,期望未来能基于FaaS做更多优化,如:多样化的任务执行方式,可以将轻量级的任务函数化,将重量级的任务服务化;任务资源动态调整,甚至某些任务可以执行时分配资源,完成后即释放。

基础组件

  • DB:使用集团IDB,负责maat信息的持久化,包括任务信息、任务运行历史、任务运行状态、节点运行历史、节点运行状态等。
  • OSS:由于上drogo导致机器迁移的风险,所有日志不能存放在本地,因此所有节点运行日志存放在oss上,需要查看日志上从oss上获取。
  • Kmon:完成监控集群运行状态及任务失败的报警功能。
  • Drogo:完成Maat所有节点的docker容器化部署。

Maat平台的优势

可视化编辑及通用的节点类型

Maat提供了一个管控平台Aflow,用户可以方便地编辑流程节点,管理所有的模板和任务,详细见上文的[管控层]。

除此之外,Maat还提供了丰富的通用节点类型。原生airflow支持许多不同种类的节点类型,这些节点可以执行不同类型的任务。在与用户的接触中,maat针对用户的使用习惯与需求,对一些节点进行封装,同时开发了几种新的节点类型,可以满足大部分用户的需求。如在使用中现有节点无法满足使用,请联系maat开发同学。

  • Bash节点:直接在worker上执行简单的bash操作,由于bash通常需要依赖其他资源,实际使用较少,参照“带资源的Bash节点”;
  • Http节点:该节点支持http调用,调度时发送http请求触发其他系统,同时该节点提供一个轮询的http接口,触发成功后轮询其他系统是否成功,成功时才继续运行;
  • 带资源的Bash节点:与普通Bash节点不同的是,该节点附带一些资源(如jar包、bash脚本、Python脚本等),节点运行时会先将资源下载到本地,然后执行bash脚本;
  • 分支节点:该节点根据之前节点的运行结果或初始传入的参数决定分之后的节点走哪个分支。

Drogo化部署

maat服务有多种角色,每种角色都需要不同的运行环境,为了维护这些运行环境,对运维同学来说绝对是个噩梦,这种情况下上hippo成为maat运维最好的选择。drogo作为基于二层调度服务的管控平台,为Maat各个节点部署在hippo上成为可能。具体来说,Drogo化的优势如下:

  • 低成本增加新节点。上Drogo前,有新增节点的需求时,每次都需要准备运行资源,重新写部署脚本,而每个节点的脚本都要运维同学自己维护。上Drogo后,所有这些部署信息保存在Drogo平台上,有新的的节点也只需要将之前类似的部署信息复制,稍加修改即可。
  • 扩容简单。上Drogo前,某类任务水位太高,为这类任务扩容,每次都需要准备机器、准备环境、调试运行参数,可能需要半天到一天的时间。上Drogo后,调整副本数,Drogo会自动扩容。
  • 有效防止机器迁移带来的服务中断。上Drogo前,机器出现问题后,只能另找机器扩容,对于某些只能单点运行的节点,只能烧香祈祷机器不挂了。上Drogo后,机器迁移后,会Drogo会自动分配一台机器将服务拉起,对于可中断的服务,单节点部署也不用担心机器挂了导致服务消失了。

下图展示了目前Drogo上部署的Maat各个角色

由于原生airflow的一些节点是有状态的,需要依赖本地一些文件,机器迁移会导致这些节点的状态丢失,我们对maat做了一些修改,保证机器迁移不会丢失运行状态:

  • 之前的调度依赖本地Python dag文件,机器迁移导致本地文件丢失。我们做了修改,所有dag保存在db,依赖db中保存的信息调度,保证机器迁移后,dag信息也不会丢失。
  • 由于基于本地文件,web service和scheduler读写的都是同一份dag文件,导致原生airflow的scheduler和web service角色必须绑定运行。以db中信息调度后,web service和scheduler可以单独部署。
  • 由于原来日志文件保存在本地,机器迁移会导致日志文件丢失。我们改造后,将日志文件保存在oss远端,每次读取日志从远端读取。

分集群管理

由于不同任务隔离的需求,maat基于airflow原生的队列管理扩展不同任务的集群管理功能,不同类型的任务可以创建自己的scheduler和worker,创建应用时可以使用指定的scheduler调度或运行在指定worker上(如果不指定由默认scheduler和worker调度)。

集群的配置参数包括以下信息:

  • worker部署配置:该worker依赖的资源,drogo启动时会将任务运行需要的资源部署到worker机器上,机器迁移时也会使用这份部署配置重新分配资源
  • worker个数:控制worker角色的个数
  • 集群并发数:控制集群中正在运行的并发数,防止任务运行过多导致下游系统压力过大
  • scheduler:目前每个集群只有一个scheduler,后续会改造成支持多个scheduler调度节点

监控&报警

平台监控报警

为了掌握平台的运行状况,maat在各个节点的关键步骤向kmon汇报metric信息,metric异常状态下会发送报警给开发同学。也可以根据这些metric信息判断当前集群的负载状况,对任务负载较高的节点进行优化。

任务报警

对于具体任务,maat支持在每个任务节点运行异常的情况下发送报警,如节点运行异常、任务未按时运行、任务运行超时等。用户可以在管控平台设置报警条件及报警接收人。

平台现状

Maat平台初始仅服务于服务于业务平台内部,发展到现在已对多个团队的多个产品提供服务:

  • [Tisplus]():调度Tisplus的上线流程及其他需要定时触发的任务;
  • [Hawkeye]():定时调度Hawkeye的分析任务
  • [Kmon]():支持kmon的监控托管服务及
  • [搜索容量预估平台Torch]():支持容量预估流程的管控
  • [搜索离线平台Bahamut]():支持离线组件平台发布流程、全量流程
  • Opensearch:一些算法场景的离线任务
  • Tpp:推荐场景的流程调度任务

Maat线上集群任务执行现状(2018.4.27数据)

日均调度任务: 1500+个

日均运行任务: 38K+次

日均运行节点: 42K+个

随着更多应用场景的接入,平台能力将会接受进一步的考验。

未来展望

随着业务的接入和数据规模的增大,Maat平台也需要进一步提升用户体验,提升平台稳定性。

  • 与Aflow进一步结合,在管控平台上一站式完成集群的创建、配置、部署
  • 提供更加丰富的报警选项,进一步加强错误的反馈机制
  • 随着任务数量的增多,一些调度上的缺陷逐渐体现出来,对于这些缺陷做进一步优化
  • 加强权限方面的控制,保证生产环境安全

最后

不例外地感谢在Maat平台发展中给与我们支持的各位同学。

本文作者:斯兰

相关推荐

团队管理“布阵术”:3招让你的团队战斗力爆表!

为何古代军队能够以一当十?为何现代企业有的团队高效似“特种部队”,有的却松散若“游击队”?**答案正隐匿于“布阵术”之中!**今时今日,让我们从古代兵法里萃取3个核心要义,助您塑造一支战斗力爆棚的...

知情人士回应字节大模型团队架构调整

【知情人士回应字节大模型团队架构调整】财联社2月21日电,针对原谷歌DeepMind副总裁吴永辉加入字节跳动后引发的团队调整问题,知情人士回应称:吴永辉博士主要负责AI基础研究探索工作,偏基础研究;A...

豆包大模型团队开源RLHF框架,训练吞吐量最高提升20倍

强化学习(RL)对大模型复杂推理能力提升有关键作用,但其复杂的计算流程对训练和部署也带来了巨大挑战。近日,字节跳动豆包大模型团队与香港大学联合提出HybridFlow。这是一个灵活高效的RL/RL...

创业团队如何设计股权架构及分配(创业团队如何设计股权架构及分配方案)

创业团队的股权架构设计,决定了公司在随后发展中呈现出的股权布局。如果最初的股权架构就存在先天不足,公司就很难顺利、稳定地成长起来。因此,创业之初,对股权设计应慎之又慎,避免留下巨大隐患和风险。两个人如...

消息称吴永辉入职后引发字节大模型团队架构大调整

2月21日,有消息称前谷歌大佬吴永辉加入字节跳动,并担任大模型团队Seed基础研究负责人后,引发了字节跳动大模型团队架构大调整。多名原本向朱文佳汇报的算法和技术负责人开始转向吴永辉汇报。简单来说,就是...

31页组织效能提升模型,经营管理团队搭建框架与权责定位

分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!31页组织效能提升模型如何拿到分享的源文件:请您关注本头条号,然后私信本头条号“文米”2个字,按照操作流程,专人负责发送源文件给您。...

异形柱结构(异形柱结构技术规程)

下列关于混凝土异形柱结构设计的说法,其中何项正确?(A)混凝土异形柱框架结构可用于所有非抗震和抗震设防地区的一般居住建筑。(B)抗震设防烈度为6度时,对标准设防类(丙类)采用异形柱结构的建筑可不进行地...

职场干货:金字塔原理(金字塔原理实战篇)

金字塔原理的适用范围:金字塔原理适用于所有需要构建清晰逻辑框架的文章。第一篇:表达的逻辑。如何利用金字塔原理构建基本的金字塔结构受众(包括读者、听众、观众或学员)最容易理解的顺序:先了解主要的、抽象的...

底部剪力法(底部剪力法的基本原理)

某四层钢筋混凝土框架结构,计算简图如图1所示。抗震设防类别为丙类,抗震设防烈度为8度(0.2g),Ⅱ类场地,设计地震分组为第一组,第一自振周期T1=0.55s。一至四层的楼层侧向刚度依次为:K1=1...

结构等效重力荷载代表值(等效重力荷载系数)

某五层钢筋混凝土框架结构办公楼,房屋高度25.45m。抗震设防烈度8度,设防类别丙类,设计基本地震加速度0.2g,设计地震分组第二组,场地类别为Ⅱ类,混凝土强度等级C30。该结构平面和竖向均规则。假定...

体系结构已成昭告后世善莫大焉(体系构架是什么意思)

实践先行也理论已初步完成框架结构留余后人后世子孙俗话说前人栽树后人乘凉在夏商周大明大清民国共和前人栽树下吾之辈已完成结构体系又俗话说青出于蓝而胜于蓝各个时期任务不同吾辈探索框架结构体系经历有限肯定发展...

框架柱抗震构造要求(框架柱抗震设计)

某现浇钢筋混凝土框架-剪力墙结构高层办公楼,抗震设防烈度为8度(0.2g),场地类别为Ⅱ类,抗震等级:框架二级,剪力墙一级,混凝土强度等级:框架柱及剪力墙C50,框架梁及楼板C35,纵向钢筋及箍筋均采...

梁的刚度、挠度控制(钢梁挠度过大会引起什么原因)

某办公楼为现浇钢筋混凝土框架结构,r0=1.0,混凝土强度等级C35,纵向钢筋采用HRB400,箍筋采用HPB300。其二层(中间楼层)的局部平面图和次梁L-1的计算简图如图1~3(Z)所示,其中,K...

死要面子!有钱做大玻璃窗,却没有钱做“柱和梁”,不怕房塌吗?

活久见,有钱做2层落地大玻璃窗,却没有钱做“柱子和圈梁”,这样的农村自建房,安全吗?最近刷到个魔幻施工现场,如下图,这栋5开间的农村自建房,居然做了2个全景落地窗仔细观察,这2个落地窗还是飘窗,为了追...

不是承重墙,物业也不让拆?话说装修就一定要拆墙才行么

最近发现好多朋友装修时总想拆墙“爆改”空间,别以为只要避开承重墙就能随便砸!我家楼上邻居去年装修,拆了阳台矮墙想扩客厅,结果物业直接上门叫停。后来才知道,这种配重墙拆了会让阳台承重失衡,整栋楼都可能变...

取消回复欢迎 发表评论: