首先大数据涉及两个方面:分布式存储系统(GFS)和分布式计算框架(MapReduce)。
1.MapReduce包含5 个步骤:Map、Sort、Combine、Shuffle 以及Reduce。这5 个步骤中最重要的就是Map 和Reduce。Map 步骤是在不同机器上独立且同步运行的,它的主要目的是将数据转换为 key-value 的形式;而 Reduce 步骤是做聚合运算,它也是在不同机器上独立且同步运行的。Map 和 Reduce 中间夹杂着一步数据移动,也就是 shuffle,这步操作会涉及数量巨大的网络传输(network I/O),需要耗费大量的时间。由于 MapReduce 的框架限制,一个 MapReduce 任务只能包含一次 Map 和一次 Reduce,计算完成之后,MapReduce 会将运算结果写回到磁盘中(更准确地说是分布式存储系统)供下次计算使用。 如果使用的算法模型需要多次使用数据,那么整个计算过程会不断重复往磁盘读写中间结果,会引起大量的网络传输和磁盘读写。
Spark使用的RDD就是为了解决这种问题而开发出来的,Spark使用了一种特殊设计的数据结构,称为RDD。RDD的一个重要特征是,分布式数据集可以在不同的并行环境当中被重复使用,这个特性将Spark和其他并行数据流模型框架(如MapReduce)区别开。
1.Spark把运算的中间数据存储在内储存中,迭代计算效率更高,Spark中除了基于内存计算外,还有DAG有向无环图来切分任务的执行先后顺序;mapreduce的中间结果需要落地,需要保存到磁盘,这样必然会有磁盘io操做,影响性能。
2.spark容错性高,因为RDD是一组分布式的存储在节点内存中的只读性质的弹性数据集,而且RDD和RDD之间存在依赖关系,某一部分丢失或者出错,可以通过整个数据集的计算流程的血缘关系来实现重建;mapreduce的话容错可能只能重新计算了,成本较高。
3、spark更加通用,spark提供了transformation和action这两大类的多个功能api,另外还有流式处理sparkstreaming模块、图计算GraphX等等;mapreduce只提供了map和reduce两种操作,流计算以及其他模块的支持比较缺乏。