S3 호환 오브젝트 스토리지다. AWS S3와 API가 동일해서 boto3 같은 S3 라이브러리를 그대로 쓸 수 있다.
로컬 또는 온프레미스 환경에서 S3처럼 파일을 저장하고 싶을 때 사용한다.
이 프로젝트에서는 Parquet 파일을 저장하는 스토리지로 사용한다.
데이터를 저장하는 파일 형식이다. 컬럼 기반으로 저장하기 때문에 특정 컬럼만 읽는 분석 쿼리에 유리하다.
JSON이나 CSV보다 압축률이 높고 읽기 성능이 좋다.
테이블 포맷 스펙이다. 실행되는 서비스가 아니다.
MinIO에 Parquet 파일이 쌓이면 그냥 파일 더미다. 어떤 파일이 어떤 테이블인지, 컬럼이 뭔지, 언제 추가됐는지 알 방법이 없다.
Iceberg는 Parquet 파일들을 테이블처럼 관리할 수 있게 해주는 규칙이다.
system_metrics/
├── data/
│ ├── 00000.parquet
│ └── 00001.parquet
└── metadata/
├── snap-001.avro → 스냅샷 정보
└── v1.metadata.json → 테이블 메타데이터
스냅샷 정보
특정 시점에 어떤 Parquet 파일이 테이블에 속했는지 기록한다. 이게 있어서 특정 시점의 데이터를 조회하는 Time Travel이 가능하다.
테이블 메타데이터
컬럼 이름/타입, 파티션 방식, 스키마 변경 이력, 현재 스냅샷 정보를 담고 있다.
| 항목 | 경로 기반 관리 | Iceberg |
|---|---|---|
| 스키마 변경 | 기존 파일 전부 재작성 | 자동 처리 |
| Time Travel | 불가 | 가능 |
| 파티션 등록 | 수동 (MSCK REPAIR TABLE) | 자동 |
| 작은 파일 관리 | 수동 | 자동 compaction |
Iceberg 테이블의 메타데이터 위치를 저장하는 서비스다.
Trino가 쿼리를 실행할 때 다음 순서로 동작한다.
Hive Metastore 자체의 메타데이터는 DB에 저장된다. 토이 프로젝트에서는 Derby(내장 DB), 프로덕션에서는 PostgreSQL 또는 MySQL을 사용한다.
분산 SQL 쿼리 엔진이다. Iceberg 포맷을 이해하고 MinIO의 Parquet 파일을 SQL로 조회할 수 있다.
SELECT * FROM iceberg.windows_logs.system_metrics
WHERE timestamp > '2026-03-10'
LIMIT 100;
Trino 자체는 데이터를 저장하지 않는다. MinIO에 있는 파일을 읽어서 쿼리만 실행한다.
데이터 적재 시
Consumer가 PyIceberg로 Parquet 파일을 MinIO에 저장하고, Iceberg 메타데이터를 업데이트한 뒤 Hive Metastore에 위치를 등록한다.
쿼리 실행 시
Trino가 Hive Metastore에서 메타데이터 위치를 확인하고, MinIO에서 메타데이터와 Parquet 파일을 읽어서 쿼리 결과를 반환한다.