1.3 PySpark大数据分析
Spark主要由Scala和Java语言开发,运行在Java虚拟机(Java Virtual Machine,JVM)中。除了提供Scala、Java开发接口外,Spark还为Python、R等语言提供了开发接口。PySpark是Spark为Python开发者提供的API,使得Python开发者在Python环境下可以运行Spark程序。
1.3.1 PySpark简介
Python在数据分析和机器学习领域拥有丰富的库资源,如NumPy、SciPy、Pandas和Scikit-learn 等,因此成为数据科学家和数据分析师处理和分析数据的热门语言。Spark 是目前处理和使用大数据的主流框架之一,其设计初衷是加速迭代计算,非常适合大数据分析、机器学习等应用场景。为了兼顾Spark和Python的优势,Apache Spark开源社区推出了PySpark。
与原生Python相比,PySpark的优势在于其能够运行在集群上,而不仅仅局限于单机环境。因此,当数据量过大以至于单机无法处理,或数据存储在HDFS中,或需要进行分布式/并行计算时,可以选择使用PySpark。
1.3.2 PySpark子模块
PySpark包括一组公共类、用于处理结构化数据的SQL模块与流数据处理的Streaming模块、用于机器学习的MLlib和ML两个包。PySpark类、模块与包如图1-8所示。
图1-8 PySpark类、模块与包
PySpark 公共类中的 pyspark.SparkContext、pyspark.RDD,Streaming 模块中的pyspark.streaming.StreamingContext、pyspark.streaming.DStream 以及 SQL 模块中的pyspark.sql.SparkSession、pyspark.sql.DataFrame为PySpark的核心类。PySpark核心类说明如表1-4所示。
表1-4 PySpark核心类说明
1.PySpark公共类
在 PySpark 中有11个公共类,分别是 Accumulator、Broadcast、RDD、SparkConf、SparkContext、SparkFiles、StorageLevel、TaskContext、RDDBarrier、BarrierTaskContext和BarrierTaskInfo。PySpark公共类的简要说明如表1-5所示。
表1-5 PySpark公共类的简要说明
PySpark的主要公共类解释说明如下。
(1)SparkContext编程入口
在PySpark中,SparkContext类是所有Spark功能的核心入口点,扮演着重要的角色。它负责与 Spark 集群通信,并负责任务的分发和执行。以下是关于 SparkContext 的详细说明。
① 功能入口。SparkContext作为Spark功能的入口点,是运行任何Spark应用程序时必须初始化的对象。因此,在编写PySpark程序时,需要先创建一个SparkContext实例,并传入一个SparkConf对象作为参数。通过这个SparkContext实例,可以提交作业、分发任务和注册应用程序。
② 驱动程序。当运行一个 Spark 应用程序时,系统会启动一个驱动程序,其中包含main函数。SparkContext会在驱动程序中启动,并在工作节点上的Executor中运行操作。
③ 集群连接。SparkContext表示与Spark集群的连接,它是创建RDD和广播变量的基础。
④ 默认实例。默认情况下,PySpark 将 SparkContext 实例命名为“sc”,因此在大多数情况下,可以直接使用“sc”这个名字来访问SparkContext实例。
此外,SparkContext还提供了许多用于操作RDD的方法,例如map()、filter()、reduce()等,这些方法使得对数据的操作变得简单高效。它还支持广播变量,这是一种只读变量,可以被缓存在每台机器上,以便在每个任务中快速访问而无需通过网络传输。
(2)SparkConf配置对象
在PySpark中,SparkConf是一个关键的配置类,用来设置和管理Spark应用程序的各种参数。通过创建SparkConf对象,可以自定义Spark应用程序参数来定制应用程序的行为,以满足不同的需求和环境。以下是关于SparkConf对象的详细说明。
① 创建SparkConf对象。通过调用SparkConf()构造函数,可以创建一个新的SparkConf对象。这个构造函数接受一个可选的字典参数,用于指定默认的配置选项。
② 加载系统属性。SparkConf对象会自动从Java系统属性中加载所有以“spark.”为前缀的属性。例如,如果在启动JVM时设置了“-Dspark.app.name=MyApp”,那么可以使用SparkConf对象的“.get("spark.app.name")”方法获取到“MyApp”。
③ 设置和获取配置选项。可以使用“set(key, value)”方法来设置配置选项,使用get(key)方法来获取配置选项的值。如果尝试获取一个未设置的配置选项,那么系统将会抛出一个异常。
④ 优先级规则。如果在创建SparkConf对象后使用set()方法设置了某个配置选项,那么该方法设置的值将优先于从系统属性中加载的值。
⑤ 不可变性。一旦创建了SparkConf对象并将其传递给SparkContext,就不能再修改该对象。这是由于Spark需要确保在应用程序的整个生命周期中,配置参数保持一致。
⑥ 传递配置给SparkContext。在创建SparkContext对象时,需要传入一个SparkConf对象。这样,SparkContext就可以使用这些配置参数来初始化和运行Spark应用程序。
(3)PySpark广播变量与累加器
在 Spark 中,为了支持并行处理,可以使用两种类型的变量:广播变量(Broadcast Variables)和累加器(Accumulators)。这两种变量可以在集群的每个节点上运行任务时使用。
① 广播变量。广播变量用于在所有节点上保存数据的只读副本。当需要在多个节点上使用相同的数据时,可以使用广播变量来避免数据的重复传输。广播变量在第一次使用时会被缓存在各个节点上,之后可以快速访问而无需再次通过网络传输。
② 累加器。累加器用于在集群中的多个节点上聚合信息。与广播变量不同,累加器是可变的,可以进行关联和交换操作。例如,可以使用累加器来实现计数器或求和操作。累加器的值会在任务执行过程中不断更新,并最终返回给驱动程序。
总的来说,广播变量主要用于在集群中共享只读数据,而累加器用于在集群中进行信息聚合。
2.PySpark SQL模块
PySpark SQL(pyspark.sql)模块包含10个类,提供了类型、配置、DataFrame和许多其他功能的SQL函数和方法,PySpark SQL模块相关类说明如表1-6所示。关于PySpark SQL模块,在本书第3章中将进行详细介绍。
表1-6 PySpark SQL模块相关类说明
3.PySpark Streaming模块
PySpark Streaming(pyspark.streaming)模块包含3个主要的类:StreamingContext、DStream、StreamingListener,也特别提供针对Flume、Kafka、Kinesis流数据处理的类,但这里只对前3个类进行说明,如表1-7所示。PySpark Streaming模块将在本书第4章中做详细介绍。
表1-7 PySpark Streaming模块相关类说明