Apache Iceberg™ 커뮤니티에 의해 승인된 Iceberg v3는 고급 새로운 기능과 데이터 유형을 도입합니다. Iceberg v3 는 삭제 벡터, 행 계보, 반정형 데이터 및 공간적 사용 사례를 위한 새로운 유형과 같은 주요 개선 사항을 포함합니다. 이러한 기능들은 고객이 데이터를 효율적으로 처리하고 쿼리할 수 있게 합니다. 또한, 이러한 개선 사항들은 Delta Lake, Apache Parquet, Apache Spark™에서 일관성 있게 적용되므로, 고객들은 데이터 또는 행 수준 삭제 파일을 다시 작성하지 않고 Delta와 Apache Iceberg™ 사이에서 상호 운용할 수 있습니다.
이 블로그 게시물에서는 Iceberg v3의 최신 개발 사항을 다룹니다:
Iceberg v3는 읽기 성능을 향상시키기 위해 행 수준 삭제를 위한 새로운 형식인 삭제 벡터를 도입했습니다. 행 수준 삭제는 삭제된 행이 저장되고 추적되는 방식을 최적화함으로써 쓰기 증폭을 크게 줄이고, 이로 인해 ETL 및 수집이 빨라집니다. Iceberg v2에서는 엔진이 쓰기 중에 삭제 파일을 함께 압축할 필요가 없었습니다. 의도는 고객이 비동기 유지 보수를 사용하는 것이었습니다. 그러나 많은 고객들이 유지 보수 서비스를 예약하지 않아서 테이블에 유지 보수되지 않은 삭제 파일이 너무 많았습니다. 이로 인해 엔진이 읽기 시 많은 행 수준 삭제 파일을 병합해야 하므로 읽기 성능이 느려졌습니다.
Iceberg v3는 새로운 삭제 벡터 형식과 삭제 파일에 대한 새로운 압축 요구 사항을 도입합니다. 이 새로운 형식은 Parquet 파일과 삭제를 적용하는 데 사용되는 메모리 내 표현 간의 변환을 피합니다. 또한, 엔진은 쓰기 시점에 파일 당 하나의 삭제 벡터를 유지해야 합니다. 이 요구 사항은 데이터 파일의 성능과 통계를 개선합니다. 이는 이전의 삭제와 현재의 삭제를 쉽게 비교할 수 있게 하여, 테이블의 행 수준 변경 사항을 스트림으로 처리하는 것을 단순화합니다.
Iceberg v3의 또 다른 주요 기능은 행 계보로, 이는 증분 처리를 단순화하는 데 사용됩니다. 행 계보를 사용하면, 엔진은 커밋 간의 행 버전을 매칭하여 행 수준 변경 사항을 찾습니다.
Iceberg v3는 행 레벨 메타데이터를 사용한 행 계보를 도입합니다: 행 ID와 행이 마지막으로 수정되거나 추가된 시퀀스 번호. 이 ID들은 버전 간에 동일한 행을 식별합니다. 시퀀스 번호는 행이 마지막으로 변경된 시점을 주석 처리합니다 - 단지 파일 간에 재배치된 것이 아닙니다. 이를 통해 엔진은 변화를 선택적으로 처리할 수 있게 되어, 더 빠르고 저렴한 워크플로우로 하류 업데이트를 단순화합니다.
행 ID 정보는 물리화 뷰와 같은 증분 처리 객체와 결합할 때 특히 유용합니다. 이러한 객체는 마지막 처리 주기 이후의 새로운 데이터 또는 변경된 데이터만 계산하도록 최적화되어 있습니다.
Iceberg v3는 또한 반정형 데이터와 공간적 데이터를 위한 새로운 데이터 유형을 추가합니다.
반정형 데이터는 스키마가 다양하여 구조화된 테이블 열에 맞지 않기 때문에 저장하기 어렵습니다. 한 가지 해결책은 이 데이터에서 개별 필드를 구조화된 형식으로 추출하는 것입니다. 그러나 이로 인해 스키마가 일관되지 않아 많은 열과 NULL 값이 있는 매우 넓은 테이블이 생성됩니다. 다른 대안은 JSON을 문자열 열에 저장하는 것입니다. 불행히도, 이는 엔진이 이러한 문자열에서 데이터를 파싱해야 하므로 읽기 성능이 떨어집니다. 반정형 데이터 유형이 없으면, 엔진은 필터를 내려받을 수 없으므로 모든 데이터 파일의 모든 행을 읽어야 합니다. Iceberg v3는 반정형 데이터를 효율적으로 표현하기 위해 VARIANT 를 도입했습니다. VARIANT 는 데이터의 구조를 인코딩하여 성능을 향상시키면서 스키마 유연성을 유지합니다.
