MapReduce 是 Hadoop 中實現分布式并行計算的核心框架,其工作原理基于“分而治之”的思想,將大規模數據處理任務分解為 Map(映射) 和 Reduce(歸約) 兩個階段。
?一、MapReduce 核心流程
?1. Input 階段
- 輸入數據分片(Input Split)
輸入文件被按塊(默認 128MB)分割為多個分片(Input Split),每個分片由一個 Map 任務處理。
- 數據讀取
使用 ?InputFormat?(如 ?TextInputFormat?)讀取分片數據,將數據轉換為 ?<key, value>? 鍵值對(例如每行文本的偏移量為 Key,內容為 Value)。
2. Map 階段
- 并行處理
每個分片數據被分發到不同節點的 Map 任務并行處理。
- 用戶自定義邏輯
用戶通過實現 ?map()? 函數對每個 ?<key, value>? 進行處理,輸出中間結果 ?<intermediate_key, intermediate_value>?。
- 示例:在 WordCount 中,Map 階段將每行文本拆分為單詞,輸出 ?<單詞, 1>?。
?
3. Shuffle & Sort 階段
?
- 數據分區(Partition)
中間結果按 ?intermediate_key? 分配到不同分區(默認按哈希值分區),每個分區對應一個 Reduce 任務。
- 排序(Sort)
同一分區內的鍵值對按 ?intermediate_key? 排序,確保相同 Key 的數據聚集。
- 合并(Combine)
可選步驟,在 Map 節點本地對相同 Key 的值進行合并(如累加計數),減少網絡傳輸量。
4. Reduce 階段
- 數據拉取(Fetch)
Reduce 任務從所有 Map 節點拉取對應分區的數據。
- 用戶自定義邏輯
用戶通過實現 ?reduce()? 函數對相同 Key 的值進行聚合(如求和、去重等),輸出最終結果 ?<output_key, output_value>?。
- 示例:在 WordCount 中,Reduce 階段將 ?<單詞, [1,1,1...]>? 合并為 ?<單詞, 總次數>?。
?
5. Output 階段
?
- 結果寫入
使用 ?OutputFormat?(如 ?TextOutputFormat?)將 Reduce 結果寫入 HDFS 或本地文件。
二、關鍵設計理念
1.?分布式并行計算
通過多節點同時處理數據分片,顯著提升大數據處理效率。
2.?容錯性
節點故障時,任務會被重新調度到其他節點執行。
3.?數據本地化(Data Locality)
Map 任務優先在存儲數據的節點上執行,減少網絡傳輸開銷。
?
三、經典示例:WordCount
?
1.?輸入:文本文件
hello world
hadoop mapreduce
?
2.?Map 階段輸出:
(hello, 1), (world, 1), (hadoop, 1), (mapreduce, 1)
3.?Shuffle & Sort:
相同 Key 的值被聚合排序,如 ?hello? 對應所有 ?1?。
4.?Reduce 階段輸出:
(hello, 1), (world, 1), (hadoop, 1), (mapreduce, 1)
四、適用場景
- 批處理任務:日志分析、數據統計、ETL 等。
- 離線計算:對實時性要求不高的大規模數據處理。
五、局限性
- 實時性差:任務需等待所有數據處理完成。
- 迭代計算低效:多次迭代會產生大量中間磁盤讀寫。
- 資源管理優化:Hadoop 2.x 引入 YARN 后,資源利用率顯著提升。