Spark执行计划解析后是如何触发执行的?

在前一篇Spark SQL 执行计划解析源码分析中,笔者分析了Spark SQL 执行计划的解析,很多文章甚至Spark相关的书籍在讲完执行计划解析之后就开始进入讲解Stage切分和调度Task执行,每个概念之间没有强烈的关联,因此这中间总感觉少了点什么,执行计划是如何触发执行的?是Spark自动触发的?还是由客户端的代码触发的?本文笔者为了解答这几个疑问,尝试进行了相关代码的分析。

物理计划都是继承自SparkPlan类,在研究如何触发执行计划之前我们来看一下最终的物理计划是实现逻辑是怎么样的,这里以SparkPlan的子类FileSourceScanExec作为列子来分析一下:

在非Columnar的模式下,普通的算子执行都是以重写doExecute方法来实现的,FileSourceScanExec同样也不例外,下面是FileSourceScanExec的doExecute方法:

我们可以看到doExecute方法的返回值是RDD[InternalRow], 这也是单个物理计划Node转化成RDD关键一步。到这里我们搞清楚了SparkPlan底层是依赖于RDD实现具体的逻辑,那么接下来我们分析一下Spark是如何将一个一个物理计划节点转换成一个一个RDD的。

首先Spark执行模型是火山模型(又叫迭代器模型),通过迭代器模型,Spark会先调用execute方法,execute方法会调用每个Node的doExecute,而从上面的分析我们可以得知每一个doExecute方法的返回类型都是RDD,因此就把每个单独的Node给串联起来了,具体的代码在SparkPlan.execute。

下面是一个简单查询对应的物理计划转换成RDD的大致逻辑:

到这里我们知道知道了多个物理计划Node会转换成多个RDD,而触发这个转换的则是下面的代码,调用了executedPlan.execute(),也就是触发executedPlan转换成RDD。

后续的逻辑就是以RDD来进行的,那么RDD又是如何计算的呢?我们知道RDD分为Transformation和Action两种类型的操作,而Transformation是惰性的,只有Action会触发计算,因此只有Action被调用的时候,RDD才会触发计算,对应的Spark的执行计划才会开始触发具体的逻辑执行。Action算子有很多中,我们可以以常见的show、take等作为入口去分析源码,被调用的地方大部分都在DataSet里面,可以一一对应地查看。

以上的逻辑仅仅是分析Spark地物理计划是如何触发执行的,还没到切分Stage以及调度Task的阶段。从这一部分的源码分析,我们可以清楚的了解到Spark的物理计划是被火山模型如何串联起来的,以及底层的RDD是如何把一一对应的,这对于理解每一个物理执行计划的Node至关重要。无论是SQL还是PySpark等DataFrame操作,最终都会转换成RDD的逻辑。

题外话:笔者之前都是一直只是知道Spark中RDD的概念,但是并没有很深刻的理解RDD的一个重要性,通过本文的分析,才清楚的认识到RDD在Spark当中扮演着如此重要的角色。

相关推荐
黎阳之光8 小时前
黎阳之光:以视频孪生重构智慧防火,打造“天空地人智”一体化森林防火新范式
大数据·运维·人工智能·物联网·安全
Daydream.V9 小时前
Python Flask超全入门实战教程|从零基础到项目部署
大数据·python·flask
SmartBrain13 小时前
AI全栈开发(SDD):慢病管理系统工程级设计
java·大数据·开发语言·人工智能·架构·aigc
zandy101113 小时前
2026 BI平台与数据中台融合架构实践:从数据烟囱到统一智能数据层
大数据·架构·spark
金智维科技官方15 小时前
圆桌对话:从流程自动化到智能流程,AI落地的下一站在哪里?
大数据·人工智能·ai·自动化·智能体
Volunteer Technology15 小时前
集群基础环境搭建(二)
大数据·flink·apache
郑小憨16 小时前
zookeeper内部原理 (进阶介绍 三)
大数据·分布式·zookeeper
厌灵泽(后端小白)16 小时前
Windows11本地安装Zookeeper(最新)
大数据·windows·zookeeper·笔记本电脑
寻道模式17 小时前
【时间之外】私有化部署AI的3个优点和3个缺点
大数据·人工智能·ollama·私有化·genericagent
郑寿昌17 小时前
2026脑机接口与大模型融合架构解析
大数据·人工智能·架构