大數據架構下的資料庫設計與工程

在學習資料工程的過程中,雖然沒有特別區分,但從講師的敘述和某些技術中,隱隱可以察覺「大數據」和一般的資料工程是有區隔的,不單單只是「資料變多」而已。所以雖然不在課程內,但我另外又搜尋了一些與大數據有關的資料,包括大數據下的資料庫設計、大數據下的資料工程等。除了分享也作為筆記,讓自己可以重複複習關於大數據的相關知識。

目錄


簡介

在軟體工程的世界裡,資料庫往往是系統的瓶頸所在。當資料規模從 GB 成長至 TB 甚至 PB 等級,我們面臨的不僅是儲存空間的挑戰,更是計算能力的典範轉移 (Paradigm Shift)。

1. 大數據的特殊性 (Volume, Velocity, Variety)

傳統單機資料庫(RDBMS)依賴 Vertical Scaling (Scale-up),透過升級 CPU 和記憶體來提升效能。然而,硬體升級有其物理極限。大數據架構的核心在於 Horizontal Scaling (Scale-out),利用數百甚至數千台商用伺服器組成叢集,共同處理龐大的資料集。

2. 分散式架構的本質

在大數據領域(如 Hadoop 生態系、Spark、Cloud Data Warehouses),我們遵循 「分而治之 (Divide and Conquer)」 的哲學:

  • 儲存與計算分離 (Storage-Compute Separation):現代架構傾向將資料存在物件儲存(如 S3, GCS, HDFS),計算資源(如 Spark Executors)則是動態調配的。
  • 移動計算而非移動數據:由於網路 I/O 是最大的效能瓶頸,我們盡可能將程式碼派發到存放資料的節點上執行,而非將資料拉回中心節點處理。

資料庫設計模型

理解資料模型的適用場景,是架構師進行技術選型(Tech Stack Selection)的第一步。

1. 一般資料庫模型 (General Purpose / OLTP)

這些模型通常應用於應用程式後端,強調交易的即時性與一致性。

  • Relational Model (RDBMS)
    • 代表:MySQL, PostgreSQL, Oracle。
    • 特性:嚴格 Schema、ACID 交易保證、使用 SQL。
    • 適用:核心業務系統(Core Banking, ERP),資料一致性要求極高的場景。
  • Document Model
    • 代表:MongoDB。
    • 特性:Schema-less (BSON/JSON)、支援巢狀結構、開發迭代快。
    • 適用:內容管理系統 (CMS)、產品目錄 (Catalog)、屬性高度動態的資料。
  • Key-Value Model
    • 代表:Redis, DynamoDB。
    • 特性:Hash Table 結構、O(1) 讀寫延遲。
    • 適用:快取 (Cache)、Session Store、高併發計數器。
  • Graph Model
    • 代表:Neo4j。
    • 特性:以節點 (Node) 與邊 (Edge) 儲存關係,解決遞迴查詢效能問題。
    • 適用:社交網絡分析、推薦引擎、路徑演算法。

2. 大數據與資料倉儲模型 (Analytical / OLAP)

當場景轉向數據分析時,寫入效能不再是首要考量,查詢吞吐量 (Throughput)歷史資料整合 才是重點。

  • Star Schema (星狀模型)
    • 最經典的 Data Warehouse 模型。以一張 Fact Table (事實表) 為中心,周圍圍繞多張 Dimension Tables (維度表)
    • 優勢:查詢邏輯簡單,JOIN 路徑短,深受 BI 工具支援。
  • Snowflake Schema (雪花模型)
    • 星狀模型的變體,將維度表進一步正規化(例如:將「產品維度」拆分為「產品」與「產品類別」)。
    • 優勢:節省儲存空間,維護容易;但 JOIN 層數過多會影響大數據查詢效能。
  • Data Vault
    • 專為企業級資料倉儲 (EDW) 設計,由 Hub (核心鍵), Link (關聯), Satellite (屬性) 組成。
    • 優勢:極高的擴充性,能完整保留歷史變更軌跡,適合整合異質來源系統。
  • Wide Column Store
    • 代表:HBase, Cassandra。
    • 特性:基於 Google BigTable 論文,支援稀疏矩陣儲存,Row Key 設計決定效能。
    • 適用:寫入量極大且需隨機讀取的場景(如 Time-series data, Log data)。

大數據的資料工程:反正規化與效能優化

在大數據處理(如 Spark/Hive)中,Shuffle (跨節點資料傳輸) 是效能殺手。為了減少 Shuffle,我們必須打破傳統資料庫設計的圭臬。

1. 正規化 vs. 反正規化

特性 正規化 (Normalization) 反正規化 (Denormalization)
目標 消除冗餘,確保資料一致性 (Consistency) 提升讀取效能 (Read Performance)
主要操作 寫入時僅更新單一表 寫入時需更新多處,讀取時單表掃描
JOIN 需求 高 (需關聯多張表還原資訊) 低 (資訊已預先整合)
適用場景 OLTP (交易系統) OLAP (分析系統)

2. 反正規化的具體實作 (Implementation)

在大數據 Pipeline (ETL/ELT) 中,我們透過以下方式實作反正規化:

  • 預先合併 (Pre-joining / Wide Table): 將 Fact Table 與常用的 Dimension Tables 在 ETL 階段就 Join 起來,形成一張包含數百個欄位的「寬表」。分析師查詢時無需再做 Join,直接對寬表進行 GROUP BY
  • 巢狀結構 (Nested Structures): 利用 Parquet/Avro 等格式支援 Struct, Array, Map 的特性。例如,不將訂單明細 (Line Items) 存成另一張表,而是作為一個 Array 直接存入訂單 (Order) 表的同一列中。這實現了 Data Locality,讀取一次即可獲得完整資訊。
  • 實體化視圖 (Materialized Views / Pre-aggregation): 針對高頻查詢(如日營收、月活躍用戶),預先計算好聚合結果並存成實體表。查詢時直接讀取結果表,而非從原始 Log 重新計算。

3. 大數據查詢效能優化 (Query Optimization)

除了反正規化,針對儲存與計算引擎的優化至關重要:

  • 資料分區 (Partitioning)最關鍵的優化。將資料按時間(dt=2025-12-20)或地區切分目錄。查詢引擎可透過 Partition Pruning 直接跳過無關的檔案,避免全表掃描 (Full Table Scan)。
  • 欄式儲存 (Columnar Storage): 使用 ParquetORC 格式。這些格式按「欄」儲存資料,當 SQL 僅 SELECT 少數欄位時,I/O 量可降低 90% 以上。同時支援 Vectorization (向量化運算)
  • 壓縮技術 (Compression): 採用 SnappyZstd。雖然消耗 CPU 解壓,但大幅減少了 Disk I/O 與 Network Shuffle 的傳輸時間,這在大數據環境中通常是划算的 Trade-off。
  • 小檔案合併 (Compaction): HDFS NameNode 與物件儲存 API 對大量小檔案(KB 級別)處理效率極差。應定期執行 Compaction 任務,將檔案合併至 128MB - 1GB 大小。

大數據的資料檢驗工程

在大數據系統中,最棘手的不是程式崩潰 (Crash),而是 Silent Failure——程式成功執行,但產出的資料是錯誤的。

由於資料來源 (Source) 往往由不同團隊維護,變更可能不會通知資料團隊,因此我們需要建立主動的 Data Profiling (資料特徵監控) 機制。

常見檢驗指標與實作

  1. 資料量波動 (Volume Check)
    • 邏輯:比較今日 Row Count 與過去 7 天移動平均線 (Moving Average)。
    • 異狀:若驟降 50% 或暴增 200%,可能代表來源系統故障或重複傳送。
  2. 空值率監控 (Null Rate Check)
    • 邏輯:監控關鍵欄位(如 User ID)的 Null 比例。
    • 異狀:若 Null Rate 從 0.1% 飆升至 90%,通常意味著上游更改了欄位名稱或邏輯,導致 ETL 讀取不到值。
  3. 統計分佈異常 (Distribution Check)
    • 邏輯:計算數值欄位的 Max, Min, Avg, Median。
    • 異狀:例如「交易金額」出現負值,「年齡」超過 200,或平均值與歷史數據發生數量級的偏差。
  4. Schema 指紋校驗 (Schema Validation)
    • 邏輯:在 ETL 啟動前,先計算來源端 Schema 的 Hash 值。
    • 異狀:若 Hash 值改變(欄位型態變更、欄位增減),應觸發 Circuit Breaker (熔斷機制),停止後續任務,避免污染下游的 Data Warehouse。

結語

大數據工程不僅是寫 SQL 或 Python,更是一門關於 Trade-off (權衡) 的藝術。從資料庫模型的選擇、反正規化的程度,到儲存格式的壓縮比,每一個決定都在平衡計算資源、儲存成本與查詢效能。建立完善的監控體系,則是確保這座龐大數據工廠穩定運作的最後一道防線。


最後編輯於 2025-12-20