本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
架构
下图描述了本指南中描述的解决方案的架构。 AWS Glue 任务从亚马逊简单存储服务 (Amazon S3) 存储桶读取数据,该存储桶是一种基于云的对象存储服务,可帮助您存储、保护和检索数据。您可以通过 AWS 管理控制台、AWS Command Line Interface (AWS CLI) 或 AWS Glue API 启动 AWS Glue Spark SQL任务。该 AWS Glue Spark SQL任务处理 Amazon S3 存储桶中的原始数据,然后将处理后的数据存储在另一个存储桶中。
例如,本指南描述了一个用Python和 Spark SQL (PySpark) 编写的基本AWS GlueSpark SQL作业。此 AWS Glue 作业用于演示Spark SQL调优的最佳实践。尽管本指南侧重于此 AWS Glue,但本指南中的最佳实践也适用于 Amazon EMR 工作Spark SQL。
下图描述了Spark SQL查询的生命周期。C Spark SQL atalyst 优化器生成查询计划。查询计划是一系列步骤,例如指令,用于访问 SQL 关系数据库系统中的数据。要制定性能优化的Spark
SQL查询计划,第一步是查看EXPLAIN计划,解释计划,然后调整计划。您可以使用Spark SQL用户界面 (UI) 或Spark SQL历史服务器来可视化计划。
SparkCatalyst Optimizer 将初始查询计划转换为优化的查询计划,如下所示:
-
分析和声明式 API — 分析阶段是第一步。未解析的逻辑计划是使用未绑定的属性和数据类型生成的,其中 SQL 查询中引用的对象未知或与输入表不匹配。然后,Spark SQLCatalyst Optimizer 会应用一组规则来制定逻辑计划。SQL 解析器可以生成 SQL 抽象语法树 (AST),并将其作为逻辑计划的输入提供。输入也可能是使用 API 构造的数据框或数据集对象。下表显示了何时应使用 SQL、数据框或数据集。
SQL 数据帧 数据集 语法错误 运行时 编译时间 编译时间 分析错误 运行时 运行时 编译时间 有关输入类型的更多信息,请查看以下内容:
-
数据集 API 提供类型化版本。由于严重依赖用户定义的 lambda 函数,这会降低性能。RDD 或数据集是静态类型的。例如,在定义 RDD 时,需要明确提供架构定义。
-
数据框 API 提供非类型化关系操作。数据框是动态键入的。与 RDD 类似,定义数据框时,架构保持不变。数据仍然是结构化的。但是,此信息仅在运行时可用。这允许编译器即时编写 SQL-like 语句和定义新列。例如,它可以在现有数据框中追加列,而无需为每个操作都定义一个新类。
-
在运行时对Spark SQL查询进行语法和分析错误评估,从而缩短运行时间。
-
-
目录-Spark SQLApache Hive Metastore (HMS)用于管理永久关系实体(例如数据库、表、列和分区)的元数据。
-
优化-优化器使用启发式方法和成本重写查询计划。它会执行以下操作来生成优化的逻辑计划:
-
修剪列
-
向下推谓词
-
重新排序加入
-
-
物理计划和计划器 — Spark SQL Catalyst Optimizer 将逻辑计划转换为一组物理计划。这意味着它会将内容转换为方式。
-
精选物理计划 — Spark SQL Catalyst Optimizer 选择最具成本效益的物理计划。
-
优化的查询计划-Spark SQL 运行性能优化和成本优化的查询计划。 Spark SQL内存管理跟踪内存使用情况,并在任务和操作员之间分配内存。Spark SQL钨引擎可以显著提高Spark SQL应用程序的内存和CPU效率。它还实现了二进制数据模型处理,并且直接对二进制数据进行操作。这就绕过了反序列化的需求,显著减少了与数据转换和反序列化相关的开销。