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 所需要的开销(多线程模型也有缺点,由于同节点上所有任务运行在一个进行中,因此,会出现严重的资源争用,难以细粒度控制每个任务占用资源)

作者:京东零售 吴化斌

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


↙↙↙阅读原文可查看相关链接,并与作者交流