博客 / 詳情

返回

架構師必備:後端程序員需要了解的數倉知識

大家好,我是Java烘焙師。後端程序員平時除了接觸業務代碼、中間件、存儲等,也難免會跟數倉有交集。下面結合筆者的經驗和思考,從後端程序員的視角看數倉、做個總結,後續再跟數倉/BI argue的時候就不虛了😃

分成兩部分介紹:離線數倉、實時數倉。

離線數倉

離線數倉是最典型的數倉應用場景。後端服務產生了業務數據、監控埋點、日誌等,如果要做統計分析,就要先離線採集到數倉,再通過SQL做聚合查詢。
離線數倉的重點,在於統計分析歷史存量數據,做合理的業務域劃分、數據分層、數據分區。

 title=

數據採集

需要採集的數據包括:業務數據、監控埋點、日誌等。

  • 業務數據:一般存儲在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把數據採集、數據計算、數據導出的流程串起來。這裏引用一張某雲廠商的實踐教程圖,裏面的數倉存儲可替代為其它。
參考:實時數倉搭建
image

  • 實時入倉:mysql binlog、或業務事件,觸發實時數據流,通過flink實時入倉
  • 數據計算:通過flink關聯join多個ods表,得到dwd表,再實時計算得到按維度聚合的dws表
  • 數據導出、對外提供接口查詢:計算結果可導出到實時數倉,如Doris、Hologres等,也可以導出到mysql、hbase、或redis,並封裝成RPC接口。這樣後端服務可以查詢實時數倉接口,對外提供高qps查詢

實時數倉使用場景

  • 內部報表查詢
  • 外部統計類查詢:典型的例如用户看到的 排行榜、多少人看過/加購/收藏/買過 等
  • 用户個性化推薦

以上,就是後端程序員需要了解的數倉知識了,歡迎關注、轉發、點贊。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.