반응형
Iceberg는 데이터 write(= delete, update, merge) 작업 수행시 적용할 수 있는 테이블 옵션이 존재한다. Iceberg v1 포맷에서는 copy-on-write 방식을 기본으로 제공했고, v2 포맷에서는 copy-on-write, merge-on-read 두 가지 방식을 지원해준다. 이번 시간에는 두 방식에 대한 설명과 각 장단점을 알아보도록 하자.
Copy-on-Write(cow) 옵션이란?
- 데이터 변경(업데이트 or 삭제)이 발생하면 변경 내용을 적용해서 새로운 데이터 파일(Datafile)을 생성한다.
- 기존 data file + 변경 내용 ➔ 새로운 data file 생성
cow 옵션의 장단점
(1) 장점
- 다른 데이터 처리 작업 없이 바로 파일을 읽으면 되므로 read 성능이 좋다.
(2) 단점
- 만약 용량이 큰 파일에 대한 변경(ex.삭제)이 일어나면 새로운 파일을 만들기 위한 write 대상이 많아져서 느려진다.
- 리소스가 적은 상황에는 TB, PB 이상의 대용량 테이블의 write 대상이 너무 많아져서 드라이버가 kill 되는 상황이 발생할 수도 있다.
- 전체 데이터 파일을 write 해야하므로 몇 개의 일부 행에 업데이트나 삭제가 자주 일어나는 테이블에는 적합하지 않다.
Merge-on-Read(mor) 옵션이란?
- 데이터 저장 방식 : 데이터 파일 + 변경 내역은 delta 파일에 저장(= avro log file)
- 옵션 설명 : 원본 데이터는 변경하지 않고 변경 내용만 delta 파일에 기록해둔다. 이후 테이블 접근시 원본과 delta 파일을 합쳐서 읽는다.
- (참고) delta file : 기준 파일과 다른 부분만 추출해서 생성한 파일
- (참고) avro file : 행 기반의 데이터 저장 포맷으로 데이터를 write 하는 것에 최적화된 방식
mor 옵션의 장단점
(1) 장점
- 변경 내용을 기록만 하면 되므로 write에 대한 처리 속도가 빨라진다. (ex. 대용량 파일의 삭제 속도를 높일 수 있다)
- 업데이트나 삭제가 자주 일어나는 테이블에 적합하다.
(2) 단점
- 테이블 접근시 원본과 delta 파일을 합치는 merge 작업이 필요해서 read 속도가 느려진다.
- 변경 이력에 대한 트랜잭션 수 만큼 delta 파일도 증가하며, delta 파일이 많아지면 주기적으로 compaction 과정이 필요하다.
- (참고) compaction : 원본 데이터와 delta 파일 내용을 반영해서 새로운 데이터 파일을 write 하는 작업
옵션 적용 예시
delete, update, merge에 대한 cow, mor 옵션을 개별적으로 설정할 수 있으므로, 사용할 테이블에 맞게 설정해주면 된다.
CREATE TABLE db.table (
id int,
first_name string,
last_name string,
major string,
class_year int
) TBLPROPERTIES (
'write.delete.mode'='copy-on-write', -- delete 옵션 설정
'write.update.mode'='merge-on-read', -- update 옵션 설정
'write.merge.mode'='merge-on-read' -- merge 옵션 설정
) PARTITIONED BY (class_year) USING iceberg;
테이블 옵션을 변경하고 싶은 경우
ALTER TABLE db.table SET TBLPROPERTIES (
'write.delete.mode'='merge-on-read', -- 변경할 delete 옵션
'write.update.mode'='copy-on-write', -- 변경할 update 옵션
'write.merge.mode'='copy-on-write' -- 변경할 merge 옵션
);
지금까지 Iceberg 테이블에 대한 copy-on-write와 merge-on-read 방식에 대해 살펴보았다. 어떤 옵션이 더 나은지에 대한 물음보다 본인이 사용하는 테이블의 특성에 맞게 옵션을 선택하면 된다. 그리고 테이블 옵션은 alter 구문으로 변경할 수 있기 때문에, 만약 본인이 택한 옵션으로 성능이 안나온다면 다른 옵션으로 바꿔볼 수 있다.
참고 사이트 - https://www.dremio.com/blog/row-level-changes-on-the-lakehouse-copy-on-write-vs-merge-on-read-in-apache-iceberg/
반응형
'[기술공부] > Data' 카테고리의 다른 글
Apache Iceberg vs Apache Hive 차이점 - (2) (0) | 2023.11.03 |
---|---|
Apache Iceberg vs Apache Hive 차이점 - (1) (1) | 2023.11.03 |
Apache Iceberg DML, 메타데이터 사용법 (0) | 2023.10.30 |
SQL튜닝 - 인덱스의 종류에 대하여 (클러스터/비클러스터 인덱스) (0) | 2023.10.27 |
SQL 튜닝 - 인덱스에 대하여 (2) | 2023.10.27 |