View a markdown version of this page

搭配 Athena Spark 工作群組使用 Lake Formation - Amazon Athena

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

搭配 Athena Spark 工作群組使用 Lake Formation

使用發行版本 Apache Spark 3.5 版,您可以使用 AWS Lake Formation AWS Glue Data Catalog,其中工作階段執行角色具有完整的資料表許可。此功能可讓您從 Athena Spark 互動式工作階段讀取和寫入受 Lake Formation 保護的資料表。請參閱下列各節,進一步了解 Lake Formation 以及如何搭配 Athena Spark 使用。

步驟 1:在 Lake Formation 中啟用完整資料表存取

若要使用完整資料表存取 (FTA) 模式,您必須允許 Athena Spark 在沒有 IAM 工作階段標籤驗證的情況下存取資料 AWS Lake Formation。若要啟用,請遵循整合應用程式進行完整資料表存取中的步驟。

步驟 1.1:使用使用者定義的角色在 Lake Formation 中註冊資料位置

您必須使用使用者定義的角色來註冊其中的資料位置 AWS Lake Formation。如需詳細資訊,請參閱用於註冊位置的角色需求

步驟 2:設定工作階段執行角色的 IAM 許可

對於基礎資料的讀取或寫入存取權,除了 Lake Formation 許可之外,執行角色還需要 lakeformation:GetDataAccess IAM 許可。有了此許可,Lake Formation 就會授與要求存取資料所需的臨時憑證。

以下範例政策說明如何提供 IAM 許可,以存取 Amazon S3 中的指令碼、將日誌上傳至 S3、 AWS Glue API 許可,以及存取 Lake Formation 的許可。

步驟 2.1:設定 Lake Formation 許可

  • 從 S3 讀取資料的 Spark 任務需要 Lake Formation SELECT許可。

  • 在 S3 中寫入/刪除資料的 Spark 任務需要 Lake Formation ALL (SUPER)許可。

  • 與 AWS Glue 資料目錄互動的 Spark 任務需要 DESCRIBEALTERDROP 許可。

步驟 3:使用 Lake Formation 初始化完整資料表存取的 Spark 工作階段

先決條件

AWS Glue Data Catalog 必須設定為中繼存放區,才能存取 Lake Formation 資料表。

設定下列設定,將 AWS 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" }

若要存取向 註冊的資料表 AWS Lake Formation,需要在 Spark 初始化期間設定下列組態,以將 Spark 設定為使用 AWS 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 Tables

{ "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