1.4 Spark重要组件
如图1-5所示,Spark的重要组件包括Spark Core、Spark SQL、GraphX、流数据处理、SparkR、MLlib/ML和Spark交互工具。
其中:Spark Core位于最底层,它实现了Spark最基础和最核心的功能;而Spark SQL、Graphx、流数据处理、SparkR、MLlib/ML 分别实现了Spark某一个方面的功能,属于重要组件。
在这里把Spark交互工具作为Spark的重要组件列出,主要是考虑它是Spark和用户的接口,平时会频繁使用Spark交互工具同Spark打交道,实现各种各样的功能,因此,对于用户来说是非常重要的。
1.4.1 Spark Core
Spark Core实现了Spark最基础和最核心的功能,它使得一个最基本的Spark分布式程序得以运行。RDD(Resilient Distributed DataSet,弹性分布式数据集)是Spark Core中最基础和最核心的内容。RDD可以认为是一个分布式的大数组,可以跨多台机器,而 C 语言、Java中的数组,其内存区域就在当前进程内,是在同一台机器上的,不能跨多台机器。Spark Core实现了RDD持久化和分区(Partition)机制,不同分区的数据往往对应不同的节点上,同时,RDD提供了很多转换操作,当在RDD上执行某一个操作时,这个操作会被分配到不同的分区上并行完成,这样,通过合理地使用RDD就可以编写出分布式并行处理的程序了。RDD计算过程中的通信、容错、资源分配等后台工作,全部由Spark框架来完成。
可以说,RDD抽象是Spark编程中最核心、最基础的概念和数据结构,也是最基础的技术,Spark同C、Java编程的本质区别,也正是在于Spark拥有RDD这种特殊的抽象。
为了实现集群资源的管理,Spark Core还实现了Standalone集群管理器,这样,Spark程序可以直接运行在Standalone模式下,不需要借助外部的集群管理器,此外,Spark Core还支持Spark程序在Hadoop Yarn、Mesos等集群管理器下运行。
对于开发者来说,Spark Core涉及以下技术点。
●Spark原理和架构;
●Spark程序的提交及运行过程;
●RDD的概念、分区的使用;
●RDD基本的Transformation和Action操作;
●SparkContext的创建、设置和API的调用;
●Job操作、DAG图、Stage的划分;
●广播变量、累加器的使用;
●序列化;
●日志查看及调试方法;
●Shuffle的优化。
1.4.2 Spark SQL
Spark SQL是Spark一个的重要组件,用来处理结构化数据。
Spark SQL能成为主流的结构化大数据处理工具,是因为它具有以下特点。
●Spark SQL中,用户可以使用SQL来操作数据库表,或者使用专门的接口(DataFrame/Dataset API)来处理结构化数据,非常灵活;
●Spark SQL可以连接不同的数据源,如Hive表、Avro、Parquet、ORC、JSON和JDBC等,一旦连接成功,后续的处理方式就都一样了,Spark SQL统一了各种类型数据的处理方式;
●Spark SQL对外支持JDBC和ODBC连接,通过JDBC或ODBC来连接数据库的智能分析工具就可以使用Spark SQL来处理大数据了;
●Spark SQL无缝兼容Hive。Spark SQL可使用已有的Hive数据仓库,支持HiveQL语法,同时还支持Hive SerDes(Hive的序列化和反序列化接口)和UDF(Hive用户定义函数)。假设有一个Hive数据仓库A,根据Spark SQL的特性,Spark SQL可以连接到 A,并且在Spark SQL上,能够使用 HiveQL、SerDes 或者 UDF 去操作A,就像之前在 Hive上的操作一样。这样,数据仓库(数据源)不变,使用方法不变(HiveQL、SerDes、UDF),对数据仓库的使用者来说,Hive可以无缝迁移到Spark SQL。
HiveQL是一种类似SQL的Hive查询语言;
UDF的全称为User-Defined Function,用户定义函数。有的查询无法使用Hive内置函数实现,通过写UDF,用户可以自定义函数来实现特点的查询;
在Spark之前,主流的大数据处理框架是 MapReduce,其结构化数据处理工具是Hive,Spark出现后,出现了基于Spark的Shark项目,用来处理结构化数据处理工具,后来Databriks重新启动并主导了Spark SQL项目,之后,Hive也启动了Hive On Spark项目,意在将Hive所使用的MapReduce替换成Spark。因此,这几个工具出现的顺序是:Hive->Shark->Spark SQL->Hive On Spark。
对于应用开发者来说,Spark SQL涉及以下技术点。
●Spark SQL核心概念和数据处理机制;
●Spark SQL运行环境的构建;
●RDD、DataFrame和Dataset的区别和转换方法;
●DataFrame/Dataset的概念和基本使用
●DataFrame/Dataset同各类数据源的转换方法;
●DataFrame/Dataset常用API的用法;
●Spark SQL中SQL的基本使用。
1.4.3 GraphX
GraphX是Spark中的图计算组件,它的底层实现基于RDD,因此,可以利用Spark进行海量图数据的分布式并行计算。GraphX向用户提供了一个有向多重图(从一个顶点到另一个顶点可以有多条同向的边)的抽象,图中的边和顶点都可以被赋值(属性)。
为了支持图计算,GraphX提供了一组基本算子,同时还提供了一个优化过的Pregel API变种;此外,Graphx还包含了一组不断增加的图算法和图构建集合,用来简化图分析任务。
Pregel是由Google提出的一个可扩展、高容错图计算平台,用来解决大型图的计算问题。Pregel也是一个图并行处理抽象,有专门的API编程接口;
Pregel基于BSP(Bulk Synchronous Parallel Computing Model,整体同步并行计算模型)实现,BSP的基本思路是:以图顶点为中心、基于消息传递批处理,其目标是解决大型图的计算问题;
Pregel API非常灵活,可描述多种图计算问题:如图遍历、最短路径、PageRank等。
与其他的图计算框架相比,Graphx具有以下3个特点。
1.更加灵活
GraphX将ETL(Extract-Transform-Load,数据抽取、转换、加载)、探索性分析(Exploratory analysis)以及迭代图形计算(Iterative graph computation)集成到了一个系统中。在此之前,上述 3 个功能往往需要不同的工具来完成。开发时,对于同一份图数据,既可以从集合的角度使用 RDD 高效地对图进行变换(Transform)和连接(Join),也可以使用 Pregel API来编写自定义的迭代图算法。
2.处理速度更快
GraphX与当前最快的图处理系统GraphLab同样执行PageRank图算法,在相同的计算数据、迭代次数情况下,GraphX的速度是GraphLab的1.3倍,与此同时,GraphX还可以利用到Spark的灵活、容错和易用等特性。
3.算法更丰富
GraphX 除了已有的高度灵活的API外,还采用了很多用户贡献的图算法(因为Spark是开源的),例如,PageRank(网页重要性评估)、Connected components(连通分支)、Label propagation(标签传播)等,所以GraphX图算法更丰富。
对开发者来说,GraphX所涉及的技术点包括以下几点。
●有向多重图的基本概念;
●GraphX的特性和基本框架;
●VertexRDD和EdgeRDD构建方法和基本操作;
●Property Graph的概念;
●Property Graph构建方法和基本操作;
●GraphX Pregel的原理和使用;
●基于GraphX的常用图算法等。
1.4.4 流数据处理
“流数据处理”是Spark中的流数据并行处理模块。
亚马逊对流数据定义是:流数据是指由数千个数据源持续生成的数据,通常以数据记录的形式发送,规模较小(约几千字节)。
流数据包括多种数据,例如移动或Web应用程序生成的日志文件、网购数据、游戏内玩家活动、社交网站信息、金融交易大厅或地理空间服务,以及来自数据中心内所连接设备或仪器的遥测数据等。根据上述定义,可以得到流数据的以下3个特点。
●持续不断;
●多种类型和要求;
●即时性。
从 Spark 2.0 开始,Spark“流数据处理”支持两种流处理方式:DStream 和 Structured Streaming,具体说明如下。
DStream是Spark传统的流处理方式,它将流数据抽象DStream(离散的RDD数据流)进行处理。DStream支持多种数据源的流数据,如图 1-7所示,包括 Kafka、Flume、Kinesis、TCP sockets、HDFS/S3、Twitter 等。处理后的结果可以存储到文件系统中,如HDFS、HBase等。
图1-7 Spark Streaming数据源和输出
Structured Streaming是Spark 2.0后新增的流数据处理方式。Structured Streaming将流数据抽象成一张不断增长、没有边界的大表,使用Dataset/DataFrame来表示这张大表,支持使用SQL或Dataset/DataFrame的API来处理流数据;从技术上看,Structured Streaming构建在Spark SQL引擎之上,可以提供更快、时延更低、容错、端到端可靠的流处理。
在Spark 2.0之前,只有DStream这种流处理方式,DStream的实现模块是Spark Streaming。因此,按照Spark的命名方式,Spark Streaming都是指DStream流数据处理模块,而不是流数据处理的统称。
流数据处理所涉及的技术包括:
●多种数据源接入DStream;
●DStream的基本原理和创建方法;
●DStream的常用Transformation和Output操作;
●Structured Streaming处理流数据基本流程和相关概念;
●Structured Streaming接入数据源;
●Structured Streaming中使用DataFrame/Dataset处理流数据。
1.4.5 SparkR
SparkR是一个R语言的Package,它提供了一种在R语言中使用Spark的手段。这样,在R语言中,可以利用Spark的分布式处理能力和机器学习算法来处理大数据。
SparkR不是对R语言已有算法做Spark并行化,也不是要替代原有的R语言算法库;
SparkR也不是实现在Spark程序中调用已有的R语言算法;
SparkR只是为R语言提供一种接入Spark的工具,使得在R语言编程时可以用Spark来处理大数据。
SparkR提供了一种类似R语言中data.frame的数据结构:SparkDataFrame,它是一个分布式的结构化数据集合,支持 selection、filtering和 aggregation等操作,可以这么认为:SparkDataFrame是一张分布式的数据库表,或者说 SparkDataFrame是R语言中分布式的data.frame。
Spark 2.0以前,SparkDataFrame的名称为SparkR DataFrame,Spark 2.0以后才改名为SparkDataFrame,本书统一为SparkDataFrame。
SparkDataFrame可以由多种数据源构建,包括结构化数据文件、Hive表、外部数据库和R语言data.frame变量。
SparkR所涉及的技术包括以下几点。
●SparkR基础,SparkR同R语言的关系;
●SparkR开发和运行环境构建;
●SparkR代码执行方式;
●SparkR的基本使用;
●SparkDataFrame的创建和基本操作;
●在SparkR中使用SQL;
●SparkR常用机器学习算法,如分类、聚类、回归、频繁模式挖掘等;
●在SparkR中实现Spark和R语言的综合应用。
1.4.6 MLlib/ML
1.MLlib简介
MLlib 是Spark的机器学习库,它提供了丰富的机器学习算法,如相关性计算、假设检验等,同时,由于Spark是开源软件,它还吸收了不少用户所贡献的算法实现,MLlib几乎囊括了机器学习领域的常用算法,如果把Spark比作一个蛋糕机,那么MLlib就是各式各样的蛋糕模具,有了它们,无须从头开始就可以做出各种形状的蛋糕了。因此,如果要从事大数据分析、大数据机器学习方向的工作,MLlib是必须要掌握的。
2.MLlib所涉及的技术
从开发的角度看,MLlib所涉及的技术有以下5个方面:
●ML组件:常用的机器学习算法,例如分类、回归和聚类等;
●特征化组件:特征抽取、转换、降维和选择;
●流水线工具:ML流水线的创建、评价和调整;
●持久化工具:算法、模型、流水线的保存或加载;
●实用工具:线性代数、统计和数据处理等。
3.MLlib接口说明
自Spark 2.0之后,MLlib的接口发生了重大变化,开发者需要特别关注。下面对MLlib的接口做一说明:
●MLlib原来的接口是基于RDD的API,位于spark.mllib包中,现在是处于维护状态,只修正已有接口的bug,不再开发新的基于RDD的API;
●MLlib现在大力发展的接口是:基于DataFrame的API,当它特性和基于RDD的API相当时,基于RDD的API就会被弃用(Deprecated),根据计划和现有进度,基于RDD的API可能会在Spark 3.0中被移除。
4.MLlib常见问题
(1)为何采用基于DataFrame的API
●DataFrame相比RDD更为友好。使用DataFrame的好处包括:统一的Spark数据源处理、SQL/DataFrame查询更灵活、基于Tungsten和Catalyst解析优化、跨语言的统一API;
●基于DataFrame的API提供了跨ML算法和多种语言统一的API;
●DataFrame可以使得ML Pipeline,特别是特征转换更加实用。
(2)为何有时称Spark MLlib为“Spark ML”
Spark ML是一个非正式的名字,偶尔被用来指代基于DataFrame的API,这是因为:基于DataFrame的API使用org.apache.spark.ml包。
(3)MLlib是否被弃用了
没有,MLlib包括基于RDD的API和基于DataFrame的API。基于RDD的API处于维护状态。但是,基于RDD的API和MLlib整体都没有被弃用。
1.4.7 Spark交互工具
Spark交互工具包括spark-shell、pyspark、sparkR和spark-sql。
1.spark-shell
spark-shell接收用户输入的Scala代码,对代码即时编译,然后提交到Spark集群执行,显示执行结果。spark-shell 这种方式可以调用 Spark 提供的所有接口,同时又免去了编译打包的过程,因此,既功能强大,又非常方便。
2.pyspark
使用Python进行Spark编程的Shell,除了语言使用Python外,所实现的功能和spark-shell类似。
3.sparkR
这是一个R语言Shell,其作用主要是:支持R语言使用Spark的DataFrame进行编程。
4.spark-sql
spark-sql接收用户输入的SQL语句,并将其提交到Spark集群,完成结构化数据的操作。
Spark交互工具所涉及的技术和知识点包括各个Shell的启动命令、基本设置、依赖环境构建、退出机制、帮助查看命令、常用操作命令等。