1.中间结果基于内存,迭代计算的中间结果不落盘直接在内存中传递。只有shuffle时或中间结果内存存不下才落盘。而MR的中间结果肯定会落盘。比如运行pageRank或者机器学习的算法,有可能要迭代几百次。
在sparkUI中,序列化和反序列化的时间往往是最久的。这样差距就显现出来了。
2.粗粒度资源申请 + 基于多线程的任务调度机制
- 1.spark也使用了mapreduce分而治之的思想。但mr的task基于进程,spark的job会划分为stage,进而切分为task,由Executor进程的线程池执行。进程的切换和开启开销远大于线程。迭代计算时,mr提交一个job就要开一个进程,就会申请资源,而spark的资源在application开始执行时就申请好了。
- 2.单个job的场景下spark优势并不大。但实际场景中的任务都是由很多job组成的,比如一个中等规模的join操作就有可能有10多个job。进行这种迭代计算时,mr执行完一个job就释放资源然后下一个job重新申请,重新开进程。而spark由application统一申请资源,application提交时已经把所有资源申请好,只需要从线程池拿线程执行一个个job即可。
3.Task的执行有优化:推测执行,数据本地化。
这一点mr也有,但spark的更先进,它有4种本地化模式,可以实现 process local。
4.spark有持久化机制,可以把数据持久化到内存或者磁盘中,减少重复的数据加载,还可以容错。MR也有缓存,但目的是为了提高磁盘IO效率
5.相比mr,spark的shuffle做了优化
2.0版本之后只有sortedShuffle
- SSM的普通机制减少文件的生成
- SSM的优化机制取消了排序
6.使用DAG来组织逻辑,逻辑计划自动合并、优化
DAG由一系列RDD通过血缘组成,通过job,stage的划分,来实现计算过程的优化。使用mr时,开发者常常花费大量时间考虑如何把操作组合到一起,以减少 MapReduce 的迭代次数。而在 Spark 的DAG可以自动优化,写出一个非常复杂的映射并不见得能比使用很多简单的连续操作获得好很多的性能。spark提供了多种算子,算子内部也进行了优化,可以更快的处理业务。而MR模型只有map和reduce2个阶段,很多代码需要自己封装。因此,用户可以用更小的操作来组织他们的程序,这样也使这些操作更容易管理。
7.提供丰富的算子,减少开发成本
算子的优势体现为:
- 1.将分布式的操作封装,只需要提供实现逻辑。就比如咱们现在,规定12点吃饭,我只需要在班里说一遍就行了吧,不需要跑到每个人耳朵边上说几点吃饭吧。而且我只规定了几点吃饭,没规定你吃什么吧,你吃盒饭去那边喝羊汤都行。所以高阶函数的好处就是更灵活、规范,如果你对既有流程不满意,当然也可以自己定义一个算子。
- 2.常用逻辑封装,而MR只有2个阶段,很多逻辑需要自己实现
- 3.分为转换、行动、持久化算子,其中转换算子懒执行、又叫延迟执行
- 方便调优,提高效率。有利于逻辑执行计划(DAG)的生成
- 节省资源。只要任务开启,即使没有计算发生,也会抢占资源。