ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ClickHouse] min_insert_block_size_rows 설정 알아보기
    Database/Clickhouse 2024. 6. 2. 07:21
    728x90
    반응형

    - 목차

     

    들어가며.

    ClickHouseMergeTree 엔진을 통해 데이터를 효율적으로 관리합니다.

    MergeTree 엔진은 데이터를 part 라는 단위로 관리하며, 각 part 는 데이터의 정렬된 블록을 포함합니다.

    min_insert_block_size_rows 는 데이터 삽입(INSERT) 시 디스크로 데이터를 플러시(Flush)하는 기준이 되는 최소 행(row) 크기를 정의하는 중요한 설정입니다.

     

    min_insert_block_size_rows 설정은 클라이언트가 INSERT 쿼리를 실행할 때, 디스크로 데이터를 플러시(Flush)하기 위한 최소 행(Row) 수를 정의하는 기준입니다.

    예를 들어, min_insert_block_size_rows 값이 10으로 설정되어 있고, 클라이언트가 100개의 행을 INSERT하면, 총 10번의 플러시가 발생하며 10개의 part가 생성되는 구조를 취합니다.

     

     

    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

     

     

    min_insert_block_size_rows 란 ?

    min_insert_block_size_rows 는 INSERT 작업에서 디스크로 플러시(Flush)할 수 있는 최소 행(Row) 수를 정의합니다.

    기본값은 1,048,449 rows 로 설정되어 있으며, ClickHouse 의 버전에 따라 다를 수 있습니다.

    이 설정은 배치(Batch) INSERT 쿼리에서만 동작하며, 단일 INSERT 쿼리 실행 시에는 설정값과 상관없이 즉시 플러시되어 Part 파일이 생성됩니다.

     

    현재 설정된 min_insert_block_size_rows 값을 확인하려면 system.settings 테이블을 조회하면 됩니다.

    select name, value from system.settings 
    where name = 'min_insert_block_size_rows';

     

     

    Single Insert Query 에서 min_insert_block_size_rows 의 동작.

    이제 실제 예시를 통해 min_insert_block_size_rows 설정에 대해 알아보겠습니다.

    실습은 Docker 환경에서 진행합니다.

     

    아래의 명령어를 통해서 ClickHouse Docker Container 를 실행합니다.

     

    docker run -d --platform linux/amd64 \
    --name clickhouse-server \
    clickhouse:24.9.3

     

     

    아래의 SQL 쿼리들을 통해서 MergeTree Table 을 생성하고 Single Insert Query 를 3회 실행합니다.

     

    CREATE TABLE test_single_insert (
        id UInt64,
        event_type String,
        timestamp DateTime
    )
    ENGINE = MergeTree()
    PARTITION BY toYYYYMMDD(timestamp)
    ORDER BY id;
    
    INSERT INTO test_single_insert VALUES (1, 'click', now());
    INSERT INTO test_single_insert VALUES (2, 'view', now());
    INSERT INTO test_single_insert VALUES (3, 'purchase', now());

     

    참고로 Part 파일들은 /var/lib/clickhouse/data/default/test_single_insert 디렉토리 하위에 생성됩니다.

    총 3개의 part 가 생성된 것을 확인할 수 있습니다.

    즉, Single Insert Query 에 대해서 개별 쿼리 당 part 가 생성됩니다.

    ls -a1 /var/lib/clickhouse/data/default/test_single_insert/

     

     

     

    Batch Insert Query 와 min_insert_block_size_rows 의 동작.

     

    min_insert_block_size_rows 설정은 Batch Insert Query 에서 동작되도록 설계되어 있습니다.

    Batch Insert Query 의 Rows 수가 min_insert_block_size_rows 보다 작은 경우에는 Single Insert Query 와 마찬가지로 즉시 Flush 되어 Part 가 생성됩니다.

     

    아래는 즉시 Flush 되는 Batch Insert Query 의 예시입니다.

    min_insert_block_size_rows 의 설정값이 1,048,449 rows 이기 때문에 1,000,000 의 Rows 를 Insert 하는 예시입니다.

    이러한 경우에는 1개의 Part 만이 생성되게 됩니다.

     

    CREATE TABLE test_batch_insert (
        id UInt64,
        event_type String,
        timestamp DateTime
    )
    ENGINE = MergeTree()
    PARTITION BY toYYYYMMDD(timestamp)
    ORDER BY id;
    
    INSERT INTO test_batch_insert
    SELECT
        number AS id,
        IF(number % 3 = 0, 'click', IF(number % 3 = 1, 'view', 'purchase')) AS event_type,
        now() - INTERVAL (number % 10000) SECOND AS created_at
    FROM numbers(1000000);

     

     

    이번에는 min_insert_block_size_rows 보다 많은 수의 Rows 를 Insert 해보도록 하겠습니다.

    min_insert_block_size_rows 의 10배에 해당하는 10,485,760 만큼 Batch Insert 를 수행하며, 기대하는 Part 의 갯수는 10개입니다.

    INSERT INTO test_batch_insert
    SELECT
        number AS id,
        IF(number % 3 = 0, 'click', IF(number % 3 = 1, 'view', 'purchase')) AS event_type,
        now() - INTERVAL (number % 10000) SECOND AS created_at
    FROM numbers(10485760);

     

    위 이미지처럼 예상했던 10개의 part가 생성된 것이 아니라, 총 11개의 part 가 생성되었습니다.

    그중 20231101_1_6_1 이라는 part는 1번부터 6번까지의 블록(Block)병합(Merge)한 결과로 생성된 새로운 part입니다.

    따라서:

    • 1번부터 10번까지의 part는 개별적으로 생성되었고,
    • Background Merge Compaction 작업을 통해 추가적으로 1개의 병합된 part가 생성된 상태입니다.

    결과적으로, 총 11개의 part 가 존재하게 되었습니다.

     

    정리하자면, 매우 큰 Batch Insert Query에서만 min_insert_block_size_rows 설정이 적용되며,

    이 설정값에 따라 데이터를 분할하여 part 를 생성합니다.

     

    반응형
Designed by Tistory.