Iceberg 증분 처리와 저장 전략
증분 처리는 이전 실행 이후 바뀐 데이터만 읽어 출력을 갱신합니다. Iceberg에서는 어떤 스냅샷 유형을 읽을 수 있는지와, 행 변경을 데이터 파일 재작성 또는 삭제 파일로 저장하는지를 함께 결정해야 합니다.
실행 경로별 지원
| 경로 | 추가 전용 | Changelog |
|---|---|---|
| Python Spark 변환 | 지원 | 지원 |
| Python 단일 노드 변환 | 지원 | 미지원 |
| Pipeline Builder Spark | 지원 | 미지원 |
| Pipeline Builder Faster | 미지원 | 미지원 |
변경 읽기
기본 append_only 모드는 읽을 구간에 Append와 Replace(컴팩션) 스냅샷만 있을 때 증분으로 처리합니다. Overwrite나 Delete가 있으면 증분 해석이 실패하여 전체 비증분 읽기로 전환하거나, require_incremental=True이면 작업을 실패시킵니다.
changelog 모드는 Append, Overwrite, Delete와 Replace를 대상으로 변경 로그를 읽습니다. 다만 실제 delete file이 들어 있는 스냅샷은 현재 changelog scan에서 지원되지 않습니다. Delete라는 스냅샷 유형을 지원한다는 것과 merge-on-read의 삭제 파일을 읽을 수 있다는 것은 다릅니다.
변경 쓰기
| 문장 또는 API | 동작 |
|---|---|
INSERT INTO | 주어진 행을 추가합니다. 기존 행을 수정하지 않고 이미 있는 행인지 검사하지도 않습니다. |
MERGE INTO | 작성한 MATCHED/NOT MATCHED 조건으로 갱신, 삽입 및 삭제를 수행합니다. |
UPDATE | 조건에 맞는 행을 새 값으로 바꿉니다. |
DELETE FROM | 조건에 맞는 행을 삭제합니다. |
Foundry의 추가 전용 증분 쓰기는 INSERT 동작을 감싸고, apply_changelog는 식별자 기반 upsert와 삭제를 제공합니다. 사용자 지정 조건이 필요하면 네이티브 SQL을 사용할 수 있습니다. 변경 로그와 고급 API에서 구체적인 입력 계약을 설명합니다.
Copy-on-write와 merge-on-read
| 전략 | 저장 방식 | 일반적인 특성 |
|---|---|---|
| Copy-on-write | 바뀐 행이 있는 데이터 파일을 다시 씁니다. | 쓰기가 더 무겁고 읽기가 빠릅니다. Iceberg 기본값입니다. |
| Merge-on-read | 기존 파일을 두고 해당 행을 가리는 delete file을 추가합니다. 갱신 및 merge는 새 행이 든 데이터 파일도 씁니다. 읽는 쪽이 삭제 파일을 적용합니다. | 쓰기가 더 가볍고 읽기 부담이 커집니다. |
생산자가 고르는 설정이지만 다운스트림이 읽을 수 있는 범위를 제한하므로 파이프라인 전체의 결정입니다. write.delete.mode, write.update.mode, write.merge.mode를 명시하지 않으면 copy-on-write를 사용하며 Foundry가 이 기본값을 바꾸지 않습니다.
속성은 해당 행 변경을 실제 적용할 때 영향을 줍니다. Merge-on-read로 설정해도 지금까지 추가만 한 테이블에는 삭제 파일이 없을 수 있습니다.
Merge-on-read의 현재 읽기 부담은 Rewrite data files 컴팩션으로 삭제 파일을 적용하고 데이터를 새 파일로 합치면 줄일 수 있습니다. 그러나 이전 변경 구간에 삭제 파일이 남아 있다는 문제까지 자동으로 해결되었다고 판단하지 않습니다.
온톨로지 객체 인덱싱
Copy-on-write Iceberg 테이블을 기반으로 한 객체 유형은 행 수준으로 증분 인덱싱합니다. 행 수정과 삭제가 해당 객체의 수정 및 삭제로 반영되며, 한 행의 변경 때문에 전체 객체를 다시 인덱싱하는 방식은 아닙니다.
읽어야 하는 데이터 양은 바뀐 행 수뿐 아니라 다시 쓴 데이터 파일 크기에 비례합니다. 같은 수의 행을 바꿔도 여러 파일에 흩어져 있으면 몇 개 파일에 모여 있을 때보다 인덱싱 비용이 커질 수 있습니다.
객체 기반 테이블은 copy-on-write로 유지합니다. Merge-on-read의 삭제나 갱신이 delete file을 만들면 증분 인덱스 빌드가 실패할 수 있습니다. 변경 로그를 읽는 테이블도 같은 제한을 적용합니다.
Delete files are currently not supported in changelog scans
구체적인 데코레이터, 버전 요구와 읽기 모드는 증분 Python API를 사용합니다.