DolphinScheduler——奇富科技的调度实践

news2024/11/16 15:37:47

目录

一、技术架构

二、业务挑战

2.1 调度任务量大

2.2 运维复杂

2.3 SLA要求高

三、调度优化实践

3.1 重复调度

3.2 漏调度

3.3 Worker服务卡死

3.4 任务重复运行

四、服务监控

4.1 方法耗时监控

4.2 任务调度链路监控

五、用户收益


原文大佬的这篇调度系统案例有借鉴意义,这里直接摘抄下来用作学习和知识沉淀。

一、技术架构

  在我们公司的大数据离线任务调度架构中,调度平台处于中间层,通过数据集成平台、数据开发平台将工作流提交给调度平台。

二、业务挑战

2.1 调度任务量大

    目前每天调度的工作流实例在3万多,任务实例在14万多。每天调度的任务量非常庞大,要保障这么多任务实例稳定、无延迟运行,是一个非常大的挑战。

2.2 运维复杂

    因为每天调度的任务实例非常多,经历了几次调度机器扩容阶段,目前2个调度集群有6台Master、34台Worker机器。

2.3 SLA要求高

    由于业务的金融属性,如果调度服务稳定性出问题,导致任务重复调度、漏调度或者异常,损失影响会非常大。

三、调度优化实践

   我们在过去一年,对于调度服务稳定,我们做了如下2个方向的优化。第一,调度服务稳定性优化。第二、调度服务监控。

3.1 重复调度

     用户大规模迁移工作流时,遇到了工作流重复调度问题。现象是同一个工作流会在同一个集群同一时间,生成2个工作流实例。经过排查,基于从A项目迁移到B项目的需求,在工作流上线时,用户通过提交工单,修改了调度数据库中工作流的项目ID,进行迁移。这么做会导致该工作流所对应的quartz(分布式调度器)元数据产生2条数据,进而导致该工作流重复调度。如图3所示,JOB_NAME为’job_1270’的记录,有2条数据,而JOB_GROUP不一样。查询源码job_name对应工作流的定时器ID,JOB_GROUP对应项目ID。因此修改工作流对应的项目ID,会导致quartz数据重复和重复调度。正确迁移工作流项目的方式是,先下线工作流,然后再修改项目ID。

SELECT count(1)FROM     (SELECT TRIGGER_NAME,        count(1) AS num    FROM QRTZ_TRIGGERS    GROUP BY  TRIGGER_NAME    HAVING num > 1 )t

3.2 漏调度

      凌晨2点调度太集中,有些工作流发生漏调度。因此优化了quartz参数,将org.quartz.jobStore.misfireThreshold从60000调整为600000。

如何监控和避免此问题,监控sql摘要如下:

select TRIGGER_NAME,NEXT_FIRE_TIME ,PREV_FIRE_TIME,NEXT_FIRE_TIME-PREV_FIRE_TIME  from QRTZ_TRIGGERS  where  NEXT_FIRE_TIME-PREV_FIRE_TIME=86400000*2

   sql逻辑是:根据quartz(分布式调度器)的元数据表QRTZ_TRIGGERS的上一次调度时间PREV_FIRE_TIME和下一次调度时间NEXT_FIRE_TIME的差值进行监控。如果差值为24小时就正常,如果差值为48小时,就说明出现了漏调度。

   如果已经发生了漏调度如何紧急处理? 我们实现了漏调度补数逻辑通过自定义工作流进行http接口调用。如果监控到发生了漏调度情况,可以立即运行此工作流,就能把漏调度的工作流立即调度运行起来。

3.3 Worker服务卡死

    这个现象是凌晨调度Worker所在机器内存占用飙升至90%多,服务卡死。

     思考产生该问题的原因是,调度worker判断本机剩余内存时,有漏洞。假设设置了worker服务剩余内存为25G时,才不进行任务调度。但是,当worker本机剩余内存为26G时,服务判断本机剩余内存未达到限制条件,那么开始从zk队列中抓取任务,每次抓取10个。而每个spark的driver占用2G内存,那么本地抓取的10个任务在未来的内存占用为20G。我们可以简单计算得出本机剩余内存为26G-20G为6G,也就是说抓取了10个任务,未来的剩余内存可能为6G,会面临严重不足。

    为了解决这个问题,我们参考Yarn,提出了”预申请”机制。预申请的机制是,判断本机剩余内存时,会减去抓取任务的内存,而不是简单判断本机剩余内存。 

    如何获取将要抓取任务的内存大小呢? 有2种方式,第一种是在创建工作流时指定本任务driver占用的内存,第二种是给一个固定平均值。

   综合考虑,采用了第二种方式,因为这种方式对于用户来说,是没有感知的。我们对要抓取的每个任务配置1.5G(经验值)内存,以及达到1.5G内存所需要的时间为180秒,抓取任务后,会放入缓存中,缓存过期时间为180(经验值)秒。剩余内存计算公式,本机剩余内存 =  【本机真实物理剩余内存】—【缓存中任务个数*1.5G】

     还是同样的场景,本机配置的剩余内存为25G,本机实际剩余内存为26G,要抓取的任务为10个。每个任务未来占用的driver内存为1.5G。简单计算一下,本机剩余内存=26G-10*1.5G。在“预申请”机制下,本机剩余内存为1G,小于25G,不会抓取,也就不会导致Worker机器的内存占用过高。那么会不会导致Worker服务内存使用率过低呢,比如shell、python、DataX等占用内存低的任务。结论是不会,因为我们有180秒过期机制,过期后,计算得到的本机剩余内存为变高。

   实施上文的内存预申请机制后,最近半年没有遇到由于内存占用过高导致worker服务卡死的问题。以下是我们加上内存预申请机制后,worker内存使用率情况,可以看见worker最大内存使用率始终稳定保持在80%以下。

3.4 任务重复运行

  在worker服务卡死时,我们发现yarn上的任务没有被杀死,而master容错时导致任务被重复提交到yarn上,最终导致用户的数据异常。

   我们分析后发现,任务实例有一个app_link字段,该字段存放用户提交的yarn任务的app id,而第一次调度的任务的app id为空。排查代码发现worker在运行任务时,只有完成的yarn 任务,才会更新app_link字段。这样导致master在容错时,拿不到app id,导致旧任务没有被杀死,最终导致任务重复提交。

   我们进行的第一个改进点为,在worker运行yarn任务时,从log中实时过滤出app id,然后每隔5秒将app id更新到app_link字段中。 这样yarn任务在运行时,也就能获取到app id,master容错时就能杀死旧任务。

   第二个改进点为,在worker服务卡死从而自杀时,杀死本机上正在运行的调度服务,这样可能master就不需要进行容错了。 实施改进点后,最近半年没有遇到重复调度的yarn任务了。

四、服务监控

    一个稳定的系统,除了代码上的优化,一定离不开完善的监控。DolphinScheduler 对外提供了 Prometheus 格式的基础指标,我们新增了一些高优指标,并集成到公司内部的监控系统。通过监控大盘来查看调度系统的健康状况,并针对不同级别的prometheus指标和阈值,配置电话 / 钉钉报警。

4.1 方法耗时监控

    我们通过byte-buddy、micrometer等,实现了自定义轻量级java agent框架。这个框架实现的目标是监控java方法的最大耗时、平均耗时、qps、服务的jvm健康状况等。并把这些监控指标通过http暴露出来,通过prometheus抓取,再通过grafana进行可视化展示,并针对不同级别的prometheus指标和阈值,配置电话 / 钉钉报警。

    例如以下是master访问zk和quartz的最大耗时,平均耗时,qps等。

以下是master服务的jvm监控指标

   通过该java agent,我们实现了api、master、worekr、zookeeper等服务方法耗时监控,提前发现问题并解决,避免将问题扩大到用户感知的状况。

4.2 任务调度链路监控

    为了保障调度任务的稳定性,有必要对任务调度的生命周期进行监控。DolphinScheduler服务调度任务的全流程是先从quartz(分布式调度器)中产生Command(待调度指令),然后将Command转化为工作流实例,再从工作流实例生成一系列对应的任务实例,需要对该任务链路的生命周期进行监控。

  • 监控quartz元数据

     前面已经讲了我们通过监控quartz元数据,发现漏调度和重复调度问题。

  • 监控command表积压情况

      通过监控command表积压情况,从而监控master是否服务正常,以及master服务的性能是否能够满足需求。

  • 监控任务实例

     通过监控任务实例等待提交时间,从而监控worker服务是否正常,以及worker服务的性能是否能够满足需求。

   综上,通过上述的全生命周期监控,可以提前感知到worker服务的性能问题,并及时解决。

五、用户收益

     通过对DolphinScheduler代码的优化,获得的最大收益是近半年没有因为调度服务故障导致用户的SLA受影响,当调度系统出现问题时,能及时感知并解决。

参考文章:

Apache DolphinScheduler 在奇富科技的首个调度异地部署实践

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

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

相关文章

图像分割 - 查找图像的轮廓(cv2.findContours函数)

1、前言 轮廓,是指图像中或者物体的外边缘线条。在简单的几何图形中,图形的轮廓是由平滑的线条构成,容易被识别。但不规则的图形或者生活中常见的物体轮廓复杂,识别起来比较困难 2、findContours函数 这里先介绍函数的参数,具体的含义会在下面实验中阐述 opencv 提供的轮…

(正规api接口代发布权限)短视频账号矩阵系统实现开发--技术全自动化saas营销链路生态

短视频账号矩阵系统实现开发--技术全自动化saas营销链路生态源头开发(本篇禁止抄袭复刻) 一、短视频矩阵系统开发者架构 云罗短视频矩阵系统saas化系统,开发层将在CAP原则基础上使用分布式架构,对此网站的整体架构采用了基于B/S三层架构模式…

计算机网络——21拥塞控制原理

拥塞控制原理 概述 拥塞 非正式的定义:“太多的数据需要网络传输,超过了网络的处理能力”与流量控制不同拥塞的表现 分组丢失(路由器缓冲区溢出)分组经历比较长时间的延迟(在路由器的队列中排队) 网络中…

第六十七天 APP攻防-Frida反证书抓包移动安全系统资产提取评估扫描

第67天 APP攻防-Frida反证书抓包&移动安全系统&资产提取&评估扫描 知识点: 1、资产提权-AppinfoScanner 2、评估框架-MobSF&mobexler 3、抓包利器-Frida&rOcapture 章节点: 1、信息收集-应用&资产提取&权限等 2、漏洞发现…

Win32汇编ListView控件学习

此控件比较复杂;和基础win32控件不同;需要先初始化Windows公共控件库, invoke InitCommonControls 之后才可使用; lvdemo.asm, .386.model flat, stdcalloption casemap :none ; case sensitiveinclude window…

锐捷网络携数据中心、以太全光等创新解决方案亮相2024MWC

在西班牙巴塞罗那举行的2024年世界移动通信大会(MWC)上,锐捷网络(下文简称“锐捷”)展示了将技术与应用充分融合的云数据中心、5G、光网络等产品及解决方案,帮助更多行业组织建设更贴近业务、智能、简单、高效、绿色低碳的网络基础设施,应对当下及未来的挑战,共同连接更广阔可能…

Apache JMeter 5.6.3 安装

源码下载 curl -O https://dlcdn.apache.org//jmeter/source/apache-jmeter-5.6.3_src.zipJMeter 下载 curl -O https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.zipjmeter.properties 里 设置中文 windows系统上解压,双击jmeter.bat 启动 执行参…

市场热点袭来,直接加仓可靠吗?九方智投洪帮主助投资者明确几大要点

消费电子近期再度走强,多企业均出现涨停。消费电子出现乐观局面,有投资者认为是因为目前市场需求旺盛,产业链正在积极拉货,持续加单,各类手机新机也在积极备货,消费电子库存低。面对市场情绪高涨&#xff0…

Spark的reduceByKey方法使用

一、需求 在ODPS上我们有如下数据: idcategory_idattr_idattr_nameattr_value205348100000462最优粘度["0W-40"]205348100000461基础油类型["全合成"]205348100000463级别["BMW Longlife 01"] 我们希望得到的结果如下:…

【任职资格】某通信行业建设人才管理系统管理项目纪实

【客户背景】 J公司成立于2007年10月,致力于成为最优秀的软件服务和信息系统整合提供商,逐步发展成为净资产过3亿、近1000名员工的股份制企业,在北京、上海、广州等各主要城市设有分公司或办事处。发展到目前,公司已经是国家规划…

MySQL 大战 PostgreSQL 第二回:呆瓜模式的分歧

去年写的全方位对比 Postgres 和 MySQL 引发了社区里不少的讨论。今天再聊一个 MySQL 和 Postgres 之间小小的不同,呆瓜模式的实现。 MySQL 的呆瓜模式 MySQL 命令行工具提供了一个选项 --safe-updates 或者 --i-am-a-dummy,默认是 false。开启之后如果…

NCDA设计大赛获奖作品剖析:UI设计如何脱颖而出?

第十二届大赛简介 - 未来设计师全国高校数字艺术设计大赛(NCDA)开始啦!视觉传达设计命题之一: ui 设计,你想知道的都在这里。为了让大家更好的参加这次比赛,本文特别为大家整理了以往NCDA大赛 UI 设计的优秀获奖作品&a…

手把手教测试,全网内容最全有深度-jmeter-调试取样器

5.1.7.3.调试取样器 该取样器主要用于调试脚本信息,添加后可以通过此取样器查看Jmeter保存的信息。 Jmeter属性:如果选择True,则会展示Jmeter.properties文件中所有设置的属性,如果选择false就不会展示。 Jmeter变量:如果选择True,则会展示Jmeter当前运行脚本中的所有变…

k8s 存储卷详解与动静部署详解

目录 一、Volume 卷 1.1 卷类型 emptyDir : hostPath: persistentVolumeClaim (PVC): configMap 和 secret: 二、 emptyDir存储卷 2.1 特点 2.2 用途: 2.3 示例 三、 hostPath存储卷 3.1 特点 3.2 用途 …

Petr and Book

题目链接:Problem - 139A - Codeforces 解题思路: 题目大概意思是这个人每星期每天会读若干叶书或者不读,但是每周最少都会读一页,算出读完这本书的那一天是周几 可以将七天读的页数存在一个数组里,遍历数组&#xf…

JavaScript 进阶04

深浅拷贝 浅拷贝 首先浅拷贝和深拷贝只针对引用类型 浅拷贝:拷贝的是地址 常见方法: 拷贝对象:Object.assgin() / 展开运算符 {…obj} 拷贝对象拷贝数组:Array.prototype.concat() 或者 […arr]适合单层对象,如果…

AI短视频矩阵运营软件|抖音视频矩阵控制工具

【罐头鱼AI传单功能介绍】 罐头鱼AI传单是一款专为短视频矩阵运营而设计的智能软件,旨在帮助用户高效管理和运营多个抖音账号,并提供一系列强大的功能来优化视频内容创作和发布流程。QQ:290615413以下是软件框架,详细介绍其功能和特点&#…

qt QRadioButton 及QButtonGroup 使用

QRadioButton 放在组合框QGroupBox中,再点击时,即使有多个QRadioButton按钮,同时选中的也就只有一个。 如下图所示, 对于多个QRadioButton,每个按钮都写一个槽函数是不太明智的选择,需要将QRadioButton放在…

类加载的基本流程

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:JavaEE 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 类加载 1. 加载2. 验证3. 准备4. 解析5. 初…

el-select 中嵌套时间选择器 el-time-picker 并且实现时间多选功能

el-select 中嵌套时间选择器 el-time-picker 并且实现时间多选功能 需求是&#xff1a;时间可多选 element中时间的选择不支持多选 下面进行封装拼接时间多选 <el-form ref"ruleFormRef" :model"ruleForm" :rules"rules" label-width"…