View a markdown version of this page

Athena Spark 작업 그룹에서 Lake Formation 사용 - Amazon Athena

Athena Spark 작업 그룹에서 Lake Formation 사용

릴리스 버전 Apache Spark 버전 3.5에서는 세션 실행 역할에 전체 테이블 권한이 있는 AWS Glue Data Catalog에서 AWS Lake Formation을 활용할 수 있습니다. 이 기능을 사용하면 Athena Spark 대화형 세션에서 Lake Formation으로 보호되는 테이블을 읽고 쓸 수 있습니다. Lake Formation 및 Athena Spark에서 이 서비스를 사용하는 방법에 대해 자세히 알아보려면 다음 섹션을 참조하세요.

1단계: Lake Formation에서 전체 테이블 액세스 활성화

전체 테이블 액세스(FTA) 모드를 사용하려면 AWS Lake Formation에서 IAM 세션 태그를 검증하지 않고도 Athena Spark에서 데이터에 액세스하도록 허용해야 합니다. 활성화하려면 Application integration for full table access의 단계를 따릅니다.

1.1단계: 사용자 정의 역할을 사용하여 Lake Formation에서 데이터 위치 등록

AWS Lake Formation에서 데이터 위치를 등록하려면 사용자 정의 역할을 사용해야 합니다. 자세한 내용은 위치를 등록하는 데 사용되는 역할에 대한 요구 사항을 참조하세요.

2단계: 세션의 실행 역할에 대한 IAM 권한 설정

기본 데이터에 대한 읽기 또는 쓰기 액세스의 경우 실행 역할에는 Lake Formation 권한 외에도 lakeformation:GetDataAccess IAM 권한이 필요합니다. 이 권한을 통해 Lake Formation은 데이터에 액세스하기 위한 임시 보안 인증 요청을 승인합니다.

다음은 Amazon S3에서 스크립트에 액세스하기 위한 IAM 권한, S3에 로그 업로드, AWS Glue API 권한 및 Lake Formation에 액세스하기 위한 권한을 제공하는 방법에 대한 정책 예제입니다.

2.1단계: Lake Formation 권한 구성

  • S3에서 데이터를 읽는 Spark 작업에는 Lake Formation SELECT 권한이 필요합니다.

  • S3에서 데이터를 쓰거나 삭제하는 Spark 작업에는 Lake Formation ALL (SUPER) 권한이 필요합니다.

  • AWS Glue Data Catalog와 상호 작용하는 Spark 작업에는 적절하게 DESCRIBE, ALTER, DROP 권한이 필요합니다.

3단계: Lake Formation을 사용하여 전체 테이블 액세스를 위한 Spark 세션 초기화

사전 조건

Lake Formation 테이블에 액세스하려면 AWS Glue Data Catalog를 메타스토어로 구성합니다.

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 초기화 중에 다음 구성을 설정하여 AWS Lake Formation 자격 증명을 사용하도록 Spark를 구성해야 합니다.

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 Tables 및 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