

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

# S3A 文件系统
<a name="emr-s3a-file"></a>

本节介绍使用 S3A 文件系统时在 Amazon Elastic Map Reduce (EMR) 上运行的 Spark 的协议。

# 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)。增加容器或执行程序内存应该可以解决此问题。

# 迁移指南：EMRFS 到 S3A 文件系统
<a name="emr-s3a-migrate"></a>

从 EMR-7.10.0 版本开始，S3A 文件系统是所有 S3 文件方案 EMR 集群的默认 filesystem/s3 连接器，包括以下项：
+ **s3://**
+ **s3n://**
+ **s3a://**

此更改适用于所有 EMR 部署，包括 EKS 和 EMR S EC2 erverless。

如果您想继续使用 EMRFS，则可以通过向 `core-site.xml` 配置文件添加以下属性进行配置：

```
<property>
  <name>fs.s3.impl</name>
  <value>com.amazon.ws.emr.hadoop.fs.EmrFileSystem</value>
</property>
```

## 将现有 EMRFS 配置迁移到 S3A 配置
<a name="emr-s3a-migration-of-existing-emrfs-configurations"></a>

**注意**  
当满足特定条件时，Amazon EMR 会在 EMRFS 和 S3A 之间实施自动配置映射。当未定义 S3A 配置，但存在相应的 EMRFS 配置时，会自动发生映射过程。此自动映射功能会扩展到存储桶级别配置，从而实现 EMRFS 和 S3A 设置之间的无缝集成。举例来说，当你使用 'fs.s3.bucket.amzn-s3-demo-bucket1 在 EMRFS 中配置特定于存储桶的加密设置时。 serverSideEncryption.kms.keyID '的值为 “XYZ”，通过将指定存储桶 amzn-s3-demo-bucket1 的 “fs.s3a.encryption.key” 设置为 “XYZ”，系统会自动将其映射到等效的 S3A 配置。

以下预定义的 EMRFS 配置集将自动转换为相应的 S3A 配置等效项。目前通过集群或作业覆盖实现的任何配置都将无缝转换为 S3A 文件系统，无需额外的手动配置或修改。

默认情况下，此配置映射功能会自动激活。希望禁用此自动转换的用户可以通过向 core-site.xml 配置文件添加以下属性来实现。

```
<property>
  <name>fs.s3a.emrfs.compatibility.enable</name>
  <value>false</value>
</property>
```

**注意**  
来自 EMRFS 的加密密钥映射 (fs.s3. serverSideEncryption.kms.keyID 或 fs.s3.cse.kems.keyID) 到 S3A (fs.s3a.encryption.key.key) 只有在任一文件系统上启用 SSE-KMS 或 CSE-KMS 加密时才会出现。


**EMRFS 到 S3A 配置映射**  

| EMRFS 配置名称 | S3A 配置名称 | 
| --- | --- | 
| fs.s3.aimd.adjustWindow | fs.s3a.aimd.adjustWindow | 
| fs.s3.aimd.enabled | fs.s3a.aimd.enabled | 
| fs.s3.aimd.increaseIncrement | fs.s3a.aimd.increaseIncrement | 
| fs.s3.aimd.initialRate | fs.s3a.aimd.initialRate | 
| fs.s3.aimd.maxAttempts | fs.s3a.aimd.maxAttempts | 
| fs.s3.aimd.minRate | fs.s3a.aimd.minRate | 
| fs.s3.aimd.reductionFactor | fs.s3a.aimd.reductionFactor | 
| fs.s3.sts.endpoint | fs.s3a.assumed.role.sts.endpoint | 
| fs.s3.sts。 sessionDurationSeconds | fs.s3a.assumed.role.session.duration | 
| fs.s3.authorization.roleMapping | fs.s3a.authorization.roleMapping | 
| fs.s3.authorization.ugi.groupName.enabled | fs.s3a.authorization.ugi.groupName.enabled | 
| fs.3。 credentialsResolverClass | fs.s3a.credentials.resolver | 
| fs.s3n.multipart.uploads.enabled | fs.s3a.multipart.uploads.enabled | 
| fs.s3n.multipart.uploads.split.size | fs.s3a.multipart.size | 
| fs.3。 serverSideEncryption.kms。 customEncryptionContext | fs.s3a.encryption.context | 
| fs.3。 enableServerSide加密 | fs.s3a.encryption.algorithm | 
| fs.3。 serverSideEncryption.kms.keyid/fs.s3.cse.kms.keyid | fs.s3a.encryption.key | 
| fs.s3.cse.kms.region | fs.s3a.encryption.cse.kms.region | 
| fs.s3.authorization.audit.enabled | fs.s3a.authorization.audit.enabled | 
| fs.s3.buckets.create.enabled | fs.s3a.bucket.probe | 
| fs.s3.delete。 maxBatchSize | fs.s3a.bulk.delete.page.size | 
| fs.s3.filestatus.metadata.enabled | fs.s3a.metadata.cache.enabled | 
| fs.s3.maxConnections | fs.s3a.connection.maximum | 
| fs.s3.maxRetries | fs.s3a.retry.limit | 
| fs.s3.metadata.cache.expiration.seconds | fs.s3a.metadata.cache.expiration.seconds | 
| fs.s3.buffer.dir | fs.s3a.buffer.dir | 
| fs.s3.canned.acl | fs.s3a.acl.default | 
| fs.s3.positionedRead.optimization.enabled | fs.s3a.positionedRead.optimization.enabled | 
| fs.3。 readFullyInto缓冲区 > 优化 > 已启用 | fs.s3a。 readFullyInto缓冲区 > 优化 > 已启用 | 
| fs.s3.signerType | fs.s3a.signing-algorithm | 
| fs.s3.storageClass | fs.s3a.create.storage.class | 
| fs.s3.threadpool.maxSize | fs.s3a.threads.max | 
| fs.3。 useRequesterPays标题 | fs.s3a.requester.pays.enabled | 
| fs.s3n.block.size | fs.s3a.block.size | 
| fs.s3n.endpoint | fs.s3a.endpoint | 
| fs.s3n.ssl.enabled | fs.s3a.connection.ssl.enabled | 
| fs.s3.open。 acceptsFileStatus | fs.s3a.open。 acceptsFileStatus | 
| fs.s3.connection。 maxIdleMilli秒 | fs.s3a.connection.idle.time | 
| fs.s3.s3 .enabled AccessGrants | fs.s3a.access.grants.enabled | 
| fs.s3.s3 .fallbacktoIAM AccessGrants | fs.s3a.access.grants.fallback.to.iam | 

### 注意事项和限制
<a name="emr-s3a-migration-considerations-and-limitations"></a>
+ 除 Trino 和 Presto 引擎外，所有 EMR 引擎 —— Spark MapReduce、Flink、Tez、Hive 等，都将使用 S3A 作为默认 S3 连接器。
+ EMR S3A 不支持与 EMR Ranger 集成。考虑迁移到 AWS Lake Formation。
+ AWS 不支持带有 S3A RecordServer 的 EMR 的 Spark 的 Lake Formation 支持——可以考虑使用 Spark Native FGAC。
+ AWS 不支持 S3 选择。
+ S3A 不提供定期清理未完成的多段上传 (MPU) 的选项-请考虑配置 [S3 存储桶生命周期策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)来清理悬空。 MPUs
+ [为了在使用 S3 CSE-CUSTOM 加密时从 EMRFS 迁移到 S3A，需要将自定义密钥提供程序从接口重写到密钥环接口。[EMRFSRSAEncryptionMaterialsProvider](https://github.com/awslabs/emr-sample-apps/tree/master/emrfs-plugins/EMRFSRSAEncryptionMaterialsProvider)](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/choose-keyring.html)有关更多信息，请参阅 [setting up S3A CSE-CUSTOM](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-s3a-cse-custom.html)。
+ 使用 EMRFS 创建的 Amazon S3 目录标有 “\$1\$1folder\$1” 后缀，而使用 S3A 文件系统创建的目录以 “/” 后缀结尾，这与通过 S3 控制台创建的目录一致。 AWS 
+ 要使用自定义 S3 凭证提供程序，请将 S3A 配置属性 `fs.s3a.aws.credentials.provider` 设置为与之前在 EMRFS 配置 `fs.s3.customAWSCredentialsProvider` 中使用的凭证提供程序类相同的类。

### 不支持的 EMRFS 配置
<a name="emr-s3a-migration-unsupported"></a>

以下 EMRFS 配置已被识别为不受支持或已过时，因此不会提供与其对应的 S3A 配置的直接映射。这些特定配置在迁移到 S3A 文件系统时不会自动转换或延续。


**不支持的 EMRFS 配置和原因**  
<a name="unsupported-emrfs-configs"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ReleaseGuide/emr-s3a-migrate.html)