Spark SQL 与传统 DBMS 的查询优化器 + 执行器的架构较为类似,只不过其执行器是在分布式环境中实现,并采用的 Spark 作为执行引擎。 Spark SQL 的查询优化是Catalyst,其基于 Scala 语言开发,可以灵活利用 Scala 原生的语言特性很方便进行功能扩展,奠定了 Spark SQL 的发展空间。 Catalyst 将 SQL 语言翻译成最终的执行计划,并在这个过程中进行查询优化。这里和传统不太一样的地方就在于, SQL 经过查询优化器最终转换为可执行的查询计划是一个查询树,传统 DB 就可以执行这个查询计划了。而 Spark SQL 最后执行还是会在 Spark 内将这棵执行计划树转换为 Spark 的有向无环图DAG 再执行。
1. Catalyst 架构及执行流程分析
下图1所示是Catalyst 的整体架构。
图 1 Spark SQL 查询引擎 Catalyst 的架构
从图1 中可以看到整个 Catalyst 是 Spark SQL 的调度核心,遵循传统数据库的查询解析步骤,对 SQL 进行解析,转换为逻辑查询计划、 物理查询计划,最终转换为
Spark 的 DAG 后再执行。图 2为 Catalyst 的执行流程。
SqlParser 将 SQL 语句转换为逻辑查询计划, Analyzer 对逻辑查询计划进行属性和关系关联检验,之后 Optimizer 通过逻辑查询优化将逻辑查询计划转换为优化的逻辑查询计划,
QueryPlanner 将优化的逻辑查询计划转换为物理查询计划, prepareForExecution 调整数据分布,最后将物理查询计划转换为执行计划进入Spark 执行任务。
图2 Catalyst 的执行流程