Amazon EMR
Amazon EMR 版本指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用经 EMRFS S3 优化的提交程序

经 EMRFS S3 优化的提交程序是 OutputCommitter 的一种实现替代品,该程序已针对在使用 EMRFS 时向 Amazon S3 位置写入文件进行了优化。提交程序适用于 Amazon EMR 版本 5.19.0 及更高版本,默认情况下将启用 Amazon EMR 5.20.0 及更高版本。经 EMRFS S3 优化的提交程序用于 Spark 作业,该作业使用 Spark SQL、DataFrame 或 Dataset 写入 Parquet 文件。经 EMRFS S3 优化的提交程序具有以下优势:

  • 通过避免在作业和任务提交阶段列出并重命名在 Amazon S3 中完成的操作来提高应用程序性能。

  • 让您在 Spark 作业中安全地启用幂等任务的推测执行,以帮助降低任务拖后腿的性能影响。

  • 避免可能在作业和任务提交阶段发生的 Amazon S3 最终一致性相关问题,并帮助在任务失败情况下提高作业正确性。

在向 HDFS 写入数据、使用 S3A 文件系统、使用 Parquet 之外的输出格式(如 ORC 或文本)或者使用 MapReduce 或 Spark 的 RDD API 时,提交程序不会生效。

只要使用了 Spark 的内置 Parquet 支持,经 EMRFS S3 优化的 Parquet 提交程序就会用于 Hive 元存储 Parquet 表。这默认在 Spark(spark.sql.hive.convertMetastoreParquet 设置为 true)中启用。有关更多信息,请参阅 Apache Spark SQL、DataFrame 和 Dataset 指南中的 Hive 元存储 Parquet 表转换。已知限制为已分区 Hive 表不支持 Spark 的内置 Parquet。因此,经 EMRFS S3 优化的提交程序不会用于此类表。

经 EMRFS S3 优化的提交程序和分段上传

要使用经 EMRFS S3 优化的提交程序,则必须在 Amazon EMR 中启用分段上传。默认启用分段上传。需要时,您可以重新启用它。有关更多信息,请参阅 Amazon EMR 管理指南中的为 Amazon S3 配置分段上传

经 EMRFS S3 优化的提交程序利用分段上传类似于事务的特征,来确保由任务写入的文件在任务提交后尝试仅显示在作业的输出位置。通过以这种方式使用分段上传,提交程序可通过默认的 FileOutputCommitter 算法版本 2 提高任务提交性能。使用经 EMRFS S3 优化的提交程序时,有一些与传统分段上传行为的关键区别需要考虑:

  • 无论文件大小如何,分段上传都会执行。这不同于 EMRFS 的默认行为,其中 fs.s3n.multipart.uploads.split.size 属性在触发分段上传时,控制文件大小。

  • 在任务提交或中止之前,分段上传在较长时间内都保持在未完成状态。这不同于 EMRFS 的默认行为,其中分段上传在任务完成写入给定文件时完成。

由于这些区别,如果 Spark Executor JVM 在任务正在运行或将数据写入到 Amazon S3 时发生崩溃或被终止,未完成的分段上传更可能被留下来。因此,当您使用经 EMRFS S3 优化的提交程序时,请务必遵循管理失败的分段上传的最佳实践。有关更多信息,请参阅 Amazon EMR 管理指南中的使用 Amazon S3 存储桶的最佳实践

作业调整注意事项

在任务被提交或中止之前,经 EMRFS S3 优化的提交程序会占用少量内存来存放任务尝试写入的每个文件。在大多数作业中,占用的内存量可以忽略不计。对于包含写入大量文件的长期任务的作业,提交程序占用的内存可能很大,需要调整为 Spark 执行程序分配的内存。您可以使用 spark.executor.memory 属性调整执行程序内存。作为指导,编写 100000 个文件的单个任务通常需要额外的 100 MB 内存。有关更多信息,请参阅 Apache Spark 文档中的应用程序属性

为 Amazon EMR 5.19.0 启用经 EMRFS S3 优化的提交程序

对于 Amazon EMR 5.20.0 及更高版本,经 EMRFS S3 优化的提交程序将默认处于启用状态。 spark.sql.parquet.fs.optimized.committer.optimization-enabled 属性是一个布尔值,可启用或禁用提交程序。如果使用的是 Amazon EMR 5.19.0,可在创建集群时或在 Spark 中将此属性设置为 true。您可以通过相同的方法将该属性设置为 false 来禁用提交程序。

在使用 Amazon EMR 5.19.0 创建集群时启用经 EMRFS S3 优化的提交程序

使用 spark-defaults 配置分类将 spark.sql.parquet.fs.optimized.committer.optimization-enabled 属性设置为 true。有关更多信息,请参阅 配置应用程序

使用 Amazon EMR 5.19.0 从 Spark 启用经 EMRFS S3 优化的提交程序

您可以将 spark.sql.parquet.fs.optimized.committer.optimization-enabled 设置为 true,方法是在 SparkConf 中对其进行硬编码,并在 Spark Shell 或 spark-submitspark-sql 工具或 conf/spark-defaults.conf 中将其作为 --conf 参数进行传递。有关更多信息,请参阅 Apache Spark 文档中的 Spark 配置

以下示例显示了如何在运行 spark-sql 命令的同时启用提交程序。

spark-sql \ --conf spark.sql.parquet.fs.optimized.committer.optimization-enabled=true \ -e "INSERT OVERWRITE TABLE target_table SELECT * FROM source_table;"