研究了一段时间,简单对比了二者不同点,也是Spark计算更有MapReduce的原因所在。
有一个误区,Spark 是基于内存的计算,所以快,这不是主要原因,要对数据做计算,必然得加载到内存, MapReduce也是如此,只不过 Spark 支持将需要反复用到的数据给 Cache 到内存中,减少数据加载耗时,所以 Spark 跑机器学习算法比较在行(需要对数据进行反复迭代)
1,交换数据的方式
MR 多使用hdfs做数据交换,多节点会带来IO压力;Spark多是基于本地磁盘做数据交换。
2,执行单元:
MR 的task的执行单元是进程,进程的创建销毁的开销较大;Spark的task执行单元是线程,开销较小。
3,缓存
MR 基本上没有使用缓存,读取效率低;Spark是用Buffle KV做缓存,很适合算法场景的多次迭代计算,也可以了解一下“钨丝计划”。
4,shuffle
MR的shuffle 过程每一个task 会产生多个小文件,task之间的文件无法共用;Spark 的shuffle过程会合并小文件,保持task和file是一对一,来精简小文件的数量。
5,数据
MR的数据多是hdfs,一对Map和Reduce 与其他MR是独立的,上下游执行阶段是没有血缘记录的;Spark的数据是RDD,多MR形式来共享数据,构建了一个DAG(有向无环图),上下游执行阶段是有血缘记录的,减少了重复拉取数据的成本。
6,资源申请粒度
MapReduce是每一个task去独自做资源申请,粒度较细,Spark是整体job来做资源申请,粒度较粗。
注释:MR 的过程:Map、Sort、Combine、Shuffle、Reduce。