Developers Haven

(DH)블로그는 개발자들이 기술 정보를 찾아볼 수 있는 안식처가 되고 싶음을 희망하여 시작하게 되었습니다. 공부한 내용과 성장 과정을 기록해두었으니 편히 둘러보시길 바랍니다.

Welcome to DH's Blog

[기술공부]/Data

Apache Iceberg의 특징과 관리방법에 대하여

DH’s Blog 2023. 10. 12. 18:12
반응형

지난 시간에 Iceberg의 구조에 대해서 자세히 알아보았는데, 혹시 못봤다면 아래 페이지를 참고하도록 하자.

이번 시간에는 Iceberg의 특징 및 사용법을 알아보려고 한다. (참고로 관련쿼리는 Spark기준으로 작성했다)

 

2023.10.11 - [[기술공부]/Data] - Apache Iceberg란 무엇일까?

 

Apache Iceberg란 무엇일까?

현재 빅데이터 솔루션 기업에서 Data Architect로 근무하면서, 새로운 기술이 우리 회사의 솔루션에 적용될때마다 자연스레 많은 기술 공부의 기회를 얻고 있다. 작년에 진행한 프로젝트에서 Iceberg

developers-haven.tistory.com

 

 


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/

 

Procedures

Spark Procedures To use Iceberg in Spark, first configure Spark catalogs. Stored procedures are only available when using Iceberg SQL extensions in Spark 3. Usage Procedures can be used from any configured Iceberg catalog with CALL. All procedures are in t

iceberg.apache.org

 

 

 

# 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 테이블의 특징에 대해 알아보도록 하자.

 

 

 

 

참조 사이트

반응형