首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Hadoop MapReduce 程式設計入門(一):核心模型與本地模擬實現

     編輯:Java 相關知識

MapReduce 是 Google 提出的分散式並行計算模型,Hadoop 為其開源實現。本文透過一個不依賴 Hadoop 框架的本地 Java 範例,剖析 MapReduce 的核心流程:資料分桶、Map 並行處理、Reduce 聚合,幫助理解分散式計算的基礎邏輯。

範例目標

生成 30 個字串,統計每個字串中字元出現次數,最後匯總總字元數。雖非真實海量數據場景,但完整展示 MapReduce 三階段流程。

核心類:MyMapReduce

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()));
                }
            }
        }
    }
}

關鍵流程解析

1. 資料分桶

step1ConvertIntoBuckets 將 30 筆資料平均分入 5 個桶(每桶 6 筆),模擬 HDFS 區塊分佈或輸入分片。桶可存於記憶體、磁碟或叢集節點。

2. Map 並行執行

每個桶對應一個 StartThread,獨立計算字串長度(模擬 Map 函數),結果存入共享的 intermediateResults。真實 Hadoop 中,MapTask 運行於 DataNode,Master 監控任務狀態並處理失敗重試。

3. Reduce 聚合

step3RunReduceFunctionForAllBuckets 遍歷中間結果求和,對應 Reduce 階段的聚合邏輯。生產環境中包含 Shuffle、Sort、Combiner 等優化機制。

從本地模擬到分散式 Hadoop

本地模擬Hadoop MapReduce
ArrayList 分桶InputFormat 切片
Thread 並行MapTask 分散式運行
共享 List 收集結果Shuffle 將輸出傳輸至 ReduceTask
主執行緒等待聚合JobTracker/ApplicationMaster 協調
無容錯機制Task 失敗自動重試、推測執行

總結

此範例雖簡單,卻精準對應 MapReduce「分治、並行、聚合」的核心思想。理解這三階段流程,是掌握 Hadoop 乃至 Spark、Flink 等後續計算引擎的基石。下篇將進入真實 Hadoop API 開發與叢集部署實戰。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved