蘇寧數(shù)據(jù)倉庫應(yīng)對數(shù)據(jù)爆發(fā)式增長的技術(shù)演進(jìn)
原創(chuàng)【51CTO.com原創(chuàng)稿件】為什么需要數(shù)據(jù)倉庫
隨著公司業(yè)務(wù)不斷發(fā)展,數(shù)據(jù)種類和存儲呈現(xiàn)爆發(fā)式增長,繁多的業(yè)務(wù)數(shù)據(jù)如何被各業(yè)務(wù)中心分析和使用,如何有效組織和管理大量業(yè)務(wù)數(shù)據(jù),減少大數(shù)據(jù)平臺相近邏輯重復(fù)計算、相近數(shù)據(jù)重復(fù)存儲,都將面臨巨大挑戰(zhàn)。
數(shù)據(jù)倉庫層次架構(gòu)
數(shù)據(jù)倉庫層次整體劃分為三層:近源數(shù)據(jù)層、整合數(shù)據(jù)層和應(yīng)用數(shù)據(jù)層,如下圖:
近源數(shù)據(jù)層
近源層是數(shù)據(jù)倉庫拷貝源數(shù)據(jù)提供整合的數(shù)據(jù)存儲區(qū)域,粒度、結(jié)構(gòu)和源系統(tǒng)保持相同
- 緩沖區(qū):保存源系統(tǒng)每天的增量數(shù)據(jù),可根據(jù)應(yīng)用需要保留適當(dāng)歷史周期的數(shù)據(jù),不長期保存數(shù)據(jù)
- 操作區(qū):存儲數(shù)據(jù)倉庫最細(xì)節(jié)數(shù)據(jù),按照業(yè)務(wù)源系統(tǒng)分類劃分;對數(shù)據(jù)做結(jié)構(gòu)化處理,完整保留所有細(xì)節(jié)數(shù)據(jù)。
近源層是整個數(shù)據(jù)倉庫中數(shù)據(jù)量***的部分。
整合數(shù)據(jù)層
- 明細(xì)區(qū):采用維度建模方法,整合近源層數(shù)據(jù),進(jìn)行適度的反范式設(shè)計明細(xì)事實數(shù)據(jù)表。
- 匯總區(qū):根據(jù)應(yīng)用層和其他下游系統(tǒng)取數(shù)需要,對明細(xì)事實數(shù)據(jù)進(jìn)行適度匯總,提升取數(shù)性能。
- 維度區(qū):數(shù)倉統(tǒng)一維度數(shù)據(jù)模型。
應(yīng)用數(shù)據(jù)層
應(yīng)用數(shù)據(jù)層為個性化匯總層,針對不是很通用統(tǒng)計維度、指標(biāo)存放在此層中,本層計算通常只有自身業(yè)務(wù)關(guān)注的維度和指標(biāo),和其他業(yè)務(wù)線一般無交集 。
數(shù)據(jù)建模
數(shù)據(jù)建模是數(shù)據(jù)倉庫中的核心工作,蘇寧數(shù)據(jù)建模主要采用的kimball維度建模方法,建模主要分兩塊,維度表設(shè)計和事實表設(shè)計。
維度表設(shè)計
維度是數(shù)據(jù)倉庫的核心,他提供了數(shù)據(jù)分析的視角和標(biāo)準(zhǔn),大部分的維度表數(shù)據(jù)量都相對較小,但是他是整個數(shù)據(jù)倉庫的核心,整個的數(shù)據(jù)建模都是圍繞著維度來建設(shè)。
維度表主鍵
維度表在數(shù)據(jù)倉庫中有不可替代的重要地位,因此維度表主鍵的確認(rèn)也尤其重要,維度表的主鍵用于和事實表做關(guān)聯(lián)使用,所以維度表主鍵也為事實表的外鍵,維表主鍵可由有業(yè)務(wù)含義的自然鍵組成;也可由無意義的代理建組成,比如使用流水號、自然鍵+日期等方式。
維表相對靜態(tài)、不隨時間變化直接使用自然鍵作為主鍵,比如:業(yè)務(wù)狀態(tài)碼、性別、城市省份等不會隨著時間改變而改變主鍵對應(yīng)業(yè)務(wù)含義,一般直接使用業(yè)務(wù)自然鍵作為主鍵;維表隨著時間的變化而產(chǎn)生變化需要考慮使用代理鍵作為主鍵。蘇寧門店代碼,會因為組織法人等信息變更,生門店代碼會發(fā)生變化,對應(yīng)主鍵的業(yè)務(wù)含義會隨著時間的變化而改變,使用一個代理鍵和業(yè)務(wù)門店代碼映射,可以識別歷史和當(dāng)前不通的門店代碼為一個門店。
實際使用過程中,由于在大數(shù)據(jù)平臺中生成穩(wěn)定代理鍵和自然鍵關(guān)系比較復(fù)雜,一般使用流水號代理鍵使用非常少。
維度反規(guī)范化處理
在OLTP系統(tǒng)中,一般表設(shè)計都遵循3NF等規(guī)范化要求要求建立數(shù)據(jù)模型,這個可以有效避免數(shù)據(jù)冗余以及數(shù)據(jù)不一致性,如下圖:
然而在OLAP系統(tǒng)中,使用規(guī)范化,會導(dǎo)致數(shù)據(jù)表關(guān)聯(lián)操作多、性能差,在OLAP系統(tǒng)中,數(shù)據(jù)是相對穩(wěn)定的,此時往往會采用反規(guī)范化處理,根據(jù)分析需要建立對應(yīng)維度寬表,降低模型查詢復(fù)雜度,提升批處理查詢性能。如下圖:
維度的合并和拆分
合并:
- 相同范圍數(shù)據(jù),對應(yīng)多張表存儲屬性不同,根據(jù)維度分析需要整合至一張維度表中,整合后減少事實表和維度表關(guān)聯(lián)次數(shù),方便數(shù)據(jù)分析和加快數(shù)據(jù)統(tǒng)計計算。
- 不同數(shù)據(jù)范圍,對應(yīng)多張表存儲信息,根據(jù)維度分析需要將相同屬性整合到一張表中,不同表中差異化的數(shù)據(jù)整合到各自數(shù)據(jù)表中。
拆分:
- 根據(jù)屬性的使用頻率、屬性變化程度、屬性數(shù)據(jù)計算產(chǎn)生時間等角度分析多維度屬性做適當(dāng)拆分,常用的信息在一張表中,對異變、冷門屬性拆分到另外一張表中,對出數(shù)比較晚的數(shù)據(jù)也做單獨拆分,可以盡可能保障主數(shù)據(jù)模型出數(shù)穩(wěn)定和提前出數(shù)時間。如下圖:
- 根據(jù)業(yè)務(wù)細(xì)分或者業(yè)務(wù)數(shù)據(jù)使用熱度進(jìn)行拆分,例如蘇寧商品目前已經(jīng)到十億+級別數(shù)據(jù)量,其中很大一部分商品已經(jīng)不在售賣,不會產(chǎn)生流量和交易,可以將近N月產(chǎn)生流量或交易數(shù)據(jù)分別建立維度表,減少事實表和維度表關(guān)聯(lián)系統(tǒng)消耗。如下圖:
需要結(jié)合業(yè)務(wù)數(shù)據(jù)情況和數(shù)據(jù)分析要求,合理使用合并和拆分方法。
緩慢變化維
緩慢變化主要是解決記錄數(shù)據(jù)倉庫中數(shù)據(jù)歷史變化,實際根據(jù)業(yè)務(wù)需要我們會有多種處理方式。
以會員會員張三舉例,9月1日前公司地址為南京市玄武區(qū)蘇寧大道一號總部一期;9月2日由原公司地址總部一期變更為總部二期,對應(yīng)多種處理方式包含覆蓋方式、新增列方式和新增行方式,下面對每種方式處理方法單獨介紹。
- 覆蓋方式:維度屬性的變化,維度舊的屬性總是被新值所覆蓋,不保留歷史狀態(tài)數(shù)據(jù),當(dāng)數(shù)據(jù)不需要保留歷史記錄,不需要執(zhí)行以前的報表,可以采取此方式。如下圖:
- 新增列方式:新增數(shù)據(jù)列記錄對應(yīng)列數(shù)據(jù)變化前數(shù)據(jù),可以記錄指定列數(shù)據(jù)變化情況。如下圖:
- 新增行方式:當(dāng)維度數(shù)據(jù)發(fā)生變更,維度表新增一條維度記錄,并且分配新的代理主鍵,通常配合有效開始時間、有效結(jié)束時間、有效標(biāo)識使用。如下圖:
快照維度表
在實際大數(shù)據(jù)平臺開發(fā)過程中,產(chǎn)生唯一代理鍵和生成緩慢變化為拉鏈表是比較困難和復(fù)雜的,在很多實際的場景中是基于計算周期,每個周期生成一份快照表,保留每個周期的快照數(shù)據(jù),采用快照表方式維護簡單使用也比較方便,弊端也很明顯浪費存儲,在數(shù)據(jù)量不是特別大的情況下使用此方式還是比較合適的。
層次維表
通常維度之間往往存在層次關(guān)系,關(guān)系的層級可能是固定的,也可能是不固定的
- 固定深度層級:比如蘇寧采購目錄層級關(guān)系,表現(xiàn)為固定四級層級關(guān)系,為提高查詢性能,將表設(shè)置為固定四層寬表。如下圖:
- 深度輕微差別層級:比如蘇寧銷售目錄關(guān)系,表現(xiàn)為三到五級層級關(guān)系,層級關(guān)系不固定,但層級深度有限,可以基于***深度和業(yè)務(wù)規(guī)則建立維度表。如下圖:
- 深度可變層級:對于深度層級不確定維表,在建模和使用都相對較復(fù)雜,可以采用橋接表方式,對每個可能的路徑保留一行,確保能遍歷所有層次。還以銷售目錄舉例,如下圖:
由上圖可見,橋接表加工處理比較復(fù)雜,且?guī)黼p算的隱患,實際模型設(shè)計中,多選擇扁平化模型設(shè)計方法來解決業(yè)務(wù)問題。
事實表設(shè)計
維度模型設(shè)計過程
- 選擇業(yè)務(wù)過程:業(yè)務(wù)過程由組織完成的微觀活動。例如易購交易過程包含:下單、支付、發(fā)貨、收貨、退貨等,明確了業(yè)務(wù)過程根據(jù)業(yè)務(wù)需求選擇和建模有關(guān)的業(yè)務(wù)過程。
- 申明粒度:確認(rèn)事實表中每一行數(shù)據(jù)的準(zhǔn)確粒度,以交易過程舉例,對應(yīng)粒度為交易時間、會員、商家、商品,申請粒度和主鍵(單號)等價,不要以數(shù)據(jù)主鍵來定義數(shù)據(jù)粒度
- 確定維度:根據(jù)業(yè)務(wù)需要確認(rèn)需要分析的業(yè)務(wù)維度,包含時間、地點、人物、環(huán)境等,常見包含日期、會員、商品、渠道、設(shè)備等
- 確定事實:事實也稱為度量,根據(jù)業(yè)務(wù)需要和數(shù)據(jù)來源確認(rèn)度量。
事務(wù)事實表
事務(wù)可以理解為業(yè)務(wù)操作最基本的動作,他可表示特定時間、空間發(fā)生的一個事件。如果某個事務(wù)發(fā)生,將在對應(yīng)事實表中建立對應(yīng)一行記錄,它能實現(xiàn)對細(xì)節(jié)行為數(shù)據(jù)的分析。
如下已訂單下單和支付過程具體,如下圖:
在實際設(shè)計過程中,如果多個業(yè)務(wù)動作的維度和度量都基本相同,可以考慮將多個業(yè)務(wù)過程合并為一張事實表,合并可以減少數(shù)據(jù)開發(fā)工作量和方便以后業(yè)務(wù)變更。如下圖:
周期快照事實
如果希望分析某個業(yè)務(wù)在某個固定的、可預(yù)測的事件間隔內(nèi)的累計性能,可使用周期快照事實表,利用周期快照可對一天、一周、一個月結(jié)束時建立數(shù)據(jù)快照,存儲到事實表中,周期快照事實表可用于記錄事實每個周期的變化情況。
例如我們業(yè)務(wù)中通常對會員累計支付金額、積分余額、會員等級、商品庫存等做周期快照,方便分析會員、商品等屬性對應(yīng)度量值,而不需要長期聚集事務(wù)歷史。
累計快照事實表
累計快照表示具有確定的開始和結(jié)束時間以及此期間所有中間過程的步驟,累計快照適中會表示多個日期外鍵,表示主要時間或過程里程碑。
以交易過程舉例,統(tǒng)計訂單對應(yīng)下單到支付時長、支付到發(fā)貨時長、發(fā)貨到收貨時長、支付到收貨時長等,事務(wù)事實表計算復(fù)雜,性能差,比較適合采用累積快照事實表。如下圖:
數(shù)據(jù)處理常見問題
離線數(shù)據(jù)處理
1)表存儲格式
盡可能避免使用textfile存儲格式。數(shù)據(jù)內(nèi)容中時常會出現(xiàn)換行、tab等一些特殊字符,使用textfile容易出現(xiàn)數(shù)據(jù)行錯位、列錯位等情況,如果特殊情況不可避免使用textfile格式,盡量選擇json文件格式,或者多個特殊分隔符作為行和列分隔符。
2)數(shù)據(jù)壓縮
建議使用orc或rc等壓縮方式存儲表,以cpu換存儲和時間 ,加快讀寫效率。
3)數(shù)據(jù)傾斜
在表數(shù)據(jù)處理過程中,多種情況會發(fā)生數(shù)據(jù)傾斜:
1. 大小表關(guān)聯(lián),走common join,由于關(guān)聯(lián)key值在大表中分布不均勻,可以開啟mapjoin,將小表加載到內(nèi)存,大表不需要根據(jù)key做hash分布,不會出現(xiàn)數(shù)據(jù)分布不均情況。
2. 兩大表關(guān)聯(lián),其中表中關(guān)鍵key值存在部分鍵值數(shù)據(jù)非常大,導(dǎo)致數(shù)據(jù)傾斜
- 個別鍵值,比如null值數(shù)據(jù)非常大,對個別鍵值做rand處理,打散數(shù)據(jù)
- 非個別的鍵值數(shù)據(jù)量很多,比如熱銷商品訪問數(shù)據(jù)量會比其他商品數(shù)據(jù)量大,可以首先統(tǒng)計topN數(shù)據(jù)量Key列表到topN表中,將量大表先和topN表關(guān)鍵,這樣topN數(shù)據(jù)可以先mapjoin,剩下數(shù)據(jù)common join,可以避免數(shù)據(jù)傾斜。
出現(xiàn)數(shù)據(jù)傾斜還是需要先分析key值數(shù)據(jù)分布情況確認(rèn)解決方案。
實時數(shù)據(jù)處理
1)數(shù)據(jù)重復(fù)
在實時數(shù)據(jù)處理過程中,不論使用storm、sparkstreaming、flink,因為在保證大數(shù)據(jù)大吞吐計算情況下,往往較難保證數(shù)據(jù)事務(wù),在環(huán)境或者計算出現(xiàn)異常情況下,容易出現(xiàn)某個批次部分?jǐn)?shù)據(jù)重復(fù)計算,在很多數(shù)據(jù)業(yè)務(wù)分析往往是無法接受的,對需要準(zhǔn)確性統(tǒng)計的計算場景,緩存每次計算結(jié)束的列表,每次計算前根據(jù)已計算列表驗證當(dāng)前數(shù)據(jù)是否已經(jīng)計算過,對計算過的數(shù)據(jù)跳過本次計算,這樣程序異?;蛘咧貑ⅲ匦伦x取kafka數(shù)據(jù)會跳過已經(jīng)計算完成的數(shù)據(jù)。對用戶流量類大數(shù)據(jù)量做到精確統(tǒng)計消耗成本太高,可以根據(jù)實際業(yè)務(wù)需要選擇對應(yīng)方案。
2)雙數(shù)據(jù)流關(guān)聯(lián)
多數(shù)情況,在實時指標(biāo)分析過程中,指標(biāo)和維度往往能通過一個數(shù)據(jù)源來分析計算得出,在某些場景下,指標(biāo)對應(yīng)維度會對應(yīng)不同的數(shù)據(jù)源,這時候就需要將兩個數(shù)據(jù)源根據(jù)業(yè)務(wù)ID關(guān)聯(lián)起來,然而兩個實時數(shù)據(jù)流可能會出現(xiàn)1.兩個數(shù)據(jù)流數(shù)據(jù)不同步,2.數(shù)據(jù)采集可能存在一定的數(shù)據(jù)丟失,導(dǎo)致可能部分pv再等待另外一個流永遠(yuǎn)都等不到。
以流量PV指標(biāo)舉例,分析維度包含:城市、頁面類型、供應(yīng)商等,其中流量訪問日志里面包含PV_ID、城市、頁面類型等信息,流量庫存日志包含PV_ID、供應(yīng)商等信息,pv數(shù)指標(biāo)對應(yīng)維度分表對應(yīng)兩個數(shù)據(jù)源中,在離線計算中join直接解決,在實時計算過程中又怎么關(guān)聯(lián)呢?
首先需要分析兩個數(shù)據(jù)流哪個是主數(shù)據(jù)流,所有的統(tǒng)計數(shù)據(jù)以主流為基礎(chǔ),保證主流數(shù)據(jù)不丟失,部分場景也可能兩個流合并作為主數(shù)據(jù)流;
其次需要對兩個數(shù)據(jù)流設(shè)定一定的緩存,對未關(guān)聯(lián)上的數(shù)據(jù)先記錄到緩存中,等待另外數(shù)據(jù)流做關(guān)聯(lián)操作,緩存需要有持久化機制,保證系統(tǒng)出現(xiàn)問題或者程序重啟緩存不會丟失;
再次設(shè)置緩存時長,由于包括數(shù)據(jù)丟失等可能情況會導(dǎo)致數(shù)據(jù)無法關(guān)聯(lián)情況,此時需要根據(jù)業(yè)務(wù)定義緩存時長,對超過時長還未關(guān)聯(lián)到的數(shù)據(jù)根據(jù)業(yè)務(wù)做對應(yīng)處理。
在實際實時模型設(shè)計盡可能減少雙流關(guān)聯(lián)的計算場景,一方面雙流關(guān)聯(lián)開發(fā)較復(fù)雜,另外一方面雙流關(guān)聯(lián)相比單流數(shù)據(jù)準(zhǔn)確性存在下降的可能性,在上舉例中,可以通過上游采集系統(tǒng)在訪問流添加供應(yīng)商等維度,由一個數(shù)據(jù)流支撐對應(yīng)指標(biāo)和維度,雙流在采集端容易做業(yè)務(wù)合并的盡可能在采集端做業(yè)務(wù)合并。
大促計算保障
電商行業(yè),大促業(yè)務(wù)量是日常業(yè)務(wù)量的很多倍,暴增的數(shù)據(jù)量對計算平臺各環(huán)節(jié)都會帶來較大的挑戰(zhàn)。
離線計算,1.數(shù)據(jù)暴增首先帶來的是底層平臺HDFS計算壓力,需要根據(jù)預(yù)估業(yè)務(wù)量擴容平臺計算能力;2.數(shù)據(jù)暴增容易帶來數(shù)據(jù)傾斜問題,例如大促爆款商品等呈現(xiàn)分化數(shù)據(jù)會導(dǎo)致數(shù)據(jù)分布嚴(yán)重不均勻,需要打散數(shù)據(jù),有效利用平臺資源分散計算,縮短計算時間;3.提前分析核心業(yè)務(wù)線,識別關(guān)鍵路徑,對關(guān)鍵路徑中慢節(jié)點做拆分優(yōu)化,提高計算并行能力,縮短關(guān)鍵路徑時間。在大促保障期間,通過計算傾斜的優(yōu)化和關(guān)鍵路徑的拆分優(yōu)化,有效提前整體出數(shù)時間。
實時計算:1.根據(jù)預(yù)估業(yè)務(wù)量擴容實時計算storm、spark streaming、flink等平臺資源;2.在流處理業(yè)務(wù)中,根據(jù)業(yè)務(wù)數(shù)據(jù)量、業(yè)務(wù)重要程度對業(yè)務(wù)計算做拆分,避免集群內(nèi)業(yè)務(wù)互相影響,對storm需要根據(jù)業(yè)務(wù)做集群拆分,盡可能將數(shù)據(jù)量大非核心業(yè)務(wù)拆分單獨集群,避免集群內(nèi)非核心業(yè)務(wù)搶占核心業(yè)務(wù)資源3.合理利用數(shù)據(jù)緩存有效提高實時計算能力;4.對適合在客戶端采集實現(xiàn)的業(yè)務(wù),由采集來實現(xiàn),減輕大數(shù)據(jù)平臺計算壓力,也能通過數(shù)據(jù)采集優(yōu)化有效避免部分業(yè)務(wù)的雙流關(guān)聯(lián),提高實時計算效率和準(zhǔn)確度。
名詞解釋:
作者:彭虎,蘇寧易購IT總部大數(shù)據(jù)中心技術(shù)副總監(jiān),12年IT從業(yè)經(jīng)驗,專長大數(shù)據(jù)hive、storm、spark等數(shù)據(jù)計算技術(shù),對數(shù)據(jù)建模、數(shù)據(jù)計算、多維分析有著專業(yè)認(rèn)知和研究,致力于數(shù)據(jù)倉庫探索研究、數(shù)據(jù)質(zhì)量分析、數(shù)據(jù)計算保障。
【51CTO原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為51CTO.com】