Data Engineering

Spark + Iceberg - 5(Merge on read vs Copy on write)

HOONY_612 2024. 1. 21. 09:46
반응형

 

소개

아이스버그 마지막으로 볼 기능인 MOR & COW 이다.

빅데이터를 다루는데 Update를 지원한다는 건 모든 ACID 트랜잭션을 지원한다는 것이다.

물론 OLTP 보다는 성능이 떨어지겠지만 OLAP에서 구현했다는 것에 대한 의미가 있다고 본다.

 

COW는 "읽기가 자주 발생하고 수정/삭제가 자주 발생하지 않고 대규모 테이블 업데이트를 사용하는 경우" 사용된다.

말 그대로 수정해야하는 컬럼이 있는 데이터 파일을 복제해 컬럼 데이터가 업데이트 되어진 파일을 만드는 것이다.

많은 컬럼이 수정될 때는 효율적이지만 소수 컬럼이 수정될 때는 전체 데이터를 복사하기 때문에 비 효율적이다.

 

MOR은 "수정/삭제가 빈번하게 발생하는 테이블을 사용하는 경우" 적합하다.

COW와는 달리 MOR은 변경 사항들을 새 파일로 만든다.

이렇게하면 쓰기에는 적합하지만 읽을 때 더 많은 파일을 추적해야해서 비용이 크다는 단점이 있다.

컬럼을 삭제하면 삭제 파일이 추가되고 이 파일을 이용해 컬럼이 삭제된 새로운 데이터 파일을 만들고 압축하는 동안 이용할 수 있다.

컬럼을 수정하면 수정 데이터는 삭제 파일 추가되고 압축하는 동안 사용되어지고 나중에는 삭제 파일이 없어진 더 적은 데이터 파일을 이용한다. 

실습

 

1. COW or MOR 사용하기

 

테이블 생성 또는 ALTER SQL문으로 수정이 가능하다.

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 문을 이용한 방식이다.

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

 

현재 class_year 2024 파티션에 정의되어져 있는 데이터를 삭제해보려고 한다.

write-delete-modecopy-on-write이다.

데이터 파일이 변경되는지 확인해보자.

DELETE FROM students WHERE major = 'Biology'

 

파일이 새로 하나 생겼다.

 

 

4. ALTER TABLE

 

이제는 속성을 copy-on-write에서 merge-on-read로 변경해보자.

ALTER TABLE students SET TBLPROPERTIES (
    'write.delete.mode'='merge-on-read'
);

 

그리고 다시 class_year 2024 파티션에 정의되어져 있는 데이터를 삭제해보자.

DELETE FROM students WHERE major = 'Economics'

 

새로운 데이터 파일이 아닌 삭제 파일이 생긴것을 볼 수 있다.

 

결과적으로 COW는 조회 시 새로운 파일 1개, MOR은 조회 시 파일 1개 + Delete File들을 추적하기때문에 성능이 떨어질 수 있다.

 

반응형