本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
EMR Spark MagicCommitProtocol
从 EMR 6.15.0 起,在使用 S3A 文件系统时,它将 MagicCommitProtocol 成为 Spark FileCommitProtocol 的默认设置。
MagicCommitProtocol
MagicCommitProtocol 是的另一种实现方式 FileCommitProtocol
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 文件系统,您可以:
-
使用与定义表、分区或目录
s3a://
时相同的文件架构。 -
在 core-site.xml
fs.s3.impl=org.apache.hadoop.fs.s3a.S3AFileSystem
中设置配置。
禁用 MagicCommitProtocol
-
你可以
spark.sql.execution.datasources.SQLEmrOptimizedCommitProtocol.leverageMagicCommitProtocol
将其设置为 false,方法是在 a 中对其进行硬编码SparkConf
,将其作为--conf
参数传递给 Spark shell 或spark-submit
和spark-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;"
-
使用
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 配置文档中的应用程序属性。