

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

# 将数据上传到 Amazon S3 Express One Zone
<a name="emr-express-one-zone"></a>

## 概述
<a name="emr-express-one-zone-overview"></a>

在 Amazon EMR 6.15.0 及更高版本中，您可以将带有 Apache Spark 的 Amazon EMR 与 [Amazon S3 Express One Zone](https://docs.amazonaws.cn/AmazonS3/latest/userguide/s3-express-one-zone.html) 存储类结合使用，以提高 Spark 作业的性能。亚马逊 EMR 7.2.0 及更高版本还支持 Flink 和 Hive HBase，因此，如果你使用这些应用程序，你也可以从 S3 Express One Zone 中受益。*S3 Express One Zone* 是一种 S3 存储类，适用于频繁访问每秒数十万个请求的数据的应用程序。S3 Express One Zone 在其发布时，提供了 Amazon S3 中延迟最低、性能最高的云对象存储。

## 先决条件
<a name="emr-express-one-zone-prereqs"></a>
+ **S3 Express One Zone 权限**：当 S3 Express One Zone 在 S3 对象上最初调用 `GET`、`LIST` 或 `PUT` 等操作时，存储类会代表您调用 `CreateSession`。您的 IAM policy 必须允许 `s3express:CreateSession` 权限，S3A 连接器才能调用 `CreateSession` API。有关使用此权限的示例策略，请参阅 [开始使用 Amazon S3 Express One Zone](#emr-express-one-zone-start)。
+ **S3A 连接器**：要将您的 Spark 集群配置为从使用 S3 Express One Zone 存储类的 Amazon S3 存储桶中访问数据，您必须使用 Apache Hadoop 连接器 S3A。要使用连接器，请确保所有 S3 都 URIs 使用该`s3a`方案。如果他们没有使用，则可以更改用于 `s3` 和 `s3n` 方案的文件系统实施。

要更改 `s3` 方案，请指定以下集群配置：

```
[
  {
    "Classification": "core-site",
    "Properties": {
      "fs.s3.impl": "org.apache.hadoop.fs.s3a.S3AFileSystem",
      "fs.AbstractFileSystem.s3.impl": "org.apache.hadoop.fs.s3a.S3A"
    }
  }
]
```

要更改 `s3n` 方案，请指定以下集群配置：

```
[
  {
    "Classification": "core-site",
    "Properties": {
      "fs.s3n.impl": "org.apache.hadoop.fs.s3a.S3AFileSystem",
      "fs.AbstractFileSystem.s3n.impl": "org.apache.hadoop.fs.s3a.S3A"
    }
  }
]
```

## 开始使用 Amazon S3 Express One Zone
<a name="emr-express-one-zone-start"></a>

**Topics**
+ [创建权限策略](#emr-express-one-zone-permissions)
+ [创建和配置集群](#emr-express-one-zone-create)
+ [配置概述](#emr-express-one-zone-configs)

### 创建权限策略
<a name="emr-express-one-zone-permissions"></a>

在创建使用 Amazon S3 Express One Zone 的集群之前，您必须创建一个 IAM policy 以附加到该集群的 Amazon EC2 实例配置文件。策略必须具有访问 S3 Express One Zone 存储类的权限。以下示例策略显示如何授予所需的权限。创建策略后，将策略附加到您用于创建 EMR 集群的实例配置文件角色，如 [创建和配置集群](#emr-express-one-zone-create) 部分所述。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3express:*:123456789012:bucket/example-s3-bucket"
      ],
      "Action": [
        "s3express:CreateSession"
      ],
      "Sid": "AllowS3EXPRESSCreatesession"
    }
  ]
}
```

------

### 创建和配置集群
<a name="emr-express-one-zone-create"></a>

接下来，使用 S3 Express One Zone 创建一个运行 Spark、、Flink 或 Hive 的集群。 HBase以下步骤描述了在 Amazon Web Services 管理控制台中创建集群的高级概述：

1. 导航到 Amazon EMR 控制台，然后从边栏中选择**集群**。然后选择**创建集群**。

1. 如果使用 Spark，请选择 Amazon EMR `emr-6.15.0` 或更高版本。如果您使用 HBase Flink 或 Hive，请选择`emr-7.2.0`或更高。

1. 选择要包含在集群中的应用程序，例如 Spark HBase、或 Flink。

1. 要启用 Amazon S3 Express One Zone，请在**软件设置**部分输入与以下示例类似的配置。配置和建议的值将在此过程之后的 [配置概述](#emr-express-one-zone-configs) 部分中介绍。

   ```
   [
     {
       "Classification": "core-site",
       "Properties": {
         "fs.s3a.aws.credentials.provider": "software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider",
         "fs.s3a.change.detection.mode": "none",
         "fs.s3a.endpoint.region": "aa-example-1",
         "fs.s3a.select.enabled": "false"
       }
     },
     {
       "Classification": "spark-defaults",
       "Properties": {
         "spark.sql.sources.fastS3PartitionDiscovery.enabled": "false"
       }
     }
   ]
   ```

1. 在 **Amazon EMR 的 EC2 实例配置文件**部分，选择使用现有角色，然后使用附加了您在上述 [创建权限策略](#emr-express-one-zone-permissions) 部分中创建的策略的角色。

1. 根据您的应用程序配置集群设置的其余部分，然后选择**创建集群**。

### 配置概述
<a name="emr-express-one-zone-configs"></a>

下表描述了在设置集群时应指定的配置和建议值，该集群将 S3 Express One Zone 与 Amazon EMR 结合使用，如 [创建和配置集群](#emr-express-one-zone-create) 部分所述。

**S3A 配置**


| 参数 | 默认 值 | 建议值 | 说明 | 
| --- | --- | --- | --- | 
|  `fs.s3a.aws.credentials.provider`  |  如果未指定，请按以下顺序使用 `AWSCredentialProviderList`：`TemporaryAWSCredentialsProvider`、`SimpleAWSCredentialsProvider`、`EnvironmentVariableCredentialsProvider`、`IAMInstanceCredentialsProvider`。  |  <pre>software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider</pre>  |  Amazon EMR 实例配置文件角色应具有允许 S3A 文件系统调用 `s3express:CreateSession` 的策略。如果其他凭证提供程序拥有 S3 Express One Zone 权限，它们也可以使用。  | 
|  `fs.s3a.endpoint.region`  |  null  |  您创建存储桶 Amazon Web Services 区域 的位置。  |  区域解析逻辑不适用于 S3 Express One Zone 存储类。  | 
|  `fs.s3a.select.enabled`  |  `true`  |  `false`  |  S3 Express One Zone 存储类不支持 Amazon S3 `select`。  | 
|  `fs.s3a.change.detection.mode`  |  `server`  |  none  |  通过检查基于 MD5 的 `etags` 进行由 S3A 进行的更改检测。S3 Express One Zone 存储类不支持 MD5 `checksums`。  | 

**Spark 配置**


| 参数 | 默认 值 | 建议值 | 说明 | 
| --- | --- | --- | --- | 
|  `spark.sql.sources.fastS3PartitionDiscovery.enabled`  |  `true`  |  false  |  内部优化使用 S3 Express One Zone 存储类不支持的 S3 API 参数。  | 

**Hive 配置**


| 参数 | 默认 值 | 建议值 | 说明 | 
| --- | --- | --- | --- | 
|  `hive.exec.fast.s3.partition.discovery.enabled`  |  `true`  |  false  |  内部优化使用 S3 Express One Zone 存储类不支持的 S3 API 参数。  | 

## 注意事项
<a name="emr-express-one-zone-considerations"></a>

将 Apache Spark on Amazon EMR 与 S3 Express One Zone 存储类集成时，请考虑以下几点：
+ 将 S3 Express One Zone 与 Amazon EMR 结合使用时需要 S3A 连接器。只有 S3A 具有与 S3 Express One Zone 交互所需的功能和存储类。有关设置连接器的步骤，请参阅 [先决条件](#emr-express-one-zone-prereqs)。
+ Amazon S3 Express One Zone 存储类支持 SSE-S3 和 SSE-KMS 加密。有关更多信息，请参阅 [Server-side encryption with Amazon S3](https://docs.amazonaws.cn/AmazonS3/latest/userguide/s3-express-data-protection.html#s3-express-ecnryption)。
+ Amazon S3 Express One Zone 存储类不支持使用 S3A `FileOutputCommitter` 写入。在 S3 Express One Zone 存储桶上使用 S3A `FileOutputCommitter` 写入会导致错误：*InvalidStorageClass: The storage class you specified is not valid*。
+ EMR on EC2 上的 Amazon EMR 6.15.0 及更高版本支持 Amazon S3 Express One Zone 存储类。此外，Amazon EMR on EKS 和 Amazon EMR Serverless 上的 Amazon EMR 7.2.0 及更高版本也支持此功能。