OneData 是阿裡巴巴内部進行資料整合和管理方法體系和工具。
指導思想
首先,要進行充分的業務調研和需求分析。
其次,進行資料總體架構設計,主要是根據資料域對資料進行劃分;按照次元模組化理論,建構總線矩陣,抽象出業務過程和次元。
再次,對報表需求進行抽象整理出相關名額體系,使用 OneData 工具完成名額規範定義和模型設計。 最後,是代碼研發和運維。
其實施流程主要分為:資料調研、架構設計、規範定義和模型設計。
資料調研
業務調研
需要确認要規劃進數倉的業務領域,以及各業務領域包含的功能子產品,以阿裡的業務為例,可規劃如下矩陣:
需求調研
了解需求方關系哪些名額?需要哪些次元、度量?資料是否沉澱到彙總層等到。
架構設計
資料域的劃分
資料域是将業務過程或者次元進行抽象的集合,一般資料域和應用系統(功能子產品)有聯系,可以考慮将同一個功能子產品系統的業務過程劃分到一個資料域:
建構總線矩陣
在進行充分的業務調研和需求調研後,就要建構總線矩陣了,需要做兩件事情:
- 明确每個資料域下有哪些業務過程。
- 業務過程與哪些次元相關,并通過總線矩陣定義每個資料域下的業務過程和次元:
名額體系搭建
基本概念
資料域:指面向業務分析,将業務過程或者次元進行抽象的集合。
業務過程:指企業的業務活動中的事件。
時間周期:用來明确資料統計的事件範圍或者時間點,如近 30 天、截至目前。
修飾類型:對修飾詞的一種抽象劃分。
修飾詞:指除統計次元外名額的業務場景限定抽象。抽象詞隸屬于一種抽象類型,如通路終端類型下的 pc、安卓、蘋果。
度量/原子名額:具有明确含義的業務名詞。如:支付金額。
次元:次元是度量的環境,用來反應業務的一類屬性,這類屬性的集合稱為一個次元,也可以稱為實體對象,如地理次元、時間次元。
次元屬性:對次元的描述,隸屬于一個次元。如:地理次元下的國家、省份。
派生名額:原子名額+多個修飾詞(可選)+時間周期。
明确原子名額、修飾詞、時間周期和派生名額的定義。
操作細則
派生名額來源于三類名額:事務型名額、存量型名額和複合型名額。
事務型名額:指對業務活動進行衡量的名額。
存量型名額:指對實體對象某些狀态的統計。
複合型名額,在上述兩種名額基礎上複合而成的。
模型設計
資料分層
業界對數倉分層的看法大同小異,大體上認為分為接入層、中間層和應用層三層,不過對中間層的了解有些差異。
接入層(ods)
業務資料一般是采用 dataX 或者 sqoop 等以固定頻率同步到數倉中建構 ODS 層;
如果是日志資料則通過 flume 或者 Kafka 等同步到數倉中。
接入層一般不會對源資料做任何處理、清洗,便于之後回溯。
明細層(dwd)
理論上明細層資料是對 ods 層資料進行清洗加工,提高 ods 層資料的可用性,對于 dwd 層資料是否同層引用的觀點需要權衡:
- 一般情況下 dwd 層不建議同層引用,這樣做可以減少明細層任務之間的依賴,減少節點深度。
- 但是在某些場景下,ods 層到 dwd 層資料加工邏輯複雜,計算開銷大,這時可以權衡考慮适當複用 dwd 表來建構新的 dwd 表。
彙總層(dws)
這一層依賴我們的名額體系,将 dwd 層的資料按照各個次元進行聚合計算。
資料集市層(dwm)
當我們有一些跨業務域的聚合統計需求時,放到這一層。
應用層(app)
這一層主要針對彙總層,進行相關名額的組合,生成報表。
次元設計
次元模組化中,将度量稱為事實,次元用于分析事實所需要的多樣環境。次元的作用一般是查詢、分類彙總以及排序。
通過報表的限制條件,以及之前資料調研和業務方的溝通,我們可以獲得次元。
次元通過主鍵與事實表進行關聯,次元表的主鍵分為代理鍵和自然鍵兩種;代理鍵不具有業務含義,一般用于處理緩慢變化次元,自然鍵則具有業務含義。
次元設計基本方法
- 選擇或者建立一個次元,通過之前總線矩陣的建構掌握了目前數倉架構中的次元。
- 确定主維表。此處主維表一般是 ODS 表,直接與業務系統同步。
- 确定相關維表。數倉是業務源系統的資料整合,不同業務系統或者同一業務系統中的表之間存在關聯性。跟據對業務的梳理,我們可以确認哪些表和主維表存在關聯關系,并選擇其中的某些表用于生成次元屬性。
- 确定次元屬性。本步驟分為兩階段,第一階段是從主維表中選擇次元屬性或生成新的次元屬性;第二階段是從相關維表中選擇次元屬性或生成新的次元屬性。
規範化和反規範化
當具有多層次的次元屬性,按照第三範式進行規範化後形成一系列次元表,而非單一次元表,這種模組化稱為雪花模式。
将次元的屬性層次合并到單個次元中的操作稱為反規範化。
一緻性次元和交叉探查
我們存在很多需求是對于不同資料域的業務過程或同一資料域的不同業務過程合并在一起觀察。例如:對于日志資料域統計商品次元的近一天 PV 和 UV;對于交易資料域統計商品次元近一天的 GMV。
這種将不同資料域的商品事實合并在一起進行資料探查,稱為交叉探查。
數倉能進行交叉探查的前提是,不同資料域要具有一緻性次元。
次元整合
由于數倉的資料源來源于不同的應用系統,應用系統之間互相獨立,是以對同一資訊的描述、存儲都可能具有差異。
而這些具有差異的資料進入數倉後需要整合在一起:
- 命名規範的統一。表名、字段名等統一。
- 字段類型的統一。相同和相似字段的字段類型統一。
- 公共代碼以及代碼值的統一。
- 業務含義相同的表的統一。主要依據高内聚、低耦合的理念,将業務關系大,源系統影響差異小的表進行整合。
表級别的整合主要有兩種形式:
垂直整合,即不同來源表包含相同的資料集,隻是存儲的資訊不同,可以整合到同一個次元模型中。
水準整合,即不同來源表包含不同的資料集,這些子集之間無交叉或存在部分交叉,如果有交叉則去重;如果無交叉,考慮不同子集的自然鍵是否沖突,不沖突則可以将各子集自然鍵作為整合後的自然鍵,或者将各自然鍵加工成一個超自然鍵。
拉連結清單
拉連結清單,又稱為極限存儲技術。假設某一張表是用來存儲全量使用者資訊的,一般我們的處理方式是,用每個分區去存儲每天全量資料的快照,這種方式的問題是,如果我希望儲存使用者的所有曆史狀态,我可能需要永久儲存每一個曆史分區。
如果使用拉連結清單,每個分區可以儲存每個使用者在當天的曆史狀态,同時曆史分區也可以進行清理。
這樣,雖然單個分區中存儲的資料變多了,但是某些曆史分區的資料被清理後,整個表存儲的資料會變少了,因為很多沒有變化的使用者資訊快照被清理了。
微型次元
微型次元的建立是通過将一部分不穩定的屬性從相對穩定的主次元中移除,放置到擁有自己代理鍵的新表來實作。
遞歸層次
遞歸層次指的是某維表的執行個體值的層次關系,次元的遞歸層次分為有固定數量級别的均衡層次結構和無固定數量級别的非均衡層次結構。
由于數倉中一般不支援遞歸 SQL 的功能來處理這種層次結構,是以需要用到其他方式。
- 層次結構扁平化,适合均衡層次結構次元。
- 層次橋接表,适合非均衡層次結構次元。
多值次元
多值次元指事實表的一條記錄在某次元表中有多條記錄與之對應。
針對多值次元,常見的處理方式有三種:
- 降低事實表的粒度。
- 列擴充。
- 較為通用的方式,采用橋接表。
雜項次元
雜項次元是由操作型系統中的訓示符或者标志字段組合而成,一般不在一緻性次元之列。
退化次元
參考文檔:
- 美團資料平台及數倉建設實踐,超十萬字總結
- 五萬字 | 耗時一個月整理出這份Hadoop吐血寶典