

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

# Spark와 함께 Iceberg 클러스터 사용
<a name="emr-iceberg-use-spark-cluster"></a>

Amazon EMR 버전 6.5.0부터 부트스트랩 작업을 포함할 필요 없이 Spark 클러스터에서 Iceberg를 사용할 수 있습니다. Amazon EMR 버전 6.4.0 이하 버전의 경우 부트스트랩 작업을 사용하여 필요한 모든 종속 항목을 사전 설치할 수 있습니다.

이 자습서에서는 AWS CLI 를 사용하여 Amazon EMR Spark 클러스터에서 Iceberg로 작업합니다. 콘솔을 사용하여 Iceberg가 설치된 클러스터를 생성하려면 [Build an Apache Iceberg data lake using Amazon Athena, Amazon EMR, and AWS Glue](https://aws.amazon.com/blogs//big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/)의 단계를 수행합니다.

## Iceberg 클러스터 생성
<a name="emr-iceberg-create-cluster"></a>

 AWS Management Console, AWS CLI 또는 Amazon EMR API를 사용하여 Iceberg가 설치된 클러스터를 생성할 수 있습니다. 이 자습서에서는 AWS CLI 를 사용하여 Amazon EMR 클러스터에서 Iceberg로 작업합니다. 콘솔을 사용하여 Iceberg가 설치된 클러스터를 생성하려면 [Build an Apache Iceberg data lake using Amazon Athena, Amazon EMR, and AWS Glue](https://aws.amazon.com/blogs//big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/)의 단계를 수행합니다.

와 함께 Amazon EMR에서 Iceberg를 사용하려면 AWS CLI먼저 다음 단계를 사용하여 클러스터를 생성합니다. 를 사용하여 Iceberg 분류를 지정하는 방법에 대한 자세한 내용은 [클러스터를 생성할 AWS CLI 때를 사용하여 구성 제공](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-cli) 또는 섹션을 AWS CLI참조하세요[클러스터를 생성할 때 Java SDK를 사용하여 구성 제공](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-sdk).

1. 다음 콘텐츠가 포함된 `configurations.json` 파일을 생성합니다.

   ```
   [{
       "Classification":"iceberg-defaults",
       "Properties":{"iceberg.enabled":"true"}
   }]
   ```

1. 그리고 다음 구성을 사용하여 클러스터를 생성합니다. 예제 Amazon S3 버킷 경로와 서브넷 ID를 사용자 정보로 교체합니다.

   ```
   aws emr create-cluster --release-label emr-6.5.0 \
   --applications Name=Spark \
   --configurations file://configurations.json \
   --region us-east-1 \
   --name My_Spark_Iceberg_Cluster \
   --log-uri s3://{{amzn-s3-demo-bucket/}} \
   --instance-type m5.xlarge \
   --instance-count 2 \
   --service-role EMR_DefaultRole_V2 \ 
   --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetId={{subnet-1234567890abcdef0}}
   ```

또는 Spark 애플리케이션을 포함하는 Amazon EMR 클러스터를 생성하고 `/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar` 파일을 Spark 작업에 JAR 종속 항목으로 포함할 수 있습니다. 자세한 내용은 [애플리케이션 제출](https://spark.apache.org/docs/latest/submitting-applications.html#submitting-applications)을 참조하세요.

jar를 Spark 작업에 종속 항목으로 포함하려면 Spark 애플리케이션에 다음 구성 속성을 추가합니다.

```
--conf "spark.jars=/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar"
```

Spark 작업 종속성에 대한 자세한 내용은 Apache Spark 설명서 [Running Spark on Kubernetes](https://spark.apache.org/docs/latest/running-on-kubernetes.html)에서 [Dependency Management](https://spark.apache.org/docs/latest/running-on-kubernetes.html#dependency-management)를 참조하세요.

## Iceberg용 Spark 세션 초기화
<a name="emr-iceberg-initialize-spark-session"></a>

다음 예제에서는 대화식 Spark 쉘을 시작하거나 Spark 제출을 사용하거나 Amazon EMR에서 Iceberg를 작업하기 위해 Amazon EMR Notebooks를 사용하는 방법을 보여줍니다.

------
#### [ spark-shell ]

1. SSH를 사용하여 마스터 노드에 연결합니다. 자세한 내용은 *Amazon EMR 관리 안내서*에서 [SSH를 사용하여 프라이머리 노드에 연결](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)을 참조하세요.

1. Spark 셸을 시작하려면 다음 명령을 입력합니다. PySpark 쉘을 사용하려면 `spark-shell`을 `pyspark`로 바꿉니다.

   ```
   spark-shell \
       --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
       --conf spark.sql.catalog.my_catalog.warehouse=s3://{{amzn-s3-demo-bucket}}/{{prefix}}/
       --conf spark.sql.catalog.my_catalog.type=glue \
       --conf spark.sql.defaultCatalog=my_catalog \
       --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
   ```

------
#### [ spark-submit ]

1. SSH를 사용하여 마스터 노드에 연결합니다. 자세한 내용은 *Amazon EMR 관리 안내서*에서 [SSH를 사용하여 프라이머리 노드에 연결](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)을 참조하세요.

1. Iceberg용 Spark 세션을 시작하려면 다음 명령을 입력합니다.

   ```
   spark-submit \
   --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
   --conf spark.sql.catalog.my_catalog.warehouse=s3://{{amzn-s3-demo-bucket1}}/{{prefix}} \
   --conf spark.sql.catalog.my_catalog.type=glue \
   --conf spark.sql.defaultCatalog=my_catalog \
   --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
   ```

------
#### [ EMR Studio notebooks ]

EMR Studio 노트북을 사용하여 Spark 세션을 초기화하려면 다음 예제와 같이 Amazon EMR Notebooks에서 `%%configure` 매직 명령을 사용하여 Spark 세션을 구성합니다. 자세한 내용은 *Amazon EMR 관리 안내서*에서 [EMR Notebooks 매직 사용](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-magics.html#emr-magics)을 참조하세요.

```
%%configure -f{
"conf":{
    "spark.sql.catalog.my_catalog":"org.apache.iceberg.spark.SparkCatalog",
    "spark.sql.catalog.my_catalog.type":"glue",
    "spark.sql.catalog.my_catalog.warehouse":"s3://{{amzn-s3-demo-bucket1}}/{{prefix}}/",
    "spark.sql.defaultCatalog":"my_catalog",
    "spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
    }
}
```

------
#### [ CLI ]

CLI를 사용하여 Spark 클러스터를 초기화하고 모든 Spark Iceberg 세션 기본 구성을 설정하려면 다음 샘플을 실행합니다. AWS CLI 및 Amazon EMR API를 사용하여 구성 분류를 지정하는 방법에 대한 자세한 내용은 [애플리케이션 구성을](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html) 참조하세요.

```
[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.sql.catalog.my_catalog":"org.apache.iceberg.spark.SparkCatalog",
      "spark.sql.catalog.my_catalog.type":"glue",
      "spark.sql.catalog.my_catalog.warehouse":"s3://{{amzn-s3-demo-bucket1}}/{{prefix}}/",
      "spark.sql.defaultCatalog":"my_catalog",
      "spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
    }
  }
]
```

------

## Iceberg 테이블에 쓰기
<a name="emr-iceberg-write-to-table"></a>

다음 예제에서는 Spark DataFrame을 생성하고 Iceberg 데이터 세트로 쓰는 방법을 보여줍니다. 이 예제에서는 SSH를 기본 hadoop 사용자로 사용하여 프라이머리 노드에 연결되어 있는 동안 Spark 쉘을 통해 데이터 세트를 작업하는 방법을 보여줍니다.

**참고**  
코드 샘플을 Spark 쉘에 붙여넣으려면 프롬프트에 `:paste`를 입력하고 예제를 붙여넣은 다음 `CTRL+D`를 누릅니다.

------
#### [ PySpark ]

Spark에는 Python 기반 쉘(`pyspark`)이 포함되어 있으며, 이 쉘을 사용하여 Python에서 작성된 Spark 프로그램을 시제품화할 수 있습니다. 프라이머리 노드에서 `pyspark`를 간접 호출합니다.

```
## Create a DataFrame.
data = spark.createDataFrame([
 ("100", "2015-01-01", "2015-01-01T13:51:39.340396Z"),
 ("101", "2015-01-01", "2015-01-01T12:14:58.597216Z"),
 ("102", "2015-01-01", "2015-01-01T13:51:40.417052Z"),
 ("103", "2015-01-01", "2015-01-01T13:51:40.519832Z")
],["id", "creation_date", "last_update_time"])

## Write a DataFrame as a Iceberg dataset to the Amazon S3 location.
spark.sql("""CREATE TABLE IF NOT EXISTS dev.db.iceberg_table (id string,
creation_date string,
last_update_time string)
USING iceberg
location 's3://{{amzn-s3-demo-bucket}}/{{example-prefix}}/db/iceberg_table'""")

data.writeTo("dev.db.iceberg_table").append()
```

------
#### [ Scala ]

```
import org.apache.spark.sql.SaveMode
import org.apache.spark.sql.functions._

// Create a DataFrame.
val data = Seq(
("100", "2015-01-01", "2015-01-01T13:51:39.340396Z"),
("101", "2015-01-01", "2015-01-01T12:14:58.597216Z"),
("102", "2015-01-01", "2015-01-01T13:51:40.417052Z"),
("103", "2015-01-01", "2015-01-01T13:51:40.519832Z")
).toDF("id", "creation_date", "last_update_time")

// Write a DataFrame as a Iceberg dataset to the Amazon S3 location.
spark.sql("""CREATE TABLE IF NOT EXISTS dev.db.iceberg_table (id string,
creation_date string,
last_update_time string)
USING iceberg
location 's3://{{amzn-s3-demo-bucket}}/{{example-prefix}}/db/iceberg_table'""")

data.writeTo("dev.db.iceberg_table").append()
```

------

## Iceberg 테이블에서 읽기
<a name="emr-iceberg-read-from-table"></a>

------
#### [ PySpark ]

```
df = spark.read.format("iceberg").load("dev.db.iceberg_table")
df.show()
```

------
#### [ Scala ]

```
val df = spark.read.format("iceberg").load("dev.db.iceberg_table")
df.show()
```

------
#### [ Spark SQL ]

```
SELECT * from dev.db.iceberg_table LIMIT 10
```

------

## Spark Iceberg에서 AWS Glue 데이터 카탈로그 사용
<a name="emr-iceberg-glue-catalog-config-spark"></a>

Spark Iceberg에서 AWS Glue 데이터 카탈로그에 연결할 수 있습니다. 이 섹션에서는 서로 다른 연결 명령을 보여줍니다.

### 기본 리전의 기본 AWS Glue 카탈로그에 연결
<a name="emr-iceberg-glue-catalog-config-spark"></a>

이 샘플은 Glue 카탈로그 유형을 사용하여 연결하는 방법을 보여줍니다. 카탈로그 ID를 지정하지 않으면 기본값을 사용합니다.

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse=s3://{{amzn-s3-demo-bucket1}}/{{prefix}} \
    --conf spark.sql.catalog.my_catalog.type=glue \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

### 특정 카탈로그 ID를 사용하여 AWS Glue 카탈로그에 연결
<a name="emr-iceberg-glue-catalog-config-spark"></a>

이 샘플은 카탈로그 ID를 사용하여 연결하는 방법을 보여줍니다.

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse=s3://{{amzn-s3-demo-bucket1}}/{{prefix}} \
    --conf spark.sql.catalog.my_catalog.type=glue \
    --conf spark.sql.catalog.my_catalog.glue.id={{AWS Glue catalog ID}} \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

이 명령은 다른 계정의 AWS Glue 카탈로그, RMS 카탈로그 또는 페더레이션 카탈로그에 연결하는 데 사용할 수 있습니다.

## Spark Iceberg에서 Iceberg REST 카탈로그(IRC) 사용
<a name="emr-iceberg-rest-catalog-config"></a>

다음 섹션에서는 카탈로그와의 Iceberg 통합을 구성하는 방법을 자세히 설명합니다.

### AWS Glue Data Catalog IRC 엔드포인트에 연결
<a name="emr-iceberg-rest-catalog-config-gdc"></a>

다음은 Iceberg REST를 사용하기 위한 샘플 `spark-submit` 명령을 보여줍니다.

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse={{glue catalog ID}} \
    --conf spark.sql.catalog.my_catalog.type=rest \
    --conf spark.sql.catalog.my_catalog.uri={{glue endpoint URI}}/iceberg \
    --conf spark.sql.catalog.my_catalog.rest.sigv4-enabled=true \
    --conf spark.sql.catalog.my_catalog.rest.signing-name=glue \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

런타임 역할이 활성화된 클러스터에서 사용하려면 다음과 같은 추가 Spark 구성 설정이 필요합니다.

```
"spark.hadoop.fs.s3.credentialsResolverClass": "software.amazon.glue.GlueTableCredentialsResolver",
"spark.hadoop.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog",
"spark.hadoop.glue.id": {{glue catalog ID}}
"spark.hadoop.glue.endpoint": "glue endpoint"
```

각 리전의 AWS Glue 엔드포인트 URL 목록은 [AWS Glue 엔드포인트 및 할당량을 참조하세요](https://docs.aws.amazon.com/general/latest/gr/glue.html).

### 임의의 IRC 엔드포인트에 연결
<a name="emr-iceberg-rest-catalog-config-arbitrary"></a>

다음은 IRC 엔드포인트를 사용하기 위한 샘플 `spark-submit` 명령을 보여줍니다.

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse={{warehouse name}} \
    --conf spark.sql.catalog.my_catalog.type=rest \
    --conf spark.sql.catalog.my_catalog.uri={{your rest endpoint}} \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

## Iceberg SparkCatalog를 사용할 때와 SparkSessionCatalog를 사용할 때의 구성 차이
<a name="emr-iceberg-spark-catalog"></a>

Iceberg는 Spark Iceberg 카탈로그를 생성하는 두 가지 방법을 제공합니다. Spark 구성을 `SparkCatalog` 또는 `SparkSessionCatalog`(으)로 설정할 수 있습니다.

### Iceberg SparkCatalog 사용
<a name="emr-iceberg-spark-catalog-spark-catalog"></a>

다음은 **SparkCatalog**를 Spark Iceberg 카탈로그로 사용하기 위한 명령을 보여줍니다.

```
spark-shell \
--conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://{{amzn-s3-demo-bucket1}}/{{prefix}} \
--conf spark.sql.catalog.my_catalog.type=glue \
--conf spark.sql.defaultCatalog=my_catalog
```

이 방법에 대한 고려 사항:
+ Iceberg 테이블에는 액세스할 수 있지만 다른 테이블은 액세스할 수 없습니다.
+ 카탈로그 이름은 **spark\_catalog**일 수 없습니다. Spark의 초기 카탈로그 이름입니다. 항상 Hive 메타스토어에 연결됩니다. 사용자가 `spark.sql.defaultCatalog`를 사용하여 덮어쓰지 않는 한 Spark의 기본 카탈로그입니다.
+ `spark.sql.defaultCatalog`를 카탈로그 이름으로 설정하여 이를 기본 카탈로그로 만들 수 있습니다.

### Iceberg SparkSessionCatalog 사용
<a name="emr-iceberg-spark-catalog-spark-session"></a>

다음은 **SparkSessionCatalog**를 Spark Iceberg 카탈로그로 사용하기 위한 명령을 보여줍니다.

```
spark-shell \
    --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog \
    --conf spark.sql.catalog.spark_catalog.warehouse=s3://{{amzn-s3-demo-bucket1}}/{{prefix}} \
    --conf spark.sql.catalog.spark_catalog.type=glue
```

이 방법에 대한 고려 사항:
+ 테이블을 Iceberg 테이블로 찾을 수 없는 경우 Spark는 해당 테이블이 Hive 메타스토어의 테이블인지 확인합니다. 자세한 내용은 [AWS Glue 데이터 카탈로그를 Hive용 카탈로그로 사용을 참조하세요](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html).
+ 카탈로그 이름은 **spark\_catalog**여야 합니다.

## Iceberg Spark 확장 사용
<a name="emr-iceberg-spark-catalog-extensions"></a>

Iceberg는 사용자가 Spark 확장 구성 `spark.sql.extensions`를 통해 설정할 수 있는 Spark 확장 `org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions`를 제공합니다. 확장을 통해 행 수준 DELETE, UPDATE 및 MERGE와 같은 주요 Iceberg 기능, 압축, 스냅샷 만료, 분기 및 태그 지정 등과 같은 Iceberg별 Spark 데이터 정의 언어 설명 및 절차를 사용할 수 있습니다. 자세한 내용은 다음을 참조하세요.
+ Iceberg Spark 쓰기 확장: [Spark 쓰기](https://iceberg.apache.org/docs/nightly/spark-writes/)
+ Iceberg Spark DDL 확장: [ALTER TABLE SQL 확장](https://iceberg.apache.org/docs/nightly/spark-ddl/#alter-table-sql-extensions/)
+ Iceberg Spark 프로시저 확장: [Spark 프로시저](https://iceberg.apache.org/docs/nightly/spark-ddl/#alter-table-sql-extensions/)

## Spark에서 Iceberg 사용 시 고려 사항
<a name="spark-considerations-catalog"></a>
+ Amazon EMR 6.5.0에서는 기본적으로 Amazon EMR on EKS에서 실행되는 Iceberg를 지원하지 않습니다. Amazon EMR 6.5.0 사용자 지정 이미지를 사용할 수 있으므로 Amazon EMR on EKS에서 Iceberg 테이블을 생성하기 위해 `--jars local:///usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar`을 `spark-submit` 파라미터로 전달할 수 있습니다. 자세한 내용은 *Amazon EMR on EKS 개발 안내서*에서 [사용자 지정 이미지를 사용하여 Amazon EMR에서 Spark 워크로드 제출](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-steps.html#docker-custom-images-submit)을 참조하세요. 지원 에 지원을 문의할 수도 있습니다. Amazon EMR 6.6.0부터 Amazon EMR on EKS에서 Iceberg가 지원됩니다.
+  AWS Glue를 Iceberg의 카탈로그로 사용하는 경우 테이블을 생성하는 데이터베이스가 AWS Glue에 있는지 확인합니다. AWS Lake Formation 와 같은 서비스를 사용하고 있고 카탈로그를 로드할 수 없는 경우 명령을 실행하기 위해 서비스에 대한 적절한 액세스 권한이 있는지 확인합니다.
+ 에 설명된 대로 Iceberg SparkSessionCatalog를 사용하는 경우 Spark Iceberg [AWS Glue 데이터 카탈로그 설정을 구성하는 것 외에도 Glue 데이터 카탈로그를 Apache Hive 메타스토어로](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html) 구성에 설명된 구성 단계를 따라야 [Iceberg SparkCatalog를 사용할 때와 SparkSessionCatalog를 사용할 때의 구성 차이](#emr-iceberg-spark-catalog)합니다. AWS 