

# Amazon EMR を使用した Amazon S3 テーブルへのアクセス
<a name="s3-tables-integrating-emr"></a>

Amazon EMR (旧称 Amazon Elastic MapReduce) は、AWS でビッグデータフレームワーク (Apache Hadoop、Apache Spark、および Apache Spark など) の実行を簡素化して、ビッグデータを処理および分析するマネージドクラスタープラットフォームです。これらのフレームワークと、関連するオープンソースプロジェクトを使用することで、分析用のデータやビジネスインテリジェンスワークロードを処理できます。Amazon EMR は、大量のデータを変換したり、他の AWS データストアやデータベースとの間で出し入れしたりできるようにします。

Amazon EMR の Apache Iceberg クラスターを使用して、Spark セッション内のテーブルバケットに接続することで S3 テーブルを操作できます。Amazon EMR のテーブルバケットに接続するには、AWS Glue Data Catalog を通じて AWS 分析サービスの統合を使用するか、オープンソースの Amazon S3 Tables Catalog for Apache Iceberg クライアントカタログを使用できます。

**注記**  
S3 Tables は [Amazon EMR バージョン 7.5](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-release-components.html) 以降でサポートされています。

## Amazon EMR Iceberg クラスターでの Spark を使用した S3 テーブルバケットへの接続
<a name="emr-setup-cluster-spark"></a>

この手順では、Apache Iceberg 用に設定された Amazon EMR クラスターをセットアップし、テーブルバケットに接続する Spark セッションを起動します。AWS Glue を通じて AWS 分析サービス統合を使用して設定することも、オープンソースの Amazon S3 Tables Catalog for Apache Iceberg クライアントカタログを使用することもできます。クライアントの詳細については、「[Amazon S3 Tables Iceberg REST エンドポイントを使用したテーブルへのアクセス](s3-tables-integrating-open-source.md)」を参照してください。

次のオプションから、Amazon EMR でテーブルを使用する方法を選択します。

------
#### [ Amazon S3 Tables Catalog for Apache Iceberg ]

Amazon S3 Tables Catalog for Apache Iceberg を使用して、Amazon EMR で Spark によりテーブルに対してクエリを実行するには、次の前提条件が必要です。

クライアントカタログ JAR の最新バージョンについては、[s3-tables-catalog GitHub リポジトリ](https://github.com/awslabs/s3-tables-catalog)を参照してください。

**前提条件**
+ Amazon EMR で使用する IAM ロールに `AmazonS3TablesFullAccess` ポリシーをアタッチします。

**Spark を使用してテーブルをクエリするように Amazon EMR クラスターを設定するには**

1. 次の設定を使用して、クラスターを作成します。この例を実行するには、`{{user input placeholders}}` をユーザー自身の情報に置き換えます。

   ```
   aws emr create-cluster --release-label emr-7.5.0 \
   --applications Name=Spark \
   --configurations file://configurations.json \
   --region {{us-east-1}} \
   --name My_Spark_Iceberg_Cluster \
   --log-uri s3://{{{{amzn-s3-demo-bucket}}}}/ \
   --instance-type m5.xlarge \
   --instance-count 2 \
   --service-role {{EMR_DefaultRole}} \
   --ec2-attributes \
   
   InstanceProfile={{EMR_EC2_DefaultRole}},SubnetId={{subnet-1234567890abcdef0}},KeyName={{my-key-pair}}
   ```

   `configurations.json`:

   ```
   [{
   "Classification":"iceberg-defaults",
   "Properties":{"iceberg.enabled":"true"}
   }]
   ```

1. [SSH を使用して Spark プライマリノードに接続します。](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-connect-master-node-ssh.html#emr-connect-cli)

1. テーブルバケットに接続する Iceberg の Spark セッションを初期化するには、次のコマンドを入力します。`{{user input placeholders}}` をテーブルバケットの ARN に置き換えます。

   ```
   spark-shell \
   --packages software.amazon.s3tables:s3-tables-catalog-for-iceberg-runtime:0.1.8 \
   --conf spark.sql.catalog.s3tablesbucket=org.apache.iceberg.spark.SparkCatalog \
   --conf spark.sql.catalog.s3tablesbucket.catalog-impl=software.amazon.s3tables.iceberg.S3TablesCatalog \
   --conf spark.sql.catalog.s3tablesbucket.warehouse=arn:aws:s3tables:{{us-east-1}}:{{111122223333}}:bucket/{{amzn-s3-demo-bucket1}} \
   --conf spark.sql.defaultCatalog=s3tablesbucket \
   --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
   ```

1. Spark SQL を使用してテーブルをクエリします。クエリの例については、「[Spark SQL を使用した S3 テーブルのクエリ](s3-tables-client-catalog.md#query-with-spark)」を参照してください。

------
#### [ AWS analytics services integration ]

AWS 分析サービス統合を使用して、Amazon EMR で Spark によりテーブルをクエリするには、次の前提条件が必要です。

**前提条件**
+ [テーブルバケットを AWS 分析サービスと統合します](s3-tables-integrating-aws.md)。
+ Amazon EMR のデフォルトのサービスロールを作成します (`EMR_DefaultRole_V2`)。詳細については、「[Amazon EMR のサービスロール (EMR ロール)](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-iam-role.html)」を参照してください。
+ Amazon EMR (`EMR_EC2_DefaultRole`) の Amazon EC2 インスタンスプロファイルを作成します。詳細については、「[クラスター EC2 インスタンスのサービスロール (EC2 インスタンスプロファイル)](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-iam-role-ec2.html)」を参照してください。
  + `AmazonS3TablesFullAccess` ポリシーを `EMR_EC2_DefaultRole` にアタッチします。

**Spark を使用してテーブルをクエリするように Amazon EMR クラスターを設定するには**

1. 次の設定を使用して、クラスターを作成します。この例を使用するには、`{{user input placeholder}}` の値を実際の情報に置き換えます。

   ```
   aws emr create-cluster --release-label emr-7.5.0 \
   --applications Name=Spark \
   --configurations file://configurations.json \
   --region {{us-east-1}} \
   --name My_Spark_Iceberg_Cluster \
   --log-uri s3://{{{{amzn-s3-demo-bucket}}}}/ \
   --instance-type m5.xlarge \
   --instance-count 2 \
   --service-role {{EMR_DefaultRole}} \
   --ec2-attributes \
   
   InstanceProfile={{EMR_EC2_DefaultRole}},SubnetId={{subnet-1234567890abcdef0}},KeyName={{my-key-pair}}
   ```

   `configurations.json`:

   ```
   [{
   "Classification":"iceberg-defaults",
   "Properties":{"iceberg.enabled":"true"}
   }]
   ```

1. [SSH を使用して Spark プライマリノードに接続します。](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-connect-master-node-ssh.html#emr-connect-cli)

1. 次のコマンドを入力して、テーブルに接続する Iceberg の Spark セッションを初期化します。リージョン、アカウント ID、テーブルバケット名の `{{user input placeholders}}` をユーザー自身の情報に置き換えます。

   ```
   spark-shell \
   --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
   --conf spark.sql.defaultCatalog=s3tables \
   --conf spark.sql.catalog.s3tables=org.apache.iceberg.spark.SparkCatalog \
   --conf spark.sql.catalog.s3tables.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog \
   --conf spark.sql.catalog.s3tables.client.region={{us-east-1}} \
   --conf spark.sql.catalog.s3tables.glue.id={{111122223333}}:s3tablescatalog/{{amzn-s3-demo-table-bucket}}
   ```

1. Spark SQL を使用してテーブルをクエリします。クエリの例については、「[Spark SQL を使用した S3 テーブルのクエリ](s3-tables-client-catalog.md#query-with-spark)」を参照してください。

------

**注記**  
Amazon EMR で `DROP TABLE PURGE` コマンドを使用している場合:  
Amazon EMR バージョン 7.5  
Spark 設定 `spark.sql.catalog.{{your-catalog-name}}.cache-enabled` を `false` に指定します。この設定が `true` に設定されている場合、テーブルキャッシュがアクティブ化されないように、新しいセッションまたはアプリケーションで コマンドを実行します。
Amazon EMR バージョン 7.5 以上  
`DROP TABLE` はサポートされていません。S3 Tables の `DeleteTable` REST API を使用してテーブルを削除できます。