PySpark介绍
框架VS类库
- 类库:别人写好的代码,可以直接导入使用。如Pandas和PySpark
- 框架:可以独立运行,并提供编程结构的一种软件产品,Spark就是一个独立的框架。
Pandas处理小规模数据集,Spark处理大规模数据集。
无论大小数据集,都有合适的技术栈去处理才能称为合格的全栈数据开发工程师
PySpark
此处PySpark是指Python运行类库,而非Spark目录中的bin/pyspark,bin/pyspark只是一个运用程序,提供Python解释器执行环境来运行Spark应用程序。
而PySpark是Spark官方提供的类库,内置了全部Spark API,可以通过PySpark类库编写Spark应用程序并提交到Spark集群中运行。
PySpark使用
应用入口:SparkContext
Spark Application应用程序的入口为: SparkContext,任何Spark应用都需要先构建SparkContext对象。
- 创建SparkConf
from pyspark import SparkConf,SparkContext #设置Spark应用运行名称和运行Master conf=SpacrConf().setAppName("my app").setMaster("local[*]")
- 基于SparkConf创建SparkContetx
sc=SparkContext(conf=conf)
案例
from pyspark import SparkConf,SparkContext
import os
if __name__ == '__main__':
# 如果没有在环境变量中设置,就需要显示的设置pyspark的python解释器
#否则会报Python worker failed to connect back.无法启动Python worker进程
os.environ['PYSPARK_PYTHON'] = "D:\dev\python\python3.11.4\python.exe"
# 若需要提交到Spark中执行则需要把setMaster去掉并通过spark-submit客户端工具指定Master
# 若提交到集群中,那么读取的文件一定要是每个机器都能访问
conf=SparkConf().setAppName("helloword").setMaster("local[*]")
sc=SparkContext(conf=conf)
nums=[1,2,3]
rdd1=sc.parallelize(nums)
rdd2=rdd1.map(lambda x:x+1)
print(rdd2.collect())
#输出[2,3,4]
分布式代码解析
以读取hdfs文件test.txt为例。
Driver 创建 SparkContext 对象,用于与集群进行交互并管理作业的执行。SparkContext 对象只存在于 Driver 中,并不会被序列化后发送到各个 Executor 上。
Driver 通过 Master 与集群通信:
- Driver 通过 SparkContext 向 Master 请求资源来执行任务。
- Master 是 Spark 集群的管理节点,负责接收来自 Driver 的资源请求,并调度集群中的 Worker 节点。
- Master 负责跟踪集群中的可用资源,包括每个 Worker 节点的 CPU、内存等,确保将这些资源合理地分配给应用程序。
Master 调度资源到各个 Worker 节点:
-
Driver 调度器(Scheduler) 将应用程序划分为多个阶段(stages),并生成任务(tasks)。Master 接收到 Driver 的资源请求后,会将任务调度给合适的 Worker 节点。
-
Worker 节点 是执行计算任务的节点,每个 Worker 节点上会运行多个 Executor,由 Master 分配的任务会在 Executor 中执行。
-
各个 Executor 读取 HDFS 上的 test.txt 文件,每个 Executor 读取一部分数据。Driver 使用 SparkContext 通过 Master 向集群申请资源后,Master 会将资源分配给各个 Worker 节点,并启动 Executor 进程来执行任务。Driver 中的调度器将数据分割为多个分区(partitions),并通过 Executor 分别读取并处理这些分区的数据。
-
各个 Executor 将处理完的结果发送回 Driver。Driver 收集所有分区的计算结果进行合并或进一步操作。
Driver 负责创建 SparkContext 对象,并通过 Master 管理任务的调度。调度器(Scheduler)将任务划分为多个阶段(stages),并将任务分配给集群中的各个 Executor。
Master 节点 负责资源管理和调度,接收来自 Driver 的资源请求,将任务分配给各个 Worker 节点。
Worker 节点 负责执行计算任务,每个 Worker 节点会启动 Executor,Executor 负责执行 Driver 分发的任务,进行数据处理。
集群上的文件要保证每个 Executor 都能正常访问到,比如通过 HDFS 提供分布式存储,使得每个节点都能读取需要的数据。
Python On Spark运行原理
Spark是基于Scala语言编写的运行在JVM之上,那么Python如何使用Spark呢?
Driver
Python 中创建的 SparkContext 通过 Py4J 桥接器与 JVM Driver 通信。Python 中的代码不会被翻译成 Java 代码,而是通过 Py4J 调用 JVM 中的对象。JVM Driver 负责调度和管理任务,将任务分发到工作节点上的 Executors。
Executor
JVM Executor 接收来自 Driver 的指令,执行 Spark 的任务。如果任务包含 Python 算子,Executor 会启动 Python worker 进程,通过 PySpark 调度 Python worker 来执行 Python 逻辑。Python worker 和 JVM Executor 通过 socket 进行数据通信。
总结
分布式代码执行特征
代码运行在集群上,被分布式运行。
在Spark中,非任务处理部分由Driver执行(非RDD代码)
任务部分由Executor执行(RDD代码)
Executor可以有很多
PySpark机构体系
Dirver翻译后由JVM执行,Executor由JVM转发,底层是Python解释器工作。