-
[Apache Iceberg] 아이스버그 테이블 최적화 - COW와 MOR 설정개발지식 아카이브/Data - Iceberg 2025. 1. 20. 07:30
Apache 아이스버그 테이블 최적화 - COW와 MOR
COW와 MOR
Row 레벨 업데이트 처리
데이터 레이크의 특징은 WORM (Write once read many) 방식을 채택하고 있다는 것이다 => 즉, 파일을 수정할 수 없다.
이는 Row 레벨로 데이터를 업데이트하는 여러 가지 모드를 탄생시켰다.
데이터 특성 및 기록 주기에 따라서 성능을 최적화할 수 있는 모드를 선택하는 것이 좋다.
COW
- Copy-On-Write 는 default approach로 평가된다
- 쓰기 성능이 느리다
- Row가 하나라도 업데이트/삭제 되면, 해당 데이터 파일을 다시 작성한다
- 읽기 성능이 빠르다
- 삭제되거나 업데이트된 파일을 조정하지 않고 읽을 수 있기 때문
MOR
- 기존 파일은 그대로 둔다. 대신 기존 파일에서 업데이트할 레코드를 삭제 파일에 캡처하여 추적한다.
- 쓰기 속도가 빠르다
- 파일 전체를 다시 쓸 필요가 없으므로
- 읽기 성능은 느리다
- 무시할 Row를 식별하기 위해 삭제 파일을 스캔해야 하기 때문이다
MOR의 읽기 비용을 최소화하기 위해서는 정기적으로 Compaction을 실행해야 하며, 다음 옵션들을 활용할 수 있음
- 필터/where 절을 사용하여 컴팩션 대상을 마지막 시간 프레임(시간, 일)에 수집된 파일로 한정함
- partial-progress-mode를 활성화하여 커밋 주기를 더 짧게 함
MOR모드는 2가지로 나뉠 수 있다
- position deletes MOR
- 위치 삭제 파일이라고 하는 것을 사용하여, 삭제하려고 하는 row 위치를 알고 있어서 그것을 따라간다
- ex) 영화관 좌석 번호를 알고 있음 → 해당 좌석 번호로 바로 가서 의자를 제거함
- 읽기 성능에 도움을 줌 → 무시해야 할 Row의 위치, Row num을 제공하므로
- 쓰기 성능에 영향을 미침 → 무시해야 할 Row의 위치를 쓰기 시점에 식별해야 하므로
- 위치 삭제 파일이라고 하는 것을 사용하여, 삭제하려고 하는 row 위치를 알고 있어서 그것을 따라간다
- equality deletes MOR
- 레코드가 일치할 시 무시해야 하는 값을 지정해준다
- ex) 영화관을 한 바퀴 쭉 돌다가 부서진 의자가 보이면 그때 제거한다
- 읽기 성능에 영향을 미침 → 모든 Row의 값을 비교하여 찾아내야 한다
- 쓰기 성능에 도움을 줌 → 쓰기 과정에서 아무것도 하지 않으므로
- 레코드가 일치할 시 무시해야 하는 값을 지정해준다
Row 레벨 업데이트 모드 3가지 비교
모드 읽기 성능 쓰기 성능 운영시 Best Practice COW 가장 빠름 가장 느림 MOR (position deletes) 빠름 빠름 컴팩션 주기 = 보통 MOR (equality deletes) 느림 가장 빠름 컴팩션 주기 = 공격적으로 설정 (읽기 비용을 감소시키기 위해)
Conf 설정
CREATE DDL 예시CREATE TABLE temp.test_transaction (..) TBLPROPERTIES ( 'write.delete.mode'='copy-on-write', 'write.update.mode'='merge-on-read', 'write.merge.mode'='merge-on-read' ) USING iceberg;
ALTER DDL 예시ALTER TABLE temp.test_transaction SET TBLPROPERTIES ( 'write.delete.mode'='merge-on-read', 'write.update.mode'='copy-on-write', 'write.merge.mode'='copy-on-write' );
각 옵션- write.delete.mode
- 삭제 트랜잭션에 사용할 어프로치
- write.update.mode
- 업데이트 트랜잭션에 사용할 어프로치
- write.merge.mode
- 컴팩션 트랜잭션에 사용할 어프로치
특징- 삭제/업데이트/병합에 각각 다른 어프로치를 사용하는 것이 가능하다.
- 기본: Spark 엔진
이는 Row 레벨로 데이터를 업데이트하는 여러 가지 모드를 탄생시켰다.
데이터 특성 및 기록 주기에 따라서 성능을 최적화할 수 있는 모드를 선택하는 것이 좋다.
Reference
이 포스팅은 Apache Iceberg The Definitive Guide 4장의 내용에 기반하여 작성하였습니다.
관련 포스팅 보기
2025.01.13 - [개발지식 아카이브/Data - Iceberg] - [Apache Iceberg] 아이스버그 테이블 최적화 - 컴팩션과 정렬
2025.01.13 - [개발지식 아카이브/Data - Iceberg] - [Apache Iceberg] 아이스버그 테이블 최적화 - 파티셔닝
'개발지식 아카이브 > Data - Iceberg' 카테고리의 다른 글
[Apache Iceberg] 아이스버그 테이블 최적화 - 메트릭 수집 (0) 2025.01.22 [Apache Iceberg] 아이스버그 테이블 최적화 - 스토리지 최적화 편 (0) 2025.01.17 [Apache Iceberg] 아이스버그 테이블 최적화 - 파티셔닝 (0) 2025.01.15 [Apache Iceberg] 아이스버그 테이블 최적화 - 컴팩션과 정렬 (0) 2025.01.13