ClickHouse - CollapsingMergeTree Table Engine - записи не объединяются, даже если они имеют одинаковые значения столбцов и разные знаки (+ 1 / -1) - PullRequest
0 голосов
/ 27 февраля 2020

У нас есть ClickHouse стол с CollapsingMergeTree двигателем. Мы хотим обновить записи как и когда данные импортируются из источника (может быть частым). Изначально все записи вставляются с колонкой +1. Чтобы обновить запись, мы вставляем обновляемую запись с теми же значениями со знаком -1, а затем вставляем обновленную запись со знаком +1, ожидая, что те же записи с противоположными знаками будут свернуты на ClickHouse, когда части данных объединены в фоновом режиме.

Проблема в «Этого никогда не случится»

Мне известно о том, что ClickHouse будет объединять данные асинхронно, но прошло несколько месяцев, и никакое объединение не выполняется ClickHouse.

Я запросил SELECT * FROM system.merges, чтобы узнать, происходит ли какое-либо слияние. Результат запроса был 0. Также обновлено ClickHouse до последней версии. Но не повезло!

Оценил бы вашу помощь, если бы кто-нибудь мог указать, в чем проблема? Я пропускаю какие-либо настройки уровня сервера? Когда ClickHouse объединяет такие записи?

Или любой другой подход, который я должен использовать для обновления ClickHouse данных?

1 Ответ

0 голосов
/ 27 февраля 2020

в конце концов - может быть никогда. Вы не должны полагаться на процесс слияния. Он имеет собственный сложный алгоритм для балансировки количества деталей. У слияния нет цели сделать окончательное слияние - сделать 1 часть, потому что она неэффективна.

optimize делает / форсирует незапланированное слияние, и вы получите, например, 4 части из 22 optimize final делает / форсирует внеплановые слияния для всех частей, пока только одна часть в разделе Единственная проблема с final в том, что он переписывает даже 1 часть в новую 1 часть. Потому что иногда нужно было свернуть строки над одной частью. Таким образом, для некоторых таблиц мы выполняем оптимизацию таблицы x разделом final (по crond) для разделов, которые имеют более одной части.

select  concat('optimize table ',database, '.','\`', table, '\` partition ',  ((groupUniqArray(partition)) as partition_count)[1], ' final')
    from system.parts
    where (database = 'xxx' or database like 'zzzz\_%') and (database,table) in (select database, table from system.replicas where engine='ReplicatedReplacingMergeTree' and is_leader)
          and table not like '.inner%' 
    group by database,table having   length(partition_count)>1 and sum(rows) < 5000000

{ ссылка }

...