經歷一番推理演算,每一個字段逐字分析,接着https://blog.csdn.net/hu_lichao/article/details/110358607 前面的理論,本篇對前面的監控作了更進一步的設計產出,看完絕對不會浪費您的時間。mysql
設計摘要:sql
任務執行、監控和報警從設計上是能夠徹底分開的,分開可讓任務執行儘量只作任務執行的事情,監控能夠根據多種監控規則來進行數據統計,數據分佈,而報警則專一於如何根據監控的結果進行自定義靈活地報警。其中在設計上能夠以監控爲主體,任務執行和報警能夠依據需求來定製,從而更好知足各方需求。 監控規則的設計,暫時從如下幾個方面入手,數據分區的生成、數據分區的數據量、數據分區的數據量波動、表數據字段的碼值分佈波動。監控的主要職責是跑數,跑出報警須要的數據,而報警,能夠根據監控的輸出數據以及監控配置進行生成done文件或者undone 和 報警。json
done目錄和原表目錄相似 表/版本/分區或日期/done/a.done or b.done or c.done (根據配置的根目錄 + 表路徑的後半部分來生成)大數據
1.表數據監控
監控什麼?要達到什麼目的?url
監控主要有兩個目的,一個是報警,另一個是攔截,攔截爲了發生問題時不繼續往下走,因此通常配置有攔截必有報警,有報警不必定有攔截,好比延時報警。.net
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=20201205code
1.2.3 分區數量波動:(分區數量的count - 前幾天的count平均值) / 前幾天的count平均值orm
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:
-
[ ] 增長值班人,報警方式升級、
-
[ ] 根據依賴來報警
-
[ ] 經過羣內機器人,來操做報警日誌表,達到報警暫停一段時間的做用 大數據開發,更多關注查看我的資料