

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# EMR ファイルシステム (EMRFS)
<a name="emr-fs"></a>

**注記**  
EMR 7.10.0 リリース以降、S3A ファイルシステムは EMRFS をデフォルトの EMR S3 コネクタとして置き換えました。

EMR ファイルシステム (EMRFS) は、すべての Amazon EMR クラスターが Amazon EMR と Amazon S3 の間で通常のファイルを直接読み書きするために使用する HDFS の実装です。EMRFS には Hadoop で使用するために Amazon S3 に永続的なデータを保存するという利便性がある一方で、データの暗号化などの機能も用意されています。

データの暗号化により、EMRFS が Amazon S3 に書き込むオブジェクトが暗号化され、Amazon S3 の暗号化されたオブジェクトを EMRFS で操作できるようになります。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 データの場所に基づいて、Amazon S3 への EMRFS リクエストに異なる IAM ロールを使用できます。詳細については、「[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 にデータを書き込み、EMRFS S3 最適化コミッターを使用しないアプリケーションで Apache Spark 投機的実行機能をオンにすると、「[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 直接書き込みは、通常、次を書き込むときなどの、EMRFS S3 最適化コミッターがサポートされていないときに使用されます。  
ORC やテキストなどの、Parquet 以外の出力形式。
Spark RDD API を使用する Hadoop ファイル。
Hive SerDe を使用する Parquet。「[Hive metastore Parquet table conversion](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 を dynamic に設定して動的パーティションを書き込むとき。
Hive のデフォルトのパーティションの場所規則に準拠しない場所などの、カスタムのパーティションの場所に書き込むとき。
HDFS への書き込みや S3A ファイルシステムの使用など、EMRFS 以外のファイルシステムを使用するとき。
アプリケーションが Amazon EMR 5.14.0 以降で直接書き込みを使用しているかどうかを判別するには、Spark INFO ログ記録を有効にします。「Direct Write: ENABLED」というテキストを含むログ行が Spark ドライバーログまたは Spark エグゼキューターコンテナログのいずれかに存在する場合、Spark アプリケーションが直接書き込みを使用して書き込んだことがわかります。  
Amazon EMR クラスターでは、投機的実行はデフォルトで `OFF` になっています。次の条件が両方ともあてはまる場合は、投機的実行をオンにしないことを強くお勧めします。  
データを Amazon S3 に書き込む場合。
データを Apache Parquet 以外の形式で、または Apache Parquet 形式だが EMRFS S3 最適化コミッターを使用せずに書き込む場合。
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 日以降、その後リリースされる Amazon EMR では、EMRFS の整合性のあるビューに標準サポートは提供されません。既存のリリースの場合、EMRFS の整合性のあるビューは、継続して利用できます。

2020 年 12 月 1 日に Amazon S3 でリリースされた、リードアフターライトの強力な整合性確保機能により、Amazon EMR クラスターで EMRFS の整合性のビュー (EMRFS CV) を使用する必要がなくなりました。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 の機能を無効にするには、次に示す 3 つのオプションのいずれかを使用します。これらのオプションは、テスト環境でテストした後に、実稼働環境に適用する必要があります。

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 CV をオンにする `--emrfs`オプションを使用しないでください。

   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. 1 つの EMR クラスターが EMRFS CV に関連付けられた DynamoDB テーブルを使用しているかどうか、または複数のクラスターがテーブルを共有しているかどうかを確認するには、次のコマンドを使用します。「[整合性のあるビューを設定する](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emrfs-configure-consistent-view.html)」の説明どおり、テーブル名は `fs.s3.consistent.metadata.tableName` で指定します。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 テーブルが別のクラスターと共有されている場合は、すべてのクラスターの EMRFS CV を一度に無効化します。この操作は、クラスターが S3 の共有ロケーションにあるオブジェクトを変更しないタイミングで行ってください。

**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. 「[整合性のあるビューを設定する](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emrfs-configure-consistent-view.html)」の説明どおり `fs.s3.consistent.notification.SQS.queueName` で指定された Amazon SQS キュー名を検索します。デフォルトの場合、キュー名の形式は、`EMRFS-Inconsistency-<j-cluster ID>` です。

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

**EMRFS CLI の使用を停止するには**
+ EMRFS CV によって生成されるメタデータは、[EMRFS CLI](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emrfs-cli-reference.html) で管理します。今後リリースされる Amazon EMR では EMRFS CV の標準サポートが終了するため、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 コンソールに移動し、サイドナビゲーションから **[古いコンソールに切り替え]** を選択します。古いコンソールに切り替えたときの動作の詳細については、「[Using the old console](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**] および [**Step 2: Hardware**] の設定を選択します。

1. [**Step 3: General Cluster Settings**] の [**Additional Options**] で、[**EMRFS consistent view**] を選択します。

1. [**EMRFS Metadata store**] に、メタデータストアの名前を入力します。デフォルト値は **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 consistent view] フィールドの値は、`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)」を参照してください。

EMRFS は、すべての Amazon S3 操作について、整合性のあるビューのオブジェクトのセットに関する情報のメタデータを確認します。EMRFS は、これらのいずれかの操作中に Amazon S3 が不整合であることを検出すると、`emrfs-site` 設定プロパティで定義されているパラメータに従って操作を再試行します。EMRFS が再試行した後、`ConsistencyException` を返すか、例外を記録してワークフローを継続します。再試行ロジックの詳細については、「[再試行ロジック](emrfs-retry-logic.md)」を参照してください。たとえば、ログには `ConsistencyExceptions` が見つかります。
+  listStatus: No Amazon S3 object for metadata item `/S3_bucket/dir/object`
+  getFileStatus: Key `dir/file` is present in metadata but not Amazon S3

EMRFS の整合性のあるビューで追跡されているオブジェクトを Amazon S3 から直接削除すると、EMRFS はそのオブジェクトを不整合として扱います。これは、そのオブジェクトが Amazon S3 に存在するものとしてメタデータにまだリストされているためです。Amazon S3 で EMRFS が追跡するオブジェクトとメタデータが同期されなくなった場合は、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 テーブルを使用して、EMRFS と同期されたか、EMRFS によって作成された Amazon S3 内のオブジェクトの整合性を追跡します。このメタデータはすべての操作（読み取り、書き込み、更新、およびコピー）の追跡に使用され、実際のコンテンツはメタデータには保存されません。このメタデータは、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 ツールは、操作が終了するか、Amazon EMR から Amazon S3 へのオブジェクト書き込みの最大再試行値に到達するまで、[エクスポネンシャルパックオフ](https://docs.aws.amazon.com/general/latest/gr/api-retries.html)を使用して DynamoDB テーブルへの書き込みを再試行します。

独自のスループットキャパシティー制限を設定できます。ただし、DynamoDB の読み込み操作と書き込み操作には、3000 読み込みキャパシティーユニット (RCU) と 1000 書き込みキャパシティーユニット (WCU) の厳密なパーティション制限があります。抑制による `sync` 障害を回避するには、読み取り操作のスループットを 3000 RCU 未満に、書き込み操作のスループットを 1000 WCU 未満に制限することをお勧めします。カスタムのスループットキャパシティー制限を設定する手順については、「[整合性のあるビューを設定する](emrfs-configure-consistent-view.md)」を参照してください。

DynamoDB コンソールで EMRFS のメタデータの Amazon CloudWatch メトリクスを表示することもできます。ここでは、抑制された読み取りリクエストと書き込みリクエストの数を確認できます。調整されたリクエストの数がゼロ以外の場合、アプリケーションは、読み取りまたは書き込み操作に割り当てられるスループット容量を増やすことで、メリットが得られる可能性があります。長時間にわたって読み取りと書き込みに割り当てられた最大のスループット容量に操作が近付いていることが表示された場合も、パフォーマンスのメリットが得られる可能性があります。

**重要な EMRFS 操作のスループット特性**  
読み取りおよび書き込み操作のデフォルト値は、それぞれ 400 スループット容量ユニット、100 スループット容量ユニットです。以下のパフォーマンス特性は、特定の操作に必要なスループットのヒントを示しています。これらのテストは、単一ノードの `m3.large` クラスターを使用して実行されました。すべての操作はシングルスレッドです。パフォーマンスは特定のアプリケーション特性によって大きく異なり、ファイルシステム操作を最適化するには、検証が必要になる場合があります。


| 運用  | 平均の 1 秒あたりの読み取り  | 平均の 1 秒あたりの書き込み  | 
| --- | --- | --- | 
| create（オブジェクト） | 26.79 |  6.70 | 
| delete（オブジェクト） | 10.79 |  10.79 | 
| delete（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（1,000,000 個のオブジェクトを含むディレクトリ） | 882.36 | 0 | 
| mkdir（120 秒間継続）  | 24.18 | 4.03 | 
| mkdir | 12.59 | 0 | 
| rename（オブジェクト） | 19.53 | 4.88 | 
| rename（1000 個のオブジェクトを含むディレクトリ） | 23.22 | 339.34 | 

**メタデータストアから古いデータを消去するステップを送信するには**  
DynamoDB ベースのメタデータの特定エントリを削除することが必要な場合があります。この操作は、テーブルに関連するストレージコストを節約するうえで役立ちます。ユーザーは、EMRFS CLI の `delete` サブコマンドを使用して、特定のエントリを手動またはプログラムで消去することができます。ただし、メタデータからエントリを削除すると、EMRFS は整合性のチェックを行わなくなります。

ジョブ完了後のプログラムによる消去は、EMRFS CLI でコマンドを実行する最終的なステップをクラスターに送信することにより行います。たとえば、クラスターにステップを送信し、2 日前より古いすべてのエントリを削除するには、次のコマンドを入力します。

```
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 メトリクスを有効にすると、Amazon S3 の結果整合性のために `FileSystem` API 呼び出しが失敗するたびに、**Inconsistency** という名前のメトリクスがプッシュされます。

**Amazon S3 の結果整合性の問題の CloudWatch メトリクスを表示するには**

CloudWatch コンソールで **Inconsistency** メトリクスを表示するには、EMRFS のメトリクスを選択し、**[ジョブフロー ID]** と **[メトリクス名]** のペアを選択します。たとえば、`j-162XXXXXXM2CU ListStatus``j-162XXXXXXM2CU GetFileStatus` などです。

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

1. [**Dashboard**] の [**Metrics**] セクションで、[**EMRFS**] を選択します。

1. [**Job Flow Metrics**] ペインで、1 つ以上の [**JobFlowId**] と [**Metric Name**] のペアを選択します。メトリクスのグラフィカル表示が、次のウィンドウに表示されます。

**Amazon SQS**  
Amazon SQS 通知を有効にすると、EMRFS の初期化時に `EMRFS-Inconsistency-<jobFlowId>` という名前の Amazon SQS キューが作成されます。Amazon S3 の結果整合性のために `FileSystem` API 呼び出しが失敗すると、Amazon SQS メッセージがキューにプッシュされます。このメッセージには、JobFlowId、API、整合性のないパスの一覧、スタックトレースなどの情報が含まれます。メッセージは、Amazon SQS コンソールを使用するか、EMRFS の `read-sqs` コマンドを使用して読み取ることができます。

**Amazon S3 の結果整合性の問題に対する Amazon SQS メッセージを管理するには**

Amazon S3 の結果整合性の問題に関する Amazon SQS メッセージは、EMRFS CLI を使用して読み取ることができます。Amazon SQS EMRFS キューからメッセージを読み取るには、`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
   ```
**注記**  
`--queue-name` の代わりに `-q` ショートカットを使用することもできます。

# 整合性のあるビューを設定する
<a name="emrfs-configure-consistent-view"></a>

`emrfs-site` プロパティの設定プロパティを使用して、整合性のあるビューに追加の設定を構成できます。たとえば、emrfs-site 設定分類 (Amazon EMR リリースバージョン 4.x 以降のみ)、またはマスターノードに emrfs-site.xml ファイルを設定するブートストラップアクションを使用して、CLI の `--emrfs` オプションに次の引数を指定することで、デフォルトの 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` プロパティ**  

| プロパティ  | デフォルトの値 | 説明  | 
| --- | --- | --- | 
| fs.s3.consistent | false |  **true** に設定すると、このプロパティは DynamoDB を使用して整合性を確保するように EMRFS を設定します。  | 
| fs.s3.consistent.retryPolicyType | exponential | このプロパティは、整合性に関する問題について再試行するときに使用するポリシーを識別します。オプションは、exponential、fixed、または none です。 | 
| 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 を使用して、整合性のあるビューのメタデータを管理できます。

**注記**  
**emrfs** コマンドは、VT100 ターミナルエミュレーションでのみサポートされます。ただし、他のターミナルエミュレータモードでも動作する場合があります。

## 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]
```

次の表に示すように、[引数] の有無にかかわらず、[options] を指定します。サブコマンド (`describe-metadata`、`set-metadata-capacity` など) に固有の [options] については、以下の各サブコマンドを参照してください。


**emrfs の [Options]**  

| オプション  | 説明  | 必須  | 
| --- | --- | --- | 
|  `-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 describe-metadata サブコマンド
<a name="emrfs-describe-metadata"></a>


**emrfs describe-metadata の [Options]**  

| オプション  | 説明  | 必須  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME* は DynamoDB メタデータテーブルの名前です。*METADATA\$1NAME* 引数が指定されていない場合、デフォルト値は `EmrFSMetadata` です。  |  いいえ  | 

**Example emrfs describe-metadata の例**  <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 set-metadata-capacity サブコマンド
<a name="emrfs-set-metadata-capacity"></a>


**emrfs set-metadata-capacity の [Options]**  

| オプション  | 説明  | 必須  | 
| --- | --- | --- | 
|  `-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 set-metadata-capacity の例**  
次の例では、`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 delete-metadata サブコマンド
<a name="emrfs-delete-metadata"></a>


**emrfs delete-metadata の [Options]**  

| オプション  | 説明  | 必須  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME* は DynamoDB メタデータテーブルの名前です。*METADATA\$1NAME* 引数が指定されていない場合、デフォルト値は `EmrFSMetadata` です。  |  いいえ  | 

**Example emrfs delete-metadata の例**  
次の例では、デフォルトのメタデータテーブルを削除します。  

```
$ emrfs delete-metadata
```

## emrfs create-metadata サブコマンド
<a name="emrfs-create-metadata"></a>


**emrfs create-metadata の [Options]**  

| オプション  | 説明  | 必須  | 
| --- | --- | --- | 
|  `-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 create-metadata の例**  
次の例では、`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 list-metadata-stores サブコマンド
<a name="emrfs-list-metadata-stores"></a>

**emrfs list-metadata-stores** サブコマンドには、[options] がありません。

**Example list-metadata-stores の例**  
次の例では、メタデータテーブルを表示します。  

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

## emrfs diff サブコマンド
<a name="emrfs-diff"></a>


**emrfs diff の [Options]**  

| オプション  | 説明  | 必須  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME* は DynamoDB メタデータテーブルの名前です。*METADATA\$1NAME* 引数が指定されていない場合、デフォルト値は `EmrFSMetadata` です。  |  いいえ  | 
|  *s3://s3Path*  |  メタデータテーブルと比較する Amazon S3 バケットへのパス。バケットは再帰的に同期されます。  |  はい  | 

**Example emrfs diff の例**  
次の例では、デフォルトのメタデータテーブルを 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 delete サブコマンド
<a name="emrfs-delete"></a>


**emrfs delete の [Options]**  

|  オプション  |  説明  |  必須  | 
| --- | --- | --- | 
|  `-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 delete の例**  
次の例では、整合性のあるビューの追跡メタデータから Amazon S3 バケットのすべてのオブジェクトを削除します。  

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

## emrfs import サブコマンド
<a name="emrfs-import"></a>


**emrfs import の [Options]**  

| オプション  | 説明  | 必須  | 
| --- | --- | --- | 
|  `-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 import の例**  
次の例では、Amazon S3 バケット内のすべてのオブジェクトを、整合性のあるビューの追跡メタデータとともにインポートします。不明なキーはすべて無視されます。  

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

## emrfs sync サブコマンド
<a name="emrfs-sync"></a>


**emrfs sync の [Options]**  

| オプション  | 説明  | 必須  | 
| --- | --- | --- | 
|  `-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 sync command の例**  
次の例では、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 read-sqs サブコマンド
<a name="emrfs-read-sqs"></a>


**emrfs read-sqs の [Options]**  

| オプション  | 説明  | 必須  | 
| --- | --- | --- | 
|  `-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 delete-sqs サブコマンド
<a name="emrfs-delete-sqs"></a>


**emrfs delete-sqs の [Options]**  

| オプション  | 説明  | 必須  | 
| --- | --- | --- | 
|  `-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`コマンドをステップとして実行する方法を示しています。この例では、 を使用してクラスターにステップ AWS SDK for Python (Boto3) を追加し、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 データにアクセスする権限を決定します。EMRFS 経由でリクエストを行うユーザーまたはグループに関係なく、このロールにアタッチされている IAM ポリシーが適用されます。デフォルトは `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 ロールを指定できます。これにより、複数のユーザーを持つクラスターについて、Amazon S3 への EMRFS リクエストの権限をカスタマイズできます。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 [Configurable](https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/conf/Configurable.html) クラスを実装します。

このアプローチの詳細については、ビッグデータブログの[「EMRFS を使用して別の AWS アカウントのデータを安全に分析](https://aws.amazon.com/blogs/big-data/securely-analyze-data-from-another-aws-account-with-emrfs)する AWS 」を参照してください。このブログ投稿には、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)」を参照してください。

   次の例では、共通設定パラメータを使って Hive クラスターを起動する `create-cluster` コマンドを示しています。さらに次のものが含まれています。
   + Amazon S3 の `amzn-s3-demo-bucket` に保存されるスクリプト `copy_jar_file.sh` を実行するブートストラップアクション。
   + JAR ファイルで `emrfs-site` として定義されたカスタム認証情報プロバイダーを指定する `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 リージョン AWS STS での の管理](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,` の使用に関する詳細は、「[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/emr/create-cluster.html](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 コンソールに移動し、サイドナビゲーションから **[古いコンソールに切り替え]** を選択します。古いコンソールに切り替えたときの動作の詳細については、「[Using the old console](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)**] オプションを選択します。
**注記**  
Amazon EMR リリースバージョン 4.4 以前を使用しているときは、**[KMS Key Management を使用した S3 サーバー側の暗号化]** (SSE-KMS) を使用できません。
   + **AWS Key Management** を使用するオプションを選択する場合は、**[AWS KMS キー ID]** を選択します。詳細については、「[EMRFS 暗号化 AWS KMS keys に を使用する](#emr-emrfs-awskms)」を参照してください。
   + [**S3 client-side encryption with custom materials provider**] を選択した場合、[**Class name**] と [**JAR location**] に入力してください。詳細については、「[Amazon S3 クライアント側の暗号化](emr-emrfs-encryption-cse.md)」を参照してください。

1. 必要に応じて、アプリケーションの他のオプションを選択し、[**Create Cluster**] を選択します。

## EMRFS 暗号化 AWS KMS keys に を使用する
<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 マネジメントコンソール 、指定した KMS キーのキーユーザーのリストにインスタンスプロファイルまたは EC2 インスタンスプロファイルを追加するか、 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 デベロッパーガイド*」の「[Creating Keys](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)」を参照してください。

**暗号化キーユーザーのリストに Amazon EMR の EC2 インスタンスプロファイルを追加するには**

1. にサインイン AWS マネジメントコンソール し、[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. **[Add]** (追加) を選択します。

## 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 を指定するときに、次の 2 つの異なるキー管理システムから選択できます。
+ **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 コマンドを入力し、次の`myConfig.json`例のようにコンテンツを含む設定 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 以降でのみ使用できます。


| プロパティ  | デフォルトの値 | 説明  | 
| --- | --- | --- | 
| 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 の暗号化と復号はクラスターの EMRFS クライアントで行われます。オブジェクトは Amazon S3 にアップロードされる前に暗号化され、ダウンロード後に復号化されます。指定するプロバイダーが、クライアントが使用する暗号化キーを提供します。クライアントは、 AWS KMS によって提供されるキー (CSE-KMS) か、クライアント側のルートキーを提供するカスタム Java クラス (CSE-C) を使用できます。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 インターフェイスを実装する必要があります。どちらのインターフェイスも AWS SDK for Java バージョン 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 引数に 2 つのフィールド (オブジェクトの 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` をクラスター内の各ノードにコピーし、クラスパスに配置します。

## SDK を使用してカスタムマテリアルプロバイダーを指定する
<a name="emr-emrfs-encryption-cse-custom-sdk"></a>

SDK を使用するには、プロパティ `fs.s3.cse.encryptionMaterialsProvider.uri` を設定し、Amazon S3 に保存するカスタム `EncryptionMaterialsProvider` クラスをクラスター内の各ノードにダウンロードします。これは、`emrfs-site.xml` ファイルで設定します。このとき、CSE を有効にして、カスタムプロバイダーの適切な場所も指定します。

例えば、RunJobFlowRequest AWS SDK for Java を使用する では、コードは次のようになります。

```
<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 のブログ投稿「[Updates to the Amazon S3 encryption client](https://aws.amazon.com/blogs/developer/updates-to-the-amazon-s3-encryption-client/)」を参照してください。また、「 AWS SDK for Java デベロッパーガイド」の[Amazon S3 暗号化クライアントの移行](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/s3-encryption-migration.html)」を参照してください。

下位互換性を保つため、暗号化クライアント V1 は SDK で引き続き使用できます。デフォルトでは、CSE が有効になっている場合、EMRFS は S3EC V1 を使用して S3 オブジェクトを暗号化および復号します。

S3EC V2 で暗号化された S3 オブジェクトは、リリースバージョンが emr-5.31.0 より前 (emr-5.30.1 以前、emr-6.1.0 以前) の EMR クラスターでは、EMRFS によって復号化できません。

**Example S3EC V2 を使用するように EMRFS を設定する**  
S3EC V2 を使用するように EMRFS を設定するには、次の設定を追加します。  

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

## Amazon S3 クライアント側暗号化の `emrfs-site.xml` プロパティ
<a name="emr-emrfs-cse-config"></a>


| プロパティ  | デフォルトの値 | 説明  | 
| --- | --- | --- | 
| 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 です。詳細については、[「 AWS SDK for Java および Amazon S3 によるクライアント側のデータ暗号化](https://aws.amazon.com/articles/client-side-data-encryption-with-the-aws-sdk-for-java-and-amazon-s3/)」を参照してください。  | 