如图2-3所示,Spark是由多个组件构成的软件栈,Spark的核心是一个由很多计算任务组成的、运行在多个工作机器或者一个计算集群上的应用进行调度、分发以及监控的计算引擎。
在Spark Core的基础上,Spark提供了一系列面向不同应用需求的组件,例如Spark SQL结构化处理和MLlib机器学习等。这些组件关系密切并且可以相互调用,这样可以方便地在同一应用程序中组合使用。
Spark自带一个简易的资源调度器,称为独立调度器。若集群中没有任何资源管理器,则可以使用自带的独立调度器。当然,Spark也支持在其他的集群管理器上运行,包括Hadoop YARN、Apache Mesos等。
Spark本身并没有提供分布式文件系统,因此Spark的分析大多依赖于HDFS,也可以从HBase和Amazon S3等持久层读取数据。
图2-3 Spark的主要组件
下面分别对Spark的各个核心组件进行讲解。
Spark Core是Spark的核心模块,主要包含两部分功能:一是负责任务调度、内存管理、错误恢复、与存储系统交互等;二是对弹性分布式数据集(Resilient Distributed Dataset,RDD)的API定义。RDD(关于RDD,将在第3章详细讲解)表示分布在多个计算节点上可以并行操作的元素集合,是Spark主要的编程抽象。Spark Core提供了创建和操作这些集合的多个API。
Spark SQL是一个用于结构化数据处理的Spark工具包,提供了面向结构化数据的SQL查询接口,使用户可以通过编写SQL或基于Apache Hive的HiveQL来方便地处理数据。当然,Spark SQL也可以查询数据仓库Hive中的数据,相当于数据仓库的查询引擎,提供了强大的计算速度。
Spark SQL还支持开发者将SQL语句融入Spark应用程序开发过程中,使用户可以在单个应用中同时进行SQL查询和复杂的数据分析。
Spark Streaming是Spark提供的对实时数据进行流式计算的组件(比如生产环境中的网页服务器日志,以及网络服务中用户提交的状态更新组成的消息队列,都是数据流),它是将流式的计算分解成一系列短小的批处理作业,支持对实时数据流进行可伸缩、高吞吐量、容错的流处理。数据可以从Kafka、Flume、Kinesis和TCP套接字等多个来源获取,可以对数据使用map、reduce、join和window等高级函数表示的复杂算法进行处理。最后,可以将处理后的数据发送到文件系统、数据库和实时仪表盘。事实上,也可以将Spark的机器学习和图形处理算法应用于数据流。
Spark Streaming提供了用来操作数据流的API,并且与Spark Core中的RDD API高度对应,可以帮助开发人员高效地处理数据流中的数据。从底层设计来看,Spark Streaming支持与Spark Core同级别的容错性、吞吐量以及可伸缩性。
Spark Streaming通过将流数据按指定时间片累积为RDD,然后将每个RDD进行批处理,进而实现大规模的流数据处理。
MLlib是Spark的机器学习(Machine Learning,ML)库,它的目标是使机器学习具有可扩展性和易用性,其中提供了分类、回归、聚类、协同过滤等常用机器学习算法,以及一些更加底层的机器学习原语。
GraphX是Spark中图形和图形并行计算的一个新组件,可以用其创建一个顶点和边都包含任意属性的有向多重图。此外,GraphX还包含越来越多的图算法和构建器,以简化图形分析任务。