为什么Spark比MapReduce快?
小记。
MapReduce是基于磁盘
的计算引擎,这里的"基于磁盘"指的是,mr多个作业之间的数据通信,是基于磁盘IO的
,Map阶段产生的数据必须要全部的写入磁盘中,且这些数据会进行sort和combine操作,再进入reduce阶段,IO效率十分低。
Spark是基于内存
的DAG计算
模型,能够对计算过程进行优化,减少shuffle和数据落盘的次数
,在每个阶段中都会尽可能的使用内存,大大提高计算的效率,并且数据通信也是基于内存
的。MR是多进程
运行,虽然易控制资源且一个进程失败不影响其他进程,但是进程的启动和销毁会占用大量的时间,从而影响效率。这也是我们使用MR执行简单任务时也会耗费很长时间的主要原因。
Spark是多线程
运行,首先线程的启停比进程快很多。粗粒度的资源申请,效率高,但是也有一个缺点:若同一节点execute中有多个task时,会容易出现资源被征用的情况。因为spark中资源分配的最细粒度是execute,无法对更细的task进行资源控制。所以在处理巨大数量级的任务时,在资源有限的情况下,运行会不稳定。- MR只要有reduce,就必然要进行排序和shuffle。mr的map端shuffle对map的输出结果写入缓存、分区、排序、合并后再写入磁盘。reduce端的shuffle是对不同map机器上取回输出的数据,进行归并后再交由reduce处理。
Spark提供了多种shuffle方案的选择,高效利用内存,同时有可能减少或避免shuffle操作。 - spark有更加灵活的内存管理机制:堆内内存和堆外内存和动态内存管理机制。
注意:并不是所有情况下Spark都比MapReduce要快,Spark对机器性能的要求相对较高,RDD的并行计算又一排瘀多核CPU的支持。
所以在机器性能有限,或者数据量巨大的情况下,可以选择更加稳定的MapReduce。