Developers Haven

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

Welcome to DH's Blog

[기술공부]/Data

Apache Iceberg : Copy-on-Write(cow) vs Merge-on-Read(mor)

DH’s Blog 2023. 10. 30. 13:49
반응형

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/

 

 

반응형