Iceberg (Merge on read, Copy on write)

Q·2025년 3월 29일

Iceberg

목록 보기
5/14

COW (Copy on write)

  • 말 그대로 수정해야하는 컬럼이 있는 데이터 파일을 복제해 컬럼 데이터가 업데이트 되어진 파일을 만드는 것이다.
  • "읽기가 자주 발생하고 수정/삭제가 자주 발생하지 않고 대규모 테이블 업데이트를 사용하는 경우" 사용
  • 많은 컬럼이 수정될 때는 효율적이지만 소수 컬럼이 수정될 때는 전체 데이터를 복사하기 때문에 비 효율적이다.

MOR (Merge on read)

  • "수정/삭제가 빈번하게 발생하는 테이블을 사용하는 경우" 적합하다.
  • 변경 사항들을 새 파일로 만든다.
  • 이렇게하면 쓰기에는 적합하지만 읽을 때 더 많은 파일을 추적해야해서 비용이 크다는 단점이 있다.
  • 컬럼을 삭제하면 삭제 파일이 추가되고 이 파일을 이용해 컬럼이 삭제된 새로운 데이터 파일을 만들고 압축하는 동안 이용할 수 있다.
  • 컬럼을 수정하면 수정 데이터는 삭제 파일이 추가되고 압축하는 동안 사용되어지고 나중에는 삭제 파일이 없어진 더 적은 데이터 파일을 이용한다.

1. CREATE TABLE, ALTER TABLE

CREATE TABLE students (
    id int,
    first_name string,
    last_name string,
    major string,
    class_year int
) USING iceberg
TBLPROPERTIES (
    'write.delete.mode'='copy-on-write',
    'write.update.mode'='merge-on-read',
    'write.merge.mode'='merge-on-read'
) PARTITIONED BY (class_year)
LOCATION 's3a://martinispark/cowmor'
ALTER TABLE students SET TBLPROPERTIES (
    'write.delete.mode'='merge-on-read',
    'write.update.mode'='copy-on-write',
    'write.merge.mode'='copy-on-write'
);

2. INSERT INTO Data

INSERT INTO students (id, first_name, last_name, major, class_year)
VALUES
    (1, 'John', 'Doe', 'Computer Science', 2022),
    (2, 'Jane', 'Smith', 'Physics', 2023),
    (3, 'Alice', 'Johnson', 'Mathematics', 2022),
    (4, 'Bob', 'Williams', 'Biology', 2024),
    (5, 'Eva', 'Brown', 'Chemistry', 2023),
    (6, 'Charlie', 'Jones', 'History', 2022),
    (7, 'Sophia', 'Lee', 'Economics', 2024),
    (8, 'Daniel', 'Davis', 'English', 2023),
    (9, 'Olivia', 'Miller', 'Political Science', 2022),
    (10, 'Liam', 'Moore', 'Psychology', 2024);

3. DELETE Data

DELETE FROM students WHERE major = 'Biology'
  • write-delete-mode에 copy-on-write를 적용하여 class_year 2024 파티션에 정의되어져 있는 데이터를 삭제
  • 데이터 파일이 변경 확인 결과 파일이 새로 하나 생겼다.

4. ALTER TABLE

ALTER TABLE students SET TBLPROPERTIES (
    'write.delete.mode'='merge-on-read'
);
  • 속성을 copy-on-write에서 merge-on-read로 변경

DELETE FROM students WHERE major = 'Economics'

  • 다시 class_year 2024 파티션에 정의되어져 있는 데이터를 삭제
  • 새로운 데이터 파일이 아닌 삭제 파일이 생긴것을 볼 수 있다.
  • 결과적으로 COW는 조회 시 새로운 파일 1개, MOR은 조회 시 파일 1개 + Delete File들을 추적하기때문에 성능이 떨어질 수 있다.

참고

profile
Data Engineer

0개의 댓글