

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在亚马逊 EMR 上使用 Spark 在 AWS Glue 数据目录中使用多目录层次结构
<a name="emr-multi-catalog"></a>

您可以注册您的 Amazon EMR 集群以访问 Gl AWS ue 数据目录，该目录使表格和其他目录资源可供各种使用者使用。 AWS Glue 数据目录支持多目录层次结构，可统一您在 Amazon S3 数据湖中的数据。它还提供了 Hive 元存储 API 和开源 Apache Iceberg REST API 来访问数据。这些功能适用于 Amazon EMR 和其他服务（例如 Amazon Athena 和 Amazon Redshift）。

## 目录资源如何组织
<a name="emr-lakehouse-org"></a>

当你在 AWS Glue 数据目录中创建资源时，你可以从任何支持 Apache Iceberg REST API 或 Hive 元数据仓的 SQL 引擎访问它们。 AWS Lake Formation 管理权限。

在 G AWS lue 数据目录中，数据按目录、数据库和表格的逻辑层次结构进行组织：
+ **目录**：保存数据存储中的对象（例如架构或表）的逻辑容器。
+ **用于存储 Redshift 托管存储 (RMS) 表的目录**：当您管理用于存储 RMS 表的目录时，可以使用 Iceberg 访问这些表。
+ **数据库**：在目录中组织数据对象（例如表和视图）。
+ **表和视图**：数据库中的数据对象，为抽象层提供可理解的架构。它们提供了一个用于访问底层数据的层，这些数据可以采用各种格式并且位于不同的位置。



## 配置用于 Amazon EMR 的数据目录
<a name="emr-lakehouse-configuration"></a>

首先，您需要将目录配置为支持 Amazon EMR 工具。 AWS Glue 数据目录提供 Hive 元存储兼容性，兼容 Iceberg REST。 APIs

**使用 Hive 元存储配置 Amazon EMR**

 有关如何设置的信息，请参阅 [AWS Glue 用户指南中的 Glue 数据目录对 Spark 作业的 AWS 支持](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-data-catalog-hive.html)。本主题介绍如何将 AWS Glue 数据目录配置为 Hive 元数据仓并使其可用作端点。此外，在使用 Glue 数据目录作为 Spark 的 A [pache Hive 元数据存储中，还有亚马逊 EMR 文档向您展示了如何将 G AWS lue 数据目录指定为](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-glue.html) Spark 元数据库。 AWS 

## 访问 Glue 数据 AWS 目录中资源的权限
<a name="emr-lakehouse-using-irc-prereqs"></a>

本节介绍了使用 Amazon EMR 工具处理目录数据的 IAM 策略要求。向 AWS Glue Data Catalog 注册集群后，您需要以下权限才能发现随后创建的数据目录的创建和更改：
+ **胶水：GetCatalog**
+ **胶水：GetCatalogs**
+ **sts: AssumeRole**
+ **sts: TagSession**
+ **sts: SetContext**
+ **sts: SetSourceIdentity**

大多数情况下，分配权限时，我们建议创建一个 IAM 角色并为其分配权限。

此外，要查询目录数据，您必须使用 AWS Lake Formation设置数据目录的权限。有关在 AWS Lake Formation中设置数据目录权限的更多信息，请参阅[授予和撤销对 Data Catalog 资源的权限](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)。

在创建和配置集群并对目录对象设置权限后，您可以提交作业来查询和处理数据。

## 配置 Spark 以访问 AWS Glue 数据目录中的多目录层次结构
<a name="emr-lakehouse-using-spark-access"></a>

在 EMR 7.5 中，你可以将 Spark 配置为使用 AWS Glue 的多目录层次结构。多目录层次结构允许您执行以下操作：
+ 将现有 Amazon Redshift 数据仓库中的 Redshift 托管存储 (RMS) 数据（例如表、视图和物化视图）导入 Glue 数据目录。 AWS 您可以使用 EMR on EC2 和 EMR Serverless 查询这些对象。
+ 使用 ZeroeTL 创建 RMS 目录、Glue 数据目录并将数据存储在 RMS 中，并使用兼容 Iceberg 的查询引擎查询数据。 AWS 
+ 使用功能齐全的存储管理（包括压缩、快照和保留）在 AWS Glue 数据目录中创建托管 Iceberg 表。

### 初始化 Spark 会话时连接到多目录
<a name="emr-iceberg-initialize-spark-session-spark"></a>

以下示例演示了如何使用交互式 Spark shell、Spark submit 或 Amazon EMR Notebooks 来处理 Glue 的多目录层次结构。 AWS 

------
#### [ spark-shell ]

1. 使用 SSH 连接主节点。有关更多信息，请参阅《Amazon EMR 管理指南》**中的[使用 SSH 连接到主节点](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)。

1. 输入以下命令以启动 Spark shell。要使用 PySpark 外壳，请`spark-shell`替换为`pyspark`。

   ```
   spark-shell \
       --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
       --conf spark.sql.catalog.my_catalog.warehouse=s3://amzn-s3-demo-bucket/prefix/
       --conf spark.sql.catalog.my_catalog.type=glue \
       --conf spark.sql.catalog.my_catalog.glue.id=Glue RMS catalog ID \
       --conf spark.sql.defaultCatalog=my_catalog \
       --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
   ```

------
#### [ spark-submit ]

1. 使用 SSH 连接主节点。有关更多信息，请参阅《Amazon EMR 管理指南》**中的[使用 SSH 连接到主节点](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)。

1. 输入以下命令以为 Spark 启动 Spark 会话。

   ```
   spark-submit \
   --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
   --conf spark.sql.catalog.my_catalog.warehouse=s3://amzn-s3-demo-bucket1/prefix \
   --conf spark.sql.catalog.my_catalog.type=glue \
   --conf spark.sql.catalog.my_catalog.glue.id=Glue RMS catalog ID \
   --conf spark.sql.defaultCatalog=my_catalog \
   --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
   ```

------
#### [ EMR Studio notebooks ]

要使用 EMR Studio notebooks 初始化 Spark 会话，请使用 Amazon EMR notebook 中的 `%%configure` 魔法命令配置 Spark 会话，如以下示例所示。有关更多信息，请参阅 *Amazon EMR 管理指南*中的[使用 EMR Notebooks 魔法命令](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-magics.html#emr-magics)。

```
%%configure -f{
"conf":{
    "spark.sql.catalog.my_catalog":"org.apache.iceberg.spark.SparkCatalog",
    "spark.sql.catalog.my_catalog.type":"glue",
    "spark.sql.catalog.my_catalog.glue.id":"Glue RMS catalog ID",
    "spark.sql.catalog.my_catalog.warehouse":"s3://amzn-s3-demo-bucket1/prefix/",
    "spark.sql.defaultCatalog", "my_catalog",
    "spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
    }
}
```

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

要使用 CLI 初始化 Spark 会话，请运行下面的示例。有关使用 AWS CLI 和 Amazon EMR API 指定配置分类的更多信息，请参阅[配置](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html)应用程序。

```
[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.sql.catalog.my_catalog":"org.apache.iceberg.spark.SparkCatalog",
      "spark.sql.catalog.my_catalog.type":"glue",
      "spark.sql.catalog.my_catalog.glue.id":"Glue RMS catalog ID",
      "spark.sql.catalog.my_catalog.warehouse":"s3://amzn-s3-demo-bucket1/prefix/",
      "spark.sql.defaultCatalog", "my_catalog",
      "spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
    }
  }
]
```

------

#### 使用 G AWS lue 数据目录初始化到 Redshift 托管存储的 Spark 会话
<a name="considerations-multi-catalog-glue-connect"></a>

以下示例命令使用 AWS Glue Data Catalog 初始化 Spark 会话。

```
spark-sql \
  --conf spark.sql.catalog.rms=org.apache.iceberg.spark.SparkCatalog \
  --conf spark.sql.catalog.rms.type=glue \
  --conf spark.sql.catalog.rms.glue.id=Glue RMS catalog ID \
  --conf spark.sql.defaultCatalog=rms
  --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

以下示例使用 Iceberg REST API 和带有 G AWS lue 数据目录的 Redshift 托管存储初始化 Spark 会话。

```
spark-sql \
  --conf spark.sql.catalog.rms=org.apache.iceberg.spark.SparkCatalog \
  --conf spark.sql.catalog.rms.type=rest \
  --conf spark.sql.catalog.rms.warehouse=glue RMS catalog ID \
  --conf spark.sql.catalog.rms.uri=Glue endpoint URI/iceberg \
  --conf spark.sql.catalog.rms.rest.sigv4-enabled=true \
  --conf spark.sql.catalog.rms.rest.signing-name=glue \
  --conf spark.sql.defaultCatalog=rms \
  --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

有关在 Spark Iceberg 中使用 AWS Glue 多目录层次结构的更多信息，请参阅将 Iceberg [集群与 Spark 配合使用](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-iceberg-use-spark-cluster.html)。

## 多目录配置的注意事项和限制
<a name="considerations-multi-catalog"></a>
+ 不支持将多目录层次结构与 Apache Hive 元存储结合使用。
+ 在使用 `SparkSessionCatalog` 时，将多目录层次结构与 Apache Hive 结合使用不支持回退到 Apache Hive 元存储。
+ 具有运行时角色的 EMR on EC2 集群不支持多目录层次结构。
+ 启用的 EC2 集群上的 EMR AWS Lake Formation 不支持多目录层次结构。