MapReduce的编程模型表达能力有限
MapReduce计算框架将计算任务抽象为map和reduce两个计算任务,这简化了编程过程,但也导致MapReduce的编程模型表达能力有限。
当实际中有些处理过程比较复杂时,我们需要建立多个MapReduce过程并连接起来,这也使得MapReduce的编程过程变得复杂。
无法实现快速的迭代计算
当一个复杂的需求涉及多个MapReduce计算任务时,MapReduce只能一个任务完成之后将结果写入磁盘,另一个计算任务才能开始,无法实现快速的迭代计算。
MapReduce计算过程的延迟一般比较高
由于MapReduce的计算过程需要从磁盘中读取数据,并将中间结果和最终结果写入HDFS通过磁盘保存(同时考虑到HDFS的多备份机制),因此MapReduce计算任务涉及大量的磁盘I/O开销。
受制于磁盘的响应速度,MapReduce计算过程的延迟一般比较高。
一个普通的MapReduce作业往往需要分钟级的运算,复杂的作业或者是数据量更大的情况下,可能花费一个小时或者更多。
相比于MapReduce,Spark产生的更晚
借鉴了MapReduce计算框架的优点
解决了MapReduce计算框架所存在的一些局限性
Spark提供了更多的操作,这使得Spark的编程模型的表达能力更强
Spark将计算过程中的中间结果放到内存中而不是写入磁盘,通过提供基于内存的计算,Spark减少了磁盘的I/0开销,能够更好的支持迭代计算任务,并提高了计算的效率
Spark提供了基于有向无环图DAG的任务调度执行机制,能够较好的支持涉及多任务、多阶段的计算需求
通过有向无环图的任务调度执行机制以及基于内存的计算,Spark具有比MapReduce更快的计算速度
Spark更容易使用
支持使用Scala、Java、Python和R语言进行编程,编程接口也更为简洁,并且可以通过Spark Shell进行交互式编程
支持多种部署方式
提供了Standalone、Spark on Mesos和Spark on YARN等多种种部署模式,具有更好的灵活性
已经发展成一个生态系统
遵循“一个软件栈满足不同应用场景”的设计理念
虽然Spark弥补了MapReduce的不足,并且已经发展成能够支持多种计算任务的一栈式解决方案,但是Spark无法完全