1.简介
大数据开发-表数据波动、码值分布波动监控 && 报警,是关于理论和设计部分,初步计算已经写完,管理平台部分,后续完善,本文主要针对模块设计部分,整体模块实现上是离线数据源的异步模块,分为指标跑批模块,监控报警模块,平台管理模块,指标跑批模块和监控报警模块主要是基于离线数据的表的通讯,即不是耦合的架构,分别是两个例行的任务,看下面的图,
2.说明
其中表设计了五张表,分别是指标跑批记录表,报警跑批记录表,和mysql表监控配置表,报警配置表,分布字段配置表,指标跑批和监控跑批不直接任务依赖,而是通过指标跑批记录表,直接产生报警跑批记录
3.代码实现
整个项目目录结构如下图:
resource: 配置文件
common: 一些公共的模块,Builder是发送消息构建器,Father是Spark项目的公共代码
rules: 下面有5个指标的规则,分别是检查分区是否存储,检查分区数量是否大于某个值,检查分区数量波动,检查分布,检查分布大向量波动
utils: 里面放的是一些工具,比如日期处理工具类,表格式处理工具,sql处理工具等
Monitor: 指标跑批的主类
SunRobot: 报警跑批的主类入库
4.Monitor类说明
rule的一些实现,不细说了,根据源代码很好看懂,而Monitor是怎么根据这些规则,生成对应的流水,主要实现代码如下:
package com.hoult
import com.beust.jcommander.JCommander
import com.hoult.common.Father
import com.hoult.rules.{Rule1, Rule2, Rule3, Rule4, Rule5, TableMonitorConf, TableMonitorRecord}
import com.hoult.utils.{DateTool, PropertiesUtils}
import org.apache.spark.sql.Dataset
import scala.collection.mutable.ListBuffer
object Monitor extends Father {
val mysqlProps = PropertiesUtils.getMysqlProps()
var broadTableConfs: Dataset[TableMonitorConf] = null
def main(args: Array[String]): Unit = {
val info: ObserverArgs = new ObserverArgs
println("入参:: " + args.mkString(","))
JCommander.newBuilder().addObject(info).build().parse(args.toArray: _*)
//广播配置表
prepare()
//生成表 * 规则 个 dataframe
import spark.implicits._
val tableConfArray: Array[TableMonitorConf] = spark.sql("select * from table_monitor_conf where db_table_name !='default.default'").as[TableMonitorConf].collect()
val defaultTableConf = spark.sql("select * from table_monitor_conf where db_table_name ='default.default'").as[TableMonitorConf].collect().take(1)(0)
var ll: ListBuffer[Dataset[TableMonitorRecord]] = ListBuffer[Dataset[TableMonitorRecord]]() //所有规则一起跑
//默认值填充
val tConfs = tableConfArray.map( conf => {
TableMonitorConf(
if(conf.db_table_key == null) defaultTableConf.db_table_key else conf.db_table_key,
conf.db_table_name,
if (conf.table_charge_people == null) defaultTableConf.table_charge_people else conf.table_charge_people,
if (conf.done_path == null) defaultTableConf.done_path else conf.done_path,
if (conf.where_condition == null) defaultTableConf.where_condition else conf.where_condition,
if (conf.if_done == null) defaultTableConf.if_done else conf.if_done,
if (conf.if_check_partition == null) defaultTableConf.if_check_partition else conf.if_check_partition,
if (conf.if_check_partition_count == null) defaul