

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 架构
<a name="architecture"></a>

下图描述了本指南中描述的解决方案的架构。 AWS Glue 任务从[亚马逊简单存储服务 (Amazon S3) 存储](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)桶读取数据，该存储桶是一种基于云的对象存储服务，可帮助您存储、保护和检索数据。您可以通过 AWS Management Console、[AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 或 AWS Glue API 启动 AWS Glue Spark SQL任务。该 AWS Glue Spark SQL任务处理 Amazon S3 存储桶中的原始数据，然后将处理后的数据存储在另一个存储桶中。



![AWS Glue 通过Spark SQL处理 Amazon S3 存储桶中的原始数据](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/spark-tuning-glue-emr/images/aws-glue-processing-S3-data.png)


例如，本指南描述了一个用Python和 Spark SQL (PySpark) 编写的基本[AWS GlueSpark SQL作业](https://docs.aws.amazon.com/glue/latest/dg/etl-jobs-section.html)。此 AWS Glue 作业用于演示Spark SQL调优的最佳实践。尽管本指南侧重于此 AWS Glue，但本指南中的最佳实践也适用于 [Amazon EMR 工作Spark SQL](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/jobs-spark.html)。

下图描述了Spark SQL查询的生命周期。C Spark SQL atalyst 优化器生成查询计划。*查询计划*是一系列步骤，例如指令，用于访问 SQL 关系数据库系统中的数据。要制定性能优化的Spark SQL查询计划，第一步是查看`EXPLAIN`计划，解释计划，然后调整计划。您可以使用Spark SQL用户界面 (UI) 或Spark SQL历史服务器来可视化计划。



![创建弹性分布式数据集 (RDD) 的Spark SQL查询生命周期](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/spark-tuning-glue-emr/images/spark-sql-query-lifecycle.png)


SparkCatalyst Optimizer 将初始查询计划转换为优化的查询计划，如下所示：

1. **分析和声明式 API** — 分析阶段是第一步。*未解析的逻辑计划*是使用未绑定的属性和数据类型生成的，其中 SQL 查询中引用的对象未知或与输入表不匹配。然后，Spark SQLCatalyst Optimizer 会应用一组规则来制定逻辑计划。SQL 解析器可以生成 SQL 抽象语法树 (AST)，并将其作为逻辑计划的输入提供。输入也可能是使用 API 构造的数据框或数据集对象。下表显示了何时应使用 SQL、数据框或数据集。  
****    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/spark-tuning-glue-emr/architecture.html)

   有关输入类型的更多信息，请查看以下内容：
   + 数据集 API 提供**类型化**版本。由于严重依赖用户定义的 lambda 函数，这会降低性能。RDD 或数据集是静态类型的。例如，在定义 RDD 时，需要明确提供架构定义。
   + 数据框 API 提供**非类型化**关系操作。数据框是动态键入的。与 RDD 类似，定义数据框时，架构保持不变。数据仍然是结构化的。但是，此信息仅在运行时可用。这允许编译器即时编写 SQL-like 语句和定义新列。例如，它可以在现有数据框中追加列，而无需为每个操作都定义一个新类。
   + 在运行时对Spark SQL查询进行语法和分析错误评估，从而缩短运行时间。

1. **目录**-**Spark SQL**Apache Hive Metastore (HMS)用于管理永久关系实体（例如数据库、表、列和分区）的元数据。

1. **优化**-优化****器使用启发式方法和成本重写查询计划。它会执行以下操作来生成优化的逻辑计划：

   1. 修剪列

   1. 向下推谓词

   1. 重新排序加入

1. **物理计划和计划**器 — Spark SQL Catalyst Optimizer 将逻辑计划转换为一组物理计划。这意味着它会将*内容*转换为*方式。*

1. **精选物理计划** — Spark SQL Catalyst Optimizer 选择最具成本效益的物理计划。

1. **优化的查询计划**-Spark SQL 运行性能优化和成本优化的查询计划。 Spark SQL内存管理跟踪内存使用情况，并在任务和操作员之间分配内存。Spark SQL钨引擎可以显著提高Spark SQL应用程序的内存和CPU效率。它还实现了二进制数据模型处理，并且直接对二进制数据进行操作。这就绕过了反序列化的需求，显著减少了与数据转换和反序列化相关的开销。