云湖湖导读:

之前我们揭秘了华为云DLI背后的核心技术引擎Spark,了解了Spark的核心概念与架构。那么,究竟是什么让Spark既提供了通用优雅的接口,同时又具备强大的计算能力呢?要回答这个问题,就需要了解Spark SQL及其运行流程。今天,我们主要通过以下两点来解析:

1、Spark SQL是什么

2、Spark SQL核心——Catalyst查询编译器


Spark SQL是什么

Spark SQL是Spark系统的核心组件,为来自不同数据源、不同格式的数据提供了结构化的视角,让用户可以使用SQL轻松的从数据中获取有价值的信息。

sparksql如何只减月份 spark sql sum_编译器

图 Spark生态

在Spark中,Spark SQL并不仅仅是狭隘的SQL,而是作为Spark程序优化、执行的核心组件。流计算、机器学习、图计算、深度学习等应用都可以转化为DataFrame/Dataset的API。这些API和通常的SQL一样,共享优化层、执行层,共享访问多种数据源的能力。可以说,Spark SQL是让Spark应用程序拥有高效性、高可容错性和丰富生态的“幕后英雄”。

sparksql如何只减月份 spark sql sum_sparksql如何只减月份_02

图 Spark SQL的角色

Spark SQL核心——Catalyst查询编译器

Spark SQL的核心是一个叫做Catalyst的查询编译器,它将用户程序中的SQL/Dataset/DataFrame经过一系列操作,最终转化为Spark系统中执行的RDD。

Catalyst中的框架如下图所示,它有以下几个重要组成部分:

sparksql如何只减月份 spark sql sum_SQL_03

Parser

兼容ANSI SQL 2003标准和HiveQL。将SQL/Dataset/DataFrame转化成一棵未经解析(Unresolved)的树,在Spark中称为逻辑计划(Logical Plan),它是用户程序的一种抽象。

Analyzer

利用目录(Catalog)中的信息,对Parser中生成的树进行解析。Analyzer有一系列规则(Rule)组成,每个规则负责某项检查或者转换操作,如解析SQL中的表名、列名,同时判断它们是否存在。通过Analyzer,我们可以得到解析后的逻辑计划。

Optimizer

对解析完的逻辑计划进行树结构的优化,以获得更高的执行效率。优化过程也是通过一系列的规则来完成,常用的规则如谓词下推(Predicate Pushdown)、列裁剪(Column Pruning)、连接重排序(Join Reordering)等。此外,Spark SQL中还有一个基于成本的优化器(Cost-based Optmizer),是由DLI内部开发并贡献给开源社区的重要组件。该优化器可以基于数据分布情况,自动生成最优的计划。

Planner

将优化后的逻辑计划转化成物理执行计划(Physical Plan)。由一系列的策略(Strategy)组成,每个策略将某个逻辑算子转化成对应的物理执行算子,并最终变成RDD的具体操作。注意在转化过程中,一个逻辑算子可能对应多个物理算子的实现,如join可以实现成SortMergeJoin或者BroadcastHashJoin,这时候需要基于成本模型(Cost Model)来选择较优的算子。上面提到的基于成本的优化器在这个选择过程中也能起到关键的作用。

经过上述的一整个流程,就完成了从用户编写的SQL语句(或DataFrame/Dataset),到Spark内部RDD的具体操作逻辑的转化。

整个Catalyst框架拥有良好的可扩展性,开发者可以根据不同的需求,灵活地添加自己的语法、解析规则、优化规则和转换策略。

总结

经过上面的介绍,我们可以看到,SparkSQL是Spark强大的计算和处理能力的使能者。DLI服务在全面兼容Spark能力的同时,还提供了丰富的数据源对接能力。通过DLI服务,用户可以通过SQL轻松访问OBS、DWS、CloudTable、Elasticsearch等多个服务中的数据,在降低使用门槛的同时,避免了数据搬迁,从而实现在一个数据湖中的高效信息探索。