數(shù)字化時(shí)代,如何建造會(huì)“運(yùn)轉(zhuǎn)”的數(shù)倉(cāng)
在建設(shè)數(shù)倉(cāng)之前需要根據(jù)數(shù)據(jù)基礎(chǔ)和業(yè)務(wù)需求來(lái)決定要建設(shè)什么標(biāo)準(zhǔn)的數(shù)倉(cāng)。
常見(jiàn)數(shù)倉(cāng)問(wèn)題
1、公共底層加工邏輯分散:對(duì)于來(lái)自多個(gè)數(shù)據(jù)源,但需要使用相同過(guò)濾和解析方式公共底層數(shù)倉(cāng),其過(guò)濾和解析代碼在每個(gè)任務(wù)或配置中直接靜態(tài)復(fù)制,未做到統(tǒng)一管理。加工邏輯分散帶來(lái)的影響是如果公共底層數(shù)倉(cāng)字段需要更改(增刪,修改過(guò)濾、解析方式等),需要刷新一遍所有相關(guān)任務(wù)的代碼。如果還存在著無(wú)法感知到所有的修改位置、修改進(jìn)度不一致、修改過(guò)程出現(xiàn)問(wèn)題等情況,下游的數(shù)據(jù)使用就可能出現(xiàn)問(wèn)題。
?

2、煙囪式開(kāi)發(fā):針對(duì)每一個(gè)需求或者每一個(gè)計(jì)算指標(biāo),都從底層數(shù)據(jù)開(kāi)始,使用相同或極其相似的限定條件、計(jì)算邏輯、接出方式,產(chǎn)出的結(jié)果僅在很小范圍內(nèi)使用。煙囪式開(kāi)發(fā)帶來(lái)的影響是下游數(shù)據(jù)口徑產(chǎn)生差異,重復(fù)解析造成的計(jì)算和存儲(chǔ)資源浪費(fèi),無(wú)法通過(guò)擴(kuò)大規(guī)模提升開(kāi)發(fā)效率,并且不利于數(shù)據(jù)的團(tuán)隊(duì)內(nèi)外共享。
3、批流建設(shè)分離:實(shí)時(shí)數(shù)倉(cāng)和離線數(shù)倉(cāng)在機(jī)制上無(wú)法使用相同的清洗和加工邏輯。這是Lambda架構(gòu)下很常見(jiàn)的問(wèn)題,可能直接影響到實(shí)時(shí)數(shù)倉(cāng)和離線數(shù)倉(cāng)的數(shù)據(jù)一致性。
局部業(yè)務(wù)問(wèn)題
1、數(shù)據(jù)含義模糊:存在于數(shù)倉(cāng)各個(gè)層級(jí)的數(shù)據(jù)中,包括但不限于字段內(nèi)數(shù)據(jù)存在多義性、字段名與含義不符、維度和指標(biāo)的組合存在偏差等。
數(shù)據(jù)的多義性會(huì)給下游使用帶來(lái)困難,有時(shí)候下游需要確定性的某一種ID,那么就還需要恢復(fù)處理,如果判斷條件不足還會(huì)出現(xiàn)無(wú)法分離的情況;字段名含義不符增大了數(shù)倉(cāng)的使用成本,即每一次個(gè)字段的使用都要通讀上游所有代碼才能確定其含義;維度指標(biāo)偏差則可能產(chǎn)生錯(cuò)誤數(shù)據(jù),并且給下游使用方帶來(lái)困擾。
2、溯源性差:由于數(shù)倉(cāng)加工代碼邏輯限制,或者數(shù)據(jù)表的生命周期設(shè)置不合理,造成的歷史數(shù)據(jù)重跑困難,或者歷史問(wèn)題現(xiàn)場(chǎng)無(wú)法恢復(fù)。數(shù)據(jù)的重算和問(wèn)題溯源是常見(jiàn)的數(shù)倉(cāng)需求,如果無(wú)法回溯則可能導(dǎo)致錯(cuò)誤數(shù)據(jù)的累積,或者無(wú)法很好地幫助業(yè)務(wù)定位問(wèn)題。
?

3、指標(biāo)膨脹:由于缺少規(guī)范上的約束,導(dǎo)致指標(biāo)中涵蓋了本可以作為維度的內(nèi)容,造成了指標(biāo)膨脹。隨著業(yè)務(wù)的發(fā)展,膨脹過(guò)度的指標(biāo)會(huì)導(dǎo)致應(yīng)用數(shù)倉(cāng)越來(lái)越臃腫且難以維護(hù)。
4、數(shù)倉(cāng)規(guī)范缺失:數(shù)倉(cāng)開(kāi)發(fā)中缺少統(tǒng)一的規(guī)范限制,導(dǎo)致任務(wù)設(shè)置、元數(shù)據(jù)管理、數(shù)據(jù)層級(jí)調(diào)用、字段命名、計(jì)算口徑等隨著開(kāi)發(fā)野蠻生長(zhǎng),并最終導(dǎo)致開(kāi)發(fā)效率降低。
明確建設(shè)步驟
開(kāi)始建設(shè)數(shù)倉(cāng)之前,首先要全面了解業(yè)務(wù)邏輯,這樣更便于做出正確的數(shù)據(jù)域和數(shù)倉(cāng)架構(gòu)劃分。
確定了業(yè)務(wù)邏輯以后,下一個(gè)關(guān)鍵步驟就是抽象業(yè)務(wù)行為,也就是劃分?jǐn)?shù)據(jù)域。如果你的業(yè)務(wù)是內(nèi)容類(lèi),那么曝光(頁(yè)面、元素)、點(diǎn)擊、播放、進(jìn)入退出應(yīng)用等就是業(yè)務(wù)內(nèi)的基本行為;如果你的業(yè)務(wù)內(nèi)容是電商類(lèi),那么加購(gòu)物車(chē)、下單、支付、發(fā)貨、退款等就是業(yè)務(wù)內(nèi)的基本行為。
?

不論自身業(yè)務(wù)的數(shù)據(jù)源質(zhì)量如何,數(shù)據(jù)開(kāi)發(fā)人員的價(jià)值體現(xiàn)為無(wú)論基于什么上報(bào)基礎(chǔ)都能構(gòu)建對(duì)下游友好的數(shù)倉(cāng)。但也可以明顯看出,如果數(shù)據(jù)源質(zhì)量太過(guò)惡劣,那勢(shì)必消耗數(shù)據(jù)開(kāi)發(fā)人員大量的時(shí)間在清洗與規(guī)整上,在數(shù)倉(cāng)其他方面的建設(shè)不免分身乏術(shù),這時(shí)可能就需要考慮數(shù)據(jù)源治理的事情了。
遵循建設(shè)原則
一致性
一致性包含但不限于批流清洗邏輯的一致、指標(biāo)計(jì)算口徑的一致和維度含義的一致。
目前多數(shù)業(yè)務(wù)都有實(shí)時(shí)和離線兩種時(shí)效性的數(shù)倉(cāng)需求,無(wú)論是lambda架構(gòu)還是kappa架構(gòu),要保證多事件(業(yè)務(wù)下所有數(shù)據(jù)域)、跨計(jì)算引擎(批處理引擎和流處理引擎)場(chǎng)景下的數(shù)倉(cāng)邏輯統(tǒng)一,需要從機(jī)制上保證而不是直接在代碼中,靠開(kāi)發(fā)人員的工程素養(yǎng),通過(guò)手動(dòng)修改來(lái)保證。
終極解決方案是通過(guò)數(shù)據(jù)開(kāi)發(fā)中臺(tái),保證全鏈路的邏輯一致性,使用界面拖拽代替代碼開(kāi)發(fā)來(lái)建設(shè)和修改數(shù)倉(cāng)。但由于業(yè)務(wù)數(shù)據(jù)的復(fù)雜性極高,這種方案的研發(fā)投入和維護(hù)成本也特別高,故目前大多數(shù)業(yè)務(wù)使用到一些折中的方案。目前已經(jīng)實(shí)現(xiàn)的是批流清洗邏輯的機(jī)制一致性。
準(zhǔn)確性
準(zhǔn)確性是數(shù)倉(cāng)開(kāi)發(fā)的生命線,對(duì)于希望使用數(shù)據(jù)驅(qū)動(dòng)的業(yè)務(wù)來(lái)說(shuō),一份不準(zhǔn)確的數(shù)據(jù)的危害比沒(méi)有數(shù)據(jù)還要大。更細(xì)地來(lái)說(shuō),準(zhǔn)確性可分為明細(xì)層字段的準(zhǔn)確性,和聚合層計(jì)算邏輯的準(zhǔn)確性。
?

明細(xì)層字段的準(zhǔn)確性可以通過(guò)上報(bào)校驗(yàn)或者白名單入數(shù)倉(cāng)來(lái)規(guī)范,上報(bào)校驗(yàn)的結(jié)果定期反饋給上報(bào)開(kāi)發(fā)方進(jìn)行修正。白名單過(guò)濾掉不合規(guī)范的數(shù)據(jù),保證數(shù)倉(cāng)內(nèi)的數(shù)據(jù)100%可用,但因?yàn)楦掳酌麊蔚某杀靖?,并且?huì)丟棄相當(dāng)一部分業(yè)務(wù)數(shù)據(jù),很少被正式業(yè)務(wù)所采用。
聚合層計(jì)算邏輯的準(zhǔn)確性由于和業(yè)務(wù)耦合較深,一般通過(guò)業(yè)務(wù)開(kāi)發(fā)間相互的代碼CR、產(chǎn)品運(yùn)營(yíng)的數(shù)據(jù)敏感度和測(cè)試同學(xué)的用例測(cè)試來(lái)保證其準(zhǔn)確性。
復(fù)用性
數(shù)據(jù)分層將數(shù)倉(cāng)各個(gè)功能模塊解耦,分別滿足不同等級(jí)的數(shù)據(jù)需求,是重要的數(shù)據(jù)加工手段。這里二八定律依然有效,即20%的表可以滿足80%的數(shù)據(jù)需求。根據(jù)每一個(gè)需求,從流水?dāng)?shù)據(jù)一路開(kāi)發(fā)到應(yīng)用數(shù)據(jù)的煙囪式開(kāi)發(fā)是不可取的,因?yàn)樵跇I(yè)務(wù)量擴(kuò)大后,維護(hù)這些數(shù)據(jù)的統(tǒng)一就會(huì)變成一件非常麻煩的事情。
構(gòu)建數(shù)據(jù)模型
無(wú)論上游的數(shù)據(jù)源多么復(fù)雜,數(shù)據(jù)上報(bào)是否規(guī)范,數(shù)據(jù)工程師的必備技能就要求能夠?qū)⑦@些數(shù)據(jù)進(jìn)行分類(lèi)、篩選和處理,產(chǎn)出一套對(duì)下游來(lái)說(shuō)含義清晰、使用便捷的數(shù)倉(cāng)。
絕大多數(shù)業(yè)務(wù),其基礎(chǔ)數(shù)倉(cāng)表都可以分為流水表和維表兩大類(lèi),在此之上可以建立各種類(lèi)型的聚合表、應(yīng)用表、模型表等,構(gòu)成如圖所示的大致引用關(guān)系。
流水表
流水表是對(duì)用戶的任意一個(gè)在現(xiàn)實(shí)中發(fā)生的不可拆分的行為的記錄,也可稱之為原子行為。例如交易就不是一個(gè)原子行為,因?yàn)槠渲邪撕芏嗟倪^(guò)程;而下單、點(diǎn)擊支付、支付成功可以算是——至少在一些簡(jiǎn)單業(yè)務(wù)里可以算是——原子行為。類(lèi)似的還可以推廣到一次瞬發(fā)技能釋放、一個(gè)頁(yè)面曝光、一次掃二維碼、一條聊天發(fā)送等等。
輕度聚合表
?

輕度聚合表主要實(shí)現(xiàn)對(duì)相似數(shù)據(jù)域的指標(biāo)聚合和口徑統(tǒng)一,并且保留部分重要的去重參數(shù)以便應(yīng)用層進(jìn)行后續(xù)計(jì)算。
可加和類(lèi)指標(biāo)(次數(shù)、金額等)從流水層需要經(jīng)過(guò)一些計(jì)算邏輯才能變成對(duì)應(yīng)指標(biāo),這個(gè)口徑統(tǒng)一維護(hù)在輕度聚合層,不僅下游使用方可以避免理解復(fù)雜的計(jì)算邏輯,直接使用輕度聚合層加工好的指標(biāo),而且在口徑需要修改時(shí)可以做到無(wú)需下游改動(dòng),同時(shí)生效。
輕度聚合層很明顯地體現(xiàn)了數(shù)倉(cāng)建設(shè)原則中的一致性和復(fù)用性。
維表
維表是對(duì)任意一層數(shù)據(jù)表中信息的關(guān)聯(lián)與拓展,字典表也算一種維表。
一般情況下維表需要落地一份存儲(chǔ)供下游使用,而不是從原始數(shù)據(jù)層直接解析后寫(xiě)在關(guān)聯(lián)邏輯里。一方面避免讀取上游表全部分區(qū)的情況,另一方面使下游維度的使用保持一致。
模型表
基于基礎(chǔ)數(shù)倉(cāng)可以根據(jù)使用需求構(gòu)建一系列模型表。以下舉兩個(gè)例子簡(jiǎn)單描述其使用場(chǎng)景,其他種類(lèi)的模型表可以舉一反三。
用戶模型表不僅可以保存性別、年齡、學(xué)歷等基礎(chǔ)信息,也可以附帶來(lái)源渠道、活躍度、進(jìn)行某些關(guān)鍵行為的次數(shù)、內(nèi)容消費(fèi)習(xí)慣等業(yè)務(wù)拓展信息,提供更全面的分析基礎(chǔ)。
漏斗模型表可以統(tǒng)計(jì)群體用戶在某種周期內(nèi),每一個(gè)步驟的操作。在內(nèi)容類(lèi)應(yīng)用里,可以是用戶從進(jìn)入應(yīng)用的每一步跳轉(zhuǎn)直到退出的過(guò)程;在交易類(lèi)應(yīng)用里,可以是從瀏覽、加購(gòu)物車(chē)、下單、支付直到完成售后的過(guò)程。