1.2 Spark的重要扩展

大家知道,在Hadoop中完成即席查询(ad-hoc queries)、批处理(batch processing),流式处理(stream processing),需要构建不同的团队,每个团队需要不同的技术和经验,很难做到共享。而Spark实现了平台融合,一个基础平台解决所有的问题,一个团队拥有相同的技术和经验完成所有的任务。

基于Spark的基础平台扩展了5个主要的Spark库,包括支持结构化数据的Spark SQL、处理实时数据的Spark Streaming、用于机器学习的MLlib、用于图计算的GraphX、用于统计分析的SparkR,各种程序库与Spark核心API高度整合在一起,并在持续不断改进。

1.2.1 Spark SQL和DataFrame

Spark SQL是Spark的一个处理结构化数据的模块,提供一个DataFrame编程抽象。它可以看作是一个分布式SQL查询引擎,主要由Catalyst优化、Spark SQL内核、Hive支持三部分组成。

相对于传统的MapReduce API,Spark的RDD API有了数量级的飞跃,从Spark SQL 1.3.0开始,在原有SchemaRDD的基础上提供了与R风格类似的DataFrame API。

DataFrame是以指定列(named columns)组织的分布式数据集合,在Spark SQL中,相当于关系数据库的一个表,或R/Python的一个数据框架,但后台更加优化。

DataFrames支持多种数据源构建,包括:结构化数据文件(Parquet、JSON)加载、Hive表读取、外部数据库读取、现有RDD转化,以及SQLContext运行SQL查询结果创建DataFrame,如图1-4所示。

图1-4 DataFrame数据来源

新的DataFrame API一方面大幅度降低了开发者学习门槛,同时支持Scala、Java、Python和R语言,且支持通过Spark Shell、Pyspark Shell和SparkR Shell提交任务。由于来源于SchemaRDD,DataFrame天然适用于分布式大数据场景。

关于Spark SQL更具体的内容和案例会在后面第6章详细介绍。

1.2.2 Spark Streaming

Spark Streaming属于核心Spark API的扩展,它支持高吞吐量和容错的实时流数据处理,它可以接受来自Kafka、Flume、Twitter、ZeroMQ或TCP Socket的数据源,使用复杂的算法表达和高级功能来进行处理,如Map、Reduce、Join、Window等,处理的结果数据能够存入文件系统、数据库。还可以直接使用内置的机器学习算法、图形处理算法来处理数据,数据输入/输出示意图如图1-5所示。

图1-5 基于Spark Streaming的数据输入/输出示意图

Spark Streaming的数据处理流程如图1-6所示,接收到实时数据后,首先对数据进行分批次处理,然后传给Spark Engine处理,最后生成该批次最后的结果。

图1-6 基于Spark Streaming的数据处理流程

Spark Streaming提供一种名为离散流(DStream)的高级抽象连续数据流。DStream直接支持Kafka、Flume的数据源创建,或者通过高级操作其他DStream创建,一个DStream是一个序列化的RDD。

关于Spark Streaming更具体的内容和案例会在第7章详细介绍。

1.2.3 Spark MLlib和ML

MLlib是Spark对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器。MLlib目前支持4种常见的机器学习问题:二元分类、回归、聚类和协同过滤,以及一个底层的梯度下降优化基础算法。

MLlib基于RDD,天生就可以与Spark SQL、GraphX、Spark Streaming无缝集成,MLlib是MLBase的一部分,MLBase通过边界定义,力图将MLBase打造成一个机器学习平台,让机器学习开发的门槛更低,让一些并不了解机器学习的用户也能方便地使用MLBase这个工具来处理自己的数据。

MLlib支持将本地向量和矩阵存储在单个机器中,也包括有一个或更多的RDD支持的分布式矩阵。在目前的实现中,本地向量和矩阵都是为公共接口服务的简单数据模式,MLlib使用了线性代数包Breeze。在监督学习中使用到的样本在MLlib中成为标记点。

Spark MLlib架构由底层基础、算法库和应用程序三部分构成。底层基础包括Spark的运行库、进行线性代数相关技术的矩阵库和向量库。算法库包括Spark MLlib实现的具体机器学习算法,以及为这些算法提供的各类评估方法;主要实现算法包括建立在广义线性回归模型的分类和回归,以及协同过滤、聚类和决策树。在最新的Spark 1.5.0版本中还新增了基于前馈神经网络的分类器算法MultilayerPerceptronClassif ier(MLPC),频繁项挖掘算法Pref ixSpan、AssociationRules,实现Kolmogorov-Smirnov检验等等算法,随着版本的演进,算法库也会越来越强大。应用程序包括测试数据的生成以及外部数据的加载等功能。

Spark的ML库基于DataFrame提供高性能API,帮助用户创建和优化实用的机器学习流水线(pipeline),包括特征转换独有的Pipelines API。相比较MLlib,变化主要体现在:

1)从机器学习的Library开始转向构建一个机器学习工作流的系统,ML把整个机器学习的过程抽象成Pipeline,一个Pipeline是由多个Stage组成,每个Stage是Transformer或者Estimator。

2)ML框架下所有的数据源都是基于DataFrame,所有模型也尽量都基于Spark的数据类型表示,ML的API操作也从RDD向DataFrame全面转变。

关于MLlib和ML库更具体的内容和案例会在第8章详细介绍。

1.2.4 GraphX

从社交网络到语言建模,图数据规模和重要性的不断增长,推动了数不清的新型并行图系统(例如,Giraph和GraphLab)的发展。通过限制可以表达的计算类型和引入新的技术来分割和分发图,这些系统可以以高于普通的数据并行系统几个数量级的速度执行复杂的图算法,如图1-7所示。

图1-7 基于GraphX的并行图计算与其他方式的比较

GraphX是用于图和并行图计算的新Spark API。从上层来看,GraphX通过引入弹性分布式属性图(resilient distributed property graph)扩展了Spark RDD。这种图是一种伪图,图中的每个边和节点都有对应的属性。

为了支持图计算,GraphX给出了一系列基础的操作(例如,subgraph、joinVertices、和MapReduceTriplets)以及基于Pregel API的优化变体。除此之外,GraphX还包含了一个不断扩展的图算法和构建器集合,以便简化图分析的任务。

关于GraphX更具体的内容和案例会在第9章中详细介绍。

1.2.5 SparkR

SparkR是AMPLab发布的一个R开发包,为Apache Spark提供了轻量的前端。SparkR提供了Spark中弹性分布式数据集(RDD)的API,用户可以在集群上通过R shell交互性地运行Job。例如,我们可以在HDFS上读取或写入文件,也可以使用lapply函数进行方法调用,定义对应每一个RDD元素的运算。

Spark具有快速(fast)、可扩展(scalable)、交互(interactive)的特点,R具有统计(statistics)、绘图(plots)的优势,R和Spark的有效结合,解决了R语言中无法级联扩展的难题,也极大地丰富了Spark在机器学习方面能够使用的Lib库。

除了常见的RDD函数式算子Reduce、reduceByKey、groupByKey和Collect之外,SparkR也支持利用lapplyWithPartition对每个RDD的分区进行操作。SparkR也支持常见的闭包(closure)功能:用户定义的函数中所引用到的变量会自动被发送到集群中的其他的机器上。

SparkR的工作原理如图1-8所示,首先加载R方法包和rJava包,然后通过SparkR初始化SparkContext。

图1-8 SparkR工作原理

关于SparkR处理数据挖掘更具体的内容和案例会在第10章详细介绍。