Spark 比 MapReduce(MR)快的原因可以总结如下:
-
内存计算:
- Spark 的核心设计是基于内存的计算模型,它将中间数据尽可能保留在内存中。这意味着在多次迭代或连续操作时,数据无需反复读写磁盘,从而显著减少I/O开销。
- 相比之下,MapReduce 的每个阶段之间都涉及到大量的磁盘读写操作,特别是shuffle过程中的排序和合并,这会导致显著的性能瓶颈。
-
DAG执行引擎:
- Spark 支持有向无环图(Directed Acyclic Graph, DAG)的任务调度模式,允许任务之间的依赖关系更复杂,多个操作可以在一个pipeline中连续执行而无需像MapReduce那样必须经过完整的map-reduce-shuffle流程。
- 在DAG模式下,Spark可以优化执行计划,避免不必要的数据重写,并支持流水线操作,使得计算更加高效。
-
高效的Shuffle机制:
- Spark 提供了多种shuffle策略,可以根据不同的应用需求灵活选择。其shuffle过程中可以选择是否进行排序和聚合,减少了不必要的计算量。
- 而MapReduce在shuffle阶段会强制执行分区、排序、分组等操作,这些操作对性能有一定影响。
-
Task执行粒度:
- Spark 中的任务粒度更细,它可以以线程级别的Task运行,这意味着在同一JVM进程中可以并发执行多个Task,降低了启动新进程带来的开销。
- MapReduce则使用多进程模型,每个MapTask和ReduceTask都需要单独的进程,进程创建和销毁的成本较高。
-
动态资源分配