通过 Amazon EMR 上的 Spark 在 AWS Glue Data Catalog 中使用多目录层次结构 - Amazon EMR

通过 Amazon EMR 上的 Spark 在 AWS Glue Data Catalog 中使用多目录层次结构

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

目录资源如何组织

在 AWS Glue Data Catalog 中创建资源时,您可以从任何支持 Apache Iceberg REST API 或 Hive 元存储的 SQL 引擎访问它们。AWSLake Formation 管理权限。

在 AWS Glue Data Catalog 中,数据按照目录、数据库和表的逻辑层次结构进行组织:

  • 目录 – 保存数据存储中的对象(例如架构或表)的逻辑容器。

  • 用于存储 Redshift 托管存储 (RMS) 表的目录 – 当您管理用于存储 RMS 表的目录时,可以使用 Iceberg 访问这些表。

  • 数据库 – 在目录中组织数据对象(例如表和视图)。

  • 表和视图 – 数据库中的数据对象,为抽象层提供可理解的架构。它们提供了一个用于访问底层数据的层,这些数据可以采用各种格式并且位于不同的位置。

配置用于 Amazon EMR 的数据目录

首先,您需要将目录配置为支持 Amazon EMR 工具。AWS Glue Data Catalog 提供 Hive 元存储兼容性和 Iceberg REST 兼容的 API。

使用 Hive 元存储配置 Amazon EMR

有关如何设置的信息,请参阅《AWS Glue 用户指南》中的适用于 Spark SQL 作业的 AWS Glue Data Catalog 支持。本主题介绍如何将 AWS Glue Data Catalog 配置为 Hive 元存储并使其可作为端点使用。此外,有 Amazon EMR 文档介绍了如何将 AWS Glue Data Catalog 指定为 Spark 元存储,请参阅使用 AWS Glue Data Catalog 作为 Spark 的 Apache Hive 元存储

访问 AWS Glue Data Catalog 中资源的权限

本节介绍了使用 Amazon EMR 工具处理目录数据的 IAM 策略要求。在将集群注册到 AWS Glue Data Catalog 后,您需要以下权限才能发现创建和后续创建的数据目录的更改:

  • glue:GetCatalog

  • glue:GetCatalogs

  • sts:AssumeRole

  • sts:TagSession

  • sts:SetContext

  • sts:SetSourceIdentity

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

此外,要查询目录数据,您必须使用 AWS Lake Formation 设置数据目录的权限。有关在 AWS Lake Formation 中设置数据目录权限的更多信息,请参阅授予和撤销对 Data Catalog 资源的权限

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

配置 Spark 以访问 AWS Glue Data Catalog 中的多目录层次结构

在 EMR 7.5 中,您可以将 Spark 配置为使用 AWS Glue 的多目录层次结构。多目录层次结构允许您执行以下操作:

  • 将现有 Amazon Redshift 数据仓库中的 Redshift 托管存储 (RMS) 数据(例如表、视图和实体化视图)导入到 AWS Glue Data Catalog。您可以使用 EMR on EC2 和 EMR Serverless 查询这些对象。

  • 创建 RMS 目录、AWS Glue Data Catalog,并使用 ZeroETL 将数据存储在 RMS 中,然后使用与 Iceberg 兼容的查询引擎查询数据。

  • 在 AWS Glue Data Catalog 中创建具有功能完备的存储管理(包括压缩、快照和保留)的托管 Iceberg 表。

初始化 Spark 会话时连接到多目录

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

spark-shell
  1. 使用 SSH 连接主节点。有关更多信息,请参阅《Amazon EMR 管理指南》中的使用 SSH 连接到主节点

  2. 输入以下命令以启动 Spark shell。要使用 PySpark Shell,请使用 pyspark 替换 spark-shell

    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 连接到主节点

  2. 输入以下命令以为 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 魔法命令

%%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 指定配置分类的更多信息,请参阅配置应用程序

[ { "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" } } ]

使用 AWS Glue Data Catalog 将 Spark 会话初始化到 Redshift 托管存储

以下示例命令使用 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 和带有 AWS Glue Data Catalog 的 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

有关将 AWS Glue 多目录层次结构与 Spark Iceberg 结合使用的更多信息,请参阅将 Iceberg 集群与 Spark 结合使用

多目录配置的注意事项和限制

  • 不支持将多目录层次结构与 Apache Hive 元存储结合使用。

  • 在使用 SparkSessionCatalog 时,将多目录层次结构与 Apache Hive 结合使用不支持回退到 Apache Hive 元存储。

  • 具有运行时角色的 EMR on EC2 集群不支持多目录层次结构。

  • 启用了 AWS Lake Formation 的 EMR on EC2 集群不支持多目录层次结构。