MR与Spark的区别

MR与Spark的区别

1、运行环境

2、计算速度

        2.1 磁盘I/O

        2.2 并行度

3、资源

        3.1资源分配与共享

        3.2资源申请与释放

4、容错

5、功能适用

6、生态



1、运行环境

        MR运行在YARN上

        Spark支持多种运行模式:

  运行模式

  运行类型

说明

local

本地模式

常用于本地开发测试,分为local单线程和local-cluster多线程模式

standalone

集群模式

独立模式,在spark自己的资源调度管理框架上运行,该框架采用master/salve结构

yarn

集群模式

在yarn资源管理器框架上运行,由yarn负责资源管理,spark负责任务调度和计算

mesos

集群模式

在mesos资源管理器框架上运行,由mesos负责资源管理,spark负责任务调度和计算

k8s

集群模式

在k8s上运行

2、计算速度

MR与Spark的根本区别(关键优化)在于:Spark除了需要shuffle的计算,其他都是将结果/中间结果持久化在内存中,而MR是都需要落地到磁盘(map,reduce 落地都写),因此Spark格外适用于频繁读写中间结果的迭代计算。

而MR最终落地HDFS,Spark如果落地,会落地节点磁盘,因此如果只是简单的非迭代计算,MR组最终只会比Spark多消耗一部分(HDFS不同DataNode间的)网络IO。

        2.1 磁盘I/O

因此,速度区别之一在于磁盘I/O,即:

MR的map端将中间输出和结果存储在磁盘中,reduce端又需要从磁盘读写中间结果,势必造成磁盘IO成为瓶颈。

Spark允许将map端的中间输出和结果存储在内存中,reduce端在拉取中建结果时避免了大量的磁盘IO。

        2.2 并行度

此外,速度区别之二在于任务的并行度不同:

Spark会增加任务的并行度从而提高速度:由于将中间结果写到磁盘与从磁盘读取中建结果属于不同的环节,MR只是将他们简单的通过串行执行衔接起来。而Spark把不同的环节抽象为Stage,允许多个Stage既可以串行执行,也可以并行执行。

3、资源

MR是基于进程,Spark是基于线程。MR是多进程模型,而Spark是多线程模型。

Spark是粗粒度资源申请模式,而MR是细粒度资源申请模式。

        3.1资源分配与共享

MapReduce每分到一个任务会启动一个进程,每个task相互独立,申请资源和申请数据,再到计算完成结果存储都是独立进行的。

而spark的所有任务都只在一个进程中,每来一个任务启动一个线程,线程可以理解成在进程的基础之上又细分的更小的任务。同节点的任务运行在一个进程中,也就是运行在一个JVM中,共享内存和资源,也就是数据和资源都可以共用,不必频繁的调用数据和申请注销资源,这就非常适合进行内存密集型任务和低延迟性作业。同节点中的多线程会存在资源争抢的现象,难以细粒度的控制每个任务所应用的资源。

在资源控制上自然mr的单线程做的更好,毕竟它不存在争抢和控制。

        3.2资源申请与释放

多进程模型便于细粒度控制每个任务占用的资源,但会消耗较多的启动时间,不适合运行低延迟类型的作业,这是MapReduce广为诟病的原因之一。而多线程模型则相反,任务启动速度快,与之相反的是MapReduce Task进程的慢启动速度,通常需要1s左右。

简单说,Spark的多个task跑在同一个进程上,这个进程会伴随spark应用程序的整个生命周期,即使没有作业进行,进程也是存在的。MR的每一个task都是一个进程,当task完成时,进程也会结束。

所以,Spark比MR快的原因也在这,MR启动就会进行更细粒度的资源申请,即需要时申请资源,用完就销毁。缺点就是申请销毁都需要时间,并且不存在任务的并行。

但是spark把进程拿到以后,这个进程会一直存在,即使没有job在跑,所以后边的job可以直接启动,不需要再重新申请资源,但缺点也是Spark更加占用资源。

4、容错

Spark容错性更高,它通过弹性分布式数据集RDD来实现高效容错,RDD是一组分布式的存储在节点内存中的只读性质的数据集,这些集合是弹性的,某一部分丢失或者出错,可以通过整个数据集的计算流程的血缘关系来实现重建;MR的话也有容错,但是是以失败后重跑map task,reduce task的方式,成本相对较高。
Spark由于更细粒度的stage划分,也能够避免部分重复计算:当 Stage 中某个分区的 Task 执行失败后,Spark会重新对此 Stage 调度,但在重新调度的时候,会过滤已经执行成功的分区任务,所以不会造成重复计算和资源浪费。而MR如果task执行失败,就会重跑整个map/reduce task任务。

5、功能适用

Spark更加功能更加丰富:Spark提供了transformation和action(转换算子和行动算子)这两大类的多个功能的算子,另外还有流式处理Spark Streaming模块,离线计算Spark SQL、图计算GraphX等;MR只提供了map和reduce两种算子,流计算以及其他模块的支持比较缺乏。

6、生态

Spark框架和生态更为复杂,首先由RDD、血缘lineage、执行时的有向无环图DAG、stage划分等等。Spark作业都需要根据不同的业务场景的需要进行调优,以达到性能要求,MR框架及其生态相对较为简单,对性能的要求也相对较弱。