大家好,我是Java烘焙師。後端程序員平時除了接觸業務代碼、中間件、存儲等,也難免會跟數倉有交集。下面結合筆者的經驗和思考,從後端程序員的視角看數倉、做個總結,後續再跟數倉/BI argue的時候就不虛了😃
分成兩部分介紹:離線數倉、實時數倉。
離線數倉
離線數倉是最典型的數倉應用場景。後端服務產生了業務數據、監控埋點、日誌等,如果要做統計分析,就要先離線採集到數倉,再通過SQL做聚合查詢。
離線數倉的重點,在於統計分析歷史存量數據,做合理的業務域劃分、數據分層、數據分區。
數據採集
需要採集的數據包括:業務數據、監控埋點、日誌等。
- 業務數據:一般存儲在DB、或HBase,可一次性把存量數據導入hive表,後續定時掃描一段時間範圍內的增量數據導入hive表
- 監控埋點:後端服務發出埋點消息,採集程序消費消息、解析、最終導入到hive表
- 日誌:可通過filebeat採集日誌,採集程序解析後、導入到hive表
數據分層
邏輯層面的水平數據分層:
ODS (Operational Data Store):原始數據,一般不做任何加工DWD (Data Warehouse Detail):數倉明細數據,在ODS的基礎上做一些簡單加工,如數據清洗,解析json格式字段、打平後存儲DWS (Data WareHouse Summary):數倉彙總數據,在DWD的基礎上按維度做聚合寬表,方便業務方使用ADS (Application Data Service):直接可用的報表應用數據
離線數倉的數據分層,類似於後端代碼結構的分層設計,比如分為接口層interface、邏輯層service、數據訪問層repository。
數據分層可以隔離每層之間的依賴,每層的變更只限於本層。比如mysql拆庫遷移只需要更換ods表,但無需改dwd表,這樣數據使用方不用感知數據源變更。
數據分層可以在DW層聚合數據,提高數據使用方的效率、降低開發成本。
後端程序員接觸最多的是ods和dwd表:
- ods表涉及到數據採集,並且是歸檔刪在線數據的前提
- dwd表可以用來排查歷史數據,因為json格式字段已打平,所以方便做篩選查詢
數據分區
按時間維度做垂直分區,一般是日級或小時級分區,取決於調度頻率:
- 天級增量表:包含某一天有變更的數據記錄
- 天級全量表:包含某一天完整的數據記錄,相當於快照
- 小時級增量表:包含某一小時有變更的數據記錄
因為數據量較大,所以不是所有的離線表都會永久保留。比如ods天級增量表可能僅保留最近n天、或最近n個分區,而dwd天級全量表會merge增量數據,可查到歷史上的所有數據記錄。
離線數倉使用場景
-
離線統計:
- 通過hive sql做複雜的關聯查詢、聚合查詢,底層會轉成MapReduce任務,查詢HDFS裏的hive表
- 比如把多張事實表、維度表join起來,做某個維度的數量加總、金額加總。事實表是業務活動的事件記錄,可以做聚合查詢統計。維度表是元數據,按維度做聚合分析(max、count,group by維度)。事實表一般包含多個維度表的外鍵。
- 數據對賬:判斷業務雙方的數據是否一致,參考筆者之前寫的文章:架構師必備:實時對賬與離線對賬
- 後端刷歷史存量數據:需要先在離線統計符合條件的數據,再導出id消息,作為後端刷數據的輸入依據
後端歸檔刪除在線數據
後端在線數據不斷膨脹,當業務層面不再訪問時,需要做歸檔刪除。一定要確保業務數據先被離線採集到、再刪除在線數據,否則就可能丟數據、找不回來了。
比如新增一個archive_status字段代表歸檔狀態(而非有業務含義的deleted字段),初始值是0,被軟刪後改成1,那麼如果hive表裏記錄的歸檔狀態是1,則代表該記錄已被離線採集到,可放心地刪除對應在線記錄。
實時數倉
有了離線數倉,為什麼還需要實時數倉呢?
- 主要還是為了時效性,離線數倉最快是小時級,如果需要秒級延遲,就需要上實時數倉了
- 實時數倉跑出來的結果,可以被後端服務查詢,用於在線業務
實時數倉的重點,在於低延遲計算、exactly-once處理,與後端應用結合可以實現很多功能。
實時數倉構建流程
使用flink把數據採集、數據計算、數據導出的流程串起來。這裏引用一張某雲廠商的實踐教程圖,裏面的數倉存儲可替代為其它。
參考:實時數倉搭建
- 實時入倉:mysql binlog、或業務事件,觸發實時數據流,通過flink實時入倉
- 數據計算:通過flink關聯join多個ods表,得到dwd表,再實時計算得到按維度聚合的dws表
- 數據導出、對外提供接口查詢:計算結果可導出到實時數倉,如Doris、Hologres等,也可以導出到mysql、hbase、或redis,並封裝成RPC接口。這樣後端服務可以查詢實時數倉接口,對外提供高qps查詢
實時數倉使用場景
- 內部報表查詢
- 外部統計類查詢:典型的例如用户看到的 排行榜、多少人看過/加購/收藏/買過 等
- 用户個性化推薦
以上,就是後端程序員需要了解的數倉知識了,歡迎關注、轉發、點贊。