Dataproc 선택적 Iceberg 구성요소

선택적 구성요소 기능을 사용하여 Dataproc 클러스터를 만들 때 Iceberg와 같은 추가 구성요소를 설치할 수 있습니다. 이 페이지에서는 Dataproc 클러스터에 Iceberg 구성요소를 선택적으로 설치하는 방법을 설명합니다.

개요

Apache Iceberg는 대규모 분석 데이터 세트를 위한 열린 테이블 형식입니다. Iceberg는 SQL 테이블의 안전성과 단순성을 빅 데이터로 가져오며, Spark, Trino, PrestoDB, Flink, Hive와 같은 엔진이 동시에 동일한 테이블로 안전하게 작동할 수 있게 해줍니다.

Dataproc 클러스터에 설치된 Apache Iceberg 구성요소는 Iceberg 라이브러리를 설치하고 Spark 및 Hive가 클러스터에서 Iceberg와 함께 작동하도록 구성합니다.

주요 Iceberg 기능

Iceberg 기능은 다음과 같습니다.

  • 스키마 혁신: 전체 테이블을 다시 작성하지 않고도 열 추가, 삭제, 이름 바꾸기가 가능합니다.
  • 시간 이동: 감사 또는 롤백 목적으로 과거 테이블 스냅샷을 쿼리할 수 있습니다.
  • 숨겨진 파티셔닝: 파티션 세부정보를 사용자에게 노출하지 않아도 고속 쿼리를 위해 데이터 레이아웃을 최적화할 수 있습니다.
  • ACID 트랜잭션: 데이터 일관성을 보장하고 충돌을 방지합니다.

호환되는 Dataproc 이미지 버전

Iceberg 구성요소는 2.2.47 이상의 이미지 버전으로 생성된 Dataproc 클러스터에 설치할 수 있습니다. 클러스터에 설치된 Iceberg 버전은 2.2 출시 버전 페이지에 표시됩니다.

Iceberg 클러스터로 Dataproc을 만들면 다음 Spark 및 Hive 속성이 Iceberg와 함께 작동하도록 구성됩니다.

구성 파일 속성 기본값
/etc/spark/conf/spark-defaults.conf spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
spark.driver.extraClassPath /usr/lib/iceberg/lib/iceberg-spark-runtime-spark-version_scala-version.jar
spark.executor.extraClassPath /usr/lib/iceberg/lib/iceberg-spark-runtime-spark-version_scala-version.jar
/etc/hive/conf/hive-site.xml hive.aux.jars.path file:///usr/lib/iceberg/lib/iceberg-hive-runtime.jar
iceberg.engine.hive.enabled true

Iceberg의 선택적인 구성요소 설치

Dataproc 클러스터를 만들 때 Iceberg 구성요소를 설치합니다. Dataproc 클러스터 이미지 버전 목록 페이지에는 최신 Dataproc 클러스터 이미지 버전에 포함된 Iceberg 구성요소 버전이 표시됩니다.

Google Cloud 콘솔

Iceberg 구성요소를 설치하는 Dataproc 클러스터를 만들려면 Google Cloud 콘솔에서 다음 단계를 수행합니다.

  1. Dataproc 클러스터 만들기 페이지를 엽니다. 클러스터 설정 패널이 선택되었습니다.
  2. 구성요소 섹션의 선택적 구성요소에서 Iceberg 구성요소를 선택합니다.
  3. 다른 클러스터 설정을 확인하거나 지정한 후 만들기를 클릭합니다.

Google Cloud CLI

Iceberg 구성요소를 설치하는 Dataproc 클러스터를 만들려면 --optional-components 플래그와 함께 gcloud dataproc clusters create 명령어를 사용합니다.

gcloud dataproc clusters create CLUSTER_NAME \
    --region=REGION \
    --optional-components=ICEBERG \
     other flags ...

다음을 바꿉니다.

REST API

Iceberg 선택적 구성요소를 설치하는 Dataproc 클러스터를 만들려면 clusters.create를 요청할 때 SoftwareConfig.Component에 Iceberg를 지정합니다.

Spark 및 Hive에 Iceberg 테이블 사용

클러스터에 Iceberg 선택적 구성요소가 설치된 Dataproc 클러스터를 만든 후에는 Spark 및 Hive를 사용하여 Iceberg 테이블 데이터를 읽고 쓸 수 있습니다.

Spark

Iceberg를 위한 Spark 세션 구성

gcloud CLI 명령어를 로컬로 사용하거나 Datapro 클러스터 마스터 노드에서 실행 중인 spark-shell 또는 pyspark REPL(Read-Eval-Print Loop)을 사용하여 Iceberg의 Spark 확장 프로그램을 사용 설정하고 Iceberg 테이블을 사용하도록 Spark 카탈로그를 설정할 수 있습니다.

gcloud

로컬 터미널 창 또는 Cloud Shell에서 다음 gcloud CLI 예시를 실행하여 Iceberg에 대해 Spark 세션을 구성하도록 Spark 작업 및 Spark 속성을 제출합니다.

gcloud dataproc jobs submit spark  \
    --cluster=CLUSTER_NAME \
    --region=REGION \
    --properties="spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \
    --properties="spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog" \
    --properties="spark.sql.catalog.CATALOG_NAME.type=hadoop" \
    --properties="spark.sql.catalog.CATALOG_NAME.warehouse=gs://BUCKET/FOLDER" \
     other flags ...

다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터 이름입니다.
  • REGION: Compute Engine 리전입니다.
  • CATALOG_NAME: Iceberg 카탈로그 이름입니다.
  • BUCKETFOLDER: Cloud Storage의 Iceberg 카탈로그 위치입니다.

spark-shell

Dataproc 클러스터에서 spark-shell REPL을 사용하여 Iceberg에 대해 Spark 세션을 구성하려면 다음 단계를 수행합니다.

  1. SSH를 사용하여 Dataproc 클러스터의 마스터 노드에 연결합니다.

  2. SSH 세션 터미널에서 다음 명령어를 실행하여 Iceberg에 대한 Spark 세션을 구성합니다.

spark-shell \
    --conf "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \
    --conf "spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog" \
    --conf "spark.sql.catalog.CATALOG_NAME.type=hadoop" \
    --conf "spark.sql.catalog.CATALOG_NAME.warehouse=gs://BUCKET/FOLDER"

다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터 이름입니다.
  • REGION: Compute Engine 리전입니다.
  • CATALOG_NAME: Iceberg 카탈로그 이름입니다.
  • BUCKETFOLDER: Cloud Storage의 Iceberg 카탈로그 위치입니다.

pyspark 셸

Dataproc 클러스터에서 pyspark REPL을 사용하여 Iceberg에 대해 Spark 세션을 구성하려면 다음 단계를 수행합니다.

  1. SSH를 사용하여 Dataproc 클러스터의 마스터 노드에 연결합니다.

  2. SSH 세션 터미널에서 다음 명령어를 실행하여 Iceberg에 대한 Spark 세션을 구성합니다.

pyspark \
    --conf "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \
    --conf "spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog" \
    --conf "spark.sql.catalog.CATALOG_NAME.type=hadoop" \
    --conf "spark.sql.catalog.CATALOG_NAME.warehouse=gs://BUCKET/FOLDER"

다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터 이름입니다.
  • REGION: Compute Engine 리전입니다.
  • CATALOG_NAME: Iceberg 카탈로그 이름입니다.
  • BUCKETFOLDER: Cloud Storage의 Iceberg 카탈로그 위치입니다.

Iceberg 테이블에 데이터 쓰기

Spark를 사용하여 Iceberg 테이블에 데이터를 쓸 수 있습니다. 다음 코드 스니펫은 샘플 데이터로 DataFrame을 만들고, Cloud Storage에 Iceberg를 만들고, Iceberg 테이블에 데이터를 씁니다.

PySpark

# Create a DataFrame with sample data.
data = spark.createDataFrame([(1, "Alice"), (2, "Bob")], ["id", "name"])

# Create an Iceberg table in Cloud Storage.
spark.sql("""CREATE TABLE IF NOT EXISTS CATALOG_NAME.NAMESPACE.TABLE_NAME (
    id integer,
    name string)
USING iceberg
LOCATION 'gs://BUCKET/FOLDER/NAMESPACE/TABLE_NAME'""")

# Write the DataFrame to the Iceberg table in Cloud Storage.
data.writeTo("CATALOG_NAME.NAMESPACE.TABLE_NAME").append()

Scala

// Create a DataFrame with sample data.
val data = Seq((1, "Alice"), (2, "Bob")).toDF("id", "name")

// Create an Iceberg table in Cloud Storage.
spark.sql("""CREATE TABLE IF NOT EXISTS CATALOG_NAME.NAMESPACE.TABLE_NAME (
    id integer,
    name string)
USING iceberg
LOCATION 'gs://BUCKET/FOLDER/NAMESPACE/TABLE_NAME'""")

// Write the DataFrame to the Iceberg table in Cloud Storage.
data.writeTo("CATALOG_NAME.NAMESPACE.TABLE_NAME").append()

Iceberg 테이블에서 데이터 읽기

Spark를 사용하여 Iceberg 테이블에서 데이터를 읽을 수 있습니다. 다음 코드 스니펫은 테이블을 읽고 콘텐츠를 표시합니다.

PySpark

# Read Iceberg table data into a DataFrame.
df = spark.read.format("iceberg").load("CATALOG_NAME.NAMESPACE.TABLE_NAME")
# Display the data.
df.show()

Scala

// Read Iceberg table data into a DataFrame.
val df = spark.read.format("iceberg").load("CATALOG_NAME.NAMESPACE.TABLE_NAME")

// Display the data.
df.show()

Spark SQL

SELECT * FROM CATALOG_NAME.NAMESPACE.TABLE_NAME

Hive

Hive에서 Iceberg 테이블 만들기

Dataproc 클러스터는 Iceberg에서 작동하도록 Hive를 미리 구성합니다.

이 섹션의 코드 스니펫을 실행하려면 다음 단계를 수행합니다.

  1. SSH를 사용하여 Dataproc 클러스터의 마스터 노드에 연결합니다.

  2. SSH 터미널 창에서 beeline를 엽니다.

    beeline -u jdbc:hive2://
    

Hive에서 파티션을 나누지 않았거나 파티션을 나눈 Iceberg 테이블을 만들 수 있습니다.

파티션을 나누지 않은 테이블

Hive에서 파티션을 나누지 않은 Iceberg 테이블을 만듭니다.

CREATE TABLE my_table (
  id INT,
  name STRING,
  created_at TIMESTAMP
) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

파티션을 나눈 테이블

PARTITIONED BY 절에서 파티션 열을 지정하여 Hive에서 파티션을 나눈 Iceberg 테이블을 만듭니다.

CREATE TABLE my_partitioned_table (
  id INT,
  name STRING
) PARTITIONED BY (date_sk INT)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

Hive에서 Iceberg 테이블에 데이터 삽입

표준 Hive INSERT 문을 사용하여 Iceberg 테이블에 데이터를 삽입할 수 있습니다.

SET hive.execution.engine=mr;

INSERT INTO my_table
SELECT 1, 'Alice', current_timestamp();

제한사항

  • MR(맵리듀스) 실행 엔진만 DML(데이터 조작 언어) 작업에 지원됩니다.
  • MR 실행은 Hive 3.1.3에서 지원이 중단되었습니다.

Hive에서 Iceberg 테이블의 데이터 읽기

Iceberg 테이블에서 데이터를 읽으려면 SELECT 문을 사용합니다.

SELECT * FROM my_table;

Hive에서 Iceberg 테이블 삭제

Hive에서 Iceberg 테이블을 삭제하려면 DROP TABLE 문을 사용합니다.

DROP TABLE my_table;

추가 정보