Iceberg 타임트래블: Point-in-Time 읽기

Iceberg 타임트래블: Point-in-Time 읽기

Iceberg는 테이블의 과거 상태를 그대로 조회할 수 있는 **타임트래블(time travel)**을 지원해요. 데이터를 특정 시점으로 되돌리는 게 아니라, 과거 커밋 시점의 스냅샷을 읽는 방식이에요. 이걸 구현하는 방법은 테이블 메타데이터에 저장된 두 종류의 이력(歷史)을 이해하면 금방 따라와요.

출처: Apache Iceberg™ Spec — Point in Time Reads (Time Travel)

본문

두 가지 테이블 이력

Iceberg 테이블은 두 종류의 이력을 지원해요.

  • 과거 "current 스냅샷"의 이력 — 테이블 메타데이터의 snapshot-log에 저장돼요. 이건 테이블의 "현재 스냅샷"이 지금까지 어떻게 바뀌어 왔는지를 타임스탬프와 스냅샷 ID 쌍으로 기록한 거예요.
  • 부모-자식 계보(parent-child lineage) — 테이블 메타데이터의 snapshots에 저장돼요. 스냅샷끼리의 부모-자식 관계를 담은 계보지요.

이 두 이력은 특정 타임스탬프에 대해 서로 다른 스냅샷 ID를 가리킬 수 있어요. 그 차이는 다양한 테이블 연산에서 생겨요. 예를 들어 current-snapshot-id를 갱신하면 테이블의 스냅샷을 임의의 스냅샷으로 설정할 수 있는데, 그 스냅샷은 어떤 테이블 브랜치에서 온 계보일 수도 있고 아예 계보가 없을 수도 있거든요.

point-in-time 쿼리 처리

point-in-time 쿼리를 처리할 때 구현은 snapshot-log 메타데이터를 사용해 주어진 시점의 테이블 상태를 조회해야 해요. 그래야 타임트래블 쿼리가 제공된 타임스탬프에서의 테이블 상태를 정확히 반영해요.

예를 들어 SQL 쿼리 SELECT * FROM prod.db.table TIMESTAMP AS OF '1986-10-26 01:21:00Z';는 스냅샷 로그에서 '1986-10-26 01:21:00 UTC' 바로 직전의 Iceberg 테이블 스냅샷을 찾고, 그 스냅샷의 메타데이터를 사용해 테이블 스캔을 수행해요.

만약 주어진 타임스탬프보다 앞선 스냅샷이 없거나, snapshot-log가 채워져 있지 않으면(옵션 필드라서), 시스템은 **누락된 메타데이터에 대한 안내 문구(error message)**를 던져야 해요.

요약

타임트래블의 핵심은 "어느 시점의 스냅샷"을 정확히 고르는 문제예요. 계보(snapshots)는 스냅샷끼리의 관계를 보여주지만, 특정 시각의 "그 순간의 current 스냅샷"을 확정하는 기준은 snapshot-log예요. 그래서 스펙은 point-in-time 읽기에 snapshot-log를 쓰라고 안내하는 거죠.

더 알아보기