數(shù)據(jù)部數(shù)據(jù)質(zhì)量預(yù)警與自動化數(shù)據(jù)測試工具
github: https://github.com/gangly/beeper
一醉拓、Beeper產(chǎn)生原因
Beeper就是當(dāng)年的BP機(jī)锄蹂,能發(fā)出嗶嗶的聲音昼丑,也有通知喳逛、報(bào)警器的意思最铁,這里用來作為數(shù)據(jù)質(zhì)量預(yù)警工具的別名。作為數(shù)據(jù)開發(fā)戚宦,多數(shù)情況下需要每天自動檢查數(shù)據(jù)質(zhì)量是否有問題个曙,有以下幾方面需要關(guān)注:
- 每天是否有數(shù)據(jù),在檢查時(shí)間點(diǎn)是否按時(shí)產(chǎn)出了數(shù)據(jù)
- 數(shù)據(jù)是否完整受楼,例如流量的各個(gè)渠道是否都有數(shù)據(jù)
- 是否有臟數(shù)據(jù)垦搬,數(shù)據(jù)加工錯誤導(dǎo)致產(chǎn)出了臟數(shù)據(jù)
- 數(shù)據(jù)波動是否正常,某些維度上的指標(biāo)相對前段時(shí)間是否在合理范圍內(nèi)
針對上面幾種情況艳汽,Beeper能滿足預(yù)警功能猴贰。
二、Beeper工作原理
Beeper是用python2.7開發(fā)河狐,因?yàn)橐O(jiān)控大數(shù)據(jù)平臺上的hive數(shù)據(jù)米绕,需要用azkaban進(jìn)行任務(wù)調(diào)度。
Beeper是基于即時(shí)查詢hive實(shí)現(xiàn)馋艺,這就要工程師預(yù)先寫好hql并配置好預(yù)警規(guī)則栅干。
目前beeper支持mysql, hive, presto查詢
- Beeper讀取jobconfs目錄下文件,一個(gè)配置文件代表一個(gè)預(yù)警任務(wù)
- 配置解析器對配置進(jìn)行解析捐祠,清洗出hql碱鳞,預(yù)警檢查規(guī)則等
- 數(shù)據(jù)查詢收集器將hql通過hive客戶端執(zhí)行,將執(zhí)行后的數(shù)據(jù)進(jìn)行收集踱蛀,清洗
- 將每條數(shù)據(jù)通過檢查器進(jìn)行檢查判斷窿给,將風(fēng)險(xiǎn)數(shù)據(jù)進(jìn)行打標(biāo)(郵件顯示為紅色)
- 構(gòu)造報(bào)警郵件內(nèi)容,發(fā)送郵件
三率拒、Beeper使用方法
3.1Beeper
由python2.7開發(fā)
beeper.job為azkaban腳本
3.2配置文件
用戶只需要在jobconfs目錄下按照一定格式編寫配置文件崩泡,一個(gè)配置文件代表一個(gè)檢查任務(wù),
采用python風(fēng)格猬膨,格式如下:
配置文件示例
{
'author': 'ligangc',
'title': '流量異常檢測報(bào)告',
'receivers': ['ligangc','tanjiquan'],
'head': '''
昨日:$yesterday
差值:昨日uv-環(huán)比上周同日uv
波動百分比:差值/環(huán)比上周同日uv
數(shù)據(jù)變化報(bào)警閾值:uv差值絕對值大于5000并且波動變化絕對值大于10%
''',
'jobs': [
{
'desc': 'presto test',
'source': 'presto',
'sql': '''
select t1.pv, t2.pv from
(
SELECT count(1) as pv FROM hive.bdc_dm.res_coreboard_employment) t1
join (
select count(1) as pv from mysql1.market.mk_task where createymd = date('2017-09-10')
) t2 on 1=1
''',
'headers': ['pv量1', 'pv量2'],
'check': 'pv量1 != pv量2',
},
{
'desc': 'market test',
'source': 'mysql:market',
'sql': '''
select count(1) as pv from market.mk_task where createymd ='2017-09-10'
''',
'headers': ['pv量'],
'check': 'pv量 >= 5',
},
{
'desc': 'clickweb流量異常檢查',
'source': 'hive',
'hql': '''
SELECT t1.channel1 as channel, t1.uv as t1uv, t2.uv as t2uv, (t2.uv-t1.uv) as diff, (1.00*(t2.uv-t1.uv)/t1.uv) as cent
from (
SELECT channel1,count(distinct uniqid) as uv from bdc_dwd.dw_fact_galog_pv_daily
where acct_day='$lastweekyesday' group by channel1
)t1 join
(
SELECT channel1,count(distinct uniqid) as uv from bdc_dwd.dw_fact_galog_pv_daily
where acct_day='$yesterday' group by channel1
) t2 on t1.channel1=t2.channel1;
''',
'headers': ['渠道', '環(huán)比上周同日uv', '昨日uv', 'uv差值', '波動百分比'],
'percent': ['波動百分比'],
'check': 'uv差值 >= 5000 and 波動百分比 >= 0.1',
},
]
}
發(fā)出的報(bào)警郵件內(nèi)容如下:
下面依次解析配置文件內(nèi)容:
字段名 | 是否必須 | 描述 | 備注 | |
---|---|---|---|---|
author | 否 | 任務(wù)編寫者 | 可不寫 | |
title | 是 | 報(bào)警郵件標(biāo)題 | ||
receivers | 是 | 郵件接收者列表 | 不需要填郵箱后綴角撞,beeper會自動添加后綴 | |
head | 是 | 郵件前置描述信息 | ||
jobs | 是 | 查詢表配置信息列表 | 每個(gè)查詢會在郵件中形成一個(gè)表格,可添加多個(gè)查詢 | |
desc | 是 | 查詢描述 | ||
hql | 是 | sql表達(dá)式 | 會替換掉里面的日期標(biāo)志 | |
headers | 是 | 表頭信息勃痴,在郵件中展示 | 必須與hql中查詢出來的字段一一對應(yīng) | |
percent | 否 | 需要顯示為百分比 | 值必須為headers中的值谒所,百分比保留兩位小數(shù) | |
check | 是 | 預(yù)警檢測表達(dá)式 | 必須為headers中的值,關(guān)聯(lián)邏輯目前支持 and, or | 這里每個(gè)指標(biāo)是用絕對值進(jìn)行比較 |
source | 是 | 數(shù)據(jù)源類型 | 目前只支持hive/mysql/presto召耘; mysql格式, mysl:數(shù)據(jù)庫名 |
其中日期標(biāo)記百炬,Beeper計(jì)算出具體日期后將其自自動替換掉,其中支持的日期類型有:
日期標(biāo)記 | 描述 | 示例 |
---|---|---|
$today | 今日日期 | 2017-09-08 |
$yesterday | 昨日日期 | 2017-09-07 |
$beforeyesday | 前日日期 | 2017-08-06 |
$lastweekday | 今日上周同日日期 | 2017-08-31 |
$lastweekyesday | 昨日上周同日日期 | 2017-09-30 |
$day_today | 今日日期(天) | 08 |
$day_yesterday | 昨日日期(天) | 07 |
$day_beforeyesday | 前日日期(天) | 06 |
$day_lastweekday | 今日上周同日日期(天) | 31 |
$day_lastweekyesday | 昨日上周同日日期(天) | 30 |
3.3 使用方法
1)下載beeper.zip解壓后刪除jobconfs目錄下文件(兩個(gè)示例文件可參考)污它,編寫配置文件放在jobconfs目錄下剖踊,配置azkaban定時(shí)調(diào)度執(zhí)行beeper任務(wù)。
若數(shù)據(jù)有問題會發(fā)送報(bào)警郵件衫贬,沒問題則不發(fā)送郵件德澈。
2)自動化測試:將要測試的sql放在lib/autotests目錄下,運(yùn)行autotest.job