

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

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

[Apache Iceberg](https://iceberg.apache.org/)는 Amazon Simple Storage Service(S3)의 대형 데이터 세트를 위한 오픈 테이블 형식입니다. 이 테이블 형식은 대형 테이블, 원자성 커밋, 동시 쓰기, SQL 호환 테이블 진화 등에서 빠른 쿼리 성능을 제공합니다. Amazon EMR 6.5.0부터 Iceberg 테이블 형식으로 Amazon EMR 클러스터에서 Apache Spark 3을 사용할 수 있습니다.

다음 테이블에는 Amazon EMR이 Iceberg를 통해 설치하는 구성 요소와 함께 Amazon EMR 7.x 시리즈의 최신 릴리스에 포함된 Iceberg의 버전이 나열되어 있습니다.

이 릴리스에서 Iceberg와 함께 설치된 구성 요소의 버전은 [릴리스 7.12.0 구성 요소 버전을 참조하세요](emr-7120-release.md).


**emr-7.12.0용 Iceberg 버전 정보**  

| Amazon EMR 릴리스 레이블 | Iceberg 버전 | Iceberg와 함께 설치된 구성 요소 | 
| --- | --- | --- | 
| emr-7.12.0 | Iceberg 1.10.0-amzn-0 | Not available. | 

다음 테이블에는 Amazon EMR이 Iceberg를 통해 설치하는 구성 요소와 함께 Amazon EMR 6.x 시리즈의 최신 릴리스에 포함된 Iceberg의 버전이 나열되어 있습니다.

이 릴리스에서 Iceberg와 함께 설치된 구성 요소의 버전은 [릴리스 6.15.0 구성 요소 버전](emr-6150-release.md)을 참조하세요.


**emr-6.15.0용 Icebert 버전 정보**  

| Amazon EMR 릴리스 레이블 | Iceberg 버전 | Iceberg와 함께 설치된 구성 요소 | 
| --- | --- | --- | 
| emr-6.15.0 | Iceberg 1.4.0-amzn-0 | Not available. | 

**Topics**
+ [Iceberg 작동 방식](emr-iceberg-how-it-works.md)
+ [Iceberg와 함께 클러스터 사용](emr-iceberg-use-cluster.md)
+ [Iceberg 릴리스 기록](Iceberg-release-history.md)

# Iceberg 작동 방식
<a name="emr-iceberg-how-it-works"></a>

Iceberg는 디렉터리가 아닌 테이블에서 개별 데이터 파일을 추적합니다. 이렇게 하면 작성자가 데이터 파일을 제자리에 생성할 수 있습니다(파일을 이동하거나 변경하지 않음). 또한 작성자는 명시적 커밋을 통해서만 테이블에 파일을 추가할 수 있습니다. 테이블 상태는 메타데이터 파일에서 유지 관리됩니다. 테이블 상태가 변경되면 항상 메타데이터를 자동으로 대체하는 새 메타데이터 파일이 생성됩니다. 테이블 메타데이터 파일은 테이블 스키마, 파티셔닝 구성 및 기타 속성을 추적합니다.

 또한 테이블 콘텐츠의 스냅샷도 포함합니다. 각 스냅샷은 특정 시점에 테이블에 있는 전체 데이터 파일 세트입니다. 스냅샷은 메타데이터 파일에 나열되지만 스냅샷의 파일은 별도의 매니페스트 파일에 저장됩니다. 한 테이블 메타데이터 파일에서 다음 테이블 메타데이터 파일로의 원자적 전환은 스냅샷 격리를 제공합니다. 독자는 테이블 메타데이터를 로드했을 때 최신 상태였던 스냅샷을 사용합니다. 독자는 새로 고침을 통해 새 메타데이터 위치를 선택할 때까지 변경 사항의 영향을 받지 않습니다. 스냅샷의 데이터 파일은 테이블의 각 데이터 파일, 파티션 데이터 및 지표에 대한 행을 포함하는 하나 이상의 매니페스트 파일에 저장됩니다. 스냅샷은 매니페스트에 있는 모든 파일을 통합한 것입니다. 자주 변경되지 않는 메타데이터를 다시 작성하지 않도록 스냅샷 간에 매니페스트 파일을 공유할 수도 있습니다.

**Iceberg 스냅샷 다이어그램**

![\[2개의 스냅샷 다이어그램. 각 스냅샷에는 재사용 가능한 여러 매니페스트에 대한 메타데이터를 저장하는 자체 매니페스트 목록이 있습니다. 각 매니페스트는 하나 이상의 데이터 파일을 참조합니다.\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/Iceberg-snapshot-diagram.png)


Iceberg는 다음 기능을 제공합니다.
+ Amazon S3 데이터 레이크의 ACID 트랜잭션 및 시간 이동을 지원합니다.
+ 커밋 재시도를 통해 [낙관적 동시성](https://iceberg.apache.org/spec/#optimistic-concurrency)의 성능 이점을 활용합니다.
+ 파일 수준 충돌 해결은 높은 동시성을 제공합니다.
+ 메타데이터의 열당 최소 및 최대 통계를 사용하면 파일을 건너뛸 수 있어서 선택적 쿼리의 성능이 향상됩니다.
+ 파티션 스키마에 대한 업데이트를 활성화하는 파티션 진화를 통해 테이블을 유연한 파티션 레이아웃으로 구성할 수 있습니다. 그러면 실제 디렉터리에 의존하지 않고도 쿼리와 데이터 볼륨을 변경할 수 있습니다.
+ [스키마 진화](https://iceberg.apache.org/docs/latest/evolution/#schema-evolution) 및 적용을 지원합니다.
+ Iceberg 테이블은 멱등성 싱크 및 재생 가능한 소스 역할을 합니다. 이를 통해 정확히 한 번의 파이프라인으로 스트리밍 및 배치 지원이 가능합니다. 멱등성 싱크는 이전에 성공했던 쓰기 작업을 추적합니다. 따라서 싱크는 장애 발생 시 데이터를 다시 요청하고, 여러 번 전송된 경우 데이터를 삭제할 수 있습니다.
+ 테이블 진화, 작업 기록, 각 커밋에 대한 통계를 포함한 기록과 계보를 확인합니다.
+ 원하는 데이터 형식(Parquet, ORC, Avro) 및 분석 엔진(Spark, Trino, PrestoDB, Flink, Hive)을 통해 기존 데이터 세트에서 마이그레이션합니다.

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

이 섹션에는 Spark, Trino, Flink, Hive와 함께 Iceberg를 사용하는 방법에 대한 정보가 포함되어 있습니다.

# 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\$1catalog**일 수 없습니다. 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\$1catalog**여야 합니다.

## 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 

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

Amazon EMR 버전 6.6.0부터 Iceberg를 Trino 클러스터와 함께 사용할 수 있습니다.

이 자습서에서는 AWS CLI 를 사용하여 Amazon EMR Trino 클러스터에서 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-trino"></a>

와 함께 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` 파일을 생성합니다. 예를 들어, Hive 메타스토어를 카탈로그로 사용하려면 파일에 다음과 같은 콘텐츠가 있어야 합니다.

   ```
   [
     {
       "Classification": "trino-connector-iceberg",
       "Properties": {
         "connector.name": "iceberg",
         "hive.metastore.uri": "thrift://localhost:9083"
       }
     }
   ]
   ```

    AWS Glue 데이터 카탈로그를 스토어로 사용하려면 파일에 다음 콘텐츠가 있어야 합니다.

   ```
   [
     {
       "Classification": "trino-connector-iceberg",
       "Properties": {
         "connector.name": "iceberg",
         "iceberg.catalog.type": "glue"
       }
     }
   ]
   ```

   Amazon EMR 7.7.0부터 *fs.native-s3.enabled=true 속성을 포함합니다.*

   ```
   [
     { 
       "Classification": "trino-connector-iceberg",
       "Properties": {
         "connector.name": "iceberg",
         "iceberg.catalog.type": "glue",
         "fs.native-s3.enabled": "true"
       }           
     }                 
   ]
   ```

1. 다음과 같은 구성으로 클러스터를 생성하고 Amazon S3 버킷 경로 및 키 이름을 사용자 정보로 바꿉니다.

   ```
   aws emr create-cluster --release-label emr-6.7.0 \
   --applications Name=Trino \
   --region us-east-1 \
   --name My_Trino_Iceberg_Cluster \
   --log-uri s3://amzn-s3-demo-bucket \
   --configurations file://configurations.json \
   --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=c3.4xlarge InstanceGroupType=CORE,InstanceCount=3,InstanceType=c3.4xlarge \ 
   --use-default-roles \
   --ec2-attributes KeyName=<key-name>
   ```

## Iceberg용 Trino 세션 초기화
<a name="emr-iceberg-initialize-trino"></a>

Trino 세션을 초기화하려면 다음 명령을 실행합니다.

```
trino-cli --catalog iceberg
```

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

다음 SQL 명령을 사용하여 생성 후 테이블에 작성합니다.

```
trino> SHOW SCHEMAS;
trino> CREATE TABLE default.iceberg_table (
            id int,
            data varchar,
            category varchar)
       WITH (
            format = 'PARQUET',
            partitioning = ARRAY['category', 'bucket(id, 16)'],
            location = 's3://amzn-s3-demo-bucket/<prefix>')
          
trino> INSERT INTO default.iceberg_table VALUES (1,'a','c1'), (2,'b','c2'), (3,'c','c3');
```

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

Iceberg 테이블에서 읽으려면 다음 명령을 실행합니다.

```
trino> SELECT * from default.iceberg_table;
```

## Trino에서 Iceberg 사용 시 고려 사항
<a name="trino-considerations"></a>
+ Amazon EMR 6.5는 기본적으로 Iceberg에 대한 Trino Iceberg 카탈로그 지원을 제공하지 않습니다. Trino에는 Iceberg v0.11이 필요하므로 Spark 클러스터와 별도로 Trino용 Amazon EMR 클러스터를 시작하고 해당 클러스터에 Iceberg v0.11을 포함하는 것이 좋습니다.
+  AWS Glue를 Iceberg의 카탈로그로 사용하는 경우 테이블을 생성하는 데이터베이스가 AWS Glue에 있는지 확인합니다. AWS Lake Formation 와 같은 서비스를 사용하고 있고 카탈로그를 로드할 수 없는 경우 명령을 실행하기 위해 서비스에 대한 적절한 액세스 권한이 있는지 확인합니다.
+ Iceberg Glue 통합은 Redshift Managed Storage 카탈로그에서 작동하지 않습니다.

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

Amazon EMR 버전 6.9.0부터 오픈 소스 Iceberg Flink 통합을 사용할 때 필수 설정 단계 없이도 Flink 클러스터에서 Iceberg를 사용할 수 있습니다.

## Iceberg 클러스터 생성
<a name="creating-iceberg-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). 다음 콘텐츠로 `configurations.json`이라는 파일을 생성합니다.

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

그리고 다음과 같은 구성으로 클러스터를 생성하고, 예제 Amazon S3 버킷 경로와 서브넷 ID를 사용자 값으로 대체합니다.

```
aws emr create-cluster --release-label emr-6.9.0 \
--applications Name=Flink \
--configurations file://iceberg_configurations.json \
--region us-east-1 \
--name My_flink_Iceberg_Cluster \
--log-uri s3://amzn-s3-demo-bucket/ \
--instance-type m5.xlarge \
--instance-count 2 \
--service-role EMR_DefaultRole \ 
--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-1234567890abcdef
```

또는 Flink 애플리케이션을 포함하는 Amazon EMR 6.9.0 클러스터를 생성하고 `/usr/share/aws/iceberg/lib/iceberg-flink-runtime.jar` 파일을 Flink 작업에 JAR 종속성으로 포함할 수 있습니다.

## Flink SQL 클라이언트 사용
<a name="using-flink-sql-client"></a>

SQL 클라이언트 스크립트는 `/usr/lib/flink/bin`에 있습니다. 다음 명령으로 스크립트를 실행할 수 있습니다.

```
flink-yarn-session -d # starting the Flink YARN Session in detached mode
./sql-client.sh
```

그러면 Flink SQL 쉘이 시작됩니다.

## Flink 예제
<a name="flink-examples"></a>

### Iceberg 테이블 생성
<a name="create-iceberg-table"></a>

**Flink SQL**

```
CREATE CATALOG glue_catalog WITH (
   'type'='iceberg',
   'warehouse'='<WAREHOUSE>',
   'catalog-impl'='org.apache.iceberg.aws.glue.GlueCatalog',
    'io-impl'='org.apache.iceberg.aws.s3.S3FileIO'
 );

USE CATALOG  glue_catalog;

CREATE DATABASE IF NOT EXISTS <DB>;

USE <DB>;

CREATE TABLE IF NOT EXISTS `glue_catalog`.`<DB>`.`sample` (id int, data string);
```

**테이블 API**

```
EnvironmentSettings settings =
                EnvironmentSettings.newInstance().inBatchMode().build();

TableEnvironment tEnv = TableEnvironment.create(settings);

String warehouse = "<WAREHOUSE>";
String db = "<DB>";

tEnv.executeSql(
                "CREATE CATALOG glue_catalog WITH (\n"
                        + "   'type'='iceberg',\n"
                        + "   'warehouse'='"
                        + warehouse
                        + "',\n"
                        + "   'catalog-impl'='org.apache.iceberg.aws.glue.GlueCatalog',\n"
                        + "   'io-impl'='org.apache.iceberg.aws.s3.S3FileIO'\n"
                        + " );");

tEnv.executeSql("USE CATALOG  glue_catalog;");
tEnv.executeSql("CREATE DATABASE IF NOT EXISTS " + db + ";");
tEnv.executeSql("USE " + db + ";");
tEnv.executeSql(
        "CREATE TABLE `glue_catalog`.`" + db + "`.`sample` (id bigint, data string);");
```

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

**Flink SQL**

```
INSERT INTO `glue_catalog`.`<DB>`.`sample` values (1, 'a'),(2,'b'),(3,'c');
```

**테이블 API**

```
tEnv.executeSql(
        "INSERT INTO `glue_catalog`.`"
                + db
                + "`.`sample` values (1, 'a'),(2,'b'),(3,'c');");
```

**데이터스트림 API**

```
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

final StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

String db = "<DB Name>";

String warehouse = "<Warehouse Path>";

GenericRowData rowData1 = new GenericRowData(2);
rowData1.setField(0, 1L);
rowData1.setField(1, StringData.fromString("a"));

DataStream<RowData> input = env.fromElements(rowData1);

Map<String, String> props = new HashMap<();
props.put("type", "iceberg");
props.put("warehouse", warehouse);
props.put("io-impl", "org.apache.iceberg.aws.s3.S3FileIO");

CatalogLoader glueCatlogLoader =
        CatalogLoader.custom(
                "glue",
                props,
                new Configuration(),
                "org.apache.iceberg.aws.glue.GlueCatalog");

TableLoader tableLoader =
        TableLoader.fromCatalog(glueCatlogLoader, TableIdentifier.of(db, "sample"));

DataStreamSink<Void> dataStreamSink =
        FlinkSink.forRowData(input).tableLoader(tableLoader).append();

env.execute("Datastream Write");
```

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

**Flink SQL**

```
SELECT * FROM `glue_catalog`.`<DB>`.`sample`;
```

**테이블 API**

```
Table result = tEnv.sqlQuery("select * from `glue_catalog`.`" + db + "`.`sample`;");
```

**데이터스트림 API**

```
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

final StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

String db = "<DB Name>";

String warehouse = "<Warehouse Path>";

Map<String, String> props = new HashMap<>();
props.put("type", "iceberg");
props.put("warehouse", warehouse);
props.put("io-impl", "org.apache.iceberg.aws.s3.S3FileIO");

CatalogLoader glueCatlogLoader =
        CatalogLoader.custom(
                "glue",
                props,
                new Configuration(),
                "org.apache.iceberg.aws.glue.GlueCatalog");
                
TableLoader tableLoader =
        TableLoader.fromCatalog(glueCatlogLoader, TableIdentifier.of(db, "sample"));

DataStream<RowData> batch =
                FlinkSource.forRowData().env(env).tableLoader(tableLoader).streaming(false).build();

batch.print().name("print-sink");
```

## Hive 카탈로그 사용
<a name="using-hive-catalog"></a>

[Hive 메타스토어 및 Glue 카탈로그를 사용하여 Flink 구성](flink-configure.md#flink-configure-hive)에 설명된 대로 Flink 및 Hive 종속성이 해결되었는지 확인합니다.

## Flink 작업 실행
<a name="running-flink-job"></a>

Flink에 작업을 제출하는 한 가지 방법은 작업별 Flink YARN 세션을 사용하는 것입니다. 다음 명령을 사용하여 시작할 수 있습니다.

```
sudo flink run -m yarn-cluster -p 4 -yjm 1024m -ytm 4096m $JAR_FILE_NAME
```

## Flink에서 Iceberg 사용 시 고려 사항
<a name="flink-considerations"></a>
+  AWS Glue를 Iceberg의 카탈로그로 사용하는 경우 테이블을 생성하는 데이터베이스가 AWS Glue에 있는지 확인합니다. AWS Lake Formation 와 같은 서비스를 사용하고 있고 카탈로그를 로드할 수 없는 경우 명령을 실행하기 위해 서비스에 대한 적절한 액세스 권한이 있는지 확인합니다.
+ Iceberg Glue 통합은 Redshift Managed Storage 카탈로그에서 작동하지 않습니다.

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

Amazon EMR 릴리스 6.9.0 이상에서 오픈 소스 Iceberg Hive 통합에 필요한 설정 단계를 수행하지 않고도 Hive 클러스터에서 Iceberg를 사용할 수 있습니다. Amazon EMR 버전 6.8.0 이하 버전의 경우 부트스트랩 작업을 사용하여 Iceberg 지원을 위해 Hive를 구성하도록 `iceberg-hive-runtime` jar을 설치할 수 있습니다.

Amazon EMR 6.9.0에는[Hive 3.1.3 integration with Iceberg 0.14.1](https://iceberg.apache.org/releases/#0140-release)의 모든 기능이 포함되어 있으며, 런타임 시 지원되는 실행 엔진 자동 선택과 같은 Amazon EMR 추가 기능(Amazon EMR on EKS 6.9.0)도 포함되어 있습니다.

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

 AWS Management Console, AWS CLI 또는 Amazon EMR API를 사용하여 Iceberg가 설치된 클러스터를 생성할 수 있습니다. 이 자습서에서는 AWS CLI 를 사용하여 Amazon EMR 클러스터에서 Iceberg로 작업합니다. 콘솔을 사용하여 Iceberg가 설치된 클러스터를 생성하려면 [Amazon Athena, Amazon EMR 및 AWS Glue를 사용하여 Iceberg 데이터 레이크 구축](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먼저 아래 단계를 사용하여 클러스터를 생성합니다. AWS CLI 또는 Java SDK를 사용하여 Iceberg 분류를 지정하는 방법에 대한 자세한 내용은 [클러스터를 생성할 AWS CLI 때를 사용하여 구성 제공](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-cli) 또는 섹션을 참조하세요[클러스터를 생성할 때 Java SDK를 사용하여 구성 제공](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-sdk). 다음 콘텐츠가 포함된 `configurations.json`이라는 파일을 생성합니다.

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

그리고 다음과 같은 구성으로 클러스터를 생성하고, 예제 Amazon S3 버킷 경로와 서브넷 ID를 사용자 정보로 대체합니다.

```
aws emr create-cluster --release-label emr-6.9.0 \
--applications Name=Hive \
--configurations file://iceberg_configurations.json \
--region us-east-1 \
--name My_hive_Iceberg_Cluster \
--log-uri s3://amzn-s3-demo-bucket/ \
--instance-type m5.xlarge \
--instance-count 2 \
--service-role EMR_DefaultRole \ 
--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-1234567890abcdef
```

Hive Iceberg 클러스터는 다음과 같은 작업을 수행합니다.
+ Iceberg Hive 런타임 jar을 Hive에 로드하고 Hive 엔진의 Iceberg 관련 구성을 활성화합니다.
+ Amazon EMR Hive의 동적 실행 엔진 선택을 활성화하여 사용자가 Iceberg 호환성을 위해 지원되는 실행 엔진을 설정하지 못하도록 합니다.

**참고**  
Hive Iceberg 클러스터는 현재 AWS Glue 데이터 카탈로그를 지원하지 않습니다. 기본 Iceberg 카탈로그는 `HiveCatalog`이며, 이는 Hive 환경에 맞게 구성된 메타스토어에 해당합니다. 카탈로그 관리에 대한 자세한 내용은 [Apache Hive 설명서](https://cwiki.apache.org/confluence/display/HIVE)의 [Using HCatalog](https://cwiki.apache.org/confluence/display/Hive/HCatalog+UsingHCat#HCatalogUsingHCat-UsingHCatalog)를 참조하세요.

## 기능 지원
<a name="feature-support"></a>

Amazon EMR 6.9.0은 Hive 3.1.3 및 Iceberg 0.14.1을 지원합니다. 이 기능은 Hive 3.1.2 및 3.1.3의 Iceberg 호환 기능으로 제한됩니다. 다음 명령이 지원됩니다.
+ Amazon EMR 릴리스 6.9.0에서 6.12.x까지 Hive `auxlib` 디렉터리에 `libfb303` jar을 포함해야 합니다. 다음 명령을 사용하여 포함합니다.

  ```
  sudo /usr/bin/ln -sf /usr/lib/hive/lib/libfb303-*.jar /usr/lib/hive/auxlib/libfb303.jar
  ```

  Amazon EMR 릴리스 6.13 이상에서 `libfb303` jar은 Hive `auxlib` 디렉터리에 기호 링크로 자동 설정됩니다.
+ **테이블 생성**
  + **파티셔닝되지 않은 테이블** - 다음과 같이 스토리지 핸들러를 제공하여 Hive의 외부 테이블을 생성할 수 있습니다.

    ```
    CREATE EXTERNAL TABLE x (i int) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
    ```
  + **파티셔닝된 테이블** - 다음과 같이 Hive에서 파티셔닝된 외부 테이블을 생성할 수 있습니다.

    ```
    CREATE EXTERNAL TABLE x (i int) PARTITIONED BY (j int) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
    ```
**참고**  
ORC, AVRO, PARQUET의 `STORED AS` 파일 형식은 Hive 3에서 지원되지 않습니다. 기본 옵션이자 유일한 옵션은 Parquet입니다.
+ **테이블 삭제** - `DROP TABLE` 명령은 다음 예제와 같이 테이블을 삭제하는 데 사용됩니다.

  ```
  DROP TABLE [IF EXISTS] table_name [PURGE];
  ```
+ **테이블 읽기** - 다음 예제와 같이 `SELECT` 문을 사용하여 Hive에서 Iceberg 테이블을 읽을 수 있습니다. 지원되는 실행 엔진은 MR 및 Tez입니다.

  ```
  SELECT * FROM table_name
  ```

  Hive의 select 구문에 대한 자세한 내용은 [LanguageManual Select](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select)를 참조하세요. Hive의 Iceberg 테이블에서 select 문에 대한 자세한 내용은 [Apache Iceberg Select](https://iceberg.apache.org/docs/latest/hive/#select)를 참조하세요.
+ **테이블에 삽입** - HiveQL의 `INSERT INTO` 문은 Map Reduce 실행 엔진만 지원하는 Iceberg 테이블에서 작동합니다. Amazon EMR Hive는 런타임 시 Iceberg 테이블의 엔진을 선택하기 때문에 Amazon EMR 사용자는 실행 엔진을 명시적으로 설정할 필요가 없습니다.
  + **단일 테이블 삽입** - 예제:

    ```
    INSERT INTO table_name VALUES ('a', 1);
    INSERT INTO table_name SELECT...;
    ```
  + **다중 테이블 삽입** - 명령문에 비원자성 다중 테이블 삽입이 지원됩니다. 예제:

    ```
    FROM source
     INSERT INTO table_1 SELECT a, b
     INSERT INTO table_2 SELECT c,d;
    ```

Amazon EMR 7.3.0부터 Iceberg를 사용하는 Hive는 AWS Glue 데이터 카탈로그를 메타스토어로 지원합니다. Glue 데이터 카탈로그를 AWS 메타스토어로 사용하려면 다음 속성을 설정합니다.

```
SET iceberg.catalog.<catalog_name>.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog;
```

또는 다음 속성을 설정할 수도 있습니다.

```
SET iceberg.catalog.<catalog_name>.type=glue;
```

그리고 다음 예제를 사용하여 테이블을 생성할 수 있습니다.

```
CREATE EXTERNAL TABLE table_name (col1 type1, col2 type2,..)
ROW FORMAT SERDE 'org.apache.iceberg.mr.hive.HiveIcebergSerDe'
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
location '<location>'
TBLPROPERTIES ('table_type'='iceberg', 'iceberg.catalog'='<catalog_name>');
```

## Hive에서 Iceberg 사용 시 고려 사항
<a name="hive-considerations"></a>
+ Iceberg는 다음과 같은 쿼리 유형을 지원합니다.
  + 테이블 생성
  + 테이블 삭제
  + 테이블에 삽입
  + 테이블 읽기
+ MR(MapReduce) 실행 엔진만 데이터 조작 언어(DML) 작업에서 지원되며 MR은 Hive 3.1.3에서 더 이상 사용되지 않습니다.
+ 7.3.0 이전 Amazon EMR의 경우 Hive를 사용하는 Iceberg에는 현재 AWS Glue 데이터 카탈로그가 지원되지 않습니다.
+ 오류 처리 성능이 부족합니다. 구성이 잘못되었어도 쿼리에 삽입 작업은 성공적으로 완료될 수 있습니다. 그러나 메타데이터를 업데이트하지 않으면 데이터가 손실될 수 있습니다.
+ Iceberg Glue 통합은 Redshift Managed Storage 카탈로그에서 작동하지 않습니다.

# Iceberg 릴리스 기록
<a name="Iceberg-release-history"></a>

다음 테이블에는 애플리케이션과 함께 설치된 구성 요소 외에도 Amazon EMR의 최신 릴리스에 포함된 Iceberg의 버전이 나열되어 있습니다. 각 릴리스의 구성 요소 버전은 [Amazon EMR 7.x 릴리스 버전](emr-release-7x.md), [Amazon EMR 6.x 릴리스 버전](emr-release-6x.md) 또는 [Amazon EMR 5.x 릴리스 버전](emr-release-5x.md)의 릴리스의 구성 요소 버전 섹션을 참조하세요.


**Iceberg 버전 정보**  

| Amazon EMR 릴리스 레이블 | Iceberg 버전 | Iceberg와 함께 설치된 구성 요소 | 
| --- | --- | --- | 
| emr-7.12.0 | 1.10.0-amzn-0 | Not available. | 
| emr-7.11.0 | 1.9.1-amzn-0 | Not available. | 
| emr-7.10.0 | 1.8.1-amzn-0 | Not available. | 
| emr-7.9.0 | 1.7.1-amzn-2 | Not available. | 
| emr-7.8.0 | 1.7.1-amzn-1 | Not available. | 
| emr-7.7.0 | 1.7.1-amzn-0 | Not available. | 
| emr-7.6.0 | 1.6.1-amzn-2 | Not available. | 
| emr-7.5.0 | 1.6.1-amzn-1 | Not available. | 
| emr-7.4.0 | 1.6.1-amzn-0 | Not available. | 
| emr-7.3.0 | 1.5.2-amzn-0 | Not available. | 
| emr-7.2.0 | 1.5.0-amzn-0 | Not available. | 
| emr-7.1.0 | 1.4.3-amzn-0 | Not available. | 
| emr-7.0.0 | 1.4.2-amzn-0 | Not available. | 
| emr-6.15.0 | 1.4.0-amzn-0 | Not available. | 
| emr-6.14.0 | 1.3.1-amzn-0 | Not available. | 
| emr-6.13.0 | 1.3.0-amzn-1 | Not available. | 
| emr-6.12.0 | 1.3.0-amzn-0 | Not available. | 
| emr-6.11.1 | 1.2.0-amzn-0 | Not available. | 
| emr-6.11.0 | 1.2.0-amzn-0 | Not available. | 
| emr-6.10.1 | 1.1.0-amzn-0 | Not available. | 
| emr-6.10.0 | 1.1.0-amzn-0 | Not available. | 
| emr-6.9.1 | 0.14.1-amzn-0 | Not available. | 
| emr-6.9.0 | 0.14.1-amzn-0 | Not available. | 
| emr-6.8.1 | 0.14.0-amzn-0 | Not available. | 
| emr-6.8.0 | 0.14.0-amzn-0 | Not available. | 
| emr-6.7.0 | 0.13.1-amzn-0 | Not available. | 
| emr-6.6.0 | 0.13.1 | Not available. | 
| emr-6.5.0 | 0.12.0 | Not available. | 

# 버전별 Iceberg 릴리스 정보
<a name="Iceberg-release-history-versions"></a>
+ [Amazon EMR 6.9.0 - Iceberg 릴리스 정보](Iceberg-release-history-690.md)

# Amazon EMR 6.9.0 - Iceberg 릴리스 정보
<a name="Iceberg-release-history-690"></a>

## Amazon EMR 6.9.0 - Iceberg 변경
<a name="Iceberg-release-history-changes-690"></a>


| Type | 설명 | 
| --- | --- | 
| 기능 |  Amazon EMR Flink와 Iceberg 통합.  | 
| 기능 |  Amazon EMR Hive와 Iceberg의 통합.  | 
| 기능 |  Amazon FSx for Lustre에서 Iceberg 메타데이터 파일 캐싱을 지원하여 쿼리 계획 시간을 개선합니다.  | 
| 백포트 |  [PR 5050](https://github.com/apache/iceberg/pull/5050): Flink 1.15: 인라인 삽입 SQL 주석의 쓰기 옵션을 지원합니다.  | 
| 백포트 |  [PR 5282](https://github.com/apache/iceberg/pull/5282): AWS: 새 데이터 파일 스트림을 열어 PUT 재시도 실패를 수정합니다.  | 
| 백포트 |  [PR 5318](https://github.com/apache/iceberg/pull/5318): Flink 1.15: FlinkSource 및 IcebergSource(FLIP-27) 사이의 격차를 해소하고 Flink SQL에서 FLIP-27 소스를 사용하기 위한 옵트인 구성을 추가했습니다.  | 
| 백포트 |  [PR 5344](https://github.com/apache/iceberg/pull/5344): Flink 1.14: FlinkSource 및 IcebergSource(FLIP-27) 사이의 격차를 해소하고 Flink SQL에서 FLIP-27 소스를 사용하기 위한 옵트인 구성을 추가했습니다.  | 
| 백포트 |  [PR 5393](https://github.com/apache/iceberg/pull/5393): Flink 1.14, 1.15: FLIP-27 소스 리더에서 Iceberg MetricContext를 Flink 지표로 변환하지 않습니다.  | 
| 백포트 |  [PR 5401](https://github.com/apache/iceberg/pull/5401): Flink 1.14, 1.15: FLIP-27 소스 리더 지표에 대한 PR 5393에서 IcebergSourceReader 그룹이 누락되었습니다.  | 
| 백포트 |  [PR 5679](https://github.com/apache/iceberg/pull/5679): Spark 3.2, 3.3: MergeRows 노드의 null 허용 여부 전파를 수정합니다.  | 
| 백포트 |  [PR 5860](https://github.com/apache/iceberg/pull/5860): Spark 3.3: 날짜로 파티셔닝된 테이블에서 RewriteManifestProcedure를 실행할 때 발생하는 쿼리 오류를 수정합니다.  | 
| 백포트 |  [PR 5880](https://github.com/apache/iceberg/pull/5880): Spark 3.3: 읽기 시 병합 프로젝션의 null 허용 여부를 수정합니다.  | 
| 백포트 |  [PR 5917](https://github.com/apache/iceberg/pull/5917): Spark 3.2: 읽기 시 병합 프로젝션의 null 허용 여부를 수정합니다.  | 