

# Athena Spark 작업 그룹에서 Lake Formation 사용
<a name="notebooks-spark-lakeformation"></a>

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

## 1단계: Lake Formation에서 전체 테이블 액세스 활성화
<a name="notebooks-spark-lakeformation-enable-fta"></a>

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

### 1.1단계: 사용자 정의 역할을 사용하여 Lake Formation에서 데이터 위치 등록
<a name="notebooks-spark-lakeformation-register-locations"></a>

AWS Lake Formation에서 데이터 위치를 등록하려면 사용자 정의 역할을 사용해야 합니다. 자세한 내용은 [위치를 등록하는 데 사용되는 역할에 대한 요구 사항](https://docs.aws.amazon.com//lake-formation/latest/dg/registration-role.html)을 참조하세요.

## 2단계: 세션의 실행 역할에 대한 IAM 권한 설정
<a name="notebooks-spark-lakeformation-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="notebooks-spark-lakeformation-configure-permissions"></a>
+ S3에서 데이터를 읽는 Spark 작업에는 Lake Formation `SELECT` 권한이 필요합니다.
+ S3에서 데이터를 쓰거나 삭제하는 Spark 작업에는 Lake Formation `ALL (SUPER)` 권한이 필요합니다.
+ AWS Glue Data Catalog와 상호 작용하는 Spark 작업에는 적절하게 `DESCRIBE`, `ALTER`, `DROP` 권한이 필요합니다.

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

### 사전 조건
<a name="notebooks-spark-lakeformation-prerequisites"></a>

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
<a name="notebooks-spark-lakeformation-hive-config"></a>

```
{
  "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
<a name="notebooks-spark-lakeformation-iceberg-config"></a>

```
{
  "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
<a name="notebooks-spark-lakeformation-s3tables-config"></a>

```
{
  "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
<a name="notebooks-spark-lakeformation-deltalake-config"></a>

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

## 고려 사항 및 제한
<a name="notebooks-spark-lakeformation-considerations"></a>
+ 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
  ```