Spark 为什么通常比 MapReduce 快
MapReduce 的执行方式
一个 MapReduce 作业只有 map 和 reduce 两个阶段。多步计算要串联多个作业,每个作业的中间结果都写回 HDFS,下一个作业再读出来。每个任务通常运行在单独的 JVM 进程里,启动开销不小。
Spark 的几个不同
- DAG 和流水线:Spark 把整个计算表示成有向无环图,按宽依赖,也就是需要 shuffle 的地方,切分成多个 stage。同一个 stage 内的窄依赖算子,例如连续的
map、filter,在一个任务里流水线执行,中间结果不落盘。 - 内存缓存:反复使用的数据集可以用
cache或persist留在内存里。机器学习、图计算这类迭代算法受益最大。 - 常驻的 Executor:Executor 进程在应用运行期间常驻,任务以线程方式运行,调度和启动都更轻。
- 惰性求值:转换操作只记录计划,遇到行动操作才执行,便于整体优化。Spark SQL 还有 Catalyst 优化器和代码生成。
需要注意的地方
- Spark 的 shuffle 同样会把数据写到磁盘。
- 常说的"快 100 倍",指的是数据能放进内存的迭代计算。一次性的批处理、数据量远超内存时,差距会小很多。
- 缓存要有取舍:内存不够时缓存会被淘汰或溢写,反而增加开销,用完记得
unpersist。