지난 시간에 Iceberg의 구조에 대해서 자세히 알아보았는데, 혹시 못봤다면 아래 페이지를 참고하도록 하자.
이번 시간에는 Iceberg의 특징 및 사용법을 알아보려고 한다. (참고로 관련쿼리는 Spark기준으로 작성했다)
2023.10.11 - [[기술공부]/Data] - Apache Iceberg란 무엇일까?
Iceberg를 관리하는 방법
# Compaction
데이터가 많이 쌓이는 테이블은 메타데이터도 증가하여 쿼리 성능이 떨어질 수 있다. 이러한 현상은 특히 실시간성 streaming 데이터에서 많이 발생하는데, 작은 용량의 파일이 여러개 들어올때 이러한 현상은 심해지게 된다. 이를 해결하기 위해 Iceberg에서는 'compaction' 기능을 활용하여 작은 파일들을 합쳐주고 메타데이터의 개수를 줄일 수 있게 해준다.
(원리) 여러개 작은 파일 -> compaction -> 큰 파일 생성 -> 새로운 메타, 스냅샷 -> 새로운 스냅샷 참조해서 쿼리 속도 향상
compaction - 작은 용량의 여러개 파일들을 합쳐서 큰 파일로 rewrite(=생성) 해주는 작업
-- 더 효율적으로 사용하려면 아래 compaction 작업을 주기적으로 스케줄 걸어놓을 수 있다.
CALL catalog.system.rewrite_data_files(
table => 'db.sample',
where => 'partiton' = 'value', -- compaction 하고자 하는 범위
options => map('min-input-files','2') -- 원하는 옵션 설정 가능
)
옵션 설정은 원하는 방식으로 지정할 수 있고 관련 내용은 아래 공식 사이트의 내용을 참고할 수 있다.
https://iceberg.apache.org/docs/latest/spark-procedures/
# Expire snapshot
스냅샷은 특정 시점의 테이블 형상을 기록한 것으로, 스냅샷을 통해 원하는 시점으로 rollback이 가능한 장점이 있다. 하지만 트랜잭션이 발생할수록 사용하지 않는 과거의 스냅샷도 쌓여갈 수 밖에 없다. 이때 과거의 스냅샷과 연결된 (현재는 안쓰이는) manifest, data file이 남아 있으므로 storage cost를 낭비하게 된다. 그래서 이러한 상황을 방지하기 위해 사용되지 않는(=expire) 과거의 스냅샷을 정리하는 과정이 필요하다.
expire snapshot - 사용되지 않는 과거의 스냅샷을 정리해주는 작업
-- 스냅샷이 정리되면 (현재 남겨진 스냅샷과 관련없는 것 중에서) 삭제 스냅샷과 관련된 manifest list, manifest, data file도 삭제된다.
CALL system.expire_snapshots(
table => 'db.sample',
older_than => timestamp, -- 해당 날짜보다 오래된 스냅샷 정리
retain_last => number -- 남겨놓을 스냅샷 갯수
)
# 메타데이터 정리
Iceberg는 트랜잭션이 발생할때마다 새로운 메타데이터가 계속 생기는데 변경이 자주 일어나는 테이블(ex. streaming)은 storage cost를 낭비할 수 있다. 그렇기 때문에 Iceberg를 효율적으로 관리하려면 정기적으로 메타를 정리해주는 과정이 필요하다. 아래와 같이 테이블 옵션을 설정하여 작업할 수 있다.
메타데이터 정리 - 새로운 메타데이터가 생성되면 과거의 오래된 메타데이터를 삭제해주는 작업
table property | 설명 |
write.metadata.delete-after-commit.enabled=true | 자동으로 메타데이터를 정리하게 만들어주는 옵션 (원하지 않으면 false로 설정) |
write.metadata.previous-versions-max | 유지하고자 하는 메타데이터 파일 개수 |
-- 새로운 메타데이터가 생기면 최신 5개의 메타만 남겨두고 자동으로 삭제해주도록 설정
-- 만약 이미 테이블을 만들었다해도 ALTER TABLE ~ SET TBLPROPERTIES 구문으로 옵션을 바꿀 수 있다.
CREATE TABLE db.sample
USING iceberg
PARTITIONED BY (part)
TBLPROPERTIES (write.metadata.delete-after-commit.enabled=true,
write.metadata.previous-versions-max=5)
AS SELECT ...
# Delete Orphan Files
Spark 같은 분산 처리 엔진에서는 Task나 Job이 실패했을때 메타데이터에서 참조하지 않는 파일(Ex.일부만 write된 파일, 스냅샷과 연결되지 않은 파일)이 생기게 된다. 이렇게 메타데이터와 연결되지 않은 파일을 'orphan file'이라 부르고 불필요하게 storage cost를 낭비하게 된다. 더 큰 문제점은 orphan file은 메타데이터, 스냅샷과 연결되어 있지 않기 때문에 expire snapshot이나 metadata file을 삭제해도 남아있게 된다. 그렇기 때문에 주기적으로 orphan file을 삭제해주는 작업이 필요하다.
remove orphan file - 메타데이터, 스냅샷과 연결되지 않은 파일을 삭제해주는 작업
여담으로 orphan이 '고아'를 의미하는 영단어인데, 부모와 같은 존재인 메타를 잃어버린 파일이라고 이해하면 된다.
-- 해당 테이블에 대한 orphan file 삭제
CALL catalog_name.system.remove_orphan_files(
table => 'db.sample'
)
이번 시간에는 Iceberg의 특징 및 사용법에 대해 알아보았다. 명령어를 조금 더 쉽게 알아볼 수 있도록 Spark 기반으로 정리해봤는데, 많은 사람들에게 도움이 되었으면 좋겠다. 아직 국내에서는 Iceberg에 대해 정리해둔 곳이 많이 없는데 이 글이 도움이 되길 바란다. 다음 시간에도 이어서 Iceberg 테이블의 특징에 대해 알아보도록 하자.
참조 사이트
'[기술공부] > Data' 카테고리의 다른 글
Apache Iceberg DML, 메타데이터 사용법 (0) | 2023.10.30 |
---|---|
SQL튜닝 - 인덱스의 종류에 대하여 (클러스터/비클러스터 인덱스) (0) | 2023.10.27 |
SQL 튜닝 - 인덱스에 대하여 (2) | 2023.10.27 |
Apache Iceberg DDL 쿼리 사용법 - Create and Alter Table (0) | 2023.10.13 |
Apache Iceberg란 무엇일까? (0) | 2023.10.11 |