spark 为什么比 mapreduce 快?
1:两者都是基于内存计算的,任何计算框架都肯定是基于内存的,所以网上说的 spark 是基于内存计算所以快,显然是错误的
2;DAG 计算模型减少的是磁盘 I/O 次数(相比于 mapreduce 计算模型而言),而不是 shuffle 次数,因为 shuffle 是根据数据重组的次数而定,所以 shuffle 次数不能减少
因为 mapreduce 计算模型只能包含一个 map 和一个 reduce,所以 reduce 完后必须进行落盘,而 DAG 可以连续 shuffle 的,也就是说一个 DAG 可以完成好几个
mapreduce,所以 dag 只需要在最后一个 shuffle 落盘,就比 mapreduce 少了,总 shuffle 次数越多,减少的落盘次数就越多
mapreduce 在 shuffle 时默认进行排序,spark 在 shuffle 时则只有部分场景才需要排序(bypass 技师不需要排序),排序是非常耗时的,这样就可以加快 shuffle 速度
所以对于下次再次使用此 rdd 时,不再再次计算,而是直接从缓存中获取,因此可以减少数据加载耗时,所以更适合需要迭代计算的机器学习算法
mapreduce 采用多进程模型,而 spark 采用了多线程模型,多进程模型的好处是便于细粒度控制每个任务占用的资源,但每次任务的启动都会消耗一定的启动时间,即 mapreduce 的 map task 和 reduce task 是进程级别的,都是 jvm 进程,每次启动都需要重新申请资源,消耗不必要的时间,而 spark task 是基于线程模型的,通过复用线程池中的线程来减少启动,关闭 task 所需要的开销(多线程模型也有缺点,由于同节点上所有任务运行在一个进行中,因此,会出现严重的资源争用,难以细粒度控制每个任务占用资源)
作者:京东零售 吴化斌
来源:京东云开发者社区 转载请注明来源