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

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

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

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


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

17 ответов

13 просмотров

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

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
Кибер Бомж
8
Карта сайта