将 Lake Formation 与 Athena Spark 工作组搭配使用 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

将 Lake Formation 与 Athena Spark 工作组搭配使用

在 Apache Spark 3.5 发行版中,您可以将 Amazon Lake Formation 与 Amazon Glue Data Catalog 搭配使用,其中会话执行角色具有完整表权限。此功能允许您从 Athena Spark 交互式会话中读取和写入受 Lake Formation 保护的表。请参阅以下部分,了解有关 Lake Formation 以及如何将其与 Athena Spark 结合使用的更多信息。

步骤 1 步:在 Lake Formation 中启用全表访问

要使用全表访问(FTA)模式,您必须允许 Athena Spark 无需在 Amazon Lake Formation 中验证 IAM 会话标签即可访问数据。要启用此模式,请按照 Application integration for full table access 中的步骤操作。

步骤 1.1:使用用户定义的角色在 Lake Formation 中注册数据位置

您必须使用用户定义的角色,才能在 Amazon Lake Formation 中注册数据位置。有关详细信息,请参阅 Requirements for roles used to register locations

步骤 2:设置会话执行角色的 IAM 权限

要获得底层数据的读取或写入权限,除 Lake Formation 权限外,执行角色还需要 lakeformation:GetDataAccess IAM 权限。获得此权限后,Lake Formation 将授权访问数据的临时凭证请求。

下面是一个策略示例,展示了如何提供 IAM 权限以访问 Amazon S3 中的脚本、将日志上传到 S3、Amazon Glue API 权限以及访问 Lake Formation 的权限。

步骤 2.1:配置 Lake Formation 权限

  • 从 S3 读取数据的 Spark 作业需要 Lake Formation SELECT 权限。

  • 在 S3 中写入/删除数据的 Spark 作业需要 Lake Formation ALL (SUPER) 权限。

  • 与 Amazon Glue Data Catalog 交互的 Spark 作业需要视情况具有 DESCRIBEALTERDROP 权限。

步骤 3:使用 Lake Formation 初始化 Spark 会话以实现全表访问

先决条件

必须将 Amazon Glue Data Catalog 配置为元存储才能访问 Lake Formation 表。

设置以下设置以将 Amazon Glue 目录配置为元存储:

{ "spark.hadoop.glue.catalogid": "ACCOUNT_ID", "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory", "spark.hadoop.hive.metastore.glue.catalogid": "ACCOUNT_ID", "spark.sql.catalogImplementation": "hive" }

要访问注册到 Amazon Lake Formation 的表,需要在 Spark 初始化期间设置以下配置,以便将 Spark 配置为使用 Amazon Lake Formation 凭证。

Hive

{ "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver", "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": "true", "spark.hadoop.fs.s3.folderObject.autoAction.disabled": "true", "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": "true", "spark.sql.catalog.createDirectoryAfterTable.enabled": "true", "spark.sql.catalog.dropDirectoryBeforeTable.enabled": "true" }

Apache Iceberg

{ "spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension", "spark.sql.catalog.spark_catalog": "org.apache.iceberg.spark.SparkSessionCatalog", "spark.sql.catalog.spark_catalog.warehouse": "s3://your-bucket/warehouse/", "spark.sql.catalog.spark_catalog.client.region": "REGION", "spark.sql.catalog.spark_catalog.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.spark_catalog.glue.account-id": "ACCOUNT_ID", "spark.sql.catalog.spark_catalog.glue.lakeformation-enabled": "true" }

Amazon S3 表

{ "spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension", "spark.sql.catalog.{catalogName}": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.{catalogName}.warehouse": "arn:aws:s3tables:{region}:{accountId}:bucket/{bucketName}", "spark.sql.catalog.{catalogName}.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.{catalogName}.glue.id": "{accountId}:s3tablescatalog/{bucketName}", "spark.sql.catalog.{catalogName}.glue.lakeformation-enabled": "true", "spark.sql.catalog.{catalogName}.client.region": "REGION", "spark.sql.catalog.{catalogName}.glue.account-id": "ACCOUNT_ID" }

Delta Lake

{ "spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension", "spark.sql.catalog.spark_catalog": "org.apache.spark.sql.delta.catalog.DeltaCatalog", "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver", "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": "true", "spark.hadoop.fs.s3.folderObject.autoAction.disabled": "true", "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": "true", "spark.sql.catalog.createDirectoryAfterTable.enabled": "true", "spark.sql.catalog.dropDirectoryBeforeTable.enabled": "true" }

注意事项和限制

  • Hive、Iceberg、Amazon S3 表和 Delta 表均支持全表访问。Hudi 表不支持全表访问。

  • 要将新目录添加到活动会话中,请将 spark.conf.set 用于新的目录配置。

  • 目录配置不可变。如果要更新目录配置,请使用 spark.conf.set 创建新目录。

  • 仅向 Spark 会话添加您需要的目录。

  • 更改默认目录:spark.catalog.setCurrentCatalog("s3tablesbucket")

  • 如果您的目录名称中有 - 等特殊字符,请在查询中将其转义,例如:

    SELECT sales_amount as nums FROM `my-s3-tables-bucket`.`s3namespace`.`daily_sales` LIMIT 100