转载自程序员小陶
Apache DolphinScheduler 在使用过程中,肯定会有任务出现失败的情况,那么问题来了:调度任务的告警是需要人为配置的,在生产环境中,面对海量的任务,如何找到重要的任务,并且在失败的时候,第一时间告警呢?
先思考一下。
先看思路
本文提供一个思路,接着往下看吧。
不卖关子了。
本质是路径查找,本文这里使用了图数据库,或者你也可以自己使用Java实现路径查找。
下面是需要实现的目标,看一组任务的关系,如下图所示,存在 A/B/C/D/E 五个任务,E 任务被配置为核心任务,当 B 任务报错时,检测到 B 和 E 之前存在路径,则需要电话告警。
所以在配置核心链路告警的时候,我们只需要配置叶子节点,在实际生产中,一般是应用层的任务,比如报表、标签、接口数据等任务。
清洗依赖数据
核心逻辑就是把所有工作流内部、跨工作流以及跨项目的依赖全部清洗出来,生成一张关系表。具体清洗逻辑,可以看: 海豚调度监控:新增依赖缺失巡检,上游改动再也不用担心了!
最终生成了t_ds_task_node_base_data
任务基础表,后续会用于 Nebula Graph,这个后面会讲。
t_ds_dag_task_relation_data_df
关系最终表,后续会用于 Nebula Graph,这个后面会讲。
t_ds_dag_task_relation_data_df
这个表结构如下:
关系导入图数据库
这里用的国产图数据库 Nebula Graph,当然你也可以自己使用 Java 实现路径查找。
为什么我们一定要引入图数据库呢?有下面几方面考虑:
- 可以减轻调度系统Mysql的压力,把负责的路径计算放在图数据库里面。
- 探索更多调度任务数据治理和运维的可能性,比如任务权重,影响分析等。
用到的组件是 Nebula Graph,最关键的函数是 find path 查询最短链路
① 用到的语法是:FIND SHORTEST PATH
需要注意的是,注意查询步长,UPTO <N> {STEP|STEPS}:
路径的最大跳数。默认值为5。
② 3.3.0 开始,子图支持了边的条件限制了,查询的时候只拿最新的一批关系。
- 创建图空间
- 创建边和点
- 导入数据
同步边:
定时脚本: 使用 Nebula Graph 社区提供的 exchange 工具把数据从 mysql 导入 Nebula Graph。
Java 服务
核心代码,在第 17 行:
返回值说明:
① 影响核心任务,需要打电话
{“data”:{“res”:1},“code”:0,“msg”:“success”}
② 不影响核心任务,不需要打电话
{“data”:{“res”:0},“code”:0,“msg”:“success”}
③ 任务不存在,忽略
{“data”:{“res”:“任务不存在!”},“code”:0,“msg”:“success”}
④ code 不等于 0 ,接口异常,忽略。
封装好接口之后,任务失败的程序调这个接口,判断失败任务是否影响核心任务,如果影响就打电话。
钉钉告警样式:
电话告警,直接给对应负责人打电话。
至此,我们减少了很多任务告警的配置工作,只需要关注核心的叶子节点是什么,也就是核心的应用任务是什么,大大提高了任务告警的配置效率!!!
- 注意:清洗数据 和 导入图数据库,在每天的 23:30 分进行,一天初始化一次,确保凌晨的任务关系是最新的,主要是用于凌晨告警。
以上就使用图关系网络解决核心链路告警的全部内容,如果有任何疑问,都可以与我交流,希望可以帮到你,下次见。
原文链接: https://blog.csdn.net/qq_31975963/article/details/139839102
本文由 白鲸开源 提供发布支持!