184 похожих чатов

Итак, следующий вопрос про переезд с одного сервера КХ на

кластер.

В standalone таблицах используется движок CollapsingMergeTree, который необходим для периодического очищения таблиц от специфического мусора. И всё работало отлично в плане схлопывания, но сейчас перевели данные на ReplicatedCollapsingMergeTree, в которые, соответственно, происходит запись через Distributed. И выясняется, что часть данных «схлопнулась», а часть — осталась. И непонятно, «схлопнутся» ли оставшиеся, и если да, то когда, а если нет, то почему…

Раньше был способ — выполнить OPTIMIZE при необходимости и радоваться жизни, но с Distributed это не работает 🤷
И как теперь быть?

34 ответов

13 просмотров

недавно был похожий вопрос, что данные не схлопываются, оказалось, что проблема была в том, что ключ шардирования был указан random, следовательно одинаковые строки попадали на разные шарды, в связи с чем они друг друга не видели чтоб доагреироваться

Тут вроде 2 проблемы. Первая это что оптимайз теперь надо запускать на replicated таблицу (если прям очень сильно надо). Вторая проблема это если ключ order by не соответствует ключу шардирования и эту проблему только что объяснили выше)

Rodion-Baskakov Автор вопроса
Zheka
недавно был похожий вопрос, что данные не схлопыва...

А не подскажете, как тогда указать правильный ключ?

Rodion Baskakov
А не подскажете, как тогда указать правильный ключ...

А вы собираетесь в будущем добавлять новые сервера/шарды?

Rodion Baskakov
А не подскажете, как тогда указать правильный ключ...

ну правильный будет тот, который строки, которые в теории должны схлопнуться будет отправлять на один и тот же шард)

Rodion Baskakov
А не подскажете, как тогда указать правильный ключ...

https://clickhouse.tech/docs/en/engines/table-engines/special/distributed/ Тут есть про sharding_key.

Rodion-Baskakov Автор вопроса
Nicolae Vartolomei
А вы собираетесь в будущем добавлять новые сервера...

Ну, это как пойдёт. В ближайшие пару лет, наверное, нет

Rodion-Baskakov Автор вопроса
Zheka
недавно был похожий вопрос, что данные не схлопыва...

Всё именно так и оказалось, спасибо за наводку… murmurHash3_64(column_name) решил проблему корректного ключа шардирования

Rodion-Baskakov Автор вопроса
Zheka
👍🏻🎉

Радость была преждевременной, оказывается: на одном наборе данных (небольшой набор, чуть более 5кк записей) всё отработало как надо, на чуть более большем (130кк) уже пару часов данные не «схлопываются». Причём с разными знаками они лежат на одном шарде (проверил, на других шардах их нет), ключ совпадает, но не схлопываются. Что это может быть и что делать?

Доагрегировать в самих запросах. По крайней мере так в документации написано. схлопывание работает в фоне и не стоит на него полагаться.

Rodion-Baskakov Автор вопроса
Vladimir Goncharov
Доагрегировать в самих запросах. По крайней мере т...

Понятно, что в фоне, вопрос лишь, в какие сроки это событие всё ж таки наступает

Rodion Baskakov
Понятно, что в фоне, вопрос лишь, в какие сроки эт...

В документации написано, что некоторые может никогда не схлопнуть

Rodion-Baskakov Автор вопроса
Vladimir Goncharov
В документации написано, что некоторые может никог...

Перечитал документацию, не нашёл такого. В случае, если разные количества и непонятный порядок состояний — да, может быть всякое. Но в случае, что все условия для свёртывания строк выполнены корректно — в документации не говорится про «никогда» 🤔

Rodion Baskakov
Перечитал документацию, не нашёл такого. В случае,...

>CollapsingMergeTree выполняет это при слиянии кусков данных. >алгоритм слияния не гарантирует, что все строки с одинаковым ключом сортировки будут находиться в одном результирующем куске данных >Если необходимо получить полностью свёрнутые данные из таблицы CollapsingMergeTree, то необходимо агрегирование. >Если вставить данные одним запросом, ClickHouse создаёт один кусок данных и никогда не будет выполнять слияние. Документация: https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/collapsingmergetree/amp/

Rodion-Baskakov Автор вопроса
Vladimir Goncharov
>CollapsingMergeTree выполняет это при слиянии кус...

Некоторые фразы вы вырвали из контекста и придали им смысл, которого авторы документации в них, как мне кажется, не вкладывали 🤷‍♂️ Никогда — это именно никогда. Но в документации говорится иное: «ClickHouse объединяет куски данных в неизвестный момент времени, который мы не можем предсказать.»

Rodion Baskakov
Некоторые фразы вы вырвали из контекста и придали ...

попробуйте optimize table ... final, оно доагрегирует даже если данные в одном парте

Rodion-Baskakov Автор вопроса
Zheka
попробуйте optimize table ... final, оно доагрегир...

Да, это сработало применительно к отдельной ReplicatedCollapsingMergeTree, но это не очень корректно, на мой взляд, бегать по нодам и искать, где лежат данные. На 5кк данных автоматическое свёртывание строк произошло через 2-3 минуты после вставки строк с отменой состояний. А вот на 130кк это не произошло и через несколько часов, хотя судя по логам КХ что-то там с этой таблицей делал, переименовывая и объединяя партиции 🤷‍♂️🤔 Ошибок в логах нет

Rodion Baskakov
Да, это сработало применительно к отдельной Replic...

ну я бы на самом деле действительно не рассчитывал на схлопывание в какой-то конкретный промежуток времени, просто доагрегировал бы сам в запросе

Rodion-Baskakov Автор вопроса
Zheka
ну я бы на самом деле действительно не рассчитывал...

Запросов прям уйму переписывать тогда придётся 🤦‍♂️ Целый проект. Хочется как-то малой кровью обойтись.

Rodion Baskakov
Запросов прям уйму переписывать тогда придётся 🤦‍♂...

сделать вью или промежуточную таблицу и пусть запросы ссылаются на неё?

Rodion-Baskakov Автор вопроса
Zheka
сделать вью или промежуточную таблицу и пусть запр...

Как компромиссное решение — очень даже неплохая идея 👍 Спасибо 🙏

Rodion-Baskakov Автор вопроса
Zheka
ну я бы на самом деле действительно не рассчитывал...

И, к слову, на какой-то конкретный момент и не рассчитывали. Но интересовал предел ожидания. Например, автоматическое свёртывание строк в течение часа вполне устроило бы. А несколько часов — это прям перебор.

Rodion Baskakov
И, к слову, на какой-то конкретный момент и не рас...

ну я для себя сделал вывод из написанного в доке, что всё-таки не стоит рассчитывать хоть на какой-то промежуток времени, лучше сразу предусмотреть механизм доагрегировать/схлопывать самому

Zheka
сделать вью или промежуточную таблицу и пусть запр...

у вьюх там прямо магия какая-то под капотом происходит в отношении прокидывания параметров

Dmitry K
у вьюх там прямо магия какая-то под капотом происх...

не совсем понял 🤔 зачем туда какие-то параметры прокидывать? я имел в виду, что можно написать код для обычной вьюхи на ту таблицу, что используется для "уймы запросов", тогда просто в них нужно будет подменить таблицу на вьюху 🤷‍♂️

Dmitry K
у вьюх там прямо магия какая-то под капотом происх...

ну или сделать таблицу, которая каждый раз будет пересчитываться досхлопывая строки и тогда подменить во всех запросах обращение к изначальной таблице на эту промежуточную

Rodion Baskakov
Некоторые фразы вы вырвали из контекста и придали ...

В последней моей цитате как раз было "никогда". Но вы видимо иначе прочитали документацию и для вас это означает "в течение часа или около того". Ну ок. Вам виднее. У меня встречались несхлопнуье строки, которые никогда не схлопывались, я прочитал документацию. Всё сошлось. При чём это поведение логично и встречается в других аггрегирующих движках. Сворачивание происходит только при слиянии кусков. Если слияния кусков не происходит, то сворачивания нет. Куски не сливаются в бесконечном цикле в один мега кусок.

Zheka
не совсем понял 🤔 зачем туда какие-то параметры пр...

Я про то что если вью это просто view as select.. from с аггрегацией, то запросы вида select.. from view where... будут хорошо оптимизированы. Если вью это view as select ... from (select...from) То запросы вида select.. from where будут работать возможно не так как ожидалось) а если там где то внутри ещё и джоин не дай бог..

Dmitry K
Я про то что если вью это просто view as select.. ...

понял) в целом — согласен, но проверять подход это "уже совсем другая история", конечно нужно смотреть что за запросы, пробовать варианты, сверять скорость и т.д. и т.п.)

Rodion-Baskakov Автор вопроса
Vladimir Goncharov
В последней моей цитате как раз было "никогда". Но...

Я вам в одном из своих ответов писал дословно следующее: «в случае, что все условия для свёртывания строк выполнены корректно — в документации не говорится про «никогда» 🤷‍♂️ Понимаете разницу? Странная дискуссия. Я говорю о том, что есть таблица с данными, куда залили строки с отменой состояний, но свёртывание не сработало, как заявлено в документации, в ответ на что вы говорите о других сценариях

Rodion Baskakov
Я вам в одном из своих ответов писал дословно след...

>ClickHouse объединяет куски данных в неизвестный момент времени, который мы не можем предсказать. Ваша же цитата. Я читаю её как "слияние может быть моментальным или вообще никогда". Если вы читаете её как "час-день", то ок, нужно просто уточнить у разработчиков. Но проблема я так понимаю всё таки есть и решать её надо. Самый простой способ - это добавить в запрос FULL, чтобы не переписывать все запросы на аггрегацию. Или если данных всего несколько лямов, то переименовать таблицу и создать вьюху с аггрегацией со старым именем.

Rodion Baskakov
Я вам в одном из своих ответов писал дословно след...

а вот и ответ от саппорта яндекса. https://t.me/clickhouse_ru/87554

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта