

# 使用 Amazon EMR 访问 Amazon S3 表类数据存储服务
<a name="s3-tables-integrating-emr"></a>

Amazon EMR（以前称为 Amazon Elastic MapReduce）是一个托管式集群平台，可简化在 Amazon 上运行大数据框架（如 Apache Hadoop 和 Apache Spark）的过程，以处理和分析海量数据。使用这些框架和相关的开源项目，您可以处理用于分析目的的数据和业务情报工作负载。Amazon EMR 还可让您转换大量数据，并将数据移入/移出其它 Amazon 数据存储和数据库。

通过在 Spark 会话中连接到表存储桶，您可以使用 Amazon EMR 中的 Apache Iceberg 集群来处理 S3 表类数据存储服务。要连接到 Amazon EMR 中的表存储桶，可以通过 Amazon Glue Data Catalog 使用 Amazon 分析服务集成，也可以使用适用于 Apache Iceberg 的开源 Amazon S3 表类数据存储服务目录客户端目录。

**注意**  
[Amazon EMR version 7.5](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-release-components.html) 或更高版本支持 S3 表类数据存储服务。

## 在 Amazon EMR Iceberg 集群上使用 Spark 连接到 S3 表存储桶
<a name="emr-setup-cluster-spark"></a>

在此过程中，您设置为 Apache Iceberg 配置的 Amazon EMR 集群，然后启动连接到表存储桶的 Spark 会话。您可以通过 Amazon Glue 使用 Amazon 分析服务集成来设置此项，也可以使用适用于 Apache Iceberg 的开源 Amazon S3 表类数据存储服务目录客户端目录。有关客户端目录的信息，请参阅[使用 Amazon S3 表类数据存储服务 Iceberg REST 端点访问表](s3-tables-integrating-open-source.md)。

从以下选项中选择在 Amazon EMR 中使用表的方法。

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

使用适用于 Apache Iceberg 的 Amazon S3 表类数据存储服务目录在 Amazon EMR 上通过 Spark 查询表需要满足以下先决条件。

有关最新版本的客户端目录 JAR，请参阅 [s3-tables-catalog GitHub 存储库](https://github.com/awslabs/s3-tables-catalog)。

**先决条件**
+ 将 `AmazonS3TablesFullAccess` 策略附加到您用于 Amazon EMR 的 IAM 角色。

**设置 Amazon EMR 集群以使用 Spark 查询表**

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. [Connect to the Spark primary node using SSH.](https://docs.amazonaws.cn//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)。

------
#### [ Amazon analytics services integration ]

使用 Amazon 分析服务集成在 Amazon EMR 上通过 Spark 查询表需要满足以下先决条件。

**先决条件**
+ [将表存储桶与 Amazon 分析服务集成](s3-tables-integrating-aws.md)。
+ 为 Amazon EMR 创建默认服务角色 (`EMR_DefaultRole_V2`)。有关详细信息，请参阅 [Service role for Amazon EMR (EMR role)](https://docs.amazonaws.cn//emr/latest/ManagementGuide/emr-iam-role.html)。
+ 为 Amazon EMR 创建 Amazon EC2 实例配置文件 (`EMR_EC2_DefaultRole`)。有关详细信息，请参阅 [Service role for cluster EC2 instances (EC2 instance profile)](https://docs.amazonaws.cn//emr/latest/ManagementGuide/emr-iam-role-ec2.html)。
  + 将 `AmazonS3TablesFullAccess` 策略附加到 `EMR_EC2_DefaultRole`。

**设置 Amazon EMR 集群以使用 Spark 查询表**

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. [Connect to the Spark primary node using SSH.](https://docs.amazonaws.cn//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`，请在新的会话或应用程序中运行该命令，这样就不会激活表缓存。
高于 7.5 的 Amazon EMR 版本  
`DROP TABLE`不支持 。可以使用 S3 表类数据存储服务 `DeleteTable` REST API 来删除表。