

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

# 在 Amazon EMR 中使用 Iceberg
<a name="iceberg-emr"></a>

Amazon EMR 使用 Apache Spark、Apache Hive、Flink 和 Trino 等開放原始碼架構，在雲端提供 PB 級資料處理、互動式分析和機器學習。

**注意**  
本指南使用 Apache Spark 做為範例。

Amazon EMR 支援多個部署選項：Amazon EMR on EC2、Amazon EMR on EKS、Amazon EMR Serverless 和 Amazon EMR on AWS Outposts。若要為您的工作負載選擇部署選項，請參閱 [Amazon EMR 常見問答集](https://aws.amazon.com/emr/faqs/)。

## 版本和功能相容性
<a name="emr-version"></a>

Amazon EMR 6.5.0 版和更新版本原生支援 Apache Iceberg。如需每個 Amazon EMR 發行版本的支援 Iceberg 版本清單，請參閱 Amazon EMR 文件中的 [Iceberg 發行歷史記錄](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/Iceberg-release-history.html)。另請參閱[使用叢集搭配 Iceberg](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-iceberg-use-cluster.html) 下的章節，了解 Amazon EMR 在不同架構上支援哪些 Iceberg 功能。

我們建議您使用最新的 Amazon EMR 版本，以受益於最新的支援 Iceberg 版本。本節中的程式碼範例和組態假設您使用的是 Amazon EMR 發行版本 **emr-7.8.0。**

## 使用 Iceberg 建立 Amazon EMR 叢集
<a name="emr-cluster"></a>

若要在已安裝 Iceberg 的 Amazon EC2 上建立 Amazon EMR 叢集，請遵循 [Amazon EMR 文件](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-iceberg-use-cluster.html)中的指示。 

具體而言，您的叢集應該設定下列分類：

```
[{
    "Classification": "iceberg-defaults",
    "Properties": {
        "iceberg.enabled": "true"
    }
}]
```

您也可以選擇使用 Amazon EMR Serverless 或 Amazon EMR on EKS 做為 Iceberg 工作負載的部署選項，從 Amazon EMR 6.6.0 開始。

## 在 Amazon EMR 中開發 Iceberg 應用程式
<a name="emr-apps"></a>

若要為您的 Iceberg 應用程式開發 Spark 程式碼，您可以使用 [Amazon EMR Studio](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio.html)，這是適用於在 Amazon EMR 叢集上執行之全受管 Jupyter 筆記本的 Web 整合開發環境 (IDE)。 

### 使用 Amazon EMR Studio 筆記本
<a name="emr-notebooks"></a>

您可以在 Amazon EMR Studio 工作區筆記本中以互動方式開發 Spark 應用程式，並將這些筆記本連接到 EC2 叢集上的 Amazon EMR 或 Amazon EMR on EKS 受管端點。如需設定適用於 [Amazon EMR on EC2 ](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-set-up.html)和 [Amazon EMR on EKS 的 EMR Studio ](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-create-eks-cluster.html)的說明，請參閱 AWS 服務 文件。

若要在 EMR Studio 中使用 Iceberg，請遵循下列步驟： 

1. 啟動已啟用 Iceberg 的 Amazon EMR 叢集，如[使用已安裝 Iceberg 的叢集](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-iceberg-use-cluster.html)所述。 

1. 設定 EMR Studio。如需說明，請參閱[設定 Amazon EMR Studio](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-set-up.html)。

1. 開啟 EMR Studio 工作區筆記本，並執行下列程式碼做為筆記本中的第一個儲存格，以設定 Spark 工作階段以使用 Iceberg：

   ```
   %%configure -f
   {
       "conf": {
           "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog",
           "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/",
           "spark.sql.catalog.<catalog_name>.type": "glue",
           "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
       }
   }
   ```

   其中：
   + `<catalog_name>` 是您的 Iceberg Spark 工作階段目錄名稱。將其取代為您選擇的名稱，並記得在所有與此目錄相關聯的組態中變更參考。在程式碼中，您可以使用完整資料表名稱來參考 Iceberg 資料表，包括 Spark 工作階段目錄名稱，如下所示：

     ```
     <catalog_name>.<database_name>.<table_name> 
     ```

     或者，您可以將預設目錄變更為您透過將 設定為目錄名稱定義的 Iceberg `spark.sql.defaultCatalog` 目錄。這種第二種方法可讓您參考沒有目錄字首的資料表，這可以簡化您的查詢。
   + `<catalog_name>.warehouse` 會指向您要存放資料和中繼資料的 Amazon S3 路徑。
   + 若要將目錄設為 AWS Glue Data Catalog，請將 `spark.sql.catalog.<catalog_name>.type`設定為 `glue`。需要此金鑰才能指向任何自訂目錄實作的實作類別。本指南稍後[的一般最佳實務](best-practices-general.md)章節說明不同的 Iceberg 支援的目錄。

1. 您現在可以開始在筆記本中以互動方式開發適用於 Iceberg 的 Spark 應用程式，如同任何其他 Spark 應用程式一樣。

如需使用 Amazon EMR Studio 設定 Spark for Apache Iceberg 的詳細資訊，請參閱部落格文章[在 Amazon EMR 上使用 Apache Iceberg 建置高效能、符合 ACID 規範、不斷發展的資料湖](https://aws.amazon.com/blogs/big-data/build-a-high-performance-acid-compliant-evolving-data-lake-using-apache-iceberg-on-amazon-emr/)。 

### 在 Amazon EMR 中執行 Iceberg 任務
<a name="emr-running-iceberg"></a>

開發 Iceberg 工作負載的 Spark 應用程式程式碼後，您可以在支援 Iceberg 的任何 Amazon EMR 部署選項上執行它 （請參閱 [Amazon EMR 常見問答集](https://aws.amazon.com/emr/faqs/#Deployment_options))。

如同其他 Spark 任務，您可以透過新增步驟或以互動方式將 Spark 任務提交至主節點，將工作提交至 EC2 叢集上的 Amazon EMR。若要執行 Spark 任務，請參閱下列 Amazon EMR 文件頁面：
+ 如需將工作提交至 EC2 叢集上 Amazon EMR 的不同選項概觀，以及每個選項的詳細指示，請參閱將[工作提交至叢集](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-work-with-steps.html)。
+ 對於 Amazon EMR on EKS，請參閱[使用 StartJobRun 執行 Spark 任務](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs.html)。
+ 對於 EMR Serverless，請參閱[執行中任務](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/jobs.html)。

以下各節提供每個 Amazon EMR 部署選項的範例。

#### EC2 上的 Amazon EMR
<a name="emr-ec2"></a>

您可以使用下列步驟來提交 Iceberg Spark 任務：

1. 在工作站上使用`emr_step_iceberg.json`下列內容建立 檔案：

   ```
   [{
       "Name": "iceberg-test-job",
       "Type": "spark",
       "ActionOnFailure": "CONTINUE",
       "Args": [
           "--deploy-mode",
           "client",
           "--conf",
           "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
           "--conf",
           "spark.sql.catalog.<catalog_name>=org.apache.iceberg.spark.SparkCatalog",
           "--conf",
           "spark.sql.catalog.<catalog_name>.type=glue",
           "--conf",
           "spark.sql.catalog.<catalog_name>.warehouse=s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/",
           "s3://YOUR-BUCKET-NAME/code/iceberg-job.py"
       ]
   }]
   ```

1. 透過自訂以粗體反白顯示的 Iceberg 組態選項，修改特定 Spark 任務的組態檔案。

1. 使用 AWS Command Line Interface (AWS CLI) 提交步驟。在 `emr_step_iceberg.json` 檔案所在的目錄中執行 命令。

   ```
   aws emr add-steps ‐‐cluster-id <cluster_id> ‐‐steps file://emr_step_iceberg.json
   ```

#### Amazon EMR Serverless
<a name="emr-serverless"></a>

若要使用 將 Iceberg Spark 任務提交至 EMR Serverless AWS CLI：

1. 在工作站上使用`emr_serverless_iceberg.json`下列內容建立 檔案：

   ```
   {
       "applicationId": "<APPLICATION_ID>",
       "executionRoleArn": "<ROLE_ARN>",
       "name": "iceberg-test-job",
       "jobDriver": {
           "sparkSubmit": {
               "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py",
               "entryPointArguments": []
           }
       },
       "configurationOverrides": {
           "applicationConfiguration": [{
               "classification": "spark-defaults",
               "properties": {
                   "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
                   "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog",
                   "spark.sql.catalog.<catalog_name>.type": "glue",
                   "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/",
                   "spark.jars":"/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar",
                   "spark.hadoop.hive.metastore.client.factory.class":"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"
               }
           }],
           "monitoringConfiguration": {
               "s3MonitoringConfiguration": {
                   "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/"
               }
           }
       }
   }
   ```

1. 透過自訂以粗體反白顯示的 Iceberg 組態選項，修改特定 Spark 任務的組態檔案。

1. 使用 提交任務 AWS CLI。在 `emr_serverless_iceberg.json` 檔案所在的目錄中執行 命令：

   ```
   aws emr-serverless start-job-run ‐‐cli-input-json file://emr_serverless_iceberg.json
   ```

若要使用 EMR Studio 主控台將 Iceberg Spark 任務提交至 EMR Serverless：

1. 請遵循 [EMR Serverless 文件](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/jobs-studio.html)中的指示。

1. 對於**任務組態**，請使用為 提供的 Spark 的 Iceberg 組態， AWS CLI 並自訂 Iceberg 的反白欄位。如需詳細說明，請參閱 Amazon [EMR 文件中的將 Apache Iceberg 與 EMR Serverless](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/using-iceberg.html) 搭配使用。

#### Amazon EMR on EKS
<a name="emr-eks"></a>

若要使用 將 Iceberg Spark 任務提交至 Amazon EMR on EKS AWS CLI：

1. 在工作站上使用`emr_eks_iceberg.json`下列內容建立 檔案：

   ```
   {
       "name": "iceberg-test-job",
       "virtualClusterId": "<VIRTUAL_CLUSTER_ID>",
       "executionRoleArn": "<ROLE_ARN>",
       "releaseLabel": "emr-6.9.0-latest",
       "jobDriver": {
           "sparkSubmitJobDriver": {
               "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py",
               "entryPointArguments": [],
               "sparkSubmitParameters": "--jars local:///usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar"
           }
       },
       "configurationOverrides": {
           "applicationConfiguration": [{
               "classification": "spark-defaults",
               "properties": {
                   "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
                   "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog",
                   "spark.sql.catalog.<catalog_name>.type": "glue",
                   "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/",
                   "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"
               }
           }],
           "monitoringConfiguration": {
               "persistentAppUI": "ENABLED",
               "s3MonitoringConfiguration": {
                   "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/"
               }
           }
       }
   }
   ```

1. 透過自訂以粗體反白顯示的 Iceberg 組態選項，修改 Spark 任務的組態檔案。

1. 使用 提交任務 AWS CLI。在 `emr_eks_iceberg.json` 檔案所在的目錄中執行下列命令：

   ```
   aws emr-containers start-job-run ‐‐cli-input-json file://emr_eks_iceberg.json
   ```

如需詳細說明，請參閱《[Amazon EMR on EKS 文件》中的將 Apache Iceberg 與](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/tutorial-iceberg.html) Amazon EMR on EKS 搭配使用。 

## Amazon EMR 的最佳實務
<a name="emr-best-practices"></a>

本節提供在 Amazon EMR 中調校 Spark 任務的一般準則，以最佳化讀取和寫入資料至 Iceberg 資料表。如需 Iceberg 特定的最佳實務，請參閱本指南稍後的[最佳實務](best-practices.md)一節。
+ **使用最新版本的 Amazon EMR** – Amazon EMR 隨 Amazon EMR Spark 執行期立即提供 Spark 最佳化。 AWS 會在每次新版本中改善 Spark 執行期引擎的效能。
+ **判斷 Spark 工作負載的最佳基礎設施** – Spark 工作負載可能需要不同類型的硬體，才能確保最佳效能。Amazon EMR [支援多種執行個體類型](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-supported-instance-types.html) （例如運算最佳化、記憶體最佳化、一般用途和儲存最佳化），以涵蓋所有類型的處理需求。當您加入新的工作負載時，我們建議您使用 M5 或 M6g 等一般執行個體類型進行基準測試。從 Ganglia 和 Amazon CloudWatch 監控作業系統 (OS) 和 YARN 指標，以判斷尖峰負載時的系統瓶頸 (CPU、記憶體、儲存體和 I/O)，並選擇適當的硬體。
+ **調校 **`spark.sql.shuffle.partitions` – 將 `spark.sql.shuffle.partitions` 屬性設定為叢集中的虛擬核心 (vCores) 總數或該值的倍數 （通常為 vCores總數的 1 到 2 倍）。當您使用雜湊和範圍分割做為寫入分佈模式時，此設定會影響 Spark 的平行處理。它會在寫入之前請求隨機播放來組織資料，以確保分割區對齊。
+ **啟用受管擴展** – 對於幾乎所有使用案例，我們建議您啟用受管擴展和動態配置。不過，如果您的工作負載具有可預測的模式，我們建議您停用自動擴展和動態配置。啟用受管擴展時，建議您使用 Spot 執行個體來降低成本。針對任務節點使用 Spot 執行個體，而非核心節點或主節點。當您使用 Spot 執行個體時，請使用每個機群具有多個執行個體類型的執行個體機群，以確保 Spot 可用性。
+ **盡可能使用廣播聯結** – 廣播 (mapside) 聯結是最理想的聯結，只要其中一個資料表夠小，足以容納您最小節點的記憶體 （依 MBs順序），而且您正在執行等式 (=) 聯結。支援除了完整外部聯結以外的所有聯結類型。廣播聯結會將較小的資料表廣播為記憶體中所有工作者節點的雜湊資料表。小型資料表廣播之後，您就無法對其進行變更。由於雜湊資料表位於 Java 虛擬機器 (JVM) 中的本機，因此可以使用雜湊聯結，根據聯結條件輕鬆與大型資料表合併。廣播聯結可提供高效能，因為隨機播放額外負荷最少。
+ **調校垃圾收集器** – 如果垃圾收集 (GC) 週期緩慢，請考慮從預設平行垃圾收集器切換到 G1GC，以獲得更好的效能。若要最佳化 GC 效能，您可以微調 GC 參數。若要追蹤 GC 效能，您可以使用 Spark UI 進行監控。理想情況下，GC 時間應小於或等於總任務執行時間的 1%。