

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

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

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

此更改适用于所有 EMR 部署（包括 EC2、EKS 和 EMR Serverless）。

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

```
<property>
  <name>fs.s3.impl</name>
  <value>com.amazon.ws.emr.hadoop.fs.EmrFileSystem</value>
</property>
<property>
  <name>fs.s3n.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 设置之间的无缝集成。举例来说，当你在 EMRFS 中使用值为 “XYZ” 的 “fs.s3.bucket.amzn-s3-demo-bucket1.server” 配置特定于存储桶的加密设置时，系统会自动将其映射到等效的 S3A 配置，方法是将指定存储桶 amzn-s3-demo-bucket1 SideEncryption.kms.keyId 的 “fs.s3a.encryption.key” 设置为 “XYZ”。

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

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

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

**注意**  
从 EMRFS（fs.s3.server SideEncryption.kms.keyId 或 fs.s3.cse.kms.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.session DurationSeconds | fs.s3a.assumed.role.session.duration | 
| fs.s3.authorization.roleMapping | fs.s3a.authorization.roleMapping | 
| fs.s3.authorization.ugi.group Name.enabled | fs.s3a.authorization.ugi.group Name.enabled | 
| fs.s3. 凭证 ResolverClass | 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.s3.server SideEncryption.kms.customEncryptionContext | fs.s3a.encryption.context | 
| fs.s3.enable ServerSideEncryption | fs.s3a.encryption.algorithm | 
| fs.s3.server/fs.s3.cse.kms.keyid SideEncryption.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.max BatchSize | 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.posited Read.optimization.enabled | fs.s3a.posited Read.optimization.enabled | 
| fs.s3.read FullyIntoBuffers.optimization.enabled | fs.s3a.read FullyIntoBuffers.optimization.enabled | 
| fs.s3.signerType | fs.s3a.signing-algorithm | 
| fs.s3.storageClass | fs.s3a.create.storage.class | 
| fs.s3.threadpool.maxSize | fs.s3a.threads.max | 
| fs.s3.use RequesterPaysHeader | 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.acceptes FileStatus | fs.s3a.open.acceptes FileStatus | 
| fs.s3.connection.max IdleMilliSeconds | fs.s3a.connection.idle.time | 
| fs.s3.s3 AccessGrants.enabled | fs.s3a.access.grants.enabled | 
| fs.s3.s3 AccessGrants.fallbackToIAM | 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)来清理悬挂的 MPU。
+ [为了在使用 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)有关更多信息，请参阅设置 S3A [CSE-CUSTOM](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-s3a-cse-custom.html)。
+ 使用 EMRFS 创建的 Amazon S3 目录标有 “\_$folder$” 后缀，而使用 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>
<table>
<thead>
  <tr><th>EMRFS 配置名称</th><th>不支持的原因</th></tr>
</thead>
<tbody>
  <tr><td>fs.s3.consistent</td><td rowspan="30">Amazon S3 提供[强大的先写后读一致性](https://aws.amazon.com/blogs/aws/amazon-s3-update-strong-read-after-write-consistency/)，因此不需要 EMRFS 一致视图功能。</td></tr>
  <tr><td>fs.s3.consistent.dynamodb.endpoint</td></tr>
  <tr><td>fs.s3. 一致.fast FirstRetrySeconds</td></tr>
  <tr><td>fs.s3.consistent.fastList</td></tr>
  <tr><td>fs.s3. 一致.fast List.batchSize</td></tr>
  <tr><td>fs.s3. 一致.fast List.prefetchMetadata</td></tr>
  <tr><td>fs.s3.consistent.metadata.accessKey</td></tr>
  <tr><td>fs.s3.consistent.metadata.autoCreate</td></tr>
  <tr><td>fs.s3.consistent.metadata.capacity.autoIncrease</td></tr>
  <tr><td>fs.s3. 一致性.metadata.capacity.auto Increase.factor</td></tr>
  <tr><td>fs.s3. 一致性.metadata.capacity.auto Increase.maxRead</td></tr>
  <tr><td>fs.s3. 一致性.metadata.capacity.auto Increase.maxWrite</td></tr>
  <tr><td>fs.s3.consistent.metadata.conditional</td></tr>
  <tr><td>fs.s3.consistent.metadata.delete.ttl.enabled</td></tr>
  <tr><td>fs.s3.consistent.metadata.delete.ttl.expiration.seconds</td></tr>
  <tr><td>fs.s3.consistent.metadata.etag.verification.enabled</td></tr>
  <tr><td>fs.s3.consistent.metadata.read.capacity</td></tr>
  <tr><td>fs.s3.consistent.metadata.read.capacity.limit</td></tr>
  <tr><td>fs.s3.consistent.metadata.secretKey</td></tr>
  <tr><td>fs.s3.consistent.metadata.tableName</td></tr>
  <tr><td>fs.s3.consistent.metadata.write.capacity</td></tr>
  <tr><td>fs.s3.consistent.metadata.write.capacity.limit</td></tr>
  <tr><td>fs.s3. 一致的通知。 CloudWatch</td></tr>
  <tr><td>fs.s3.consistent.notification.SQS</td></tr>
  <tr><td>fs.s3. 一致的通知。 SQS.batchSize</td></tr>
  <tr><td>fs.s3. 一致的通知。 SQS.customMsg</td></tr>
  <tr><td>fs.s3. 一致的通知。 SQS.pathReportLimit</td></tr>
  <tr><td>fs.s3. 一致的通知。 SQS.pullWaitTimeSeconds</td></tr>
  <tr><td>fs.s3. 一致的通知。 SQS.queueName</td></tr>
  <tr><td>fs.s3.consistent.retryCount</td></tr>
  <tr><td>fs.s3.cse.crypto StorageMode</td><td rowspan="4">与使用 S AWS DK V1 的 EMRFS 不同。S3A 使用不支持这些选项的 AWS SDK V2。</td></tr>
  <tr><td>fs.s3.cse.crypto StorageMode.deleteInstructionFiles.enabled</td></tr>
  <tr><td>fs.s3.cse.encryption V2.enabled</td></tr>
  <tr><td>fs.s3.cse.materials Description.enabled</td></tr>
  <tr><td>fs.s3.multipart.clean.age.threshold</td><td rowspan="2">S3A 不支持定期清理未完成分段上传 (MPU) - 请考虑配置 [S3 存储桶生命周期策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)来清理悬挂的 MPU。</td></tr>
  <tr><td>fs.s3.multipart.clean.enabled</td></tr>
  <tr><td>fs.s3.multipart.clean.jitter.max</td><td rowspan="4">添加该功能以避免分段上传线程卡住或变慢。S3A 不存在类似问题，因此不需要它。</td></tr>
  <tr><td>fs.s3.multipart.fraction.part.avg.completion.time</td></tr>
  <tr><td>fs.s3.multipart.part.attempts</td></tr>
  <tr><td>fs.s3.multipart.th.fraction.parts.completed</td></tr>
  <tr><td>fs.s3.instance Profile.retryCount</td><td rowspan="31">这些是 EMRFS 特有的配置，由于功能和架构差异，S3A 不需要这些配置。</td></tr>
  <tr><td>fs.s3.instance Profile.retryPeriodSeconds</td></tr>
  <tr><td>fs.s3.external StagedFiles.maxActiveTasks</td></tr>
  <tr><td>fs.s3.folder Object.autoAction.disabled</td></tr>
  <tr><td>fs.s3.folder Object.autoInsert</td></tr>
  <tr><td>fs.s3.get Object.initialSocketTimeoutMilliseconds</td></tr>
  <tr><td>fs.s3.list Files.incrementalFetch.enabled</td></tr>
  <tr><td>fs.s3.list FilesInOrder.includeDescendantsOfFiles</td></tr>
  <tr><td>fs.s3.list Objects.encodingType</td></tr>
  <tr><td>fs.s3.buckets.create.region</td></tr>
  <tr><td>fs.s3.configuration.load.enablebled</td></tr>
  <tr><td>fs.s3.create.allow FileNameEndsWithFolderSuffix</td></tr>
  <tr><td>fs.s3.open.lazy Connection.enabled</td></tr>
  <tr><td>fs.s3.region.fallback</td></tr>
  <tr><td>fs.s3.region.retryCount</td></tr>
  <tr><td>fs.s3.region.retry PeriodSeconds</td></tr>
  <tr><td>fs.s3.rename.algorithm.version</td></tr>
  <tr><td>fs.s3.request Handler.classNames</td></tr>
  <tr><td>fs.s3.request Statistics.enabled</td></tr>
  <tr><td>fs.s3.request Statistics.sinks</td></tr>
  <tr><td>fs.s3.retry PeriodSeconds</td></tr>
  <tr><td>fs.s3.seekStrategy</td></tr>
  <tr><td>fs.s3.threadpool.buffer.size</td></tr>
  <tr><td>fs.s3.threadpool.maxSize</td></tr>
  <tr><td>fs.s3.use DirectoryHeaderAsFolderObject</td></tr>
  <tr><td>fs.s3n.filestatuscache.enable</td></tr>
  <tr><td>fs.s3.delete.retryCount</td></tr>
  <tr><td>fs.s3.s3 AccessGrants.cacheSize</td></tr>
  <tr><td>fs.s3.s3 AccessGrants.retryDelayBase</td></tr>
  <tr><td>fs.s3.s3 AccessGrants.throttledRetryDelayBase</td></tr>
  <tr><td>fs.s3.s3 AccessGrants.maxRetries</td></tr>
</tbody>
</table>
