将 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 作业需要视情况具有
DESCRIBE、ALTER、DROP权限。
步骤 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