

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 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)，针对在使用 S3A 文件系统时使用 EMR Spark 将文件写入 Amazon S3 进行了优化。此协议旨在通过避免在作业和任务提交阶段使用 Amazon S3 中的重命名操作来提高应用程序性能。

 MagicCommitProtocol 这是 Spark 在使用 S3A 文件系统时在 Amazon Elastic Map Reduce (EMR) 上运行时使用的默认 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>

使用 S MagicCommitProtocol 3A 文件系统时，在 Amazon Elastic Map Reduce (EMR) 上运行的 Spark 默认处于启用状态。

要使用 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. 您可以将 `spark.sql.execution.datasources.SQLEmrOptimizedCommitProtocol.leverageMagicCommitProtocol` 设置为 false，方法是在 `SparkConf` 中对其进行硬编码，并在 Spark Shell、`spark-submit` 和 `spark-sql` 工具或者 `conf/spark-defaults.conf` 中将其作为 `--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 驱动程序的 `spark.driver.memory` 属性和 `spark.executor.memory` 属性来优化内存。作为指导，编写 100,000 个文件的单个任务通常需要额外的 200MB 内存。有关更多信息，请参阅 Apache Spark 配置文档中的[应用程序属性](https://spark.apache.org/docs/latest/configuration.html#application-properties)。