Как обеспечить скорость вставки 1 вставка в секунду при использовании ClickhouseIO - PullRequest
0 голосов
/ 10 марта 2020

Я использую Apache Beam Java SDK для обработки событий и записи их в базу данных Clickhouse. К счастью, есть готовый к использованию ClickhouseIO .

ClickhouseIO накапливает элементы и вставляет их в пакетном режиме, но из-за параллельного характера конвейера это все равно приводит к большому количеству вставок в секунду в моем дело. В Clickhouse я часто получаю «DB :: Exception: слишком много частей» или «DB :: Exception: слишком много одновременных запросов».

Документация Clickhouse рекомендует делать 1 вставку в секунду , Есть ли способ, которым я могу гарантировать это с ClickhouseIO? Может быть, какая-то группировка КВ до ClickhouseIO.Write или что-то еще?

1 Ответ

1 голос
/ 10 марта 2020

Похоже, вы интерпретируете эти ошибки не совсем корректно:

DB :: Exception: слишком много деталей

Это означает, что вставка влияет на большее количество разделов, чем разрешено ( по умолчанию это значение равно 100, оно управляется параметром max_partitions_per_insert_block ).

Таким образом, либо число затронутых разделов действительно велико, либо ключ PARTITION BY был определяется довольно гранулярно.

Как это исправить:

  • попытаться сгруппировать пакет INSERT таким образом, чтобы он содержал данные, относящиеся к менее чем 100 разделам
  • попытаться уменьшить размер блока вставки (если он довольно большой) - withMaxInsertBlockSize
  • увеличить ограничение max_partitions_per_insert_block в SQL -запросе (например, INSERT .. SETTINGS max_partitions_per_insert_block = 300 (я думаю, у ClickhouseIO должна быть возможность настраивать пользовательские параметры на уровне запросов)) или на стороне сервера путем изменения userprofile-settings
  • уменьшить количество одновременных запросов средствами Beam.
  • увеличить ограничение на стороне сервера в настройках userprofile или server (см. https://github.com/ClickHouse/ClickHouse/issues/7765 )
...