

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

# 如何使用 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
  ```