MapReduce 的核心流程是其实现分布式计算的关键,通过将任务分解为 Map 和 Reduce 两个阶段,并结合中间的数据混洗(Shuffle)和排序(Sort)机制,实现对海量数据的并行处理。以下是其核心流程的详细描述:
1. 输入分片(Input Splitting)
- 目的:将输入数据划分为多个逻辑块(Split),每个块对应一个 Map 任务的输入。
- 实现:
- 分片大小通常与分布式文件系统(如 HDFS)的块大小(如 128MB)对齐,保证数据本地性(Data Locality)。
- 分片是逻辑划分,不实际切割数据,仅定义数据范围(如偏移量)。
- 优势:并行启动多个 Map 任务,避免单点处理瓶颈。
2. Map 阶段
-
任务:处理输入分片,生成中间键值对。
-
步骤:
- 读取数据:每个 Map 任务读取分配给它的输入分片。
- 执行用户定义的 Mapper 函数:
- 输入:
<Key1, Value1>(如文件偏移量、一行文本)。 - 处理:解析数据并生成中间键值对
<Key2, Value2>(如词频统计中的<单词, 1>)。
- 输入:
- 中间结果写入本地磁盘:
- Map 的输出暂存到运行 Map 任务的节点本地磁盘(非 HDFS),避免占用网络带宽。
- 数据按 分区(Partition) 分类,为后续 Reduce 阶段做准备(例如通过
hash(Key2) % R分配到 R 个 Reduce 任务)。
-
可选优化:Combiner(本地聚合):
- 在 Map 端对中间结果进行局部合并(如将
<word, [1,1]>合并为<word, 2>),减少传输到 Reduce 的数据量。
- 在 Map 端对中间结果进行局部合并(如将
3. Shuffle 与 Sort 阶段
- 目的:将 Map 输出的中间结果按 Key 分组并排序,确保相同 Key 的数据进入同一个 Reduce 任务。
- 详细流程:
(1) 分区(Partitioning)
- 每个 Map 任务的输出按 Key 的哈希值分配到不同的分区(Partition),每个分区对应一个 Reduce 任务。
- 例如:
partition = hash(Key2) % R(R 是 Reduce 任务数)。
(2) 溢写(Spill)
- Map 任务的内存缓冲区(默认 100MB)填满后,数据会按分区和 Key 排序后溢写到本地磁盘,生成多个临时文件。
- 排序依据:Key 的顺序(例如字典序)。
(3) 合并(Merge)
- Map 任务完成后,将所有临时文件合并为一个 分区且排序 的大文件,每个分区对应一个 Reduce 任务。
(4) 数据拉取(Fetch)
- Reduce 任务主动从所有 Map 任务的节点上拉取属于自己分区的数据。
- 若数据本地性优先,Reduce 任务可能被调度到已存有所需数据的节点。
(5) 全局排序与分组
- Reduce 端将拉取的所有数据按 Key 全局排序,并合并相同 Key 的 Value 列表,形成
<Key2, [Value2]>的输入。
4. Reduce 阶段
- 任务:对 Shuffle 后的分组数据执行归约操作,生成最终结果。
- 步骤:
- 读取排序后的数据:Reduce 任务从多个 Map 节点拉取并合并后的数据。
- 执行用户定义的 Reducer 函数:
- 输入:
<Key2, List<Value2>>(如<word, [1,1,1]>)。 - 处理:对 Value 列表进行聚合(如求和、去重、过滤等),输出
<Key3, Value3>(如<word, 3>)。
- 输入:
- 结果写入存储系统:
- 输出通常写入 HDFS,每个 Reduce 任务生成一个独立的结果文件(如
part-r-00000)。
- 输出通常写入 HDFS,每个 Reduce 任务生成一个独立的结果文件(如
5. 输出结果
- 存储位置:Reduce 的输出文件存储在分布式文件系统(如 HDFS)中。
- 文件命名规则:按 Reduce 任务编号命名(例如
part-r-00000,part-r-00001)。 - 合并结果:若需要全局有序结果,需额外处理(MapReduce 默认不保证跨 Reduce 任务的有序性)。
流程图解
输入数据 → Split1 → Map → (Partition, Sort, Spill) → Merge → Shuffle → Reduce → 输出结果
输入数据 → Split2 → Map → (Partition, Sort, Spill) → Merge ↗
输入数据 → Split3 → Map → (Partition, Sort, Spill) → Merge ↗
关键特点
- 并行性:Map 和 Reduce 任务均分布式执行,充分利用集群资源。
- 数据本地性:优先在存储数据的节点上运行 Map 任务,减少网络传输。
- 容错机制:
- 失败的任务会被重新调度到其他节点。
- 推测执行(Speculative Execution)避免慢节点拖慢整体进度。
示例:词频统计(WordCount)
- Map 阶段:
- 输入:
<行号, "hello world hello">。 - 输出:
<"hello", 1>,<"world", 1>,<"hello", 1>。
- 输入:
- Shuffle & Sort:
- 按 Key 分区(如
hash("hello") % 2),排序后生成<"hello", [1,1]>和<"world", [1]>。
- 按 Key 分区(如
- Reduce 阶段:
- 输入:
<"hello", [1,1]>→ 输出<"hello", 2>。 - 输入:
<"world", [1]>→ 输出<"world", 1>。
- 输入:
总结
MapReduce 的核心流程通过 分片、Map、Shuffle/Sort、Reduce 四个阶段,将复杂任务拆解为可并行化的子任务,同时通过自动化的数据分发、排序和容错机制,实现了对海量数据的高效处理。其设计思想(分而治之)已成为分布式计算的经典范式。
8916

被折叠的 条评论
为什么被折叠?



