本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
EMR Spark MagicCommitProtocol
从 EMR 6.15.0 起,在使用 S3A 文件系统时, MagicCommitProtocol 成 FileCommitProtocol 为 Spark 的默认设置。
MagicCommitProtocol
MagicCommitProtocol 是的另一种实现方式 FileCommitProtocol
MagicCommitProtocol 这是使用 S3A 文件系统时,在 Amazon Elastic Map Reduce (EMR) 上运行的 Spark 使用的默认 FileCommitProtocol 实现。 MagicCommitProtocol 内部使用 MagicV2Committer 向亚马逊 S3 执行文件写入。
对于静态插入操作,在任务提交阶段将文件 MagicCommitProtocol 写入作业的输出位置。相比之下,对于动态插入覆盖操作,任务尝试写入的文件只有在作业提交时才会出现在作业的输出位置。这是通过在任务提交调用时将提交元数据导出回 Spark 驱动程序来实现的。
启用 MagicCommitProtocol
使用 S3A 文件系统时,在 Amazon Elastic Map Reduce (EMR) 上运行的 Spark 默认处于启用状态。 MagicCommitProtocol
要使用 S3A 文件系统,您可以执行以下操作:
-
定义表、分区或目录时,使用文件方案
s3a://。 -
在 core-site.xml 文件中设置配置
fs.s3.impl=org.apache.hadoop.fs.s3a.S3AFileSystem。
禁用 MagicCommitProtocol
-
您可以将
spark.sql.execution.datasources.SQLEmrOptimizedCommitProtocol.leverageMagicCommitProtocol设置为 false,方法是在SparkConf中对其进行硬编码,并在 Spark Shell、spark-submit和spark-sql工具或者conf/spark-defaults.conf中将其作为--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 配置文档中的应用程序属性。