EMR Spark MagicCommitProtocol - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

EMR Spark MagicCommitProtocol

从 EMR 6.15.0 起,在使用 S3A 文件系统时,它将 MagicCommitProtocol 成为 Spark FileCommitProtocol 的默认设置。

MagicCommitProtocol

MagicCommitProtocol 是的另一种实现方式 FileCommitProtocol,针对在使用 S3A 文件系统时使用 EMR Spark 将文件写入 Amazon S3 进行了优化。该协议旨在通过避免在任务和任务提交阶段在 Amazon S3 中使用重命名操作来提高应用程序性能。

MagicCommitProtocol 这是 Spark 在使用 S3A 文件系统时在 Amazon Elastic Map Reduce (EMR) 上运行时使用的默认 FileCommitProtocol 实现。 MagicCommitProtocol 内部使用 magicv2Committer 来执行向 Amazon S3 写入文件。

对于静态插入操作,会在任务提交阶段将文件 MagicCommitProtocol 写入作业的输出位置。相比之下,对于动态插入覆盖操作,由任务尝试写入的文件仅在作业提交后出现在作业的输出位置。这是通过在任务提交调用时将提交元数据导出回 Spark 驱动程序来实现的。

正在启用 MagicCommitProtocol

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

要使用 S3A 文件系统,您可以:

  1. 使用与定义表、分区或目录s3a://时相同的文件架构。

  2. 在 core-site.xml fs.s3.impl=org.apache.hadoop.fs.s3a.S3AFileSystem 中设置配置。

禁用 MagicCommitProtocol

  1. 你可以spark.sql.execution.datasources.SQLEmrOptimizedCommitProtocol.leverageMagicCommitProtocol将其设置为 false,方法是在 a 中对其进行硬编码SparkConf,将其作为--conf参数传递给 Spark shell 或spark-submitspark-sql工具,或者传入conf/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 驱动程序的 spark.driver.memory 属性和 spark.executor.memory 属性来优化内存。作为指导原则,写入 100,000 个文件的单个任务通常需要额外的 200MB 内存。有关更多信息,请参阅 Apache Spark 配置文档中的应用程序属性