數倉那點事:從入門到佛系

(一)初識數倉

 

每個人對於數倉的理解,都源自於大數據,而大數據有源自於那個神奇的故事:從前有一家超市,它有一個怪現象,尿布和啤酒赫然擺在一起出售。外行人不明所以,但內行人卻看到了尿布和啤酒的銷量雙雙增加。爲什麼呢?正是因爲大數據發揮了它最原始的作用:組合分析。婦女們經常會囑咐她們的丈夫下班以後要爲孩子買尿布,而丈夫在買完尿布之後又要順手買回自己愛喝的啤酒,因此啤酒和尿布在一起購買的機會還是很多的。這就是大數據最初的魔力。

數據倉庫已經是一個非常成熟穩定的模型了,Inmon在它的書裏將數據倉庫定義爲:一個面向主題的(Subject Oriented)、集成的(Integrated)、反映歷史變化(Time Variant)、相對穩定的(Non-Volatile)的數據集合,用於支持管理決策(Decision Making Support)。在2017年,TDWI提出了一個數據分析成熟度模型(Big Data Maturity Model),比較好的解釋了一家公司數據倉庫的建設階段,就像下圖這樣:

這個模型有六個階段:孕育期、嬰兒期、兒童期、少年期、成人期、長者期。

孕育期:打印基本的報表,交給各個部門的員工來手工填寫;

嬰兒期:用Excel完成基本的數據組織與統計;

兒童期:能夠部署獨立的應用程序,來滿足單個部門的需求;

少年期:形成了基本的數倉概念,並引入了數據的定義、規則、維度標準化等概念;

成人期:搭建企業級數據倉庫,並通過整合的數據來支持一些關鍵業務的驅動;

長者期:BI的概念形成,數倉建設非常規範。

當然,由於中國過早的進入了互聯網和移動互聯網時代,並沒有經歷過軟件時代的相關歷程,因此數倉的概念從一開始就與大數據緊緊的綁定在了一起,成爲了每個互聯網公司的標配部門。

 

(二)大數據時代裏的數倉入門

 

如果你是一名數據開發的同學,出去面試,基本都會被問到一個問題:“如果是你來負責數據倉庫建設,你會考慮如何來建設好數據倉庫?”這個問題通常是考察候選人的架構設計水平的,看你對於業務有多深入的瞭解。大部分人的回答都是偏技術層面的,通常會說出一個比較完整的數據分層模型,但僅僅分層清晰就足夠了嗎?不一定。

 

我們先看一下通常的數據倉庫分層模型:

 

Data Source Layer:源數據層,代表收集到數據倉庫中的各類原始日誌,包括採集的網頁/客戶端日誌、數據庫操作數據、第三方數據等;

Data Extraction Layer:數據抽取層,主要目的在於將數據沉澱到數倉平臺上,可以用消息隊列來做緩衝;

Staging Area:數據公共層:目的在於爲後續進一步的數據處理和整合提供便利;

ETL Layer:ETL層,將數據進行初始的加工,帶有了一定的處理邏輯,將數據轉換爲結構化或者半結構化這種具備分析屬性的格式;

Data Storage Layer:數據存儲層,將數據存儲到分佈式平臺上,並提供容錯、均衡等功能;

Data Logic Layer:數據邏輯層,這部分是數據倉庫邏輯概念的核心層,具體分層下面會繼續講到;

Data Presentation Layer:數據展示層,主要目的在於提供報表數據;

Metadata Layer:元數據層,該層用於描述數據倉庫存儲的數據;

System Operations Layer:系統操作層,該層包括了數據倉庫系統中操作的信息,比如ETL任務的狀態、系統的性能,用戶access記錄等。

 

數據邏輯通常按照下圖進行分層:

 

到這裏爲止,如何建設好一個數據倉庫的概念,就基本解釋清楚了,這也是一名從業3年的數據人應該有的基本能力。但是,這也僅僅是技術層面的總結,解決了工程上的“能不能實現”,但“能不能有用”,就是另外一個話題了。

 

(三)數倉如何變得有用

 

數據倉庫是不是有用,要看它能做什麼。通常而言,數據倉庫要解決業務的問題,爲業務的發展提供決策依據和運營參考,換句話說,數據倉庫要與業務有強綁定的關係。如果一個數據倉庫只能把數據接入進來,做好分層,但不知道給誰用,那麼這個數據倉庫通常就是沒有價值的,在你做部門彙報的時候,會被大佬瘋狂diss。那麼業務會怎麼用數據?通常而言,還是從數倉的概念出發,我們給出三個很具體的用途:

 

第一個用途是集成:對於互聯網公司來說,數據通常十分的零散,例如數據庫日誌在運維手裏、廣告數據在廣告團隊那裏、業務數據在後端那裏,產品同學在全局角度上設計了一些好的產品或者功能,需要綜合各方面的情況,來看這個產品或者功能是否有用,那麼數據倉庫就是他們唯一的選擇。從技術層面說,決策支持需求通常是全局的、關聯的,必須將數據整合到一個地方纔能方便統計分析和挖掘。從數據處理層面說,不同的數據格式不一樣,有的是關係型的數據表,有的是本結構化的日誌,有的數據還以多媒體的形式存在,也需要將數據轉化成相對統一的格式。

在集成的層面上,我們就需要強調不同開源框架的作用與相互配合了。自底向上,與OSI類似,通用框架下的大數據體系有七層:數據源、數據收集層、數據存儲層、資源管理與服務協調層、計算引擎層、數據分析層及數據可視化層。詳情參考下面這篇文章:

https://blog.csdn.net/gaixiaoyang123/article/details/104359655

 

第二個用途是面向主題:我們把四面八方的數據都拿到了,那怎樣組織這些數據呢?換句話說,產品丟了一個又一個的需求過來,我們通過怎樣的方式,能夠儘快消滅掉這些需求嗯?通常而言,這裏就要引入兩個很重要的概念:建模、域。

 

在數據倉庫領域,經常會聽到兩個名字,Bill Inmon與Ralph Kimball。Inmon最早提出數據倉庫的概念,在構建數據倉庫過程中,主張自頂向下的設計,先設計好數倉的整體架構,然後進行局部設計,而Kimball正好相反,主張自底向上設計,先根據各個業務主題進行設計,然後通過維度模型將數據倉庫整合起來。目前Kimball的維度建模普遍被大家採用。

下圖爲Inmon構建過程示例:

下圖爲Kimball維度建模示例:

 

域的概念,簡單來說就是主題,是業務方向的統稱。爲什麼要按主題來組織?因爲數據倉庫是分析型的數據集合,我們分析的出發點通常是業務實體,分析的目的就是要了解業務實體的各種行爲狀態、瞭解每個業務的效果。通過將相對固定的業務領域,按照一定的抽象規則進行歸納,便可以形成相對獨立的信息模型。通常而言,我們會在公共層,也就是DWS層進行數據域的劃分,在某些已成熟單一主體業務按照這樣來做比較好,比如像金融,安全等領域,通過對主體業務內的數據進行抽象分類,進行精細化的管理。像下圖所示:

但是,當業務領域過多時,會將數據管理複雜化,在當前業務快速響應的時代,基於業務+數據域的劃分或許是更好的一種管理方式,它沒有對原有的業務重新歸納,基於非直接業務數據也從橫向整體通盤進行考慮。如下圖所說:

 

第三個用途是反應歷史變化:可能很多業務場景並不涉及到歷史變化,但一旦涉及到了,就絕不是一件簡單的事情,尤其是在電商領域。可以說,歷史變化是一個將縱向比對橫向的過程,只有對比歷史才能發掘目前數據的價值。所以,數據倉庫有一個很重要的使命,就是保存歷史數據的狀態,免得產品同學挖出了一個坑後,你無從下手排查……

但是,歷史數據的保存是有成本的,如果不加區分全量保存,會對存儲系統產生非常大的壓力,很快Hadoop集羣就是各種90%、各種瘋狂報警了。那麼我們如何組織和整理歷史變化數據呢?通常而言,這裏就是拉鍊表、快照事實表等概念了。

 

事實表參考這篇文章:

https://blog.csdn.net/gaixiaoyang123/article/details/104000982

下圖是快照事實表的說明:

 

拉鍊表參考這篇文章:

https://blog.csdn.net/saqin6255/article/details/80362248

下圖是拉鍊表的說明:

 

(四)有用之後就是佛系

 

即便我們進階了很多,既有技術支撐,也有方法論鋪墊之後,還是會面對一個現實的問題:工作內容沒有價值。大家其實能說出很多很多的原因,比如下面這些:

1.工作職責劃分不明確,把數據分析當作報表開發,怎麼體現價值?

2.需求一個接一個做不完,產品不把分析當合作夥伴,就是工具!

3.分析師沒有主動權,只能被動接需求,需求是誰提的,誰的成果和價值才高!

 

對於不同的角色,能做的事情是很不同的:

1.對於一名執行者,小兵,沒什麼可說的,老老實實把自己的專業度提升到自己的巔峯,你的專業度纔是你的立身之本,這都沒有,那你有什麼用?老大爭取來了項目,你能完成嗎?

2.對於一名團隊的骨幹,要學會去幫助老大發掘有價值的項目和好的切入點,去推動,去協調。你具備的不只是專業技能,更多的是一名職業人的職業性。

3.對於團隊的老大,要學會共贏,一定要能夠把大老闆的路子打通,有一個至多個業務方的盟友。互聯網很多Leader都是從技術轉過來的,這時候要學會轉變思維,不要總感覺自己是一名頂尖的工程師。

 

當然,可能我們一直無法做到團隊老大或者TL的位置,會長期以團隊骨幹的身份存在,那麼更加的佛系一些,有時間多讀讀書,像《格魯夫給經理人的第一課》,因爲工作,或者說職場,不是一次短跑,而是一次長跑,幸運不是每天都有,而是階段性的。佛系的意義,在於冬天的時候,給自己多積累經驗,慢慢跑,等到春暖花開的時候,再繼續跟上去,把過去的知識再發揮出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章