<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          網(wǎng)易云音樂數(shù)倉維度建模實(shí)踐-模型設(shè)計(jì)篇

          共 3448字,需瀏覽 7分鐘

           ·

          2021-04-07 19:56


          數(shù)倉模型架構(gòu)搭建、模型設(shè)計(jì)是整個(gè)數(shù)倉建設(shè)的核心部分。數(shù)倉建模的價(jià)值體現(xiàn)在:數(shù)據(jù)質(zhì)量、健壯水平、資源消耗、服務(wù)響應(yīng)速度。



          寫在前面:我們?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ì)量、高效率、低成本。




          一、搭建模型架構(gòu)


          這一環(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è)方向:

          1. 數(shù)據(jù)域的劃分特點(diǎn) 

          2. 業(yè)務(wù)的復(fù)雜度,各業(yè)務(wù)線、業(yè)務(wù)過程之間的區(qū)別和聯(lián)系,用戶在各業(yè)務(wù)線的特點(diǎn)和關(guān)系,業(yè)務(wù)數(shù)據(jù)體量,解耦因素等等。

          3. 指標(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):


          主要思路是:

          1. 各內(nèi)容業(yè)務(wù)線各自獨(dú)立建設(shè)內(nèi)容和用戶類指標(biāo),按照上面架構(gòu)圖分?jǐn)?shù)據(jù)域逐步建設(shè)

          2. 輕度匯總表和中度匯總表都是用戶實(shí)體+內(nèi)容實(shí)體+退化維模式。輕度匯總表基本涵蓋大部分需求場(chǎng)景

          3. 重度匯總表要么是單實(shí)體,要么是用戶+內(nèi)容雙實(shí)體組成,且不包含退化維

          4. 重度匯總表分為增量表和全量表,增量包含近1/3/7/30天時(shí)間周期的指標(biāo),全量表計(jì)算歷史累計(jì)指標(biāo)。這么做的目的是在計(jì)算人數(shù)類指標(biāo)和計(jì)算資源之間做了平衡。

          5. 每個(gè)內(nèi)容業(yè)務(wù)線最后都有自己內(nèi)容大寬表和維表

          6. 用戶指標(biāo)拆分到具體的內(nèi)容業(yè)務(wù)線上,各自獨(dú)立建設(shè)用戶業(yè)務(wù)寬表,做到充分解耦,以滿足各自場(chǎng)景需求

          7. 用戶維表采用先分后總模型:先建設(shè)不受業(yè)務(wù)數(shù)據(jù)干擾的公用基礎(chǔ)維表+各業(yè)務(wù)線用戶維表,強(qiáng)解耦,保持獨(dú)立,再建設(shè)全域用戶維表




          二、建模流程


          定下數(shù)倉的基調(diào),即模型架構(gòu)后。接下來就要開始進(jìn)行具體單個(gè)模型的設(shè)計(jì)了。具體建模流程按照下面流程進(jìn)行:




           三、模型設(shè)計(jì)方法論


          有了模型體系架構(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ì)遵循的通用原則:反范式、扁平化

            



          四、實(shí)例介紹


          根據(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í)間不影響,不解耦




          五、總結(jié)


          上述提到的模型分層、建模流程和建模方法論,在團(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)容,歡迎在下方留言~

          瀏覽 101
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  激情网站五月天 | 色婷婷精品国产免费 | A∨视频在线免费观看 | AV电影亚洲 | 97超碰人人操人人 |