數(shù)據(jù)分層是數(shù)據(jù)倉(cāng)庫(kù)設(shè)計(jì)中十分重要的一個(gè)環(huán)節(jié),優(yōu)秀的分層設(shè)計(jì)能夠讓整個(gè)數(shù)據(jù)體系更易理解和使用。而目前網(wǎng)絡(luò)中大部分可以被檢索到相關(guān)文章只是簡(jiǎn)單地提及數(shù)據(jù)分層的設(shè)計(jì),或缺少明確而詳細(xì)的說明,或缺少可落地實(shí)施的方案,或缺少具體的示例說明。
因此,本文將指出一種通用的數(shù)據(jù)倉(cāng)庫(kù)分層方法,具體包含如下內(nèi)容:
介紹數(shù)據(jù)分層的作用
提出一種通用的數(shù)據(jù)分層設(shè)計(jì),以及分層設(shè)計(jì)的原則
舉出具體的例子說明
提出可落地的實(shí)踐意見
1數(shù)據(jù)分層
“為什么要進(jìn)行數(shù)據(jù)分層?”
這應(yīng)該是數(shù)據(jù)倉(cāng)庫(kù)同學(xué)在設(shè)計(jì)數(shù)據(jù)分層時(shí)首先要被挑戰(zhàn)的問題,類似的問題可能會(huì)有很多,比如說“為什么要做數(shù)據(jù)倉(cāng)庫(kù)?”、“為什么要做元數(shù)據(jù)管理?”、“為什么要做數(shù)據(jù)質(zhì)量管理?”。當(dāng)然,這里我們只聊一下為什么要做設(shè)計(jì)數(shù)據(jù)分層。
作為一名數(shù)據(jù)的規(guī)劃者,我們肯定希望自己的數(shù)據(jù)能夠有秩序地流轉(zhuǎn),數(shù)據(jù)的整個(gè)生命周期能夠清晰明確被設(shè)計(jì)者和使用者感知到。直觀來講就是如下的左圖這般層次清晰、依賴關(guān)系直觀。
但是,大多數(shù)情況下,我們完成的數(shù)據(jù)體系卻是依賴復(fù)雜、層級(jí)混亂的。如下的右圖,在不知不覺的情況下,我們可能會(huì)做出一套表依賴結(jié)構(gòu)混亂,甚至出現(xiàn)循環(huán)依賴的數(shù)據(jù)體系。
因此,我們需要一套行之有效的數(shù)據(jù)組織和管理方法來讓我們的數(shù)據(jù)體系更有序,這就是談到的數(shù)據(jù)分層。數(shù)據(jù)分層并不能解決所有的數(shù)據(jù)問題,但是,數(shù)據(jù)分層卻可以給我們帶來如下的好處:
清晰數(shù)據(jù)結(jié)構(gòu):每一個(gè)數(shù)據(jù)分層都有它的作用域和職責(zé),在使用表的時(shí)候能更方便地定位和理解
減少重復(fù)開發(fā):規(guī)范數(shù)據(jù)分層,開發(fā)一些通用的中間層數(shù)據(jù),能夠減少極大的重復(fù)計(jì)算
統(tǒng)一數(shù)據(jù)口徑:通過數(shù)據(jù)分層,提供統(tǒng)一的數(shù)據(jù)出口,統(tǒng)一對(duì)外輸出的數(shù)據(jù)口徑
復(fù)雜問題簡(jiǎn)單化:將一個(gè)復(fù)雜的任務(wù)分解成多個(gè)步驟來完成,每一層解決特定的問題
2一種通用的數(shù)據(jù)分層設(shè)計(jì)
為了滿足前面提到數(shù)據(jù)分層帶來的好處,我們將數(shù)據(jù)模型分為三層:數(shù)據(jù)運(yùn)營(yíng)層(?ODS )、數(shù)據(jù)倉(cāng)庫(kù)層(DW)和數(shù)據(jù)應(yīng)用層(APP)。如下圖所示。簡(jiǎn)單來講,我們可以理解為:**ODS層存放的是接入的原始數(shù)據(jù),DW層是存放我們要重點(diǎn)設(shè)計(jì)的數(shù)據(jù)倉(cāng)庫(kù)中間層數(shù)據(jù),APP是面向業(yè)務(wù)定制的應(yīng)用數(shù)據(jù)。**下面詳細(xì)介紹這三層的設(shè)計(jì)。
一、數(shù)據(jù)運(yùn)營(yíng)層:ODS(Operational Data Store)
“面向主題的”,數(shù)據(jù)運(yùn)營(yíng)層,也叫ODS層,是最接近數(shù)據(jù)源中數(shù)據(jù)的一層,數(shù)據(jù)源中的數(shù)據(jù),經(jīng)過抽取、洗凈、傳輸,也就說傳說中的 ETL 之后,裝入本層。本層的數(shù)據(jù),總體上大多是按照源頭業(yè)務(wù)系統(tǒng)的分類方式而分類的。
一般來講,為了考慮后續(xù)可能需要追溯數(shù)據(jù)問題,因此對(duì)于這一層就不建議做過多的數(shù)據(jù)清洗工作,原封不動(dòng)地接入原始數(shù)據(jù)即可,至于數(shù)據(jù)的去噪、去重、異常值處理等過程可以放在后面的DWD層來做。
二、數(shù)據(jù)倉(cāng)庫(kù)層:DW(Data Warehouse)
數(shù)據(jù)倉(cāng)庫(kù)層是我們?cè)谧鰯?shù)據(jù)倉(cāng)庫(kù)時(shí)要核心設(shè)計(jì)的一層,在這里,從?ODS 層中獲得的數(shù)據(jù)按照主題建立各種數(shù)據(jù)模型。DW層又細(xì)分為 DWD(Data Warehouse Detail)層、DWM(Data WareHouse Middle)層和DWS(Data WareHouse Servce)層。
1、數(shù)據(jù)明細(xì)層:DWD(Data Warehouse Detail)
該層一般保持和ODS層一樣的數(shù)據(jù)粒度,并且提供一定的數(shù)據(jù)質(zhì)量保證。同時(shí),為了提高數(shù)據(jù)明細(xì)層的易用性,該層會(huì)采用一些維度退化手法,將維度退化至事實(shí)表中,減少事實(shí)表和維表的關(guān)聯(lián)。
另外,在該層也會(huì)做一部分的數(shù)據(jù)聚合,將相同主題的數(shù)據(jù)匯集到一張表中,提高數(shù)據(jù)的可用性,后文會(huì)舉例說明。
2、數(shù)據(jù)中間層:DWM(Data WareHouse Middle)
該層會(huì)在DWD層的數(shù)據(jù)基礎(chǔ)上,對(duì)數(shù)據(jù)做輕度的聚合操作,生成一系列的中間表,提升公共指標(biāo)的復(fù)用性,減少重復(fù)加工。直觀來講,就是對(duì)通用的核心維度進(jìn)行聚合操作,算出相應(yīng)的統(tǒng)計(jì)指標(biāo)。
3、數(shù)據(jù)服務(wù)層:DWS(Data WareHouse Servce)
又稱數(shù)據(jù)集市或?qū)挶?。按照業(yè)務(wù)劃分,如流量、訂單、用戶等,生成字段比較多的寬表,用于提供后續(xù)的業(yè)務(wù)查詢,OLAP分析,數(shù)據(jù)分發(fā)等。
一般來講,該層的數(shù)據(jù)表會(huì)相對(duì)比較少,一張表會(huì)涵蓋比較多的業(yè)務(wù)內(nèi)容,由于其字段較多,因此一般也會(huì)稱該層的表為寬表。
在實(shí)際計(jì)算中,如果直接從DWD或者ODS計(jì)算出寬表的統(tǒng)計(jì)指標(biāo),會(huì)存在計(jì)算量太大并且維度太少的問題,因此一般的做法是,在DWM層先計(jì)算出多個(gè)小的中間表,然后再拼接成一張DWS的寬表。由于寬和窄的界限不易界定,也可以去掉DWM這一層,只留DWS層,將所有的數(shù)據(jù)在放在DWS亦可。
三、數(shù)據(jù)應(yīng)用層:APP(Application)
在這里,主要是提供給數(shù)據(jù)產(chǎn)品和數(shù)據(jù)分析使用的數(shù)據(jù),一般會(huì)存放在?ES、PostgreSql、Redis等系統(tǒng)中供線上系統(tǒng)使用,也可能會(huì)存在 Hive 或者 Druid 中供數(shù)據(jù)分析和數(shù)據(jù)挖掘使用。比如我們經(jīng)常說的報(bào)表數(shù)據(jù),一般就放在這里。
四、維表層(Dimension)
最后補(bǔ)充一個(gè)維表層,維表層主要包含兩部分?jǐn)?shù)據(jù):
高基數(shù)維度數(shù)據(jù):一般是用戶資料表、商品資料表類似的資料表。數(shù)據(jù)量可能是千萬(wàn)級(jí)或者上億級(jí)別。
低基數(shù)維度數(shù)據(jù):一般是配置表,比如枚舉值對(duì)應(yīng)的中文含義,或者日期維表。數(shù)據(jù)量可能是個(gè)位數(shù)或者幾千幾萬(wàn)。
至此,我們講完了數(shù)據(jù)分層設(shè)計(jì)中每一層的含義,這里做一個(gè)總結(jié)便于理解,如下圖。
3舉個(gè)例子
趁熱打鐵,舉個(gè)栗子說明一下,如下圖,可以認(rèn)為是一個(gè)電商網(wǎng)站的數(shù)據(jù)體系設(shè)計(jì)。我們暫且只關(guān)注用戶訪問日志這一部分?jǐn)?shù)據(jù)。
在ODS層中,由于各端的開發(fā)團(tuán)隊(duì)不同或者各種其它問題,用戶的訪問日志被分成了好幾張表上報(bào)到了我們的ODS層。
為了方便大家的使用,我們?cè)贒WD層做了一張用戶訪問行為天表,在這里,我們將PC網(wǎng)頁(yè)、H5、小程序和原生APP訪問日志匯聚到一張表里面,統(tǒng)一字段名,提升數(shù)據(jù)質(zhì)量,這樣就有了一張可供大家方便使用的明細(xì)表了。
在DWM層,我們會(huì)從DWD層中選取業(yè)務(wù)關(guān)注的核心維度來做聚合操作,比如只保留人、商品、設(shè)備和頁(yè)面區(qū)域維度。類似的,我們這樣做了很多個(gè)DWM的中間表。
然后在DWS層,我們將一個(gè)人在整個(gè)網(wǎng)站中的行為數(shù)據(jù)放到一張表中,這就是我們的寬表了,有了這張表,就可以快速滿足大部分的通用型業(yè)務(wù)需求了。
最后,在APP應(yīng)用層,根據(jù)需求從DWS層的一張或者多張表取出數(shù)據(jù)拼接成一張應(yīng)用表即可。
備注:例子只是為了簡(jiǎn)單地說明每一層的作用,并不是最合理的解決方案,大家辯證地看待即可。
4技術(shù)實(shí)踐
既然談到了數(shù)據(jù)分層,那不同的層次中會(huì)用到什么計(jì)算引擎和存儲(chǔ)系統(tǒng)呢,本節(jié)來簡(jiǎn)單分享一下。數(shù)據(jù)層的存儲(chǔ)一般如下:
Data Source:數(shù)據(jù)源一般是業(yè)務(wù)庫(kù)和埋點(diǎn),當(dāng)然也會(huì)有第三方購(gòu)買數(shù)據(jù)等多種數(shù)據(jù)來源方式。業(yè)務(wù)庫(kù)的存儲(chǔ)一般是Mysql 和 PostgreSql。
ODS 層:ODS 的數(shù)據(jù)量一般非常大,所以大多數(shù)公司會(huì)選擇存在HDFS上,即Hive或者Hbase,Hive居多。
DW 層:一般和 ODS 的存儲(chǔ)一致,但是為了滿足更多的需求,也會(huì)有存放在 PG 和 ES 中的情況。
APP 層:應(yīng)用層的數(shù)據(jù),一般都要求比較快的響應(yīng)速度,因此一般是放在 Mysql、PG、Redis中。
計(jì)算引擎的話,可以簡(jiǎn)單參考圖中所列就行。目前大數(shù)據(jù)相關(guān)的技術(shù)更新迭代比較快,本節(jié)所列僅為簡(jiǎn)單參考。
5思考
思考和總結(jié)一下數(shù)據(jù)分層的原則是什么?為什么要這樣分層?每層之間的界限又是什么?我個(gè)人從這幾個(gè)角度來理解數(shù)據(jù)分層的劃分:
從對(duì)應(yīng)用的支持來講,我們希望越靠上層次,越對(duì)應(yīng)用友好。比如APP層,基本是完全為應(yīng)用來設(shè)計(jì)的,很易懂,DWS層的話,相對(duì)來講就會(huì)有一點(diǎn)點(diǎn)理解成本,然后DWM和DWD層就比較難理解了,因?yàn)樗木S度可能會(huì)比較多,而且一個(gè)需求可能要多張表經(jīng)過很復(fù)雜的計(jì)算才能完成。
從能力范圍來講,我們希望80%需求由20%的表來支持。直接點(diǎn)講,就是大部分(80%以上)的需求,都用DWS的表來支持就行,DWS支持不了的,就用DWM和DWD的表來支持,這些都支持不了的極少一部分?jǐn)?shù)據(jù)需要從原始日志中撈取。結(jié)合第一點(diǎn)來講的話就是:80%的需求,我們都希望以對(duì)應(yīng)用很友好的方式來支持,而不是直接暴露給應(yīng)用方原始日志。
從數(shù)據(jù)聚合程度來講,我們希望,越上層數(shù)據(jù)的聚合程度越高,看上面的例子即可,ODS和DWD的數(shù)據(jù)基本是原始日志的粒度,不做任何聚合操作,DWM做了輕度的聚合操作只保留了通用的維度,DWS做了更高的聚合操作,可能只保留一到兩個(gè)能表征當(dāng)前描述主體的維度。從這個(gè)角度來看,我們又可以理解為我們是按照數(shù)據(jù)的聚合程度來劃分?jǐn)?shù)據(jù)層次的。
比如,目前市面上很流行的帆軟公司的軟件——FineBI,功能算是前沿的,可做BI報(bào)表,內(nèi)置了10+行業(yè)解決方案和幾十種可視化大屏模板demo,只需要直接把數(shù)據(jù)放入到模板中,馬上就可以生成數(shù)據(jù),無需花費(fèi)很多時(shí)間,很適合企業(yè)使用。
我們專注高端建站,小程序開發(fā)、軟件系統(tǒng)定制開發(fā)、BUG修復(fù)、物聯(lián)網(wǎng)開發(fā)、各類API接口對(duì)接開發(fā)等。十余年開發(fā)經(jīng)驗(yàn),每一個(gè)項(xiàng)目承諾做到滿意為止,多一次對(duì)比,一定讓您多一份收獲!