

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

# 設定 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 一般參考》**中的[區域與端點](https://docs.aws.amazon.com/general/latest/gr/#emr_region)。

為獲得最佳效能，您應該啟動與資料相同區域中的叢集。例如，如果 Amazon S3 儲存貯體將您的輸入資料儲存在美國西部 (奧勒岡) 區域，您應該在美國西部 (奧勒岡) 區域中啟動您的叢集，以避免跨區域資料傳輸費用。如果使用一個 Amazon S3 儲存貯體來接收叢集的輸出，您也會想在美國西部 (奧勒岡) 區域中建立一個 Amazon S3 儲存貯體。

如果您打算將一個 Amazon EC2 金鑰對與叢集關聯 (必須使用 SSH 以登入至主節點)，金鑰對必須建立在與叢集相同的區域。同樣地，Amazon EMR 建立用來管理該叢集的安全群組，也是建立在與叢集相同的區域中。

如果您在 2017 年 5 月 17 日 AWS 帳戶 或之後註冊 ，當您從 AWS 管理主控台 存取資源時的預設區域為美國東部 （俄亥俄） (us-east-2)；對於較舊的帳戶，預設區域為美國西部 （奧勒岡） (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 區域 與端點](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>

若要使用 SDK 選擇一個區域，請設定您的應用程式以使用該區域的端點。如果您正在使用 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 字首指定要使用的檔案系統。例如， 使用 S3A `s3://amzn-s3-demo-bucket1/path`參考 Amazon S3 儲存貯體 （自 EMR-7.10.0 發行以來）。 Amazon S3 S3A 下表列出可用的檔案系統，並提供各檔案系統的最佳使用時機建議。

Amazon EMR 和 Hadoop 在處理叢集時，通常會使用下列檔案系統當中的兩種或多種。HDFS 和 S3A 是與 Amazon EMR 搭配使用的兩個主要檔案系統。

**重要**  
從 Amazon EMR 5.22.0 版開始，Amazon EMR 僅使用 AWS Signature 第 4 版來驗證對 Amazon S3 的請求。舊版 Amazon EMR 在某些情況下使用 AWS Signature 第 2 版，除非版本備註指出 Signature 第 4 版僅供使用。如需詳細資訊，請參閱《*Amazon Simple Storage Service 開發人員指南*》中的[驗證請求 (AWS 簽章版本 4)](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) 和[驗證請求 (AWS 簽章版本 2)](https://docs.aws.amazon.com/AmazonS3/latest/API/auth-request-sig-v2.html)。


| 檔案系統 | 字首 | Description | 
| --- | --- | --- | 
| 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 執行個體的週期內保存。執行個體存放區磁碟區非常適合存放不斷變動的暫存資料，例如緩衝區、快取、臨時資料及其他暫存的內容。如需詳細資訊，請參閱 [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。例如，下面兩個 URI 都會解析成 HDFS 中相同的位置。

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

**存取遠端 HDFS**
+ 包含 URI 中主節點的 IP 地址，如以下範例所示。

  ```
  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 區塊檔案系統是一種舊版檔案系統，用於支援上傳到大於 5 GB 的 Amazon S3。透過 Amazon EMR 透過 AWS Java 開發套件提供的分段上傳功能，您可以將大型檔案上傳至 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，您可以使用串聯器/解串器 (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 實作 (Hive 版本 0.7.1.1 和更高版本) 包含可用於匯入和匯出 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 EMR AWS Direct Connect 使用 連線至資料](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)。如需有關將 Amazon S3 與 Hadoop 搭配使用的詳細資訊，請參閱 [http://wiki.apache.org/hadoop/AmazonS3](http://wiki.apache.org/hadoop2/AmazonS3)。

**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 管理主控台 來建立和設定 Amazon S3 儲存貯體的許可。您也可以使用 Amazon S3 API 或 AWS CLI為 Amazon S3 儲存貯體建立並設定許可。您也可以搭配修改來使用 curl，將適合的身分驗證參數傳遞到 Amazon S3。

請參閱下列資源：
+ 若要使用主控台來建立儲存貯體，請參閱《Amazon S3 使用者指南》**中的[建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html)。
+ 若要使用 建立和使用儲存貯體 AWS CLI，請參閱《Amazon [ S3 使用者指南》中的搭配 使用高階 S3 命令 AWS Command Line Interface](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-s3-commands.html)。 *Amazon S3 *
+ 若要使用 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 Access Points 搭配儲存貯體，請參閱《Amazon S3 使用者指南》**中的[為您的存取點使用儲存貯體型別名](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-alias.html)。您可以輕鬆地將 Amazon S3 Access Points 與 Amazon S3 Access Point 別名搭配使用，而不是使用 Amazon S3 儲存貯體名稱。您可以將 Amazon S3 Access Point 別名同時用於現有的和新的應用程式，包括 Spark、Hive、Presto 和其他應用程式。

**注意**  
如果您為儲存貯體啟用登入，這只會啟用儲存貯體存取日誌而非 Amazon EMR 叢集日誌。

在儲存貯體建立期間或之後，您可以根據您的應用程式來設定存取儲存貯體的適當權限。通常，您會授予讀取、寫入權限給您自己 (擁有者) ，而將讀取權限授予給已驗證的使用者。

所需的 Amazon S3 儲存貯體必須先存在，您才能夠建立叢集。您必須將所需指令碼和叢集中參考的資料上傳至 Amazon S3。

## 設定適用於 Amazon S3 的分段上傳
<a name="Config_Multipart"></a>

Amazon EMR 透過適用於 Java 的 AWS SDK 支援 Amazon 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)。


| 組態參數名稱 | 預設值 | Description | 
| --- | --- | --- | 
| 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 | 指定考慮清除之前分段上傳存留期下限 (秒數) 的長類型。預設為一週。 | 
| fs.s3.multipart.clean.jitter.max | 10000 | 指定在排定的下次清除之前將隨機抖動延遲上限 (秒數) 新增到 15 分鐘固定延遲的整數類型。 | 

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

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

**使用主控台停用分段上傳**

1. 登入 AWS 管理主控台，並在 https：//[https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr) 開啟 Amazon EMR 主控台。

1. 在左側導覽窗格中的 **EC2 上的 EMR** 下，選擇**叢集**，然後選擇**建立叢集**。

1. 在**軟體設定**下，輸入下列組態：`classification=core-site,properties=[fs.s3n.multipart.uploads.enabled=false]`。

1. 選擇適用於您的叢集的任何其他選項。

1. 若要啟動您的叢集，請選擇**建立叢集**。

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

**使用 停用分段上傳 AWS CLI**

此程序說明如何使用 AWS CLI停用分段上傳。若要停用分段上傳，請輸入含 `create-cluster` 參數的 `--bootstrap-actions` 命令。

1. 建立有下列內容的檔案 `myConfig.json`，並將該檔案儲存在您執行命令的同一個目錄中：

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

1. 輸入下列命令，然後使用 EC2 金鑰對的名稱來取代 *myKey*。
**注意**  
包含 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 使用者指南》**中的[使用適用於 Java 的 AWS SDK 進行分段上傳](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 SDK 搭配 Amazon S3 APIs 使用分段上傳，將日誌檔案和輸出資料寫入 Amazon 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 EMR 搭配使用的版本控制儲存貯體，建議在 Amazon S3 中啟用生命週期組態規則，以移除過期的物件刪除標記。在版本控制的儲存貯體中刪除物件時，即會建立一個刪除標記。如果物件的舊版本於後續過期，則會留下儲存貯體中的過期物件刪除標記。雖然不會針對刪除標記收費，移除過期的標記可以提升 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 及更高版本時，您可以將 Amazon EMR 搭配 Apache Spark，並與 [Amazon S3 Express One Zone](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-one-zone.html) 儲存類別結合使用，以提高 Spark 作業的效能。Amazon EMR 7.2.0 版和更新版本也支援 HBase、Flink 和 Hive，因此如果您使用這些應用程式，也可以受益於 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 政策必須允許 `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 URI 均使用 `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 政策以連接至該叢集的 Amazon EC2 執行個體設定檔。該 IAM 政策必須具有 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>

接著，建立執行 Spark、HBase、Flink 或 Hive 搭配 S3 Express One Zone 的叢集。下列步驟說明在 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`  |  無  |  S3A 的變更偵測是透過檢查 MD5 型的 `etags` 來運作。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>

將 Amazon EMR 上的 Apache Spark 與 S3 Express One Zone 儲存類別整合時請考量以下事項：
+ 需要 S3A 連接器才能將 S3 Express One Zone 與 Amazon EMR 搭配使用。只有 S3A 具有與 S3 Express One Zone 互動所需的功能和儲存類別。如需了解設定該連接器的步驟，請參閱 [先決條件](#emr-express-one-zone-prereqs)。
+ Amazon S3 Express One Zone 儲存類別支援 SSE-S3 和 SSE-KMS 加密。如需詳細資訊，請參閱[使用 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*。
+ 在 EC2 上的 EMR 上，Amazon EMR 6.15.0 版及更高版本支援 Amazon S3 Express One Zone。此外，Amazon EMR 7.2.0 版及更新版本支援 Amazon EMR on EKS 和 Amazon EMR Serverless。

# 使用 上傳資料 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)。然後，您可以在 AWS 區域 S3 儲存貯體所在的 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)
+ [從串流應用程式存取快取檔案](#cachemapper)
+ [從串流應用程式存取快取檔案](#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 會使用 symlinks 將快取檔案關聯至映射器和縮減器的目前工作目錄。符號連結是檔案位置的別名，而非實際的檔案位置。參數的值 (`yarn-site.xml` 中的 `yarn.nodemanager.local-dirs`) 會指定暫時檔案的位置。Amazon EMR 會將此參數設定為 `/mnt/mapred`，或根據執行個體類型和 EMR 版本而變化。例如，設定可能會有 `/mnt/mapred` 和 `/mnt1/mapred`，因為執行個體類型有兩個暫時性磁碟區。快取檔案位於 `/mnt/mapred/taskTracker/archive` 中的臨時檔案位置的子目錄。

如果您快取單一檔案，DistributedCache 會將該檔案放在 `archive` 目錄中。如果您快取存檔，DistributedCache 會解壓縮檔案，在 `/archive` 中建立子目錄，其名稱與封存檔案名稱相同。個別檔案位於新的子目錄。

您只能在使用串流時使用 DistributedCache。

## 從串流應用程式存取快取檔案
<a name="cachemapper"></a>

若要從您的映射器或縮減器應用程式存取快取的檔案，務必將目前的工作目錄 (./) 新增到您的應用程式，並且如同目前工作目錄中的檔案一般參考快取的檔案。

## 從串流應用程式存取快取檔案
<a name="cacheinconsole"></a>

您可以使用 AWS 管理主控台 和 AWS CLI 來建立使用分散式快取的叢集。

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

**使用新主控台來指定分散式快取檔案**

1. 登入 AWS 管理主控台，並在 https：//[https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr) 開啟 Amazon EMR 主控台。

1. 在左側導覽窗格中的 **EC2 上的 EMR** 下，選擇**叢集**，然後選擇**建立叢集**。

1. 在**步驟**下，選擇**新增步驟**。這會開啟**新增步驟**對話方塊。在**引數**欄位中，納入檔案和存檔以儲存至快取。檔案大小 (或在封存檔案中的檔案大小總和) 必須少於分配的快取大小。

   如果要將個別檔案新增至分散式快取，在檔案放置在本機快取中時，在檔案的名稱和位置、井字號 (\$1)，以及您想要提供給檔案的名稱後面接著指定 `-cacheFile`。下列範例示範如何將個別檔案新增至分散式快取。

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

   如果要將封存檔案新增至分散式快取，請在 Amazon S3 中的檔案的位置、井字號 (\$1)，以及您想要提供給本機快取中檔案集合的名稱後面接著輸入 `-cacheArchive`。下列範例示範如何將封存檔案新增至分散式快取。

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

   在其他對話方塊欄位中輸入適當的值。選項視步驟類型而異。若要新增步驟並結束對話方塊，請選擇**新增步驟**。

1. 選擇適用於您的叢集的任何其他選項。

1. 若要啟動您的叢集，請選擇**建立叢集**。

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

**使用 指定分散式快取檔案 AWS CLI**
+ 若要在叢集建立時提交串流步驟，輸入含 `create-cluster` 參數的 `--steps` 命令。若要使用 指定分散式快取檔案 AWS CLI，請在提交串流步驟時指定適當的引數。

  如果要將個別檔案新增至分散式快取，在檔案放置在本機快取中時，在檔案的名稱和位置、井字號 (\$1)，以及您想要提供給檔案的名稱後面接著指定 `-cacheFile`。

  如果要將封存檔案新增至分散式快取，請在 Amazon S3 中的檔案的位置、井字號 (\$1)，以及您想要提供給本機快取中檔案集合的名稱後面接著輸入 `-cacheArchive`。下列範例示範如何將封存檔案新增至分散式快取。

  如需在 中使用 Amazon EMR 命令的詳細資訊 AWS CLI，請參閱 [https://docs.aws.amazon.com/cli/latest/reference/emr](https://docs.aws.amazon.com/cli/latest/reference/emr)。

**Example 1**  
輸入以下命令來啟動叢集並提交使用 `-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 資料庫，您可從 [ https://github.com/kevinweil/hadoop-lzo](https://github.com/kevinweil/hadoop-lzo) 下載。請注意，因為這是第三方程式庫，Amazon EMR 不提供如何使用此工具的開發人員支援。如需使用資訊，請參閱 [hadoop-lzo 讀我檔。](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 EMR AWS Direct Connect 使用 連線至資料
<a name="emr-plan-input-directconnect"></a>

Direct Connect 是一項服務，可讓您從資料中心、辦公室或主機代管環境建立與 Amazon Web Services 的私有專用網路連線。如果您有大量輸入資料，使用 Direct Connect 可能會降低網路成本、增加頻寬輸送量，並提供比網際網路連線更一致的網路體驗。如需詳細資訊，請參閱 [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 是一項服務，可讓您以faster-than-internet的速度，在 Amazon Simple Storage Service (Amazon S3) 與現場資料儲存位置之間傳輸大量資料。Snowball Edge 支援兩種任務類型：匯入任務和匯出任務。匯入作業涉及將資料從內部部署來源傳輸至 Amazon S3 儲存貯體。匯出作業涉及將資料從 Amazon S3 儲存貯體傳輸至內部部署來源。對於這兩種任務類型，Snowball Edge 裝置可在 Amazon S3 和現場資料儲存位置之間傳輸資料時保護和保護您的資料。Snowball Edge 裝置堅固耐用，受到 AWS Key Management Service () 的保護AWS KMS。如需詳細資訊，請參閱 [AWS Snowball 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 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)頁面上的指示進行操作。

**注意**  
 如果您在**建立儲存貯體**精靈中啟用日誌記錄，則僅啟用儲存貯體存取日誌而非叢集日誌。

**注意**  
如需指定區域特定儲存貯體的詳細資訊，請參閱《*Amazon Simple Storage Service 開發人員指南*[》中的儲存貯](https://docs.aws.amazon.com/AmazonS3/latest/dev/LocationSelection.html)體和區域，以及[適用於 AWS SDKs可用區域端點。 ](https://aws.amazon.com/articles/available-region-endpoints-for-the-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 叢集，您可以使用串聯器/解串器 (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 使用者的儲存貯體。
+  在您或叢集寫入 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
  ```

# 壓縮 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>

 若您的任務會從映射器將大量資料隨機播放到縮減器，啟用中繼資料壓縮可大幅改善效能。可壓縮映射輸出，在資料抵達核心節點時再解壓縮。組態設定為 mapred.compress.map.output。啟用方式與輸出壓縮類似。

 若寫入的是自訂的 Jar，請使用以下命令：

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

## 將 Snappy 程式庫與 Amazon EMR 搭配使用
<a name="emr-using-snappy"></a>

Snappy 是針對速度最佳化處理的壓縮與解壓縮程式庫。Amazon EMR AMI 2.0 版及更新版本均有提供，且是中繼壓縮的預設方式。如需 Snappy 的詳細資訊，請至 [http://code.google.com/p/snappy/](http://code.google.com/p/snappy/)。