

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

# 配置 Amazon EMR 集群位置和数据存储
<a name="emr-cluster-location-data-storage"></a>

此部分会介绍如何为集群配置区域、使用 Amazon EMR 时可用的其它文件系统以及如何使用这些文件系统。它还会介绍如何准备数据或将数据上载到 Amazon EMR（如果需要），以及如何为日志文件和您配置的所有输出数据文件准备输出位置。

**Topics**
+ [为您的 Amazon EMR 集群选择一个 AWS 区域](emr-plan-region.md)
+ [使用 Amazon EMR 处理存储和文件系统](emr-plan-file-systems.md)
+ [准备输入数据以供 Amazon EMR 处理](emr-plan-input.md)
+ [为 Amazon EMR 集群输出配置位置](emr-plan-output.md)

# 为您的 Amazon EMR 集群选择一个 AWS 区域
<a name="emr-plan-region"></a>

Amazon Web Services 在全球范围内的数据中心的服务器上运行。数据中心按地理区域进行管理。启动 Amazon EMR 集群时，必须指定区域。您可以选择一个区域，以便减少延迟、尽可能降低成本或满足法规要求。有关 Amazon EMR 支持的所有区域和端点的列表，请参阅《Amazon Web Services 一般参考》** 中的 [Regions and endpoints](https://docs.aws.amazon.com/general/latest/gr/#emr_region)。

为了获得最佳性能，您应在与您的数据相同的区域启动集群。例如，如果存储您的输入数据的 Amazon S3 存储桶位于美国西部（俄勒冈州）区域，那么您应在美国西部（俄勒冈州）区域启动集群，以避免缴纳跨区域数据传输费。如果您使用 Amazon S3 存储桶接收集群输出，那么也应该在美国西部（俄勒冈州）区域创建该集群输出。

如果您打算将某个 Amazon EC2 密钥对与集群相关联（这是使用 SSH 登录主节点所必需的操作），那么必须在集群所在区域创建密钥对。与之类似，Amazon EMR 创建的用以管理集群的安全组也应在集群所在区域内创建。

如果您 AWS 账户 在 2017 年 5 月 17 日当天或之后注册的，则访问资源时的默认区域为美国东部（俄亥俄州）(us-east-2)；对于较旧的账户，默认区域 AWS 管理控制台 是美国西部（俄勒冈）(us-west-2) 或美国东部（弗吉尼亚北部）(us-east-1)。有关更多信息，请参阅[区域和端点](https://docs.aws.amazon.com/general/latest/gr/rande.html)。

某些 AWS 功能仅在有限的地区可用。例如，集群计算实例仅在美国东部（弗吉尼亚州北部）区域可用，而亚太地区（悉尼）区域仅支持 Hadoop 1.0.3 及更高版本。当您选择一个区域时，请核实该区域是否支持您想要使用的功能。

为了获得最佳性能，请将要用于集群的所有 AWS 资源使用相同的区域。下表列出了区域名称和服务的映射关系。有关 Amazon EMR 区域的列表，请参阅《Amazon Web Services 一般参考》** 中的 [AWS 区域 and endpoints](https://docs.aws.amazon.com/general/latest/gr/rande.html#emr_region)。

## 使用控制台选择区域
<a name="emr-dev-specify-region-console"></a>

默认区域显示在导航栏上账户信息的左侧。要在新旧控制台中切换区域，请选择“区域”下拉菜单并选择一个新选项。

## 使用指定区域 AWS CLI
<a name="emr-dev-specify-region-cli"></a>

 AWS CLI 使用**aws configure**命令或`AWS_DEFAULT_REGION`环境变量在中指定默认区域。有关更多信息，请参阅[《*AWS Command Line Interface 用户指南》*中的配置 AWS 区域](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-installing-specifying-region)。

## 选择一个使用 SDK 或 API 的区域
<a name="emr-dev-specify-region-api"></a>

要使用软件开发工具包选择区域，请将应用程序配置为使用该区域的端点。如果您正在使用 AWS SDK 创建客户端应用程序，那么您可以通过调用 `setEndpoint` 来变更客户终端节点，如下例所示：

```
1. client.setEndpoint("elasticmapreduce.us-west-2.amazonaws.com");
```

在您的应用程序通过设置端点指定一个区域后，您可以为集群的 EC2 实例设置可用区。可用区是专用于隔离其他可用区内故障的区分位置，可向相同区域中的其他可用区提供低延迟的便宜网络连接。一个区域包含一个或多个可用区。为了优化性能和降低延迟，所有资源应与使用它们的集群位于同一可用区。

# 使用 Amazon EMR 处理存储和文件系统
<a name="emr-plan-file-systems"></a>

Amazon EMR 和 Hadoop 提供了各种文件系统，供您在处理集群步骤时使用。通过用于访问数据的 URI 前缀，您可以指定要使用的文件系统类型。例如，`s3://amzn-s3-demo-bucket1/path` 指向一个使用 S3A 的 Amazon S3 存储桶（自 EMR-7.10.0 版本起）。下表列出了可用的文件系统以及关于最适合用途的建议。

Amazon EMR 和 Hadoop 处理集群时通常会使用两个或多个以下文件系统。HDFS 和 S3A 是与 Amazon EMR 配合使用的两种主要文件系统。

**重要**  
从亚马逊 EMR 版本 5.22.0 开始，亚马逊 EMR 仅 AWS 使用签名版本 4 来验证向亚马逊 S3 发出的请求。早期的 Amazon EMR 版本在某些情况下使用 AWS 签名版本 2，除非发行说明中注明仅使用签名版本 4。有关更多信息，请参阅《*亚马逊简单存储服务开发者AWS *[指南》中的对请求进行身份验证（AWS 签名版本 4）](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)[和对请求进行身份验证（签名版本 2）](https://docs.aws.amazon.com/AmazonS3/latest/API/auth-request-sig-v2.html)。


| 文件系统 | Prefix | 说明 | 
| --- | --- | --- | 
| HDFS | hdfs:// (或无前缀) |  HDFS 是适用于 Hadoop 的一种可扩展的分布式便携文件系统。HDFS 的一项优势是管理集群的 Hadoop 集群节点与管理单一步骤的 Hadoop 集群节点之间的数据感知。有关更多信息，请参阅 [Hadoop 文档](http://hadoop.apache.org/docs/stable)。 通过主节点和核心节点使用 HDFS。优势是快；劣势是它是短暂存储，会在集群终止时回收。它最适合用于缓存由中间任务流程步骤产生的结果。  | 
| S3A | s3://, s3a://, s3n:// |  Hadoop S3A 文件系统是一个开源 S3 连接器，它使 Apache Hadoop 及其生态系统能够直接与 Amazon S3 存储进行交互。它允许用户使用与 Hadoop 兼容的文件操作在 S3 存储桶中读取和写入数据，从而在 Hadoop 应用程序和云存储之间实现无缝集成。 在 EMR-7.10.0 之前，Amazon EMR 将 EMRFS 用于 *s3://* 和 *s3n://* 方案。   | 
| 本地文件系统 |  |  本地文件系统指的是本地连接的磁盘。创建 Hadoop 集群时，会从 EC2 实例上创建各个节点，这些节点附带了预先配置的数据块，这些数据块属于称为*实例存储* 的预先附加的磁盘存储。实例存储卷上的数据仅在 EC2 实例的生命周期内保留。实例存储卷适合于存储不断变化的临时数据（如缓冲区、缓存、Scratch 数据和其他临时内容）。有关更多信息，请参阅 [Amazon EC2 实例存储](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html)。 HDFS 使用本地文件系统，但 Python 也从本地文件系统运行，您可以选择在实例存储卷上存储其他应用程序文件。  | 
| （早期）Amazon S3 数据块文件系统 | s3bfs:// |  Amazon S3 数据块文件系统是一种早期文件存储系统。我们强烈反对使用此系统。  我们不推荐使用此文件系统，因为它可能触发竞争条件，此条件可能会导致集群故障。但是，早期应用程序可能会需要它。   | 

## 访问文件系统
<a name="emr-dev-access-file-systems"></a>

通过用于访问数据的统一资源标识符 (URI) 前缀，您可以指定要使用的文件系统。以下步骤介绍了如何引用几种不同类型的文件系统。

**访问本地 HDFS**
+ 在 URI 中指定 `hdfs:///` 前缀。Amazon EMR 会将未在 URI 中指定前缀的路径解析为本地 HDFS。例如，以下两项都 URIs 将解析到 HDFS 中的相同位置。

  ```
  1. hdfs:///path-to-data
  2. 							
  3. /path-to-data
  ```

**访问远程 HDFS**
+ 将主节点 IP 地址包含在 URI 内，如以下示例所示。

  ```
  1. hdfs://master-ip-address/path-to-data
  2. 						
  3. master-ip-address/path-to-data
  ```

**访问 Amazon S3**
+ 使用 `s3://` 前缀。

  ```
  1. 						
  2. s3://bucket-name/path-to-file-in-bucket
  ```

**访问 Amazon S3 数据块文件系统**
+ 仅用于需要 Amazon S3 数据块文件系统的旧版应用程序。要使用此文件系统访问或存储数据，请在 URI 中使用 `s3bfs://` 前缀。

  Amazon S3 数据块文件系统是一种旧版文件系统，用于支持向 Amazon S3 上传大于 5 GB 的文件。借助 Amazon EMR 通过 AWS Java SDK 提供的分段上传功能，您可以将大型文件上传到 Amazon S3 原生文件系统，Amazon S3 块文件系统已被弃用。有关 EMR 分段上传的更多信息，请参阅[为 Amazon S3 配置分段上传](emr-plan-upload-s3.html#Config_Multipart)。有关 S3 对象大小和部分大小限制的更多信息，请参阅《**Amazon Simple Storage Service** 用户指南》**中的 [Amazon S3 分段上传限制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html)。
**警告**  
因为此早期文件系统可能创建会导致文件系统损坏的竞争条件，所以您应当避免使用此形式，而改用 EMRFS。

  ```
  1. s3bfs://bucket-name/path-to-file-in-bucket
  ```

# 准备输入数据以供 Amazon EMR 处理
<a name="emr-plan-input"></a>

多数集群会先加载输入数据，然后再处理这些数据。为加载数据，必须定位在集群可以访问的位置，并且格式必须为集群可以处理的类型。最常见的情形是将输入数据上载至 Amazon S3。Amazon EMR 为您的集群提供了从 Amazon S3 导入或读取数据的工具。

Hadoop 中的默认输入格式是文本文件，然而您也可以自定义 Hadoop 从而使用工具导入以其它格式存储的数据。

**Topics**
+ [Amazon EMR 可以接受的输入类型](emr-plan-input-accept.md)
+ [将数据导入 Amazon EMR 的不同方法](emr-plan-get-data-in.md)

# Amazon EMR 可以接受的输入类型
<a name="emr-plan-input-accept"></a>

集群的默认输入格式是文本文件，每行都使用换行符 (\$1n) 分隔，这是最常用的输入格式。

如果您输入的数据格式不是默认的文本文件，可以使用 Hadoop 接口 `InputFormat` 指定其它输入类型。您甚至可以创建 `FileInputFormat` 类型的子类，用于处理自定义数据类型。欲了解更多信息，请参阅 [http://hadoop.apache。 org/docs/current/api/org/apache/hadoop/mapred/InputFormat.html。](http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/InputFormat.html)

如果您使用的是 Hive，则可以使用 a serializer/deserializer (SerDe) 将数据从给定格式读入 HDFS。欲了解更多信息，请参阅 [https://cwiki.apache。 org/confluence/display/Hive/SerDe](https://cwiki.apache.org/confluence/display/Hive/SerDe)。

# 将数据导入 Amazon EMR 的不同方法
<a name="emr-plan-get-data-in"></a>

Amazon EMR 提供了几种方法将数据导入到集群上。最常见的方法是将数据上载到 Amazon S3，然后使用 Amazon EMR 的内置功能将数据加载到集群上。您还可以使用 Hadoop 的 DistributedCache 功能将文件从分布式文件系统传输到本地文件系统。Amazon EMR（Hive 版本 0.7.1.1 及更高版本）提供的 Hive 实施包括一项功能，您可以使用此功能在 DynamoDB 和 Amazon EMR 集群之间导入和导出数据。如果有大量的本地数据要处理，您会发现 Direct Connect 服务非常有用。

**Topics**
+ [将数据上载到 Amazon S3](emr-plan-upload-s3.md)
+ [使用上传数据 AWS DataSync](emr-plan-upload-datasync.md)
+ [使用 Amazon EMR 分布式缓存导入文件](emr-plan-input-distributed-cache.md)
+ [使用 Amazon EMR 检测和处理压缩文件](HowtoProcessGzippedFiles.md)
+ [使用 Amazon EMR 将 DynamoDB 数据导入 Hive](emr-plan-input-dynamodb.md)
+ [通过 Amazon EM AWS Direct Connect R 连接数据](emr-plan-input-directconnect.md)
+ [使用 Amazon EMR 上传大量数据 AWS Snowball Edge](emr-plan-input-snowball.md)

# 将数据上载到 Amazon S3
<a name="emr-plan-upload-s3"></a>

有关如何将文件上传到 Amazon S3 的说明，请参阅《Amazon Simple Storage Service 用户指南》**中的[向存储桶添加对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PuttingAnObjectInABucket.html)。[有关将亚马逊 S3 与 Hadoop 配合使用的更多信息，请参阅 http://wiki.apache。 org/hadoop/AmazonS](http://wiki.apache.org/hadoop2/AmazonS3)3。

**Topics**
+ [创建和配置 Amazon S3 存储桶](#create-s3-bucket-input)
+ [为 Amazon S3 配置分段上载](#Config_Multipart)
+ [最佳实践](#emr-bucket-bestpractices)
+ [将数据上传到 Amazon S3 Express One Zone](emr-express-one-zone.md)

## 创建和配置 Amazon S3 存储桶
<a name="create-s3-bucket-input"></a>

Amazon EMR 适用于 Java 的 AWS SDK 与 Amazon S3 一起使用来存储输入数据、日志文件和输出数据。Amazon S3 将这些存储位置称为*存储桶*。存储桶具有某些限制以符合 Amazon S3 和 DNS 要求。有关更多信息，请参阅 *《Amazon Simple Storage Service 用户指南》*中的[存储桶限制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/BucketRestrictions.html)。

本节向您展示如何使用 Amazon S3 AWS 管理控制台 创建和设置亚马逊 S3 存储桶的权限。您还可以使用 Amazon S3 API 或 AWS CLI为 Amazon S3 存储桶创建和设置权限。您还可以将 curl 与修改一起使用来传递 Amazon S3 的相应身份验证参数。

请参阅以下资源：
+ 要使用控制台创建存储桶，请参阅《Amazon S3 用户指南》[https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html)中的*创建存储桶*。
+ 要使用创建和使用存储桶 AWS CLI，请参阅 [A *mazon S3 用户指南 AWS Command Line Interface中的使用高级别 S3* 命令](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-s3-commands.html)。
+ 要使用 SDK 创建存储桶，请参阅《Amazon Simple Storage Service 用户指南》**中的[创建存储桶的示例](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-get-location-example.html)。
+ 要通过 curl 使用存储桶，请参阅 [curl 的 Amazon S3 身份验证工具](https://aws.amazon.com/code/amazon-s3-authentication-tool-for-curl/)。
+ 有关指定特定于区域的存储桶的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[访问存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html#access-bucket-intro)。
+ 要使用 Amazon S3 访问点处理存储桶，请参阅《Amazon S3 用户指南》**中的[为接入点使用存储桶式别名](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-alias.html)。您可以轻松地将 Amazon S3 接入点与 Amazon S3 访问点别名一起使用，而不使用 Amazon S3 存储桶名称。您可以将 Amazon S3 接入点别名用于现有应用程序和新的应用程序，包括 Spark、Hive、Presto 等其他应用程序。

**注意**  
如果您为存储桶启用日志记录，则只启用存储桶访问日志，而不会启用 Amazon EMR 集群日志。

在存储桶创建期间或创建后，您可以根据应用程序设置适当权限来访问存储桶。一般情况下，您可以给自己（所有者）授予读取和写入权限，并给已验证用户授予读取访问权限。

在创建集群之前，所需的 Amazon S3 存储桶必须存在。您必须将集群中引用的所有必要的脚本或数据上载至 Amazon S3。

## 为 Amazon S3 配置分段上载
<a name="Config_Multipart"></a>

亚马逊 EMR 支持通过适用于 Java 的 S AWS DK 进行亚马逊 S3 分段上传。分段上载可让您将单独对象作为一组片段上载。您可以独立上载以及按任意顺序上载这些对象分段。如果任意分段传输失败，可以重新传输该分段且不会影响其它分段。上载完所有的对象分段后，Amazon S3 将汇集这些分段并创建对象。

有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的 [分段上传概述](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html)。

此外，Amazon EMR 提供的属性可让您更精确地对分段上载失败的分段进行清理。

下表描述了分段上载的 Amazon EMR 配置属性。您可以使用 `core-site` 配置分类配置这些属性。有关更多信息，请参阅《Amazon EMR 版本指南》**中的[配置应用程序](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/configure-apps.html)。


| 配置参数名称 | 默认 值 | 说明 | 
| --- | --- | --- | 
| fs.s3n.multipart.uploads.enabled | true | 布尔值类型，指示是否要启用分段上载。当 EMRFS 一致视图处于启用状态时，系统会默认启用分段上传，而将此值设置为 false 会被忽略。 | 
| fs.s3n.multipart.uploads.split.size | 134217728 | 在 EMRFS 启动新的分段上载之前且分段上载处于启用状态时，指定分段的大小上限（以字节为单位）。最小值为 `5242880` (5 MB)。如果指定了较小值，则使用 `5242880`。最大值为 `5368709120` (5 GB)。如果指定了较大值，则使用 `5368709120`。 如果 EMRFS 客户端加密功能已禁用且 Amazon S3 优化的提交程序也处于禁用状态，则此值还可以控制数据文件的大小上限，相应数据文件可能会增大，直到 EMRFS 使用分段上载（而非 `PutObject` 请求）来上载文件。有关更多信息，请参阅  | 
| fs.s3n.ssl.enabled | true | 布尔值类型，指示使用 http 还是 https。 | 
| fs.s3.buckets.create.enabled | false | 布尔值类型，指示是否应在存储桶不存在时创建存储桶。设置为 false 会导致 CreateBucket 操作出现异常。 | 
| fs.s3.multipart.clean.enabled | false | 布尔值类型，指示是否要启用后台定期清理未完成的分段上载。 | 
| fs.s3.multipart.clean.age.threshold | 604800 | long 类型，用于指定分段上载的最小有效期（以秒为单位），然后考虑对其进行清理。默认有效期为一周。 | 
| fs.s3.multipart.clean.jitter.max | 10000 | 整数类型，指定在安排下一轮清理之前最大随机抖动的延迟（以秒为单位）增至 15 分钟的固定延迟。 | 

### 禁用分段上传
<a name="emr-dev-multipart-upload"></a>

------
#### [ Console ]

**使用控制台禁用分段上传**

1. [登录 AWS 管理控制台，然后在 /emr 上打开亚马逊 EMR 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/emr)

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择 **Create cluster**（创建集群）。

1. 在 **Software Settings**（软件设置）下，输入下面的配置：`classification=core-site,properties=[fs.s3n.multipart.uploads.enabled=false]`。

1. 选择适用于集群的任何其他选项。

1. 要启动集群，选择 **Create cluster**（创建集群）。

------
#### [ CLI ]

**要禁用分段上传，请使用 AWS CLI**

此过程介绍如何使用 AWS CLI禁用分段上载。要禁用分段上载，请键入带 `create-cluster` 参数的 `--bootstrap-actions` 命令。

1. 使用以下内容创建一个文件 (`myConfig.json`)，并将其保存到您在其中运行该命令的同一目录中：

   ```
   [
     {
       "Classification": "core-site",
       "Properties": {
         "fs.s3n.multipart.uploads.enabled": "false"
       }
     }
   ]
   ```

1. 请键入以下命令，将 *myKey* 替换为您的 EC2 密钥对的名称。
**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

   ```
   1. aws emr create-cluster --name "Test cluster" \
   2. --release-label emr-7.12.0 --applications Name=Hive Name=Pig \
   3. --use-default-roles --ec2-attributes KeyName=myKey --instance-type m5.xlarge \
   4. --instance-count 3 --configurations file://myConfig.json
   ```

------
#### [ API ]

**使用 API 禁用分段上传**
+ 有关以编程方式使用 Amazon S3 分段上传的信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[使用 AWS SDK for Java 进行分段上传](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMPDotJavaAPI.html)。

  有关适用于 Java 的 AWS 软件开发工具包的更多信息，请参阅[AWS 适用于 Java 的开发工具包](https://aws.amazon.com/sdkforjava/)。

------

## 最佳实践
<a name="emr-bucket-bestpractices"></a>

以下是将 Amazon S3 存储桶与 EMR 集群结合使用的建议。

### 启用版本控制
<a name="emr-enable-versioning"></a>

版本控制是针对 Amazon S3 存储桶的建议的配置。一旦启用版本控制，则可确保即使数据被意外删除或覆盖，也可恢复数据。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》中的[使用版本控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)。

### 清理失败的分段上载
<a name="emr-multipart-cleanup"></a>

默认情况下，EMR 集群组件使用通过 Java AWS 开发工具包和 Amazon S3 进行分段上传 APIs ，将日志文件和输出数据写入亚马逊 S3。有关使用 Amazon EMR 更改与此配置相关的属性的信息，请参阅[为 Amazon S3 配置分段上载](#Config_Multipart)。有时，上载大型文件会生成未完成的 Amazon S3 分段上载。在分段上载无法成功完成时，进行中的分段上载将继续占用存储桶并会产生存储费用。我们建议采用下列选项，以避免文件存储过多：
+ 对于与 Amazon EMR 结合使用的存储桶，启用 Amazon S3 中的生命周期配置，以在上载启动日期三天后删除仍未完成的分段上载。利用生命周期配置规则，您可以创建控制对象的存储类和生命周期。有关更多信息，请参阅[对象生命周期管理](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)和[使用存储桶生命周期策略中止未完成的分段上载](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config)。
+ 通过将 `fs.s3.multipart.clean.enabled` 设置为 `true` 并调整其它清理参数来启用 Amazon EMR 的分段清理功能。此功能可用于正常运行时间有限的高容量、大规模集群。在这种情况下，生命周期配置规则的 `DaysAfterIntitiation` 参数可能太长，即使设置为最小参数，也会导致 Amazon S3 存储中迅猛增加。Amazon EMR 的分段清理功能有便于实现更精确的控制。有关更多信息，请参阅[为 Amazon S3 配置分段上载](#Config_Multipart)。

### 管理版本标记
<a name="w2aac28c11c17c11b7c11b9"></a>

我们建议您在 Amazon S3 中启用生命周期配置规则，以删除您与 Amazon EMR 结合使用的启用了版本控制的存储桶的过期对象删除标记。删除受版本控制的存储桶中的对象时将创建删除标记。如果对象的所有早期版本随后过期，则存储桶中将保留过期的对象删除标记。虽然您无需为删除标记付费，但删除过期的标记可提高 LIST 请求的性能。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》中的[在启用了版本控制的存储桶中进行生命周期配置](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-configuration-bucket-with-versioning.html)。

### 性能最佳实践
<a name="w2aac28c11c17c11b7c11c11"></a>

根据您的工作负载，对 EMR 集群及其上应用程序的特定类型使用会导致对存储桶的大量请求。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[请求率和性能注意事项](https://docs.aws.amazon.com/AmazonS3/latest/userguide/request-rate-perf-considerations.html)。

# 将数据上传到 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.aws.amazon.com/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以下步骤描述了在 AWS 管理控制台中创建集群的高级概述：

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  |  您创建存储桶 AWS 区域 的位置。  |  区域解析逻辑不适用于 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.aws.amazon.com/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 及更高版本也支持此功能。

# 使用上传数据 AWS DataSync
<a name="emr-plan-upload-datasync"></a>

AWS DataSync 是一项在线数据传输服务，可简化、自动化和加速在本地存储和存储服务之间或 AWS 存储服务之间 AWS 移动数据的过程。 DataSync 支持各种本地存储系统，例如 Hadoop 分布式文件系统 (HDFS)、NAS 文件服务器和自我管理的对象存储。

数据导入到集群的最常见方法是将数据上载到 Amazon S3，然后使用 Amazon EMR 的内置功能将数据加载到集群上。

DataSync 可以帮助您完成以下任务：
+ 将 Hadoop 集群上的 HDFS 复制到 Amazon S3 以实现业务连续性
+ 将 HDFS 复制到 Amazon S3 以填充数据湖
+ 在 Hadoop 集群的 HDFS 与 Amazon S3 之间传输数据以进行分析和处理

要将数据上传到 S3 存储桶，请先在本地存储所在网络中部署一个或多个 DataSync 代理。*代理*是用于从自行管理位置读取数据或向自行管理位置写入数据的虚拟机 (VM)。然后，您可以在 S3 存储桶 AWS 区域 所在的 AWS 账户 和位置激活代理。

激活代理后，您可以为本地存储创建源位置，为 S3 存储桶创建目标位置，还要创建一个任务。*任务* 由两个位置（源和目标）和一组用于控制任务行为的默认选项组成。

最后，运行 DataSync 任务将数据从源传输到目的地。

有关更多信息，请参阅[开始使用 AWS DataSync](https://docs.aws.amazon.com/datasync/latest/userguide/getting-started.html)。

# 使用 Amazon EMR 分布式缓存导入文件
<a name="emr-plan-input-distributed-cache"></a>

DistributedCache 是一种 Hadoop 功能，可以在映射或归约任务需要访问通用数据时提高效率。如果集群所依赖的现有应用程序或二进制文件在创建集群时尚未安装，您可以使用 DistributedCache 导入这些文件。此功能让集群节点可以从它的本地文件系统中读取导入的文件，而不是从其它集群节点中检索文件。

欲了解更多信息，请访问 [http://hadoop.apache。 org/docs/stable/api/org/apache/hadoop/filecache/DistributedCache.html。](http://hadoop.apache.org/docs/stable/api/org/apache/hadoop/filecache/DistributedCache.html)

创建集群时，可以调用 DistributedCache。在即将开始 Hadoop 作业前，将文件读入缓存区，并且在作业持续期间文件会保留在缓存中。您可以对存储在任何 Hadoop 兼容文件系统（如 HDFS 或 Amazon S3）上的文件执行缓存操作。文件缓存的默认大小是 10 GB。要更改缓存大小，可使用引导操作重新配置 Hadoop 参数 `local.cache.size`。有关更多信息，请参阅[创建引导操作以使用 Amazon EMR 集群安装其他软件](emr-plan-bootstrap.md)。

**Topics**
+ [支持的文件类型](#emr-dev-supported-file-types)
+ [缓存文件的位置](#locationofcache)
+ [从 Streaming 应用程序访问缓存文件](#cachemapper)
+ [从 Streaming 应用程序访问缓存文件](#cacheinconsole)

## 支持的文件类型
<a name="emr-dev-supported-file-types"></a>

DistributedCache 适用于单个文件和存档。单个文件缓存为只读模式。可执行文件和二进制文件具有执行权限设置。

存档是使用实用程序打包的一个或多个文件，例如 `gzip`。DistributedCache 将压缩文件传递到每个核心节点，然后将存档作为缓存的一部分进行解压缩。DistributedCache 支持以下压缩格式：
+ zip
+ tgz
+ tar.gz
+ tar
+ jar

## 缓存文件的位置
<a name="locationofcache"></a>

DistributedCache 仅将文件复制到核心节点。如果集群中没有核心节点，DistributedCache 会将文件复制到主节点。

利用符号链接，DistributedCache 将缓存文件与映射器和折叠器（reducer）的当前工作目录相关联。符号链接是文件位置的一个别名，而不是实际的文件位置。参数值（`yarn-site.xml` 中的 `yarn.nodemanager.local-dirs`），可指定临时文件的位置。Amazon EMR 或基于实例类型和 EMR 版本的某些变体，将此参数设置为 `/mnt/mapred`。例如，某个设置可能包含 `/mnt/mapred` 和 `/mnt1/mapred`，因为此实例类型有两个短暂卷。缓存文件位于临时文件位置的子目录中：`/mnt/mapred/taskTracker/archive`。

如果您将单个文件读入缓存，那么 DistributedCache 会将此文件放在 `archive` 目录下。如果您将一份归档读入缓存，那么 DistributedCache 会解压缩该文件，然后使用与归档文件相同的名称在 `/archive` 下创建子目录。单个文件位于新的子目录下。

仅当使用 Streaming 时，才可以使用 DistributedCache。

## 从 Streaming 应用程序访问缓存文件
<a name="cachemapper"></a>

要从映射器或 Reducer 应用程序中访问缓存文件，您需要确保已将当前工作目录 (./) 添加到应用程序路径中，并引用了缓存文件，就好像这些文件存在于当前工作目录下一样。

## 从 Streaming 应用程序访问缓存文件
<a name="cacheinconsole"></a>

您可以使用 AWS 管理控制台 和 AWS CLI 来创建使用分布式缓存的集群。

------
#### [ Console ]

**使用新控制台指定分布式缓存文件**

1. [登录 AWS 管理控制台，然后在 /emr 上打开亚马逊 EMR 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/emr)

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择 **Create cluster**（创建集群）。

1. 在 **Steps**（步骤）下，选择 **Add step**（添加步骤）。**Add step**（添加步骤）对话框随即打开。在 **Arguments**（参数）字段，将要保存至缓存的文件和存档包含在内。文件大小 (或存档文件中文件的总计大小) 必须小于分配的缓存大小。

   如果要将单个文件添加到分布式缓存，请指定 `-cacheFile`，后跟文件名称和位置、井号（\$1）以及将文件放入本地缓存时要为其指定的名称。以下示例说明了如何将单个文件添加到分布式缓存。

   ```
   -cacheFile \
   s3://amzn-s3-demo-bucket/file-name#cache-file-name
   ```

   如果要将存档文件添加到分布式缓存，请输入 `-cacheArchive`，后跟文件在 Amazon S3 中的位置、井号（\$1）以及您要为本地缓存中的文件集合指定的名称。以下示例说明了如何将存档文件添加到分布式缓存。

   ```
   -cacheArchive \
   s3://amzn-s3-demo-bucket/archive-name#cache-archive-name
   ```

   在其他对话框字段中输入相应值。选项因步骤类型而异。要添加步骤并退出对话框，请选择 **Add step**（添加步骤）。

1. 选择适用于集群的任何其他选项。

1. 要启动集群，选择 **Create cluster**（创建集群）。

------
#### [ CLI ]

**使用指定分布式缓存文件 AWS CLI**
+ 要在创建集群时提交 Streaming 步骤，请键入带 `create-cluster` 参数的 `--steps` 命令。要使用指定分布式缓存文件 AWS CLI，请在提交 Streaming 步骤时指定相应的参数。

  如果要将单个文件添加到分布式缓存，请指定 `-cacheFile`，后跟文件名称和位置、井号（\$1）以及将文件放入本地缓存时要为其指定的名称。

  如果要将存档文件添加到分布式缓存，请输入 `-cacheArchive`，后跟文件在 Amazon S3 中的位置、井号（\$1）以及您要为本地缓存中的文件集合指定的名称。以下示例说明了如何将存档文件添加到分布式缓存。

  有关在中使用 Amazon EMR 命令的更多信息 AWS CLI，请参阅。[https://docs.aws.amazon.com/cli/latest/reference/emr](https://docs.aws.amazon.com/cli/latest/reference/emr)

**Example 1**  
键入以下命令启动集群并提交一个 Streaming 步骤，该步骤使用 `-cacheFile` 将文件 `sample_dataset_cached.dat` 添加到缓存。  

```
aws emr create-cluster --name "Test cluster" --release-label emr-4.0.0 --applications Name=Hive Name=Pig --use-default-roles --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3 --steps Type=STREAMING,Name="Streaming program",ActionOnFailure=CONTINUE,Args=["--files","s3://my_bucket/my_mapper.py s3://my_bucket/my_reducer.py","-mapper","my_mapper.py","-reducer","my_reducer.py,"-input","s3://my_bucket/my_input","-output","s3://my_bucket/my_output", "-cacheFile","s3://my_bucket/sample_dataset.dat#sample_dataset_cached.dat"]
```
如果不使用 `--instance-groups` 参数指定实例计数，则将启动单个主节点，其余实例将作为核心节点启动。所有节点都使用该命令中指定的实例类型。  
如果您之前未创建默认 EMR 服务角色和 EC2 实例配置文件，请先键入 `aws emr create-default-roles` 创建它们，然后再键入 `create-cluster` 子命令。

**Example 2**  
以下命令显示了流式集群的创建过程，并使用 `-cacheArchive` 将一份存档的文件添加到缓存。  

```
aws emr create-cluster --name "Test cluster" --release-label emr-4.0.0 --applications Name=Hive Name=Pig --use-default-roles --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3 --steps Type=STREAMING,Name="Streaming program",ActionOnFailure=CONTINUE,Args=["--files","s3://my_bucket/my_mapper.py s3://my_bucket/my_reducer.py","-mapper","my_mapper.py","-reducer","my_reducer.py,"-input","s3://my_bucket/my_input","-output","s3://my_bucket/my_output", "-cacheArchive","s3://my_bucket/sample_dataset.tgz#sample_dataset_cached"]
```
如果不使用 `--instance-groups` 参数指定实例计数，则将启动单个主节点，其余实例将作为核心节点启动。所有节点都使用该命令中指定的实例类型。  
如果您之前未创建默认 EMR 服务角色和 EC2 实例配置文件，请先键入 `aws emr create-default-roles` 创建它们，然后再键入 `create-cluster` 子命令。

------

# 使用 Amazon EMR 检测和处理压缩文件
<a name="HowtoProcessGzippedFiles"></a>

Hadoop 会检查文件扩展名以检测压缩文件。Hadoop 支持的压缩类型是：gzip、bzip2 和 LZO。不需要执行任何额外操作来解压缩使用这些压缩类型的文件；Hadoop 会为您执行这些操作。

[要索引 LZO 文件，你可以使用 hadoop-lzo 库，该库可以从 hadoop-lzo 下载。https://github.com/kevinweil/](https://github.com/kevinweil/hadoop-lzo)请注意，因为这是第三方库，所以 Amazon EMR 不会为开发人员提供有关如何使用此工具的支持。有关使用信息，请参阅 [hadoop-lzo readme 文件](https://github.com/kevinweil/hadoop-lzo/blob/master/README.md)。

# 使用 Amazon EMR 将 DynamoDB 数据导入 Hive
<a name="emr-plan-input-dynamodb"></a>

Amazon EMR 提供的 Hive 实施包括一项功能，您可以使用此功能在 DynamoDB 和 Amazon EMR 集群之间导入和导出数据。如果您的输入数据存储在 DynamoDB 中，这会非常有用。有关详细信息，请参阅[使用 Amazon EMR 导出、导入、查询和连接 DynamoDB 中的表](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/EMRforDynamoDB.html)。

# 通过 Amazon EM AWS Direct Connect R 连接数据
<a name="emr-plan-input-directconnect"></a>

Direct Connect 是一项服务，您可以使用该服务从您的数据中心、办公室或托管环境与 Amazon Web Services 建立专用网络连接。如果您有大量的输入数据，则使用 Direct Connect 可以降低网络成本，增加带宽吞吐量，并提供比基于 Internet 的连接更一致的网络体验。有关更多信息，请参阅 [Direct Connect 用户指南](https://docs.aws.amazon.com/directconnect/latest/UserGuide/)。

# 使用 Amazon EMR 上传大量数据 AWS Snowball Edge
<a name="emr-plan-input-snowball"></a>

AWS Snowball Edge 这项服务可用于在亚马逊简单存储服务 (Amazon S3) Simple Storage Service 和您的现场数据存储位置 faster-than-internet之间快速传输大量数据。Snowball Edge 支持两种作业类型：导入作业和导出作业。导入任务涉及将数据从本地部署源传输到 Amazon S3 存储桶。导出任务涉及将数据从 Amazon S3 存储桶传输到本地部署源。对于这两种作业类型，Snowball Edge 设备会保护您的数据安全，而区域承运商在 Amazon S3 和您的现场数据存储位置之间传输这些数据。Snowball Edge 设备在物理上坚固耐用，受到 AWS Key Management Service ()AWS KMS的保护。有关更多信息，请参阅 [AWS Snowball Edge Edge 开发人员指南](https://docs.aws.amazon.com/snowball/latest/developer-guide/)。

# 为 Amazon EMR 集群输出配置位置
<a name="emr-plan-output"></a>

 Amazon EMR 集群最常见的输出格式是压缩或未压缩的文本文件。通常，把这些文件写入 Amazon S3 存储桶。启动该集群前，必须先创建此存储桶。启动集群时，指定 S3 存储桶作为输出位置。

有关更多信息，请参阅以下主题：

**Topics**
+ [创建和配置 Amazon S3 存储桶](#create-s3-bucket-output)
+ [Amazon EMR 可以返回什么格式？](emr-plan-output-formats.md)
+ [如何使用 Amazon EMR 将数据写入非您拥有的 Amazon S3 存储桶](emr-s3-acls.md)
+ [压缩 Amazon EMR 集群输出的方法](emr-plan-output-compression.md)

## 创建和配置 Amazon S3 存储桶
<a name="create-s3-bucket-output"></a>

Amazon EMR（Amazon EMR）使用 Amazon S3 存储输入数据、日志文件和输出数据。Amazon S3 将这些存储位置称为*存储桶*。存储桶具有某些限制以符合 Amazon S3 和 DNS 要求。有关更多信息，请转至《Amazon Simple Storage Service 开发人员指南》**中的[存储桶限制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/BucketRestrictions.html)。

要创建 Amazon S3 存储桶，请按照《Amazon Simple Storage Service 开发人员指南》**中的[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)页面中的说明进行操作。

**注意**  
 如果在 **Create a Bucket (创建存储桶)** 向导中启用了日志记录，则只启用存储桶访问日志，不会启用集群日志。

**注意**  
有关指定特定区域存储桶的更多信息，请参阅 A *mazon 简单存储服务开发者指南中的存储*[桶和](https://docs.aws.amazon.com/AmazonS3/latest/dev/LocationSelection.html)区域以及[可用的区域](https://aws.amazon.com/articles/available-region-endpoints-for-the-aws-sdks/)终端节点。 AWS SDKs 

 创建存储桶后，您可以为其设置适当的权限。一般情况下，您可以给自己（所有者）授予读取和写入权限。在配置存储桶时，强烈建议您关注[Amazon S3 的安全最佳实践](https://docs.aws.amazon.com/AmazonS3/latest/userguide/security-best-practices.html)。

 在创建集群之前，所需的 Amazon S3 存储桶必须存在。您必须将集群中引用的所有必要的脚本或数据上载至 Amazon S3。下表介绍了示例数据、脚本和日志文件位置。


| 信息 | Amazon S3 中的示例位置 | 
| --- | --- | 
| 脚本或程序 |  s3://amzn-s3-demo-bucket1/script/MapperScript.py  | 
| 日志文件 |  s3://amzn-s3-demo-bucket1/logs  | 
| 输入数据 |  s3://amzn-s3-demo-bucket1/input  | 
| 输出数据 |  s3://amzn-s3-demo-bucket1/output  | 

# Amazon EMR 可以返回什么格式？
<a name="emr-plan-output-formats"></a>

 集群的默认输出格式是将密钥和值对写入单独文本文件行的文本。这是最常用的输出格式。

 如果默认输出数据需要采用默认文本文件以外的格式，则可以使用 Hadoop 接口 `OutputFormat` 指定其它输出类型。您甚至可以创建 `FileOutputFormat` 类型的子类，用于处理自定义数据类型。欲了解更多信息，请参阅 [http://hadoop.apache。 org/docs/current/api/org/apache/hadoop/mapred/OutputFormat.html。](http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/OutputFormat.html)

 如果您要启动 Hive 集群，则可以使用 serializer/deserializer (SerDe) 将 HDFS 中的数据输出为给定格式。欲了解更多信息，请参阅 [https://cwiki.apache。 org/confluence/display/Hive/SerDe](https://cwiki.apache.org/confluence/display/Hive/SerDe)。

# 如何使用 Amazon EMR 将数据写入非您拥有的 Amazon S3 存储桶
<a name="emr-s3-acls"></a>

 默认情况下，当您将文件写入到 Amazon Simple Storage Service（Amazon S3）存储桶时，您是唯一一个能够读取该文件的用户。假设您将文件写入到您自己的存储桶，此默认设置会保护您的文件隐私。

 但是，如果您正在运行集群，并且希望输出写入其他 AWS 用户的 Amazon S3 存储桶，并且您希望其他 AWS 用户能够读取该输出，则必须做两件事：
+  让其他 AWS 用户向您授予他们的 Amazon S3 存储桶的写入权限。您启动的集群在您的 AWS 证书下运行，因此您启动的任何集群也可以写入其他 AWS 用户的存储桶。
+  为其他 AWS 用户设置您或集群写入 Amazon S3 存储桶的文件的读取权限。设置这些读取权限的最简单方法是使用预设访问控制列表 (ACLs)，这是一组由 Amazon S3 定义的预定义访问策略。

 有关其他 AWS 用户如何授予您向其他用户的 Amazon S3 存储桶写入文件的权限的信息，请参阅《*亚马逊简单存储服务用户指南》中的编辑存储*[桶权限](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EditingBucketPermissions.html)。

 要让您的集群在向 Amazon S3 写入文件 ACLs 时使用固定 ACL，请将`fs.s3.canned.acl`集群配置选项设置为要使用的预装 ACL。下表列出了当前定义的罐装 ACLs。


| 标准 ACL | 说明 | 
| --- | --- | 
| AuthenticatedRead | 指定为所有者授予 Permission.FullControl 访问权限及为 GroupGrantee.AuthenticatedUsers 组被授权者授予 Permission.Read 访问权限。 | 
| BucketOwnerFullControl | 指定为存储桶的所有者授予 Permission.FullControl 访问权限。存储桶的所有者不必与对象的所有者相同。 | 
| BucketOwnerRead | 指定为存储桶的所有者授予 Permission.Read 访问权限。存储桶的所有者不必与对象的所有者相同。 | 
| LogDeliveryWrite | 指定为所有者授予 Permission.FullControl 访问权限及为 GroupGrantee.LogDelivery 组被授权者授予 Permission.Write 访问权限，以便能够传递访问日志。 | 
| Private | 指定为所有者授予 Permission.FullControl 访问权限。 | 
| PublicRead | 指定为所有者授予 Permission.FullControl 访问权限及为 GroupGrantee.AllUsers 组被授权者授予 Permission.Read 访问权限。 | 
| PublicReadWrite | 指定为所有者授予 Permission.FullControl 访问权限及为 GroupGrantee.AllUsers 组被授权者授予 Permission.Read 和 Permission.Write 访问权限。 | 

 根据您正在运行的集群类型，有多种方法可设置集群配置选项。以下步骤介绍了如何设置常见案例的选项。

**ACLs 在 Hive 中使用 canded 写入文件**
+  通过 Hive 命令提示符，将 `fs.s3.canned.acl` 配置选项设置为您想在其写入 Amazon S3 的文件上设置集群的预装 ACL。要访问 Hive 命令提示符，可通过 SSH 连接到主节点，然后在 Hadoop 命令提示符处键入 Hive。有关更多信息，请参阅[使用 SSH 连接到 Amazon EMR 集群主节点](emr-connect-master-node-ssh.md)。

   以下示例将 `fs.s3.canned.acl` 配置选项设置为 `BucketOwnerFullControl`，这可给予 Amazon S3 存储桶的所有者对该文件的完全控制权。请注意，设置命令区分大小写，且不含引号或空格。

  ```
  hive> set fs.s3.canned.acl=BucketOwnerFullControl;   
  create table acl (n int) location 's3://amzn-s3-demo-bucket/acl/'; 
  insert overwrite table acl select count(*) from acl;
  ```

   示例的最后两行创建了一个存储在 Amazon S3 中的表格，并向该表格中写入数据。

**在 Pig ACLs 中使用 canded 写文件**
+  通过 Pig 命令提示符，将 `fs.s3.canned.acl` 配置选项设置为您想在其写入 Amazon S3 的文件上设置集群的预装 ACL。要访问 Pig 命令提示符，可通过 SSH 连接到主节点，然后在 Hadoop 命令提示符处键入 Pig。有关更多信息，请参阅 [使用 SSH 连接到 Amazon EMR 集群主节点](emr-connect-master-node-ssh.md)。

   以下示例将`fs.s3.canned.acl`配置选项设置为 BucketOwnerFullControl，这使得 Amazon S3 存储桶的所有者可以完全控制该文件。请注意，设置命令包含一个位于预装 ACL 名称前面的空格，并且不包含引号。

  ```
  pig> set fs.s3.canned.acl BucketOwnerFullControl; 
  store some data into 's3://amzn-s3-demo-bucket/pig/acl';
  ```

**在自定义 JAR ACLs 中使用 canded 写入文件**
+  利用带有 -D 标志的 Hadoop 设置 `fs.s3.canned.acl` 配置选项。如以下示例所示。

  ```
  hadoop jar hadoop-examples.jar wordcount 
  -Dfs.s3.canned.acl=BucketOwnerFullControl s3://amzn-s3-demo-bucket/input s3://amzn-s3-demo-bucket/output
  ```

# 压缩 Amazon EMR 集群输出的方法
<a name="emr-plan-output-compression"></a>

有多种方法可以压缩数据处理产生的输出。使用的压缩工具取决于数据的属性。在传输大量数据时，压缩可以提高性能。

## 输出数据压缩
<a name="HadoopOutputDataCompression"></a>

 这会压缩 Hadoop 作业的输出。如果您正在使用，则结果 TextOutputFormat 是 gzip 格式的文本文件。如果您要写入， SequenceFiles 则结果是内部压缩 SequenceFile 的。将配置设置 mapred.output.compress 设置为 True，可启用该功能。

 如果您运行的是流式作业，则可以将这些参数传递给流式作业的方式启用该功能。

```
1. -jobconf mapred.output.compress=true
```

 您还可以使用引导操作，自动压缩所有的作业输出。此处介绍如何使用 Ruby 客户端做到这点。

```
1.    
2. --bootstrap-actions s3://elasticmapreduce/bootstrap-actions/configure-hadoop \
3. --args "-s,mapred.output.compress=true"
```

 最后，如果写入自定义 JAR，可以在创建作业时使用以下行启用输出压缩。

```
1. FileOutputFormat.setCompressOutput(conf, true);
```

## 中间数据压缩
<a name="HadoopIntermediateDataCompression"></a>

 如果您的作业有海量的数据在映射器会 Reducer 之间来回发送，那么启用中间压缩可以提高性能。压缩映射输出，并在其到达核心节点时进行解压缩。配置设置是 mapred.compress.map.output。您同样可以对输出压缩启用这个功能。

 当写入自定义 JAR 时，使用下列命令：

```
1. conf.setCompressMapOutput(true);
```

## 在 Amazon EMR 中使用 Snappy 库
<a name="emr-using-snappy"></a>

Snappy 是一种压缩和解压缩库，已为提高速度而进行了优化。它在 Amazon EMR 2.0 及更高 AMIs 版本中可用，并用作中间压缩的默认设置。有关 Snappy 库的详细信息，请转到 [http://code.google.com/p/snappy/](http://code.google.com/p/snappy/)。