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 所须要的开销(多线程模型也有毛病,因为同节点上所有工作运行在一个进行中,因而,会呈现重大的资源争用,难以细粒度管制每个工作占用资源)
作者:京东批发 吴化斌
起源:京东云开发者社区 转载请注明起源