

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

# 在 AWS Glue 中使用任務
<a name="author-glue-job"></a>

以下各節提供有關 AWS Glue中 ETL 和 Ray 任務的資訊。

**Topics**
+ [AWS Glue 版本](release-notes.md)
+ [在 中使用 Spark 任務 AWS Glue](etl-jobs-section.md)
+ [在 中使用 Ray 任務 AWS Glue](ray-jobs-section.md)
+ [在 AWS Glue 中設定 Python Shell 任務的任務屬性](add-job-python.md)
+ [監控 AWS Glue](monitor-glue.md)

# AWS Glue 版本
<a name="release-notes"></a>

您可以在新增或更新任務時設定 AWS Glue 版本參數。 AWS Glue 版本會決定 AWS Glue 支援的 Apache Spark 和 Python 版本。Python 版本指示針對 Spark 類型任務支援的版本。下表列出可用的 AWS Glue 版本、對應的 Spark 和 Python 版本，以及其他功能變更。

您可以使用 [Apache Spark 的生成式 AI 升級](upgrade-analysis.md)，將 Glue ETL 任務從舊版 Glue (≥ 2.0) 升級至最新的 Glue 版本。

## AWS Glue 版本
<a name="release-notes-versions"></a>

<a name="table-glue-versions"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/release-notes.html)

**注意**  
下列 Glue 版本支援這些 PythonShell 版本：  
Glue 1.0 版支援 PythonShell 3.6 版。
Glue 3.0 版支援 PythonShell 3.9 版。
此外，僅 Glue 1.0 版和 0.9 版支援開發端點。

# AWS Glue 版本支援政策
<a name="glue-version-support-policy"></a>

AWS Glue 是無伺服器資料整合服務，可讓您輕鬆探索、準備及合併資料，以進行分析、機器學習和應用程式開發。*AWS Glue 任務*包含在 AWS Glue 中執行資料整合工作的商業邏輯。AWS Glue 中有兩種任務類型：*Spark (批次和串流)*、*Ray* 和 *Python shell*。在定義任務時，您可以指定 AWS Glue 版本，該版本會在基礎 Spark、Ray 或 Python 執行期環境中設定版本。例如：5.0 AWS Glue版 Spark 任務支援 Spark 3.5.4 和 Python 3.11。

## 支援政策
<a name="glue-version-support-policy-milestones"></a>

AWS Glue 版本是以作業系統、程式設計語言和軟體程式庫的組合為基礎建置的，這些程式庫需要維護和安全性更新。 AWS Glue的版本支援政策是在版本的任何主要元件達到社群長期支援 (LTS) 結束且不再提供安全性更新時結束對版本的支援。 AWS Glue的版本支援政策包含下列狀態：

終止**支援 (EOS) -** 當 AWS Glue 版本達到 EOS 時：
+ AWS Glue 不會再將安全修補程式或其他更新套用至 EOS 版本。
+ AWS Glue EOS 版本上的 任務不符合技術支援的資格。
+ AWS Glue 在 EOS 版本上執行任務時， 可能無法遵守 SLAs。

**生命週期結束 (EOL) -** 當 AWS Glue 版本達到 EOL 時：
+ 您無法再在 EOL 版本上建立新的 AWS Glue 任務或互動式工作階段。
+ 您無法再開始在這些 AWS Glue 版本上執行任務。
+ AWS Glue 將在 EOL 版本上停止現有的任務執行和互動式工作階段。
+ EOL 版本將從 AWS Glue SDKs和 APIs中移除。

下列 AWS Glue 版本已終止支援，在生命週期結束後將不再提供。對版本支援狀態的變更從指定日期的午夜 (太平洋時區) 開始。


| **類型** | **Glue 版本** | **終止支援** | **生命週期結束** | 
| --- | --- | --- | --- | 
| **類型** | **Python 版本** | **終止支援** | **生命週期結束** | 
| --- | --- | --- | --- | 
| **類型** | **筆記本版本** | **終止支援** | **生命週期結束** | 
| --- | --- | --- | --- | 
| Spark | Glue 0.9 版 (Spark 2.2、Scala 2、Python 2) | 6/1/2022 | 4/1/2026 | 
| Spark | Glue 1.0 版 (Spark 2.4、Python 2) | 6/1/2022 | 4/1/2026 | 
| Spark | Glue 1.0 版 (Spark 2.4、Scala 2、Python 3) | 9/30/2022 | 4/1/2026 | 
| Spark | Glue 2.0 版 (Spark 2.4、Python 3) | 1/31/2024 | 4/1/2026 | 
| Python shell | Python 2 (1.0 AWS Glue 版） | 6/1/2022 | 4/1/2026 | 
| Python shell | PythonShell 3.6 (Glue 1.0 版) | 3/31/2026 | NA | 
| 開發端點 | Zeppelin 筆記本 | 9/30/2022 | NA | 

**注意**  
 一旦在 2026 年 3 月 31 日終止支援，即不允許建立新的 AWS Glue Python Shell 3.6 任務，但您可以繼續更新並執行現有的任務。不過，在已停止的版本上執行的任務不符合技術支援的資格。 AWS Glue 不會將安全性修補程式或其他更新套用至已停止的版本。當任務在已停止的版本上執行時 AWS Glue ， 也不會遵守 SLAs。

AWS 強烈建議您將任務移轉至支援的版本中。

如需有關將 Spark 任務遷移至AWS Glue最新版本的資訊，請參閱[將AWS Glue任務遷移至 5.1 AWS Glue版。](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-51.html)

將您的 Python shell 任務移轉到最新的 AWS Glue 版本：
+ 在主控台中，選擇 `Python 3 (Glue Version 4.0)`。
+ 在 [CreateJob](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateJob.html)/[UpdateJob](https://docs.aws.amazon.com/glue/latest/webapi/API_UpdateJob.html) API 中，將 `GlueVersion` 參數設定為 `2.0`，以及將 `Command` 參數下的 `PythonVersion` 設定為 `3`。`GlueVersion` 組態不會影響 Python Shell 任務的行為，因此沒有增加 `GlueVersion` 的優勢。
+ 您需要讓自己的任務指令碼與 Python 3 相容。

# AWS Glue 將 Spark 任務遷移至 5.1 AWS Glue 版
<a name="migrating-version-51"></a>

本主題說明 0.9、1.0、2.0、3.0、4.0 和 5.0 AWS Glue 版之間的變更，以允許您將 Spark 應用程式和 ETL 任務遷移至 AWS Glue 5.1。它還描述了 AWS Glue 5.1 中的功能以及使用它的優勢。

若要將此功能與 AWS Glue ETL 任務搭配使用，請在建立任務`Glue version`時**5.1**為 選擇 。

**Topics**
+ [新功能](#migrating-version-51-features)
+ [要遷移至 AWS Glue 5.1 的動作](#migrating-version-51-actions)
+ [移轉檢查清單](#migrating-version-51-checklist)
+ [從 AWS Glue 5.0 遷移至 AWS Glue 5.1](#migrating-version-51-from-50)
+ [從較舊 AWS Glue 版本遷移至 AWS Glue 5.1](#migrating-older-versions-to-51)
+ [連接器和 JDBC 驅動程式遷移 for AWS Glue 5.1](#migrating-version-51-connector-driver-migration)

## 新功能
<a name="migrating-version-51-features"></a>

本節說明 5.1 AWS Glue 版的新功能和優點。
+ Apache Spark 從 3.5.4 in AWS Glue 5.0 更新至 3.5.6 in AWS Glue 5.1。
+ 開放資料表格式 (OTF) 已更新為 Hudi 1.0.2、Iceberg 1.10.0 和 Delta Lake 3.3.2
+ **Iceberg 具體化視**觀表 - 建立和管理 Iceberg 具體化視觀表 (MV)。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/introducing-apache-iceberg-materialized-views-in-aws-glue-data-catalog/) 
+ **Iceberg 格式 3.0 版** - 擴展資料類型和現有中繼資料結構，以新增新功能。如需詳細資訊，請參閱 [Iceberg 資料表規格](https://iceberg.apache.org/spec/)。
+ **Hudi 完整資料表存取** - 根據您在 中定義的政策，Apache Spark 中 Apache Hudi 的完整資料表存取 (FTA) 控制 AWS Lake Formation。當任務角色具有完整的資料表存取權時，此功能可在 AWS Lake Formation 已註冊的資料表上啟用來自 AWS Glue ETL 任務的讀取和寫入操作。
+ **Spark 原生精細存取控制 (FGAC) 支援使用 AWS Lake Formation** - DDL/DML 操作 （例如 CREATE、ALTER、DELETE、DROP) 搭配已註冊 Apache Hive、Apache Iceberg 和 Delta Lake 資料表的精細存取控制 AWS Lake Formation。
+ **Spark 任務的稽核內容** - AWS CloudTrail 日誌中的 AWS Glue ETL 任務的稽核內容可供 AWS Glue 和 AWS Lake Formation API 呼叫使用。

**已知問題和限制**  
請注意下列已知問題和限制：
+ 檢視 SQL 子句的有限支援，用於建立具體化檢視、查詢重寫和增量重新整理。如需更多詳細資訊，請參閱 [Iceberg 具體化檢視功能文件頁面](https://docs.aws.amazon.com/lake-formation/latest/dg/materialized-views.html#materialized-views-considerations-limitations) 
+ **Hudi FTA 寫入**要求在任務執行期間使用 HoodieCredentialedHadoopStorage 進行登入資料販賣。在執行 Hudi 任務時設定下列組態：

  `hoodie.storage.class=org.apache.spark.sql.hudi.storage.HoodieCredentialedHadoopStorage` 
+ Hudi FTA 寫入支援僅適用於預設 Hudi 組態。自訂或非預設 Hudi 設定可能未完全支援，並可能導致非預期的行為。FTA 寫入模式也不支援 Hudi Merge-On-Read (MOR) 資料表的叢集。

**突破性變更**  
請注意下列變更：
+  S3A 檔案系統已將 EMRFS 取代為預設 S3 連接器。如需如何遷移的資訊，請參閱 [從 AWS Glue 5.0 遷移至 AWS Glue 5.1](#migrating-version-51-from-50)。

## 要遷移至 AWS Glue 5.1 的動作
<a name="migrating-version-51-actions"></a>

對於現有的任務，請將舊版 `Glue version` 變更為任務組態中的 `Glue 5.1`。
+ 在 AWS Glue Studio `Glue 5.1 - Supports Spark 3.5.6, Scala 2, Python 3`中，選擇 `Glue version`。
+ 在 API 中，選擇 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-UpdateJob](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-UpdateJob) API 操作 `GlueVersion` 參數中的 **5.1**。

對於新任務，當您建立任務時請選擇 `Glue 5.1`。
+ 在主控台中，在 `Glue version` 中選擇 `Spark 3.5.6, Python 3 (Glue Version 5.1) or Spark 3.5.6, Scala 2 (Glue Version 5.1)`。
+ 在 AWS Glue Studio `Glue 5.1 - Supports Spark 3.5.6, Scala 2, Python 3`中，選擇 `Glue version`。
+ 在 API 中，選擇 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob) API 操作 `GlueVersion` 參數中的 **5.1**。

若要檢視來自 AWS Glue 2.0 或更早版本的 AWS Glue 5.1 Spark 事件日誌，[請使用 CloudFormation 或 Docker 啟動升級的 Spark 歷史記錄伺服器 for AWS Glue 5.1。](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-history.html)

## 移轉檢查清單
<a name="migrating-version-51-checklist"></a>

檢閱此檢查清單以進行移轉：
+ 【Python】 將 boto 參考從 1.34 更新為 1.40。

## 從 AWS Glue 5.0 遷移至 AWS Glue 5.1
<a name="migrating-version-51-from-50"></a>

 AWS Glue 5.0 中存在的所有現有任務參數和主要功能都將存在於 AWS Glue 5.1 中。移轉時請注意下列變更：
+ 在 AWS Glue 5.1 中，S3A 檔案系統已取代 EMRFS 做為預設 S3 連接器。如果`spark.hadoop.fs.s3a.endpoint.region`未設定 `spark.hadoop.fs.s3a.endpoint`和 ，則 S3A 使用的預設區域為 `us-east-2`。這可能會導致問題，例如 S3 上傳逾時錯誤，尤其是 VPC 任務。若要緩解此變更造成的問題，請在 AWS Glue 5.1 中使用 S3A 檔案系統時設定 `spark.hadoop.fs.s3a.endpoint.region` Spark 組態。
+ 若要繼續使用 EMRFS 而非 S3A，請設定下列 Spark 組態：

  ```
      --conf spark.hadoop.fs.s3.impl=com.amazon.ws.emr.hadoop.fs.EmrFileSystem
      --conf spark.hadoop.fs.s3n.impl=com.amazon.ws.emr.hadoop.fs.EmrFileSystem
      --conf spark.hadoop.fs.AbstractFileSystem.s3.impl=org.apache.hadoop.fs.s3.EMRFSDelegate
  ```

請參閱 Spark 移轉文件：
+ [移轉指南：Spark Core](https://spark.apache.org/docs/3.5.6/core-migration-guide.html)
+ [移轉指南：SQL、資料集和 DataFrame](https://spark.apache.org/docs/3.5.6/sql-migration-guide.html)
+ [移轉指南：結構化串流](https://spark.apache.org/docs/3.5.6/ss-migration-guide.html)
+ [升級 PySpark](https://spark.apache.org/docs/3.5.6/api/python/migration_guide/pyspark_upgrade.html)

## 從較舊 AWS Glue 版本遷移至 AWS Glue 5.1
<a name="migrating-older-versions-to-51"></a>
+ 如需與 AWS Glue 4.0 到 AWS Glue 5.0 相關的遷移步驟，請參閱[從 AWS Glue 4.0 遷移到 AWS Glue 5.0。](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-50.html#migrating-version-50-from-40)
+ 如需與 AWS Glue 3.0 至 AWS Glue 5.0 相關的遷移步驟，請參閱[從 AWS Glue 3.0 遷移至 AWS Glue 5.0。](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-50.html#migrating-version-50-from-30)
+ 如需與 AWS Glue 2.0 到 AWS Glue 5.0 相關的遷移步驟，以及 2.0 和 4.0 AWS Glue 版之間的遷移差異清單，請參閱[從 AWS Glue 2.0 遷移到 AWS Glue 5.0。](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-50.html#migrating-version-50-from-20)

## 連接器和 JDBC 驅動程式遷移 for AWS Glue 5.1
<a name="migrating-version-51-connector-driver-migration"></a>

如需已升級的 JDBC 和資料湖連接器版本，請參閱：
+ [附錄 B：JDBC 驅動程式升級](#migrating-version-51-appendix-jdbc-driver)
+ [附錄 C：連接器升級](#migrating-version-51-appendix-connector)
+ [附錄 D：開放式資料表格式升級](#migrating-version-51-appendix-open-table-formats)

下列變更適用於 for AWS Glue 5[附錄 D：開放式資料表格式升級](#migrating-version-51-appendix-open-table-formats).1 中識別的 OTF 版本升級。

**Apache Hudi**  
請注意下列變更：
+ 支援 Lake Formation 註冊資料表上的 FTA 讀取和寫入存取。

**Apache Iceberg**  
請注意下列變更：
+ 支援 Iceberg 格式第 3 版。支援下列功能：
  + 用於分割和排序的多引數轉換。
  + 資料列譜系追蹤。
  + 刪除向量。在[部落格文章](https://aws.amazon.com/blogs/big-data/unlock-the-power-of-apache-iceberg-v3-deletion-vectors-on-amazon-emr/)中進一步了解 
  + 資料表加密金鑰。
  + 資料欄的預設值支援。
+ 支援 AWS Lake Formation 已註冊資料表上的 Spark 原生 FGAC 寫入。
+ Athena SQL 相容性 - 由於錯誤，無法讀取 EMR Spark 建立的 Iceberg V3 資料表： `GENERIC_INTERNAL_ERROR: Cannot read unsupported version 3`

**Delta Lake**  
請注意下列變更：
+ 支援 Lake Formation 註冊資料表上的 FTA 讀取和寫入存取。

### 附錄 A：值得注意的相依性升級
<a name="migrating-version-51-appendix-dependencies"></a>

以下是相依性升級：


| 相依性 | in AWS Glue 5.1 版本 | in AWS Glue 5.0 版本 | in AWS Glue 4.0 版本 | in AWS Glue 3.0 版 | in AWS Glue 2.0 版本 |  AWS Glue 1.0 版 | 
| --- | --- | --- | --- | --- | --- | --- | 
| Java | 17 | 17 | 8 | 8 | 8 | 8 | 
| Spark | 3.5.6 | 3.5.4 | 3.3.0-amzn-1 | 3.1.1-amzn-0 | 2.4.3 | 2.4.3 | 
| Hadoop | 3.4.1 | 3.4.1 | 3.3.3-amzn-0 | 3.2.1-amzn-3 | 2.8.5-amzn-5 | 2.8.5-amzn-1 | 
| Scala | 2.12.18 | 2.12.18 | 2.12 | 2.12 | 2.11 | 2.11 | 
| Jackson | 2.15.2 | 2.15.2 | 2.12 | 2.12 | 2.11 | 2.11 | 
| Hive | 2.3.9-amzn-4 | 2.3.9-amzn-4 | 2.3.9-amzn-2 | 2.3.7-amzn-4 | 1.2 | 1.2 | 
| EMRFS | 2.73.0 | 2.69.0 | 2.54.0 | 2.46.0 | 2.38.0 | 2.30.0 | 
| Json4s | 3.7.0-M11 | 3.7.0-M11 | 3.7.0-M11 | 3.6.6 | 3.5.x | 3.5.x | 
| Arrow | 12.0.1 | 12.0.1 | 7.0.0 | 2.0.0 | 0.10.0 | 0.10.0 | 
| AWS Glue Data Catalog 用戶端 | 4.9.0 | 4.5.0 | 3.7.0 | 3.0.0 | 1.10.0 | N/A | 
| AWS 適用於 Java 的 SDK | 2.35.5 | 2.29.52 | 1.12 | 1.12 |  |  | 
| Python | 3.11 | 3.11 | 3.10 | 3.7 | 2.7 和 3.6 | 2.7 和 3.6 | 
| Boto | 1.40.61 | 1.34.131 | 1.26 | 1.18 | 1.12 | N/A | 
| EMR DynamoDB 連接器 | 5.7.0 | 5.6.0 | 4.16.0 |  |  |  | 

### 附錄 B：JDBC 驅動程式升級
<a name="migrating-version-51-appendix-jdbc-driver"></a>

以下是 JDBC 驅動程式升級：


| 驅動程式 | JDBC 驅動程式 AWS Glue 5.1 版 | JDBC 驅動程式 AWS Glue 5.0 版 |  AWS Glue 4.0 中的 JDBC 驅動程式版本 | JDBC 驅動程式 in AWS Glue 3.0 版 | 過去版本的 JDBC 驅動程式 AWS Glue 版本 | 
| --- | --- | --- | --- | --- | --- | 
| MySQL | 8.0.33 | 8.0.33 | 8.0.23 | 8.0.23 | 5.1 | 
| Microsoft SQL Server | 10.2.0 | 10.2.0 | 9.4.0 | 7.0.0 | 6.1.0 | 
| Oracle 資料庫 | 23.3.0.23.09 | 23.3.0.23.09 | 21.7 | 21.1 | 11.2 | 
| PostgreSQL | 42.7.3 | 42.7.3 | 42.3.6 | 42.2.18 | 42.1.0 | 
| Amazon Redshift |  redshift-jdbc42-2.1.0.29  |  redshift-jdbc42-2.1.0.29  |  redshift-jdbc42-2.1.0.16  |  redshift-jdbc41-1.2.12.1017   |  redshift-jdbc41-1.2.12.1017   | 
| SAP Hana | 2.20.17 | 2.20.17 | 2.17.12 |  |  | 
| Teradata | 20.00.00.33 | 20.00.00.33 | 20.00.00.06 |  |  | 

### 附錄 C：連接器升級
<a name="migrating-version-51-appendix-connector"></a>

以下是連接器升級：


| 驅動程式 | 連接器 in AWS Glue 5.1 版 |  AWS Glue 5.0 中的連接器版本 |  AWS Glue 4.0 中的連接器版本 | 連接器 in AWS Glue 3.0 版 | 
| --- | --- | --- | --- | --- | 
| EMR DynamoDB 連接器 | 5.7.0 | 5.6.0 | 4.16.0 |  | 
| Amazon Redshift | 6.4.2 | 6.4.0 | 6.1.3 |  | 
| OpenSearch | 1.2.0 | 1.2.0 | 1.0.1 |  | 
| MongoDB | 10.3.0 | 10.3.0 | 10.0.4 | 3.0.0 | 
| Snowflake | 3.1.1 | 3.0.0 | 2.12.0 |  | 
| Google BigQuery | 0.32.2 | 0.32.2 | 0.32.2 |  | 
| AzureCosmos | 4.33.0 | 4.33.0 | 4.22.0 |  | 
| AzureSQL | 1.3.0 | 1.3.0 | 1.3.0 |  | 
| Vertica | 3.3.5 | 3.3.5 | 3.3.5 |  | 

### 附錄 D：開放式資料表格式升級
<a name="migrating-version-51-appendix-open-table-formats"></a>

以下是開放式資料表格式升級：


| OTF | 連接器 in AWS Glue 5.1 版 |  AWS Glue 5.0 中的連接器版本 |  AWS Glue 4.0 中的連接器版本 | 連接器 in AWS Glue 3.0 版 | 
| --- | --- | --- | --- | --- | 
| Hudi | 1.0.2 | 0.15.0 | 0.12.1 | 0.10.1 | 
| Delta Lake | 3.3.2 | 3.3.0 | 2.1.0 | 1.0.0 | 
| Iceberg | 1.10.0 | 1.7.1 | 1.0.0 | 0.13.1 | 

# AWS Glue 將 Spark 任務遷移至 5.0 AWS Glue 版
<a name="migrating-version-50"></a>

本主題說明 0.9、1.0、2.0、3.0 和 4.0 AWS Glue 版之間的變更，以允許您將 Spark 應用程式和 ETL 任務遷移至 AWS Glue 5.0。它還描述了 AWS Glue 5.0 中的功能以及使用它的優勢。

若要將此功能與 AWS Glue ETL 任務搭配使用，請在建立任務`Glue version`時**5.0**為 選擇 。

**Topics**
+ [新功能](#migrating-version-50-features)
+ [要遷移至 AWS Glue 5.0 的動作](#migrating-version-50-actions)
+ [移轉檢查清單](#migrating-version-50-checklist)
+ [AWS Glue 5.0 功能](#migrating-version-50-features)
+ [從 AWS Glue 4.0 遷移至 AWS Glue 5.0](#migrating-version-50-from-40)
+ [從 AWS Glue 3.0 遷移至 AWS Glue 5.0](#migrating-version-50-from-30)
+ [從 AWS Glue 2.0 遷移至 AWS Glue 5.0](#migrating-version-50-from-20)
+ [AWS Glue 5.0 中的記錄行為變更](#enable-continous-logging-changes-glue-50)
+ [連接器和 JDBC 驅動程式遷移 for AWS Glue 5.0](#migrating-version-50-connector-driver-migration)

## 新功能
<a name="migrating-version-50-features"></a>

本節說明 5.0 AWS Glue 版的新功能和優點。
+ Apache Spark 從 3.3.0 in AWS Glue 4.0 更新至 3.5.4 in AWS Glue 5.0。請參閱 [從 Spark 3.3.0 到 Spark 3.5.4 的主要增強功能](#migrating-version-50-features-spark)。
+ 使用 Lake Formation 的 Spark 原生精細存取控制 (FGAC)。這包括適用於 Iceberg、Delta 和 Hudi 資料表的 FGAC。如需詳細資訊，請參閱[使用 AWS Glue 搭配 AWS Lake Formation 進行精細存取控制](https://docs.aws.amazon.com/glue/latest/dg/security-lf-enable.html)。

  請注意 Spark 原生 FGAC 的下列考量或限制：
  + 目前不支援資料寫入
  + 透過 `GlueContext` 使用 Lake Formation 寫入到 Iceberg 需要改用 IAM 存取控制

  如需使用 Spark 原生 FGAC 時的限制和考量完整清單，請參閱[考量和限制](security-lf-enable-considerations.md)。
+ 支援 Amazon S3 Access Grants 做為 Amazon S3 資料的可擴展存取控制解決方案 AWS Glue。如需詳細資訊，請參閱[搭配 使用 Amazon S3 Access Grants AWS Glue](security-s3-access-grants.md)。
+ 開放式資料表格式 (OTF) 已更新為 Hudi 0.15.0、Iceberg 1.7.1 和 Delta Lake 3.3.0
+ Amazon SageMaker Unified Studio 支援。
+ Amazon SageMaker 資料湖倉和資料抽象整合。如需詳細資訊，請參閱[從 AWS Glue ETL 查詢中繼存放區資料目錄](#migrating-version-50-features-metastore)。
+ 支援使用 `requirements.txt` 安裝其他 Python 程式庫。如需詳細資訊，請參閱[使用 requirements.txt AWS 在 Glue 5.0 或更高版本中安裝其他 Python 程式庫](aws-glue-programming-python-libraries.md#addl-python-modules-requirements-txt)。
+ AWS Glue 5.0 支援 Amazon DataZone 中的資料歷程。您可以設定 AWS Glue 在 Spark 任務執行期間自動收集歷程資訊，並傳送要在 Amazon DataZone 中視覺化的歷程事件。如需詳細資訊，請參閱 [Amazon DataZone 中的資料沿襲](https://docs.aws.amazon.com/datazone/latest/userguide/datazone-data-lineage.html)。

  若要在 AWS Glue 主控台上設定，請開啟**產生歷程事件**，然後在**任務詳細資訊**索引標籤上輸入您的 Amazon DataZone 網域 ID。  
![\[螢幕擷取畫面顯示開啟 的 Amazon DataZone 日期歷程 AWS Glue。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/glue-50-data-lineage.png)

  或者，可以提供下列任務參數 (提供 DataZone 網域 ID)：
  + 索引鍵：`--conf`
  + 值：

    ```
    extraListeners=io.openlineage.spark.agent.OpenLineageSparkListener
    —conf spark.openlineage.transport.type=amazon_datazone_api
    -conf spark.openlineage.transport.domainId=<your-domain-ID>
    ```
+ 連接器和 JDBC 驅動器更新。如需詳細資訊，請參閱[附錄 B：JDBC 驅動程式升級](#migrating-version-50-appendix-jdbc-driver)及[附錄 C：連接器升級](#migrating-version-50-appendix-connector)。
+ Java 從 8 更新至 17。
+ 將磁碟空間增加到 94GB 和 138GB 的 AWS Glue `G.1X` 和 `G.2X`工作者的儲存空間增加。此外，新的工作者類型 `G.12X`、 `G.16X`和記憶體最佳化 `R.1X`、`R.2X`、`R.4X`、 `R.8X` 提供 AWS Glue 4.0 和更新版本。如需詳細資訊，請參閱[任務](aws-glue-api-jobs-job.md) 
+ 如果任務**支援 v2，則支援適用於 Java 的 AWS SDK 第** 2 - AWS Glue 5.0 版任務可以使用適用於 Java 的 [1.12.569](https://github.com/aws/aws-sdk-java/tree/1.12.569) 或 [2.28.8 版。](https://github.com/aws/aws-sdk-java-v2/tree/2.28.8)適用於 Java 的 AWS SDK 2.x 是 1.x 版程式碼庫的主要重寫。它建置在 Java 8\$1 上，並新增了數個經常請求的功能。這些包括支援非封鎖 I/O 以及能夠在執行期外掛不同的 HTTP 實作。如需詳細資訊，包括從 SDK for Java v1 到 v2 的移轉指南，請參閱 [AWS SDK for Java 第 2 版](https://docs.aws.amazon.com/sdk-for-java)指南。

**突破性變更**  
請注意下列變更：
+  在 AWS Glue 5.0 中，使用 S3A 檔案系統時，如果未設定 `fs.s3a.endpoint` 和 `fs.s3a.endpoint.region`，則 S3A 使用的預設區域為 `us-east-2`。這可能會導致問題，例如 S3 上傳逾時錯誤，尤其是 VPC 任務。若要緩解此變更造成的問題，請在 AWS Glue 5.0 中使用 S3A 檔案系統時，設定 `fs.s3a.endpoint.region` Spark 組態。
+ Lake Formation 精細存取控制 (FGAC)
  + AWS Glue 5.0 僅支援使用 Spark DataFrames 的新 Spark 原生 FGAC。它不支援 FGAC using AWS Glue DynamicFrames。
    + 在 5.0 中使用 FGAC 需要從 AWS Glue DynamicFrames 遷移至 Spark DataFrames
    + 如果您不需要 FGAC，則不需要移轉至 Spark DataFrame 和 GlueContext 功能，例如任務書籤和下推述詞將繼續運作。
  + 使用 Spark 原生 FGAC 的任務需要至少 4 個工作者：一個使用者驅動程式、一個系統驅動程式、一個系統執行器和一個待命使用者執行器。
  + 如需詳細資訊，請參閱[使用 AWS Glue 搭配 AWS Lake Formation 進行精細存取控制](https://docs.aws.amazon.com/glue/latest/dg/security-lf-enable.html)。
+ Lake Formation 完整資料表存取 (FTA)
  + AWS Glue 5.0 支援 FTA 搭配 Spark 原生 DataFrames （新） 和 GlueContext DynamicFrames （舊版，有限制）
  + Spark 原生 FTA
    + 如果 4.0 指令碼使用 GlueContext，請移轉為使用原生 Spark。
    + 此功能僅限於 hive 和 iceberg 資料表
    + 如需有關設定 5.0 任務以使用 Spark 原生 FTA 的詳細資訊，請參閱 
  + GlueContext DynamicFrame FTA
    + 不需要變更程式碼
    + 此功能僅限於非 OTF 資料表，不適用於 Iceberg、Delta Lake 和 Hudi。
+ 不支援[向量化 SIMD CSV 讀取器](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format-csv-home.html#aws-glue-programming-etl-format-simd-csv-reader)。
+ 不支援[持續記錄](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuous-logging-enable.html)至輸出日誌群組。請改用 `error` 日誌群組。
+  AWS Glue 任務執行洞見`job-insights-rule-driver`已棄用。`job-insights-rca-driver` 日誌串流現在位於錯誤日誌群組中。
+ 不支援基於 Athena 的自訂/市場連接器。
+ 不支援 Adobe Marketo Engage、Facebook Ads、Google Ads、Google Analytics 4、Google Sheets、Hubspot、Instagram Ads、Intercom、Jira Cloud、Oracle NetSuite、Salesforce、Salesforce Marketing Cloud、Salesforce Marketing Cloud Account Engagement、SAP OData、ServiceNow、Slack、Snapchat Ads、S Stripe、Zendesk 和 Zoho CRM 連接器。
+  AWS Glue 5.0 不支援自訂 log4j 屬性。

### 從 Spark 3.3.0 到 Spark 3.5.4 的主要增強功能
<a name="migrating-version-50-features-spark"></a>

請注意下列增強功能：
+ 適用於 Spark Connect 的 Python 用戶端 ([SPARK-39375](https://issues.apache.org/jira/browse/SPARK-39375))。
+ 實作對資料表中資料欄 DEFAULT 值的支援 ([SPARK-38334](https://issues.apache.org/jira/browse/SPARK-38334))。
+ 支援「橫向資料欄別名參考」([SPARK-27561](https://issues.apache.org/jira/browse/SPARK-27561))。
+ 強化錯誤類別的 SQLSTATE 使用 ([SPARK-41994](https://issues.apache.org/jira/browse/SPARK-41994))。
+ 預設啟用 Bloom Filter Joins ([SPARK-38841](https://issues.apache.org/jira/browse/SPARK-38841))。
+ Spark UI 可擴展性和驅動程式穩定性更佳，適用於大型應用程式 ([SPARK-41053](https://issues.apache.org/jira/browse/SPARK-41053))。
+ 結構化串流中的非同步進度追蹤 ([SPARK-39591](https://issues.apache.org/jira/browse/SPARK-39591))。
+ 結構化串流中的 Python 任意狀態處理 ([SPARK-40434](https://issues.apache.org/jira/browse/SPARK-40434))。
+ Pandas API 覆蓋率改進 ([SPARK-42882](https://issues.apache.org/jira/browse/SPARK-42882)) 和 PySpark 中的 NumPy 輸入支援 ([SPARK-39405](https://issues.apache.org/jira/browse/SPARK-39405))。
+ 為 PySpark 使用者定義的函數提供記憶體分析工具 ([SPARK-40281](https://issues.apache.org/jira/browse/SPARK-40281))。
+ 實作 PyTorch Distributor ([SPARK-41589](https://issues.apache.org/jira/browse/SPARK-41589))。
+ 發布 SBOM 成品 ([SPARK-41893](https://issues.apache.org/jira/browse/SPARK-41893))。
+ 僅支援 IPv6 環境 ([SPARK-39457](https://issues.apache.org/jira/browse/SPARK-39457))。
+ 自訂的 K8s 排程器 (Apache YuniKorn 和 Volcano) GA ([SPARK-42802](https://issues.apache.org/jira/browse/SPARK-42802))。
+ Spark Connect ([SPARK-42554](https://issues.apache.org/jira/browse/SPARK-42554)) 和 ([SPARK-43351](https://issues.apache.org/jira/browse/SPARK-43351)) 中的 Scala 和 Go 用戶端支援。
+ 適用於 Spark Connect 的基於 PyTorch 的分佈式 ML 支援 ([SPARK-42471](https://issues.apache.org/jira/browse/SPARK-42471))。
+ Python 和 Scala ([SPARK-42938](https://issues.apache.org/jira/browse/SPARK-42938)) 中 Spark Connect 的結構化串流支援。
+ Python Spark Connect 用戶端 ([SPARK-42497](https://issues.apache.org/jira/browse/SPARK-42497)) 的 Pandas API 支援。
+ 介紹 Arrow Python UDF ([SPARK-40307](https://issues.apache.org/jira/browse/SPARK-40307))。
+ 支援 Python 使用者定義的資料表函數 ([SPARK-43798](https://issues.apache.org/jira/browse/SPARK-43798))。
+ 將 PySpark 錯誤移轉至錯誤類別 ([SPARK-42986](https://issues.apache.org/jira/browse/SPARK-42986))。
+ PySpark 測試架構 ([SPARK-44042](https://issues.apache.org/jira/browse/SPARK-44042))。
+ 新增對 Datasketches HllSketch ([SPARK-16484](https://issues.apache.org/jira/browse/SPARK-16484)) 的支援。
+ 內建 SQL 函數改進 ([SPARK-41231](https://issues.apache.org/jira/browse/SPARK-41231))。
+ IDENTIFIER 子句 ([SPARK-43205](https://issues.apache.org/jira/browse/SPARK-43205))。
+ 將 SQL 函數新增至 Scala、Python 和 R API ([SPARK-43907](https://issues.apache.org/jira/browse/SPARK-43907))。
+ 新增 SQL 函數的具名引數支援 ([SPARK-43922](https://issues.apache.org/jira/browse/SPARK-43922))。
+ 如果隨機資料已移轉，避免在停用的執行器上重新執行不必要的任務 ([SPARK-41469](https://issues.apache.org/jira/browse/SPARK-41469))。
+ 分散式 ML <> spark connect ([SPARK-42471](https://issues.apache.org/jira/browse/SPARK-42471))。
+ DeepSpeed 分配器 ([SPARK-44264](https://issues.apache.org/jira/browse/SPARK-44264))。
+ 實作 RocksDB 狀態存放區的變更日誌檢查點 ([SPARK-43421](https://issues.apache.org/jira/browse/SPARK-43421))。
+ 引入運算子之間的浮水印傳播 ([SPARK-42376](https://issues.apache.org/jira/browse/SPARK-42376))。
+ 介紹 dropDuplicatesWithinWatermark ([SPARK-42931](https://issues.apache.org/jira/browse/SPARK-42931))。
+ RocksDB 狀態存放區提供器記憶體管理增強功能 ([SPARK-43311](https://issues.apache.org/jira/browse/SPARK-43311))。

## 要遷移至 AWS Glue 5.0 的動作
<a name="migrating-version-50-actions"></a>

對於現有的任務，請將舊版 `Glue version` 變更為任務組態中的 `Glue 5.0`。
+ 在 AWS Glue Studio `Glue 5.0 - Supports Spark 3.5.4, Scala 2, Python 3`中，選擇 `Glue version`。
+ 在 API 中，選擇 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-UpdateJob](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-UpdateJob) API 操作 `GlueVersion` 參數中的 **5.0**。

對於新任務，當您建立任務時請選擇 `Glue 5.0`。
+ 在主控台中，在 `Glue version` 中選擇 `Spark 3.5.4, Python 3 (Glue Version 5.0) or Spark 3.5.4, Scala 2 (Glue Version 5.0)`。
+ 在 AWS Glue Studio `Glue 5.0 - Supports Spark 3.5.4, Scala 2, Python 3`中，選擇 `Glue version`。
+ 在 API 中，選擇 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob) API 操作 `GlueVersion` 參數中的 **5.0**。

若要檢視來自 AWS Glue 2.0 或更早版本的 AWS Glue 5.0 Spark 事件日誌，[請使用 CloudFormation 或 Docker 啟動升級的 Spark 歷史記錄伺服器 for AWS Glue 5.0。](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-history.html)

## 移轉檢查清單
<a name="migrating-version-50-checklist"></a>

檢閱此檢查清單以進行移轉：
+ Java 17 更新
+ 【Scala】 將 AWS SDK 呼叫從 v1 升級至 v2
+ Python 3.10 移轉到 3.11
+ [Python] 將 boto 參考從 1.26 更新至 1.34

## AWS Glue 5.0 功能
<a name="migrating-version-50-features"></a>

本節詳細說明 AWS Glue 功能。

### 從 AWS Glue ETL 查詢中繼存放區資料目錄
<a name="migrating-version-50-features-metastore"></a>

您可以註冊您的 AWS Glue 任務來存取 AWS Glue Data Catalog，讓資料表和其他中繼存放區資源可用於分散取用者。Data Catalog 支援多目錄階層，其可跨 Amazon S3 資料湖統一所有資料。其還提供 Hive 中繼存放區 API 和開放原始碼 Apache Iceberg API 來存取資料。這些功能可供 AWS Glue 和其他資料導向服務使用，例如 Amazon EMR、Amazon Athena 和 Amazon Redshift。

當您在 Data Catalog 中建立資源時，您可以從支援 Apache Iceberg REST API. AWS Lake Formation manages 許可的任何 SQL 引擎存取資源。在組態之後，您可以使用熟悉的應用程式查詢這些中繼存放區資源，利用 AWS Glue的功能來查詢不同的資料。包括 Apache Spark 和 Trino。

#### 中繼資料資源的組織方式
<a name="migrating-version-50-features-metastore-organized"></a>

使用 將資料組織在目錄、資料庫和資料表的邏輯階層中 AWS Glue Data Catalog：
+ 目錄 – 包含資料存放區物件的邏輯容器，例如結構描述或資料表。
+ 資料庫 – 在目錄中組織諸如資料表和檢視等資料物件。
+ 資料表和檢視 – 資料庫中的資料物件，提供具有可理解結構描述的抽象層。其可讓您輕鬆存取各種格式和各種位置的基礎資料。

## 從 AWS Glue 4.0 遷移至 AWS Glue 5.0
<a name="migrating-version-50-from-40"></a>

 AWS Glue 4.0 中存在的所有現有任務參數和主要功能都將存在於 AWS Glue 5.0 中，但機器學習轉換除外。

已新增下列新參數：
+ `--enable-lakeformation-fine-grained-access`：在 AWS Lake Formation 資料表中啟用精細存取控制 (FGAC) 功能。

請參閱 Spark 移轉文件：
+ [移轉指南：Spark Core](https://spark.apache.org/docs/3.5.6/core-migration-guide.html)
+ [移轉指南：SQL、資料集和 DataFrame](https://spark.apache.org/docs/3.5.6/sql-migration-guide.html)
+ [移轉指南：結構化串流](https://spark.apache.org/docs/3.5.6/ss-migration-guide.html)
+ [升級 PySpark](https://spark.apache.org/docs/3.5.6/api/python/migration_guide/pyspark_upgrade.html)

## 從 AWS Glue 3.0 遷移至 AWS Glue 5.0
<a name="migrating-version-50-from-30"></a>

**注意**  
如需與 AWS Glue 4.0 相關的遷移步驟，請參閱 [從 AWS Glue 3.0 遷移至 AWS Glue 4.0](migrating-version-40.md#migrating-version-40-from-30)。

 AWS Glue 3.0 中存在的所有現有任務參數和主要功能都將存在於 AWS Glue 5.0 中，但機器學習轉換除外。

## 從 AWS Glue 2.0 遷移至 AWS Glue 5.0
<a name="migrating-version-50-from-20"></a>

**注意**  
如需與 AWS Glue 4.0 相關的遷移步驟，以及 3.0 和 4.0 AWS Glue 版之間的遷移差異清單，請參閱 [從 AWS Glue 3.0 遷移至 AWS Glue 4.0](migrating-version-40.md#migrating-version-40-from-30)。

另請注意 3.0 和 2.0 AWS Glue 版之間的下列遷移差異：
+  AWS Glue 2.0 中存在的所有現有任務參數和主要功能都將存在於 AWS Glue 5.0 中，但機器學習轉換除外。
+ 單獨的數個 Spark 變更可能需要修改指令碼，以確保沒有被引用刪除的功能。例如，Spark 3.1.1 和更新版本不會啟用 Scala 無類型的 UDF，但 Spark 2.4 確實允許。
+ 不支援 Python 2.7。
+ 在現有 AWS Glue 2.0 任務中提供的任何額外 jar 都可能會導致相互衝突的相依性，因為在數個相依性中有升級。可以避免 `--user-jars-first` 任務參數的 classpath 衝突。
+ parquet 檔案的載入/儲存時間戳記的行為變更。有關更多詳細資訊，請參閱從 Spark SQL 3.0 升級到 3.1。
+ 驅動器/執行器組態的不同 Spark 任務平行處理。可以透過傳遞 `--executor-cores` 任務引數來調整任務平行處理。

## AWS Glue 5.0 中的記錄行為變更
<a name="enable-continous-logging-changes-glue-50"></a>

 以下是 AWS Glue 5.0 中記錄行為的變更。如需詳細資訊，請參閱[記錄 AWS Glue 任務](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuous-logging.html)。
+  所有日誌 (系統日誌、Spark 常駐程式日誌、使用者日誌和 Glue Logger 日誌) 現在預設都會寫入到 `/aws-glue/jobs/error` 日誌群組。
+  不再使用先前版本中用於持續記錄的 `/aws-glue/jobs/logs-v2` 日誌群組。
+  無法再使用已移除的持續記錄引數來重新命名或自訂日誌群組或日誌串流名稱。反之，請參閱 AWS Glue 5.0 中的新任務引數。

### AWS Glue 5.0 中引入了兩個新的任務引數
<a name="enable-continous-logging-new-arguments-glue-50"></a>
+  `––custom-logGroup-prefix`：可讓您指定 `/aws-glue/jobs/error` 和 `/aws-glue/jobs/output` 日誌群組的自訂字首。
+  `––custom-logStream-prefix`：可讓您為日誌群組中的日誌串流名稱指定自訂字首。

   自訂字首的驗證規則和限制包括：
  +  整個日誌串流名稱的長度必須介於 1 到 512 個字元之間。
  +  日誌串流名稱的自訂字首限制為 400 個字元。
  +  字首中允許的字元包括字母數字字元、底線 (`\$1`)、連字號 (`-`) 和斜線 (`/`)。

### AWS Glue 5.0 中的已棄用連續記錄引數
<a name="enabling-continuous-logging-deprecated-arguments"></a>

 下列用於連續記錄的任務引數已在 AWS Glue 5.0 中棄用 
+  `––enable-continuous-cloudwatch-log` 
+  `––continuous-log-logGroup` 
+  `––continuous-log-logStreamPrefix` 
+  `––continuous-log-conversionPattern` 
+  `––enable-continuous-log-filter` 

## 連接器和 JDBC 驅動程式遷移 for AWS Glue 5.0
<a name="migrating-version-50-connector-driver-migration"></a>

如需已升級的 JDBC 和資料湖連接器版本，請參閱：
+ [附錄 B：JDBC 驅動程式升級](#migrating-version-50-appendix-jdbc-driver)
+ [附錄 C：連接器升級](#migrating-version-50-appendix-connector)
+ [附錄 D：開放式資料表格式升級](#migrating-version-50-appendix-open-table-formats)

下列變更適用於 Glue 5.0 附錄中識別的連接器或驅動器版本。

**Amazon Redshift**  
請注意下列變更：
+ 新增支援三部分資料表名稱，以允許連接器查詢 Redshift 資料共用資料表。
+ 更正 Spark `ShortType` 的映射，使用 Redshift `SMALLINT` 而非 `INTEGER`，以更好地比對預期的資料大小。
+ 新增對 Amazon Redshift Serverless 自訂叢集名稱 (CNAME) 的支援。

**Apache Hudi**  
請注意下列變更：
+ 支援記錄層級索引。
+ 支援自動產生記錄金鑰。現在不需要指定記錄金鑰欄位。

**Apache Iceberg**  
請注意下列變更：
+ 使用 支援精細存取控制 AWS Lake Formation。
+ 支援分支和標記，其為具有各自獨立生命週期的具名快照參考。
+ 已新增變更日誌檢視程序，該程序會產生檢視，其中包含在指定期間或特定快照之間對資料表所做的變更。

**Delta Lake**  
請注意下列變更：
+ 支援 Delta Universal Format (UniForm)，其可透過 Apache Iceberg 和 Apache Hudi 進行無縫存取。
+ 支援實作 Merge-on-Read 範例的刪除向量。

**AzureCosmos**  
請注意下列變更：
+ 新增階層分區索引鍵支援。
+ 已新增將自訂結構描述與 StringType (原始 json) 用於巢狀屬性的選項。
+ 已新增組態選項 `spark.cosmos.auth.aad.clientCertPemBase64`，以允許搭配使用 SPN (ServicePrincipal 名稱) 身分驗證與憑證，而非用戶端機密。

如需詳細資訊，請參閱 [Azure Cosmos DB Spark 連接器變更日誌](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/cosmos/azure-cosmos-spark_3-2_2-12/CHANGELOG.md)。

**Microsoft SQL Server**  
請注意下列變更：
+ 預設啟用 TLS 加密。
+ 當 encrypt = false 但伺服器需要加密時，會根據 `trustServerCertificate` 連線設定來驗證憑證。
+ `aadSecurePrincipalId` 和 `aadSecurePrincipalSecret` 已棄用。
+ 已移除 `getAADSecretPrincipalId` API。
+ 在指定領域時新增了 CNAME 解析度。

**MongoDB**  
請注意下列變更：
+ 支援使用 Spark 結構化串流的微型批量模式。
+ 支援 BSON 資料類型。
+ 新增了在使用微型批量或連續串流模式時讀取多個集合的支援。
  + 如果 `collection` 組態選項中使用的集合名稱包含逗號，Spark Connector 會將其視為兩個不同的集合。為了避免這種情況，必須在逗號前面加上反斜線 (\$1) 來轉義逗號。
  + 如果 `collection` 組態選項中使用的集合名稱為 "\$1"，Spark Connector 會將其解譯為掃描所有集合的規格。為了避免這種情況，必須在星號前面加上反斜線 (\$1) 來轉義逗號。
  + 如果 `collection` 組態選項中使用的集合名稱包含反斜線 (\$1)，Spark Connector 會將反斜線視為轉義字元，這可能會變更其解譯值的方式。為了避免這種情況，必須在反斜線前面加上另一個反斜線來轉義反斜線。

如需詳細資訊，請參閱[適用於 Spark 的 MongoDB 連接器版本備註](https://www.mongodb.com/docs/spark-connector/current/release-notes/)。

**Snowflake**  
請注意下列變更：
+ 引進了一個新 `trim_space` 參數，可以在儲存到 Snowflake 資料表時，用來自動修剪 `StringType` 資料欄的值。預設：`false`。
+ 根據預設，在工作階段層級停用 `abort_detached_query` 參數。
+ 使用 OAUTH 時移除了 `SFUSER` 參數的需求。
+ 已移除進階查詢下推功能。提供了此功能的替代方案。例如，使用者可以直接從 Snowflake SQL 查詢載入資料，而不是從 Snowflake 資料表載入資料。

如需詳細資訊，請參閱 [Snowflake Connector for Spark 版本備註](https://docs.snowflake.com/en/release-notes/clients-drivers/spark-connector-2024)。

### 附錄 A：值得注意的相依性升級
<a name="migrating-version-50-appendix-dependencies"></a>

以下是相依性升級：


| 相依性 | in AWS Glue 5.0 版本 | in AWS Glue 4.0 版本 | in AWS Glue 3.0 版 | in AWS Glue 2.0 版本 |  AWS Glue 1.0 版 | 
| --- | --- | --- | --- | --- | --- | 
| Java | 17 | 8 | 8 | 8 | 8 | 
| Spark | 3.5.4 | 3.3.0-amzn-1 | 3.1.1-amzn-0 | 2.4.3 | 2.4.3 | 
| Hadoop | 3.4.1 | 3.3.3-amzn-0 | 3.2.1-amzn-3 | 2.8.5-amzn-5 | 2.8.5-amzn-1 | 
| Scala | 2.12.18 | 2.12 | 2.12 | 2.11 | 2.11 | 
| Jackson | 2.15.2 | 2.12 | 2.12 | 2.11 | 2.11 | 
| Hive | 2.3.9-amzn-4 | 2.3.9-amzn-2 | 2.3.7-amzn-4 | 1.2 | 1.2 | 
| EMRFS | 2.69.0 | 2.54.0 | 2.46.0 | 2.38.0 | 2.30.0 | 
| Json4s | 3.7.0-M11 | 3.7.0-M11 | 3.6.6 | 3.5.x | 3.5.x | 
| Arrow | 12.0.1 | 7.0.0 | 2.0.0 | 0.10.0 | 0.10.0 | 
| AWS Glue Data Catalog 用戶端 | 4.5.0 | 3.7.0 | 3.0.0 | 1.10.0 | N/A | 
| AWS 適用於 Java 的 SDK | 2.29.52 | 1.12 | 1.12 |  |  | 
| Python | 3.11 | 3.10 | 3.7 | 2.7 和 3.6 | 2.7 和 3.6 | 
| Boto | 1.34.131 | 1.26 | 1.18 | 1.12 | N/A | 
| EMR DynamoDB 連接器 | 5.6.0 | 4.16.0 |  |  |  | 

### 附錄 B：JDBC 驅動程式升級
<a name="migrating-version-50-appendix-jdbc-driver"></a>

以下是 JDBC 驅動程式升級：


| 驅動程式 | JDBC 驅動程式 AWS Glue 5.0 版 |  AWS Glue 4.0 中的 JDBC 驅動程式版本 | JDBC 驅動程式 in AWS Glue 3.0 版 | 過去版本的 JDBC 驅動程式 AWS Glue 版本 | 
| --- | --- | --- | --- | --- | 
| MySQL | 8.0.33 | 8.0.23 | 8.0.23 | 5.1 | 
| Microsoft SQL Server | 10.2.0 | 9.4.0 | 7.0.0 | 6.1.0 | 
| Oracle 資料庫 | 23.3.0.23.09 | 21.7 | 21.1 | 11.2 | 
| PostgreSQL | 42.7.3 | 42.3.6 | 42.2.18 | 42.1.0 | 
| Amazon Redshift |  redshift-jdbc42-2.1.0.29  |  redshift-jdbc42-2.1.0.16  |  redshift-jdbc41-1.2.12.1017   |  redshift-jdbc41-1.2.12.1017   | 
| SAP Hana | 2.20.17 | 2.17.12 |  |  | 
| Teradata | 20.00.00.33 | 20.00.00.06 |  |  | 

### 附錄 C：連接器升級
<a name="migrating-version-50-appendix-connector"></a>

以下是連接器升級：


| 驅動程式 |  AWS Glue 5.0 中的連接器版本 |  AWS Glue 4.0 中的連接器版本 | 連接器 in AWS Glue 3.0 版 | 
| --- | --- | --- | --- | 
| EMR DynamoDB 連接器 | 5.6.0 | 4.16.0 |  | 
| Amazon Redshift | 6.4.0 | 6.1.3 |  | 
| OpenSearch | 1.2.0 | 1.0.1 |  | 
| MongoDB | 10.3.0 | 10.0.4 | 3.0.0 | 
| Snowflake | 3.0.0 | 2.12.0 |  | 
| Google BigQuery | 0.32.2 | 0.32.2 |  | 
| AzureCosmos | 4.33.0 | 4.22.0 |  | 
| AzureSQL | 1.3.0 | 1.3.0 |  | 
| Vertica | 3.3.5 | 3.3.5 |  | 

### 附錄 D：開放式資料表格式升級
<a name="migrating-version-50-appendix-open-table-formats"></a>

以下是開放式資料表格式升級：


| OTF |  AWS Glue 5.0 中的連接器版本 |  AWS Glue 4.0 中的連接器版本 | 連接器 in AWS Glue 3.0 版 | 
| --- | --- | --- | --- | 
| Hudi | 0.15.0 | 0.12.1 | 0.10.1 | 
| Delta Lake | 3.3.0 | 2.1.0 | 1.0.0 | 
| Iceberg | 1.7.1 | 1.0.0 | 0.13.1 | 

# AWS Glue 將 Spark 任務遷移至 4.0 AWS Glue 版
<a name="migrating-version-40"></a>

本主題說明 0.9、1.0、2.0 和 3.0 AWS Glue 版之間的變更，以允許您將 Spark 應用程式和 ETL 任務遷移至 AWS Glue 4.0。它還描述了 AWS Glue 4.0 中的功能以及使用它的優勢。

若要將此功能與 AWS Glue ETL 任務搭配使用，請在建立任務`Glue version`時**4.0**為 選擇 。

**Topics**
+ [支援的新功能](#migrating-version-40-features)
+ [要遷移至 AWS Glue 4.0 的動作](#migrating-version-40-actions)
+ [移轉檢查清單](#migrating-version-40-checklist)
+ [從 AWS Glue 3.0 遷移至 AWS Glue 4.0](#migrating-version-40-from-30)
+ [從 AWS Glue 2.0 遷移至 AWS Glue 4.0](#migrating-version-40-from-20)
+ [從 AWS Glue 1.0 遷移至 AWS Glue 4.0](#migrating-version-40-from-10)
+ [從 AWS Glue 0.9 遷移至 AWS Glue 4.0](#migrating-version-40-from-09)
+ [連接器和 JDBC 驅動程式遷移 for AWS Glue 4.0](#migrating-version-40-connector-driver-migration)
+ [附錄 A：值得注意的相依性升級](#migrating-version-40-appendix-dependencies)
+ [附錄 B：JDBC 驅動程式升級](#migrating-version-40-appendix-jdbc-driver)
+ [附錄 C：連接器升級](#migrating-version-40-appendix-connector)

## 支援的新功能
<a name="migrating-version-40-features"></a>

本節說明 4.0 AWS Glue 版的新功能和優點。
+ 其基於 Apache Spark 3.3.0，但包括 AWS Glue和 Amazon EMR 中的最佳化，例如調整式查詢執行、向量化讀取器，以及最佳化的隨機和分割區合併。
+ 升級所有原生來源的 JDBC AWS Glue 驅動程式，包括 MySQL、Microsoft SQL Server、Oracle、PostgreSQL、MongoDB，以及 Spark 3.3.0 引進的升級 Spark 程式庫和相依性。
+ 以新的 Amazon Redshift 連接器和 JDBC 驅動程式進行更新。
+ 透過升級的 EMR File System (EMRFS) 最佳化 Amazon S3 存取，並預設啟用 Amazon S3 最佳化的輸出提交器。
+ 最佳化 Data Catalog 存取與分割區索引、下推述詞、分割區清單，以及升級的 Hive 中繼存放區用戶端。
+ 與 Lake Formation 整合，以控管的目錄資料表具有儲存格層級篩選和資料湖交易。
+ 減少啟動延遲，可改善整體任務完成時間和互動性。
+ Spark 任務以 1 秒的增量計費，最短計費持續時間變為原來的十分之一，即從最短 10 分鐘變為最短 1 分鐘。
+ 原生支援開放式資料湖架構，包括 Apache Hudi、Delta Lake 和 Apache Iceberg。
+ 原生支援以 Amazon S3 為基礎的雲端隨機排序儲存外掛程式 (Apache Spark 外掛程式)，以使用 Amazon S3 進行隨機排序和彈性儲存容量。

**從 Spark 3.1.1 到 Spark 3.3.0 的主要增強功能**  
請注意下列增強功能：
+ 資料列層級執行時間篩選 ([SPARK-32268](https://issues.apache.org/jira/browse/SPARK-32268))。
+ ANSI 增強功能 ([SPARK-38860](https://issues.apache.org/jira/browse/SPARK-38860))。
+ 錯誤訊息改善項目 ([SPARK-38781](https://issues.apache.org/jira/browse/SPARK-38781))。
+ 支援 Parquet 向量化讀取器的複雜類型 ([SPARK-34863](https://issues.apache.org/jira/browse/SPARK-34863))。
+ 隱藏 Spark SQL 的檔案中繼資料支援 ([SPARK-37273](https://issues.apache.org/jira/browse/SPARK-37273))。
+ 提供 Python/pandas UDF 的分析工具 ([SPARK-37443](https://issues.apache.org/jira/browse/SPARK-37443))。
+ 導入 Trigger.AvailableNow，以執行分成多批次執行的 Trigger.Once 等串流查詢 ([SPARK-36533](https://issues.apache.org/jira/browse/SPARK-36533))。
+ 更全面的 Datasource V2 下推功能 ([SPARK-38788](https://issues.apache.org/jira/browse/SPARK-38788))。
+ 從 log4j 1 移轉到 log4j 2 ([SPARK-37814](https://issues.apache.org/jira/browse/SPARK-37814))。

**其他顯著的變更**  
請注意下列變更：
+ 突破性變更
  + 在文件和 Python/文件中加入 Python 3.6 支援的參考 ([SPARK-36977](https://issues.apache.org/jira/browse/SPARK-36977))。
  + 將內建 pickle 更換成 cloudpickle，以移除命名的 tuple hack ([SPARK-32079](https://issues.apache.org/jira/browse/SPARK-32079))。
  + 將 pandas 從最小版本增加到 1.0.5 ([SPARK-37465](https://issues.apache.org/jira/browse/SPARK-37465))。

## 要遷移至 AWS Glue 4.0 的動作
<a name="migrating-version-40-actions"></a>

對於現有的任務，請將舊版 `Glue version` 變更為任務組態中的 `Glue 4.0`。
+ 在 AWS Glue Studio `Glue 4.0 - Supports Spark 3.3, Scala 2, Python 3`中，選擇 `Glue version`。
+ 在 API 中，選擇 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-UpdateJob](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-UpdateJob) API 操作 `GlueVersion` 參數中的 **4.0**。

對於新任務，當您建立任務時請選擇 `Glue 4.0`。
+ 在主控台中，在 `Glue version` 中選擇 `Spark 3.3, Python 3 (Glue Version 4.0) or Spark 3.3, Scala 2 (Glue Version 3.0)`。
+ 在 AWS Glue Studio `Glue 4.0 - Supports Spark 3.3, Scala 2, Python 3`中，選擇 `Glue version`。
+ 在 API 中，選擇 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob) API 操作 `GlueVersion` 參數中的 **4.0**。

若要檢視來自 AWS Glue 2.0 或更早版本的 AWS Glue 4.0 Spark 事件日誌，[請使用 CloudFormation 或 Docker 啟動升級的 Spark 歷史記錄伺服器 for AWS Glue 4.0。](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-history.html)

## 移轉檢查清單
<a name="migrating-version-40-checklist"></a>
+ 您任務的外部 Python 程式庫是否依賴於 Python 2.7/3.6？
  + 將相依程式庫從 Python 2.7/3.6 更新為 Python 3.10，因為 Spark 3.3.0 完全刪除了 Python 2.7 和 3.6 的支援。

## 從 AWS Glue 3.0 遷移至 AWS Glue 4.0
<a name="migrating-version-40-from-30"></a>

移轉時請注意下列變更：
+  AWS Glue 3.0 中存在的所有現有任務參數和主要功能都將存在於 AWS Glue 4.0 中。
+ AWS Glue 3.0 使用 Amazon EMR 最佳化 Spark 3.1.1，而 AWS Glue 4.0 使用 Amazon EMR 最佳化 Spark 3.3.0。

  單獨的數個 Spark 變更可能需要修改指令碼，以確保沒有引用被刪除的功能。
+ AWS Glue 4.0 也提供 EMRFS 和 Hadoop 的更新。如需特定版本，請參閱[附錄 A：值得注意的相依性升級](#migrating-version-40-appendix-dependencies)。
+ ETL 任務中提供的 AWS SDK 現在已從 1.11 升級到 1.12。
+ 所有 Python 任務都將使用 3.10 版。先前，Python 3.7 已在 AWS Glue 3.0 中使用。

  因此， out-of-the-box可用的某些 pymodule AWS Glue 會升級。
+ Log4j 已升級到 Log4j2。
  + 如需 Log4j2 移轉路徑的資訊，請參閱 [Log4j 文件](https://logging.apache.org/log4j/2.x/manual/migration.html#Log4j2API)。
  + 您必須以適當的 log4j2 屬性將任何自訂 log4j 屬性檔案重新命名為 log4j2.properties 檔案。
+ 如需移轉某些連接器，請參閱[連接器和 JDBC 驅動程式遷移 for AWS Glue 4.0](#migrating-version-40-connector-driver-migration)。
+  AWS 加密 SDK 已從 1.x 升級至 2.x。 AWS Glue 使用 AWS Glue 安全組態的任務，以及取決於執行時間提供的 AWS 加密 SDK 相依性的任務都會受到影響。請參閱 AWS Glue 任務遷移的說明。

  您可以安全地將 AWS Glue 2.0/3.0 任務升級至 AWS Glue 4.0 任務，因為 AWS Glue 2.0/3.0 已包含 AWS 加密 SDK 橋接器版本。

請參閱 Spark 移轉文件：
+ [從 Spark SQL 3.1 升級到 3.2](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-31-to-32)
+ [從 Spark SQL 3.2 升級到 3.3](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-32-to-33)

## 從 AWS Glue 2.0 遷移至 AWS Glue 4.0
<a name="migrating-version-40-from-20"></a>

移轉時請注意下列變更：

**注意**  
如需與 AWS Glue 3.0 相關的遷移步驟，請參閱 [從 AWS Glue 3.0 遷移至 AWS Glue 4.0](#migrating-version-40-from-30)。
+  AWS Glue 2.0 中存在的所有現有任務參數和主要功能都將存在於 AWS Glue 4.0 中。
+ 用於將 Parquet 資料寫入 Amazon S3 的 EMRFS S3-optimized遞交者預設為自 AWS Glue 3.0 起啟用。不過，您仍然可以透過將 `--enable-s3-parquet-optimized-committer` 設定為 `false` 來停用它。
+ AWS Glue 2.0 使用開放原始碼 Spark 2.4，而 AWS Glue 4.0 使用 Amazon EMR 最佳化 Spark 3.3.0。
  + 單獨的數個 Spark 變更可能需要修改指令碼，以確保沒有引用被刪除的功能。
  + 例如，Spark 3.3.0 不啟用 Scala 無類型的 UDF，但 Spark 2.4 確實允許它們。
+ ETL 任務中提供的 AWS SDK 現在已從 1.11 升級到 1.12。
+ AWS Glue 4.0 還具有 EMRFS 的更新、更新的 JDBC 驅動程式，以及 提供的 Spark 本身的其他最佳化內容 AWS Glue。
+ Scala 從 2.11 更新到 2.12，而 Scala 2.12 不回溯相容 Scala 2.11。
+ Python 3.10 也是用於 Python 指令碼的預設版本，因為 AWS Glue 2.0 只利用 Python 3.7 和 2.7。
  + Python 2.7 不支援 Spark 3.3.0。在任務組態中請求 Python 2 的任何任務都將失敗，並出現 IllegalArgumentException。
  + 安裝其他 Python 模組的新機制自 AWS Glue 2.0 起已推出。
+ 數個相依性更新，在 [附錄 A：值得注意的相依性升級](#migrating-version-40-appendix-dependencies) 中反白顯示。
+ 在現有 AWS Glue 2.0 任務中提供的任何額外 JAR 檔案可能會導致相互衝突的相依性，因為 4.0 中的數個相依性從 2.0 升級。您可以避免 classpath 在 AWS Glue 4.0 中與`--user-jars-first` AWS Glue 任務參數衝突。
+ AWS Glue 4.0 使用 Spark 3.3。從 Spark 3.1 開始，從 Parquet 檔案載入時間戳記以及將時間戳記儲存至此類檔案的行為發生了變化。有關更多詳細資訊，請參閱[從 Spark SQL 3.0 升級到 3.1](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-30-to-31)。

  建議在讀取/寫入包含時間戳記資料行的 parquet 資料時設定以下參數。設定這些參數可以解決 AWS Glue 動態影格和 Spark 資料影格在 Spark 2 升級至 Spark 3 期間發生的行事曆不相容問題。使用「更正」選項原樣讀取 datetime 值；使用「舊式」選項可以在讀取過程中針對行事曆差異重新設定 datetime 值的基準。

  ```
  - Key: --conf
  - Value: spark.sql.legacy.parquet.int96RebaseModeInRead=[CORRECTED|LEGACY] --conf spark.sql.legacy.parquet.int96RebaseModeInWrite=[CORRECTED|LEGACY] --conf spark.sql.legacy.parquet.datetimeRebaseModeInRead=[CORRECTED|LEGACY]
  ```
+ 如需移轉某些連接器，請參閱[連接器和 JDBC 驅動程式遷移 for AWS Glue 4.0](#migrating-version-40-connector-driver-migration)。
+  AWS 加密 SDK 已從 1.x 升級至 2.x。 AWS Glue 使用 AWS Glue 安全組態的任務，以及取決於執行時間提供的 AWS 加密 SDK 相依性的任務都會受到影響。請參閱這些 AWS Glue 任務遷移的說明：
  + 您可以安全地將 AWS Glue 2.0 任務升級至 AWS Glue 4.0 任務，因為 AWS Glue 2.0 已包含 AWS 加密 SDK 橋接器版本。

請參閱 Spark 移轉文件：
+ [從 Spark SQL 2.4 升級到 3.0](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-24-to-30)
+ [從 Spark SQL 3.1 升級到 3.2](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-31-to-32)
+ [從 Spark SQL 3.2 升級到 3.3](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-32-to-33)
+ [自 Spark 3.0 以來預期日期時間行為的變化。](https://issues.apache.org/jira/browse/SPARK-31408)

## 從 AWS Glue 1.0 遷移至 AWS Glue 4.0
<a name="migrating-version-40-from-10"></a>

移轉時請注意下列變更：
+ AWS Glue 1.0 使用開放原始碼 Spark 2.4，而 AWS Glue 4.0 使用 Amazon EMR 最佳化 Spark 3.3.0。
  + 單獨的數個 Spark 變更可能需要修改指令碼，以確保沒有引用被刪除的功能。
  + 例如，Spark 3.3.0 不啟用 Scala 無類型的 UDF，但 Spark 2.4 確實允許它們。
+  AWS Glue 4.0 中的所有任務都會以大幅改善的啟動時間執行。Spark 任務將以 1 秒的增量計費，最短計費持續時間變為原來的十分之一，因為啟動延遲將從最大 10 分鐘到最大 1 分鐘。
+ 記錄行為已在 AWS Glue 4.0 中大幅變更，Spark 3.3.0 的最低需求為 Log4j2。
+ 數個相依性更新，在附錄中反白顯示。
+ Scala 也從 2.11 更新到 2.12，而 Scala 2.12 不回溯相容 Scala 2.11。
+ Python 3.10 也是用於 Python 指令碼的預設版本，因為 AWS Glue 0.9 只利用 Python 2。

  Python 2.7 不支援 Spark 3.3.0。在任務組態中請求 Python 2 的任何任務都將失敗，並出現 IllegalArgumentException。
+ 從 AWS Glue 2.0 起，已推出透過 pip 安裝其他 Python 模組的新機制。如需詳細資訊，請參閱[使用 pip 在 AWS Glue 2.0\$1 中安裝其他 Python 模組](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-libraries.html#addl-python-modules-support)。
+ AWS Glue 4.0 不會在 Apache YARN 上執行，因此 YARN 設定不適用。
+ AWS Glue 4.0 沒有 Hadoop 分散式檔案系統 (HDFS)。
+ 在現有 AWS Glue 1.0 任務中提供的任何額外 JAR 檔案可能會導致相互衝突的相依性，因為 4.0 中的數個相依性從 1.0 升級。我們預設會使用 `--user-jars-first` AWS Glue 任務參數啟用 AWS Glue 4.0，以避免此問題。
+ AWS Glue 4.0 支援自動擴展。因此，啟用 Auto Scaling 後，將提供 ExecutorAllocationManager 指標。
+ 在 4.0 AWS Glue 版任務中，您可以指定工作者數量和工作者類型，但不指定 `maxCapacity`。
+ AWS Glue 4.0 版尚不支援機器學習轉換。
+ 如需移轉某些連接器，請參閱[連接器和 JDBC 驅動程式遷移 for AWS Glue 4.0](#migrating-version-40-connector-driver-migration)。
+  AWS 加密 SDK 已從 1.x 升級至 2.x。 AWS Glue 使用 AWS Glue 安全組態的任務，以及取決於執行時間提供的 AWS 加密 SDK 相依性的任務都會受到影響。請參閱這些 AWS Glue 任務遷移的說明。
  + 您無法將 AWS Glue 0.9/1.0 任務直接遷移至 AWS Glue 4.0 任務。這是因為直接升級至 2.x 版或更新版本並立即啟用所有新功能時， AWS Encryption SDK 將無法解密在舊版 AWS Encryption SDK 下加密的加密文字。
  + 為了安全升級，我們建議您先遷移至包含 AWS Encryption SDK 橋接器版本的 AWS Glue 2.0/3.0 任務。執行任務一次，以利用 AWS 加密 SDK 橋接器版本。
  + 完成後，您可以安全地將 AWS Glue 2.0/3.0 任務遷移至 AWS Glue 4.0。

請參閱 Spark 移轉文件：
+ [從 Spark SQL 2.4 升級到 3.0](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-24-to-30)
+ [從 Spark SQL 3.0 升級到 3.1](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-30-to-31)
+ [從 Spark SQL 3.1 升級到 3.2](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-31-to-32)
+ [從 Spark SQL 3.2 升級到 3.3](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-32-to-33)
+ [自 Spark 3.0 以來預期日期時間行為的變化。](https://issues.apache.org/jira/browse/SPARK-31408)

## 從 AWS Glue 0.9 遷移至 AWS Glue 4.0
<a name="migrating-version-40-from-09"></a>

移轉時請注意下列變更：
+ AWS Glue 0.9 使用開放原始碼 Spark 2.2.1，而 AWS Glue 4.0 使用 Amazon EMR 最佳化 Spark 3.3.0。
  + 單獨的數個 Spark 變更可能需要修改指令碼，以確保沒有引用被刪除的功能。
  + 例如，Spark 3.3.0 不啟用 Scala 無類型的 UDF，但 Spark 2.2 確實允許它們。
+  AWS Glue 4.0 中的所有任務都會以大幅改善的啟動時間執行。Spark 任務將以 1 秒的增量計費，最短計費持續時間變為原來的十分之一，因為啟動延遲將從最大 10 分鐘變為最大 1 分鐘。
+ 記錄行為自 AWS Glue 4.0 起已大幅變更，Spark 3.3.0 的最低需求為 Log4j2，如此處所述 (https://spark.apache.org/docs/latest/core-migration-guide.html\$1upgrading-from-core-32-to-33：//)。
+ 數個相依性更新，在附錄中反白顯示。
+ Scala 也從 2.11 更新到 2.12，而 Scala 2.12 不回溯相容 Scala 2.11。
+ Python 3.10 也是用於 Python 指令碼的預設版本，因為 AWS Glue 0.9 只利用 Python 2。
  + Python 2.7 不支援 Spark 3.3.0。在任務組態中請求 Python 2 的任何任務都將失敗，並出現 IllegalArgumentException。
  + 提供透過 pip 安裝其他 Python 模組的新機制。
+ AWS Glue 4.0 不會在 Apache YARN 上執行，因此 YARN 設定不適用。
+ AWS Glue 4.0 沒有 Hadoop 分散式檔案系統 (HDFS)。
+ 在現有 AWS Glue 0.9 任務中提供的任何額外 JAR 檔案都可能會導致相互衝突的相依性，因為 3.0 中的數個相依性從 0.9 升級。您可以避免 AWS Glue 3.0 中的 classpath 與`--user-jars-first` AWS Glue 任務參數衝突。
+ AWS Glue 4.0 支援自動擴展。因此，啟用 Auto Scaling 後，將提供 ExecutorAllocationManager 指標。
+ 在 4.0 AWS Glue 版任務中，您可以指定工作者數量和工作者類型，但不指定 `maxCapacity`。
+ AWS Glue 4.0 版尚不支援機器學習轉換。
+ 如需移轉某些連接器，請參閱[連接器和 JDBC 驅動程式遷移 for AWS Glue 4.0](#migrating-version-40-connector-driver-migration)。
+  AWS 加密 SDK 已從 1.x 升級至 2.x。 AWS Glue 使用 AWS Glue 安全組態的任務，以及取決於執行時間提供的 AWS 加密 SDK 相依性的任務都會受到影響。請參閱這些 AWS Glue 任務遷移的說明。
  + 您無法將 AWS Glue 0.9/1.0 任務直接遷移至 AWS Glue 4.0 任務。這是因為直接升級至 2.x 版或更新版本並立即啟用所有新功能時， AWS Encryption SDK 將無法解密在舊版 AWS Encryption SDK 下加密的加密文字。
  + 為了安全升級，我們建議您先遷移至包含 AWS Encryption SDK 橋接器版本的 AWS Glue 2.0/3.0 任務。執行任務一次，以利用 AWS 加密 SDK 橋接器版本。
  + 完成後，您可以安全地將 AWS Glue 2.0/3.0 任務遷移至 AWS Glue 4.0。

請參閱 Spark 移轉文件：
+ [從 Spark SQL 2.2 升級到 2.3](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-22-to-23)
+ [從 Spark SQL 2.3 升級到 2.4](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-23-to-24)
+ [從 Spark SQL 2.4 升級到 3.0](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-24-to-30)
+ [從 Spark SQL 3.0 升級到 3.1](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-30-to-31)
+ [從 Spark SQL 3.1 升級到 3.2](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-31-to-32)
+ [從 Spark SQL 3.2 升級到 3.3](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-32-to-33)
+ [自 Spark 3.0 以來預期日期時間行為的變化。](https://issues.apache.org/jira/browse/SPARK-31408)

## 連接器和 JDBC 驅動程式遷移 for AWS Glue 4.0
<a name="migrating-version-40-connector-driver-migration"></a>

如需已升級的 JDBC 和資料湖連接器版本，請參閱：
+ [附錄 B：JDBC 驅動程式升級](#migrating-version-40-appendix-jdbc-driver)
+ [附錄 C：連接器升級](#migrating-version-40-appendix-connector)

### Hudi
<a name="migrating-version-40-connector-driver-migration-hudi"></a>
+ Spark SQL 支援改善項目：
  + 透過 `Call Procedure` 命令新增升級、降級、引導、清理和維修的支援。`Create/Drop/Show/Refresh Index` 語法可在 Spark SQL 中使用。
  + 透過 Spark DataSource 的使用消除對照於 Spark SQL 的效能落差。過去的 Datasource 寫入曾比 SQL 快。
  + 所有內建金鑰產生器都會實作更多效能 Spark 特定 API 操作。
  + 用 RDD 轉換取代大量 `insert` 操作中的 UDF 轉換，以削減使用 SerDe 的成本。
  + 使用 Hudi 的 Spark SQL 需要由 `tblproperites` 或 SQL 陳述式中的選項指定 `primaryKey`。更新和刪除操作也需要 `preCombineField`。
+ 自 0.10.0 版起，在 0.10.0 版之前建立且無 `primaryKey` 的任何 Hudi 資料表都需要使用 `primaryKey` 欄位重新建立。

### PostgreSQL
<a name="migrating-version-40-connector-driver-migration-postgresql"></a>
+ 已處理數個安全漏洞 (CVE)。
+ 原生支援 Java 8。
+ 如果任務正使用陣列的陣列，此情境可以作為多維陣列處理，但不包括位元組陣列。

### MongoDB
<a name="migrating-version-40-connector-driver-migration-mongodb"></a>
+ 目前 MongoDB 連接器支援 Spark 3.1 版或更高版本和 MongoDB 4.0 版或更高版本。
+ 由於連接器升級，部分屬性名稱也已變更。例如，URI 屬性名稱已變更為 `connection.uri`。如需目前選項的詳細資訊，請參閱 [MongoDB Spark Connector 部落格](https://www.mongodb.com/docs/spark-connector/current/configuration/)。
+ 使用由 Amazon DocumentDB 託管的 MongoDB 4.0 時有些功能差異。如需詳細資訊，請參閱以下主題：
  + [功能差異：Amazon DocumentDB 和 MongoDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/functional-differences.html)
  +  [支援的 MongoDB API、操作和資料類型](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html)。
+ "Partitioner" 選項僅限於 `ShardedPartitioner`、`PaginateIntoPartitionsPartitioner` 和 `SinglePartitionPartitioner`。該選項不能將預設 `SamplePartitioner` 和 `PaginateBySizePartitioner` 用於 Amazon DocumentDB，因為階段運算子不支援 MongoDB API。如需詳細資訊，請參閱 [Supported MongoDB APIs, Operations, and Data Types](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html) (支援的 MongoDB API、操作和資料類型)。

### Delta Lake
<a name="migrating-version-40-connector-driver-migration-delta"></a>
+ Delta Lake 現在支援 [SQL 中的時間移動操作](https://docs.delta.io/2.1.0/delta-batch.html#query-an-older-snapshot-of-a-table-time-travel)，可輕鬆查詢舊資料。透過此更新，現在可在 Spark SQL 中以及透過 DataFrame API 提供時間移動操作。已在 SQL 中新增對目前 TIMESTAMP 版本的支援。
+ Spark 3.3 導入 [Trigger.AvailableNow](https://issues.apache.org/jira/browse/SPARK-36533)，以執行串流查詢 (等同於用於批次查詢的 `Trigger.Once`)。使用 Delta 資料表作為串流來源時，也提供此支援。
+ 支援傳回資料表中資料欄清單的 SHOW COLUMNS。
+ 支援 Scala 和 Python DeltaTable API 中的 [DESCRIBE DETAIL](https://docs.delta.io/2.1.0/delta-utility.html#retrieve-delta-table-details)。其會使用 DeltaTable API 或 Spark SQL 擷取 Delta 資料表的相關詳細資訊。
+ 支援從 SQL [Delete](https://github.com/delta-io/delta/pull/1328)、[Merge](https://github.com/delta-io/delta/pull/1327) 和 [Update](https://github.com/delta-io/delta/pull/1331) 命令傳回操作指標。這些 SQL 命令之前會傳回空的 DataFrame，現在則會傳回包含已執行操作之實用指標的 DataFrame。
+ 最佳化效能改善項目：
  + 設定組態選項 `spark.databricks.delta.optimize.repartition.enabled=true` 以在 Optimize 命令中使用 `repartition(1)` 而非 `coalesce(1)`，以便在精簡小型檔案時實現更高的效能。
  + 使用佇列式方法平行化精簡任務，從而[改善效能](https://github.com/delta-io/delta/pull/1315)。
+ 其他顯著的變更：
  + [支援將變數用於](https://github.com/delta-io/delta/issues/1267) VACUUM 和 OPTIMIZE SQL 命令。
  + 目錄資料表 CONVERT TO DELTA 的改善功能，包括：
    + 未提供時，[自動填入分割區結構描述](https://github.com/delta-io/delta/commit/18d4d12ed06f973006501f6c39c8785db51e2b1f)。
    + [使用目錄的分割區資訊](https://github.com/delta-io/delta/commit/ebff29904f3ababb889897343f8f8f7a010a1f71)來尋找要遞交的資料檔案，而不進行完整的目錄掃描。只會遞交使用中分割區目錄下的資料檔案，而不遞交資料表目錄中的所有資料檔案。
  + 未使用 DROP COLUMN 與 RENAME COLUMN 時，在已啟用資料欄對應的資料表上[支援變更資料饋送 (CDF) 批次讀取](https://github.com/delta-io/delta/issues/1349)。如需詳細資訊，請參閱 [Delta Lake 文件](https://docs.delta.io/2.1.0/delta-change-data-feed.html#known-limitations)。
  + 在第一次傳遞中啟用結構描述剔除，以[改善 Update 命令的效能](https://github.com/delta-io/delta/pull/1202)。

### Apache Iceberg
<a name="migrating-version-40-connector-driver-migration-iceberg"></a>
+ 已新增掃描規劃和 Spark 查詢的數項[效能改善項目](https://iceberg.apache.org/releases/#performance-improvements)。
+ 已新增常見的 REST 目錄用戶端，該用戶端使用以變更為基礎的遞交來解決服務端的遞交衝突。
+ 已支援 SQL 時間移動查詢的 `AS OF` 語法。
+ 已新增 MERGE 和 UPDATE 查詢的「讀取時合併」支援。
+ 已新增使用 Z-order 重新寫入分割區的支援。
+ 已新增 Puffin 的規格和實作，此為大型統計資料和索引 blob 的格式，就像是 [Theta 示意圖](https://datasketches.apache.org/docs/Theta/InverseEstimate.html)或 bloom 篩選條件。
+ 已新增遞增取用資料的新介面 (附加和變更日誌掃描)。
+ 已新增對於大量操作和遠端讀取 FileIO 介面的支援。
+ 已新增更多中繼資料表，以在中繼資料樹狀結構中顯示刪除檔案。
+ 已變更放置資料表行為。在 Iceberg 0.13.1 中，執行 `DROP TABLE` 會從目錄移除資料表，並刪除資料表內容。在 Iceberg 1.0.0 中，`DROP TABLE` 僅從目錄刪除資料表。若要刪除資料表內容，請使用 `DROP TABLE PURGE`。
+ 已在 Iceberg 1.0.0 中啟用 Parquet 向量化讀取。如要停用向量化讀取，請將 `read.parquet.vectorization.enabled` 設定為 `false`。

### Oracle
<a name="migrating-version-40-connector-driver-migration-oracle"></a>

僅為次要變更。

### MySQL
<a name="migrating-version-40-connector-driver-migration-mysql"></a>

僅為次要變更。

### Amazon Redshift
<a name="migrating-version-40-connector-driver-migration-redshift"></a>

AWS Glue 4.0 具有新的 Amazon Redshift 連接器和新的 JDBC 驅動程式。如需增強功能以及如何從舊版遷移的相關資訊 AWS Glue ，請參閱 [Redshift 連線](aws-glue-programming-etl-connect-redshift-home.md)。

## 附錄 A：值得注意的相依性升級
<a name="migrating-version-40-appendix-dependencies"></a>

以下是相依性升級：


| 相依性 | in AWS Glue 4.0 版本 | in AWS Glue 3.0 版本 | in AWS Glue 2.0 版本 | in AWS Glue 1.0 版本 | 
| --- | --- | --- | --- | --- | 
| Spark | 3.3.0-amzn-1 | 3.1.1-amzn-0 | 2.4.3 | 2.4.3 | 
| Hadoop | 3.3.3-amzn-0 | 3.2.1-amzn-3 | 2.8.5-amzn-5 | 2.8.5-amzn-1 | 
| Scala | 2.12 | 2.12 | 2.11 | 2.11 | 
| Jackson | 2.13.3 | 2.10.x | 2.7.x | 2.7.x | 
| Hive | 2.3.9-amzn-2 | 2.3.7-amzn-4 | 1.2 | 1.2 | 
| EMRFS | 2.54.0 | 2.46.0 | 2.38.0 | 2.30.0 | 
| Json4s | 3.7.0-M11 | 3.6.6 | 3.5.x | 3.5.x | 
| Arrow | 7.0.0 | 2.0.0 | 0.10.0 | 0.10.0 | 
| AWS Glue Data Catalog 用戶端 | 3.7.0 | 3.0.0 | 1.10.0 | N/A | 
| Python | 3.10 | 3.7 | 2.7 和 3.6 | 2.7 和 3.6 | 
| Boto | 1.26 | 1.18 | 1.12 | N/A | 

## 附錄 B：JDBC 驅動程式升級
<a name="migrating-version-40-appendix-jdbc-driver"></a>

以下是 JDBC 驅動程式升級：


| 驅動程式 | 過去版本的 JDBC 驅動程式 AWS Glue 版本 | JDBC 驅動程式 in AWS Glue 3.0 版 |  AWS Glue 4.0 中的 JDBC 驅動程式版本 | 
| --- | --- | --- | --- | 
| MySQL | 5.1 | 8.0.23 | 8.0.23 | 
| Microsoft SQL Server | 6.1.0 | 7.0.0 | 9.4.0 | 
| Oracle 資料庫 | 11.2 | 21.1 | 21.7 | 
| PostgreSQL | 42.1.0 | 42.2.18 | 42.3.6 | 
| MongoDB | 2.0.0 | 4.0.0 | 4.7.2 | 
| Amazon Redshift |  redshift-jdbc41-1.2.12.1017   |  redshift-jdbc41-1.2.12.1017   |  redshift-jdbc42-2.1.0.16  | 

## 附錄 C：連接器升級
<a name="migrating-version-40-appendix-connector"></a>

以下是連接器升級：


| 驅動程式 | 連接器 in AWS Glue 3.0 版 |  AWS Glue 4.0 中的連接器版本 | 
| --- | --- | --- | 
| MongoDB | 3.0.0 | 10.0.4 | 
| Hudi | 0.10.1 | 0.12.1 | 
| Delta Lake | 1.0.0 | 2.1.0 | 
| Iceberg | 0.13.1 | 1.0.0 | 
| DynamoDB | 1.11 | 1.12 | 

# Glue 中 Apache Spark AWS 的生成式 AI 升級
<a name="upgrade-analysis"></a>

 Glue AWS 中的 Spark 升級可讓資料工程師和開發人員使用生成式 AI，將現有的 AWS Glue Spark 任務升級和遷移到最新的 Spark 版本。資料工程師可以使用它來掃描其 AWS Glue Spark 任務、產生升級計畫、執行計畫，以及驗證輸出。其透過自動化識別和更新 Spark 指令碼、組態、相依性、方法和功能等無差別的工作，來減少 Spark 升級的時間和成本。

![\[GIF 會顯示範例升級分析工作流程的端對端實作。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/demo_lumos.gif)


## 運作方式
<a name="upgrade-analysis-how-it-works"></a>

 當您使用升級分析時， AWS Glue 會識別任務程式碼中版本和組態之間的差異，以產生升級計畫。升級計劃會詳細說明所有程式碼變更，以及必要的移轉步驟。接著， AWS Glue 會在 環境中建置並執行升級的應用程式，以驗證變更，並產生程式碼變更清單，供您遷移任務。可以檢視更新後的指令碼，以及詳細說明提議變更的摘要。執行您自己的測試後，請接受變更，Glue AWS 任務會使用新指令碼自動更新至最新版本。

 升級分析程序可能需要一些時間才能完成，具體取決於任務的複雜性和工作負載。升級分析的結果將儲存在指定的 Amazon S3 路徑中，您可以檢閱這些路徑以了解升級和任何潛在的相容性問題。在檢閱升級分析結果之後，您可以決定是否要繼續實際升級，或在升級之前對任務進行任何必要的變更。

## 先決條件
<a name="upgrade-analysis-prerequisites"></a>

 使用生成式 AI 升級 Glue AWS 中的任務需要下列先決條件：
+  AWS Glue 2 PySpark 任務 – 只有 AWS Glue 2 任務可以升級至 AWS Glue 5。
+  需要 IAM 許可才能開始分析、檢閱結果並升級您的任務。如需詳細資訊，請參閱以下 [許可](#auto-upgrade-permissions) 部分中的範例。
+  如果使用 AWS KMS 加密分析成品，則需要額外的 AWS AWS KMS 許可。如需詳細資訊，請參閱以下 [AWS KMS 政策](#auto-upgrade-kms-policy) 部分中的範例。

### 許可
<a name="auto-upgrade-permissions"></a>

#### 若要開始新的升級分析，需要下列許可：
<a name="collapsible-section-1"></a>

1.  使用以下許可來更新呼叫者的 IAM 政策：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "glue:StartJobUpgradeAnalysis",
                   "glue:StartJobRun",
                   "glue:GetJobRun",
                   "glue:GetJob",
                   "glue:BatchStopJobRun"
               ],
               "Resource": [
                   "arn:aws:glue:us-east-1:111122223333:job/jobName"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject"
               ],
               "Resource": [
              		 "arn:aws:s3:::amzn-s3-demo-bucket/script-location/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject",
                   "s3:GetObject"
               ],
               "Resource": [
               		"arn:aws:s3:::amzn-s3-demo-bucket/results/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "kms:Decrypt",
                   "kms:GenerateDataKey"
               ],
               "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-id"
           }
       ]
   }
   ```

------

1.  更新您要升級之任務的執行角色，以包含下列內嵌政策：

   ```
       {
         "Effect": "Allow",
         "Action": ["s3:GetObject"],    
         "Resource": [
           "ARN of the Amazon S3 path provided on API",
           "ARN of the Amazon S3 path provided on API/*"
         ]
       }
   ```

    例如，如果您使用的是 Amazon S3 路徑 `s3://amzn-s3-demo-bucket/upgraded-result`，則政策將為：

   ```
   {
         "Effect": "Allow",
         "Action": ["s3:GetObject"],
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-bucket/upgraded-result/",
           "arn:aws:s3:::amzn-s3-demo-bucket/upgraded-result/*"
         ]
       }
   ```

#### 若要擷取分析的詳細資訊，需要下列許可：
<a name="collapsible-section-2"></a>

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:GetJobUpgradeAnalysis"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:job/jobName"
      ]
    }
  ]
}
```

------

#### 若要停止進行中的分析，需要下列許可：
<a name="collapsible-section-3"></a>

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:StopJobUpgradeAnalysis",
        "glue:BatchStopJobRun"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:job/jobName"
      ]
    }
  ]
}
```

------

#### 若要列出在特定任務上提交的所有分析，需要下列許可：
<a name="collapsible-section-4"></a>

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:ListJobUpgradeAnalyses"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:job/jobName"
      ]
    }
  ]
}
```

------

#### 若要接受分析中的變更並升級任務，需要下列許可：
<a name="collapsible-section-5"></a>

### AWS KMS 政策
<a name="auto-upgrade-kms-policy"></a>

 若要在開始分析時傳遞您自己的自訂 AWS KMS 金鑰，請參閱下一節以設定 AWS KMS 金鑰的適當許可。

#### 使用 AWS KMS 金鑰設定結果成品加密：
<a name="w2aac37b7c20c13c13b5b5"></a>

 此政策可確保您在 AWS KMS 金鑰上同時擁有加密和解密許可。

```
{
    "Effect": "Allow",
    "Principal":{
        "AWS": "<IAM Customer caller ARN>"
    },
    "Action": [
      "kms:Decrypt",
      "kms:GenerateDataKey",
    ],
    "Resource": "<key-arn-passed-on-start-api>"
}
```

## 執行升級分析並套用升級指令碼
<a name="auto-upgrade-procedure"></a>

 可以執行升級分析，這會對您從**任務**檢視中選取的任務產生升級計劃。

1.  從**任務**中選取 AWS Glue 2.0 任務，然後從**動作**功能表中選擇**執行升級分析**。  
![\[螢幕擷取畫面會顯示動作功能表中的「使用 AI 來升級分析」。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/upgrade-analysis-run-action-menu.png)

1.  在該模型中，選取路徑，將產生的升級計畫存放在**結果路徑**中。這必須是您可以存取和寫入的 Amazon S3 儲存貯體。  
![\[螢幕擷取畫面顯示已完成的升級分析。用於套用升級指令碼的按鈕會顯示。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/upgrade-analysis-configuration-options.png)

1.  視需要設定下列其他選項：
   +  **執行組態** – 選用：執行組態是選用設定，可讓您自訂升級分析期間執行之驗證執行的各個層面。此組態用於執行已升級的指令碼，並可讓您選取運算環境屬性 (工作者類型、工作者數目等)。請注意，在檢閱、接受變更並將其套用至生產環境之前，應該使用非生產開發人員帳戶對範例資料集執行驗證。執行組態包含下列可自訂參數：
     + 工作者類型：可以指定要用於驗證執行的工作者類型，讓您可以根據您的需求選擇適當的運算資源。
     + 工作者數目：可以定義要為驗證執行佈建的工作者數目，讓您可以根據工作負載需求擴展資源。
     + 任務逾時 (以分鐘為單位)：此參數可讓您設定驗證執行的時間限制，確保任務在指定的持續時間後終止，以防止資源消耗過多。
     + 安全組態：可以設定安全設定，例如加密和存取控制，以確保在驗證執行期間保護您的資料和資源。
     + 其他任務參數：如有需要，可以新增任務參數，以進一步自訂驗證執行的執行環境。

      透過利用執行組態，可以量身打造驗證執行以符合您的特定需求。例如，可以設定驗證執行以使用較小的資料集，讓分析更快完成並最佳化成本。此方法可確保有效執行升級分析，同時將驗證階段的資源使用率和相關成本降至最低。
   +  **加密組態** – 選用：
     + **啟用升級成品加密**：在將資料寫入結果路徑時啟用靜態加密。如果不想加密升級成品，請取消勾選此選項。

1.  選擇**執行**以開始升級分析。分析執行時，可以在**升級分析**索引標籤中檢視結果。分析詳細資訊視窗會顯示關於分析的資訊，以及升級成品的連結。
   +  **結果路徑** – 這是存放結果摘要和升級指令碼的位置。
   +  **Amazon S3 中的已升級指令碼** – Amazon S3 中升級指令碼的位置。可以在套用升級之前檢視指令碼。
   +  **Amazon S3 中的升級摘要** – Amazon S3 中升級摘要的位置。可以在套用升級之前檢視升級摘要。

1.  當升級分析成功完成後，可以選擇**套用已升級的指令碼**來升級指令碼，以自動升級任務。

    套用後，Glue AWS 版本將更新為 4.0。可以在**指令碼**索引標籤中檢視新指令碼。  
![\[螢幕擷取畫面顯示已完成的升級分析。用於套用升級指令碼的按鈕會顯示。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/upgrade-analysis-analysis-details-preview.png)

## 了解升級摘要
<a name="auto-upgrade-analysis-summary"></a>

 此範例示範將 AWS Glue 任務從 2.0 版升級至 4.0 版的程序。範例任務會從 Amazon S3 儲存貯體中讀取產品資料，使用 Spark SQL 將數個轉換套用至資料，然後將轉換的結果儲存回 Amazon S3 儲存貯體。

### 原始程式碼 (AWS Glue 2.0) - 升級之前
<a name="w2aac37b7c20c21b5b1"></a>

```
from awsglue.transforms import *
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from pyspark.sql.types import *
from pyspark.sql.functions import *
from awsglue.job import Job
import json
from pyspark.sql.types import StructType

sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)

gdc_database = "s3://aws-glue-scripts-us-east-1-gamma/demo-database/"
schema_location = (
    "s3://aws-glue-scripts-us-east-1-gamma/DataFiles/"
)

products_schema_string = spark.read.text(
    f"{schema_location}schemas/products_schema"
).first()[0]

product_schema = StructType.fromJson(json.loads(products_schema_string))

products_source_df = (
    spark.read.option("header", "true")
    .schema(product_schema)
    .option(
        "path",
        f"{gdc_database}products/",
    )
    .csv(f"{gdc_database}products/")
)

products_source_df.show()
products_temp_view_name = "spark_upgrade_demo_product_view"
products_source_df.createOrReplaceTempView(products_temp_view_name)

query = f"select {products_temp_view_name}.*, format_string('%0$s-%0$s', category, subcategory) as unique_category from {products_temp_view_name}"
products_with_combination_df = spark.sql(query)
products_with_combination_df.show()

products_with_combination_df.createOrReplaceTempView(products_temp_view_name)
product_df_attribution = spark.sql(
    f"""
SELECT *,
unbase64(split(product_name, ' ')[0]) as product_name_decoded,
unbase64(split(unique_category, '-')[1]) as subcategory_decoded
FROM {products_temp_view_name}
"""
)
product_df_attribution.show()


product_df_attribution.write.mode("overwrite").option("header", "true").option(
    "path", f"{gdc_database}spark_upgrade_demo_product_agg/"
).saveAsTable("spark_upgrade_demo_product_agg", external=True)

spark_upgrade_demo_product_agg_table_df = spark.sql(
    f"SHOW TABLE EXTENDED in default like 'spark_upgrade_demo_product_agg'"
)
spark_upgrade_demo_product_agg_table_df.show()
job.commit()
```

### 新程式碼 (Glue 4.0) - 升級之後
<a name="upgrade-analysis-example-new-code-glue-4"></a>

```
from awsglue.transforms import *
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from pyspark.sql.types import *
from pyspark.sql.functions import *
from awsglue.job import Job
import json
from pyspark.sql.types import StructType

sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
# change 1
spark.conf.set("spark.sql.adaptive.enabled", "false")
# change 2
spark.conf.set("spark.sql.legacy.pathOptionBehavior.enabled", "true")
job = Job(glueContext)

gdc_database = "s3://aws-glue-scripts-us-east-1-gamma/demo-database/"
schema_location = (
    "s3://aws-glue-scripts-us-east-1-gamma/DataFiles/"
)

products_schema_string = spark.read.text(
    f"{schema_location}schemas/products_schema"
).first()[0]

product_schema = StructType.fromJson(json.loads(products_schema_string))

products_source_df = (
    spark.read.option("header", "true")
    .schema(product_schema)
    .option(
        "path",
        f"{gdc_database}products/",
    )
    .csv(f"{gdc_database}products/")
)

products_source_df.show()
products_temp_view_name = "spark_upgrade_demo_product_view"
products_source_df.createOrReplaceTempView(products_temp_view_name)

# change 3
query = f"select {products_temp_view_name}.*, format_string('%1$s-%1$s', category, subcategory) as unique_category from {products_temp_view_name}"
products_with_combination_df = spark.sql(query)
products_with_combination_df.show()

products_with_combination_df.createOrReplaceTempView(products_temp_view_name)
# change 4
product_df_attribution = spark.sql(
    f"""
SELECT *,
try_to_binary(split(product_name, ' ')[0], 'base64') as product_name_decoded,
try_to_binary(split(unique_category, '-')[1], 'base64') as subcategory_decoded
FROM {products_temp_view_name}
"""
)
product_df_attribution.show()


product_df_attribution.write.mode("overwrite").option("header", "true").option(
    "path", f"{gdc_database}spark_upgrade_demo_product_agg/"
).saveAsTable("spark_upgrade_demo_product_agg", external=True)

spark_upgrade_demo_product_agg_table_df = spark.sql(
    f"SHOW TABLE EXTENDED in default like 'spark_upgrade_demo_product_agg'"
)
spark_upgrade_demo_product_agg_table_df.show()
job.commit()
```

### 分析摘要的說明
<a name="upgrade-analysis-explanation-summary"></a>

![\[螢幕擷取畫面會顯示升級分析摘要。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/upgrade-analysis-explanation-summary.png)


 根據摘要，Glue AWS 提議了四種變更，以便成功將指令碼從 AWS Glue 2.0 升級到 AWS Glue 4.0：

1.  **Spark SQL 組態 (spark.sql.adaptive.enabled)**：此變更可還原應用程式行為，因為從 Spark 3.2 開始，針對 Spark SQL 適應性查詢執行推出了新功能。可以檢查此組態變更，並根據其偏好設定進一步啟用或停用其。

1.  **DataFrame API 變更**：該路徑選項不能與其他 DataFrameReader 操作共存，例如 `load()`。若要保留先前的行為， AWS Glue 已更新指令碼以新增新的 SQL 組態 **(spark.sql.legacy.pathOptionBehavior.enabled)**。

1.  **Spark SQL API 變更**：已更新 `format_string(strfmt, obj, ...)` 中的 `strfmt` 行為，不允許 `0$` 作為第一個引數。為了確保相容性， AWS Glue 已改為將指令碼修改為使用 `1$`做為第一個引數。

1.  **Spark SQL API 變更**：`unbase64` 函數不允許格式不正確的字串輸入。為了保留先前的行為， AWS Glue 已更新指令碼以使用 `try_to_binary`函數。

## 停止進行中的升級分析
<a name="auto-upgrade-stopping-analysis"></a>

 可以取消進行中的升級分析，或直接停止分析。

1.  選擇**升級分析**索引標籤。

1.  選取正在執行的任務，然後選擇**停止**。這將停止分析。然後，可以對相同的任務執行另一個升級分析。  
![\[螢幕擷取畫面會顯示已選取任務的升級分析索引標籤。任務仍在執行中。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/upgrade-analysis-tab.png)

## 考量事項
<a name="upgrade-analysis-considerations"></a>

 當您開始使用 Spark 升級時，需要考慮幾個重要層面，才能以最佳方式使用服務。
+  **服務範圍和限制**：目前版本著重於將 PySpark 程式碼從 AWS Glue 2.0 版升級至 5.0 版。目前，服務會處理不依賴其他程式庫相依性的 PySpark 程式碼。您可以在 AWS 帳戶中同時執行最多 10 個任務的自動升級，讓您有效率地升級多個任務，同時維持系統穩定性。
  +  僅支援 PySpark 任務。
  +  升級分析會在 24 小時後逾時。
  +  一個任務一次只能執行一個作用中的升級分析。在帳戶層級，最多可以同時執行 10 個作用中的升級分析。
+  在**升級程序期間最佳化成本**：由於 Spark 升級使用生成式 AI 透過多次反覆運算來驗證升級計畫，因此在帳戶中以 AWS Glue 任務身分執行每個反覆運算時，為了提高成本效益，最佳化驗證任務執行組態至關重要。若要達成此目的，建議您在開始升級分析時指定執行組態，如下所示：
  +  使用非生產開發人員帳戶，然後選取代表生產資料但大小較小的模擬資料集範例，以便使用 Spark 升級進行驗證。
  +  使用適當大小的運算資源，例如 G.1X 工作者，並選取適當數目的工作者來處理範例資料。
  +  適用時啟用 AWS Glue 任務自動調整規模，以根據工作負載自動調整資源。

   例如，如果您的生產任務使用 20 個 G.2X 工作者處理 TB 級資料，則可以將升級任務設定為使用 2 個 G.2X 工作者來處理 GB 級代表性資料，並啟用自動擴展以進行驗證。
+  **最佳實務**：強烈建議您使用非生產任務開始升級旅程。此方法可讓您熟悉升級工作流程，並了解服務如何處理不同類型的 Spark 程式碼模式。
+  **警示和通知**：針對任務使用生成式 AI 升級功能時，請確保已關閉失敗任務執行的警示/通知。在升級過程中，在提供升級成品之前，您的帳戶中最多可能會有 10 個失敗的任務執行。
+  **異常偵測規則**：關閉正在升級的任務中的任何異常偵測規則，因為在升級驗證進行期間，在中繼任務執行期間寫入到輸出資料夾的資料可能不是預期的格式。
+  **將升級分析與冪等任務搭配使用**：將升級分析與冪等任務搭配使用，以確保每次後續驗證任務執行嘗試都與前一個任務相似，並且不會遇到問題。冪等任務是可以使用相同輸入資料多次執行的任務，而且每次都會產生相同的輸出。在 Glue 中使用 Apache Spark AWS 的生成式 AI 升級時，服務會在驗證程序中執行任務的多個反覆運算。在每次反覆運算期間，其會變更您的 Spark 程式碼和組態，以驗證升級計畫。如果 Spark 任務不具冪等性，則使用相同的輸入資料多次執行其可能會導致問題。

## 支援的 區域
<a name="upgrade-analysis-supported-regions"></a>

Apache Spark 的生成式 AI 升級可在下列區域使用：
+ **亞太區域**：東京 (ap-northeast-1)、首爾 (ap-northeast-2)、孟買 (ap-south-1)、新加坡 (ap-southeast-1) 和雪梨 (ap-southeast-2)
+ **北美洲**：加拿大 (ca-central-1)
+ **歐洲**：法蘭克福 (eu-central-1)、斯德哥爾摩 (eu-north-1)、愛爾蘭 (eu-west-1)、倫敦 (eu-west-2) 和巴黎 (eu-west-3)
+ **南美洲**：聖保羅 (sa-east-1)
+ **美國**：北維吉尼亞 (us-east-1)、俄亥俄 (us-east-2) 和奧勒岡 (us-west-2)

## Spark 升級中的跨區域推論
<a name="w2aac37b7c20c37"></a>

 Spark 升級採用 技術 Amazon Bedrock ，並利用跨區域推論 (CRIS)。透過 CRIS，Spark 升級會自動選擇您所在地理位置內的最佳區域 (請參閱[此處](https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference.html)的詳細說明) 來處理您的推論請求，最大限度地利用可用的運算資源和模型可用性，以提供最佳的客戶體驗。使用跨區域推論無需額外付費。

 跨區域推論請求會保留在原始資料所在地理位置的 AWS 區域中。例如，在美國提出的請求會保留在美國的 AWS 區域內。雖然資料只會存放在主要區域中，但在使用跨區域推論時，您的輸入提示和輸出結果可能會移動到主要區域之外。所有資料都會透過 Amazon 的安全網路進行加密傳輸。

# 在 中使用 Spark 任務 AWS Glue
<a name="etl-jobs-section"></a>

提供 Spark ETL AWS Glue 任務的 資訊。

**Topics**
+ [在 Glue AWS 任務中使用任務參數](aws-glue-programming-etl-glue-arguments.md)
+ [AWS Glue Spark 和 PySpark 任務](spark_and_pyspark.md)
+ [AWS Glue 工作者類型](worker-types.md)
+ [在 AWS Glue 中串流 ETL 任務](add-job-streaming.md)
+ [記錄與 AWS Lake Formation FindMatches 相符](machine-learning.md)
+ [將 Apache Spark 程式遷移至 AWS Glue](glue-author-migrate-apache-spark.md)

# 在 Glue AWS 任務中使用任務參數
<a name="aws-glue-programming-etl-glue-arguments"></a>

建立 AWS Glue 任務時，您可以設定一些標準欄位，例如 `Role`和 `WorkerType`。您可以透過 `Argument` 欄位 (主控台中的**任務參數**) 提供其他組態資訊。在這些欄位中，您可以為 AWS Glue 任務提供本主題中列出的引數 （參數）。

 如需 AWS Glue 任務 API 的詳細資訊，請參閱 [任務](aws-glue-api-jobs-job.md)。

**注意**  
 任務引數的大小上限為 260 KB。如果引數大小大於 260 KB，驗證檢查將引發錯誤。



## 設定任務參數
<a name="w2aac37c11b8c11"></a>

您可以透過主控台在 **Job Parameters** (任務參數) 標題下的 **Job details** (任務詳細資訊) 索引標籤中設定任務。您也可以透過在任務`NonOverridableArguments`上設定 `DefaultArguments`或 ，或在任務執行`Arguments`上設定 AWS CLI 來設定任務。每次執行任務時，都會傳入任務上設定的引數，而在任務執行中設定的引數只會針對該個別執行傳入。

例如，下列是執行使用 `--arguments` 來設定任務參數之任務的語法。

```
$ aws glue start-job-run --job-name "CSV to CSV" --arguments='--scriptLocation="s3://my_glue/libraries/test_lib.py"'
```

## 存取任務參數
<a name="w2aac37c11b8c13"></a>

撰寫 AWS Glue 指令碼時，您可能想要存取任務參數值，以改變您自己的程式碼行為。我們提供協助程式方法來在我們的程式庫中執行此操作。這些方法會解析覆寫任務參數值的任務執行參數值。解析在多個位置設定的參數時，任務 `NonOverridableArguments` 會覆寫任務執行 `Arguments`，這將覆寫任務 `DefaultArguments`。

**在 Python 中：**

在 Python 任務中，我們提供了一個名為 `getResolvedParameters` 的函數。如需詳細資訊，請參閱[使用 `getResolvedOptions` 存取參數](aws-glue-api-crawler-pyspark-extensions-get-resolved-options.md)。任務參數可在 `sys.argv` 變數中使用。

**在 Scala 中：**

在 Scala 任務中，我們提供了一個名為 `GlueArgParser` 的物件。如需詳細資訊，請參閱[AWS Glue Scala GlueArgParser API](glue-etl-scala-apis-glue-util-glueargparser.md)。任務參數可在 `sysArgs` 變數中使用。

## 任務參數參考
<a name="job-parameter-reference"></a>

**AWS Glue 會辨識下列引數名稱，您可以用來設定任務和任務執行的指令碼環境：**

**`--additional-python-modules`**  
 以逗號分隔的清單，代表要安裝的一組 Python 套件。您可以從 PyPI 安裝套件或提供自訂發行版本。PyPI 套件項目的格式為 `package==version`，其中包含 PyPI 名稱和目標套件的版本。自訂發行版本項目是發行版本的 S3 路徑。  
項目使用 Python 版本比對來比對套件和版本。這意味著您將需要使用兩個等號，例如 `==`。還有其他版本的比對運算子，如需更多資訊，請參閱 [PEP 440](https://peps.python.org/pep-0440/#version-matching)。  
若要將模組安裝選項傳遞給 `pip3`，請使用 [--python-modules-installer-option](#python-modules-installer-option) 參數。

**`--auto-scale-within-microbatch`**  
預設值為 true。此參數只能用於 Glue AWS 串流任務，其會處理一系列微批次中的串流資料，且必須啟用自動擴展。將此值設定為 false 時，會運算已完成微型批次之批次處理持續時間的指數移動平均值，並將此值與間格大小進行比較，以判斷是縱向擴展執行器數目還是縮減其規模。只有在微型批次完成時才會進行擴展。將此值設定為 true 時，在微型批次期間，當 Spark 任務數量保持不變 30 秒，或目前的批次處理大於間格大小時，它會縱向擴展。如果執行器閒置超過 60 秒，或批次處理持續時間的指數移動平均值較低，則執行器數量將下降。

**`--class`**  
可作為您的 Scala 指令碼進入點的 Scala 類別。這只在您的 `--job-language` 設為 `scala` 才適用。

**`--continuous-log-conversionPattern`**  
為啟用連續記錄的任務指定自訂轉換日誌模式。轉換模式僅適用於驅動程式日誌和執行程式日誌。它不會影響 AWS Glue 進度列。

**`--continuous-log-logGroup`**  
為啟用連續記錄的任務指定自訂 Amazon CloudWatch 日誌群組名稱。

**`--continuous-log-logStreamPrefix`**  
 為啟用連續記錄的任務指定自訂 CloudWatch 日誌串流字首。

**`--customer-driver-env-vars` 和 `--customer-executor-env-vars`**  
這些參數會分別針對每個工作者 (驅動程式或執行器) 在作業系統上設定環境變數。您可以在 Glue AWS 上建置平台和自訂架構時使用這些參數，讓使用者在上面撰寫任務。啟用這兩個旗標可讓您分別在驅動程式和執行器上設定不同的環境變數，而不必在任務指令碼本身中注入相同邏輯。  
**範例使用方式**  
以下是使用這些參數的範例：

```
"—customer-driver-env-vars", "CUSTOMER_KEY1=VAL1,CUSTOMER_KEY2=\"val2,val2 val2\"",
"—customer-executor-env-vars", "CUSTOMER_KEY3=VAL3,KEY4=VAL4"
```
在任務執行引數中設定這些參數相當於執行下列命令：  
在驅動程式中：  
+ export CUSTOMER\$1KEY1=VAL1
+ export CUSTOMER\$1KEY2="val2,val2 val2"
在執行器中：  
+ export CUSTOMER\$1KEY3=VAL3
然後，在任務指令碼本身中，您可以使用 `os.environ.get("CUSTOMER_KEY1")` 或 `System.getenv("CUSTOMER_KEY1")` 擷取環境變數。  
**強制執行的語法**  
定義環境變數時，遵循下列標準：
+ 每個金鑰都必須具有 `CUSTOMER_ prefix`。

  例如：對於 `"CUSTOMER_KEY3=VAL3,KEY4=VAL4"`，`KEY4=VAL4` 將被忽略且未設定。
+ 每個金鑰和值對都必須以單一逗號表示。

  例如：`"CUSTOMER_KEY3=VAL3,CUSTOMER_KEY4=VAL4"`
+ 如果「值」有空格或逗號，則必須在引號內定義。

  例如：`CUSTOMER_KEY2=\"val2,val2 val2\"`
此語法緊密模擬設定 bash 環境變數的標準。

**`--datalake-formats` **  
Glue 3.0 AWS 及更新版本支援。  
指定要使用的資料湖架構。 AWS Glue 會將您指定的架構所需的 JAR 檔案新增至 `classpath`。如需詳細資訊，請參閱[搭配 AWS Glue ETL 任務使用資料湖架構](aws-glue-programming-etl-datalake-native-frameworks.md)。  
您可以指定以下一或多個值，以逗號分隔：  
+ `hudi`
+ `delta`
+ `iceberg`
例如，傳遞下列引數來指定所有三個架構。  

```
'--datalake-formats': 'hudi,delta,iceberg'
```

**`--disable-proxy-v2`**  
 停用服務代理，以允許透過 VPC 對來自指令碼的 Amazon S3、CloudWatch 和 AWS Glue 進行 AWS 服務呼叫。如需詳細資訊，請參閱[設定 AWS 呼叫通過您的 VPC](https://docs.aws.amazon.com/glue/latest/dg/connection-VPC-disable-proxy.html)。若要停用服務代理，請將此參數的值設定為 `true`。

**`--enable-auto-scaling`**  
將此值設定為 `true` 時，開啟自動擴展和按每名工作者計費。

**`--enable-continuous-cloudwatch-log`**  
啟用 Glue AWS 任務的即時連續記錄。您可以在 CloudWatch 中檢視即時 Apache Spark 任務日誌。

**`--enable-continuous-log-filter`**  
當您建立或編輯已啟用持續記錄的任務時，指定標準篩選條件 (`true`) 或無篩選條件 (`false`)。選擇標準篩選條件可剔除無用的 Apache Spark 驅動程式/執行器，以及 Apache Hadoop YARN 活動訊號日誌訊息。選擇無篩選條件可讓您獲得所有日誌訊息。

**`--enable-glue-datacatalog`**  
可讓您使用 AWS Glue Data Catalog 做為 Apache Spark Hive 中繼存放區。若要啟用此功能，請將此值設定為 `true`。

**`--enable-job-insights`**  
使用 Glue AWS 任務執行洞見啟用額外的錯誤分析監控。如需詳細資訊，請參閱[使用 AWS Glue 任務執行洞察進行監控](monitor-job-insights.md)。依預設，此值設定為 `true` 並啟用任務執行見解。  
此選項適用於 AWS Glue 2.0 和 3.0 版。

**`--enable-lakeformation-fine-grained-access`**  
啟用 Glue AWS 任務的精細存取控制。如需詳細資訊，請參閱[搭配 AWS 使用 Glue AWS Lake Formation 進行精細存取控制](security-lf-enable.md)。

**`--enable-metrics`**  
針對此任務執行啟用任務分析的指標集合。這些指標可在 AWS Glue 主控台和 Amazon CloudWatch 主控台上取得。此參數的值不相關。若要啟用此功能，您可為此參數提供任何值，但為了確保清晰明瞭，建議您使用 `true`。若要停用此功能，請從任務組態中移除此參數。

**`--enable-observability-metrics`**  
 啟用一組可觀測性指標，以針對 Glue AWS 主控台和 Amazon CloudWatch 主控台下在任務執行監控頁面上執行的每個任務產生洞見。若要啟用此功能，請將此參數值設定為 true。若要停用此功能，請將其設為 `false` 或從作業組態中移除此參數。

**`--enable-rename-algorithm-v2`**  
將 EMRFS 重新命名演算法版本設定為第 2 版。當 Spark 任務使用動態分割區覆寫模式時，有可能會建立重複的分割區。例如，您最終可能會得到一個重複的分割區，例如 `s3://bucket/table/location/p1=1/p1=1`。在這裡，P1 是被覆寫的分割區。重新命名演算法版本 2 會修正此問題。  
此選項僅適用於 AWS Glue 1.0 版。

**`--enable-s3-parquet-optimized-committer`**  
啟用 EMRFS S3 最佳化遞交者，以將 Parquet 資料寫入 Amazon S3。您可以在建立或更新 AWS Glue 任務時，透過 Glue AWS 主控台提供參數/值對。將值設為 **true** 以啟用遞交者。根據預設， 標記會在 AWS Glue 3.0 中開啟，並在 AWS Glue 2.0 中關閉。  
如需詳細資訊，請參閱[使用 EMRFS S3 最佳化遞交者](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-s3-optimized-committer.html)。

**`--enable-spark-ui`**  
設定為 時`true`，開啟 功能以使用 Spark UI 來監控和偵錯 AWS Glue ETL 任務。

**`--executor-cores`**  
可以平行執行的 Spark 任務數量。Glue AWS 3.0\$1 支援此選項。該值不應超過工作者類型上 vCPU 數目的 2 倍，即分別為 `G.1X` 上 8 個、`G.2X` 上 16 個、`G.4X` 上 32 個、`G.8X` 上 64 個、`G.12X` 上 96 個、`G.16X` 上 128 個和 `R.1X` 上 8 個、`R.2X` 上 16 個、`R.4X` 上 32 個、`R.8X` 上 64 個。更新此組態時應小心，這可能會影響任務效能，因為增加任務平行處理會導致記憶體和磁碟壓力，並且可能會對來源和目標系統限流 (例如：它會在 Amazon RDS 上造成更多並行連線)。

**`--extra-files`**  
組態檔案等其他檔案的 Amazon S3 路徑；在系統執行您的指令碼前， AWS Glue 即會將其複製到驅動程式節點上指令碼的工作型錄。多個值必須是以英文逗號 (`,`) 分隔的完整路徑。值可以是個別檔案或型錄位置。Python Shell 任務類型不支援此選項。

**`--extra-jars`**  
 AWS Glue 複製到驅動程式和執行器的其他檔案的 Amazon S3 路徑。在執行指令碼之前， AWS Glue 也會將這些檔案新增至 Java classpath。多個值必須是以英文逗號 (`,`) 分隔的完整路徑。延伸模組不需要是 `.jar`

**`--extra-py-files`**  
執行指令碼之前， Glue 新增至驅動程式節點上 Python 路徑的其他 Python AWS 模組的 Amazon S3 路徑。多個值必須是以英文逗號 (`,`) 分隔的完整路徑。僅支援個別檔案路徑，而非目錄路徑。

**`--job-bookmark-option`**  
控制任務書籤的行為。可設定以下選項值：    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html)
例如，若要啟用任務書籤，請傳遞以下參數：  

```
'--job-bookmark-option': 'job-bookmark-enable'
```

**`--job-language`**  
指令碼程式設計語言。此值必須為 `scala` 或 `python`。如果此參數不存在，則預設值為 `python`。

**`--python-modules-installer-option`**  
使用 [--additional-python-modules](#additional-python-modules) 安裝模組時，針對要傳送到 `pip3` 的選項給予定義的純文字字串。以您在命令列中執行的相同方式提供選項，以空格分隔各項，並在前方加上英文破折號。如需使用方面的詳細資訊，請參閱 [在 AWS Glue 2.0 或更新版本中使用 pip 安裝其他 Python 模組](aws-glue-programming-python-libraries.md#addl-python-modules-support)。  
當您使用 Python AWS 3.9 時，Glue 任務不支援此選項。

**`--scriptLocation`**  
ETL 指令碼所在的 Amazon Simple Storage Service (Amazon S3) 位置 (格式是 `s3://path/to/my/script.py`)。此參數會覆寫在 `JobCommand` 物件中設定的指令碼位置。

**`--spark-event-logs-path`**  
指定 Amazon S3 路徑。使用 Spark UI 監控功能時， AWS Glue 會每隔 30 秒將此 Amazon S3 路徑的 Spark 事件日誌排清到儲存貯體，該儲存貯體可用作存放 Spark UI 事件的暫時目錄。

**`--TempDir`**  
指定儲存貯體的 Amazon S3 路徑做為任務的暫時目錄。  
例如，若要設定臨時目錄，請傳遞以下引數：  

```
'--TempDir': 's3-path-to-directory'
```
AWS 如果儲存貯體不存在於區域中，Glue 會為任務建立暫存儲存貯體。此儲存貯體可能允許公開存取。您可以修改 Amazon S3 中的儲存貯體以設定的公有存取封鎖，或稍後在該區域的所有任務完成後刪除儲存貯體。

**`--use-postgres-driver`**  
將此值設定為 `true`，即會在類別路徑中優先考慮 Postgres JDBC 驅動程式，以避免與 Amazon Redshift JDBC 驅動程式發生衝突。此選項僅適用於 AWS Glue 2.0 版。

**`--user-jars-first`**  
將此值設定為 `true`，即會在 classpath 中優先考慮客戶的額外 JAR 檔案。此選項僅適用於 AWS Glue 2.0 版或更新版本。

**`--conf`**  
控制 Spark 組態參數。適用於進階使用案例。

**`--encryption-type`**  
舊參數。應使用安全組態設定對應的行為。如需有關安全組態的詳細資訊，請參閱 [加密 寫入的資料 AWS Glue](encryption-security-configuration.md)。

AWS Glue 會在內部使用下列引數，您不應該使用它們：
+ `--debug` — Glue AWS 內部。請勿設定。
+ `--mode` — Glue AWS 內部。請勿設定。
+ `--JOB_NAME` — Glue AWS 內部。請勿設定。
+ `--endpoint` — Glue AWS 內部。請勿設定。



## 
<a name="w2aac37c11b8c17"></a>

 AWS Glue 支援使用 Python `site`模組引導環境`sitecustomize`，以執行網站特定的自訂。建議僅為進階使用案例啟動您自己的初始化函數，並在 Glue 4.0 AWS 上盡力支援。

 環境變數字首 `GLUE_CUSTOMER` 會保留供客戶使用。

# AWS Glue Spark 和 PySpark 任務
<a name="spark_and_pyspark"></a>

AWS Glue 支援 Spark 和 PySpark 任務。Spark 任務是在 管理的 Apache Spark 環境中執行 AWS Glue。它會分批次處理資料。串流 ETL 任務類似 Spark 任務，不同之處在於它會在資料串流上執行 ETL。它使用 Apache Spark 結構化串流框架。某些 Spark 任務功能不適用於串流 ETL 任務。

下列各節提供 AWS Glue Spark 和 PySpark 任務的相關資訊。

**Topics**
+ [在 中設定 Spark 任務的任務屬性 AWS Glue](add-job.md)
+ [編輯 AWS Glue 主控台中的 Spark 指令碼](edit-script-spark.md)
+ [任務 (舊版)](console-edit-script.md)
+ [使用任務書籤追蹤處理的資料](monitor-continuations.md)
+ [儲存 Spark 隨機資料](monitor-spark-shuffle-manager.md)
+ [監控 AWS Glue Spark 任務](monitor-spark.md)
+ [Glue 中 Apache Spark 的生成式 AI AWS 疑難排解](troubleshoot-spark.md)
+ [搭配 Glue AWS 使用具體化視觀表](materialized-views.md)

# 在 中設定 Spark 任務的任務屬性 AWS Glue
<a name="add-job"></a>

當您在 AWS Glue 主控台上定義任務時，您可以為屬性提供值，以控制 AWS Glue 執行時間環境。

## 定義 Spark 任務的任務屬性
<a name="create-job"></a>

以下清單說明 Spark 任務的屬性。如需了解 Python shell 任務的屬性，請參閱 [為 Python shell 任務定義任務屬性](add-job-python.md#create-job-python-properties)。如需了解串流 ETL 任務的屬性，請參閱 [定義串流 ETL 任務的任務屬性](add-job-streaming.md#create-job-streaming-properties)。

這些屬性會依在 AWS Glue 主控台上**新增任務**精靈上顯示的順序列出。

**名稱**  
提供長度上限為 255 個字元的 UTF-8 字串。

**Description**  
提供最多 2,048 個字元的選用描述。

**IAM 角色**  
指定 IAM 角色以授權使用執行工作和存取資料存放區所需的資源。如需在 中執行任務之許可的詳細資訊 AWS Glue，請參閱 [Glue AWS 的身分和存取管理](security-iam.md)。

**Type**  
ETL 任務的類型。這是根據您選取的資料來源類型自動設定的。  
+ **Spark** 使用任務命令 `glueetl` 執行​ Apache Spark ETL 指令碼。
+ **Spark 串流**使用任務命令 `gluestreaming` 執行​ Apache Spark 串流 ETL 指令碼。如需詳細資訊，請參閱[在 AWS Glue 中串流 ETL 任務](add-job-streaming.md)。
+ **Python Shell**​ 使用任務命令 `pythonshell` 執行 Python 指令碼。如需詳細資訊，請參閱[在 AWS Glue 中設定 Python Shell 任務的任務屬性](add-job-python.md)。

**AWS Glue 版本**  
AWS Glue 版本會決定任務可用的 Apache Spark 和 Python 版本，如下表所示。      
<a name="table-glue-versions"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/add-job.html)

**Language**  
ETL 指令碼中的程式碼定義了任務的邏輯。指令碼可在 Python 或 Scala 中編寫。您可以選擇任務執行的指令碼是由 產生 AWS Glue 或由您提供。您可以在 Amazon Simple Storage Service (Amazon S3) 中提供指令碼名稱和位置。請確認路徑中沒有跟指令碼目錄名稱相同的檔案。若要進一步了解如何編寫指令碼，請參閱 [AWS Glue 程式設計指南](edit-script.md)。

**工作者類型**  
可使用以下工作者類型：  
 AWS Glue 工作者可用的資源是以 DPUs測量。DPU 是處理能力的相對測量，包含 4 個 vCPUs的運算容量和 16 GB 的記憶體。  
+ **G.025X** – 選擇這種類型時，您也要提供 **工作者數目** 的值。每個工作者都會映射到 0.25 個 DPU (2 個 vCPU、4 GB 記憶體)，外加 84 GB 磁碟 (大約 34 GB 可用)。我們建議低容量串流任務採用這種工作者類型。此工作者類型僅適用於 3.0 AWS Glue 版或更新版本的串流任務。
+ **G.1X** – 選擇這種類型時，您也要提供 **工作者數目** 的值。每個工作者映射到 1 個 DPU (4 個 vCPUs，16 GB 記憶體），其中包含 94GB 磁碟 （大約 44GB 可用）。我們建議將此工作者類型用於資料轉換、聯結和查詢等工作負載，以提供可擴展且符合成本效益的方式來執行大部分任務。
+ **G.2X** – 選擇這種類型時，您也要提供 **工作者數目** 的值。每個工作者映射到 2 個 DPU (8 個 vCPUs，32 GB 記憶體） 和 138GB 磁碟 （大約 78GB 可用）。我們建議將此工作者類型用於資料轉換、聯結和查詢等工作負載，以提供可擴展且符合成本效益的方式來執行大部分任務。
+ **G.4X** – 選擇這種類型時，您也要提供 **工作者數目** 的值。每個工作者映射到 4 個 DPU (16 個 vCPUs，64 GB 記憶體） 和 256GB 磁碟 （大約 230GB 可用）。我們建議工作負載包含最嚴苛轉換、彙總、聯結和查詢的任務採用這種工作者類型。
+ **G.8X** – 選擇這種類型時，您也要提供 **工作者數目** 的值。每個工作者映射到 8 個 DPU (32 個 vCPUs，128 GB 記憶體） 和 512GB 磁碟 （大約 485GB 可用）。我們建議工作負載包含最嚴苛轉換、彙總、聯結和查詢的任務採用這種工作者類型。
+ **G.12X** – 選擇這種類型時，您也要提供 **工作者數目** 的值。每個工作者映射到 12 個 DPU (48 個 vCPUs，192 GB 記憶體） 和 768GB 磁碟 （大約 741GB 可用）。對於具有需要大量運算容量且資源密集的大型工作負載任務，我們建議使用此工作者類型。
+ **G.16X** – 選擇這種類型時，您也要提供 **工作者數目** 的值。每個工作者映射到 16 個 DPU (64 個 vCPUs，256 GB 記憶體） 和 1024GB 磁碟 （大約 996GB 可用）。對於具有需要最大運算容量的最大且資源最密集的工作負載的任務，我們建議使用此工作者類型。
+ **R.1X** – 選擇這種類型時，您也要提供 **工作者數目** 的值。每個工作者都會映射到 1 個具有記憶體最佳化組態的 DPU。對於經常遇到記憶體不足錯誤或需要高記憶體與 CPU 比率的記憶體密集型工作負載，建議使用此工作者類型。
+ **R.2X** – 選擇這種類型時，您也要提供 **工作者數目** 的值。每個工作者都會映射到 2 個具有記憶體最佳化組態的 DPU。對於經常遇到記憶體不足錯誤或需要高記憶體與 CPU 比率的記憶體密集型工作負載，建議使用此工作者類型。
+ **R.4X** – 選擇這種類型時，您也要提供 **工作者數目** 的值。每個工作者都會映射到 4 個具有記憶體最佳化組態的 DPU。對於經常遇到記憶體不足錯誤或需要高記憶體與 CPU 比率的大型記憶體密集型工作負載，建議使用此工作者類型。
+ **R.8X** – 選擇這種類型時，您也要提供 **工作者數目** 的值。每個工作者都會映射到 8 個具有記憶體最佳化組態的 DPU。對於經常遇到記憶體不足錯誤或需要高記憶體與 CPU 比率的超大型記憶體密集型工作負載，建議使用此工作者類型。
**工作者類型規格**  
下表提供了所有可用 G 工作者類型的詳細規格：    
**G 工作者類型規格**    
<a name="table-worker-specifications"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/add-job.html)
**重要：**G.12X 和 G.16X 工作者類型以及所有 R 工作者類型 (R.1X 到 R.8X) 具有更高的啟動延遲。  
我們會根據您執行 ETL 任務所使用的 DPU 數量，以小時費率計費。如需詳細資訊，請參閱 [AWS Glue 定價頁面](https://aws.amazon.com/glue/pricing/)。  
對於 1.0 版或更早 AWS Glue 版本的任務，當您使用主控台設定任務並指定**標準****工作者類型**時，會設定**最大容量**，且**工作者數量**會變成**最大容量** - 1 的值。如果您使用 AWS Command Line Interface (AWS CLI) 或 AWS SDK，您可以指定**最大容量**參數，也可以同時指定**工作者類型**和**工作者數量**。  
對於 2.0 AWS Glue 版或更新版本的任務，您無法指定**最大容量**。反之，您必須指定 **Worker type (工作者類型)** 與 **Number of workers (工作者數目)**。  
**G.4X** 和 **G.8X** 工作者類型僅適用於下列 AWS 區域中的 3.0 AWS Glue 版或更新版本 Spark ETL 任務：美國東部 （俄亥俄）、美國東部 （維吉尼亞北部）、美國西部 （加利佛尼亞北部）、美國西部 （奧勒岡）、亞太區域 （孟買）、亞太區域 （首爾）、亞太區域 （新加坡）、亞太區域 （雪梨）、亞太區域 （東京）、加拿大 （中部）、歐洲 （法蘭克福）、歐洲 （愛爾蘭）、歐洲 （倫敦）、歐洲 （西班牙）、歐洲 （斯德哥爾摩） 和南美洲 （聖保羅）。  
**G.12X**、 和 **R.1X** 透過**R.8X**工作者類型僅適用於下列 AWS 區域中的 4.0 AWS Glue 版或更新版本 Spark ETL 任務：美國東部 （維吉尼亞北部）**G.16X**、美國西部 （奧勒岡）、美國東部 （俄亥俄）、歐洲 （愛爾蘭） 和歐洲 （法蘭克福）。未來版本將支援其他區域。

**請求的工作者數目**  
對於大多數工作者類型，您必須指定任務時執行所分配的工作者數目。

**工作書籤**  
指定任務執行時 AWS Glue 處理狀態資訊的方式。您可以讓任務書籤記住之前處理過的資料、更新狀態資訊，或是忽略狀態資訊。如需詳細資訊，請參閱[使用任務書籤追蹤處理的資料](monitor-continuations.md)。

**任務執行佇列**  
指定任務執行是否在稍後因服務配額而無法立即執行時排入佇列。  
核取時，會為任務執行啟用任務執行佇列。如果未填入，系統不會考慮將任務執行排入佇列。  
如果此設定與任務執行中設定的值不相符，則會使用任務執行欄位中的值。

**Flex 執行**  
當您使用 AWS Studio 或 API 設定任務時，您可以指定標準或彈性任務執行類別。您的任務可能具有不同程度的優先順序和時間敏感度。標準執行類別非常適合需要快速的任務啟動和專用資源的時間敏感型工作負載。  
彈性執行類別適用於非緊急任務，例如生產前任務、測試和一次性資料載入。使用 3.0 AWS Glue 版或更新版本和 `G.1X` 或 `G.2X` 工作者類型的任務支援彈性任務執行。新的工作者類型 (`G.12X`、`G.16X` 和 `R.1X` 至 `R.8X`) 不支援彈性執行。  

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/FnHCoTuDLXU/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/FnHCoTuDLXU)

彈性任務執行基於在任何時間點執行的工作者數目計費。針對執行中的彈性任務執行，可新增或移除工作者數目。計費方式不是簡單的 `Max Capacity` \$1 `Execution Time`，每個工作者都會計入任務執行期間的時間。計費為 (`Number of DPUs per worker` \$1 `time each worker ran`) 的總和。  
如需詳細資訊，請參閱 AWS Studio 中的說明面板，或 [任務](aws-glue-api-jobs-job.md)和 [任務執行](aws-glue-api-jobs-runs.md)。

**重試次數**  
指定 AWS Glue 在任務失敗時自動重新啟動任務的次數，從 0 到 10。達到逾時限制的任務不會重新啟動。

**任務逾時**  
設定執行時間上限 (單位為分鐘)。上限為 7 天或 10,080 分鐘。否則，任務會擲回例外狀況。  
在值保留空白時，逾時預設為 2,880 分鐘。  
逾時值大於 7 天的任何現有 AWS Glue 任務將預設為 7 天。例如，如果您為批次任務指定了 20 天的逾時，則會在第 7 天停止。  
**任務逾時的最佳實務**  
任務會根據執行時間計費。為了避免意外費用，請設定適合您任務預期執行時間的逾時值。

**進階屬性**    
**指令碼檔案名稱**  
您的任務的唯一指令碼名稱。無法命名為**未命名任務**。  
**指令碼路徑**  
指令碼的 Amazon S3 位置。該路徑的格式必須是 `s3://bucket/prefix/path/`。其必須以斜線 (`/`) 結尾，且不包含任何檔案。  
**任務指標**  
當此任務執行時，開啟或關閉建立 Amazon CloudWatch 指標。若要檢視分析資料，您必須啟用此選項。如需如何開啟和視覺化呈現指標的詳細資訊，請參閱[任務監控與偵錯](monitor-profile-glue-job-cloudwatch-metrics.md)。  
**任務可觀測性指標**  
在此任務執行時，開啟建立其他可觀測性 CloudWatch 指標。如需詳細資訊，請參閱[使用 AWS Glue 可觀測性指標進行監控](monitor-observability.md)。  
**連續記錄**  
開啟連續記錄到 Amazon CloudWatch。如果未啟用此選項，則只有在任務完成後才能使用日誌。如需詳細資訊，請參閱 [記錄 AWS Glue 任務](monitor-continuous-logging.md)。  
**Spark 使用者介面**  
啟用 Spark UI 來監控此任務。如需詳細資訊，請參閱[為 AWS Glue 任務啟用 Apache Spark web UI](monitor-spark-ui-jobs.md)。  
**Spark UI 日誌路徑**  
啟用 Spark UI 時寫入日誌的路徑。  
**Spark UI 記錄和監控組態**  
請選擇下列其中一個選項：  
+ *標準*：使用 AWS Glue 任務執行 ID 做為檔案名稱寫入日誌。在 AWS Glue 主控台中開啟 Spark UI 監控。
+ *舊版*：使用 'spark-application-\$1timestamp\$1' 作為檔案名稱寫入日誌。請勿開啟 Spark UI 監控。
+ *標準和舊版*：將日誌同時寫入標準和舊版位置。在 AWS Glue 主控台中開啟 Spark UI 監控。  
**並行上限**  
設定此任務允許並行執行的最大數量。預設為 1。達到此閾值時，會傳回錯誤。可指定的最大值由服務限制來控制。例如，新的執行個體啟動時，如果有先前的任務仍在執行，您可能會想要傳回錯誤，以防相同任務的兩個執行個體同時執行。  
**暫時路徑**  
提供工作目錄在 Amazon S3 中的位置，其中暫時性中繼結果會在 AWS Glue 執行指令碼時寫入。請確認路徑中沒有跟暫時目錄名稱相同的檔案。當 AWS Glue 讀取和寫入 Amazon Redshift 和特定 AWS Glue 轉換時，會使用此目錄。  
AWS Glue 如果儲存貯體尚未存在於區域中， 會為任務建立暫時儲存貯體。此儲存貯體可能允許公開存取。您可以修改 Amazon S3 中的儲存貯體以設定的公有存取封鎖，或稍後在該區域的所有任務完成後刪除儲存貯體。  
**延遲通知閾值 (分鐘)**  
設定傳送延遲通知之前所要經過的時間閾值 (以分鐘為單位)。您可以設定這個閾值，以在 `RUNNING`、`STARTING` 或 `STOPPING` 任務執行所花的時間超過預期分鐘數時傳送通知。  
**安全組態**  
從清單中選擇安全組態。安全設定指定在 Amazon S3 目標上如何加密資料：不加密、使用 AWS KMS受管金鑰 (SSE-KMS) 或 Amazon S3 管理的加密金鑰 (SSE-S3) 進行伺服器端加密。  
**伺服器端加密**  
如果您選擇此選項，則 ETL 任務寫入 Amazon S3 時，資料會在靜態時加密 (使用 SSE-S3 加密)。您的 Amazon S3 資料目標和寫入 Amazon S3 暫時目錄的任何資料都會加密。系統會以任務參數的形式傳遞此選項。如需詳細資訊，請參閱 *Amazon Simple Storage Service 使用者指南*中的[透過 Amazon S3 受管加密金鑰 (SSE-S3) 使用伺服器端加密來保護資料](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html)。  
如果指定安全組態，則會忽略此選項。  
**使用 Glue 資料目錄做為 Hive 中繼存放區**  
選取 以使用 AWS Glue Data Catalog 做為 Hive 中繼存放區。此任務所用的 IAM 角色必須具有 `glue:CreateDatabase` 許可。稱為「預設」的資料庫隨即在 Data Catalog 中建立 (如當時該資料庫尚未存在)。

**連線**  
選擇 VPC 組態，以存取位於虛擬私有雲端 (VPC) 中的 Amazon S3 資料來源。您可以在 AWS Glue中建立和管理網路連線。如需詳細資訊，請參閱[連線至資料](glue-connections.md)。

**Libraries (程式庫)**    
**Python 程式庫路徑，相依的 JAR 路徑和參考檔案路徑**  
如果您的指令碼需要這些選項，請進行指定。定義此任務時，您可以為這些選項定義以逗號分隔的 Amazon S3 路徑。執行任務時，您可以覆寫這些路徑。如需詳細資訊，請參閱[提供您的自訂指令碼](console-custom-created.md)。  
**工作參數**  
一組金鑰/值對，會以具名參數的形式傳遞至指令碼。這些是指令碼執行時使用的預設值，但您可以在觸發時或在執行任務階段覆寫。您必須在索引鍵名稱前加上 `--`；例如：`--myKey`。使用 時，您會傳遞任務參數做為映射 AWS Command Line Interface。  
如需範例，請參閱 [在 AWS Glue 中傳遞和存取 Python 參數](aws-glue-programming-python-calling.md#aws-glue-programming-python-calling-parameters) 的 Python 參數。  
**Tags (標籤)**  
使用 **Tag key (標籤金鑰)** 和選用的 **Tag value (標籤值)**，標記您的任務。標籤鍵在建立後，將是唯讀狀態。應用標籤至某些資源，有助於您對其進行整理和識別。如需詳細資訊，請參閱[AWS 中的標籤 AWS Glue](monitor-tags.md)。

## 存取 Lake Formation 受管資料表任務的限制
<a name="lf-table-restrictions"></a>

建立從 讀取或寫入由 管理之資料表的任務時，請記住下列注意事項和限制 AWS Lake Formation：
+ 使用儲存格層級篩選條件存取資料表的任務不支援下列功能：
  + [任務書籤](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuations.html)和[限制執行](https://docs.aws.amazon.com/glue/latest/dg/bounded-execution.html)
  + [Push-down 述詞](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html#aws-glue-programming-etl-partitions-pushdowns)
  + [伺服器端類別目錄分割述詞](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html#aws-glue-programming-etl-partitions-cat-predicates)
  + [enableUpdateCatalog](https://docs.aws.amazon.com/glue/latest/dg/update-from-job.html)

# 編輯 AWS Glue 主控台中的 Spark 指令碼
<a name="edit-script-spark"></a>

指令碼包含從來源擷取資料、轉換資料的程式碼，並將其載入到 target。 會在啟動任務時 AWS Glue 執行指令碼。

AWS Glue ETL 指令碼可以在 Python 或 Scala 中進行程式碼編寫。Python 指令碼使用了 PySpark Python 分支的延伸語言，適用於擷取、轉換和載入 (ETL) 任務。此指令碼包含了*延伸的架構*，來處理 ETL 的轉換作業。當您針對任務自動產生原始程式碼邏輯時，指令碼也會隨之產生。您可以編輯這個指令碼，也可以提供自己的指令碼來處理您的 ETL 任務。

 如需有關在 AWS Glue 中定義和編輯指令碼的資訊，請參閱 [AWS Glue 程式設計指南](edit-script.md)。

## 其他程式庫或檔案
<a name="w2aac37c11c12c13b9"></a>

如果指令碼需要其他程式庫或檔案，您可加以指定，如下所示：

**Python 程式庫路徑**  
以逗號分隔的 Amazon Simple Storage Service (Amazon S3) 路徑，連接至您指令碼所需的 Python 程式庫。  
只能使用純 Python 程式庫。目前尚未支援使用 C 延伸模組的程式庫 (例如 pandas Python 資料分析程式庫)。

**相依 jar 路徑**  
以逗號分隔的 Amazon S3 路徑，連接至指令碼所需的 JAR 檔案。  
目前只有純 Java 或 Scala (2.11) 程式庫才可使用。

**參考檔案路徑**  
以逗號分隔的 Amazon S3 路徑，連接至指令碼所需的其他檔案 (例如組態檔案)。

# 任務 (舊版)
<a name="console-edit-script"></a>

指令碼包含執行擷取、轉換和載入 (ETL) 任務的程式碼。您可以提供自己的指令碼，或者 AWS Glue 可依照您的指引產生指令碼。如需編寫自己專用指令碼的詳細資訊，請參閱[提供您的自訂指令碼](console-custom-created.md)。

您可以在 AWS Glue 主控台編輯指令碼。編輯指令碼時，您可以新增來源、目標和轉換。

**編輯指令碼**

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue主控台。接著選擇 **Jobs** (任務) 索引標籤。

1. 在清單中選擇任務，然後選擇 **Action**, **Edit script** (動作，編輯指令碼) 以開啟指令碼編輯器。

   您也可以從任務詳細資訊頁面存取指令碼編輯器。選擇 **Script (指令碼)** 索引標籤，接著選擇 **Edit script (編輯指令碼)**。

   

## 指令碼編輯器
<a name="console-edit-script-editor"></a>

AWS Glue 指令碼編輯器可讓您插入、修改、刪除指令碼中的來源、目標和轉換。指令碼編輯器會顯示指令碼以及圖表，協助您將資料流程視覺化。

要建立指令碼的圖表，請選擇 **Generate diagram (產生圖表)**。AWS Glue 在指令碼中使用以 **\$1\$1** 開頭的註釋行來呈現圖表。要在圖表中正確展示指令碼，您必須讓註釋中的參數和 Apache Spark 程式碼中的參數保持同步。

無論您的游標置於指令碼中何處，指令碼編輯器都能讓您新增程式碼範本。在編輯器最上方，從下列選項中選擇：
+ 若要新增來源資料表到指令碼，請選擇 **Source** (來源)。
+ 若要新增目標到指令碼，請選擇 **Target** (目標)。
+ 若要新增目標位置到指令碼，請選擇 **Target location** (目標位置)。
+ 若要新增轉換到指令碼，請選擇 **Transform** (轉換)。如需在指令碼中呼叫函數的詳細資訊，請參閱 [在 PySpark 中程式設計 AWS Glue ETL 指令碼](aws-glue-programming-python.md)。
+ 若要新增 Spigot 轉換到指令碼，請選擇 **Spigot**。

在插入的程式碼中，修改註釋和 Apache Spark 程式碼中的 `parameters`。例如您新增了 **Spigot** 轉換，請確認 `path` 在 `@args` 註釋和 `output` 程式碼中都已被取代。

**Logs** (日誌) 索引標籤會顯示任務執行時與其關聯的日誌。顯示範圍為最近的 1,000 行。

**Schema (結構描述)** 索引標籤會顯示在 Data Catalog 中所選來源和目標的結構描述。

# 使用任務書籤追蹤處理的資料
<a name="monitor-continuations"></a>

AWS Glue 會持續保留前次執行 ETL 任務的狀態資訊，以追蹤在該任務執行期間所處理的資料。此保存狀態資訊稱為*任務書籤*。任務書籤可協助 AWS Glue 維護狀態資訊，以及防止重新處理舊資料。透過任務書籤，您可以在依排定間隔重新執行時處理新資料。任務書籤包括各種任務元素的狀態，例如來源、轉換和目標。例如，ETL 任務可能會讀取 Amazon S3 檔案中的新分割區。AWS Glue 會追蹤已由任務成功處理的分割區，避免重複處理以及任務目標資料存放區中出現重複的資料。

任務書籤實作於 JDBC 資料來源、Relationalize 轉換和部分 Amazon Simple Storage Service (Amazon S3) 來源。下表列出 AWS Glue 針對任務書籤支援的 Amazon S3 來源格式。


| AWS Glue 版本 | Amazon S3 來源格式 | 
| --- | --- | 
| 0.9 版 | JSON、CSV、Apache Avro、XML | 
| 1.0 版和更新版本 | JSON、CSV、Apache Avro、XML、Parquet、ORC | 

如需 AWS Glue 版本的詳細資訊，請參閱[定義 Spark 任務的任務屬性](add-job.md#create-job)。

透過 AWS Glue 指令碼存取時，任務書籤功能具有其他功能。瀏覽產生的指令碼時，您可能會看到與此功能相關的轉換內容。如需詳細資訊，請參閱[使用任務書籤](programming-etl-connect-bookmarks.md)。

**Topics**
+ [在 AWS Glue 中使用任務書籤](#monitor-continuations-implement)
+ [任務書籤功能的操作詳細資訊](#monitor-continuations-script)

## 在 AWS Glue 中使用任務書籤
<a name="monitor-continuations-implement"></a>

當任務開始之後，會將任務書籤選項當成參數傳遞。下表說明在 AWS Glue 主控台中設定任務書籤的選項。


****  

| 工作書籤 | Description | 
| --- | --- | 
| Enable | 讓任務在執行之後更新狀態，以追蹤先前處理的資料。如果您任務的來源具有任務書籤支援，則會追蹤已處理的資料，而且在任務執行時，會處理最後一個檢查點之後的新資料。 | 
| 停用 | 不會使用任務書籤，而且任務一律會處理整個資料集。您需負責管理之前工作執行的輸出。這是預設值。 | 
| 暫停 |  處理上次成功執行後的遞增資料，或由下列子選項識別範圍內的資料，而不更新最後一個書籤的狀態。您需負責管理之前工作執行的輸出。這兩個子選項是： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitor-continuations.html) 指定此選項組時，不會更新任務書籤狀態。 子選項是可選的，但是當使用時，必須提供這兩個子選項。  | 

有關在命令列傳遞至任務的參數 (特別是任務標籤) 的詳細資訊，請參閱 [在 Glue AWS 任務中使用任務參數](aws-glue-programming-etl-glue-arguments.md)。

若是 Amazon S3 輸入來源，AWS Glue 任務書籤會檢查物件的上次修改時間，以確認需要重新處理哪些物件。如果自上次任務執行之後已修改您的輸入來源資料，則在您重新執行任務時重新處理檔案。

如為 JDBC 來源，則適用的規定如下：
+ AWS Glue 會針對每個資料表使用一個或多個欄做為書籤索引鍵，以決定新資料和已處理的資料。書籤索引鍵結合在一起，形成單一複合索引鍵。
+ 依預設，AWS Glue 會使用主索引鍵作為書籤索引鍵，但條件是其依序遞增或遞減 (沒有間隙)。
+ 您可以指定要在 AWS Glue 指令碼中用作書籤索引鍵的資料欄。如需在 AWS Glue 指令碼中使用任務書籤的詳細資訊，請參閱 [使用任務書籤](programming-etl-connect-bookmarks.md)。
+ AWS Glue 不支援使用名稱區分大小寫的資料欄作為任務書籤索引鍵。

您可以將 AWS Glue Spark ETL 任務的任務書籤倒轉至任何之前的任務執行。現在，您可以透過將任務書籤倒轉至任何之前的任務執行，更好地支援資料回填方案，從而在後續的任務執行中，僅重新處理已加入書籤的任務執行中的資料。

如果您想要使用相同的任務來重新處理所有資料，則請重設任務書籤。若要重設任務書籤狀態，請使用 AWS Glue 主控台、[ResetJobBookmark 動作 (Python: reset\$1job\$1bookmark)](aws-glue-api-jobs-runs.md#aws-glue-api-jobs-runs-ResetJobBookmark) API 操作或 AWS CLI。例如，使用 AWS CLI輸入下列命令：

```
    aws glue reset-job-bookmark --job-name my-job-name
```

當您倒轉或重設書籤時，AWS Glue 不會清除目標檔案，因為可能有多個目標，且未使用任務書籤追蹤目標。只有來源檔案會使用任務書籤來追蹤。您可以在倒轉和重新處理來源檔案時建立不同的輸出目標，以避免輸出中的資料重複。

AWS Glue 會依任務來追蹤任務書籤。如果您刪除任務，任務書籤將不會保留。

在某些情況下，您可能已啟用 AWS Glue 任務書籤，但 ETL 任務正在重新處理已在稍早執行中處理的資料。如需解決此錯誤常見原因的資訊，請參閱[對 Glue 常見設定錯誤進行故障診斷](glue-troubleshooting-errors.md)。

## 任務書籤功能的操作詳細資訊
<a name="monitor-continuations-script"></a>

本節說明如何使用任務書籤的更多操作詳細資訊。

任務書籤會存放任務的狀態。都會依任務名稱和版本號碼輸入狀態的每個執行個體。指令碼呼叫 `job.init` 時，會擷取其狀態，而且一律會取得最新版本。在狀態內，有多個狀態元素，即指令碼中每個來源、轉換和目的地執行個體所特有的。這些狀態元素是依連接到指令碼中對應元素 (來源、轉換或目的地) 的轉換內容所識別。從使用者指令碼呼叫 `job.commit` 時，會自動儲存狀態元素。指令碼會從引數取得任務名稱以及任務書籤的控制選項。

任務書籤中的狀態元素是來源、轉換或目的地特定的資料。例如，假設您想要從上游任務或程序持續寫入的 Amazon S3 位置讀取遞增資料。在此情況下，指令碼必須判斷到目前為止已處理哪些項目。Amazon S3 來源的任務書籤實作會儲存資訊，因此，在重新執行任務時，只能使用儲存的資訊來篩選新物件，以及重新計算下次執行任務的狀態。時間戳記用來篩選新的檔案。

除了狀態元素之外，任務書籤還會有*執行次數*、*嘗試次數*和*版本號碼*。執行次數會追蹤任務的執行，而嘗試次數會記錄任務執行的嘗試。任務執行次數是每次成功執行所遞增的依序增加數目。嘗試次數會追蹤每次執行的嘗試，而且只有在失敗嘗試之後執行時才會遞增。版本號碼會依序遞增，並追蹤任務書籤的更新。

在 AWS Glue 服務資料庫中，所有轉換的書籤狀態會儲存為索引鍵/值對：

```
{
  "job_name" : ...,
  "run_id": ...,
  "run_number": ..,
  "attempt_number": ...
  "states": {
    "transformation_ctx1" : {
      bookmark_state1
    },
    "transformation_ctx2" : {
      bookmark_state2
    }
  }
}
```

**最佳實務**  
下列是使用任務書籤的最佳實務。
+ *不要在已啟用書籤的情況下更改資料來源屬性*。例如，有一個資料來源 0 指向 Amazon S3 輸入路徑 A，且該任務啟用了書籤並從已執行了好幾輪的來源進行讀取。如果您將資料來源 0 的輸入路徑變更為 Amazon S3 路徑 B，而不變更 `transformation_ctx`， AWS Glue 任務將使用儲存的舊書籤狀態。這會導致輸入路徑 B 中的檔案遺失或略過檔案， AWS Glue 如同假設這些檔案已在先前的執行中處理過一樣。
+ *使用帶有書籤的目錄表，以便更好地管理分割區*。書籤既適用於 Data Catalog 中的資料來源，也適用於來自選項的資料來源。但是，使用來自選項的方法會難以刪除/新增分割區。將目錄表與爬蟲程式結合使用可以提供更好的自動化來追蹤新增的[分割區](https://docs.aws.amazon.com/glue/latest/dg/tables-described.html#tables-partition)，並可讓您靈活地使用 [pushdown 述詞](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html)選擇特定的分割區。
+ *將 [AWS Glue Amazon S3 檔案清單建立工具](https://aws.amazon.com/premiumsupport/knowledge-center/glue-oom-java-heap-space-error/)用於大型資料集*。書籤將列出每個輸入分割區下的所有檔案並執行篩選，因此如果單個分割區下的檔案太多，書籤可能會遇到驅動程式 OOM 的問題。使用 AWS Glue Amazon S3 檔案清單工具，避免一次列出記憶體中的所有檔案。

# 儲存 Spark 隨機資料
<a name="monitor-spark-shuffle-manager"></a>

隨機排序是每當資料分割區之間重新排列 Spark 任務的重要步驟。這是必需的，因為諸如 `join`、` groupByKey`、`reduceByKey` 以及 `repartition` 等廣泛轉換需要來自其他分割區的資訊才能完成處理。Spark 會從每個分割區收集所需的資料，並將其結合成一個新的分割區。在隨機排序期間，資料會寫入磁碟並透過網路傳輸。因此，隨機排序操作與本機磁碟容量密切相關。當執行器沒有足夠的磁碟空間並且沒有復原時，Spark 擲出 `No space left on device` 或 ` MetadataFetchFailedException` 錯誤。

**注意**  
 AWS Glue 僅 AWS Glue ETL 任務支援具有 Amazon S3 的 Spark 隨機播放外掛程式。

**解決方案**  
透過 AWS Glue，您現在可以使用 Amazon S3 來存放 Spark 隨機排序資料。Amazon S3 是一項物件儲存服務，提供領先業界的可擴展性、資料可用性、安全性和效能。此解決方案可為您的 Spark 任務分解運算和儲存，並提供完整的彈性和低成本的隨機排序儲存，讓您可靠地執行最密集的隨機排序工作負載。

![\[Spark workflow showing Map and Reduce stages using Amazon S3 for shuffle data storage.\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/gs-s3-shuffle-diagram.png)


我們正推出新的 Apache Spark 雲端隨機排序儲存外掛程式，以便您有效地使用 Amazon S3。如果已知任務受到大型隨機操作的本機磁碟容量限制，您可以開啟 Amazon S3 隨機排序來可靠地執行您的 AWS Glue 任務，而不會失敗。在某些情況下，如果您有大量的小分割區或隨機排序檔案已寫入 Amazon S3，則隨機排序到 Amazon S3 會比本機磁碟 (或 EBS) 稍慢一些。

## 使用雲端隨機排序儲存外掛程式的先決條件
<a name="monitor-spark-shuffle-manager-prereqs"></a>

 若要搭配 AWS Glue ETL 任務使用 Cloud Shuffle Storage Plugin，您需要下列項目：
+ 與任務執行位於相同區域的 Amazon S3 儲存貯體，用於存放中繼隨機排序和溢出的資料。您可以使用 `--conf spark.shuffle.glue.s3ShuffleBucket=s3://shuffle-bucket/prefix/` 指定隨機排序儲存的 Amazon S3 字首，如下列範例所示：

  ```
  --conf spark.shuffle.glue.s3ShuffleBucket=s3://glue-shuffle-123456789-us-east-1/glue-shuffle-data/
  ```
+  在*字首*上設定 Amazon S3 儲存生命週期政策 (如 `glue-shuffle-data`)，因為隨機排序管理器在任務完成後不會清除檔案。任務完成後，應刪除中繼隨機排序和溢出的資料。使用者可以在字首上設定簡短的生命週期政策。如需設定 Amazon S3 生命週期政策的說明，請參閱《Amazon Simple Storage Service 使用者指南》中的[設定儲存貯體的生命週期組態](https://docs.aws.amazon.com//AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)。

## 從 AWS 主控台使用 AWS Glue Spark 隨機播放管理員
<a name="monitor-spark-shuffle-manager-using-console"></a>

若要在設定任務時，使用 AWS Glue 主控台或 AWS Glue Studio 設定 AWS Glue Spark 隨機排序管理器：選擇 **--write-shuffle-files-to-s3** 任務參數以開啟該任務的 Amazon S3 隨機排序。

![\[Job parameters interface showing --write-shuffle-files- parameter and option to add more.\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/gs-s3-shuffle.png)


## 使用 AWS Glue Spark 隨機排序外掛程式
<a name="monitor-spark-shuffle-manager-using"></a>

下列任務參數會開啟並微調 AWS Glue 隨機排序管理器。這些參數是旗標，因此不會考慮提供的任何值。
+ `--write-shuffle-files-to-s3`：主要旗標，啟用 AWS Glue Spark 隨機排序管理器以使用 Amazon S3 儲存貯體來寫入和讀取隨機排序資料。當未指定旗標時不使用隨機排序管理器。
+ `--write-shuffle-spills-to-s3` – (僅對 AWS Glue 2.0 版本提供支援)。此為選用旗標，可讓您將溢出檔案卸載到 Amazon S3 儲存貯體，這可為 Spark 任務提供額外的彈性。只有將大量資料溢出到磁碟的大型工作負載才需要它。如果未指定旗標，則不會寫入中繼溢出檔案。
+ ` --conf spark.shuffle.glue.s3ShuffleBucket=s3://<shuffle-bucket>` — 另一個可選標記，它指定您在其中寫入隨機排序檔案的 Amazon S3 儲存貯體。根據預設，`--TempDir`/shuffle-data. AWS Glue 3.0\$1 支援將隨機播放檔案寫入多個儲存貯體，方法是使用逗號分隔符號指定儲存貯體，如 所示`--conf spark.shuffle.glue.s3ShuffleBucket=s3://shuffle-bucket-1/prefix,s3://shuffle-bucket-2/prefix/`。使用多個儲存貯體可改善效能。

您需要提供安全組態設定，才能為隨機資料啟用靜態加密。如需安全組態的詳細資訊，請參閱 [設定 AWS Glue 中的加密](set-up-encryption.md)。AWS Glue 支援 Spark 提供的所有其他隨機顯示相關組態。

**雲端隨機排序儲存外掛程式的軟體二進位檔**  
您也可以依據 Apache 2.0 許可證下載 Apache Spark 雲端隨機排序儲存外掛程式的軟體二進位檔，並在任何 Spark 環境中執行該二進位檔。這個新的外掛程式隨附對 Amazon S3 的立即支援，也可以輕鬆設定為使用其他形式的雲端儲存，例如 [Google Cloud Storage 和 Microsoft Azure Blob 儲存體](https://github.com/aws-samples/aws-glue-samples/blob/master/docs/cloud-shuffle-plugin/README.md)。如需詳細資訊，請參閱 [Apache Spark 雲端隨機排序儲存外掛程式](https://docs.aws.amazon.com/glue/latest/dg/cloud-shuffle-storage-plugin.html)。

**備註與限制**  
以下是 AWS Glue 隨機排序管理器的備註或限制：
+  AWS Glue 隨機播放管理員不會在任務完成後自動刪除存放在 Amazon S3 儲存貯體中的 （暫時） 隨機播放資料檔案。若要確保資料保護，請在啟用雲端隨機排序儲存外掛程式之前遵循 [使用雲端隨機排序儲存外掛程式的先決條件](#monitor-spark-shuffle-manager-prereqs) 中的說明進行操作。
+ 如果資料偏斜，您可以使用此功能。

# Apache Spark 雲端隨機排序儲存外掛程式
<a name="cloud-shuffle-storage-plugin"></a>

雲端隨機排序儲存外掛程式是與 [`ShuffleDataIO` API](https://github.com/apache/spark/blob/master/core/src/main/java/org/apache/spark/shuffle/api/ShuffleDataIO.java) 相容的 Apache Spark 外掛程式，允許在雲端儲存系統 (如 Amazon S3) 上儲存隨機排序資料。此外掛程式可以幫助您補充或更換本機磁碟儲存容量，以進行大型隨機排序操作，此類操作通常由 Spark 應用程式中的轉換 (例如 `join`、`reduceByKey`、`groupByKey` 和 `repartition`) 觸發，從而減少無伺服器資料分析任務和管道的常見故障或對價格/效能的負面影響。

**AWS Glue**  
AWS Glue 3.0 和 4.0 版本隨附預先安裝的外掛程式，並可啟用對 Amazon S3 的隨機排序，而無需任何額外的步驟。如需詳細資訊，請參閱 [AWS Glue Spark 隨機排序外掛程式與 Amazon S3](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-shuffle-manager.html)，以啟用 Spark 應用程式的功能。

**其他 Spark 環境**  
該外掛程式需要在其他 Spark 環境中設定以下 Spark 組態：
+ `--conf spark.shuffle.sort.io.plugin.class=com.amazonaws.spark.shuffle.io.cloud.ChopperPlugin`：這會通知 Spark 使用此外掛程式對 IO 進行隨機排序。
+ `--conf spark.shuffle.storage.path=s3://bucket-name/shuffle-file-dir`：隨機排序檔案的存放路徑。

**注意**  
該外掛程式會覆寫一個 Spark 核心類別。因此，需要在 Spark jar 之前載入外掛程式 jar。如果在 AWS Glue 外部使用此外掛程式，您可以在內部部署 YARN 環境中使用 `userClassPathFirst` 來達成此目的。

## 將外掛程式與 Spark 應用程式綁定在一起
<a name="cloud-shuffle-storage-plugin-bundling"></a>

您可以在本機開發 Spark 應用程式時，透過在 Maven `pom.xml` 中新增外掛程式相依性，將外掛程式與 Spark 應用程式和 Spark 發行版本 (3.1 及更高版本) 綁定在一起。如需有關此外掛程式和 Spark 版本的詳細資訊，請參閱[外掛程式版本](#cloud-shuffle-storage-plugin-versions)。

```
<repositories>
   ...
    <repository>
        <id>aws-glue-etl-artifacts</id>
        <url>https://aws-glue-etl-artifacts.s3.amazonaws.com/release/ </url>
    </repository>
</repositories>
...
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>chopper-plugin</artifactId>
    <version>3.1-amzn-LATEST</version>
</dependency>
```

或者，您也可以直接從 AWS Glue Maven 成品下載二進位檔，並將其包含在 Spark 應用程式中，如下所示。

```
#!/bin/bash
sudo wget -v https://aws-glue-etl-artifacts.s3.amazonaws.com/release/com/amazonaws/chopper-plugin/3.1-amzn-LATEST/chopper-plugin-3.1-amzn-LATEST.jar -P /usr/lib/spark/jars/
```

spark-submit 範例

```
spark-submit --deploy-mode cluster \
--conf spark.shuffle.storage.s3.path=s3://<ShuffleBucket>/<shuffle-dir> \
--conf spark.driver.extraClassPath=<Path to plugin jar> \ 
--conf spark.executor.extraClassPath=<Path to plugin jar> \
--class <your test class name> s3://<ShuffleBucket>/<Your application jar> \
```

## 選用組態
<a name="cloud-shuffle-storage-plugin-optional"></a>

這些是控制 Amazon S3 隨機排序行為的選用組態值。
+ `spark.shuffle.storage.s3.enableServerSideEncryption`：啟用/停用將檔案隨機排序和溢位的 S3 SSE。預設值為 `true`。
+ `spark.shuffle.storage.s3.serverSideEncryption.algorithm`：要使用的 SSE 演算法。預設值為 `AES256`。
+ `spark.shuffle.storage.s3.serverSideEncryption.kms.key`：啟用 SSE aws:kms 時的 KMS 金鑰 ARN。

除了這些組態之外，您可能需要設定組態，例如 `spark.hadoop.fs.s3.enableServerSideEncryption` 和**其他特定於環境的組態**，以確保針對您的使用案例套用適當加密。

## 外掛程式版本
<a name="cloud-shuffle-storage-plugin-versions"></a>

與每個版本相關聯的 Spark AWS Glue 版本支援此外掛程式。下表顯示 AWS Glue 版本、Spark 版本和相關的外掛程式版本，以及外掛程式軟體二進位檔的 Amazon S3 位置。


| AWS Glue 版本 | Spark 版本 | 外掛程式版本 | Amazon S3 位置 | 
| --- | --- | --- | --- | 
| 3.0 | 3.1 | 3.1-amzn-LATEST |  s3://aws-glue-etl-artifacts/release/com/amazonaws/chopper-plugin/3.1-amzn-0/chopper-plugin-3.1-amzn-LATEST.jar  | 
| 4.0 | 3.3 | 3.3-amzn-LATEST |  s3://aws-glue-etl-artifacts/release/com/amazonaws/chopper-plugin/3.3-amzn-0/chopper-plugin-3.3-amzn-LATEST.jar  | 

## 授權
<a name="cloud-shuffle-storage-plugin-binary-license"></a>

此外掛程式的軟體二進位檔依據 Apache 2.0 許可證獲得授權。

# 監控 AWS Glue Spark 任務
<a name="monitor-spark"></a>

**Topics**
+ [中可用的 Spark 指標 AWS Glue Studio](#console-jobs-details-metrics-spark)
+ [使用 Apache Spark web UI 監控任務](monitor-spark-ui.md)
+ [使用 AWS Glue 任務執行洞察進行監控](monitor-job-insights.md)
+ [使用 Amazon CloudWatch 監控](monitor-cloudwatch.md)
+ [任務監控與偵錯](monitor-profile-glue-job-cloudwatch-metrics.md)

## 中可用的 Spark 指標 AWS Glue Studio
<a name="console-jobs-details-metrics-spark"></a>

**Metrics (指標)** 索引標籤會顯示在任務執行時和分析功能開啟時，所收集到的指標。Spark 任務中會顯示下列圖表：
+ ETL 資料移動
+ 記憶體使用狀況：驅動程式和執行器

選擇 **View additional metrics (檢視其他指標)**，來顯示下列的圖表：
+ ETL 資料移動
+ 記憶體使用狀況：驅動程式和執行器
+ 在執行器之間的資料隨機移動
+ CPU 負載：驅動程式和執行器
+ 任務執行：運作中的執行器、已完成的階段和所需執行器的數量上限

如果任務已啟用收集指標，則這些圖表的資料會推送到 CloudWatch 指標。如需如何開啟指標和解讀圖表的詳細資訊，請參閱 [任務監控與偵錯](monitor-profile-glue-job-cloudwatch-metrics.md)。

**Example ETL 資料移動圖表**  
ETL 資料移動圖表顯示下列指標：  
+ 所有執行器從 Amazon S3 讀取的位元組數量—[`glue.ALL.s3.filesystem.read_bytes`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.read_bytes)
+ 所有執行器寫入至 Amazon S3 位元組數量—[`glue.ALL.s3.filesystem.write_bytes`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.write_bytes)

![\[ETL 資料移動圖表 (位於 AWS Glue 主控台的「指標」索引標籤中)。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/job_detailed_etl.png)


**Example 記憶體使用狀況圖表**  
記憶體使用狀況圖表顯示下列指標：  
+ 此驅動程式的 JVM 堆疊所使用的記憶體佔比 (比例：0-1)，依驅動程式、由 *executorId* 所辨識的執行器，或所有執行器劃分 —
  + [`glue.driver.jvm.heap.usage`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.jvm.heap.usage)
  + [`glue.executorId.jvm.heap.usage`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.executorId.jvm.heap.usage)
  + [`glue.ALL.jvm.heap.usage`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.jvm.heap.usage)

![\[記憶體使用狀況圖表 (位於 AWS Glue 主控台的「指標」索引標籤中)。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/job_detailed_mem.png)


**Example 執行器之間的資料隨機移動圖表**  
執行器之間的資料隨機移動圖表顯示下列指標：  
+ 所有執行器讀取的位元組數量 (以在這些執行器之間隨機移動資料) — [`glue.driver.aggregate.shuffleLocalBytesRead`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.aggregate.shuffleLocalBytesRead)
+ 所有執行器寫入的位元組數量 (以在這些執行器之間隨機移動資料) — [`glue.driver.aggregate.shuffleBytesWritten`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.aggregate.shuffleBytesWritten)

![\[執行器之間的資料隨機移動圖表 (位於 AWS Glue 主控台的「指標」索引標籤中)。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/job_detailed_data.png)


**Example CPU 負載圖表**  
CPU 負載圖表顯示下列指標：  
+ 驅動程式、由 *executorId* 所辨識的執行器，或所有執行器使用的 CPU 系統負載佔比 (比例：0-1) —
  + [`glue.driver.system.cpuSystemLoad`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.system.cpuSystemLoad)
  + [`glue.executorId.system.cpuSystemLoad`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.executorId.system.cpuSystemLoad)
  + [`glue.ALL.system.cpuSystemLoad`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.system.cpuSystemLoad)

![\[CPU 負載圖表 (位於 AWS Glue 主控台的「指標」索引標籤中)。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/job_detailed_cpu.png)


**Example 任務執行圖表**  
任務執行圖表顯示下列指標：  
+ 目前正在運作中執行器的數量 — [`glue.driver.ExecutorAllocationManager.executors.numberAllExecutors`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.ExecutorAllocationManager.executors.numberAllExecutors)
+ 已完成階段的數量 — [`glue.aggregate.numCompletedStages`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.aggregate.numCompletedStages)
+ 所需執行器數量的上限 — [`glue.driver.ExecutorAllocationManager.executors.numberMaxNeededExecutors`](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.ExecutorAllocationManager.executors.numberMaxNeededExecutors)

![\[任務執行圖表 (位於 AWS Glue 主控台的「指標」索引標籤中)。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/job_detailed_exec.png)


# 使用 Apache Spark web UI 監控任務
<a name="monitor-spark-ui"></a>

您可以使用 Apache Spark Web UI 來監控和偵錯在 AWS Glue 任務系統上執行的 AWS Glue ETL 任務，以及在 AWS Glue 開發端點上執行的 Spark 應用程式。Spark UI 可讓您為每個任務檢查下列項目：
+ 每個 Spark 階段的事件時間軸
+ 任務的有向無環圖 (DAG)
+ SparkSQL 查詢的實體和邏輯計畫
+ 每個任務的基礎 Spark 環境變數

如需有關使用 Spark Web UI 的詳細資訊，請參閱《Spark 文件》中的 [Web UI](https://spark.apache.org/docs/3.3.0/web-ui.html)。如需如何解譯 Spark UI 結果以改善任務效能的指引，請參閱 AWS 方案指南中 [AWS Glue Apache Spark 任務效能調校的最佳實務](https://docs.aws.amazon.com/prescriptive-guidance/latest/tuning-aws-glue-for-apache-spark/introduction.html)。

 您可以在 AWS Glue 主控台中查看 Spark UI。當 AWS Glue 任務以標準 （而非舊版） 格式產生的日誌在 AWS Glue 3.0 或更新版本上執行時，即可使用此功能，這是較新任務的預設值。如果您的日誌檔案大於 0.5 GB，您可以為在 AWS Glue 4.0 或更新版本上執行的任務啟用滾動日誌支援，以簡化日誌封存、分析和故障診斷。

您可以使用 AWS Glue主控台或 AWS Command Line Interface () 啟用 Spark UI AWS CLI。當您啟用 Spark UI 時，AWS Glue 開發端點上的 AWS Glue ETL 任務和 Spark 應用程式可以將 Spark 事件日誌備份到您在 Amazon Simple Storage Service (Amazon S3) 中指定的位置。可搭配使用 Amazon S3 中已備份的事件日誌與 Spark UI，即可在工作運作時即時使用，也可在工作完成後使用。當日誌保留在 Amazon S3 中時， AWS Glue 主控台中的 Spark UI 可以檢視它們。

## 許可
<a name="monitor-spark-ui-limitations-permissions"></a>

 若要在 AWS Glue 主控台中使用 Spark UI，您可以使用`UseGlueStudio`或新增所有個別服務 APIs。所有 API 都需要完全使用 Spark UI，但使用者可以在 IAM 許可中新增其服務 API 來存取 SparkUI 功能，以進行精細存取。

 `RequestLogParsing` 最為重要，因為其會執行日誌剖析。其餘 API 用於讀取各自的剖析資料。例如，`GetStages` 可讓您存取 Spark 任務所有階段的資料。

 映射到 `UseGlueStudio` 的 Spark UI 服務 API 清單如以下範例政策中所示。下面的政策提供僅限使用 Spark UI 功能的存取權。若要新增更多許可，例如 Amazon S3 和 IAM，請參閱[為 建立自訂 IAM 政策 AWS Glue Studio。 ](https://docs.aws.amazon.com/glue/latest/dg/getting-started-min-privs.html#getting-started-all-gs-privs.html)

 映射到 `UseGlueStudio` 的 Spark UI 服務 API 清單如以下範例政策中所示。使用 Spark UI 服務 API 時，請使用下列命名空間：`glue:<ServiceAPI>`。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowGlueStudioSparkUI",
      "Effect": "Allow",
      "Action": [
        "glue:RequestLogParsing",
        "glue:GetLogParsingStatus",
        "glue:GetEnvironment",
        "glue:GetJobs",
        "glue:GetJob",
        "glue:GetStage",
        "glue:GetStages",
        "glue:GetStageFiles",
        "glue:BatchGetStageFiles",
        "glue:GetStageAttempt",
        "glue:GetStageAttemptTaskList",
        "glue:GetStageAttemptTaskSummary",
        "glue:GetExecutors",
        "glue:GetExecutorsThreads",
        "glue:GetStorage",
        "glue:GetStorageUnit",
        "glue:GetQueries",
        "glue:GetQuery"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

------

## 限制
<a name="monitor-spark-ui-limitations"></a>
+  AWS Glue 主控台中的 Spark UI 不適用於 2023 年 11 月 20 日之前發生的任務執行，因為它們是舊版日誌格式。
+  AWS Glue 主控台中的 Spark UI 支援滾動日誌 for AWS Glue 4.0，例如串流任務中預設產生的日誌。所有產生的滾動日誌事件檔案總和上限為 2 GB。對於沒有滾動日誌支援 AWS Glue 的任務，SparkUI 支援的日誌事件檔案大小上限為 0.5 GB。
+  對於只能由您的 VPC 存取的 Amazon S3 儲存貯體中存放的 Spark 事件日誌，Serverless Spark UI 不適用。

## 範例：Apache Spark Web UI
<a name="monitor-spark-ui-limitations-example"></a>

此範例顯示如何使用 Spark UI 了解工作效能。螢幕擷取畫面顯示自我管理的 Spark 歷史記錄伺服器提供的 Spark Web UI。 AWS Glue 主控台中的 Spark UI 提供類似的檢視。如需有關使用 Spark Web UI 的詳細資訊，請參閱《Spark 文件》中的 [Web UI](https://spark.apache.org/docs/3.3.0/web-ui.html)。

以下是 Spark 應用程式的範例，它會讀取兩個資料來源、執行聯結轉換，然後以 Parquet 格式將其寫入至 Amazon S3。

```
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from pyspark.sql.functions import count, when, expr, col, sum, isnull
from pyspark.sql.functions import countDistinct
from awsglue.dynamicframe import DynamicFrame
 
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
 
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
 
job = Job(glueContext)
job.init(args['JOB_NAME'])
 
df_persons = spark.read.json("s3://awsglue-datasets/examples/us-legislators/all/persons.json")
df_memberships = spark.read.json("s3://awsglue-datasets/examples/us-legislators/all/memberships.json")
 
df_joined = df_persons.join(df_memberships, df_persons.id == df_memberships.person_id, 'fullouter')
df_joined.write.parquet("s3://aws-glue-demo-sparkui/output/")
 
job.commit()
```

下列 DAG 視覺化顯示此 Spark 任務中的不同階段。

![\[Spark UI 的螢幕擷取畫面顯示任務 0 的 2 個已完成階段。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/spark-ui1.png)


下列任務的事件時間軸顯示不同 Spark 執行器的啟動、執行和終止。

![\[Spark UI 的螢幕擷取畫面顯示不同 Spark 執行器的完成、失敗和作用中階段。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/spark-ui2.png)


下列畫面顯示 SparkSQL 查詢計畫的詳細資訊：
+ 已剖析的邏輯計畫
+ 已分析的邏輯計畫
+ 已最佳化的邏輯計畫
+ 要執行的實體計畫

![\[SparkSQL 查詢計畫：已剖析、已分析和已最佳化的邏輯計畫，以及要執行的實體計畫。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/spark-ui3.png)


**Topics**
+ [許可](#monitor-spark-ui-limitations-permissions)
+ [限制](#monitor-spark-ui-limitations)
+ [範例：Apache Spark Web UI](#monitor-spark-ui-limitations-example)
+ [為 AWS Glue 任務啟用 Apache Spark web UI](monitor-spark-ui-jobs.md)
+ [啟動 Spark 歷史記錄伺服器](monitor-spark-ui-history.md)

# 為 AWS Glue 任務啟用 Apache Spark web UI
<a name="monitor-spark-ui-jobs"></a>

您可以使用 Apache Spark Web UI 來監控和偵錯在 AWS Glue 任務系統上執行的 AWS Glue ETL 任務。您可以使用 AWS Glue 主控台或 AWS Command Line Interface (AWS CLI) 來設定 Spark UI。

每 30 秒，AWS Glue 會將 Spark 事件日誌備份至您指定的 Amazon S3 路徑。

**Topics**
+ [設定 Spark UI (主控台)](#monitor-spark-ui-jobs-console)
+ [設定 Spark UI (AWS CLI)](#monitor-spark-ui-jobs-cli)
+ [使用筆記本為工作階段設定 Spark UI](#monitor-spark-ui-sessions)
+ [啟用滾動日誌](#monitor-spark-ui-rolling-logs)

## 設定 Spark UI (主控台)
<a name="monitor-spark-ui-jobs-console"></a>

使用 AWS 管理主控台，依照以下步驟來設定 Spark UI。建立 AWS Glue 任務時，預設會啟用 Spark UI。

**建立或編輯工作時開啟 Spark UI**

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue主控台。

1. 在導覽窗格中，選擇 **Jobs (任務)**。

1. 選擇**新增任務**，或選取現有任務。

1. 在**任務詳細資料**中，開啟**進階屬性**。

1. 在 **Spark UI** 索引標籤下方，選擇將 **Spark UI 日誌寫入 Amazon S3**。

1. 指定 Amazon S3 路徑以用於存放任務的 Spark 事件日誌。請注意，如果在工作中使用安全組態，加密也會套用至 Spark UI 日誌檔案。如需詳細資訊，請參閱[加密 寫入的資料 AWS Glue](encryption-security-configuration.md)。

1. 在 **Spark UI 記錄和監控組態**下方：
   + 如果您要在 AWS Glue 主控台中產生要檢視的日誌，請選取**標準**。
   + 如果要產生日誌以在 Spark 歷史記錄伺服器中檢視，請選取**舊版**。
   + 您也可以選擇產生兩者。

## 設定 Spark UI (AWS CLI)
<a name="monitor-spark-ui-jobs-cli"></a>

若要產生使用 Spark UI 檢視的日誌，請在 AWS Glue 主控台中使用 AWS CLI 將下列任務參數傳遞給AWS Glue任務。如需詳細資訊，請參閱[在 Glue AWS 任務中使用任務參數](aws-glue-programming-etl-glue-arguments.md)。

```
'--enable-spark-ui': 'true',
'--spark-event-logs-path': 's3://s3-event-log-path'
```

若要將日誌分發至其舊版位置，請將 `--enable-spark-ui-legacy-path` 參數設定為 `"true"`。如果您不想要產生這兩種格式的日誌，請移除 `--enable-spark-ui` 參數。

## 使用筆記本為工作階段設定 Spark UI
<a name="monitor-spark-ui-sessions"></a>

**警告**  
AWS Glue 互動式工作階段目前不支援主控台中的 Spark UI。設定 Spark 歷史記錄伺服器。

 如果您使用 AWS Glue 筆記本，請在開始工作階段之前設定 SparkUI 組態。為此，請使用 `%%configure` 儲存格魔術命令：

```
%%configure { “--enable-spark-ui”: “true”, “--spark-event-logs-path”: “s3://path” }
```

## 啟用滾動日誌
<a name="monitor-spark-ui-rolling-logs"></a>

 為 AWS Glue 任務啟用 SparkUI 和滾動日誌事件檔案有幾個優點：
+  滾動日誌事件檔案 – 啟用滾動日誌事件檔案後， 會針對任務執行的每個步驟 AWS Glue 產生個別日誌檔案，讓您更輕鬆地識別特定階段或轉換的特定問題並進行疑難排解。
+  更好的日誌管理 – 滾動日誌事件檔案有助於更有效率地管理日誌檔案。日誌不是單一但可能很大的日誌檔案，而是會根據任務執行階段分區成更小、更易於管理的檔案。這可以簡化日誌封存、分析和故障診斷。
+  改善容錯能力 – 如果 AWS Glue 任務失敗或中斷，滾動日誌事件檔案可以提供有關最後一個成功階段的寶貴資訊，讓您更輕鬆地從該點繼續任務，而不是從頭開始。
+  成本最佳化 – 透過啟用滾動日誌事件檔案，可以節省與日誌檔案相關聯的儲存成本。您可以儲存更小、更易於管理的日誌檔案，而非儲存單一、可能很大的日誌檔案，這可能更具成本效益，尤其對於長時間執行或複雜任務。

 在新環境中，使用者可以透過以下方法明確啟用滾動日誌：

```
'—conf': 'spark.eventLog.rolling.enabled=true'
```

或

```
'—conf': 'spark.eventLog.rolling.enabled=true —conf 
spark.eventLog.rolling.maxFileSize=128m'
```

 啟動滾動日誌時，`spark.eventLog.rolling.maxFileSize` 會指定事件日誌檔案的大小上限，然後再滾動。如果未指定此可選參數，其會預設為 128 MB。最小值為 10 MB。

 所有產生的滾動日誌事件檔案總和上限為 2 GB。對於沒有滾動日誌支援 AWS Glue 的任務，SparkUI 支援的日誌事件檔案大小上限為 0.5 GB。

可以透過傳遞其他組態來關閉串流工作的滾動日誌。請注意，非常大的日誌檔案可能需要昂貴的維護成本。

若要關閉滾動日誌，請提供下列組態：

```
'--spark-ui-event-logs-path': 'true',
'--conf': 'spark.eventLog.rolling.enabled=false'
```

# 啟動 Spark 歷史記錄伺服器
<a name="monitor-spark-ui-history"></a>

可使用 Spark 歷史記錄伺服器，在您自己的基礎設施中視覺化 Spark 日誌。您可以在 AWS Glue 主控台中看到在 AWS Glue 4.0 或更新版本上執行 AWS Glue 任務的相同視覺效果，其中包含以標準 （而非舊版） 格式產生的日誌。如需詳細資訊，請參閱[使用 Apache Spark web UI 監控任務](monitor-spark-ui.md)。

您可以使用在 EC2 執行個體上託管伺服器的 AWS CloudFormation 範本來啟動 Spark 歷史記錄伺服器，或使用 Docker 在本機啟動。

**Topics**
+ [使用 啟動 Spark 歷史記錄伺服器並檢視 Spark UI AWS CloudFormation](#monitor-spark-ui-history-cfn)
+ [啟動 Spark 歷史記錄伺服器並使用 Docker 檢視 Spark UI](#monitor-spark-ui-history-local)

## 使用 啟動 Spark 歷史記錄伺服器並檢視 Spark UI AWS CloudFormation
<a name="monitor-spark-ui-history-cfn"></a>

您可以使用 AWS CloudFormation 範本來啟動 Apache Spark 歷史記錄伺服器，並檢視 Spark Web UI。這些範本是範例，您應加以修改以符合您的需求。

**使用 啟動 Spark 歷史記錄伺服器並檢視 Spark UI CloudFormation**

1. 選擇下表中的其中一個 **Launch Stack (啟動堆疊)** 按鈕。這會在 CloudFormation 主控台上啟動堆疊。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitor-spark-ui-history.html)

1. 在 **Specify template (指定範本)** 頁面上，選擇 **Next (下一步)**。

1. 在 **Specify stack details (指定堆疊詳細資訊)** 頁面上，輸入 **Stack name (堆疊名稱)**。在 **Parameters** (參數) 下輸入其他資訊。

   1. 

**Spark UI 組態**

      請提供下列資訊：
      + **IP address range (IP 地址範圍)** - 可用於檢視 Spark UI 的 IP 地址範圍。如果您想要限制來自特定 IP 地址範圍的存取，您應該使用自訂值。
      + **History server port (歷史記錄伺服器連接埠)** - Spark UI 的連接埠。您可以使用預設值。
      + **Event log directory (事件日誌目錄)** - 選擇從 AWS Glue 任務或開發端點存放 Spark 事件日誌的位置。您必須使用 **s3a://** 做為事件日誌路徑配置。
      + **Spark package location (Spark 套件位置)** - 您可以使用預設值。
      + **Keystore path (金鑰存放區路徑)** - HTTPS 的 SSL/TLS 金鑰存放區路徑。如果您要使用自訂金鑰存放區檔案，可以在此指定 S3 路徑 `s3://path_to_your_keystore_file`。如果您將此參數保留空白，將會產生並使用以自我簽署憑證為基礎的金鑰存放區。
      + **Keystore password** (金鑰存放區密碼) – 輸入 HTTPS 的 SSL/TLS 金鑰存放區密碼。

   1. 

**EC2 執行個體組態**

      請提供下列資訊：
      + **Instance type (執行個體類型)** - 託管 Spark 歷史記錄伺服器的 Amazon EC2 執行個體類型。由於此範本啟動您帳戶中的 Amazon EC2 執行個體，因此會另外向您的帳戶收取 Amazon EC2 費用。
      + **Latest AMI ID (最新的 AMI ID)** - Spark 歷史記錄伺服器執行個體之 Amazon Linux 2 的 AMI ID。您可以使用預設值。
      + **VPC ID ** - Spark 歷史記錄伺服器執行個體的 Virtual Private Cloud (VPC) ID。您可以使用您帳戶中可用的任何 VPC，不建議使用預設 VPC 搭配[預設網路 ACL](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html#default-network-acl)。如需詳細資訊，請參閱 *Amazon VPC 使用者指南*中的[預設 VPC 和預設子網路](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html)以及[建立 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#Create-VPC)。
      + **Subnet ID (子網路 ID)** - Spark 歷史記錄伺服器執行個體的 ID。您可以使用 VPC 中的任何子網路。您必須能夠從用戶端連線到網路以連接至子網路。如果您要透過網際網路存取，必須使用在路由表中具有網際網路閘道的公有子網路。

   1. 選擇**下一步**。

1. 在 **Configure stack options** (設定堆疊選項) 頁面上，若要使用目前使用者憑證來決定 CloudFormation 如何在堆疊中建立、修改或刪除資源，請選擇 **Next** (下一步)。您也可以在**許可**區段指定一個角色，而非使用目前使用者的許可，然後選擇**下一步**。

1. 在 **Review (檢閱)** 頁面上檢閱範本。

   選取**我確認 CloudFormation 可能會建立 IAM 資源**，然後選擇**建立堆疊**。

1. 等待堆疊建立。

1. 開啟 **Outputs (輸出)** 標籤。

   1. 如果您使用公有子網路，請複製 **SparkUiPublicUrl** 的 URL。

   1. 如果您使用私有子網路 , 請複製 **SparkUiPrivateUrl** 的 URL。

1. 開啟 Web 瀏覽器，然後貼入該 URL。這可讓您使用 HTTPS 在指定連接埠上存取伺服器。您的瀏覽器可能會無法辨識伺服器的憑證，在此情況下，您必須覆寫其保護並繼續。

## 啟動 Spark 歷史記錄伺服器並使用 Docker 檢視 Spark UI
<a name="monitor-spark-ui-history-local"></a>

如果您偏好本機存取 (不使用 EC2 執行個體做為 Apache Spark 歷史記錄伺服器)，您也可以使用 Docker 來啟動 Apache Spark 歷史記錄伺服器，並在本機檢視 Spark UI。此 Dockerfile 為範例，您應該修改以符合您的需求。

 **先決條件** 

如需有關如何在筆記型電腦上安裝 Docker 的資訊，請參閱 [Docker 引擎社群](https://docs.docker.com/install/)。

**啟動 Spark 歷史記錄伺服器並使用 Docker 在本機檢視 Spark UI**

1. 從 GitHub 下載檔案。

   從 [ AWS Glue 程式碼範例](https://github.com/aws-samples/aws-glue-samples/tree/master/utilities/Spark_UI/)下載 Dockerfile 和 `pom.xml`。

1. 決定是否要使用您的使用者憑證或聯合身分使用者憑證來存取 AWS。
   + 若要使用目前的使用者登入資料進行存取 AWS，請在 `docker run`命令`AWS_SECRET_ACCESS_KEY`中取得要用於 ` AWS_ACCESS_KEY_ID`和 的值。如需詳細資訊，請參閱《 IAM 使用者指南》**中的[管理 IAM 使用者的存取金鑰](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)。
   + 若要使用 SAML 2.0 聯合身分使用者存取 AWS，請取得 ` AWS_ACCESS_KEY_ID`、 `AWS_SECRET_ACCESS_KEY`和 的值` AWS_SESSION_TOKEN`。如需詳細資訊，請參閱[請求暫時安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)。

1. 判斷您的事件日誌目錄的位置，以在 `docker run` 命令中使用。

1. 使用本機目錄中的檔案建置 Docker 映像檔，對其使用名稱 ` glue/sparkui` 以及標籤 `latest`。

   ```
   $ docker build -t glue/sparkui:latest . 
   ```

1. 建立並啟動 Docker 容器。

   在下列命令中，使用先前在步驟 2 與 3 中取得的值。

   1. 若要使用您的使用者憑證建立 Docker 容器，請使用類似如下的命令。

      ```
      docker run -itd -e SPARK_HISTORY_OPTS="$SPARK_HISTORY_OPTS -Dspark.history.fs.logDirectory=s3a://path_to_eventlog
       -Dspark.hadoop.fs.s3a.access.key=AWS_ACCESS_KEY_ID -Dspark.hadoop.fs.s3a.secret.key=AWS_SECRET_ACCESS_KEY"
       -p 18080:18080 glue/sparkui:latest "/opt/spark/bin/spark-class org.apache.spark.deploy.history.HistoryServer"
      ```

   1. 要使用暫時憑證建立 Docker 容器，請使用 ` org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider` 做為提供者，並提供在步驟 2 中取得的憑證值。如需詳細資訊，請參閱 *Hadoop：與 Amazon Web Services 整合*文件中的[將工作階段憑證與 TemporaryAWSCredentialsProvider 搭配使用](https://hadoop.apache.org/docs/stable/hadoop-aws/tools/hadoop-aws/index.html#Using_Session_Credentials_with_TemporaryAWSCredentialsProvider)。

      ```
      docker run -itd -e SPARK_HISTORY_OPTS="$SPARK_HISTORY_OPTS -Dspark.history.fs.logDirectory=s3a://path_to_eventlog
       -Dspark.hadoop.fs.s3a.access.key=AWS_ACCESS_KEY_ID -Dspark.hadoop.fs.s3a.secret.key=AWS_SECRET_ACCESS_KEY
       -Dspark.hadoop.fs.s3a.session.token=AWS_SESSION_TOKEN
       -Dspark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider"
       -p 18080:18080 glue/sparkui:latest "/opt/spark/bin/spark-class org.apache.spark.deploy.history.HistoryServer"
      ```
**注意**  
這些組態參數來自 [ Hadoop-AWS 模組](https://hadoop.apache.org/docs/stable/hadoop-aws/tools/hadoop-aws/index.html)。您可能需要根據您的使用案例來新增具體的組態。例如：隔離區域中的使用者需要設定 ` spark.hadoop.fs.s3a.endpoint`。

1. 在瀏覽器中開啟 `http://localhost:18080` 以在本機檢視 Spark UI。

# 使用 AWS Glue 任務執行洞察進行監控
<a name="monitor-job-insights"></a>

AWS Glue 任務執行洞見是 的一項功能 AWS Glue ，可簡化 AWS Glue 任務的任務偵錯和最佳化。 AWS Glue 提供 [Spark UI](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui.html)，以及用於監控 AWS Glue 任務的 [CloudWatch 日誌和指標](https://docs.aws.amazon.com/glue/latest/dg/monitor-cloudwatch.html)。使用此功能，您可以取得 AWS Glue 任務執行的相關資訊：
+ 失敗 AWS Glue 的任務指令碼行號。
+ 在任務失敗之前，Spark 查詢計劃中最近執行的 Spark 動作。
+ 與時間排序日誌串流中顯示的故障相關的 Spark 異常事件。
+ 根本原因分析和修正問題的建議動作 (例如調校指令碼)。
+ 常見的 Spark 事件 (與 Spark 動作相關的日誌訊息)，其中包含解決根本原因的建議動作。

您可以使用 AWS Glue CloudWatch 日誌中的兩個新日誌串流來取得所有這些洞見。

## 要求
<a name="monitor-job-insights-requirements"></a>

 AWS Glue 任務執行洞見功能適用於 2.0 版和更新 AWS Glue 版本。您可以遵循現有任務的[遷移指南](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-30.html)，從較舊 AWS Glue 版本升級這些任務。

## 啟用 AWS Glue ETL 任務的任務執行洞察
<a name="monitor-job-insights-enable"></a>

您可以透過 AWS Glue Studio 或 CLI 啟用任務執行洞察。

### AWS Glue Studio
<a name="monitor-job-insights-requirements"></a>

透過 建立任務時 AWS Glue Studio，您可以在任務**詳細資訊**索引標籤下啟用或停用任務執行洞見。檢查是否已選中**產生任務洞見**。

![\[在 AWS Glue Studio中啟用任務執行見解。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-job-run-insights-1.png)


### 命令列
<a name="monitor-job-insights-enable-cli"></a>

如果透過 CLI 建立任務，則可以使用單個新的[任務參數](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html)啟動任務：`--enable-job-insights = true`。

預設情況下，在 [AWS Glue 連續記錄](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuous-logging.html)使用的相同預設日誌群組下建立任務執行見解日誌串流, 即 `/aws-glue/jobs/logs-v2/`。您可以使用相同的連續記錄引數集來設定自訂日誌群組名稱、日誌篩選條件和日誌群組組態。如需詳細資訊，請參閱[啟用 AWS Glue 任務的持續記錄](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuous-logging-enable.html)。

## 存取 CloudWatch 中的任務執行見解日誌串流
<a name="monitor-job-insights-access"></a>

啟用任務執行見解功能後，當任務執行失敗時，可能會建立兩個日誌串流。任務成功完成後，兩個串流均不會產生。

1. *異常分析日誌串流*：`<job-run-id>-job-insights-rca-driver`。此串流提供下列資訊：
   + 造成失敗 AWS Glue 的任務指令碼行號。
   + 在 Spark 查詢計劃 (DAG) 中最近執行的 Spark 動作。
   + Spark 驅動程式和執行器中與異常相關的簡明時間排序事件。您可以從中找到詳細資訊，例如完整的錯誤訊息、失敗的 Spark 任務及其執行器 ID，這些資訊可協助您專注於特定執行器的日誌串流，以便在需要時進行更深入的調查。

1. *基於規則的見解串流*：
   + 根本原因分析和關於如何修正錯誤的建議 (例如使用特定的任務參數以最佳化效能)。
   + 作為根本原因分析基礎的相關 Spark 事件和建議的動作。

**注意**  
僅當任何異常 Spark 事件可用於失敗的任務執行時，第一個串流才會存在；只有在見解可用於失敗的任務執行時，第二個串流才存在。例如，如果您的任務成功完成，則不會產生任何串流；如果任務失敗，但沒有可以與故障場景相符的服務定義規則，則僅產生第一個串流。

如果任務是從 建立 AWS Glue Studio，則任務執行詳細資訊索引標籤 （任務執行洞見） 下也會提供上述串流的連結，例如「簡潔和合併錯誤日誌」和「錯誤分析和指引」。

![\[Job Run Details (任務執行詳細資訊) 頁面包含指向日誌串流的連結。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-job-run-insights-2.png)


## AWS Glue 任務執行洞察的範例
<a name="monitor-job-insights-example"></a>

在本部分中，我們展示任務執行見解功能如何協助您解決失敗任務中問題的範例。在此範例中，使用者忘記在 AWS Glue 任務中匯入所需的模組 （張量流程），以分析和建置其資料的機器學習模型。

```
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from pyspark.sql.types import *
from pyspark.sql.functions import udf,col

args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

data_set_1 = [1, 2, 3, 4]
data_set_2 = [5, 6, 7, 8]

scoresDf = spark.createDataFrame(data_set_1, IntegerType())

def data_multiplier_func(factor, data_vector):
    import tensorflow as tf
    with tf.compat.v1.Session() as sess:
        x1 = tf.constant(factor)
        x2 = tf.constant(data_vector)
        result = tf.multiply(x1, x2)
        return sess.run(result).tolist()

data_multiplier_udf = udf(lambda x:data_multiplier_func(x, data_set_2), ArrayType(IntegerType(),False))
factoredDf = scoresDf.withColumn("final_value", data_multiplier_udf(col("value")))
print(factoredDf.collect())
```

如果沒有任務執行見解功能，當任務失敗時，您只會看到 Spark 擲回的訊息：

`An error occurred while calling o111.collectToPython. Traceback (most recent call last):`

該訊息含糊不清，並限制了您的偵錯體驗。在此情況下，此功能為您提供了兩個 CloudWatch 日誌串流中的其他見解：

1. `job-insights-rca-driver` 日誌串流：
   + *異常事件*：此日誌串流提供與從 Spark 驅動程式和不同分佈式工作者收集的故障相關的 Spark 異常事件。這些事件可協助您了解例外狀況的時間順序傳播，因為故障的程式碼會跨分散在 AWS Glue 工作者的 Spark 任務、執行器和階段執行。
   + *行號*：此日誌串流標識第 21 行，該行叫用以匯入導致失敗的 Python 模組；它還標識第 24 行，其中叫用 Spark Action `collect()`，作為指令碼中最後執行的一行。  
![\[job-insights-rca-driver 日誌串流。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-job-run-insights-3.png)

1. `job-insights-rule-driver` 日誌串流：
   + *根本原因和建議*：除了指令碼中故障的行號和上次執行的行號之外，此日誌串流會顯示根本原因分析和建議，讓您遵循 AWS Glue 文件並設定必要的任務參數，以便在 AWS Glue 任務中使用額外的 Python 模組。
   + *基礎事件*：此日誌串流還顯示了使用服務定義規則評估的 Spark 異常事件，以推斷根本原因並提供建議。  
![\[job-insights-rule-driver 日誌串流。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-job-run-insights-4.png)

# 使用 Amazon CloudWatch 監控
<a name="monitor-cloudwatch"></a>

您可以使用 Amazon CloudWatch 來監控 AWS Glue；該服務會收集並處理來自 AWS Glue 的原始資料，進而將這些資料轉換為便於讀取且幾近即時的指標。這些統計資料會記錄兩週的時間，讓您可以存取歷史資訊，以更清楚 Web 應用程式或服務的執行效能。根據預設，系統會自動將 AWS Glue 指標資料傳送至 CloudWatch。如需更多詳細資訊，請參閱 *Amazon CloudWatch 使用者指南*中的[什麼是 Amazon CloudWatch？](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatch.html)，以及 [AWS Glue 指標](monitoring-awsglue-with-cloudwatch-metrics.md#awsglue-metrics)。

 **連續記錄** 

AWS Glue 也支援即時持續記錄 AWS Glue 任務。當任務的持續記錄啟用時，您就可以在 AWS Glue 主控台或 CloudWatch 主控台儀表板檢視即時日誌。如需詳細資訊，請參閱[記錄 AWS Glue 任務](monitor-continuous-logging.md)。

 **可觀測性指標** 

 啟用**任務可觀測性指標**時，會在任務執行時產生其他 Amazon CloudWatch 指標。使用 AWS Glue 可觀測性指標產生 AWS Glue 內部所發生之事件的深入解析，以改善問題的分類和分析。

**Topics**
+ [使用 Amazon CloudWatch 指標監控 AWS Glue](monitoring-awsglue-with-cloudwatch-metrics.md)
+ [在 AWS Glue 任務設定檔上設定 Amazon CloudWatch 警示](monitor-profile-glue-job-cloudwatch-alarms.md)
+ [記錄 AWS Glue 任務](monitor-continuous-logging.md)
+ [使用 AWS Glue 可觀測性指標進行監控](monitor-observability.md)

# 使用 Amazon CloudWatch 指標監控 AWS Glue
<a name="monitoring-awsglue-with-cloudwatch-metrics"></a>

您可以使用 AWS Glue 任務分析器來分析及監控 AWS Glue 操作。它會收集來自 AWS Glue 任務的原始資料，將這些資料處理成可讀取且幾近即時的指標並存放於 Amazon CloudWatch。系統會將這些統計資料保留於 CloudWatch 中並加以彙整，以便您存取歷史資訊，讓您更深入掌握應用程式的執行情況。

**注意**  
 啟用任務指標並建立 CloudWatch 自訂指標時，您可能會產生額外費用。如需詳細資訊，請參閱 [Amazon CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/)。

## AWS Glue 指標概觀
<a name="metrics-overview"></a>

當您與 AWS Glue 互動時，它會傳送指標至 CloudWatch。您可使用 AWS Glue 主控台 (偏好的方法)、CloudWatch 主控台儀表板或 AWS Command Line Interface (AWS CLI) 中檢視這些指標。

**使用 AWS Glue 主控台儀表板檢視指標**

您能檢視任務指標的摘要或詳細圖表，或是任務執行的詳細圖表。

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台。

1. 在導覽窗格中，選擇**任務執行監控**。

1. 在**任務執行**中，選擇**動作**以停止目前正在執行的任務、檢視任務或倒轉任務書籤。

1. 選取任務，然後選擇**檢視執行詳細資訊**，以檢視有關任務執行的其他資訊。

**使用 CloudWatch 主控台儀表板檢視指標**

指標會先依服務命名空間分組，再依各命名空間內不同的維度組合分類。

1. 在 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，選擇**指標**。

1. 選擇 **Glue (Glue)** 命名空間。

**使用 檢視指標 AWS CLI**
+ 在命令提示中，使用下列命令。

  ```
  1. aws cloudwatch list-metrics --namespace Glue
  ```

AWS Glue 每 30 秒就會向 CloudWatch 回報指標，且 CloudWatch 指標儀表板也設定成每分鐘顯示一次指標。AWS Glue 指標表示先前回報數值中的差異值。適當時，指標儀表板將會彙總 (加總) 30 秒的值，以取得最後完整一分鐘的值。

### AWS Glue Spark 任務的指標行為
<a name="metrics-overview-spark"></a>

 當指令碼中的 `GlueContext` 進行初始化時，系統便已啟用 AWS Glue 指標。通常，唯有在 Apache Spark 任務快結束時，系統才會更新指標。這些指標代表目前所有完成的 Spark 任務彙總值。

但是，AWS Glue 傳遞至 CloudWatch 的 Spark 指標通常是絕對值，可代表這些指標在回報時的目前狀態。AWS Glue 每 30 秒就會向 CloudWatch 回報這些指標，且指標儀表板通常會顯示過去 1 分鐘內收到的資料點平均值。

AWS Glue 指標名稱皆有以下其中一個類型的前綴：
+ `glue.driver.` – 若是以此字首為名稱開頭，即代表該指標屬於 Spark 驅動程式中所有執行器的彙總 AWS Glue 指標，或是對應至 Spark 驅動程式的 Spark 指標。
+ `glue.`*executorId*`.` – *executorId* 是特定 Spark 執行器的數量。它對應至日誌中的執行器。
+ `glue.ALL.` – 名稱開頭為此字首的指標即是所有 Spark 執行器的彙總值。

## AWS Glue 指標
<a name="awsglue-metrics"></a>

AWS Glue 設定檔，並每 30 秒將下列指標傳送至 CloudWatch，指標 AWS Glue 儀表板每分鐘報告一次：


| 指標 | Description | 
| --- | --- | 
|  `glue.driver.aggregate.bytesRead` |  由所有執行器中執行的所有已完成 Spark 任務，從所有資料來源讀取的位元組數。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（計數）。 有效的統計數字：總和。此指標是來自上次報告值的差異值，因此在 AWS Glue 指標儀表板上，SUM 統計資料會用於彙總。 單位：位元組 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 此指標的使用方式與 `glue.ALL.s3.filesystem.read_bytes` 指標相同，差別在於此指標會在 Spark 任務結束時更新並擷取非 S3 資料來源。  | 
|  `glue.driver.aggregate.elapsedTime` |  ETL 經過時間 (以毫秒為單位) (不包括任務啟動程序時間)。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（計數）。 有效的統計數字：總和。此指標是來自上次報告值的差異值，因此在 AWS Glue 指標儀表板上，SUM 統計資料會用於彙總。 單位：毫秒 可用於判斷任務執行平均所需的時間。 使用資料的一些方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.aggregate.numCompletedStages` |  任務中已完成階段的數量。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（計數）。 有效的統計數字：總和。此指標是來自上次報告值的差異值，因此在 AWS Glue 指標儀表板上，SUM 統計資料會用於彙總。 單位：計數 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 使用資料的一些方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|  `glue.driver.aggregate.numCompletedTasks` |  任務中已完成任務的數目。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（計數）。 有效的統計數字：總和。此指標是來自上次報告值的差異值，因此在 AWS Glue 指標儀表板上，SUM 統計資料會用於彙總。 單位：計數 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|  `glue.driver.aggregate.numFailedTasks` |  失敗的任務數量。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（計數）。 有效的統計數字：總和。此指標是來自上次報告值的差異值，因此在 AWS Glue 指標儀表板上，SUM 統計資料會用於彙總。 單位：計數 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 這些資料可用來設定警示，以防止增加失敗，這些失敗可能會提出資料、叢集或指令碼的異常情況。  | 
|  `glue.driver.aggregate.numKilledTasks` |  終止的任務數量。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（計數）。 有效的統計數字：總和。此指標是來自上次報告值的差異值，因此在 AWS Glue 指標儀表板上，SUM 統計資料會用於彙總。 單位：計數 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 使用資料的一些方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|  `glue.driver.aggregate.recordsRead` |  由所有執行器中執行的所有已完成 Spark 任務，從所有資料來源讀取的記錄數。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（計數）。 有效的統計數字：總和。此指標是來自上次報告值的差異值，因此在 AWS Glue 指標儀表板上，SUM 統計資料會用於彙總。 單位：計數 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 此指標的使用方式類似於 `glue.ALL.s3.filesystem.read_bytes` 指標，差別在於此指標會在 Spark 任務結束時更新。  | 
|   `glue.driver.aggregate.shuffleBytesWritten` |  自上一個報告以來，所有執行器寫入隨機播放資料的位元組數 （由 AWS Glue 指標儀表板彙總為上一分鐘為此目的寫入的位元組數）。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（計數）。 有效的統計數字：總和。此指標是來自上次報告值的差異值，因此在 AWS Glue 指標儀表板上，SUM 統計資料會用於彙總。 單位：位元組 可用於監視：任務中的資料隨機播放 (大型聯結、GroupBy、重新分割、聯合)。 使用資料的一些方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.aggregate.shuffleLocalBytesRead` |  自上一個報告以來，所有執行器讀取以在它們之間隨機播放資料的位元組數 （由 AWS Glue 指標儀表板彙總為上一分鐘為此目的讀取的位元組數）。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（計數）。 有效的統計數字：總和。此指標是來自上次報告值的差異值，因此在 AWS Glue 指標儀表板上，SUM 統計資料會用於彙總。 單位：位元組 可用於監視：任務中的資料隨機播放 (大型聯結、GroupBy、重新分割、聯合)。 使用資料的一些方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|  `glue.driver.BlockManager.disk.diskSpaceUsed_MB` |  在所有執行器中使用的 MB 磁碟空間數目。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（規格）。 有效的統計數字：平均。這是 Spark 指標，報告為絕對值。 單位：MB 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 使用資料的一些方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.ExecutorAllocationManager.executors.numberAllExecutors` |  目前正在執行中任務執行器的數量。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（規格）。 有效的統計數字：平均。這是 Spark 指標，報告為絕對值。 單位：計數 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 使用資料的一些方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.ExecutorAllocationManager.executors.numberMaxNeededExecutors` |  滿足目前負載所需的最大值 (主動執行中和擱置中) 任務執行器數目。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（規格）。 有效的統計數字：上限。這是 Spark 指標，報告為絕對值。 單位：計數 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 使用資料的一些方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.jvm.heap.usage`  `glue.`*executorId*`.jvm.heap.usage`  `glue.ALL.jvm.heap.usage`  |  此驅動程式之 JVM 堆疊所使用的記憶體佔比 (比例：0-1)、由 executorId 所辨識的執行器，或所有執行器。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（規格）。 有效的統計數字：平均。這是 Spark 指標，報告為絕對值。 單位：百分比 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 使用資料的一些方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|  `glue.driver.jvm.heap.used`  `glue.`*executorId*`.jvm.heap.used`  `glue.ALL.jvm.heap.used`  |  JVM 堆積針對驅動程式、由 *executorId* 識別的執行器或所有執行器，所使用的記憶體位元組數目。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（規格）。 有效的統計數字：平均。這是 Spark 指標，報告為絕對值。 單位：位元組 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 使用資料的一些方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.s3.filesystem.read_bytes`  `glue.`*executorId*`.s3.filesystem.read_bytes`  `glue.ALL.s3.filesystem.read_bytes`  |  自上次報告以來，驅動程式、*executorId* 識別的執行器或 ALL 執行器從 Amazon S3 讀取的位元組數 （由 AWS Glue 指標儀表板彙總為上一分鐘讀取的位元組數）。 有效維度：`JobName`、`JobRunId` 以及 `Type` (計量)。 有效的統計數字：總和。此指標是來自上次報告值的差異值，因此在 AWS Glue 指標儀表板上，SUM 統計資料會用於彙總。 AWS Glue 指標儀表板曲線下的區域可用來視覺化比較兩個不同任務執行讀取的位元組。 單位：位元組。 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 產生的資料可用於： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.s3.filesystem.write_bytes`  `glue.`*executorId*`.s3.filesystem.write_bytes`  `glue.ALL.s3.filesystem.write_bytes`  |  自上次報告以來，驅動程式、*executorId* 識別的執行器或 ALL 執行器寫入 Amazon S3 的位元組數 （由 AWS Glue 指標儀表板彙總為前一分鐘內寫入的位元組數）。 有效維度：`JobName`、`JobRunId` 以及 `Type` (計量)。 有效的統計數字：總和。此指標是來自上次報告值的差異值，因此在 AWS Glue 指標儀表板上，SUM 統計資料會用於彙總。 AWS Glue 指標儀表板曲線下的區域可用來視覺化比較兩個不同任務執行所寫入的位元組。 單位：位元組 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 使用資料的一些方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|  `glue.driver.streaming.numRecords` |  在微批次中接收的記錄數目。此指標僅適用於 2.0 版及更高 AWS Glue 版本的 AWS Glue 串流任務。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（計數）。 有效的統計數字：總和、上限、下限、平均、百分位數 單位：計數 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|  `glue.driver.streaming.batchProcessingTimeInMs` |  處理批次所需的時間 (以毫秒為單位)。此指標僅適用於 2.0 版及更高 AWS Glue 版本的 AWS Glue 串流任務。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（計數）。 有效的統計數字：總和、上限、下限、平均、百分位數 單位：計數 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 
|   `glue.driver.system.cpuSystemLoad`  `glue.`*executorId*`.system.cpuSystemLoad`  `glue.ALL.system.cpuSystemLoad`  |  驅動程式使用的 CPU 系統負載佔比 (比例：0-1)、由 *executorId* 所辨識的執行器，或所有執行器。 有效維度： `JobName`( AWS Glue 任務的名稱）、 `JobRunId`(JobRun ID 或 `ALL`) 和 `Type`（規格）。 有效的統計數字：平均。此指標會報告為絕對值。 單位：百分比 可用於監控： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html) 使用資料的一些方法： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)  | 

## AWS Glue 指標的維度
<a name="awsglue-metricdimensions"></a>

AWS Glue 指標使用 AWS Glue 命名空間，並提供下列維度的指標：


| 維度 | Description | 
| --- | --- | 
|  `JobName`  |  此維度會篩選特定任務之所有 AWS Glue 任務執行的指標。  | 
|  `JobRunId`  |  此維度會依 JobRun ID 或 篩選特定 AWS Glue 任務執行的指標`ALL`。  | 
|  `Type`  |  此維度會依 `count` (彙總數字) 或 `gauge` (某個時間點的值) 篩選指標。  | 

如需更多資訊，請參閱 [Amazon CloudWatch 使用者指南](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/)。

# 在 AWS Glue 任務設定檔上設定 Amazon CloudWatch 警示
<a name="monitor-profile-glue-job-cloudwatch-alarms"></a>

AWS Glue 指標也可於 Amazon CloudWatch 中使用。您可以針對已排程任務的任何 AWS Glue 指標，來設定警示。

下列是設定警示的幾個常見案例：
+ 執行任務的記憶體用盡 (OOM)：設定警示，當 AWS Glue 任務的驅動程式或執行器之記憶體使用量超過正常平均值時，發出警示。
+ 落後的執行器：設定警示，當 AWS Glue 任務中執行器的數量長時間持續低於某個閾值時，發出警示。
+ 資料後端記錄或重新處理：使用 CloudWatch 的數學表達式，比較任務流程中個別任務的指標。然後，您就可以根據產生的運算式數值 (例如任務所寫入位元組的比率，以及後續任務所讀取的位元組數)，來觸發警示。

如需設定警示的詳細指示，請參閱 *[Amazon CloudWatch Events 使用者指南](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/)*中的[建立或編輯 CloudWatch 警示](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ConsoleAlarms.html)。

如需使用 CloudWatch 的監控與除錯案例，請參閱[任務監控與偵錯](monitor-profile-glue-job-cloudwatch-metrics.md)。

# 記錄 AWS Glue 任務
<a name="monitor-continuous-logging"></a>

 在 AWS Glue 5.0 中，所有任務都具有即時記錄功能。此外，可以指定自訂組態選項來量身打造記錄行為。這些選項包括設定 Amazon CloudWatch 日誌群組名稱、 Amazon CloudWatch 日誌串流字首 （在 AWS Glue 任務執行 ID 和驅動程式/執行器 ID 之前），以及日誌訊息的日誌轉換模式。這些組態可讓您在具有不同過期政策的自訂 Amazon CloudWatch 日誌群組中彙總日誌。此外，可以使用自訂日誌串流字首和轉換模式，更有效地分析日誌。此自訂層級可讓您根據特定需求來最佳化日誌管理和分析。

## AWS Glue 5.0 中的記錄行為
<a name="monitor-logging-behavior-glue-50"></a>

 根據預設，系統會將系統日誌、Spark 協助程式日誌和使用者 AWS Glue 日誌寫入 中的`/aws-glue/jobs/error`日誌群組 Amazon CloudWatch。另一方面，使用者 stdout (標準輸出) 和 stderr (標準錯誤) 日誌預設會寫入到 `/aws-glue/jobs/output` 日誌群組。

## 自訂記錄
<a name="monitor-logging-custom"></a>

 可以使用下列任務引數來自訂預設日誌群組和日誌串流字首：
+  `--custom-logGroup-prefix`：可讓您指定 `/aws-glue/jobs/error` 和 `/aws-glue/jobs/output` 日誌群組的自訂字首。如果您提供自訂字首，日誌群組名稱的格式如下：
  +  `/aws-glue/jobs/error` 將為 `<customer prefix>/error` 
  +  `/aws-glue/jobs/output ` 將為 `<customer prefix>/output` 
+  `--custom-logStream-prefix`：可讓您為日誌群組中的日誌串流名稱指定自訂字首。如果您提供自訂字首，日誌串流名稱的格式如下：
  +  `jobrunid-driver` 將為 `<customer log stream>-driver` 
  +  `jobrunid-executorNum` 將為 `<customer log stream>-executorNum` 

 自訂字首的驗證規則和限制：
+  整個日誌串流名稱的長度必須介於 1 到 512 個字元之間。
+  自訂字首本身限制為 400 個字元。
+  自訂字首必須符合規則表達式模式 `[^:\$1]\$1` (允許的特殊字元為 '\$1'、'-' 和 '/')。

## 使用自訂指令碼記錄器記錄應用程式特定訊息
<a name="monitor-logging-script"></a>

您可以使用 AWS Glue 記錄器，在指令碼中記錄即時傳送到驅動程式日誌串流的任何應用程式特定訊息。

以下範例顯示 Python 指令碼。

```
from awsglue.context import GlueContext
from pyspark.context import SparkContext

sc = SparkContext()
glueContext = GlueContext(sc)
logger = glueContext.get_logger()
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
```

以下範例顯示 Scala 指令碼。

```
import com.amazonaws.services.glue.log.GlueLogger

object GlueApp {
  def main(sysArgs: Array[String]) {
    val logger = new GlueLogger
    logger.info("info message")
    logger.warn("warn message")
    logger.error("error message")
  }
}
```

## 啟用進度列來顯示任務進度
<a name="monitor-logging-progress"></a>

AWS Glue 在`JOB_RUN_ID-progress-bar`日誌串流下提供即時進度列，以檢查 AWS Glue 任務執行狀態。目前它僅支援初始化 `glueContext` 的任務。如果您在未初始化 的情況下執行純 Spark 任務`glueContext`，則不會顯示 AWS Glue 進度列。

進度列每 5 秒顯示一次以下的最新進度。

```
Stage Number (Stage Name): > (numCompletedTasks + numActiveTasks) / totalNumOfTasksInThisStage]
```

## 記錄的安全組態 Amazon CloudWatch
<a name="monitor-security-config-logging"></a>

 為 Amazon CloudWatch 日誌啟用安全組態時， 會使用包含安全組態名稱的特定命名模式 AWS Glue 建立日誌群組。

### 使用安全組態命名日誌群組
<a name="monitor-log-group-naming"></a>

 預設和自訂日誌群組將如下所示：
+  **預設錯誤日誌群組：**`/aws-glue/jobs/Security-Configuration-Name-role/glue-job-role/error`
+  **預設輸出日誌群組：**`/aws-glue/jobs/Security-Configuration-Name-role/glue-job-role/output`
+  **自訂錯誤日誌群組 (AWS Glue 5.0)：** `custom-log-group-prefix/Security-Configuration-Name-role/glue-job-role/error`
+  **自訂輸出日誌群組 (AWS Glue 5.0)：** `custom-log-group-prefix/Security-Configuration-Name-role/glue-job-role/output`

### 所需的 IAM 許可
<a name="monitor-logging-iam-permissions"></a>

 如果使用 Amazon CloudWatch Logs 啟用安全組態，則需要將 `logs:AssociateKmsKey` 許可新增至您的 IAM 角色許可。如果未包含該許可，則會停用連續記錄。

 此外，若要設定 Amazon CloudWatch 日誌的加密，請遵循《Amazon [ Logs 使用者指南》中的使用 在 Amazon CloudWatch 日誌中加密日誌資料 AWS Key Management Service](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html)的指示。 Amazon CloudWatch 

### 其他資訊
<a name="additional-info"></a>

 如需建立安全組態的詳細資訊，請參閱在 [AWS Glue 主控台上管理安全組態](https://docs.aws.amazon.com/glue/latest/dg/console-security-configurations.html)。

**Topics**
+ [AWS Glue 5.0 中的記錄行為](#monitor-logging-behavior-glue-50)
+ [自訂記錄](#monitor-logging-custom)
+ [使用自訂指令碼記錄器記錄應用程式特定訊息](#monitor-logging-script)
+ [啟用進度列來顯示任務進度](#monitor-logging-progress)
+ [記錄的安全組態 Amazon CloudWatch](#monitor-security-config-logging)
+ [啟用持續記錄 AWS Glue 4.0 和舊版任務](monitor-continuous-logging-enable.md)
+ [檢視 AWS Glue 任務的日誌](monitor-continuous-logging-view.md)

# 啟用持續記錄 AWS Glue 4.0 和舊版任務
<a name="monitor-continuous-logging-enable"></a>

**注意**  
 在 AWS Glue 4.0 和舊版中，持續記錄是可用的功能。不過，隨著 AWS Glue 5.0 的推出，所有任務都具有即時記錄功能。如需 AWS Glue 5.0 中記錄功能和組態選項的詳細資訊，請參閱[記錄 AWS Glue 任務](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuous-logging.html)。

您可以使用 AWS Glue 主控台或透過 AWS Command Line Interface () 啟用持續記錄AWS CLI。

在您建立新任務、編輯現有任務，或是透過 AWS CLI啟用任務時，可以啟用持續記錄。

您也可以指定自訂組態選項，例如 Amazon CloudWatch 日誌群組名稱、 AWS Glue 任務執行 ID 驅動程式/執行器 ID 之前的 CloudWatch 日誌串流字首，以及日誌訊息的日誌轉換模式。這些組態可協助您在具有不同過期政策的自訂 CloudWatch 日誌群組中設定彙總日誌，並使用自訂日誌串流字首和轉換模式進一步分析它們。

**Topics**
+ [使用 AWS 管理主控台](#monitor-continuous-logging-enable-console)
+ [使用自訂指令碼記錄器記錄應用程式特定訊息](#monitor-continuous-logging-script)
+ [啟用進度列來顯示任務進度](#monitor-continuous-logging-progress)
+ [具有連續記錄的安全組態](#monitor-logging-encrypt-log-data)

## 使用 AWS 管理主控台
<a name="monitor-continuous-logging-enable-console"></a>

請依照下列步驟，使用 主控台在建立或編輯 AWS Glue 任務時啟用持續記錄。

**建立具有持續記錄的新 AWS Glue 任務**

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台。

1. 在導覽窗格中，選擇 **ETL 任務**。

1. 選擇**視覺化的 ETL**。

1. 在**任務詳細資訊**索引標籤中，展開**進階屬性**部分。

1. 在**持續記錄**下，選取在 **CloudWatch 中啟用日誌**。

**啟用現有 AWS Glue 任務的持續記錄**

1. 在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台。

1. 在導覽窗格中，選擇 **Jobs (任務)**。

1. 從 **Jobs (任務)** 清單中選擇現有的任務。

1. 選擇 **Action (動作)**、**Edit job (編輯任務)**。

1. 在**任務詳細資訊**索引標籤中，展開**進階屬性**部分。

1. 在**持續記錄**下，選取在 **CloudWatch 中啟用日誌**。

### 使用 AWS CLI
<a name="monitor-continuous-logging-cli"></a>

若要啟用持續記錄，您可以將任務參數傳遞至 AWS Glue 任務。傳遞下列特殊任務參數，類似於其他 AWS Glue 任務參數。如需詳細資訊，請參閱[在 Glue AWS 任務中使用任務參數](aws-glue-programming-etl-glue-arguments.md)。

```
'--enable-continuous-cloudwatch-log': 'true'
```

您可以指定自訂 Amazon CloudWatch 日誌群組名稱。如果未指定，則預設日誌群組名稱為 `/aws-glue/jobs/logs-v2`。

```
'--continuous-log-logGroup': 'custom_log_group_name'
```

您可以指定自訂 Amazon CloudWatch 日誌串流字首。如果未指定，則預設日誌資料流字首為任務執行 ID。

```
'--continuous-log-logStreamPrefix': 'custom_log_stream_prefix'
```

您可以指定自訂持續記錄轉換模式。如果未指定，則預設轉換模式為 `%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n`。請注意，轉換模式僅適用於驅動程式日誌和執行程式日誌。它不會影響 AWS Glue 進度列。

```
'--continuous-log-conversionPattern': 'custom_log_conversion_pattern'
```

## 使用自訂指令碼記錄器記錄應用程式特定訊息
<a name="monitor-continuous-logging-script"></a>

您可以使用 AWS Glue 記錄器，在指令碼中記錄即時傳送到驅動程式日誌串流的任何應用程式特定訊息。

以下範例顯示 Python 指令碼。

```
from awsglue.context import GlueContext
from pyspark.context import SparkContext

sc = SparkContext()
glueContext = GlueContext(sc)
logger = glueContext.get_logger()
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
```

以下範例顯示 Scala 指令碼。

```
import com.amazonaws.services.glue.log.GlueLogger

object GlueApp {
  def main(sysArgs: Array[String]) {
    val logger = new GlueLogger
    logger.info("info message")
    logger.warn("warn message")
    logger.error("error message")
  }
}
```

## 啟用進度列來顯示任務進度
<a name="monitor-continuous-logging-progress"></a>

AWS Glue 在`JOB_RUN_ID-progress-bar`日誌串流下提供即時進度列，以檢查 AWS Glue 任務執行狀態。目前它僅支援初始化 `glueContext` 的任務。如果您在未初始化 的情況下執行純 Spark 任務`glueContext`，則不會顯示 AWS Glue 進度列。

進度列每 5 秒顯示一次以下的最新進度。

```
Stage Number (Stage Name): > (numCompletedTasks + numActiveTasks) / totalNumOfTasksInThisStage]
```

## 具有連續記錄的安全組態
<a name="monitor-logging-encrypt-log-data"></a>

如果為 CloudWatch 日誌啟用安全組態， AWS Glue 會為連續日誌建立名為 的日誌群組，如下所示：

```
<Log-Group-Name>-<Security-Configuration-Name>
```

預設和自訂日誌群組將如下所示：
+ 預設的連續日誌群組為 `/aws-glue/jobs/error-<Security-Configuration-Name>`
+ 自訂的連續日誌群組為 `<custom-log-group-name>-<Security-Configuration-Name>`

您需要新增 `logs:AssociateKmsKey` 至您的 IAM 角色許可 (如果您使用 CloudWatch Logs 啟用安全組態)。如果未包含該許可，則會停用連續記錄。此外，若要設定 CloudWatch Logs 的加密，請依照 *Amazon CloudWatch Logs 使用者指南*中的[使用 AWS Key Management Service加密 CloudWatch Logs 中的日誌資料](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html)指示進行。

如需建立安全組態的詳細資訊，請參閱[在 AWS Glue 主控台上使用安全組態](console-security-configurations.md)。

**注意**  
 啟用日誌記錄並建立其他 CloudWatch 日誌事件時，可能會產生額外費用。如需詳細資訊，請參閱 [Amazon CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/)。

# 檢視 AWS Glue 任務的日誌
<a name="monitor-continuous-logging-view"></a>

您可以使用 AWS Glue 主控台或 Amazon CloudWatch 主控台檢視即時日誌。

**使用 AWS Glue 主控台儀表板檢視即時日誌**

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台。

1. 在導覽窗格中，選擇 **Jobs (任務)**。

1. 新增或開始現有的任務。選擇 **Action (動作)**、**Run job (執行任務)**。

   當您開始執行任務時，請導覽到頁面，其中包含有關執行中任務的資訊：
   + **Logs (日誌)** 標籤會顯示較舊的彙總應用程式日誌 。
   + **日誌**索引標籤會在任務搭配 `glueContext` 初始化執行時顯示即時進度列。
   + **Logs** 索引標籤也包含**驅動程式日誌**，可擷取即時 Apache Spark 驅動程式日誌，以及在任務執行時使用應用程式記錄器記錄的指令碼中的 AWS Glue 應用程式日誌。

1. 對於較舊的任務，您也可以在 **Job History (任務歷史記錄)** 檢視中透過選擇 **Logs (日誌)** 來檢視即時日誌。此動作會移至 CloudWatch 主控台，並顯示所有 Spark 驅動程式、執行器，以及該任務執行的進度列日誌串流。

**使用 CloudWatch 主控台儀表板檢視即時日誌**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，選擇 **Log (日誌)**。

1. 選擇 **/aws-glue/jobs/error/** 日誌群組。

1. 在 **Filter (篩選條件)** 方塊中，貼上任務執行 ID。

   您可以檢視驅動程式日誌、執行器日誌，以及進度列 (如果使用 **Standard filter (標準篩選條件)**)。

# 使用 AWS Glue 可觀測性指標進行監控
<a name="monitor-observability"></a>

**注意**  
AWS Glue 可觀測性指標可在 AWS Glue 4.0 及更新版本上使用。

 使用 AWS Glue 可觀測性指標針對 Apache Spark 任務產生 AWS Glue 內部所發生之事件的深入解析，以改善問題的分類和分析。可觀測性指標能透過 Amazon CloudWatch 儀表板以視覺化呈現，並可用來協助執行錯誤的根本原因分析，以及診斷效能瓶頸。您可以減少大規模偵錯問題所花費的時間，使您能夠專注於更快、更有效地解決問題。

 AWS Glue 可觀測性提供以下四個群組中分類的 Amazon CloudWatch 指標：
+  **可靠性 (即錯誤類別)**：可輕鬆識別特定時間範圍內您可能想要解決之常見失敗原因。
+  **效能 (即偏態)**：識別效能瓶頸並套用調整技術。例如，當您因任務偏態而遇到效能降低時，您可能會想要啟用 Spark 調適性查詢執行，並微調偏斜聯結閾值。
+  **輸送量 (即每個來源/接收器輸送量)**：監控資料讀取和寫入的趨勢。您也可以設定異常的 Amazon CloudWatch 警示。
+  **資源使用率 (即工作者、記憶體和磁碟使用率)**：有效率地找出容量使用率低的任務。您可能會想要為這些任務啟用 AWS Glue 自動擴展。

## 開始使用 AWS Glue 可觀測性指標
<a name="monitor-observability-getting-started"></a>

**注意**  
 設會在 AWS Glue Studio 主控台中啟用新的指標。

**要在 AWS Glue Studio 中設定可觀測性指標：**

1. 登入 AWS Glue 主控台，然後從主控台功能表選擇 **ETL 任務**。

1. 按一下**您的任務**區段中的任務名稱，即可選擇任務。

1. 選擇 **Job details** (任務詳細資訊) 索引標籤。

1. 捲動至底部，然後選擇**進階屬性**，接著選擇**任務可觀測性指標**。  
![\[螢幕擷取畫面顯示「任務詳細資料」索引標籤「進階」屬性。「任務可觀測性指標」選項會反白顯示。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/job-details-observability-metrics.png)

**若要使用 啟用AWS Glue可觀測性指標 AWS CLI：**
+  將輸入 JSON 檔案中的下列鍵值新增至 `--default-arguments` 對應：

  ```
  --enable-observability-metrics, true
  ```

## 使用 AWS Glue 可觀測性
<a name="monitor-observability-cloudwatch"></a>

 由於可觀測性指標是透過 AWS Glue 提供 Amazon CloudWatch，因此您可以使用 Amazon CloudWatch 主控台 AWS CLI、 SDK 或 API 來查詢可觀測性指標資料點。請參閱[使用 Glue 可觀測性監控資源使用率以降低成本](https://aws.amazon.com/blogs/big-data/enhance-monitoring-and-debugging-for-aws-glue-jobs-using-new-job-observability-metrics/)，了解何時使用 AWS Glue 可觀測性指標的範例使用案例。

### AWS Glue 在 Amazon CloudWatch 主控台中使用可觀測性
<a name="monitor-observability-cloudwatch-console"></a>

**若要在 Amazon CloudWatch 主控台中查詢和視覺化指標：**

1.  開啟 Amazon CloudWatch 主控台，然後選擇**所有指標**。

1.  在自訂命名空間下方，選取 **AWS Glue**。

1.  選擇**任務可觀測性指標、每個來源的可觀測性指標，或每個接收器的可觀測性指標**。

1. 搜尋特定的指標名稱、任務名稱、任務執行 ID，然後加以選取。

1. 在**圖形化指標**索引標籤下方，設定您偏好的統計資料、期間和其他選項。  
![\[螢幕擷取畫面顯示 Amazon CloudWatch 主控台和指標圖表。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/cloudwatch-console-metrics.png)

**使用 查詢可觀測性指標 AWS CLI：**

1.  建立指標定義 JSON 檔案並使用自己的值取代 `your-Glue-job-name` 和 `your-Glue-job-run-id`。

   ```
   $ cat multiplequeries.json
   [
       {
           "Id": "avgWorkerUtil_0",
           "MetricStat": {
               "Metric": {
                   "Namespace": "Glue",
                   "MetricName": "glue.driver.workerUtilization",
                   "Dimensions": [
                       {
                           "Name": "JobName",
                           "Value": "<your-Glue-job-name-A>"
                       },
                       {
                           "Name": "JobRunId",
                           "Value": "<your-Glue-job-run-id-A>"
                       },
                       {
                           "Name": "Type",
                           "Value": "gauge"
                       },
                       {
                           "Name": "ObservabilityGroup",
                           "Value": "resource_utilization"
                       }
                   ]
               },
               "Period": 1800,
               "Stat": "Minimum",
               "Unit": "None"
           }
       },
       {
           "Id": "avgWorkerUtil_1",
           "MetricStat": {
               "Metric": {
                   "Namespace": "Glue",
                   "MetricName": "glue.driver.workerUtilization",
                   "Dimensions": [
                       {
                           "Name": "JobName",
                           "Value": "<your-Glue-job-name-B>"
                       },
                       {
                           "Name": "JobRunId",
                           "Value": "<your-Glue-job-run-id-B>"
                       },
                       {
                           "Name": "Type",
                           "Value": "gauge"
                       },
                       {
                           "Name": "ObservabilityGroup",
                           "Value": "resource_utilization"
                       }
                   ]
               },
               "Period": 1800,
               "Stat": "Minimum",
               "Unit": "None"
           }
       }
   ]
   ```

1.  執行 `get-metric-data` 命令：

   ```
   $ aws cloudwatch get-metric-data --metric-data-queries file: //multiplequeries.json \
        --start-time '2023-10-28T18: 20' \
        --end-time '2023-10-28T19: 10'  \
        --region us-east-1
   {
       "MetricDataResults": [
           {
               "Id": "avgWorkerUtil_0",
               "Label": "<your-label-for-A>",
               "Timestamps": [
                   "2023-10-28T18:20:00+00:00"
               ],
               "Values": [
                   0.06718750000000001
               ],
               "StatusCode": "Complete"
           },
           {
               "Id": "avgWorkerUtil_1",
               "Label": "<your-label-for-B>",
               "Timestamps": [
                   "2023-10-28T18:50:00+00:00"
               ],
               "Values": [
                   0.5959183673469387
               ],
               "StatusCode": "Complete"
           }
       ],
       "Messages": []
   }
   ```

## 可觀測性指標
<a name="monitor-observability-metrics-definitions"></a>

 AWS Glue 可觀測性設定檔並 Amazon CloudWatch 每 30 秒將下列指標傳送至 ，其中一些指標會顯示在AWS Glue Studio任務執行監控頁面中。


| 指標 | Description | Category | 
| --- | --- | --- | 
| glue.driver.skewness.stage |  指標類別：job\$1performance Spark 階段執行偏態：此指標表示特定階段中最大任務持續時間與此階段中的中等任務持續時間相比較有多長。其會擷取執行偏態，此偏態可能是由輸入資料偏態或轉換 (例如，偏斜聯結) 引起。此指標的值落在 [0, infinity[ 的範圍內，其中 0 表示該階段所有任務中，任務執行時間的最大值與中位數的比率小於特定階段偏態因子。預設階段偏態因子為「5」，可透過 spark conf 覆寫此值：spark.metrics.conf.driver.source.glue.jobPerformance.skewnessFactor 階段偏態值為 1 表示比率是階段偏態因子的兩倍。 階段偏態的值會每 30 秒更新一次，可反映目前的偏態。階段結束時的值會反映最後階段偏態。 此階段層級指標用於計算任務層級指標 `glue.driver.skewness.job`。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (job\$1performance) 有效的統計資料：平均值、最大值、最小值、百分位數 單位：計數  | job\$1performance | 
| glue.driver.skewness.job |  指標類別：job\$1performance  任務偏態是所有階段的加權偏態的最大值。階段偏態 (glue.driver.skewness.stage) 使用階段持續時間加權。這是為了避免以下極端情況，即相對於其他階段，嚴重偏斜的階段實際執行時間很短 (因此其偏態對整體作業效能影響不大，不值得費力嘗試解決其偏態)。 此指標會在每個階段完成時更新，因此最後一個值會反映實際的整體作業偏態。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (job\$1performance) 有效的統計資料：平均值、最大值、最小值、百分位數 單位：計數  | job\$1performance | 
| glue.succeed.ALL |  指標類別：錯誤 成功的作業執行總數，可完成失敗類別的圖片 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計數)，以及 ObservabilityGroup (錯誤) 有效的統計資料：總和 單位：計數  | error | 
| glue.error.ALL |  指標類別：錯誤  作業執行錯誤總數，可完成失敗類別的圖片 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計數)，以及 ObservabilityGroup (錯誤) 有效的統計資料：總和 單位：計數  | error | 
| glue.error.[error category] |  指標類別：錯誤  這實際上是一組指標，只有在作業執行失敗時才會更新。錯誤分類有助於分類和偵錯。當作業執行失敗時，會將造成失敗的錯誤分類，並將對應的錯誤類別指標設為 1。這有助於針對所有作業錯誤分析執行隨著時間變化的失敗分析，以找出最常見的失敗類別並開始解決這些問題。AWS Glue 有 28 個錯誤類別，包括 OUT\$1OF\$1MEMORY (驅動程式和執行程式)、PERMISSION、SYNTAX 和 THROTTLING 錯誤類別。錯誤類別還包括 COMPILATION、LAUNCH 和 TIMEOUT 錯誤類別。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計數)，以及 ObservabilityGroup (錯誤) 有效的統計資料：總和 單位：計數  | error | 
| glue.driver.workerUtilization |  指標類別：resource\$1utilization  實際使用的已配置工作者百分比。如果不理想，自動擴展可以有所助益。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值、最大值、最小值、百分位數 單位：百分比  | resource\$1utilization | 
| glue.driver.memory.heap.[available \$1 used] |  指標類別：resource\$1utilization  在作業執行期間，驅動程式可用/已用的堆積記憶體。這有助於了解記憶體使用量趨勢，特別是隨著時間的推移，除了對記憶體相關的失敗進行偵錯，還有助於避免潛在的失敗。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：位元組  | resource\$1utilization | 
| glue.driver.memory.heap.used.percentage |  指標類別：resource\$1utilization  在作業執行期間，驅動程式已用的 (%) 堆積記憶體。這有助於了解記憶體使用量趨勢，特別是隨著時間的推移，除了對記憶體相關的失敗進行偵錯，還有助於避免潛在的失敗。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：百分比  | resource\$1utilization | 
| glue.driver.memory.non-heap.[available \$1 used] |  指標類別：resource\$1utilization  在作業執行期間，驅動程式可用/已用的非堆積記憶體。這有助於了解記憶體使用量趨勢，特別是隨著時間的推移，除了對記憶體相關的失敗進行偵錯，還有助於避免潛在的失敗。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：位元組  | resource\$1utilization | 
| glue.driver.memory.non-heap.used.percentage |  指標類別：resource\$1utilization  在作業執行期間，驅動程式已用的 (%) 非堆積記憶體。這有助於了解記憶體使用量趨勢，特別是隨著時間的推移，除了對記憶體相關的失敗進行偵錯，還有助於避免潛在的失敗。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：百分比  | resource\$1utilization | 
| glue.driver.memory.total.[available \$1 used] |  指標類別：resource\$1utilization  在作業執行期間，驅動程式可用/已用的記憶體總量。這有助於了解記憶體使用量趨勢，特別是隨著時間的推移，除了對記憶體相關的失敗進行偵錯，還有助於避免潛在的失敗。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：位元組  | resource\$1utilization | 
| glue.driver.memory.total.used.percentage |  指標類別：resource\$1utilization  在作業執行期間，驅動程式已用的 (%) 記憶體總量。這有助於了解記憶體使用量趨勢，特別是隨著時間的推移，除了對記憶體相關的失敗進行偵錯，還有助於避免潛在的失敗。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：百分比  | resource\$1utilization | 
| glue.ALL.memory.heap.[available \$1 used] |  指標類別：resource\$1utilization  執行程式可用/已用的堆積記憶體。ALL 表示所有執行程式。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：位元組  | resource\$1utilization | 
| glue.ALL.memory.heap.used.percentage |  指標類別：resource\$1utilization  執行程式已用的 (%) 堆積記憶體。ALL 表示所有執行程式。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：百分比  | resource\$1utilization | 
| glue.ALL.memory.non-heap.[available \$1 used] |  指標類別：resource\$1utilization  執行程式可用/已用的非堆積記憶體。ALL 表示所有執行程式。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：位元組  | resource\$1utilization | 
| glue.ALL.memory.non-heap.used.percentage |  指標類別：resource\$1utilization  執行程式已用的 (%) 非堆積記憶體。ALL 表示所有執行程式。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：百分比  | resource\$1utilization | 
| glue.ALL.memory.total.[available \$1 used] |  指標類別：resource\$1utilization  執行程式可用/已用的記憶體總量。ALL 表示所有執行程式。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：位元組  | resource\$1utilization | 
| glue.ALL.memory.total.used.percentage |  指標類別：resource\$1utilization  執行程式已用的 (%) 記憶體總量。ALL 表示所有執行程式。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：百分比  | resource\$1utilization | 
| glue.driver.disk.[available\$1GB \$1 used\$1GB] |  指標類別：resource\$1utilization  在作業執行期間，驅動程式可用/已用的磁碟空間。這有助於了解磁碟使用量趨勢，特別是隨著時間的推移，除了對磁碟空間不足相關的失敗進行偵錯，還有助於避免潛在的失敗。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：千兆位元組 (GB)  | resource\$1utilization | 
| glue.driver.disk.used.percentage] |  指標類別：resource\$1utilization  在作業執行期間，驅動程式可用/已用的磁碟空間。這有助於了解磁碟使用量趨勢，特別是隨著時間的推移，除了對磁碟空間不足相關的失敗進行偵錯，還有助於避免潛在的失敗。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：百分比  | resource\$1utilization | 
| glue.ALL.disk.[available\$1GB \$1 used\$1GB] |  指標類別：resource\$1utilization  執行程式可用/已用的磁碟空間。ALL 表示所有執行程式。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：千兆位元組 (GB)  | resource\$1utilization | 
| glue.ALL.disk.used.percentage |  指標類別：resource\$1utilization  執行程式可用/已用/已用(%) 的磁碟空間。ALL 表示所有執行程式。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)，以及 ObservabilityGroup (resource\$1utilization) 有效的統計資料：平均值 單位：百分比  | resource\$1utilization | 
| glue.driver.bytesRead |  指標類別：輸送量  此作業執行中每個輸入來源以及針對所有來源讀取的位元組數目。這有助於了解資料磁碟區及其隨時間的變化，進而幫助解決資料偏態等問題。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (儀表)、ObservabilityGroup (resource\$1utilization)，以及 Source (來源資料位置) 有效的統計資料：平均值 單位：位元組  | 輸送量 | 
| glue.driver.[recordsRead \$1 filesRead]  |  指標類別：輸送量  此作業執行中每個輸入來源以及針對所有來源讀取的記錄/檔案數目。這有助於了解資料磁碟區及其隨時間的變化，進而幫助解決資料偏態等問題。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (儀表)、ObservabilityGroup (resource\$1utilization)，以及 Source (來源資料位置) 有效的統計資料：平均值 單位：計數  | 輸送量 | 
| glue.driver.partitionsRead  |  指標類別：輸送量  此作業執行中每個 Amazon S3 輸入來源以及針對所有來源讀取的分割區數目。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (儀表)、ObservabilityGroup (resource\$1utilization)，以及 Source (來源資料位置) 有效的統計資料：平均值 單位：計數  | 輸送量 | 
| glue.driver.bytesWrittten |  指標類別：輸送量  此作業執行中每個輸出接收器以及針對所有接收器寫入的位元組數目。這有助於了解資料磁碟區及其隨時間的演進，進而幫助解決處理偏態等問題。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)、ObservabilityGroup (resource\$1utilization)，以及 Sink (接收器資料位置) 有效的統計資料：平均值 單位：位元組  | 輸送量 | 
| glue.driver.[recordsWritten \$1 filesWritten] |  指標類別：輸送量  此作業執行中每個輸出接收器以及針對所有接收器寫入的記錄/檔案數目。這有助於了解資料磁碟區及其隨時間的演進，進而幫助解決處理偏態等問題。 有效維度：JobName (AWS Glue 作業的名稱)、JobRunId (JobRun ID 或 ALL)、Type (計量)、ObservabilityGroup (resource\$1utilization)，以及 Sink (接收器資料位置) 有效的統計資料：平均值 單位：計數  | 輸送量 | 

## 錯誤類別
<a name="monitor-observability-error-categories"></a>


| 錯誤類別 | Description | 
| --- | --- | 
| COMPILATION\$1ERROR | 編譯 Scala 程式碼期間出現錯誤。 | 
| CONNECTION\$1ERROR | 連線到服務/遠端主機/資料庫服務等項目時出現錯誤。 | 
| DISK\$1NO\$1SPACE\$1ERROR |  驅動程式/執行程式的磁碟中沒有剩餘空間時出現錯誤。  | 
| OUT\$1OF\$1MEMORY\$1ERROR | 驅動程式/執行程式的記憶體中沒有剩餘空間時出現錯誤。 | 
| IMPORT\$1ERROR | 匯入相依性時出現錯誤。 | 
| INVALID\$1ARGUMENT\$1ERROR | 輸入引數無效/非法時出現錯誤。 | 
| PERMISSION\$1ERROR | 缺少服務、資料等項目的許可時出現錯誤。 | 
| RESOURCE\$1NOT\$1FOUND\$1ERROR |  資料、位置等項目不存在時出現錯誤。  | 
| QUERY\$1ERROR | 因 Spark SQL 查詢執行而出現錯誤。 | 
| SYNTAX\$1ERROR | 指令碼中存在語法錯誤時出現錯誤。 | 
| THROTTLING\$1ERROR | 達到服務並行限制或超出服務配額限制時出現錯誤。 | 
| DATA\$1LAKE\$1FRAMEWORK\$1ERROR | 因 AWS Glue 原生支援的資料湖架構 (例如 Hudi、Iceberg 等) 而出現錯誤。 | 
| UNSUPPORTED\$1OPERATION\$1ERROR | 進行不支援的操作時出現錯誤。 | 
| RESOURCES\$1ALREADY\$1EXISTS\$1ERROR | 要建立或新增的資源已存在時出現錯誤。 | 
| GLUE\$1INTERNAL\$1SERVICE\$1ERROR | 發生 AWS Glue 內部服務問題時出現錯誤。 | 
| GLUE\$1OPERATION\$1TIMEOUT\$1ERROR | AWS Glue 操作逾時時出現錯誤。 | 
| GLUE\$1VALIDATION\$1ERROR | 無法驗證 AWS Glue 作業所需的值時出現錯誤。 | 
| GLUE\$1JOB\$1BOOKMARK\$1VERSION\$1MISMATCH\$1ERROR | 在相同的來源儲存貯體上執行同一個作業並同時寫入相同/不同的目的地 (並行數 > 1) 時出現錯誤 | 
| LAUNCH\$1ERROR | 在 AWS Glue 作業啟動階段出現錯誤。 | 
| DYNAMODB\$1ERROR |  Amazon DynamoDB 服務發生一般錯誤。 | 
| GLUE\$1ERROR | 因 AWS Glue 服務而出現一般錯誤。 | 
| LAKEFORMATION\$1ERROR |  AWS Lake Formation 服務出現一般錯誤。 | 
| REDSHIFT\$1ERROR |  Amazon Redshift 服務出現一般錯誤。 | 
| S3\$1ERROR | 因 Amazon S3 服務而出現一般錯誤。 | 
| SYSTEM\$1EXIT\$1ERROR | 一般系統結束錯誤。 | 
| TIMEOUT\$1ERROR | 作業因操作逾時而失敗時出現一般錯誤。 | 
| UNCLASSIFIED\$1SPARK\$1ERROR | 因 Spark 而出現一般錯誤。 | 
| UNCLASSIFIED\$1ERROR | 預設錯誤類別。 | 

## 限制
<a name="monitoring-observability-limitations"></a>

**注意**  
必須將 `glueContext` 初始化才能發布指標。

 在來源維度中，值可以是 Amazon S3 路徑或資料表名稱，具體取決於來源類型。此外，如果來源為 JDBC 且使用的是查詢選項，則會在來源維度中設定查詢字串。如果該值超過 500 個字元，則會修剪至 500 個字元以內。值的限制如下：
+ 非 ASCII 字元會被移除。
+ 如果來源名稱不包含任何 ASCII 字元，則會將該名稱轉換為 <非 ASCII 輸入>。

### 輸送量指標的限制和考量
<a name="monitoring-observability-considerations"></a>
+  支援 DataFrame 和以 DataFrame 為基礎的 DynamicFrame (例如 JDBC，從 Amazon S3 上的 parquet 讀取)，但不支援以 RDD 為基礎的 DynamicFrame (例如在 Amazon S3 讀取 csv、json)。從技術上來講，支援 Spark UI 上可見的所有讀取和寫入。
+  如果資料來源是目錄資料表且格式為 JSON、CSV、文字或 Iceberg，則會發出 `recordsRead` 指標。
+  JDBC 和 Iceberg 資料表中不提供 `glue.driver.throughput.recordsWritten`、`glue.driver.throughput.bytesWritten` 和 `glue.driver.throughput.filesWritten` 指標。
+  指標可能會延遲出現。如果任務在大約一分鐘內完成， Amazon CloudWatch 則指標中可能沒有輸送量指標。

# 任務監控與偵錯
<a name="monitor-profile-glue-job-cloudwatch-metrics"></a>

您可以收集 AWS Glue 任務的指標，並且在 AWS Glue 和 Amazon CloudWatch 主控台上，用視覺化的方式呈現這些指標，來找出和修正問題。分析您的 AWS Glue 任務需要執行下列步驟：

1.  啟用指標：

   1.  在任務定義中啟用 **Job metrics (任務指標)** 選項。您可以在 AWS Glue 主控台中啟用分析功能，或是將分析功能做為任務的參數。如需詳細資訊，請參閱[定義 Spark 任務的任務屬性](add-job.md#create-job)或[在 Glue AWS 任務中使用任務參數](aws-glue-programming-etl-glue-arguments.md)。

   1.  在任務定義中啟用 **AWS Glue 可觀測性指標**選項。您可以在 AWS Glue 主控台中啟用可觀測性指標，或是將其作為作業的參數。如需更多資訊，請參閱[使用 AWS Glue 可觀測性指標進行監控](monitor-observability.md)。

1. 確認任務指令碼會將 `GlueContext` 初始化。例如，下列的指令碼片段會將 `GlueContext` 初始化，並顯示分析程式碼在指令碼中的所在位置。這個一般格式會在後續的除錯案例中使用。

   ```
   import sys
   from awsglue.transforms import *
   from awsglue.utils import getResolvedOptions
   from pyspark.context import SparkContext
   from awsglue.context import GlueContext
   from awsglue.job import Job
   import time
   
   ## @params: [JOB_NAME]
   args = getResolvedOptions(sys.argv, ['JOB_NAME'])
   
   sc = SparkContext()
   glueContext = GlueContext(sc)
   spark = glueContext.spark_session
   job = Job(glueContext)
   job.init(args['JOB_NAME'], args)
   
   ...
   ...
   code-to-profile
   ...
   ...
   
   
   job.commit()
   ```

1. 執行任務。

1. 以視覺化的方式呈現指標：

   1. 在 AWS Glue 主控台中以視覺化的方式呈現指標，並找出驅動程式或執行程式的異常指標。

   1. 在作業執行監控頁面、作業執行詳細資訊頁面或 Amazon CloudWatch 上查看可觀測性指標。如需詳細資訊，請參閱[使用 AWS Glue 可觀測性指標進行監控](monitor-observability.md)。

1. 利用辨識出的指標來縮小問題根源的範圍。

1. 或者，使用已辨識驅動程式或任務執行器的日誌串流，來確認問題的根源。

 **AWS Glue 可觀測性指標的使用案例** 
+  [進行 OOM 例外與任務異常的除錯](monitor-profile-debug-oom-abnormalities.md) 
+  [針對高要求的階段和落後任務進行除錯](monitor-profile-debug-straggler.md) 
+  [監控多個任務的進度](monitor-debug-multiple.md) 
+  [DPU 容量規劃監控](monitor-debug-capacity.md) 
+  [使用 AWS Glue 可觀測性監控資源使用率以降低成本](https://aws.amazon.com/blogs/big-data/enhance-monitoring-and-debugging-for-aws-glue-jobs-using-new-job-observability-metrics) 

# 進行 OOM 例外與任務異常的除錯
<a name="monitor-profile-debug-oom-abnormalities"></a>

您可以針對 AWS Glue 中的記憶體不足 (OOM) 例外和任務異常進行除錯。下列的段落所說明的除錯案例，是針對 Apache Spark 驅動程式或 Spark 執行器的記憶體不足 (OOM) 例外進行除錯。
+ [進行驅動程式 OOM 例外的除錯](#monitor-profile-debug-oom-driver)
+ [進行執行器 OOM 例外的除錯](#monitor-profile-debug-oom-executor)

## 進行驅動程式 OOM 例外的除錯
<a name="monitor-profile-debug-oom-driver"></a>

在這個案例中，Spark 任務會從 Amazon Simple Storage Service (Amazon S3) 讀取大量的小型檔案。接著將檔案轉換成 Apache Parquet 格式，然後寫入到 Amazon S3。Spark 驅動程式的記憶體即將用盡。輸入的 Amazon S3 資料在不同的 Amazon S3 分割區中，具有超過 100 萬個檔案。

分析程式碼如下：

```
data = spark.read.format("json").option("inferSchema", False).load("s3://input_path")
data.write.format("parquet").save(output_path)
```

### 在 AWS Glue 主控台上視覺化分析指標
<a name="monitor-debug-oom-visualize"></a>

下列的圖表顯示驅動程式和執行器的記憶體使用量百分比。此用量曲線是由一個資料點繪製而成，而此資料點是過去一分鐘內所呈報值的平均值。您可以看到在任務的記憶體使用狀況圖中，[驅動程式記憶體](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.jvm.heap.usage)很快地就超過 50% 的安全使用量門檻。另一方面，所有執行器的整體[平均記憶體使用量](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.jvm.heap.usage)仍然低於 4%。這明顯地顯示出這項 Spark 任務中驅動程式執行的異常狀況。

![\[驅動程式和執行器的記憶體使用量百分比。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-oom-memoryprofile.png)


工作的執行很快地失敗，在 ** 主控台的 **History (歷程記錄)AWS Glue 索引標籤中，顯示了下列的錯誤訊息：Command Failed with Exit Code 1 (指令執行失敗，結束代碼 1)。這個錯誤字串代表任務因系統錯誤而失敗，在此案例中，是因為驅動程式的記憶體用盡。

![\[AWS Glue 主控台顯示的錯誤訊息。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-oom-errorstring.png)


在主控台的 **History (歷程記錄)** 索引標籤中，選擇 **Error logs (錯誤日誌)** 連結，來確認 CloudWatch Logs 所提供關於驅動程式 OOM 的資訊。在任務的錯誤日誌中搜尋「**Error**」，確認這的確是讓任務失敗的 OOM 例外：

```
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
# Executing /bin/sh -c "kill -9 12039"...
```

在任務的 **History (歷程記錄)** 索引標籤中，選擇 **Logs (日誌)**。您可於任務開始時在 CloudWatch Logs 找到驅動程式執行的追蹤。Spark 驅動程式會試著列出所有目錄中的所有檔案、建立 `InMemoryFileIndex`，並針對每個檔案啟動一個任務。這會導致 Spark 驅動程式必須在記憶體中維持大量的狀態顯示，以追蹤所有的任務。該驅動程式會針對大量檔案的完整清單建立快取，以維持記憶體內的索引，進而造成驅動程式的 OOM。

### 利用分組功能來修正處理多個檔案的問題
<a name="monitor-debug-oom-fix"></a>

您可以利用 * 中的*分組AWS Glue功能，來修正處理多個檔案的問題。使用動態框架時，以及輸入資料集包含大量檔案 (超過 50,000 個) 時，分組功能就會自動啟用。分組功能可讓您將多個檔案合併為一個群組，讓任務處理整個群組而非單一檔案。因此，Spark 驅動程式儲存於記憶體中的狀態顯示會大幅減少，追蹤的任務也減少。關於手動啟用資料集的分組功能，詳細資訊請參閱 [讀取在大型群組中的輸入檔案](grouping-input-files.md)。

若要查看 AWS Glue 任務的記憶體使用狀況，請在啟用分組功能的狀況下，分析下列程式碼：

```
df = glueContext.create_dynamic_frame_from_options("s3", {'paths': ["s3://input_path"], "recurse":True, 'groupFiles': 'inPartition'}, format="json")
datasink = glueContext.write_dynamic_frame.from_options(frame = df, connection_type = "s3", connection_options = {"path": output_path}, format = "parquet", transformation_ctx = "datasink")
```

您可以在 AWS Glue 任務狀況分析中，監控記憶體的使用狀況和 ETL 資料的移動。

在 AWS Glue 任務的整個任務期間內，驅動程式都會以低於 50% 的記憶體使用量閥值來執行。執行器會串流來自 Amazon S3 的資料、進行處理，然後將資料輸出寫入到 Amazon S3。因此，執行器在任何時點所使用的記憶體皆少於 5%。

![\[出現問題的記憶體使用狀況已經修正。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-oom-memoryprofile-fixed.png)


下列的資料移動狀況圖，顯示了所有執行器隨著任務的進行，過去一分鐘內[讀取](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.read_bytes)和[寫入](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.write_bytes)的 Amazon S3 位元組總數。這兩種動作都會遵循相同的模式，讓資料分散透過所有執行器串流。這項任務會在不到三小時內處理完所有的一百萬個檔案。

![\[出現問題的資料移動狀況已經修正。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-oom-etlmovement.png)


## 進行執行器 OOM 例外的除錯
<a name="monitor-profile-debug-oom-executor"></a>

在此案例中，您可以了解如何針對 Apache Spark 執行器可能會發生的 OOM 例外，來進行除錯。下列的程式碼使用了 Spark MySQL 讀取器，來將包含約 3,400 萬行的大型資料表，讀取到 Spark DataFrame 中。接著再以 Parquet 格式，將資料輸出寫入至 Amazon S3。您可以提供連線屬性，並使用預設的 Spark 組態來讀取資料表。

```
val connectionProperties = new Properties()
connectionProperties.put("user", user)
connectionProperties.put("password", password)
connectionProperties.put("Driver", "com.mysql.jdbc.Driver")
val sparkSession = glueContext.sparkSession
val dfSpark = sparkSession.read.jdbc(url, tableName, connectionProperties)
dfSpark.write.format("parquet").save(output_path)
```

### 在 AWS Glue 主控台上視覺化已分析的指標
<a name="monitor-debug-oom-visualize-2"></a>

如果記憶體使用量圖表的斜率為正值且跨越 50%，則如果在發出下一個指標之前任務失敗，則記憶體耗盡很可能是造成失敗的原因。下列圖表顯示執行開始的一分鐘內，所有執行器的[平均記憶體使用量](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.jvm.heap.usage)快速暴增超過 50%。使用量達到 92%，而執行此執行器的容器被 Apache Hadoop YARN 停止。

![\[所有執行器的平均記憶體使用量。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-oom-2-memoryprofile.png)


如下列圖表所示，到任務失敗之前，一直都有[單一執行器](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.ExecutorAllocationManager.executors.numberAllExecutors)在執行。這是由於啟動了新的執行器來取代已停止的執行器。JDBC 資料來源的讀取，預設並非平行進行，因為這會需要從欄分割資料表，並開啟多個連線。因此，只有一個執行器會以序列方式讀取完整的資料表。

![\[任務執行圖顯示任務失敗前一直有單一執行器在執行。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-oom-2-execution.png)


如下列圖表所示，在任務失敗之前，Spark 嘗試啟動新的任務四次。您可以查看三個執行器的[記憶體使用狀況](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.jvm.heap.used)。每個執行器很快地就用完自己所有的記憶體。當第四個執行器用完記憶體後，任務就失敗了。因此，並未立即呈報其指標。

![\[執行器的記憶體使用狀況。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-oom-2-exec-memprofile.png)


您可以從 AWS Glue 主控台上的錯誤字串，確認任務是因為 OOM 例外而失敗，如下列圖像所示。

![\[AWS Glue 主控台顯示的錯誤訊息。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-oom-2-errorstring.png)


**任務輸出日誌**：為了進一步確認執行器 OOM 例外的情況，請檢視 CloudWatch Logs。搜尋 **Error** 時，您會發現四個執行器大約是在相同的期間內遭到停止，如指標儀表板上所示。因為超過了記憶體使用量的限制，這些執行器全都遭到 YARN 終止。

執行器 1

```
18/06/13 16:54:29 WARN YarnAllocator: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:54:29 WARN YarnSchedulerBackend$YarnSchedulerEndpoint: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:54:29 ERROR YarnClusterScheduler: Lost executor 1 on ip-10-1-2-175.ec2.internal: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:54:29 WARN TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, ip-10-1-2-175.ec2.internal, executor 1): ExecutorLostFailure (executor 1 exited caused by one of the running tasks) Reason: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
```

執行器 2

```
18/06/13 16:55:35 WARN YarnAllocator: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:55:35 WARN YarnSchedulerBackend$YarnSchedulerEndpoint: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:55:35 ERROR YarnClusterScheduler: Lost executor 2 on ip-10-1-2-16.ec2.internal: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:55:35 WARN TaskSetManager: Lost task 0.1 in stage 0.0 (TID 1, ip-10-1-2-16.ec2.internal, executor 2): ExecutorLostFailure (executor 2 exited caused by one of the running tasks) Reason: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
```

執行器 3

```
18/06/13 16:56:37 WARN YarnAllocator: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:56:37 WARN YarnSchedulerBackend$YarnSchedulerEndpoint: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:56:37 ERROR YarnClusterScheduler: Lost executor 3 on ip-10-1-2-189.ec2.internal: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:56:37 WARN TaskSetManager: Lost task 0.2 in stage 0.0 (TID 2, ip-10-1-2-189.ec2.internal, executor 3): ExecutorLostFailure (executor 3 exited caused by one of the running tasks) Reason: Container killed by YARN for exceeding memory limits. 5.8 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
```

執行器 4

```
18/06/13 16:57:18 WARN YarnAllocator: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:57:18 WARN YarnSchedulerBackend$YarnSchedulerEndpoint: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:57:18 ERROR YarnClusterScheduler: Lost executor 4 on ip-10-1-2-96.ec2.internal: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
18/06/13 16:57:18 WARN TaskSetManager: Lost task 0.3 in stage 0.0 (TID 3, ip-10-1-2-96.ec2.internal, executor 4): ExecutorLostFailure (executor 4 exited caused by one of the running tasks) Reason: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
```

### 利用 AWS Glue 動態框架來修正擷取大小
<a name="monitor-debug-oom-fix-2"></a>

由於預設的 Spark JDBC 擷取大小為 0，因此執行器在讀取 JDBC 資料表時用盡了記憶體。這代表 Spark 執行器上的 JDBC 驅動程式，試著一次從資料庫擷取 3,400 萬行的資料，並建立這些資料的快取 (即使 Spark 是一次一行的進行串流作業)。使用 Spark 時，您可以將擷取大小的參數，設定為非 0 的預設值，來避免這種狀況發生。

您也可以改用 AWS Glue 動態框架，來修正這個問題。在預設情況下，動態框架會使用 1,000 個資料列的擷取大小，通常這個設定值已經夠用。因此，執行器不會使用超過總記憶體 7% 的記憶體量。AWS Glue 任務只會使用單一執行器，在不到兩分鐘內完成。雖然我們建議使用 AWS Glue 動態框架，但是您也可以使用 Apache Spark `fetchsize` 屬性來設定擷取大小。請參閱 [Spark SQL、DataFrames 和資料集指南](https://spark.apache.org/docs/2.2.0/sql-programming-guide.html#jdbc-to-other-databases)。

```
val (url, database, tableName) = {
 ("jdbc_url", "db_name", "table_name")
 } 
val source = glueContext.getSource(format, sourceJson)
val df = source.getDynamicFrame
glueContext.write_dynamic_frame.from_options(frame = df, connection_type = "s3", connection_options = {"path": output_path}, format = "parquet", transformation_ctx = "datasink")
```

**正常分析指標：**使用 [ 動態框架的](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.jvm.heap.usage)執行器記憶體AWS Glue絕對不會超過安全門檻，如下列圖像所示：此等記憶體會從資料庫串流資料行，而且任何時點只會針對 JDBC 驅動程式中的 1,000 行建立快取。不會發生記憶體不足的例外狀況。

![\[AWS Glue 主控台顯示執行器記憶體低於安全門檻值。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-oom-2-memoryprofile-fixed.png)


# 針對高要求的階段和落後任務進行除錯
<a name="monitor-profile-debug-straggler"></a>

您可以利用 AWS Glue 任務分析功能，在擷取、轉換和載入 (ETL) 任務中，找出高要求階段和落後任務。在 AWS Glue 任務的階段中，落後任務所花費的作業時間，遠多於其他的任務。因此，此等任務需要花較長的時間完成作業，也延遲了任務的總執行時間。

## 將小型的輸入檔案合併為較大的輸出檔案
<a name="monitor-profile-debug-straggler-scenario-1"></a>

當不同任務之間的作業量分配不均，或是資料傾斜造成某個任務需要處理更多的資料時，就可能會出現落後的任務。

您可以分析下列程式碼 (在 Apache Spark 中的通用模式)，來將大量的小型檔案合併為較大的輸出檔案。在這個範例中，輸入資料集是 32 GB 的 JSON Gzip 壓縮檔案。輸出資料集約包含 190 GB 的未壓縮 JSON 檔案。

分析程式碼如下：

```
datasource0 = spark.read.format("json").load("s3://input_path")
df = datasource0.coalesce(1)
df.write.format("json").save(output_path)
```

### 在 AWS Glue 主控台上視覺化已分析的指標
<a name="monitor-debug-straggler-visualize"></a>

您可以分析任務，檢驗四組不同的指標：
+ ETL 資料移動
+ 在執行器之間的資料隨機移動
+ 任務執行
+ 記憶體使用狀況

**ETL 資料移動**：在 **ETL Data Movement (ETL 資料移動)** 分析圖表中，所有執行器在前 6 分鐘內就完成的第一個階段中，相當快速地[讀取](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.read_bytes)資料 (單位：位元組)。不過，任務執行的總時間約為一個小時，大部分為資料[寫入](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.write_bytes)作業。

![\[顯示 ETL 資料移動狀況的圖表。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-straggler-1.png)


**執行器之間的資料隨機移動：**在第二階段結束之前，隨機移動資料期間[讀取](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.aggregate.shuffleLocalBytesRead)和[寫入](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.aggregate.shuffleBytesWritten)的位元組數量出現突增的峰值，如 **Job Execution (任務執行)** 和 **Data Shuffle (資料隨機移動)** 指標所示。在所有執行器隨機移動資料之後，就只從第 3 號執行器進行讀取和寫入。

![\[執行器之間資料隨機移動的指標。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-straggler-2.png)


**任務執行：**如下列圖表所示，其他所有的執行器皆處於閒置狀態，最後在 10:09 之前終止。在這個時間點，執行器的總數減少到只剩下一個。這清楚地顯示出，第 3 號執行器包含落後任務，此任務所花費的執行時間最長，而且佔了大部分的任務執行時間。

![\[運作中執行器的執行指標。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-straggler-3.png)


**記憶體使用狀況：**經過前兩階段後，只有[第 3 號執行器](monitoring-awsglue-with-cloudwatch-metrics.md#glue.executorId.jvm.heap.used)正在使用記憶體來運作處理資料。剩下的執行器只是處於閒置狀態，或是在前兩個階段完成之後，就很快地遭到終止。

![\[經過前兩個階段後的記憶體使用狀況指標。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-straggler-4.png)


### 利用分組來解決落後執行器的問題
<a name="monitor-debug-straggler-fix"></a>

您可以利用 * 中的*分組AWS Glue功能，來避免出現落後的執行器。利用分組功能，將資料平均地分配給所有執行器，並使用叢集上所有可用的執行器，將檔案合併為更大型的檔案。如需詳細資訊，請參閱 [讀取在大型群組中的輸入檔案](grouping-input-files.md)。

若要查看 AWS Glue 任務中的 ETL 資料移動狀況，請在啟用分組功能的情況下，分析下列程式碼：

```
df = glueContext.create_dynamic_frame_from_options("s3", {'paths': ["s3://input_path"], "recurse":True, 'groupFiles': 'inPartition'}, format="json")
datasink = glueContext.write_dynamic_frame.from_options(frame = df, connection_type = "s3", connection_options = {"path": output_path}, format = "json", transformation_ctx = "datasink4")
```

**ETL 資料移動：**在整個任務執行期間，資料寫入作業現在會與資料讀取作業並行串流。因此，任務會在 8 分鐘之內完成，速度比之前快上許多。

![\[ETL 資料移動狀況顯示問題已經修正。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-straggler-5.png)


**執行器之間的資料隨機移動：**在進行讀取時，使用分組功能將輸入檔案合併之後，就不用在資料讀取之後，進行成本昂貴的資料隨機移動作業。

![\[資料隨機移動指標顯示問題已修正。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-straggler-6.png)


**任務執行：**任務執行指標會顯示運作中執行器的總數，以及處理的資料維持地相當穩定。在任務中沒有任何落後作業。所有的執行器皆處於運作狀態，在任務尚未完成之前，不會遭到終止。由於不需在執行器之間進行中間的資料隨即移動作業，因此任務中只有一個階段。

![\[任務執行小工具的指標，顯示任務中沒有落後的作業。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-straggler-7.png)


**記憶體使用狀況**：此指標顯示所有執行器的[現用記憶體使用量](monitoring-awsglue-with-cloudwatch-metrics.md#glue.executorId.jvm.heap.used)—重新確認所有的執行器都在活動中。隨著資料同時串流傳入和輸出寫入，所有執行器使用的總記憶體大致平均，而且遠低於所有執行器的安全門檻值。

![\[記憶體使用狀況指標，顯示所有執行器的現用記憶體使用量。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-straggler-8.png)


# 監控多個任務的進度
<a name="monitor-debug-multiple"></a>

您可以同時描述多個 AWS Glue 任務，並監控它們之間的資料流程。這是一個常見的任務流程模式，且需要監控個別任務進度、資料處理後端紀錄、資料重新處理和任務書籤。

**Topics**
+ [已分析的程式碼](#monitor-debug-multiple-profile)
+ [在 AWS Glue 主控台上視覺化已分析的指標](#monitor-debug-multiple-visualize)
+ [修正檔案處理](#monitor-debug-multiple-fix)

## 已分析的程式碼
<a name="monitor-debug-multiple-profile"></a>

在此任務流程中，您有兩個任務：輸入任務和輸出任務。輸入任務透過定期觸發排定每隔 30 分鐘執行。在每個輸入任務成功執行之後，即排定要執行的輸出任務。這些排定的任務皆由任務觸發器控制。

![\[主控台螢幕擷取畫面會顯示任務觸發條件正在控制的輸入和輸出任務排程處理。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-multiple-1.png)


**輸入任務**：此任務從 Amazon Simple Storage Service (Amazon S3) 位置讀取的資料，會使用 `ApplyMapping` 轉換該任務，並將其寫入至暫存 Amazon S3 位置。以下程式碼是已分析的輸入任務程式碼：

```
datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": ["s3://input_path"], "useS3ListImplementation":True,"recurse":True}, format="json")
applymapping1 = ApplyMapping.apply(frame = datasource0, mappings = [map_spec])
datasink2 = glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": staging_path, "compression": "gzip"}, format = "json")
```

**輸出任務**：此任務從 Amazon S3 的暫存位置讀取輸入任務中的輸出，將其再次轉換並寫入至目的地：

```
datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": [staging_path], "useS3ListImplementation":True,"recurse":True}, format="json")
applymapping1 = ApplyMapping.apply(frame = datasource0, mappings = [map_spec])
datasink2 = glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": output_path}, format = "json")
```

## 在 AWS Glue 主控台上視覺化已分析的指標
<a name="monitor-debug-multiple-visualize"></a>

在相同的輸出任務時間軸上，以下儀表板會將輸入任務的 Amazon S3 位元組寫入指標，加乘至 Amazon S3 位元組讀取指標。該時間軸顯示了輸入與輸出任務的不同任務執行。輸入任務 (紅色) 每 30 分鐘啟動一次。輸出任務 (褐色) 會於輸入任務完成時啟動，最大並行數量為 1。

![\[圖形顯示了讀取和寫入的資料。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-multiple-4.png)


在此範例中並未啟用[任務書籤](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuations.html)。在該指令碼程式碼中沒有使用轉換細節來啟用任務書籤。

**任務歷史記錄**：從下午 12 點開始，輸入和輸出任務會有多項執行，如 **History (歷史記錄)** 標籤中所示。

AWS Glue 主控台的輸入任務如下所示：

![\[主控台螢幕擷取畫面顯示了輸入任務的歷史紀錄標籤。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-multiple-2.png)


下列映像顯示了輸出任務：

![\[主控台螢幕擷取畫面顯示了輸出任務的歷史紀錄標籤。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-multiple-3.png)


**第一個任務執行**：如下方的 Data Bytes Read and Written (資料位元組讀取和寫入圖形) 所示，在 12:00 和 12:30 之間的第一個輸入與輸出任務的任務執行，顯示了曲線下大致的相同區域。那些領域代表了輸入任務寫入的 Amazon S3 位元組，以及輸出任務讀取的 Amazon S3 位元組。此資料也由 Amazon S3 位元組寫入的比例所確認 (超過 30 分鐘的加總 - 輸入任務的任務觸發器頻率)。在下午 12 點開始的輸入任務執行比例資料點也是 1。

以下圖表顯示所有任務執行的資料流程比例：

![\[圖形顯示了資料流程比例：寫入的位元組和讀取的位元組。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-multiple-5.png)


**第二個任務執行**：在第二個任務執行中，輸出任務讀取的位元數和輸入任務寫入的位元數之間有清楚的差異。(在輸出任務的兩個任務執行中比較曲線下的區域，或在輸入與輸出任務中的第二個執行中比較區域。) 讀取和寫入的位元組比例，顯示第二個範圍 (從 12:30 至 13:00) 的 30 分鐘內，輸出任務資料讀取約是輸入任務資料寫入的 2.5 倍。這是因為任務書籤並未啟用，故輸出任務重新處理了輸入任務的第一個任務執行的輸出。超過 1 的比率，說明有由輸出任務處理的額外資料後端紀錄。

**第三個任務執行**：輸入任務與寫入的位元組數相當的一致 (請參閱紅色曲線以下的區域)。不過，輸入任務第三個任務執行的執行時間超出預期 (請參閱紅色曲線的尾部)。因此，輸出任務的第三個任務執行會延遲開始。第三個任務執行僅在 13:00 到 13:30 之間剩餘的 30 分鐘內處理暫存位置中累積的一小部分資料。位元組流程的比例，顯示它僅會處理由輸入任務的第三個任務執行寫入資料的 0.83 (參見 13:00 時的比例)。

**輸入和輸出任務的重疊**：輸出任務的第四個任務執行依各排程在 13:30 開始，即輸出任務的第三個任務執行完成之前。這兩個任務執行間有部分重疊。不過，輸出任務的第三個任務執行約在 13:17 開始，它僅擷取 Amazon S3 暫存位置中列出的檔案。這包含了輸入任務的第一個任務執行的所有資料輸出。13:30 的實際比例為 2.75。從 13:30 至 14:00 間，輸出任務的第三個任務執行處理的寫入資料，是輸入任務的第四個任務執行的 2.75 倍。

如這些映像所示，輸出任務正在重新處理資料，這些資料位於輸入任務的所有優先任務暫存位置。因此，輸出任務的第四個任務執行時間最長，並與輸入任務的整個第五個任務執行重疊。

## 修正檔案處理
<a name="monitor-debug-multiple-fix"></a>

您應該確保輸出任務僅會處理尚未由輸出任務的前一任務執行處理過的檔案。若要執行此操作，請啟用任務書籤並在輸出任務中設定轉換內容，如下所示：

```
datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": [staging_path], "useS3ListImplementation":True,"recurse":True}, format="json", transformation_ctx = "bookmark_ctx")
```

任務書籤啟用後，輸出任務將不會自輸入任務的所有先前任務執行中重新處理暫存位置裡的資料。下列映像顯示了資料的讀取和寫入，棕色曲線下的面積與紅色曲線相當一致且相似。

![\[圖形以紅色和棕色線條顯示了資料的讀取和寫入。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-multiple-6.png)


由於沒有額外的資料處理，位元組流程比例也會大致保持接近為 1。

![\[圖形顯示了資料流程比例：寫入的位元組和讀取的位元組\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-multiple-7.png)


在下一個輸入任務執行開始將更多資料放入暫存位置之前，輸出任務的任務執行將開始並擷取暫存位置中的檔案。只要此操作持續執行，它僅會處理之前的輸入任務執行所擷取的檔案，且比例保持接近 1。

![\[圖形顯示了資料流程比例：寫入的位元組和讀取的位元組\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-multiple-7.png)


假設輸入任務花費的時間超過預期，於是，輸出任務將從兩個輸入任務執行中擷取暫存位置中的檔案。然後，該輸出任務執行的比例將高於 1。不過，以下輸出任務的任務執行，不會處理任何輸出任務之前的任務執行已處裡的檔案。

# DPU 容量規劃監控
<a name="monitor-debug-capacity"></a>

您可以在 中使用任務指標 AWS Glue 來估計可用於向外擴展AWS Glue任務的資料處理單位 (DPUs) 數量。

**注意**  
此頁面僅適用於 AWS Glue 0.9 和 1.0 版。較新版本的 AWS Glue 包含節省成本的功能，這些功能會在容量規劃時帶來額外的考量。

**Topics**
+ [已分析的程式碼](#monitor-debug-capacity-profile)
+ [在 AWS Glue 主控台上視覺化已分析的指標](#monitor-debug-capacity-visualize)
+ [判斷最佳 DPU 容量](#monitor-debug-capacity-fix)

## 已分析的程式碼
<a name="monitor-debug-capacity-profile"></a>

以下指令碼會讀取包含 428 個 gzip JSON 檔案的 Amazon Simple Storage Service (Amazon S3) 分割區。該指令碼套用對應來變更欄位名稱，並以 Apache Parquet 格式將它們轉換並寫入 Amazon S3。您將根據預設佈建 10 個 DPU 並執行此任務。

```
datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": [input_path], "useS3ListImplementation":True,"recurse":True}, format="json")
applymapping1 = ApplyMapping.apply(frame = datasource0, mappings = [(map_spec])
datasink2 = glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": output_path}, format = "parquet")
```

## 在 AWS Glue 主控台上視覺化已分析的指標
<a name="monitor-debug-capacity-visualize"></a>

**任務執行 1：**在此任務執行中，我們將展示如何尋找叢集中是否存在佈建不足的 DPU。在 AWS Glue 中的任務執行功能顯示所有主動執行的執行器[數量](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.ExecutorAllocationManager.executors.numberAllExecutors)、完成階段的[數量](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.aggregate.numCompletedStages)，以及所需執行器的最大[數量](monitoring-awsglue-with-cloudwatch-metrics.md#glue.driver.ExecutorAllocationManager.executors.numberMaxNeededExecutors)。

所需執行器最大數量的計算，是透過新增執行中任務和待處理任務總數除以每個執行器的任務。該結果是滿足目前負載所需的執行器總數的測量。

相反的，主動執行的執行器數量，會衡量有多少執行器正在執行主動 Apache Spark 任務。隨著任務的進行，所需的最大執行器可以更改，並且通常會在等待中的任務佇列降低時向下移動到任務的末端。

下圖中的水平紅線顯示了分配執行器的最大數量，這取決於您為任務分配的 DPU 數。在本例中，您需要為該任務執行分配 10 個 DPU。一個 DPU 保留給管理使用。另外九個 DPU 則會分別執行兩個執行器，且會保留其中一個執行器給 Spark 驅動程式。Spark 驅動程式會在主要應用程式內執行。因此，分配的執行器最大數量是 2\$19 - 1 = 17 個執行器。

![\[顯示主動執行器和最大所需執行器的任務指標。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-capacity-1.png)


如圖所示，所需執行器的最大數量在任務開始時從 107 開始，而中動執行器數量保持為 17。這與具有 10 個 DPU 的分配執行器最大數量相同。所需執行器最大數量和所分配執行器最大數量間的比率 (對於 Spark 驅動程式，兩者都新增 1 個) 會提供佈建不足因數：108/18 = 6 倍。您可以佈建 6 (佈建不足比率) \$19 (目前 DPU 容量 - 1) \$1 1 個 DPU = 55 個 DPU 來擴展該任務，即可以最高平行處理速度執行並加速完成。

 AWS Glue 主控台會以靜態線 (表示分配執行器​原始數量上限) 顯示詳細的任務指標。該主控台會透過指標的任務定義來計算分配執行器的上限。相反地，如需詳細任務執行指標，主控台會透過任務執行組態來計算分配執行器的上限，特別是針對任務執行分配的 DPU 數。若要檢視個別任務執行的指標，請選取任務執行並選擇 **View run metrics (檢視執行指標)**。

![\[顯示 ETL 資料移動的任務指標。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-capacity-2.png)


查看 Amazon S3 位元組[讀取](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.read_bytes)和[寫入](monitoring-awsglue-with-cloudwatch-metrics.md#glue.ALL.s3.filesystem.write_bytes)，請注意，該任務會在 Amazon S3 資料中花費所有的六分鐘串流，並將其平行寫出。分配的 DPU 上的所有核心都正在讀取和寫入 Amazon S3。所需執行器的最大數量為 107，也符合輸入 Amazon S3 路徑中的檔案數 – 428。每個執行器可以啟動四個 Spark 任務以處理四個輸入檔案 (JSON gzip)。

## 判斷最佳 DPU 容量
<a name="monitor-debug-capacity-fix"></a>

根據先前任務執行的結果，您可以將分配的 DPU 總數增加到 55，並查看任務的執行情況。該任務可在三個分鐘內完成 – 是先前所需時間的一半。此案例中的任務擴展並非線性的，因為它是一種短期執行任務。具有長期執行任務或大量任務的任務 (大量的最大所需執行器) 受益於接近線性的 DPU 擴展效能加速。

![\[圖形顯示分配的 DPU 總數增加\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-capacity-3.png)


如上圖所示，主動執行器的總數達到最大分配數 – 107 個執行器。同樣地，所需執行器的最大數量永遠不會超過分配的執行器最大數量。所需的最大執行器數量是根據主動執行和等待中任務計數計算的，因此可能小於活動執行器的數量。這是因為可能有執行器在短時間內部分或完全閒置，且尚未淘汰。

![\[圖形顯示了達到最大分配總數的主動執行器。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-capacity-4.png)


此任務執行使用 6 倍以上的執行器從 Amazon S3 平行讀取和寫入。因此，此任務執行會為讀取和寫入使用更多的 Amazon S3 頻寬，並且更快完成。

### 識別過度佈建的 DPU
<a name="monitor-debug-capacity-over"></a>

接下來，您可以判斷使用 100 DPU (99 \$1 2 = 198 執行器) 擴展任務是否有助於進一步擴展。如下圖顯示，該任務仍然需要三分鐘來完成。同樣，任務不會超出 107 個執行器 (55 個 DPU 組態)，其餘 91 個執行器被過度佈建而完全不使用。這表示增加的 DPU 數量有時可能無法提高效能，這從所需的最大執行器數量中可以看出。

![\[圖形顯示提高 DPU 數目有時可能無法提高任務效能。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/monitor-debug-capacity-5.png)


### 比較時間差異
<a name="monitor-debug-capacity-time"></a>

下表中顯示的三個任務執行總結了 10 個 DPU、55 個 DPU 和 100 個 DPU 的任務執行時間。您可以使用監控第一個任務執行建立的評估來尋找 DPU 容量以改善任務執行時間。


| 任務 ID | DPU 數量 | 執行時間 | 
| --- | --- | --- | 
| jr\$1c894524c8ef5048a4d9... | 10 | 6 分鐘。 | 
| jr\$11a466cf2575e7ffe6856... | 55 | 3 分鐘。 | 
| jr\$134fa1ed4c6aa9ff0a814... | 100 | 3 分鐘。 | 

# Glue 中 Apache Spark 的生成式 AI AWS 疑難排解
<a name="troubleshoot-spark"></a>

 Glue 中 Apache Spark AWS 任務的生成式 AI 疑難排解是一項新功能，可協助資料工程師和科學家輕鬆診斷和修正 Spark 應用程式的問題。此功能利用機器學習和生成式 AI 技術，可分析 Spark 任務中的問題，並提供詳細的根本原因分析以及可行的建議來解決這些問題。Apache Spark 的生成式 AI 疑難排解適用於在 Glue AWS 4.0 版及更高版本上執行的任務。


|  | 
| --- |
|  使用採用 AI 技術的故障診斷代理程式轉換您的 Apache Spark 故障診斷，現在支援所有主要部署模式，包括 AWS Glue、Amazon EMR-EC2、Amazon EMR-Serverless 和 Amazon SageMaker AI 筆記本。這個功能強大的代理程式透過將自然語言互動、即時工作負載分析和智慧程式碼建議結合到無縫體驗中，來消除複雜的偵錯程序。如需實作詳細資訊，請參閱[什麼是 Amazon EMR 的 Apache Spark 故障診斷代理](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/spark-troubleshoot.html)程式。檢視[使用 Glue 疑難排解代理](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/spark-troubleshooting-using-troubleshooting-agent.html)程式疑難排解範例中的第二個示範。 AWS   | 

## 適用於 Apache Spark 的生成式 AI 疑難排解如何工作？
<a name="troubleshoot-spark-how-it-works"></a>

 對於失敗的 Spark 任務，生成式 AI 疑難排解會分析任務中繼資料，以及與任務錯誤簽章相關聯的精確指標和日誌，以產生根本原因分析，並建議特定解決方案和最佳實務，以協助解決任務失敗。

## 針對您的任務設定適用於 Apache Spark 的生成式 AI 疑難排解
<a name="w2aac37c11c12c33c13"></a>

### 設定 IAM 許可權限
<a name="troubleshoot-spark-iam-permissions"></a>

 授予許可給 Glue 中任務的 Spark 故障診斷所使用的 APIs AWS ，需要適當的 IAM 許可。您可以透過將下列自訂 AWS 政策連接至 IAM 身分 （例如使用者、角色或群組） 來取得許可。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:StartCompletion",
        "glue:GetCompletion"
      ],
      "Resource": [
        "arn:aws:glue:*:*:completion/*",
        "arn:aws:glue:*:*:job/*"
      ]
    }
  ]
}
```

------

**注意**  
 IAM 政策中使用下列兩個 APIs，透過 Glue Studio AWS 主控台啟用此體驗： `StartCompletion`和 `GetCompletion`。

### 指派權限
<a name="troubleshoot-spark-assigning-permissions"></a>

 若要提供存取權，請新增權限至您的使用者、群組或角色：
+  對於 IAM Identity Center 中的使用者和群組：建立許可集。請按照《IAM Identity Center 使用者指南》中[建立許可集](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtocreatepermissionset.html)的說明進行操作。
+  對於在 IAM 中透過身分提供者管理的使用者：建立聯合身分的角色。請按照《IAM 使用者指南》的[為第三方身分提供者 (聯合) 建立角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp.html)中的指示進行操作。
+  對於 IAM 使用者：建立您的使用者可擔任的角色。請按照《IAM 使用者指南》的[為 IAM 使用者建立角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)中的指示進行操作。

## 從失敗的任務執行中執行疑難排解分析
<a name="troubleshoot-spark-run-analysis"></a>

 您可以透過 Glue AWS 主控台中的多個路徑存取故障診斷功能。以下是如何開始：

### 選項 1：從「任務清單」頁面中
<a name="troubleshoot-spark-from-jobs-list"></a>

1.  開啟 AWS 位於 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 的 Glue 主控台。

1.  在導覽窗格中，選擇 **ETL 任務**。

1.  在任務清單中找到失敗的任務。

1.  在任務詳細資訊區段中選取**執行**索引標籤。

1.  按一下您要分析的失敗任務執行。

1.  選擇**使用 AI 進行疑難排解**以開始分析。

1.  疑難排解分析完成後，可以在畫面底部的**疑難排解分析**索引標籤中檢視根本原因分析和建議。

![\[GIF 會顯示失敗執行的端對端實作，並透過 AI 功能執行進行疑難排解。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/troubleshoot_spark_option_1_jobs_list.gif)


### 選項 2：使用「任務執行監控」頁面
<a name="troubleshoot-spark-job-run-monitoring-page"></a>

1.  導覽至**任務執行監控**頁面。

1.  找到失敗的任務執行。

1.  選擇**動作**下拉式功能表。

1.  選擇**使用 AI 進行故障診斷**。

![\[GIF 會顯示失敗執行的端對端實作，並透過 AI 功能執行進行疑難排解。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/troubleshoot_spark_option_2_job_monitoring.gif)


### 選項 3：從「任務執行詳細資訊」頁面中
<a name="troubleshoot-spark-job-run-details-page"></a>

1.  按一下**執行**索引標籤中失敗執行的**檢視詳細資訊**，或在**任務執行監控**頁面中選取任務執行，導覽至失敗任務執行的詳細資訊頁面。

1.  在任務執行詳細資訊頁面中，找到**疑難排解分析**索引標籤。

## 支援的故障診斷類別
<a name="troubleshoot-spark-supported-troubleshooting-categories"></a>

 此服務著重於資料工程師和開發人員在其 Spark 應用程式中經常遇到的三個主要問題類別：
+  **資源設定和存取錯誤：**在 Glue AWS 中執行 Spark 應用程式時，資源設定和存取錯誤是最常診斷但具挑戰性的問題之一。當您的 Spark 應用程式嘗試與 AWS 資源互動，但遇到許可問題、資源遺失或組態問題時，通常會發生這些錯誤。
+  **Spark 驅動程式和執行器記憶體問題：**Apache Spark 任務中的記憶體相關錯誤的診斷和解決可能很複雜。當資料處理要求超過驅動程式節點或執行器節點上可用的記憶體資源時，這些錯誤通常會顯現出來。
+  **Spark 磁碟容量問題：**Glue Spark 任務中的儲存相關錯誤通常會在隨機播放操作、資料溢出或處理大規模資料轉換時出現。 AWS 這些錯誤可能特別棘手，因為其可能會在您的任務執行一段時間後才會顯現，因此可能會浪費寶貴的運算時間和資源。
+  **查詢執行錯誤：**Spark SQL 和 DataFrame 操作中的查詢失敗可能難以進行故障診斷，因為錯誤訊息可能無法明確指向根本原因，並且可以使用小型資料集的查詢可能會突然大規模失敗。當這些錯誤在複雜的轉換管道中深入發生時，會變得更加具有挑戰性，其中實際問題可能來自較早階段的資料品質問題，而不是查詢邏輯本身。

**注意**  
 在生產環境中實作任何建議的變更之前，請徹底檢閱建議的變更。此服務會根據模式和最佳實務提供建議，但您的特定使用案例可能需要其他考量。

## 支援的 區域
<a name="troubleshoot-spark-supported-regions"></a>

Apache Spark 的生成式 AI 疑難排解可在下列區域使用：
+ **非洲**：開普敦 (af-south-1)
+ **亞太區域**：香港 (ap-east-1)、東京 (ap-northeast-1)、首爾 (ap-northeast-2)、大阪 (ap-northeast-3)、孟買 (ap-south-1)、新加坡 (ap-southeast-1)、雪梨 (ap-southeast-2) 和雅加達 (ap-southeast-3)
+ **歐洲**：法蘭克福 (eu-central-1)、斯德哥爾摩 (eu-north-1)、米蘭 (eu-south-1)、愛爾蘭 (eu-west-1)、倫敦 (eu-west-2) 和巴黎 (eu-west-3)
+ **中東**：巴林 (me-south-1) 和阿拉伯聯合大公國 (me-central-1)
+ **北美洲**：加拿大 (ca-central-1)
+ **南美洲**：聖保羅 (sa-east-1)
+ **美國**：北維吉尼亞 (us-east-1)、俄亥俄 (us-east-2)、北加州 (us-west-1) 和奧勒岡 (us-west-2)

# 搭配 Glue AWS 使用具體化視觀表
<a name="materialized-views"></a>

AWS Glue 5.1 版和更新版本支援在 Glue Data Catalog 中建立和管理 Apache Iceberg AWS 具體化視觀表。具體化檢視是受管資料表，以 Apache Iceberg 格式存放 SQL 查詢的預先計算結果，並隨著基礎來源資料表的變更遞增更新。您可以使用具體化視觀表來簡化資料轉換管道，並加速複雜分析工作負載的查詢效能。

當您使用 Glue 中的 Spark AWS 建立具體化檢視時，檢視定義和中繼資料會存放在 AWS Glue Data Catalog 中。預先計算的結果會以 Apache Iceberg 資料表的形式存放在 Amazon S3 Tables 儲存貯體中，或存放在您帳戶中的 Amazon S3 一般用途儲存貯體中。 AWS Glue Data Catalog 會自動監控來源資料表，並使用受管運算基礎設施重新整理具體化視觀表。

**Topics**
+ [具體化視觀表如何與 Glue AWS 搭配使用](#materialized-views-how-they-work)
+ [先決條件](#materialized-views-prerequisites)
+ [設定 Spark 以使用具體化視觀表](#materialized-views-configuring-spark)
+ [建立具體化視觀表](#materialized-views-creating)
+ [查詢具體化視觀表](#materialized-views-querying)
+ [重新整理具體化視觀表](#materialized-views-refreshing)
+ [管理具體化視觀表](#materialized-views-managing)
+ [具體化視觀表的許可](#materialized-views-permissions)
+ [監控具體化視觀表操作](#materialized-views-monitoring)
+ [範例：完成工作流程](#materialized-views-complete-workflow)
+ [考量和限制](#materialized-views-considerations-limitations)

## 具體化視觀表如何與 Glue AWS 搭配使用
<a name="materialized-views-how-they-work"></a>

具體化視觀表透過 Glue AWS 任務和 Glue Studio 筆記本中的 Apache Spark Iceberg AWS 支援與 AWS Glue 整合。當您將 Spark 工作階段設定為使用 AWS Glue Data Catalog 時，您可以使用標準 SQL 語法建立具體化檢視。Spark 最佳化工具可以在提供更好的效能時自動重寫查詢，以使用具體化視觀表，無需手動修改應用程式程式碼。

Glue Data Catalog AWS 會處理具體化視觀表維護的所有操作層面，包括：
+ 使用 Apache Iceberg 的中繼資料層偵測來源資料表中的變更
+ 使用受管 Spark 運算排程和執行重新整理操作
+ 根據資料變更決定是否執行完整或增量重新整理
+ 將預先計算的結果儲存為 Apache Iceberg 格式以進行多引擎存取

您可以使用用於一般資料表的相同 Spark SQL 介面，從 AWS Glue 查詢具體化視觀表。預先計算的資料也可以從其他 服務存取，包括 Amazon Athena 和 Amazon Redshift。

## 先決條件
<a name="materialized-views-prerequisites"></a>

若要搭配 Glue AWS 使用具體化視觀表，您需要：
+ 一個 帳戶
+ AWS Glue 5.1 版或更新版本
+ 在 Glue Data Catalog AWS 中註冊的 Apache Iceberg 格式來源資料表
+ AWS Lake Formation 針對來源資料表和目標資料庫設定的許可
+ 向 註冊的 S3 Tables 儲存貯體或 S3 一般用途儲存貯體， AWS Lake Formation 用於存放具體化視觀表資料
+ 具有存取 Glue Data Catalog AWS 和 Amazon S3 許可的 IAM 角色

## 設定 Spark 以使用具體化視觀表
<a name="materialized-views-configuring-spark"></a>

若要在 Glue AWS 中建立和管理具體化視觀表，請使用所需的 Iceberg 延伸模組和目錄設定來設定 Spark 工作階段。組態方法取決於您使用的是 AWS Glue 任務或 Glue Studio AWS 筆記本。

### 設定 AWS Glue 任務
<a name="materialized-views-configuring-glue-jobs"></a>

建立或更新 AWS Glue 任務時，請將下列組態參數新增為任務參數：

#### 對於 S3 Tables 儲存貯體
<a name="materialized-views-s3-tables-buckets"></a>

```
job = glue.create_job(
    Name='materialized-view-job',
    Role='arn:aws:iam::111122223333:role/GlueServiceRole',
    Command={
        'Name': 'glueetl',
        'ScriptLocation': 's3://amzn-s3-demo-bucket/scripts/mv-script.py',
        'PythonVersion': '3'
    },
    DefaultArguments={
        '--enable-glue-datacatalog': 'true',
        '--conf': 'spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions '
        '--conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog '
                  '--conf spark.sql.catalog.glue_catalog.type=glue '
                  '--conf spark.sql.catalog.glue_catalog.warehouse=s3://amzn-s3-demo-bucket/warehouse '
                  '--conf spark.sql.catalog.glue_catalog.glue.region=us-east-1 '
                  '--conf spark.sql.catalog.glue_catalog.glue.id=111122223333 '
                  '--conf spark.sql.catalog.glue_catalog.glue.account-id=111122223333 ',
                  '--conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true ',
                  '--conf spark.sql.catalog.s3t_catalog=org.apache.iceberg.spark.SparkCatalog '
                  '--conf spark.sql.catalog.s3t_catalog.type=glue '
                  '--conf spark.sql.catalog.s3t_catalog.glue.id=111122223333:s3tablescatalog/my-table-bucket ',
                  '--conf spark.sql.catalog.s3t_catalog.glue.account-id=111122223333 ',
                  '--conf spark.sql.catalog.s3t_catalog.glue.lakeformation-enabled=true ',
                  '--conf spark.sql.catalog.s3t_catalog.warehouse=s3://amzn-s3-demo-bucket/mv-warehouse '
                  '--conf spark.sql.catalog.s3t_catalog.glue.region=us-east-1 '
                  '--conf spark.sql.defaultCatalog=s3t_catalog '
                  '--conf spark.sql.optimizer.answerQueriesWithMVs.enabled=true '
                  '--conf spark.sql.materializedViews.metadataCache.enabled=true'
    },
    GlueVersion='5.1'
)
```

#### 對於 S3 一般用途儲存貯體
<a name="materialized-views-s3-general-purpose-buckets"></a>

```
job = glue.create_job(
    Name='materialized-view-job',
    Role='arn:aws:iam::111122223333:role/GlueServiceRole',
    Command={
        'Name': 'glueetl',
        'ScriptLocation': 's3://amzn-s3-demo-bucket/scripts/mv-script.py',
        'PythonVersion': '3'
    },
    DefaultArguments={
        '--enable-glue-datacatalog': 'true',
        '--conf': 'spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions '
                  '--conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog '
                  '--conf spark.sql.catalog.glue_catalog.type=glue '
                  '--conf spark.sql.catalog.glue_catalog.warehouse=s3://amzn-s3-demo-bucket/warehouse '
                  '--conf spark.sql.catalog.glue_catalog.glue.region=us-east-1 '
                  '--conf spark.sql.catalog.glue_catalog.glue.id=111122223333 ',
                  '--conf spark.sql.catalog.glue_catalog.glue.account-id=111122223333 ',
                  '--conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true ',
                  '--conf spark.sql.defaultCatalog=glue_catalog '
                  '--conf spark.sql.optimizer.answerQueriesWithMVs.enabled=true '
                  '--conf spark.sql.materializedViews.metadataCache.enabled=true'
    },
    GlueVersion='5.1'
)
```

### 設定 AWS Glue Studio 筆記本
<a name="materialized-views-configuring-glue-studio-notebooks"></a>

在 AWS Glue Studio 筆記本中，使用筆記本開頭的 %%configure 魔術命令來設定 Spark 工作階段：

```
%%configure
{
    "conf": {
        "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
        "spark.sql.catalog.glue_catalog": "org.apache.iceberg.spark.SparkCatalog",
        "spark.sql.catalog.glue_catalog.type": "glue",
        "spark.sql.catalog.glue_catalog.warehouse": "s3://amzn-s3-demo-bucket/warehouse",
        "spark.sql.catalog.glue_catalog.glue.region": "us-east-1",
        "spark.sql.catalog.glue_catalog.glue.id": "111122223333",
        "spark.sql.catalog.glue_catalog.glue.account-id": "111122223333",
        "spark.sql.catalog.glue_catalog.glue.lakeformation-enabled": "true",
        "spark.sql.defaultCatalog": "glue_catalog",
        "spark.sql.optimizer.answerQueriesWithMVs.enabled": "true",
        "spark.sql.materializedViews.metadataCache.enabled": "true"
    }
}
```

### 啟用增量重新整理
<a name="materialized-views-enabling-incremental-refresh"></a>

若要啟用增量重新整理最佳化，請將下列組態屬性新增至您的任務參數或筆記本組態：

```
--conf spark.sql.optimizer.incrementalMVRefresh.enabled=true
--conf spark.sql.optimizer.incrementalMVRefresh.deltaThresholdCheckEnabled=false
```

### 組態參數
<a name="materialized-views-configuration-parameters"></a>

下列組態參數控制具體化視觀表行為：
+ `spark.sql.extensions` – 啟用具體化視觀表支援所需的 Iceberg Spark 工作階段延伸。
+ `spark.sql.optimizer.answerQueriesWithMVs.enabled` – 啟用自動查詢重寫以使用具體化視觀表。設定為 true 以啟用此最佳化。
+ `spark.sql.materializedViews.metadataCache.enabled` – 啟用具體化檢視中繼資料的快取，以進行查詢最佳化。設為 true 可改善查詢重寫效能。
+ `spark.sql.optimizer.incrementalMVRefresh.enabled` – 啟用增量重新整理最佳化。設為 true 以在重新整理操作期間僅處理已變更的資料。
+ `spark.sql.optimizer.answerQueriesWithMVs.decimalAggregateCheckEnabled` – 控制查詢重寫中小數彙總操作的驗證。設定為 false 以停用特定小數溢位檢查。

## 建立具體化視觀表
<a name="materialized-views-creating"></a>

您可以使用 Glue 任務或筆記本中的 CREATE MATERIALIZED VIEW SQL AWS 陳述式建立具體化視觀表。檢視定義會將轉換邏輯指定為參考一或多個來源資料表的 SQL 查詢。

### 在 Glue AWS 任務中建立基本具體化視觀表
<a name="materialized-views-creating-basic-glue-jobs"></a>

下列範例示範在 Glue AWS 任務指令碼中建立具體化檢視，在檢視定義中使用具有三個部分命名慣例的完整資料表名稱：

```
from awsglue.context import GlueContext
from pyspark.context import SparkContext

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# Create materialized view
spark.sql("""
    CREATE MATERIALIZED VIEW customer_orders
    AS 
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM glue_catalog.sales.orders
    GROUP BY customer_name
""")
```

### 使用自動重新整理建立具體化視觀表
<a name="materialized-views-creating-automatic-refresh"></a>

若要設定自動重新整理，請在建立檢視時指定重新整理排程，在檢視定義中使用具有三個部分命名慣例的完整資料表名稱：

```
spark.sql("""
    CREATE MATERIALIZED VIEW customer_orders
    SCHEDULE REFRESH EVERY 1 HOUR
    AS 
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM glue_catalog.sales.orders
    GROUP BY customer_name
""")
```

### 使用跨目錄參考建立具體化視觀表
<a name="materialized-views-creating-cross-catalog"></a>

當您的來源資料表與具體化檢視位於不同的目錄中時，請在檢視名稱和檢視定義中使用具有三部分命名慣例的完整資料表名稱：

```
spark.sql("""
    CREATE MATERIALIZED VIEW s3t_catalog.analytics.customer_summary
    AS 
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM glue_catalog.sales.orders
    GROUP BY customer_name
""")
```

### 在 Glue Studio AWS 筆記本中建立具體化視觀表
<a name="materialized-views-creating-glue-studio-notebooks"></a>

在 AWS Glue Studio 筆記本中，您可以使用 %%sql 魔術命令，在檢視定義中使用具有三個部分命名慣例的完整資料表名稱來建立具體化檢視：

```
%%sql
CREATE MATERIALIZED VIEW customer_orders
AS 
SELECT 
    customer_name, 
    COUNT(*) as order_count, 
    SUM(amount) as total_amount 
FROM glue_catalog.sales.orders
GROUP BY customer_name
```

## 查詢具體化視觀表
<a name="materialized-views-querying"></a>

建立具體化檢視後，您可以使用 Glue 任務或筆記本中的標準 SQL SELECT AWS 陳述式，像任何其他資料表一樣進行查詢。

### 在 Glue AWS 任務中查詢
<a name="materialized-views-querying-glue-jobs"></a>

```
from awsglue.context import GlueContext
from pyspark.context import SparkContext

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# Query materialized view
result = spark.sql("SELECT * FROM customer_orders")
result.show()
```

### 在 AWS Glue Studio 筆記本中查詢
<a name="materialized-views-querying-glue-studio-notebooks"></a>

```
%%sql
SELECT * FROM customer_orders
```

### 自動查詢重寫
<a name="materialized-views-automatic-query-rewrite"></a>

啟用自動查詢重寫時，Spark 最佳化工具會分析您的查詢，並在可以改善效能時自動使用具體化視觀表。例如，如果您執行下列查詢：

```
result = spark.sql("""
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM orders
    GROUP BY customer_name
""")
```

Spark 最佳化工具會自動重寫此查詢，以使用 customer\$1orders 具體化檢視，而不是處理基本訂單資料表，前提是具體化檢視是最新的。

### 驗證自動查詢重寫
<a name="materialized-views-verifying-automatic-query-rewrite"></a>

若要驗證查詢是否使用自動查詢重寫，請使用 EXPLAIN EXTENDED 命令：

```
spark.sql("""
    EXPLAIN EXTENDED
    SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount 
    FROM orders
    GROUP BY customer_name
""").show(truncate=False)
```

在執行計畫中，尋找 BatchScan 操作中的具體化檢視名稱。如果計劃顯示 BatchScan glue\$1catalog.analytics.customer\$1orders，而不是 BatchScan glue\$1catalog.sales.orders，則查詢會自動重新寫入，以使用具體化視觀表。

請注意，自動查詢重寫需要時間，Spark 中繼資料快取才能在建立具體化檢視之後填入。此程序通常會在 30 秒內完成。

## 重新整理具體化視觀表
<a name="materialized-views-refreshing"></a>

您可以使用兩種方法重新整理具體化視觀表：完全重新整理或增量重新整理。完整重新整理會從所有基礎資料表資料重新計算整個具體化視觀表，而增量重新整理只會處理自上次重新整理以來變更的資料。

### Glue AWS 任務中的手動完整重新整理
<a name="materialized-views-manual-full-refresh-glue-jobs"></a>

若要完整重新整理具體化視觀表：

```
spark.sql("REFRESH MATERIALIZED VIEW customer_orders FULL")

# Verify updated results
result = spark.sql("SELECT * FROM customer_orders")
result.show()
```

### Glue AWS 任務中的手動增量重新整理
<a name="materialized-views-manual-incremental-refresh-glue-jobs"></a>

若要執行增量重新整理，請確定已在 Spark 工作階段組態中啟用增量重新整理，然後執行：

```
spark.sql("REFRESH MATERIALIZED VIEW customer_orders")

# Verify updated results
result = spark.sql("SELECT * FROM customer_orders")
result.show()
```

 AWS Glue Data Catalog 會根據檢視定義和變更的資料量，自動判斷增量重新整理是否適用。如果無法進行增量重新整理，操作會回到完全重新整理。

### 在 AWS Glue Studio 筆記本中重新整理
<a name="materialized-views-refreshing-glue-studio-notebooks"></a>

在筆記本中，使用 %%sql 魔術命令：

```
%%sql
REFRESH MATERIALIZED VIEW customer_orders FULL
```

### 驗證增量重新整理執行
<a name="materialized-views-verifying-incremental-refresh"></a>

若要確認已成功執行增量重新整理，請在 AWS Glue 任務中啟用偵錯記錄：

```
from awsglue.context import GlueContext
from pyspark.context import SparkContext
import logging

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# Enable debug logging
logger = logging.getLogger('org.apache.spark.sql')
logger.setLevel(logging.DEBUG)

# Execute refresh
spark.sql("REFRESH MATERIALIZED VIEW customer_orders")
```

在 Glue AWS 任務日誌中搜尋下列訊息：

```
DEBUG RefreshMaterializedViewExec: Executed Incremental Refresh
```

## 管理具體化視觀表
<a name="materialized-views-managing"></a>

AWS Glue 提供 SQL 命令，用於管理任務和筆記本中具體化視觀表的生命週期。

### 描述具體化視觀表
<a name="materialized-views-describing"></a>

若要檢視具體化檢視的中繼資料，包括其定義、重新整理狀態和上次重新整理時間戳記：

```
spark.sql("DESCRIBE EXTENDED customer_orders").show(truncate=False)
```

### 變更具體化視觀表
<a name="materialized-views-altering"></a>

若要修改現有具體化檢視的重新整理排程：

```
spark.sql("""
    ALTER MATERIALIZED VIEW customer_orders 
    ADD SCHEDULE REFRESH EVERY 2 HOURS
""")
```

若要移除自動重新整理：

```
spark.sql("""
    ALTER MATERIALIZED VIEW customer_orders 
    DROP SCHEDULE
""")
```

### 捨棄具體化視觀表
<a name="materialized-views-dropping"></a>

若要刪除具體化檢視：

```
spark.sql("DROP MATERIALIZED VIEW customer_orders")
```

此命令會從 Glue Data Catalog AWS 中移除具體化檢視定義，並從 S3 儲存貯體中刪除基礎 Iceberg 資料表資料。

### 列出具體化視觀表
<a name="materialized-views-listing"></a>

若要列出資料庫中的所有具體化視觀表：

```
spark.sql("SHOW VIEWS FROM analytics").show()
```

## 具體化視觀表的許可
<a name="materialized-views-permissions"></a>

若要建立和管理具體化視觀表，您必須設定 AWS Lake Formation 許可。建立具體化檢視的 IAM 角色 （定義者角色） 需要來源資料表和目標資料庫的特定許可。

### 定義者角色的必要許可
<a name="materialized-views-required-permissions-definer-role"></a>

定義者角色必須具有下列 Lake Formation 許可：
+ 在來源資料表上 – 沒有資料列、資料欄或儲存格篩選條件的 SELECT 或 ALL 許可
+ 在目標資料庫上 – CREATE\$1TABLE 許可
+ 在 AWS Glue Data Catalog 上 – GetTable 和 CreateTable API 許可

當您建立具體化檢視時，定義者角色的 ARN 會存放在檢視定義中。 AWS Glue Data Catalog 會在執行自動重新整理操作時擔任此角色。如果定義者角色無法存取來源資料表，重新整理操作將會失敗，直到許可還原為止。

### Glue 任務的 IAM AWS 許可
<a name="materialized-views-iam-permissions-glue-jobs"></a>

Glue AWS 任務的 IAM 角色需要下列許可：

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetCatalog",
                "glue:GetCatalogs",
                "glue:GetTable",
                "glue:GetTables",
                "glue:CreateTable",
                "glue:UpdateTable",
                "glue:DeleteTable",
                "glue:GetDatabase",
                "glue:GetDatabases",
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*:/aws-glue/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "lakeformation:GetDataAccess"
            ],
            "Resource": "*"
        }
    ]
}
```

您用於具體化檢視自動重新整理的角色必須具有角色的 iam：PassRole 許可。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::111122223333:role/materialized-view-role-name"
      ]
    }
  ]
}
```

若要讓 Glue 為您自動重新整理具體化視觀表，該角色也必須具有下列信任政策，讓服務能夠擔任該角色。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::111122223333:role/materialized-view-role-name"
      ]
    }
  ]
}
```

如果具體化檢視存放在 S3 資料表儲存貯體中，您也需要將下列許可新增至角色。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3tables:PutTableMaintenanceConfiguration"
      ],
      "Resource": "arn:aws:s3tables:*:123456789012:*"
    }
  ]
}
```

### 授予具體化視觀表的存取權
<a name="materialized-views-granting-access"></a>

若要授予其他使用者查詢具體化視觀表的存取權，請使用 AWS Lake Formation 授予具體化視觀表的 SELECT 許可。使用者可以查詢具體化視觀表，而不需要直接存取基礎來源資料表。

如需設定 Lake Formation 許可的詳細資訊，請參閱《 AWS Lake Formation 開發人員指南》中的授予和撤銷 Data Catalog 資源的許可。

## 監控具體化視觀表操作
<a name="materialized-views-monitoring"></a>

 AWS Glue Data Catalog 會將具體化檢視重新整理操作的指標和日誌發佈至 Amazon CloudWatch。您可以監控透過 CloudWatch 指標處理的重新整理狀態、持續時間和資料磁碟區。

### 檢視任務日誌
<a name="materialized-views-viewing-job-logs"></a>

若要檢視建立或重新整理具體化檢視之 AWS Glue 任務的日誌：

1. 開啟 AWS Glue 主控台。

1. 從導覽窗格中選擇任務。

1. 選取您的任務，然後選擇執行。

1. 選取特定的執行，然後選擇日誌以檢視 CloudWatch 日誌。

### 設定警示
<a name="materialized-views-setting-up-alarms"></a>

若要在重新整理操作失敗或超過預期持續時間時接收通知，請在具體化檢視指標上建立 CloudWatch 警示。您也可以設定 Amazon EventBridge 規則來觸發重新整理事件的自動回應。

## 範例：完成工作流程
<a name="materialized-views-complete-workflow"></a>

下列範例示範在 Glue AWS 中建立和使用具體化檢視的完整工作流程。

### 範例 AWS Glue 任務指令碼
<a name="materialized-views-example-glue-job-script"></a>

```
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

# Create database and base table
spark.sql("CREATE DATABASE IF NOT EXISTS sales")
spark.sql("USE sales")

spark.sql("""
    CREATE TABLE IF NOT EXISTS orders (
        id INT,
        customer_name STRING,
        amount DECIMAL(10,2),
        order_date DATE
    )
""")

# Insert sample data
spark.sql("""
    INSERT INTO orders VALUES 
        (1, 'John Doe', 150.00, DATE('2024-01-15')),
        (2, 'Jane Smith', 200.50, DATE('2024-01-16')),
        (3, 'Bob Johnson', 75.25, DATE('2024-01-17'))
""")

# Create materialized view
spark.sql("""
    CREATE MATERIALIZED VIEW customer_summary
    AS 
    SELECT 
        customer_name, 
        COUNT(*) as order_count, 
        SUM(amount) as total_amount 
    FROM glue_catalog.sales.orders
    GROUP BY customer_name
""")

# Query the materialized view
print("Initial materialized view data:")
spark.sql("SELECT * FROM customer_summary").show()

# Insert additional data
spark.sql("""
    INSERT INTO orders VALUES 
        (4, 'Jane Smith', 350.00, DATE('2024-01-18')),
        (5, 'Bob Johnson', 100.25, DATE('2024-01-19'))
""")

# Refresh the materialized view
spark.sql("REFRESH MATERIALIZED VIEW customer_summary FULL")

# Query updated results
print("Updated materialized view data:")
spark.sql("SELECT * FROM customer_summary").show()

job.commit()
```

### 範例 AWS Glue Studio 筆記本
<a name="materialized-views-example-glue-studio-notebook"></a>

```
%%configure
{
    "conf": {
        "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
        "spark.sql.catalog.glue_catalog": "org.apache.iceberg.spark.SparkCatalog",
        "spark.sql.catalog.glue_catalog.type": "glue",
        "spark.sql.catalog.glue_catalog.warehouse": "s3://amzn-s3-demo-bucket/warehouse",
        "spark.sql.catalog.glue_catalog.glue.region": "us-east-1",
        "spark.sql.catalog.glue_catalog.glue.id": "111122223333",
        "spark.sql.catalog.glue_catalog.glue.account-id": "111122223333",
        "spark.sql.catalog.glue_catalog.glue.lakeformation-enabled": "true",
        "spark.sql.defaultCatalog": "glue_catalog",
        "spark.sql.optimizer.answerQueriesWithMVs.enabled": "true",
        "spark.sql.materializedViews.metadataCache.enabled": "true"
    }
}
```

```
%%sql
CREATE DATABASE IF NOT EXISTS sales
```

```
%%sql
USE sales
```

```
%%sql
CREATE TABLE IF NOT EXISTS orders (
    id INT,
    customer_name STRING,
    amount DECIMAL(10,2),
    order_date DATE
)
```

```
%%sql
INSERT INTO orders VALUES 
    (1, 'John Doe', 150.00, DATE('2024-01-15')),
    (2, 'Jane Smith', 200.50, DATE('2024-01-16')),
    (3, 'Bob Johnson', 75.25, DATE('2024-01-17'))
```

```
%%sql
CREATE MATERIALIZED VIEW customer_summary
AS 
SELECT 
    customer_name, 
    COUNT(*) as order_count, 
    SUM(amount) as total_amount 
FROM glue_catalog.sales.orders
GROUP BY customer_name
```

```
%%sql
SELECT * FROM customer_summary
```

```
%%sql
INSERT INTO orders VALUES 
    (4, 'Jane Smith', 350.00, DATE('2024-01-18')),
    (5, 'Bob Johnson', 100.25, DATE('2024-01-19'))
```

```
%%sql
REFRESH MATERIALIZED VIEW customer_summary FULL
```

```
%%sql
SELECT * FROM customer_summary
```

## 考量和限制
<a name="materialized-views-considerations-limitations"></a>

搭配 Glue AWS 使用具體化視觀表時，請考慮下列事項：
+ 具體化視觀表需要 AWS Glue 5.1 版或更新版本。
+ 來源資料表必須是在 Glue Data Catalog 中註冊的 Apache Iceberg AWS 資料表。啟動時不支援 Apache Hive、Apache Hudi 和 Linux Foundation Delta Lake 資料表。
+ 來源資料表必須位於與具體化視觀表相同的區域和帳戶中。
+ 所有來源資料表都必須由 管理 AWS Lake Formation。不支援僅限 IAM 的許可和混合存取。
+ 具體化視觀表無法參考 AWS Glue Data Catalog 檢視、多方視觀表或其他具體化視觀表作為來源資料表。
+ 檢視定義者角色必須在未套用資料列、資料欄或儲存格篩選條件的所有來源資料表上具有完整讀取存取權 (SELECT 或 ALL 許可）。
+ 具體化視觀表最終與來源資料表一致。在重新整理時段期間，查詢可能會傳回過時的資料。執行手動重新整理以立即保持一致性。
+ 最短自動重新整理間隔為一小時。
+ 增量重新整理支援 SQL 操作的限制子集。檢視定義必須是單一 SELECT-FROM-WHERE-GROUP BY-HAVING 區塊，而且不能包含設定操作、子查詢、SELECT 或彙總函數中的 DISTINCT 關鍵字、視窗函數或 INNER JOIN 以外的聯結。
+ 增量重新整理不支援使用者定義的函數或特定內建函數。僅支援 Spark SQL 內建函數的子集。
+ 查詢自動重寫只會考慮具體化視觀表，其定義屬於與增量重新整理限制類似的受限 SQL 子集。
+ CREATE MATERIALIZED VIEW 查詢不支援包含英數字元和底線以外的特殊字元的識別符。這適用於所有識別符類型，包括catalog/namespace/table名稱、資料欄和結構欄位名稱、CTEs 和別名。
+ 以 \$1\$1ivm 字首開頭的具體化檢視資料欄會保留供系統使用。Amazon 保留在未來版本中修改或移除這些資料欄的權利。
+ 具體化視觀表定義不支援 SORT BY、LIMIT、OFFSET、CLUSTER BY 和 ORDER BY 子句。
+ 不支援跨區域和跨帳戶來源資料表。
+ 檢視查詢中參考的資料表必須使用三部分命名慣例 （例如 glue\$1catalog.my\$1db.my\$1table)，因為自動重新整理不會使用預設目錄和資料庫設定。
+ 完整重新整理操作會覆寫整個資料表，並使先前的快照無法使用。
+ 具體化視觀表定義不支援非確定性函數，例如 rand() 或 current\$1timestamp()。

# AWS Glue 工作者類型
<a name="worker-types"></a>

## 概觀
<a name="worker-types-overview"></a>

AWS Glue 提供多種工作者類型，以因應不同的工作負載需求，從小型串流任務到大規模的記憶體密集型資料處理任務。本節提供有關所有可用工作者類型、其規格和用法建議的完整資訊。

### 工作者類型類別
<a name="worker-type-categories"></a>

AWS Glue 提供兩種主要類別的工作者類型：
+ **G 工作者類型**：針對標準 ETL 工作負載最佳化的一般用途運算工作者
+ **R 工作者類型**：專為記憶體密集型 Spark 應用程式而設計的記憶體最佳化工作者

### 資料處理單位 (DPU)
<a name="data-processing-units"></a>

 AWS Glue 工作者可用的資源是以 DPUs測量。DPU 是處理能力的相對測量，包含 4 個 vCPUs的運算容量和 16 GB 的記憶體。

**記憶體最佳化 DPU (M-DPU)**：R 類型工作者使用 M-DPU，相較於標準 DPU，在指定大小下可提供兩倍的記憶體分配。這表示雖然標準 DPU 可提供 16 GB 的記憶體，但 R 類型工作者中的 M-DPU 可提供專為記憶體密集型 Spark 應用程式最佳化的 32GB 記憶體。

## 可用的工作者類型
<a name="available-worker-types"></a>

### G.1X
<a name="g1x-standard-worker"></a>
+ **DPU**：1 個 DPU (4 個 vCPU、16 GB 記憶體)
+ **儲存**：94GB 磁碟 (大約 44GB 可用)
+ **使用案例**：資料轉換、聯結和查詢 - 可擴展且符合成本效益，適合大多數任務

### G.2X
<a name="g2x-standard-worker"></a>
+ **DPU**：2 個 DPU (8 個 vCPU、32 GB 記憶體)
+ **儲存**：138GB 磁碟 (大約 78GB 可用)
+ **使用案例**：資料轉換、聯結和查詢 - 可擴展且符合成本效益，適合大多數任務

### G.4X
<a name="g4x-large-worker"></a>
+ **DPU**：4 個 DPU (16 個 vCPU、64 GB 記憶體)
+ **儲存**：256GB 磁碟 (大約 230GB 可用)
+ **使用案例**：嚴苛的轉換、彙總、聯結和查詢

### G.8X
<a name="g8x-extra-large-worker"></a>
+ **DPU**：8 個 DPU (32 個 vCPU、128 GB 記憶體)
+ **儲存**：512GB 磁碟 (大約 485GB 可用)
+ **使用案例**：嚴苛的轉換、彙總、聯結和查詢

### G.12X
<a name="g12x-very-large-worker"></a>
+ **DPU**：12 個 DPU (48 個 vCPU、192 GB 記憶體)
+ **儲存**：768GB 磁碟 (大約 741GB 可用)
+ **使用案例**：需要大量運算容量的超大型且資源密集型工作負載

### G.16X
<a name="g16x-maximum-worker"></a>
+ **DPU**：16 個 DPU (64 個 vCPU、256 GB 記憶體)
+ **儲存**：1024GB 磁碟 (大約 996GB 可用)
+ **使用案例**：需要最大運算容量的最大且資源密集型工作負載

### R.1X - 記憶體最佳化\$1
<a name="r1x-memory-optimized-small"></a>
+ **DPU**：1 個 M-DPU (4 個 vCPU，32 GB 記憶體)
+ **使用案例**：記憶體密集型工作負載，經常出現記憶體不足錯誤或者記憶體與 CPU 比率要求較高

### R.2X - 記憶體最佳化\$1
<a name="r2x-memory-optimized-medium"></a>
+ **DPU**：2 個 M-DPU (8 個 vCPU，64 GB 記憶體)
+ **使用案例**：記憶體密集型工作負載，經常出現記憶體不足錯誤或者記憶體與 CPU 比率要求較高

### R.4X - 記憶體最佳化\$1
<a name="r4x-memory-optimized-large"></a>
+ **DPU**：4 個 M-DPU (16 個 vCPU，128 GB 記憶體)
+ **使用案例**：大型記憶體密集型工作負載，經常出現記憶體不足錯誤或者記憶體與 CPU 比率要求較高

### R.8X - 記憶體最佳化\$1
<a name="r8x-memory-optimized-extra-large"></a>
+ **DPU**：8 個 M-DPU (32 個 vCPU，256 GB 記憶體)
+ **使用案例**：超大型記憶體密集型工作負載，經常出現記憶體不足錯誤或者記憶體與 CPU 比率要求較高

**\$1** 使用這些工作者時，可能會遇到較高的啟動延遲。若要解決問題，請嘗試下列方法：
+ 等候幾分鐘，然後再次提交您的任務。
+ 提交減少工作者數目的新任務。
+ 使用不同的工作者類型或大小提交新任務。

## 工作者類型規格表
<a name="worker-type-specifications"></a>


**工作者類型規格**  

| 工作者類型 | 每個節點的 DPU | vCPU | 記憶體 (GB) | 磁碟 (GB) | 大約可用磁碟空間 (GB) | 每個節點的 Spark 執行器 | 
| --- | --- | --- | --- | --- | --- | --- | 
| G.1X | 1 | 4 | 16 | 94 | 44 | 1 | 
| G.2X | 2 | 8 | 32 | 138 | 78 | 1 | 
| G.4X | 4 | 16 | 64 | 256 | 230 | 1 | 
| G.8X | 8 | 32 | 128 | 512 | 485 | 1 | 
| G.12X | 12 | 48 | 192 | 768 | 741 | 1 | 
| G.16X | 16 | 64 | 256 | 1024 | 996 | 1 | 
| R.1X | 1 | 4 | 32 | 94 | 44 | 1 | 
| R.2X | 2 | 8 | 64 | 138 | 78 | 1 | 
| R.4X | 4 | 16 | 128 | 256 | 230 | 1 | 
| R.8X | 8 | 32 | 256 | 512 | 485 | 1 | 

*注意*：R 工作者類型具有記憶體最佳化組態，其規格已針對記憶體密集型工作負載進行了最佳化。

## 重要考量
<a name="important-considerations"></a>

### 啟動延遲
<a name="startup-latency"></a>

**重要**  
G.12X 和 G.16X 工作者類型，以及所有 R 工作者類型 (R.1X 到 R.8X)，可能會遇到較高的啟動延遲。若要解決問題，請嘗試下列方法：  
等候幾分鐘，然後再次提交您的任務。
提交減少工作者數目的新任務。
使用不同的工作者類型和大小提交新任務。

## 選擇正確的工作者類型
<a name="choosing-right-worker-type"></a>

### 對於標準 ETL 工作負載
<a name="standard-etl-workloads"></a>
+ **G.1X 或 G.2X**：對於典型的資料轉換、聯結和查詢最具成本效益
+ **G.4X 或 G.8X**：適用於具有較大資料集的更嚴苛工作負載

### 適用於大規模工作負載
<a name="large-scale-workloads"></a>
+ **G.12X**：需要大量運算資源的超大型資料集
+ **G.16X**：最嚴苛工作負載的最大運算能力

### 對於記憶體密集型工作負載
<a name="memory-intensive-workloads"></a>
+ **R.1X 或 R.2X**：中小型記憶體密集型任務
+ **R.4X 或 R.8X**：經常發生 OOM 錯誤的大型記憶體密集型工作負載

## 成本最佳化考量
<a name="cost-optimization-considerations"></a>
+ **標準 G 工作者**：可平衡運算、記憶體和聯網資源，用於成本較低的各種工作負載
+ **R 工作者**：專門用於具有快速效能的記憶體密集型任務，適用於在記憶體中處理大型資料集的工作負載

## 最佳實務
<a name="best-practices"></a>

### 工作者選擇準則
<a name="worker-selection-guidelines"></a>

1. 對於大多數工作負載，**從標準工作者開始** (G.1X、G.2X)

1. 當頻繁出現記憶體不足錯誤或工作負載具有快取、隨機播放和彙總等記憶體密集型操作時，**使用 R 工作者**

1. 對於需要最大資源的運算密集型工作負載，**請考慮 G.12X/G.16X** 

1. 在時間敏感型工作流程中使用新的工作者類型時，**考慮容量限制** 

### 效能最佳化
<a name="performance-optimization"></a>
+ 監控 CloudWatch 指標以了解資源使用率
+ 根據資料大小和複雜性，使用適當的工作者計數
+ 考慮資料分區策略，以最佳化工作者效率

# 在 AWS Glue 中串流 ETL 任務
<a name="add-job-streaming"></a>

您可以建立串流擷取、轉換和載入 (ETL) 任務，讓它連續執行並從 Amazon Kinesis Data Streams、Apache Kafka 和 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 的串流來源使用資料。這些任務會清理並轉換資料，然後將結果載入 Amazon S3 資料湖或 JDBC 資料存放區。

此外，您可以為 Amazon Kinesis Data Streams 產生資料。此功能僅適用於撰寫 AWS Glue 指令碼時。如需詳細資訊，請參閱[Kinesis 連線](aws-glue-programming-etl-connect-kinesis-home.md)。

依預設，AWS Glue 以 100 秒的間隔處理和寫出資料。這樣可以有效處理資料，並且可在資料到達時間比預期晚時執行彙總。您可以修改此時段大小，以提高適時性或彙總正確性。AWS Glue 串流任務使用檢查點而不是任務書籤來追蹤已讀取的資料。

**注意**  
AWS Glue 在串流 ETL 任務執行時按小時計費。

本影片討論串流 ETL 的成本挑戰，以及其中節省成本的功能 AWS Glue。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/6ggTFOtfUxU/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/6ggTFOtfUxU)


建立串流 ETL 任務包含下列步驟：

1. 對於 Apache Kafka 串流來源，建立連接到 Kafka 來源或 Amazon MSK 叢集的 AWS Glue 連線。

1. 為串流來源手動建立 Data Catalog 資料表。

1. 為串流資料來源建立 ETL 任務。定義串流特定的任務屬性，並提供您自己的指令碼，或選擇修改產生的指令碼。

如需詳細資訊，請參閱[在 中串流 ETL AWS Glue](components-overview.md#streaming-etl-intro)。

為 Amazon Kinesis Data Streams 建立串流 ETL 任務時，您不需要建立 AWS Glue 連線。但是，如果有連線連接到以 Kinesis Data Streams 做為來源的 AWS Glue 串流 ETL 任務，則需要連到 Kinesis 的 Virtual Private Cloud (VPC) 端點。如需詳細資訊，請參閱 *Amazon VPC 使用者指南*中的[建立介面端點](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)。在另一個帳戶中指定 Amazon Kinesis Data Streams 時，您必須設定角色和政策以允許跨帳戶存取。如需詳細資訊，請參閱[範例：從不同帳戶中的 Kinesis 串流讀取](https://docs.aws.amazon.com/kinesisanalytics/latest/java/examples-cross.html)。

AWS Glue 串流 ETL 作業可以自動偵測壓縮資料、透明地解壓縮串流資料、在輸入來源上執行例行轉換並載入輸出存放區。

AWS Glue 根據輸入格式，支援以下壓縮類型的自動解壓縮：


| 壓縮類型 | Avro 檔案 | Avro 資料 | JSON | CSV | Grok | 
| --- | --- | --- | --- | --- | --- | 
| BZIP2 | 是 | 是 | 是 | 是 | 是 | 
| GZIP | 否 | 是 | 是 | 是 | 是 | 
| SNAPPY | 是 (原始 Snappy) | 是 (框架式 Snappy) | 是 (框架式 Snappy) | 是 (框架式 Snappy) | 是 (框架式 Snappy) | 
| XZ | 是 | 是 | 是 | 是 | 是 | 
| ZSTD | 是 | 否 | 否 | 否 | 否 | 
| DEFLATE | 是 | 是 | 是 | 是 | 是 | 

**Topics**
+ [為 Apache Kafka 資料串流建立 AWS Glue 連線](#create-conn-streaming)
+ [為串流來源建立資料目錄資料表](#create-table-streaming)
+ [Avro 串流來源的注意事項與限制](#streaming-avro-notes)
+ [將 grok 模式套用至串流來源](#create-table-streaming-grok)
+ [定義串流 ETL 任務的任務屬性](#create-job-streaming-properties)
+ [串流 ETL 注意事項和限制](#create-job-streaming-restrictions)

## 為 Apache Kafka 資料串流建立 AWS Glue 連線
<a name="create-conn-streaming"></a>

若要讀取 Apache Kafka 串流，您必須建立 AWS Glue 連線。

**為 Kafka 來源建立 AWS Glue 連線 (主控台)**

1. 在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台。

1. 在導覽窗格中，於 **Data catalog** ( Data Catalog ) 下選擇 **Connections** (連線)。

1. 選擇 **Add connection (新增連線)**，然後在 **Set up your connection’s properties (設定連線的屬性)** 頁面上輸入連線名稱。
**注意**  
如需指定連線屬性的詳細資訊，請參見《[AWS Glue 連線屬性。](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-connections)》。

1. 對於**連線類型**，請選擇 **Kafka**。

1. 對於 **Kafka bootstrap servers URLs (Kafka 引導伺服器 URL)**，請為您的 Amazon MSK 叢集或 Apache Kafka 叢集輸入引導代理程式的主機和連接埠號碼。僅使用 Transport Layer Security (TLS) 端點來建立與 Kafka 叢集的初始連線。不支援純文字端點。

   以下是 Amazon MSK 叢集的主機名稱和連接埠號碼對的範例清單。

   ```
   myserver1.kafka.us-east-1.amazonaws.com:9094,myserver2.kafka.us-east-1.amazonaws.com:9094,
   myserver3.kafka.us-east-1.amazonaws.com:9094
   ```

   如需取得引導代理程式資訊的詳細資訊，請參閱 *Amazon Managed Streaming for Apache Kafka 開發人員指南*中的[取得 Amazon MSK 叢集的引導代理程式](https://docs.aws.amazon.com/msk/latest/developerguide/msk-get-bootstrap-brokers.html)。

1. 如果您想要與 Kafka 資料來源的安全連線，請選取 **Require SSL connection (需要 SSL 連線)**，以及對於 **Kafka private CA certificate location (Kafka 私有 CA 憑證位置)**，輸入自訂 SSL 憑證的有效 Amazon S3 路徑。

   對於自我管理的 Kafka 的 SSL 連線，自訂憑證是強制性的。這對於 Amazon MSK 是選用的。

   如需指定 Kafka 之自訂憑證的詳細資訊，請參閱 [AWS Glue SSL 連線屬性](connection-properties.md#connection-properties-SSL)。

1. 使用 AWS Glue Studio 或 AWS CLI 指定 Kafka 用戶端身分驗證方法。若要存取，**AWS Glue**請從左側導覽窗格中的 **ETL** 選單 AWS Glue Studio 中選取 。

   如需 Kafka 用戶端身分驗證方法的詳細資訊，請參閱 [用於用戶端身分驗證的 AWS Glue Kafka 連連線屬性](#connection-properties-kafka-client-auth)。

1. 選用地輸入描述，然後選擇 **Next (下一頁)**。

1. 對於 Amazon MSK 叢集，請指定其 Virtual Private Cloud (VPC)、子網路和安全群組。VPC 資訊對於自我管理 Kafka 是選用的。

1. 選擇 **Next (下一頁)** 檢閱所有連線屬性，然後選擇 **Finish (完成)**。

如需 AWS Glue 連線的詳細資訊，請參閱 [連線至資料](glue-connections.md)。

### 用於用戶端身分驗證的 AWS Glue Kafka 連連線屬性
<a name="connection-properties-kafka-client-auth"></a>

**SASL/GSSAPI (Kerberos) 身分驗證**  
選擇此身分驗證方法將允許您指定 Kerberos 屬性。

**Kerberos Keytab**  
選擇 Keytab 檔案的位置。Keytab 存放了一個或多個主體的長期金鑰。如需詳細資訊，請參閱 [MIT Kerberos 文件：Keytab](https://web.mit.edu/kerberos/krb5-latest/doc/basic/keytab_def.html)。

**Kerberos krb5.conf 檔案**  
選擇 krb5.conf 檔案。這包含預設範圍 (類似網域的邏輯網路，可定義相同 KDC 下的一組系統) 和 KDC 伺服器的位置。如需詳細資訊，請參閱 [MIT Kerberos 文件：krb5.conf](https://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/krb5_conf.html)。

**Kerberos 主體和 Kerberos 服務名稱**  
輸入 Kerberos 主體和服務名稱。如需詳細資訊，請參閱 [MIT Kerberos 文件：Kerberos 主體](https://web.mit.edu/kerberos/krb5-1.5/krb5-1.5.4/doc/krb5-user/What-is-a-Kerberos-Principal_003f.html)。

**SASL/SCRAM-SHA-512 身分驗證**  
 選擇此身分驗證方法將允許您指定身分驗證憑證。

**AWS Secrets Manager**  
在搜尋方塊中鍵入名稱或 ARN 來搜尋字符。

**直接提供使用者名稱和密碼**  
請在搜尋方塊中鍵入名稱或 ARN 來搜尋字符。

**SSL 用戶端身分驗證**  
選擇此身分驗證方法將允許您透過瀏覽 Amazon S3 來選取 Kafka 用戶端金鑰存放區的位置。或者，您可以輸入 Kafka 用戶端金鑰存放區密碼和 Kafka 用戶端金鑰密碼。

**IAM 身分驗證**  
此身分驗證方法不需要任何額外的規格，且只有當串流來源是 MSK Kafka 時才適用。

**SASL/PLAIN 身分驗證**  
選擇此身分驗證方法可讓您指定身分驗證憑證。

## 為串流來源建立資料目錄資料表
<a name="create-table-streaming"></a>

可針對串流來源手動建立的資料目錄表，此資料目錄表可指定來源資料串流屬性，包含資料結構描述。此資料表做為串流 ETL 任務的資料來源。

如果您不知道來源資料串流中資料的結構描述，您可以建立沒有結構描述的資料表。然後，當您建立串流 ETL 任務時，您可以開啟 AWS Glue 結構描述偵測功能。AWS Glue 會從串流資料判斷結構描述。

使用 [AWS Glue 主控台](https://console.aws.amazon.com/glue/)、 AWS Command Line Interface (AWS CLI) 或 AWS Glue API 來建立資料表。如需使用 AWS Glue 主控台手動建立資料表的詳細資訊，請參閱 [建立資料表](tables-described.md)。

**注意**  
您無法使用 AWS Lake Formation 主控台建立資料表；您必須使用 AWS Glue主控台。

另外，請考慮以下 Avro 格式的串流來源或您可以套用 Grok 模式之日誌資料的資訊。
+ [Avro 串流來源的注意事項與限制](#streaming-avro-notes)
+ [將 grok 模式套用至串流來源](#create-table-streaming-grok)

**Topics**
+ [Kinesis 資料來源](#kinesis-source)
+ [Kafka 資料來源](#kafka-source)
+ [AWS Glue 結構描述登錄檔資料表來源](#schema-registry-table)

### Kinesis 資料來源
<a name="kinesis-source"></a>

建立資料表時，請設定下列串流 ETL 屬性 (主控台)。

**來源類型**  
**Kinesis**

**針對相同帳戶中的 Kinesis 來源：**    
**區域**  
Amazon Kinesis Data Streams 服務所在的 AWS 區域。區域和 Kinesis 串流名稱會一起翻譯成串流 ARN。  
範例：https://kinesis.us-east-1.amazonaws.com  
**Kinesis 串流名稱**  
串流名稱，如 *Amazon Kinesis Data Streams 開發人員指南*中的[建立串流](https://docs.aws.amazon.com/streams/latest/dev/kinesis-using-sdk-java-create-stream.html)所述。

**如需其他帳戶中的 Kinesis 來源，請參閱[此範例](https://docs.aws.amazon.com/kinesisanalytics/latest/java/examples-cross.html)，將角色和政策設定為允許跨帳戶存取。設定下列設定：**    
**串流 ARN**  
消費者註冊的 Kinesis 資料串流的 ARN。如需詳細資訊，請參閱 中的 [Amazon Resource Name (ARNs) AWS 和服務命名空間](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)*AWS 一般參考*。  
**擔任的角色 ARN**  
要擔任之角色的 Amazon Resource Name (ARN)。  
**工作階段名稱 (選用)**  
擔任角色工作階段的識別碼。  
當同一個角色由不同委託人或出於不同原因而承擔時，使用角色工作階段名稱來唯一識別工作階段。在跨帳戶案例中，角色工作階段名稱對擁有該角色的帳戶是可見的，而且可以由擁有該角色的帳戶記錄。角色工作階段名稱也用於擔任角色委託人的 ARN。這表示使用臨時安全登入資料的後續跨帳戶 API 請求，會在其 AWS CloudTrail 日誌中向外部帳戶公開角色工作階段名稱。

**為 Amazon Kinesis Data Streams 設定串流 ETL 屬性 (AWS Glue API 或 AWS CLI)**
+ 若要為相同帳戶中的 Kinesis 來源設定串流 ETL 屬性，請在 `CreateTable` API 操作或 `create_table` CLI 命令的 `StorageDescriptor` 結構中指定 `streamName` 和 `endpointUrl` 參數。

  ```
  "StorageDescriptor": {
  	"Parameters": {
  		"typeOfData": "kinesis",
  		"streamName": "sample-stream",
  		"endpointUrl": "https://kinesis.us-east-1.amazonaws.com"
  	}
  	...
  }
  ```

  或者，指定 `streamARN`。  
**Example**  

  ```
  "StorageDescriptor": {
  	"Parameters": {
  		"typeOfData": "kinesis",
  		"streamARN": "arn:aws:kinesis:us-east-1:123456789:stream/sample-stream"
  	}
  	...
  }
  ```
+ 若要為另一個帳戶中的 Kinesis 來源設定串流 ETL 屬性，請在 `CreateTable` API 操作或 `create_table` CLI 命令的 `StorageDescriptor` 結構中指定 `streamARN`、`awsSTSRoleARN` 和 `awsSTSSessionName` (選用) 參數。

  ```
  "StorageDescriptor": {
  	"Parameters": {
  		"typeOfData": "kinesis",
  		"streamARN": "arn:aws:kinesis:us-east-1:123456789:stream/sample-stream",
  		"awsSTSRoleARN": "arn:aws:iam::123456789:role/sample-assume-role-arn",
  		"awsSTSSessionName": "optional-session"
  	}
  	...
  }
  ```

### Kafka 資料來源
<a name="kafka-source"></a>

建立資料表時，請設定下列串流 ETL 屬性 (主控台)。

**來源類型**  
 **Kafka**

**針對 Kafka 來源：**    
**主題名稱**  
主題名稱依 Kafka 中所指定。  
**連線**  
參考 Kafka 來源的 AWS Glue 連線，如 [為 Apache Kafka 資料串流建立 AWS Glue 連線](#create-conn-streaming) 中所述。

### AWS Glue 結構描述登錄檔資料表來源
<a name="schema-registry-table"></a>

若要使用使用 AWS Glue 結構描述登錄檔串流任務，請依照 [使用案例： AWS Glue Data Catalog](schema-registry-integrations.md#schema-registry-integrations-aws-glue-data-catalog) 中的說明建立或更新結構描述登錄檔資料表。

目前，AWS Glue 串流僅支援 Glue 結構描述登錄檔 Avro 格式，其中結構描述推斷設定為 `false`。

## Avro 串流來源的注意事項與限制
<a name="streaming-avro-notes"></a>

下列注意事項和限制適用於 Avro 格式的串流來源：
+ 開啟結構描述偵測時，Avro 結構描述必須包含在裝載中。關閉時，裝載應該只包含資料。
+ 動態框架不支援某些 Avro 資料類型。在 AWS Glue 主控台的建立資料表精靈 **Define a schema (定義結構描述)** 頁面中定義結構描述時，您無法指定這些資料類型。在結構描述偵測期間，Avro 結構描述中不支援的類型會轉換成支援的類型，如下所示：
  + `EnumType => StringType`
  + `FixedType => BinaryType`
  + `UnionType => StructType`
+ 如果您使用主控台中 **Define a schema (定義結構描述)** 頁面來定義資料表結構描述，則結構描述的隱含根元素類型為 `record`。如果您想要 `record` 以外的根元素類型，例如 `array` 或 `map`，則無法使用 **Define a schema (定義結構描述)** 頁面指定結構描述。相反，您必須略過該頁面，並將結構描述指定為資料表屬性或在 ETL 指令碼內指定。
  + 若要在資料表屬性中指定結構描述，請完成建立資料表精靈、編輯資料表詳細資訊，並在 **Table properties (資料表屬性)** 下新增鍵值對。使用鍵 `avroSchema`，然後輸入值的結構描述 JSON 物件，如下列螢幕擷取畫面所示。  
![\[在 Table properties (資料表屬性) 標題下方，有兩欄文字欄位。左側欄標題為 Key (金鑰)，右側的欄標題為 Value (數值)。第一行中的鍵/值對是 classification/avro。第二行中的鍵/值對是 avroSchema/{"type":"array","items":"string"}。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/table_properties_avro.png)
  + 若要在 ETL 指令碼中指定結構描述，請修改 `datasource0` 指派陳述式，並新增 `avroSchema` 鍵至 `additional_options` 參數，如下列 Python 和 Scala 範例所示。

------
#### [ Python ]

    ```
    SCHEMA_STRING = ‘{"type":"array","items":"string"}’
    datasource0 = glueContext.create_data_frame.from_catalog(database = "database", table_name = "table_name", transformation_ctx = "datasource0", additional_options = {"startingPosition": "TRIM_HORIZON", "inferSchema": "false", "avroSchema": SCHEMA_STRING})
    ```

------
#### [ Scala ]

    ```
    val SCHEMA_STRING = """{"type":"array","items":"string"}"""
    val datasource0 = glueContext.getCatalogSource(database = "database", tableName = "table_name", redshiftTmpDir = "", transformationContext = "datasource0", additionalOptions = JsonOptions(s"""{"startingPosition": "TRIM_HORIZON", "inferSchema": "false", "avroSchema":"$SCHEMA_STRING"}""")).getDataFrame()
    ```

------

## 將 grok 模式套用至串流來源
<a name="create-table-streaming-grok"></a>

您可以為日誌資料來源建立串流 ETL 任務，並使用 Grok 模式將日誌轉換為結構化資料。ETL 任務接著會將資料當成結構化資料來源處理。您可以指定當您為串流來源建立 Data Catalog 資料表時要套用的 Grok 模式。

如需 Grok 模式和自訂模式字串值的相關資訊，請參閱 [撰寫 grok 自訂分類器](custom-classifier.md#custom-classifier-grok)。

**將 grok 模式新增至資料目錄資料表 (主控台)**
+ 使用建立資料表精靈，並使用 [為串流來源建立資料目錄資料表](#create-table-streaming) 中指定的參數建立資料表。指定資料格式為 Grok，填寫 **Grok pattern (Grok 模式)** 欄位，並選擇性地在 **Custom patterns (optional) (自訂模式 (選用))** 下方新增自訂模式。  
![\[*\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/grok-data-format-create-table.png)

  在每個自訂模式之後按 **Enter**。

**將 grok 模式新增至 Data Catalog 資料表 (AWS Glue API 或 AWS CLI)**
+ 新增 `GrokPattern` 參數，並選擇性地將 `CustomPatterns` 參數新增至 `CreateTable` API 操作或 `create_table` CLI 命令。

  ```
   "Parameters": {
  ...
      "grokPattern": "string",
      "grokCustomPatterns": "string",
  ...
  },
  ```

  將 `grokCustomPatterns` 表示為字串，並使用 "\$1n" 作為模式之間的分隔符。

  下列是指定這些參數的範例。  
**Example**  

  ```
  "parameters": {
  ...
      "grokPattern": "%{USERNAME:username} %{DIGIT:digit:int}",
      "grokCustomPatterns": "digit \d",
  ...
  }
  ```

## 定義串流 ETL 任務的任務屬性
<a name="create-job-streaming-properties"></a>

在 AWS Glue 主控台上定義串流 ETL 任務時，請提供下列串流特定的屬性。如需其他任務屬性的說明，請參閱 [定義 Spark 任務的任務屬性](add-job.md#create-job)。​ 

**IAM 角色**  
指定用於授權執行任務、存取串流來源和存取目標資料存放區之資源的 AWS Identity and Access Management (IAM) 角色。  
若要存取 Amazon Kinesis Data Streams，請將 `AmazonKinesisFullAccess` AWS 受管政策連接至角色，或連接類似的 IAM 政策，以允許更精細的存取。如需政策範例，請參閱[使用 IAM 控制對 Amazon Kinesis Data Streams 資源的存取](https://docs.aws.amazon.com/streams/latest/dev/controlling-access.html)。  
如需在 AWS Glue 執行任務之許可的詳細資訊，請參閱 [Glue AWS 的身分和存取管理](security-iam.md)。

**Type**  
選擇 **Spark streaming (Spark 串流)**。

**AWS Glue 版本**  
AWS Glue 版本決定了可用於任務的 Apache Spark 和 Python 或 Scala 版本。選擇一個選項，指定可用於任務的 Python 或 Scala 版本。AWS Glue具有 Python 3 支援的 2.0 版本是串流 ETL 任務的預設值。

**Maintenance window (維護時段)**  
指定可以在其中重新啟動串流任務的時段。請參閱 [AWS Glue 串流的維護時段](glue-streaming-maintenance.md)。

**任務逾時**  
選擇性地輸入持續時間 (以分鐘為單位)。預設值為空白。  
+ 串流任務的逾時值必須少於 7 天或 10,080 分鐘。
+ 當您將值保留空白時，如果尚未設定維護時段，系統會在 7 天後重新啟動任務。如果您已設定維護時段，系統會在 7 天後的維護時段期間重新啟動任務。

**資料來源**  
指定您在 [為串流來源建立資料目錄資料表](#create-table-streaming) 中建立的資料表。

**資料目標**  
執行以下任意一項：  
+ 選擇 **Create tables in your data target (在您的資料目標中建立資料表)**，然後指定下列資料目標屬性。  
**資料存放區**  
選擇 Amazon S3 或 JDBC。  
**格式**  
選擇任何格式。全部支援串流。
+ 選擇 **Use tables in the data catalog and update your data target (使用 Data Catalog 中的資料表並更新您的資料目標)**，然後選擇 JDBC 資料存放區的資料表。

**輸出結構描述定義**  
執行以下任意一項：  
+ 選擇 **Automatically detect schema of each record (自動偵測每筆記錄的結構描述)** 以開啟結構描述偵測。AWS Glue 會從串流資料判斷結構描述。
+ 選擇 **Specify output schema for all records (指定所有記錄的輸出結構描述)**，以使用「套用映射」轉換來定義輸出結構描述。

**指令碼**  
選擇性地提供您自己的指令碼或修改產生的指令碼，以執行 Apache Spark 結構化串流引擎支援的操作。如需可用操作的詳細資訊，請參閱[串流 DataFrames/資料集上的操作](https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#operations-on-streaming-dataframesdatasets)。

## 串流 ETL 注意事項和限制
<a name="create-job-streaming-restrictions"></a>

請記住下列注意事項和限制：
+ 自動解壓縮 AWS Glue 串流 ETL 作業僅適用於支援的壓縮類型。同時請注意以下各項：
  + 框架式 Snappy 指的是官方 Snappy [框架格式](https://github.com/google/snappy/blob/main/framing_format.txt)。
  + Glue 3.0 版支援 Deflate，而 Glue 2.0 版不支援。
+ 使用結構描述偵測時，您無法執行串流資料的聯結。
+ AWS Glue 串流 ETL 任務不支援 Avro 格式 AWS Glue 結構描述登錄檔的 Union 資料類型。
+ 您的 ETL 指令碼可以使用 Apache Spark 結構化串流原生的 AWS Glue 內建轉換。如需詳細資訊，請參閱 Apache Spark 網站上的[串流 DataFrames/資料集上的操作](https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#operations-on-streaming-dataframesdatasets)或 [AWS Glue PySpark 轉換參考](aws-glue-programming-python-transforms.md)。
+ AWS Glue 串流 ETL 任務使用檢查點來追蹤已讀取的資料。因此，已停止再重新啟動的任務會從原先在串流中停止的位置接續下去。如果想要重新處理資料，您可以刪除指令碼中參考的檢查點資料夾。
+ 不支援任務書籤。
+ 若要在任務中使用 Kinesis Data Streams 的強化廣發功能，請參閱 [在 Kinesis 串流任務中使用強化廣發功能](aws-glue-programming-etl-connect-kinesis-efo.md)。
+ 如果使用從 AWS Glue 結構描述登錄檔建立的 Data Catalog 資料表，則當新的結構描述版本可用時，為了反映新的結構描述，您需要執行以下操作：

  1. 停止與資料表相關聯的任務。

  1. 更新「 Data Catalog 」資料表的結構描述。

  1. 重新啟動與資料表相關聯的任務。

# 記錄與 AWS Lake Formation FindMatches 相符
<a name="machine-learning"></a>

**注意**  
 AWS Glue 主控台中的下列區域目前無法使用記錄比對：中東 （阿拉伯聯合大公國）、歐洲 （西班牙）、亞太區域 （雅加達） 和歐洲 （蘇黎世）。

AWS Lake Formation 提供機器學習功能來建立自訂轉換以清理您的資料。目前有一個名為 FindMatches 的可用轉換。FindMatches 轉換可讓您識別資料集中重複或相符的記錄，即使記錄沒有通用的唯一識別符，也沒有欄位完全相符。不需要編寫任何程式碼或了解機器學習的運作方式。FindMatches 在許多不同的問題中非常有用，例如：
+ **Matching customers** (比對客戶)：跨不同客戶資料庫連結客戶記錄，即使許多客戶欄位在資料庫之間不完全相符 (例如：名稱拼字不同、地址差異、資料遺失或不正確等)。
+ **Matching products** (比對產品)：比對目錄中的產品與其他產品來源，例如產品目錄與競爭對手的目錄 (其中的項目結構不同)。
+ **Improving fraud detection** (改善詐騙偵測)：識別重複的客戶帳戶，新建立的帳戶與先前已知的詐騙使用者相符 (或可能相符) 時進行判斷。
+ **Other matching problems** (其他比對問題)：比對地址、電影、零件清單等。一般而言，如果人類可以查看您的資料庫列並判斷它們是否相符，則 FindMatches 轉換很有可能對您有幫助。

 當您建立任務時，您可以建立這些轉換。您建立的轉換會以來源資料存放區結構描述與您標記的來源資料集中的範例資料為基礎 (我們將這個程序稱為「教導」轉換)。來源資料集中必須存在您標記的記錄。在這個程序中，我們會產生一個檔案，您可以標記然後重新上傳，轉換會從中學習。在您教導轉換後，您便可以從您的 Spark 式 AWS Glue 任務 (PySpark 或 Scala Spark) 呼叫它，並搭配相容的來源資料存放區，在其他指令碼中使用它。

 在建立轉換後，它便會存放在 AWS Glue 中。在 AWS Glue 主控台上，您可以管理您建立的轉換。在**資料整合和 ETL** 的導覽窗格中，選擇**資料分類工具 > 記錄比對**，您可以進行編輯並繼續教導您的機器學習轉換。如需在主控台上管理轉換的詳細資訊，請參閱[使用機器學習轉換](console-machine-learning-transforms.md)。

**注意**  
AWS Glue 2.0 版 FindMatches 任務使用 Amazon S3 儲存貯體 `aws-glue-temp-<accountID>-<region>`，在轉換處理資料期間存放暫時檔案。您可以在執行完成後，手動或設定 Amazon S3 生命週期規則來刪除此資料。

## 機器學習轉換的類型
<a name="machine-learning-transforms"></a>

您可以建立機器學習轉換，來清理您的資料。您可以從 ETL 指令碼呼叫這些轉換。您的資料會在資料結構中從轉換傳遞至轉換，而此資料結構稱為 *DynamicFrame*，是 Apache Spark SQL `DataFrame` 的延伸。`DynamicFrame` 包含您的資料，而您可以參考其結構描述以處理資料。

下列類型的機器學習轉換可供您使用：

*尋找符合項目*  
在來源資料中尋找重複記錄。您可以透過標記範例資料集，指出哪些資料列相符，來教導此機器學習轉換。您使用範例標記資料教導它的次數越多，機器學習轉換便會學習應將哪些資料列視為相符項目。取決於您設定轉換的方式，輸出會是以下其中一項：  
+ 輸入資料表的複本，加上 `match_id` 資料行，其中會填入指出相符記錄集的值。`match_id` 資料行是任意識別符。具有相同 `match_id` 的任何記錄已識別為彼此相符。具有不同 `match_id` 的記錄不相符。
+ 輸入資料表的複本，其中會移除重複的資料列。若找到多個重複項，便會保留主索引鍵最小的記錄。

*尋找增量改進相符項目*  
尋找相符項目轉換也可以設定為在現有和增量改進框架中尋找相符項目，並以輸出方式傳回包含每個相符群組唯一 ID 的資料行。  
如需詳細資訊，請參閱：[尋找增量改進相符項目](machine-learning-incremental-matches.md)

### 使用 FindMatches 轉換
<a name="machine-learning-find-matches"></a>

您可以使用 `FindMatches` 轉換來在來源資料中尋找重複記錄。其中會產生或提供標記檔案，來協助教導轉換。

**注意**  
目前，下列區域不支援使用自訂加密金鑰的 `FindMatches` 轉換：  
亞太區域 (大阪) – `ap-northeast-3`

 若要開始使用 FindMatches 轉換，您可依照以下步驟操作。如需更進階且詳細的範例，請參閱**AWS 大數據部落格**：[使用 AWS Glue 和 AWS Lake Formation FindMatches ML 協調資料，以建置客戶 360 檢視。 ](https://aws.amazon.com/blogs/big-data/harmonize-data-using-aws-glue-and-aws-lake-formation-findmatches-ml-to-build-a-customer-360-view/)

#### 開始使用尋找相符項目轉換
<a name="machine-learning-find-mathes-workflow"></a>

遵循這些步驟來開始使用 `FindMatches` 轉換：

1. 在 中 AWS Glue Data Catalog 為要清理的來源資料建立資料表。如需如何建立爬蟲程式的資訊，請參閱[在 AWS Glue 主控台上使用爬蟲程式](https://docs.aws.amazon.com/glue/latest/dg/console-crawlers.html)。

   若您的來源資料是文字類型的檔案 (例如逗點分隔值 (CSV) 檔案)，請考慮以下事項：
   + 在不同的資料夾中保留您的輸入記錄 CSV 檔案及標記檔案。否則，AWS Glue 爬蟲程式可能會將他們視為相同資料表的多個部分，並以不正確的方式在 Data Catalog 中建立資料表。
   + 除非您的 CSV 檔案只包含 ASCII 字元，否則請確保針對 CSV 檔案使用不包含 BOM (位元組順序標記) 的 UTF-8 編碼。Microsoft Excel 通常會在 UTF-8 CSV 檔案的開頭新增 BOM。若要移除它，請在文字編輯器中開啟 CSV 檔案，然後將檔案重新儲存為 **UTF-8 without BOM (不包含 BOM 的 UTF-8)**。

1. 在 AWS Glue 主控台上建立任務，然後選擇 **Find matches (尋找相符項目)** 轉換類型。
**重要**  
您為任務選擇的資料來源資料表不能包含超過 100 個資料行。

1. 告訴 AWS Glue 產生標籤檔案，方法是選擇 **Generate labeling file (產生標籤檔案)**。AWS Glue 會先對每個 `labeling_set_id` 的類似記錄進行分組，以便您可以檢閱這些群組。您在 `label` 資料行中標示相符項目。
   + 若您已有標記檔案 (即指出相符資料列的記錄範例)，請將檔案上傳至 Amazon Simple Storage Service (Amazon S3)。如需標記檔案格式的資訊，請參閱[標記檔案格式](#machine-learning-labeling-file)。繼續進行步驟 4。

1. 下載標記檔案並標記檔案，如[標記](#machine-learning-labeling)一節所述。

1. 上傳修正後的標記檔案。AWS Glue 會執行任務來教導轉換如何尋找相符項目。

   在 **Machine learning transforms (機器學習轉換)** 清單頁面上，選擇 **History (歷史記錄)** 標籤。此頁面會指出 AWS Glue 何時執行下列任務：
   + **Import labels (匯入標籤)**
   + **Export labels (匯出標籤)**
   + **Generate labels (產生標籤)**
   + **Estimate quality (估計品質)**

1. 若要建立更佳的轉換，您可以反覆地下載、標記和上傳標記檔案。在初始執行時，會有許多記錄比對錯誤。但是 AWS Glue 會隨著您透過驗證標記檔案繼續教導它而逐步學習。

1. 評估尋找相符項目的效能和結果，來評估和調校您的轉換。如需詳細資訊，請參閱[在 AWS Glue 中調校機器學習轉換](add-job-machine-learning-transform-tuning.md)。

#### 標記
<a name="machine-learning-labeling"></a>

當 `FindMatches` 產生標記檔案時，會從您的來源資料表選取記錄。根據先前的培訓結果，`FindMatches` 會識別價值最高的記錄來進行學習。

*標記*的動作是編輯標記檔案 (我們建議使用如 Microsoft Excel 的試算表)，並將識別符或標籤新增至識別相符和不相符記錄的 `label` 資料行。在您資料檔案中擁有清楚且一致的相符項目定義相當重要。`FindMatches` 會從您指定為相符 (或不相符) 的記錄學習，並使用您的決定來學習如何尋找重複的記錄。

`FindMatches` 產生標記檔案時，大約會產生 100 筆記錄。這些 100 筆記錄通常會分為 10 個*標記組*，其中每個標記組會以 `FindMatches` 產生的唯一 `labeling_set_id` 辨識。每個標記組應視為是獨立於其他標記組的個別標記任務。您的任務為使用每個標記組識別相符與不相符的記錄。

##### 在試算表中編輯標記檔案的秘訣
<a name="machine-learning-labeling-tips"></a>

在試算表應用程式中編輯標記檔案時，請考慮以下事項：
+ 檔案可能會在尚未完全展開資料行欄位的情況下開啟。您可能需要展開 `labeling_set_id` 和 `label` 資料行來查看那些資料格中的內容。
+ 若主索引鍵資料行是數字 (例如 `long` 資料類型)，試算表可能會將其解譯為數字並變更值。此索引鍵值必須做為文字處理。若要修正此問題，請將主索引鍵資料行中的所有資料格格式化成 **Text data (文字資料)**。

#### 標記檔案格式
<a name="machine-learning-labeling-file"></a>

AWS Glue 產生的標記檔案用以教導您的 `FindMatches` 轉換使用以下格式。如果您為 AWS Glue 產生自己的檔案，該檔案也需遵循此格式：
+ 它是一個逗點分隔值 (CSV) 檔案。
+ 它必須以 `UTF-8` 編碼。若您使用 Microsoft Windows 編輯檔案，它可能會以 `cp1252` 進行編碼。
+ 它必須位在 Amazon S3 位置中，才能傳遞給 AWS Glue。
+ 為每個標記任務使用中等數量的行。雖然每個任務可達 2-30 列，但每個任務建議使用 10—20 列。不建議使用超過 50 列的任務，且此類任務可能會導致不佳的結果或系統故障。
+ 如果您有已標記的資料 (由標記為「match」(相符) 或「no-match」(不相符) 的記錄對組成)，這也沒問題。這些已標記的記錄對可以表示為大小 2 的標記組。在這種情況下，例如，如果兩項紀錄相符，則可將它們標記為「A」；如果它們不相符，則可將一筆記錄標記為「A」，另一筆標記為「B」。
**注意**  
 因為它包含額外的資料行，標記檔案所擁有的結構描述會與包含您來源資料的檔案不同。請將標記檔案置放在與任何轉換輸入 CSV 檔案不同的資料夾中，以防 AWS Glue 爬蟲程式在 Data Catalog 中建立資料表時將其納入考慮範圍。否則，AWS Glue 爬取程式建立的資料表可能無法正確地代表您的資料。
+ 前兩個資料行 (`labeling_set_id`、`label`) 是 AWS Glue 的必要項目。其餘資料行必須與要處理資料的結構描述相符。
+ 針對每個 `labeling_set_id`，您可以使用相同的標籤識別所有相符記錄。標籤是置放在 `label` 欄中的唯一字串。我們建議使用包含簡單字元的標籤，例如 A、B、C 等。標籤區分大小寫，並且會在 `label` 資料行中輸入。
+ 包含相同 `labeling_set_id` 和相同標籤的資料列會視為是相符的標記。
+ 包含相同 `labeling_set_id` 但不同標籤的資料列會視為是*不*相符的標記。
+ 包含不同 `labeling_set_id` 資料會視為未傳達任何資訊或不相符。

  以下是標記資料的範例：    
<a name="table-labeling-data"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/machine-learning.html)
+ 在以上的例子中，我們會將 John/Johnny/Jon Doe 識別為相符，並教導系統這些記錄與 Jane Smith 不相符。我們會另外教導系統 Richard 和 Rich Jones 皆為同一人，但這些記錄與 Sarah Jones/Jones-Walker 和 Richie Jones Jr. 不相符。
+ 如您所見，標籤的範圍會限制在 `labeling_set_id`。因此，標籤不會超過 `labeling_set_id` 的邊界。例如，位於 `labeling_set_id` 1 中的標籤「A」不會與 `labeling_set_id` 2 中的標籤「A」有任何關聯。
+ 若記錄不包含標記組內的任何相符項目，請為其指派一個唯一標籤。例如，Jane Smith 與標記組 ABC123 中的任何記錄，因此它是在有 B 標籤的該標記組中的唯一記錄。
+ 標記組「GHI678」表示標記組可以只由授予相同標籤 (以表示其相符) 的兩筆記錄組成。同樣地「XYZABC」表示授予不同標籤給兩筆記錄，以表示其不相符。
+ 請注意，有時標記組可能不含任何相符項目 (亦即，您授予標記組中的每筆記錄不同的標籤)，或標記組可能全都「相同」(您授予它們全都相同的標籤)。只要您的標籤組共同包含依您的條件屬於與不屬於「相同」的記錄範例。

**重要**  
確認您傳遞給 AWS Glue 的 IAM 角色具備包含標記檔案 Amazon S3 儲存貯體的存取權限。按照慣例，AWS Glue 政策會授予許可至名稱字首為 **aws-glue-** 的 Amazon S3 儲存貯體或資料夾。若您的標記檔案位於不同位置，請在 IAM 角色中將許可新增至該位置。

# 在 AWS Glue 中調校機器學習轉換
<a name="add-job-machine-learning-transform-tuning"></a>

您可以在 AWS Glue 中調校您的機器學習轉換，改善資料清理任務的結果來滿足您的目標。若要改善轉換，您可以產生標記集、新增標籤，然後重複這些步驟多次來教導它，直到您取得所需要的結果為止。您也可以變更一些機器學習參數來進行調校。

如需機器學習轉換的詳細資訊，請參閱[記錄與 AWS Lake Formation FindMatches 相符](machine-learning.md)。

**Topics**
+ [機器學習度量](machine-learning-terminology.md)
+ [在精確度和取回率之間進行選擇](machine-learning-precision-recall-tradeoff.md)
+ [在正確性和成本之間進行選擇](machine-learning-accuracy-cost-tradeoff.md)
+ [使用相符項目可信度分數估計相符項目的品質](match-scoring.md)
+ [教導尋找相符項目轉換](machine-learning-teaching.md)

# 機器學習度量
<a name="machine-learning-terminology"></a>

若要了解用來調校您機器學習轉換的度量，建議您先熟悉以下術語：

**真肯定 (TP)**  
轉換在資料中正確找到的相符項目，有時候稱為「命中」**。

**真否定 (TN)**  
轉換在資料中正確拒絕的不相符項目。

**假肯定 (FP)**  
轉換在資料中不正確地分類為相符項目的不相符項目，有時候稱為「錯誤警示」**。

**假否定 (FN)**  
轉換在資料中並未找到的相符項目，有時候稱為「未中」**。

如需機器學習中所使用術語的詳細資訊，請參閱 Wikipedia 中的 [Confusion matrix](https://en.wikipedia.org/wiki/Confusion_matrix)。

若要調校您的機器學習轉換，您可以在轉換的 **Advanced properties (進階屬性)** 中變更下列度量的值。
+ **Precision (精確度)** 會測量轉換在識別為肯定 (真肯定和假肯定) 的記錄總數中，找到真肯定的效果有多好。如需詳細資訊，請參閱 Wikipedia 中的 [Precision and recall](https://en.wikipedia.org/wiki/Precision_and_recall)。
+ **Recall (取回率)** 會測量從來源資料的所有記錄中，轉換找到真肯定的效果有多好。如需詳細資訊，請參閱 Wikipedia 中的 [Precision and recall](https://en.wikipedia.org/wiki/Precision_and_recall)。
+ **Accuracy (準確性)** 會測量轉換找到真肯定和真否定的效果有多好。提高正確性需要更多的機器資源和成本。但也會增加回收率。如需詳細資訊，請參閱 Wikipedia 中的 [Accuracy and precision](https://en.wikipedia.org/wiki/Accuracy_and_precision#In_information_systems)。
+ **Cost (成本)** 會測量執行轉換需要使用多少運算資源 (以及因此產生的金錢成本)。

# 在精確度和取回率之間進行選擇
<a name="machine-learning-precision-recall-tradeoff"></a>

每個 `FindMatches` 轉換都包含了 `precision-recall` 參數。您可以使用此參數來指定以下其中一個項目：
+ 若您更擔心轉換在兩筆記錄實際上不相符時錯誤地報告成相符，建議您強調「精確度」**。
+ 如果您更擔心轉換無法偵測到相符的記錄，建議您強調「取回率」**。

您可以在 AWS Glue 主控台上進行這項取捨，或是使用 AWS Glue 機器學習 API 操作。

**何時應著重在精確度**  
若您更擔心 `FindMatches` 在兩筆記錄不相符報告成相符的風險，建議您著重在精確度。若要著重在精確度，請選擇「較高」**的精確度取回率取捨值。使用更高的值，`FindMatches` 轉換便需要更多證據來判斷兩筆記錄是否相符。轉換會調校成較傾向於將記錄視為不相符。

例如，假設您正在使用 `FindMatches` 偵測影片目錄中的重複項，並且您為轉換提供了較高的精確度取回率值。若您的轉換不正確地將「星際大戰四部曲：曙光乍現」**視為與「星際大戰：帝國反擊戰」**相同，想要「星際大戰四部曲：曙光乍現」**的客戶便可能會看到「星際大戰：帝國反擊戰」**。這會是不佳的客戶體驗。

但是，若轉換無法偵測到「星際大戰四部曲：曙光乍現」**與「星際大戰：四部曲 ‒ 曙光乍現」**相同，客戶一開始可能會感到困惑，但最後還是會了解到他們是相同的項目。這會是一項錯誤，但不會像先前的案例那樣不佳。

**何時應著重在取回率**  
若您更擔心 `FindMatches` 轉換可能無法偵測到兩筆記錄實際上是相符項目的風險，建議您著重在取回率。若要著重在取回率，請選擇「較低」**的精確度取回率取捨值。使用較低的值，`FindMatches` 轉換便需要較少證據來判斷兩筆記錄是否相符。轉換會調校成較傾向於將記錄視為相符。

例如，這可能會是安全組織的優先事項。假設您正在將客戶與已知詐騙犯的清單進行比對，此時判斷客戶是否為詐騙犯便非常重要。您正在使用 `FindMatches` 將詐騙犯清單和客戶清單進行比對。每次 `FindMatches` 在兩個清單間找到相符項目，便會指派一名稽核人員來驗證該客戶是否確實是詐騙犯。相較於精確度，您的組織可能會偏好選擇取回率。換句話說，您會寧願讓稽核人員手動檢閱並拒絕客戶並非詐騙犯時的一些案例，也不願意在識別確實位於詐騙犯清單上的客戶時失敗。

**如何同時著重精確度和取回率**  
同時改善精確度和取回率的最佳方式是標記更多資料。隨著您標記更多資料，`FindMatches` 轉換的整體正確性便會獲得改善，進而同時改善精確度和取回率。但是，即使是使用最正確的轉換，仍然還是會有您必須實驗著重精確度或取回率，或是在這兩者之間選擇一個值的灰色地帶。

# 在正確性和成本之間進行選擇
<a name="machine-learning-accuracy-cost-tradeoff"></a>

每個 `FindMatches` 轉換都包含 `accuracy-cost` 參數。您可以使用此參數來指定以下其中一個項目：
+ 若您更希望轉換能夠正確地報告兩個記錄相符，建議您強調「正確性」**。
+ 若您更擔心執行轉換的成本或速度，建議您強調「較低成本」**。

您可以在 AWS Glue 主控台上進行這項取捨，或是使用 AWS Glue 機器學習 API 操作。

**何時應著重在正確性**  
若您更擔心 `find matches` 結果不包含任何相符項目的風險，建議您著重在正確性。若要著重在正確性，請選擇「較高」**的正確性成本取捨值。使用較高的值，`FindMatches` 轉換便需要更多時間執行更完整的搜尋，以正確地取得相符記錄。請注意，此參數不會讓錯誤地將不相符兩筆記錄視為相符項目的機率降低。轉換會調校成傾向花費更多時間尋找相符項目。

**何時應著重在成本**  
若您更擔心執行 `find matches` 轉換的成本，而非找到多少相符項目，建議您著重在成本。若要著重在成本，請選擇「較低」**的正確性成本取捨值。使用較低的值，`FindMatches` 轉換執行時需要的資源便會更少。轉換會調校成傾向尋找較少相符項目。若您可以接受著重在較低成本時的結果，請使用此設定。

**如何同時著重正確性及較低成本**  
檢查更多筆記錄來判斷他們是否為相符項目時，會需要更多的電腦處理時間。若您希望減少成本，卻又不想犧牲品質，以下是一些您可以採取的步驟：
+ 消除資料來源中您不在乎是否相符的記錄。
+ 從資料來源中消除您確定在判斷相符/不相符時實用性不高的資料行。一個良好的判斷方式便是消除您認為不會在您決定一組記錄是否為「相同」記錄時影響您決策的資料行。

# 使用相符項目可信度分數估計相符項目的品質
<a name="match-scoring"></a>

相符項目可信度分數提供 FindMatches 所找到之相符項目的品質估計，以區分機器學習模型中具有高度自信、不確定或不太可能的相符記錄。相符項目可信度分數介於 0 到 1 之間，其中分數越高，表示相似度越高。檢查相符項目可信度分數可讓您區分系統高度可信 (您可能會決定合併) 的相符項目叢集、系統不確定的叢集 (您可能會決定安排人工檢閱)，以及系統認為不太可能的叢集 (可能會決定拒絕)。

如果您看到高相符項目可信度分數，但確定沒有相符項目；或是看到低分數，但實際上確定有相符項目，則可能要調整自己的訓練資料。

存在大規模產業資料集時，可信度分數就特別有用，因為檢閱每個 FindMatches 決定是不切實際的行為。

相符項目可信度分數在 AWS Glue 2.0 或更高版本中推出。

## 產生相符項目可信度分數
<a name="specifying-match-scoring"></a>

您可以在呼叫 `FindMatches` 或 `FindIncrementalMatches` API 時將 `computeMatchConfidenceScores` 的布林值設定為 True，即可產生相符項目可信度分數。

AWS Glue 將新的 `column match_confidence_score` 新增至輸出。

## 相符項目評分範例
<a name="match-scoring-examples"></a>

例如，請考慮下列相符的記錄：

**分數 >= 0.9**  
相符記錄的摘要：

```
  primary_id  |   match_id  | match_confidence_score

3281355037663    85899345947   0.9823658302132061
1546188247619    85899345947   0.9823658302132061
```

詳細資訊:

![\[網際網路閘道的路由表範例。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/match_score1.png)


在此範例中，我們可以看到兩條記錄非常相似，共同具有 `display_position`、`primary_name` 和 `street name`。

**分數 >= 0.8 和分數 < 0.9**  
相符記錄的摘要：

```
  primary_id  |   match_id  | match_confidence_score

309237680432     85899345928   0.8309852373674638
3590592666790    85899345928   0.8309852373674638
343597390617     85899345928   0.8309852373674638
249108124906     85899345928   0.8309852373674638
463856477937     85899345928   0.8309852373674638
```

詳細資訊:

![\[網際網路閘道的路由表範例。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/match_score2.png)


在此範例中，我們可以看到這些記錄具有相同的 `primary_name` 和 `country`。

**分數 > = 0.6 和分數 < 0.7**  
相符記錄的摘要：

```
  primary_id  |   match_id  | match_confidence_score

2164663519676    85899345930   0.6971099896480333
 317827595278    85899345930   0.6971099896480333
 472446424341    85899345930   0.6971099896480333
3118146262932    85899345930   0.6971099896480333
 214748380804    85899345930   0.6971099896480333
```

詳細資訊:

![\[網際網路閘道的路由表範例。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/match_score3.png)


在此範例中，我們可以看到這些記錄僅具有相同的 `primary_name`。

如需詳細資訊，請參閱：
+ [步驟 5：使用您的機器學習轉換新增和執行任務](machine-learning-transform-tutorial.md#ml-transform-tutorial-add-job)
+ PySpark：[FindMatches 類別](aws-glue-api-crawler-pyspark-transforms-findmatches.md)
+ PySpark：[FindIncrementalMatches 類別](aws-glue-api-crawler-pyspark-transforms-findincrementalmatches.md)
+ Scala：[FindMatches 類別](glue-etl-scala-apis-glue-ml-findmatches.md)
+ Scala：[FindIncrementalMatches 類別](glue-etl-scala-apis-glue-ml-findincrementalmatches.md)

# 教導尋找相符項目轉換
<a name="machine-learning-teaching"></a>

每個 `FindMatches` 轉換都必須經過教導，來了解哪些項目應視為相符項目，哪些項目又應視為不相符的項目。您可以透過新增標籤至檔案，並將您的選擇上傳至 AWS Glue 來教導您的轉換。

您可以在 AWS Glue 主控台中協調此標記，或是使用 AWS Glue 機器學習 API 操作。

**我應該新增多少次標籤？ 我需要多少標籤？**  
這些問題的解答大部分都取決於您。您必須評估 `FindMatches` 是否交付了您所需要的正確性等級，以及您是否認為進行更多標記對您來說確實有價值。決定這一點的最佳方式是查看在 AWS Glue 主控台中選擇 **Estimate quality (估計品質)** 時可以產生的「Precision (精確度)」、「Recall (取回)」和「Area under the Precision-Recall curve (精確度取回率曲線下方的區域)」指標。在您標記更多組任務後，請重新執行這些指標並驗證他們是否獲得改善。若在標記幾組任務之後，您仍然沒有在您關注的指標上看到改善，表示轉換的品質可能已到達極限。

**為何同時需要真肯定和真否定標籤？**  
`FindMatches` 轉換需要肯定和否定範例，才能了解您視為相符的項目有哪些。若您標記 `FindMatches` 產生的培訓資料 (例如使用 **I do not have labels (我沒有標籤)** 選項)，`FindMatches` 會嘗試為您產生一組「標籤組 ID」。在每個任務中，您都會將相同的「標籤」給予一些記錄，並將不同的「標籤」給予其他記錄。換句話說，任務通常不是全部相同或是全部不同 (但若特定任務為全部「相同」或全部「不同」也沒什麼問題)。

如果您正在使用 **Upload labels from S3 (從 S3 上傳標籤)** 選項教導您的 `FindMatches` 轉換，請嘗試同時包含相符記錄和不相符記錄的範例。您也可以只擁有一個類型。這些標籤可協助您建置更正確的 `FindMatches` 轉換，但您仍然需要使用 **Generate labeling file (產生標記檔案)** 選項標記一些您產生的記錄。

**我該如何強制讓轉換完全照我教導的方式進行比對？**  
`FindMatches` 轉換會從您提供的標籤學習，因此它可能會產生與您所提供標籤不相符的記錄對。若要強制 `FindMatches` 轉換遵守您的標籤，請選取 **FindMatchesParameter** 中的 **EnforceProvidedLabels**。

**當機器學習轉換將實際上不相符的項目識別為相符項目時，您可以使用哪些技術？**  
您可以使用下列技術：
+ 將 `precisionRecallTradeoff` 提高到更高的值。這最後會導致尋找到的相符項目數減少，但應該也會在到達夠高的值時細分您的龐大叢集。
+ 擷取對應至不正確結果的輸出資料列，然後將他們重新格式化成標記集 (移除 `match_id` 資料行並新增 `labeling_set_id` 和 `label` 資料行)。若有需要，請分散 (細分) 成多個標記集，確保標記程式能在指派標籤時記住每個標記集。然後，正確地標記相符的資料集、上傳標籤檔案，然後將它附加到您現有的標籤。這可能會足以教導您的轉換程式要了解模式時應尋找的項目為何。
+ (進階) 最後，請觀察該資料，查看是否有您可以偵測，但系統並未注意到的模式。使用標準 AWS Glue 函數預先處理該資料，來「正常化」**資料。分離您知道對其自身資料行而言重要程度不同的資料，來強調您希望演算法學習的內容。或是從您知道其資料彼此相關的資料行建構合併資料行。

# 使用機器學習轉換
<a name="console-machine-learning-transforms"></a>

您可以使用 AWS Glue 建立自訂機器學習轉換，以用於清理資料。您可以在 AWS Glue 主控台上建立任務時使用這些轉換。

如需如何建立機器學習轉換的資訊，請參閱[記錄與 AWS Lake Formation FindMatches 相符](machine-learning.md)。

**Topics**
+ [轉換屬性](#console-machine-learning-properties)
+ [新增和編輯機器學習轉換](#console-machine-learning-transforms-actions)
+ [檢視轉換詳細資訊](#console-machine-learning-transforms-details)
+ [使用標籤教導轉換](#console-machine-learning-transforms-teaching-transforms)

## 轉換屬性
<a name="console-machine-learning-properties"></a>

若要檢視現有的機器學習轉換，請登入 AWS 管理主控台，然後開啟位於 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 的 AWS Glue 主控台。在**資料整合和 ETL** 下的導覽窗格中，選擇**資料分類工具 > 記錄比對**。

每個轉換的屬性：

**轉換名稱**  
建立轉換時授予它的唯一名稱。

**ID**  
轉換的唯一識別符。

**標籤計數**  
為了協助教導轉換而在標籤檔案中提供的標籤數。

**狀態**  
指出轉換為 **Ready (準備就緒)** 還是 **Needs training (需要訓練)**。若要在任務中成功執行機器學習轉換，它必須處於**就緒**。

**已建立**  
建立轉換的日期。

**已修改**  
上次更新轉換的日期。

**Description**  
為轉換提供的描述 (如果已提供)。

**AWS Glue 版本**  
使用的 AWS Glue 版本。

**執行識別碼**  
建立轉換時授予它的唯一名稱。

**任務類型**  
機器學習轉換的類型；例如 **Find matching records (尋找相符記錄)**。

**狀態**  
指出任務執行的狀態。可能的狀態包括：  
+ 啟動
+ 執行中
+ 正在停止
+ 已停止
+ Succeeded
+ 失敗
+ Timeout (逾時)

**錯誤**  
如果狀態為「失敗」，會顯示錯誤訊息，說明失敗的原因。

## 新增和編輯機器學習轉換
<a name="console-machine-learning-transforms-actions"></a>

 您可以在 AWS Glue 主控台上檢視、刪除、設定和教導，或調校轉換。在清單中選取轉換旁邊的核取方塊、選擇 **Action (動作)**，然後選擇您希望採取的動作。

### 建立新的 ML 轉換
<a name="w2aac37c11c24c23c11b5"></a>

 若要新增機器學習轉換，請選擇**建立轉換**。依照**新增任務**精靈中的說明來進行操作。如需詳細資訊，請參閱[記錄與 AWS Lake Formation FindMatches 相符](machine-learning.md)。

#### 步驟 1. 設定轉換屬性。
<a name="w2aac37c11c24c23c11b5b7"></a>

1. 輸入名稱和描述 (選用)。

1. 或者，設定安全組態。請參閱 [使用機器學習轉換的資料加密](#ml_transform_sec_config)。

1. 或者，進行任務執行設定。任務執行設定可讓您自訂任務的執行方式。選取工作者類型、工作者數量、任務逾時 (以分鐘為單位)、重試次數及 AWS Glue 版本。

1. 或者設定標籤。標籤是您可以指派給 AWS 資源的標籤。每個標籤皆包含索引鍵與選用值。標籤可用來搜尋和篩選您的資源或追蹤您的 AWS 成本。

#### 步驟 2. 選擇資料表和主索引鍵。
<a name="w2aac37c11c24c23c11b5b9"></a>

1. 選擇 AWS Glue 目錄資料庫和資料表。

1. 從選取的資料表中選擇主索引鍵。主索引鍵資料欄通常包含資料來源中每個記錄的唯一識別碼。

#### 步驟 3。選取調整選項。
<a name="w2aac37c11c24c23c11b5c11"></a>

1.  對於**取回率與精確度**，請選擇調整值來調整轉換，以著重於取回率或精確度。依預設，已選取**已平衡**，但您可以選擇著重於取回率或精確度，或選擇**自訂**並輸入介於 0.0 到 1.0 (含) 之間的值。

1.  對於**低成本與準確度**，請選擇調整值以著重於成本或準確度，或選擇**自訂**並輸入介於 0.0 到 1.0 (含) 之間的值。

1.  對於**比對強制執行**，如果您想要透過強制輸出比對使用的標籤來教導機器學習轉換，請選擇**強制輸出以比對標籤**。

#### 步驟 4. 檢閱和建立。
<a name="w2aac37c11c24c23c11b5c13"></a>

1.  檢閱步驟 1 至 3 的選項。

1.  針對需要修改的任何步驟選擇**編輯**。選擇**建立轉換**以完成建立轉換精靈。

### 使用機器學習轉換的資料加密
<a name="ml_transform_sec_config"></a>

將機器學習轉換新增至 AWS Glue，您可以選擇性地指定與資料來源或資料目標相關聯的安全性組態。如果用於存放資料的 Amazon S3 儲存貯體是使用安全組態加密的，請在建立轉換時指定相同的安全組態。

您也可以選擇使用伺服器端加密搭配 AWS KMS (SSE-KMS) 來加密模型和標籤，以防止未經授權的人員對其進行檢查。如果您選擇此選項，系統會提示您 AWS KMS key 依名稱選擇 ，或者您可以選擇**輸入金鑰 ARN**。如果您選擇輸入 KMS 金鑰的 ARN，則會出現第二個欄位，您可以在其中輸入 KMS 金鑰 ARN。

**注意**  
目前，下列區域不支援使用自訂加密金鑰的機器學習轉換：  
亞太區域 (大阪)`ap-northeast-3`

## 檢視轉換詳細資訊
<a name="console-machine-learning-transforms-details"></a>

### 檢視轉換屬性
<a name="console-machine-learning-transforms-details"></a>

**轉換屬性**頁面包含轉換的屬性。它會顯示轉換定義的詳細資訊，例如以下項目：
+ **Transform name (轉換名稱)** 顯示轉換的名稱。
+ **Type (類型)** 會列出轉換的類型。
+ **Status (狀態)** 顯示轉換是否已準備就緒，可在指令碼或任務中使用。
+ **Force output to match labels (強制輸出與標籤進行比對)** 顯示轉換是否會強制輸出與使用者提供的標籤進行比對。
+ **Spark version (Spark 版本)** 與您在新增轉換時在 **Task run properties (任務執行屬性)** 中選擇的 AWS Glue 版本相關。AWS Glue 1.0 和 Spark 2.4 是建議大多數客戶使用的版本。如需詳細資訊，請參閱 [AWS Glue 版本](https://docs.aws.amazon.com/glue/latest/dg/release-notes.html#release-notes-versions)。

### 「歷史記錄」、「預估品質」和「標籤」索引標籤
<a name="w2aac37c11c24c23c13b5"></a>

 轉換詳細資訊包含您在建立轉換時所定義的資訊。若要查看轉換詳細資訊，請在 **Machine learning transforms (機器學習轉換)** 清單中選取轉換，然後在下列標籤上檢閱資訊：
+ 歷程記錄
+ Estimate quality (估計品質)
+ Tags (標籤)

#### 歷程記錄
<a name="console-machine-learning-transforms-history"></a>

**History (歷史記錄)** 標籤會顯示您的轉換任務執行歷史記錄。為了教導轉換，會執行數種類型的任務。針對每個任務，執行指標包含下列項目：
+ **Run ID (執行 ID)** 是 AWS Glue 在此任務每次執行時所建立的識別符。
+ **Task type (任務類型)** 顯示任務執行的類型。
+ **Status** (狀態) 顯示所列出的每個任務是否成功，其中最上方會列出最近的執行。
+ **Error (錯誤)** 會在執行未成功時，顯示錯誤訊息的詳細資訊。
+ **Start time** (開始時間) 會顯示任務開始的日期和時間 (本地時間)。
+ **結束時間**會顯示任務結束的日期和時間 (本地時間)。
+ **Logs (日誌)** 會連結至此次任務執行時所寫入 `stdout` 的日誌。

  **Logs (日誌)** 連結會帶您前往 Amazon CloudWatch Logs。您可以在此檢視在 中建立之資料表的詳細資訊， AWS Glue Data Catalog 以及遇到的任何錯誤。您可以在 CloudWatch 主控台中，管理日誌的保留期間。預設的日誌保留期間為 `Never Expire`。如需如何變更保留期間的詳細資訊，請參閱 *Amazon CloudWatch Logs 使用者指南*中的[變更 CloudWatch Logs 中的日誌資料保留期間](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#SettingLogRetention)。
+ **標籤檔案**會顯示指向所產生標記檔案之 Amazon S3 的連結。

#### Estimate quality (估計品質)
<a name="console-machine-learning-transforms-metrics"></a>

 **Estimate quality (估計品質)** 標籤會顯示您用來測量轉換品質的指標。透過使用標記資料的子集與您提供的標籤進行比較轉換比對預測，來計算預估值。這些預估是近似值。您可以從此標籤呼叫 **Estimate quality (估計品質)** 任務執行。

**Estimate quality (估計品質)** 標籤從包括下列屬性的最近一次 **Estimate quality (估計品質)** 執行顯示指標：
+ **Area under the Precision-Recall curve (精確度取回率曲線下方的區域)** 是一個單一數字，用來估算轉換的整體品質上限。它獨立於為精確度取回率參數所進行的選擇之外。較高的值表示您有較具吸引力的精確度與取回率取捨。
+ **Precision (精確度)** 估算轉換正確預測相符項目的頻率。
+ **Recall upper limit (取回率上限)** 估算針對實際的相符項目，轉換預測為相符的頻率。
+ **F1** 預估介於 0 和 1 之間轉換的準確度，其中 1 表示最佳準確度。如需詳細資訊，請參閱 Wikipedia 中的 [F1 score](https://en.wikipedia.org/wiki/F1_score)。
+ **Column importance (欄重要性)** 資料表會顯示每個資料行的資料行名稱和重要性分數。欄重要性可協助您了解欄對模型的貢獻方式，藉由識別記錄中的哪些欄比其他欄更重要。此資料可能會提示您新增或變更標籤集，以提高或降低欄的重要性。

  [重要性] 欄會提供每個欄的數值分數，表示為不大於 1.0 的小數點。

如需了解品質估計與真實品質的資訊，請參閱[品質估計與端對端 (真實) 品質](#console-machine-learning-quality-estimates-true-quality)。

如需調校您轉換的詳細資訊，請參閱[在 AWS Glue 中調校機器學習轉換](add-job-machine-learning-transform-tuning.md)。

#### 品質估計與端對端 (真實) 品質
<a name="console-machine-learning-quality-estimates-true-quality"></a>

AWS Glue 會透過向內部機器學習模型呈現您為其提供比對標籤，但該模型先前從未看過的數組記錄，來預估轉換品質。這些品質估計是機器學習模型的品質函數，會受到您標記以「教導」轉換的記錄數量影響。端對端，或是*真實*取回率 (不會由 `ML transform` 自動計算) 也會受到 `ML transform` 篩選機制影響，該機制會提供各種可能的相符項目給機器學習模型。

您可以指定**較低成本-準確度**調整值來重點調整此篩選方法。在您將調整值移向**準確度**一端時，系統會進行更完整且更詳細的搜尋，以尋找可能是相符項目的記錄組。您為機器學習模型提供的記錄組越多，`ML transform` 的端對端或真實取回率也會越接近預估的取回率指標。因此，由於比對成本/準確性權衡的變化所導致的配對端對端品質的變化，通常不會反映在品質預估中。

#### Tags (標籤)
<a name="w2aac37c11c24c23c13b5c13"></a>

 標籤是您可以指派給 AWS 資源的標籤。每個標籤皆包含索引鍵與選用值。標籤可用來搜尋和篩選您的資源或追蹤您的 AWS 成本。

## 使用標籤教導轉換
<a name="console-machine-learning-transforms-teaching-transforms"></a>

 您可以從機器學習轉換詳細資訊頁面選擇**教導轉換**，以使用標籤 (範例) 教導機器學習轉換。透過提供範例 (稱為標籤) 來教導機器學習演算法時，您可以選擇要使用的現有標籤或建立標記檔案。

![\[螢幕擷取畫面顯示使用標籤教導轉換的精靈畫面。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/machine-learning-teach-transform.png)

+  **標記**：如果您有標籤，請選擇**我有標籤**。如果沒有標籤，您仍然可以繼續「產生標記檔案」中的下一步。
+  **產生標記檔案**：AWS Glue 從來源資料中擷取記錄並建議潛在的相符記錄。您可以選擇 Amazon S3 儲存貯體來存放產生的標籤檔案。選擇**產生標記檔案**以開始該程序。完成後，選擇**下載標記檔案**。下載的檔案將有一欄標籤，您可以在其中填寫標籤。
+  **從 Amazon S3 上傳標籤**：從存放標籤檔案的 Amazon S3 儲存貯體中選擇完成的標記檔案。然後，選擇將標籤附加到現有標籤或覆寫現有標籤。選擇**從 Amazon S3 上傳標記檔案**。

# 教學課程：使用 建立機器學習轉換 AWS Glue
<a name="machine-learning-transform-tutorial"></a>

本教學會帶您使用 AWS Glue逐步進行建立及管理機器學習 (ML) 轉換的動作。使用本教學前，建議您先熟悉使用 AWS Glue 主控台新增爬取程式和任務，以及編輯指令碼。您也應熟悉在 Amazon Simple Storage Service (Amazon S3) 主控台上尋找及下載檔案。

在此範例中，您會建立一個 `FindMatches` 轉換來尋找相符的記錄、教導它如何識別相符及不相符的記錄，並在 AWS Glue 任務中使用它。AWS Glue 任務會寫入一個包含名為 `match_id` 額外資料行的新 Amazon S3 檔案。

本教學使用的來源資料是名為 `dblp_acm_records.csv` 的檔案。此檔案是可從原始 [DBLP ACM 資料集](https://doi.org/10.3886/E100843V2)所取得學術出版物 (DBLP 和 ACM) 的修改版本。`dblp_acm_records.csv` 檔案是一個逗點分隔值 (CSV) 檔案，其格式為不包含位元組順序標記 (BOM) 的 UTF-8 格式。

第二個檔案 `dblp_acm_labels.csv` 則是包含相符和不相符記錄的範例標記檔案，會做為本教學的一部分用來教導轉換。

**Topics**
+ [步驟 1：網路爬取來源資料](#ml-transform-tutorial-crawler)
+ [步驟 2：建立機器學習轉換](#ml-transform-tutorial-create)
+ [步驟 3：教導您的機器學習轉換](#ml-transform-tutorial-teach)
+ [步驟 4：估計您機器學習轉換的品質](#ml-transform-tutorial-estimate-quality)
+ [步驟 5：使用您的機器學習轉換新增和執行任務](#ml-transform-tutorial-add-job)
+ [步驟 6：驗證 Amazon S3 的輸出資料](#ml-transform-tutorial-data-output)

## 步驟 1：網路爬取來源資料
<a name="ml-transform-tutorial-crawler"></a>

首先，請先爬取來源 Amazon S3 CSV 檔案來在 Data Catalog 中建立相對應的中繼資料資料表。

**重要**  
若要指示爬蟲程式只為 CSV 檔案建立資料表，請將 CSV 來源資料存放在與其他檔案不同的 Amazon S3 資料夾中。

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台。

1. 在導覽窗格中，選擇 **Crawlers (爬取程式)**、**Add crawler (新增爬取程式)**。

1. 遵循精靈來建立和執行名為 `demo-crawl-dblp-acm` 的爬取程式，並輸出至 `demo-db-dblp-acm` 資料庫。執行精靈時，若資料庫尚未存在，請建立 `demo-db-dblp-acm` 資料庫。選擇 Amazon S3 包含路徑，以在目前 AWS 區域中取樣資料。例如，針對 `us-east-1`，指向來源檔案的 Amazon S3 包含路徑為 `s3://ml-transforms-public-datasets-us-east-1/dblp-acm/records/dblp_acm_records.csv`。

   若作業成功，爬取程式會建立 `dblp_acm_records_csv` 資料表，其中包含下列資料行：id、標題 (title)、作者 (authors)、地點 (venue)、年份 (year) 及來源 (source)。

## 步驟 2：建立機器學習轉換
<a name="ml-transform-tutorial-create"></a>

接著，請新增以爬取程式所建立資料來源資料表的結構描述為基礎，名為 `demo-crawl-dblp-acm` 的機器學習轉換。

1. 在 AWS Glue 主控台的**資料整合和 ETL** 下的導覽窗格中，選擇**資料分類工具 > 記錄比對**，然後選擇**新增轉換**。請遵循精靈來建立包含下列屬性的 `Find matches` 轉換。

   1. 針對 **Transform name (轉換名稱)**，請輸入 **demo-xform-dblp-acm**。這是轉換的名稱，用來尋找來源資料中的相符項目。

   1. 針對 **IAM role (IAM 角色)**，請選擇擁有 Amazon S3 來源資料、標記檔案及 AWS Glue API 操作許可的 IAM 角色。如需詳細資訊，請參閱 *AWS Glue 開發人員指南*中的[為 AWS Glue 建立 IAM 角色](https://docs.aws.amazon.com/glue/latest/dg/create-an-iam-role.html)。

   1. 對於 **Data source (資料來源)**，請選擇資料庫 **demo-db-dblp-acm** 中名為 **dblp\$1acm\$1csv** 的資料表。

   1. 針對 **Primary key (主索引鍵)**，請選擇資料表的主索引鍵資料行，即 **id**。

1. 在精靈中，選擇 **Finish (完成)** 並傳回 **ML transforms (機器學習轉換)** 清單。

## 步驟 3：教導您的機器學習轉換
<a name="ml-transform-tutorial-teach"></a>

接下來，您會使用教學範例標記檔案來教導您的機器學習轉換。

在其狀態變更為 **Ready for use (已準備就緒可供使用)** 之前，您無法在擷取、轉換和載入 (ETL) 作業中使用機器學習語言。若要讓您的轉換準備就緒，您必須提供相符和不相符記錄的範例，來教導它如何識別相符與不相符的記錄。若要教導您的轉換，您可以 **Generate a label file (產生標記檔案)** 及標籤，然後 **Upload label file (上傳標記檔案)**。在本教學中，您可以使用名為 `dblp_acm_labels.csv` 的範例標記檔案。如需標記程序的詳細資訊，請參閱 [標記](machine-learning.md#machine-learning-labeling)。

1. 在 AWS Glue 主控台上的導覽窗格中，選擇**記錄比對**。

1. 選擇 `demo-xform-dblp-acm` 轉換，然後選擇 **Action (動作)**、**Teach (教導)**。遵循精靈來教導您的 `Find matches` 轉換。

1. 在轉換屬性頁面上，選擇 **I have labels (我擁有標籤)**。選擇目前 AWS 區域中範例標籤檔案的 Amazon S3 路徑。例如，針對 `us-east-1`，請從 Amazon S3 路徑 `s3://ml-transforms-public-datasets-us-east-1/dblp-acm/labels/dblp_acm_labels.csv` 使用 **overwrite (覆寫)** 現有標籤選項來上傳所提供的標記檔案。標記檔案必須位於和 AWS Glue 主控台相同區域內的 Amazon S3 中。

   在您上傳標記檔案時，會在 AWS Glue 中啟動任務，來新增或覆寫用來教導轉換如何處理資料來源的標籤。

1. 在精靈的最終頁面上，選擇 **Finish (完成)**，然後傳回 **ML transforms (機器學習轉換)** 清單。

## 步驟 4：估計您機器學習轉換的品質
<a name="ml-transform-tutorial-estimate-quality"></a>

接著，您可以估計您機器學習轉換的品質。品質會取決於您已完成的標記數。如需估計品質的詳細資訊，請參閱 [Estimate quality (估計品質)](console-machine-learning-transforms.md#console-machine-learning-transforms-metrics)。

1. 在 AWS Glue 主控台的**資料整合和 ETL** 下的導覽窗格中，選擇**資料分類工具 > 記錄比對**。

1. 選擇 `demo-xform-dblp-acm` 轉換，然後選擇 **Estimate quality (估計品質)** 標籤。此標籤會顯示目前轉換的品質估計 (若可用的話)。

1. 選擇 **Estimate quality (估計品質)** 來啟動任務，估計轉換的品質。品質估計的正確性會以來源資料的標記為基礎。

1. 導覽至 **History (歷史記錄)** 標籤。在此窗格中，會為轉換列出任務執行，包括 **Estimating quality (估計品質)** 任務。如需執行的詳細資訊，請選擇 **Logs (日誌)**。在完成時，檢查執行狀態是否是 **Succeeded (成功)**。

## 步驟 5：使用您的機器學習轉換新增和執行任務
<a name="ml-transform-tutorial-add-job"></a>

在此步驟中，您會使用機器學習轉換來在 AWS Glue 中新增及執行任務。當 `demo-xform-dblp-acm` 轉換為 **Ready for use (已準備就緒可供使用)** 時，您便可以在 ETL 任務中使用它。

1. 在 AWS Glue 主控台上，選擇導覽窗格中的 **Jobs (任務)**。

1. 選擇 **Add job (新增任務)**，並遵循精靈中的步驟，使用所產生的指令碼來建立 ETL Spark 任務。為您的轉換選擇下列屬性值：

   1. 針對 **Name (名稱)**，選擇本教學中的範例任務 **demo-etl-dblp-acm**。

   1. 針對 **IAM role (IAM 角色)**，選擇具備 Amazon S3 來源資料、標記檔案及 AWS Glue API 操作許可的 IAM 角色。如需詳細資訊，請參閱 *AWS Glue 開發人員指南*中的[為 AWS Glue 建立 IAM 角色](https://docs.aws.amazon.com/glue/latest/dg/create-an-iam-role.html)。

   1. 針對 **ETL language (ETL 語言)**，選擇 **Scala**。這是 ETL 指令碼中的程式語言。

   1. 針對 **Script file name (指令碼檔案名稱)**，選擇 **demo-etl-dblp-acm**。這是 Scala 指令碼的檔案名稱 (與任務名稱相同)。

   1. 針對 **Data source (資料來源)**，選擇 **dblp\$1acm\$1records\$1csv**。您選擇的資料來源必須符合機器學習轉換資料來源結構描述。

   1. 針對 **Transform type (轉換類型)**，請選擇 **Find matching records (尋找相符記錄)** 來使用機器學習轉換建立任務。

   1. 清除 **Remove duplicate records (移除重複記錄)**。由於寫入的輸出記錄包含新增的額外 `match_id` 欄位，因此您不需要移除重複記錄。

   1. 針對 **Transform (轉換)**，選擇任務使用的機器學習轉換 **demo-xform-dblp-acm**。

   1. 針對 **Create tables in your data target (在您的資料目標中建立資料表)**，選擇使用下列屬性建立資料表：
      + **資料存放區類型** — **Amazon S3**
      + **格式** – **CSV**
      + **壓縮類型** — **None**
      + **目標路徑** — 寫入任務輸出的 Amazon S3 路徑 （在目前的主控台 AWS 區域中）

1. 選擇 **Save job and edit script (儲存任務並編輯指令碼)** 來顯示指令碼編輯器頁面。

1. 編輯指令碼以新增陳述式，將指向 **Target path (目標路徑)** 的任務輸出寫入單一分割區。在執行 `FindMatches` 轉換的陳述式後立即新增此陳述式。陳述式與以下內容相似。

   ```
   val single_partition = findmatches1.repartition(1) 
   ```

   您必須修改 `.writeDynamicFrame(findmatches1)` 陳述式，將輸出做為 `.writeDynamicFrame(single_partion)` 寫入。

1. 在您編輯指令碼後，請選擇 **Save (儲存)**。修改後的指令碼看起來會與以下程式碼相似，但已根據您的環境進行自訂。

   ```
   import com.amazonaws.services.glue.GlueContext
   import com.amazonaws.services.glue.errors.CallSite
   import com.amazonaws.services.glue.ml.FindMatches
   import com.amazonaws.services.glue.util.GlueArgParser
   import com.amazonaws.services.glue.util.Job
   import com.amazonaws.services.glue.util.JsonOptions
   import org.apache.spark.SparkContext
   import scala.collection.JavaConverters._
   
   object GlueApp {
     def main(sysArgs: Array[String]) {
       val spark: SparkContext = new SparkContext()
       val glueContext: GlueContext = new GlueContext(spark)
       // @params: [JOB_NAME]
       val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
       Job.init(args("JOB_NAME"), glueContext, args.asJava)
       // @type: DataSource
       // @args: [database = "demo-db-dblp-acm", table_name = "dblp_acm_records_csv", transformation_ctx = "datasource0"]
       // @return: datasource0
       // @inputs: []
       val datasource0 = glueContext.getCatalogSource(database = "demo-db-dblp-acm", tableName = "dblp_acm_records_csv", redshiftTmpDir = "", transformationContext = "datasource0").getDynamicFrame()
       // @type: FindMatches
       // @args: [transformId = "tfm-123456789012", emitFusion = false, survivorComparisonField = "<primary_id>", transformation_ctx = "findmatches1"]
       // @return: findmatches1
       // @inputs: [frame = datasource0]
       val findmatches1 = FindMatches.apply(frame = datasource0, transformId = "tfm-123456789012", transformationContext = "findmatches1", computeMatchConfidenceScores = true)
     
     
       // Repartition the previous DynamicFrame into a single partition. 
       val single_partition = findmatches1.repartition(1)    
    
       
       // @type: DataSink
       // @args: [connection_type = "s3", connection_options = {"path": "s3://aws-glue-ml-transforms-data/sal"}, format = "csv", transformation_ctx = "datasink2"]
       // @return: datasink2
       // @inputs: [frame = findmatches1]
       val datasink2 = glueContext.getSinkWithFormat(connectionType = "s3", options = JsonOptions("""{"path": "s3://aws-glue-ml-transforms-data/sal"}"""), transformationContext = "datasink2", format = "csv").writeDynamicFrame(single_partition)
       Job.commit()
     }
   }
   ```

1. 選擇 **Run job (執行任務)** 來啟動任務執行。在任務清單中檢查任務的狀態。當任務完成時，在 **ML transform (ML 轉換)**、**History (歷史記錄)** 索引標籤上，有一個新的 **Run ID (執行 ID)** 列已加入 **ETL job (ETL 任務)** 類型。

1. 導覽至 **Jobs (任務)**、**History (歷史記錄)** 標籤。在這個窗格中會列出任務執行。如需執行的詳細資訊，請選擇 **Logs (日誌)**。在完成時，檢查執行狀態是否是 **Succeeded (成功)**。

## 步驟 6：驗證 Amazon S3 的輸出資料
<a name="ml-transform-tutorial-data-output"></a>

在此步驟中，您可以在新增任務時所選擇的 Amazon S3 儲存貯體內檢查任務執行的輸出。您可以將輸出檔案下載到您的本機電腦，並驗證已成功識別相符的記錄。

1. 開啟位於 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 的 Amazon S3 主控台。

1. 下載任務的目標輸出檔案 `demo-etl-dblp-acm`。在試算表應用程式 (您可能需要為檔案新增 `.csv` 副檔名，才能正常開啟) 中開啟檔案。

   下圖顯示 Microsoft Excel 中的輸出摘要。  
![\[顯示轉換輸出的 Excel 試算表。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/demo_output_dblp_acm.png)

   資料來源和目標檔案都有 4,911 筆記錄。但是，`Find matches` 轉換會新增另一個名為 `match_id` 的資料行，來識別輸出中的相符記錄。`match_id` 相同的資料列會視為相符記錄。`match_confidence_score` 為介於 0 至 1 之間的數字，用來估計 `Find matches` 找到之相符項目的品質。

1. 依據 `match_id` 排序輸出檔案，來輕鬆查看哪些記錄是相符項目。比較其他資料行中的值，查看您是否同意 `Find matches` 轉換的結果。若您不同意其結果，您可以新增更多標籤來繼續教導轉換。

   您也可以依據其他欄位排序檔案 (例如 `title`)，來查看標題相似的記錄是否擁有相同的 `match_id`。

# 尋找增量改進相符項目
<a name="machine-learning-incremental-matches"></a>

尋找相符項目功能可讓您識別資料集中重複或相符的記錄，即使記錄沒有通用的唯一識別符，也沒有欄位完全相符。尋找相符項目的最初版本轉換單一資料集中識別的相符記錄。將新資料新增至資料集時，您必須將其與現有的乾淨資料集合併，然後針對完整的合併資料集重新執行比對。

增量改進比對功能可讓您更輕鬆地比對現有相符的資料集與增量記錄。假設您想要將潛在客戶資料與現有客戶資料集進行比對。增量改進比對功能可讓您靈活地透過將結果合併至單一資料庫或資料表，將數十萬個新潛在客戶與現有的潛在客戶和客戶資料庫進行比對。藉由僅在新的和現有的資料集之間進行比對，尋找增量改進相符項目最佳化功能可縮短運算時間，同時降低成本。

增量改進比對的用法與尋找相符項目類似，如 [教學課程：使用 建立機器學習轉換 AWS Glue](machine-learning-transform-tutorial.md) 中所述。本主題僅識別與增量改進比對的差異。

如需詳細資訊，請參閱部落格貼文[增量改進資料比對](https://aws.amazon.com/blogs/big-data/incremental-data-matching-using-aws-lake-formation/)。

## 執行增量改進比對任務
<a name="machine-learning-incremental-matches-add"></a>

對於下列程序，假設以下情況：
+ 您已將現有的資料集網路爬取至資料表 *first\$1records*。*first\$1records* 資料集必須是相符的資料集，或相符任務的輸出。
+ 您已使用 AWS Glue 2.0 版建立並訓練「尋找相符項目」轉換。這是唯一支援增量改進相符項目的 AWS Glue 版本。
+ 使用的 ETL 語言是 Scala。請注意，Python 也受到支援。
+ 已經產生的模型稱為 `demo-xform`。

1. 將增量改進資料集抓取至 *second\$1records* 資料表中。

1. 在 AWS Glue 主控台上，選擇導覽窗格中的 **Jobs (任務)**。

1. 選擇 **Add job (新增任務)**，並遵循精靈中的步驟，使用所產生的指令碼來建立 ETL Spark 任務。為您的轉換選擇下列屬性值：

   1. 對於 **Name** (名稱)，請選擇 **demo-etl**。

   1. 對於 **IAM role** (IAM 角色)，請選擇具備 Amazon S3 來源資料、標記檔案及 [AWS Glue API 操作](https://docs.aws.amazon.com/glue/latest/dg/create-an-iam-role.html)許可的 IAM 角色。

   1. 針對 **ETL language (ETL 語言)**，選擇 **Scala**。

   1. 對於 **Script file name** (指令碼檔案名稱)，請選擇 **demo-etl**。這是 Scala 指令碼的檔案名稱。

   1. 對於 **Data source** (資料來源)，請選擇 **first\$1records**。您選擇的資料來源必須符合機器學習轉換資料來源結構描述。

   1. 針對 **Transform type (轉換類型)**，請選擇 **Find matching records (尋找相符記錄)** 來使用機器學習轉換建立任務。

   1. 選取增量改進比對選項，並針對 **Data Source** (資料來源) 選取名為 **second\$1records** 的資料表。

   1. 對於 **Transform** (轉換)，請選擇任務使用的機器學習轉換 **demo-xform**。

   1. 選擇 **Create tables in your data target** (在您的資料目標中建立資料表) 或 **Use tables in the data catalog and update your data target** (使用 Data Catalog 中的資料表並更新您的資料目標)。

1. 選擇 **Save job and edit script (儲存任務並編輯指令碼)** 來顯示指令碼編輯器頁面。

1. 選擇 **Run job (執行任務)** 來啟動任務執行。

# 在視覺化任務中使用 FindMatches
<a name="find-matches-visual-job"></a>

 若要在 AWS Glue Studio 中使用 **FindMatches** 轉換，您可使用調用 FindMatches API 的**自訂轉換**節點。如需有關如何使用自訂轉換的詳細資訊，請參閱[建立自訂轉換](https://docs.aws.amazon.com/glue/latest/ug/transforms-custom.html) 

**注意**  
 FindMatches API 目前僅適用於 `Glue 2.0`。若要使用調用 FindMatches API 的自訂轉換來執行任務，請在**任務詳細資訊**索引標籤中確定 AWS Glue 版本為 `Glue 2.0`。若 AWS Glue 的版本並非 `Glue 2.0`，則任務在執行期可能會失敗且顯示下列錯誤訊息：「無法從 'awsglueml.transforms' 匯入名稱 'FindMatches'」。

## 先決條件
<a name="adding-find-matches-to-a-visual-job-prerequisites"></a>
+  若要使用 **Find Matches** 轉換，請在 [https://console.aws.amazon.com/gluestudio/](https://console.aws.amazon.com/gluestudio/) 開啟 AWS Glue Studio 主控台。
+  建立機器學習轉換。建立完成後會產生 transformId。您將需要此 ID 完成以下步驟。如需有關如何建立機器學習轉換的詳細資訊，請參閱[新增和編輯機器學習轉換](https://docs.aws.amazon.com/glue/latest/dg/console-machine-learning-transforms.html#console-machine-learning-transforms-actions)。

## 新增 FindMatches 轉換
<a name="adding-find-matches-to-a-visual-job"></a>

**若要新增 FindMatches 轉換：**

1.  在 AWS Glue Studio 任務編輯器中，按一下視覺化任務圖表左上角的十字符號以開啟「資源」面板，然後選擇**資料**索引標籤以選擇資料來源。此為您要檢查相符項目的資料來源。  
![\[螢幕擷取畫面顯示圓圈內的十字符號。當您在視覺化任務編輯器中按一下此符號時，即會開啟「資源」面板。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/resource-panel-blank-canvas.png)

1.  選擇資料來源節點，然後按一下視覺化任務圖表左上角的十字符號，開啟「資源」面板並搜尋「自訂轉換」。選擇**自訂轉換**節點以將其新增至圖表。**自訂轉換**會連結至資料來源節點。若未連結，則可按一下**自訂轉換**節點並選擇**節點屬性**索引標籤，然後在**節點父項**下方選擇資料來源。

1.  按一下視覺化圖表中的**自訂轉換**節點，然後選擇**節點屬性**索引標籤並命名自訂轉換。建議您重新命名轉換，以便在視覺化圖表中輕鬆識別轉換名稱。

1.  選擇**轉換**索引標籤，您可以在其中編輯程式碼區塊。您可在此處新增調用 FindMatches API 的程式碼。  
![\[選取「自訂轉換」節點時，螢幕擷取畫面會在「轉換」索引標籤中顯示程式碼區塊。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/custom-transform-code-block.png)

    程式碼區塊包含可讓您開始使用的預先填入程式碼。使用以下範本覆寫預先填入的程式碼。此範本具有 **transformId** (可由您提供) 的預留位置。

   ```
   def MyTransform (glueContext, dfc) -> DynamicFrameCollection:
       dynf = dfc.select(list(dfc.keys())[0])
       from awsglueml.transforms import FindMatches
       findmatches = FindMatches.apply(frame = dynf, transformId = "<your id>")
       return(DynamicFrameCollection({"FindMatches": findmatches}, glueContext))
   ```

1.  在視覺畫圖表中按一下**自訂轉換**節點，然後按一下視覺化任務圖表左上角的十字符號，開啟「資源」面板並搜尋「從集合中選取」。由於集合中只有一個 DynamicFrame，無須變更預設選擇。

1.  您可以繼續新增轉換或存放結果，其中現已具有豐富的「尋找相符項目」額外資料欄。若您想在下游轉換中參考這些新資料欄，需要將其新增至轉換輸出結構描述。執行此作業的最簡易方式，是選擇**資料預覽**索引標籤，然後在結構描述索引標籤中選擇「使用 datapreview 結構描述」。

1.  若要自訂 FindMatchs，您可新增其他參數並傳遞至 'apply' 方法。參閱 [FindMatches 類別](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-transforms-findmatches.html)。

## 新增 FindMatch 增量轉換
<a name="find-matches-incrementally-visual-job"></a>

 增量比對的程序與**新增 FindMatches 轉換**相同，但具有下列差異：
+  您需要兩個父節點，而非自訂轉換的父節點。
+  第一個父節點應為資料集。
+  第二個父節點應為增量資料集。

   將 `transformId` 替換為範本程式碼區塊中的 `transformId`：

  ```
  def MyTransform (glueContext, dfc) -> DynamicFrameCollection:
      dfs = list(dfc.values())
      dynf = dfs[0]
      inc_dynf = dfs[1]
      from awsglueml.transforms import FindIncrementalMatches
      findmatches = FindIncrementalMatches.apply(existingFrame = dynf, incrementalFrame = inc_dynf,
                                      transformId = "<your id>")
      return(DynamicFrameCollection({"FindMatches": findmatches}, glueContext))
  ```
+  如需選用參數，請參閱 [FindIncrementalMatches 類別](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-transforms-findincrementalmatches.html)。

# 將 Apache Spark 程式遷移至 AWS Glue
<a name="glue-author-migrate-apache-spark"></a>

Apache Spark 是在大型資料集上執行的分散式運算工作負載的開放原始碼平台。 AWS Glue 利用 Spark 的功能，為 ETL 提供最佳化的體驗。您可以將 Spark 程式遷移至 AWS Glue ，以利用我們的功能。 AWS Glue 提供與 Amazon EMR 上 Apache Spark 預期的相同效能增強功能。

## 執行 Spark 程式碼
<a name="glue-author-migrate-apache-spark-run"></a>

原生 Spark 程式碼可在開箱即用 AWS Glue 的環境中執行。指令碼通常是透過反覆變更一段程式碼來開發，這樣的工作流程很適合互動式工作階段。不過，現有的程式碼更適合在 AWS Glue 任務中執行，這可讓您排程和一致地取得每個指令碼執行的日誌和指標。您可以透過主控台上傳和編輯現有指令碼。

1. 取得指令碼的來源。在此範例中，您將使用 Apache Spark 儲存庫中的範例指令碼。[二值化器範例](https://github.com/apache/spark/blob/master/examples/src/main/python/ml/binarizer_example.py) 

1. 在 AWS Glue 主控台中，展開左側導覽窗格，然後選取 **ETL** > **任務** 

   在 **Create job** (建立任務) 面板中，選取 **Spark script editor** (Spark 指令碼編輯器)。**Options** (選項) 區段將會出現。在 **Options** (選項) 下，選取 **Upload and edit an existing script** (上傳並編輯現有的指令碼)。

   **File upload** (檔案上傳) 區段將會出現。在 **File upload** (檔案上傳) 下，按一下 **Choose file** (選擇檔案)。您的系統文件選擇器將會出現。導覽到您儲存 `binarizer_example.py` 的位置中，選取它並確認。

   **Create** (建立 )按鈕會出現在 **Create job** (建立任務) 面板的標頭。按一下該按鈕。  
![\[已選取具有 Spark 指令碼編輯器窗格的 AWS Glue Studio 任務頁面。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/migrate-apache-spark-01-upload-job.png)

1. 您的瀏覽器將導覽至指令碼編輯器。在標頭上，按一下 **Job details** (任務詳細資訊) 索引標籤。設定**名稱**和 **IAM 角色**。如需 IAM AWS Glue 角色的相關指導，請參閱 [設定 的 IAM 許可 AWS Glue](set-up-iam.md)。

   選用 - 將 **Requested number of workers** (請求的工作者數目) 設定為 `2`，並將 **Number of retries** (重試次數) 設定為 `1`。這些選項在執行生產任務時非常重要，但是在測試功能時，關閉這些選項可以簡化您的體驗。

   在標題列中，按一下 **Save** (儲存)，然後點選 **Run** (執行)  
![\[具有依照指示設定選項的任務詳細資訊頁面。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/migrate-apache-spark-02-job-details.png)

1. 導覽至 **Runs** (執行) 索引標籤。您會看到與您任務執行對應的面板。請稍候幾分鐘，頁面應該會自動重新整理，並在 **Run status** (執行狀態) 下顯示 **Succeeded** (成功)。  
![\[具有成功任務執行的任務執行頁面。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/migrate-apache-spark-03-job-runs.png)

1. 您需要檢查輸出，以確認 Spark 指令碼按預期執行。此 Apache Spark 範例指令碼應該將字串寫入至輸出串流。您可以透過導覽至成功任務執行面板中 **Cloudwatch logs** (CloudWatch 日誌) 下的 **Output logs** (輸出日誌) 找到該資料。請注意，任務執行運行 ID (在 **Id** 標籤下產生的 id) 以 `jr_` 開頭 。

   這會開啟 CloudWatch 主控台，將 設定為視覺化預設 AWS Glue 日誌群組 的內容`/aws-glue/jobs/output`，篩選成任務執行 ID 的日誌串流內容。每個工作者都會產生日誌串流，並在 **Log streams** (日誌串流) 下顯示為資料列。每個工作者應執行請求的程式碼。您需要開啟所有日誌串流來找出正確的工作者。找到正確的工作者之後，您應該會看到指令碼的輸出，如下圖所示：  
![\[具有 Spark 程式輸出的 CloudWatch 主控台頁面。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/migrate-apache-spark-04-log-output.png)

## 移轉 Spark 程式所需的常見程序
<a name="glue-author-migrate-apache-spark-migrate"></a>

### 評估 Spark 版本支援
<a name="glue-author-migrate-apache-spark-migrate-versions"></a>

 AWS Glue 發行版本定義任務可用的 Apache Spark 和 Python 版本 AWS Glue 。您可以在 找到我們的 AWS Glue 版本及其支援的內容[AWS Glue 版本](release-notes.md#release-notes-versions)。您可能需要更新 Spark 程式，以便與較新版本的 Spark 相容，才能存取部分 AWS Glue 功能。

### 包含第三方程式庫
<a name="glue-author-migrate-apache-spark-third-party-libraries"></a>

許多現有的 Spark 程式將具有相依性 (在私有和公有成品上)。 AWS Glue 支援 Scala 任務的 JAR 樣式相依性和 Python 任務的 Wheel 和來源純 Python 相依性。

**Python** - 如需 Python 相依性的相關資訊，請參閱 [搭配 Glue 使用 Python AWS 程式庫](aws-glue-programming-python-libraries.md)

 AWS Glue 環境中提供常見的 Python 相依性，包括常見的 [Pandas](https://pandas.pydata.org/) 程式庫。相依性包含在 AWS Glue 2.0 以上的版本中。如需有關所提供模組的詳細資訊，請參閱 [Python 模組已在 Glue AWS 中提供](aws-glue-programming-python-libraries.md#glue-modules-provided)。如果您需要提供的任務具有預設包含不同版本的相依性，您可以使用 `--additional-python-modules`。如需任務引數的相關資訊，請參閱 [在 Glue AWS 任務中使用任務參數](aws-glue-programming-etl-glue-arguments.md)。

您可以為額外的 Python 相依性提供 `--extra-py-files` 任務引數。如果您要從 Spark 程式移轉任務，這個參數就是一個不錯的選擇，因為其在功能上等同於 PySpark 中的 `--py-files` 旗標，並且受到相同限制。如需有關 `--extra-py-files` 參數的詳細資訊，請參閱 [包括 Python 檔案與 PySpark 原生功能](aws-glue-programming-python-libraries.md#extra-py-files-support)

對於新任務，您可以使用 `--additional-python-modules` 任務引數來管理 Python 相依性。使用此引數可以獲得更完善的相依性管理體驗。此參數支援 Wheel 樣式相依性，包含具有與 Amazon Linux 2 相容的原生程式碼繫結的相依性。

**Scala**

您可以為額外的 Scala 相依性提供 `--extra-jars` 任務引數。相依性必須在 Amazon S3 中託管，且引數值應為以逗號分隔的 Amazon S3 路徑清單，並不含空格。您可能會發現在託管和設定相依性之前重新綁定相依性，以便更輕鬆地管理組態。 AWS Glue JAR 相依性包含 Java 位元組碼，可從任何 JVM 語言產生。您可以使用其他 JVM 語言 (例如 Java) 來撰寫自訂相依性。

### 管理資料來源憑證
<a name="glue-author-migrate-apache-spark-credential-management"></a>

現有的 Spark 程式可能帶有複雜或自訂組態，以從其資料來源中提取資料。 AWS Glue 連線支援常見的資料來源身分驗證流程。如需有關 AWS Glue 連線的詳細資訊，請參閱 [連線至資料](glue-connections.md)。

AWS Glue 連線有助於以兩種主要方式將您的任務連線至各種類型的資料存放區：透過方法呼叫我們的程式庫，並在 AWS 主控台中設定**其他網路連線**。您也可以從任務中呼叫 AWS SDK，從連線擷取資訊。

 **方法呼叫** – AWS Glue 連線與 AWS Glue Data Catalog 緊密整合，這項服務可讓您策劃資料集的相關資訊，而可與 AWS Glue 連線互動的方法也反映了這一點。如果您有想要重複使用的現有身分驗證組態，對於 JDBC 連線，您可以透過 上的 `extract_jdbc_conf`方法存取 AWS Glue 連線組態`GlueContext`。如需詳細資訊，請參閱[extract\$1jdbc\$1conf](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-extract_jdbc_conf) 

**主控台組態** – AWS Glue 任務使用相關聯的 AWS Glue 連線來設定與 Amazon VPC 子網路的連線。如果您直接管理您的安全資料，您可能需要在 AWS 主控台中提供`NETWORK`類型 **其他網路連線** 來設定路由。如需有關 AWS Glue 連線 API 的詳細資訊，請參閱 [Connections API](aws-glue-api-catalog-connections.md)

如果您的 Spark 程式具有自訂或不常見的身分驗證流程，則可能需要以實作方式來管理安全素材。如果 AWS Glue 連線似乎不適合，您可以在 Secrets Manager 中安全地託管安全資料，並透過任務中提供的 boto3 或 AWS SDK 存取它們。

### 設定 Apache Spark
<a name="glue-author-migrate-apache-spark-spark-configuration"></a>

複雜的移轉通常會改變 Spark 組態，以因應其工作負載。現代版本的 Apache Spark 允許使用 `SparkSession`. AWS Glue 3.0\$1 任務設定執行期組態，並提供 `SparkSession`，可修改以設定執行期組態。[Apache Spark 組態](https://spark.apache.org/docs/latest/configuration.html)。調校 Spark 很複雜， AWS Glue 不保證支援設定所有 Spark 組態。如果您的遷移需要大量的 Spark 層級組態，請聯絡 支援。

### 設定自訂組態
<a name="glue-author-migrate-apache-spark-custom-configuration"></a>

遷移的 Spark 程式可能設計為採用自訂組態。 AWS Glue 允許透過任務引數在任務和任務執行層級上設定組態。如需任務引數的相關資訊，請參閱 [在 Glue AWS 任務中使用任務參數](aws-glue-programming-etl-glue-arguments.md)。您可以透過我們的程式庫在任務內容中存取任務引數。 AWS Glue 提供公用程式函數，以在任務上設定的引數與任務執行上設定的引數之間提供一致的檢視。請在 Python 中參閱 [使用 `getResolvedOptions` 存取參數](aws-glue-api-crawler-pyspark-extensions-get-resolved-options.md)，並在 Scala 中參閱 [AWS Glue Scala GlueArgParser API](glue-etl-scala-apis-glue-util-glueargparser.md)。

### 移轉 Java 程式碼
<a name="glue-author-migrate-apache-spark-java-code"></a>

如同 [包含第三方程式庫](#glue-author-migrate-apache-spark-third-party-libraries) 中所說明，您的相依性可以包含由 JVM 語言 (例如 Java 或 Scala) 產生的類別。您的相依性可以包含 `main` 方法。您可以在相依性中使用 `main`方法做為 Scala AWS Glue 任務的進入點。這可以讓您在 Java 中寫入 `main` 方法，或重複使用封裝至您自身程式庫標準的 `main` 方法。

若要使用來自相依性的 `main` 方法，請執行以下操作：清除提供預設 `GlueApp` 物件的編輯窗格內容。在相依性中提供完全合格的類別名稱，以作為具有金鑰 `--class` 的任務引數。然後，您應該能夠觸發任務執行。

您無法設定引數 AWS Glue 傳遞至 `main`方法的順序或結構。如果您現有的程式碼需要讀取 中設定的組態 AWS Glue，這可能會導致與先前的程式碼不相容。如果您使用 `getResolvedOptions`，也無法擁有能夠呼叫此方法的適當位置。考慮直接從 AWS Glue產生的主要方法來叫用您的相依性。下列 AWS Glue ETL 指令碼顯示此範例。

```
import com.amazonaws.services.glue.util.GlueArgParser

object GlueApp {
  def main(sysArgs: Array[String]) {
    val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
    
    // Invoke static method from JAR. Pass some sample arguments as a String[], one defined inline and one taken from the job arguments, using getResolvedOptions
    com.mycompany.myproject.MyClass.myStaticPublicMethod(Array("string parameter1", args("JOB_NAME")))
    
    // Alternatively, invoke a non-static public method.
    (new com.mycompany.myproject.MyClass).someMethod()
  }
}
```

# 在 中使用 Ray 任務 AWS Glue
<a name="ray-jobs-section"></a>

**重要**  
AWS Glue for Ray 自 2026 年 4 月 30 日起不再向新客戶開放。如果您想要使用 AWS Glue for Ray，請在該日期之前註冊。現有客戶可以繼續正常使用該服務。如需類似 AWS Glue for Ray 的 功能，請探索 Amazon EKS。如需詳細資訊，請參閱 [AWS Glue 的 Ray 終止支援](https://docs.aws.amazon.com/glue/latest/dg/awsglue-ray-jobs-availability-change.html)。

本節提供使用 AWS Glue for Ray 任務的相關資訊。如需撰寫 AWS Glue Ray 指令碼的詳細資訊，請參閱 [Ray 指令碼程式設計](aws-glue-programming-ray.md)一節。

**Topics**
+ [for Ray AWS Glue 入門](#author-job-ray-using)
+ [支援的 Ray 執行期環境](#author-job-ray-runtimes)
+ [計算 Ray 任務中的工作者](#author-job-ray-worker-accounting)
+ [在 Ray 任務中使用任務參數](author-job-ray-job-parameters.md)
+ [使用指標監控 Ray 任務](author-job-ray-monitor.md)

## for Ray AWS Glue 入門
<a name="author-job-ray-using"></a>

若要使用 AWS Glue for Ray，您可以使用與 AWS Glue for Spark. AWS Glue jobs 搭配使用的相同 AWS Glue 任務和互動式工作階段，旨在定期執行相同的指令碼，而互動式工作階段旨在讓您針對相同的佈建資源循序執行程式碼片段。

AWS Glue ETL 和 Ray 在下方不同，因此在指令碼中，您可以存取不同的工具、功能和組態。作為由 管理的新運算架構 AWS Glue，Ray 具有不同的架構，並使用不同的詞彙來描述其功能。如需詳細資訊，請參閱 Ray 文件中的 [Architecture Whitepapers](https://docs.ray.io/en/latest/ray-contribute/whitepaper.html) (架構白皮書)。

**注意**  
AWS Glue for Ray 在美國東部 （維吉尼亞北部）、美國東部 （俄亥俄）、美國西部 （奧勒岡）、亞太區域 （東京） 和歐洲 （愛爾蘭） 提供。

### AWS Glue Studio 主控台中的 Ray 任務
<a name="author-job-ray-using-console"></a>

在 AWS Glue Studio 主控台的任務****頁面上，您可以在 AWS Glue Studio-**Ray 指令碼編輯器**中建立任務時選取新選項。選擇此選項可在主控台中建立 Ray 任務。如需有關這些任務及其使用方式的詳細資訊，請參閱 [建置視覺化的 ETL 任務](author-job-glue.md)。

![\[選取 Ray 指令碼編輯器選項時， 中的任務頁面。 AWS Glue Studio\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/ray_job_setup.png)


### AWS CLI 和 SDK 中的 Ray 任務
<a name="author-job-ray-using-cli"></a>

中的 Ray 任務 AWS CLI 使用與其他 任務相同的 SDK 動作和參數。 AWS Glue for Ray 為特定參數引入新值。如需有關任務 API 的詳細資訊，請參閱 [任務](aws-glue-api-jobs-job.md)。

## 支援的 Ray 執行期環境
<a name="author-job-ray-runtimes"></a>

在 Spark 任務中，`GlueVersion` 會決定在 AWS Glue for Spark 任務中可用的 Apache Spark 和 Python 的版本。Python 版本指示針對 Spark 類型任務支援的版本。這不是 Ray 執行期環境的設定方式。

針對 Ray 任務，您應將 `GlueVersion` 設定為 `4.0` (或更高版本)。不過，Ray 任務中可用的 Ray、Python 和其他程式庫的版本由任務定義中的 `Runtime` 欄位決定。

`Ray2.4` 執行期環境將在發布後至少可用 6 個月。隨著 Ray 的快速發展，您將能夠透過未來的執行期環境發行版本合併 Ray 更新和改進。

有效值：`Ray2.4`


| 執行期值 | Ray 和 Python 版本 | 
| --- | --- | 
| Ray2.4 (適用於 AWS Glue 4.0\$1) |  Ray 2.4.0 Python 3.9  | 

**其他資訊**
+ 如需 Ray 版本 AWS Glue 隨附的版本備註，請參閱 [AWS Glue 版本](release-notes.md#release-notes-versions)。
+ 如需在執行期環境中提供的 Python 程式庫，請參閱 [Ray 任務隨附的模組](edit-script-ray-env-dependencies.md#edit-script-ray-modules-provided)。

## 計算 Ray 任務中的工作者
<a name="author-job-ray-worker-accounting"></a>

AWS Glue 在新的 Graviton 型 EC2 工作者類型上執行 Ray 任務，僅適用於 Ray 任務。為了適當地為工作負載 (專門為其設計了 Ray) 佈建這些工作者，我們提供了與大多數工作者不同的運算資源與記憶體資源比率。為了計算這些資源，我們使用記憶體最佳化資料處理單元 (M-DPU)，而不是標準資料處理單元 (DPU)。
+ 一個 M-DPU 對應 4 個 vCPU 和 32 GB 記憶體。
+ 一個 DPU 對應 4 個 vCPU 和 16 GB 記憶體。DPU 用於透過 Spark 任務和對應的工作者來計算 AWS Glue 中的資源。

Ray 任務目前擁有一種工作者類型 (即 `Z.2X`) 的存取權。`Z.2X` 工作者映射至 2 個 M-DPU (8 個 vCPU、64 GB 記憶體)，且擁有 128 GB 的磁碟空間。`Z.2X` 機器提供 8 個 Ray 工作者 (每個 vCPU 一個)。

您可以在帳戶中同時使用的 M-DPU 數量取決於服務配額。如需 AWS Glue 帳戶限制的詳細資訊，請參閱[AWS Glue 端點和配額](https://docs.aws.amazon.com/general/latest/gr/glue.html)。

您可以在任務定義中使用 `--number-of-workers (NumberOfWorkers)` 指定可用於 Ray 任務的工作節點數量。如需有關任務 API 中 Ray 值的詳細資訊，請參閱 [任務](aws-glue-api-jobs-job.md)。

您可以進一步指定 Ray 任務必須與 `--min-workers` 任務參數一起配置的工作者數量下限。如需有關任務參數的詳細資訊，請參閱 [參考資料](author-job-ray-job-parameters.md#author-job-ray-parameters-reference)。

# 在 Ray 任務中使用任務參數
<a name="author-job-ray-job-parameters"></a>

**重要**  
AWS Glue for Ray 自 2026 年 4 月 30 日起不再向新客戶開放。如果您想要使用 AWS Glue for Ray，請在該日期之前註冊。現有客戶可以繼續正常使用該服務。如需類似 AWS Glue for Ray 的 功能，請探索 Amazon EKS。如需詳細資訊，請參閱 [AWS Glue 的 Ray 終止支援](https://docs.aws.amazon.com/glue/latest/dg/awsglue-ray-jobs-availability-change.html)。

您為 Ray AWS Glue 任務設定引數的方式與 AWS Glue 為 Spark 任務設定引數的方式相同。如需 AWS Glue API 的詳細資訊，請參閱 [任務](aws-glue-api-jobs-job.md)。您可以使用此參考中列出的不同引數來設定 AWS Glue Ray 任務。您也可以提供自己的引數。

您可以透過主控台在 **Job Parameters** (任務參數) 標題下的 **Job details** (任務詳細資訊) 索引標籤中設定任務。您也可以在任務`DefaultArguments`上設定 或在任務執行`Arguments`上設定 ， AWS CLI 透過 設定任務。預設引數和任務參數會在多次執行中留在任務內。

例如，下列是執行使用 `--arguments` 來設定特殊參數之任務的語法。

```
$ aws glue start-job-run --job-name "CSV to CSV" --arguments='--scriptLocation="s3://my_glue/libraries/test_lib.py",--test-environment="true"'
```

設定引數後，您可以透過環境變數從 Ray 任務中存取任務參數。這可為您提供為每個執行設定任務的方法。環境變數的名稱將是不含 `--` 字首的任務引數名稱。

例如，在之前的範例中，變數名稱將是 `scriptLocation` 和 `test-environment`。然後，您需透過標準程式庫中可用的方法擷取引數：`test_environment = os.environ.get('test-environment')`。如需有關使用 Python 存取環境變數的詳細資訊，請參閱 Python 文件中的 [os module](https://docs.python.org/3/library/os.html)。

## 設定 Ray 任務產生日誌的方式
<a name="author-job-ray-logging-configuration"></a>

依預設，Ray 任務產生的日誌和指標會傳送到 CloudWatch 和 Amazon S3。您可以使用 `--logging_configuration` 參數來變更日誌的產生方式，目前您可以使用此參數來讓 Ray 任務停止產生各種類型的日誌。此參數採用 JSON 物件，其金鑰對應至您想要變更的日誌/行為。此參數支援下列金鑰：
+ `CLOUDWATCH_METRICS` – 設定可用於將任務運作狀態視覺化的 CloudWatch 指標系列。如需指標的詳細資訊，請參閱 [使用指標監控 Ray 任務](author-job-ray-monitor.md)。
+ `CLOUDWATCH_LOGS` – 設定 CloudWatch 日誌，以提供有關任務執行狀態的 Ray 應用程式層級詳細資訊。如需日誌的詳細資訊，請參閱 [對日誌 AWS Glue 中的 Ray 錯誤進行故障診斷](troubleshooting-ray.md)。
+ `S3` – 設定 AWS Glue 寫入 Amazon S3 的內容，主要與 CloudWatch 日誌類似，但做為檔案而非日誌串流。

若要停用 Ray 日誌行為，請提供值 `{\"IS_ENABLED\": \"False\"}`。例如，若要停用 CloudWatch 指標和 CloudWatch 日誌，請提供下列設定：

```
"--logging_configuration": "{\"CLOUDWATCH_METRICS\": {\"IS_ENABLED\": \"False\"}, \"CLOUDWATCH_LOGS\": {\"IS_ENABLED\": \"False\"}}"
```

## 參考資料
<a name="author-job-ray-parameters-reference"></a>

 Ray 任務會辨識以下引數名稱，您可以用來為 Ray 任務和任務執行設定指令碼環境：
+ `--logging_configuration` – 用於停止產生 Ray 任務建立的各種日誌。依預設，這些日誌會在所有 Ray 任務上產生。格式：逸出字串 JSON 物件。如需詳細資訊，請參閱[設定 Ray 任務產生日誌的方式](#author-job-ray-logging-configuration)。
+ `--min-workers` – 配置給 Ray 任務的工作節點最小數目。工作節點可以執行多個複本，每個虛擬 CPU 一個複本。格式：整數。下限：0。上限：在任務定義的 `--number-of-workers (NumberOfWorkers)` 中指定的值。如需有關計算工作節點的詳細資訊，請參閱 [計算 Ray 任務中的工作者](ray-jobs-section.md#author-job-ray-worker-accounting)。
+ `--object_spilling_config` – AWS Glue for Ray 支援使用 Amazon S3 作為擴展 Ray 物件存放區可用空間的方式。若要啟用此行為，您可以使用此參數提供 Ray 一個*物件溢出*的 JSON 組態物件。如需有關 Ray 物件溢出組態的詳細資訊，請參閱 Ray 文件中的 [Object Spilling](https://docs.ray.io/en/latest/ray-core/objects/object-spilling.html)。格式：JSON 物件。

  AWS Glue for Ray 僅支援一次溢出到磁碟或溢出到 Amazon S3。您可以提供多個溢出位置，只要它們遵守此限制即可。溢出到 Amazon S3 時，您還需要為此儲存貯體新增 IAM 許可至任務。

  使用 CLI 將 JSON 物件作為組態提供時，您必須將其作為字串提供，並對 JSON 物件進行字串逸出。例如，溢出到一個 Amazon S3 路徑的字串值如下所示：`"{\"type\": \"smart_open\", \"params\": {\"uri\":\"s3path\"}}"`。在 中 AWS Glue Studio，將此參數提供為沒有額外格式的 JSON 物件。
+ `--object_store_memory_head` – 配置給 Ray 前端節點上 Plasma 物件存放區的記憶體。此執行個體會執行叢集管理服務以及工作者複本。此值代表暖啟動後執行個體上可用記憶體的百分比。您使用此參數調整記憶體密集型工作負載，大多數使用案例都可以接受預設值。格式：正整數。下限：1。上限：100。

  如需有關 Plasma 的詳細資訊，請參閱 Ray 文件中的 [The Plasma In-Memory Object Store](https://ray-project.github.io/2017/08/08/plasma-in-memory-object-store.html) (Plasma 記憶體內物件存放區)。
+ `--object_store_memory_worker` – 配置給 Ray 工作節點上 Plasma 物件存放區的記憶體。這些執行個體僅執行工作者複本。此值代表暖啟動後執行個體上可用記憶體的百分比。此參數用於調整記憶體密集型工作負載 – 大多數使用案例都可以接受預設值。格式：正整數。下限：1。上限：100。

  如需有關 Plasma 的詳細資訊，請參閱 Ray 文件中的 [The Plasma In-Memory Object Store](https://ray-project.github.io/2017/08/08/plasma-in-memory-object-store.html) (Plasma 記憶體內物件存放區)。
+ `--pip-install` – 要安裝的一組 Python 套件。您可以使用此引數從 PyPI 安裝套件。格式：以逗號分隔的清單。

  PyPI 套件項目的格式為 `package==version`，其中包含 PyPI 名稱和目標套件的版本。項目使用 Python 版本比對來比對套件和版本。例如 `==`，而非單一等於 `=`。也存在其他的版本比對運算子。如需詳細資訊，請參閱 Python 網站上的 [PEP 440](https://peps.python.org/pep-0440/#version-matching)。您還可以使用 `--s3-py-modules` 提供自訂模組。
+ `--s3-py-modules`：託管 Python 模組分佈的一組 Amazon S3 路徑。格式：以逗號分隔的清單。

  您可以使用它來分發自己的模組到 Ray 任務。您還可以使用 `--pip-install` 提供來自 PyPI 的模組。與 AWS Glue ETL 不同，自訂模組不是透過 pip 設定，而是傳遞給 Ray 進行分發。如需詳細資訊，請參閱[Ray 任務的其他 Python 模組](edit-script-ray-env-dependencies.md#edit-script-ray-python-libraries-additional)。
+ `--working-dir`：Amazon S3 中託管之 .zip 檔案的路徑，其中包含要分發到執行 Ray 任務的所有節點的檔案。格式：字串。如需詳細資訊，請參閱[為 Ray 任務提供檔案](edit-script-ray-env-dependencies.md#edit-script-ray-working-directory)。

# 使用指標監控 Ray 任務
<a name="author-job-ray-monitor"></a>

**重要**  
AWS Glue for Ray 自 2026 年 4 月 30 日起不再向新客戶開放。如果您想要使用 AWS Glue for Ray，請在該日期之前註冊。現有客戶可以繼續正常使用該服務。如需類似 AWS Glue for Ray 的 功能，請探索 Amazon EKS。如需詳細資訊，請參閱 [AWS Glue 的 Ray 終止支援](https://docs.aws.amazon.com/glue/latest/dg/awsglue-ray-jobs-availability-change.html)。

您可以使用 AWS Glue Studio 和 Amazon CloudWatch 監控 Ray 任務。CloudWatch AWS Glue 會使用 Ray 收集和處理來自 的原始指標，以便進行分析。這些指標會在 AWS Glue Studio 主控台中視覺化，讓您可以在任務執行時監控任務。

如需如何監控 的一般概觀 AWS Glue，請參閱 [使用 Amazon CloudWatch 指標監控 AWS Glue](monitoring-awsglue-with-cloudwatch-metrics.md)。如需如何使用由 發佈之 CloudWatch 指標的一般概觀 AWS Glue，請參閱 [使用 Amazon CloudWatch 監控](monitor-cloudwatch.md)。

## 在 AWS Glue 主控台中監控 Ray 任務
<a name="author-job-ray-monitor-console"></a>

在任務執行的詳細資訊頁面的**執行詳細資訊**區段下方，您可以檢視預先建置的彙總圖表，以視覺化可用的任務指標。 會針對每個任務執行，將任務指標 AWS Glue Studio 傳送至 CloudWatch。您可以使用這些任務指標建立叢集和工作的設定檔，以及存取有關每個節點的詳細資訊。

如需有關可用指標圖表的詳細資訊，請參閱 [檢視 Ray 任務執行的 Amazon CloudWatch 指標](view-job-runs.md#monitoring-job-run-metrics-ray)。

## CloudWatch 中的 Ray 任務指標概觀
<a name="author-job-ray-monitor-cw"></a>

在 CloudWatch 中啟用詳細監控功能時，我們會發佈 Ray 指標。指標會發佈至 `Glue/Ray` CloudWatch 命名空間。
+ **執行個體指標**

  我們會針對指派給任務的執行個體，發佈 CPU、記憶體和磁碟使用率的指標。這些指標會由 `ExecutorId`、`ExecutorType` 和 `host` 等特性識別。這些指標是標準 Linux CloudWatch 代理程式指標的子集。您可以在 CloudWatch 文件中找到指標名稱和特性的相關資訊。如需詳細資訊，請參閱 [CloudWatch 代理程式收集的指標](https://docs.aws.amazon.com//AmazonCloudWatch/latest/monitoring/metrics-collected-by-CloudWatch-agent.html)。
+ **Ray 叢集指標**

  我們會將執行指令碼的 Ray 程序中的指標轉送至此命名空間，然後提供對您而言最重要的指標。可用的指標可能因 Ray 版本而異。如需有關任務正在執行之 Ray 版本的詳細資訊，請參閱 [AWS Glue 版本](release-notes.md)。

  Ray 會在執行個體層級收集指標。它還提供了任務和叢集的指標。如需有關 Ray 基礎指標策略的詳細資訊，請參閱 Ray 文件中的[指標](https://docs.ray.io/en/latest/ray-observability/ray-metrics.html#system-metrics)。

**注意**  
 我們不會將 Ray 指標發佈至僅用於 AWS Glue ETL 任務的 `Glue/Job Metrics/` 命名空間。

# 在 AWS Glue 中設定 Python Shell 任務的任務屬性
<a name="add-job-python"></a>

 您可以使用 Python shell 任務，在 AWS Glue 中以 shell 的方式執行 Python 指令碼。您可以透過 Python Shell 任務，來執行與 Python 3.6 或 Python 3.9 相容的指令碼。

**注意**  
 Pyshell v3.6 的支援將在 2026 年 3 月 1 日結束。若要遷移工作負載，請參閱[從 AWS Glue Python shell 任務遷移](https://docs.aws.amazon.com/glue/latest/dg/pyshell-migration.html)。如果您想要繼續使用 Python Shell v3.9，請參閱[從 Python Shell 3.6 移轉至 Python Shell 3.9](#migrating-version-pyshell36-to-pyshell39)。

**Topics**
+ [限制](#python-shell-limitations)
+ [執行環境](#python-shell-execution-environment)
+ [為 Python shell 任務定義任務屬性](#create-job-python-properties)
+ [適用於 Python shell 任務的支援程式庫](#python-shell-supported-library)
+ [提供自己的 Python 程式庫](#create-python-extra-library)
+ [在 中使用 AWS CloudFormation 搭配 Python shell 任務 AWS Glue](#python-shell-jobs-cloudformation)
+ [從 Python Shell 3.6 移轉至 Python Shell 3.9](#migrating-version-pyshell36-to-pyshell39)
+ [從 AWS Glue Python shell 任務遷移](pyshell-migration.md)

## 限制
<a name="python-shell-limitations"></a>

注意 Python Shell 任務的下列限制：
+  您無法使用任務書籤搭配 Python shell 任務。
+ 您不能將任何 Python 程式庫打包為 Python 3.9 \$1 中的 `.egg` 檔案。請改用 `.whl`。
+ 由於 S3 資料的暫時複本有限制，`--extra-files` 選項無法使用。

## 執行環境
<a name="python-shell-execution-environment"></a>

Python shell 任務會在受管執行環境中執行，提供存取本機儲存以進行臨時資料處理：

**本機暫時儲存**  
`/tmp` 目錄可在任務執行期間用於暫時儲存。此目錄提供大約 14 GiB 的可用空間，可用於：  
+ 臨時檔案處理
+ 中繼資料儲存
+ 快取小型資料集
`/tmp` 目錄是暫時性的，會在任務完成後清除。請勿將其用於持續儲存重要資料。

## 為 Python shell 任務定義任務屬性
<a name="create-job-python-properties"></a>

這些章節說明在 中AWS Glue Studio或使用 AWS CLI 定義任務屬性。

### AWS Glue Studio
<a name="create-job-python-properties-studio"></a>

當您在 AWS Glue Studio 中定義 Python Shell 任務時，您會提供以下一些屬性：

**IAM 角色**  
指定 AWS Identity and Access Management (IAM) 角色，用於授權用於執行任務和存取資料存放區的資源。如需在 AWS Glue 執行任務之許可的詳細資訊，請參閱 [Glue AWS 的身分和存取管理](security-iam.md)。

**Type**  
選擇 **Python shell (Python shell)** 來​使用名為 `pythonshell` 的任務執行 Python 指令碼。

**Python 版本**  
選擇 Python 版本。預設為 Python 3.9。有效版本為 Python 3.6 和 Python 3.9。

**載入常見的分析程式庫 (建議)**  
選擇此選項可在 Python Shell 中包含 Python 3.9 的常見程式庫。  
如果您的程式庫是自訂的，或者與預先安裝的程式庫衝突，您可以選擇不安裝常見程式庫。但是，除了常見程式庫之外，您還可以安裝其他程式庫。  
當您選取此選項時，`library-set` 選項設定為 `analytics`。當您取消選取此選項時，`library-set` 選項設定為 `none`。

**指令碼檔案名稱和指令碼路徑**  
指令碼中的程式碼定義了任務的程序性邏輯。您可以在 Amazon Simple Storage Service (Amazon S3) 中提供指令碼名稱和位置。請確認路徑中沒有跟指令碼目錄名稱相同的檔案。若要進一步了解使用指令碼，請參閱 [AWS Glue 程式設計指南](edit-script.md)。

**指令碼**  
指令碼中的程式碼定義了任務的程序性邏輯。您可以使用 Python 3.6 或 Python 3.9 編寫指令碼。您可以在 AWS Glue Studio 中編輯指令碼。

**資料處理單位**  
可在此任務執行時分配的 AWS Glue 資料處理單位​ (DPU) 數目上限。DPU 是處理能力的相對測量，由 4 個 vCPUs的運算容量和 16 GB 的記憶體組成。如需詳細資訊，請參閱 [AWS Glue 定價](https://aws.amazon.com/glue/pricing/)。  
您可以將值設為 0.0625 或 1。預設為 0.0625。在任一情況下，執行個體的本機磁碟都是 20 GB。

### CLI
<a name="create-job-python-properties-cli"></a>

 您也可以使用 建立 **Python shell** 任務 AWS CLI，如下列範例所示。

```
 aws glue create-job --name python-job-cli --role Glue_DefaultRole 
     --command '{"Name" :  "pythonshell", "PythonVersion": "3.9", "ScriptLocation" : "s3://amzn-s3-demo-bucket/scriptname.py"}'  
     --max-capacity 0.0625
```

**注意**  
 您不需要指定 AWS Glue 的版本，因為參數 `--glue-version` 不適用於 AWS Glue Shell 任務。任何指定的版本都會予以忽略。

 您使用 AWS CLI 預設為 Python 3 建立的任務。有效的 Python 版本為 3 (對應於 3.6) 和 3.9。若要指定 Python 3.6，請將此元組新增至 `--command` 參數：`"PythonVersion":"3"`

 若要指定 Python 3.9，請將此元組新增至 `--command` 參數：`"PythonVersion":"3.9"`

 若要設定 Python shell 任務所用的容量上限，請提供 `--max-capacity` 參數。​ 無法將 `--allocated-capacity` 參數用於 Python shell 任務。

## 適用於 Python shell 任務的支援程式庫
<a name="python-shell-supported-library"></a>

 在使用 Python 3.9 的 Python Shell 中，您可以選擇程式庫集來使用預先封裝的程式庫集來滿足您的需求。您可以使用 `library-set` 選項來選擇程式庫集。有效值為 `analytics` 和 `none`。

執行 Python shell 任務的環境支援以下程式庫：


| Python 版本 | Python 3.6 | Python 3.9 | 
| --- | --- | --- | 
| 程式庫集 | 無 | 分析 | 無 | 
| avro |  | 1.11.0 |  | 
| awscli | 116.242 | 1.23.5 | 1.23.5 | 
| awswrangler |  | 2.15.1 |  | 
| botocore | 1.12.232 | 1.24.21 | 1.23.5 | 
| boto3 | 203 年 9 月 1 日 | 1.21.21 |  | 
| elasticsearch |  | 8.2.0 |  | 
| numpy | 1.16.2 | 1.22.3 |  | 
| pandas | 0.24.2 | 1.4.2 |  | 
| psycopg2 |  | 2.9.3 |  | 
| pyathena |  | 2.5.3 |  | 
| PyGreSQL | 5.0.6 |  |  | 
| PyMySQL |  | 1.0.2 |  | 
| pyodbc |  | 4.0.32 |  | 
| pyorc |  | 0.6.0 |  | 
| redshift-connector |  | 2.0.907 |  | 
| 請求 | 2.22.0 | 2.27.1 |  | 
| scikit-learn | 0.20.3 | 1.0.2 |  | 
| scipy | 1.2.1 | 1.8.0 |  | 
| SQLAlchemy |  | 1.4.36 |  | 
| s3fs |  | 2022.3.0 |  | 

您可以在 Python shell 任務中使用 `NumPy`​ 程式庫以進行科學運算。如需詳細資訊，請參閱 [NumPy](http://www.numpy.org) 相關文章。以下範例顯示的 NumPy 指令碼可用於 Python shell 任務。指令碼會列印「Hello world」和多個數學計算的結果。

```
import numpy as np
print("Hello world")

a = np.array([20,30,40,50])
print(a)

b = np.arange( 4 )

print(b)

c = a-b

print(c)

d = b**2

print(d)
```

## 提供自己的 Python 程式庫
<a name="create-python-extra-library"></a>

### 使用 PIP
<a name="create-python-extra-library-pip"></a>

Python Shell 使用 Python 3.9 允許您在任務層級提供額外的 Python 模組或不同的版本。您可以使用 `--additional-python-modules` 選項與逗號分隔的 Python 模組清單來新增新模組或變更現有模組的版本。使用 Python Shell 任務時，您無法使用此參數來提供在 Amazon S3 上託管的自訂 Python 模組。

例如，要更新或新增新的 `scikit-learn` 模組，請使用以下索引鍵與值：`"--additional-python-modules", "scikit-learn==0.21.3"`。

AWS Glue 使用 Python Package Installer (pip3) 來安裝其他模組。您可以在 `--additional-python-modules` 值內傳遞額外的 pip3 選項。例如 `"scikit-learn==0.21.3 -i https://pypi.python.org/simple/"`。來自 pip3 的任何不相容或限制都適用。

**注意**  
為避免未來出現不相容，我們建議您使用為 Python 3.9 建置的程式庫。

### 使用 Egg 或 Whl 文件
<a name="create-python-extra-library-egg-whl"></a>

您可能已有一或多個 Python 程式庫封裝為 `.egg` 或 `.whl` 檔案。若是如此，您可以使用「`--extra-py-files`」旗標下的 AWS Command Line Interface (AWS CLI)，將它們指定到您的任務，如下列範例所示。

```
aws glue create-job --name python-redshift-test-cli --role role --command '{"Name" :  "pythonshell", "ScriptLocation" : "s3://MyBucket/python/library/redshift_test.py"}' 
     --connections Connections=connection-name --default-arguments '{"--extra-py-files" : ["s3://amzn-s3-demo-bucket/EGG-FILE", "s3://amzn-s3-demo-bucket/WHEEL-FILE"]}'
```

如果您不確定如何從 Python 程式庫建立 `.egg` 或 `.whl` 檔案，請使用以下步驟。此範例適用於 macOS、Linux 和適用於 Linux 的 Windows 子系統 (WSL)。

**建立 Python .egg 或 .whl 檔案**

1. 在 Virtual Private Cloud (VPC) 建立 Amazon Redshift 叢集並將一些資料新增到資料表。

1. 為您在建立叢集時所用的 VPC-SecurityGroup-Subnet 組合建立 AWS Glue 連線。​ 測試連線是否成功。

1. 建立名為 `redshift_example` 的目錄，並建立名為 `setup.py` 的檔案。​ 將以下程式碼貼入 `setup.py`。

   ```
   from setuptools import setup
   
   setup(
       name="redshift_module",
       version="0.1",
       packages=['redshift_module']
   )
   ```

1. 在 `redshift_example` 目錄中，建立 `redshift_module` 目錄。​在 `redshift_module`​ 目錄中，建立檔案 `__init__.py` 和 `pygresql_redshift_common.py`。

1. 將 `__init__.py` 檔案留空。在 `pygresql_redshift_common.py` 中貼上以下程式碼。在先前的程式碼中，將 *port*、*db\$1name*、*user*​ 和 *password\$1for\$1user* 取代為 Amazon Redshift 叢集的特定詳細資訊。將 *table-name* 取代為 Amazon Redshift 中的資料表名稱。

   ```
   import pg
   
   
   def get_connection(host):
       rs_conn_string = "host=%s port=%s dbname=%s user=%s password=%s" % (
           host, port, db_name, user, password_for_user)
   
       rs_conn = pg.connect(dbname=rs_conn_string)
       rs_conn.query("set statement_timeout = 1200000")
       return rs_conn
   
   
   def query(con):
       statement = "Select * from table_name;"
       res = con.query(statement)
       return res
   ```

1. 如果您尚未這麼做，請變更至 `redshift_example` 目錄。​

1. 執行以下任意一項：
   + 執行下列命令以建立 `.egg` 檔案。

     ```
     python setup.py bdist_egg
     ```
   + 執行下列命令以建立 `.whl` 檔案。

     ```
     python setup.py bdist_wheel
     ```

1. 安裝上述命令所需的相依項目。

1. 該命令會在 `dist` 目錄中建立檔案。
   + 如果您建立了 egg 檔案，會命名為 `redshift_module-0.1-py2.7.egg`。
   + 如果您建立了 wheel 檔案，會命名為 `redshift_module-0.1-py2.7-none-any.whl`。

   將此檔案上傳到 Amazon S3。

   在此範例中，上傳的檔案路徑為 *s3://amzn-s3-demo-bucket/EGG-FILE* 或 *s3://amzn-s3-demo-bucket/WHEEL-FILE*。

1. 建立要用來做為 AWS Glue 任務之指令碼的​ Python 檔案，並將以下程式碼新增到該檔案。

   ```
   from redshift_module import pygresql_redshift_common as rs_common
   
   con1 = rs_common.get_connection(redshift_endpoint)
   res = rs_common.query(con1)
   
   print "Rows in the table cities are: "
   
   print res
   ```

1. 將上述檔案上傳到 Amazon S3。在此範例中，上傳的檔案路徑為 *s3://amzn-s3-demo-bucket/scriptname.py*。

1. 使用此指令碼建立 Python shell 任務。在 AWS Glue 主控台的 **Job properties (任務屬性)** 頁面上，在 **Python library path (Python 程式庫路徑)** 方塊中指定 `.egg/.whl` 檔案的路徑。如果您有多個 `.egg/.whl` 檔案和​ Python 檔案，請在此方塊中提供以逗號分隔的清單。

   修改或重新命名 `.egg` 檔案時，檔案名稱必須使用由「python setup.py bdist\$1egg」指令產生的預設名稱，或必須承繼 Python 模組命名慣例。如需詳細資訊，請參閱 [Python 程式碼樣式指南](https://www.python.org/dev/peps/pep-0008/)。

   使用 AWS CLI，透過 命令建立任務，如下列範例所示。

   ```
   aws glue create-job --name python-redshift-test-cli --role Role --command '{"Name" :  "pythonshell", "ScriptLocation" : "s3://amzn-s3-demo-bucket/scriptname.py"}' 
        --connections Connections="connection-name" --default-arguments '{"--extra-py-files" : ["s3://amzn-s3-demo-bucket/EGG-FILE", "s3://amzn-s3-demo-bucket/WHEEL-FILE"]}'
   ```

   當任務執行時，指令碼會列印在 Amazon Redshift 叢集 *table\$1name* 資料表中建立的列。

## 在 中使用 AWS CloudFormation 搭配 Python shell 任務 AWS Glue
<a name="python-shell-jobs-cloudformation"></a>

 您可以在 中使用 AWS CloudFormation 搭配 Python shell 任務AWS Glue。以下是範例：

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  Python39Job:
    Type: 'AWS::Glue::Job'
    Properties:
      Command:
        Name: pythonshell
        PythonVersion: '3.9'
        ScriptLocation: 's3://bucket/location'
      MaxRetries: 0
      Name: python-39-job
      Role: RoleName
```

 Python shell 任務輸出的 Amazon CloudWatch Logs 群組是 `/aws-glue/python-jobs/output`。針對錯誤，請參閱日誌群組 `/aws-glue/python-jobs/error`。​ 

## 從 Python Shell 3.6 移轉至 Python Shell 3.9
<a name="migrating-version-pyshell36-to-pyshell39"></a>

 若要將 Python shell 任務遷移至 AWS Glue 最新版本：

1.  在 AWS Glue 主控台 ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)：//) 中，選擇現有的 Python shell 任務。

1.  在**任務**詳細資訊索引標籤中，將 Python 版本設定為 `Python 3.9`，然後選擇**儲存**。

1.  確保您的任務指令碼與 Python 3.9 相容，且成功執行。

# 從 AWS Glue Python shell 任務遷移
<a name="pyshell-migration"></a>

 AWS 於 AWS 2018 年啟動 Glue Python shell 任務於 2018 年 AWS 啟動 AWS Glue Python shell 任務，讓客戶能夠輕鬆執行small-to-medium ETL 任務的 Python 指令碼，並觸發 SQL 查詢。不過，現在有更現代且靈活的選項可以處理目前在 PythonShell 上執行的工作負載。本主題說明如何將工作負載從 AWS Glue Python shell 任務遷移到其中一個替代選項，以利用可用的新功能。

 本主題說明如何從 AWS Glue Python shell 任務遷移至替代選項。

## 將工作負載遷移至 AWS Glue Spark 任務
<a name="pyshell-migration-to-glue-spark-jobs"></a>

 [AWS Glue Spark 和 PySpark 任務](https://docs.aws.amazon.com/glue/latest/dg/spark_and_pyspark.html)可讓您以分散式方式執行工作負載。由於 AWS Glue Python Shell 任務和 AWS Glue Spark 任務都在同一平台上執行，因此很容易遷移，而且您可以繼續使用與 Python Shell AWS 任務搭配使用的現有 Glue 功能，例如 AWS Glue Workflows、 AWS Glue Triggers、 AWS Glue Amazon EventBridge 整合、\$1 PIP 型套件安裝等。

 不過， AWS Glue Spark 任務旨在執行 Spark 工作負載，工作者數量下限為 2。如果從 Python Shell 任務移轉而不修改指令碼，則實際只會使用一個工作者，其他工作者將保持閒置狀態。這會增加成本。

 為了提高效率，請重寫 Python 任務指令碼以利用 Spark 的功能，並將工作負載分配到多個工作者。如果 Python 指令碼是以 Pandas 為基礎，則使用 Spark 上的新 Pandas API 可輕鬆移轉。[請參閱 AWS 大數據部落格：深入了解適用於 Apache Spark 的 AWS Glue 4.0](https://aws.amazon.com/blogs/big-data/dive-deep-into-aws-glue-4-0-for-apache-spark/)。

## 將工作負載遷移至 AWS Lambda
<a name="pyshell-migration-to-aws-lambda"></a>

 AWS Lambda 是一種無伺服器運算服務，可讓您執行程式碼，而無需佈建或管理伺服器。由於 AWS Lambda 具有較低的啟動時間和更靈活的運算容量選項，因此您可從這些優勢中受益。為了管理額外的 Python 程式庫， AWS Glue Python Shell 任務使用 PIP 型安裝。不過，對於 AWS Lambda，您需要選擇下列其中一個選項： zip 封存、容器映像或 Lambda Layers。

 另一方面，逾時 AWS Lambda上限為 900 秒 (15 分鐘）。如果您現有 AWS Glue Python Shell 任務工作負載的任務持續時間超過此期限，或者您的工作負載具有可能導致更長任務持續時間的尖峰模式，則建議您探索其他選項，而不是探索其他選項 AWS Lambda。

## 將工作負載移轉至 Amazon ECS/Fargate
<a name="pyshell-migration-to-ecs-aws-fargate"></a>

 Amazon Elastic Container Service (Amazon ECS) 是一項全受管服務，可簡化容器化應用程式的部署、管理和擴展。 AWS Fargate 是一種無伺服器運算引擎，適用於在 Amazon ECS 和 Amazon Elastic Kubernetes Service (Amazon EKS) 上執行的容器化工作負載。Amazon ECS 和 Fargate 中沒有最大逾時，因此這是長時間執行任務的理想選擇。由於您可以完全控制容器映像，因此可以將 Python 指令碼和額外的 Python 程式庫帶入容器並進行使用。不過，需要將 Python 指令碼容器化，才能使用此方法。

## 將工作負載移轉至 Amazon Managed Workflows for Apache Airflow Python Operator
<a name="pyshell-migration-to-amazon-mwaa-python-operator"></a>

 Amazon Managed Workflows for Apache Airflow (Managed Workflows for Apache Airflow) 是一項適用於 Apache Airflow 的受管協同運作服務，可以更輕鬆地在雲端中大規模設定和操作端對端資料管道。如果您已經有 MWAA 環境，使用 Python 運算子而非 Glue Python Shell AWS 任務會非常簡單。Python 運算子是在 Airflow 工作流程中執行 Python 程式碼的運算子。不過，如果您沒有現有的 MWAA 環境，建議探索其他選項。

## 將工作負載遷移至 Amazon SageMaker AI AI 訓練任務
<a name="pyshell-migration-to-amazon-sagemaker-ai"></a>

 Amazon SageMaker AI 訓練是由 提供的全受管機器學習 (ML) 服務 Amazon SageMaker AI ，可協助您有效率地大規模訓練各種 ML 模型。 Amazon SageMaker AI AI 任務的核心是 ML 工作負載的容器化，以及管理 AWS 運算資源的能力。如果您偏好沒有最大逾時的無伺服器環境， Amazon SageMaker AI AI 訓練任務可能適合您。不過，啟動延遲通常比 Glue Python Shell AWS 任務更長。對於延遲敏感任務，建議探索其他選項。

# 監控 AWS Glue
<a name="monitor-glue"></a>

監控是維護 AWS Glue 和其他 AWS 解決方案的可靠性、可用性和效能的重要部分。 AWS 提供監控工具，可讓您用來監看 AWS Glue、回報錯誤，並在適當時自動採取行動：

您可以使用下列自動化監控工具來監看 AWS Glue ，並在發生錯誤時進行回報：
+ **Amazon CloudWatch Events** 提供近乎即時的系統事件串流，描述 AWS 資源的變更。CloudWatch Events 能自動化執行事件導向型運算。您可以撰寫規則來監控特定事件，並在發生這些事件 AWS 時觸發其他服務中的自動動作。如需詳細資訊，請參閱 [Amazon CloudWatch Events 使用者指南](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/)。
+ **Amazon CloudWatch Logs** 可讓您從 Amazon EC2 執行個體和其他來源監控 AWS CloudTrail、存放和存取您的日誌檔案。CloudWatch Logs 可監控日誌檔案中的資訊，並在達到特定閾值時通知您。您也可以將日誌資料存檔在高耐用性的儲存空間。如需詳細資訊，請參閱 [Amazon CloudWatch Logs 使用者指南](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/)。
+ **AWS CloudTrail** 會擷取由您的帳戶或代表 AWS 您的帳戶發出的 API 呼叫和相關事件，並將日誌檔案交付至您指定的 Amazon S3 儲存貯體。您可以識別哪些使用者和帳戶呼叫 AWS、進行呼叫的來源 IP 地址，以及呼叫的時間。如需詳細資訊，請參閱[「AWS CloudTrail 使用者指南」](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)。

此外，您可以在 AWS Glue 主控台中存取下列洞見，以協助您偵錯和描述檔任務：
+ Spark 工作 – 您可以看到所選 CloudWatch 指標系列的視覺化，而較新的工作可以存取 Spark UI。如需詳細資訊，請參閱[監控 AWS Glue Spark 任務](monitor-spark.md)。
+ Ray 工作 – 您可以看到所選 CloudWatch 指標系列的視覺化。如需詳細資訊，請參閱[使用指標監控 Ray 任務](author-job-ray-monitor.md)。

**Topics**
+ [AWS 中的標籤 AWS Glue](monitor-tags.md)
+ [使用 EventBridge 自動化 AWS Glue](automating-awsglue-with-cloudwatch-events.md)
+ [監控 AWS Glue 資源](monitor-resource-metrics.md)
+ [使用 記錄 AWS Glue API 呼叫 AWS CloudTrail](monitor-cloudtrail.md)

# AWS 中的標籤 AWS Glue
<a name="monitor-tags"></a>

為了利於您管理 AWS Glue 資源，您可以選擇將自己的標籤指派至某些 AWS Glue 資源類型。標籤是您指派給 AWS 資源的標籤。每個標籤皆包含由您定義的一個金鑰與一個選用值。您可以在 AWS Glue 中使用標籤，方便您整理和識別資源。標籤可以用來建立成本會計報告，以及限制資源的存取情況。如果您使用的是 AWS Identity and Access Management，您可以控制 AWS 帳戶中哪些使用者具有建立、編輯或刪除標籤的許可。除了呼叫標籤相關 API 的許可外，還需要呼叫連線上標記 API 的 `glue:GetConnection` 許可，以及呼叫資料庫上標記 API 的 `glue:GetDatabase` 許可。如需詳細資訊，請參閱[ABAC 與 AWS Glue](security_iam_service-with-iam.md#security_iam_service-with-iam-tags)。

在 AWS Glue 中，您可以標記下列資源：
+ 連線
+ 資料庫
+ 爬蟲程式
+ 互動式工作階段
+ 開發端點
+ 任務
+ 觸發條件
+ 工作流程
+ 藍圖
+ 機器學習轉換
+ 資料品質規則集
+ 串流結構描述
+ 串流結構描述登錄檔

**注意**  
最佳實務的做法為允許標記這些 AWS Glue 資源，隨時將 `glue:TagResource` 動作包含至您的政策當中。

在 AWS Glue 上使用標籤時，請考慮下列事項。
+ 每個實體最多支援使用 50 個標籤。
+ 在 AWS Glue 中，您以 `{"string": "string" ...}` 格式將標籤指定為金鑰值對清單。
+ 當您在物件上建立標籤時，需要標籤索引鍵，而標籤值為選用。
+ 標籤索引鍵和標籤值皆區分大小寫。
+ 標籤索引鍵與標籤值不得包含 *aws* 字首。這類標籤不可執行任何操作。
+ 最大標籤索引鍵長度為 128 個 UTF-8 形式的 Unicode 字元。標籤索引鍵不得為空或 null。
+ 最大標籤值長度為 256 個 UTF-8 形式的 Unicode 字元。標籤索引鍵可以為空或 null。

## AWS Glue 連線的標記支援
<a name="tag-connections"></a>

您可以限制 `CreateConnection`、`UpdateConnection`、`GetConnection` 和 `DeleteConnection` 動作許可 (根據資源標籤)。這可讓您在需要從 Data Catalog 擷取 JDBC 連線資訊之 JDBC 資料來源 AWS Glue 的任務上實作最低權限存取控制。

**範例使用方式**  
建立具有標籤 【"connection-category"， "dev-test"】 的 AWS Glue 連線。

為 IAM 政策中的 `GetConnection` 動作指定標籤條件。

```
{
   "Effect": "Allow",
   "Action": [
     "glue:GetConnection"
     ],
   "Resource": "*",
   "Condition": {
     "ForAnyValue:StringEquals": {
       "aws:ResourceTag/tagKey": "dev-test"
     }
   }
 }
```

## 範例
<a name="TagExamples"></a>

以下範例會使用指派的標籤來建立任務。

**AWS CLI**

```
aws glue create-job --name job-test-tags --role MyJobRole --command Name=glueetl,ScriptLocation=S3://aws-glue-scripts//prod-job1 
--tags key1=value1,key2=value2
```

**CloudFormation JSON**

```
{
  "Description": "AWS Glue Job Test Tags",
  "Resources": {
    "MyJobRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": [
                  "glue.amazonaws.com"
                ]
              },
              "Action": [
                "sts:AssumeRole"
              ]
            }
          ]
        },
        "Path": "/",
        "Policies": [
          {
            "PolicyName": "root",
            "PolicyDocument": {
              "Version": "2012-10-17",		 	 	 
              "Statement": [
                {
                  "Effect": "Allow",
                  "Action": "*",
                  "Resource": "*"
                }
              ]
            }
          }
        ]
      }
    },
    "MyJob": {
      "Type": "AWS::Glue::Job",
      "Properties": {
        "Command": {
          "Name": "glueetl",
          "ScriptLocation": "s3://aws-glue-scripts//prod-job1"
        },
        "DefaultArguments": {
          "--job-bookmark-option": "job-bookmark-enable"
        },
        "ExecutionProperty": {
          "MaxConcurrentRuns": 2
        },
        "MaxRetries": 0,
        "Name": "cf-job1",
        "Role": {
           "Ref": "MyJobRole",
           "Tags": {
                "key1": "value1", 
                "key2": "value2"
           } 
        }
      }
    }
  }
}
```

**CloudFormation YAML**

```
Description: AWS Glue Job Test Tags
Resources:
  MyJobRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - glue.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: "/"
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action: "*"
                Resource: "*"
  MyJob:
    Type: AWS::Glue::Job
    Properties:
      Command:
        Name: glueetl
        ScriptLocation: s3://aws-glue-scripts//prod-job1
      DefaultArguments:
        "--job-bookmark-option": job-bookmark-enable
      ExecutionProperty:
        MaxConcurrentRuns: 2
      MaxRetries: 0
      Name: cf-job1
      Role:
        Ref: MyJobRole
        Tags:
           key1: value1
           key2: value2
```

如需詳細資訊，請參閱 [AWS 標記策略](https://aws.amazon.com/answers/account-management/aws-tagging-strategies/)。

如需有關如何使用標籤控制存取權的詳細資訊，請參閱[ABAC 與 AWS Glue](security_iam_service-with-iam.md#security_iam_service-with-iam-tags)。

# 使用 EventBridge 自動化 AWS Glue
<a name="automating-awsglue-with-cloudwatch-events"></a>

您可以使用 Amazon EventBridge 自動化您的 AWS 服務，並自動回應系統事件，例如應用程式可用性問題或資源變更。來自 AWS 服務的事件會以近乎即時的方式交付至 EventBridge。您可編寫簡單的規則，來指示您在意的事件，以及當事件符合規則時所要自動執行的動作。可以自動觸發的動作如下：
+ 叫用 AWS Lambda 函數
+ 調用 Amazon EC2 執行命令
+ 將事件轉傳至 Amazon Kinesis Data Streams
+ 啟用 AWS Step Functions 狀態機器
+ 通知 Amazon SNS 主題或 Amazon SQS 佇列

下列是將 EventBridge 與 AWS Glue 搭配使用的部分範例：
+ 在 ETL 任務成功時啟動 Lambda 函數
+ 在 ETL 任務失敗時通知 Amazon SNS 主題

下列 EventBridge 由 AWS Glue 產生。
+ `"detail-type":"Glue Job State Change"` 的事件是針對`SUCCEEDED`、`FAILED`、`TIMEOUT` 和 `STOPPED` 產生。
+ `"detail-type":"Glue Job Run Status"` 的事件是針對 `RUNNING`、`STARTING` 和 `STOPPING` 任務執行產生 (在超過任務延遲通知閾值時)。您必須設定任務延遲通知閾值屬性才能接收這些事件。

  超過任務延遲通知閾值時，每個任務執行狀態只會產生一個事件。
+ `"detail-type":"Glue Crawler State Change"` 的事件是針對 `Started`、`Succeeded` 和 `Failed` 產生。
+ `“detail_type”:“Glue Scheduled Crawler Invocation Failure”` 的事件會在排程編目程式無法啟動時產生。在通知詳細資訊中：
  + `customerId` 包含客戶的帳戶 ID。
  + `crawlerName` 包含無法啟動的編目程式名稱。
  + `errorMessage` 包含調用失敗的例外狀況訊息。
+ 當自動受管資料欄統計資料任務執行無法啟動時，會產生 `“detail_type”:“Glue Auto Statistics Invocation Failure“` 的事件。在通知詳細資訊中：
  + `catalogId` 包含與目錄關聯的 ID。
  + `databaseName` 包含受影響資料庫的名稱。
  + `tableName` 包含受影響資料表的名稱。
  + `errorMessage` 包含調用失敗的例外狀況訊息。
+ 當 (cron) 排程資料欄統計資料任務執行無法啟動時，會產生 `“detail_type”:“Glue Scheduled Statistics Invocation Failure”` 的事件。在通知詳細資訊中：
  + `catalogId` 包含與目錄關聯的 ID。
  + `databaseName` 包含受影響資料庫的名稱。
  + `tableName` 包含受影響資料表的名稱。
  + `errorMessage` 包含調用失敗的例外狀況訊息。
+ 當資料欄統計資料任務執行啟動時，會產生 `“detail_type”:“Glue Statistics Task Started”` 的事件。
+ 當資料欄統計資料任務執行成功時，會產生 `“detail_type”:“Glue Statistics Task Succeeded”` 的事件。
+ 當資料欄統計資料任務執行失敗時，會產生 `“detail_type”:“Glue Statistics Task Failed”` 的事件。
+ `"detail-type":"Glue Data Catalog Database State Change"` 的事件是針對 `CreateDatabase`、`DeleteDatabase`、`CreateTable`、`DeleteTable` 和 `BatchDeleteTable` 產生。例如，某資料表建立或遭刪除時，便會將通知傳送至 EventBridge。請注意，您無法撰寫會根據通知事件的順序或存在的程式，因為這些事件可能會被移出序列或遺漏。盡可能發出事件。在通知詳細資訊中：
  + `typeOfChange` 會包含 API 操作的名稱。
  + `databaseName` 會包含受影響資料庫的名稱。
  + `changedTables` 包含每個通知高達 100 個​受影響資料表的名稱。資料表名稱太長時，可能會建立多個通知。
+ `"detail-type":"Glue Data Catalog Table State Change"` 的事件是針對 `UpdateTable`、`CreatePartition`、`BatchCreatePartition`、`UpdatePartition`、`DeletePartition`、`BatchUpdatePartition` 和 `BatchDeletePartition` 產生。例如，某資料表或分區更新時，便會將通知傳送至 EventBridge。請注意，您無法撰寫會根據通知事件的順序或存在的程式，因為這些事件可能會被移出序列或遺漏。盡可能發出事件。在通知詳細資訊中：
  + `typeOfChange` 會包含 API 操作的名稱。
  + `databaseName` 包含內含受影響資源之資料庫的名稱​。
  + `tableName` 會包含受影響資料表的名稱。
  + `changedPartitions` 會在一個通知中指定高達 100 個受影響的分割區。​ 分割區名稱太長時，可能會建立多個通知。

    例如，如果有兩個分割區金鑰 (`Year` 和 `Month`)，則 ​`"2018,01", "2018,02"` 會修改 `"Year=2018" and "Month=01"`​ 的分割區和 `"Year=2018" and "Month=02"` 的分割區。​

    ```
    {
        "version":"0",
        "id":"abcdef00-1234-5678-9abc-def012345678",
        "detail-type":"Glue Data Catalog Table State Change",
        "source":"aws.glue",
        "account":"123456789012",
        "time":"2017-09-07T18:57:21Z",
        "region":"us-west-2",
        "resources":["arn:aws:glue:us-west-2:123456789012:database/default/foo"],
        "detail":{
            "changedPartitions": [
                "2018,01",
                "2018,02"
            ],
            "databaseName": "default",
            "tableName": "foo",
            "typeOfChange": "BatchCreatePartition"
            }
    }
    ```

如需詳細資訊，請參閱 [Amazon CloudWatch Events 使用者指南](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/)。如需 AWS Glue 特有的事件，請參閱 [AWS Glue 事件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/EventTypes.html#glue-event-types)。

# 監控 AWS Glue 資源
<a name="monitor-resource-metrics"></a>

AWS Glue 設有服務限制，可保護客戶免於意外過度佈建，以及避免意圖增加帳單的惡意動作。這些限制也會保護服務。登入 AWS Service Quota 主控台，客戶可以檢視其目前的資源限制並請求提高 （如適用）。

AWS Glue 可讓您在 Amazon CloudWatch 中以百分比形式檢視服務的資源使用量，並在其上設定 CloudWatch 警示以監控使用量。Amazon CloudWatch 可監控在 Amazon 基礎設施上執行 AWS 的資源和客戶應用程式。這些指標免費提供給您。支援下列指標：
+ 每個帳戶的工作流程數量
+ 每個帳戶的觸發次數
+ 每個帳戶的任務數量
+ 每個帳戶的並行執行任務數量
+ 每個帳戶的藍圖數量
+ 每個帳戶的互動式工作階段數量

## 設定和使用資源指標
<a name="monitor-resource-metrics"></a>

若要使用此功能，您可以前往 Amazon CloudWatch 主控台檢視指標並設定警示。指標位於 AWS/Glue 命名空間下，是實際資源用量計數除以資源配額的百分比。CloudWatch 指標會傳送至您的帳戶，您無需支付任何費用。例如，如果您建立了 10 個工作流程，而您的服務配額允許您最多擁有 200 個工作流程，則使用量為 10/200 = 5%，而在圖表中，您將會看到百分比為 5 的資料點。更具體地說：

```
Namespace: AWS/Glue
Metric name: ResourceUsage
Type: Resource
Resource: Workflow (or Trigger, Job, JobRun, Blueprint, InteractiveSession)
Service: Glue
Class: None
```

![\[資源指標\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/resource_monitoring_1.png)


若要在 CloudWatch 主控台中建立指標的警示：

1. 找到指標後，請前往**圖表化指標**。

1. 按一下**動作**下的**建立警示**。

1. 視需要設定警示。

每當您的資源使用量發生變化 (例如增加或減少) 時，我們都會發出指標。但是，如果您的資源使用量未變動，我們會每小時發出指標，以便您擁有連續的 CloudWatch 圖表。為避免遺失資料點，我們不建議您設定少於 1 小時的時段。

您也可以使用 AWS CloudFormation 設定警示，如下列範例所示。在此範例中，一旦工作流程資源使用量達到 80%，即會觸發警示，將訊息傳送至現有 SNS 主題，您可在此訂閱該主題以取得通知。

```
{
	"Type": "AWS::CloudWatch::Alarm",
	"Properties": {
		"AlarmName": "WorkflowUsageAlarm",
		"ActionsEnabled": true,
		"OKActions": [],
		"AlarmActions": [
			"arn:aws:sns:af-south-1:085425700061:Default_CloudWatch_Alarms_Topic"
		],
		"InsufficientDataActions": [],
		"MetricName": "ResourceUsage",
		"Namespace": "AWS/Glue",
		"Statistic": "Maximum",
		"Dimensions": [{
				"Name": "Type",
				"Value": "Resource"
			},
			{
				"Name": "Resource",
				"Value": "Workflow"
			},
			{
				"Name": "Service",
				"Value": "Glue"
			},
			{
				"Name": "Class",
				"Value": "None"
			}
		],
		"Period": 3600,
		"EvaluationPeriods": 1,
		"DatapointsToAlarm": 1,
		"Threshold": 80,
		"ComparisonOperator": "GreaterThanThreshold",
		"TreatMissingData": "notBreaching"
	}
}
```

# 使用 記錄 AWS Glue API 呼叫 AWS CloudTrail
<a name="monitor-cloudtrail"></a>

AWS Glue 已與 服務整合 AWS CloudTrail，此服務提供使用者、角色或 AWS 服務在 中採取之動作的記錄AWS Glue。CloudTrail 會將 AWS Glue 的所有 API 呼叫擷取為事件。擷取的呼叫包括從 AWS Glue 主控台進行的呼叫，以及針對 AWS Glue API 操作的程式碼呼叫。如果您建立追蹤，就可以將 CloudTrail 事件持續交付到 Amazon S3 儲存貯體，包括 AWS Glue 的事件。即使您未設定追蹤，依然可以透過 CloudTrail 主控台中的 **Event history (事件歷史記錄)** 檢視最新事件。您可以利用 CloudTrail 所收集的資訊來判斷向 AWS Glue 發出的請求，以及發出請求的 IP 地址、人員、時間和其他詳細資訊。

若要進一步了解 CloudTrail，請參閱[AWS CloudTrail 《使用者指南》](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)。

## CloudTrail 中的 AWS Glue 資訊
<a name="monitor-cloudtrail-info"></a>

當您建立 AWS 帳戶時，會在您的帳戶上啟用 CloudTrail。當活動在 中發生時AWS Glue，該活動會與**事件歷史記錄**中的其他服務 AWS 事件一起記錄在 CloudTrail 事件中。您可以在 AWS 帳戶中檢視、搜尋和下載最近的事件。如需詳細資訊，請參閱《使用 CloudTrail 事件歷史記錄檢視事件》[https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)。

若要持續記錄您 AWS 帳戶中的事件，包括 的事件AWS Glue，請建立追蹤。*線索*能讓 CloudTrail 將日誌檔案交付至 Amazon S3 儲存貯體。根據預設，當您在主控台中建立線索時，線索會套用至所有 AWS 區域。線索會記錄 AWS 分割區中所有區域的事件，並將日誌檔案交付至您指定的 Amazon S3 儲存貯體。此外，您可以設定其他 AWS 服務，以進一步分析和處理 CloudTrail 日誌中所收集的事件資料。如需詳細資訊，請參閱下列內容：
+ [為 AWS 您的帳戶建立追蹤](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)
+ [CloudTrail 支援的服務和整合](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-aws-service-specific-topics.html#cloudtrail-aws-service-specific-topics-integrations)
+ [設定 CloudTrail 的 Amazon SNS 通知](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/getting_notifications_top_level.html)
+ [從多個區域接收 CloudTrail 日誌檔案](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html)，以及[從多個帳戶接收 CloudTrail 日誌檔案](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-receive-logs-from-multiple-accounts.html)

CloudTrail 會記錄所有 AWS Glue 動作，並記錄在 [AWS Glue API](aws-glue-api.md) 中。例如，對 `CreateDatabase`、`CreateTable` 和 `CreateScript` 動作發出的呼叫會在 CloudTrail 記錄檔案中產生專案。

每一筆事件或日誌專案都會包含產生請求者的資訊。身分資訊可協助您判斷下列事項：
+ 該請求是否使用根或 IAM 使用者憑證提出。
+ 提出該請求時，是否使用了特定角色或聯合身分使用者的暫時安全憑證。
+ 請求是否由其他 AWS 服務提出。

如需詳細資訊，請參閱 [CloudTrail userIdentity 元素](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html)。

然而，CloudTrail 不會記錄所有與呼叫相關的資訊。例如，特定敏感資訊就不會記錄，像是在連線要求中使用的 `ConnectionProperties`，而下列 API 傳回的回應則會記錄為 `null`。

```
BatchGetPartition       GetCrawlers          GetJobs          GetTable
CreateScript            GetCrawlerMetrics    GetJobRun        GetTables
GetCatalogImportStatus  GetDatabase          GetJobRuns       GetTableVersions
GetClassifier           GetDatabases         GetMapping       GetTrigger
GetClassifiers          GetDataflowGraph     GetObjects       GetTriggers
GetConnection           GetDevEndpoint       GetPartition     GetUserDefinedFunction
GetConnections          GetDevEndpoints      GetPartitions    GetUserDefinedFunctions
GetCrawler              GetJob               GetPlan
```

## 了解 AWS Glue 日誌檔案項目
<a name="monitor-cloudtrail-logs"></a>

追蹤是一種組態，可讓事件以日誌檔案的形式交付至您指定的 Amazon S3 儲存貯體。CloudTrail 日誌檔案包含一或多個日誌專案。一個事件為任何來源提出的單一請求，並包含請求動作、請求的日期和時間、請求參數等資訊。CloudTrail 日誌檔並非依公有 API 呼叫的堆疊追蹤排序，因此不會以任何特定順序出現。

以下範例顯示的是展示 `DeleteCrawler` 動作的 CloudTrail 日誌項目。

```
{
  "eventVersion": "1.05",
  "userIdentity": {
    "type": "IAMUser",
    "principalId": "AKIAIOSFODNN7EXAMPLE",
    "arn": "arn:aws:iam::123456789012:user/johndoe",
    "accountId": "123456789012",
    "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
    "userName": "johndoe"
  },
  "eventTime": "2017-10-11T22:29:49Z",
  "eventSource": "glue.amazonaws.com",
  "eventName": "DeleteCrawler",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "72.21.198.64",
  "userAgent": "aws-cli/1.11.148 Python/3.6.1 Darwin/16.7.0 botocore/1.7.6",
  "requestParameters": {
    "name": "tes-alpha"
  },
  "responseElements": null,
  "requestID": "b16f4050-aed3-11e7-b0b3-75564a46954f",
  "eventID": "e73dd117-cfd1-47d1-9e2f-d1271cad838c",
  "eventType": "AwsApiCall",
  "recipientAccountId": "123456789012"
}
```

以下範例顯示的是展示 `CreateConnection` 動作的 CloudTrail 日誌項目。

```
{
  "eventVersion": "1.05",
  "userIdentity": {
    "type": "IAMUser",
    "principalId": "AKIAIOSFODNN7EXAMPLE",
    "arn": "arn:aws:iam::123456789012:user/johndoe",
    "accountId": "123456789012",
    "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
    "userName": "johndoe"
  },
  "eventTime": "2017-10-13T00:19:19Z",
  "eventSource": "glue.amazonaws.com",
  "eventName": "CreateConnection",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "72.21.198.66",
  "userAgent": "aws-cli/1.11.148 Python/3.6.1 Darwin/16.7.0 botocore/1.7.6",
  "requestParameters": {
    "connectionInput": {
      "name": "test-connection-alpha",
      "connectionType": "JDBC",
      "physicalConnectionRequirements": {
        "subnetId": "subnet-323232",
        "availabilityZone": "us-east-1a",
        "securityGroupIdList": [
          "sg-12121212"
        ]
      }
    }
  },
  "responseElements": null,
  "requestID": "27136ebc-afac-11e7-a7d6-ab217e5c3f19",
  "eventID": "e8b3baeb-c511-4597-880f-c16210c60a4a",
  "eventType": "AwsApiCall",
  "recipientAccountId": "123456789012"
}
```