-
[ClickHouse] Compact Wide Parts 알아보기 ( part_type )Database/Clickhouse 2024. 1. 16. 21:17728x90반응형
- 목차
들어가며.
이번 글에서는 ClickHouse MergeTree 의 part_type 에 대해서 알아보려고 합니다.
먼저 Parts 에 대한 자세한 설명은 아래 링크로 대신하도록 하겠습니다.
https://westlife0615.tistory.com/737
https://westlife0615.tistory.com/565
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 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
반응형'Database > Clickhouse' 카테고리의 다른 글
[ClickHouse] Multi Sharding 구현하기 ( Docker, Shards ) (0) 2024.02.17 [Clickhouse] Shard & Replica Cluster 구성하기 (0) 2024.02.14 [ClickHouse] Block 알아보기 (0) 2024.01.10 ClickHouse MergeTree 알아보기 (0) 2023.11.07 [ClickHouse] 사용자 추가 및 설정하기 ( user.xml ) (0) 2023.09.27