2016-11-14 4 views
3

나는 클릭 하우스에 이벤트 테이블 (MergeTree)이 있으며 동시에 많은 작은 삽입물을 실행하려고합니다. 그러나 서버가 과부하가되고 응답하지 않습니다. 또한 삽입물 중 일부가 손실됩니다. 클릭 하우스 오류 로그에 많은 레코드가 있습니다 :클릭 하우스에 여러 개의 작은 삽입물이 있음

01:43:01.668 [ 16 ] <Error> events (Merger): Part 201 61109_20161109_240760_266738_51 intersects previous part 

그런 쿼리를 최적화 할 수있는 방법이 있습니까? 나는 어떤 종류의 이벤트에 대량 삽입물을 사용할 수 있다는 것을 알고있다. 기본적으로 클릭 하우스가 처리하는 여러 레코드로 하나의 삽입을 실행합니다. 그러나 클릭 또는 열기와 같은 일부 이벤트는이 방법으로 처리 할 수 ​​없습니다.

다른 질문 : clickhouse가 유사한 레코드가 존재한다고 결정하는 이유는 무엇입니까? 삽입시 인덱스와 동일한 필드가있는 유사한 레코드가 있지만 다른 필드는 다릅니다.

Caused by: ru.yandex.clickhouse.except.ClickHouseUnknownException: ClickHouse exception, message: Connect to localhost:8123 [ip6-localhost/0:0:0:0:0:0:0:1] timed out, host: localhost, port: 8123; Connect to ip6-localhost:8123 [ip6-localhost/0:0:0:0:0:0:0:1] timed out 
    ... 36 more 

가 대부분 프로젝트 빌드시 clickhouse 데이터베이스에 대해 테스트

을 실행 :

는 때때로 나는 또한 다음과 같은 오류가 나타납니다.

답변

3

이는 (복제되지 않은) MergeTree에 많은 수의 작은 삽입을 처리 할 때 알려진 문제입니다.

이것은 버그이므로 조사하고 수정해야합니다.

해결 방법은 다음과 같이 큰 배치로 삽입하는 것이 좋습니다. 초당 약 1 회 : https://clickhouse.yandex/reference_en.html#Performance%20on%20data%20insertion.

+0

우리는 온 오프 기준으로 생성 된 이벤트가 있습니다. 일괄 적으로 채널에 삽입하는 것은 대기열이나 다른 임시 장소를위한 준비 영역을 만들어야한다는 것을 의미합니다. 우리가해야 할 모자입니까, 아니면 단일 행을 삽입하는 다른 권장 방법이 있습니까? 두 번째 후속 질문 : 문서에서 "성능을 향상 시키려면 여러 INSERT 쿼리를 병렬로 만들 수 있습니다 ...". 이것은 각 프로세스가 삽입되는 병렬 프로세스/스레드를 실행할 수 있다는 것을 의미합니까? 그러나 각 프로세스는 초당 하나의 배치를 병렬로 수행해야합니까? – ipolevoy

+0

예, 이벤트를 일부 대기열 또는 서비스의 in-process 버퍼에 축적하고 일괄 처리로 삽입해야합니다. – uYSIZfoz

+0

많은 INSERT를 병렬로 수행 할 수 있습니다. 초 당 하나의 배치가 모든 스레드에서 합계로 권장됩니다. – uYSIZfoz

2

초당 ~ 20 인서 트를 발생 시키므로 서버가 높은로드 밸런스, 메모리 소비 및 CPU 사용량에 도달하게 만들었지 만 비슷한 문제가 발생했습니다. 나는 메모리에 삽입을 버퍼링하는 Buffer 테이블을 생성 한 다음 주기적으로 "실제"on-disk 테이블에 플러시합니다. 그리고 마술과 마찬가지로 모든 것이 아주 잘 수행되었습니다. loadavg, 메모리 및 CPU 사용량이 정상 수준으로 떨어졌습니다. 좋은 점은 버퍼 테이블에 대해 쿼리를 실행하고 메모리와 디스크에서 일치하는 행을 다시 가져올 수 있으므로 클라이언트가 버퍼링에 영향을받지 않기 때문입니다. https://clickhouse.yandex/docs/en/table_engines/buffer.html