本文选自“图灵教育”微信。
Spark简史
Spark于2009年作为一个研究项目在加州大学伯克利分校RAD实验室(AMPLab的前身)诞生。实验室中的一些研究人员曾经用过Hadoop MapReduce。他们发现MapReduce在迭代计算和交互计算的任务上表现得效率低下。因此,Spark从一开始就是为交互式查询和迭代算法设计的,同时还支持内存式存储和高效的容错机制。
2009年,关于Spark的研究论文在学术会议上发表,同年Spark项目正式诞生。其后不久,相比于MapReduce,Spark在某些任务上已经获得了10~20倍的性能提升。
Spark是什么
Spark是一个用来实现快速而通用的集群计算的平台。
在速度方面,Spark扩展了广泛使用的MapReduce计算模型,而且高效地支持更多计算模式,包括交互式查询和流处理。在处理大规模数据集时,速度是非常重要的。速度快就意味着我们可以进行交互式的数据操作,否则我们每次操作就需要等待数分钟甚至数小时。Spark的一个主要特点就是能够在内存中进行计算,因而更快。不过即使是必须在磁盘上进行的复杂计算,Spark依然比MapReduce更加高效。
总的来说,Spark适用于各种各样原先需要多种不同的分布式平台的场景,包括批处理、迭代算法、交互式查询、流处理。通过在一个统一的框架下支持这些不同的计算,Spark使我们可以简单而低耗地把各种处理流程整合在一起。而这样的组合,在实际的数据分析过程中是很有意义的。不仅如此,Spark的这种特性还大大减轻了原先需要对各种平台分别管理的负担。
Spark所提供的接口非常丰富。除了提供基于Python、Java、Scala和SQL的简单易用的API以及内建的丰富的程序库以外,Spark还能和其他大数据工具密切配合使用。例如,Spark可以运行在Hadoop集群上,访问包括Cassandra在内的任意Hadoop数据源。
Spark组件
Spark项目包含多个紧密集成的组件。Spark的核心是一个对由很多计算任务组成的、运行在多个工作机器或者是一个计算集群上的应用进行调度、分发以及监控的计算引擎。由于Spark的核心引擎有着速度快和通用的特点,因此Spark还支持为各种不同应用场景专门设计的高级组件,比如SQL和机器学习等。这些组件关系密切并且可以相互调用,这样你就可以像在平常软件项目中使用程序库那样,组合使用这些的组件。
Spark的各个组件如图所示,后面附各个组件功能的简单介绍。
Spark Core
Spark Core实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core中还包含了对弹性分布式数据集(resilient distributed dataset,简称RDD)的API定义。RDD表示分布在多个计算节点上可以并行操作的元素集合,是Spark主要的编程抽象。Spark Core提供了创建和操作这些集合的多个API。
Spark SQL
Spark SQL是Spark用来操作结构化数据的程序包。通过Spark SQL,我们可以使用SQL或者Apache Hive版本的SQL方言(HQL)来查询数据。Spark SQL支持多种数据源,比如Hive表、Parquet以及JSON等。除了为Spark提供了一个SQL接口,Spark SQL还支持开发者将SQL和传统的RDD编程的数据操作方式相结合,不论是使用Python、Java还是Scala,开发者都可以在单个的应用中同时使用SQL和复杂的数据分析。通过与Spark所提供的丰富的计算环境进行如此紧密的结合,Spark SQL得以从其他开源数据仓库工具中脱颖而出。Spark SQL是在Spark 1.0中被引入的。
在Spark SQL之前,加州大学伯克利分校曾经尝试修改Apache Hive以使其运行在Spark上,当时的项目叫作Shark。现在,由于Spark SQL与Spark引擎和API的结合更紧密,Shark已经被Spark SQL所取代。
Spark Streaming
Spark Streaming是Spark提供的对实时数据进行流式计算的组件。比如生产环境中的网页服务器日志,或是网络服务中用户提交的状态更新组成的消息队列,都是数据流。Spark Streaming提供了用来操作数据流的API,并且与Spark Core中的RDD API高度对应。这样一来,程序员编写应用时的学习门槛就得以降低,不论是操作内存或硬盘中的数据,还是操作实时数据流,程序员都更能应对自如。从底层设计来看,Spark Streaming支持与Spark Core同级别的容错性、吞吐量以及可伸缩性。
MLlib
Spark中还包含一个提供常见的机器学习(ML)功能的程序库,叫作MLlib。MLlib提供了很多种机器学习算法,包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据导入等额外的支持功能。MLlib还提供了一些更底层的机器学习原语,包括一个通用的梯度下降优化算法。所有这些方法都被设计为可以在集群上轻松伸缩的架构。
GraphX
GraphX是用来操作图(比如社交网络的朋友关系图)的程序库,可以进行并行的图计算。与Spark Streaming和Spark SQL类似,GraphX也扩展了Spark的RDD API,能用来创建一个顶点和边都包含任意属性的有向图。GraphX还支持针对图的各种操作(比如进行图分割的subgraph和操作所有顶点的mapVertices),以及一些常用图算法(比如PageRank和三角计数)。
集群管理器
就底层而言,Spark设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计算。为了实现这样的要求,同时获得最大灵活性,Spark支持在各种集群管理器(cluster manager)上运行,包括Hadoop YARN、Apache Mesos,以及Spark自带的一个简易调度器,叫作独立调度器。如果要在没有预装任何集群管理器的机器上安装Spark,那么Spark自带的独立调度器可以让你轻松入门;而如果已经有了一个装有Hadoop YARN或Mesos的集群,通过Spark对这些集群管理器的支持,你的应用也同样能运行在这些集群上。第7章会详细探讨这些不同的选项以及如何选择合适的集群管理器。
【图书推荐】
作者:Holden Karau,Andy Konwinski,Patrick Wendell,Matei Zaharia
译者:王道远
Spark作者及核心成员作品,Spark社区贡献者执笔翻译
Spark入门第一书
《Spark快速大数据分析》全面介绍Spark核心概念和基本原理,注重Spark用法。教会读者用Python、Java以及Scala的简易API来快速操控大规模数据集,使用简短的代码实现复杂的并行作业,了解从简单的批处理作业到流处理以及机器学习等应用。
“Spark是构建大数据应用最为流行的框架,而如果有人要我推荐一些指南书籍,《Spark快速大数据分析》无疑会排在首位。”
——Ben Lorica,O'Reilly首席数据科学家
作者:Sandy Ryza,Uri Laserson,Sean Owen,Josh Wills
译者:龚少成
定价:59
Amazon 4.8星实战手册,Cloudera公司数据科学家实践之作
展示利用Spark进行大规模数据分析的若干模式
将Spark、统计学方法和真实数据集结合起来
《Spark高级数据分析》是使用Spark进行大规模数据分析的实战宝典,由著名大数据公司Cloudera数据科学家撰写。首先介绍了Spark及其生态系统,接着详细介绍了将分类、协同过滤及异常检查等常用技术应用于基因学、安全和金融领域的若干模式。如果你对机器学习和统计学有基本的了解,并且会用Java、Python或Scala编程,这些模式将有助于你开发自己的数据应用。
作者:Nick Pentreath
译者:蔡立宇 黄章帅 周济民
用Scala、Java或Python语言编写你的第一个Spark程序
《Spark机器学习》介绍了Spark的基础知识,从利用Spark API来载入和处理数据,到将数据作为多种机器学习模型的输入。通过详细实例和现实应用讲解了常见的机器学习模型,包括推荐系统、分类、回归、聚类和降维。
你用Spark吗?