

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

# 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 클러스터는 현재 AWSGlue 데이터 카탈로그를 지원하지 않습니다. 기본 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는 AWSGlue 데이터 카탈로그를 메타스토어로 지원합니다. 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에는 현재 AWSGlue 데이터 카탈로그가 지원되지 않습니다.
+ 오류 처리 성능이 부족합니다. 구성이 잘못되었어도 쿼리에 삽입 작업은 성공적으로 완료될 수 있습니다. 그러나 메타데이터를 업데이트하지 않으면 데이터가 손실될 수 있습니다.
+ Iceberg Glue 통합은 Redshift Managed Storage 카탈로그에서 작동하지 않습니다.