| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- BigData
- Iceberg
- bigdata engineer
- 프로그래머스
- apache iceberg
- Data Engineering
- Trino
- hadoop
- 개발
- 자바
- 코테
- 코딩
- 백준
- HDFS
- 삼성역맛집
- Kafka
- 알고리즘
- pyspark
- HIVE
- 영어
- 코딩테스트
- Apache Kafka
- java
- Linux
- 여행
- 코엑스맛집
- 맛집
- Spark
- bigdata engineering
- Data Engineer
- Today
- Total
지구정복
Trino와 Iceberg 연동 완벽 가이드 | 빅데이터 분석 환경 구축하기 본문
안녕하세요! 빅데이터 엔지니어링 분야에서 최근 가장 주목받고 있는 Trino와 Apache Iceberg 연동에 대해 자세히 알아보겠습니다.
데이터 레이크 기술이 급속히 발전하면서, 전통적인 데이터 웨어하우스의 한계를 뛰어넘는 새로운 솔루션들이 등장하고 있어요. 그 중에서도 Trino의 Iceberg Connector는 현대적인 분석 플랫폼의 필수 요소가 되었습니다.
직접 프로덕션에서 운영해본 노하우를 바탕으로, 기본 설정부터 고급 튜닝까지 단계별로 정리해드릴게요!
Trino-Iceberg 연동 아키텍처 살펴보기
먼저 이 두 기술이 어떻게 협력하는지 구조부터 파악해보겠습니다.
[사진: 1.jpg - Trino Iceberg connector 아키텍처 다이어그램]
주요 컴포넌트 분석
분산 스토리지 접근 방식
기존 중앙집중식과 달리, Trino의 각 노드가 객체 스토리지에 직접 연결되는 구조입니다.
```
코디네이터 노드 ──┐
├── 클라우드 스토리지 (S3/GCS/Azure)
워커 노드들 ──────┘
```
메타데이터 관리 시스템
테이블 정보를 저장하고 관리하는 다양한 옵션을 제공합니다:
• **Hive Metastore**: 가장 보편적인 선택지
• **AWS Glue**: 아마존 완전관리형 서비스
• **JDBC 기반**: 관계형 DB 활용
• **REST API**: 모던한 HTTP 방식
• **Nessie**: Git 스타일의 버전 관리
• **Snowflake**: 스노우플레이크 통합
지원 스토리지 시스템 총정리
다양한 스토리지 백엔드와의 호환성이 뛰어납니다:
퍼블릭 클라우드
• **Amazon S3**: 업계 표준 객체 스토리지
• **Google Cloud Storage**: 구글 클라우드 기본 스토리지
• **Azure Blob Storage**: 마이크로소프트 클라우드 서비스
프라이빗 및 호환 솔루션
• **MinIO**: S3 API 호환 오픈소스
• **HDFS**: 하둡 생태계 표준 파일시스템
실제로 MinIO 환경에서 테스트해봤는데, S3와 동일한 설정으로 완벽하게 작동하더라고요.
파일 포맷 지원 현황
[사진: 2.jpg - Iceberg 테이블 메타데이터 구조]
Iceberg가 지원하는 주요 데이터 포맷들입니다:
1. Parquet (추천 포맷)
```sql
-- Parquet으로 테이블 생성 예시
CREATE TABLE iceberg.db.sample_table (
user_id BIGINT,
username VARCHAR,
signup_date TIMESTAMP
) WITH (
format = 'PARQUET',
partitioning = ARRAY['year(signup_date)']
);
```
2. ORC 포맷
컬럼형 저장에 최적화된 고성능 포맷으로, 하이브 환경에서 선호됩니다.
3. Avro 포맷
스키마 변경에 유연한 로우 기반 포맷입니다.
핵심 설정 파라미터 마스터하기
카탈로그 기본 구성
```properties
catalog/iceberg.properties
connector.name=iceberg
메타스토어 연결 설정
iceberg.catalog.type=hive_metastore
hive.metastore.uri=thrift://metastore-server:9083
AWS Glue 사용하는 경우
iceberg.catalog.type=glue
hive.metastore.glue.region=ap-northeast-2
```
파일 포맷 및 압축 옵션
```properties
기본 저장 포맷 지정
iceberg.file-format=PARQUET
압축 알고리즘 선택
iceberg.compression-codec=ZSTD
선택 가능: ZSTD, SNAPPY, LZ4, GZIP, NONE
테이블별 고유 경로 사용
iceberg.unique-table-location=true
```
개인적으로는 ZSTD 압축을 강력 추천합니다. 압축률과 처리 속도의 밸런스가 최고예요.
효율적인 파티셔닝 설계 방법
시간 기반 분할 전략
```sql
-- 연도 단위 파티션
CREATE TABLE annual_sales (
transaction_id BIGINT,
revenue DECIMAL(10,2),
transaction_date DATE
) WITH (
partitioning = ARRAY['year(transaction_date)']
);
-- 월 단위로 더 세분화
CREATE TABLE monthly_sales (
transaction_id BIGINT,
revenue DECIMAL(10,2),
transaction_date DATE
) WITH (
partitioning = ARRAY['year(transaction_date)', 'month(transaction_date)']
);
-- 실시간 데이터용 시간 단위
CREATE TABLE realtime_logs (
log_id BIGINT,
user_id BIGINT,
log_timestamp TIMESTAMP
) WITH (
partitioning = ARRAY['year(log_timestamp)', 'month(log_timestamp)', 'day(log_timestamp)', 'hour(log_timestamp)']
);
```
해시 버킷 활용법
```sql
-- 사용자별 균등 분산
CREATE TABLE user_behavior (
user_id BIGINT,
action_type VARCHAR,
action_time TIMESTAMP
) WITH (
partitioning = ARRAY['bucket(user_id, 16)', 'year(action_time)']
);
```
문자열 절단 파티셔닝
```sql
-- 지역별 데이터 분할
CREATE TABLE location_data (
area_code VARCHAR,
metric_value BIGINT
) WITH (
partitioning = ARRAY['truncate(area_code, 2)']
);
```
스키마 진화 기능 활용하기
Iceberg의 핵심 장점 중 하나인 스키마 진화 기능을 살펴보겠습니다.
컬럼 추가하기
```sql
-- 신규 컬럼 추가
ALTER TABLE sample_table ADD COLUMN email_address VARCHAR;
-- 기본값 설정과 함께 추가
ALTER TABLE sample_table ADD COLUMN account_status VARCHAR DEFAULT 'pending';
```
컬럼 수정 및 삭제
```sql
-- 불필요한 컬럼 제거
ALTER TABLE sample_table DROP COLUMN deprecated_field;
-- 컬럼명 변경
ALTER TABLE sample_table RENAME COLUMN old_field TO new_field;
```
데이터 타입 확장
```sql
-- INT를 BIGINT로 확장
ALTER TABLE sample_table ALTER COLUMN record_id SET DATA TYPE BIGINT;
-- FLOAT을 DOUBLE로 확장
ALTER TABLE sample_table ALTER COLUMN amount SET DATA TYPE DOUBLE;
```
이런 변경이 기존 데이터를 건드리지 않고 바로 적용되는 게 정말 놀라워요.
메타데이터 테이블로 깊이 있는 분석하기
Iceberg는 테이블 상태를 분석할 수 있는 특별한 메타데이터 테이블들을 제공합니다:
스냅샷 히스토리 확인
```sql
-- 테이블 스냅샷 전체 조회
SELECT * FROM "sample_table$snapshots"
ORDER BY committed_at DESC;
```
테이블 변경 추적
```sql
-- 변경 이력 상세 조회
SELECT * FROM "sample_table$history"
ORDER BY made_current_at DESC;
```
파일 레벨 정보
```sql
-- 데이터 파일 상세 분석
SELECT
file_path,
file_format,
record_count,
file_size_in_bytes
FROM "sample_table$files";
```
파티션 통계
```sql
-- 파티션별 데이터 분포
SELECT
partition,
record_count,
file_count
FROM "sample_table$partitions";
```
[사진: 3.jpg - Time Travel 쿼리 예시 코드]
Time Travel 쿼리 실행
```sql
-- 과거 특정 시점 데이터 조회
SELECT * FROM sample_table FOR TIMESTAMP AS OF TIMESTAMP '2024-01-15 14:30:00';
-- 스냅샷 ID로 과거 데이터 접근
SELECT * FROM sample_table FOR VERSION AS OF 987654321;
```
성능 튜닝 및 캐시 전략
메타데이터 캐시 최적화
```properties
메타데이터 캐싱 사용 (기본: true)
iceberg.metadata-cache.enabled=true
캐시 유지 시간 (기본: 10분)
iceberg.metadata-cache.ttl=10m
최대 캐시 엔트리 수
iceberg.metadata-cache.max-entries=10000
```
파일시스템 캐시 설정
```properties
FS 캐싱 활성화
iceberg.file-system-cache.enabled=true
iceberg.file-system-cache.max-disk-usage=100GB
```
실제 운영에서 메타데이터 캐싱을 켜면 쿼리 응답속도가 눈에 띄게 개선됩니다.
테이블 관리 프로시저 활용법
기존 테이블 등록하기
```sql
-- S3 기존 테이블을 카탈로그에 등록
CALL system.register_table(
schema_name => 'analytics',
table_name => 'legacy_table',
table_location => 's3://data-lake/tables/legacy/'
);
```
테이블 등록 해제
```sql
-- 메타스토어에서만 제거 (실제 데이터는 보존)
CALL system.unregister_table(
schema_name => 'analytics',
table_name => 'unused_table'
);
```
Hive 테이블 변환
```sql
-- Hive를 Iceberg로 마이그레이션
CALL system.migrate(
schema_name => 'warehouse',
table_name => 'hive_legacy_table'
);
```
외부 파일 통합
```sql
-- 기존 파일들을 테이블에 추가
CALL system.add_files(
schema_name => 'analytics',
table_name => 'target_table',
file_paths => ARRAY['s3://bucket/data/part1.parquet', 's3://bucket/data/part2.parquet']
);
```
실전 운영 노하우 공유
파티셔닝 설계 원칙
• 쿼리 패턴 분석 후 가장 빈번한 필터 조건을 파티션 키로 선택
• 과도한 파티셔닝은 오버헤드 증가로 이어질 수 있음
• 시계열 데이터는 년/월/일 계층 구조 권장
압축 코덱 선택 가이드
• ZSTD: 범용적 사용에 최적
• SNAPPY: 빠른 압축/해제 우선시
• GZIP: 저장 공간 절약이 중요한 경우
메타데이터 유지보수
• 주기적인 오래된 스냅샷 정리 작업
• 캐시 설정으로 성능 향상
• 테이블 통계 정보의 지속적 업데이트
정리하며
Trino의 Iceberg Connector는 모던 데이터 레이크 플랫폼의 핵심 기술입니다. 스키마 진화, 시점별 데이터 조회, 체계적인 메타데이터 관리 등의 기능으로 기존 데이터 웨어하우스의 장점을 오픈소스 환경에서 구현할 수 있게 해줍니다.
실시간 처리와 배치 분석을 동시에 지원하면서 ACID 특성까지 보장하는 점에서, 엔터프라이즈급 데이터 인프라 구축에 매우 적합한 솔루션이라고 확신합니다.
---
실무 경험을 나눠주세요!
Trino-Iceberg 조합을 실제 프로젝트에 적용해보신 분들의 후기나 질문을 댓글로 남겨주세요~ 특히 성능 최적화나 운영 이슈 관련 경험담을 공유해주시면 다른 분들께도 큰 도움이 될 것 같아요!
유익하셨다면 구독과 공감 부탁드려요! 💕
'데이터 엔지니어링 정복 > Trino' 카테고리의 다른 글
| [Trino] Python에서 SSL Trino사용 (0) | 2025.05.26 |
|---|---|
| [Trino] Query exceeded per-node memory limit of 1GB | Trino Memory, CPU Tunning (0) | 2025.02.18 |
| [Trino] SSL/TLS(https) 적용 혹은 만료시 재생성후 배포 | Max retries exceeded with url (0) | 2025.02.13 |