一系列问题:
重复计算、
使用范围的局限性、
资源分配、
统一管理
为了解决上述MapReduce及各种处理框架所带来的问题,加州大学伯克利分校推出了Spark统一大数据处理框架。
Spark是一种与Hadoop MapReduce类似的开源集群大数据计算分析框架。Spark基于内存计算,整合了内存计算的单元,所以相对于hadoop的集群处理方法,Spark在性能方面更具优势。
Spark启用了弹性内存分布式数据集,除了能够提供交互式查询外,还可以优化迭代工作负载(迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程)。
从另一角度来看,Spark可以看作MapReduce的一种扩展。MapReduce之所以不擅长迭代式、交互式和流式的计算工作,主要因为它缺乏在计算的各个阶段进行有效的资源共享,针对这一点,
**Spark创造性地引入了RDD(弹性分布式数据集)**来解决这个问题。RDD的重要特性之一就是资源共享。
Spark基于内存计算,提高了大数据处理的实时性,同时兼具高容错性和可伸缩性,更重要的是,Spark可以部署在大量廉价的硬件之上,形成集群。
提到Spark的优势就不得不提到大家熟知的Hadoop。事实上,Hadoop主要解决了两件事情:
1)数据的可靠存储。
2)数据的分析处理。
相应地,Hadoop也主要包括两个
核心部分:
1)分布式文件系统(Hadoop Distributed File System, HDFS):在集群上提供高可靠的文件存储,通过将文件块保存多个副本的办法解决服务器或硬盘故障的问题。
2)计算框架MapReduce:通过简单的Mapper和Reducer的抽象提供一个编程模型,可以在一个由几十台,甚至上百台机器组成的不可靠集群上并发地、分布式地处理大量的数据集,而把并发、分布式(如机器间通信)和故障恢复等计算细节隐藏起来。
Spark是MapReduce的一种更优的替代方案,可以兼容HDFS等分布式存储层,也可以兼容现有的Hadoop生态系统,同时弥补MapReduce的不足。
与Hadoop MapReduce相比,Spark的优势如下:
❑ 中间结果:基于MapReduce的计算引擎通常将中间结果输出到磁盘上,以达到存储和容错的目的。由于任务管道承接的缘故,一切查询操作都会产生很多串联的Stage,这些Stage输出的中间结果存储于HDFS。而Spark将执行操作抽象为通用的有向无环图(DAG),可以将多个Stage的任务串联或者并行执行,而无须将Stage中间结果输出到HDFS中。(浪费磁盘)
❑ 执行策略:MapReduce在数据
Shuffle之前,需要花费大量时间来排序,而Spark不需要对所有情景都进行排序。由于采用了DAG的执行计划,每一次输出的中间结果都可以缓存在内存中。(节约时间)
❑ 任务调度的开销:MapReduce系统是为了处理长达数小时的批量作业而设计的,在某些极端情况下,提交任务的延迟非常高。而Spark采用了事件驱动的类库AKKA来启动任务,通过线程池复用线程来避免线程启动及切换产生的开销。(节约开销)
❑ 更好的容错性:RDD之间维护了血缘关系(lineage),一旦某个RDD失败了,就能通过父RDD
自动重建,保证了容错性。
❑ 高速:基于内存的Spark计算速度大约是基于磁盘的Hadoop MapReduce的100倍。
❑ **易用:**相同的应用程序代码量一般比Hadoop MapReduce少50%~80%。
❑ 提供了丰富的API:(通过 API 接口实现计算机软件之间的相互通信。API 的一个主要功能是提供通用功能集)与此同时,Spark支持多语言编程,如Scala、Python及Java,便于开发者在自己熟悉的环境下工作。Spark自带了80多个算子,同时允许在Spark Shell环境下进行交互式计算,开发者可以像书写单机程序一样开发分布式程序,轻松利用Spark搭建大数据内存计算平台,并利用内存计算特性,实时处理海量数据。