spark学习之执行计划explain

本文解析Spark SQL代码执行流程,涵盖解析、验证、优化及物理计划,教你解读各类执行计划,提升对Spark性能调优的认识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🐼今天我们来学习阅读spark的执行计划,在学习执行计划之前,我们需要了解spark中的代码是如何执行的,学习代码的执行过程有助于我们加深对spark的理解,对往期内容感兴趣的同学可以查看👇:

🐰本文主要是讲解spark sql的代码,从本质上说,操作dataframe和sql,spark都将转换为相同的底层执行计划,那我们这里就以sql代码执行为例。

1. spark代码处理流程

1.1 代码处理详细过程

流程图如下:
在这里插入图片描述

  1. 将sql语句转化为未决断的逻辑执行计划(未决断的意思就是只验证了sql语法的正确性,未验证表名列名的正确性)
  2. 使用catalog验证第一步中的表名列名信息,转化为逻辑执行计划(catalog描述了数据集的属性和数据集的位置)
  3. 接着对我们的sql语法进行优化,得到优化后的逻辑执行计划
  4. 优化后的逻辑执行计划转化为物理执行计划
  5. 根据合适CBO(代价选择)将物理执行计划转化为可以执行的代码
  6. 转化为rdd去执行任务

1.2 核心过程

在这里插入图片描述

  1. 分析
  2. 逻辑优化
  3. 生成物理执行计划
  4. 评估模型分析
  5. 代码生成

2. spark查看执行计划

2.1 explain的用法

下面介绍如何使用explain查询几种执行计划

  • explain():只展示物理执行计划。(使用较多
  • explain(mode=“simple”):只展示物理执行计划。
  • explain(mode=“extended”):展示物理执行计划和逻辑执行计划。
  • explain(mode=“codegen”) :展示要 Codegen 生成的可执行 Java 代码。(使用较多
  • explain(mode=“cost”):展示优化后的逻辑执行计划以及相关的统计。
  • explain(mode=“formatted”):以分隔的方式输出,它会输出更易读的物理执行计划,并展示每个节点的详细信息。

演示一下:我们这里有student表和score表,连接分组操作。

sqlway=spark.sql("""
select student.s_id,count(1)
from student
left join score
on student.s_id=score.s_id
group by student.s_id
""")
sqlway.explain(mode="extended")#展示物理执行计划和逻辑执行计划。

展示逻辑和物理执行计划结果如下:
在这里插入图片描述
图片中的各个部分解释如下:

  1. Unresolved 逻辑执行计划:== Parsed Logical Plan ==
    含义:Parser 组件检查 SQL 语法上是否有问题,然后生成 Unresolved(未决断)的逻辑计划,不检查表名、不检查列名。
  2. Resolved 逻辑执行计划:== Analyzed Logical Plan ==
    含义:通过访问 Spark 中的 Catalog 存储库来解析验证语义、列名、类型、表名等。
  3. 优化后的逻辑执行计划:== Optimized Logical Plan ==
    含义:Catalyst 优化器根据各种规则进行优化。
  4. 物理执行计划:== Physical Plan ==
    含义:生成java代码执行

3. spark阅读执行计划

这一部分将通过第二部分中的代码产生的执行进行解读。
悄悄告诉你们,执行计划的阅读方式是从下往上阅读。

3.1 阅读 Parsed Logical Plan

在这里插入图片描述
这一部分显示的是未决断的逻辑执行计划。从下至上依次是查看表名,然后join,然后聚合。

3.2 阅读 Analyzed Logical Plan

在这里插入图片描述
这一部分,是加入了catalog验证表名和列名之后的执行计划,和上一部分的很像,但增加了表的相关信息,#号代表列的序号,L代表长整型整数。

3.3 阅读 Optimized Logical Plan

在这里插入图片描述
这一部分,是优化后的逻辑执行计划,加入了判断空值、自动过滤等功能,优化了逻辑执行过程。

3.4 阅读 Physical Plan

在这里插入图片描述
这一部分,介绍一些物理执行计划中的名词:

  • HashAggregate:表示数据聚合,一般 HashAggregate 是成对出现,第一个HashAggregate 是将执行节点本地的数据进行局部聚合,另一个 HashAggregate 是将各个分区的数据进一步进行聚合计算。
  • Exchange:表示shuffle,表示需要在集群上移动数据。很多时候HashAggregate 会以 Exchange 分隔开来。
  • Project:表示 SQL 中的投影操作,就是选择列(例如:select name, age…)
  • BroadcastHashJoin:表示通过基于广播方式进行 HashJoin。
  • LocalTableScan :表示全表扫描本地的表。

根据这些,我们可以看出,物理执行计划会去寻找表所在的文件位置,取出所需要的列,规约(预聚合),广播,join的方式,聚合的列等等信息。

4. 总结

在这一部分中,我们对spark sql对运行原理和执行计划进行了说明,学习这一部分的主要原因是让我们更加了解spark的运行机制,为后面我们学习spark的优化做基础。

5. 参考资料

  • 尚硅谷spark3.0
  • spark权威指南
<think>嗯,用户想学习如何使用Spark进行数据开发,需要学习资料和入门教程。首先,我需要整理Spark的基础知识,比如它的核心组件和架构。然后,用户可能需要具体的安装步骤和环境配置,比如引用中的Spark环境搭建命令,可以参考引用4。接下来,数据处理的流程,比如ETL步骤,引用3提到了初始化SparkSession和读取数据源,这部分应该详细说明。另外,用户可能对Spark SQL感兴趣,引用1和引用2都提到了,需要强调SQL和DataFrame的使用。学习资料方面,官方文档和推荐书籍很重要,还有实践项目建议。最后,生成相关问题时要覆盖基础概念、安装、组件对比、优化技巧和应用场景,这样用户能全面学习。要注意使用正确的中文表达,确保LaTeX格式无误,比如变量用$...$,独立公式用$$...$$,但当前问题可能数学公式不多,不过要注意可能的代码块和引用标识。需要检查引用是否正确对应,比如引用1是关于Spark SQL,引用3是ETL步骤,引用4是环境搭建。可能还需要补充一些实际代码示例,如SparkSession初始化和简单的数据处理操作,帮助用户理解。最后确保回答结构清晰,分步骤指导,让用户能一步步跟着做。</think>### 如何使用Spark进行数据开发 #### 一、Spark基础概念 1. **核心架构** Spark基于分布式内存计算,核心组件包括: - **Spark Core**:任务调度、内存管理、容错机制 - **Spark SQL**:结构化数据处理(如SQL查询)[^1] - **Spark Streaming**:实时流数据处理 - **MLlib**:机器学习库 - **GraphX**:图计算 2. **编程模型** 使用弹性分布式数据集(RDD)和DataFrame作为主要数据结构,支持Scala、Java、Python和R语言。 #### 二、环境搭建与入门 1. **安装步骤** 根据引用[4],通过以下命令下载并解压Spark: ```bash wget https://dlcdn.apache.org/spark/spark-3.2.0/spark-3.2.0-bin-hadoop3.2.tgz tar zxvf spark-3.2.0-bin-hadoop3.2.tgz ``` 2. **初始化SparkSession** 如引用[3]所示,Python中初始化Spark环境: ```python from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("DataLakeETL") \ .getOrCreate() ``` #### 三、数据开发流程 1. **数据读取与写入** - 从CSV加载数据: ```python df = spark.read.csv("path/to/data.csv", header=True) ``` - 写入Parquet格式: ```python df.write.parquet("output.parquet") ``` 2. **数据处理与转换** ```python # 筛选和聚合 result = df.filter(df["age"] > 30).groupBy("department").count() ``` 3. **使用Spark SQL** 如引用[1]所述,可直接运行SQL查询: ```python df.createOrReplaceTempView("employees") spark.sql("SELECT department, AVG(salary) FROM employees GROUP BY department") ``` #### 四、学习资料推荐 1. **官方文档** - [Spark官方指南](https://spark.apache.org/docs/latest/) 2. **入门教程** - 引用[2]中提到的《Spark基础入门》视频教程 - 书籍:《Learning Spark, 2nd Edition》 3. **实践项目** - 实现日志分析ETL流程 - 构建实时词频统计应用 #### 五、常见问题解决 - **性能优化**:通过缓存RDD(`df.cache()`)或调整分区数提升效率。 - **调试技巧**:使用`df.explain()`查看执行计划。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳小葱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值