本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Amazon EMR 中使用 Apache Iceberg
Amazon EMR 使用 Apache Spark、Apache Hive、Flink 和 Trino 等開放原始碼架構,在雲端提供 PB 級資料處理、互動式分析和機器學習。
注意
本指南使用 Apache Spark 做為範例。
Amazon EMR 支援多個部署選項:Amazon EC2 上的 Amazon EMR、Amazon EKS 上的 Amazon EMR、Amazon EMR Serverless 和 上的 Amazon EMR AWS Outposts。若要為您的工作負載選擇部署選項,請參閱 Amazon EMR 常見問答集
版本和功能相容性
Amazon EMR 6.5.0 版和更新版本原生支援 Apache Iceberg。如需每個 Amazon EMR 發行版本的支援 Iceberg 版本清單,請參閱 Amazon EMR 文件中的 Iceberg 發行歷史記錄。另請參閱使用叢集搭配 Iceberg 下的章節,了解 Amazon EMR 在不同架構上支援哪些 Iceberg 功能。
我們建議您使用最新的 Amazon EMR 版本,以受益於最新的支援 Iceberg 版本。本節中的程式碼範例和組態假設您使用的是 Amazon EMR 發行版本 emr-7.8.0。
使用 Iceberg 建立 Amazon EMR 叢集
若要在已安裝 Iceberg 的 Amazon EC2 上建立 Amazon EMR 叢集,請遵循 Amazon EMR 文件中的指示。
具體而言,您的叢集應該設定下列分類:
[{ "Classification": "iceberg-defaults", "Properties": { "iceberg.enabled": "true" } }]
您也可以選擇從 Amazon EMR 6.6.0 開始,使用 Amazon EMR Serverless 或 Amazon EMR on Amazon EKS 做為 Iceberg 工作負載的部署選項。
在 Amazon EMR 中開發 Iceberg 應用程式
若要為您的 Iceberg 應用程式開發 Spark 程式碼,您可以使用 Amazon EMR Studio,這是適用於在 Amazon EMR 叢集上執行之全受管 Jupyter 筆記本的 Web 整合開發環境 (IDE)。
使用 Amazon EMR Studio 筆記本
您可以在 Amazon EMR Studio 工作區筆記本中以互動方式開發 Spark 應用程式,並將這些筆記本連接到 Amazon EC2 叢集上的 Amazon EMR 或 Amazon EKS 受管端點上的 Amazon EMR。如需在 Amazon EC2 上設定 Amazon EMR Studio 和在 Amazon EKS 上設定 Amazon EMR 的說明,請參閱 AWS 服務 文件。
若要在 EMR Studio 中使用 Iceberg,請遵循下列步驟:
-
啟動已啟用 Iceberg 的 Amazon EMR 叢集,如使用已安裝 Iceberg 的叢集中所指示。
-
設定 EMR Studio。如需說明,請參閱設定 Amazon EMR Studio。
-
開啟 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
。需要此金鑰才能指向任何自訂目錄實作的實作類別。本指南稍後的一般最佳實務章節說明不同的 Iceberg 支援的目錄。
-
-
您現在可以開始在筆記本中以互動方式開發適用於 Iceberg 的 Spark 應用程式,如同任何其他 Spark 應用程式一樣。
如需使用 Amazon EMR Studio 設定 Spark for Apache Iceberg 的詳細資訊,請參閱部落格文章在 Amazon EMR 上使用 Apache Iceberg 建置高效能、符合 ACID 規範、不斷發展的資料湖
在 Amazon EMR 中執行 Iceberg 任務
為 Iceberg 工作負載開發 Spark 應用程式碼後,您可以在支援 Iceberg 的任何 Amazon EMR 部署選項上執行它 (請參閱 Amazon EMR 常見問答集
如同其他 Spark 任務,您可以透過新增步驟或以互動方式將 Spark 任務提交至主節點,將工作提交至 Amazon EC2 叢集上的 Amazon EMR。若要執行 Spark 任務,請參閱下列 Amazon EMR 文件頁面:
-
如需將工作提交至 Amazon EC2 叢集的不同選項概觀,以及每個選項的詳細指示,請參閱將工作提交至叢集。
-
對於 Amazon EMR on Amazon EKS,請參閱使用 StartJobRun 執行 Spark 任務。
-
對於 Amazon EMR Serverless,請參閱執行中任務。
以下各節提供每個 Amazon EMR 部署選項的範例。
Amazon EC2 上的 Amazon EMR
您可以使用下列步驟來提交 Iceberg Spark 任務:
-
在工作站上使用
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" ] }]
-
透過自訂以粗體反白顯示的 Iceberg 組態選項,修改特定 Spark 任務的組態檔案。
-
使用 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
若要使用 將 Iceberg Spark 任務提交至 Amazon EMR Serverless AWS CLI:
-
在工作站上使用
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/" } } } }
-
透過自訂以粗體反白顯示的 Iceberg 組態選項,修改特定 Spark 任務的組態檔案。
-
使用 提交任務 AWS CLI。在
emr_serverless_iceberg.json
檔案所在的目錄中執行 命令:aws emr-serverless start-job-run ‐‐cli-input-json file://emr_serverless_iceberg.json
若要使用 EMR Studio 主控台將 Iceberg Spark 任務提交至 Amazon EMR Serverless:
-
遵循 Amazon EMR Serverless 文件中的指示。
-
對於任務組態,請使用為 提供的 Spark 的 Iceberg 組態, AWS CLI 並自訂 Iceberg 的反白欄位。如需詳細說明,請參閱 Amazon EMR 文件中的將 Apache Iceberg 與 EMR Serverless 搭配使用。
Amazon EMR on Amazon EKS
若要使用 向 Amazon EMR on Amazon EKS 提交 Iceberg Spark 任務 AWS CLI:
-
在工作站上使用
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/" } } } }
-
透過自訂以粗體反白顯示的 Iceberg 組態選項,修改 Spark 任務的組態檔案。
-
使用 提交任務 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 與 Amazon EMR on EKS 搭配使用。
Amazon EMR 的最佳實務
本節提供在 Amazon EMR 中調校 Spark 任務的一般準則,以最佳化讀取和寫入資料至 Iceberg 資料表。如需 Iceberg 特定的最佳實務,請參閱本指南稍後的最佳實務一節。
-
使用最新版本的 Amazon EMR – Amazon EMR 透過 Amazon EMR Spark 執行期提供立即可用的 Spark 最佳化。 AWS 會在每次新版本中改善 Spark 執行期引擎的效能。
-
判斷 Spark 工作負載的最佳基礎設施 – Spark 工作負載可能需要不同類型的硬體,才能確保最佳效能。Amazon EMR 支援多種執行個體類型 (例如運算最佳化、記憶體最佳化、一般用途和儲存最佳化),以涵蓋所有類型的處理需求。當您加入新的工作負載時,我們建議您使用 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%。