Spark SQL 原理与开发
下面我将针对你的提纲,围绕 Spark SQL 的开发和源码剖析,分环节细化到具体方法、内部逻辑、源码行级剖析,并给出详细注释和速记口诀,方便你理解和记忆。
一、Spark SQL 原理与开发
1. SQL在大数据中的组成原理
组成原理
- SQL解析层:负责SQL语句解析为AST(抽象语法树)。
- 逻辑计划层:将AST转为逻辑执行计划(Logical Plan)。
- 优化器:Catalyst优化器对逻辑计划进行优化(如谓词下推、投影剪裁等)。
- 物理计划层:将优化后的逻辑计划转为物理计划(Physical Plan)。
- 执行引擎:物理计划被转换为RDD/DAG并分布式执行。
速记口诀
“语法树-逻辑化,优化后-物理跑,底层RDD并行搞。”
2. DataFrame与Dataset开发
常用API与原理
- DataFrame:结构化数据集(Row类型),面向SQL风格。
- Dataset:类型安全的分布式数据集(泛型[T]),支持编译期类型检查。
关键方法
spark.read.json/csv/parquet
df.select
,df.filter
,df.groupBy
df.as[Type]
转换为Datasetdf.createOrReplaceTempView("table")
注册临时表
源码入口
DataFrame
实际是Dataset[Row]
- 入口类:
org.apache.spark.sql.Dataset
- 具体方法如
select
、filter
最终会生成 LogicalPlan
速记口诀
“DF灵活,DS安全,转化计划LogicalPlan。”
3. 整合Hive Metastore搭建企业级数仓
步骤
- 添加依赖:
spark-hive
- 配置 hive-site.xml
- 启动 SparkSession 时开启 Hive 支持
关键方法
val spark = SparkSession.builder().appName("example").enableHiveSupport().getOrCreate()
spark.sql("show tables")
spark.table("hive_table")
源码细节
- HiveCatalog / HiveExternalCatalog 负责与Metastore交互
- 元数据管理入口:
org.apache.spark.sql.hive.HiveExternalCatalog
速记口诀
“配置依赖启支持,Hive数仓轻松起。”
二、Spark SQL 源码分析
1. ANTLR4的SQL解析
源码入口
org.apache.spark.sql.catalyst.parser.SqlBaseLexer
org.apache.spark.sql.catalyst.parser.SqlBaseParser
org.apache.spark.sql.catalyst.parser.CatalystSqlParser.parsePlan(sqlText: String): LogicalPlan
解析流程
- 词法分析:SqlBaseLexer
- 语法分析:SqlBaseParser
- 生成AST:parse树
- 转换为LogicalPlan:CatalystSqlParser
速记口诀
“Lexer分词,Parser语法,AST转计划。”
2. AST语法树与逻辑到物理计划转换
AST到LogicalPlan
- AST节点由
SqlBaseParser
生成 - 通过
AstBuilder
将AST转为LogicalPlan
逻辑计划转物理计划
QueryExecution
类:持有 logical/optimized/physical planSparkPlanner
将LogicalPlan转为PhysicalPlan
关键源码方法
CatalystSqlParser.parsePlan(sql)
AstBuilder.visitXXX(ctx)
QueryExecution.optimizedPlan
QueryExecution.sparkPlan
速记口诀
“AST到逻辑,Planner物理,执行全靠QueryExecution。”
3. 逻辑计划、优化器、物理计划、RDD转换
逻辑计划 LogicalPlan
- 类层次:
org.apache.spark.sql.catalyst.plans.logical.LogicalPlan
- 常见子类:
Project
,Filter
,Aggregate
- 主要字段:
children
、output
优化器 Optimizer
- 入口类:
org.apache.spark.sql.catalyst.optimizer.Optimizer
- 优化规则:如
PushDownPredicate
,ColumnPruning
- 调用链:
QueryExecution.optimizedPlan
物理计划 PhysicalPlan
- 类层次:
org.apache.spark.sql.execution.SparkPlan
- 常见子类:
ProjectExec
,FilterExec
,SortExec
- 生成:
QueryExecution.sparkPlan
RDD转换
SparkPlan.execute()
->RDD[InternalRow]
- 物理计划节点会生成对应的RDD算子
典型源码行级解析(以 select 语句为例)
// 1. 解析SQL为LogicalPlan
val logicalPlan = CatalystSqlParser.parsePlan("SELECT name FROM people")// 2. 逻辑计划优化
val optimizedPlan = Optimizer.execute(logicalPlan)// 3. 物理计划生成
val sparkPlan = SparkPlanner.plan(optimizedPlan)// 4. 物理计划执行,生成RDD
val resultRDD = sparkPlan.execute()
速记口诀
“逻辑计划先生成,优化规则再套用,物理计划来落地,RDD执行最底层。”
总结速记口诀总览
-
SQL执行链口诀
“语法树-逻辑化,优化后-物理跑,底层RDD并行搞。”
-
DataFrame与Dataset口诀
“DF灵活,DS安全,转化计划LogicalPlan。”
-
Hive集成口诀
“配置依赖启支持,Hive数仓轻松起。”
-
SQL解析口诀
“Lexer分词,Parser语法,AST转计划。”
-
计划转换口诀
“AST到逻辑,Planner物理,执行全靠QueryExecution。”
-
计划执行全流程口诀
“逻辑计划先生成,优化规则再套用,物理计划来落地,RDD执行最底层。”
如需对某一流程的具体源码行、类、方法进行更细致的分析(如 select、join、group by 的内部实现),请告知具体需求,我可逐步详细剖析!