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