問題場景
單次需處理 100GB+ 文本資料(上千萬寵物記錄),記憶體無法全載入。需先逐條處理產出中間結果,再對所有中間結果綜合分析(二次處理)。
核心策略:MapReduce 風格分區
若二次處理的聚合運算滿足結合律(或可拆解為滿足結合律的子運算),可採用分區處理:
- Partition 階段:讀取原始檔,根據關鍵欄位(如寵物品種、地區)計算哈希,將記錄寫入
K 個中間檔案(part-00000 ~ part-0000K)。同一鍵值的記錄落入同一檔案。
- Map 處理:對每個中間檔獨立執行「逐條處理 + 局部聚合」,產出局部結果檔。
- Reduce 合併:對每個分區的局部結果執行最終聚合,輸出最終結果。
不滿足結合律時的替代方案
- 外部排序:將中間結果按關鍵欄位排序(歸併排序落盤),再流式掃描聚合。
- 資料庫臨時表:導入 SQLite/PostgreSQL,建立索引後用 SQL 聚合。
- 流式處理框架:Apache Flink、Spark Streaming、Kafka Streams 原生支援大狀態聚合與容錯。
工程落地建議
- 中間檔採用列式格式或壓縮,減少 I/O。
- 分區數
K 設為 CPU 核心數 × 2~4,平衡並行度與檔案句柄數。
- 記錄處理邏輯冪等,支援斷點續傳(記錄已處理行號/位移)。
總結
「分而治之」是大數據單機處理的核心:將大問題拆解為多個可放入記憶體的小問題,獨立解決後合併。