View a markdown version of this page

EMR Serverless에 대한 Lake Formation 전체 테이블 액세스 - Amazon EMR

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

EMR Serverless에 대한 Lake Formation 전체 테이블 액세스

Amazon EMR 릴리스 7.8.0 이상에서는 세분화된 액세스 제어의 제한 없이 작업 런타임 역할에 전체 테이블 권한이 있는 Glue Data Catalog와 함께 AWS Lake Formation을 활용할 수 있습니다. 이 기능을 사용하면 EMR Serverless Spark 배치 및 대화형 방식 작업에서 Lake Formation으로 보호되는 테이블을 읽고 쓸 수 있습니다. Lake Formation 및 EMR Serverless와 함께 사용하는 방법에 대해 자세히 알아보려면 다음 섹션을 참조하세요.

전체 테이블 액세스 권한으로 Lake Formation 사용

작업의 런타임 역할에 전체 테이블 액세스 권한이 있는 EMR Serverless Spark 작업 또는 대화형 세션에서 AWS Lake Formation 보호 Glue 데이터 카탈로그 테이블에 액세스할 수 있습니다. EMR Serverless 애플리케이션에서 AWS Lake Formation을 활성화할 필요가 없습니다. Spark 작업이 전체 테이블 액세스(FTA)로 구성된 경우 AWS Lake Formation 자격 증명은 AWS Lake Formation 등록 테이블의 S3 데이터를 읽거나 쓰는 데 사용되는 반면, 작업의 런타임 역할 자격 증명은 AWS Lake Formation에 등록되지 않은 테이블을 읽거나 쓰는 데 사용됩니다.

중요

세분화된 액세스 제어를 위해 AWS Lake Formation을 활성화하지 마십시오. 작업은 전체 테이블 액세스(FTA)와 세분화된 액세스 제어(FGAC)를 동일한 EMR 클러스터 또는 애플리케이션에서 실행할 수 없습니다.

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

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

참고

교차 계정 테이블에 액세스할 때는 생산자와 소비자 계정 모두에서 전체 테이블 액세스를 활성화합니다. 동일한 방식으로 교차 리전 테이블에 액세스할 때 생산자와 소비자 리전 모두에서 이 설정을 활성화합니다.

2단계: 작업 런타임 역할에 대한 IAM 권한 설정

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

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

JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "ScriptAccess", "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::*.amzn-s3-demo-bucket/scripts" ] }, { "Sid": "LoggingAccess", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/logs/*" ] }, { "Sid": "GlueCatalogAccess", "Effect": "Allow", "Action": [ "glue:Get*", "glue:Create*", "glue:Update*" ], "Resource": [ "*" ] }, { "Sid": "LakeFormationAccess", "Effect": "Allow", "Action": [ "lakeformation:GetDataAccess" ], "Resource": [ "*" ] } ] }

2.1단계 Lake Formation 권한 구성

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

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

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

자세한 내용은 데이터 카탈로그 리소스에 권한 부여를 참조하세요.

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

사전 조건

AWS Lake Formation 테이블에 액세스하려면 Glue 데이터 카탈로그를 메타스토어로 구성해야 합니다.

설정을 다음과 같이 설정하여 Glue 카탈로그를 메타스토어로 구성합니다.

--conf spark.sql.catalogImplementation=hive --conf spark.hive.metastore.client.factory.class=com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory

EMR Serverless용 데이터 카탈로그 활성화에 대한 자세한 내용은 EMR Serverless용 메타스토어 구성을 참조하세요.

AWS Lake Formation에 등록된 테이블에 액세스하려면 Spark 초기화 중에 다음 구성을 설정하여 AWS Lake Formation 자격 증명을 사용하도록 Spark를 구성해야 합니다.

Hive
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
Iceberg
--conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog --conf spark.sql.catalog.spark_catalog.warehouse=S3_DATA_LOCATION --conf spark.sql.catalog.spark_catalog.client.region=REGION --conf spark.sql.catalog.spark_catalog.type=glue --conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID --conf spark.sql.catalog.spark_catalog.glue.lakeformation-enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
Delta Lake
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
Hudi
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true --conf spark.jars=/usr/lib/hudi/hudi-spark-bundle.jar --conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog --conf spark.serializer=org.apache.spark.serializer.KryoSerializer
  • spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver: AWS Lake Formation 등록 테이블에 Lake Formation S3 자격 증명을 사용하도록 EMR Filesystem(EMRFS) 또는 EMR S3A를 구성합니다. S3 테이블이 등록되지 않은 경우 작업의 런타임 역할 자격 증명을 사용합니다.

  • spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=truespark.hadoop.fs.s3.folderObject.autoAction.disabled=true: S3 폴더를 생성할 때 $folder$ 접미사 대신 콘텐츠 유형 헤더 application/x-directory를 사용하도록 EMRFS를 구성합니다. Lake Formation 자격 증명은 $folder$ 접미사가 있는 테이블 폴더 읽기를 허용하지 않으므로 Lake Formation 테이블을 읽을 때 필요합니다.

  • spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true: 생성 전에 테이블 위치가 비어 있는지 확인하는 작업을 건너뛰도록 Spark를 구성합니다. Lake Formation 등록 테이블에서는 필수입니다. 위치가 비어 있는지 확인하기 위한 Lake Formation 자격 증명은 Glue Data Catalog 테이블을 생성한 후에만 사용할 수 있기 때문입니다. 이 구성이 없으면 작업의 런타임 역할 자격 증명이 빈 테이블 위치를 검증합니다.

  • spark.sql.catalog.createDirectoryAfterTable.enabled=true: Hive 메타스토어에서 테이블 생성 후 Amazon S3 폴더를 생성하도록 Spark를 구성합니다. Lake Formation 등록 테이블에서는 필수입니다. S3 폴더를 생성하기 위한 Lake Formation 자격 증명은 Glue Data Catalog 테이블을 생성한 후에만 사용할 수 있기 때문입니다.

  • spark.sql.catalog.dropDirectoryBeforeTable.enabled=true: Hive 메타스토어에서 테이블 삭제 전 S3 폴더를 제거하도록 Spark를 구성합니다. Lake Formation 등록 테이블에서는 필수입니다. Glue Data Catalog에서 테이블을 삭제한 후에는 S3 폴더를 삭제하기 위한 Lake Formation 자격 증명을 사용할 수 없기 때문입니다.

  • spark.sql.catalog.<catalog>.glue.lakeformation-enabled=true: AWS Lake Formation 등록 테이블에 Lake Formation S3 자격 증명을 사용하도록 Iceberg 카탈로그를 구성합니다. 테이블이 등록되지 않은 경우 기본 환경 자격 증명을 사용합니다.

SageMaker Unified Studio에서 전체 테이블 액세스 모드 구성

JupyterLab 노트북의 대화형 Spark 세션에서 Lake Formation 등록 테이블에 액세스하려면 호환성 권한 모드를 사용합니다. %%configure 매직 명령을 사용하여 Spark 구성을 설정합니다. 테이블 유형을 기반으로 구성 선택:

For Hive tables
%%configure -f { "conf": { "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 } }
For Iceberg tables
%%configure -f { "conf": { "spark.sql.catalog.spark_catalog": "org.apache.iceberg.spark.SparkSessionCatalog", "spark.sql.catalog.spark_catalog.warehouse": "S3_DATA_LOCATION", "spark.sql.catalog.spark_catalog.client.region": "REGION", "spark.sql.catalog.spark_catalog.type": "glue", "spark.sql.catalog.spark_catalog.glue.account-id": "ACCOUNT_ID", "spark.sql.catalog.spark_catalog.glue.lakeformation-enabled": "true", "spark.sql.catalog.dropDirectoryBeforeTable.enabled": "true" } }
For Delta Lake tables
%%configure -f { "conf": { "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 } }
For Hudi tables
%%configure -f { "conf": { "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, "spark.jars": "/usr/lib/hudi/hudi-spark-bundle.jar", "spark.sql.extensions": "org.apache.spark.sql.hudi.HoodieSparkSessionExtension", "spark.sql.catalog.spark_catalog": "org.apache.spark.sql.hudi.catalog.HoodieCatalog", "spark.serializer": "org.apache.spark.serializer.KryoSerializer" } }

자리 표시자 바꾸기:

  • S3_DATA_LOCATION: S3 버킷 경로

  • REGION: AWS region(예: us-east-1)

  • ACCOUNT_ID: AWS 계정 ID

참고

노트북에서 Spark 작업을 실행하기 전에 이러한 구성을 설정해야 합니다.

지원되는 작업

이러한 작업은 AWS Lake Formation 자격 증명을 사용하여 테이블 데이터에 액세스합니다.

  • CREATE TABLE

  • ALTER TABLE

  • INSERT INTO

  • INSERT OVERWRITE

  • UPDATE

  • MERGE INTO

  • DELETE FROM

  • ANALYZE TABLE

  • REPAIR TABLE

  • DROP TABLE

  • Spark 데이터 소스 쿼리

  • Spark 데이터 소스 쓰기

참고

위에 나열되지 않은 작업은 계속해서 IAM 권한을 사용하여 테이블 데이터에 액세스합니다.

고려 사항

  • 전체 테이블 액세스가 활성화되지 않은 작업을 사용하여 Hive 테이블이 생성되고, 삽입된 레코드가 없는 경우 전체 테이블 액세스를 사용하는 작업의 후속 읽기 또는 쓰기는 실패합니다. 전체 테이블 액세스 권한이 없는 EMR Spark가 $folder$ 접미사를 테이블 폴더 이름에 추가하기 때문입니다. 이 문제는 다음과 같은 방법으로 해결할 수 있습니다.

    • FTA가 활성화되지 않은 작업의 테이블에 1개 이상의 행을 삽입합니다.

    • S3의 폴더 이름에 $folder$ 접미사를 사용하지 않도록 FTA가 활성화되지 않은 작업을 구성합니다. Spark 구성 spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true를 설정하면 가능합니다.

    • S3 콘솔 또는 AWS S3 CLI를 s3://path/to/table/table_name 사용하여 테이블 위치에 AWS S3 폴더를 생성합니다.

  • 전체 테이블 액세스는 Amazon EMR 릴리스 7.8.0부터 EMR 파일 시스템(EMRFS)에서 지원되며, Amazon EMR 릴리스 7.10.0부터 S3A 파일 시스템에서 지원됩니다.

  • Hive, Iceberg, Delta 및 Hudi 테이블에는 전체 테이블 액세스가 지원됩니다.

  • Hudi FTA 쓰기 지원 고려 사항:

    • Hudi FTA 쓰기는 작업 실행 중에 자격 증명 벤딩에 HoodieCredentialedHadoopStorage를 사용해야 합니다. Hudi 작업을 실행할 때 다음 구성을 설정합니다. hoodie.storage.class=org.apache.spark.sql.hudi.storage.HoodieCredentialedHadoopStorage

    • Hudi에 대한 전체 테이블 액세스(FTA) 쓰기 지원은 Amazon EMR 릴리스 7.12부터 사용할 수 있습니다.

    • Hudi FTA 쓰기 지원은 현재 기본 Hudi 구성에서만 작동합니다. 사용자 지정이거나 기본값이 아닌 Hudi 설정은 완전히 지원되지 않을 수 있으며 예기치 않은 동작이 발생할 수 있습니다.

    • FTA 쓰기 모드에서는 Hudi Merge-On-Read(MOR) 테이블에 대한 클러스터링이 지원되지 않습니다.

  • Formation Fine 세분 영역 액세스 제어(FGAC) 규칙 또는 Glue Data Catalog 뷰가 있는 테이블을 참조하는 작업은 실패합니다. FGAC 규칙 또는 Glue Data Catalog 뷰로 테이블을 쿼리하려면 FGAC 모드를 사용해야 합니다. AWS 설명서: 세분화된 액세스 제어를 위해 AWS Lake Formation과 함께 EMR Serverless 사용에서 설명하는 단계에 따라 FGAC 모드를 활성화할 수 있습니다.

  • 전체 테이블 액세스는 Spark 스트리밍을 지원하지 않습니다.

  • Lake Formation 테이블에 Spark DataFrame을 쓰는 경우 Hive 및 Iceberg 테이블 df.write.mode("append").saveAsTable(table_name)에는 APPEND 모드만 지원됩니다.

  • 외부 테이블을 생성하려면 IAM 권한이 필요합니다.

  • Lake Formation은 Spark 작업 내에서 자격 증명을 임시로 캐시하므로 현재 실행 중인 Spark 배치 작업 또는 대화형 방식 세션에는 권한 변경 내용이 반영되지 않을 수 있습니다.

  • 역할에 대한 서비스 연결 역할:Lake Formation 요구 사항이 아닌 사용자 정의 역할을 사용합니다.

Hudi FTA 쓰기 지원 - 지원되는 작업

다음 표는 전체 테이블 액세스 모드에서 Hudi COW( Copy-On-Write) 및 MOR(Merge-On-Read) 테이블에 대해 지원되는 쓰기 작업을 보여줍니다.

Hudi FTA 지원 쓰기 작업
테이블 유형 연산 SQL 쓰기 명령 Status
COW INSERT 테이블에 삽입 지원됨
COW INSERT 테이블에 삽입 - 파티션(정적, 동적) 지원됨
COW INSERT INSERT OVERWRITE 지원됨
COW INSERT INSERT OVERWRITE - PARTITION(정적, 동적) 지원됨
UPDATE UPDATE 테이블 업데이트 지원됨
COW UPDATE 테이블 업데이트 - 파티션 변경 지원되지 않음
DELETE DELETE 테이블에서 삭제 지원됨
ALTER ALTER 대체 테이블 - 이름 바꾸기 지원되지 않음
COW ALTER 테이블 변경 - TBLPROPERTIES 설정 지원됨
COW ALTER ALTER TABLE - UNSET TBLPROPERTIES 지원됨
COW ALTER 테이블 변경 - 열 변경 지원됨
COW ALTER 테이블 변경 - 열 추가 지원됨
COW ALTER 테이블 변경 - 파티션 추가 지원됨
COW ALTER 테이블 변경 - 파티션 삭제 지원됨
COW ALTER 테이블 변경 - 파티션 복구 지원됨
COW ALTER 테이블 동기화 파티션 복구 지원됨
DROP DROP DROP TABLE 지원됨
COW DROP 삭제 테이블 - 제거 지원됨
CREATE CREATE 테이블 생성 - 관리형 지원됨
COW CREATE 테이블 생성 - 파티션 기준 지원됨
COW CREATE 존재하지 않는 경우 테이블 생성 지원됨
COW CREATE CREATE TABLE LIKE 지원됨
COW CREATE CREATE TABLE AS SELECT 지원됨
CREATE CREATE CREATE TABLE with LOCATION - 외부 테이블 지원되지 않음
DATAFRAME(INSERT) DATAFRAME(INSERT) saveAsTable.Overwrite 지원됨
COW DATAFRAME(INSERT) saveAsTable.Append 지원되지 않음
COW DATAFRAME(INSERT) saveAsTable.Ignore 지원됨
COW DATAFRAME(INSERT) saveAsTable.ErrorIfExists 지원됨
COW DATAFRAME(INSERT) saveAsTable - 외부 테이블(경로) 지원되지 않음
COW DATAFRAME(INSERT) save(경로) - DF v1 지원되지 않음
모르 INSERT 테이블에 삽입 지원됨
모르 INSERT 테이블에 삽입 - 파티션(정적, 동적) 지원됨
모르 INSERT INSERT OVERWRITE 지원됨
모르 INSERT INSERT OVERWRITE - PARTITION(정적, 동적) 지원됨
UPDATE UPDATE 테이블 업데이트 지원됨
모르 UPDATE 테이블 업데이트 - 파티션 변경 지원되지 않음
DELETE DELETE 테이블에서 삭제 지원됨
ALTER ALTER 대체 테이블 - 이름 바꾸기 지원되지 않음
모르 ALTER 테이블 변경 - TBLPROPERTIES 설정 지원됨
모르 ALTER ALTER TABLE - UNSET TBLPROPERTIES 지원됨
모르 ALTER 테이블 변경 - 열 변경 지원됨
모르 ALTER 테이블 변경 - 열 추가 지원됨
모르 ALTER 테이블 변경 - 파티션 추가 지원됨
모르 ALTER 테이블 변경 - 파티션 삭제 지원됨
모르 ALTER 테이블 변경 - 파티션 복구 지원됨
모르 ALTER 테이블 동기화 파티션 복구 지원됨
DROP DROP DROP TABLE 지원됨
모르 DROP 삭제 테이블 - 제거 지원됨
CREATE CREATE 테이블 생성 - 관리형 지원됨
모르 CREATE 테이블 생성 - 파티션 기준 지원됨
모르 CREATE 존재하지 않는 경우 테이블 생성 지원됨
모르 CREATE CREATE TABLE LIKE 지원됨
모르 CREATE CREATE TABLE AS SELECT 지원됨
CREATE CREATE CREATE TABLE with LOCATION - 외부 테이블 지원되지 않음
DATAFRAME(UPSERT) DATAFRAME(UPSERT) saveAsTable.Overwrite 지원됨
모르 DATAFRAME(UPSERT) saveAsTable.Append 지원되지 않음
모르 DATAFRAME(UPSERT) saveAsTable.Ignore 지원됨
모르 DATAFRAME(UPSERT) saveAsTable.ErrorIfExists 지원됨
모르 DATAFRAME(UPSERT) saveAsTable - 외부 테이블(경로) 지원되지 않음
모르 DATAFRAME(UPSERT) save(경로) - DF v1 지원되지 않음
DATAFRAME(삭제) DATAFRAME(삭제) saveAsTable.Append 지원되지 않음
모르 DATAFRAME(삭제) saveAsTable - 외부 테이블(경로) 지원되지 않음
모르 DATAFRAME(삭제) save(경로) - DF v1 지원되지 않음
DATAFRAME(BULK_INSERT) DATAFRAME(BULK_INSERT) saveAsTable.Overwrite 지원됨
모르 DATAFRAME(BULK_INSERT) saveAsTable.Append 지원되지 않음
모르 DATAFRAME(BULK_INSERT) saveAsTable.Ignore 지원됨
모르 DATAFRAME(BULK_INSERT) saveAsTable.ErrorIfExists 지원됨
모르 DATAFRAME(BULK_INSERT) saveAsTable - 외부 테이블(경로) 지원되지 않음
모르 DATAFRAME(BULK_INSERT) save(경로) - DF v1 지원되지 않음