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

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

кластер.

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

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

34 ответов

7 просмотров

недавно был похожий вопрос, что данные не схлопываются, оказалось, что проблема была в том, что ключ шардирования был указан 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

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

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

А чем вам питонисты не угодили?😂
.
79
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Привет, запускаю werf в dind в k8s, получаю ошибку на этапе build/beforeSetup: /.werf/stapel/embedded/bin/bash: /.werf/scripts/5898bdfe5214357d3706b879cc8d3d78460fb379607cbd...
florius0
7
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Dim Dim, [02.07.2024 11:07] DB 0x62 Dim Dim, [02.07.2024 11:07] DB 0x66 Dim Dim, [02.07.2024 11:07] кто пояснит что это?
Dim Dim
14
Ошибка: segmentation fault (core dumped) Код: pastebin.com/BEsNNSSV Сообщение от компилятора: отсутствует ОС: Arch Linux Ядро: x86_64 Linux 6.9.7-arch1-1 Процессор: Intel Cele...
sec
4
Ребят, а за скок можно впарить анон чат с апишкой и веб админкой ?
Eugene Неелов
15
Добрый день, чат. Мне в очередь из других RabbitMQ по shovel валятся метрики в формате текста для Prometheus. Помогите пожалуйста подружить RabbitMQ и Prometheus, чтобы он (...
Aleksey
4
@ahndmn @ayaw0_0 здарова, на чем пишете?
Aiwan \ (•◡•) / _bot
7
Кстати, я тут еще с одной темой столкнулся, вот учу я C++, на таком то ресурсе, а остальные постоянно советуют практиковаться, что то писать, проекты, но как писать если вот т...
aaswq1
7
Карта сайта