Spark基本的数据结构叫做弹性分布式数据集(RDD)。这是一个分布于集群节点的只读数据集合,并以容错的、并行的方式进行维护。
传统的MapReduce框架中的Map阶段和Reduce阶段的结果均要写磁盘,这大大降低了系统性能。
为了解决MapReduce的性能问题,Spark使用RDD作为分布式程序的工作集合,它提供一种分布式共享内存的受限形式。在分布式共享内存系统中,应用可以向全局地址空间的任意位置进行读写操作,而RDD是只读的,对其只能进行创建、转化和求值等操作。
利用RDD可以方便地实现迭代算法,简单地说就是能够在一个循环中多次访问数据集合。RDD还适合探索式的数据分析,能够对数据重复执行类似于数据库风格的查询。
Spark需要一个集群管理器和一个分布式存储系统作为支撑。对于集群管理,Spark支持独立管理(原生的Spark集群),Hadoop YARN和Apache Mesos。对于分布式存储,Spark可以与多种系统对接,包括HDFS、MapR文件系统、Cassandra、OpenStack Swift、Amazon S3、Kudu,或者一个用户自己实现的文件系统。
Spark框架含有Spark Core、Spark SQL、Spark Streaming、MLlib Machine Learning Library、GraphX等几个主要组件。
Spark Core是所有Spark相关组件的基础。 它以RDD这个抽象概念为核心,通过一组应用程序接口,提供分布式任务的分发、调度和基本的I/O功能。Spark Core的编程接口支持Java、Python、Scala和R等程序语言。
这组接口使用的是函数式编程模式,即一个包含对RDD进行map、filter、reduce、join等并行操作的驱动程序。这些基本操作把RDD作为输入并产生新的RDD。RDD自身是一个不变的数据集,对RDD的所有转换操作都是lazy模式,即Spark不会立刻计算结果,而只是简单地记住所有对数据集的转换操作。这些转换只有遇到action操作的时候才会开始真正执行,这样的设计使Spark更加高效。容错功能是通过跟踪每个RDD的“血统” (lineage,指的是产生此RDD的一系列操作)实现的。一旦RDD的数据丢失,还可以 使用血统进行重建 。RDD可以由任意类型的Python、Java或Scala对象构成。
Spark还有两种形式的共享变量:broadcast和accumulators。 broadcast变量引用的是需要在所有节点上有效的只读数据,accumulators可以简便地对各节点返回给驱动程序的值进行聚合。
Spark SQL是基于Spark Core之上的一个组件,它引入了名为DataFrames的数据抽象。DataFrames能够支持结构化、半结构化数据。 Spark SQL提供了一种“领域特定语言”(Domain-Specific Language,简称DSL),用于在Scala、Java或Python中操纵DataFrames。同时Spark SQL也通过命令行接口或ODBC/JDBC提供对SQL语言的支持。
Spark Streaming利用Spark Core的快速调度能力执行流数据的分析。它以最小批次获取数据,并对批次上的数据执行RDD转化。可以让用于批处理分析的Spark应用程序代码也可以用于流数据分析。
Spark中还包含一个机器学习程序库,叫做MLlib。MLlib提供了很多机器学习算法,包括分类、回归、聚类、协同过滤等,还支持模型评估、数据导入等额外的功能。MLlib还提供了一些更底层的机器学习原语,如一个通用的梯度下降算法等。所有这些方法都被设计为可以在集群上轻松伸缩的架构。
GraphX是Spark上的图(如社交网络的朋友关系图)处理框架。可以进行并行的图计算。由于RDD是只读的,因此GraphX不适合需要更新图的场景。