티스토리 뷰
더보기
사용이유 : 동기 삽입으로 인한 I/O 절약 하기 위함
Clickhouse 에서 Async Insert 설정을 사용하게되면, Clickhouse가 서버측에서 일괄로 처리 할 수 있습니다.
Clickhouse의 기본 설정은 동기식으로 작동하게 됩니다. 아래 그림은 async_insert = 0 이 상태, 기본 설정입니다.
기본 설정을 이용하게 되면, Insert statements가 작동함에 따라 동기적으로 처리가 됩니다.
아래 설정은 async_insert설정을 사용하는 방식입니다.
async_insert =1 으로 설정하게 되면 async_insert를 활성화 한다는 뜻입니다. ClickHouse는 정기적으로 디스크에 플러시하기 전에 먼저 들어오는 삽입을 메모리 내 버퍼에 저장합니다.
wait_for_async_insert 설정은 비동기 삽입이 완료될 때까지 클라이언트가 기다릴지 여부를 결정합니다.
async_insert를 활성화하면 데이터 삽입이 비동기적으로 처리되지만, 클라이언트는 기본적으로 삽입 작업이 완료될 때까지 기다리지 않습니다. wait_for_async_insert를 설정하면 클라이언트가 비동기 삽입 작업이 완료될 때까지 기다리게 됩니다.
ClickHouse에 데이터를 대규모 배치로 삽입
- 장점 : 컴퓨팅 주기와 디스크 I/O가 절약되므로 비용이 절약
- async_insert 설정 활성화 → 클라이언트 측에서 데이터 일괄 처리
- Clickhouse는 동기식으로 데이터를 씀.
- Async Insert사용시 쿼리 자동 중복 제거 - 비활성화됨
실제 사용법
- 쿼리단에서 사용
ALTER USER default SETTINGS async_insert = 1
- 삽입쿼리
INSERT INTO YourTable SETTINGS async_insert=1, wait_for_async_insert=1 VALUES (...)
- Table Alter 하기
ALTER TABLE YourTable MODIFY SETTING async_insert = 1;
- jdbc설정에서 파라미터로 처리
"jdbc:ch://HOST.clickhouse.
cloud:8443/?user=default&password=PASSWORD&ssl=true&custom_http_params=async_insert=1,wait_for_async_insert=1"
오류 처리
Too many partitions for single INSERT block (more than 100). The limit is controlled by 'max_partitions_per_insert_block' setting
- Insert 대량으로 들어오는 경우 에러 발생
com.clickhouse.client.ClickHouseException: Code: 252. DB::Exception: Too many partitions for single INSERT block (more than 100). The limit is controlled by 'max_partitions_per_insert_block' setting. Large number of partitions is a common misconception. It will lead to severe negative performance impact, including slow server startup, slow INSERT queries and slow SELECT queries. Recommended total number of partitions for a table is under 1000..10000. Please note, that partitioning is not intended to speed up SELECT queries (ORDER BY key is sufficient to make range queries fast). Partitions are intended for data manipulation (DROP PARTITION, etc).: While executing WaitForAsyncInsert. (TOO_MANY_PARTS) (version 23.5.4.25 (official build))
, server ClickHouseNode [uri=http://10.???.1.53:????/default]@1254192771
at com.clickhouse.client.ClickHouseException.of(ClickHouseException.java:168)
at com.clickhouse.client.AbstractClient.lambda$execute$0(AbstractClient.java:291)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
해결방법
- 'max_partitions_per_insert_block' 설정값 조정 - 1000이상으로 조정 필요
- max_partitions_per_insert_block ?
- 단일 INSERT 블록이 처리할 수 있는 최대 파티션 수를 제한하는 설정
- 한 번에 너무 많은 파티션을 처리하는 것을 방지하여 성능 문제를 예방하기 위해 사용
- 너무 큰 값으로 설정하면 성능 저하나 다른 문제가 발생
- max_partitions_per_insert_block 설정값 조정
-
SET max_partitions_per_insert_block = 200; -- 원하는 값으로 조정
-
- max_partitions_per_insert_block ?
- 데이터 삽입 시 파티션 수 줄이기
한 번에 삽입하는 데이터의 파티션 수를 줄여야함.