

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 如何將資料寫入非使用 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 使用者的儲存貯體。
+  在您或叢集寫入 Amazon S3 儲存貯體的檔案上設定其他 AWS 使用者的讀取許可。設定這些讀取許可最簡單的方法，是使用固定的存取控制清單 (ACL)，這是由 Amazon S3 定義的一組預先定義的存取政策。

 如需有關其他 AWS 使用者如何授予您將檔案寫入其他使用者 Amazon S3 儲存貯體之許可的資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[編輯儲存貯體許可](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EditingBucketPermissions.html)。

 為了讓叢集在將檔案寫入至 Amazon S3 時使用固定 ACL，請將 `fs.s3.canned.acl` 叢集組態選項設定為要使用的固定 ACL。下表列出目前定義的固定 ACL。


| 固定的 ACL | Description | 
| --- | --- | 
| 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 存取權限。 | 

 根據您正在執行的叢集類型，有許多方法可以設定叢集組態選項。下列程序說明如何為一般情況設定選項。

**在 Hive 中使用固定 ACL 寫入檔案**
+  從 Hive 命令提示字元處，將 `fs.s3.canned.acl` 組態選項設定為您想在寫入至 Amazon S3 的檔案上設定叢集的固定 ACL。若要存取使用 SSH 連接到主節點的 Hive 命令提示字元，然後在 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 中使用固定 ACL 寫入檔案**
+  從 Pig 命令提示字元處，將 `fs.s3.canned.acl` 組態選項設定為您想在寫入至 Amazon S3 的檔案上設定叢集的固定 ACL。若要存取使用 SSH 連接到主節點的 Pig 命令提示字元，然後在 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 中使用固定 ACL 寫入檔案**
+  透過 Hadoop 與 -D 旗標設定 `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
  ```