

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Architecture
<a name="architecture"></a>

下圖說明本指南中所述解決方案的架構。 AWS Glue 任務會從 [Amazon Simple Storage Service (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 SQLAmazon S3 儲存貯體中處理原始資料，然後將處理的資料存放在不同的儲存貯體中。



![AWS Glue 在 Amazon S3 儲存貯體中Spark SQL處理原始資料](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/spark-tuning-glue-emr/images/aws-glue-processing-S3-data.png)


舉例來說，本指南說明以 Python和 Spark SQL() 撰寫的基本[AWS GlueSpark SQL任務](https://docs.aws.amazon.com/glue/latest/dg/etl-jobs-section.html)PySpark。此 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查詢的生命週期。Spark SQL Catalyst Optimizer 會產生查詢計畫。*查詢計畫*是一系列步驟，如指示，用於存取 SQL 關聯式資料庫系統中的資料。若要開發效能最佳化Spark SQL的查詢計劃，第一步是檢視`EXPLAIN`計劃、解譯計劃，然後調校計劃。您可以使用Spark SQL使用者介面 (UI) 或Spark SQL歷史記錄伺服器來視覺化計劃。



![建立彈性分散式資料集 (RDD) 的Spark SQL查詢生命週期](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/spark-tuning-glue-emr/images/spark-sql-query-lifecycle.png)


Spark Catalyst Optimizer 會將初始查詢計畫轉換為最佳化查詢計畫，如下所示：

1. **分析和宣告式 APIs** – 分析階段是第一個步驟。*未解決的邏輯計畫*，其中 SQL 查詢中參考的物件不明或不符合輸入資料表，會產生未繫結屬性和資料類型。Spark SQL Catalyst Optimizer 接著會套用一組規則來建置邏輯計畫。SQL 剖析器可以產生 SQL 抽象語法樹 (AST)，並提供此做為邏輯計劃的輸入。輸入也可能是使用 API 建構的資料框架或資料集物件。下表顯示何時應使用 SQL、資料框架或資料集。  
****    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/spark-tuning-glue-emr/architecture.html)

   如需輸入類型的詳細資訊，請檢閱以下內容：
   + 資料集 API 提供**類型**版本。這會因為高度依賴使用者定義的 lambda 函數而降低效能。RDD 或資料集是以靜態方式輸入。例如，當您定義 RDD 時，您需要明確提供結構描述定義。
   + 資料框架 API 提供**未輸入的**關聯式操作。系統會動態輸入資料影格。與 RDD 類似，當您定義資料影格時，結構描述會保持不變。資料仍然是結構化的。不過，此資訊只能在執行時間使用。這可讓編譯器即時撰寫類似 SQL 的陳述式並定義新的資料欄。例如，它可以將資料欄附加到現有的資料框架，而不需要為每個操作定義新的類別。
   + 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 效率。它也會實作二進位資料模型處理，並直接在二進位資料上運作。這可略過還原序列化的需求，並大幅降低與資料轉換和還原序列化相關的額外負荷。