Spark SQL运行原理解析

SparkSQL遵循与传统数据库类似的SQL处理步骤,包括解析、绑定、优化和执行。它使用catalyst作为核心优化器,通过Antlr解析SQL生成逻辑计划,再经过Analyzer绑定元数据,Optimizer进行优化,最后由SparkPlanner生成物理计划执行。整个流程涉及SparkSessionCatalog、AnalysisRules和PlanningStrategies等组件,确保高效的数据处理。

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

传统关系型数据库中 ,最基本的sql查询语句由projecttion (field a,field b,field c) , datasource (table A) 和 fieter (field a >10) 三部分组成。 分别对应了sql查询过程中的result , datasource和operation ,也就是按照result ——> datasource ——> operation 的顺序来描述,如下图所示:

 但是sql实际执行过程是按照operation——> datasource——>result 的顺序来执行的这与sql语法正好相反,具体的执行过程如下:

  1 . 语法和词法解析:对写入的sql语句进行词法和语法解析(parse),分辨出sql语句在哪些是关键词(如select ,from 和where),哪些是表达式,哪些是projection ,哪些是datasource等,判断SQL语法是否规范,并形成逻辑计划。

  2 .绑定:将SQL语句和数据库的数据字典(列,表,视图等)进行绑定(bind),如果相关的projection和datasource等都在的话,则表示这个SQL语句是可以执行的。

  3 .优化(optimize):一般的数据库会提供几个执行计划,这些计划一般都有运行统计数据,数据库会在这些计划中选择一个最优计划。

  4 .执行(execute):执行前面的步骤获取最有执行计划,返回查询的数据集。

SparkSQL的运行架构:

  Spark SQL对SQL语句的处理和关系型数据库采用了类似的方法,sparksql先会将SQL语句进行解析(parse)形成一个Tree,然后使用Rule对Tree进行绑定,优化等处理过程,通过模式匹配对不同类型的节点采用不同操作。而sparksql的查询优化器是catalyst,它负责处理查询语句的解析,绑定,优化和生成物理执行计划等过程,catalyst是sparksql最核心部分。

1.SparkSQL的运行简化流程

  1. 进行DataFrame|Dataset|SQL编程;
  2. Spark会将编写的代码转换并生成一个逻辑计划;
  3. Spark会将此逻辑计算转换生成一个重计划,同时在底层以执行的代码进行优化;
  4. Spark将这个优化了的物理计划提交到集群上执行,底层上是基于RDD的操作;

  Spark SQL由core,catalyst,hive和hive-thriftserver4个部分组成。

  • core: 负责处理数据的输入/输出,从不同的数据源获取数据(如RDD,Parquet文件和JSON文件等),然后将结果查询结果输出成Data Frame。
  • catalyst: 负责处理查询语句的整个处理过程,包括解析,绑定,优化,生成物理计划等。
  • hive: 负责对hive数据的处理。
  • hive-thriftserver:提供client和JDBC/ODBC等接口。

3.Spark优化器catalyst

        SparkSQL会先将SQL语句进行解析形成一个树(Tree), 然后使用Rule对Tree进行绑定,优化等处理,通过模式匹配对不同类型的节点采用不同的操作。

而SparkSQL的查询优化器是catalyst, 它负责语句的解析(parse), 绑定,优化和根据逻辑执行计划生成物理执行计划等过程,catalyst是SparkSQL最核心的部分。
 

4.SparkSQL运行原理 分析: 

  1.使用SesstionCatalog保存元数据

  在解析sql语句前需要初始化sqlContext,它定义sparksql上下文,在输入sql语句前会加载SesstionCatalog,初始化sqlcontext时会把元数据保存在SesstionCatalog中,包括库名,表名,字段,字段类型等。这些数据将在解析未绑定的逻辑计划上使用。

  2.使用Antlr生成未绑定的逻辑计划

  Spark2.0版本起使用Antlr进行词法和语法解析,Antlr会构建一个按照关键字生成的语法树,也就是生成的未绑定的逻辑计划。

  3.使用Analyzer绑定逻辑计划

  在这个阶段Analyzer 使用Analysis Rules,结合SessionCatalog元数据,对未绑定的逻辑计划进行解析,生成已绑定的逻辑计划。

  4.使用Optimizer优化逻辑计划

  Opetimize(优化器)的实现和处理方式同Analyzer类似,在该类中定义一系列Rule,利用这些Rule对逻辑计划和Expression进行迭代处理,达到树的节点的合并和优化。

  5.使用SparkPlanner生成可执行计划的物理计划

   SparkPlanner使用Planning Strategies对优化的逻辑计划进行转化,生成可执行的物理计划。

  6.使用QueryExecution执行物理计划

// 创建SparkSession类。从2.0开始逐步替代SparkContext称为Spark应用入口
var spark = SparkSession.builder().appName("appName").master("local").getOrCreate()
//创建数据表并读取数据
spark.read.json("./test.json").createOrReplaceTempView("test_table")
//通过SQL进行数据分析。可输入任何满足语法的语句
spark.sql("select name from test_table where a > 1").show()

5.SparkSQL运行图解

sql语句首先是生成逻辑计划,然后是物理计划

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

四月天03

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

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

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

打赏作者

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

抵扣说明:

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

余额充值