大数据开发开源平台之 Spark SQL 的基础
Spark SQL 作为 Spark 计算查询的重要支撑,在 Spark 生态当中的重要性是不言而喻的。Spark SQL 使得一般的开发人员或者非专业的开发人员,也大数据培训能快速完成相应的计算查询需求,这也是其存在的重要意义。今天的大数据开发学习分享,我们就来讲讲 Spark SQL 及基础引擎。
在编程级别上,Spark SQL 允许开发人员对具有模式的结构化数据发出与 ANSI SQL:2003 兼容的查询。自从在 Spark1.3 中引入以来,Spark SQL 已经发展成为一个强大的引擎,在此基础上建立了许多高级的结构化功能。除了允许你对数据发出类似 SQL 的查询外,Spark SQL 引擎还包括:
统一 Spark 组件,并允许抽象为 Java、Scala、Python 和 R 中的 DataFrame/Dataset,这简化了对结构化数据集的工作。
连接到 Apache Hive 元存储库和表。
从结构化文件(JSON、CSV、文本、CSV、拼花、ORC 等)读写具有特定 schema 的结构化数据。并将数据转换为临时表。
提供交互式 Spark SQL Shell 支持快速数据浏览。
通过标准数据库 JDBC/ODBC 连接器提供与外部工具之间的桥梁。
为 JVM 生成优化的查询计划和紧凑的代码,以便最终执行。
Spark SQL 引擎的核心是 Catalyst 优化器和 Project Tungsten。它们一起支持高级 DataFrame、Dataset API 和 SQL 查询。
优化器
Catalyst 优化器接受计算查询,并将其转换为一个执行计划。它经历了四个转换阶段,如下图所示:
阶段 1:分析
Spark SQL 引擎首先会为 SQL 或 DataFrame 查询生成一个抽象语法树(AST)。在此初始阶段,任何列或表名都将会被解析为内部的 Catalog,catalog 是一个指向 Spark SQL 的编程接口,该接口包含列、数据类型、函数、表、数据库、列名等等的列表。一旦全部成功解决,查询将继续进入下一阶段。
阶段 2:逻辑优化
该阶段包括两个内部阶段。应用基于标准化的优化方法,Catalyst 优化器将首先构建一组多个计划,然后使用其基于成本的优化器(CBO)将成本分配给每个计划。这些计划展示为算子树的形式;例如,它们可能包括常数折叠、谓词下推、投影计算、布尔表达式简化等过程。这个逻辑计划是对物理计划的输入。
阶段 3:物理执行计划
在此阶段,Spark SQL 使用与 Spark 执行引擎相匹配的物理运算符,为所选的逻辑计划生成最佳的物理计划。
阶段 4:代码生成
查询优化的最后阶段涉及生成在每台机器上运行的高效 Java 字节码。因为 Spark SQL 可以对内存中加载的数据集进行操作,所以 Spark 可以使用最先进的编译器技术来生成代码以加快执行速度。换句话说,它充当了编译器。Tungsten 项目在这里发挥了重要作用,是整个阶段代码生成的利器。
整个阶段的代码生成是什么呢?这是一个物理查询优化阶段,它将整个查询分解成一个函数,摆脱虚拟函数调用,并使用 CPU 寄存器存储中间数据。Spark2.0 中引入的第二代 Tungsten 引擎使用此方法生成紧凑的 RDD 代码以便最终执行。这种精简的策略显著提高了 CPU 的效率和性能。
原创作者:robin
评论