數(shù)據(jù)架構(gòu)重構(gòu)

去年激挪,對(duì)產(chǎn)品的數(shù)據(jù)架構(gòu)進(jìn)行了一次較大規(guī)模的重構(gòu)拗秘。通過這次重構(gòu)圣絮,大幅提升了整體性能和數(shù)據(jù)質(zhì)量。在此雕旨,把這次數(shù)據(jù)架構(gòu)重構(gòu)的過程和心得總結(jié)一下扮匠,為以后數(shù)據(jù)架構(gòu)設(shè)計(jì)提供些參考……

一、總體概況

根據(jù)“金字塔”原理凡涩,結(jié)論先行棒搜,先拋出重構(gòu)前后的數(shù)據(jù)架構(gòu):


重構(gòu)前后數(shù)據(jù)架構(gòu)對(duì)比圖

二、重構(gòu)前存在的問題

我們的大數(shù)據(jù)應(yīng)用活箕,經(jīng)歷了較長(zhǎng)時(shí)間的野蠻生長(zhǎng)力麸。這期間的主要思想是,各應(yīng)用獨(dú)立發(fā)展育韩,互不影響克蚂。在這個(gè)思想的指導(dǎo)下,形成了之前的數(shù)據(jù)架構(gòu)(如上圖左):從原始表生成面向應(yīng)用的主題表數(shù)據(jù)筋讨。

然而埃叭,隨著應(yīng)用越來越多,應(yīng)用之間相互關(guān)聯(lián)悉罕、互相依賴的情況也越來越多赤屋,產(chǎn)生了一系列的問題:

  1. 使用難:主題表是由領(lǐng)域應(yīng)用驅(qū)動(dòng)設(shè)計(jì)的,定制性比較強(qiáng)壁袄,沒有很好地考慮擴(kuò)展和通用性类早,需求變化就很難重用∈嚷撸基于這些表進(jìn)行再次匯聚涩僻、關(guān)聯(lián)都比較困難。

  2. 質(zhì)量差:相同指標(biāo)在不同領(lǐng)域中的算法不統(tǒng)一,常存在數(shù)據(jù)一致性問題逆日,數(shù)據(jù)質(zhì)量差恼琼。

  3. 性能低: 所有的主題表都需要從原始表開始處理,不同主題數(shù)據(jù)之間存在很多相似的重復(fù)計(jì)算屏富,整體性能低下。

  4. 開發(fā)慢: 應(yīng)用需求的變化導(dǎo)致主題表結(jié)構(gòu)頻繁變化蛙卤,并且需要從原始表重新處理狠半,改動(dòng)大,響應(yīng)需求慢颤难。

三神年、問題的解決之道

1. 表模型難以使用的解決之道——維度建模

重構(gòu)之前的表模型難以使用,主要原因有:

  • 主題表由各應(yīng)用的研發(fā)人員根據(jù)特定的需求而設(shè)計(jì)行嗤,很少考慮與別的應(yīng)用的通用性已日,造成相似的表很難共享;
  • 主題表設(shè)計(jì)中栅屏,沒有很好的關(guān)注粒度和度量的可加性飘千。存在在同一行數(shù)據(jù)中,包含不同粒度的數(shù)據(jù)的情況(比如栈雳,在小時(shí)粒度的一行數(shù)據(jù)中护奈,存在記錄一天呼叫次數(shù)的字段),以及只包含不可加度量的情況(比如哥纫,只包含成功率字段霉旗,但是沒有成功次數(shù)和總次數(shù)),這使得從這些表進(jìn)行再次聚合變得很困難蛀骇。
  • 主題表的設(shè)計(jì)中厌秒,沒有很好的關(guān)注維度一致性。比如擅憔,同樣是表示小區(qū)鸵闪,有的表中用enodeb+cellid,有的表中用cellkey雕欺,這使得關(guān)聯(lián)這些表變得很困難岛马。

以上這些問題,可以用維度建模的方法屠列,很好地解決啦逆。維度建模不是一個(gè)新技術(shù),是早期數(shù)據(jù)倉庫普遍使用的一種建模方法笛洛。在維度建模的世界里夏志,世界被分為兩部分:

  • 事實(shí):是現(xiàn)實(shí)世界各事件的度量。
  • 維度:用于描述事件的環(huán)境。誰沟蔑、什么湿诊、何處、何時(shí)瘦材、為什么厅须、如何等。

維度模型設(shè)計(jì)過程主要關(guān)注四個(gè)方面:

① 業(yè)務(wù)過程
② 粒度
③ 維度
④ 度量

更多關(guān)于維度建模的方法這里不再詳述食棕,這里主要講下是如何使用維度建模解決問題的:

  • 面向業(yè)務(wù)過程設(shè)計(jì)模型取代面向領(lǐng)域應(yīng)用設(shè)計(jì)模型朗和,解決了表模型的通用性問題。由于原始數(shù)據(jù)來源于某些具體的業(yè)務(wù)過程(比如呼叫建立簿晓、呼叫釋放等等)眶拉,這些業(yè)務(wù)過程是相對(duì)穩(wěn)定的,面向業(yè)務(wù)過程設(shè)計(jì)可以使得模型更穩(wěn)定憔儿。具體的領(lǐng)域應(yīng)用可以通過把相關(guān)的業(yè)務(wù)過程數(shù)據(jù)關(guān)聯(lián)起來構(gòu)建應(yīng)用所需的數(shù)據(jù)忆植,因此,這些模型也更通用谒臼,適合不同領(lǐng)域應(yīng)用之間共享朝刊。
  • 關(guān)注粒度和度量可加性。對(duì)于一個(gè)表模型的設(shè)計(jì)屋休,必須明確確定它的粒度坞古,即表中的一行表示的是什么,度量必須與粒度保持一致(如劫樟,小時(shí)粒度痪枫,即一個(gè)小時(shí)一行記錄,這行中的所有度量必須是這個(gè)小時(shí)的度量叠艳,而不應(yīng)該包含一天的度量)奶陈。度量按照其可加性,可分為完全可加附较、半可加和不可加吃粒。具有完全可加性的度量可以更好的支持匯聚。對(duì)于不可加的度量(如成功率)拒课,在表設(shè)計(jì)時(shí)要保留它的可加分量(如成功次數(shù)和總次數(shù))徐勃。這樣設(shè)計(jì)出來的表模型,就具備了很好的再次聚合的能力早像。
  • 一致性維度僻肖,構(gòu)建數(shù)據(jù)總線:當(dāng)各個(gè)不同的業(yè)務(wù)過程,具有一致的維度時(shí)卢鹦,這些維度就像構(gòu)建了一個(gè)總線臀脏,各個(gè)模型可以很方便的掛載到總線上,相互之間可以方便地進(jìn)行關(guān)聯(lián)。

2. 數(shù)據(jù)質(zhì)量差的解決之道——數(shù)據(jù)標(biāo)準(zhǔn)

重構(gòu)之前數(shù)據(jù)質(zhì)量差主要表現(xiàn)在數(shù)據(jù)不一致上揉稚。比如同樣是掉話率指標(biāo)秒啦,有的應(yīng)用上看是1%,有的是1.1%搀玖。究其原因余境,最主要是因?yàn)槿狈?biāo)準(zhǔn)。同樣的指標(biāo)灌诅,在不同領(lǐng)域內(nèi)的算法不一致葛超。比如有的掉話率算法是:掉話總數(shù)/釋放總次數(shù);有的掉話率算法是:掉話次數(shù)/呼叫總次數(shù)延塑。而呼叫總次數(shù)并不等于釋放總次數(shù)。

為解決數(shù)據(jù)質(zhì)量問題答渔,我們定義了一套標(biāo)準(zhǔn)體系关带。由這些標(biāo)準(zhǔn),指導(dǎo)每個(gè)表模型及其算法的設(shè)計(jì)沼撕,如下:


  • 業(yè)務(wù)域:分為三級(jí)宋雏。將所有涉及的業(yè)務(wù)過程劃分到不同業(yè)務(wù)域中。比如:無線-4G-連接建立業(yè)務(wù)過程务豺。
  • 術(shù)語:是原始的度量(有的地方也叫原子指標(biāo))磨总。比如:信號(hào)強(qiáng)度。
  • 約束條件:是對(duì)術(shù)語的一個(gè)修飾笼沥。比如:有效信號(hào)強(qiáng)度(a < 信號(hào)強(qiáng)度 < b)
  • 基礎(chǔ)指標(biāo):約束條件蚪燕、術(shù)語再加上一個(gè)聚合函數(shù)(count、sum)就形成一個(gè)基礎(chǔ)指標(biāo)奔浅。比如:有效信號(hào)強(qiáng)度上報(bào)的次數(shù)馆纳。基礎(chǔ)指標(biāo)一般具有完全可加性汹桦。
  • 復(fù)合指標(biāo):由基礎(chǔ)指標(biāo)計(jì)算得到的指標(biāo)鲁驶,一般是百分比、比率舞骆、平均值等钥弯。如有效信號(hào)平均強(qiáng)度。復(fù)合指標(biāo)一般不具備可加性督禽。表模型設(shè)計(jì)時(shí)脆霎,要注意保留構(gòu)成復(fù)合指標(biāo)的可加分量,這樣的表模型才具備更好的再次聚合能力赂蠢。
  • 公共維度:定義了維度主鍵绪穆、維度屬性的標(biāo)準(zhǔn)。

公共維度指導(dǎo)維度表模型的設(shè)計(jì);維度+術(shù)語指導(dǎo)事實(shí)詳單表的設(shè)計(jì)玖院;維度+基礎(chǔ)指標(biāo)以及復(fù)合指標(biāo)指導(dǎo)聚集表的設(shè)計(jì)菠红。

有了這一系列的標(biāo)準(zhǔn),每個(gè)模型以及其算法都是規(guī)范的难菌,可審計(jì)的试溯。此外,我們還實(shí)現(xiàn)了根據(jù)指標(biāo)標(biāo)準(zhǔn)郊酒,自動(dòng)生成聚集表算法的工具遇绞,強(qiáng)化了標(biāo)準(zhǔn)的切實(shí)落地。

3. 數(shù)據(jù)處理性能低的解決之道——數(shù)據(jù)共享

重構(gòu)之前燎窘,性能優(yōu)化做了很多輪摹闽,單個(gè)任務(wù)的性能問題基本都解決了,但整體性能仍然不高……究其原因褐健,主要是因?yàn)閿?shù)據(jù)無法共享付鹿,各應(yīng)用間存在大量相似地重復(fù)計(jì)算,耗費(fèi)了大量計(jì)算和存儲(chǔ)資源蚜迅。此外舵匾,由于原來表設(shè)計(jì)難以使用,常造成本應(yīng)很簡(jiǎn)單算法谁不,實(shí)現(xiàn)卻異常復(fù)雜坐梯,性能低下。

解決性能問題是本次數(shù)據(jù)架構(gòu)重構(gòu)的最根本驅(qū)動(dòng)力刹帕。畢竟吵血,性能差意味著服務(wù)器就要多,服務(wù)器就是白花花的銀子啊……

解決性能問題偷溺,最根本的是構(gòu)建數(shù)據(jù)共享層践瓷。重構(gòu)后的數(shù)據(jù)架構(gòu)中的DWD和DWS兩層,就是數(shù)據(jù)共享層亡蓉。上層應(yīng)用都基于這些共享的數(shù)據(jù)進(jìn)一步計(jì)算晕翠,避免了以前大量的重復(fù)計(jì)算和存儲(chǔ)。性能得到了大幅提升砍濒。

此外淋肾,在本次重構(gòu)過程中,個(gè)人比較得意的另一項(xiàng)工作是開發(fā)一個(gè)SQL靜態(tài)檢查工具爸邢。對(duì)SQL進(jìn)行語法解析和語義分析樊卓,構(gòu)建表的血緣和字段血緣。這樣掃描出大量無用字段杠河、無用表碌尔、無用任務(wù)等浇辜。清掃這些垃圾,使得性能也有了一定改善唾戚。同時(shí)柳洋,SQL靜態(tài)檢查中集成了一些性能編碼最佳實(shí)踐的規(guī)則(比如,要使用partition對(duì)數(shù)據(jù)進(jìn)行過濾)叹坦,可以對(duì)SQL編碼的性能問題起到一定的防范作用熊镣。關(guān)于這個(gè)工具,以后有時(shí)間再單獨(dú)介紹募书。

4. 數(shù)據(jù)開發(fā)慢的解決之道——數(shù)據(jù)分層

原來數(shù)據(jù)開發(fā)慢绪囱,除了很多相似的重復(fù)開發(fā)導(dǎo)致的慢以外,另一個(gè)主要原因是一個(gè)需求需要一個(gè)研發(fā)人員從原始數(shù)據(jù)開始從頭處理生成最終的主題表莹捡,這條鏈路很漫長(zhǎng)鬼吵,并且不便于分工合作。

解決這個(gè)問題的主要方法是建立數(shù)據(jù)分層篮赢。對(duì)模型進(jìn)行分層而柑,可以做到關(guān)注點(diǎn)分離,這帶來一系列好處:

  1. 可以簡(jiǎn)化問題:由于每層關(guān)注點(diǎn)不同荷逞,可以將一個(gè)復(fù)雜的任務(wù),按固定模式和套路粹排,分解為的幾個(gè)部分种远。每一層只關(guān)注自己相關(guān)的部分,整個(gè)系統(tǒng)會(huì)比較簡(jiǎn)單和容易理解顽耳。
  2. 便于數(shù)據(jù)維護(hù):當(dāng)數(shù)據(jù)出現(xiàn)問題之后坠敷,問題的定位和修復(fù),可以分層來做射富。而不用“眉毛胡子一把抓”膝迎。
  3. 有利于數(shù)據(jù)共享:數(shù)據(jù)分層后,可以將共享的數(shù)據(jù)限制在一定層級(jí)之內(nèi)胰耗。

此外限次,對(duì)于本次數(shù)據(jù)架構(gòu)重構(gòu),分層還有一個(gè)重要作用——可以使得重構(gòu)的過程可按層級(jí)柴灯,逐步進(jìn)行卖漫。這也一定程度上減少了此次重構(gòu)的壓力。

數(shù)據(jù)分層赠群,簡(jiǎn)化了開發(fā)和維護(hù)的工作羊始,使得各研發(fā)可以很好的合作,并行開發(fā)查描。

同時(shí)突委,由于數(shù)據(jù)標(biāo)準(zhǔn)的建立柏卤,使得DWD層到DWS層的算法自動(dòng)生成成為可能。做到了設(shè)計(jì)即開發(fā)匀油,進(jìn)一步提升了開發(fā)的效率缘缚。

四、重構(gòu)后的數(shù)據(jù)分層架構(gòu)

綜合以上各種問題的解決之道钧唐,本次重構(gòu)最終形成的數(shù)據(jù)分層架構(gòu)如下圖:

1. 原始數(shù)據(jù)層ODS(Operation Data Store): 是入庫的原始數(shù)據(jù)表忙灼。此層無需太多設(shè)計(jì),只需要保留最原始的數(shù)據(jù)即可钝侠。

2. 詳單數(shù)據(jù)層DWD(Data Warehouse Detail):是以不同的業(yè)務(wù)過程為劃分该园,建立的語義統(tǒng)一、粒度一致帅韧、維度和度量齊全的事實(shí)詳單寬表里初。此層是本數(shù)據(jù)架構(gòu)中最重要的一層。成功構(gòu)建此層的關(guān)鍵在于維度建模和數(shù)據(jù)標(biāo)準(zhǔn)忽舟。要嚴(yán)格按照維度建模的四個(gè)步驟來設(shè)計(jì)表模型:①選擇業(yè)務(wù)過程双妨;②聲明粒度;③確定維度叮阅;④確定事實(shí)刁品。要對(duì)所有的維度和事實(shí)(術(shù)語)進(jìn)行標(biāo)準(zhǔn)化定義。同時(shí)浩姥,為了提高性能挑随,減少后期的關(guān)聯(lián)操作引入的開銷,此層中的表可以把部分常用維度屬性退化到此表中勒叠,并且盡可能包含此業(yè)務(wù)過程中的所有度量兜挨。

3. 聚集數(shù)據(jù)層DWS(Data Warehouse Summary):是按照不同維度對(duì)詳單進(jìn)行匯聚,形成包含各種指標(biāo)的聚集數(shù)據(jù)表眯分。成功構(gòu)建此層的關(guān)鍵在于維度標(biāo)準(zhǔn)和指標(biāo)標(biāo)準(zhǔn)拌汇。有了這兩個(gè)標(biāo)準(zhǔn)為指導(dǎo),可以構(gòu)建出自動(dòng)生成算法的工具弊决,實(shí)現(xiàn)設(shè)計(jì)即開發(fā)噪舀。

4. 應(yīng)用數(shù)據(jù)層ADS(Application Data Store):是為不同應(yīng)用定制開發(fā)的應(yīng)用數(shù)據(jù)表。應(yīng)用根據(jù)需求可靈活組合多個(gè)DWS或DWD表來構(gòu)建ADS表飘诗。

5. 公共維度層CDS(Common Dimension Store):是按照維度標(biāo)準(zhǔn)構(gòu)建的一致性維度表傅联。維度表是維度建模的靈魂,也是本數(shù)據(jù)架構(gòu)的靈魂疚察。正是有了這些一致性維度蒸走,才使得不同域的數(shù)據(jù)可以相互關(guān)聯(lián)。每個(gè)維表都應(yīng)該有一個(gè)唯一的主鍵以及一系列的維度屬性貌嫡。與維度建模要求不同的是比驻,本次重構(gòu)中该溯,維度主鍵并沒有使用代理鍵,而是使用業(yè)務(wù)系統(tǒng)的自然鍵别惦。這么做的主要原因是在分布式系統(tǒng)中生成代理鍵太復(fù)雜狈茉,并且在大數(shù)據(jù)情況下將自然鍵替換成代理鍵的開銷太大。

五掸掸、總結(jié)

本次數(shù)據(jù)架構(gòu)重構(gòu)的核心是維度建模氯庆。以維度建模方法論為指導(dǎo),通過建立完善的數(shù)據(jù)標(biāo)準(zhǔn)體系扰付,成功地把原來混亂的數(shù)據(jù)架構(gòu)重構(gòu)為最終層級(jí)清晰的數(shù)據(jù)架構(gòu)堤撵。通過此次重構(gòu),產(chǎn)品性能提升2到3倍羽莺,數(shù)據(jù)質(zhì)量有了大幅提升实昨,開發(fā)效率也得以提高。

此次數(shù)據(jù)架構(gòu)重構(gòu)能夠比較成功地實(shí)現(xiàn)盐固,個(gè)人總結(jié)有以下幾個(gè)原因:

  1. 合適的數(shù)據(jù)建模方法論——維度建模荒给。
  2. 業(yè)務(wù)專家全程參與數(shù)據(jù)標(biāo)準(zhǔn)制定。
  3. 分層的架構(gòu)刁卜,有利于分離關(guān)注點(diǎn)志电,逐層重構(gòu)可減小影響。
  4. 自動(dòng)化工具對(duì)提升效率的幫助蛔趴。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挑辆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夺脾,更是在濱河造成了極大的恐慌,老刑警劉巖茉继,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咧叭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡烁竭,警方通過查閱死者的電腦和手機(jī)菲茬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來派撕,“玉大人婉弹,你說我怎么就攤上這事≈蘸穑” “怎么了镀赌?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)际跪。 經(jīng)常有香客問我商佛,道長(zhǎng)喉钢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任良姆,我火速辦了婚禮肠虽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘玛追。我一直安慰自己税课,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布痊剖。 她就那樣靜靜地躺著韩玩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邢笙。 梳的紋絲不亂的頭發(fā)上啸如,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音氮惯,去河邊找鬼叮雳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妇汗,可吹牛的內(nèi)容都是我干的帘不。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杨箭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼寞焙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起互婿,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤捣郊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后慈参,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呛牲,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年驮配,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娘扩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壮锻,死狀恐怖琐旁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猜绣,我是刑警寧澤灰殴,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站掰邢,受9級(jí)特大地震影響验懊,放射性物質(zhì)發(fā)生泄漏擅羞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一义图、第九天 我趴在偏房一處隱蔽的房頂上張望减俏。 院中可真熱鬧,春花似錦碱工、人聲如沸娃承。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽历筝。三九已至,卻和暖如春廊谓,著一層夾襖步出監(jiān)牢的瞬間梳猪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工蒸痹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留春弥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓叠荠,卻偏偏與公主長(zhǎng)得像匿沛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榛鼎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容