1. 程式人生 > 其它 >大資料-資料倉庫-實時數倉架構分析

大資料-資料倉庫-實時數倉架構分析


數倉分層

分層 全稱 譯名 說明 壓縮 列式儲存 分割槽
ODS Operation Data Store 原始層 原始資料
DIM Dimension 維度層 合併維度表
DWD Data Warehouse Detail 明細層 資料處理、維度建模
DWS Data Warehouse Service 服務層 去主鍵聚合,得到原子指標
DWT Data Warehouse Topic 主題層 存放主題物件的累積行為
ADS Application Data Store 應用層 具體業務指標
  • ODS:原始資料,日誌和業務資料 放到 Kafka
  • DWD:根據資料物件為單位進行分流,比如訂單、頁面訪問等等
  • DIM:維度資料
  • DWM:對於部分資料物件進行進一步加工,比如獨立訪問、跳出行為,也可以和維度進行關聯,形成寬表,依舊是明細資料。
  • DWS:根據某個主題將多個事實資料輕度聚合,形成主題寬表。
  • ADS:把ClickHouse中的資料根據視覺化需進行篩選聚合

命名規範

庫名:業務大類
表名:分層名_業務細類
臨時表:temp_表名
備份表:bak_表名
檢視:view_表名(場景:不共享的維度表、即席查詢)

分層 命名規範 說明
ODS ods+源型別+源表名+full/i full:全量同步
i:增量同步
ods_postgresql_sku_full
ods_mysql_order_detail_i
ods_frontend_log
DIM dim+維度+full/zip full:全量表
zip:拉鍊表
日期維度表沒有後綴
dim_sku_full
dim_user_zip
dim_date
DWD dwd+事實+full/i full:全量事實
i:增量事實
DWS dws+原子指標 時間粒度有1d、1h…
1d:按1天
1h:按1小時
dws_page_visitor_1d
DWT dwt_消費者畫像
ADS ads+衍生指標/派生指標

離線數倉:事實表,維度表,都放Hive
實時數倉:原始資料放 Kafka,維度資料 放 HBase,Phoenix

  • 離線計算:就是在計算開始前已知所有輸入資料,輸入資料不會產生變化,一般計算量級較大,計算時間也較長。例如今天早上一點,把昨天累積的日誌,計算出所需結果。最經典的就是 Hadoop 的 MapReduce 方式;
    一般是根據前一日的資料生成報表,雖然統計指標、報表繁多,但是對時效性不敏感。從技術操作的角度,這部分屬於批處理的操作。即根據確定範圍的資料一次性計算。

  • 實時計算:輸入資料是可以以序列化的方式一個個輸入並進行處理的,也就是說在開始的時候並不需要知道所有的輸入資料。與離線計算相比,執行時間短,計算量級相對較小。強調計算過程的時間要短,即所查當下給出結果。
    主要側重於對當日資料的實時監控,通常業務邏輯相對離線需求簡單一下,統計指標也少一些,但是更注重資料的時效性,以及使用者的互動性。從技術操作的角度,這部分屬於流處理的操作。根據資料來源源不斷地到達進行實時的運算。

  • 即席查詢: 需求的臨時性,小李,把兩星期的資料拉給我看下(只在這個時刻需要)
    Presto: 當場計算(基於記憶體速度快)
    Kylin:預計算(提前算好),多維分析(Hive With Cube)

Sqoop 匯入資料方式:

  • 增量: where 1=1、

  • 全量: where 建立時間=當天、

  • 新增及變化:where 建立時間=當天 or 操作時間=當天、

  • 特殊(只匯入一次)
    Flume:

  • tailDirSource
    優點:斷點續傳,監控多目錄多檔案
    缺點:當檔案更名之後,重新讀取該檔案造成資料重複
    注意:1. 要使用不更名的列印日誌框架(logback)--一般logback 也會設定成更名的,每天一個日誌檔案,檔名帶上日期,如果寫死檔名,更名後可能會丟資料
    2.修改原始碼,讓TailDirSource判斷檔案時,只看 iNode 值

  • KafkaChannel
    優點:將資料匯入Kafka,省了一層Sink
    Kafka:生產者、消費者
    用法:1. Source-KafkaChannel-Sink
    2. Source-KafkaChannel
    3. KafkaChannel-Sink

邏輯線: 資料流、監控、優化、配置。

Kafka

  • Producer:ACK、攔截器、序列化器、分割槽器、傳送流程、事務、冪等性,分割槽規則-->有指定分割槽發到指定分割槽,沒有根據Key進行hash,都沒有進行輪詢(粘性)
  • Broker: Topic 副本-> 高可用 ISR LEO、HW ;分割槽:高併發、負載均衡(防止熱點)
  • Consumer:分割槽分配規則 offset 儲存(預設:_consumer_offsets 主題、其它:手動維護Offerset(MySQL)帶事務,精準一次消費

分層的好處

  • 複雜問題拆解為多層
  • 減少重複開發(可以去中間層取數,不用每次都去原始層)
  • 隔離原始資料,例如:異常資料、敏感資料(使用者電話…)

資料儲存策略

  • 原始層保持資料原貌,不進行脫敏和清洗
  • 建立分割槽表(例如:日期分割槽),防止全表掃描
  • 資料壓縮,減少磁碟佔用(如:LZO、gzip、snappy)
  • 列式儲存提高查詢效率(如:Parquet、ORC)

離線架構:追求系統的穩定性、考慮到公司未來的發展,資料量一定會變得很大、早期的時間實時業務使用 SparkStreaming(微批次)

  • 優點:耦合性低、穩定性高
  • 缺點:時效性差

實時架構:Kafka叢集高可用,資料量小,所有機器存在同一個機房,傳輸沒有問題,

  • 優點:時效性好 Flink
  • 缺點:耦合性高,穩定性低