Apache Iceberg 데이터 레이크 통합 구축 개요
대규모 분산 처리 환경에서 SQL 호환성과 ACID 트랜잭션을 제공하는 데이터 레이크 솔루션으로 Iceberg를 활용하려면 기반 스택(HDFS, YARN, Hive)과의 정확한 연동이 필요합니다. 본 가이드에서는 Hive 메타스토어를 기반으로 Flink 실시간 스트리밍과 Trino 대용량 분석을 동시에 지원하기 위한 구성 단계와 일반적인 운영 장애 케이스를 정리합니다.
1. 하둡 스택 기반 인프라 준비
Iceberg의 저장소 계층은 HDFS를 주로 사용하며, 스케줄링과 리소스 관리를 위해 YARN이 반드시 기동되어 있어야 합니다. Hive는 로컬 모드 또는 Thrift 모드로 구동하며, 두 시스템은 동일한 물리적 또는 가상 머신에 배치하는 것이 메타데이터 동기화 측면에서 안정적입니다.
- 추천 버전 조합: Hadoop 3.2+, Hive 3.1+, JDK 1.8+
- 主机名 설정:
hostnamectl set-hostname lake-cluster-primary - JDK 설치:
yum install -y java-1.8.0-openjdk-devel.x86_64
2. Hive 메타스토어와의 연동 설정
Hive에서 Iceberg 테이블을 인식하려면 런타임 의존성 JAR 파일을 클래스패스에 추가하고, 관련 프로퍼티를 활성화해야 합니다.
- 런타임 패키지 배포: 공식 저장소에서 호환되는
iceberg-hive-runtime-{version}.jar를 다운로드하여$HIVE_HOME/lib/디렉토리에 복사합니다. - 메타스토어 초기화:
schematool --initSchema -dbType derby명령어로 기본 스키마를 생성합니다. - 서비스 기동: 메타데이터 서비스를 먼저 실행한 후, Thrift 서버를 포트 10000으로 오픈합니다.
2.1 핵심 설정 파일 구성
아래는 Iceberg 연동을 위해 수정된 주요 구성 파일 예시입니다. 변수명과 경로값은 실제 클러스터 환경에 맞게 재정의할 수 있습니다.
hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
<property>
<name>iceberg.engine.hive.enabled</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=metastore_db;create=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://lake-cluster-primary:9083</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>lake-cluster-primary</value>
</property>
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<property>
<name>hive.server2.active.passive.ha.enable</name>
<value>true</value>
</property>
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
</property>
</configuration>
core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://lake-cluster-primary:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/data</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>admin</value>
</property>
<property>
<name>hadoop.proxyuser.admin.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.admin.groups</name>
<value>*</value>
</property>
</configuration>
환경 변수 및 서비스 시작
# hive-env.sh
export HADOOP_HOME=/opt/hadoop-3.2.4
export HIVE_CONF_DIR=/opt/hive/conf
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
# 서비스 기동
/opt/hive/bin/hive --service metastore &
/opt/hive/bin/hive --service hiveserver2 -hiveconf hive.server2.thrift.port=10000 &
비선형 접속을 위해 beeline로 연결 시 반드시 인증 계정(-n root)을 명시해야 권한 검증 에러를 방지할 수 있습니다.
2.2 Iceberg 객체 생성 예시
-- 런타임 팩로드
add jar /opt/iceberg-hive-runtime-0.13.1.jar;
-- 카탈로그 등록
SET iceberg.catalog.lake_catalog.type=hive;
SET iceberg.catalog.lake_catalog.uri=thrift://lake-cluster-primary:9083;
SET iceberg.catalog.lake_catalog.clients=5;
SET iceberg.catalog.lake_catalog.warehouse=hdfs://lake-cluster-primary:8020/lake_warehouse;
-- 테이블 정의
CREATE TABLE warehouse_logs (
event_id int,
payload string,
created_at timestamp
) PARTITIONED BY (region string)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';
-- 데이터 적재
INSERT INTO warehouse_logs VALUES (101, 'system_start', CURRENT_TIMESTAMP(), 'kr_seoul');
3. Flink SQL 연동 구조
Flink에서 Iceberg를 사용하기 위해서는 클러스터 라이브러리 경로에 해당 런타임 패키지와 하둡 셰이디드 JAR을 배치해야 합니다. 이후 환경 변수 HADOOP_CONF_DIR를 참조해 네임노드의 메타데이터 위치를.resolve할 수 있도록 설정합니다.
# 실행 전 설정
export HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop
export HADOOP_CLASSPATH=$(/opt/hadoop/bin/hadoop classpath)
./bin/start-cluster.sh --jar /opt/flink-ext/iceberg-flink-runtime-0.12.1.jar
SQL 클라이언트 상에서 외부 메타데이터 소스를 매핑합니다.
CREATE CATALOG hadoop_prod WITH (
'type'='iceberg',
'catalog-type'='hadoop',
'warehouse'='hdfs://lake-cluster-primary:8020/lake_warehouse',
'property-version'='1'
);
USE catalog hadoop_prod;
CREATE DATABASE streaming_db;
CREATE TABLE flink_kafka_source (
record_id BIGINT,
value STRING
) WITH (
'connector'='iceberg',
'catalog-name'='hadoop_prod',
'catalog-type'='hadoop',
'warehouse'='hdfs://nn:8020/lake_warehouse'
);
4. Trino 분석 엔진 연결
Trino는 최신 버전 기준 JDK 11 이상을 요구하므로 기존大数据 컴포넌트의 Java 8 환경과는 격리가 필요합니다. 코디네이터와 워커 역할을 분리하여 구성하는 것이 성능 분산에 유리합니다.
| 역할 | 호스트명 | 포트 |
|---|---|---|
| Coordinator | lake-node-01 | 8089 |
| Worker | lake-node-02, lake-node-03, lake-node-04 | 8090 |
4.1 노드별 속성 설정
# config.properties (Coordinator)
coordinator=true
http-server.http.port=8089
query.max-memory=4GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://lake-node-01:8089
# jvm.config (Coordinator)
-server
-Xmx4G
-XX:+UseG1GC
-XX:+HeapDumpOnOutOfMemoryError
# worker config.properties
coordinator=false
http-server.http.port=8090
discovery.uri=http://lake-node-01:8089
# worker jvm.config
-server
-Xmx32G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-Djdk.attach.allowAttachSelf=true
# node.properties (모든 노드 공통)
node.environment=production
node.data-dir=/opt/trino/data
node.id=[고유 UUID 또는 호스트 이름]
4.2 Iceberg 커넥터 연동
etc/catalog/iceberg.properties 파일을 생성하여 Hive 메타스토어 주소를 포인트합니다.
connector.name=iceberg
hive.metastore.uri=thrift://lake-node-01:9083
hive.config.resources=/opt/trino/etc/hadoop/core-site.xml,/opt/trino/etc/hadoop/hdfs-site.xml
HA 환경이라면 hive.config.resources 경로를 명시하지 않을 경우 네임노이드(Namespace) 조회 실패가 발생할 수 있습니다.
4.3 CLI 쿼리 수행
./trino-cli --server lake-node-01:8089
> show catalogs;
> use hive.lake_catalog.streaming_db;
> select event_id, region from warehouse_logs limit 10;
5. 운영 중 발생 가능한 오류 및 대처 방안
- METASTORE_row_size_exceeds_limit: MyISAM 테이블의 행 크기 제한(65535 바이트)을 초과할 경우 발생합니다. MySQL 메타스토어 데이터베이스 문자셋을
latin1로 변경하거나 InnoDB로 마이그레이션하세요. /bin/bash: /bin/java: No such file or directory: 시스템 PATH에 자바 실행 파일이 심볼릭 링크로 연결되지 않은 상태입니다.ln -s $JAVA_HOME/bin/java /bin/java명령어로 복구를 진행합니다.- HiveServer2 기동 실패 (Port 10000 미반영): 로그에
SessionNotRunning또는 Tez 의존성 ClassNotFoundException이 출력될 경우,hive.server2.active.passive.ha.enable을true로 활성화하거나 Hive 인터랙티브 HA 기능이 꺼졌음을 명시하세요. - anonymous 사용자 권한 거부: Beeline 접속 시
-n파라미터 생략 시 익명 세션이 생성되어 HDFS/tmp영역 접근이 차단됩니다. 반드시 유효한 Kerberos 또는 로컬 사용자를 지정하세요. - 위임(Impersonation) 실패:
hive.server2.enable.doAs=false설정이 누락되면 하둡 프록시 규칙을 우회하지 못합니다. core-site.xml의hadoop.proxyuser.*범위도 함께 조정하세요. - MapReduce Task Return Code 2: Hiverun 시
libfb303.jar클래스 패스 누락이거나, YARN 가상 메모리 비율(yarn.nodemanager.vmem-pmem-ratio)이 낮아 컨테이너 할당이 중단되는 경우가 많습니다.set hive.support.concurrency=false;적용 또는 최소 할당량(yarn.scheduler.minimum-allocation-mb)을 2048 이상으로 확대하면 안정성이 향상됩니다.