EMR Spark MagicCommitProtocol - Amazon EMR

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

EMR Spark MagicCommitProtocol

從 EMR 6.15.0 之後,使用 S3A 檔案系統時,MagicCommitProtocol 會成為 Spark 的預設 FileCommitProtocol。

MagicCommitProtocol

MagicCommitProtocol 是 FileCommitProtocol 的替代實作,已針對使用 Amazon S3 S3A 進行最佳化。此通訊協定旨在透過避免在任務和任務遞交階段期間在 Amazon S3 中使用重新命名操作來改善應用程式效能。

MagicCommitProtocol 是使用 S3A 檔案系統時,在 Amazon Elastic Map Reduce (EMR) 上執行的 Spark 使用的預設 FileCommitProtocol 實作。MagicCommitProtocol 在內部使用 MagicV2Committer 執行檔案寫入 Amazon S3。

對於靜態插入操作,MagicCommitProtocol 在任務遞交階段將檔案寫入任務的輸出位置。相反地,對於動態插入覆寫操作,任務嘗試寫入的檔案只會在任務遞交時出現在任務的輸出位置。這是透過在任務遞交呼叫時將遞交中繼資料匯出回 Spark 驅動程式來實現的。

啟用 MagicCommitProtocol

使用 S3A 檔案系統時,在 Amazon Elastic Map Reduce (EMR) 上執行的 Spark 預設會啟用 MagicCommitProtocol。

若要使用 S3A 檔案系統,您可以:

  1. 使用定義資料表、分割區或目錄s3a://時所用的檔案配置。

  2. 在 core-site.xml fs.s3.impl=org.apache.hadoop.fs.s3a.S3AFileSystem中設定組態。

停用 MagicCommitProtocol

  1. 您可以在 中將其硬式編碼SparkConf、在 Spark shell 或 spark-submitspark-sql工具中將其做為--conf參數傳遞,或在 中將其spark.sql.execution.datasources.SQLEmrOptimizedCommitProtocol.leverageMagicCommitProtocol設定為 falseconf/spark-defaults.conf。如需詳細資訊,請參閱 Apache Spark 文件中的 Spark 組態

    下列範例示範如何在執行spark-sql命令時停用 MagicCommitProtocol。

    spark-sql \ --conf spark.sql.execution.datasources.SQLEmrOptimizedCommitProtocol.leverageMagicCommitProtocol=false \ -e "INSERT OVERWRITE TABLE target_table SELECT * FROM source_table;"
  2. 使用spark-defaults組態分類將 spark.sql.execution.datasources.SQLEmrOptimizedCommitProtocol.leverageMagicCommitProtocol 屬性設定為 false。如需詳細資訊,請參閱設定應用程式

MagicCommitProtocol 考量事項

  • 對於靜態分割區插入,在 Spark 執行器上,MagicCommitProtocol 會對任務嘗試寫入的每個檔案耗用少量記憶體,直到任務遞交或中止為止。在大多數任務中,記憶體的消耗量極少。Spark 驅動程式沒有額外的記憶體需求

  • 對於動態分割區插入,在 Spark 驅動程式上,MagicCommitProtocol 需要記憶體來儲存每個遞交檔案的中繼資料資訊,直到任務遞交或中止為止。在大多數作業中,會忽略預設 Spark 驅動程式記憶體設定。

    對於具有寫入大量檔案之長時間執行任務的作業,遞交通訊協定耗用的記憶體量可能會很明顯,並需要調整配置給 Spark,特別是 Spark 執行器的記憶體。您可以使用 spark.driver.memory 屬性調整 Spark 驅動程式的記憶體,或使用 spark.executor.memory 屬性調整 Spark 執行器的記憶體。作為準則,撰寫 100,000 個檔案的單一任務通常需要額外的 200MB 記憶體。如需詳細資訊,請參閱 Apache Spark 組態文件中的應用程式屬性