在当前的大数据领域,Apache Spark无疑占有重要的位置,特别是新版本的Spark在流处理方面的加强,使它可以适用实时数据分析的场景。
在Spark出现之前,想要在一个组织内同时完成多种大数据分析任务,必须部署多套大数据工具,比如离线分析用Hadoop MapReduce,查询数据用Hive,流数据处理用Storm,而机器学习用Mahout。
在这种情况下,一方面增加了大数据系统开发的难度,需要有不同技能的人员共同协作才能完成,这也会导致系统的运维变得复杂。另一方面,由于不同大数据工具之间需要互相传递数据,而对于数据的格式可能要求不同,因此需要在多个系统间进行数据格式转换和传输工作,这个过程既费时又费力。
Spark软件是一个“One Stack to rule them all”的大数据计算框架,它的目标是用一个技术栈完美地解决大数据领域的各种计算任务。Spark官方对Spark的定义是:通用的大数据快速处理引擎。
从某种程度上来说,Spark和Hadoop软件的组合,是未来大数据领域性价比最高的组合,也是最有发展前景的组合。
2009年,Spark诞生于伯克利大学的AMPLab实验室,AMP是Algorithms、Machines与People的缩写。一开始Spark只是一个学术上的实验性项目,代码量并不多,可以称得上是一个轻量级的框架。
2010年,伯克利大学正式开源了Spark项目。2013年,Spark成为Apache基金会下的项目,进入高速发展期。同年,Apache Spark的开发团队成立了Databricks公司。
2014年,Spark仅在一年左右的时间,就以非常快的速度成为Apache的顶级项目。从2015年开始,Spark在国内大数据领域变得异常火爆,很多大型的公司开始使用Spark来替代Hadoop MapReduce、Hive和Storm等传统的大数据计算框架。
现在已经有很多公司在生产环境下使用Apache Spark作为大数据的计算框架,包括eBay、雅虎、阿里、百度、腾讯、网易、京东、华为、优酷、搜狗和大众点评等。与此同时,Spark也获得了多个世界级IT厂商的支持,其中包括IBM和Intel等。
可以说,Spark用Spark RDD、Spark SQL、Spark Streaming、Spark MLlib和Spark GraphX成功解决了大数据领域中,离线批处理、交互式查询、实时流计算、机器学习与图计算等最常见的计算问题。
Apache Spark框架是用Scala语言编写。Scala是一门多范式(Multi-Paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行在Java虚拟机上,并兼容现有的Java程序。Scala源代码被编译成Java字节码,所以它可以运行在JVM之上,并可以调用现有的Java类库。
而Hadoop是由Java语言开发的。Java是一门面向对象的编程语言,具有功能强大和简单易用的特征。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程等特点。可以说,作为一个大数据从业人员,Java语言几乎是必会的一门语言。
Apache Spark最重要的特点是基于内存进行计算,因此计算的速度可以达到Hadoop MapReduce或Hive的数十倍,甚至上百倍。很多应用程序,为了提升程序的响应速度,常用的方法就是将数据在内存中进行缓存。一般来说,Apache Spark对计算机的内存要求比较高。
通常来说,Apache Spark中RDD存放在内存中,如果内存不够存放数据,会同时使用磁盘存储数据。因此,为了提升Spark对数据的计算速度,应该尽可能让计算机的内存足够大,这样可以防止数据缓存到磁盘上。
而Hadoop MapReduce是从HDFS中读取数据的,通过MapReduce将中间结果写入HDFS,然后再重新从HDFS读取数据进行MapReduce操作,再回写到HDFS中,这个过程涉及多次磁盘IO操作,因此,计算速度相对来说比较慢。
Apache Spark只是一个计算分析框架,虽然可以在一套软件栈内完成各种大数据分析任务,但是它并没有提供分布式文件系统,因此必须和其他的分布式文件系统进行集成才能运作。
Spark是专门用来对分布式数据进行计算处理,它本身并不能存储数据。可以说,Spark是大数据处理的瑞士军刀,支持多种类型的数据文件,如HDFS、HBase和各种关系型数据库,可以同时支持批处理和流数据处理。
而Hadoop主要由HDFS、MapReduce和YARN构成。其中HDFS作为分布式数据存储,这也是离线数据存储的不二选择。另外,借助MapReduce可以很好地进行离线数据批处理,而且非常稳定,对于实时性要求不高的批处理任务,用MapReduce也是一个不错的选择。
在Apache Spark中,用户提交的任务称为Application,一个Application对应一个SparkContext。一个Application中存在多个Job,每触发一次Action操作就会产生一个Job。这些Job可以并行或串行执行,每一个Job中有多个Stage,每一个Stage里面有多个Task,由TaskScheduler分发到各个Executor中执行。Executor的生命周期和Application一样,即使没有Job运行也是存在的,所以Task可以快速启动读取内存进行计算。
另外,在Spark中每一个Job可以包含多个RDD转换算子,在调度时可以生成多个Stage,借助Spark框架中提供的转换算子和RDD操作算子,可以实现很多复杂的数据计算操作,而这些复杂的操作在Hadoop中原生是不支持的。
在Hadoop中,一个作业称为一个Job, Job里面分为Map Task和Reduce Task,每个Task都在自己的进程中运行,当Task结束时,进程也会随之结束。
Spark虽然号称是通用的大数据快速处理引擎,但是目前还不能替换Hadoop,因为Spark并没有提供分布式文件系统。