MapReduce 是 Google 提出的分散式並行計算模型,Hadoop 為其開源實現。本文透過一個不依賴 Hadoop 框架的本地 Java 範例,剖析 MapReduce 的核心流程:資料分桶、Map 並行處理、Reduce 聚合,幫助理解分散式計算的基礎邏輯。
生成 30 個字串,統計每個字串中字元出現次數,最後匯總總字元數。雖非真實海量數據場景,但完整展示 MapReduce 三階段流程。
public class MyMapReduce {
List buckets = new ArrayList();
List intermediateResults = new ArrayList();
List values = new ArrayList();
public void init() {
// 步驟 1:生成測試資料
for (int i = 1; i <= 30; i++) {
values.add("https://pconline900.javaeye.com" + i);
}
// 步驟 2:資料分桶
List b = step1ConvertIntoBuckets(values, 5);
// 步驟 3:並行 Map 處理
List res = step2RunMapFunctionForAllBuckets(b);
// 步驟 4:Reduce 聚合
step3RunReduceFunctionForAllBuckets(res);
}
// 將資料均勻分配到 N 個桶
public List step1ConvertIntoBuckets(List list, int numberOfBuckets) { ... }
// 為每個桶啟動執行緒執行 Map
public List step2RunMapFunctionForAllBuckets(List list) {
for (int i = 0; i < list.size(); i++) {
new StartThread((List) list.get(i)).start();
}
Thread.sleep(1000); // 等待完成
return intermediateResults;
}
// Reduce 階段:匯總所有中間結果
public void step3RunReduceFunctionForAllBuckets(List list) {
int sum = 0;
for (Object o : list) sum += Integer.parseInt((String) o);
System.out.println("Total Count is " + sum);
}
// Map 執行緒:計算字串長度作為字元數
class StartThread extends Thread {
private List tempList;
public StartThread(List list) { this.tempList = list; }
public void run() {
for (Object o : tempList) {
String str = (String) o;
synchronized (this) {
intermediateResults.add(String.valueOf(str.length()));
}
}
}
}
}
step1ConvertIntoBuckets 將 30 筆資料平均分入 5 個桶(每桶 6 筆),模擬 HDFS 區塊分佈或輸入分片。桶可存於記憶體、磁碟或叢集節點。
每個桶對應一個 StartThread,獨立計算字串長度(模擬 Map 函數),結果存入共享的 intermediateResults。真實 Hadoop 中,MapTask 運行於 DataNode,Master 監控任務狀態並處理失敗重試。
step3RunReduceFunctionForAllBuckets 遍歷中間結果求和,對應 Reduce 階段的聚合邏輯。生產環境中包含 Shuffle、Sort、Combiner 等優化機制。
| 本地模擬 | Hadoop MapReduce |
|---|---|
| ArrayList 分桶 | InputFormat 切片 |
| Thread 並行 | MapTask 分散式運行 |
| 共享 List 收集結果 | Shuffle 將輸出傳輸至 ReduceTask |
| 主執行緒等待聚合 | JobTracker/ApplicationMaster 協調 |
| 無容錯機制 | Task 失敗自動重試、推測執行 |
此範例雖簡單,卻精準對應 MapReduce「分治、並行、聚合」的核心思想。理解這三階段流程,是掌握 Hadoop 乃至 Spark、Flink 等後續計算引擎的基石。下篇將進入真實 Hadoop API 開發與叢集部署實戰。