網(wǎng)易云音樂數(shù)倉維度建模實(shí)踐-模型設(shè)計(jì)篇
寫在前面:我們?yōu)槭裁匆?/strong>
這里想先說下,這些年我在數(shù)倉摸爬滾打的一些經(jīng)歷:
剛畢業(yè)那會(huì)兒,我覺得數(shù)倉簡單啊,不就是用sql開發(fā)一張張表嘛,誰不會(huì)呀,那段時(shí)間覺得好沒挑戰(zhàn)呀,沒事的時(shí)候搗鼓下高大上的spark、scala啥的。

后來開始接觸模型,我的認(rèn)知開始發(fā)生變化,原來每一個(gè)表都是一個(gè)個(gè)精心設(shè)計(jì)的模型,我以為數(shù)倉就是一個(gè)個(gè)模型。
再后來,接觸越來越復(fù)雜的業(yè)務(wù),我發(fā)現(xiàn),設(shè)計(jì)模型也不是一個(gè)簡單的事情。我以為我設(shè)計(jì)地很完美,但,業(yè)務(wù)不斷發(fā)展后:
一個(gè)需求一個(gè)模型,要膨脹了......
原來的模型跑的時(shí)間越來越長了?
有些kpi指標(biāo)要早點(diǎn)出來,但是受模型里個(gè)別指標(biāo)硬生生的拖慢了速度?
發(fā)現(xiàn)一個(gè)bug,想快速補(bǔ)數(shù)據(jù),發(fā)現(xiàn)只能串行一天天的跑?
怎么好多模型的指標(biāo)有重復(fù)咧?
這個(gè)指標(biāo)長的一樣,咋定義不一樣呢?
怎么同樣口徑的指標(biāo),從不同的表計(jì)算,數(shù)值不一樣呢?
這咋每天都在延遲報(bào)警誒?每天都要運(yùn)維,心塞塞~~
業(yè)務(wù)要這個(gè)數(shù)據(jù),哪個(gè)表計(jì)算的來著?
常用指標(biāo)和僵尸指標(biāo)都在一個(gè)模型躺著,刪怕影響業(yè)務(wù),用戶難受,不刪我難受,浪費(fèi)資源 ......
淌過這些坑后,如醍醐灌頂,這其實(shí)就是一個(gè)系統(tǒng)嘛。它不是一張表,也不是一個(gè)模型,而是一個(gè)有著完整體系架構(gòu)和規(guī)范,需要同時(shí)考慮功能性需求和非功能性需求的系統(tǒng)。功能需求很好理解,就是滿足業(yè)務(wù)需求,產(chǎn)出數(shù)據(jù)和指標(biāo)。難點(diǎn)在于非功能性需求,比如:指標(biāo)質(zhì)量高不高、數(shù)據(jù)安不安全、數(shù)據(jù)產(chǎn)出快不快、模型是否穩(wěn)定可擴(kuò)展、數(shù)據(jù)服務(wù)穩(wěn)不穩(wěn)定、代碼是否健壯、是否浪費(fèi)了計(jì)算資源和存儲(chǔ)資源......

總之,數(shù)據(jù)模型就是數(shù)據(jù)組織和存儲(chǔ)方法,它強(qiáng)調(diào)從業(yè)務(wù)、數(shù)據(jù)存取和使用角度合理存儲(chǔ)數(shù)據(jù)。它的價(jià)值體現(xiàn)在:數(shù)據(jù)質(zhì)量、健壯水平、服務(wù)響應(yīng)速度、資源消耗。轉(zhuǎn)化成對(duì)企業(yè)數(shù)倉的要求就是:強(qiáng)穩(wěn)定、高質(zhì)量、高效率、低成本。
這一環(huán)節(jié),我給它取了個(gè)名字,叫"定調(diào)"。這里主要根據(jù)各自部門的業(yè)務(wù)形態(tài)和數(shù)據(jù)服務(wù)特點(diǎn)來確定整體數(shù)倉建設(shè)的基調(diào)。
首先,明確數(shù)倉各層次的要做的事情,下面是云音樂模型層次的框架圖:

DWD:存放面向業(yè)務(wù)過程的明細(xì)事實(shí)數(shù)據(jù),做一些數(shù)據(jù)清洗和規(guī)范化等。
DWS:面向分析主題建模,這里要說明的是,云音樂dws層的基架是輕度匯總事實(shí)表,這里做了一些常用的退化維,基本要求是:大部分指標(biāo)都可以從輕度匯總層上計(jì)算得出。中度匯總層按需建設(shè)。重度匯總層基本上是單實(shí)體指標(biāo)。
DIM:所有實(shí)體的維度,云音樂含有不同身份的用戶和多種類的內(nèi)容實(shí)體,所以會(huì)有大量的維度模型
ADS:數(shù)據(jù)集市層?;赿ws和dim表,云音樂建設(shè)了大量面向應(yīng)用的數(shù)據(jù)集市。
確定橫向模型層的任務(wù)后,接下來要確定下縱向數(shù)據(jù)域下各業(yè)務(wù)線的建設(shè)模式。
根據(jù)經(jīng)驗(yàn),數(shù)倉的建設(shè)難度與業(yè)務(wù)深度和復(fù)雜度是成正比的,dws層的建設(shè)尤為復(fù)雜。dws層的設(shè)計(jì)要考慮三個(gè)方向:
數(shù)據(jù)域的劃分特點(diǎn)
業(yè)務(wù)的復(fù)雜度,各業(yè)務(wù)線、業(yè)務(wù)過程之間的區(qū)別和聯(lián)系,用戶在各業(yè)務(wù)線的特點(diǎn)和關(guān)系,業(yè)務(wù)數(shù)據(jù)體量,解耦因素等等。
指標(biāo)的特點(diǎn),指標(biāo)的構(gòu)成無非是退化維+時(shí)間周期+原子指標(biāo)構(gòu)成,所以分析下指標(biāo)的退化維一般有哪些、時(shí)間周期有哪些、原子指標(biāo)種類有哪些。
基于以上三點(diǎn),大致可以給整體數(shù)倉定個(gè)調(diào),敲定數(shù)倉dws,從而整個(gè)數(shù)倉架構(gòu)基本上就可以確定下來了。比如,云音樂最重要的用戶和內(nèi)容業(yè)務(wù)線的設(shè)計(jì)大致如下架構(gòu):

主要思路是:
各內(nèi)容業(yè)務(wù)線各自獨(dú)立建設(shè)內(nèi)容和用戶類指標(biāo),按照上面架構(gòu)圖分?jǐn)?shù)據(jù)域逐步建設(shè)
輕度匯總表和中度匯總表都是用戶實(shí)體+內(nèi)容實(shí)體+退化維模式。輕度匯總表基本涵蓋大部分需求場(chǎng)景
重度匯總表要么是單實(shí)體,要么是用戶+內(nèi)容雙實(shí)體組成,且不包含退化維
重度匯總表分為增量表和全量表,增量包含近1/3/7/30天時(shí)間周期的指標(biāo),全量表計(jì)算歷史累計(jì)指標(biāo)。這么做的目的是在計(jì)算人數(shù)類指標(biāo)和計(jì)算資源之間做了平衡。
每個(gè)內(nèi)容業(yè)務(wù)線最后都有自己內(nèi)容大寬表和維表
用戶指標(biāo)拆分到具體的內(nèi)容業(yè)務(wù)線上,各自獨(dú)立建設(shè)用戶業(yè)務(wù)寬表,做到充分解耦,以滿足各自場(chǎng)景需求
用戶維表采用先分后總模型:先建設(shè)不受業(yè)務(wù)數(shù)據(jù)干擾的公用基礎(chǔ)維表+各業(yè)務(wù)線用戶維表,強(qiáng)解耦,保持獨(dú)立,再建設(shè)全域用戶維表
定下數(shù)倉的基調(diào),即模型架構(gòu)后。接下來就要開始進(jìn)行具體單個(gè)模型的設(shè)計(jì)了。具體建模流程按照下面流程進(jìn)行:

有了模型體系架構(gòu)和建模流程,我們要實(shí)打?qū)嵉卦O(shè)計(jì)一個(gè)個(gè)模型。我們知道表的分類主要是事實(shí)表和維表。事實(shí)表是維度建模的核心,維度是維度建模的基礎(chǔ)和靈魂。設(shè)計(jì)模型其實(shí)就是在設(shè)計(jì)事實(shí)表和維度表。簡單介紹下模型設(shè)計(jì)的基本原則和設(shè)計(jì)方法。
1.模型設(shè)計(jì)基本原則有:
1.1高內(nèi)聚低耦合(最重要,非功能性需求決定架構(gòu))
產(chǎn)出時(shí)間
粒度
業(yè)務(wù)相關(guān)性
訪問頻率
運(yùn)行方式:并行、串行
資源消耗情況
1.2核心模型與擴(kuò)展模型分離
核心模型:支持常用的核心業(yè)務(wù)
擴(kuò)展模型:支持個(gè)性化或少量應(yīng)用需要
比如:mlog的分享引入,只有在做增長時(shí)才需要,需要拆開成立專門的分享引入模型
1.3公共處理邏輯下沉及單一
越是底層公用的處理邏輯越應(yīng)該在數(shù)據(jù)調(diào)度依賴的底層進(jìn)行封裝與實(shí)現(xiàn),不要讓公用的處理邏輯暴露給應(yīng)用層實(shí)現(xiàn),不要讓公共邏輯多處同時(shí)存在。
1.4成本與性能平衡
適當(dāng)?shù)臄?shù)據(jù)冗余可換取查詢和刷新性能,不宜過度冗余與數(shù)據(jù)復(fù)制。
1.5數(shù)據(jù)可回滾
處理邏輯不變,在不同時(shí)間多次運(yùn)行數(shù)據(jù)結(jié)果確定不變。
1.6一致性
具有相同含義的字段在不同表中的命名必須相同,必須使用規(guī)范定義中的名稱。
1.7命名清晰、可理解
表命名需清晰、一致,表名需易于用戶理解和使用。
2.事實(shí)表設(shè)計(jì)方法
2.1選擇業(yè)務(wù)過程及確定事實(shí)表類型
事實(shí)表類型:
1)單事務(wù)事實(shí)表:單個(gè)業(yè)務(wù)過程
2)多事務(wù)事實(shí)表:多個(gè)業(yè)務(wù)過程放在一個(gè)事實(shí)表中
①原則:
業(yè)務(wù)過程是否有相似性?
是否來源同一業(yè)務(wù)源系統(tǒng)?
用戶使用的學(xué)習(xí)成本哪種更低?
計(jì)算和存儲(chǔ)成本是否會(huì)降低?
②方式
不同的業(yè)務(wù)過程使用不同的事實(shí)字段進(jìn)行存放
不同業(yè)務(wù)過程的事實(shí)使用同一個(gè)事實(shí)字段進(jìn)行存放,但增加一個(gè)業(yè)務(wù)過程標(biāo)簽
2.2聲明粒度(非常重要)
粒度傳遞的是與事實(shí)表度量有關(guān)的細(xì)節(jié)層次,精確定義事實(shí)表每一行所代表的業(yè)務(wù)含義
盡量選擇最細(xì)級(jí)別的原子粒度,以確保事實(shí)表的應(yīng)用具有最大的靈活性。
2.3確定維度:應(yīng)該選擇能夠描述清楚業(yè)務(wù)過程所處的環(huán)境的維度信息。
2.4確定事實(shí):
應(yīng)該選擇與業(yè)務(wù)過程有關(guān)的所有事實(shí)
事實(shí)的粒度要與所聲明的事實(shí)表的粒度一致
2.5冗余維度:
冗余下游用戶方便使用的常用維度:常用的用于統(tǒng)計(jì)的維度屬性
冗余原則
不冗余查詢速度是不是很慢
存儲(chǔ)資源是不是夠
查詢頻率是不是很多
冗余在哪一模型層的事實(shí)表中:明細(xì)層、輕度匯總層?
3.維度設(shè)計(jì)的基本方法
選擇維度和新建維度
確定主維表
確定相關(guān)維表
確定維度屬性:從主維表和相關(guān)維表中抽取
盡可能生成豐富的維度屬性
盡可能多地給出包括一些富有意義的文字性描述,例如名稱等
區(qū)分?jǐn)?shù)值型屬性和事實(shí):看用途
盡量沉淀出通用的維度屬性
維度設(shè)計(jì)遵循的通用原則:反范式、扁平化
根據(jù)前面介紹的方法論,云音樂社區(qū)mlog內(nèi)容線的部分模型架構(gòu)如下:

維表:一張mlog主維表
mlog互動(dòng)行為輕度匯總表:mlog的互動(dòng)行為合并,因?yàn)榫哂邢嗤沫h(huán)境信息
流量輕度匯總表:曝光點(diǎn)擊瀏覽合并,環(huán)境信息相似
歷史累計(jì)指標(biāo)單獨(dú):運(yùn)行方式解耦
1d/3d/7d/28d指標(biāo):合并,運(yùn)行時(shí)間不影響,不解耦
上述提到的模型分層、建模流程和建模方法論,在團(tuán)隊(duì)內(nèi)部形成了較為穩(wěn)定的規(guī)范,并在團(tuán)隊(duì)內(nèi)部得到大力推廣。好的規(guī)范離不開產(chǎn)品功能的加持,網(wǎng)易有數(shù)大數(shù)據(jù)平臺(tái)的模型設(shè)計(jì)中心基于網(wǎng)易內(nèi)部多個(gè)團(tuán)隊(duì)的數(shù)倉建設(shè)經(jīng)驗(yàn),將數(shù)倉建模實(shí)踐經(jīng)驗(yàn)和方法論進(jìn)行了產(chǎn)品化,為云音樂數(shù)倉團(tuán)隊(duì)落地內(nèi)部規(guī)范、完成數(shù)倉建模方面提供了極大的幫助。

云音樂數(shù)倉團(tuán)隊(duì)和網(wǎng)易有數(shù)產(chǎn)品也會(huì)更加緊密合作,把更多實(shí)踐經(jīng)驗(yàn)和建設(shè)指導(dǎo),輸出給模型設(shè)計(jì)中心,讓模型設(shè)計(jì)中心幫助更多數(shù)據(jù)團(tuán)隊(duì)完成自身數(shù)據(jù)中臺(tái)的搭建。如需了解更多關(guān)于模型設(shè)計(jì)中心的更多內(nèi)容,歡迎在下方留言~
