안녕하세요.
데이터 엔지니어링 & 운영 업무를 하는 중 알게 된 지식이나 의문점들을 시리즈 형식으로 계속해서 작성해나가며
새로 알게 된 점이나 잘 못 알고 있었던 점을 더욱 기억에 남기기 위해 글을 꾸준히 작성 할려고 합니다.
Iceberg 의 경우 공식문서와 구글링, ChatGPT 를 참고하여 공부하고 있습니다.
반드시 글을 읽어 주실 때 잘 못 말하고 있는 부분은 정정 요청 드립니다.
저의 지식에 큰 도움이 됩니다. :)
Iceberg 는 테이블 포맷이기 때문에 별도의 엔진이 없습니다.
그러므로 Spark 이나 Trino 와 같은 엔진이 사전에 필요합니다.
해당 세팅은 Iceberg 가 Hive Metastore 를 활용하는 예제 입니다.
Iceberg rest api 서버가 HMS 를 대체할 수 있듯이 있지만 Reference 가 많이 부족하며, 보통 Hadoop 환경에 Hive가 설치되어 있는 것으로 예상하여 HMS 테스트만 진행하겠습니다.
아이스버그는 아래 공식 홈페이지에서 다운받을 수 있습니다.
iceberg-spark-runtime-{spark(major.minor) version}-{scala version}-{iceberg version}.jar
구성으로 네이밍 되어 있습니다.
현재 설치 문서는 아래 jar 를 활용하고 있습니다.
iceberg-spark-runtime-3.5_2.12-1.5.2.jar
Spark 의 jars 폴더에 jar를 넣어줍니다.
...
# 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
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()
https://trino.io/blog/2021/08/12/deep-dive-into-iceberg-internals.html
trino는 iceberg runtime 을 버전에 맞게 미리 내장하고 있습니다.
그러므로 카탈로그만 생성해 주면 됩니다.
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
$TRINO_HOME/bin/launcher stop
$TRINO_HOME/bin/launcher start
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;
Iceberg 는 file format 의 일종이 아닌 table format입니다!
file format 은 parquet, orc 등이 해당하구요. iceberg 와 hive 의 차이를 보면 좀 더 이해할 수 있는데요 hive 는 기본적으로 directory 형태로 table의 구조가 형성이 됩니다. ( partitioning 을 의미하겠죠 ) 반면 iceberg의 경우 directory 구조의 partitioning 이 아닌 depth 가 없는 파일형태로 관리됩니다. 이와 같은 구조 변화가 hive에서 해결하지 못하는 문제를 해결할 수 있게하는 결정적 역할을 합니다.