

# Amazon S3 on Outposts 与本地 Amazon EMR on Outposts
<a name="s3-outposts-emr"></a>

Amazon EMR 是一个托管式集群平台，可简化在 AWS 上运行大数据框架（如 Apache Hadoop 和 Apache Spark）以处理和分析海量数据的操作。通过使用这些框架和相关的开源项目，您可以处理用于分析目的的数据和业务情报工作负载。Amazon EMR 还可以协助您转换大量数据并将数据移入/移出其它 AWS 数据存储和数据库，并支持 Amazon S3 on Outposts。有关更多信息，请参阅《Amazon EMR 管理指南》**中的 [Amazon EMR on Outposts](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-outposts.html)。

对于 Amazon S3 on Outposts，Amazon EMR 在版本 7.0.0 中开始支持 Apache Hadoop S3A 连接器。早期版本的 Amazon EMR 不支持本地 S3 on Outposts，也不支持 EMR 文件系统（EMRFS）。

**受支持的应用程序**  
Amazon EMR 与 Amazon S3 on Outposts 结合使用可支持以下应用程序：
+ Hadoop
+ Spark
+ Hue
+ Hive
+ Sqoop
+ Pig
+ Hudi
+ Flink

有关更多信息，请参阅[《Amazon EMR 版本指南》](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-release-components.html)。

## 创建和配置 Amazon S3 on Outposts 桶
<a name="create-outposts-bucket"></a>

Amazon EMR 将 适用于 Java 的 AWS SDK 与 Amazon S3 on Outposts 结合使用来存储输入数据和输出数据。您的 Amazon EMR 日志文件存储在您选择的区域 Amazon S3 位置，而不是本地存储在 Outpost 上。有关更多信息，请参阅《Amazon EMR 管理指南》**中的 [Amazon EMR 日志](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-manage-view-web-log-files.html)。

为了符合 Amazon S3 和 DNS 的要求，S3 on Outposts 桶具有命名限制和局限性。有关更多信息，请参阅 [创建 S3 on Outposts 存储桶](S3OutpostsCreateBucket.md)。

在 Amazon EMR 版本 7.0.0 及更高版本中，您可以将 Amazon EMR 与 S3 on Outposts 和 S3A 文件系统结合使用。

**先决条件**  
**S3 on Outposts 权限** – 当您创建 Amazon EMR 实例配置文件时，您的角色必须包含 S3 on Outposts 的 AWS Identity and Access Management（IAM）命名空间。S3 on Outposts 具有自己的命名空间 `s3-outposts*`。有关使用此命名空间的示例策略，请参阅[使用 S3 on Outposts 设置 IAM](S3OutpostsIAM.md)。

**S3A 连接器** – 要将您的 EMR 集群配置为访问 Amazon S3 on Outposts 桶中的数据，您必须使用 Apache Hadoop S3A 连接器。要使用该连接器，请确保所有 S3 URI 都使用 `s3a` 方案。如果不是这样，您可以配置用于 EMR 集群的文件系统实现，以便 S3 URI 可以与 S3A 连接器结合使用。

要将文件系统实现配置为与 S3A 连接器结合使用，请为 EMR 集群使用 `fs.file_scheme.impl` 和 `fs.AbstractFileSystem.file_scheme.impl` 配置属性，其中 `file_scheme` 对应于您拥有的 S3 URI 类型。要使用以下示例，请将 *`user input placeholders`* 替换为您自己的信息。例如，要更改使用 `s3` 方案的 S3 URI 的文件系统实现，请指定以下集群配置属性：

```
1. [
2.   {
3. "Classification": "core-site",
4.     "Properties": {
5.     "fs.s3.impl": "org.apache.hadoop.fs.s3a.S3AFileSystem",
6.     "fs.AbstractFileSystem.s3.impl": "org.apache.hadoop.fs.s3a.S3A"
7.     }
8.   }
9. ]
```

要使用 S3A，请将 `fs.file_scheme.impl` 配置属性设置为 `org.apache.hadoop.fs.s3a.S3AFileSystem`，并将 `fs.AbstractFileSystem.file_scheme.impl` 属性设置为 `org.apache.hadoop.fs.s3a.S3A`。

例如，如果您要访问路径 `s3a://bucket/...`，请将 `fs.s3a.impl` 属性设置为 `org.apache.hadoop.fs.s3a.S3AFileSystem`，然后将 `fs.AbstractFileSystem.s3a.impl` 属性设置为 `org.apache.hadoop.fs.s3a.S3A`。

## 开始将 Amazon EMR 与 Amazon S3 on Outposts 结合使用
<a name="getting-started-outposts"></a>

以下主题介绍了如何开始将 Amazon EMR 与 Amazon S3 on Outposts 结合使用。

**Topics**
+ [创建权限策略](#create-permission-policy)
+ [创建和配置集群](#configure-cluster)
+ [配置概述](#configurations-overview)
+ [注意事项](#considerations)

### 创建权限策略
<a name="create-permission-policy"></a>

在创建使用 Amazon S3 on Outposts 的 EMR 集群之前，您必须创建一个 IAM policy 以附加到该集群的 Amazon EC2 实例配置文件。该策略必须具有访问 S3 on Outposts 接入点 Amazon 资源名称（ARN）的权限。有关为 S3 on Outposts 创建 IAM policy 的更多信息，请参阅[使用 S3 on Outposts 设置 IAM](S3OutpostsIAM.md)。

以下示例策略显示如何授予所需的权限。创建策略后，将策略附加到您用于创建 EMR 集群的实例配置文件角色，如 [创建和配置集群](#configure-cluster) 部分所述。要使用此示例，请将 *`user input placeholders`* 替换为您自己的信息。

```
 1. {
 2. "Version":"2012-10-17",		 	 	  
 3.   "Statement": [
 4.         {
 5.   "Effect": "Allow",
 6.             "Resource": "arn:aws:s3-outposts:us-west-2:111122223333:outpost/op-01ac5d28a6a232904/accesspoint/access-point-name,
 7.             "Action": [
 8.                 "s3-outposts:*"
 9.             ]
10.         }
11.     ]
12.     
13.  }
```

### 创建和配置集群
<a name="configure-cluster"></a>

要创建在 S3 on Outposts 中运行 Spark 的集群，请在控制台中完成以下步骤。

**创建在 S3 on Outposts 中运行 Spark 的集群**

1. 通过 [https://console.aws.amazon.com/elasticmapreduce/](https://console.aws.amazon.com/elasticmapreduce/) 打开 Amazon EMR 控制台。

1. 在左侧导航窗格中，选择**集群**。

1. 选择**创建集群**。

   

1. 对于 **Amazon EMR 版本**，请选择 **emr-7.0.0** 或更高版本。

1. 对于应用程序捆绑包，请选择 **Spark 交互式**。然后，选择要包含在集群中的任何其它受支持的应用程序。

1. 要启用 Amazon S3 on Outposts，请输入您的配置设置。

**示例配置设置**  
要使用以下示例配置设置，请将 `user input placeholders` 替换为您自己的信息。

   ```
    1. [
    2.  {
    3.    "Classification": "core-site",
    4.    "Properties": {
    5.      "fs.s3a.bucket.DOC-EXAMPLE-BUCKET.accesspoint.arn": "arn:aws:s3-outposts:us-west-2:111122223333:outpost/op-01ac5d28a6a232904/accesspoint/access-point-name"
    6.      "fs.s3a.committer.name": "magic", 
    7.      "fs.s3a.select.enabled": "false"
    8.     }
    9.   },
   10.   {
   11.     "Classification": "hadoop-env",
   12.     "Configurations": [
   13.       {
   14.         "Classification": "export",
   15.         "Properties": {
   16.           "JAVA_HOME": "/usr/lib/jvm/java-11-amazon-corretto.x86_64" 
   17.           }
   18.        }
   19.      ],
   20.      "Properties": {}
   21.    },
   22.    {
   23.      "Classification": "spark-env",
   24.      "Configurations": [
   25.        {
   26.          "Classification": "export",
   27.          "Properties": {
   28.            "JAVA_HOME": "/usr/lib/jvm/java-11-amazon-corretto.x86_64"
   29.          }
   30.        }
   31.       ],
   32.       "Properties": {}
   33.      },
   34.      {
   35.       "Classification": "spark-defaults",
   36.       "Properties": {
   37.         "spark.executorEnv.JAVA_HOME": "/usr/lib/jvm/java-11-amazon-corretto.x86_64",
   38.         "spark.sql.sources.fastS3PartitionDiscovery.enabled": "false"
   39.       }
   40.      }
   41.   ]
   ```

1. 在**联网**部分中，选择您的 AWS Outposts 机架上的虚拟私有云（VPC）和子网。有关 Amazon EMR on Outposts 的更多信息，请参阅《Amazon EMR 管理指南》**中的 [AWS Outposts 上的 EMR 集群](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-outposts.html)。

1. 在 **Amazon EMR 的 EC2 实例配置文件**部分，选择附加了[您之前创建的权限策略](#create-permission-policy)的 IAM 角色。

1. 配置剩余的集群设置，然后选择**创建集群**。

### 配置概述
<a name="configurations-overview"></a>

下表描述了 S3A 配置，以及在设置将 S3 on Outposts 与 Amazon EMR 结合使用的集群时要为这些配置的参数指定的值。


| 参数 | 默认值 | S3 on Outposts 的必需值 | 说明 | 
| --- | --- | --- | --- | 
|  `fs.s3a.aws.credentials.provider`  |  如果未指定，S3A 将在区域桶中查找具有 Outposts 桶名称的 S3。  |  S3 on Outposts 桶的接入点 ARN  |  Amazon S3 on Outposts 支持将纯 Virtual Private Cloud (VPC) 接入点作为访问 Outposts 存储桶的唯一方式。  | 
|  `fs.s3a.committer.name`  | file |  `magic`  |  Magic 提交程序是 S3 on Outposts 唯一支持的提交程序。  | 
|  `fs.s3a.select.enabled`  |  `TRUE`  |  `FALSE`  | Outposts 上不支持 S3 Select。 | 
|  `JAVA_HOME`  |  `/usr/lib/jvm/java-8`  |  `/usr/lib/jvm/java-11-amazon-corretto.x86_64`  |  S3A 上的 S3 on Outposts 需要 Java 版本 11。  | 

下表描述了 Spark 配置，以及在设置将 S3 on Outposts 与 Amazon EMR 结合使用的集群时要为这些配置的参数指定的值。


| 参数 | 默认值 | S3 on Outposts 的必需值 | 说明 | 
| --- | --- | --- | --- | 
|  `spark.sql.sources.fastS3PartitionDiscovery.enabled`  |  `TRUE`  |  `FALSE`  |  S3 on Outposts 不支持快速分区。  | 
|  `spark.executorEnv.JAVA_HOME`  |  `/usr/lib/jvm/java-8`  |  `/usr/lib/jvm/java-11-amazon-corretto.x86_64`  |  S3A 上的 S3 on Outposts 需要 Java 版本 11。  | 

### 注意事项
<a name="considerations"></a>

当您将 Amazon EMR 与 S3 on Outposts 桶集成时，请考虑以下几点：
+ Amazon EMR 版本 7.0.0 及更高版本支持 Amazon S3 on Outposts。
+ 将 S3 on Outposts 与 Amazon EMR 结合使用时需要 S3A 连接器。只有 S3A 具有与 S3 on Outposts 桶交互所需的功能。有关 S3A 连接器设置的信息，请参阅[先决条件](#s3a-outposts-prerequisites)。
+ Amazon S3 on Outposts 对于 Amazon EMR 仅支持采用 Amazon S3 托管式密钥的服务器端加密（SSE-S3）。有关更多信息，请参阅 [S3 on Outposts 中的数据加密](s3-outposts-data-encryption.md)。
+ Amazon S3 on Outposts 不支持使用 S3A FileOutputCommitter 进行写入。在 S3 on Outposts 桶上使用 S3A FileOutputCommitter 进行写入会导致以下错误：InvalidStorageClass：您指定的存储类无效。
+ Amazon EMR Serverless 或 Amazon EMR on EKS 不支持 Amazon S3 on Outposts。
+ Amazon EMR 日志存储在您选择的区域 Amazon S3 位置，而不是本地存储在 S3 on Outposts 桶中。