用Spark来替代Hadoop的观点在很早之前笔者就有耳闻,其实提出这种观点的缘由仍是在于Spark和Hadoop二者之间存在的差别。首先,二者都是开源的,这使得他们可以大规模应用在大数据分析领域,也可以在其基础上进行多样性的开发;其次,Spark立足与Scala,使得Scala拥有了高性能的计算框架;同时,Spark与Hadoop相比,不受HDFS的局限,在海量数据的计算、挖掘性能上优于Hadoop,在当下较为流行的机器学习上,Spark也有较好的表现,因此在这些因素的做用下,Spark日益受到用户的喜好。
但这并不能说明Hadoop再也不拥有优点,Hadoop拥有强大的生态,做为一种分布式系统架构,Hadoop适用于低成本、大规模的数据分析环境,可以接受海量数据的存储和运算,虽然Spark改进了不少MapReduce的算法,但实际上更多的是做为Hadoop的一种补充。
要深入理解二者之间的关系,首先须要对Hadoop进行详细了解:算法
Hadoop可以解决什么问题?
Hadoop解决了大数据(大到一台计算机没法进行存储,一台计算机没法在要求的时间内进行处理)的可靠存储和处理。
HDFS,在由普通PC组成的集群上提供高可靠的文件存储,经过将块保存多个副本的办法解决服务器或硬盘坏掉的问题。
MapReduce,经过简单的Mapper和Reducer的抽象提供一个编程模型,能够在一个由几十台上百台的PC组成的不可靠集群上并发地,分布式地处理大量的数据集,而把并发、分布式(如机器间通讯)和故障恢复等计算细节隐藏起来。而Mapper和Reducer的抽象,又是各类各样的复杂数据处理均可以分解为的基本元素。复杂的数据处理能够分解为由多个Job(包含一个Mapper和一个Reducer)组成的有向无环图(DAG),而后每一个Mapper和Reducer放到Hadoop集群上执行,就能够得出结果。
在MapReduce中,Shuffle是一个很是重要的过程,正是有了看不见的Shuffle过程,才可使在MapReduce之上写数据处理的开发者彻底感知不到分布式和并发的存在。编程
那么,Hadoop有哪些局限于不足呢?
可是,MapRecue存在如下局限,使用起来比较困难。
1.抽象层次低,须要手工编写代码来完成,使用上难以上手;
2.只提供两个操做,Map和Reduce,表达力欠缺;
3.一个Job只有Map和Reduce两个阶段(Phase),复杂的计算须要大量的Job完成,Job之间的依赖关系是由开发者本身管理的;
4.处理逻辑隐藏在代码细节中,没有总体逻辑;
5.中间结果也放在HDFS文件系统中;
6.ReduceTask须要等待全部MapTask都完成后才能够开始,时延高,只适用Batch数据处理,对于交互式数据处理,实时数据处理的支持不够;
7.对于迭代式数据处理性能比较差。安全
因而,针对以上内容,Spark作了必定程度上的改进:
从性能方面来比较,Spark在于运算速度快。Spark还能够执行批量处理,然而它真正擅长的是处理流工做负载、交互式查询和机器学习。
相比MapReduce基于磁盘的批量处理引擎,Spark赖以成名之处是其数据实时处理功能。Spark与Hadoop及其模块兼容。实际上,在Hadoop的项目页面上,Spark就被列为是一个模块。Spark有本身的页面,由于虽然它能够经过YARN(另外一种资源协调者)在Hadoop集群中运行,可是它也有一种独立模式。它能够做为 Hadoop模块来运行,也能够做为独立解决方案来运行。MapReduce和Spark的主要区别在于,MapReduce使用持久存储,而Spark使用弹性分布式数据集(RDDS)。
Spark之因此如此快速,缘由在于它在内存中处理一切数据。没错,它还可使用磁盘来处理未所有装入到内存中的数据。
Spark的内存处理为来自多个来源的数据提供了近乎实时分析的功能:营销活动、机器学习、物联网传感器、日志监控、安全分析和社交媒体网站。另外,MapReduce使用批量处理,其实历来就不是为惊人的速度设计的。它的初衷是不断收集来自网站的信息,不须要这些数据具备实时性或近乎实时性。服务器
从简单易用角度来讲,Spark支持Scala(原生语言)、Java、Python和Spark SQL。Spark SQL很是相似于SQL 92,因此几乎不须要经历一番学习,立刻能够上手。Spark还有一种交互模式,那样开发人员和用户均可以得到查询和其余操做的即时反馈。MapReduce没有交互模式,不过有了Hive和Pig等附加模块,采用者使用MapReduce来得容易一点。架构
在容错性方面,MapReduce和Spark从两个不一样的方向来解决问题。MapReduce使用TaskTracker节点,它为 JobTracker节点提供了心跳(heartbeat)。若是没有心跳,那么JobTracker节点从新调度全部将执行的操做和正在进行的操做,交给另外一个TaskTracker节点。这种方法在提供容错性方面颇有效,但是会大大延长某些操做(即使只有一个故障)的完成时间。
Spark使用弹性分布式数据集(RDD),它们是容错集合,里面的数据元素可执行并行操做。RDD能够引用外部存储系统中的数据集,好比共享式文件系统、HDFS、HBase,或者提供Hadoop InputFormat的任何数据源。Spark能够用Hadoop支持的任何存储源建立RDD,包括本地文件系统,或前面所列的其中一种文件系统。并发
因此,经过上面内容的论述,笔者认为,Spark能够对Hadoop起到一个很好的补充做用,并且在某种程度上,二者能够并行。Hadoop创建分布式文件系,而Spark负责进行高效地数据运算,从而搭建一个理想的大数据处理平台。
app