網(wǎng)易嚴(yán)選數(shù)據(jù)質(zhì)量實(shí)踐

Hi,我是王知無(wú),一個(gè)大數(shù)據(jù)領(lǐng)域的原創(chuàng)作者。? 放心關(guān)注我,獲取更多行業(yè)的一手消息。
這篇文章將從三個(gè)方面給大家介紹:
第一部分,數(shù)據(jù)質(zhì)量問(wèn)題的危害和發(fā)生原因;
第二部分,如何保障數(shù)據(jù)質(zhì)量;
第三部分,網(wǎng)易嚴(yán)選數(shù)據(jù)質(zhì)量實(shí)踐。
數(shù)據(jù)質(zhì)量問(wèn)題的危害和發(fā)生原因
1. 數(shù)據(jù)質(zhì)量問(wèn)題的危害
數(shù)據(jù)質(zhì)量問(wèn)題的危害通常體現(xiàn)在四個(gè)方面:數(shù)據(jù)的完整性、數(shù)據(jù)延遲、數(shù)據(jù)準(zhǔn)確性、數(shù)據(jù)一致性。
數(shù)據(jù)完整性??猶記得2018年杭研和考拉一起共建數(shù)據(jù)中臺(tái),為了更好的了解業(yè)務(wù),我駐扎到考拉現(xiàn)場(chǎng)。剛?cè)滋欤?dāng)時(shí)考拉的業(yè)務(wù)投訴數(shù)倉(cāng)、說(shuō)流量數(shù)據(jù)不正確,排查了半天,發(fā)現(xiàn)是流量數(shù)據(jù)丟失,原因是幾臺(tái)機(jī)器數(shù)據(jù)沒(méi)有收集,最終定為P2事故。
數(shù)據(jù)延遲??在考拉呆了幾個(gè)星期,有一天分析師和業(yè)務(wù)在群里吼,怎么數(shù)據(jù)還沒(méi)有產(chǎn)出?都十點(diǎn)多了。原因是一個(gè)關(guān)鍵任務(wù)失敗,報(bào)警電話給對(duì)應(yīng)人沒(méi)有叫起來(lái),導(dǎo)致了整個(gè)數(shù)據(jù)延遲4小時(shí)+,定級(jí)P3事故。
數(shù)據(jù)準(zhǔn)確性??2020年下半年嚴(yán)選由于一個(gè)任務(wù)節(jié)點(diǎn)依賴有問(wèn)題,沒(méi)有依賴到數(shù)據(jù),導(dǎo)致了用戶標(biāo)簽一堆老客當(dāng)成了新客,造成了30w+的資損P1事故。
數(shù)據(jù)一致性??2020年 嚴(yán)選新客運(yùn)營(yíng)同學(xué)提出用戶當(dāng)前紅包數(shù)據(jù)不準(zhǔn)確,用戶紅包用掉了,怎么APP上還有浮層提醒,定位發(fā)現(xiàn)flink任務(wù)里面的一個(gè)task寫(xiě)ES的時(shí)候假死,其他task正常。
?
數(shù)據(jù)質(zhì)量會(huì)導(dǎo)致資損、業(yè)務(wù)分析滯后、錯(cuò)誤、算法模型不準(zhǔn)確、數(shù)據(jù)質(zhì)疑 等等問(wèn)題,我們可以分析下具體的發(fā)生原因。
2. 數(shù)據(jù)質(zhì)量問(wèn)題發(fā)生的原因
原因可以總結(jié)為兩個(gè)方面:系統(tǒng)不穩(wěn)定、程序BUG
系統(tǒng)不穩(wěn)定
埋點(diǎn)服務(wù)器配置更新或掛掉導(dǎo)致日志收集問(wèn)題;
?日志和數(shù)據(jù)庫(kù)數(shù)據(jù)同步問(wèn)題;
?離線計(jì)算平臺(tái)任務(wù)突然變慢卡死或失敗問(wèn)題;
?實(shí)時(shí)計(jì)算平臺(tái)任務(wù)Task卡死;
?KAFKA壓力大數(shù)據(jù)延遲。
程序bug
后端程序有Bug原始數(shù)據(jù)有問(wèn)題;
數(shù)據(jù)開(kāi)發(fā)程序有Bug;
實(shí)時(shí)任務(wù)和離線任務(wù)邏輯不一致;
上游數(shù)據(jù)變更未通知下游。
知道了發(fā)生數(shù)據(jù)質(zhì)量問(wèn)題的原因,接下來(lái)我們?cè)趺捶婪赌兀?/span>
如何保障數(shù)據(jù)質(zhì)量
1. 采用規(guī)范的開(kāi)發(fā)模式(解決后端和數(shù)據(jù)開(kāi)發(fā)的Bug)
利用網(wǎng)易有數(shù)的中臺(tái)產(chǎn)品:數(shù)據(jù)測(cè)試中心,做到開(kāi)發(fā)->測(cè)試->上線監(jiān)控流程
第一次開(kāi)發(fā)的時(shí)候,探查數(shù)據(jù)形態(tài)(如枚舉數(shù)量),進(jìn)行唯一性檢測(cè),和業(yè)務(wù)確認(rèn)數(shù)據(jù)量;
后期修改任務(wù)(業(yè)務(wù)改造),通過(guò)主鍵,進(jìn)行改造前后數(shù)據(jù)對(duì)比;
針對(duì)核心資產(chǎn)任務(wù),進(jìn)行code view機(jī)制,審批后提交上線;
上線后增加唯一性監(jiān)控、行數(shù)監(jiān)控、枚舉值監(jiān)控、指標(biāo)值監(jiān)控等相應(yīng)監(jiān)控。
2. 通過(guò)基線的機(jī)制保障數(shù)據(jù)及時(shí)性
利用網(wǎng)易有數(shù)的中臺(tái)產(chǎn)品:任務(wù)運(yùn)維中心,設(shè)置2點(diǎn)半基線->4點(diǎn)半基線->7點(diǎn)半基線,保證核心維表和dwd表、核心dws相關(guān)dwd表、核心dm層表及時(shí)產(chǎn)出
采用預(yù)警的方式提前白天處理,減少夜晚報(bào)警(如流量當(dāng)天數(shù)據(jù)監(jiān)控);
采用值班機(jī)制、多次呼叫并升級(jí),防止電話打不醒、任務(wù)延遲事故問(wèn)題。
3. 數(shù)據(jù)質(zhì)量監(jiān)控
利用網(wǎng)易有數(shù)中臺(tái)產(chǎn)品:數(shù)據(jù)質(zhì)量中心,進(jìn)行完整性、準(zhǔn)確性、一致性監(jiān)控
【完整性】針對(duì)當(dāng)天日志的IP地址數(shù)目進(jìn)行監(jiān)控,如果發(fā)現(xiàn)IP減少進(jìn)行白天報(bào)警規(guī)則,(避免第二天T+1任務(wù)出問(wèn)題);
【準(zhǔn)確性】核心dwd和dim表進(jìn)行行數(shù)、波動(dòng)性、主鍵、枚舉值監(jiān)控保證準(zhǔn)確性;
【準(zhǔn)確性】核心dws指標(biāo)、枚舉 進(jìn)行監(jiān)控;
【一致性】針對(duì)實(shí)時(shí)和離線數(shù)據(jù)進(jìn)行對(duì)比監(jiān)控(Lambda架構(gòu))? 針對(duì)不同存儲(chǔ)引擎數(shù)據(jù)對(duì)比監(jiān)控(如Mysql、ES、Kudu)。
保障數(shù)據(jù)質(zhì)量的輔助產(chǎn)品已經(jīng)到位了,我們是怎么實(shí)踐的呢?
數(shù)據(jù)質(zhì)量實(shí)踐
1. 開(kāi)發(fā)篇-超會(huì)改造
背景:
由于之前后端表設(shè)計(jì)不合理、導(dǎo)致新業(yè)務(wù)不能支持、業(yè)務(wù)后端需要改造。
改造過(guò)程:
業(yè)務(wù)10+表進(jìn)行變更、甚至有一張表拆分成4+表的場(chǎng)景、業(yè)務(wù)含義、枚舉大規(guī)模變更;
我們進(jìn)行了20+數(shù)據(jù)模型對(duì)比,如果有問(wèn)題反饋給業(yè)務(wù)后端改造

改造結(jié)果:
幫助主站后端找到8+問(wèn)題,讓其進(jìn)行修復(fù);保證了改造前后數(shù)倉(cāng)數(shù)據(jù)一致性,最終成功上線切換。

2. 保障及時(shí)性
我們進(jìn)行了輪班值班機(jī)制。每人3天,一個(gè)主值班人員、一個(gè)被值班人員。主要設(shè)立3條基線 2點(diǎn)半、4點(diǎn)半、7點(diǎn)半。

在基線我們有兩種報(bào)警:一種預(yù)警、一種破線。
掛在基線里面的任務(wù)或者鏈路里面的任務(wù)失敗,直接電話報(bào)警;
通過(guò)近14天排除掉最長(zhǎng)運(yùn)行時(shí)間和最短的運(yùn)行時(shí)間進(jìn)行鏈路計(jì)算時(shí)間,如果有可能破線,會(huì)進(jìn)行基線破線電話報(bào)警。
通過(guò)預(yù)警我們不會(huì)進(jìn)行電話報(bào)警,會(huì)采用短信、pop、郵件報(bào)警,如2點(diǎn)半基線在兩點(diǎn)的時(shí)候沒(méi)完成(緩沖半個(gè)小時(shí)),這樣白天我們進(jìn)行任務(wù)優(yōu)化。如果不長(zhǎng)期優(yōu)化,就會(huì)惡性循環(huán),在破線的邊緣徘徊。
如果值班人電話打不通沒(méi)處理,會(huì)給被值班人員進(jìn)行呼叫。
PS: 值班很痛苦、需要大家共同保障。
3. 保障完整性、準(zhǔn)確性、一致性
日志監(jiān)控
對(duì)于正常日志丟失,我們進(jìn)行了IP數(shù)量的校驗(yàn)。

針對(duì)當(dāng)天流量日志進(jìn)行IP數(shù)量的監(jiān)控,如大于多少臺(tái),以及波動(dòng)性監(jiān)控;當(dāng)機(jī)器數(shù)量減少的時(shí)候觸發(fā)報(bào)警。這里的報(bào)警要注意的點(diǎn) 是當(dāng)天的流量數(shù)據(jù),非T+1(如果半夜叫起處理的話基本也延遲了),也不存在阻斷下游的概念。
如果有的日志有對(duì)應(yīng)DB數(shù)據(jù),此時(shí)還可以加上日志和db數(shù)據(jù)的對(duì)比較監(jiān)控。
業(yè)務(wù)上游變更
業(yè)務(wù)上游變更可能會(huì)涉及到字段名稱、類(lèi)型,這種我們主要采用審批和變更提醒的方式進(jìn)行防護(hù),還有一種是業(yè)務(wù)的邏輯的變更。
case?when?a.topic?=?"getCartCoupon"?then?1when?a.topic?=??"getCoupon"?and?a.sub_welfare_type?not?in?(6)?then?2?when?a.topic?=?"pushSms"?then?3when?a.topic?=?"getCoupon"?and?a.sub_welfare_type?in?(6)?then?6when?a.topic?=?"openCard"?then?6else 0 end as welfare_type,
數(shù)倉(cāng)針對(duì)業(yè)務(wù)進(jìn)行定義了枚舉,當(dāng)業(yè)務(wù)有新的類(lèi)型產(chǎn)出的時(shí)候,我們可能識(shí)別不出來(lái),那怎么能快速發(fā)現(xiàn)呢?答案如下:

重要資損模型
有時(shí)候數(shù)倉(cāng)團(tuán)隊(duì)會(huì)出dm模型用來(lái)進(jìn)行發(fā)放福利,這個(gè)如果稍有差錯(cuò),就可能帶來(lái)大的資損事故(錢(qián)的多少?zèng)Q定了事故的等級(jí)),在這塊我們會(huì)進(jìn)行基礎(chǔ)的監(jiān)控和發(fā)放錢(qián)的監(jiān)控。

如果當(dāng)天需要發(fā)放超過(guò)10w就會(huì)阻斷。

標(biāo)簽相關(guān)監(jiān)控
在用戶標(biāo)簽這塊我們會(huì)有實(shí)時(shí)+離線的dm層明細(xì)數(shù)據(jù)、匯總數(shù)據(jù),為了保障標(biāo)簽不帶來(lái)資損,這塊我們也進(jìn)行了全方位的質(zhì)量監(jiān)控(這塊類(lèi)似于dwd 和dws 的數(shù)據(jù)監(jiān)控)。
比如在明細(xì)數(shù)據(jù)這塊我們主要進(jìn)行了唯一性和行數(shù)以及波動(dòng)性的檢測(cè)。

匯總數(shù)據(jù)這塊我們除了基礎(chǔ)唯一性、行數(shù)、波動(dòng)性的檢測(cè)外加了指標(biāo)監(jiān)控。

在實(shí)時(shí)和離線這塊我們進(jìn)行了對(duì)比監(jiān)控。

對(duì)于標(biāo)簽,除了存儲(chǔ)hive kudu外還會(huì)存儲(chǔ)到ES和Hbase里面,所以我們還加了數(shù)據(jù)對(duì)比監(jiān)控。

事實(shí)證明,只有完善的監(jiān)控才能保證標(biāo)簽的整體質(zhì)量。
總結(jié)
最后總結(jié)下在數(shù)據(jù)質(zhì)量實(shí)踐過(guò)程中沉淀的方法。第一個(gè)沉淀了實(shí)時(shí)標(biāo)簽開(kāi)發(fā)流程規(guī)范:

第二個(gè)是沉淀了質(zhì)量監(jiān)控的方法:

以上是我今天介紹的內(nèi)容,希望能給大家?guī)?lái)一些借鑒,謝謝。
如果這個(gè)文章對(duì)你有幫助,不要忘記?「在看」?「點(diǎn)贊」?「收藏」?三連啊喂!

