大数据开发-表数据波动、码值分布波动监控
经历一番推理演算,每个字段逐字分析,接着https://blog.csdn.net/hu_lichao/article/details/110358607 前面的理论,本篇对前面的监控做了更进一步的设计产出,看完绝对不会浪费您的时间。
设计摘要:
任务执行、监控和报警从设计上是可以完全分开的,分开可以让任务执行尽可能只做任务执行的事情,监控可以根据多种监控规则来进行数据统计,数据分布,而报警则专注于如何根据监控的结果进行自定义灵活地报警。其中在设计上可以以监控为主体,任务执行和报警可以依据需求来定制,从而更好满足各方需求。 监控规则的设计,暂时从以下几个方面入手,数据分区的生成、数据分区的数据量、数据分区的数据量波动、表数据字段的码值分布波动。监控的主要职责是跑数,跑出报警需要的数据,而报警,可以根据监控的输出数据以及监控配置进行生成done文件或者undone 和 报警。
done目录和原表目录类似 表/版本/分区或日期/done/a.done or b.done or c.done (根据配置的根目录 + 表路径的后半部分来生成)
1.表数据监控
监控什么?要达到什么目的?
监控主要有两个目的,一个是报警,另外一个是拦截,拦截为了发生问题时不继续往下走,所以一般配置有拦截必有报警,有报警不一定有拦截,比如延时报警。
1.1 输入什么
一个调度平台的调度时间,以天为单位,最后体现在跑批日志的分区字段上,可以支持回溯,其他监控需要的配置信息都在表数据监控的主表里面,一些特别的配置信息,会用到附属表,比如分布子表。
1.2 计算模型
1.2.1分区有没有生成 show partitions | grep xx
1.2.2分区数量大于某个阈值,默认0:select count(*) from db_table where {db_table_date_column} = f($input_date) and version=20201205
1.2.3 分区数量波动:(分区数量的count - 前几天的count平均值) / 前几天的count平均值
1.2.4 数据码值分布波动监控
如何衡量数据分布波动
假设某指标码值和数据分布如下:
2020-12-05 | 2020-12-06 | 2020-12-07 |
---|---|---|
a 10% | a 9% | a 1% |
b 50% | b 51% | b 90% |
c 40% | c 40% | c 9% |
可以看到在12.07日,波动较大,需要做预警,问如何衡量这个波动,以及设置预警
把a,b,c看成一个向量,求比如最近一周(不包括当天)的向量平均值
$$ a1,b1,c1 $$
,然后计算当前向量
$$ a0,b0,b1 - a1,b1,c1 / (a1,b1,c1) = a3,b3,c3 $$
数据分布波动计算模型
key 当天向量
$$ a=(x,y,z...) $$
$$ b=(x1,y1,z1....) $$
那么波动向量
$$ c=(a-b)/a $$
,最终结果
$$ c=(x2,y2,z2...) $$
2.报警设计
报警任务的每次启动可以依赖当天分区数据监控的日志跑批分区,即至少有跑批日志,才开始进行报警任务。报警的输入是监控主表和监控跑批表,输出done,undone && 报警,于报警日志中。
3. 整体设计
使用平台例行任务来调度监控任务,使用mysql开发环境来读配置,使用gp来存储结果数据,使用平台同步功能将同结构的hive结果表同步到gp来做报表展示,整个过程支持回溯。
表数据监控配置表:
-- 总表 create table table_monitor_conf ( db_table string, table_charge_people string comment '表负责人', done_path string comment 'done 文件输出位置前缀', where_condition string comment 'where 子句内容 eg:version=20201201 and dt=#YYYYMMdd#', if_done string comment '总开关:是否生成done文件' if_check_partition string comment '规则1:是否监控产出分区', if_check_partition_count string comment '规则2:是否监控产出分区数据量', if_check_partition_count_fluctuates string comment '规则3:是否监控产出分区数据量波动', if_check_distribute string comment '规则4:是否监控产出表数据分布波动' ) -- 分布子表if_check_distribute 为1时候使用 create table table_monitor_distribute_conf ( db_table string comment '表名', with_code_value_keys string comment '有码值的keys:k1,k2,k3', no_code_value_keys string comment '无码值的keys:k1,k2,k3' )
其中当table_monitor_conf 的 db_table = 'default.default' 时候表示是所有配置记录的默认值。
表数据量监控跑批记录:
create table table_monitor_records ( run_db_table string comment '跑批表,来源table_monitor_conf 的db_table', check_date_time string comment '任务实际跑批时间-程序生成', run_check_partition string comment '规则1产出:根据where_condition 是否产出分区' run_check_partition_count bigint comment '规则2产出:根据where_condition 跑出来的表数量', run_check_partition_count_fluctuates string comment '规则3产出:表数据量相对一周前平均值的数据波动', run_check_distribute_json comment '规则4产出:数据分布的大json', run_check_distribute_fluctuates comment '规则4产出:数据分布的大json相对一周平均值的波动大json' ) partition by (dt string comment '数据跑批分区,平台传入') comment '监控跑批记录表'
报警配置表
create table table_monitor_notify_conf( db_table string comment '库表', notify_enable string comment '是否开启此报警', normal_produce_datetime string comment '表数据正常产生时间', check_count_threshold bigint comment '监控产出分区数据量的阈值', check_count_fluctuates_threshold double comment '监控产出分区数据量波动的阈值' , check_distribute__json_threshold double comment '表数据分布阈值' )
报警日志表
create table table_monitor_notify_records( db_table string comment '哪个表有问题', view_url string comment '页面展示地址', table_charge_people string comment '表负责人', trouble_description string comment '有什么问题', check_date_time string comment '报警时间-程序生成', ) patition by (dt string comment '数据跑批分区,平台传入')
写出数据,done 文件 ,undone文件 每个表,每个分区只有一个
数据分布,在分布波动的第一次跑数据时候,就会写一份
总共有几个任务:监控任务,报警任务各1个,每天1点->晚上8点,10分钟一次
其他:
hi_email_message_phone string comment '报警方式,保留字段' zhiban_people string comment '值班负责人,保留字段',
TODO:
-
[ ] 增加值班人,报警方式升级、
-
[ ] 根据依赖来报警
-
[ ] 通过群内机器人,来操作报警日志表,达到报警暂停一段时间的作用 大数据开发,更多关注查看个人资料

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
面试官:我问的是Java内存模型,你回答堆栈方法区干嘛?
听说微信搜索《Java鱼仔》会变更强哦! 本文收录于JavaStarter,里面有我完整的Java系列文章,学习或面试都可以看看哦 (一)概述 很多人会把Java内存区域(运行时数据区)和Java内存模型(JMM)搞混,这两者是完全不一样的东西。 Java内存区域是指JVM运行时数据分区域存储,而Java内存模型是定义了线程和主内存之间的抽象关系,了解Java内存模型是学好Java并发编程的基础。 (二)Java内存模型 Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。我们来看一张图: 每个线程拥有一个自己的私有工作内存,需要变量时从主内存中拷贝一份到工作内存,如果更新过变量之后再将共享变量刷新到主内存。 但是两个线程之间,是没有办法读取对方工作内存中的变量值的。看一个例子: public class Test { private static boolean flag=false; public static void main(String[] args) throws Int...
- 下一篇
教程:如何在DeFi应用中集成Curve协议
Curve.Fi是一组规模庞大的DEFi协议,这个教程的目的是帮助你关注智能合约开发的现代方法,以及如何在自己的Defi应用中集成Curve.Fi这种大型协议的关键点。 用熟悉的语言学习 以太坊合约与DApp开发 :Java | Php | Python | .Net / C# | Golang |Node.JS | Flutter / Dart 1、Curve.Fi开发教程的组织方式 是的,我已经说过我们将深入研究代码。尽管我们不是在谈论AMM模型的数学运算,也不是在Curve.Fi合约中使用的其他一些特定技巧,但是我们仍然需要了解一些内容。当然,这不是在谈论成功的DeFi开发-我没有给出提示。这是我经验的一部分,在这里我将分享一些有关Curve智能合约的基本架构以及我们如何与这些架构集成的知识。实际上,下图中包含了本教程的全部内容: 我们研究的是Y-Pool,它以一种简单明了的方式组织。存款(Deposit)合约将你的资金打包成Y-Token,然后将其发送到兑换(Swap)合约,兑换合约为用户生成LP代币。如果你要提取流通性份额以及所赚取的收益,则合约会执行相同的操作,但是方式相反...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8