mapreduce的工作原理
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 后,资源利用率显著提升。