杭州思科对 Apache DolphinScheduler Alert 模块的改造

杭州思科已经将 Apache DolphinScheduler 引入公司自建的大数据平台。目前,杭州思科大数据工程师 李庆旺 负责 Alert 模块的改造已基本完成,以更完善的 Alert 模块适应实际业务中对复杂告警的需求。
PROFILE

李庆旺
杭州思科 大数据工程师,主要负责 Spark、调度系统等大数据方向开发。
我们在使用原有的调度平台处理大数据任务时,在操作上多有不便。比如一个对数据进行处理聚合分析的任务,首先由多个前置 Spark 任务对不同数据源数据进行处理、分析。最后的 Spark 任务对这期间处理的结果进行再次聚合、分析,得到我们想要的最终数据。但遗憾的是当时的调度平台无法串行执行多个任务,需要估算任务处理时间来设置多个任务的开始执行时间。同时其中一个任务执行失败,需要手动停止后续任务。这种方式既不方便,也不优雅。 而 Apache DolphinScheduler 的核心功能——工作流定义可以将任务串联起来,完美契合我们的需求。于是,我们将 Apache DolphinScheduler 引入自己的大数据平台,而我主要负责 Alert 模块改造。目前我们其他同事也在推进集成 K8s,希望未来任务在 K8s 中执行。 今天分享的是 Alert 模块的改造。
01 Alert 模块的设计

DolphinScheduler Alert 模块的设计
Apache DolphinScheduler 1.0 版本的 Alert 模式使用配置alert.properties的方式,通过配置邮箱、短信等实现告警,但这样的方式已经不适用于当前的场景了。官方也进行过告警模块重构,详情设计思路参考官方文档:
https://github.com/apache/dolphinscheduler/issues/3049
https://dolphinscheduler.apache.org/zh-cn/development/backend/spi/alert.html Apache
DolphinScheduler 告警模块是一个独立启动的服务,核心之一是 AlertPluginManager 类。告警模块集成了很多插件,如钉钉、微信、飞书、邮件等,以独立的形式写在源码中,启动服务时会解析插件并将配置的参数格式化成JSON形式,前端通过JSON自动渲染出页面。AlertPluginManager 在启动时会缓存插件到内存中。AlertServer类会启动线程池,定时扫描DB。 当工作流配置了通知策略,同时Worker 执行工作流结束,执行结果匹配通知策略成功后,DB插入告警数据后,线程池扫描 DB,调用AlertSender 类的send方法传入告警数据。告警数据绑定的是告警组,一个告警组对应了多个告警实例。AlertSender类遍历告警实例,通过AlertPluginManager类获取插件实例,调用实例的发送方法,最后更新结果。这是 Apache DolphinScheduler 的整个告警流程。 需要注意的是,Alert server 启动的同时也启动了 RPC 服务,这是一种针对特殊类型任务,如 SQL 查询报表而设计的告警方式,可以让 Worker 通过 RPC 直接访问 Alert Server,利用 Alert 模块完成告警,这个数据不写入 DB。但从整体上来说,Apache DolphinScheduler 的告警模式还是以写 DB,异步交互的方式为主。

定义工作流之后,可以在启动前设置通知策略,绑定告警组。

在任务维度,可以配置超时告警,当任务超时可以触发报警。这里没有告警组配置,任务和工作流共用一个告警组,当任务超时,会推送到工作流设置的告警组。

上图为系统告警配置的流程图。可以看到,一个工作流可以配置多个任务实例,任务可以配置超时触发告警,工作流成功或者失败可以触发告警。一个告警组可以绑定多个告警实例。这样的配置不太合理,我们希望告警实例也可以匹配工作流/任务实例的状态,也就是工作流成功和失败调用同一个告警组,但是触发不同的告警实例。这样使用起来更符合真实场景。

创建告警组,一个告警组可以绑定多个告警实例。
02 大数据任务告警场景

以下是我们日常工作中的一些 常见的大数据任务告警场景。 对于定时任务,在开始执行前、任务上线、下线或修改参数,以及任务执行成功或失败时都发送通知。区别是,对于同一任务不同结果,我们希望触发不同的通知,比如成功发短信通知或者钉钉微信群通知即可,而任务失败了需要在第一时间通知对应的研发人员,以得到更快的响应,这时候钉钉微信群中@对应研发人员或者电话通知会更及时。目前,公司的任务调度平台是任务中调用API 进行通知,这种与代码强耦合的方式极其不方便,实际上可以抽象成一个更为通用的模块来实现。 Apache DolphinScheduler 的架构虽然符合实际场景需求,但问题在于告警模块页面配置只能选择成功触发通知,或失败触发通知,绑定的是同一个告警组,即无论成功还是失败,告警的途径是相同的,这一点并不满足我们在实际生产环境中需要不同结果以不同方式通知的需求。因此,我们对 Alert 模块进行了一些改造。
03 Alert 模块的改造

改造的第一步是告警实例。此前,新增一个告警实例,触发告警就会触发该实例的 send 方法,我们希望在定义告警实例时可以绑定一个告警策略,有三个选项,成功发、失败发,以及成功和失败都发。 在任务定义维度,有一个超时告警的功能,实际上对应失败的策略。

上图为改造完成的配置页面,在创建告警实例页面,我们添加了一个告警类型字段,选择是在成功、失败,或者无论成功或失败时调用插件。

上图为改造后Apache DolphinScheduler 告警模块的架构,我们对其中进行了两点改造。 其一,在执行完工作流或任务时,如果触发告警,在写入DB时,会保存本次工作流或者任务的执行结果,具体是成功还是失败。第二,调用告警实例发送方法添加了一个逻辑判断,将告警实例与任务状态进行匹配,匹配则执行该告警实例发送逻辑,不匹配则过滤。 改造后告警模块支持场景如下:

详细设计请参考 issue:https://github.com/apache/dolphinscheduler/issues/7992
代码详见:https://github.com/apache/dolphinscheduler/pull/8636
此外,我们还针对 Apache DolphinScheduler 的告警模块向社区提出几点优化的建议,感兴趣的小伙伴可以跟进 issue,一起来做后续的工作:
工作流启动或上下线或参数修改时,可以触发通知;
告警场景针对 worker 的监控,如果 worker 挂掉或和 ZK 断开失去心跳,会认为 worker 宕机,会触发告警,但会默认匹配 ID 为 1 的告警组。这样的设置是在源码中写明的,但不看源码不知道其中的逻辑,不会专门设置ID为1的告警组,无法第一时间得到worker宕机的通知;
告警模块目前支持飞书、钉钉、微信、邮件等多种插件,这些插件适用于国内用户,但国外用户可能使用不同的插件,如思科使用的 Webex Teams,国外常用告警插件 PagerDuty,我们也都进行开发并贡献给了社区。同时还有一些比较常用的比如Microsoft Teams等,感兴趣的小伙伴也可以提个PR,贡献到社区。
最后一点,可能大数据领域的小伙伴对于前端不太熟悉,想要开发并贡献告警插件,但是想到需要开发前端就不想进行下去了。开发 Apache DolphinScheduler 告警插件是不需要写前端代码的,只需要在新建告警实例插件时,在 Java 代码中配置好页面中需要输入的参数或者需要选择的按钮(源码详见org.apache.dolphinscheduler.spi.params),系统会自动格式化成 JSON 格式,前端通过form-create 可以通过 JSON 自动渲染成页面。因此,完全不用担心写前端的问题。
参与开源
随着国内开源的迅猛崛起,Apache DolphinScheduler 社区迎来蓬勃发展,为了做更好用、易用的调度,真诚欢迎热爱开源的伙伴加入到开源社区中来,为中国开源崛起献上一份自己的力量,让本土开源走向全球。

参与 DolphinScheduler 社区有非常多的参与贡献的方式,包括:

贡献第一个PR(文档、代码) 我们也希望是简单的,第一个PR用于熟悉提交的流程和社区协作以及感受社区的友好度。
社区汇总了以下适合新手的问题列表:https://github.com/apache/dolphinscheduler/issues/5689
非新手问题列表:
https://github.com/apache/dolphinscheduler/issues?q=is%3Aopen+is%3Aissue+label%3A%22volunteer+wanted%22
如何参与贡献链接:
https://dolphinscheduler.apache.org/zh-cn/docs/development/contribute.html
来吧,DolphinScheduler开源社区需要您的参与,为中国开源崛起添砖加瓦吧,哪怕只是小小的一块瓦,汇聚起来的力量也是巨大的。
参与开源可以近距离与各路高手切磋,迅速提升自己的技能,如果您想参与贡献,我们有个贡献者种子孵化群,可以添加社区小助手微信(Leonard-ds) ,手把手教会您( 贡献者不分水平高低,有问必答,关键是有一颗愿意贡献的心 )。
添加小助手微信时请说明想参与贡献。
来吧,开源社区非常期待您的参与。
社区官网
https://dolphinscheduler.apache.org/
代码仓地址https://github.com/apache/dolphinscheduler
您的 Star,是 Apache DolphinScheduler 为爱发电的动力️ ~
投稿请添加社区小助手微信
(Leonard-ds)
杭州思科对 Apache DolphinScheduler Alert 模块的改造的更多相关文章
- 日均 6000+ 实例,TB 级数据流量,Apache DolphinScheduler 如何做联通医疗大数据平台的“顶梁柱”?
作者 | 胡泽康 鄞乐炜 作者简介 胡泽康 联通(广东)产业互联网公司 大数据工程师,专注于开源大数据领域,从事大数据平台研发工作 鄞乐炜 联通(广东)产业互联网公司 大数据工程师,主要从事大数据平 ...
- Apache DolphinScheduler新一代分布式工作流任务调度平台实战-上
概述 定义 dolphinscheduler 官网地址 https://dolphinscheduler.apache.org/ dolphinscheduler GitHub地址 https://g ...
- Apache DolphinScheduler 3.0.0 正式版发布!
点亮 ️ Star · 照亮开源之路 GitHub:https://github.com/apache/dolphinscheduler 版本发布 2022/8/10 2022 年 8 ...
- 论语音社交视频直播平台与 Apache DolphinScheduler 的适配度有多高
在 Apache DolphinScheduler& Apache ShenYu(Incubating) Meetup 上,YY 直播 软件工程师 袁丙泽 为我们分享了<YY直播基于Ap ...
- Apache DolphinScheduler 2.0.1 来了,备受期待的一键升级、插件化终于实现
✎ 编 者 按:好消息!Apache DolphinScheduler 2.0.1 版本正式发布! 本版本中,DolphinScheduler 经历了一场微内核+插件化的架构改进,70% 的代码被重构 ...
- 在 Apache DolphinScheduler 上调试 LDAP 登录,亲测有效!
点击上方 蓝字关注我们 作者 | 小钻风 01 背景 当看这边文章时,那得恭喜您终于找到宝藏,这是梦开始的地方-- 使用 Apache DolphinScheduler 的小伙伴会遇到个挠脑袋的问题 ...
- 从 Airflow 到 Apache DolphinScheduler,有赞大数据开发平台的调度系统演进
点击上方 蓝字关注我们 作者 | 宋哲琦 ✎ 编 者 按 在不久前的 Apache DolphinScheduler Meetup 2021 上,有赞大数据开发平台负责人 宋哲琦 带来了平台调度系统 ...
- Apache DolphinScheduler之最美好的遇见
关于 Apache DolphinScheduler社区 Apache DolphinScheduler(incubator) 于17年在易观数科立项,19年3月开源, 19 年8月进入Apache ...
- 数据平台调度升级改造 | 从Azkaban 平滑过度到 Apache DolphinScheduler 的操作实践
Fordeal的数据平台调度系统之前是基于Azkaban进行二次开发的,但是在用户层面.技术层面都存在一些痛点问题难以被解决.比如在用户层面缺少任务可视化编辑界面.补数等必要功能,导致用户上手难体验差 ...
随机推荐
- 微服务效率工具 goctl 深度解析(上)
前言 本文根据 安前松 的视频分享整理而来,视频回放地址如下: https://www.bilibili.com/video/BV1Hr4y1x7Ne goctl 的由来 1. goctl 的诞生 g ...
- 数组——JavaSE基础
数组 数组初始化 public class ArrayDemo02 { public static void main(String[] args) { // 静态初始化 int[] a = {1, ...
- 为什么我在css里使用功能类优先
前言 我想在我们开始的学CSS语法的时候,都是从以下的流程开始的: 1.写一个CSS类选择器: .my-class { } 2.往选择器里填充CSS语法: .my-class { display fl ...
- 以字节跳动内部 Data Catalog 架构升级为例聊业务系统的性能优化
背景 字节跳动 Data Catalog 产品早期,是基于 LinkedIn Wherehows 进行二次改造,产品早期只支持 Hive 一种数据源.后续为了支持业务发展,做了很多修修补补的工作,系统 ...
- CabloyJS v4.0.0支持工作流引擎及更多 🎉
截至2020年12月21日冬至,花了近5年时间作出最小可用NodeJS开源全栈框架,这就是CabloyJS V4.0.0 5年,90个模块,30万行代码,5400次提交(Commits),开启Node ...
- python创建分类器小结
简介:分类是指利用数据的特性将其分成若干类型的过程. 监督学习分类器就是用带标记的训练数据建立一个模型,然后对未知数据进行分类. 一.简单分类器 首先,用numpy创建一些基本的数据,我们创建了8个点 ...
- Charles如何抓取https请求-移动端+PC端
Charles安装完成,默认只能抓取到http请求,如果查看https请求,会显示unkonw或其它之类的响应.所以需要先进行一些配置,才能抓取到完整的https请求信息.下面针对PC端和手机端抓包的 ...
- JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文带你厘清个中曲直,给你个选择SpringDataJPA的理由!
序言 Spring Data JPA作为Spring Data中对于关系型数据库支持的一种框架技术,属于ORM的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度. 本文档隶属于< ...
- javascript写淡入淡出效果的轮播图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SAP APO - 简介
SAP高级计划和优化(SAP APO)是SAP SCM中的关键模块之一,在供应链流程中控制供应网络计划,备件计划,TP / VS和需求计划. 它可以帮助组织在动态环境中管理其供应链流程. SAP AP ...