ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ClickHouse] Compact Wide Parts 알아보기 ( part_type )
    Database/Clickhouse 2024. 1. 16. 21:17
    728x90
    반응형

     

    - 목차

     

    들어가며.

    이번 글에서는 ClickHouse MergeTree 의 part_type 에 대해서 알아보려고 합니다.

    먼저 Parts 에 대한 자세한 설명은 아래 링크로 대신하도록 하겠습니다.

    https://westlife0615.tistory.com/737

     

    [ClickHouse] Parts & Partition 알아보기

    - 목차 들어가며. 이번 글에서는 ClickHouse 의 MergeTree 엔진에서 사용되는 Parts 와 Partition 에 대해서 알아보려고 합니다. Partition 은 MergeTree Table 에 생성되는 데이터의 물리적인 단위입니다. Table 은 P

    westlife0615.tistory.com

    https://westlife0615.tistory.com/565

     

    [ClickHouse] Block 알아보기

    - 목차 들어가며. 이번 글에서는 ClickHouse 의 Block 의 개념에 대해서 알아보려고 합니다. ClickHouse MergeTree 엔진의 Table 을 생성하고, 해당 테이블에 데이터를 추가하게 되면 Parts 가 생성됩니다. ClickH

    westlife0615.tistory.com

     

    ClickHouse 의 MergeTree 테이블은 데이터가 생성되면 Parts 라는 데이터 조각들을 생성합니다.

    이 Parts 들은 Insert Query 에 의해서 생성되는 Rows 들을 저장하고 있는 실질적인 파일인데요.

    Parts 가 이 Row 들을 저장하는 방식이 바로 Part Type 에 해당합니다.

    종류로는 Wide 와 Compact 가 존재하는데요.

    이번 글에서 Part Type 에 대해서 상세히 알아보도록 하겠습니다.

     

    ClickHouse Container 생성하기.

    간단한 실습을 위해서 도커를 활용하여 ClickHouse Container 를 생성해보겠습니다.

    아래의 링크는 Docker 를 활용하여 ClickHouse Container 를 실행하는 예제 코드르 담고 있습니다.

    https://westlife0615.tistory.com/694

     

    [Clickhouse] Docker 로 Clickhouse 구현하기

    - 목차 들어가며. 이번 글에서는 Docker 를 활용해서 Clickhouse 를 구축하는 글을 작성하려고 합니다. 사용할 Docker Image 는 bitnami/clickhouse 이미지입니다. 간단한 MergeTree 엔진의 Table 을 생성하고 데이

    westlife0615.tistory.com

     

    ClickHouse Docker Container 가 실행되었다면 실습을 위한 Table 을 생성하도록 하겠습니다.

    CREATE TABLE default.test_part_type
    (
        `id`   UInt32,
        `date` DATETIME
    )
    ENGINE MergeTree()
    PARTITION BY toYYYYMM(date)
    ORDER BY tuple(date)
    SETTINGS index_granularity = 8192,
    min_rows_for_wide_part = 100,
    min_bytes_for_wide_part = 0;

     

    Part Type 이란 ?

    Part Type 은 ClickHouse MergeTree Table 의 Part 의 타입을 의미합니다.

    MergeTree Table 은 데이터가 Insert 되면 Part 라는 데이터 조각을 생성합니다.

    그리고 이 Parts 들은 ORDER BY 의 설정에 따라 데이터들이 정렬되어 저장됩니다.

    Parts 들은 두가지 타입이 있습니다.

    하나는 Compact 그리고 다른 하나는 Wide 입니다.

    이들을 나누는 기준은 데이터의 사이즈이구요.

    데이터의 사이즈가 적은 Parts 는 Compact 타입이 되며,

    Merge Operation 이 진행되어 사이즈가 커진 Parts 는 Wide 타입이 됩니다.

    즉, Part Type 을 결정짓는 기준은 데이터의 사이즈가 됩니다.

    Compact Part Type.

    먼저 Compact 타입에 대해서 알아보겠습니다.

    Compact 타입은 Part 의 크기가 작을 때의 Part Type 입니다.

    Compact 타입의 특징은 모든 Column 들이 하나의 파일로써 관리됩니다.

    반면 Wide 타입인 경우에는 각각의 Column 마다 개별적인 파일로 관리됩니다.

    그래서 데이터의 양이 적을 때에는 모든 Column 들이 하나의 파일로써 관리되다가

    어느 순간 데이터 양이 많아지게 되면 Wide Type 으로 바뀌게 되죠.

     

    1개의 Row 추가하기.

    저의 경우에는 min_rows_for_wide_part = 100 설정은 통해서 Compact 와 Wide 의 기준을 100 개의 Row 로 설정하였습니다.

    아래의 쿼리를 통해서 1개의 Row 를 추가해보았습니다.

    INSERT INTO default.test_part_type
    select toUInt32(number) as id, toDateTime(addMinutes(toDate('2023-01-01'), `number`)) as date
    from numbers(1);

     

    그 이후에 생성된 파일들을 확인해보면 아래와 같습니다.

    참고로 파일이 생성되는 위치는 "/var/lib/clickhouse/data/default/test_part_type/202301_1_1_1" 입니다.

    checksums.txt  
    columns.txt  
    count.txt  
    data.bin  
    data.mrk3  
    default_compression_codec.txt  
    minmax_date.idx  
    partition.dat  
    primary.idx

     

    data.bin 파일이 모든 데이터 Row 들이 저장되는 파일의 이름입니다.

    모든 데이터들이 하나의 파일인 data.bin 파일에 저장되게 됩니다.

     

    99개의 Row 추가하기.

    아래의 Insert Query 를 실행하여 99개의 Row 들을 추가로 생성합니다.

    INSERT INTO default.test_part_type
    select toUInt32(number) as id, toDateTime(addMinutes(toDate('2023-01-01'), `number`)) as date
    from numbers(99);

     

    그 이후에 Parts 의 상태를 알아보겠습니다.

    아래의 결과와 같이 Row 가 1개의 Part 와 Row 가 99개인 Part 가 생성됩니다.

    그리고 둘다 Compact Type 이죠.

    SELECT partition, name, part_type, rows
    FROM system.parts
    WHERE table = 'test_part_type'
      AND active = 1
    +---------+------------+---------+----+
    |partition|name        |part_type|rows|
    +---------+------------+---------+----+
    |202301   |202301_1_1_0|Compact  |1   |
    |202301   |202301_2_2_0|Compact  |99  |
    +---------+------------+---------+----+

     

    Parts 들을 Merge 하기.

    이번에는 Optimize 문장을 통해서 두개의 Parts 들을 Merge 시켜보도록 하겠습니다.

    2개의 Parts 가 Merge 되어 하나의 Part 가 됩니다.

    그리고 이는 100개의 Row 가 되므로 min_rows_for_wide_part = 100 설정에 의해서 Wide 로 변하게 됩니다.

    optimize table test_part_type partition 202301
    +---------+------------+---------+----+
    |partition|name        |part_type|rows|
    +---------+------------+---------+----+
    |202301   |202301_1_2_1|Wide     |100 |
    +---------+------------+---------+----+

     

    Wide Part Type.

    "/var/lib/clickhouse/data/default/test_part_type/202301_1_2_1" 아래의 파일들을 조회합니다.

    생성된 파일들은 아래와 같습니다.

    주목할 점은 date.bin, id.bin 두개의 파일입니다.

    Compact Type 일 때에 존재하던 data.bin 파일은 존재하지 않습니다.

    그리고 각 Column 마다 bin 파일이 생성됩니다.

    checksums.txt  
    columns.txt  
    count.txt  
    date.bin  
    date.mrk2  
    default_compression_codec.txt  
    id.bin  
    id.mrk2  
    minmax_date.idx  
    partition.dat  
    primary.idx

     

     

    반응형
Designed by Tistory.