

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

# EMR 檔案系統 (EMRFS)
<a name="emr-fs"></a>

**注意**  
從 EMR 7.10.0 版本開始，S3A 檔案系統已取代 EMRFS 做為預設 EMR S3 連接器。

EMR 檔案系統 (EMRFS) 是一種 HDFS 實作，所有 Amazon EMR 叢集會用來從 Amazon EMR 將一般檔案直接讀取和寫入至 Amazon S3。EMRFS 提供將持久性資料儲存在 Amazon S3 的方便性，可讓您與 Hadoop 搭配使用，同時提供資料加密之類的功能。

資料加密可讓您加密物件，EMRFS 會將其寫入 Amazon S3，並讓 EMRFS 在 Amazon S3 中使用加密的物件。如果您使用的是 Amazon EMR 發行版本 4.8.0 或更新版本，您可以使用安全組態來設定 Amazon S3 中 EMRFS 物件的加密，以及其他加密設定。如需詳細資訊，請參閱[加密選項](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-data-encryption-options)。如果使用 Amazon EMR 的舊發行版本，您可以手動設定加密設定。如需詳細資訊，請參閱[使用 EMRFS 屬性來指定 Amazon S3 加密](emr-emrfs-encryption.md)。

Amazon S3 為所有 AWS 區域中的所有 GET、PUT 和 LIST 操作提供強大的先寫後讀一致性。這表示您使用 EMRFS 寫入的內容將從 Amazon S3 中讀取，而不會影響效能。如需詳細資訊，請參閱 [Amazon S3 資料一致性模式](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html#ConsistencyModel)。

使用 Amazon EMR 發行版本 5.10.0 或更新版本時，您可以根據叢集使用者、群組或 Amazon S3 中 EMRFS 資料的位置，來為 EMRFS 請求將不同 IAM 角色用於 Amazon S3。如需詳細資訊，請參閱[設定向 Amazon S3 請求使用 EMRFS 的 IAM 角色](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-emrfs-iam-roles)。

**警告**  
在為執行 Apache Spark 作業的 Amazon EMR 叢集開啟推測性執行之前，請先檢閱下列資訊。  
EMRFS 包括 EMRFS S3 優化的遞交程式，它是一種 OutputCommitter 實作，針對使用 EMRFS 時將檔案寫入至 Amazon S3 的操作進行優化。如果您使用將資料寫入至 Amazon S3 的應用程式開啟 Apache Spark 推測性執行功能，並且不使用 EMRFS S3 優化的遞交程式，則可能會遇到 [SPARK-10063](https://issues.apache.org/jira/browse/SPARK-10063) 中所述的資料正確性問題。如果您使用早於 Amazon EMR 發行版本 5.19 的 Amazon EMR 版本，或以 ORC 和 CSV 等格式將檔案寫入至 Amazon S3，則可能會發生這種情況。EMRFS S3 優化的遞交程式不支援這些格式。如需使用 EMRFS S3 優化的遞交程式的完整需求清單，請參閱 [EMRFS S3 優化的遞交程式的需求](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-committer-reqs.html)。  
在不支援 EMRFS S3 優化的遞交程式時，通常會使用 EMRFS 直接寫入，例如寫入下列內容時：  
Parquet 以外的輸出格式，例如 ORC 或文字。
使用 Spark RDD API 的 Hadoop 檔案。
使用 Hive SerDe 的 Parquet。請參閱 [Hive 中繼存放區 Parquet 資料表轉換](https://spark.apache.org/docs/latest/sql-data-sources-parquet.html#hive-metastore-parquet-table-conversion)。
在下列情況下，不會使用 EMRFS 直接寫入：  
啟用 EMRFS S3 優化的遞交程式時，請參閱 [EMRFS S3 優化的遞交程式的需求](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-committer-reqs.html)。
在將 partitionOverwriteMode 設定為動態的情況下寫入動態分割區時。
在寫入至自訂分割區位置時，例如不符合 Hive 預設分割區位置慣例的位置。
在使用 EMRFS 以外的檔案系統時，例如寫入至 HDFS 或使用 S3A 檔案系統。
若要確定您的應用程式是否在 Amazon EMR 5.14.0 或更新版本中使用直接寫入，請啟用 Spark INFO 日誌記錄。如果 Spark 驅動程式日誌或 Spark 執行程式容器日誌中存在包含文字 "Direct Write: ENABLED" 的日誌行，則您的 Spark 應用程式會使用直接寫入進行寫入。  
依預設，Amazon EMR 叢集上的推測性執行處於 `OFF` 狀態。如果這兩個條件都成立，我們強烈建議您不要開啟推測性執行：  
您正在將資料寫入至 Amazon S3。
資料以 Apache Parquet 以外的格式寫入，或以不使用 EMRFS S3 優化的遞交程式的 Apache Parquet 格式寫入。
如果您開啟 Spark 推測性執行並使用 EMRFS 直接寫入將資料寫入至 Amazon S3，您可能會遇到間歇性資料遺失。當您將資料寫入至 HDFS 或使用 EMRFS S3 優化的遞交程式在 Parquet 中寫入資料時，Amazon EMR 不會使用直接寫入，因此不會發生此問題。  
如果您需要以使用 EMRFS 直接寫入的格式將資料從 Spark 寫入至 Amazon S3，並使用推測性執行，建議寫入至 HDFS，然後使用 S3DistCP 將輸出檔案傳輸至 Amazon S3。

**Topics**
+ [一致性檢視](emr-plan-consistent-view.md)
+ [授權存取 Amazon S3 中的 EMRFS 資料](emr-plan-credentialsprovider.md)
+ [管理預設 AWS Security Token Service 端點](emr-emrfs-sts-endpoint.md)
+ [使用 EMRFS 屬性來指定 Amazon S3 加密](emr-emrfs-encryption.md)

# 一致性檢視
<a name="emr-plan-consistent-view"></a>

**警告**  
2023 年 6 月 1 日，EMRFS 一致性檢視將終止對未來 Amazon EMR 版本的標準支援。EMRFS 一致性檢視將繼續適用於現有版本。

由於 Amazon S3 於 2020 年 12 月 1 日發佈了強大的先寫後讀一致性，因此您不再需要將 EMRFS 一致性檢視 (EMRFS CV) 與 Amazon EMR 叢集搭配使用。EMRFS CV 是一項選用功能，可讓 Amazon EMR 叢集檢查 Amazon S3 物件的清單和先寫後讀一致性。當您建立叢集並開啟 EMRFS CV 時，Amazon EMR 會建立 Amazon DynamoDB 資料庫來儲存物件中繼資料，該資料庫用於追蹤 S3 物件的清單和先寫後讀一致性。現在，您可以關閉 EMRFS CV 並刪除它使用的 DynamoDB 資料庫，這樣就不會產生額外的費用。下列程序說明如何檢查 CV 功能、將其關閉以及刪除此功能使用的 DynamoDB 資料庫。<a name="enable-emr-fs-console"></a>

**檢查您是否正在使用 EMRFS CV 功能**

1. 導覽至**組態**標籤。如果您的叢集具有下列組態，則會使用 EMRFS CV。

   ```
   Classification=emrfs-site,Property=fs.s3.consistent,Value=true
   ```

1. 或者，使用 AWS CLI 以 [`describe-cluster` API](https://docs.aws.amazon.com/cli/latest/reference/emr/describe-cluster.html) 描述您的叢集。如果輸出包含 `fs.s3.consistent: true`，則您的叢集會使用 EMRFS CV。

**在您的 Amazon EMR 叢集上關閉 EMRFS CV**

若要關閉 EMRFS CV 功能，請使用下列三個選項之一。您應在測試環境中測試這些選項，然後再將這些選項套用於生產環境。

1. 

**停止現有的叢集，並在沒有 EMRFS CV 選項的情況下啟動新叢集。**

   1. 停止叢集之前，確保您已備份資料並通知使用者。

   1. 若要停止叢集，請遵循[終止叢集](https://docs.aws.amazon.com/emr/latest/ManagementGuide/UsingEMR_TerminateJobFlow.html)中的指示進行操作。

   1. 如果您使用 Amazon EMR 主控台建立新叢集，請導覽至**進階選項**。在**編輯軟體設定**區段中，取消選取用於開啟 EMRFS CV 的選項。如果 **EMRFS 一致性檢視**的核取方塊可用，請保持不勾選此核取方塊。

   1. 如果您使用 AWS CLI 建立具有 [`create-cluster` API](https://docs.aws.amazon.com/cli/latest/reference/emr/create-cluster.html) 的新叢集，請勿使用 `--emrfs`選項，這會開啟 EMRFS CV。

   1. 如果您使用 SDK CloudFormation 或 建立新的叢集，請勿使用[設定一致檢視](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emrfs-configure-consistent-view.html)中列出的任何組態。

1. 

**複製叢集並移除 EMRFS CV**

   1. 在 Amazon EMR 主控台中，選擇使用 EMRFS CV 的叢集。

   1. 在**叢集詳細資訊**頁面頂端，選擇**複製**。

   1. 選擇**上一步**，然後導覽至**步驟 1：軟體和步驟**。

   1. 在**編輯軟體設定**中，移除 EMRFS CV。在**編輯組態**中，刪除 `emrfs-site` 分類中的下列組態。如果要從 S3 儲存貯體載入 JSON，您必須修改 S3 物件。

      ```
      [
      	{"classification":
      		"emrfs-site",
      		"properties": {
      			"fs.s3.consistent.retryPeriodSeconds":"10",
      			"fs.s3.consistent":"true",
      			"fs.s3.consistent.retryCount":"5",
      			"fs.s3.consistent.metadata.tableName":"EmrFSMetadata"
      		}
      	}
      ]
      ```

1. 

**從使用執行個體群組的叢集中移除 EMRFS CV**

   1. 使用下列命令檢查單一 EMR 叢集是否使用與 EMRFS CV 關聯的 DynamoDB 資料表，或多個叢集是否共用此資料表。資料表名稱在 `fs.s3.consistent.metadata.tableName` 中指定，如[設定一致性檢視](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emrfs-configure-consistent-view.html)中所述。EMRFS CV 使用的預設資料表名稱為 `EmrFSMetadata`。

      ```
      aws emr describe-cluster --cluster-id j-XXXXX | grep fs.s3.consistent.metadata.tableName
      ```

   1. 如果您的叢集未與其他叢集共用 DynamoDB 資料庫，請使用下列命令重新設定叢集並停用 EMRFS CV。如需詳細資訊，請參閱[重新設定執行中叢集中的執行個體群組](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-running-cluster.html)。

      ```
      aws emr modify-instance-groups --cli-input-json file://disable-emrfs-1.json
      ```

      此命令會開啟您要修改的檔案。使用下列組態修改檔案。

      ```
      {
      	"ClusterId": "j-xxxx",
      	"InstanceGroups": [
      		{
      			"InstanceGroupId": "ig-xxxx",
      			"Configurations": [
      				{
      					"Classification": "emrfs-site",
      					"Properties": {
      						"fs.s3.consistent": "false"
      					},
      					"Configurations": []
      				}
      			]
      		}
      	]
      }
      ```

   1. 如果您的叢集與其他叢集共用 DynamoDB 資料表，請在沒有叢集修改共用 S3 位置中的任何物件時關閉所有叢集上的 EMRFS CV。

**刪除與 EMRFS CV 關聯的 Amazon DynamoDB 資源**

從 Amazon EMR 叢集中移除 EMRFS CV 之後，刪除與 EMRFS CV 關聯的 DynamoDB 資源。在執行此操作之前，您將繼續產生與 EMRFS CV 關聯的 DynamoDB 費用。

1. 檢查 DynamoDB 資料表的 CloudWatch 指標，並確認任何叢集都未使用此資料表。

1. 刪除 DynamoDB 資料表。

   ```
   aws dynamodb delete-table --table-name <your-table-name>
   ```

**刪除與 EMRFS CV 關聯的 Amazon SQS 資源**

1. 如果已將叢集設定為將不一致通知推送至 Amazon SQS，您可以刪除所有 SQS 佇列。

1. 尋找 `fs.s3.consistent.notification.SQS.queueName` 中指定的 Amazon SQS 佇列名稱，如[設定一致性檢視](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emrfs-configure-consistent-view.html)中所述。預設佇列名稱格式為 `EMRFS-Inconsistency-<j-cluster ID>`。

   ```
   aws sqs list-queues | grep ‘EMRFS-Inconsistency’
   aws sqs delete-queue –queue-url <your-queue-url>
   ```

**停止使用 EMRFS CLI**
+ [EMRFS CLI](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emrfs-cli-reference.html) 會管理 EMRFS CV 產生的中繼資料。隨著對 EMRFS CV 的標準支援在 Amazon EMR 的未來版本中終止，對 EMRFS CLI 的支援也將終止。

**Topics**
+ [啟用一致性檢視](enable-consistent-view.md)
+ [了解 EMRFS 一致性檢視如何在 Amazon S3 中追蹤物件](emrfs-files-tracked.md)
+ [重試邏輯](emrfs-retry-logic.md)
+ [EMRFS 一致檢視中繼資料](emrfs-metadata.md)
+ [設定 CloudWatch 和 Amazon SQS 的一致性通知](emrfs-configure-sqs-cw.md)
+ [設定一致性檢視](emrfs-configure-consistent-view.md)
+ [EMRFS CLI 命令參考](emrfs-cli-reference.md)

# 啟用一致性檢視
<a name="enable-consistent-view"></a>

您可以使用 AWS 管理主控台、 或 組態分類，為 EMRFS 啟用 Amazon S3 伺服器端加密或一致性檢視。 AWS CLI `emrfs-site` <a name="enable-emr-fs-console"></a>

**使用主控台設定一致性檢視**

1. 導覽至新的 Amazon EMR 主控台，然後從側邊導覽選取**切換至舊主控台**。如需有關切換至舊主控台時預期情況的詳細資訊，請參閱[使用舊主控台](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in)。

1. 選擇 **Create cluster (建立叢集)**，然後選擇 **Go to advanced options (前往進階選項)**。

1. 針對 **Step 1: Software and Steps (步驟 1：軟體和步驟)** 和 **Step 2: Hardware (步驟 2：硬體)** 選擇設定。

1. 針對 **Step 3: General Cluster Settings (步驟 3：一般叢集設定)**，在 **Additional Options (其他選項)**，選擇 **EMRFS consistent view (EMRFS 一致性檢視)**。

1. 針對 **EMRFS Metadata store (EMRFS 中繼資料存放區)**，輸入中繼資料存放區的名稱。預設值為 **EmrFSMetadata**。如果 EmrFSMetadata 資料表不存在，則會在 DynamoDB 中為您建立。
**注意**  
叢集終止時，Amazon EMR 不會自動從 DynamoDB 中移除 EMRFS 中繼資料。

1. 針對 **Number of retries (重試數)**，輸入整數值。如果偵測到不一致，EMRFS 會嘗試以此次數來呼叫 Amazon S3。預設值為 **5**。

1. 針對 **Retry period (in seconds) (重試期間 (以秒為單位))**，輸入整數值。這是 EMRFS 在重試之間等待的時間。預設值為 **10**。
**注意**  
系統會透過指數退避執行後續的重試動作。

**使用 啟動已啟用一致性檢視的叢集 AWS CLI**

我們建議您安裝 的目前版本 AWS CLI。若要下載最新版本，請參閱 [https://aws.amazon.com/cli/](https://aws.amazon.com/cli/)。
+ 
**注意**  
包含 Linux 行接續字元 (\$1) 是為了提高可讀性。它們可以在 Linux 命令中移除或使用。對於 Windows，請將其移除或取代為插入符號 (^)。

  ```
  1. aws emr create-cluster --instance-type m5.xlarge --instance-count 3 --emrfs Consistent=true \
  2. --release-label emr-7.12.0 --ec2-attributes KeyName=myKey
  ```

**使用 檢查是否已啟用一致性檢視 AWS 管理主控台**
+ 若要檢查是否在主控台上啟用一致性檢視，導覽到 **Cluster List (叢集清單)** 並選擇您的叢集名稱以檢視 **Cluster Details (叢集詳細資訊)**。「EMRFS 一致性檢視」欄位的值為 `Enabled` 或 `Disabled`。

**若要透過檢查 `emrfs-site.xml` 檔案來查看一致性檢視是否已啟用**
+ 您可以透過檢查叢集的主節點上的 `emrfs-site.xml` 組態檔案中來確認一致性是否啟用。如果 `fs.s3.consistent` 的布林值設為 `true`，則會針對涉及 Amazon S3 的檔案系統操作啟用一致性檢視。

# 了解 EMRFS 一致性檢視如何在 Amazon S3 中追蹤物件
<a name="emrfs-files-tracked"></a>

EMRFS 會透過將這些物件的相關資訊新增至 EMRFS 中繼資料，來在 Amazon S3 中建立物件的一致性檢視。EMRFS 會在以下狀況將這些清單新增至中繼資料：
+  在 Amazon EMR 作業過程由 EMRFS 寫入的物件。
+  會使用 EMRFS CLI 將物件與 EMRFS 中繼資料進行同步，或將物件匯入 EMRFS 中繼資料。

EMRFS 讀取的物件不會自動新增到中繼資料。當 EMRFS 刪除物件時，清單仍會維持在中繼資料中，且保持已刪除的狀態，直到使用 EMRFS CLI 將該清單清除為止。若要進一步了解 CLI，請參閱 [EMRFS CLI 命令參考](emrfs-cli-reference.md)。如需有關在 EMRFS 中繼資料清除清單的詳細資訊，請參閱 [EMRFS 一致檢視中繼資料](emrfs-metadata.md)。

對於每個 Amazon S3 操作，EMRFS 會檢查中繼資料是否有一致性檢視中一組物件的相關資訊。如果在這些操作中 EMRFS 發現 Amazon S3 是不一致的，則會根據在 `emrfs-site` 組態屬性中定義的參數重試操作。在 EMRFS 用完重試數後，它會擲出 `ConsistencyException` 或記錄例外狀況並繼續工作流程。如需關於重試日誌的詳細資訊，請參閱 [重試邏輯](emrfs-retry-logic.md)。您可以在日誌中找到 `ConsistencyExceptions`，例如：
+  listStatus：沒有適用於中繼資料項目 `/S3_bucket/dir/object` 的 Amazon S3 物件
+  getFileStatus：金鑰 `dir/file` 存在於中繼資料，但不在 Amazon S3 中

如果您直接從 EMRFS 一致性檢視追蹤的 Amazon S3 中刪除物件，EMRFS 會將該物件視為不一致，因為其仍然存在於 Amazon S3 所列的中繼資料。如果您的中繼資料與 EMRFS 在 Amazon S3 中追蹤的物件不同步，您可以使用 EMRFS CLI 的 **sync** 子命令重設中繼資料以反映 Amazon S3。為了探索中繼資料與 Amazon S3 之間的差異，請使用 **diff**。最後，EMRFS 只有在中繼資料中參考之物件的一致性檢視，可以是同一個 Amazon S3 路徑中的其他物件 (但未受到追蹤)。EMRFS 列出 Amazon S3 路徑中的物件時，會傳回在中繼資料以及該 Amazon S3 路徑中追蹤的物件超集合。

# 重試邏輯
<a name="emrfs-retry-logic"></a>

EMRFS 經特定次數的嘗試，為在中繼資料中追蹤的物件驗證清單一致性。預設值為 5。除非 `fs.s3.consistent.throwExceptionOnInconsistency` 是設定為 `false`，其中它只會記錄以不一致的形式而追蹤的物件，否則為避免超過重試次數，原始任務會傳回錯誤。根據預設，EMRFS 使用指數退避重試政策，但您也可以將它設為固定政策。使用者也可以為特定時段而進行嘗試，再繼續其他任務，而無需擲回例外狀況。他們可以透過將 `fs.s3.consistent.throwExceptionOnInconsistency` 設為 `false`、將 `fs.s3.consistent.retryPolicyType` 設為 `fixed` 和將 `fs.s3.consistent.retryPeriodSeconds` 設為所需的值而達成此目的。以下範例會建立已啟用一致性的叢集，其會記錄不一致且將固定重試間隔設為 10 秒：

**Example 將重試期間設為固定數量**  

```
aws emr create-cluster --release-label emr-7.12.0 \
--instance-type m5.xlarge --instance-count 1 \
--emrfs Consistent=true,Args=[fs.s3.consistent.throwExceptionOnInconsistency=false, fs.s3.consistent.retryPolicyType=fixed,fs.s3.consistent.retryPeriodSeconds=10] --ec2-attributes KeyName=myKey
```

**注意**  
包含 Linux 行接續字元 (\$1) 是為了提高可讀性。它們可以在 Linux 命令中移除或使用。對於 Windows，請將其移除或取代為插入符號 (^)。

如需詳細資訊，請參閱[一致性檢視](emr-plan-consistent-view.md)。

## IMDS 的 EMRFS 組態可取得區域呼叫
<a name="randomized-exponential-backoff-retry"></a>

EMRFS 依賴 IMDS （執行個體中繼資料服務） 來取得執行個體區域和 Amazon S3、DynamoDB 或 AWS KMS 端點。但是，IMDS 對它可以處理的請求數量有限制，超過該限制的請求將會失敗。此 IMDS 限制可能會導致 EMRFS 無法初始化，並導致查詢或命令失敗。您可以使用下列隨機化指數退避重試機制和 emrfs-site.xml 中的退避區域組態屬性，來解決所有重試失敗的案例。

```
<property>
    <name>fs.s3.region.retryCount</name>
    <value>3</value>
    <description>
    Maximum retries that would be attempted to get AWS region.
    </description>
</property>
<property>
    <name>fs.s3.region.retryPeriodSeconds</name>
    <value>3</value>
    <description>
    Base sleep time in second for each get-region retry.
    </description>
</property>
<property>
    <name>fs.s3.region.fallback</name>
    <value>us-east-1</value>
    <description>
    Fallback to this region after maximum retries for getting AWS region have been reached.
    </description>
</property>
```

# EMRFS 一致檢視中繼資料
<a name="emrfs-metadata"></a>

EMRFS 一致性檢視會使用 DynamoDB 資料表來追蹤一致性，以便追蹤 Amazon S3 中的物件是否已與 EMRFS 同步或由 EMRFS 建立。中繼資料會用於追蹤所有操作 (讀取、寫入、更新和副本)，在該應用程式中也沒有存放實際內容。此中繼資料可用來驗證從 Amazon S3 收到的物件或中繼資料是否如預期一樣。這個確認讓 EMRFS 能夠為 EMRFS 寫入至 Amazon S3 的新物件或使用 EMRFS 同步的物件，檢查清單一致性和先寫後讀一致性。多個叢集可以共用相同的中繼資料。

**如何將項目新增到中繼資料**  
您可以使用 `sync` 或 `import` 子命令來將項目新增至中繼資料。`sync` 會反映 Amazon S3 物件在路徑中的狀態，同時嚴格使用 `import` 以將新項目新增至中繼資料。如需詳細資訊，請參閱[EMRFS CLI 命令參考](emrfs-cli-reference.md)。

**如何檢查 Amazon S3 內中繼資料與物件之間的差異**  
若要檢查中繼資料與 Amazon S3 之間的差異，請使用 EMRFS CLI 的 `diff` 子命令。如需詳細資訊，請參閱[EMRFS CLI 命令參考](emrfs-cli-reference.md)。

**如何知道中繼資料操作正在受到節流**  
EMRFS 集預設會將對中繼資料讀取和寫入操作的輸送容量限制設在 500 個和 100 個單位。大量物件或儲存貯體可能會導致操作超過此容量，在達到此限制時 DynamoDB 將對操作限流。例如，如果您執行的操作超過這些容量限制，應用程式可能會導致 EMRFS 擲出 `ProvisionedThroughputExceededException`。在限流時，EMRFS CLI 工具會嘗試使用[指數退避](https://docs.aws.amazon.com/general/latest/gr/api-retries.html)，來重試寫入 DynamoDB 資料表，直到操作完成或達到將物件從 Amazon EMR 寫入至 Amazon S3 的最大重試值。

您可以設定自己的輸送容量限制。但是，DynamoDB 對讀取和寫入操作具有每秒 3,000 個讀取容量單位 (RCU) 和 1,000 個寫入容量單位 (WCU) 的分割區限制限制。為了避免因限流而導致 `sync` 故障，建議您將讀取操作的輸送量限制為少於 3,000 個 RCU，將寫入操作的輸送量限制為少於 1,000 個 WCU。如需有關設定自訂輸送容量限制的指示，請參閱 [設定一致性檢視](emrfs-configure-consistent-view.md)。

您也可以在 DynamoDB 主控台針對 EMRFS 中繼資料檢視 Amazon CloudWatch 指標，而您可在該主控台查看讀取和寫入請求的限流數。如果您有非零值節流請求，應用程式可能會為讀取或寫入操作增加分配輸送容量而受益。如果您發現操作在讀取或寫入很長一段時間後即將接近最大分配輸送容量，您也可以實現效能優勢。

**顯著 EMRFS 操作的輸送量特性**  
讀取和寫入操作的預設分別是 400 和 100 輸送容量單位。以下效能特性讓您能掌握特定操作所需的輸送量。使用單一節點的 `m3.large` 叢集執行這些測試。所有操作皆是進行單一執行緒處理。效能會根據特定的應用程式特性而有所不同，且可能需要試驗來最佳化檔案系統操作。


| 作業  | 每秒讀取平均值  | 每秒寫入平均值  | 
| --- | --- | --- | 
| 建立 (物件) | 26.79 |  6.70 | 
| 刪除 (物件) | 10.79 |  10.79 | 
| 刪除 (包含 1000 個物件的目錄) | 21.79 | 338.40  | 
|  getFileStatus (物件) | 34.70 | 0  | 
| getFileStatus (目錄) | 19.96 | 0 | 
| listStatus (包含 1 個物件的目錄) | 43.31 | 0 | 
| listStatus (包含 10 個物件的目錄) | 44.34 | 0 | 
| listStatus (包含 100 個物件的目錄) | 84.44 | 0 | 
| listStatus (包含 1,000 個物件的目錄) | 308.81 | 0 | 
| listStatus (包含 10,000 個物件的目錄) | 416.05 | 0 | 
| listStatus (包含 100,000 個物件的目錄) | 823.56 | 0 | 
| listStatus (包含 100 萬個物件的目錄) | 882.36 | 0 | 
| mkdir (持續 120 秒)  | 24.18 | 4.03 | 
| mkdir | 12.59 | 0 | 
| 重新命名 (物件) | 19.53 | 4.88 | 
| 重新命名 (包含 1000 個物件的目錄) | 23.22 | 339.34 | 

**若要提交步驟，以將舊資料從您的中繼資料存放區中清除**  
使用者可能希望在 DynamoDB 型中繼資料中移除特定項目。這可協助降低與資料表關聯的儲存成本。使用者可以透過使用 EMRFS CLI `delete` 子指令，手動或以程式設計方式清除特定項目。不過，如果您將項目從中繼資料刪除，EMRFS 將不再進行任何一致性檢查。

透過將最後一個步驟提交到叢集 (亦即在 EMRFS CLI 上執行命令)，即可在完成任務後以程式設計的方式完成清除。例如，輸入下列命令來將步驟提交到您的叢集，以刪除保存時間超過兩天的所有項目。

```
aws emr add-steps --cluster-id j-2AL4XXXXXX5T9 --steps Name="emrfsCLI",Jar="command-runner.jar",Args=["emrfs","delete","--time","2","--time-unit","days"]
{
    "StepIds": [
        "s-B12345678902"
    ]
}
```

使用傳回的 StepId 值來檢查操作的結果日誌。

# 設定 CloudWatch 和 Amazon SQS 的一致性通知
<a name="emrfs-configure-sqs-cw"></a>

針對 Amazon S3 最終一致性問題，您可以在 EMRFS 中啟用 CloudWatch 指標和 Amazon SQS 訊息。

**CloudWatch**  
當 CloudWatch 指標啟用時，會在 `FileSystem` API 呼叫因為 Amazon S3 最終一致性而失敗時推送名為**一致性**的指標。

**針對 Amazon S3 最終一致性問題檢視 CloudWatch 指標**

若要在 CloudWatch 主控台中檢視**一致性**指標，請選取 EMRFS 指標，然後選取 **JobFlowId**/**公制名稱**對。例如：`j-162XXXXXXM2CU ListStatus` 和 `j-162XXXXXXM2CU GetFileStatus` 等等。

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在 **Dashboard (儀表板)** 的 **Metrics (指標)** 區段，選擇 **EMRFS**。

1. 在 **Job Flow Metrics (任務流程指標)** 窗格中，選擇一或多個 ** JobFlowId**/**Metric Name (指標名稱)** 對。圖形呈現的指標會顯示在以下視窗中。

**Amazon SQS**  
當啟用 Amazon SQS 通知時，名稱為 `EMRFS-Inconsistency-<jobFlowId>` 的 Amazon SQS 佇列會在 EMRFS 初始化時加以建立。當 `FileSystem` API 呼叫由於 Amazon S3 最終一致性而失敗時，即會將 Amazon SQS 訊息推送至佇列。訊息包含 JobFlowId、API、不一致路徑的清單、堆疊追蹤之類的資訊。您可以使用 Amazon SQS 主控台或使用 EMRFS `read-sqs` 命令來讀取訊息。

**若要管理 Amazon SQS 訊息，確認是否有 Amazon S3 最終一致性問題**

您可以使用 EMRFS CLI 讀取 Amazon SQS 訊息，確認是否有 Amazon S3 最終一致性問題。若要從 EMRFS Amazon SQS 佇列讀取訊息，請鍵入 `read-sqs` 命令，並在主節點的本機檔案系統上指定輸出位置以產生輸出檔案。

您也可以使用 `delete-sqs` 命令來刪除 EMRFS Amazon SQS 佇列。

1. 若要從 Amazon SQS 佇列讀取訊息，請鍵入下列命令。將 *queuename* 取代為您設定的 Amazon SQS 佇列的名稱，並將 */path/filename* 取代為輸出檔案的路徑：

   ```
   emrfs read-sqs --queue-name queuename --output-file /path/filename
   ```

   例如，若要從預設佇列讀取和輸出 Amazon SQS 訊息，請鍵入：

   ```
   emrfs read-sqs --queue-name EMRFS-Inconsistency-j-162XXXXXXM2CU --output-file /path/filename
   ```
**注意**  
您也可以使用 `-q` 和 `-o` 捷徑 (而非 `--queue-name` 和 `--output-file`)。

1. 若要刪除 Amazon SQS 佇列，請鍵入下列命令：

   ```
   emrfs delete-sqs --queue-name queuename
   ```

   例如，若要刪除預設佇列，請輸入：

   ```
   emrfs delete-sqs --queue-name EMRFS-Inconsistency-j-162XXXXXXM2CU
   ```
**注意**  
您也可以使用 `-q` 捷徑 (而非 `--queue-name`)。

# 設定一致性檢視
<a name="emrfs-configure-consistent-view"></a>

您可以透過使用 `emrfs-site` 屬性的組態屬性來提供其他設定，以設定這些設定來進行一致性檢視使用。例如，您可以透過將下列引數提供給 CLI `--emrfs` 選項，使用 emrfs-site 組態分類 (Amazon EMR 發行版本 4.x 及更新版本)，或引導操作在主節點上設定 emrfs-site.xml 檔案，以選擇不同的預設 DynamoDB 輸送量：

**Example 在叢集啟動時變更預設中繼資料的讀取和寫入值**  

```
aws emr create-cluster --release-label emr-7.12.0 --instance-type m5.xlarge \
--emrfs Consistent=true,Args=[fs.s3.consistent.metadata.read.capacity=600,\
fs.s3.consistent.metadata.write.capacity=300] --ec2-attributes KeyName=myKey
```

或者，您可以使用下列組態檔案，並將它儲存在本機或 Amazon S3：

```
[
    {
      "Classification": "emrfs-site",
      "Properties": {
        "fs.s3.consistent.metadata.read.capacity": "600",
        "fs.s3.consistent.metadata.write.capacity": "300"
      }
    }
 ]
```

使用透過以下語法而建立的組態：

```
aws emr create-cluster --release-label emr-7.12.0 --applications Name=Hive \
--instance-type m5.xlarge --instance-count 2 --configurations file://./myConfig.json
```

**注意**  
包含 Linux 行接續字元 (\$1) 是為了提高可讀性。它們可以在 Linux 命令中移除或使用。對於 Windows，請將其移除或取代為插入符號 (^)。

您可以使用組態或 AWS CLI `--emrfs`引數設定下列選項。如需有關那些引數的更多資訊，請參閱 [AWS CLI 命令參考](https://docs.aws.amazon.com/cli/latest/reference/)。


**一致性檢視的 `emrfs-site.xml` 內容**  

| 屬性  | 預設值 | Description  | 
| --- | --- | --- | 
| fs.s3.consistent | false |  設為 **true** 時，此屬性會設定 EMRFS 使用 DynamoDB 以提供一致性。  | 
| fs.s3.consistent.retryPolicyType | exponential | 此屬性會在重試一致性問題時識別要使用的政策。選項包括：指數、固定或無。 | 
| fs.s3.consistent.retryPeriodSeconds | 1 | 此屬性會設定在一致性重試次數之間的等待時間長度。 | 
| fs.s3.consistent.retryCount | 10 | 此屬性會設定在偵測到不一致時的重試次數上限。 | 
| fs.s3.consistent.throwExceptionOnInconsistency | true | 此屬性會決定是否擲出或記錄一致性例外狀況。設為 true 時，即會擲出 ConsistencyException。 | 
| fs.s3.consistent.metadata.autoCreate | true | 設為 true 時，此屬性會啟用中繼資料資料表的自動建立。 | 
| fs.s3.consistent.metadata.etag.verification.enabled | true | 在 Amazon EMR 5.29.0 中，預設會啟用此屬性。啟用時，EMRFS 會使用 S3 ETags 來驗證正在讀取的物件是否為最新的可用版本。此功能適用於更新後讀取的使用案例，其中在 S3 上的檔案被覆寫，同時保有相同名稱。此 ETag 驗證功能目前不適用於 S3 Select。 | 
| fs.s3.consistent.metadata.tableName | EmrFSMetadata | 此屬性會指定在 DynamoDB 中的中繼資料資料表名稱。 | 
| fs.s3.consistent.metadata.read.capacity | 500 | 此屬性會指定在中繼資料資料表建立時 DynamoDB 要佈建的讀取容量。 | 
| fs.s3.consistent.metadata.write.capacity | 100 | 此屬性會指定在中繼資料資料表建立時 DynamoDB 要佈建的寫入容量。 | 
| fs.s3.consistent.fastList | true | 設為 true 時，此屬性會使用多個執行緒列出目錄 (依需要)。必須啟用一致性才能使用此屬性。 | 
| fs.s3.consistent.fastList.prefetchMetadata | false | 設為 true 時，此屬性可讓中繼資料預先擷取包含超過 20,000 個項目的目錄。 | 
| fs.s3.consistent.notification.CloudWatch | false | 設為 true 時，會針對因 Amazon S3 最終一致性問題而失敗的 FileSystem API 呼叫啟用 CloudWatch 指標。 | 
| fs.s3.consistent.notification.SQS | false | 設為 true 時，最終一致性通知會推送至 Amazon SQS 佇列。 | 
| fs.s3.consistent.notification.SQS.queueName | EMRFS-Inconsistency-<jobFlowId> | 變更此屬性可讓您為有關 Amazon S3 最終一致性問題的訊息指定自己的 SQS 佇列名稱。 | 
| fs.s3.consistent.notification.SQS.customMsg | none | 此屬性可讓您指定在有關 Amazon S3 最終一致性問題之 SQS 訊息中所含的自訂訊息。如果未針對此屬性指定值，訊息中的對應欄位則為空。 | 
| fs.s3.consistent.dynamodb.endpoint | none | 此屬性可讓您指定自訂的 DynamoDB 端點以供一致性檢視中繼資料使用。 | 
| fs.s3.useRequesterPaysHeader | false | 設定為 true 時，此屬性允許 Amazon S3 向啟用了請求付款人選項的儲存貯體發出請求。 | 

# EMRFS CLI 命令參考
<a name="emrfs-cli-reference"></a>

依預設，EMRFS CLI 會安裝在使用 Amazon EMR 發行版本 3.2.1 或更新版本建立之所有叢集主節點上。您可以使用 EMRFS CLI 來管理一致性檢視的中繼資料。

**注意**  
僅支援使用 VT100 終端模擬以執行 **emrfs** 命令。不過，它可以使用其他終端機模擬器模式。

## emrfs 頂層命令
<a name="emrfs-top-level"></a>

支援以下結構的 **emrfs** 頂層命令。

```
emrfs [describe-metadata | set-metadata-capacity | delete-metadata | create-metadata | \
list-metadata-stores | diff | delete | sync | import ] [options] [arguments]
```

如下表所述，指定 [選項]，其中包含或不含 [引數]。如需子命令專屬的 [選項] (`describe-metadata`、`set-metadata-capacity` 等)，請參閱以下每個子命令。


**適用於 emrfs 的 [選項]**  

| 選項  | Description  | 必要  | 
| --- | --- | --- | 
|  `-a AWS_ACCESS_KEY_ID \| --access-key AWS_ACCESS_KEY_ID`  |  您用來將物件寫入 Amazon S3 和在 DynamoDB 中建立或存取中繼資料存放區的 AWS 存取金鑰。在預設情況下，*AWS\$1ACCESS\$1KEY\$1ID* 會設為用來建立叢集的存取金鑰。  |  否  | 
|  `-s AWS_SECRET_ACCESS_KEY \| --secret-key AWS_SECRET_ACCESS_KEY`  |  與您用來將物件寫入 Amazon S3，以及在 DynamoDB 中建立或存取中繼資料存放區的存取金鑰相關聯的 AWS 私密金鑰。在預設情況下，*AWS\$1SECRET\$1ACCESS\$1KEY* 會設為用來建立叢集之與存取金鑰關聯的私密金鑰。  |  否  | 
|  `-v \| --verbose`  |  使輸出最詳細。  |  否  | 
|  `-h \| --help`  |  顯示 `emrfs` 命令的協助訊息，內含使用陳述式。  |  否  | 

## emrfs 描述中繼資料子命令
<a name="emrfs-describe-metadata"></a>


**適用於 emrfs describe-metadata 的 [選項]**  

| 選項  | Description  | 必要  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME* 是 DynamoDB 中繼資料資料表的名稱。如果未提供 *METADATA\$1NAME* 引數，預設值是 `EmrFSMetadata`。  |  否  | 

**Example emrfs 描述中繼資料範例**  <a name="emrfs-describe-metadata"></a>
以下範例說明預設的中繼資料表格。  

```
$ emrfs describe-metadata
EmrFSMetadata
  read-capacity: 400
  write-capacity: 100
  status: ACTIVE
  approximate-item-count (6 hour delay): 12
```

## emrfs 設定中繼資料容量子命令
<a name="emrfs-set-metadata-capacity"></a>


**適用於 emrfs set-metadata-capacity 的 [選項]**  

| 選項  | Description  | 必要  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME* 是 DynamoDB 中繼資料資料表的名稱。如果未提供 *METADATA\$1NAME* 引數，預設值是 `EmrFSMetadata`。  |  否  | 
|  `-r READ_CAPACITY \| --read-capacity READ_CAPACITY`  |  中繼資料資料表的請求讀取輸送容量。如果未提供 *READ\$1CAPACITY* 引數，預設值是 `400`。  |  否  | 
|  `-w WRITE_CAPACITY \| --write-capacity WRITE_CAPACITY`  |  中繼資料資料表的請求寫入輸送容量。如果未提供 *WRITE\$1CAPACITY* 引數，預設值是 `100`。  |  否  | 

**Example emrfs 設定中繼資料容量範例**  
以下範例會將讀取輸送容量設為 `600` 而寫入容量設為 `150` 以供名為 `EmrMetadataAlt` 的中繼資料資料表使用。  

```
$ emrfs set-metadata-capacity --metadata-name EmrMetadataAlt  --read-capacity 600 --write-capacity 150
  read-capacity: 400
  write-capacity: 100
  status: UPDATING
  approximate-item-count (6 hour delay): 0
```

## emrfs 刪除中繼資料子命令
<a name="emrfs-delete-metadata"></a>


**適用於 emrfs delete-metadata 的 [選項]**  

| 選項  | Description  | 必要  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME* 是 DynamoDB 中繼資料資料表的名稱。如果未提供 *METADATA\$1NAME* 引數，預設值是 `EmrFSMetadata`。  |  否  | 

**Example emrfs 刪除中繼資料範例**  
以下範例會刪除預設的中繼資料資料表。  

```
$ emrfs delete-metadata
```

## emrfs 建立中繼資料子命令
<a name="emrfs-create-metadata"></a>


**適用於 emrfs create-metadata 的 [選項]**  

| 選項  | Description  | 必要  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME* 是 DynamoDB 中繼資料資料表的名稱。如果未提供 *METADATA\$1NAME* 引數，預設值是 `EmrFSMetadata`。  |  否  | 
|  `-r READ_CAPACITY \| --read-capacity READ_CAPACITY`  |  中繼資料資料表的請求讀取輸送容量。如果未提供 *READ\$1CAPACITY* 引數，預設值是 `400`。  |  否  | 
|  `-w WRITE_CAPACITY \| --write-capacity WRITE_CAPACITY`  |  中繼資料資料表的請求寫入輸送容量。如果未提供 *WRITE\$1CAPACITY* 引數，預設值是 `100`。  |  否  | 

**Example emrfs 建立中繼資料範例**  
以下範例請求建立名為「`EmrFSMetadataAlt`」的中繼資料資料表。  

```
$ emrfs create-metadata -m EmrFSMetadataAlt
Creating metadata: EmrFSMetadataAlt
EmrFSMetadataAlt
  read-capacity: 400
  write-capacity: 100
  status: ACTIVE
  approximate-item-count (6 hour delay): 0
```

## emrfs 列出中繼資料存放區子命令
<a name="emrfs-list-metadata-stores"></a>

**emrfs list-metadata-stores** 子命令沒有 [options]。

**Example List-metadata-stores 範例**  
以下範例列出您的中繼資料資料表。  

```
$ emrfs list-metadata-stores
  EmrFSMetadata
```

## emrfs 差異子命令
<a name="emrfs-diff"></a>


**適用於 emrfs diff 的 [選項]**  

| 選項  | Description  | 必要  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME* 是 DynamoDB 中繼資料資料表的名稱。如果未提供 *METADATA\$1NAME* 引數，預設值是 `EmrFSMetadata`。  |  否  | 
|  *s3://s3Path*  |  Amazon S3 儲存貯體的路徑會與中繼資料資料表相比較。以遞迴的方式同步儲存貯體。  |  是  | 

**Example emrfs 差異範例**  
下列範例會將預設中繼資料資料表與 Amazon S3 儲存貯體相比較。  

```
$ emrfs diff s3://elasticmapreduce/samples/cloudfront
BOTH | MANIFEST ONLY | S3 ONLY
DIR elasticmapreduce/samples/cloudfront
DIR elasticmapreduce/samples/cloudfront/code/
DIR elasticmapreduce/samples/cloudfront/input/
DIR elasticmapreduce/samples/cloudfront/logprocessor.jar
DIR elasticmapreduce/samples/cloudfront/input/XABCD12345678.2009-05-05-14.WxYz1234
DIR elasticmapreduce/samples/cloudfront/input/XABCD12345678.2009-05-05-15.WxYz1234
DIR elasticmapreduce/samples/cloudfront/input/XABCD12345678.2009-05-05-16.WxYz1234
DIR elasticmapreduce/samples/cloudfront/input/XABCD12345678.2009-05-05-17.WxYz1234
DIR elasticmapreduce/samples/cloudfront/input/XABCD12345678.2009-05-05-18.WxYz1234
DIR elasticmapreduce/samples/cloudfront/input/XABCD12345678.2009-05-05-19.WxYz1234
DIR elasticmapreduce/samples/cloudfront/input/XABCD12345678.2009-05-05-20.WxYz1234
DIR elasticmapreduce/samples/cloudfront/code/cloudfront-loganalyzer.tgz
```

## emrfs 刪除子命令
<a name="emrfs-delete"></a>


**適用於 emrfs delete 的 [選項]**  

|  選項  |  Description  |  必要  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME* 是 DynamoDB 中繼資料資料表的名稱。如果未提供 *METADATA\$1NAME* 引數，預設值是 `EmrFSMetadata`。  |  否  | 
|  *s3://s3Path*  |  您追蹤以進行一致性檢視之 Amazon S3 儲存貯體路徑。以遞迴的方式同步儲存貯體。  |  是  | 
| -t TIME \$1 --time TIME |  過期時間 (使用時間單位引數來解釋)。會針對指定儲存貯體將所有早於 *TIME* 引數的中繼資料項目予以刪除。  |  | 
|  `-u UNIT \| --time-unit UNIT`  |  用來解譯時間引數 (奈秒、微秒、毫秒、秒、分鐘、小時或天) 的測量。如果未指定任何引數，預設值會是 `days` 秒。  |  | 
|  `--read-consumption READ_CONSUMPTION`  |  用於 **delete** 操作之可用讀取輸送量的請求量。如果未提供 *READ\$1CONSUMPTION* 引數，預設值是 `400`。  |  否   | 
|  `--write-consumption WRITE_CONSUMPTION`  |  用於 **delete** 操作之可用寫入輸送量的請求量。如果未提供 *WRITE\$1CONSUMPTION* 引數，預設值是 `100`。  |  否  | 

**Example emrfs 刪除範例**  
下列範例會將 Amazon S3 儲存貯體中的所有物件從一致性檢視的追蹤中繼資料中移除。  

```
$ emrfs delete s3://elasticmapreduce/samples/cloudfront
entries deleted: 11
```

## emrfs 匯入子命令
<a name="emrfs-import"></a>


**適用於 emrfs import 的 [選項]**  

| 選項  | Description  | 必要  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME* 是 DynamoDB 中繼資料資料表的名稱。如果未提供 *METADATA\$1NAME* 引數，預設值是 `EmrFSMetadata`。  |  否  | 
|  *s3://s3Path*  |  您追蹤以進行一致性檢視之 Amazon S3 儲存貯體路徑。以遞迴的方式同步儲存貯體。  |  是  | 
|  `--read-consumption READ_CONSUMPTION`  |  用於 **delete** 操作之可用讀取輸送量的請求量。如果未提供 *READ\$1CONSUMPTION* 引數，預設值是 `400`。  |  否  | 
|  `--write-consumption WRITE_CONSUMPTION`  |  用於 **delete** 操作之可用寫入輸送量的請求量。如果未提供 *WRITE\$1CONSUMPTION* 引數，預設值是 `100`。  |  否  | 

**Example emrfs 匯入範例**  
下列範例會使用一致性檢視的追蹤中繼資料來匯入 Amazon S3 儲存貯體中的所有物件。所有不明的金鑰皆遭到忽略。  

```
$ emrfs import s3://elasticmapreduce/samples/cloudfront
```

## emrfs 同步子命令
<a name="emrfs-sync"></a>


**適用於 emrfs sync 的 [選項]**  

| 選項  | Description  | 必要  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME* 是 DynamoDB 中繼資料資料表的名稱。如果未提供 *METADATA\$1NAME* 引數，預設值是 `EmrFSMetadata`。  |  否  | 
|  *s3://s3Path*  |  您追蹤以進行一致性檢視之 Amazon S3 儲存貯體路徑。以遞迴的方式同步儲存貯體。  |  是  | 
|  `--read-consumption READ_CONSUMPTION`  |  用於 **delete** 操作之可用讀取輸送量的請求量。如果未提供 *READ\$1CONSUMPTION* 引數，預設值是 `400`。  |  否  | 
|  `--write-consumption WRITE_CONSUMPTION`  |  用於 **delete** 操作之可用寫入輸送量的請求量。如果未提供 *WRITE\$1CONSUMPTION* 引數，預設值是 `100`。  |  否  | 

**Example emrfs 同步子命令範例**  
下列範例會使用一致性檢視的追蹤中繼資料來匯入 Amazon S3 儲存貯體中的所有物件。所有不明的金鑰皆遭到刪除。  

```
$ emrfs sync s3://elasticmapreduce/samples/cloudfront
Synching samples/cloudfront                                       0 added | 0 updated | 0 removed | 0 unchanged
Synching samples/cloudfront/code/                                 1 added | 0 updated | 0 removed | 0 unchanged
Synching samples/cloudfront/                                      2 added | 0 updated | 0 removed | 0 unchanged
Synching samples/cloudfront/input/                                9 added | 0 updated | 0 removed | 0 unchanged
Done synching s3://elasticmapreduce/samples/cloudfront            9 added | 0 updated | 1 removed | 0 unchanged
creating 3 folder key(s)
folders written: 3
```

## emrfs 讀取 sqs 子命令
<a name="emrfs-read-sqs"></a>


**適用於 emrfs read-sqs 的 [選項]**  

| 選項  | Description  | 必要  | 
| --- | --- | --- | 
|  `-q QUEUE_NAME \| --queue-name QUEUE_NAME`  |  *QUEUE\$1NAME* 是在 `emrfs-site.xml` 中設定的 Amazon SQS 佇列名稱。預設值為 **EMRFS-Inconsistency-<jobFlowId>**。  |  是  | 
|  `-o OUTPUT_FILE \| --output-file OUTPUT_FILE`  |  *OUTPUT\$1FILE* 是主節點本機檔案系統上的輸出檔路徑。從佇列中讀取的訊息會寫入這個檔案。  |  是  | 

## emrfs 刪除 sqs 子命令
<a name="emrfs-delete-sqs"></a>


**適用於 emrfs delete-sqs 的 [選項]**  

| 選項  | Description  | 必要  | 
| --- | --- | --- | 
|  `-q QUEUE_NAME \| --queue-name QUEUE_NAME`  |  *QUEUE\$1NAME* 是在 `emrfs-site.xml` 中設定的 Amazon SQS 佇列名稱。預設值為 **EMRFS-Inconsistency-<jobFlowId>**。  |  是  | 

## 提交 EMRFS CLI 命令作為步驟
<a name="emrfs-submit-steps-as-cli"></a>

下列範例示範如何透過利用 AWS CLI 或 API 和 在主節點上使用 `emrfs`公用程式`command-runner.jar`，以執行 `emrfs`命令做為步驟。此範例使用 適用於 Python (Boto3) 的 AWS SDK 將步驟新增至叢集，將 Amazon S3 儲存貯體中的物件新增至預設 EMRFS 中繼資料資料表。

```
import boto3
from botocore.exceptions import ClientError


def add_emrfs_step(command, bucket_url, cluster_id, emr_client):
    """
    Add an EMRFS command as a job flow step to an existing cluster.

    :param command: The EMRFS command to run.
    :param bucket_url: The URL of a bucket that contains tracking metadata.
    :param cluster_id: The ID of the cluster to update.
    :param emr_client: The Boto3 Amazon EMR client object.
    :return: The ID of the added job flow step. Status can be tracked by calling
             the emr_client.describe_step() function.
    """
    job_flow_step = {
        "Name": "Example EMRFS Command Step",
        "ActionOnFailure": "CONTINUE",
        "HadoopJarStep": {
            "Jar": "command-runner.jar",
            "Args": ["/usr/bin/emrfs", command, bucket_url],
        },
    }

    try:
        response = emr_client.add_job_flow_steps(
            JobFlowId=cluster_id, Steps=[job_flow_step]
        )
        step_id = response["StepIds"][0]
        print(f"Added step {step_id} to cluster {cluster_id}.")
    except ClientError:
        print(f"Couldn't add a step to cluster {cluster_id}.")
        raise
    else:
        return step_id


def usage_demo():
    emr_client = boto3.client("emr")
    # Assumes the first waiting cluster has EMRFS enabled and has created metadata
    # with the default name of 'EmrFSMetadata'.
    cluster = emr_client.list_clusters(ClusterStates=["WAITING"])["Clusters"][0]
    add_emrfs_step(
        "sync", "s3://elasticmapreduce/samples/cloudfront", cluster["Id"], emr_client
    )


if __name__ == "__main__":
    usage_demo()
```

您可以使用傳回的 `step_id` 值來檢查操作的結果日誌。

# 授權存取 Amazon S3 中的 EMRFS 資料
<a name="emr-plan-credentialsprovider"></a>

依預設，EC2 的 EMR 角色會決定存取 Amazon S3 中的 EMRFS 資料的許可。附接至此角色 (無論是使用者或群組) IAM 政策套用會透過 EMRFS 來發出請求。預設值為 `EMR_EC2_DefaultRole`。如需詳細資訊，請參閱[叢集 EC2 執行個體的服務角色 (EC2 執行個體設定檔)](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-role-for-ec2.html)。

從 Amazon EMR 發行版本 5.10.0 開始，您也可以使用安全組態來為 EMRFS 指定 IAM 角色。這可讓您為有多個使用者的叢集將 EMRFS 請求的許可自訂為 Amazon S3。您可以為不同使用者和群組，並根據 Amazon S3 中的字首為不同的 Amazon S3 儲存貯體指定不同 IAM 角色。當 EMRFS 對 Amazon S3 發出請求，以符合您指定的使用者、群組或位置，叢集會使用您指定的對應角色，而不是適用於 EC2 的 EMR 角色。如需詳細資訊，請參閱[設定向 Amazon S3 請求使用 EMRFS 的 IAM 角色](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-emrfs-iam-roles)。

或者，如果您的 Amazon EMR 解決方案所要求的已超出 EMRFS 的 IAM 角色所能提供的，您可以定義自訂登入資料供應商類別，其可讓您自訂 Amazon S3 中 EMRFS 資料的存取權。

## 為 Amazon S3 中的 EMRFS 資料建立自訂憑證提供者
<a name="emr-create-credentialsprovider"></a>

若要建立自訂登入資料供應商，您實作 [ AWSCredentialsProvider](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/AWSCredentialsProvider.html) 和 Hadoop [可設定的](https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/conf/Configurable.html)類別。

如需此方法的詳細說明，請參閱 大數據部落格中的 AWS [使用 EMRFS 安全地分析來自另一個 AWS 帳戶](https://aws.amazon.com/blogs/big-data/securely-analyze-data-from-another-aws-account-with-emrfs)的資料。部落格文章包含的教學課程，可逐步引導您完成從 IAM 角色到啟動叢集的端對端程序。它還提供一個 Java 程式碼範例，其會實作自訂登入資料供應商類別。

基本步驟如下：

**若要指定自訂登入資料供應商**

1. 建立自訂登入資料供應商類別 (編譯為 JAR 檔案)。

1. 執行指令碼做為引導操作來將自訂登入資料供應商 JAR 檔案複製到在叢集主節點的 `/usr/share/aws/emr/emrfs/auxlib` 位置。如需有關引導操作的詳細資訊，請參閱 [(選用) 建立引導操作以安裝其他軟體](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-bootstrap.html)。

1. 自訂 `emrfs-site` 分類以指定您在 JAR 檔案中實作的類別。如需有關指定組態物件以自訂應用程式的詳細資訊，請參閱《Amazon EMR 版本指南》**中的[設定應用程式](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html)。

   以下範例示範 `create-cluster` 命令，其會啟動 Hive 叢集與常見的組態參數，而且還包括：
   + 執行指令碼 `copy_jar_file.sh` 的引導操作，此指令碼會儲存至 Amazon S3 中的 `amzn-s3-demo-bucket`。
   + `emrfs-site` 分類，其會指定在 JAR 檔中定義做為 `MyCustomCredentialsProvider` 的自訂登入資料供應商
**注意**  
包含 Linux 行接續字元 (\$1) 是為了提高可讀性。它們可以在 Linux 命令中移除或使用。對於 Windows，請將其移除或取代為插入符號 (^)。

   ```
   aws emr create-cluster --applications Name=Hive \
   --bootstrap-actions '[{"Path":"s3://amzn-s3-demo-bucket/copy_jar_file.sh","Name":"Custom action"}]' \
   --ec2-attributes '{"KeyName":"MyKeyPair","InstanceProfile":"EMR_EC2_DefaultRole",\
   "SubnetId":"subnet-xxxxxxxx","EmrManagedSlaveSecurityGroup":"sg-xxxxxxxx",\
   "EmrManagedMasterSecurityGroup":"sg-xxxxxxxx"}' \
   --service-role EMR_DefaultRole_V2 --enable-debugging --release-label emr-7.12.0 \
   --log-uri 's3n://amzn-s3-demo-bucket/' --name 'test-awscredentialsprovider-emrfs' \
   --instance-type=m5.xlarge --instance-count 3  \
   --configurations '[{"Classification":"emrfs-site",\
   "Properties":{"fs.s3.customAWSCredentialsProvider":"MyAWSCredentialsProviderWithUri"},\
   "Configurations":[]}]'
   ```

# 管理預設 AWS Security Token Service 端點
<a name="emr-emrfs-sts-endpoint"></a>

EMRFS 使用 AWS Security Token Service (STS) 擷取暫時安全登入資料，以存取您的 AWS 資源。舊版 Amazon EMR 發行版本會將所有 AWS STS 請求傳送至位於 的單一全域端點`https://sts.amazonaws.com`。Amazon EMR 發行版本 5.31.0 和 6.1.0 及更新版本會改為向區域 AWS STS 端點提出請求。這可以減少延遲並提高工作階段字符有效性。如需端點的詳細資訊 AWS STS ，請參閱*AWS Identity and Access Management 《 使用者指南*》中的[AWS STS 在 AWS 區域中管理](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) 。

在您使用 Amazon EMR 發行版本 5.31.0 和 6.1.0 及更新版本時，您可以覆寫預設 AWS STS 端點。若要執行此操作，您必須變更 `emrfs-site` 組態中的 `fs.s3.sts.endpoint` 屬性。

下列 AWS CLI 範例會將 EMRFS 使用的預設 AWS STS 端點設定為全域端點。

```
aws emr create-cluster --release-label <emr-5.33.0> --instance-type m5.xlarge \
--emrfs Args=[fs.s3.sts.endpoint=https://sts.amazonaws.com]
```

**注意**  
包含 Linux 行接續字元 (\$1) 是為了提高可讀性。它們可以在 Linux 命令中移除或使用。對於 Windows，請將其移除或取代為插入符號 (^)。

或者，您可以使用下列範例建立 JSON 組態檔案，並使用 `emr create-cluster` 的 `--configurations` 引數來指定它。如需有關使用 `--configurations,` 的詳細資訊，請參閱[《AWS CLI 命令參考》**](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/emr/create-cluster.html)。

```
[
  {
    "classification": "emrfs-site",
    "properties": {
      "fs.s3.sts.endpoint": "https://sts.amazonaws.com"
    }
  }
]
```

# 使用 EMRFS 屬性來指定 Amazon S3 加密
<a name="emr-emrfs-encryption"></a>

**重要**  
從 Amazon EMR 發行版本 4.8.0 開始，您可以使用安全組態設定來更輕鬆地並透過更多選項套用加密設定。我們建議您使用安全組態。如需詳細資訊，請參閱[設定資料加密](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-create-security-configuration.html#emr-security-configuration-encryption)。本節所述的主控台說明在 4.8.0 之前的發行版本提供。如果您使用 AWS CLI 在叢集組態和後續版本的安全組態中設定 Amazon S3 加密，則安全組態會覆寫叢集組態。

建立叢集時，您可以使用主控台或透過 或 EMR SDK 使用`emrfs-site`分類屬性，為 Amazon S3 中的 EMRFS 資料指定伺服器端加密 (SSE) AWS CLI 或用戶端加密 (CSE)。Amazon S3 SSE 和 CSE 互斥；您可以選擇其中之一，但無法同時選擇。

如需 AWS CLI 說明，請參閱下方適用於加密類型的適當區段。

**使用 指定 EMRFS 加密選項 AWS 管理主控台**

1. 導覽至新的 Amazon EMR 主控台，然後從側邊導覽選取**切換至舊主控台**。如需有關切換至舊主控台時預期情況的詳細資訊，請參閱[使用舊主控台](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in)。

1. 選擇 **Create cluster (建立叢集)**，然後選擇 **Go to advanced options (前往進階選項)**。

1. 選擇 4.7.2 或之前的 **Release (版本)**。

1. 選擇適用於應用程式的 **Software and Steps (軟體和步驟)** 的其他選項，然後選擇 **Next (下一步)**。

1. 選擇在 **Hardware (硬體)** 和 **General Cluster Settings (一般叢集設定)** 窗格中適用於您的應用程式的設定。

1. 在 **Security (安全)** 窗格上，在 **Authentication and encryption (身分驗證和加密)** 下，選取要使用的 **S3 Encryption (with EMRFS) (S3 加密 (搭配 EMRFS))**。
**注意**  
**使用 KMS 金鑰管理的 S3 伺服器端加密** (SSE-KMS) 在使用 Amazon EMR 發行版本 4.4 或更早版本時無法使用。
   + 如果您選擇使用 **AWS 金鑰管理**的選項，請選擇 **AWS KMS 金鑰 ID**。如需詳細資訊，請參閱[使用 AWS KMS keys 進行 EMRFS 加密](#emr-emrfs-awskms)。
   + 如果您選擇 **S3 client-side encryption with custom materials provider (S3 用戶端加密搭配自訂資料供應商)**，請提供 **Class name (類別名稱)** 和 **JAR location (JAR 位置)**。如需詳細資訊，請參閱[Amazon S3 用戶端加密](emr-emrfs-encryption-cse.md)。

1. 選擇適用於應用程式的其他選項，然後選擇 **Create Cluster (建立叢集)**。

## 使用 AWS KMS keys 進行 EMRFS 加密
<a name="emr-emrfs-awskms"></a>

 AWS KMS 加密金鑰必須在與 Amazon EMR 叢集執行個體和與 EMRFS 搭配使用的 Amazon S3 儲存貯體相同的區域中建立。如果您指定的金鑰與用來設定叢集的帳戶位於不同的帳戶中，您必須使用其 ARN 指定金鑰。

Amazon EC2 執行個體設定檔的角色必須具有使用您指定的 KMS 金鑰的許可。Amazon EMR 中執行個體設定檔的預設角色為 `EMR_EC2_DefaultRole`。如果您對執行個體設定檔使用不同的角色，或向 Amazon S3 請求使用 EMRFS 的 IAM 角色，請確保每個角色都會視情況新增為金鑰使用者。這會授予角色使用 KMS 金鑰的許可。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的[使用金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users)和[設定向 Amazon S3 請求使用 EMRFS 的 IAM 角色](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-emrfs-iam-roles.html)。

您可以使用 AWS 管理主控台 將執行個體描述檔或 EC2 執行個體描述檔新增至指定 KMS 金鑰的金鑰使用者清單，或使用 AWS CLI 或 AWS SDK 連接適當的金鑰政策。

請記住，Amazon EMR 僅支援[對稱 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks)。您無法使用[非對稱 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html#asymmetric-cmks)來加密 Amazon EMR 叢集中的靜態資料。如需判斷 KMS 金鑰為對稱或非對稱的說明，請參閱[識別對稱和非對稱 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/find-symm-asymm.html)。

下面的程序描述如何使用 AWS 管理主控台新增預設 Amazon EMR 執行個體設定檔 `EMR_EC2_DefaultRole` 作為*金鑰使用者*。這裡假設您已建立 KMS 金鑰。若要建立新的 KMS 金鑰，請參閱《AWS Key Management Service 開發人員指南》**中的[建立金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。

**將 Amazon EMR 的 EC2 執行個體設定檔新增至加密金鑰使用者的清單**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms) 的 AWS Key Management Service (AWS KMS) 主控台。

1. 若要變更 AWS 區域，請使用頁面右上角的區域選擇器。

1. 選取要修改的 KMS 金鑰別名。

1. 在 **Key Users (金鑰使用者)** 下的金鑰詳細資訊頁面上，選擇 **Add (新增)**。

1. 在 **Add key users (新增金鑰使用者)** 對話方塊中，選取適當的角色。預設角色的名稱為 `EMR_EC2_DefaultRole`。

1. 選擇**新增**。

## Amazon S3 伺服器端加密
<a name="emr-emrfs-encryption-sse"></a>

所有 Amazon S3 儲存貯體都已預設設定加密，且所有上傳至 S3 儲存貯體的新物件都會在靜態時自動加密，Amazon S3 會在將資料寫入磁碟時加密物件層級的資料，並在存取資料時解密資料。如需有關 SSE 的詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[使用伺服器端加密保護資料](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。

當您在 Amazon EMR 中指定 SSE 時，您可以在兩種不同的金鑰管理系統中選擇：
+ **SSE-S3** – Amazon S3 為您管理密鑰。
+ **SSE-KMS** – 您可以使用 AWS KMS key 來設定適用於 Amazon EMR 的政策。如需 Amazon EMR 金鑰需求的詳細資訊，請參閱[使用 AWS KMS keys 進行加密](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-encryption-enable.html#emr-awskms-keys)。

使用客戶提供的金鑰的 SSE (SSE-C) 不適用於 Amazon EMR。

**使用 建立已啟用 SSE-S3 的叢集 AWS CLI**
+ 鍵入以下命令：

  ```
  aws emr create-cluster --release-label emr-4.7.2 or earlier \
  --instance-count 3 --instance-type m5.xlarge --emrfs Encryption=ServerSide
  ```

您也可以透過在 `emrfs-site` 屬性中將 fs.s3.enableServerSideEncryption 屬性設定為 true 來啟用 SSE-S3。請參閱以下 SSE-KMS 的範例並省略金鑰 ID 屬性。

**使用 建立已啟用 SSE-KMS 的叢集 AWS CLI**
**注意**  
SSE-KMS 僅能在 Amazon EMR 發行版本 4.5.0 及更新版本中使用。
+ 輸入下列 AWS CLI 命令以使用 SSE-KMS 建立叢集，其中 *keyID* 為 AWS KMS key，例如 *a4567b8-9900-12ab-1234-123a45678901*：

  ```
  aws emr create-cluster --release-label emr-4.7.2 or earlier --instance-count 3 \
  --instance-type m5.xlarge --use-default-roles \
  --emrfs Encryption=ServerSide,Args=[fs.s3.serverSideEncryption.kms.keyId=keyId]
  ```

  **--或--**

  使用 `emrfs-site`分類輸入下列 AWS CLI 命令，並提供包含內容的組態 JSON 檔案，如以下`myConfig.json`範例所示：

  ```
  aws emr create-cluster --release-label emr-4.7.2 or earlier --instance-count 3 --instance-type m5.xlarge --applications Name=Hadoop --configurations file://myConfig.json --use-default-roles
  ```

  範例內容 **myConfig.json**：

  ```
  [
    {
      "Classification":"emrfs-site",
      "Properties": {
         "fs.s3.enableServerSideEncryption": "true",
         "fs.s3.serverSideEncryption.kms.keyId":"a4567b8-9900-12ab-1234-123a45678901"
      }
    }
  ]
  ```

### SSE-S3 和 SSE-KMS 的組態屬性
<a name="emr-emrfs-encryption-site-sse-properties"></a>

可使用 `emrfs-site` 組態分類以設定這些屬性。SSE-KMS 僅能在 Amazon EMR 發行版本 4.5.0 及更新版本中使用。


| 屬性  | 預設值 | Description  | 
| --- | --- | --- | 
| fs.s3.enableServerSideEncryption | false |  設定為 **true** 時，會使用伺服器端加密對儲存在 Amazon S3 中的物件加密。如果沒有指定金鑰，則會使用 SSE-S3。  | 
| fs.s3.serverSideEncryption.kms.keyId | n/a |  指定 AWS KMS 金鑰 ID 或 ARN。如果已指定金鑰，則會使用 SSE-KMS。  | 

# Amazon S3 用戶端加密
<a name="emr-emrfs-encryption-cse"></a>

使用 Amazon S3 用戶端加密，Amazon S3 加密及解密會在您 EMR 叢集上的 EMRFS 用戶端中進行。物件在上傳至 Amazon S3 之前會先加密，並在下載後解密。您指定的提供者會提供用戶端使用的加密金鑰。用戶端可以使用 AWS KMS (CSE-KMS) 提供的金鑰或提供用戶端根金鑰 (CSE-C) 的自訂 Java 類別。CSE-KMS 和 CSE-C 之間的加密細節略有不同，具體取決於指定的提供者和要解密或加密之物件的中繼資料。如需有關這些差異的詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[使用用戶端加密保護資料](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html)。

**注意**  
Amazon S3 CSE 只能確保與 Amazon S3 交換的 EMRFS 資料經過加密；而不會加密叢集執行個體磁碟區上的所有資料。此外，由於 Hue 不使用 EMRFS，因此 Hue S3 檔案瀏覽器寫入到 Amazon S3 的物件不會被加密。

**使用 為 Amazon S3 中的 EMRFS 資料指定 CSE-KMS AWS CLI**
+ 鍵入下列命令，並將 *MyKMSKeyID* 取代為要使用的 KMS 金鑰的金鑰 ID 或 ARN：

  ```
  aws emr create-cluster --release-label emr-4.7.2 or earlier
  --emrfs Encryption=ClientSide,ProviderType=KMS,KMSKeyId=MyKMSKeyId
  ```

## 建立自訂金鑰提供者
<a name="emr-emrfs-create-cse-key"></a>

根據您在建立自訂金鑰提供者時使用的加密類型，應用程式也必須實作不同的 EncryptionMaterialsProvider 介面。適用於 Java 的 AWS 開發套件 1.11.0 版及更新版本提供這兩個界面。
+ 若要實作 Amazon S3 加密，請使用 [ com.amazonaws.services.s3.model.EncryptionMaterialsProvider 介面](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/EncryptionMaterialsProvider.html)。
+ 若要實作本機磁碟加密，請使用 [ com.amazonaws.services.elasticmapreduce.spi.security.EncryptionMaterialsProvider 介面](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/elasticmapreduce/spi/security/EncryptionMaterialsProvider.html)。

您可以使用任何策略來為實作提供加密資料。例如，您可以選擇提供靜態加密資料，或與更複雜的金鑰管理系統整合。

如果您使用 Amazon S3 加密，則必須將加密演算法 **AES/GCM/NoPadding** 用於自訂加密資料。

如果您使用的是本機磁碟加密，則用於自訂加密資料的加密演算法會因 EMR 版本而有所不同。對於 Amazon EMR 7.0.0 及更低版本，您必須使用 **AES/GCM/NoPadding**。對於 Amazon EMR 7.1.0 及更高版本，您必須使用 **AES**。

EncryptionMaterialsProvider 類別會透過加密內容取得加密資料。Amazon EMR 會在執行期填入加密內容資訊，以協助呼叫者判斷要傳回的正確加密資料。

**Example 範例：透過 EMRFS 使用自訂金鑰提供者進行 Amazon S3 加密**  
當 Amazon EMR 從 EncryptionMaterialsProvider 類別擷取加密資料以執行加密時，EMRFS 會選擇性地將 materialsDescription 引數填入兩個欄位：物件的 Amazon S3 URI 和叢集的 JobFlowId (可供 EncryptionMaterialsProvider 類別使用以選擇性地傳回加密資料)。  
例如，提供者可能會針對不同的 Amazon S3 URI 字首傳回不同的金鑰。這是傳回的加密資料的描述，最終會與 Amazon S3 物件一起儲存，而不是 EMRFS 產生並傳遞給提供者的 materialsDescription 值。解密 Amazon S3 物件時，加密資料描述會傳遞至 EncryptionMaterialsProvider 類別，以便再次選擇性地傳回相符的金鑰以解密物件。  
下面提供了 EncryptionMaterialsProvider 參考實作。另一個自訂提供者 [EMRFSRSAEncryptionMaterialsProvider](https://github.com/awslabs/emr-sample-apps/tree/master/emrfs-plugins/EMRFSRSAEncryptionMaterialsProvider) 可從 GitHub 取得。  

```
import com.amazonaws.services.s3.model.EncryptionMaterials;
import com.amazonaws.services.s3.model.EncryptionMaterialsProvider;
import com.amazonaws.services.s3.model.KMSEncryptionMaterials;
import org.apache.hadoop.conf.Configurable;
import org.apache.hadoop.conf.Configuration;

import java.util.Map;

/**
 * Provides KMSEncryptionMaterials according to Configuration
 */
public class MyEncryptionMaterialsProviders implements EncryptionMaterialsProvider, Configurable{
  private Configuration conf;
  private String kmsKeyId;
  private EncryptionMaterials encryptionMaterials;

  private void init() {
    this.kmsKeyId = conf.get("my.kms.key.id");
    this.encryptionMaterials = new KMSEncryptionMaterials(kmsKeyId);
  }

  @Override
  public void setConf(Configuration conf) {
    this.conf = conf;
    init();
  }

  @Override
  public Configuration getConf() {
    return this.conf;
  }

  @Override
  public void refresh() {

  }

  @Override
  public EncryptionMaterials getEncryptionMaterials(Map<String, String> materialsDescription) {
    return this.encryptionMaterials;
  }

  @Override
  public EncryptionMaterials getEncryptionMaterials() {
    return this.encryptionMaterials;
  }
}
```

## 使用 指定自訂資料提供者 AWS CLI
<a name="emr-emrfs-encryption-cse-custom-cli"></a>

若要使用 AWS CLI，請將 `Encryption`、`ProviderType`、`CustomProviderClass` 和 `CustomProviderLocation` 引數傳遞給 `emrfs` 選項。

```
aws emr create-cluster --instance-type m5.xlarge --release-label emr-4.7.2 or earlier --emrfs Encryption=ClientSide,ProviderType=Custom,CustomProviderLocation=s3://amzn-s3-demo-bucket/myfolder/provider.jar,CustomProviderClass=classname
```

將 `Encryption` 設定為 `ClientSide` 會啟用用戶端加密，`CustomProviderClass` 是 `EncryptionMaterialsProvider` 物件的名稱，而 `CustomProviderLocation` 是本機 或 Amazon S3 位置，Amazon EMR 會從其中將 `CustomProviderClass` 複製到叢集中每個節點並將其置於 classpath。

## 使用 SDK 指定自訂資料提供者
<a name="emr-emrfs-encryption-cse-custom-sdk"></a>

若要使用 SDK,，您可以設定屬性 `fs.s3.cse.encryptionMaterialsProvider.uri` 以將您儲存在 Amazon S3 中的自訂 `EncryptionMaterialsProvider` 類別下載至叢集中的每個節點。您在 `emrfs-site.xml` 檔案 (已啟用 CSE) 中進行此設定以及自訂的供應商的適當位置。

例如， 適用於 Java 的 AWS SDK 在使用 RunJobFlowRequest 的 中，您的程式碼可能如下所示：

```
<snip>
		Map<String,String> emrfsProperties = new HashMap<String,String>();
	    	emrfsProperties.put("fs.s3.cse.encryptionMaterialsProvider.uri","s3://amzn-s3-demo-bucket/MyCustomEncryptionMaterialsProvider.jar");
	    	emrfsProperties.put("fs.s3.cse.enabled","true");
	    	emrfsProperties.put("fs.s3.consistent","true");
		    emrfsProperties.put("fs.s3.cse.encryptionMaterialsProvider","full.class.name.of.EncryptionMaterialsProvider");

		Configuration myEmrfsConfig = new Configuration()
	    	.withClassification("emrfs-site")
	    	.withProperties(emrfsProperties);

		RunJobFlowRequest request = new RunJobFlowRequest()
			.withName("Custom EncryptionMaterialsProvider")
			.withReleaseLabel("emr-7.12.0")
			.withApplications(myApp)
			.withConfigurations(myEmrfsConfig)
			.withServiceRole("EMR_DefaultRole_V2")
			.withJobFlowRole("EMR_EC2_DefaultRole")
			.withLogUri("s3://myLogUri/")
			.withInstances(new JobFlowInstancesConfig()
				.withEc2KeyName("myEc2Key")
				.withInstanceCount(2)
				.withKeepJobFlowAliveWhenNoSteps(true)
				.withMasterInstanceType("m5.xlarge")
				.withSlaveInstanceType("m5.xlarge")
			);						
					
		RunJobFlowResult result = emr.runJobFlow(request);
</snip>
```

## 具有參數的自訂 EncryptionMaterialsProvider
<a name="emr-emrfs-encryption-custommaterials"></a>

您可能需要直接將引數傳遞給供應商。若要這樣做，您可以使用 `emrfs-site` 組態分類與定義為屬性的自訂引數。其中一個範例組態如下所示，其會儲存為檔案 (`myConfig.json`)：

```
[
    {
      "Classification": "emrfs-site",
      "Properties": {
        "myProvider.arg1":"value1",
	    "myProvider.arg2":"value2"
      }
    }
 ]
```

使用來自 的 `create-cluster`命令 AWS CLI，您可以使用 `--configurations`選項來指定 檔案，如下所示：

```
aws emr create-cluster --release-label emr-7.12.0 --instance-type m5.xlarge --instance-count 2 --configurations file://myConfig.json --emrfs Encryption=ClientSide,CustomProviderLocation=s3://amzn-s3-demo-bucket/myfolder/myprovider.jar,CustomProviderClass=classname
```

## 設定 EMRFS S3EC V2 支援
<a name="emr-emrfs-encryption-cse-s3v2"></a>

S3 Java SDK 版本 (1.11.837 及更新版本) 支援具有各種安全增強功能的加密用戶端第 2 版 (S3EC V2)。如需詳細資訊，請參閱 S3 部落格文章 [Amazon S3 加密用戶端的更新](https://aws.amazon.com/blogs/developer/updates-to-the-amazon-s3-encryption-client/)。此外，請參閱[《 開發人員指南》中的 Amazon S3 加密用戶端遷移](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/s3-encryption-migration.html)。 適用於 Java 的 AWS SDK 

SDK 中仍提供加密用戶端 V1 以實現回溯相容性。依預設，如果已啟用 CSE，EMRFS 將使用 S3EC V1 來加密和解密 S3 物件。

在發行版本早於 emr-5.31.0 (emr-5.30.1 及更早版本、emr-6.1.0 及更早版本) 的 EMR 叢集上，EMRFS 無法解密使用 S3EC V2 加密的 S3 物件。

**Example 將 EMRFS 設定為使用 S3EC V2**  
若要將 EMRFS 設定為使用 S3EC V2，請新增下列組態：  

```
{
  "Classification": "emrfs-site",
  "Properties": {
    "fs.s3.cse.encryptionV2.enabled": "true"
  }
}
```

## Amazon S3 用戶端加密的 `emrfs-site.xml` 屬性
<a name="emr-emrfs-cse-config"></a>


| 屬性  | 預設值 | Description  | 
| --- | --- | --- | 
| fs.s3.cse.enabled | false |  設定為 **true** 時，會使用用戶端加密對儲存在 Amazon S3 中的 EMRFS 物件加密。  | 
| fs.s3.cse.encryptionV2.enabled | false |  設定為 `true` 時，EMRFS 會使用 S3 加密用戶端第 2 版來加密和解密 S3 上的物件。適用於 EMR 5.31.0 版及更新版本。  | 
| fs.s3.cse.encryptionMaterialsProvider.uri | N/A | 當使用自訂加密資料。具有 EncryptionMaterialsProvider 的 JAR 所在的 Amazon S3 URI。當您提供此 URI 時，Amazon EMR 會自動將 JAR 下載至叢集中的所有節點。 | 
| fs.s3.cse.encryptionMaterialsProvider | N/A |  與用戶端加密搭配使用的 `EncryptionMaterialsProvider` 類別路徑。使用 CSE-KMS 時，指定 `com.amazon.ws.emr.hadoop.fs.cse.KMSEncryptionMaterialsProvider`。  | 
| fs.s3.cse.materialsDescription.enabled | false |  設定為 `true` 時，會使用物件的 Amazon S3 URI 和 JobFlowId 填入加密物件的 materialsDescription。當使用自訂加密資料時，設為 `true`。  | 
| fs.s3.cse.kms.keyId | N/A |  使用 CSE-KMS 時進行套用。用於加密的 KMS 金鑰的 KeyId、ARN 或別名的值。  | 
| fs.s3.cse.cryptoStorageMode | ObjectMetadata  |  Amazon S3 儲存模式。預設情況下，加密資訊的描述會儲存在物件中繼資料。您也可以將說明存放在指令檔案。有效值為 ObjectMetadata 和 InstructionFile。如需詳細資訊，請參閱[使用 適用於 Java 的 AWS SDK 和 Amazon S3 進行用戶端資料加密](https://aws.amazon.com/articles/client-side-data-encryption-with-the-aws-sdk-for-java-and-amazon-s3/)。  | 