

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

# 将数据上载到 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)。