SparkSQL 是如何将SQL语句转化为Spark任务的呢?
详细过程如下图
通过拉去 github 的 Spark 源码,查看 SparkSQL 模块的 readme.txt 文件可以看出,SparkSQL 包含4个方面的内容
SparkSQL源码主要包含4大模块
- Catalyst (sql/catalyst):sql词法语法解析、绑定、逻辑执行计划优化
- Execution (sql/core):查询规划器/执行引擎,用于将Catalyst的逻辑查询计划转换为Spark RDD、SQL执行
- Hive Support (sql/hive):负责对hive数据的处理逻辑,包括允许用户使用HiveQL子集编写查询和使用HiveSerdes从HiveMetastore访问数据的扩展。还有一些包装器允许用户运行包含配置单元UDF、UDAFs和UDTFs的查询。
- HiveServer and CLI support (sql/hive-thriftserver):提供client和JDBC/ODBC接口,包括对SQL CLI(bin/spark SQL)和HiveServer2(用于JDBC/ODBC)兼容服务器的支持。
什么是Catalyst ?
Catalyst 负责解析 SQL, 生成执行计划,具体过程包括:
- 解析SQL,生成抽象语法树(AST)
- 在 AST 中加入元数据信息,生成逻辑执行计划
- 对已经加入元数据的 AST, 输入优化器, 进行规则优化(RBO) ,生成优化后的逻辑执行计划。
哪些阶段属于Catalyst ?
Catalyst 作用是什么?
首先,RDD大致运行步骤:先将 RDD 解析为由 Stage 组成的 DAG,后将 Stage 转为 Task 直接运行。任务会按照代码所示运行,依赖开发者的优化,开发者会在很大程度上影响运行效率。
与 RDD 不同,SparkSQL 可以获知数据的 Schema 来进行优化,SparkSQL 的 DSL 和 SQL 并不是直接生成计划交给集群执行,而是经过了一个叫做 Catalyst 的优化器,这个优化器能够自动帮助开发者优化代码。SparkSQL 中正是由于 Catalyst 优化器存在,使得无论基于SQL还是DSL分析数据,性能都是一样的,并且底层做了很多优化。