RDD
Spark基本的数据结构叫弹性分布式数据集(Resilient Distributed Datasets,简称RDD).
概念:
一个分布于集群节点的只读数据集合,并以容错的、并行的方式进行维护.
为了解决MapReduce的性能问题,Spark使用RDD作为分布式程序的工作集合,它提供一种分布式共享内存的受限形式.在分布式共享内存系统中,应用可以向全局地址空间的任意位置进行读写操作,而RDD是只读的,对其只能进行创建、转化和求值等操作.
RDD的优势:
可以方便地实现迭代算法,简单地说就是能在一个循环中多次访问数据集合.RDD还适合探索式的数据分析,能够对数据重复执行类似于数据库风格的查询.最为经典的的迭代算法是用于机器学习系统的培训算法.
Spark基本概念
- Spark需要一个集群管理器和一个分布式存储系统作为支撑.
- 对于集群管理器: 一般用YARN 或 Mesos
对于分布式存储,Spark可以与多种系统对接. HDFS、MapR文件系统、亚马逊S3,或者一个用户自己实现的文件系统. - Spark支持伪分布式的本地部署模式,通用仅用于开发和测试目的.
- 本地模式不要分布式存储,而是用本地文件系统代替.此场景下,Spark运行在一个机器上,每个CPU核是一个执行器(executor).
- Spark框架含有Spark Core、Spark SQL、Spark Streaming、MLib Machine Learning Library、GraphX等几个主要组件.
Spark Core
Spark Core是所有Spark相关组件的基础.
它以RDD这个抽象概念为核心,通过一组应用程序接口,提供分布式任务的分发、调度和基本的I/O功能.
Spark Core的编程接口支持Java、Python、Scala和R等程序语言.
这组接口使用的是函数式编程模式,即一个包含对RDD进行map、filter、reduce、join等并行操作的驱动程序,向Spark传递一个函数,然后Spark调度此函数在集群上并行执行.这些基本操作把RDD作为输入并产生新的RDD.
RDD自身是一个不变的数据集,对RDD的所有转换操作都是lazy模式,即Spark不会立即执行计算结果,而只是简单地记住所有对数据集的转换操作,这些转换只有遇到action操作的时候才会真正开始执行,这样的设计使Spark更加高效.
容错功能是通过追踪每个RDD的“血统”(lineage,指的是产生此RDD的一系列操作)实现的.一旦RDD的数据丢失,还可以使用血统进行重建.
Spark SQL
Spark SQL是基于Spark Core之上的一个组件,它引入了名为DataFrames的数据抽象.DataFrames能够支持结构化、半结构化数据.
Spark SQL提供了一种“领域特定语言”(Domain-Specific Language,简称DSL),用于在Scala、Java或Python中操纵DataFrames.同时Spark SQL也通过命令行接口或ODBC/JDBC提供对SQL语言的支持.
Spark Streaming
Spark Streaming利用Spark Core的快速调度能力执行流数据的分析.它以最小批次获取数据,并对批次上的数据执行RDD转化.这样的设计,可以让用于批处理分析的Spark应用程序代码也可以用流数据分析,因此便于实时大数据处理架构的实现.但是这种便利性带来的问题是处理最小批次数据的延时.
Storm和Flink的streaming组件,以事务为单位处理流数据
Spark Streaming以最小批次为单位处理流数据. 伪实时
Spark Streaming支持从Kafka、Flume、TCP/IP sockets、Twitter、ZeroMQ、Kinesis接收数据.
MLlib Machine Learning Library
Spark中还包含一个机器学习程序库,叫做MLlib.MLlib提供了很多机器学习算法,包括分类、回归、聚类、协同过滤等,还支持模型评估、数据导入等额外的功能.MLlib还提供了一些更底层的机器学习原语,如一个通用的梯度下降算法等.所有这些方法都被设计为可以在集群上轻松伸缩的架构.
GraphX
GraphX是Spark上的图(如设计网络的朋友关系图)处理框架.可以进行并行的图计算.与Spark Streaming和Spark SQL类似,GraphX也扩展了Spark的RDD API,能用来创建一个顶点和边都包括任意属性的有向图.GraphX还支持对图的各种操作,比如进行图分割的subgraph和操作所有顶点的mapVertices,以及一些常用的图算法,如PageRank和三角计算等.由于RDD是可读的,因此GraphX不适合需要更新图的场景.