spark为什么比mapreduce快?

首先廓清几个误区:

1:两者都是基于内存计算的,任何计算框架都必定是基于内存的,所以网上说的spark是基于内存计算所以快,显然是谬误的

2;DAG计算模型缩小的是磁盘I/O次数(相比于mapreduce计算模型而言),而不是shuffle次数,因为shuffle是依据数据重组的次数而定,所以shuffle次数不能缩小

所以总结spark比mapreduce快的起因有以下几点:

1:DAG相比hadoop的mapreduce在大多数状况下能够缩小磁盘I/O次数

因为mapreduce计算模型只能蕴含一个map和一个reduce,所以reduce完后必须进行落盘,而DAG能够间断shuffle的,也就是说一个DAG能够实现好几个

mapreduce,所以dag只须要在最初一个shuffle落盘,就比mapreduce少了,总shuffle次数越多,缩小的落盘次数就越多

2:spark shuffle 的优化

mapreduce在shuffle时默认进行排序,spark在shuffle时则只有局部场景才须要排序(bypass技师不须要排序),排序是十分耗时的,这样就能够放慢shuffle速度

3:spark反对将须要重复用到的数据进行缓存

所以对于下次再次应用此rdd时,不再再次计算,而是间接从缓存中获取,因而能够缩小数据加载耗时,所以更适宜须要迭代计算的机器学习算法

4:工作级别并行度上的不同

mapreduce采纳多过程模型,而spark采纳了多线程模型,多过程模型的益处是便于细粒度管制每个工作占用的资源,但每次工作的启动都会耗费肯定的启动工夫,即mapreduce的map task 和reduce task是过程级别的,都是jvm过程,每次启动都须要从新申请资源,耗费不必要的工夫,而spark task是基于线程模型的,通过复用线程池中的线程来缩小启动,敞开task所须要的开销(多线程模型也有毛病,因为同节点上所有工作运行在一个进行中,因而,会呈现重大的资源争用,难以细粒度管制每个工作占用资源)

作者:京东批发 吴化斌

起源:京东云开发者社区 转载请注明起源