

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

# S3A MagicV2 Committer
<a name="s3a-magicv2-committer"></a>

在 EMR-6.15.0 版本中，Amazon EMR 引入了一种新的 S3A 提交程序类型，称为 MagicV2 提交程序。有关此功能的全面信息，请参阅相关文档章节。

MagicV2 Committer 代表了开源的增强实现 [MagicCommitter](https://javadoc.io/static/org.apache.hadoop/hadoop-aws/3.4.0/org/apache/hadoop/fs/s3a/commit/magic/MagicS3GuardCommitter.html)，专门设计用于优化通过 S3A 文件系统向 Amazon S3 写入文件。与其前身一样，它利用 Amazon S3 的分段上传功能来消除通常与作业和任务提交阶段关联的传统列表和重命名操作。

与原始版本相比 MagicCommitter，MagicV2 提交器在任务提交阶段（而不是作业提交阶段）将文件写入作业的输出位置，从而表现出卓越的性能。这种方法支持分布式文件写入，Amazon S3 上不再需要临时提交元数据存储，从而提高了成本效益。此外，MagicV2 提交程序允许在提交过程中跨多个线程覆盖文件路径，从而提供更高的灵活性。

## 启用 MagicV2 提交程序
<a name="s3a-magicv2-committer-enable"></a>

要启用 MagicV2 提交程序，请在作业配置中传递以下配置，或使用核心站点配置来设置该属性。有关更多信息，请参阅[配置应用程序](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html)。

```
mapreduce.outputcommitter.factory.scheme.s3a=org.apache.hadoop.fs.s3a.commit.S3ACommitterFactory
fs.s3a.committer.magic.enabled=true
fs.s3a.committer.name=magicv2
fs.s3a.committer.magic.track.commits.in.memory.enabled=true
```

对于需要在提交或写入新文件之前覆盖现有目录的工作负载，除了前面提到的配置之外，还需要以下附加配置。

```
fs.s3a.committer.magic.overwrite.and.commit=true
fs.s3a.committer.magic.delete.directory.threads=thread size
```

`threads` 配置的默认值为 `20`。但是，当需要覆盖大量目录时，应该调整此参数以获得更好的性能。此功能仅适用于 EMR-7.2.0 及以上版本。

## 注意事项
<a name="considerations"></a>
+ 如果 Java 虚拟机 (JVM) 在任务运行并向 Amazon S3 写入数据时崩溃或被终止，则更有可能留下不完整的分段上传。因此，当您使用 MagicV2 提交程序时，请务必遵循管理失败的分段上传的最佳实践。有关更多信息，请参阅《Amazon EMR 管理指南》中的[使用 Amazon S3 存储桶的最佳实践](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-upload-s3.html#emr-bucket-bestpractices)部分。
+ 如果某个作业失败，则成功任务提交的任何文件仍然会出现在目标路径中。在这种情况下，在同一目标路径上重新运行作业之前，用户需要手动清理已提交的文件。
+ 在任务被提交或中止之前，MagicV2 提交程序会占用少量内存来存放任务尝试写入的每个文件。在大多数作业中，占用的内存量可以忽略不计。然而，在某些情况下，当单个执行程序进程同时处理大量任务时，可能会造成很大内存压力，容器或执行程序可能会内存不足 (OOM)。增加容器或执行程序内存应该可以解决此问题。