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

Добрый день! Вопрос по оптимальному применению clickhouse Есть проект, данные с

определённой периодичностью добавляются, а так же изменяются (сортировка по категориям, рассчёты на основе сырых данных), так же выполняются большие SELECT запросы для построения отчётов . Сейчас хранение данных организованно на PostgreSQL, но с увеличением количества данных увеличилось и время обработки 1 запроса.

При поиске более быстрого решения выбор пал на clickhouse(причина выбора в названии чата собственно описана очень лаконично). Но однако, встал вопрос обновления данных, насколько я понял привычного обновления данных в clickhouse нет, и прочтя доки пришёл к выводу, что есть 2 пути:
1. VersionedCollapsingMergeTree (изменения состояний объекта)
Эта штука подходит для точечного изменения и имеет недостаток в том что при построении запросов для сбора статистики надо будет указывать фильтры чтобы туда не попал левый sign
2. мутации ALTER UPDATE
Эта штука вроде как могёт в обновлении пачками, но во первых пугает вот эта строчка из документации: "Но после применения первой мутации формат данных таблицы становится несовместимым с предыдущими версиями и откатиться на предыдущую версию уже не получится." и вот этот "При этом атомарности нет — куски заменяются на помутированные по мере выполнения и запрос SELECT, заданный во время выполнения мутации, увидит данные как из измененных кусков, так и из кусков, которые еще не были изменены."


Собственно вопросы:
1. Правильно ли я всё понял и это действительно только 2 возможных варианта обновления?
2. Если я не прав, то какие есть варианты помимо?

17 ответов

19 просмотров

даже не пробуйте второй вариант, убьете диски и не получите что хотите CollapsingMergeTree + SELECT ... FINAL вполне себе работает

1. Ещё есть ReplacingMergeTree если удалять не надо, только обновлять

Михаил-Явруян Автор вопроса
Slach [altinity]
даже не пробуйте второй вариант, убьете диски и не...

Даже если есть потребность обновлять данные не точечно, а пачками?

Михаил-Явруян Автор вопроса
Ivan Kalinin
1. Ещё есть ReplacingMergeTree если удалять не над...

А можно подробнее как именно обновлять записи используя этот движок?

Михаил Явруян
Даже если есть потребность обновлять данные не точ...

CollapsingMergeTree в целом пофигу сколько вы обновляете на самом деле вы просто пишете UPDATE как DELETE (sign -1 / old values) + INSERT (sign +1 new values) и дальше всю работу делает SELECT ... FINAL и background merges когда данные из двух кусков сливаются. то что имеет одинаковые значения ORDER BY ... но разные sign -1и +1 просто схлапывается и не пишется в новый кусок..

Михаил Явруян
А можно подробнее как именно обновлять записи испо...

Точно так же как VersionedCollapsing, только sign не надо. По ключу сортировки + поле с версией

Михаил-Явруян Автор вопроса
Slach [altinity]
CollapsingMergeTree в целом пофигу сколько вы обно...

Это примерно понятно, при обновлении получается так, что я запишу ещё раз страую версию строки, и новую. Но при этом старой версии дам sign -1 и когда нибудь оно схлопнется с новой.

Роман Болдырев
А почему может быть проблема с дисками?

потому что мутация полностью переписывает выбранные парты применяя к ним мутацию....

Slach [altinity]
потому что мутация полностью переписывает выбранны...

Все это читал, но все равно не очевидно при чем здесь ресурс дисков?

Роман Болдырев
Все это читал, но все равно не очевидно при чем зд...

ну посчитайте у вас два парта по 10 гигайбайт вам нужно применить миграцию вам нужно прочитать 2*10 гигабайт и потом записать 2*10 гигабайт итого 40 гигов i/o ок. теперь посчитайте что вам надо это сделать 100 раз в секунду (ну или как вы там собрались часто мутации запускать) короче мутации не выход поймите что у clickhouse eventual consistency by design и в соответсвии с этим действуйте

Slach [altinity]
ну посчитайте у вас два парта по 10 гигайбайт вам ...

Я вас понял, примерно так и предполагал, но хотел услышать точный ответ - 100 раз в секунду по 20Гб конечно не вариант), но если проводить мутации по расписанию раз в 10минут\час\день, и например изменения затрагивают не все парты, то возможно этот подход будет работать?

Роман Болдырев
Я вас понял, примерно так и предполагал, но хотел ...

будет. как вам уже сказали, но в момент SELECT, часть партов изменена, часть нет... получаете то что получаете... materialized view + aggregatedmergetree или projection будет быстрее

Slach [altinity]
будет. как вам уже сказали, но в момент SELECT, ча...

Я просто сейчас пробую схему с мутациями, при этом новым данным, до проведения мутации я ставлю признак что они еще не актуальны. В процессе мутации признак изменяю на актуальный, а старые записи помечаю на удаление. Промежуток мутаций не чаще чем раз в 10-30 минут, и в любой момент времени данные консистентны - поскольку новые хоть и записаны, но до обработки в запросах не фигурируют, а старые данные пока не переведены на удаление.

Роман Болдырев
Я просто сейчас пробую схему с мутациями, при этом...

ну посмотрите в system.part_log чтобы оценить сколько там читается и пишется по вашим мутациям

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта