

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

# EMR Spark MagicCommitProtocol
<a name="emr-spark-magic-commit-protocol"></a>

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

## MagicCommitProtocol
<a name="magic-commit-protocol"></a>

MagicCommitProtocol 是 [FileCommitProtocol](https://dlcdn.apache.org/spark/docs/2.4.2/api/java/org/apache/spark/internal/io/FileCommitProtocol.html) 的替代實作，已針對使用 Amazon S3 S3A 進行最佳化。此通訊協定旨在透過避免在任務和任務遞交階段期間在 Amazon S3 中使用重新命名操作來改善應用程式效能。

MagicCommitProtocol 是使用 S3A 檔案系統時，在 Amazon Elastic Map Reduce (EMR) 上執行的 Spark 使用的預設 FileCommitProtocol 實作。MagicCommitProtocol 在內部使用 [MagicV2Committer ](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/s3a-magicv2-committer.html) 執行檔案寫入 Amazon S3。

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

## 啟用 MagicCommitProtocol
<a name="enabling-magic-commit-protocol"></a>

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

若要使用 S3A 檔案系統，您可以：

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

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

## 停用 MagicCommitProtocol
<a name="disabling-magic-commit-protocol"></a>

1. 您可以透過在 中對其進行硬式編碼`SparkConf`、在 Spark shell 或 `spark-submit`和 `spark-sql`工具中將其作為`--conf`參數傳遞，或在 中將其`spark.sql.execution.datasources.SQLEmrOptimizedCommitProtocol.leverageMagicCommitProtocol`設定為 false`conf/spark-defaults.conf`。如需詳細資訊，請參閱 Apache [Spark 文件中的 Spark 組態](https://spark.apache.org/docs/latest/configuration.html)。

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

   ```
   spark-sql \
     --conf spark.sql.execution.datasources.SQLEmrOptimizedCommitProtocol.leverageMagicCommitProtocol=false \
   -e "INSERT OVERWRITE TABLE target_table SELECT * FROM source_table;"
   ```

1. 使用`spark-defaults`組態分類將 `spark.sql.execution.datasources.SQLEmrOptimizedCommitProtocol.leverageMagicCommitProtocol` 屬性設定為 false。如需詳細資訊，請參閱[設定應用程式](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html)。

## MagicCommitProtocol 考量事項
<a name="magic-commit-considerations"></a>
+ 對於靜態分割區插入，在 Spark 執行器上，MagicCommitProtocol 會對任務嘗試寫入的每個檔案耗用少量記憶體，直到任務遞交或中止為止。在大多數任務中，記憶體的消耗量極少。Spark 驅動程式沒有額外的記憶體需求
+ 對於動態分割區插入，在 Spark 驅動程式上，MagicCommitProtocol 需要記憶體來存放每個遞交檔案的中繼資料資訊，直到任務遞交或中止為止。在大多數作業中，會忽略預設 Spark 驅動程式記憶體設定。

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