
1) 【一句话结论】Hadoop MapReduce采用分阶段、按阶段调度的批处理模型(以磁盘I/O为主),适合静态、一次性的大规模数据批处理;Spark基于弹性分布式数据集(RDD)的内存计算模型(支持迭代),适合需要多次转换、交互式或流式处理的大规模数据。
2) 【原理/概念讲解】
MapReduce的核心是分阶段执行:输入数据经Map阶段处理为中间键值对,Shuffle阶段按键分组并排序,Reduce阶段聚合分组结果。任务调度按阶段提交,每个阶段完成后启动下一阶段。容错通过检查点(Checkpoint)保存中间结果或重算失败任务。内存管理主要依赖磁盘,数据读写频繁,I/O开销大。类比:工厂流水线,每个阶段(Map、Shuffle、Reduce)是独立工序,数据在阶段间通过磁盘传输。
Spark的核心是弹性分布式数据集(RDD):容错的、分区的只读对象集合。执行模型基于RDD的转换(Transformation,如map、filter)和动作(Action,如reduce、collect)。任务调度根据RDD的依赖图(宽依赖/窄依赖)动态调度任务。容错通过操作历史(Lineage)或检查点,快速恢复失败任务。内存管理将中间结果缓存内存,减少磁盘I/O,支持迭代计算。类比:内存中的数据集,支持快速转换和迭代,类似编程中的变量操作,数据在内存中传递,减少磁盘读写。
3) 【对比与适用场景】
| 特性 | Hadoop MapReduce | Spark |
|---|---|---|
| 定义 | 分阶段(Map、Shuffle、Reduce)的批处理框架 | 基于RDD的内存计算框架,支持迭代和交互式计算 |
| 任务调度 | 按阶段提交,每个阶段完成后启动下一阶段 | 按RDD依赖图(宽/窄依赖)动态调度任务 |
| 内存管理 | 主要依赖磁盘,数据读写频繁,I/O开销大 | 中间结果缓存内存,减少磁盘I/O,支持迭代 |
| 容错机制 | 检查点或重算失败任务(可能重算整个阶段) | Lineage或检查点,快速恢复,重算失败分区 |
| 典型场景 | 静态、一次性的大规模数据批处理(如日志分析) | 需要多次转换、迭代(如机器学习训练、交互式查询) |
| 性能特点 | 适合数据量大、计算简单、不频繁转换的场景 | 适合数据转换频繁、迭代计算、流式处理(通过Spark Streaming) |
4) 【示例】(计算文本文件中每个单词的出现次数)
# 1. Map阶段:将每个单词转换为(word, 1)
map_task = (word, 1) for word in line.split()
# 2. Shuffle阶段:按word分组
shuffle = group by word
# 3. Reduce阶段:对每个分组求和
reduce_task = sum(counts) for word in group
text_rdd = sc.textFile("input.txt")
words_rdd = text_rdd.flatMap(lambda line: line.split())
word_counts_rdd = words_rdd.reduceByKey(lambda a, b: a + b)
result = word_counts_rdd.collect()
5) 【面试口播版答案】(约90秒)
“面试官您好,Hadoop MapReduce和Spark的核心执行模型差异在于,MapReduce是分阶段、按阶段调度的批处理模型,以磁盘I/O为主,而Spark是基于弹性分布式数据集(RDD)的内存计算模型,支持迭代。具体来说,MapReduce的执行分为Map、Shuffle、Reduce三个阶段,任务调度按阶段提交,每个阶段完成后才启动下一阶段,容错通过检查点或重算失败任务,内存管理依赖磁盘,导致I/O开销大,适合静态、一次性的大规模数据批处理,比如日志聚合。而Spark的执行基于RDD的转换和动作,任务调度根据依赖图动态调度,容错通过lineage或检查点,中间结果缓存内存,减少磁盘I/O,支持迭代计算,适合需要多次转换、交互式或流式处理,比如机器学习训练或实时分析。比如计算单词计数,MapReduce需要三个阶段,数据在磁盘间传输;Spark通过内存缓存中间结果,转换更高效。总结来说,MapReduce适合批处理、数据量大、计算简单场景,Spark适合迭代、交互式、流式处理场景。”
6) 【追问清单】
7) 【常见坑/雷区】