[데이터 플랫폼 운영 / 개발] - Iceberg (HMS) 세팅

Chan hae OH·2024년 4월 12일
0

iceberg

목록 보기
1/4

1. 시작말


안녕하세요.

데이터 엔지니어링 & 운영 업무를 하는 중 알게 된 지식이나 의문점들을 시리즈 형식으로 계속해서 작성해나가며

새로 알게 된 점이나 잘 못 알고 있었던 점을 더욱 기억에 남기기 위해 글을 꾸준히 작성 할려고 합니다.

Iceberg 의 경우 공식문서와 구글링, ChatGPT 를 참고하여 공부하고 있습니다.

반드시 글을 읽어 주실 때 잘 못 말하고 있는 부분은 정정 요청 드립니다.

저의 지식에 큰 도움이 됩니다. :)



2. 환경 준비


Iceberg 는 테이블 포맷이기 때문에 별도의 엔진이 없습니다.

그러므로 Spark 이나 Trino 와 같은 엔진이 사전에 필요합니다.

해당 세팅은 Iceberg 가 Hive Metastore 를 활용하는 예제 입니다.

Iceberg rest api 서버가 HMS 를 대체할 수 있듯이 있지만 Reference 가 많이 부족하며, 보통 Hadoop 환경에 Hive가 설치되어 있는 것으로 예상하여 HMS 테스트만 진행하겠습니다.

2.1. 사전 준비

2.2. 차례

  1. Spark with Iceberg
  2. Trino with Iceberg
  3. Hive metastore 사용 확인



3. Spark with Iceberg


3.1. Iceberg 다운

아이스버그는 아래 공식 홈페이지에서 다운받을 수 있습니다.

https://repo1.maven.org/maven2/org/apache/iceberg/

iceberg-spark-runtime-{spark(major.minor) version}-{scala version}-{iceberg version}.jar 구성으로 네이밍 되어 있습니다.


현재 설치 문서는 아래 jar 를 활용하고 있습니다.

iceberg-spark-runtime-3.5_2.12-1.5.2.jar

https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar


Spark 의 jars 폴더에 jar를 넣어줍니다.


3.2. spark-default.conf 수정


...

# ICEBERG
spark.sql.extensions                            org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
spark.sql.catalog.iceberg                       org.apache.iceberg.spark.SparkCatalog # 참고 1
spark.sql.catalog.iceberg.type                  hive # metastore 타입
spark.sql.catalog.iceberg.default-namespace     lake # db
spark.sql.catalog.iceberg.uri                   thrift://hadoop-master:9083 # hive metastore thrift url
spark.driver.extraClassPath                     file:///opt/apps/spark/jars/*
spark.executor.extraClassPath                   file:///opt/apps/spark/jars/*

참고 1 : iceberg 카탈로그는 2가지를 선택할 수 있습니다.

  • org.apache.iceberg.spark.SparkCatalog

  • org.apache.iceberg.spark.SparkSessionCatalog

    SparkSessionCatalog 의 경우 spark 의 built-in 카탈로그를 활용하게 되기 때문에 SparkCatalog 옵션을 지정합니다.

https://iceberg.apache.org/docs/latest/spark-configuration/#catalog-configuration

3.3. spark-submit test


Iceberg 는 카탈로그의 대소문자를 구분합니다. 소문자로 통일 하도록 합니다.

from pyspark.sql import SparkSession

if __name__ == '__main__':
    spark = SparkSession.builder \
                    .master("yarn") \
                    .appName("Iceberg Test") \
                    .enableHiveSupport() \
                    .getOrCreate()

    spark.sql(f"""
    create database iceberg.lake
    """)
    
    spark.sql(f"""
    create database iceberg.lake.test (id string) using iceberg
    """)
    
    spark.sql(f"""
    select * from iceberg.lake.test
    """).show()

    spark.stop()



4. Trino with Iceberg


https://trino.io/blog/2021/08/12/deep-dive-into-iceberg-internals.html


trino는 iceberg runtime 을 버전에 맞게 미리 내장하고 있습니다.

그러므로 카탈로그만 생성해 주면 됩니다.

4.1. iceberg.properties 생성

vi $TRINO_HOME/etc/catalog/iceberg.properties # 트리노에서 카탈로그 이름은 프로퍼티스 파일명을 따라갑니다.

connector.name=iceberg
hive.metastore.uri=thrift://hadoop-master:9083
hive.config.resources=/opt/apps/trino/etc/core-site.xml,/opt/apps/trino/etc/hdfs-site.xml
iceberg.hive-catalog-name=hive
iceberg.catalog.type=HIVE_METASTORE
iceberg.file-format=PARQUET
iceberg.compression-codec=GZIP

4.2. Trino 재기동 후 확인

$TRINO_HOME/bin/launcher stop

$TRINO_HOME/bin/launcher start



5. Hive metastore 사용 확인


HMS 를 사용하는지 확인하기 위해 HMS 를 구성하기 위한 RDBMS 에서 아래와 같이 확인해봅니다.

기존의 transaction 들이 있어서 내용이 들어 있어야 합니다.

select    
    t1.TBL_ID,    
    t2.DB_ID,    
    t2.SD_ID,    
    t2.OWNER,    
    t2.OWNER_TYPE,    
    t3.NAME,    
    t2.TBL_NAME,    
    t2.TBL_TYPE,    
    t1.PARAM_KEY,   
    t1.PARAM_VALUE,    
    t2.CREATE_TIME,    
    t2.LAST_ACCESS_TIME,    
    t3.DB_LOCATION_URI
from TABLE_PARAMS t1
left join TBLS t2
on t1.tbl_id = t2.tbl_id
left join DBS t3
on t2.db_id = t3.db_id;



profile
Data Engineer

2개의 댓글

comment-user-thumbnail
2024년 12월 19일

Iceberg 는 file format 의 일종이 아닌 table format입니다!
file format 은 parquet, orc 등이 해당하구요. iceberg 와 hive 의 차이를 보면 좀 더 이해할 수 있는데요 hive 는 기본적으로 directory 형태로 table의 구조가 형성이 됩니다. ( partitioning 을 의미하겠죠 ) 반면 iceberg의 경우 directory 구조의 partitioning 이 아닌 depth 가 없는 파일형태로 관리됩니다. 이와 같은 구조 변화가 hive에서 해결하지 못하는 문제를 해결할 수 있게하는 결정적 역할을 합니다.

1개의 답글