用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负责进行高效地数据运算,从而搭建一个理想的大数据处理平台。
网友评论