MapReduce 是 Hadoop 生态中负责批量数据计算的核心组件,它把复杂的分布式计算抽象为 Map 与 Reduce 两个阶段,让开发者无需关心任务调度、数据分片与容错细节即可处理海量数据。本页从编程模型、执行流程、调优策略到典型应用场景,为你梳理一条可落地的 MapReduce 学习路径。
MapReduce 采用「分而治之」的思想:输入数据被切分为多个分片,每个分片交给一个 Map 任务并行处理,产出中间键值对;框架在 Shuffle 阶段按键对中间结果进行分区、排序与归并,再交由 Reduce 任务汇总输出。整个过程中,开发者只需实现 Mapper、Reducer 以及可选的 Partitioner、Combiner 等组件。
一个 MapReduce 作业从提交到完成,会经历资源申请、任务分发、数据本地化计算与结果落盘等多个环节。理解这条链路,是排查作业变慢、数据倾斜等问题的前提。
客户端计算输入分片并上传作业资源,JobSubmitter 向 ResourceManager 申请 ApplicationMaster。
Map 任务读取分片并输出中间结果,经环形缓冲区溢写、合并后由 Reduce 端拉取。
Reduce 任务对归并后的数据执行用户逻辑,结果写入 HDFS,作业状态回写历史服务器。
| 调优维度 | 常用参数 | 作用说明 |
|---|---|---|
| 分片大小 | mapreduce.input.fileinputformat.split.maxsize | 控制 Map 任务数量与单任务数据量 |
| 溢写与合并 | mapreduce.task.io.sort.mb | 影响 Map 端缓冲区大小与磁盘溢写次数 |
| Reduce 并行度 | mapreduce.job.reduces | 决定 Reduce 任务数量与输出文件个数 |
| 数据压缩 | mapreduce.map.output.compress | 降低 Shuffle 阶段网络与磁盘 IO 压力 |
建议先学 MapReduce 理解分布式计算的基本范式与 Shuffle 机制,再学习 Spark 的内存计算与 DAG 调度,两者对照学习效果更好。
先看是否存在数据倾斜,再检查分片数量是否过少、Shuffle 数据量是否过大,最后确认是否开启 Map 端聚合与中间结果压缩。
不建议。Reduce 数量决定输出文件数与并行度,过多会产生大量小文件并增加调度开销,通常结合数据量与集群资源综合评估。
从 HDFS 存储到 MapReduce 计算,再到 Hive 与 Spark,按路径循序渐进掌握核心组件。