数仓作业延时告警-基于关键路径预推
简介
作业延时告警,通常来说有两种方式:
其一,当作业到目标时间点还没完成触发告警;这类情况,对于目标作业而言,延时已经触发了,风险相对较大;有的是监控接口延时(raw层),这里可能会出现接口延时,但是对于下游目标作业并没有延时影响;
其二,当前置作业完成已经晚于最晚时效,目标作业预触发告警;因为是前置预警,所以有一定的时间提前做好风险处理;
这里主要介绍第二种预警的思路,构思源自项目管理中的关键路径;
关键路径相关请访问:百度百科:关键路径);
前提假定条件:数仓为周期调度作业分配了足够的资源,作业计算pending等待时间极短;
这里澄清下量化的期望:量化的目的是为了减少不确定性,而不是消除不确定;只要减少不确定带来的收益大于投入就是好的;对于不确定的地方也欢迎大家提出意见&优化方案;
量化相关或可阅读:《数据化决策》;作者:道格拉斯·W. 哈伯德(美国)
应用环境:离线数仓,yarn调度+hive亦或sparksql引擎计算
作业示例图

在数仓中,可能会存在这几类情况:
- 同一个作业出现在多个依赖路径中,比如上截图的A作业;
- 作业与作业之间有设置不依赖,这类依赖关系在计算中应做剔除;
- 不同周期作业依赖,这类情况在特定时间节点做特殊处理;比如日频率作业依赖月频率作业,一般的调度依赖机制,t月周期日频作业依赖t-1月周期任务,即7月日频作业等月频6月周期跑完开始执行;
考虑到数仓作业跑批时长具有一定的波动性,可能存在作业异常,作业跑批时长取近n周期中位数(中位数对异常兼容较好);邻近相对更能代表当前集群情况,邻近取的周期数不应过多;这里按日频:近7日;月频:近3月;周频:近3周;小时:近24小时;
月频不太好把控,取周期数少可能命中特殊情况不具有代表性,取的周期过多,过早时间集群和作业配置可能会有变更,中位数不能代表最近情况;
数据准备
这里主要依赖如下几块数据:
1.集群作业跑批时长数据,用来估算每个作业跑批时长(这里取中位数,防异常),大概样式如下:

一般完成时间指的是基于当前集群概况,作业一般能在这个时间完成;
2.调度作业的依赖关系,大概样式如下:

计算流程
对于集群每一个非根节点(目标)作业结合作业依赖与跑批时长数据写一个递归程序计算上游作业节点最晚完成时效要求;

比如计算G作业前置作业依赖,G作业一般(这里取中位)在16点跑批完,作业跑批时长在2个小时,
那么G作业最晚需在14:00开始跑批
G作业依赖于E、B、A三个作业,根据E、B、A三个作业的运行时长可得出,E最晚需在13点跑批,B最晚需在13:00跑批,A最晚需在13:00跑批;
B作业依赖于A,所以为保障G作业在16:00完成,A作业最晚需在12:00点开始;
这里作业A处在两条依赖路线,兼容取最长路线(关键路径),在计算体现为在递归计算上游依赖最晚开始时间时,如一个作业重复出现,新计算的开始时间若早于之前的开始时间,则取最早的开始时间;
最后得出,作业G如需16:00完成,前置依赖最晚开始时间要求为:
A:12:00
B:13:00
E:13:00
延时预估取最大延时差,如果A在14:00完成(延时1个小时),E在16:00点完成(延时2个小时),那么目标G作业最终为18:00点完成,延时2个小时;前置依赖延时最大时间;(这里需要拉取已经跑批记录,取最大延时时长)
同理,计算作业D的前置依赖最晚开始时间,作业D跑批2小时,需在12:00完成,那么作业D需在10:00开始,前置依赖A需在9:00开始跑批;
同时满足作业D和作业G的目标时效,作业A在两个作业中都有依赖,则取最早时效,最晚开始时间为9:00;
脚本逻辑对每一个目标时效作业上游依赖时效计算写一个递归逻辑即可,逐层查找计算上游依赖时效要求,直到没有上游结束(查到根节点);如果链路重复遇到一个作业,最晚开始时间取最早的时间,该重复出现作业不再重复计算上游作业时效要求;
数据输出
数据输出每一个作业以及其前置依赖最晚开始时效要求,如上依赖截图输出为:

目标时效设置
以上计算先给出的是作业一般完成时效,是基于当前集群概况作业大多数能完成的时间,即当前可行的时效;考虑到跑批时效不稳定,实际设定目标可以稍往后延长些许时间,比如1个小时;
这里可以结合目标作业完成时间波动来看,比如覆盖85%以上作业完成时间,再结合业务情况在这个基础上酌情往后延长时间;比如85%的作业实例在下午16:00点完成,这里可以设置到16:30这样;具体可由业务和技术共同商定;
有的业务时效要求不敏感的,比如一般目标作业下午14:00完成,业务方期望17:00完成就行,那么期望时效也可以适当往后延延,比如到16:00,同时预留时间去排查问题;(优先排查处理那些紧迫的需要)
如果对时效敏感,目标作业时效要求高,则可以优化关键路径上的作业,缩短作业跑批时长,作业优化相关可参考早前写的:sparksql优化以及hive和sparksql优化方向
这里需要注意的是,作业依赖链路中的关键路径并不是一成不变的,可能会随着作业优化时效变短而发生变更;
在设定期望时效后,相应的前置依赖时效根据计算得出时间差相应调整即可;比如期望G作业17:00完成,则前置作业A最晚在13:00开始执行即可;(完成时间跟A作业最晚开始时间相差4个小时)
告警方式
这块可提单平台开发一个接口(一般公司规模起来都会有),邮箱或者短信推送,监控脚本可根据实际需要一小时扫描一次作业运行情况或者其他时间间隔;一旦触发告警,脚本通过该接口将信息推送出来;
相关文章:
数仓作业延时告警-基于关键路径预推
简介 作业延时告警,通常来说有两种方式: 其一,当作业到目标时间点还没完成触发告警;这类情况,对于目标作业而言,延时已经触发了,风险相对较大;有的是监控接口延时(raw层…...
秋招复习笔记——八股文部分:网络TCP
TCP 三次握手和四次挥手 TCP 基本认识 序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号…...
麒麟桌面操作系统上配置Samba
原文链接:麒麟桌面操作系统上配置Samba Hello,大家好啊!今天给大家带来一篇关于在麒麟桌面操作系统上配置Samba的文章。Samba是一种免费的软件,实现了SMB/CIFS网络协议,使得Linux和Windows系统之间可以共享文件和打印机…...
【Go】探索 Go 语言的内建函数 copy
山水间歌声回荡 回荡思念的滚烫 去年的家书两行 读来又热了眼眶 云水边静沐暖阳 烟波里久违的故乡 别来无恙 你在心上 🎵 张靓颖/张杰《燕归巢》 在 Go 语言中,copy 是一个用于在切片之间复制元素的内建函数。它提供了一种简单而高…...
【React】JSX:从基础语法到高级用法的深入解析
文章目录 一、什么是 JSX?1. 基础语法2. 嵌入表达式3. 使用属性4. JSX 是表达式 二、JSX 的注意事项1. 必须包含在单个父元素内2. JSX 中的注释3. 避免注入攻击 三、JSX 的高级用法1. 条件渲染2. 列表渲染3. 内联样式4. 函数作为子组件 四、最佳实践 在 React 开发中…...
JMeter 使用
1.JMeter 是什么? JMeter 是一款广泛使用的开源性能测试工具,由 Apache 软件基金会维护。它主要用于测试 Web 应用程序的负载能力和性能,但也支持其他类型的测试,如数据库、FTP、JMS、LDAP、SOAP web services 等。 2.特点&#x…...
20240724----安装git和配置git的环境变量/如何用命令git项目到本地idea
备注参考博客: 1)可以参考博客,用git把项目git到本地 2)可以参考博客vcs没有git 3)git版本更新,覆盖安装 (一)安装git (1)官网下载的链接 https://git-scm.com/downlo…...
JavaScript实战 - 用Canvas画一个心形
作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有疑问或建议,请私信或评论留言! 前言: 如…...
vim gcc
vim 使用 vs filename 分屏 ctrl ww 切窗口 shift zz 快速提出vim vim配置 vim启动时自动读取当前用户的家目录的.vimrc文件 vim配置只影响本用户 其他用户观看同一文件不受影响 gcc指令 & c文件编译过程 动态库 静态库 & 链接方式 有相应库才能进行…...
Symfony 表单构建器:创建和管理表单的最佳实践
Symfony 表单构建器:创建和管理表单的最佳实践 Symfony 是一个流行的 PHP 框架,以其强大的功能和灵活性闻名。表单构建器是 Symfony 中一个非常重要的组件,它提供了简单且高效的方式来创建和管理表单。本文将详细介绍 Symfony 表单构建器的最…...
Intel电脑CPU的选择
酷睿 i5/i7/i9 系列至强 Xeon 系列应用场景家用消费级电脑企业服务器工作站PCIe通道数 16X 最多识别到2张显卡,且每张降速为8X 64X 最多支持8张显卡同时使用 内存信道2通道8通道内存容量最大128GB最大6TB工作时长不建议长期不间断连续使用专为365*24不断电使用而设…...
MySQL字段设置的varchar长度小于数据长度自动截取丢弃超出的长度而不是报错?
MySQL字段设置的varchar长度小于数据长度自动截取丢弃超出的长度而不是报错? 事情是这样的,我们一个订单表存放了商品的快照信息其中快照信息存储的是json格式商品信息,当查看订单是报错了,发现我们后端服务查询到订单的快照信息…...
Linux|多线程(三)
线程池 线程池是一种多线程处理形式,处理过程中它将被提交的任务分配给预先创建好的多个线程中的一个去执行。 线程池的实现 #pragma once #include <pthread.h> #include <vector> #include <string> #include <unistd.h> #include <…...
智能合约中如何返回mapping
在 Solidity 中,直接返回一个 mapping 的所有数据是不可能的,因为 mapping 本身不支持直接遍历。但是,可以使用一些技巧来实现这一目标,例如通过维护一个额外的数组来跟踪 mapping 中的键,并通过这个数组来返回所有的键…...
nginx的学习(二):负载均衡和动静分离
简介 nginx的负载均衡和动静分离的简单使用 负载均衡配置 外部访问linux的ip地址:80/edu/a.html地址,会轮询访问Tomcat8080和Tomcat8081服务。 Tomcat的准备 准备两个Tomcat,具体准备步骤在nginx的学习一的反向代理例子2中,在Tomcat8080…...
普中51单片机:DS1302时钟芯片讲解与应用(十)
文章目录 引言基本特性什么是RAM?什么是涓流充电? 电路图和引脚说明通信协议以及工作流程寄存器控制寄存器日历/时钟寄存器 DS1302读写时序代码演示——数码管显示时分秒 引言 DS1302 是一款广泛使用的实时时钟 (RTC) 芯片,具有低功耗、内置…...
Preact:轻量级替代React的选择
Preact是一个轻量级的JavaScript库,它提供了与React相似的API,但体积更小,性能更优。Preact的核心理念是尽可能地保持与React的兼容性,同时去除不必要的部分,使其成为一个理想的替代品,尤其是在对性能和包大…...
全栈嵌入式C++、STM32、Modbus、FreeRTOS和MQTT协议:工业物联网(IIoT)可视化系统设计思路(附部分代码解析)
项目概述 随着工业4.0时代的到来,工业物联网(IIoT)在提高生产效率、降低运营成本和实现智能制造方面得到了广泛应用。本项目旨在开发一个全面的工业物联网监控系统,能够实时监测设备的温度、压力、振动和电流等参数,并…...
Greenplum数据库中的数据倾斜问题及处理方法
一、数据倾斜问题的原因 数据分布不均匀:当数据在表的分区或分片中不均匀分布时,会导致某些分区或分片的数据量较大,从而引发数据倾斜问题。连接键存在热点数据:如果连接操作中使用的键值存在热点数据,即某些键值出现…...
缓存设计理论
缓存设计理论是一个涉及多个方面的复杂主题,主要目标是优化数据访问速度,减少数据访问延迟,提高系统性能,并同时保持数据的一致性和系统的稳定性。以下是从几个关键方面对缓存设计理论的概述: 一、缓存的作用与目的 …...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
