MapReduce 是 Hadoop 的核心计算框架,用于分布式处理大规模数据集。它的核心思想是 **"分而治之"**,将任务拆分为多个子任务并行处理,最终汇总结果。以下是其工作原理的详细解析
1. 核心阶段
MapReduce 的执行过程分为三个阶段:
1. Map 阶段
2. Shuffle & Sort 阶段
3. Reduce 阶段
2. 详细流程
(1) Map 阶段
- 输入分片(Input Splits)
输入数据被逻辑划分为多个分片(Split),每个分片由一个 Map 任务处理。
- 分片大小通常等于 HDFS 块大小(默认 128MB)。
- 分片是逻辑划分,实际数据仍在 HDFS 中物理存储。
- Map 任务执行
- 每个 Map 任务处理一个分片,逐行读取数据。
- 调用用户编写的 `map()` 函数,将输入键值对(如 `<行号, 行内容>`)转换为中间键值对(如 `<单词, 1>`)。
- 输出中间结果存储在 Map 节点的本地磁盘(而非 HDFS)中。
(2) Shuffle & Sort 阶段
- 分区(Partitioning)
Map 输出的中间键值对按 Key 的哈希值分配到不同的 Reduce 分区(默认使用 `HashPartitioner`)。
- 分区数等于 Reduce 任务数(由用户指定)。
- 排序(Sorting)
每个分区内的数据按键(Key)排序,保证相同 Key 的数据聚集在一起。
- 合并(Combiner,可选)
本地执行类似 Reduce 的合并操作(如对 `<单词, [1,1]>` 合并为 `<单词, 2>`),减少网络传输量。
- 数据拉取(Fetch)
Reduce 任务从所有 Map 节点拉取属于自己的分区数据。
(3) Reduce 阶段
- 合并与归约
Reduce 任务将来自不同 Map 的同一分区数据合并,按键分组(如 `<单词, [1,1,1]>`)。
- 调用用户编写的 `reduce()` 函数,处理每个键及其值集合(如求和、去重等)。
- 最终结果写入 HDFS。
---
3. 关键机制
(1) 容错机制
- Task 重试
若某个 Map 或 Reduce 任务失败,YARN 会自动在其他节点重新调度该任务。
- 推测执行(Speculative Execution)
对执行过慢的任务启动备份任务,取先完成的结果,避免集群资源被拖慢。
(2) 数据本地化优化
- 优先调度
尽量将 Map 任务调度到存储输入数据的节点,减少网络传输。
---
4. 示例:词频统计(WordCount)
1. 输入分片
将文本文件划分为多个 Split(如 3 个 Split)。
2. Map 阶段
每个 Map 处理一个 Split,输出 `<word, 1>`。
3.Shuffle & Sort
相同单词的键值对被分配到同一个 Reduce 分区并按字母排序。
4. **Reduce 阶段**
Reduce 对每个单词的 `[1,1,...]` 求和,得到 `<word, total_count>`。
---
5. 核心组件角色
| 组件 | 作用 |
|--------------------|------------------------------------------------------------|
| **JobClient** | 提交作业到集群,监控状态。 |
| **ResourceManager**| YARN 的资源调度器,分配容器(Container)。 |
| **NodeManager** | 在节点上启动和管理容器(运行 Map/Reduce 任务)。 |
| **ApplicationMaster**| 协调单个作业的执行,监控任务进度。 |
---
6. 优缺点
- 优点
- 线性扩展性:通过增加节点处理 PB 级数据。
- 容错性强:自动处理节点故障。
- 适合批处理:离线分析大规模静态数据。
- 缺点
- 延迟高:不适合实时处理。
- 中间结果写磁盘:性能不如内存计算框架(如 Spark)。
---
7. 执行命令示例
提交一个 MapReduce 作业(如 WordCount):
hadoop jar hadoop-mapreduce-examples.jar wordcount /input /output
---
通过这种分阶段、分布式的处理方式,MapReduce 能够高效处理海量数据,是 Hadoop 生态的基石之一。
MapReduce
最新推荐文章于 2025-05-25 10:25:39 发布