在大数据时代,数据的处理和分析变得尤为重要。Apache Spark作为一个开源的分布式大数据处理引擎,提供了流处理和批处理的共同处理引擎,具有并行处理和容错能力。本文将探讨Apache Spark的内部机制和高级架构,包括其组件、集群管理器、RDD以及执行程序的运行时组件。
Apache Spark简介
Apache Spark是一个开源的分布式大数据处理引擎,它为流数据和批数据提供了一个共同的处理引擎。与Hadoop MapReduce相比,Spark通过内存计算的概念,使其速度大约快100倍。Spark提供了高级API,支持Java、Scala、Python和R四种语言。
Spark组件
Spark由核心组件Spark Core构成,它包含了大部分的库。在Spark Core之上,有四个不同的组件:Spark SQL、Spark Streaming、MLlib和GraphX。
Spark SQL提供了类似SQL的接口,使用户能够使用Spark作为处理引擎来处理结构化和半结构化数据。它支持SQL和HQL查询,并且能够处理来自多个来源的数据。
Spark Streaming支持处理大量数据流。它通过微批处理支持实时流处理,将实时数据转换为小批量数据,然后由处理引擎进行处理。
MLlib组件提供了机器学习库,用于数据的统计和动态分析。它包括聚类、分类、回归等多种机器学习算法,并提供高质量的算法和高速的执行。
GraphX提供了基于Spark Core的分布式图计算。它包含多个Spark RDD API,帮助创建有向图,其顶点和边与任意属性相关联。使用GraphX,可以进行遍历、搜索和路径查找。
集群管理器
Spark还包含三个可插拔的集群管理器:Standalone、Apache Mesos和Hadoop YARN。这些管理器负责启动执行器、调度任务,并根据应用需求管理资源。
Spark RDD
Apache Spark有一个基本的数据结构叫做弹性分布式数据集(RDD),它是Apache Spark的骨干。RDD执行两个主要功能:转换和动作。转换是对输入数据执行的操作,如Map()、Filter()、sortBy()等,它们基于执行的操作创建新的RDD。动作是执行新创建的RDD以获得所需结果的过程,如collect()、countByKey()等。动作将结果返回给驱动程序。
Spark高级架构
当使用Spark运行任何作业时,底层的执行过程如下。有一个驱动程序与集群管理器一起工作,在工作节点上调度任务。一旦这些任务完成,它们将结果返回给驱动程序。
Spark驱动程序的第一个活动是调用程序的主方法。当在Spark中编写任何执行代码时,会给出主类,这是程序的入口点,由Spark驱动程序执行。驱动程序创建Spark上下文或Spark会话,这取决于使用的Spark版本。驱动程序运行用户代码,最终创建RDD数据框架和数据单元,这些是Spark世界中的数据单元抽象。驱动程序执行所有不同的转换,并以任务的形式在不同的执行器上执行动作。驱动程序执行的两个主要功能是将用户程序转换为任务,并在集群管理器的帮助下将这些任务调度到执行器上。
Spark执行与集群管理器无关。可以插入任何三个可用的集群管理器或支持的集群管理器,执行行为不会改变。Spark依赖集群管理器启动执行器。这是集群管理器的职责,负责调度和启动执行器。资源由集群管理器分配,用于执行任务。集群管理器是一个可插拔组件,有三个可用和支持的集群管理器可供选择,可以根据用例和需求插入任何一个。集群管理器可以根据工作负载动态调整Spark应用程序使用的资源。集群管理器可以根据数据处理需求增加或减少执行器的数量。
给定Spark作业中的各个任务在Spark执行器中运行。Spark执行器以任务的形式运行数据加工的实际编程逻辑。执行器在Spark应用程序提交以执行作业时启动,并在整个应用程序的生命周期内运行。执行器的两个主要角色是运行任务并将结果返回给驱动程序,以及为RDD数据集和用户缓存的数据框架提供内存存储。因此,执行器是执行数据处理任务的实际单位。
Spark示例程序
from pyspark import SparkContext
sc = SparkContext("local", "count app")
words = sc.parallelize(
["scala",
"java",
"hadoop",
"spark",
"akka",
"spark vs hadoop",
"pyspark",
"pyspark and spark"]
)
words_filter = words.filter(lambda x: 'spark' in x)
counts = words_filter.count()
print("Number of elements filtered -> %i" % (counts))
#sample output
#Number of elements
#filtered -> 4