

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

# Amazon EMR을와 통합 AWS Lake Formation
<a name="emr-lake-formation"></a>

AWS Lake Formation 는 Amazon Simple Storage Service(S3) 데이터 레이크에서 데이터를 검색, 카탈로그화, 정리 및 보호하는 데 도움이 되는 관리형 서비스입니다. Lake Formation은 AWS Glue 데이터 카탈로그의 데이터베이스 및 테이블에 대한 열, 행 또는 셀 수준에서 세분화된 액세스를 제공합니다. 자세한 내용은 [AWS Lake Formation란 무엇입니까?](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html)를 참조하세요.

Amazon EMR 릴리스 6.7.0 이상에서는 Amazon EMR 클러스터에 제출하는 Spark, Hive 및 Presto 작업에 Lake Formation 기반 액세스 제어를 적용할 수 있습니다. Lake Formation과 통합하려면 *런타임 역할*이 있는 EMR 클러스터를 생성해야 합니다. 런타임 역할은 Amazon EMR 작업 또는 쿼리에 연결하는 AWS Identity and Access Management (IAM) 역할입니다. 그런 다음 Amazon EMR은이 역할을 사용하여 AWS 리소스에 액세스합니다. 자세한 내용은 [Amazon EMR 단계의 런타임 역할](emr-steps-runtime-roles.md) 단원을 참조하십시오.

## Amazon EMR이 Lake Formation과 함께 작동하는 방식
<a name="how-emr-lf-works"></a>

Amazon EMR을 Lake Formation과 통합한 후에는 [`Step` API](https://docs.aws.amazon.com/emr/latest/APIReference/API_Step.html) 또는 SageMaker AI Studio를 사용하여 Amazon EMR 클러스터에 쿼리를 실행할 수 있습니다. 그런 다음 Lake Formation은 Amazon EMR의 임시 보안 인증을 통해 데이터에 대한 액세스를 제공합니다. 이 프로세스를 보안 인증 벤딩이라고 합니다. 자세한 내용은 [AWS Lake Formation란 무엇입니까?](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html)를 참조하세요.

다음 개요에서는 Amazon EMR이 Lake Formation 보안 정책에 따라 보호되는 데이터에 액세스하는 방법을 설명합니다.

![\[Amazon EMR이 Lake Formation 보안 정책으로 보호되는 데이터에 액세스하는 방법\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ManagementGuide/images/lf-emr-security.png)


1. 사용자가 Lake Formation의 데이터에 대한 Amazon EMR 쿼리를 제출합니다.

1. Amazon EMR은 사용자에게 데이터 액세스 권한을 부여하기 위해 Lake Formation에 임시 보안 인증을 요청합니다.

1. Lake Formation은 임시 보안 인증을 반환합니다.

1. Amazon EMR은 Amazon S3에서 데이터를 검색하기 위한 쿼리 요청을 보냅니다.

1. Amazon EMR은 Amazon S3에서 데이터를 수신하여 필터링하고 Lake Formation에서 사용자가 정의한 사용자 권한을 기반으로 결과를 반환합니다.

Lake Formation 정책에 사용자 및 그룹을 추가하는 방법에 대한 자세한 내용은 [Granting Data Catalog permissions](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)를 참조하세요.

## 사전 조건
<a name="prerequisites"></a>

Amazon EMR과 Lake Formation을 통합하기 전에 다음 요구 사항을 충족해야 합니다.
+ Amazon EMR 클러스터에서 런타임 역할 인증을 켭니다.
+  AWS Glue 데이터 카탈로그를 메타데이터 스토어로 사용합니다.
+ Lake Formation에서 AWS Glue 데이터 카탈로그의 데이터베이스, 테이블 및 열에 액세스할 수 있는 권한을 정의하고 관리합니다. 자세한 내용은 [AWS Lake Formation란 무엇입니까?](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html)를 참조하세요.

# Lake Formation을 통한 세분화된 액세스
<a name="lake-formation-fine-grained-access"></a>

Amazon EMR 릴리스 6.15.0 이상에는 AWS Lake Formation을 기반으로 행, 열 또는 셀 수준에서 세분화된 액세스 제어에 대한 지원이 포함됩니다. 이 섹션의 주제에서는 세분화된 액세스 제어를 통해 EMR Spark 작업 또는 대화형 세션에서 Lake Formation 보호 Glue Data Catalog 테이블에 액세스하는 방법을 다룹니다.

# Amazon EMR에서 Lake Formation 활성화
<a name="emr-lf-enable"></a>

Amazon EMR 6.15.0 이상에서는 Glue 데이터 카탈로그의 데이터에 액세스하는 EC2 클러스터의 Amazon EMR에서 Spark 작업을 실행할 때 AWS AWS Lake Formation 를 사용하여 Hudi, Iceberg 또는 Delta Lake 기반 테이블에 테이블, 행, 열 및 셀 수준 권한을 적용할 수 있습니다.

이 섹션에서는 보안 구성을 생성하고 Amazon EMR과 함께 작동하도록 Lake Formation을 설정하는 방법을 다룹니다. 또한 Lake Formation용으로 생성한 보안 구성으로 클러스터를 시작하는 방법도 살펴봅니다.

## 1단계: EMR 클러스터의 런타임 역할 설정
<a name="emr-lf-launch-cluster"></a>

EMR 클러스터에 대한 런타임 역할을 사용하려면 보안 구성을 생성해야 합니다. 보안 구성을 사용하면 클러스터 전체에 일관된 보안, 권한 부여 및 인증 옵션을 적용할 수 있습니다.

1. 다음 보안 콘텐츠를 포함하는 `lf-runtime-roles-sec-cfg.json` 파일을 생성합니다.

   ```
   {
       "AuthorizationConfiguration": {
           "IAMConfiguration": {
               "EnableApplicationScopedIAMRole": true,
               "ApplicationScopedIAMRoleConfiguration": {
                   "PropagateSourceIdentity": true
               }
           },
           "LakeFormationConfiguration": {
               "AuthorizedSessionTagValue": "Amazon EMR"
           }
       },
       "EncryptionConfiguration": {
   	    "EnableAtRestEncryption": false,
               "EnableInTransitEncryption": true,
               "InTransitEncryptionConfiguration": {
               "TLSCertificateConfiguration": {<certificate-configuration>}
           }
       }
   }
   ```

   아래 예제에서는 인증서 구성에 Amazon S3의 인증서와 함께 zip 파일을 사용하는 방법을 보여줍니다.
   + Amazon S3에 인증서가 있는 zip 파일이 키 공급자로 사용됩니다. (인증서 요구 사항은 [Amazon EMR 암호화를 사용하여 전송 중 데이터 암호화에 대한 인증서 제공](emr-encryption-enable.md#emr-encryption-certificates) 섹션 참조)

   ```
   "TLSCertificateConfiguration": {
   	"CertificateProviderType": "PEM",       
   	"S3Object": "s3://MyConfigStore/artifacts/MyCerts.zip"
    }
   ```

   아래 예제에서는 인증서 구성에 사용자 지정 키 공급자를 사용하는 방법을 보여줍니다.
   + 사용자 지정 키 공급자가 사용됩니다. (인증서 요구 사항은 [Amazon EMR 암호화를 사용하여 전송 중 데이터 암호화에 대한 인증서 제공](emr-encryption-enable.md#emr-encryption-certificates) 섹션 참조)

   ```
   "TLSCertificateConfiguration": {
   	"CertificateProviderType": "Custom",
   	"S3Object": "s3://MyConfig/artifacts/MyCerts.jar",
   	"CertificateProviderClass": "com.mycompany.MyCertProvider"
       }
   ```

1. 다음으로 세션 태그가 Lake Formation을 승인할 수 있도록 `LakeFormationConfiguration/AuthorizedSessionTagValue` 속성을 `Amazon EMR`로 설정합니다.

1. 다음 명령을 사용하여 Amazon EMR 보안 구성을 생성합니다.

   ```
   aws emr create-security-configuration \
   --name 'iamconfig-with-iam-lf' \
   --security-configuration file://lf-runtime-roles-sec-cfg.json
   ```

   또는 [Amazon EMR 콘솔](https://console.aws.amazon.com//emr)을 사용하여 사용자 지정 설정이 포함된 보안 구성을 생성할 수 있습니다.

## 2단계: Amazon EMR 클러스터 시작
<a name="emr-lf-launch-cluster"></a>

이제 이전 단계에서 생성한 보안 구성을 사용하여 EMR 클러스터를 시작할 준비가 되었습니다. 보안 구성 생성에 대한 자세한 내용은 [보안 구성을 사용하여 Amazon EMR 클러스터 보안 설정](emr-security-configurations.md) 및 [Amazon EMR 단계의 런타임 역할](emr-steps-runtime-roles.md) 섹션을 참조하세요.

## 3단계: Amazon EMR 런타임 역할을 사용하여 Lake Formation 기반 열, 행 또는 셀 수준 권한 설정
<a name="emr-lf-fgac-perms"></a>

Lake Formation을 사용하여 열, 행 또는 셀 수준에서 세분화된 액세스 제어를 적용하려면 Lake Formation의 데이터 레이크 관리자가 세션 태그 구성(`AuthorizedSessionTagValue`)의 값으로 `Amazon EMR`을 설정합니다. Lake Formation은 이 세션 태그를 사용하여 직접 호출자에게 권한을 부여하고 데이터 레이크에 대한 액세스를 제공합니다. Lake Formation 콘솔의 **애플리케이션 통합 설정** 섹션에서 이 세션 태그를 설정할 수 있습니다. *123456789012*를 자체 AWS 계정 ID로 바꿉니다.

## 4단계: Amazon EMR 런타임 역할에 대한 AWS Glue 및 Lake Formation 권한 부여 구성
<a name="emr-lf-trust-policy"></a>

Amazon EMR 런타임 역할을 사용하여 Lake Formation 기반 액세스 제어 설정을 계속하려면 Amazon EMR 런타임 역할에 대한 AWS Glue 및 Lake Formation 권한 부여를 구성해야 합니다. IAM 런타임 역할이 Lake Formation과 상호 작용할 수 있도록 하려면 해당 역할에 `lakeformation:GetDataAccess` 및 `glue:Get*`을 사용하여 액세스 권한을 부여합니다.

Lake Formation 권한은 AWS Glue 데이터 카탈로그 리소스, Amazon S3 위치 및 해당 위치의 기본 데이터에 대한 액세스를 제어합니다. IAM 권한은 Lake Formation 및 AWS Glue APIs. 데이터 카탈로그의 테이블에 액세스할 수 있는 Lake Formation 권한이 있더라도(SELECT) `glue:Get*` API에 IAM 권한이 없으면 작업이 실패합니다. Lake Formation 액세스 제어에 대한 자세한 내용은 [Lake Formation access control overview](https://docs.aws.amazon.com/lake-formation/latest/dg/lf-permissions-overview.html)를 참조하세요.

1.  다음 콘텐츠가 포함된 `emr-runtime-roles-lake-formation-policy.json` 파일을 생성합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "LakeFormationManagedAccess",
         "Effect": "Allow",
         "Action": [
           "lakeformation:GetDataAccess",
           "glue:Get*",
           "glue:Create*",
           "glue:Update*"
         ],
         "Resource": [
           "*"
         ]
       }
     ]
   }
   ```

------

1. 관련 IAM 정책을 생성합니다.

   ```
   aws iam create-policy \
   --policy-name emr-runtime-roles-lake-formation-policy \
   --policy-document file://emr-runtime-roles-lake-formation-policy.json
   ```

1. 이 정책을 IAM 런타임 역할에 할당하려면 [AWS Lake Formation 권한 관리](https://docs.aws.amazon.com/lake-formation/latest/dg/managing-permissions.html)의 단계를 수행합니다.

이제 런타임 역할과 Lake Formation을 사용하여 테이블 및 열 수준 권한을 적용할 수 있습니다. 소스 자격 증명을 사용하여 작업을 제어하고 작업을 모니터링할 수도 있습니다 AWS CloudTrail.

런타임 역할로 사용하려는 각 IAM 역할에 대해 인스턴스 프로파일을 `EMR_EC2_DefaultRole`로 대체하여 다음과 같은 신뢰 정책을 설정합니다. IAM 역할의 신뢰 정책을 수정하려면 [역할 신뢰 정책 수정](https://docs.aws.amazon.com//IAM/latest/UserGuide/roles-managingrole-editing-console.html)을 참조하세요.

```
{
   "Sid":"AllowAssumeRole",
   "Effect":"Allow",
   "Principal":{
     "AWS":"arn:aws:iam::<AWS_ACCOUNT_ID>:role/EMR_EC2_DefaultRole"
   },
   "Action":[
        "sts:AssumeRole",
        "sts:TagSession"
       ]
 }
```

자세한 포괄적인 예제를 보려면 [Introducing runtime roles for Amazon EMR steps](https://aws.amazon.com/blogs/big-data/introducing-runtime-roles-for-amazon-emr-steps-use-iam-roles-and-aws-lake-formation-for-access-control-with-amazon-emr/)를 참조하세요.<a name="iceberg-with-lake-formation-spark-catalog-integration-lf-ec2"></a>

다중 카탈로그 계층 구조를 위해 Iceberg 및 AWS Glue 데이터 카탈로그와 통합하는 방법에 대한 자세한 내용은 [AWS Glue 데이터 카탈로그의 다중 카탈로그 계층 구조에 액세스하도록 Spark 구성을](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-multi-catalog.html#emr-lakehouse-using-spark-access) 참조하세요.

# 오픈 테이블 형식 지원
<a name="emr-lf-fgac1"></a>

Amazon EMR 릴리스 6.15.0 이상에는 Spark SQL AWS Lake Formation 을 사용하여 데이터를 읽고 쓸 때 Hive 테이블, Apache Iceberg, Apache Hudi 및 Delta Lake를 사용하여를 기반으로 하는 세분화된 액세스 제어에 대한 지원이 포함됩니다. Amazon EMR은 Apache Hudi를 통해 테이블, 행, 열 및 셀 수준 액세스 제어를 지원합니다. Amazon EMR 릴리스 6.15.0 이상부터 AWS Lake Formation을 기반으로 행, 열 또는 셀 수준에서 세분화된 액세스 제어에 대한 지원이 포함됩니다. EMR 7.12부터 Lake Formation 벤딩 자격 증명을 사용하여 Apache Hive, Apache Iceberg 및 Delta Lake 테이블에 대해 테이블 데이터를 수정하는 DML 및 DDL 작업이 지원됩니다.

이 섹션의 주제에서는 세분화된 액세스 제어를 통해 EMR Spark 작업 또는 대화형 세션에서 열린 테이블 형식으로 Lake Formation에 등록된 테이블에 액세스하는 방법을 다룹니다.

## 권한 요구 사항
<a name="emr-lf-perm"></a>

### 에 등록되지 않은 테이블 AWS Lake Formation
<a name="emr-lf-tbl-reg"></a>

에 등록되지 않은 테이블 AWS Lake Formation의 경우 작업 런타임 역할은 Amazon S3의 AWS Glue 데이터 카탈로그와 기본 테이블 데이터에 모두 액세스합니다. 이를 위해서는 작업 런타임 역할에 AWS Glue 및 Amazon S3 작업 모두에 대한 적절한 IAM 권한이 있어야 합니다.

### 에 등록된 테이블 AWS Lake Formation
<a name="emr-lf-tbl-not-reg"></a>

에 등록된 테이블 AWS Lake Formation의 경우 작업 런타임 역할은 AWS Glue 데이터 카탈로그 메타데이터에 액세스하고 Lake Formation에서 제공하는 임시 자격 증명은 Amazon S3의 기본 테이블 데이터에 액세스합니다. 작업을 실행하는 데 필요한 Lake Formation 권한은 Spark 작업이 시작하는 AWS Glue 데이터 카탈로그 및 Amazon S3 API 호출에 따라 달라지며 다음과 같이 요약할 수 있습니다.
+ **DESCRIBE** 권한을 사용하면 런타임 역할이 데이터 카탈로그에서 테이블 또는 데이터베이스 메타데이터를 읽을 수 있습니다.
+ **ALTER** 권한은 런타임 역할이 데이터 카탈로그의 테이블 또는 데이터베이스 메타데이터를 수정할 수 있도록 허용합니다.
+ **DROP** 권한을 사용하면 런타임 역할이 데이터 카탈로그에서 테이블 또는 데이터베이스 메타데이터를 삭제할 수 있습니다.
+ **SELECT** 권한을 사용하면 런타임 역할이 Amazon S3에서 테이블 데이터를 읽을 수 있습니다.
+ **INSERT** 권한은 런타임 역할이 Amazon S3에 테이블 데이터를 쓸 수 있도록 허용합니다.
+ **DELETE** 권한은 런타임 역할이 Amazon S3에서 테이블 데이터를 삭제할 수 있도록 허용합니다.
**참고**  
Lake Formation은 Spark 작업이 AWS Glue를 호출하여 테이블 메타데이터를 검색하고 Amazon S3를 호출하여 테이블 데이터를 검색할 때 권한을 느리게 평가합니다. 권한이 부족한 런타임 역할을 사용하는 작업은 Spark가 누락된 권한이 필요한 AWS Glue 또는 Amazon S3를 호출할 때까지 실패하지 않습니다.

**참고**  
다음 지원되는 테이블 매트릭스에서:   
**Supported**로 표시된 작업은 Lake Formation 자격 증명만 사용하여 Lake Formation에 등록된 테이블의 테이블 데이터에 액세스합니다. Lake Formation 권한이 충분하지 않으면 작업이 런타임 역할 자격 증명으로 돌아가지 않습니다. Lake Formation에 등록되지 않은 테이블의 경우 작업 런타임 역할 자격 증명이 테이블 데이터에 액세스합니다.
**Amazon S3 위치에서 지원되는 IAM 권한으로** 표시된 작업은 Lake Formation 자격 증명을 사용하여 Amazon S3의 기본 테이블 데이터에 액세스하지 않습니다. 이러한 작업을 실행하려면 테이블이 Lake Formation에 등록되어 있는지 여부에 관계없이 작업 런타임 역할에 테이블 데이터에 액세스하는 데 필요한 Amazon S3 IAM 권한이 있어야 합니다.

------
#### [ Hive ]

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ManagementGuide/emr-lf-fgac1.html)

------
#### [ Iceberg ]

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ManagementGuide/emr-lf-fgac1.html)

**Iceberg의 Spark 구성:** Iceberg 형식을 사용하려면 다음 구성을 설정합니다. `DB_LOCATION`을 Iceberg 테이블이 있는 Amazon S3 경로로 바꾸고 리전 및 계정 ID 자리 표시자를 자체 값으로 바꾸세요.

```
spark-sql \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
--conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog 
--conf spark.sql.catalog.spark_catalog.warehouse=s3://DB_LOCATION
--conf spark.sql.catalog.spark_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog 
--conf spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO
--conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID
--conf spark.sql.catalog.spark_catalog.glue.id=ACCOUNT_ID
--conf spark.sql.catalog.spark_catalog.client.region=AWS_REGION
```

이전 EMR 버전에서 Iceberg 형식을 사용하려면 다음 명령을 대신 사용하세요.

```
spark-sql \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension  
--conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkCatalog 
--conf spark.sql.catalog.spark_catalog.warehouse=s3://DB_LOCATION
--conf spark.sql.catalog.spark_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog 
--conf spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO  
--conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID
--conf spark.sql.catalog.spark_catalog.glue.id=ACCOUNT_ID
--conf spark.sql.catalog.spark_catalog.client.assume-role.region=AWS_REGION
--conf spark.sql.catalog.spark_catalog.lf.managed=true
```

**예**:

다음은 Iceberg 테이블 작업의 몇 가지 예입니다.

```
-- Create an Iceberg table
CREATE TABLE my_iceberg_table (
    id BIGINT,
    name STRING,
    created_at TIMESTAMP
) USING ICEBERG;

-- Insert data
INSERT INTO my_iceberg_table VALUES (1, 'Alice', current_timestamp());

-- Query the table
SELECT * FROM my_iceberg_table;
```

------
#### [ Hudi ]

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ManagementGuide/emr-lf-fgac1.html)

**Hudi에 대한 Spark 구성:**

EMR 7.10 이상 버전에서 Spark 쉘을 시작하려면 다음 명령을 사용합니다.

```
spark-sql
--jars /usr/lib/hudi/hudi-spark-bundle.jar \
--conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog \
--conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension
```

이전 EMR 버전에서 Spark 쉘을 시작하려면 대신 아래 명령을 사용합니다.

```
spark-sql
--jars /usr/lib/hudi/hudi-spark-bundle.jar \
--conf spark.serializer=org.apache.spark.serializer.KryoSerializer \
--conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog \
--conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension  \
--conf spark.sql.catalog.spark_catalog.lf.managed=true
```

**예**:

다음은 Hudi 테이블 작업의 몇 가지 예입니다.

```
-- Create a Hudi table
CREATE TABLE my_hudi_table (
    id BIGINT,
    name STRING,
    created_at TIMESTAMP
) USING HUDI
TBLPROPERTIES (
    'type' = 'cow',
    'primaryKey' = 'id'
);

-- Insert data
INSERT INTO my_hudi_table VALUES (1, 'Alice', current_timestamp());

-- Query the latest snapshot
SELECT * FROM my_hudi_table;
```

copy-on-write 테이블의 최신 스냅샷을 쿼리하려면:

```
SELECT * FROM my_hudi_cow_table
```

```
spark.read.table("my_hudi_cow_table")
```

압축된 최신 `MOR` 테이블 데이터를 쿼리하려면 `_ro` 접미사가 붙은 읽기 최적화 테이블을 쿼리하면 됩니다.

```
SELECT * FROM my_hudi_mor_table_ro
```

```
spark.read.table("my_hudi_mor_table_ro")
```

------
#### [ Delta Lake ]

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ManagementGuide/emr-lf-fgac1.html)

**Delta Lake의 Spark 구성:**

Lake Formation on EMR 7.10 이상에서 Delta Lake를 사용하려면 다음 명령을 실행합니다.

```
spark-sql \
   --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension \
  --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog
```

Lake Formation on EMR 6.15\$17.9와 함께 Delta Lake를 사용하려면 다음 명령을 실행합니다.

```
spark-sql \
  --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension \
  --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog \
  --conf spark.sql.catalog.spark_catalog.lf.managed=true
```

Lake Formation에서 레코드 서버를 사용하여 Spark 카탈로그를 관리하도록 하려면 `spark.sql.catalog.<managed_catalog_name>.lf.managed`를 true로 설정합니다.

**예**:

다음은 Delta Lake 테이블 작업의 몇 가지 예입니다.

```
-- Create a Delta Lake table
CREATE TABLE my_delta_table (
    id BIGINT,
    name STRING,
    created_at TIMESTAMP
) USING DELTA;

-- Insert data
INSERT INTO my_delta_table VALUES (1, 'Alice', current_timestamp());

-- Query the table
SELECT * FROM my_delta_table;

-- Update data
UPDATE my_delta_table SET name = 'Alice Smith' WHERE id = 1;

-- Merge data
MERGE INTO my_delta_table AS target
USING (SELECT 2 as id, 'Bob' as name, current_timestamp() as created_at) AS source
ON target.id = source.id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;
```

** AWS Glue 데이터 카탈로그에서 Delta Lake 테이블 생성**

Lake Formation을 사용하는 Amazon EMR은 7.12 이전 EMR 릴리스에서 DDL 명령 및 Delta 테이블 생성을 지원하지 않습니다. 다음 단계에 따라 AWS Glue 데이터 카탈로그에서 테이블을 생성합니다.

1. 다음 예제 코드를 사용하여 델타 테이블을 생성합니다. S3 위치가 존재하는지 확인합니다.

   ```
   spark-sql \
   --conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension" \
   --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog"
   
   > CREATE DATABASE if not exists <DATABASE_NAME> LOCATION 's3://<S3_LOCATION>/transactionaldata/native-delta/<DATABASE_NAME>/';
   > CREATE TABLE <TABLE_NAME> (x INT, y STRING, z STRING) USING delta;
   > INSERT INTO <TABLE_NAME> VALUES (1, 'a1', 'b1');
   ```

1. 테이블의 세부 정보를 보려면 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)로 이동합니다.

1. 왼쪽 탐색에서 **Data Catalog**를 확장하고 **테이블**을 선택한 다음, 사용자가 생성한 테이블을 선택합니다. **스키마**에서 Spark로 생성한 Delta 테이블이 AWS Glue의 데이터 형식에 모든 열을 저장한다는 것을 알 `array<string>` 수 있습니다.

1. Lake Formation에서 열 및 셀 수준 필터를 정의하려면 스키마에서 `col` 열을 제거한 다음, 테이블 스키마에 있는 열을 추가합니다. 이 예제에서는 `x`, `y`, `z` 열을 추가합니다.

------

이 기능을 사용하면 copy-on-write 테이블에서 스냅샷 쿼리를 실행하여 지정된 커밋 또는 압축 인스턴스에서 테이블의 최신 스냅샷을 쿼리할 수 있습니다. 현재 Lake Formation 지원 Amazon EMR 클러스터는 증분 쿼리 및 시간 이동 쿼리를 수행하려면 Hudi의 커밋 시간 열을 검색해야 합니다. Spark의 `timestamp as of` 구문과 `Spark.read()` 함수는 지원하지 않습니다. 올바른 구문은 `select * from table where _hoodie_commit_time <= point_in_time`입니다. 자세한 내용은 [Point in time Time-Travel queries on Hudi table](https://cwiki.apache.org/confluence/display/HUDI/RFC+-+07+%3A+Point+in+time+Time-Travel+queries+on+Hudi+table)을 참조하세요.

**참고**  
지원되지 않는 최적화로 인해 Lake Formation 클러스터의 읽기 성능이 느려질 수 있습니다. 이러한 기능에는 Hudi 메타데이터를 기반으로 하는 파일 목록 및 데이터 건너뛰기가 포함됩니다. 애플리케이션 성능을 테스트하여 요구 사항을 충족하는지 확인하는 것이 좋습니다.

# Amazon EMR에서 Glue Data Catalog 보기 작업
<a name="SECTION-jobs-glue-data-catalog-views-ec2"></a>

**참고**  
Amazon EMR 릴리스 AWS 7.10.0 이상에서 EMR on EC2와 함께 사용할 Glue 데이터 카탈로그 뷰를 생성하고 관리할 수 있습니다. [https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-7100-release.html](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-7100-release.html) 

 AWS Glue Data Catalog에서 EMR on EC2와 함께 사용할 뷰를 생성하고 관리할 수 있습니다. 일반적으로 AWS Glue 데이터 카탈로그 뷰라고 합니다. 이러한 뷰는 여러 SQL 쿼리 엔진을 지원하므로 EC2의 EMR Amazon Athena및 Amazon Redshift와 같은 다양한 AWS 서비스에서 동일한 뷰에 액세스할 수 있으므로 유용합니다.

데이터 카탈로그에서 보기를 생성하면에서 리소스 권한 부여 및 태그 기반 액세스 제어를 사용하여 액세스 권한을 AWS Lake Formation 부여할 수 있습니다. 이 액세스 제어 방법을 사용하면 보기를 생성할 때 참조한 테이블에 대한 추가 액세스를 구성하지 않아도 됩니다. 이러한 권한 부여 방법을 정의자 시맨틱이라고 하며 이러한 보기를 정의자 보기라고 합니다. Lake Formation의 액세스 제어에 대한 자세한 내용은 AWS Lake Formation 개발자 안내서의 [데이터 카탈로그 리소스에 대한 권한 부여 및 취소](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)를 참조하세요.

Data Catalog 보기는 다음 사용 사례에 유용합니다.
+ **세분화된 액세스 제어** - 사용자에게 필요한 권한에 따라 데이터 액세스를 제한하는 뷰를 생성할 수 있습니다. 예를 들어, 데이터 카탈로그의 뷰를 사용하여 인사 관리(HR) 부서 소속이 아닌 직원은 개인 식별 정보(PII)를 보지 못하게 할 수 있습니다.
+ **완전한 정의 완료** - Data Catalog의 뷰에 필터를 적용하면 데이터 카탈로그의 뷰에서 사용할 수 있는 데이터 레코드가 항상 완전한지 확인할 수 있습니다.
+ **향상된 보안** - 보기를 생성하는 데 사용되는 쿼리 정의를 완료합니다. 이러한 이점은 데이터 카탈로그의 보기가 악의적 액터의 SQL 명령에 영향을 받지 않는다는 것을 의미합니다.
+ **간단한 데이터 공유** - 데이터를 이동하지 않고 다른 AWS 계정과 데이터를 공유합니다. 자세한 내용은 [Cross-account data sharing in Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-permissions.html)을 참조하세요.

## Data Catalog 뷰 생성
<a name="SECTION-jobs-glue-data-catalog-views-create-ec2"></a>

Data Catalog 뷰는 다양한 방법으로 생성할 수 있습니다. 여기에는 AWS CLI 또는 Spark SQL 사용이 포함됩니다. 몇 가지 예는 다음과 같습니다.

------
#### [ Using SQL ]

다음은 Data Catalog 뷰를 생성하기 위한 구문을 보여줍니다. `MULTI DIALECT` 뷰 유형을 기록합니다. 이 작업을 수행하면 데이터 카탈로그 보기가 다른 보기와 구별됩니다. `SECURITY` 조건자는 `DEFINER`로 지정됩니다. 이는 `DEFINER` 의미 체계가 있는 Data Catalog 뷰를 나타냅니다.

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW [IF NOT EXISTS] view_name
[(column_name [COMMENT column_comment], ...) ]
[ COMMENT view_comment ]
[TBLPROPERTIES (property_name = property_value, ... )]
SECURITY DEFINER
AS query;
```

다음은 구문을 따르는 샘플 `CREATE` 문입니다.

```
CREATE PROTECTED MULTI DIALECT VIEW catalog_view
SECURITY DEFINER
AS
SELECT order_date, sum(totalprice) AS price
FROM source_table
GROUP BY order_date
```

또한 SQL을 사용하여 테스트 실행 모드에서 뷰를 만들어 실제로 리소스를 생성하지 않고도 뷰 생성을 테스트할 수 있습니다. 이 옵션을 사용하면 입력을 검증하는 "드라이 런"이 생성되고 검증이 성공하면 뷰를 나타내는 AWS Glue 테이블 객체의 JSON이 반환됩니다. 이 경우 실제 뷰는 생성되지 않습니다.

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW view_name
SECURITY DEFINER 
[ SHOW VIEW JSON ]
AS view-sql
```

------
#### [ Using the AWS CLI ]

**참고**  
CLI 명령을 사용하는 경우 뷰 생성에 사용된 SQL은 구문 분석되지 않습니다. 이로 인해 뷰는 생성되었지만, 쿼리가 성공하지 못하는 경우가 발생할 수 있습니다. 뷰를 생성하기 전에 SQL 구문을 테스트합니다.

다음 CLI 명령을 사용하여 뷰를 만듭니다.

```
aws glue create-table --cli-input-json '{
  "DatabaseName": "database",
  "TableInput": {
    "Name": "view",
    "StorageDescriptor": {
      "Columns": [
        {
          "Name": "col1",
          "Type": "data-type"
        },
        ...
        {
          "Name": "col_n",
          "Type": "data-type"
        }
      ],
      "SerdeInfo": {}
    },
    "ViewDefinition": {
      "SubObjects": [
        "arn:aws:glue:aws-region:aws-account-id:table/database/referenced-table1",
        ...
        "arn:aws:glue:aws-region:aws-account-id:table/database/referenced-tableN",
       ],
      "IsProtected": true,
      "Representations": [
        {
          "Dialect": "SPARK",
          "DialectVersion": "1.0",
          "ViewOriginalText": "Spark-SQL",
          "ViewExpandedText": "Spark-SQL"
        }
      ]
    }
  }
}'
```

------

## 지원되는 뷰 작업
<a name="SECTION-jobs-glue-data-catalog-views-supported-operations-ec2"></a>

다음 명령 조각은 Data Catalog 뷰를 사용하는 다양한 방법을 보여줍니다.
+ **CREATE VIEW**

  Data Catalog 뷰를 생성합니다. 다음은 기존 테이블에서 뷰를 생성하는 방법을 보여주는 샘플입니다.

  ```
  CREATE PROTECTED MULTI DIALECT VIEW catalog_view 
  SECURITY DEFINER AS SELECT * FROM my_catalog.my_database.source_table
  ```
+ **ALTER VIEW**

  사용 가능한 구문:
  + `ALTER VIEW view_name [FORCE] ADD DIALECT AS query`
  + `ALTER VIEW view_name [FORCE] UPDATE DIALECT AS query`
  + `ALTER VIEW view_name DROP DIALECT`

  `FORCE ADD DIALECT` 옵션을 사용하여 새 엔진 언어에 따라 스키마 및 하위 객체를 강제 업데이트할 수 있습니다. `FORCE`를 사용하여 다른 엔진 언어를 업데이트하지 않아도 이로 인해 쿼리 오류가 발생할 수 있습니다. 다음은 샘플을 보여줍니다.

  ```
  ALTER VIEW catalog_view FORCE ADD DIALECT
  AS
  SELECT order_date, sum(totalprice) AS price
  FROM source_table
  GROUP BY orderdate;
  ```

  다음은 언어를 업데이트하기 위해 뷰를 변경하는 방법을 보여줍니다.

  ```
  ALTER VIEW catalog_view UPDATE DIALECT AS 
  SELECT count(*) FROM my_catalog.my_database.source_table;
  ```
+ **DESCRIBE VIEW**

  뷰를 설명하는 데 사용할 수 있는 구문:
  + `SHOW COLUMNS {FROM|IN} view_name [{FROM|IN} database_name]` - 사용자에게 뷰를 설명하는 데 필요한 AWS Glue 및 Lake Formation 권한이 있는 경우 열을 나열할 수 있습니다. 다음은 열을 표시하기 위한 몇 가지 샘플 명령입니다.

    ```
    SHOW COLUMNS FROM my_database.source_table;    
    SHOW COLUMNS IN my_database.source_table;
    ```
  + `DESCRIBE view_name` - 사용자에게 뷰를 설명하는 데 필요한 AWS Glue 및 Lake Formation 권한이 있는 경우 메타데이터와 함께 뷰의 열을 나열할 수 있습니다.
+ **DROP VIEW**

  사용 가능한 구문:
  + `DROP VIEW [ IF EXISTS ] view_name`

    다음 샘플은 삭제 전에 뷰가 존재하는지 테스트하는 `DROP` 문을 보여줍니다.

    ```
    DROP VIEW IF EXISTS catalog_view;
    ```
+ **보기 생성 표시**
  + `SHOW CREATE VIEW view_name` - 지정된 뷰를 생성하는 SQL 문을 보여줍니다. 다음은 Data Catalog 뷰 생성을 보여주는 샘플입니다.

    ```
    SHOW CREATE TABLE my_database.catalog_view;
    CREATE PROTECTED MULTI DIALECT VIEW my_catalog.my_database.catalog_view (
      net_profit,
      customer_id,
      item_id,
      sold_date)
    TBLPROPERTIES (
      'transient_lastDdlTime' = '1736267222')
    SECURITY DEFINER AS SELECT * FROM
    my_database.store_sales_partitioned_lf WHERE customer_id IN (SELECT customer_id from source_table limit 10)
    ```
+ **SHOW VIEWS**

  일반 뷰, 다중 언어 뷰(MDV) 및 Spark 언어가 없는 MDV와 같은 카탈로그의 모든 뷰를 나열합니다. 사용 가능한 구문은 다음과 같습니다.
  + `SHOW VIEWS [{ FROM | IN } database_name] [LIKE regex_pattern]`:

    다음은 뷰를 표시하는 샘플 명령입니다.

    ```
    SHOW VIEWS IN marketing_analytics LIKE 'catalog_view*';
    ```

데이터 카탈로그 뷰 생성 및 구성에 대한 자세한 내용은 AWS Lake Formation 개발자 안내서의 [AWS Glue 데이터 카탈로그 뷰 구축](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html)을 참조하세요.

## Data Catalog 뷰 쿼리
<a name="SECTION-jobs-glue-data-catalog-views-querying-ec2"></a>

 데이터 카탈로그 보기를 생성한 후 AWS Lake Formation 세분화된 액세스 제어가 활성화된 Amazon EMR Spark 작업을 사용하여 쿼리할 수 있습니다. 작업 런타임 역할에는 Data Catalog 뷰에 대한 Lake Formation `SELECT` 권한이 있어야 합니다. 뷰에서 참조된 기본 테이블에 대한 액세스 권한을 부여하지 않아도 됩니다.

모든 설정을 마치면 보기를 쿼리할 수 있습니다. 예를 들어, EMR Studio에서 Amazon EMR 애플리케이션을 생성한 후 다음 쿼리를 실행하여 뷰에 액세스할 수 있습니다.

```
SELECT * from my_database.catalog_view LIMIT 10;
```

유용한 함수는 `invoker_principal`입니다. 이 함수는 EMRS 작업 런타임 역할의 고유 식별자를 반환합니다. 이 함수는 호출 보안 주체에 따라 뷰 출력을 제어하는 용도로 사용할 수 있습니다. 이 함수를 사용하여 호출 역할에 따라 쿼리 결과를 구체화하는 조건을 뷰에 추가할 수 있습니다. 이 함수를 사용하려면 작업 런타임 역할에 `LakeFormation:GetDataLakePrincipal` IAM 작업 권한이 있어야 합니다.

```
select invoker_principal();
```

예를 들어, 이 함수를 `WHERE` 절에 추가하여 쿼리 결과를 구체화할 수 있습니다.

## 고려 사항 및 제한 사항
<a name="SECTION-jobs-glue-data-catalog-views-considerations-ec2"></a>

Data Catalog 뷰를 생성할 때 적용되는 사항은 다음과 같습니다.
+ Amazon EMR 7.10 이상에서 Data Catalog 뷰만 생성할 수 있습니다.
+ Data Catalog 뷰를 정의하는 사용자에는 뷰에서 액세스하는 기본 테이블에 대해 `SELECT` 액세스 권한이 있어야 합니다. 특정 기본 테이블의 정의자 역할에 Lake Formation 필터가 적용된 경우 Data Catalog 뷰 생성에 실패합니다.
+ 기본 테이블에는 Lake Formation의 `IAMAllowedPrincipals` 데이터 레이크 권한이 없어야 합니다. 이 권한이 있는 경우 *다중 언어 뷰는 IAMAllowedPrincipals 권한이 없는 테이블만 참조*라는 오류가 발생할 수 있습니다.
+ 테이블의 Amazon S3 위치를 Lake Formation 데이터 레이크 위치로 등록해야 합니다. 테이블이 등록되지 않은 경우 *다중 언어 뷰는 Lake Formation 관리형 테이블만 참조* 오류가 발생할 수 있습니다. Lake Formation에 Amazon S3 위치를 등록하는 방법에 대한 자세한 내용은 AWS Lake Formation 개발자 안내서의 [ Amazon S3 위치 등록](https://docs.aws.amazon.com/lake-formation/latest/dg/register-location.html)을 참조하세요.
+ `PROTECTED` Data Catalog 보기만 생성할 수 있습니다. `UNPROTECTED` 보기는 지원되지 않습니다.
+ 데이터 카탈로그 보기 정의에서 다른 AWS 계정의 테이블을 참조할 수 없습니다. 또한 별도의 리전에 있는 동일한 계정의 테이블을 참조할 수 없습니다.
+ 계정 또는 리전 간에 데이터를 공유하려면 리소스 링크를 사용하여 전체 뷰를 계정 및 리전 간에 공유합니다.
+ 사용자 정의 함수(UDF)는 지원되지 않습니다.
+ Iceberg 테이블 기반 뷰를 사용할 수 있습니다. 오픈 테이블 형식의 Apache Hudi 및 Delta Lake도 지원됩니다.
+ Data Catalog 보기는 다른 보기를 참조할 수 없습니다.
+  AWS Glue Data Catalog 뷰 스키마는 항상 소문자를 사용하여 저장됩니다. 예를 들어, DDL 문을 사용하여 `Castle`이라는 열을 만드는 경우 생성된 열은 `castle`과 같이 소문자로 표시됩니다. 그런 다음 DML 쿼리의 열 이름을 `Castle` 또는 `CASTLE`로 지정하면 EMR Spark는 쿼리를 실행하기 위해 이름을 소문자로 만듭니다. 하지만 열 머리글은 쿼리에서 지정한 대소문자를 사용하여 표시됩니다.

  DML 쿼리에 지정된 열 이름이 Glue Data Catalog의 열 이름과 일치하지 않는 경우 쿼리가 실패하도록 하려면 `spark.sql.caseSensitive=true`를 설정할 수 있습니다.

# Lake Formation을 사용하는 Amazon EMR에 대한 고려 사항
<a name="emr-lf-limitations-cont"></a>

Lake Formation을 사용하는 Amazon EMR은 [사용 가능한 모든 리전](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-region.html)에서 사용할 수 있습니다.

## Lake Formation 버전 7.9 이하를 사용하는 Amazon EMR에 대한 고려 사항
<a name="emr-lf-limitations-early"></a>

EMR 7.9 및 이전 버전 AWS Lake Formation 에서를 사용할 때는 다음 사항을 고려하세요.
+ 행, 열 및 셀 수준의 [세분화된 액세스 제어](emr-lf-enable.md#emr-lf-fgac-perms)는 Amazon EMR 릴리스 6.15 이상이 설치된 클러스터에서 사용할 수 있습니다.
+ 테이블에 액세스할 수 있는 사용자는 해당 테이블의 모든 속성에 액세스할 수 있습니다. 테이블에 Lake Formation 기반 액세스 제어를 사용하는 경우 테이블을 검토하여 속성에 민감한 데이터나 정보가 포함되어 있지 않은지 확인합니다.
+ Lake Formation을 포함하는 Amazon EMR 클러스터는 Spark가 테이블 통계를 수집할 때 Spark가 HDFS로 폴백하는 기능을 지원하지 않습니다. 이 기능은 일반적으로 쿼리 성능을 최적화하는 데 도움이 됩니다.
+ 관리되지 않는 Apache Spark 테이블을 사용하는 Lake Formation 기반 액세스 제어를 지원하는 작업에는 `INSERT INTO` 및 `INSERT OVERWRITE`가 포함됩니다.
+ Apache Spark 및 Apache Hive에서 Lake Formation 기반 액세스 제어를 지원하는 작업에는 `SELECT`, `DESCRIBE`, `SHOW DATABASE`, `SHOW TABLE`, `SHOW COLUMN`, `SHOW PARTITION`이 있습니다.
+ Amazon EMR은 다음과 같은 Lake Formation 기반 작업에 대한 액세스 제어를 지원하지 않습니다.
  + 관리 테이블에 쓰기
  + Amazon EMR에서는 `CREATE TABLE`을 지원하지 않습니다. Amazon EMR 6.10.0 이상에서는 `ALTER TABLE`을 지원합니다.
  + `INSERT` 명령 이외의 DML 명령문
+ 동일한 쿼리지만 Lake Formation 기반 액세스 제어 사용 여부에 따라 성능 차이가 있습니다.
+ Spark 작업에 대해서는 Lake Formation을 사용하는 Amazon EMR만 사용할 수 있습니다.
+ 신뢰할 수 있는 자격 증명 전파는 Glue Data Catalog의 다중 카탈로그 계층 구조에서 지원되지 않습니다. 자세한 내용은 [AWS Glue 데이터 카탈로그의 다중 카탈로그 계층 구조 작업을 참조하세요](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-multi-catalog.html).

## Lake Formation 버전 7.10 이상을 사용하는 Amazon EMR에 대한 고려 사항
<a name="emr-lf-limitations"></a>

EMR 7.10 이상 버전 AWS Lake Formation 에서와 함께 Amazon EMR을 사용할 때는 다음 사항을 고려하세요.
+ Amazon EMR은 Apache Hive, Apache Iceberg, Apache Delta 및 Apache Hudi 테이블에 대해서만 Lake Formation을 통한 세분화된 액세스 제어를 지원합니다. Apache Hive 형식에는 Parquet, ORC 및 xSV CSV가 포함됩니다.
+ Lake Formation 지원 애플리케이션의 경우 Spark 로그는 시스템 공간 로그와 사용자 공간 로그의 두 그룹으로 Amazon S3에 기록됩니다. 시스템 공간 로그에는 전체 테이블 스키마와 같은 민감한 정보가 포함될 수 있습니다. 이 데이터를 보호하기 위해 Amazon EMR은 시스템 공간 로그를 사용자 공간 로그와 별도의 위치에 저장합니다. 계정 관리자는 사용자에게 시스템 공간 로그에 대한 액세스 권한을 부여하지 않는 것이 좋습니다.
+ Lake Formation에 테이블 위치를 등록하면 Amazon EMR 작업 런타임 역할이 아닌 등록에 사용되는 역할의 권한에 의해서만 데이터 액세스가 제어됩니다. 등록 역할이 잘못 구성되면 테이블에 액세스하려고 시도하는 작업이 실패합니다.
+ Lake Formation 작업의 경우 `DynamicResourceAllocation`을 끌 수 없습니다.
+ Spark 작업에서 Lake Formation만 사용할 수 있습니다.
+ Lake Formation을 사용하는 Amazon EMR은 작업 전체에서 단일 Spark 세션만 지원합니다.
+ Lake Formation을 사용하는 Amazon EMR은 리소스 링크를 통해 공유되는 교차 계정 테이블 쿼리만 지원합니다.
+ 다음은 지원되지 않습니다.
  + 복원력 있는 분산 데이터세트(RDD)
  + Spark 스트리밍
  + Lake Formation에 부여된 권한으로 쓰기
  + 중첩된 열에 대한 액세스 제어
+ Amazon EMR은 다음을 포함하여 시스템 드라이버의 완전한 격리를 저해할 수 있는 기능을 차단합니다.
  + UDT, HiveUDF 및 사용자 지정 클래스가 포함된 사용자 정의 함수
  + 사용자 지정 데이터 소스
  + Spark 확장, 커넥터 또는 메타스토어에 대한 추가 jar 제공
  + `ANALYZE TABLE` 명령
+ 액세스 제어, `EXPLAIN PLAN` 및 DDL 작업(예: `DESCRIBE TABLE`)을 적용하려면 제한된 정보를 노출하지 않습니다.
+ Amazon EMR은 Lake Formation 지원 애플리케이션의 시스템 드라이버 Spark 로그에 대한 액세스를 제한합니다. 시스템 드라이버는 관리자 권한으로 실행되므로 시스템 드라이버가 생성하는 이벤트 및 로그에는 민감한 정보가 포함될 수 있습니다. 권한이 없는 사용자 또는 코드가 이 민감한 데이터에 액세스하지 못하도록 Amazon EMR은 시스템 드라이버 로그에 대한 액세스를 비활성화했습니다.

  시스템 프로파일 로그는 항상 관리형 스토리지에 유지되며, 이는 비활성화할 수 없는 필수 설정입니다. 이러한 로그는 고객 관리형 KMS 키 또는 AWS 관리형 KMS 키를 사용하여 안전하게 저장되고 암호화됩니다.

  Amazon EMR 애플리케이션이 Amazon S3용 VPC 엔드포인트가 있는 프라이빗 서브넷에 있고 엔드포인트 정책을 연결하여 액세스를 제어하는 경우 작업이 AWS 관리형 Amazon S3로 로그 데이터를 전송하려면 먼저 [관리형 스토리지](logging.html#jobs-log-storage-managed-storage)에 자세히 설명된 권한을 VPC 정책에 S3 게이트웨이 엔드포인트에 포함해야 합니다. 요청 문제 해결은 AWS 지원팀에 문의하세요.
+ Lake Formation에 테이블 위치를 등록한 경우 Amazon EMR 작업 런타임 역할에 대한 IAM 권한과 관계없이 데이터 액세스 경로는 Lake Formation에 저장된 자격 증명을 통과합니다. 테이블 위치에 등록된 역할을 잘못 구성하면 테이블 위치에 대한 S3 IAM 권한이 있는 역할을 사용하는 제출된 작업이 실패합니다.
+ Lake Formation 테이블에 쓰는 경우 Lake Formation에 부여된 권한이 아닌 IAM 권한을 사용합니다. 작업 런타임 역할에 필요한 S3 권한이 있는 경우 이를 사용하여 쓰기 작업을 실행할 수 있습니다.

다음은 Apache Iceberg를 사용하는 경우 고려 사항 및 제한 사항입니다.
+ Apache Iceberg는 세션 카탈로그에서만 사용할 수 있으며, 임의로 이름이 지정된 카탈로그에서는 사용할 수 없습니다.
+ Lake Formation에 등록된 Iceberg 테이블은 메타데이터 테이블 `history`, `metadata_log_entries`, `snapshots`, `files`, `manifests`, `refs`만 지원합니다. Amazon EMR은 `partitions`, `path`, `summaries`와 같이 민감한 데이터를 포함할 수 있는 열을 숨깁니다. 이 제한 사항은 Lake Formation에 등록되지 않은 Iceberg 테이블에 적용되지 않습니다.
+ Lake Formation에 등록하지 않은 테이블은 모든 Iceberg 저장 프로시저를 지원합니다. `register_table` 및 `migrate` 절차는 어떤 테이블에서도 지원되지 않습니다.
+ V1 대신 Iceberg DataFrameWriterV2를 사용하는 것이 좋습니다.

## 버전 7.12 이상용 Lake Formation을 사용하는 Amazon EMR에 대한 고려 사항
<a name="emr-lf-limit-712"></a>

### 일반
<a name="emr-lf-limits-g"></a>

Amazon EMR에서 Lake Formation을 사용할 때 다음 제한 사항을 검토합니다.
+ Lake Formation 작업의 경우 `DynamicResourceAllocation`을 끌 수 없습니다.
+ Spark 작업에서 Lake Formation만 사용할 수 있습니다.
+ Lake Formation을 사용하는 Amazon EMR은 작업 전체에서 단일 Spark 세션만 지원합니다.
+ Lake Formation을 사용하는 Amazon EMR은 리소스 링크를 통해 공유되는 교차 계정 테이블 쿼리만 지원합니다.
+ 다음은 지원되지 않습니다.
  + 복원력 있는 분산 데이터세트(RDD)
  + Spark 스트리밍
  + 중첩된 열에 대한 액세스 제어
+ Amazon EMR은 다음을 포함하여 시스템 드라이버의 완전한 격리를 저해할 수 있는 기능을 차단합니다.
  + UDT, HiveUDF 및 사용자 지정 클래스가 포함된 사용자 정의 함수
  + 사용자 지정 데이터 소스
  + Spark 확장, 커넥터 또는 메타스토어에 대한 추가 jar 제공
  + `ANALYZE TABLE` 명령
+ Amazon EMR 애플리케이션이 Amazon S3용 VPC 엔드포인트가 있는 프라이빗 서브넷에 있고 엔드포인트 정책을 연결하여 액세스를 제어하는 경우 작업이 AWS 관리형 Amazon S3로 로그 데이터를 전송하려면 먼저 [관리형 스토리지](logging.html#jobs-log-storage-managed-storage)에 자세히 설명된 권한을 VPC 정책에 S3 게이트웨이 엔드포인트에 포함해야 합니다. 요청 문제 해결은 AWS 지원팀에 문의하세요.
+ Amazon EMR 7.9.0부터 Spark FGAC는 s3a:// 스키마와 함께 사용할 때 S3AFileSystem을 지원합니다.
+ Amazon EMR 7.11은 CTAS를 사용하여 관리형 테이블 생성을 지원합니다.
+ Amazon EMR 7.12는 CTAS를 사용하여 관리형 및 외부 테이블 생성을 지원합니다.

## 권한
<a name="emr-lf-permissions"></a>
+ 액세스 제어를 적용하기 위해 EXPLAIN PLAN 및 DESCRIBE TABLE과 같은 DDL 작업은 제한된 정보를 노출하지 않습니다.
+ Lake Formation에 테이블 위치를 등록하면 데이터 액세스는 EMR Serverless 작업 런타임 역할의 IAM 권한 대신 Lake Formation에 저장된 자격 증명을 사용합니다. 런타임 역할에 해당 위치에 대한 S3 IAM 권한이 있더라도 테이블 위치에 등록된 역할이 잘못 구성된 경우 작업이 실패합니다.
+ Amazon EMR 7.12부터 추가 모드에서 Lake Formation 자격 증명과 함께 DataFrameWriter(V2)를 사용하여 기존 Hive 및 Iceberg 테이블에 쓸 수 있습니다. 덮어쓰기 작업의 경우 또는 새 테이블을 생성할 때 EMR은 런타임 역할 자격 증명을 사용하여 테이블 데이터를 수정합니다.
+ 뷰 또는 캐시된 테이블을 소스 데이터로 사용할 때 다음 제한 사항이 적용됩니다(이러한 제한 사항은 AWS Glue Data Catalog 뷰에는 적용되지 않음).
  + MERGE, DELETE 및 UPDATE 작업의 경우
    + 지원됨: 뷰 및 캐시된 테이블을 소스 테이블로 사용합니다.
    + 지원되지 않음: 할당 및 조건 절에서 뷰 및 캐시된 테이블 사용.
  + CREATE OR REPLACE 및 REPLACE TABLE AS SELECT 작업의 경우:
    + 지원되지 않음: 뷰 및 캐시된 테이블을 소스 테이블로 사용.
+ 소스 데이터에 UDFs 있는 Delta Lake 테이블은 삭제 벡터가 활성화된 경우에만 MERGE, DELETE 및 UPDATE 작업을 지원합니다.

## 로그 및 디버깅
<a name="emr-lf-logs-debugging"></a>
+ Amazon EMR은 Lake Formation 지원 애플리케이션의 시스템 드라이버 Spark 로그에 대한 액세스를 제한합니다. 시스템 드라이버는 관리자 권한으로 실행되므로 시스템 드라이버가 생성하는 이벤트 및 로그에는 민감한 정보가 포함될 수 있습니다. 권한이 없는 사용자 또는 코드가 이 민감한 데이터에 액세스하지 못하도록 Amazon EMR은 시스템 드라이버 로그에 대한 액세스를 비활성화했습니다.

  시스템 프로파일 로그는 항상 관리형 스토리지에 유지되며, 이는 비활성화할 수 없는 필수 설정입니다. 이러한 로그는 고객 관리형 KMS 키 또는 AWS 관리형 KMS 키를 사용하여 안전하게 저장되고 암호화됩니다.

## Iceberg
<a name="emr-lf-iceberg-considerations"></a>

Apache Iceberg를 사용할 때 다음 고려 사항을 검토합니다.
+ Apache Iceberg는 세션 카탈로그에서만 사용할 수 있으며, 임의로 이름이 지정된 카탈로그에서는 사용할 수 없습니다.
+ Lake Formation에 등록된 Iceberg 테이블은 메타데이터 테이블 `history`, `metadata_log_entries`, `snapshots`, `files`, `manifests`, `refs`만 지원합니다. Amazon EMR은 `partitions`, `path`, `summaries`와 같이 민감한 데이터를 포함할 수 있는 열을 숨깁니다. 이 제한 사항은 Lake Formation에 등록되지 않은 Iceberg 테이블에 적용되지 않습니다.
+ Lake Formation에 등록되지 않은 테이블은 모든 Iceberg 저장 프로시저를 지원합니다. `register_table` 및 `migrate` 절차는 어떤 테이블에서도 지원되지 않습니다.
+ V1 대신 Iceberg DataFrameWriterV2를 사용하는 것이 좋습니다.

# Spark 네이티브 세분화된 액세스 제어 알로리스팅된 PySpark API
<a name="clean-rooms-spark-fgac-pyspark-api-allowlist"></a>

보안 및 데이터 액세스 제어를 유지하기 위해 Spark 세분화된 액세스 제어(FGAC)는 특정 PySpark 함수를 제한합니다. 이러한 제한은 다음을 통해 적용됩니다.
+ 함수 실행을 방지하는 명시적 차단
+ 함수를 작동하지 않게 만드는 아키텍처 비호환성
+ 오류를 발생시키거나, 액세스 거부 메시지를 반환하거나, 호출 시 아무 작업도 수행하지 않을 수 있는 함수

Spark FGAC에서는 다음 PySpark 기능이 지원되지 않습니다.
+ RDD 작업(SparkRDDUnsupportedException으로 차단됨)
+ Spark Connect(지원되지 않음)
+ Spark 스트리밍(지원되지 않음)

네이티브 Spark FGAC 환경에서 나열된 함수를 테스트하고 예상대로 작동하는지 확인했지만 테스트에서는 일반적으로 각 API의 기본 사용만 다룹니다. 여러 입력 유형 또는 복잡한 로직 경로가 있는 함수에는 테스트되지 않은 시나리오가 있을 수 있습니다.

여기에 나열되지 않고 위의 지원되지 않는 범주에 명확하게 포함되지 않은 함수의 경우 다음을 권장합니다.
+ 감마 환경 또는 소규모 배포에서 먼저 테스트
+ 프로덕션 환경에서 사용하기 전에 동작 확인

**참고**  
클래스 메서드가 나열되었지만 기본 클래스는 표시되지 않은 경우에도 메서드는 계속 작동해야 합니다. 즉, 기본 클래스 생성자를 명시적으로 확인하지 않은 것입니다.

PySpark API는 모듈로 구성됩니다. 각 모듈 내의 메서드에 대한 일반적인 지원은 아래 표에 자세히 설명되어 있습니다.


| 모듈 이름 | Status | 참고 | 
| --- | --- | --- | 
|  pyspark\$1core  |  지원됨  |  이 모듈에는 기본 RDD 클래스가 포함되어 있으며 이러한 함수는 대부분 지원되지 않습니다.  | 
|  pyspark\$1sql  |  지원됨  |  | 
|  pyspark\$1testing  |  지원됨  |  | 
|  pyspark\$1resource  |  지원됨  |  | 
|  pyspark\$1streaming  |  차단됨  |  Spark FGAC에서는 스트리밍 사용이 차단됩니다.  | 
|  pyspark\$1mllib  |  실험적  |  이 모듈에는 RDD 기반 ML 작업이 포함되어 있으며 이러한 함수는 대부분 지원되지 않습니다. 이 모듈은 철저하게 테스트되지 않았습니다.  | 
|  pyspark\$1ml  |  실험적  |  이 모듈에는 DataFrame 기반 ML 작업이 포함되어 있으며 이러한 함수는 대부분 지원됩니다. 이 모듈은 철저하게 테스트되지 않았습니다.  | 
|  pyspark\$1pandas  |  지원됨  |    | 
|  pyspark\$1pandas\$1slow  |  지원됨  |    | 
| pyspark\$1connect |  차단됨  |  Spark FGAC에서는 Spark Connect 사용이 차단됩니다.  | 
| pyspark\$1pandas\$1connect |  차단됨  |  Spark FGAC에서는 Spark Connect 사용이 차단됩니다.  | 
| pyspark\$1pandas\$1slow\$1connect |  차단됨  |  Spark FGAC에서는 Spark Connect 사용이 차단됩니다.  | 
| pyspark\$1errors |  실험적  |  이 모듈은 철저하게 테스트되지 않았습니다. 사용자 지정 오류 클래스는 사용할 수 없습니다.  | 

**API 허용 목록**

다운로드 가능하고 검색하기 쉬운 목록을 위해 [네이티브 FGAC에서 허용되는 Python 함수](samples/Python functions allowed in Native FGAC.zip)에서 모듈 및 클래스가 있는 파일을 사용할 수 있습니다.

# Amazon EMR on EC2에 대한 Lake Formation 전체 테이블 액세스
<a name="lake-formation-unfiltered-ec2-access"></a>

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

## 전체 테이블 액세스 권한으로 Lake Formation 사용
<a name="lake-formation-unfiltered-ec2-full-access"></a>

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

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

### 1단계: Lake Formation에서 전체 테이블 액세스 활성화
<a name="lake-formation-unfiltered-ec2-full-table-access"></a>

전체 테이블 액세스(FTA) 모드를 사용하려면 AWS Lake Formation에서 IAM 세션 태그 검증 없이 타사 쿼리 엔진이 데이터에 액세스하도록 허용해야 합니다. 활성화하려면 [Application integration for full table access](https://docs.aws.amazon.com/lake-formation/latest/dg/full-table-credential-vending.html)의 단계를 따릅니다.

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

### 2단계: 작업 런타임 역할에 대한 IAM 권한 설정
<a name="lake-formation-unfiltered-ec2-iam-permissions"></a>

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

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

#### 2.1단계 Lake Formation 권한 구성
<a name="lake-formation-unfiltered-ec2-permission-model"></a>
+ S3에서 데이터를 읽는 Spark 작업에는 Lake Formation SELECT 권한이 필요합니다.
+ S3에서 데이터를 쓰거나 삭제하는 Spark 작업에는 Lake Formation ALL(SUPER) 권한이 필요합니다.
+ Glue Data Catalog와 상호 작용하는 Spark 작업에는 DESCRIBE, ALTER, DROP 권한이 필요합니다.

자세한 내용은 [데이터 카탈로그 리소스에 권한 부여](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)를 참조하세요.

### 3단계: Lake Formation을 사용하여 전체 테이블 액세스를 위한 Spark 세션 초기화
<a name="lake-formation-unfiltered-ec2-spark-session"></a>

#### 사전 조건
<a name="lake-formation-unfiltered-ec2-spark-session-prereq"></a>

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

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

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

EC2에서 Amazon EMR용 데이터 카탈로그를 활성화하는 방법에 대한 자세한 내용은 [ EC2에서 Amazon EMR용 메타스토어 구성을](metastore-config.html) 참조하세요.

 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=true` 및 `spark.hadoop.fs.s3.folderObject.autoAction.disabled=true`: S3 폴더를 생성할 때 \$1folder\$1 접미사 대신 콘텐츠 유형 헤더 application/x-directory를 사용하도록 EMRFS를 구성합니다. Lake Formation 자격 증명은 \$1folder\$1 접미사가 있는 테이블 폴더 읽기를 허용하지 않으므로 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에서 전체 테이블 액세스 모드 구성
<a name="lake-formation-unfiltered-ec2-full-table"></a>

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 작업을 실행하기 전에 이러한 구성을 설정해야 합니다.

#### 지원되는 작업
<a name="lake-formation-unfiltered-ec2-supported-operations"></a>

이러한 작업은 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 권한을 사용하여 테이블 데이터에 액세스합니다.

#### 고려 사항
<a name="considerations"></a>
+ 전체 테이블 액세스가 활성화되지 않은 작업을 사용하여 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과 함께 Amazon EMR on EC2 사용에](emr-serverless-lf-enable.html) 설명된 단계에 따라 FGAC 모드를 활성화할 수 있습니다.
+ 전체 테이블 액세스는 Spark 스트리밍을 지원하지 않습니다.
+ Lake Formation 테이블에 Spark DataFrame을 쓰는 경우 Hive 및 Iceberg 테이블 `df.write.mode("append").saveAsTable(table_name)`에는 APPEND 모드만 지원됩니다.
+ 외부 테이블을 생성하려면 IAM 권한이 필요합니다.
+ Lake Formation은 Spark 작업 내에서 자격 증명을 임시로 캐시하므로 현재 실행 중인 Spark 배치 작업 또는 대화형 방식 세션에는 권한 변경 내용이 반영되지 않을 수 있습니다.
+ 역할에 대한 서비스 연결 역할:[Lake Formation 요구 사항이](https://docs.aws.amazon.com/lake-formation/latest/dg/registration-role.html) 아닌 사용자 정의 역할을 사용합니다.

#### Hudi FTA 쓰기 지원 - 지원되는 작업
<a name="hudi-fta-supported-operations"></a>

다음 표는 전체 테이블 액세스 모드에서 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 | 테이블 변경 - 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\$1INSERT) | DATAFRAME(BULK\$1INSERT) | saveAsTable.Overwrite | 지원됨 | 
| 모르 | DATAFRAME(BULK\$1INSERT) | saveAsTable.Append | 지원되지 않음 | 
| 모르 | DATAFRAME(BULK\$1INSERT) | saveAsTable.Ignore | 지원됨 | 
| 모르 | DATAFRAME(BULK\$1INSERT) | saveAsTable.ErrorIfExists | 지원됨 | 
| 모르 | DATAFRAME(BULK\$1INSERT) | saveAsTable - 외부 테이블(경로) | 지원되지 않음 | 
| 모르 | DATAFRAME(BULK\$1INSERT) | save(경로) - DF v1 | 지원되지 않음 | 