- 01 May 2022 (54 messages)
-
⚡️ Продаю СОФТ для рассылки в чаты ⚡️
🧨 Софт просто - огонь🧨
- Если вы хотите предложить вашу услугу/товар/продукт на большую аудиторию, то вам обязательно нужен данный софт!
- За сутки может отправить более 100.000 смс.
💰 Цена данного софта = 6000 рос.руб.
🔻 Так же в продаже есть софт для рассылки в ЛС.
🔻Софт для инвайта.
🔻Софт для автоматической подписки на чаты.
🔻Парсер. -
/stat@combot
-
-
Аукцион открыт)
-
Удаляем сообщения, контекст удален
-
Бесплатно?
-
/stat@combot
-
/stat@combot
-
-
Всем привет!
Нужна ваша помощь
Импорт данных реализован через http api
?query=INSERT%20INTO%20imported_table%20FORMAT%20CSV' --data-binary @file.csv
Есть ошибка при импорте данных через http api:
(CANNOT_PARSE_INPUT_ASSERTION_FAILED) (version 22.1.3.7 (official build))
: While executing ParallelParsingBlockInputFormat: (at row 172)
. (CANNOT_PARSE_INPUT_ASSERTION_FAILED) (version 22.1.3.7 (official build))
Есть задача, пока нет возможности поправить скрипт, игнорировать такие строки и ошибки, но загружать при этом остальные корректные строки
input_format_allow_errors_num и input_format_skip_unknown_fields=1 не помогают
Подскажите, пожалуйста, как можно решить данную проблему? -
Коллеги, доброй ночи. Бахнул вчера вечером в таблицу почти 2 млрд записей. В таблице 2 скип индекса. С момента заливки данных прошли почти сутки, бд до сих пор оклематься не может. Запросы по первичному индексу выполняются минут по 5. Хотя он и выводит мне результат быстро, но запрос не прекращается. Подскажите пожалуйста в чём проблема? Это фоном так индексы просчитываются новые и пересортировка таблицы по первичному происходит?
И заодно, подскажите, кто знает. Как понять, что переиндексирование таблицы закончено? -
Что значит "выводит мне результат быстро, но запрос не прекращается"? Это datagrip? Покажите ddl и запрос
-
нет никакого фоном. Все индексы ВСЕГДА построены окончательно по завершению инсерта
-
это обычный консольный клиент кликхауса, в терминале
-
В фоновом режиме ClickHouse выполняет слияния кусков данных для более эффективного хранения. Я вот это скорее имел в виду. Не влияет ли этот процесс
-
типа лексиграфическая пересортировка по первичному ключу
-
99% мержей случились в момент инсерта, оставшийся 1% ни на что не влияет и закончился минут через 5 после последнего инсерта
-
нету никаких пересортировок, не надо фантазировать
-
-
-
фантазеры. Вторичные индексы в куске могут быть могут не быть. При инсерте они создаются в куске и готовы еще до того как инсерт вернет управление.
-
если вторичных индексов в парте нет, их можно достроить мутацией materialize index
-
мержи создают индексы естественным образом, так же как и инсерт
-
Не понял, почему фантазеры, я просто указал на то, что не нашёл инфу про инсерт (без мержей) касательно skip index и стало интересно. Спасибо.
-
запрос по первичному индексу select * ? сколько времени выполняется select count()
-
т.е. хотите сказать, что сортировка в лексиграфическом порядке происходит в момент инсерта?
-
да
-
да, по первичному. count выдаётся мгновенно
-
короче ваша проблема вообще никак не связана с инсертами, мержами, индексами
-
в таком случае мне нужно ещё раз перечитать документацию)
-
как тогда можно объяснить ситуацию, когда при 500млн записей поиск по первичному индексу отрабатывает менее, чем за секунду, а при 2млрд - 5 минут?
-
это вот реальный мой случай сейчас
-
я знаю 48 обяснений, как-то не хочентся проверять все.
джойн есть? аггрегация? сортировка?
покажите explain estimate ваш_select
и
set send_logs_level='trcace';
ваш_select ... format Null; -
ни джойнов, ни агрегаций, ни сортировок.
`
explain estimate select * from metrics prewhere pkey like 'xxxx%' limit 100;
EXPLAIN ESTIMATE
SELECT *
FROM metrics
PREWHERE pkey LIKE 'xxxx%'
LIMIT 100
Query id: e8170490-ddef-41fc-9050-344fb2b97195
┌─database─┬─table──────────┬─parts─┬───rows─┬─marks─┐
│ xxxx │ metrics │ 7 │ 443466 │ 13859 │
└──────────┴────────────────┴───────┴────────┴───────┘
` -
обычный селект строки по маске на значение колонки
-
а через 5 минут завершается запрос? сколько GB processed (Processed 100.00 thousand rows, 800.00 KB) ?
а таблица distributed? -
сейчас повторю запрос, отпишусь
-
100 rows in set. Elapsed: 217.031 sec. Processed 56.17 thousand rows, 12.89 MB (258.83 rows/s., 59.40 KB/s.)
-
одна таблица, на одной ноде
-
без шардингов и всяких распределений
-
а сколько памяти у сервера?
-
32GB
-
С системой точно все в порядке? atop где-нибудь красное показывает?
-
set send_logs_level='trace';
ваш_select ... format Null; -
-
[node100] 2022.05.02 00:31:38.197893 [ 1815704 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> executeQuery: (from [::1]:43426, user: xxxxx) select * from metrics prewhere pkey like 'qwerty%' limit 1 format Null;
[node100] 2022.05.02 00:31:38.198891 [ 1815704 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> ContextAccess (xxxxx): Access granted
[node100] 2022.05.02 00:31:38.199099 [ 1815704 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> InterpreterSelectQuery: FetchColumns -> Complete
[node100] 2022.05.02 00:31:38.199511 [ 1815704 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Key condition: (column 0 in ['qwerty', 'qwertz'))
[node100] 2022.05.02 00:31:38.199676 [ 1815704 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): MinMax index condition: unknown
[node100] 2022.05.02 00:31:38.200207 [ 1815872 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Running binary search on index range for part 202204_1234_1413_3 (6211981 marks)
[node100] 2022.05.02 00:31:38.200218 [ 1815735 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Running binary search on index range for part 202204_1594_1809_3 (7454370 marks)
[node100] 2022.05.02 00:31:38.200249 [ 1815875 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Running binary search on index range for part 202204_2172_2172_0 (10789 marks)
[node100] 2022.05.02 00:31:38.200280 [ 1815876 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Running binary search on index range for part 202204_1990_2171_3 (6281093 marks)
[node100] 2022.05.02 00:31:38.200251 [ 1815756 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Running binary search on index range for part 202204_1810_1989_3 (6212000 marks)
[node100] 2022.05.02 00:31:38.200257 [ 1815778 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Running binary search on index range for part 202204_1414_1593_3 (6211952 marks)
[node100] 2022.05.02 00:31:38.200250 [ 1815873 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Running binary search on index range for part 202204_1_1233_4_556 (41194922 marks)
[node100] 2022.05.02 00:31:38.203963 [ 1815756 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found (LEFT) boundary mark: 4696744
[node100] 2022.05.02 00:31:38.204023 [ 1815778 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found (LEFT) boundary mark: 4698362
[node100] 2022.05.02 00:31:38.204060 [ 1815756 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found (RIGHT) boundary mark: 4697987
[node100] 2022.05.02 00:31:38.204074 [ 1815778 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found (RIGHT) boundary mark: 4699620
[node100] 2022.05.02 00:31:38.204061 [ 1815735 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found (LEFT) boundary mark: 5636864
[node100] 2022.05.02 00:31:38.204110 [ 1815876 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found (LEFT) boundary mark: 4749799
[node100] 2022.05.02 00:31:38.204137 [ 1815778 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found continuous range in 43 steps -
[node100] 2022.05.02 00:31:38.204183 [ 1815735 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found (RIGHT) boundary mark: 5638366
[node100] 2022.05.02 00:31:38.204099 [ 1815873 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found (LEFT) boundary mark: 31012529
[node100] 2022.05.02 00:31:38.204049 [ 1815872 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found (LEFT) boundary mark: 4697244
[node100] 2022.05.02 00:31:38.204238 [ 1815735 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found continuous range in 44 steps
[node100] 2022.05.02 00:31:38.204293 [ 1815872 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found (RIGHT) boundary mark: 4698518
[node100] 2022.05.02 00:31:38.204118 [ 1815756 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found continuous range in 43 steps
[node100] 2022.05.02 00:31:38.204329 [ 1815872 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found continuous range in 43 steps
[node100] 2022.05.02 00:31:38.204185 [ 1815876 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found (RIGHT) boundary mark: 4751062
[node100] 2022.05.02 00:31:38.204290 [ 1815873 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found (RIGHT) boundary mark: 31019841
[node100] 2022.05.02 00:31:38.204370 [ 1815876 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found continuous range in 42 steps
[node100] 2022.05.02 00:31:38.204090 [ 1815875 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found (LEFT) boundary mark: 8426
[node100] 2022.05.02 00:31:38.204405 [ 1815873 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found continuous range in 49 steps
[node100] 2022.05.02 00:31:38.204429 [ 1815875 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found (RIGHT) boundary mark: 8433
[node100] 2022.05.02 00:31:38.204473 [ 1815875 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Trace> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Found continuous range in 25 steps
[node100] 2022.05.02 00:31:38.204837 [ 1815704 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Selected 7/7 parts by partition key, 7 parts by primary key, 13859/73577100 marks by primary key, 13859 marks to read from 7 ranges
[node100] 2022.05.02 00:31:38.205300 [ 1815704 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> xxxxx.metrics (6fbdae6b-2c89-4e36-afbd-ae6b2c890e36) (SelectExecutor): Reading approx. 443466 rows with 7 streams
[node100] 2022.05.02 00:31:38.207100 [ 1815814 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 4.47 GiB.
[node100] 2022.05.02 00:31:38.386467 [ 1815756 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 5.05 GiB.
[node100] 2022.05.02 00:31:49.494361 [ 1815872 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 6.04 GiB.
[node100] 2022.05.02 00:32:01.134631 [ 1815735 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 7.06 GiB. -
[node100] 2022.05.02 00:32:12.740096 [ 1815876 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 8.04 GiB.
[node100] 2022.05.02 00:32:21.187334 [ 1815814 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 9.51 GiB.
[node100] 2022.05.02 00:32:34.376382 [ 1815876 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 10.02 GiB.
[node100] 2022.05.02 00:32:51.201379 [ 1815872 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 11.06 GiB.
[node100] 2022.05.02 00:33:00.838116 [ 1815814 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 12.53 GiB.
[node100] 2022.05.02 00:33:08.955138 [ 1815876 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 13.04 GiB.
[node100] 2022.05.02 00:33:35.506902 [ 1815814 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 15.53 GiB.
[node100] 2022.05.02 00:33:45.078600 [ 1815814 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 16.16 GiB.
[node100] 2022.05.02 00:34:03.399894 [ 1815814 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 17.38 GiB.
[node100] 2022.05.02 00:34:22.298660 [ 1815814 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 18.58 GiB.
[node100] 2022.05.02 00:34:31.463592 [ 1815814 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 19.18 GiB.
[node100] 2022.05.02 00:34:50.458226 [ 1815814 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 20.42 GiB.
[node100] 2022.05.02 00:34:59.513516 [ 1815814 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 21.07 GiB.
[node100] 2022.05.02 00:35:22.843898 [ 1815814 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Current memory usage (total): 22.31 GiB.
[node100] 2022.05.02 00:35:41.327850 [ 1815704 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Information> executeQuery: Read 56174 rows, 12.29 MiB in 243.129815155 sec., 231 rows/sec., 51.78 KiB/sec.
[node100] 2022.05.02 00:35:41.327927 [ 1815704 ] {737c871c-9609-4e31-8cc4-0cfcd07eaea6} <Debug> MemoryTracker: Peak memory usage (for query): 28.43 MiB.
Ok.
0 rows in set. Elapsed: 243.131 sec. Processed 56.17 thousand rows, 12.89 MB (231.04 rows/s., 53.02 KB/s.) -
а сколько колонок в таблице?
а если order by добавить тоже самое?
SELECT *
FROM metrics
PREWHERE pkey LIKE 'xxxx%'
order by pkey
LIMIT 100 -
Колонок в таблице 15. Ордер бай лучше не сделает, проверял(
-
Какой нибудь вердикт вынести можете?) В каком хотя бы направлении мне дальше копать? И спасибо, что в час ночи помогаете решить проблему)
-
а что если колонки добавлять по одной, вместо * , на какой колонке тормозит?
либо баг в КХ и надо проверять на старой версии 21.8.15, потому что непонятно накой он память выделяет и в конце пишет Peak memory usage (for query): 28.43 MiB
либо диск тормозит и кусок файлов медленно читается ( я бы смотрел sudo dmesg |tail )
хотя врядли диск, такой объем закешировался бы уже. -
Кстати перебирать колонки не пробовал, надо бы проверить)
По поводу диска - посмотрю. Не исключаю, что дело и в нём.
Проверю всё уже завтра. Спасибо!) -
Диск действительно по iops перегружен, но запрос маленький, должен из кеша обслуживаться (15Гб рам в кеше). Я б убедился бы что вся нагрузка идёт от кх (iotop), что кх выполняет только один запрос (а то вдруг какая-нибудь тулза раз в секунду отправляет запрос, который 20 выполняется и там очередь в 20+ запросов дружно грузят диск). И если действительно кх в монопольном режиме так нагрузил шпиндельный диск (на массив не похоже, разве что аппаратный, деградировавший и с отключённым кешем), то стал бы кх ковырять - кх на шпинделях себя должен прекрасно чувствовать.
- 02 May 2022 (69 messages)
-
🔔 Продаю автоматические программы для : 🔔
1️⃣ - Массовая рассылка по чатам.👉6000 рублей.
2️⃣ - Массовая рассылка в ЛС. 👉 9000 рублей.
3️⃣ - Инват.👉 5000 рублей.
4️⃣ - Автоподписчик на чаты. 👉4000 рублей.
5️⃣ - Парсинг. 👉3500 рублей. -
Привет! Вот раньше можно было дату при джойне проверить на пустоту через like '0000-00-00%'
в более новых версиях (в моем случае 21.12) это можно сделать, например через like '1970-01-01%'.
Вопрос: а нет ли какой-нибудь ф-ии, возвращающей дефолтную дату в КХ? Или может быть такую проверку можно как-то покрасивее сделать? А то вдруг в будущих версиях опять в этом моменте что-то поменяется... -
Выбирайте любую дату ранее 1900 года - вернет дефолтную, в чем проблема.
-
обкастовывайте в строку, сверяйте с 00000....
-
-
Коллеги, добрый день. Кто-нибудь проводил бенчмарк на разных index_granularity ? в связке с skip-indexes ?
-
можно, но не нужно
select defaultValueOfArgumentType(today()); 1970-01-01
select defaultValueOfTypeName('Date'); 1970-01-01
проще использовать --join_use_nulls
select * from (select 0 key) l left join (select 1 key, today() a) r using key settings join_use_nulls=1;
┌─key─┬────a─┐
│ 0 │ ᴺᵁᴸᴸ │
└─────┴──────┘
или просто вводя дополнительное поле found
select * from (select 0 key) l left join (select 1 key, today() a, 1 found) r using key;
┌─key─┬──────────a─┬─found─┐
│ 0 │ 1970-01-01 │ 0 │
└─────┴────────────┴───────┘ -
а смысл?
результат будет абсолютно разный и у индекса можно задать granularity что решает в 99% задачу. -
В этом и вопрос, с самими индексами - предсказуемо, как например влияет на производительность изменение гранулы до 1024 ?
-
или наоборот - увеличение в 2 раза
-
результат будет абсолютно разный для разных данных и разных индексов
-
Догадываюсь. Поэтому и спрашиваю, кто-нибудь проводил бенчмарки?
-
use-cases если хотите. "Вот у нас такие данные, мы вот поэксперементировали - получили вот такой результат"
-
со скип-индексами нашел несколько статей. А вот с самой granularity в MergeTree - нет. Все берут за основу дефолтное значение
-
зачем? вот предположим я нашел что идеальный вариант миллион строк в грануле индекса, и у таблицы index_granularity 16384, ну я ставлю granularity 1000000/16384
-
Вы это к тому, что гранулярность primary_index не очень важна?
-
или ее тоже можно менять?
-
бессмысленно менять index_granularity для улучшения skip indexов
-
Понимаю, а на что она тогда вообще влияет?
-
она очень важна, настолько важна, что ее не надо менять ни в коем случае для тюнинга скип индекса
-
а для чего ее можно / нужно менять?
-
Точнее так, вот этот параграф в документации
"""
Accordingly, the natural impulse to try to speed up ClickHouse queries by simply adding an index to key columns is often incorrect. This advanced functionality should only be used after investigating other alternatives, such as modifying the primary key (see How to Pick a Primary Key), using projections, or using materialized views. Even when a data skipping index is appropriate, careful tuning both the index and the table will often be necessary.
""" -
Два самых частых случая:
1. В таблице очень много очень узких строк. Например в таблице 10 триллионов строк и три поля 64 бит. Размер первичного индекса 100гб, он хранится в памяти, 100гб ОЗУ жалко. Он такой большой потому что много строк и гранулы 8192, увеличиваем размер гранулы в 4 раза до 32768, получаем индекс в четыре раза меньше 25гб.
2. В таблице есть aggregate functions uniq uniqmerge, т.е. ячейки таблицы очень жирные это не 64 бита а напротив 20кб. Адаптивная гранулярность в этом случае не срабатывает. Т.е. размер гранул в байтах огромен и запросы которым надо прочитать из гранулы мало строк очень тормозят потому что читают соседние строки, и запрос таким образом поднимает с диска несколько гигабайт. В этом случае надо уменьшить 8192 например до 256. -
Я вас понял, спасибо большое
-
Denny, подскажи, правильно ли я понял:
Если в таблице не более 300-500 млн. строк и в 99% случаев требуется отбирать практически все значения (uniqExact), то размер гранул вообще не будет играть роли? -
Не будет
-
Спасибо
-
Ну и uniqExact не равно aggregate function. Это два абсолютно разных кейса
-
да, я понимаю. Просто между строк увидел некоторые моменты, применимые к моим случаям.
-
В документации была удобная табличка, какие кондишены поддреживаются какими скип-индексами. Не могу ее теперь найти, есть у кого-нибудь ссылка под рукой? Спасибо
-
Можно пару предложений почему? Разве мы не уменьшаем кол-во проверок через увеличение гранулярности индекса? При условии высококардинального поля
-
Ни слова не понял
-
Денни, почему нельзя менять гранулярность для тюнинга скип индекса? Речь про гранулярность, кстати, скип индекса или первичного ключа?
-
Гранулярность первичного ключа слишком важна, чтобы ее менять ради такой глупости как скип индексы. И да у индекса есть собственная гранулярность , ее надо подбирать.
-
Спасибо.
-
Как minmax index ведет себя с NULL ?
-
А поконкретней?
-
Приветствую. Подскажите плиз .
Нужно ли соблюдать какую-то версионность zookeepera и clickhouse ?
Например, могу ли я использовать clickhouse 21.3.13 и zookeeper 3.8 ? -
> Нужно ли соблюдать какую-то версионность zookeepera и clickhouse ?
Нет
> Например, могу ли я использовать clickhouse 21.3.13 и zookeeper 3.8 ?
Да, вполне.
Мы правда используем 3.7, но думаю 3.8 не сильно хуже -
Я думал когда выходит новая версия, то она должна улучшать работу предыдущей 🙂
-
Ну где два шага вперед, где один назад
-
-
А clickhouse-keeper Вы у себя не используете ещё?
-
Не в нашем облаке пока, но кое где используем.
Плюс насколько знаю в яндексе используют для некоторых кластеров -
я использую zookeeper 3.4 со всеми версиями КХ.
-
Ну у Вас и ClickHouse наверное 21.3, а может и предыдущий LTS 🙂
-
КХ у меня 18.14, 20.8, 21.8, 22.4, 22.5
-
А clickhouse-keeper используете или только на zookeeper?
-
использую для тестовых окружений
-
"ALTER ADD PROJECTION is not supported for tables with the old syntax." - как "рпавильно" пересоздать таблицу с новым синтаксисом?
-
вообще как правильно копировать таблицу без потери данных - если в нее постоянно заливка идет
-
^ таблица ReplicatedCollapsingMergeTree()
-
сколько данных таблице в ГБ и в строках
-
Сейчас
-
PROJECTION не совсем правильно работают с Collapsing, они не видят сами колапсы
-
тупо не доделано https://github.com/ClickHouse/ClickHouse/issues/24778Projections inconsistent results for ReplacingMergeTree/CollapsingMergeTree · Issue #24778 · ClickHouse/ClickHouse
drop table if exists tp; create table tp (type Int32, eventcnt UInt64, projection p (select sum(eventcnt), type group by type)) engine = ReplacingMergeTree order by type; insert into tp select numb...
-
57240527 строк, 1 GB
Вторая
12 Миллиардов - 520 Gb -
Как мне их скопировать
-
Насчет коллапсов - спасибо, это важно знать
-
ну 1 ГБ не проблема остановить инсерты, да переинсертить
с большой таблицей несколько вариантов, например создать новую таблицу, на старую сделать мат.вью которое начнет дублировать запись например начиная с 3 мая (where event_date >= 'may3') , и по кускам из старой перелить все что до 3го мая. -
Привет! Хочу с вами поделиться, вероятно, очень полезным сервисом по трудоустройству IT-специалистов из СНГ в Американские и Европейские компании, так-же есть прога по релокации в другие страны, вдруг кому-то наш сервис поможет получить классный оффер. Огромных успехов всем!!! Open jobs for software developers, QA engineers, and data scientists
Work for an American or European company remotely or relocate to work abroad! Find your perfect job match with Talent Service -
@den_crane Снова добрый вечер! В продолжение вчерашнего вопроса про тормозной селект на >2млрд строк. Забыл упомянуть про то, что при создании таблицы я выставил index_granularity = 32. Хотел сделать индекс менее разреженным и проверить, насколько это отразится на работе. Так вот, столь малое значение этого параметра не может привести к обратному эффекту и к вот такого рода тормозам?
-
Ну так попробуйте поставить стандартный и проверьте
-
У вас в 256 раз больше индексов
-
а могу я изменить индекс гранулярити на существующей таблице?
-
Скорее нет, чем да.
Проще пересоздать думаю -
ну я вот тоже в документации не нашёл ответ(
-
типа как альтернативу ты мог бы предложить из-за mrk2 подправить мету а потом перемержить? Такое работает?
-
Не (ну или чуть иначе чем ты предложил),
Создать новую таблицу с mixed_granularity on сделать ATTACH PARTITION FROM
и выполнить OPTIMIZE TABLE FINAL
Не уверен, что сработает правда - 03 May 2022 (44 messages)
-
Так сработало у нас
-
Joined.
-
Я проводил. Обычно дефолтный самый быстрый
-
Кайф спс, догадывался но чёткого понимания не было
-
max_bytes_before_external_sort / group_by использует tmp_policy для внешней сортировки? Или ему начхать что там и он смотрит только на tmp_path?
-
Joined.
-
-
-
Joined.
-
в последних версиях есть отдельный тип поля JSON
он раскладывается в отдельные колонки
https://clickhouse.com/docs/en/guides/developer/working-with-json/json-intro
есть подход когда raw json хранится как строка
и отдельно из него через JSONExtract функции материализуются колонки. по мере надобности
https://clickhouse.com/docs/en/guides/developer/working-with-json/json-other-approachesHandling JSON | ClickHouse DocsIntroduction to Handling JSON
-
> Есть ли разница в хранении в CH VARCHAR и JSON (Array)?
разница кардинальная
JSON тип это отдельные под-колонки...
> Нужны ли дополнительные настройки для хранения?
насколько помню нет
нужна только версия clickhouse 22.3 или 22.4 желательно
ну и баги поищите, в github
функционал новый, наверняка что-то всплывает -
-
Ребята, добрый день!
Подскажите, пожалуйста, у нас есть проблема с настройкой репликации между инстансами Клика. Есть ли кто то, кто мог бы нам помочь на платной почасовой основе и пройтись по нашим конфигам и определить проблему? Если есть возможность - напишите в личку.
Наша проблема уже поднималась в чате ранее - https://t.me/clickhouse_ru/268182Artem Savitsky in ClickHouse не тормозитВмем привет! Подскажите кто знает пожалуйста - CH version 22.1.3.7 У нас 1 шард/3 реплики (схема и настройки прилагается в скриншоте) При инстерте или батч инсерте в дистрибутивную таблицу - все данные мгновенно реплицируются (видно во всех репликах) и данные можно получить через select на дистрибутивной таблице, но клиент (java jdbc) выдает ошибку Code: 286. DB::Exception: Received from lx51:9000. DB::Exception: Another quorum insert has been already started. (UNSATISFIED_QUORUM_FOR_PREVIOUS_WRITE) (version 22.1.3.7 (official build)) На 3х нодах где размещены реплики также ошибки в логах (также в скриншотах) при каждом новом инстерте меняется только хост ноды (lx51:9000, lx52:9000, lx53:9000) - но ошибка остается таже
-
-
❗️Продаю полностью рабочую программу, которая автоматически делает отправки вашего текста в чаты❗️
• Программа поддерживает отправку сразу с многих аккаунтов.
• С одного аккаунта можно отправить до 10.000 смс.
• Программа полностью автоматическая. Вам нужно нажимать только на одну кнопку.
⚠️ Продаю за очень маленькие деньги, так как очень срочно нужны деньги.
✅ Цена за данную программу - 5999р. -
/report
-
привет, а им кто-то занимается вообще?
Последняя stable там 22.2.2.1 -
-
Поменяли адрес репы. Смотрите доки
-
Installation | ClickHouse Documentation
Installation System Requirements ClickHouse can run on any Linux, FreeBSD, or Mac OS X with x86_64, AArch64, or PowerPC6
-
спасибо
-
благодарю.
-
☑️ Пpoдаю крeдитныe кapтoчки PФ и дpугиx стpaн! Отправим, анонимно! Tinkoff и Пpиватбанк пoд зaказ.
💲 Рaботaем черeз гаpантa. Отмoeм вaши деньги.
🔥 https://tele.gg/bank_karty -
-
у вас на локальных нодах в кластере DDL таблицы разошлись?
-
Что на других версиях кх ошибки не было?
-
прошлая версия была очень старая - 19.5.3.8. Ошибки не было на тех же самых запросах
-
нет. Такие запросы работают:
select col1 from events limit 1;
select col1 from events_distributed limit 1;
select dictGet('dict', 'name', col1) from events limit 1;
а вот так ошибка:
select dictGet('dict', 'name', col1) from events_distributed limit 1; -
ошибка полностью:
Cannot find column dictGet('dict', 'name', col1) in source stream, there are only columns: [dictGet('dict', 'name', col1)]. (THERE_IS_NO_COLUMN) -
dictGetOrDefault тоже заваливается?
-
да, тоже самое
-
Доброго времени суток коллеги, подскажи как в КХ можно подойти к теме AUTO INCREMENT ?
Хочу , что бы данные подгружаемые в таблицу, автоматически получали id. Допустим это таблица заказов и каждый новый заказ должен быть уникальным. -
Стоит ли смотреть в сторону UUID ?
-
А вам нужна сортировка по этому id?
-
Да в принципе нет, могу сделать по дате 🤷♂️
-
Не только при хранении, но и при запросах тоже? Если да, то uuid-ы подойдут.
-
Да и при запросах тоже. Но меня беспокоит в uuid, что он от AI требует условия insert! А если я добавляю данные к примеру импортом csv или у меня допустим материализованная вью?!
-
default для этого же есть
-
если бы вы чуть раскрыли момент default )))
-
id UUID DEFAULT generateUUIDv4()
-
спасибо, я буду изучать этот момент))))
-
если пишете через буфер, то в буфере сгенерируется и запишется в таблицу, если через MV, то можно в самой таблице не писать DEFAULT, а в MV генерировать
-
хочу сейчас попробовать через обычный view
-
работает!!!! Спасибо Вам огромное))))
- 04 May 2022 (106 messages)
-
Разобрался в чем проблема. В старом кластере словари были через XML, в новом SQL DDL. Как выяснилось в новом формате словарей нужно указывать имя БД в качестве префикса, а в старом работало без этого.
С другой стороны присутствует некоторая неконсистентность: при запросе в локальную таблицу работает и без префикса, но при запросе в Distributed таблицу префикс обязателен. -
И база не default?
-
база default, словари тоже default
-
Пардон, я че то пропустил, а зачем вообще айди записи ?
-
Всем привет,знакомлюсь:)
-
-
дайте, пожалуйста, совет. в конце той недели некорректно удалил партиции по фильтру max_date <= today() - 14; и теперь логи пестрят ошибками вида:
2022.05.04 09:51:27.634937 [ 10678 ] {} <Warning> graphite.graphite_reverse (ReplicatedMergeTreePartCheckThread): Checking part 20220426_20220427_1939313_1939318_1
2022.05.04 09:51:27.635267 [ 10678 ] {} <Warning> graphite.graphite_reverse (ReplicatedMergeTreePartCheckThread): Checking if anyone has a part 20220426_20220427_1939313_1939318_1 or covering part.
2022.05.04 09:51:27.637905 [ 10678 ] {} <Warning> graphite.graphite_reverse (ReplicatedMergeTreePartCheckThread): Found parts with the same min block and with the same max block as the missing part 20220426_20220427_1939313_1939318_1 on replica r00monch03.r00.egov.local. Hoping that it will eventually appear as a result of a merge. -
таких партиций некоторое количество
┌─partition─┬───max_date─┬─name────────────────────────────────┐
│ 202204 │ 2022-04-27 │ 20220426_20220427_1939313_1939313_0 │
│ 202204 │ 2022-04-26 │ 20220426_20220426_1939314_1939314_0 │
│ 202204 │ 2022-04-26 │ 20220426_20220426_1939315_1939315_0 │
│ 202204 │ 2022-04-26 │ 20220426_20220426_1939316_1939316_0 │
│ 202204 │ 2022-04-26 │ 20220426_20220426_1939317_1939317_0 │
│ 202204 │ 2022-04-26 │ 20220426_20220426_1939318_1939318_0 │
│ 202204 │ 2022-04-26 │ 20220426_20220426_1939320_1939320_0 │
│ 202204 │ 2022-04-26 │ 20220426_20220426_1939321_1939321_0 │
│ 202204 │ 2022-04-27 │ 20220426_20220427_1939323_1939323_0 │
│ 202204 │ 2022-04-27 │ 20220426_20220427_1939324_1939324_0 │
└───────────┴────────────┴─────────────────────────────────────┘
но при попытке сделать detach, получаю ошибку
ALTER TABLE graphite.graphite_reverse
DETACH PART '20220426_20220427_1939313_1939313_0'
Query id: 990d23f9-a305-4f24-854d-49c3e3366f47
0 rows in set. Elapsed: 0.004 sec.
Received exception from server (version 22.3.3):
Code: 384. DB::Exception: Received from localhost:9000. DB::Exception: Part 20220426_20220427_1939313_1939313_0 is currently participating in a background operation (mutation/merge), try again later. (PART_IS_TEMPORARILY_LOCKED) -
-
❗️ Продаю СОФТЫ ❗️
В наличии есть софты и для Telegram и для ВК.
✅Рассылка в ЛС.
✅Рассылка по чатам.
✅Рассылка по комментариям.
✅Инвайт.
✅Парсинг.
✅Парсинг по ГЕО.
✅Автоподписка на чаты.
🛑Цены самые минимальные🛑 -
Ребята, помогите найти проблему...
Есть вот такая реплицируемая таблица данных c шардами:
portsdata - Distributed('datalayer', 'test', 'portsdata_repl', rand())
Поля - timestamp DateTime, port_id UInt32, parent_port_id UInt32 NULL, service_id UInt32, in_octets UInt64, in_octets_delta UInt64, out_octets UInt64, out_octets_delta UInt64, period UInt32
portsdata_repl - ReplicatedMergeTree('/clickhouse/tables/{shard}/test/portsdata_repl', '{replica}') PARTITION BY toYYYYMM(timestamp) ORDER BY (timestamp, service_id, port_id) SETTINGS index_granularity = 8192
Есть вот такой запрос, который агрегирует данные и определяет 95й персентиль:
SELECT service_set, quantileExact(0.95)(`in_bps`) AS in_95th, quantileExact(0.95)(`out_bps`) AS out_95th
FROM (
SELECT
interval_start,
service_set,
sum(`avg_in_bps`) AS in_bps,
sum(`avg_out_bps`) AS out_bps
FROM (
SELECT
toStartOfInterval(`timestamp`, INTERVAL 5 minute) AS interval_start,
service_id,
arrayJoin([[1]]) AS service_set,
avg(((`in_octets_delta` * 😍 / `period`)) AS avg_in_bps,
avg(((`out_octets_delta` * 😍 / `period`)) AS avg_out_bps
FROM `portsdata`
GLOBAL LEFT OUTER JOIN (
SELECT
port_id AS child_port_id,
parent_port_id,
service_id AS child_service_id
FROM `portsdata`
WHERE `service_id` IN (1)
) AS `children_map` ON `children_map`.`parent_port_id` == `port_id`
WHERE
`service_id` IN (1)
AND (`timestamp` >= '1651622400')
AND (`timestamp` < '1651968000')
AND (isNull(`child_service_id`) OR `service_id` != `child_service_id`)
GROUP BY `interval_start`, `service_id`, `port_id`, `child_port_id`
)
WHERE has(`service_set`, `service_id`)
GROUP BY `interval_start`, `service_set`
ORDER BY interval_start
)
GROUP BY `service_set`
Пример выполнения команды выше по определению персентиля:
service_set in_95th out_95th
[1] 17504.0 8752.0
Суть проблемы в том, что персентиль считается неверно, подсчитанные in_bps\out_bps персентили выше максимального значения в последовательности агрегируемых данных.
Если выполнить внутреннюю команду по агрегации данных (до определения персентиля):
SELECT
interval_start,
service_set,
sum(`avg_in_bps`) AS in_bps,
sum(`avg_out_bps`) AS out_bps
FROM (
SELECT
toStartOfInterval(`timestamp`, INTERVAL 1440 minute) AS interval_start,
service_id,
arrayJoin([[1]]) AS service_set,
avg(((`in_octets_delta` * 😍 / `period`)) AS avg_in_bps,
avg(((`out_octets_delta` * 😍 / `period`)) AS avg_out_bps
FROM `portsdata`
GLOBAL LEFT OUTER JOIN (
SELECT
port_id AS child_port_id,
parent_port_id,
service_id AS child_service_id
FROM `portsdata`
WHERE `service_id` IN (1)
) AS `children_map` ON `children_map`.`parent_port_id` == `port_id`
WHERE
`service_id` IN (1)
AND (`timestamp` >= '1651622400')
AND (`timestamp` < '1651968000')
AND (isNull(`child_service_id`) OR `service_id` != `child_service_id`)
GROUP BY `interval_start`, `service_id`, `port_id`, `child_port_id`
)
WHERE has(`service_set`, `service_id`)
GROUP BY `interval_start`, `service_set`
ORDER BY interval_start
то получим следующие данные:
interval_start service_set in_bps out_bps
2022-05-04 00:00:00 [1] 2296 1148
2022-05-05 00:00:00 [1] 6904 3452
2022-05-06 00:00:00 [1] 11512 5756
2022-05-07 00:00:00 [1] 16120 8060 -
Подытожу:
У меня есть один большой запрос в clickhouse, который берет данные за определенный промежуток времени, агрегируем и затем вычисляем из этих данных персентиль.
И дело в том, что персентиль считается неверно. Персентиль получается больше чем максимальное значение из последовательности агрегированных данных, что в принципе неправильно.
Не получается найти причину в чем проблема. Нужна помощь -
Подскажите, пожалуйста:
хочу замерить быстродействие remote таблицы. Что нужно прописать в квере в set, чтобы запрос не кешировался и был чистый результат при повторных запусках? -
Не знаю, есть ли чего в set, я использую отдельный запрос после этого https://clickhouse.com/docs/ru/sql-reference/statements/system/#query_language-system-drop-uncompressed-cacheЗапросы SYSTEM | ClickHouse Docs
query-language-system}
-
А если попробовать на время остановить мутации и мерджи?
-
а есть какой-то элегантный способ это сделать?
-
-
Там несколько команд стоп
-
ага, спасибо! сейчас буду пробовать
-
Может имена полей в бэктики `` нужно обернуть
-
Обернул, не помогло. 😔
-
Запятую после Tax UInt64 уберите.
-
Блин... Точно. Спасибо!
*Простыню кода удалил, чтобы не мусорить* -
попробовал постопать фетчи, мержи, ттл мержи - не помогло. сейчас заглянул в system.replication_queue, и там такая картина:
SELECT table, type, parts_to_merge, is_detach, num_tries, merge_type FROM system.replication_queue where num_tries > 1;
SELECT
table,
type,
parts_to_merge,
is_detach,
num_tries,
merge_type
FROM system.replication_queue
WHERE num_tries > 1
Query id: c18c89ff-c4ad-4e15-ba01-8c092d650e11
┌─table────────────┬─type─────┬─parts_to_merge─┬─is_detach─┬─num_tries─┬─merge_type─┐
│ graphite_reverse │ GET_PART │ [] │ 0 │ 1327482 │ │
│ graphite_reverse │ GET_PART │ [] │ 0 │ 1327549 │ │
└──────────────────┴──────────┴────────────────┴───────────┴───────────┴────────────┘ -
Привет. Подключаюсь к Yandex Managed Service for ClickHouse при помощи clickhouse-benchmark.
Он пишет вот такое
WARNING: Certificate verification failed
----------------------------------------
Issuer Name: /CN=YandexInternalRootCA
Subject Name: /CN=YandexInternalRootCA
The certificate yielded the error: self signed certificate in certificate chain
The error occurred in the certificate chain at position 2
Accept the certificate (y,n)? DB::NetException: SSL Exception: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED (rc1b-8sht3vfv69o4tca1.mdb.yandexcloud.net:9440)
Консольный клиент пишет тоже самое но дает утвердительно ответить на впорос, и после этого нормально работает.
Отсюда вопрос, что можно сделать чтобы заработало? -
Привет 👋 короткий вопрос: grants для insert: написано что «privilege level: column» я правильно понимаю, что просто дать grant Insert on db.* не получится?
-
Дал такой grant insert, а Go драйвер все равно говорит надо дать insert(col1,col2) on db.table
-
Здесь вы дали доступ исключительно на выполнение операции Select, а не Insert
grant Select on db.* -
Сделайте
grant Select,Insert on db.*
и попробуйте Insert -
Исправил на insert вместо select, моя ошибка 🤦♂️
-
Он делает insert, но в логах все равно ошибка периодически что нужен grant insert(col1,col2) on db.table
-
Те insert проходит, данные в таблице появляются, но в логах ошибка?
-
Все, нашёл проблему, ansible мне там гадил и делал revoke периодически по поэтому в логах были ошибки. Разобрался, спасибо за ответы👌
-
есть сотни источников с разнородными метриками. По каждому источнику надо делать плюс-минус одну и ту же аналитику. Есть смысл все хранить в одной очень широкой таблице вместо сотен таблиц для каждого источника?
-
ну если они между собой не будут пересекаться в запросах, то можно и в разных. А если будут - то в 1 будет практичней.
-
А ещё помогите, плз.
После попытки влить данные из CSV в таблицу получаю:
SQL Error [32] [07000]: Code: 32. DB::Exception: Attempt to read after eof: Cannot parse UInt8 from String, because value is too short: while converting source column idTypeSession to destination column idTypeSession: while executing 'FUNCTION _CAST(idTypeSession :: 2, UInt8 :: 13) -> _CAST(idTypeSession, UInt8) UInt8 : 12'. (ATTEMPT_TO_READ_AFTER_EOF)
При этом значений idTypeSession всего 15 (от 0 до 14).
Почему каст не проходит? -
Ну самый простой вариант - либо разделителя нет и идет попытка левого значения преобразовать в UInt8, либо действительно кривое число (например, с минусом)
-
или еще проще - у вас куча пустых строк в конце файла
-
Это может так аукаться? Не ожидал. Пойду проверять.
-
конечно. Например, у вас в конце будет не просто простая строка, а что то типа
;;;;;;;;;;; - то есть пустые значения.. -
в csv каждая строка - это набор данных. Соответственно, если там будет пустота или ;;;; - будет идти попытка преобразования данных.
-
Имеет смысл заменять пустые значения на \N при выгрузке, либо тогда задать дефолтное значение NULL у неприходящих атрибутов.
-
Нет, я к тому, что не ожидал, что падать будет в середине столбцов, а не в конечном столбце.
Но в общем нет, проверил, пустых строк нет, все значения в таблице в этом столбце положительные. -
большой файл csv?
-
5 гигов
-
О как... А грузится он порциями или разом?
-
Пытаюсь разом
-
Ну тогда я бы попробовал сделать хитрость - сделать поле idTypeSession типом String, и залить. Если вдруг все Ок - добавить матер. столбец в итоговой таблице - в котором сделать преобразование строки в число. Если пройдет, подменить запросами idTypeSession на число.
-
Понял, спасибо за идею, пойду пробовать!
-
Дак, почему не сделать LowCordinality,
-
Зачем эти костыли ? Если по факту уже придумали решения для этого
-
всем привет
сервер не запускается(
выдаёт ошибку clickhouse-server.service: Failed at step EXEC spawning /usr/bin/clickhouse-server: Operation not permitted
командой $ sudo -u clickhouse /usr/bin/clickhouse-server --config-file /etc/clickhouse-server/config.xml заводится
подскажите куда копать чтобы поправить -
началось после правки /etc/clickhouse-server/users.xml
возврат к старой версии не помог -
проверьте права на этот файл
`ls -lah /etc/clickhouse-server/users.xml` -
r-------- 1 clickhouse clickhouse 6,2K мая 4 13:56 /etc/clickhouse-server/users.xml
-
у меня вот -rw-r--r--. 1 clickhouse clickhouse
попробуйте додать прав, возможно поможет -
не помогло
на папке такие же права? -
дело похоже в другом
Cannot open file /run/clickhouse-server/clickhouse-server.pid, errno: 2, strerror: No such file or directory. (CANNOT_OPEN_FILE), Stack trace (when copying this message, always include the lines below) -
sudo clickhouse restart помог😂
-
🙏🏻
-
Коллеги, правильно ли я понимаю, что clickhouse-local на вход может принимать форматы файлов что указаны в таблице?
https://clickhouse.com/docs/ru/interfaces/formats -
An update on upcoming ClickHouse events.
May 12 is our day of meetups (in both EU and US timezones). We are welcoming speakers from Opensee and Gigasheet. In addition, Alexey Milovidov and Geoff Genz from the ClickHouse team will be sharing. Find the one nearest you and join us.
https://www.meetup.com/pro/clickhouse/
May 19 is the next release webinar. If you haven’t joined one in the past, we share the highlights of the release – including live demos —, leave time for Q&A, and…generally…celebrate with the community. Register now!
https://clickhouse.com/company/events/v22-5-release-webinar/ClickHouse | Meetup Pro - MeetupClickHouse is on Meetup Pro with more than 441 members across 10 Meetups worldwide. Meetup Pro is the professional tool for organizing and communicating a network of users, partners, contributors and members.
-
None
-
да
-
а как конкретно "некорректно удалил партиции по фильтру" ?
-
так а почему вы считаете во внешнем запросе?
-
Всем привет!
Кто подскажет, что за параметр такой: max_rows_to_read и насколько безопасно его увеличивать? Например, до миллиона строк.
Читать то я умею: максимальное количество строчек, которое можно прочитать из таблицы при выполнении запроса
Но мне не очень понятно, как оно работает. Если КХ кидает такую ошибку, то это запрос говно (раньше работал, но стало больше данны) или надо увеличивать max_rows_to_read?
Code: 49. DB::Exception: Prefetch is valid in readUntilPosition: (while reading column sample_id): (while reading from part /var/lib/clickhouse/disks/object_storage/store/637/6374d274-b1a7-4b95-b705-830599538cee/all_2556_9214_36_9529/ from mark 2117 with max_rows_to_read = 8192): While executing MergeTreeInOrder. (LOGICAL_ERROR) (version 22.3.3.44 (official build)) -
Это low cardinality колонка?
-
LOGICAL_ERROR это баг КХ. Раньше это до апгрейда?
-
Вообще этот баг после обновы как-будто бы. Хостимся в облаке яндекса.
Залив большого кол-ва данных пришелся практически на один день с апдейтом и происходило это без меня... -
Не очень прошарен: sample_id UInt64,
-
так откатывайтесь
-
Хм, там вылезали баги похожие, нужно метод который кх для чтения поменять
-
Это можно как-то законфижить или нам лучше откатиться?
-
Можно на user level
Настройка называется как то ...read_method... -
-
-
Ты клик на 150 миллиардов строк мигрировала за ночь?
-
Добрый день!
Вопрос: как можно определить таблицу на которую направлено matview если известна исходная таблица на которую повешена matview?
Создаю matview
CREATE MATERIALIZED VIEW test_sev.mv_test_tbl_last_last
TO test_sev.test_tbl_last
AS
SELECT date, item_id, unit_id
FROM test_sev.test_tbl
Запросом
select database,name,engine,dependencies_database,dependencies_table from system.tables where database='test_sev' and name ='test_tbl'
получаю что от моей исходной таблицы test_tbl есть зависимое matview ['mv_test_tbl_last_last']
А теперь как по этому mv_test_tbl_last_last получить TO таблицу(test_sev.test_tbl_last ) в которую оно пишет данные ? -
Я не Анна, но хотел бы услышать подробности.
-
Да там мем небольшой случился: в ДЦ сломался "главный" роутер, сказали сети не будет ещё день. А у нас на клике критически важный функционал завязан, чуть ли не с боем вырвали диски из серверов и перенесли через кликхаус бекап
-
А так и вижу толпа ДБА на толпу Админов с криками "Отдай диск, век воли не видать"
-
там, скорее, юридические моменты: ДЦ всеми силами старается сделать вид, что он защищен от внешнего доступа, потому абы кто не может получить оборудование
-
как вариант, достать из колонки create_table_query
-
Да, пока вижу только этот вариант. Но это конечно так себе, регуляркой выдергивать из DDL.
Я думал есть более прямая связь -
+ если не использовался TO, то и в engine_full эта же инфа должна быть
-
У нас все с явным хранением(TO)
-
SHOW CREATE TABLE MV_NAME
-
Это то же самое что system.tables.create_table_query. Те так же надо вытаскивать табличку TO из текста запроса?
-
Ребят привет. У нас на одной ноде память течет. 100+ гб объем на сервере, 22.3.3.44. Подскажите куда копать?
-
-
прекрасный график на котором абсолютно ничего нельзя понять
ни осей, ни легенд. -
я думаю линейный рост графика видно
-
ох, вы не представляете сколько сотен раз я видел графики с таким ростом и только 2 раза это был лик.
пока не вижу шкалу в ГБ, это бессмысленно даже обсуждать -
-
зеленый только что рестартнули, по этому график остыл
-
даже не знаю плакать или смеятся теперь, пойду чаю попью
-
как это понимать?
-
вы когда шкалу видите от 0 до 100, вы о чем думаете? от 0 до 100 , что является ценой деления?
-
а что подразумеваются под memory usage спросить не хочется?)
-
это тоже, это будет след. вопрос. А вообще проще конечно спросить select из system таблиц
-
Gb :)
-
какой именно select сделать?
-
ну и для информации сейчас есть два известных issue related похожих на утечки, одно про LiveView другое про kafka engine (но это особенности librdkafka).
-
select metric, formatReadableSize(value) from system.asynchronous_metrics where metric ilike '%mem%';
select metric, formatReadableSize(max(value))
from asynchronous_metric_log
where event_date >=today() and metric ilike '%mem%'
group by metric; -
не, у нас rabbitMQ и LiveView вроде не применяем
- 05 May 2022 (160 messages)
-
Всем привет. Я правильно понял что асинхронная вставка работает только в HTTP протоколом, а значит оно не совместимо с Clickhouse-driver на python?
-
Подскажите, в документации https://clickhouse.com/docs/ru/engines/table-engines/integrations/rabbitmq есть параметр rabbitmq_host_port, и логин, пароль и vhost нужно в конфиг сервера вписывать, а как быть если нужно сходить в несколько vhost и в несколько серверов? Вот тут https://github.com/ClickHouse/ClickHouse/blob/master/docs/en/engines/table-engines/integrations/rabbitmq.md есть вот такой еще прааметр (rabbitmq_address = 'amqp(s)://guest:guest@localhost/vhost'), но если я его использую получаю ошибку.
DB::Exception: Empty address passed to function parseAddress. (BAD_ARGUMENTS) (version 22.2.2.1). (BAD_ARGUMENTS)RabbitMQ | ClickHouse Docsrabbitmq-engine}
-
Всем привет! подскажите пожалуйста, клик сегфолтит примерно раз 30 секунд и рестартует
по стектрейсу нифига не понятно, но чукча джавист, чукча не плюсовик
Куда копать, чтобы удовлетворить потребности клика?
2022.05.05 07:07:14.768709 [ 231 ] {} <Fatal> BaseDaemon: ########################################
2022.05.05 07:07:14.768746 [ 231 ] {} <Fatal> BaseDaemon: (version 21.10.2.15 (official build), build id: 6699B86599A2121E78E0D42DD67791ABD9AE5265) (from thread 207) (no query) Received signal Segmentation fault (11)
2022.05.05 07:07:14.768763 [ 231 ] {} <Fatal> BaseDaemon: Address: 0x7f1def49cf98 Access: write. Attempted access has violated the permissions assigned to the memory area. -
вот это очень смущает
2022.05.05 07:07:14.768763 [ 231 ] {} <Fatal> BaseDaemon: Address: 0x7f1def49cf98 Access: write. Attempted access has violated the permissions assigned to the memory area. -
-
Специально, Алексей сделал вот такую штуку https://pastila.nl/
-
сорри, поправлю
-
всё прочитал -- очень интересно, траги-комедия, можно еще логов? в телеграме увеличили размер пересылаемого файла до 2гб, надо было стрим прям сюда лить
-
-
-
-
DB::PipelineExecutor::prepareProcessor
и DB::PipelineExecutor::tryAddProcessorToStackIfUpdated
48 штук вложенных это у вас какой то хитрый запрос
но какой именно непонятно
можете посмотреть [231] на пару строк выше
там возможно мелькнет uuid для query_id -
опытным путём выяснил что проблема в зафейленной мутации, очистил все мутации и полёт нормальный
-
а что значит зафейленная мутация ?
какую ошибку в system.mutations показывало? -
ошибок не было, просто is_done = 0
-
их для этой таблицы накопилось около 10к
-
ну в смысле не фейленная. а подвисшая...
-
там справочные данные, поэтому проще всё дропнуть и перекатить
-
10к мутаций это не фейл, это непонимание как мутации работают
справочники через dictionary лучше держать, самое простое, если в память влазит -
в чем именно там ошибка была - не понятно, по логам было видно что клик вычитывал мутации, пытался их применить и сваливался в сегфолт
-
они накопились за 2 недели
по поводу словарей - согласен, но это легаси, которое поправить уже непросто -
вот было бы конечно здорово из system.query_log
вытащить как именно вы ALTER TABLE делали -
-
-
Functions for Working with JSON | ClickHouse Docs
functions-for-working-with-json}
-
У вас JSON не валидный. Не хватает [] по краям
-
with '[{"a": "hello", "b": [-100, 200.0, 300]},{ "a": "world","b": [-500, 700.0, 300]}]' as arg
select JSON_QUERY(arg,'$[*].a') -
-
Добрый день! Нужна помощь в вычислении exponentialMovingAverage по сетке времени. Приведу пример, что я имею в виду. Есть временной ряд, timestamp -> value
Нужно рассчитать ewma для конкретного ts, но в вычислении использовать только те timestamps, которые отстоят от конкретного ts на время dt.
То есть,
t1 -> v1
t1 + dt/2 -> v2
t1 + 2dt/3 -> v3
t1 + dt -> v4
t1 + 3dt/2 -> v5
t1 +2dt -> v6
Для t1+2dt ewma надо рассчитать пользуясь значениями t1+dt, t1, t1-dt ... . Возможно ли такое сделать в clickhouse? -
> t1 + 2dt/3 -> v3
Не лишнее тут? -
Вроде шаг по 0.5dt
-
не, как раз нет. его не нужно учитывать, но оно есть. Шаг произвольный. Равно как и dt хочется задавать как параметр во вьюхе, например.
-
наблюдения не равномерно распределены сильно. Может быть и такое, что на t1-dt наблюдения нет, но как там добавить какую-то интерполяцию, я примерно понимаю.
-
А, эт просто пример данных.
Мб такое можно
exponentialMovingAverageIf(val, (t1(некое значение) - ts) % dt = 0) -
Добрый день, подскажите кто сталкивался про это предупреждение
Configuration property group.id is a consumer property and will be ignored by this producer instance
вознкает когда пишешь в через таблицу с Engine Kafka, но параметр kafka_group_name является обязательным для движка.
Есть ли способ избавиться от ворнинга, кроме как изменить уровень логирования?) -
да, сейчас попробую, спасибо.
-
если на уровне всего сервера, то лезть в конфиги
если на уровне запроса, то SELECT .... SETTINGS allow_experimental_window_functions = 1 -
спасибо!
-
так вроде уже и без этого работают
-
и начиная с какой-то недавней версии, она по умолчанию включена
-
уже несколько месяцев как
-
-
Вам тогда не надо, они без этой настройки уже работают в этой версии
-
Привет! Есть SELECT с таблиц (3 штуки), в которых хранится очень много данных. Если делать запрос в Merge таблицу (указывает на эти 3 таблицы), то запрос занимает 117 сек. А если делать через подзапрос в FROM таблицы через UNION ALL то получается 50 сек. Где можно об этом почитать, почему второй вариант работает быстрее больше чем в 2 раза?
-
текущие настройки сервера лежат в system.settings, там и эта настройка есть, можете удостовериться, что она по умолчанию включена
(или выключена, если кто-то отключил :) -
-
Кхм
-
странно, судя по changelog, начиная с 21.9 она должна была иметь description "Obsolete setting"
по крайней мере, так она выглядит у меня на 22.4 -
-
в общем, пока разгадываете эту непонятку, можно попробовать вернуться к моему первому сообщению )
я бы для начала попробовал с настройкой на уровне запроса -
-
Вообще такая настройка должна быть удалена
-
mark window functions as ready for general use by akuzm · Pull Request #27184 · ClickHouse/ClickHouse
Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Mark window functions as ready for general use. Remove th...
-
Ну и её включили по умолчанию
-
с 21.9
-
скажите пожалуйста, а в запросе SELECT .... SETTINGS allow_experimental_window_functions = 1, после select что должно идти?
-
Ничего
-
SETTINGS указываете в конце запроса
-
она не удалена физически из system settings (смотрю на версиях 22.3 и 22.4), просто в description указано "Obsolete setting, does nothing"
-
-
ваш запрос, в котором вы хотите использовать любую оконную функцию
-
-
Я снова пришел помощи просить. 😔
Экспорт в клик CSV таблицы с double внутри (например "200,001") вываливается с ошибкой "garbage after Float64".
То есть клик в колонку типа Float64 заливает только целую часть double, а дробную отбрасывает. Поменял уже сепаратор CSV файла на ; чтобы запятая нормально обрабатывалась - не помогает. Что можно сделать с этим? Может имеет смысл поменять формат колонки Клика? -
вроде работает
-
кхм, может потому что Float ожидает точку, а у вас запятая
-
-
Чатик, подскажите пожалуйста, Connection request from old client /192.168.48.34:39450; will be dropped if server is in r-o mode. - зукиперы подняты, кх не стартует тк <Error> Application: Coordination::Exception: All connection tries failed while connecting to ZooKeeper. nodes: 192.168.48.196:2181, 192.168.48.90:2181, 192.168.48.117:2181
-
зукиперы “дропают коннекшны”, кх говорият что подключиться к зк не могут, пингуются все, в логах зк коннекты от серверов кх видны как отстреливаются, рестартил всех, куда бы копать
-
Ну да, я понимаю. Потому и спросил, что делать с этим. Если формат колонки менять, то на какой тогда? Дробные числа же только в Float32/64, или ещё можно что то использовать?
-
Загрузить как строку, на ходу поменять запятую на точку
-
Или CSVшку каким нибудь perl'ом обрабатывать сначала? Такое себе решение, конечно...
-
А можно пример кода? Это после INSERT уже делать или можно как то совместить?
-
Совместить
create table csvtest(csv_id Int64, c1 String, c2 String) Engine=Memory;
INSERT INTO csvtest SELECT 55,c1,c2 FROM input('c1 String, c2 String') format CSV a,b
select * from csvtest
SELECT *
FROM csvtest
Query id: 7f6453eb-59f6-4750-8391-435ff242b426
┌─csv_id─┬─c1─┬─c2─┐
│ 55 │ a │ b │
└────────┴────┴────┘ -
О, круто! Спасибо огромное!
-
-
Чет какая то мешанина из json и массивов
-
select JSON_QUERY(arg,'$[*].a[*].name')
-
Пользователи самый быстрый олтп базы привествую!))
Будет круто если решим такую задачу)
Есть две почти одинакоые таблицы (логи события пользователей) , но в одной из них не хватает 1% данных, с помощью какого запроса/функции могу вывести недостающие данные учитывая что возможно только поле timestamp отличается -
Спасибо
-
Не в тот чатик ... Тут не OLTP
-
-
"where ... not in" в помощь..
-
SELECT .. FROM a WHERE timestamp NOT IN (select timestamp from B). Навскидку так.
-
скажите пожалуйста, max() over () не реализована?
-
у меня на 22.3.2.1 работает
но когда появилась, не знаю )
какой у вас запрос? -
у меня 22.0.4, возможно поэтому(
-
а на что ругается?
-
Code: 48, e.displayText() = DB::Exception: The support for window functions is experimental and will change in backwards-incompatible ways in the future releases. Set allow_experimental_window_functions = 1 to enable it. While processing 'max(pass) OVER ()' (version 21.7.2.7 (official build))
-
так ругается на то, что вы забыли добавить в конце SETTINGS
-
-
-
Всем добра!
Поменял пароль пользователя, через CREATE USER OR REPLACE. Дал доступ через GRANT ALL ON. Теперь данные запрашиваются, но при запросе данных с использование справочников Authentication failed: password is incorrect or there is no user with such name: while executing 'FUNCTION dictGet(
Куда копать, подскажите, пожалуйста. -
>у меня 22.0.4, возможно поэтому(
>version 21.7.2.7 -
а от другого пользователя такие dictGet работают?
-
Теперь вообще ни от какого пользователя не работает. Специально создал пользователя, но и он тоже оказался не у дел. Даже default через clickhouse-client в консоли не может выполнять.
-
и как словарь создан?
словарю нужен пользователь пароль чтобы ходить к таблицам которые источник словаря -
Вроде дошло! Словарь создан как локальное подключение. Спасибо большое! Просто огромное! Не видел очевидного.(
-
>Словарь создан как локальное подключение.
>словарю нужен пользователь пароль чтобы ходить к таблицам которые источник словаря
это нужно для security, иначе получается дыра, которая позволяет через словарь увидеть данные пользователю у которого нет прав, потому что в КХ нет понятия владельцев объектов -
Копал в GRANT, но не накопал. Пока от вас не пришла подсказка.) Не туда копал. Еще раз благодарю!
-
-
-
SELECT sku, count() FROM (
select
toDate('2019-02-28') as dte, extractAll('["2072805", "2072805", "2055805"]', '"(\\d*)"') as sku
union all
SELECT
toDate('2019-02-28') as dte, extractAll('["1994388"]', '"(\\d*)"') as sku
) ARRAY JOIN sku
GROUP BY
sku -
SELECT date, arrayJoin(JSONExtract(SKU,'Array(String)') AS g_SKU FROM t GROUP BY date
-
ой
-
arrayJoin вместо groupArray
-
-
ой что-то голова не варит
SELECT date, g_SKU, count() g_SKU_cnt FROM (
SELECT date, arrayJoin(JSONExtract(SKU,'Array(String)') AS g_SKU FROM t
) GROUP BY date, g_SKU
вот так скорее всего сработает -
но хочется сразу предупредить, что если записей сотни миллионов, то будет довольно медленно по меркам clickhouse и памяти отожрет на группировку дофига...
-
Это я понимаю мне все равно надо где то это предрасчитать, что бы потом в куб положить
-
-
create table nenavizhu_pisat_create_table(date Date, SKU String) Engine=Memory;
insert into nenavizhu_pisat_create_table values('2019-02-28', '["2072805", "2072805", "2055805"]')
insert into nenavizhu_pisat_create_table values('2019-02-28', '["1994388"]');
SELECT date, arrayJoin(extractAll(SKU, '"(\\w+)"')) s, count() from nenavizhu_pisat_create_table group by date,s;
┌───────date─┬─s───────┬─count()─┐
│ 2019-02-28 │ 2055805 │ 1 │
│ 2019-02-28 │ 2072805 │ 2 │
│ 2019-02-28 │ 1994388 │ 1 │
└────────────┴─────────┴─────────┘ -
нажимаете на красный крестик напротив "fix tests" / ищете ClickHouse build check (actions) — 22/22 artifact gr... / нажимаете
https://s3.amazonaws.com/clickhouse-builds/36756/76dd2409809dacd1ff9cb4b8e6069ffe4b8cac1e/clickhouse_build_check_(actions)/report.html
качаете deb
ng-13 relwithdebuginfo none bundled unsplitted success link 0:47:57
clickhouse-client_22.5.1.1_all.deb
clickhouse-common-static_22.5.1.1_amd64.deb
clickhouse-server_22.5.1.1_all.deb -
благодарю)
-
Есть вопрос по интеграции с Кафкой и MV в целом.
Есть MV, которая разбирает данные в формате JSONAsString. В структуру этого json добавляют новое поле, соответственно, надо поменять MV. Но в DDL для MV отсутствует конструкция OR REPLACE.
Можно только так:
DROP TABLE my_mv;
CREATE MATERIALIZED VIEW my_mv
...
Как правильно поменять MV под новую структуру без потери данных? -
можно через MATERIALIZED VIEW в TO SummingMergeTree что нибудь придумать такое чтобы нагрузку размазать...
-
with
cte as (select dt, arrayJoin (SKU) as mas, uniqExact(SKU) as ar2 from test_tbl group by dt, SKU)
select dt, mas, sum(ar2) from cte
group by dt, mas
Еще вариант ) -
ALTER TABLE … MODIFY QUERY Statement | ClickHouse Docs
alter-modify-query}
-
SKU строка
-
и данные из таблицы с кафка-движком при этом не будут потеряны на время этого действия?
-
тут вот не могу сказать 100 точно
https://kb.altinity.com/altinity-kb-integrations/altinity-kb-kafka/altinity-kb-kafka-main-parsing-loop/
кафка никакого INSERT не делает, она читает топик и формируется INSERT блок в MV уже...
и я не помню ошибки в MV они не дают librdkafka consumer читать топик, или чтение топика продолжается...
если не дают, тогда все ок, старые сообщения пойдут по старому формату, новые по новому
но вообще вам бы больше подошел подход чтения исходной строки как строка
и набора полей которые через DEFAULT JSONExtract задаются... -
не будут
-
спасибо за ответы!
-
DROP TABLE my_mv;
CREATE MATERIALIZED VIEW my_mv
тоже не теряет данные если MV только одно.
когда вы дропаете MV консьюм из кафки прекращается -
самый безопасный способ
DETACH kafka_table
2. ... any modifications of derived MV (CREATE may not work, because kafka table is detached, but ATTACH MATERIALIZED VIEW will)
3. ATTACH kafka_table -
ALTER TABLE mv MODIFY QUERY SELECT a * 2 as a FROM src_table;
отлично работает, его клаудфлер сделал для себя и у них на их нагрузках оно используется уже два года
allow_experimental_alter_materialized_view_structure нужен по смешной причине, MODIFY QUERY не меняет структуру полей в самом MV, но это и не нужно -
-
-
-
так просто ifNull или assumeNotNull
-
-
-
если запрос выполняется 0.1 сек и читает из кеша ОС, то незаметны, если запрос выполняется 10минут и 99% читает с диска, то в два раза (6900/3500), 10 минут vs 5 минут
-
А как сделать, чтобы результат вот такого запроса(~80s) кешировался и не высчитывался при повторном SELECT?
SELECT *
FROM tablename
WHERE (sign_date >= '2020-06-01') AND (sign_date <= '2020-06-02') AND match(product_name, '(?i)(^|,|\\.|-|;|"|\\s)(pattern1|pattern2)(\\.|\\s|$|-|,|;|")') -
Если я правильно помню, у кликхауса нет кеша результатов запросов
-
Хм. Но ведь справедливо бы его сделать, если запрос внутри одной партиции. Наверное. Но ладно, Спасибо!
-
кешируйте на стороне приложения
и попробуйте поменять match на что нибудь по проще
у вас в люм случае выбирается столбец
и вместо SELECT *
только те столбцы которые нужны
а то у вас таблица читается вся за двое суток...
и потом фильтруется по столбцу на CPU через match -
chproxy это умеет
-
-
про яндекс облако? а этих Cloud много
-
-
-
облако тиктока подойдет в сингапуре 🙂 ?
-
-
Спасибо за ответы @den_crane @BloodJazMan
-
и в чем вопрос? в каком облаке такое можно?
-
ну нормальная схема. рабочая вполне
сколько данных то сырых не сжатых такий планируете? -
-
https://domclick.ru косплеят (импортозамещают) ClickHouse. Эта шутка за -200 -- баян ?Link
Найти, купить, снять квартиру, комнату, дом и коммерческую недвижимость в Москве. Объявления о продаже и аренде недвижимости от партнеров и проверенных собственников. Бесплатное размещение объявлений.
-
Где косплеят, как косплеят?
-
Click = Клик
House = дом
же -
Шутка за минус стопицот, да.
-
Это понятно. Но боян ли ?
-
Это вообще про недвижимость
Причем тут СУБД?
попалась на тупую шутку -
Да
-
Спасибо
-
Подскажите пожалуйста почему так не получается дедуплицировать ?
и какие варианты ?
```OPTIMIZE TABLE db_name.table_name PARTITION toYYYYMM(today()) DEDUPLICATE;```
ошибка
Code: 62. DB::Exception: Syntax error: failed at position 63 ('DEDUPLICATE'): DEDUPLICATE. Expected one of: FILTER, OVER, token, DoubleColon, MOD, DIV, NOT, BETWEEN, LIKE, ILIKE, NOT LIKE, NOT ILIKE, IN, NOT IN, GLOBAL IN, GLOBAL NOT IN, IS, AND, OR, QuestionMark. (SYNTAX_ERROR) (version 22.3.3.44 (official build))
ключь партицирования YYYYMM -
```OPTIMIZE TABLE db_name.table_name PARTITION 202205 DEDUPLICATE;``` - норм отрабатывает
-
Ну вы должны указать имя партиции и указать модификатор FINAL. А можно не указывать.
-
PARTITION tuple(toYYYYMM(today()))
-
спасибо 🙏
- 06 May 2022 (158 messages)
-
-
Сделать такую же таблицу, Выполнить Detach table, скопировать ее данные в другое место, выполнить attach table и там и там. Потом удалить лишние колонки в новой таблице
-
и помнить о том что если таблица реплицируется то attach делать только на 1 реплике 🙂
-
Insert … select
Новая таблица на том же сервере? -
А вот по поводу репликации и аттач. Я так понял из документации что наоборот, аттач не реплицируется и его руками нужно делать на каждом сервере
-
возможно сейчас да, из моего старого опыта (1 год назад или 2) вполне себе реплицировался
-
по этому у меня тогда вышло х2 данных случайно))))
-
-
переименуйте на уровне view
-
-
всем привет.
Помогите решить проблему
Clickhouse 22.1.3.7
Не понимаем даже куда копать
Проблема на одной ноде кластера
2022.05.06 13:01:07.671220 [ 49385 ] {} <Fatal> BaseDaemon: ########################################
2022.05.06 13:01:07.671266 [ 49385 ] {} <Fatal> BaseDaemon: (version 22.1.3.7 (official build), build id: D11BC54A7FE20E44) (from thread 49384) (no query) Received signal Segmentation fault (11)
2022.05.06 13:01:07.671292 [ 49385 ] {} <Fatal> BaseDaemon: Address: NULL pointer. Access: read. Address not mapped to object.
2022.05.06 13:01:07.671316 [ 49385 ] {} <Fatal> BaseDaemon: Stack trace: 0x173f211f 0x173f4f21 0x173f5384 0x173f9700 0x7f5614c79ca2 0x7f5614c79eb3 0x7f56149a29fd
2022.05.06 13:01:07.671360 [ 49385 ] {} <Fatal> BaseDaemon: 2. tcache_bin_flush_small @ 0x173f211f in /data/clickhouse/bin/22.1.3.7/clickhouse
2022.05.06 13:01:07.671382 [ 49385 ] {} <Fatal> BaseDaemon: 3. ? @ 0x173f4f21 in /data/clickhouse/bin/22.1.3.7/clickhouse
2022.05.06 13:01:07.671397 [ 49385 ] {} <Fatal> BaseDaemon: 4. ? @ 0x173f5384 in /data/clickhouse/bin/22.1.3.7/clickhouse
2022.05.06 13:01:07.671412 [ 49385 ] {} <Fatal> BaseDaemon: 5. tsd_cleanup @ 0x173f9700 in /data/clickhouse/bin/22.1.3.7/clickhouse
2022.05.06 13:01:07.671436 [ 49385 ] {} <Fatal> BaseDaemon: 6. __nptl_deallocate_tsd @ 0x7ca2 in /usr/lib64/libpthread-2.17.so
2022.05.06 13:01:07.671464 [ 49385 ] {} <Fatal> BaseDaemon: 7. start_thread @ 0x7eb3 in /usr/lib64/libpthread-2.17.so
2022.05.06 13:01:07.671484 [ 49385 ] {} <Fatal> BaseDaemon: 8. __clone @ 0xfe9fd in /usr/lib64/libc-2.17.so
2022.05.06 13:01:07.857311 [ 49385 ] {} <Fatal> BaseDaemon: Calculated checksum of the binary: 38FD0E3944230CBD1E0C1028A9D68C83. There is no information about the reference checksum.
2022.05.06 13:01:19.601666 [ 94333 ] {} <Fatal> Application: Child process was terminated by signal 11. -
можете сделать MV с опцией TO, и отправлять данные в обычную таблицу со всеми фичами
-
если на одной - прогоняли memtest ? банально, но...
-
Спасибо
-
К сожалению, нет возможности прогнать тест памяти, это ВМ и у меня нет на ней полных прав
-
ну в вм бессмысленно прогонять.
-
похоже, что clickhouse насилует память интенсивнее чем memtest. Тут на одной машинке 22.{2|3|4} крашатся на самых разных операциях, а memtest счастлив в полной мере.
-
попробуйте смигрировать вм на другой хочт и попробовать ещё раз. Если перестало повторяться - то хост дефективный
-
НИЧОСИИ
-
NUMA ?
-
благодарю, попробую
-
hetzner :)
-
ROWHAMMER ? мемтест вроде как не обнаруживает это
-
а в хетзнере память без ECC ?!
-
Там и датацентры иной раз без серверов, чисто commodity hardware.
-
Atach table нет, не реплицируется
Attach partition реплицируется. Если выполнить на двух репликах все удвоится -
спасибо
-
так rename column
-
@den_crane подскажи пожалуйста как лимитировать потребление памяти ClickHouse на операциях типа select distinct ? понятно что через задействование диска, по-другому никак. swap не предлагать.
-
Конечно можно
-
И сколько строк в system.mutations where not is_done ?
-
А это не только для семейства движков MergeTree?
-
Distinct же можно переписать в groupby и выставить спиллинг external before groupby
-
о, интересно. по какому заклинанию искать доку на тему того как залимитировать group by ?
-
-
Это и есть это семейство. в семейство не входят log, memory, ...
-
max_bytes_before_external_group_by
-
а, да, извиняюсь, репликейтед туда тоже входит
-
Спасибо!
-
просто при попытке написать запрос на rename column получаю такую ошибку
-
-
вам гадит jetbrains
-
-
Datagrip пытается валидировать синтаксис sql используя знания о кх трехлетней давности.
-
-
тогда действительно возможно проблема в железе. Я наступал в хецнере на бажный AMD CPU (или перегрев), купил 8 серверов, на одном КХ падал, заменил на другой такой же, все ОК.
-
-
-
спасибо, буду пробовать запускать на других хостах
-
Здравствуйте!
Подскажите пожалуйста, есть таблица ReplacingMergeTree, с колонкой-версией origin_event_version
В таблице есть две записи с одинаковым ключем сортировки и одинаковым ключем партиционирования и одинаковой версией origin_event_version
Должна ли удаляться дублирующая запись при этих данных?
Делал OPTIMIZE TABLE numbers FINAL, дубликаты не удалились.
Если делать SELECT FROM numbers FINAL, дубликата нет.
Параметры таблицы:
ENGINE=ReplacingMergeTree("origin_event_version") PARTITION BY toYYYYMMDD("datetime") ORDER BY ("datetime", "origin_id", "origin_event_uuid") -
На скриншоте видно, что разница только в колонке id (не входит в ключ сортировки), и что _partition_id одинаковый
-
Добрый день,
Такой вопрос меня волнует, возможно ли одним запросом собрать данные?
Есть таблица с кодами датами в CH
| code date
| 1001983 2019-02-28
| 1010053 2019-02-28
где code может быть либо SKU либо группой SKU, но только либо тем, либо другим
1001983 - SKU
select ref from item where sku = 1001983
1010053 - группа SKU
select ref from item where group_sku = 1010053
Нужно получить данные по ref из item по code таблицы
В sm sql была возможность Outer apply ставить -
optimize final выполнился?
-
да,
OPTIMIZE TABLE numbers FINAL
Query id: cde3c97b-42c8-4676-8970-63dade842192
Ok.
0 rows in set. Elapsed: 273.876 sec. -
в system.merges закончился мердж?
-
да,
SELECT *
FROM system.merges
Query id: 3d7765f0-2775-44ca-9fa4-050d5961f3b4
Ok.
0 rows in set. Elapsed: 0.006 sec. -
в принципе не обязательно оставляет уникальные строки, ну попробуйте еще дедупликацию сделать optimize deuplicate
-
Добавьте в селект виртуальную колонку _part
-
-
Final мержит до упора если есть возможность. Если парты очень большие и места на диске нет, то межр не случится
-
тоже пробовал,
optimize table numbers final deduplicate by "datetime", "origin_id", "origin_event_uuid";
не помогало -
о, а вот тут точно. места на диске мало, не догадался посмотреть
-
-
Так проще размеры партов посмотреть и место на диске
-
парты по 200 мб максимум, а вот места на диске было меньше 100 мегабайт, прям впритык :/
освободил 8 гб, запустил optimize еще раз.
запрос отвалился в итоге по таймауту, но видимо всё еще маслает, в system.merges обновляются записи.
но дубликаты пропали.
Спасибо большое! -
потому, что нельзя делать две агрегации в одном запросе
Code: 184. DB::Exception: Aggregate function sum(avg_in_bps) is found inside another aggregate function in query: While processing sum(avg_in_bps). (ILLEGAL_AGGREGATION) (version 21.11.11.1 (official build)) -
мая 06 17:17:08 localhost clickhouse-server[1478172]: 2022.05.06 17:17:08.250884 [ 1478172 ] {} <Fatal> Application: Child process was terminated by signal 9 (KILL). If it is not done by 'forcestop' command or manually, the possible cause is OOM Killer (see 'dmesg' and look at the '/var/log/kern.log' for the details).
мая 06 17:17:08 localhost systemd[1]: clickhouse-server.service: Succeeded.
мая 06 17:17:08 localhost systemd[1]: clickhouse-server.service: Consumed 2h 15min 18.911s CPU time.
У кликхауса ПО ДЕФОЛТУ есть вачдог. ЗАЧЕМ?! если есть systemd...контейнеры тоже все умеют перезапускать.
ну как-бы и ладно. но если чайлд процесс прибить SIGKILL (так делает earlyOOM) то родительский процесс выходит с кодом 0! ну и systemd конечно его не перезапускает. Ну зачем так. Разумеется мы отключили вачдог, но у нас есть куча клиентов на старых версиях нашей системы с кликхаусом. БОЛЬ. -
Вобще, выбор дефолтов у КХ доставляет в разных местах. Отлично что всё это настраиваемо (прям радует) но сами значения выбраны... крайне странно
-
я не об этом.
представьте у вас на входе значения 1,2,3 вам нужен max -> 3 , а вы сначала считаете среднее, оно получается (1+2+3)/3 =2, а затем вы считаете max(2) и говорите что результат неверный. -
хм… понял, спасибо большое
-
и да, в 2022 году нет интеграции с Systemd. (мы запатчили) чтобы сообщеать системде, что КХ готов принимать запросы.
-
хахахахаха, ватчдог не перезапускает (его можно выключить, настройкой)
-
да, патч состоит из 1 строки.
-
ну мы и выключили. Нафиг он вобще нужен по дефолту. кто такой дефолт придумал ?!
-
Алексей очень долго мечтал о возможности записать в лог КХ инфу о том что процесс КХ умер по причине ....
и запилил ватчдог -
отлично. зачем по дефолту сделал?
-
да и максимум что можно узнать - это название сигнала.
-
системда это пишет
-
Он очень странный человек, я согласен с ним на только 5% по любому вопросу (при этом я конформист), благодаря этому у нас есть КХ.
-
Такие баги кто-нибудь будет фиксить в КХ ? у меня ощущения что нет
-
(если я зарепорчу)
-
но все равно не совсем понятно.. Я же персентиль считаю из набора уже агрегированных значений. Т.е. например из набора уже усредненных значений считается персентиль.
-
конечно это не будут фиксить
-
каеф
-
как и интеграцию с системд. правильно?
-
-
-
-
-
потому что Яндексу это не нужно, а значит это не нужно никому.
-
так?
-
ну я просто чтобы понимать.
-
никаких наездов
-
Доброго дня, Csv откройте, может там в первой строчке дата, а потом уже строки нормальные идут. Если так, то сотрите вобще эту дату.
-
-
попробуйте запятые вместо ;
-
прикол конечно) но сработало
-
вы о чем? КХ в systemd работает, есть возможность настройкой выключить вотчдог, я выключил
# cat /etc/default/clickhouse
CLICKHOUSE_WATCHDOG_ENABLE=0 -
clickhouse-client --format_csv_delimiter=";" --query="...."
-
сейчас баг таки зарепорчу и всё станет понятно. делаю это в данный момент.
-
чтобы точки с запятыми приняло
-
вы даже не представляете настолько я далек от Яндекса, и как Яндекс далек от Кликхауза.
-
ладно. значит вопрос кому-то другому...
-
https://github.com/ClickHouse/ClickHouse/issues/8685 - этот баг репортил мой коллега ещё 2 года назад.Notify systemd about successful startup · Issue #8685 · ClickHouse/ClickHouse
Use case I have a service which starts after clickhouse-server.service startup, but clickhouse-server.service considered started right after fork called by systemd (Type=simple). This causes connec...
-
я только дополнил
-
С моей точки зрения это ну мелочь, чинится настройкой, фигня какая-то.
(Я 8 часов в день чиню у клиентов крешлупы, неработающие мержи, застрявшие очереди репликации, лишние парты, потеряные парты, по локоть в коде и зукипере, с моей точки зрения КХ работает минуты 3 в год, остальное время лежит) -
У нас КХ работает нормально в основном. но когда падает - падает громко
-
и настройкой не чинится. Костылями вокруг - да.
-
У нас где-то 3К серверов с КХ (не кластер :), просто не связанные меж собой никак, разные базы) и все разные и нами не управляемые (входит в состав нашего коробочного продукта). И надо сделать чтобы оно ну хоть немного самолечилось
-
всего 8? маловато будет
-
у меня 2 работы, я больше 14 часов в день не могу работать.
-
-
Это всё из-за старости, выгорание ;)
-
эка вы лихо 14 + 16 вывели в сутки. готовый проект менеджер!
-
нет, это к 8, с арифметикой норм )
-
@den_crane Делаю всё по документации:
https://clickhouse.com/docs/ru/sql-reference/statements/select/group-by/#select-group-by-in-external-memoryСекция GROUP BY | ClickHouse Docsselect-group-by-clause}
-
-
А памяти не хватает.... ЧЯДНТ ?
-
@bvt123 тот же вопрос
-
200 мегабайт ?
-
Издеваетесь ?
-
да.
-
нет.
-
в чём проблема ? если слишком мало - то надо поправить доку.
-
либо показать как надо считать если там не всё так тупо линейно
-
я просто хотел проверить как работает. Где гарантии что сработает если будет 20 ГБ ?
-
а где max_threads=1 ?
-
FAIL
-
доку поправить бы. это не очевидно
-
это нормально. Иногда мне не хватает 2TB ОЗУ. Это ожидаемо. By design
-
В доке 10000000000, а у вас 100000000
-
дада. сарказм понят.
-
очень смешно, да
-
нет сарказма
-
ПОМОГЛО
-
круть
-
а нет. рано радовался
-
-
В чём прикол, в доке по 10 нулей, у вас по 8
-
что так, что так. на 99% падает
-
дак в доке наверно и таблица другая. У меня нет столько оперативы в этой инсталляции. И там число чисто для примера же.
-
что за дурацкий стёб.
-
Блэт, ну тогда ставьте 10 и 20 мегабайт
-
Это же так же как 100 и 200
-
а сколько озу у сервера?
-
8 ГБ. можно КХ отдать не более 3
-
вот только не надо вот мол про днищенское железо. это не моё.
-
Разработка и вежливое общение тоже
-
с таким количество строк на таких серверах справляется только КХ.
-
ну поставьте max_memory_usage='3G', max_bytes_before_external_group_by='1G'
-
попробую. Но всёже есть какая-то методика расчёт чтобы не пальцем в небо? в доке напиано в 2 раза... а тут в три. может там константу какую прибавлять. Просто есть сервера где больше оперативы. 32 например.
-
Я не помню, чтобы были проблемы на нормальном количестве оперативной памяти при GROUP BY. И у нас примерно max_memory_usage / 2
-
нету. Изначально писалось под сервера у которых >64. У ydb вон вообще под железки от 100
-
если оперативки мало то max_bytes_before_external_group_by надо делать маленьким, типа если 4 то 1.
делается спиллинг на диск и группируются кусочки, но результат надо собрать в единое целое, и кусочки собираются в 256 бакетов, и 1/256 результата должна поместится в память -
256 бакетов это часть алоритма, изменить нельзя, это даже не хардкод велью
-
> типа если 4 то 1
это соотношение max_memory_usage к max_bytes_before_external_group_by?
1/256 от суммы размеров всех хешей от уникальных полей по которым делаем груп бай ? -
Полгода назад был доклад про то, что кафка как менеджер очередей для накопления пачки инсёртов более не нужна, и теперь можно напрямую инсёртить, не накапливая предварительно. Поправьте меня если ошибаюсь. Как проектировать новую систему с брокером очередей для больших инсертов или можно без этой прослойки
-
Можно ли вставлять в ClickHouse по одной строке?
В этом видео мы рассмотрим производительность ClickHouse при вставке в асинхронном режиме и сравним его производительность с kittenhouse в режиме reverse proxy. Презентация Яндекса: https://www.youtube.com/watch?v=W6h3_xykd2Y&t=4940s Установка kittenhouse: 1. Установите Go по инструкциям из https://golang.org 2. Склонируйте мой форк kittenhouse: `git clone https://github.com/YuriyNasretdinov/kittenhouse.git` 3. Зайдите в директорию с kittenhouse и установите его: `cd kittenhouse; go install -v` 4. Собранный kittenhouse будет находиться в `~/go/bin/kittenhouse` Использование reverse proxy: Предположим, что ClickHouse находится на localhost на порту по умолчанию, тогда reverse proxy на порту 8124 (открытый в интернет по умолчанию (!)) будет запущен таким образом: `kittenhouse -u='' -g='' -p 8124 -reverse -ch-addr=127.0.0.1:8123` Использование утилиты inserter для бенчмарков: 1. Сохраните файл из Gist как inserter.go в отдельной директории: https://gist.github.com/YuriyNasretdinov/be43cf200c2c3a160f13e3b5d784aa3c 2. Соберите файл с помощью `go mod init; go get .; go install -v` 3. Утилита inserter будет находиться в `~/go/bin/inserter` 4. Подберите нужные Вам параметры (использовать ли ClickHouse, какой адрес сервера, сколько нужно сделать вставок, и т.д.) и запустите бенчмарк. Посмотрите видео, для того, чтобы увидеть пример использования. В конце работы выводится среднее количество запросов в секунду (QPS) во время работы утилиты.
- 07 May 2022 (16 messages)
-
لا تدع أي شخص يخدعك من أموالك. تقرير إلى صندوق الوارد الخاص بي لإرشادات تعدين العملات المشفرة. شكرًا
-
Всем привет! Верно ли, что вместо null лучше хранить некое значение и потом выполнять nullIf()? Или без разницы и это чепуха?
Движок MergeTree. -
Лучше вместо нуллов хранить пустые строки, или нули, да
-
не чепуха, нуллы требуют отдельный битмап и соответственно оверхед. другое дело, насколько это критично? если не критично, то нуллы лучше в плане логической чистоты кода.
-
спасибо!
-
Приветствую.
В старую табличку добавил geo
ALTER TABLE default.a_1_merge_summ_minuts ADD COLUMN geo LowCardinality(FixedString(2)) , MODIFY ORDER BY (days, sid, tid, geo)
Появились первичные ключи.. которых не было
ENGINE = SummingMergeTree
PRIMARY KEY (days, sid, tid)
ORDER BY (days, sid, tid, geo)
Вставка сюда из MV ( добавлю geo ) будет не по первичному ключу а по ORDER BY ?
В доках вроде описано, но хочу уточнить
Работает только для таблиц семейства MergeTree (в том числе реплицированных). После выполнения запроса ключ сортировки таблицы заменяется на new_expression (выражение или кортеж выражений). Первичный ключ при этом остаётся прежним.
Отличие заключается в том, что для таблиц SummingMergeTree при слиянии кусков данных ClickHouse все строки с одинаковым первичным ключом (точнее, с одинаковым ключом сортировки) заменяет на одну -
-
первичных ключей нету в КХ
PRIMARY KEY описывает поля которые входят в главный индекс
ORDER BY описывает как строки в таблице отсортированы и что мержи будут использовать для схлапывания строк для SummingMergeTree -
>Я насколько понимаю старые данные останутся как есть схлопнуты, а новые инсерты уже пойдут по новому ORDER BY ?
да. Абстрактно говоря старые данные тоже уже схлопнуты по новому ORDER BY, их не надо схлопывать, там одно и тоже значение geo (пустое / дефолтное) -
>Появились первичные ключи.. которых не было
PRIMARY KEY был неявно, незримо, просто был равен ORDER BY, поэтому не присутсвовал в DDL таблицы -
Спасибо большое 🤘
-
А как сейчас лучше сделать нужно дропнуть просто эту табличку ?
CREATE MATERIALIZED VIEW default.MV_1_minuts TO default.a_1_merge_summ_minuts
и новую создать с geo тут же ? -
-
-
да drop/create
-
👍
- 08 May 2022 (29 messages)
-
снимите меня с ручничка пожалста, что CH не нравится ?
Code: 69. DB::Exception: Decimal value is too big: 1 digits were read: 5e0. Expected to read decimal with scale 2 and precision 2: (at row 1)
:
Row 1:
Column 0, name: dt, type: Date, parsed text: "<DOUBLE QUOTE>2022-04-08<DOUBLE QUOTE>"
Column 1, name: ts, type: DateTime, parsed text: "<DOUBLE QUOTE>2022-04-08 16:31:43<DOUBLE QUOTE>"
Column 2, name: child, type: UInt32, parsed text: "59555293"
Column 3, name: zoneId, type: UInt32, parsed text: "0"
Column 4, name: appId, type: String, parsed text: "<DOUBLE QUOTE>com.xiaomi.mipicks<DOUBLE QUOTE>"
Column 5, name: appName, type: String, parsed text: "<DOUBLE QUOTE>GetApps<DOUBLE QUOTE>"
Column 6, name: usageData, type: String, parsed text: "<DOUBLE QUOTE>{<DOUBLE QUOTE><DOUBLE QUOTE>secondUsageDay<DOUBLE QUOTE><DOUBLE QUOTE>:0,<DOUBLE QUOTE><DOUBLE QUOTE>secondUsageWeek<DOUBLE QUOTE><DOUBLE QUOTE>:0,<DOUBLE QUOTE><DOUBLE QUOTE>secondUsageMonth<DOUBLE QUOTE><DOUBLE QUOTE>:8}<DOUBLE QUOTE>"
Column 7, name: usageTs, type: DateTime, parsed text: "<DOUBLE QUOTE>2022-04-08 19:32:42<DOUBLE QUOTE>"
Column 8, name: tz, type: Decimal(2, 2), parsed text: "5.00"ERROR
Code: 69. DB::Exception: Decimal value is too big: 1 digits were read: 5e0. Expected to read decimal with scale 2 and precision 2. (ARGUMENT_OUT_OF_BOUND) (version 22.5.1.1328 (official build))
: While executing ParallelParsingBlockInputFormat: data for INSERT was parsed from stdin: (in query: INSERT INTO appUsageWithAggregated FORMAT CSV). (ARGUMENT_OUT_OF_BOUND) -
-
-
MySQL - Value of 1 in DECIMAL(2, 2) is coming out as 0.99
I am storing monetary values, and I read that FLOAT has internal rounding problems (although I can't say I ever noticed any problems) and that it is better to use DECIMAL. So I have been using DEC...
-
DECIMAL(2, 2) only allows a range of -0.99 to 0.99
-
-
🔥KAЧECTBEНHAЯ И ЭΦФEКTИBНАЯ PЕКЛ𝖠МА TELΕGRAM🔥
❗️НИКAKИⲬ 𝖮ГPАНИЧЕНИЙ ΠО КОHТEНТᎩ❗️
BериՓ,шоп,cайт,про𝚎кт,нaрⲕ,peферaлы,ycлуги, ⲕаналы и т.д.
✔️ Софт coбcтⲃeннoй paзpaбoтκи
✔️ Aⲃтoотвeтчик c ⲃaшим т𝚎кстом
✔️ Cтaтиcтикa
✔️ Bысоⲕaя чacтoтноcть
✔️ Упоминaни𝚎 yчастникоⲃ чатa через @
✔️ Постоянно добавляются новые гpуппы, подбeрем под ⲃашy т𝚎мaтику
✔️ Πoмoгaeм cocтaвить и ⲕpacивo oфopмить oбъяⲃлени𝚎
✔️ Бoльшой опыт SMM
✔️ Γapaнт - любой пpoвeренный вpеменем
❗️НЕ ОTКЛАДЫBAЙ Р𝖠ЗВИТИE ƃИЗНΕСA - ЗАKАЗЫВАЙ РEKЛАМᎩ ΠPЯ𝖬О СЕЙЧ𝖠С❗️
@bestarget -
51704444 ./lib/clickhouse
51701892 ./lib/clickhouse/data
47826500 ./lib/clickhouse/data/system
А нормально что таблица system ест 90% места? -
-
-
-
Ну вот про логи не знал, в доке сей момент был?
-
Уже тоже в это наступил
-
О, Марк. Чем лечил?
-
Там есть опции по неписанию данных таблиц. @bvt123 подсказал
-
На память не помню, триггерни в рабочее время - скину
-
Окей, если до вторника не найду, тригерну, но наводок в принципе хватает
-
А ещё, старые удалить по названию нельзя. Ну тоесть можно, но там есть подвох что они могут назвать немного иначе (_1, _2 и тп). Поэтому надо скрипт который выбирает из system.parts все таблицы у кого бд=систем. И эти таблицы грохать
-
Следующая грабля будет в том что там есть лимиты на обьем данных которые можно грохнуть
-
Удобно
-
А мы знакомы ?
-
Ты был завсегдатаем Джобса, я тебя помню как нормального)
-
О_о. Но всеравно не понял кто ты
-
-
Ага, спасибо. Это оно
-
Но в это надо предварительно наступить прежде чем прочитать
-
.
-
Равно как и с удалением больших таблиц а вернее партишенов
-
очень, шаловливые ручки случайно не натворят беды
- 09 May 2022 (117 messages)
-
доброго утра
подскажите пожалуйста, лыжи не едут или я тупой
что не так с exponentialMovingAverage?
с over или без, она выдает значение очень далекое от среднего, и чем больше выставляю период - тем меньше это значение становится.
к тому же, вне зависимости от периода, сохраняется прямая пропорция между значениями. если подобрать множители, то значения с разных периодов сходятся 1 в 1.
чяднт?
на всякий случай пошел в эксель, там по известной формуле ema=price*alpha + prev_ema*(1-alpha) при alpha=2/(1+N) - все выходит верно, я получаю средние значения около входных...
или если есть у кого рецепт расчета EMA в кликхаусе, поделитесь плиз -
входные данные: выборка time_open, close_price из серии минутрых свечей с биржи. в качестве значения time в ema скармливаю toUnixTimestamp(time_open)
-
А скрипты внезапно не отработают на куче инсталляций.
-
Это читали?
https://altinity.com/blog/2020/3/9/real-time-moving-average-with-clickhouse-live-viewsReal-time Moving Average with ClickHouse Live ViewsIn data analytics, analysts often use moving averages. Moving averages help to smooth data series as well as identify long term trends. New Live View tables start to bring real-time capabilities to ClickHouse.One of the applications of Live View tables is a calculation of real-time metrics on the event data. Readings from IoT sensors, price ticks from the stock exchange, or some metrics from your production servers are some of the examples of event data streams. ClickHouse can store all this data with a good compression ratio and excellent analytical query performance.
-
❗️Срoчно требуютcя сoтpyдниⲕи на доcтaвку и oпeрaторы(удал𝚎ннo) ⲃ oнлайн магазин, любoй гоpод PФ ❗️
@lavkaif_bot -
Всем привет. Подскажите, в чем может быть трабл. Пытаюсь через DB Viewer импортировать CSV, в котором есть две колонки типа Array. Одна с текстом, другая числовая. Текстовая все ок парсится, а вот с числовой засада.
Тип столбца Array(Float32)
Значение столбца:
"[-0.0014539104938000324, -0.0005765507130586335, -0.0003760113346034566, -7.520226692069132e-05, -5.013484461379422e-05, -0.0026195456310707478, -0.0004261461792172508, -3.760113346034566e-05, -1.2533711153448555e-05]"'
Подскажите плз в чем может быть трабл? -
Пробовали Float64?
-
Неа. Ща попробую.
-
Нифига. Та же ошибка....
`Code: 130. DB::ParsingException: Cannot read array from text, expected comma or end of array, found ''':
Column 24, name: ColumnName, type: Array(Float64), parsed text: "["ERROR
Code: 130. DB::ParsingException: Cannot read array from text, expected comma or end of array, found '''. (CANNOT_READ_ARRAY_FROM_TEXT) (version 22.3.3.44 (official build))
: While executing TabSeparatedRowInputFormat: (at row 1)
. (CANNOT_READ_ARRAY_FROM_TEXT) (version 22.3.3.44 (official build)) -
Привет! Есть ли у кого-то опыт отсылки метрик в Prometheus на основе sql-запроса в СH? Какие будут рекомендации?
-
-
-
В кликхаусе есть predefined query, которые по http можно дёргать и получать ответ сразу в формате прометея
https://clickhouse.com/docs/en/interfaces/http#predefined_http_interfaceHTTP Interface | ClickHouse Docshttp-interface}
-
это не то. это простое скользящее среднее, а нужно именно экспоненциальное. там не просто сумма, а накапливающаяся сумма произведения нового значения на пропорциональный сглаживающий фактор и произведения предыдущего значения на обратно пропорциональный сглаживающий фактор.
если совсем просто, то ema=p*a + ema*(1-a)
сама по себе функция рекурсивная.
и в кх есть exponentialMovingAverage, и даже дока по нему есть... "какая-то", но считает он хрень, хотя в описании доки сказано, что он считает именно то, что мне нужно, буквально ссылка на википедию
в общем понятно.
сделаю отдельный скрипт, которым буду перегенерять метрику и потом чекать в графане, неудобно ну и хер с ним... -
соглашусь, неплохой вариант
необходимость рестарта правда отталкивает очень -
так он же явно пишет, что ему одинарная ковычка в конце не нравится
-
к тому же, то, что они там делают, делается одной строчкой с оконной функцией...
-
Да, видел, не совсем ещё понял что именно мне нужно, буду разбираться :) спасибо
-
ну возможно баг, покажите пример на https://github.com/ClickHouse/ClickHouse/issues
без конкретики тяжело понять о чем вы.
например over без order by считает за все окно,
select x, sum(x) over () from (select number x from numbers(10));
┌─x─┬─sum(x) OVER ()─┐
│ 0 │ 45 │
│ 1 │ 45 │
│ 2 │ 45 │
│ 3 │ 45 │
│ 4 │ 45 │
│ 5 │ 45 │
│ 6 │ 45 │
│ 7 │ 45 │
│ 8 │ 45 │
│ 9 │ 45 │
└───┴────────────────┘
VS
select x, sum(x) over (order by x) from (select number x from numbers(10));
┌─x─┬─sum(x) OVER (ORDER BY x ASC)─┐
│ 0 │ 0 │
│ 1 │ 1 │
│ 2 │ 3 │
│ 3 │ 6 │
│ 4 │ 10 │
│ 5 │ 15 │
│ 6 │ 21 │
│ 7 │ 28 │
│ 8 │ 36 │
│ 9 │ 45 │
└───┴──────────────────────────────┘Issues · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
еще раз, sum, avg и прочие - простые аггрегирующие функции, они берут всю кучу и считают.
exponentialMovingAverage должен высчитываться рекурсивно из последнего значения.
https://clickhouse.com/docs/en/sql-reference/aggregate-functions/reference/exponentialmovingaverage/ -
я не про это. OVER без ORDER BY выдает КОНЕЧНЫЙ результат в каждой строке для всего окна , он всегда ОДИН/EДИН.
-
вот взять сейчас курс битка. 33к-35к. среднее щначение должно быть где то в этом диапазоне, вне зависимости от периода.
эта же функция с периодами 9, 12, 26 может выдавать значения около 3000, 2000, 1000 соответственно. и это ни разу не среднее, даже если пробовать их перемнобать на период. и опять же, пропорция у всех этих значений вне зависимости от периода, сохраняется абсолютно прчмая, без какого либо сдвига, в котором заключается суть этого среднего значения -
?
т.е. rows between X preceding and current row выдаст не тот набор, который выдаст вложенный селект с лимитом X? -
в КХ не работают "выдаст вложенный селект с лимитом X"
-
размер окна exponentialMovingAverage задается в параметре exponentialMovingAverage(1)
SELECT 1 AS value, number FROM numbers_mt(10);
┌─value─┬─number─┐
│ 1 │ 0 │
│ 1 │ 1 │
│ 1 │ 2 │
│ 1 │ 3 │
│ 1 │ 4 │
│ 1 │ 5 │
│ 1 │ 6 │
│ 1 │ 7 │
│ 1 │ 8 │
│ 1 │ 9 │
└───────┴────────┘
select value, time, exponentialMovingAverage(1)(value, time) over ()
from ( SELECT 1 AS value, number time FROM numbers_mt(10) ) ;
┌─value─┬─time─┬─exponentialMovingAverage(1)(value, time) OVER ()─┐
│ 1 │ 0 │ 0.9990234375 │
│ 1 │ 1 │ 0.9990234375 │
│ 1 │ 2 │ 0.9990234375 │
│ 1 │ 3 │ 0.9990234375 │
│ 1 │ 4 │ 0.9990234375 │
│ 1 │ 5 │ 0.9990234375 │
│ 1 │ 6 │ 0.9990234375 │
│ 1 │ 7 │ 0.9990234375 │
│ 1 │ 8 │ 0.9990234375 │
│ 1 │ 9 │ 0.9990234375 │
└───────┴──────┴──────────────────────────────────────────────────┘
select value, time, exponentialMovingAverage(1)(value, time) over (order by time)
from ( SELECT 1 AS value, number time FROM numbers_mt(10) ) ;
;
┌─value─┬─time─┬─exponentialMovingAverage(1)(value, time) OVER (ORDER BY time ASC)─┐
│ 1 │ 0 │ 0.5 │
│ 1 │ 1 │ 0.75 │
│ 1 │ 2 │ 0.875 │
│ 1 │ 3 │ 0.9375 │
│ 1 │ 4 │ 0.96875 │
│ 1 │ 5 │ 0.984375 │
│ 1 │ 6 │ 0.9921875 │
│ 1 │ 7 │ 0.99609375 │
│ 1 │ 8 │ 0.998046875 │
│ 1 │ 9 │ 0.9990234375 │
└───────┴──────┴───────────────────────────────────────────────────────────────────┘ -
SELECT
value,
time,
exponentialMovingAverage(1)(value, time) OVER (ORDER BY time ASC)
FROM
(
SELECT
10 AS value,
number AS time
FROM numbers_mt(10)
)
Query id: 5a95b327-7e1a-42e8-960e-2cf9f5ea8788
┌─value─┬─time─┬─exponentialMovingAverage(1)(value, time) OVER (ORDER BY time ASC)─┐
│ 10 │ 0 │ 5 │
│ 10 │ 1 │ 7.5 │
│ 10 │ 2 │ 8.75 │
│ 10 │ 3 │ 9.375 │
│ 10 │ 4 │ 9.6875 │
│ 10 │ 5 │ 9.84375 │
│ 10 │ 6 │ 9.921875 │
│ 10 │ 7 │ 9.9609375 │
│ 10 │ 8 │ 9.98046875 │
│ 10 │ 9 │ 9.990234375 │
└───────┴──────┴───────────────────────────────────────────────────────────────────┘ -
-
Всем доброго, товарищи подскажите пожалуйста можно ли в кликхаус заполнить значение в колонке по условию. У меня есть таблица, я создаю представление с доп столбцом, в котором например вложен селект из другой таблицы, если значение есть в таблице значит ставим 1 иначе 0. Перерыл уже весь инет но.. Заранее спасибо
-
Мальчишкам приветик, остальным соболезную:)
-
CREATE MATERIALIZED VIEW default.fs ENGINE=MergeTree() ORDER BY (date, magazin) POPULATE AS(
--DELETE VIEW default.fs
--CREATE TABLE default.fs5 ENGINE=MergeTree() ORDER BY (date, magazin) AS
(
SELECT
l.date as date,
l.magazin as magazin,
l.nomenklatura as nomenklatura,
l.kolichestvo as kolichestvo,
l.summa_so_skidkoy as summa_so_skidkoy,
l.nom_gr as nom_gr,
r.mg as mg,
r.dir as dir,
r.region as region,
r.rayon as rayon,
0 as is_utm
FROM default.sales AS l
LEFT OUTER JOIN default.mags AS r
ON l.magazin = r.magazin
)
)
Сейчас как то так, хотелось бы "0 as is_utm" заполнять сразу по условию 0 или 1 Пните в нужном направлении плиз -
Коллеги, нет ли исследований по запуску ClickHouse в Docker? В плане бенчмарков и насколько это вообще хорошо в продакшне?
Все что удалось накопать по теме из документации:
https://clickhouse.com/docs/en/operations/performance-test/
https://clickhouse.com/benchmark/hardware/ -
-
-
Я просто по следам бенчмарков от PostgreSQL заинтересовался, там скорость могла падать в некоторых случаях
-
вот запрос
SELECT time_ts,
current_price,
exponentialMovingAverage(9)(current_price, time_ts) OVER (ORDER BY "time_ts" ASC) AS ema
FROM (
SELECT time_ts,
current_price
FROM (
SELECT toStartOfInterval(trade_ts, INTERVAL 1 MINUTE) AS time,
toUnixTimestamp(time) AS time_ts,
last_value(price) AS current_price
FROM btb.BTCUSDT_trades
WHERE trade_ts BETWEEN
'2022-05-04' AND
'2022-05-06'
GROUP BY toStartOfInterval(trade_ts, INTERVAL 1 MINUTE)
ORDER BY time ASC
LIMIT 20
)
GROUP BY time_ts, current_price
ORDER BY time_ts ASC
)
GROUP BY time_ts, current_price
ORDER BY time_ts ASC;
и даже если поубирать последние GROUP BY ,то результат не меняется -
Вот не начинайте. Как минимум одна сеть готова просадить производительность до 2+ раз на мелких операциях.
Если, конечно, не хост нетворк -
и вот выхлоп
-
Пусть даже будет хост нетворк, для упрощения
-
Ну тогда я могу сравнить bare metal и виртуалку и сказать что оверхед на сеть в гипервизоре тоже ненулевой))
-
Вот хотелось бы глянуть на что-нибудь вроде Clickhouse in Ubuntu vs. Ubuntu + Clickhouse in Docker, например
-
-
-
-
Ну вот хотелось бы посмотреть на бенчмарки конечно. Ладно, спасибо, тогда сам займусь бенчмарками
-
Здравствуйте, есть идеи?
Таблица ReplacingMergeTree на 300млн с дублями по order by ключу,
Когда запускается запрос через jenkins кидает memory limit, когда запускаю тот же запрос через ch-client на сервере c trace, то такой ошибки нет, по логам 8 ГБ ОЗУ и успешно выполняется
Пользователь один и тот же, аргументы одни и те же
CREATE TABLE db.table ENGINE = MergeTree ORDER BY col SETTINGS index_granularity = 8192 AS SELECT * FROM db.table2 FINAL;
Ошибка
DB::Exception: Memory limit (total) exceeded: would use 27.94 GiB (attempt to allocate chunk of 5242880 bytes), maximum: 27.94 GiB: While executing ReplacingSorted. -
Там наверно если альпайн линукс с дебильным либси
-
Возможно, сейчас уже есть и на дебиане, помню что проблемы были, но не помню какой контейнер тестировали
-
есть ли вероятность что из-за разницы версий у clickhouse-client такое происходит?
jenkins ch-client ClickHouse client version 21.6.5.37 (official build).
сервер ch-client ClickHouse client version 21.11.4.14 (official build).
версия ch 21.11.4 -
разница в итоговой таблице по строчкам почти в 2 раза
-
Ну может и не в этом дело, но лучше иметь клиент такой же версии либо более поздней
-
jenkins поддерживает 2 кх, которые занимаются немного разными вещами
То есть более старый КХ будет работать норм с новым клиентом? -
Я думаю, что вообще выполнять запросы через client не классно и это костыли
-
Какой путь лучше? Через баш же надо как-то запускать)
-
http интерфейс?
-
Я думаю, что любой интерфейс кликхауса, который просто принимает запрос
-
Будет работать без проблем
-
дак клиент и есть такой интерфейс)
-
/report
-
у вас минутные отсчеты, exponentialMovingAverage считает что current_price=0 в остальные 59 секунд
добавьте intDiv(time_ts,60)
exponentialMovingAverage(9)(current_price, intDiv(time_ts,60)) OVER (ORDER BY time_ts) AS ema -
Удалось лишь 6 к 1. что-то у меня не так видимо. про 256 и бакеты если честно я тоже не очень понял. @bvt123 возможно и твоя помощь понадобится (в другом чате, если хочешь).
Суть вопроса - как рассчитать max_memory_usage и max_bytes_before_external_group_by. В документации соотношение 2 к 1, мне приходится делать 6 к 1. Пикантности добавляет ещё и то, что допустим 600М ограничения по памяти выглядит как более гигабайта в топе (RSS). При этом в состоянии ничего не делания — 122 МБ в RSS. Абсолютно точно, конечно, рассчитывать не требуется. но погрешность в несколько раз не очень нравится. Почему это всё важно? скрипт переноса данных будет запускаться на большом количестве инсталляций с разным количеством оперативки.
да, запрос вот такой (для устраниения дубликатов. Старая таблица была не RMT и ещё и с кривым партицированием):
insert into log4 select * from webstat.log3 where day >= '2021-12-01' and day < '2022-01-01' group by *; -
хм, это довольно неочевидно, но помогло.
безмерно благодарствую)
правда теперь еще одна непонятка появилась - он выходит на среднее значение довольно долго. при указаном количестве периодов 5 - на среднее вышел только где-то к 36-40 строке, а при указании максимального нужного мне количества периодов он на среднее вышел уже в 2хх строках.
буду дальше тыкать. еще раз огромное спасибо! -
не обижайтесь, но мне неинтересно обсуждать инсталляции с меньше чем 32ГБ. Это потеря времени. Я буду игнорировать вопросы.
-
ок. тоесть если мем_лимит допустим 16ГБ то правило 2 к 1 бетонно будет работать. верно ?
-
нет, это общая рекомендация, куча исключений.
-
сделать-то можно, просто инсерты будут работать примерно в 10тыс раз медленее.
алиасы таблиц во вьюхах не поддерживаются, пишите имя таблицы в имени поля -
тут все под словом докер понимают что-то свое. Например кубернетис это докер или уже нет?
-
Я имел в виду чистый докер, без кубернетиса, но если есть что-то с кубернетисом, то тоже здорово
-
минимальная разница, на уровне погрешности, никто не заморачивается измерениями.
-
Отлично, спасибо!
-
/report
-
-
/report
-
-
ЧЯДНТ ?
-
возможно версия КХ не поддерживает эту настройку
-
клиент и сервер ТОЧНО одной и тойже версии
-
логично. но откуда тогда клиент об ней знает ?
-
клиент и сервер 146% одной версии
-
что значит знает?
-
начало скриншота. набрал часть сеттинга и нажал таб
-
судя по всему это настройка для таблицы, а не глобально для запросов
-
отсюда и знает
-
нашел информацию про настройку в distributed table engine доке
https://clickhouse.com/docs/en/engines/table-engines/special/distributed/Distributed Table Engine | ClickHouse Docsdistributed}
-
в разделе Distributed Settings
Которые задаются в конце создания таблицы
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = Distributed(cluster, database, table[, sharding_key[, policy_name]])
[SETTINGS name=value, ...]
Могу ошибаться, понятия не имею как distributed работают, но выводы делаю из доки -
-
Спасибо. Я правильно понял, что на MergeTree это работать не будет ?
-
это настройка чисто для distributed
Просто MergeTree движок не distributed, поэтому не будет работать -
Будет
-
ну как я и сказал, понятия не имею как работают distributed) Сорри за дезинфу
-
Есть два типа настроек. Settings и merge_tree settings
-
Хорошо. Где нужно писать min_compressed_bytes_to_fsync_after_merge ? в документации вообще этого нет
-
merge tree которые для всего семейства merge tree?
-
Settings в сессии/профиле пользователя.
-
Merge tree settings либо в секции merge tree либо в settings таблицы
-
ну нет. есть ещё глобальный конфиг сервера. некоторые опции можно только там.
-
Ну ок есть 27 типов настроек.
-
Вы посчитали или на память написали?)
-
Если это не сарказм, то таки жесть
-
MergeTree tables settings | ClickHouse Docs
merge-tree-settings}
-
и что. там про фсинк ни одной опции нет.
-
(проверил, на мердж три позволяет задать у таблицы, но будет ли действовать ещё не проверил)
-
Вряд ли кх позволит абы что ставить в настройках
-
это был ещё один вопрос. не успел задать. может ли так случиться что опцию задал, а она не действует.
-
ну не дописали еще, у меня есть в плане на июль 2026 года
-
SELECT *
FROM system.merge_tree_settings
WHERE name LIKE '%fsync%'
настройки уровня запроса/сессии
select * from system.settings -
Хорошое у вас планирование…. Долгосрочное….
-
Ух-ты. Спасибо!.
-
да, просто это мелкая настройка, для параноиков,
вот например недокументированные geo функции
readWKTMultiPolygon
readWKTPolygon
polygonsWithinSpherical
polygonsDistanceSpherical
polygonsDistanceCartesian
polygonsEqualsCartesian
polygonsSymDifferenceSpherical
polygonsSymDifferenceCartesian
polygonsIntersectionSpherical
polygonsWithinCartesian
polygonConvexHullCartesian
polygonAreaSpherical
polygonsUnionSpherical
polygonPerimeterSpherical
polygonsIntersectionCartesian
polygonAreaCartesian
polygonPerimeterCartesian
polygonsUnionCartesian
cosineDistance
LinfDistance
L2Distance
L1Distance
tupleHammingDistance
LpDistance
distanceL1
distanceLp
distanceL2
distanceLinf
и когда садишься дописать доку, выбираешь что важнее min_compressed_bytes_to_fsync_after_merge или cosineDistance -
ну как-бы не совсем для параноиков. Думаешь как я доехал до этого? у нас накручено оказалось dirty_writeback_centisecs. А потом от клиентов повалилось too many broken parts
-
Можно вспомнить maxIntersections, которой уже 4 года а все еще нет в доке
-
гыгы, я только вчера про нее узнал
-
新增maxIntersections(left_col, right_col)聚合函数, 返回最大同时相交区间数[left; 对]. maxIntersectionsPosition(left, right) 函数返回 "maximum" 间隔的开始.
-
все же поняно 😁
-
https://github.com/ClickHouse/ClickHouse/pull/2012
А принесли не китайцы кстати, просто кое кто более ответственно относится к коллективному заполнению доки )add aggregate functions IntersectionsMax and IntersectionsMaxPos by furmur · Pull Request #2012 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en new aggregate functions: IntersectionsMax(start_column ,end_column) IntersectionsMaxPos(start_column ,end_c...
-
Не так давно слышал что есть(будет) какая-то возможность вставки в CH маленькими батчами без предварительной агрегации, не наведете где посмотреть как работает?
-
ClickHouse - ClickHouse v21.11 Released
We’re continuing our monthly release cadence and blog updates at ClickHouse, Inc. The 21.11 release includes asynchronous inserts, interactive mode,…
-
Спасибо
- 10 May 2022 (45 messages)
-
-
при этом вручную перезагрузка через system reload dictionary работает нормально. После ручного обновления в логе
2022.05.09 20:36:07.680480 [ 4119654 ] {ef86321d-641f-40cd-9b3d-cc112fb24c09} <Trace> ExternalDictionariesLoader: Next update time for '4fd3cbad-43f5-4217-9903-bb18c1e731bd' was set to 2022-05-09 20:36:57
но обновление в назначенное время не происходит -
в clickhouse-server.err.log грепом по 4fd3cbad-43f5-4217-9903-bb18c1e731bd есть вот только такие записи, но они старые:
2022.05.03 18:09:17.000341 [ 1349802 ] {} <Error> ExternalDictionariesLoader: Could not update external dictionary '4fd3cbad-43f5-4217-9903-bb18c1e731bd', leaving the previous version, next update is scheduled at 2022-05-03 18:17:14: Code: 614. DB::Exception: Try 1. Connection to 11.11.11.11:5432 failed: connection to server at "11.11.11.11", port 5432 failed: timeout expired -
Подскажите, пожалуйста, почему не удается установить пакеты clickhouse-server и clickhouse-client на ubuntu?
-
а если основной лог грепать по ExternalDictionariesLoader
-
Репозиторий не добавили
-
ls -l /etc/apt/sources.list.d/
-
Там пробел просто
-
-
Почему только HTTP протокол?
-
\после tee убрать из команды и всё
-
там \ лишний, копи-пейст проблема
-
так реализовали. Все несколько сложнее и через TCP тоже можно, кажется go и python либы уже научились, и КХ клиенту тоже ключ добавят
-
Меня интересует PHP. Что нужно чтобы произошло сие?
-
Всмысле, что добавить нужно и куда
-
Урра!! Спасибо, все получилось (я 3 часа искала ошибку ))))
-
так https://github.com/smi2/phpClickHouse 'port' => '8123', через HTTP работает. При чем тут TCP ?
-
только вот такое, но этот словарь действительно не скофигурирован:
2022.05.10 02:04:35.404283 [ 4157305 ] {89a07857-74b5-4d57-b38b-9efadd6f2526} <Error> executeQuery: Code: 36. DB::Exception: Dictionary (`campaign_tracking`) not found. > -
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0xaebed1a in /usr/bin/clickhouse
1. DB::Exception::Exception<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(int, std::__1::basic_string<char, std::__1::char_trai>
2. DB::ExternalDictionariesLoader::resolveDictionaryName(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_st>
3. DB::ExternalDictionariesLoader::getDictionary(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::shared_ptr<DB::C>
4. DB::TreeOptimizer::apply(std::__1::shared_ptr<DB::IAST>&, DB::TreeRewriterResult&, std::__1::vector<DB::TableWithColumnNamesAndTypes, std::__1::allocator<DB::TableWit>
5. DB::TreeRewriter::analyzeSelect(std::__1::shared_ptr<DB::IAST>&, DB::TreeRewriterResult&&, DB::SelectQueryOptions const&, std::__1::vector<DB::TableWithColumnNamesAnd>
6. ? @ 0x14c5acf2 in /usr/bin/clickhouse
7. DB::InterpreterSelectQuery::InterpreterSelectQuery(std::__1::shared_ptr<DB::IAST> const&, std::__1::shared_ptr<DB::Context const>, std::__1::optional<DB::Pipe>, std::>
8. DB::InterpreterSelectQuery::InterpreterSelectQuery(std::__1::shared_ptr<DB::IAST> const&, std::__1::shared_ptr<DB::Context const>, DB::SelectQueryOptions const&, std:>
9. DB::InterpreterSelectWithUnionQuery::buildCurrentChildInterpreter(std::__1::shared_ptr<DB::IAST> const&, std::__1::vector<std::__1::basic_string<char, std::__1::char_>
10. DB::InterpreterSelectWithUnionQuery::InterpreterSelectWithUnionQuery(std::__1::shared_ptr<DB::IAST> const&, std::__1::shared_ptr<DB::Context const>, DB::SelectQueryO>
11. DB::InterpreterSelectWithUnionQuery::getSampleBlock(std::__1::shared_ptr<DB::IAST> const&, std::__1::shared_ptr<DB::Context const>, bool) @ 0x14cb1780 in /usr/bin/cl>
12. DB::getDatabaseAndTablesWithColumns(std::__1::vector<DB::ASTTableExpression const*, std::__1::allocator<DB::ASTTableExpression const*> > const&, std::__1::shared_ptr>
13. DB::JoinedTables::resolveTables() @ 0x14cdbedf in /usr/bin/clickhouse
14. DB::InterpreterSelectQuery::InterpreterSelectQuery(std::__1::shared_ptr<DB::IAST> const&, std::__1::shared_ptr<DB::Context const>, std::__1::optional<DB::Pipe>, std:>
15. DB::InterpreterSelectQuery::InterpreterSelectQuery(std::__1::shared_ptr<DB::IAST> const&, std::__1::shared_ptr<DB::Context const>, DB::SelectQueryOptions const&, std>
16. DB::InterpreterSelectWithUnionQuery::buildCurrentChildInterpreter(std::__1::shared_ptr<DB::IAST> const&, std::__1::vector<std::__1::basic_string<char, std::__1::char>
17. DB::InterpreterSelectWithUnionQuery::InterpreterSelectWithUnionQuery(std::__1::shared_ptr<DB::IAST> const&, std::__1::shared_ptr<DB::Context const>, DB::SelectQueryO>
18. DB::InterpreterFactory::get(std::__1::shared_ptr<DB::IAST>&, std::__1::shared_ptr<DB::Context>, DB::SelectQueryOptions const&) @ 0x14bffa96 in /usr/bin/clickhouse
19. ? @ 0x14ee8750 in /usr/bin/clickhouse
20. DB::executeQuery(DB::ReadBuffer&, DB::WriteBuffer&, bool, std::__1::shared_ptr<DB::Context>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_tra>
21. DB::HTTPHandler::processQuery(DB::HTTPServerRequest&, DB::HTMLForm&, DB::HTTPServerResponse&, DB::HTTPHandler::Output&, std::__1::optional<DB::CurrentThread::QuerySc>
22. DB::HTTPHandler::handleRequest(DB::HTTPServerRequest&, DB::HTTPServerResponse&) @ 0x157a8a52 in /usr/bin/clickhouse
23. DB::HTTPServerConnection::run() @ 0x15a0d67b in /usr/bin/clickhouse
24. Poco::Net::TCPServerConnection::start() @ 0x18667a0f in /usr/bin/clickhouse
25. Poco::Net::TCPServerDispatcher::run() @ 0x18669e61 in /usr/bin/clickhouse
26. Poco::PooledThread::run() @ 0x1881a549 in /usr/bin/clickhouse
27. Poco::ThreadImpl::runnableEntry(void*) @ 0x18817c40 in /usr/bin/clickhouse
28. ? @ 0x7f4bfdf30609 in ?
29. __clone @ 0x7f4bfde55163 in ? -
А как вернуться в clickhouse если в терминале меня из нее вышибло (там мне ошибку выдало и выкинуло)?
-
вы сейчас в кх клиенте
чтобы выйти из него сделайте exit; -
👍
-
Мы используем форк поддерживающий TCP протокол
-
почему на удается войти в директорию clickhouse-server и посмотреть конфигурационные файлы, такие как config.xml например?
-
Тут надо бы основы работы в шелле
-
Попробуйте ls /etc/clickhouse-server
-
Какая-то дичь на скриншоте в плане вводимых команд
-
Попробуйте sudo cd /etc/clickhouse-server
-
🤦♂
-
Сработает, наверно. Но смысла ноль
-
Видимо у пользователя kate нет прав доступа на папку /etc/clickhouse-server. Через sudo все должно получиться.
-
Пожалуйста посчитайте гайды по linux, а именно об устройстве папок, работы с терминалом
-
Всем привет
Вопрос к пользователям MaterializedPostgreSQL. Как вы боритесь с разрастанием pg_wal? Они за неделю сожрали 2 tb( -
Йоу! Есть таблица с партициями по дате PARTITION BY toYYYYMMDD(date). Я хочу продублировать данные за день в этой таблице в другой день, можно ли это сделать, используя инструменты над партициями? (freeze, alter table update in partition, etc)
-
нельзя т.к. надо данные менять, только insert into ... select
-
спасибо, есть другие мнения?)
-
-
Не вижу проблемы с инсертом
-
у вас же в партиции данные есть, даже если вы обманите кх - и подсунете дубликат партиции с другим именем
-
данные все равно будут за тот деть, что вы скопировали
-
а это пробовали https://clickhouse.com/docs/en/sql-reference/statements/alter/partition/#alter_attach-partition-from ?Manipulating Partitions and Parts | ClickHouse Docs
alter_manipulations-with-partitions}
-
если напрямую не выйдет, можно придумать таблицу-“посредника”
-
Подскажите, почему не рабоатет ни одно из выражений? Проблема в версии? Не могу скастовать строку 'true' к типу bool
-
SELECT CAST('true', 'Bool')
Query id: 849255fa-0fb9-415a-91ec-d75ee0bbe678
┌─CAST('true', 'Bool')─┐
│ true │
└──────────────────────┘
1 rows in set. Elapsed: 0.001 sec.
38604531e29e :) select version()
SELECT version()
Query id: 3fd6296d-fd25-4321-a715-73eca4865c28
┌─version()─┐
│ 22.1.3.7 │
└───────────┘
1 rows in set. Elapsed: 0.001 sec.
38604531e29e :) -
Значит проблема в версии, большое спасибо
- 11 May 2022 (47 messages)
-
Привет! подскажите а гибридное хранение уже можно использовать для продакшена?
-
https://highload.ru/foundation/2022/abstracts/8144
Уж не знаю, будет ли там про бенчмарки -
Огонь! Постараюсь найти способ посмотреть
-
Есть бесплатная трансляция главного зала
-
Супер, сегодня вечером разузнаю
-
Всем привет, подскажите, пожалуйста, не нарушу ли я правила группы, если запощу вакансию по ClickHouse в нашу команду. Работаю в Aiven, сравнительно молодой и перспективный стартап, по последней оценке $2B, офисы по всему миру. Мы любим и вкладываемся в opensource. Ищем талантов, прелагаем relocation.
-
Постите если КХ, это нормально.
-
С тегом jobs
-
Привет, уже 100 раз спрашивали, но может что изменилось в 2022 - какой самый простой способ посчитать totalы в запросе, в котором есть лимит? Не хочется делать доп. запрос, при этом не хочется привязываться к формату (with total), группировкам (with rollup) и в идеале оконкам (count over) из-за ньюансов каждого подхода...
-
Всем привет
У меня вопрос, вот есть одна табличка (скажем табличка А) типа MergeTree и MV типа ReplacingMergeTree с TO syntax (скажем табличка B) из таблицы А
Я хочу добавить одну колонку для этих таблиц. Нужно ли мне как-то фризить инсерты в табличку А, если у меня в онлайн режиме падают туда данные и не хотелось бы их потерять в табличке В? -
Спасибо.
https://apply.workable.com/aiven/j/C297560743/ - позиция в нашу команду по разработке и поддержке ClickHouse в Aiven (по вопросам технического плана можно обращаться ко мне напрямую, касательно рекрутмента @Ludmila_Lumi)
https://apply.workable.com/aiven/j/F0FB31090E/ - позиция в Open Source офис.
#jobsSenior Backend Engineer (ClickHouse), Helsinki, Berlin, Europe - AivenAiven’s exceptional growth is a testament to our ambition in becoming the global category leader in managed cloud data infrastructure. Since its inception six years ago, Aiven’s mission has been to enable customers to drive business results from open-s...
-
-
-
Как в ClickHouse такую строку '\u0411\u0438-\u0431\u0438' преобразовать в utf-8?
-
SELECT toValidUTF8('\u0411\u0438-\u0431\u0438')
https://clickhouse.com/docs/en/sql-reference/functions/string-functions/Functions for Working with Strings | ClickHouse Docsfunctions-for-working-with-strings}
-
80 lvl Clickhouse ?
)) -
Какого-то определенного ? Может имя есть его, ник в телеграмме или страничка в вк.
-
Эта функция для таких строк: '\x61\xF0\x80\x80\x80b'
На моем примере может только показаться, что она работает, потому что некоторые способы вывода результата сами преобразуют такие строки в utf-8, а мне надо в базе преобразование сделать, как на скрине не подходит -
Ну тогда нужен пример, когда функция покажет кривизну, и оттуда уже думать )
-
Вот пример в Dbeaver, который не преобразует результат запроса в utf-8. То есть эта функция с такими строками ничего не делает
-
Есть такой тупой вариант:
select visitParamExtractString('{"abc":"\u0411\u0438-\u0431\u0438"}', 'abc'); -
Круто, спасибо )) Главное, что работает
-
подскажите пожалуйста, пытаюсь по доке тестануть JSON тип, но не могу создать таблицу тк ругается на EPHEMERAL:
04c7175a1aa7 🙂 set allow_experimental_object_type = 1;
SET allow_experimental_object_type = 1
Query id: 20931360-f794-42b7-b874-34ab8e172577
Connecting to localhost:9003 as user warehouse.
Connected to ClickHouse server version 22.3.3 revision 54455.
ClickHouse client version is older than ClickHouse server. It may lack support for new features.
Ok.
0 rows in set. Elapsed: 0.002 sec.
04c7175a1aa7 🙂 create table github_json
(
event_type LowCardinality(String) DEFAULT JSONExtractString(message_raw, 'type'),
repo_name LowCardinality(String) DEFAULT JSONExtractString(message_raw, 'repo.name'),
message JSON DEFAULT message_raw,
message_raw String EPHEMERAL
) ENGINE = MergeTree ORDER BY (event_type, repo_name)
Syntax error: failed at position 271 (')') (line 7, col 1):
create table github_json
(
event_type LowCardinality(String) DEFAULT JSONExtractString(message_raw, 'type'),
repo_name LowCardinality(String) DEFAULT JSONExtractString(message_raw, 'repo.name'),
message JSON DEFAULT message_raw,
message_raw String EPHEMERAL
) ENGINE = MergeTree ORDER BY (event_type, repo_name)
Expected one of: expression with ternary operator, logical-OR expression, list, delimited by operator of variable arity, logical-AND expression, logical-NOT expression, expression with prefix unary operator, NOT, nullity checking, comparison expression, list, delimited by binary operators, BETWEEN expression, string concatenation expression, additive expression, INTERVAL operator expression, INTERVAL, TIMESTAMP operator expression, TIMESTAMP, DATE operator expression, DATE, multiplicative expression, unary expression, CAST expression, tuple element expression, array element expression, element of expression, SELECT subquery, CAST operator, tuple, collection of literals, parenthesized expression, array, literal, NULL, number, Bool, true, false, string literal, case, CASE, COLUMNS matcher, COLUMNS, function, identifier, qualified asterisk, compound identifier, list of elements, asterisk, substitution, MySQL-style global variable -
ну так и добавляйте в форк. TCP протокол позволяет async инсерты если данные заинлайтить в текст запроса инсерт, а не передавать отдельно.
-
меня бы насторожило "It may lack support for new features." ;)
-
нет, много багов
-
из датагрипа тоже ругалось, из /play тоже ругалось,,, попробую апнуть консоль клиента, но думаю результат очевиден
-
alter table modify query позволяет на ходу поменять MV.
т.е.
добавляете поле alter-ом в TO таблицу
добавляете поле alter-ом в A таблицу
меняете MV - alter table modify query
начинаете инсертить поле в A таблицу -
-
на гитхабе такое надо спрашивать
-
-
на гитхабе ассетов для FreeBSD в принципе нет, они только на https://builds.clickhouse.com есть
-
Спасибо )
-
билды собираются кодом который в гитхабе.
И вообще какая разница.
Если вы сейчас сделаете PR который заэнейблит mysql во freebsd, то его вмержат (насколько я понимаю есть проблема в сборке mysql либы под freebds с кросскомпиляцией)
freedbs ассеты в гитхабе не лежат потому что их забыли копировать в пайплайне -
-
спасибо, попробую погнать волну там
-
-
перестартуйте еще раз, иногда с 10й попытки заводится
-
-
Пока это низкий приоритет, то есть никто этим не занимается. Надежда на то, что эта задача сделается сама собой в рамках какой-либо другой задачи. Например, сейчас актуальна https://github.com/ClickHouse/ClickHouse/issues/35630 и есть шанс, что в рамках работы над ней случайно активизируется MySQL для FreeBSD.Build all contribs using our own CMake files (2) · Issue #35630 · ClickHouse/ClickHouse
Continuation of #9226. We have strict guidelines for our code base: don't use source codes or libraries from OS or repositories; build everything from source code; use fixed versions of the...
-
Здравствуйте, а есть ли какая-то уже устоявшаяся борда для графаны или кастомный (отдельное какое-то приложение с админкой/бордой) мониторинг, который покрывает основные метрики ClickHouse?
-
Привет! <Error> mysqlxx::Pool: mysqlxx::ConnectionFailed
2022.05.11 14:49:02.335504 [ 3045858 ] {} <Warning> Application: Connection to my_dtabs@my_dbhost.tech:3406 as user clickhouse failed: mysqlxx::ConnectionFailed: Can't initialize character set utf8mb4 (path: compiled_in) (my_dbhost.tech:3406)
помогите плиз, никто не сталкивался? на чьей стороне чинить -
Zabbix? Или какие именно метрики вы имеет ввиду?
-
Что-то типа okmeter для постгреса, например, ну или заббикс, да. Готовые темплейты с алертами настроенными https://grafana.com/grafana/dashboards/882 вот что нашел - но оно видимо староеClickhouse dashboard for Grafana | Grafana Labs
Clickhouse metrics
-
Добрый день. В Okmeter, уже в этом году, планируется полноценная поддержка ClickHouse. Правда, пока, точных сроков нету(
-
-
в итоге откатил обновление. так и не смог завести на новой версии. вроде бы не на столько старая версия была...
- 12 May 2022 (217 messages)
-
Извините. а когда группу сделали приватной и почему забанили пользователя @natamya ?
-
Если кто сталкивался, подскажите в чем дело. Использую clickhouse-copier, кидает ошибку:
<Error> Application: Will retry: Code: 47. DB::Exception: Missing columns: 'EventDate' while processing query: 'SELECT DISTINCT toYYYYMM(EventDate) AS partition FROM _local.`.read_shard_1.target_cluster.metrika.access_logs_local` ORDER BY partition DESC', required columns: 'EventDate'.
Колонка есть`EventDate` Date MATERIALIZED toDate(Timestamp) -
это на приемнике или на отправителе запрос ломается?
-
на отправителе, сразу после выполнения clickhouse-copier --config-file=zookeeper.xml --task-path=/clickhouse-copier/access_logs_local --base-dir .
-
у меня подозрения на MATERIALIZED, на таблицах без MATERIALIZED все ок
-
ну вроде как MATERIALIZED нельзя в SELECT * ... использовать, в остальном он от DEFAULT толком ничем не отличается...
если запрос руками выпонить таже ошибка? -
в смысле insert into table select * from?
-
insert into talbe select * from тут да, не будет выборки но у вас ошибка то другая
SELECT DISTINCT toYYYYMM(EventDate) AS partition FROM _local..read_shard_1.target_cluster.metrika.access_logs_local ORDER BY partition DESC
вот этот запрос на отправителе работает если ручками из clickhouse-client запустить? -
Возвращает сode: 81. DB::Exception: Received from localhost:9000. DB::Exception: Database _local doesn't exist. (UNKNOWN_DATABASE) Я мб не совсем понимаю как правильно такой запрос выполнить.
-
если вы его скопировали из телеги, то там кавычки потерялись
потому что таблица у вас точки содержит -
-
возможно это какая то временная таблица которую clickhouse-copier создает... ? или это ваша таблица?
-
-
Search · copier materialized · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
какая версия clickhouse-copier ?
-
-
22.3.3.44
-
похоже на мою ситуацию https://github.com/ClickHouse/ClickHouse/issues/26702
-
nikitamikhaylov - Overview
MIPT. nikitamikhaylov has 24 repositories available. Follow their code on GitHub.
-
Всем привет. Не подскажете, как работает order by при создании таблицы mergetree? В доке пишут, что если не задавать первичный ключ, то он будет создан из order by. У меня есть таблица с ивентам order by по datetime полю, на которую настроена materialized view. В таблицу ивентов я могу дублировать записи по datetime полю, но materialized view отрабатывает только если добавятся какие-то новые.
-
PK не гарантирует уникальности
-
А как можно избежать проверку уникальности при работе materialized view? Или может на это влияет что-то другое?
-
Какой движок у таблицы в которую складывает MV ?
-
Distributed в ReplicatedMergeTree
-
так, давайте на две части проблему разделим
первое понятия
PRIMARY KEY - первичный ключ, он ОБЯЗАТЕЛЕН но не как в MySQL, он НЕ УНИКАЛЬНЫЙ, значения первичного ключа хранятся на диске, все остальные колонки отсортированы в соответствии с значениями полей первичного ключа, это позволяет очень быстро сканировать таблицу если в WHERE есть поля из PRIMARY KEY
ORDER BY - он же sorting key в документации, в него должны входить все поля из PRIMARY KEY и могут быть еще поля по которым остальные колонки сортируются, если PRIMARY KEY не задан то он равен ORDER BY
что касается materialized view
явно вы не так понимаете как он работает
он не срабатывает никогда когда "добавляются новые значения"
оригинальная таблица у вас какой engine?
SHOW CREATE TABLE покажите на таблицу и на materialized view? -
-
в system.parts было поле modification_time
https://clickhouse.com/docs/en/operations/system-tables/parts_columns
тут почитайте, мб то что нужноparts_columns | ClickHouse Docssystemtables-partscolumns}
-
-
-
system.part_log еще есть
-
Немного сократил, но в целом все так
CREATE TABLE db.events (
message String,
received_at DateTime DEFAULT now(),
REC_DATE Date DEFAULT toDate(now())
)
ENGINE = MergeTree()
PARTITION BY REC_DATE
ORDER BY (REC_DATE, received_at)
TTL received_at + INTERVAL 2 WEEK
CREATE MATERIALIZED VIEW db.mv
TO db.distributed
AS SELECT
…
FROM db.events
WHERE
JSONExtractString(db.events.message, 'entity_type') = ‘type’
CREATE TABLE db.distributed
AS db.table
ENGINE = Distributed(‘cluster’, ‘db’, ‘table’, intHash64(received_at))
CREATE TABLE db.table (
…
REC_DATE Date,
received_at DateTime
)
ENGINE = ReplicatedMergeTree('/clickhouse/cluster/tables/db/shard-{shard}/table’, '{replica}')
PARTITION BY REC_DATE
ORDER BY (REC_DATE, …, received_at) -
ReplicatedMergeTree - если повторно один и тот же блок вставлять, он будет скипаться
как тестируете? по одной записи вставляете? с теми же самыми данными? -
Спасибо! Избыточно немного, но зато гарантированно есть то, что надо
-
добавил несколько записаей в формате TabSeparated и импортирую
clickhouse-client -q “insert into db.events format TabSeparated” < dump.tsv -
ну получается просто два раза вставляете одни и теже данные
они проходят путь MergeTree -> MV -> Distributed -> ReplicatedMergeTree - и в последнем скипаются -
получается уникальность проверяется по всему блоку? Т.е достаточно изменить одно поле одной записи, чтобы это пропустить? В смысле тогда будет уже новый блок
-
А есть какая-нибудь аггрегирующая функция для AggregateMergeTree, которая берет argMax, если в обоих записях есть какие-то не null значения и берет не null значение, если в одной из записи есть null?
-
Ну либо как такое поведение симулировать
-
В ответ на свой вопрос для истории (каж-ся это оно)
https://kb.altinity.com/engines/mergetree-table-engine-family/aggregatingmergetree/ -
-
угу. будет новый блок и он вставится нормально в ReplicatedMergeTree
-
Понял, сейчас попробую, спасибо большое
-
атомарно нет
с рестартом сервера
просто переименовать
systemctl stop clickhouse-server
/var/lib/clickhouse/metadata/db_ordinary_name
/var/lib/clickhouse/metadata/db_ordinary_name.sql (тут переименовать внутри файла)
/var/lib/clickhouse/data/db_ordinary_name
systemctl start clickhouse-server -
Всем привет!
Пробовал переехать с zookeeper на clickhouse-keeper.
Перегнал данные в новый кластер и начал его тестировать.
Первая проблема была достаточно часто наблюдал ерроры Session expired.
А так же столкнулся с проблемой https://github.com/ClickHouse/ClickHouse/issues/35712
Возможно у кого-то уже есть опыт работы с clickhouse-keeper или может подскажите какие настройки нужно здесь применить, чтобы избавиться от этой ошибкиSession expired (Session expired). (KEEPER_EXCEPTION) - (ClickHouse Keeper) · Issue #35712 · ClickHouse/ClickHouseDescribe what's wrong I am trying to migrate Apache Zookeeper into ClickHouse Keeper but am running into Session expired KEEPER_EXCEPTION while doing a bunch of table creations that which I...
-
Спасибо)
-
а у вас clickhouse-keeper запускается один экземпляр отдельно? или несколько реплик?
или это in-process keeper внутри clickhouse-server? -
Это in-process keeper внутри clickhouse-server
-
Вопрос знающим
Как кликхаус понимает какая запись была последней? Экспериментирую с anyLast, вроде он каким-то образом понимает какая запись была последней, но не понимаю как -
В табличке они хранятся в другом порядке (не в порядке вставки записей), но кх все равно как-то понимает какая запись последняя была при вставке
-
сколько серверов?
можно попробовать настройки raft протокола потюнить
coordination_settings
но там
<operation_timeout_ms>10000</operation_timeout_ms>
<session_timeout_ms>30000</session_timeout_ms>
по умолчанию итак нифига не маленькие...
а вы как прописываете <zookeeper> секцию? один хост 127.0.0.1? -
судя по документации, никак не понимает, и результаты функций any / anyLast являются indeterminate
видимо, сегодня просто такая фаза Луны, что он берет последнюю по физической вставке, и строить на этом бизнес-логику не стоит
https://clickhouse.com/docs/en/sql-reference/aggregate-functions/reference/any/any | ClickHouse Docsagg_function-any}
-
Ого, понял, спасибо
-
Нет, указываю все сервера.
Серверов всего 4 (2 шарда по 2 реплики)
<keeper_server>
<tcp_port>9181</tcp_port>
<server_id>1</server_id>
<log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
<snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>
<coordination_settings>
<operation_timeout_ms>10000</operation_timeout_ms>
<session_timeout_ms>30000</session_timeout_ms>
<raft_logs_level>warning</raft_logs_level>
</coordination_settings>
<raft_configuration>
<server>
<id>1</id>
<hostname>hostname1.domain.com</hostname>
<port>9444</port>
</server>
<server>
<id>2</id>
<hostname>hostname2.domain.com</hostname>
<port>9444</port>
</server>
<server>
<id>3</id>
<hostname>hostname3.domain.com</hostname>
<port>9444</port>
</server>
<server>
<id>4</id>
<hostname>hostname4.domain.com</hostname>
<port>9444</port>
</server>
</raft_configuration>
</keeper_server> -
<zookeeper>
<node>
<host>hostname1.domain.com</host>
<port>9181</port>
</node>
<node>
<host>hostname2.domain.com</host>
<port>9181</port>
</node>
<node>
<host>hostname3.domain.com</host>
<port>9181</port>
</node>
<node>
<host>hostname4.domain.com</host>
<port>9181</port>
</node>
</zookeeper> -
укажите один
в <zookeeper> 127.0.0.1
и посмотрите что получится
для in-process этого достаточно
там все равно через raft протокол остальные зукиперы будут жить -
посмотрите на функцию argMax, она хороший заменитель anyLast, потому что это как anyLast с order by
-
<raft_configuration> оставьте без изменений
-
Господа, добрый день! Подскажите, пожалуйста, в кликхаусе есть возможность передачи в функцию дефолтного значения или перехват ошибки парсинга с возратом дефолтного значения в случае ошибки функции?
Интересует toDateTime. Если туда передать пустую строку, функция валится, а хочется получить, например, нулевую дату -
Тогда не совсем понимаю... В доке альтинити косяк? (https://kb.altinity.com/engines/mergetree-table-engine-family/aggregatingmergetree/)
Потому что там пример того, как получить ПОСЛЕДНЕЕ не null значение, или здесь под последним имеется в виду последнее при рандомном чтении? -
Но какой в этом смысл тогда, если операция недетерминирована?
-
Пробовал и так, разницы нету, наткнулся потом на issue с похожей проблемой
https://github.com/ClickHouse/ClickHouse/issues/35712
Но, смотрю что её даже не верифицировали как баг, потому вообще не ясно будут ли за неё браться или нет...Session expired (Session expired). (KEEPER_EXCEPTION) - (ClickHouse Keeper) · Issue #35712 · ClickHouse/ClickHouseDescribe what's wrong I am trying to migrate Apache Zookeeper into ClickHouse Keeper but am running into Session expired KEEPER_EXCEPTION while doing a bunch of table creations that which I...
-
То есть он так же будет брать только не null значения?
Я к чему, вот есть игрушечный пример. Здесь выделенные колонки это order by для aggregateMergeTree
Я хочу чтобы в итоге col2, col3 = b, 2 и чтобы детерминированно, а не как с anyLast -
ну странная конечно фигня,
а какаая у вас интенсивность вставки что сессия экспайрится, чаще чем раз в минуту вообще вставляете? -
У нас запись через кафку, у нее настроено время сбрасывания 7.5 секунд
-
"чтобы детерминированно"
а по какому полю собираетесь это определять, если у вас на экране 4 рандомных строки с одинаковым "ключом"? -
Могу добавить колонку по типу "event_date", условно порядок вставки
-
угу, ну тогда вообще все ровно должно быть... не должна сессия экспайрится
попробуйте raft логи до information увеличить и посмотреть
может между серверами рафт рушится часто, тогда из-за этого даже на 127.0.0.1 потеря сессии будет -
Спасибо, попробую включить уровень information
-
хотя по идее warning или error должны быть потеря кворума
вы логи анализировали до того как ошибку словить
grep -i raft /var/log/clickhouse-server/clickhouse-server.log
что нибудь такое -
добавляйте, сделаете по ней argMax() и голова не будет болеть от того, а как anyLast в очередной раз себя поведет
конечно, может, оказаться, что anyLast под капотом всегда читает в одном порядке, но лично я бы (на опыте работы с разными бд) не рискнул на этом строить логику ) -
Всем привет )
есть вопрос по запросу к кх
у меня есть табличка (скриншот прикрепляю)
и мне в ней нужно посчитать куммулятивную сумму (нарастающим итогом) по столбцу total_rev_per_day для каждого столбца day_of_life (то есть напротив day_of_life=1 я хочу видеть значение, равное сумме 698.74+4.99; напротив day_of_life=24 я хочу видеть значение, равное сумме 698.74+4.99+4.99 и так далее...)
как это можно сделать? -
Этого не хватит, вам нужны тогда наносекунды, а их в now() нет.
-
либо движок ReplacingMergeTree попробуйте, если вам все строки не нужны, и их можно схлопнуть
-
sum(total_rev) over (order by day_of_live rows unbounded preceding)
-
Спасибо ☺️
-
Так, сейчас, кажется я привел не совсем удачный пример
В итоге здесь надо получить col2 = c, col3 = 1
Порядок вставки указан стрелкой -
Не страшно, до инсерта можно заранее посчитать "now()", не средствами кх
-
Насколько я помню, ReplacingMergeTree берет именно прям ВСЮ последнюю строку, а мне нужно поведение похожее на anyLast, то есть последнее не null значение
-
да, так и есть
тогда да, я бы добавил какой-то insert timestamp, чтобы от него отталкиваться -
Если есть возможность, тогда да. А если нет, то можно комбинировать now() и rowNumberInAllBlocks() например, чтобы нумерация внутри блока позволила сохранить его порядок.
-
WINDOW functions
SELECT day_of_life, SUM(total_rev_per_day) OVER (ORDER BY day_of_live RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_revenue FROM table ORDER BY day_of_life
как то так -
То есть AggregateMergeTree с argMax по timestamp вставки?
-
Window Functions | ClickHouse Docs
ClickHouse supports the standard grammar for defining windows and window functions. The following features are currently supported:
-
Всем привет. Подскажите, как сгенерировать столбец с типом DateTime с шагом в 1 час на текущий день. Нужно 24 строки от начала текущего дня до его конца
-
Привет. Есть необходимость физически разделить кластер на 2 zookeeper кластера.
В текущий момент все схемы идут в 100 шарде на 1 кластере. Идея в том что бы разделить их по шарднам.
Есть идея быстро стопнуть кластер, переименовать пути в таком роде:
zkpath /clickhouse/table/100 -> /clickhouse/table/300 -> macros 300 some shemas.
zkpath /clickhouse/table/100 -> /clickhouse/table/200 -> macros 200 some shemas.
Стартануть хосты с новыми макросами.
На сколько безопасен такой метод, нету ли по мимо макроса каверзных моментов в метаданных?
Возможно есть какие то другие пути? -
как вариант через массив, может и проще можно
SELECT arrayJoin(arrayMap(x -> (start + toIntervalHour(x)), range))
FROM
(
SELECT
range(24) AS range,
toStartOfDay(now()) AS start
) -
можно при помощи табличной функции numbers()
https://clickhouse.com/docs/en/sql-reference/table-functions/numbers/numbers | ClickHouse Docsnumbers}
-
оооо спасибо, то что нужно!!!!
-
Есть из чего выбрать)) Спасибо!
-
select toStartOfDay(now()) + toIntervalHour(number) FROM numbers(24);
-
SELECT toStartOfDay(now()) + toIntervalHour(number)
FROM numbers(24) -
Функцию parseDateTimeBestEffortOrZero смотрели?
-
сейчас посмотрю, спасибо!
-
Кстати говоря, нашел незадокументированную функцию now64(<precision>) :)
Но я думаю ее не просто так нет в доке ) -
просто забыли задокументировать
-
Можете проверить посиком в чате, все про нее знают
-
Понял
-
Получается она стабильная?
-
Да
-
Так нельзя в зк переименовывать
System restore replica -
Добрый день.
Подскажите пожалуйста.
Можно ли к табличке из новым синтаксисом MergeTree аттачить данные которые которые были взяти из таблички из старым синтаксисом?(В новом синтаксисе изменилась запись PRIMARY KEY)
Ибо переписав табличку на новый синтаксис перестали артачиться данные( запрос на атачь выполняет но фактический данных нет ) -
У функций есть orZero orNull суффиксы
-
Нельзя
-
Спасибо!
-
А есть ли какие-то варианты обновить табличку на новый синтаксис ?
-
Вы не можете увидеть / узнать в каком порядке хранятся записи. AnyLast примерно похож на правду потому что в нумерации блоков инкрементальный счетчик
-
Есть. Дорого (за деньги)
-
Понял.
А distribution engine может работать из табличкой из новым и старым синтаксисом ? -
А на более старых версиях ch без SYSTEM RESTORE REPLICA ?
-
Привет. Хочу протестировать тип json, но не могу создать таблицу. Ругается, что не включена экспирементальная настройка, хотя она включена. Версия клика 22.3.3.44
SET allow_experimental_object_type=1;
CREATE table test_json
( event JSON ) ENGINE = Memory;
Code: 44. DB::Exception: Cannot create table with column 'event' which type is 'Object('json')' because experimental Object type is not allowed. Set setting allow_experimental_object_type = 1 in order to allow it. (ILLEGAL_COLUMN) (version 22.3.3.44 (official build)) -
может, есть еще варианты, например engine=Merge. Переименовываете старую таблицу, создаете новую в новом синтаксисе, накрываете все engine=merge, merge подсовываете в distributed. Я так переехал со старого синтаксиса на новый (в 2018 году)
-
SET allow_experimental_object_type=1;
включает в СЕССИИ.
у инсерта другая СЕССИЯ. Надо либо передевать в инсерте, либо задать в профиле, чтобы у всех сессий по умолчанию было =1 -
а зачем вам разделять зукипер?
в смысле можно и по другому сделать, но нужно знать конечную цель (НЕ ЗАДАЧУ) -
у вас проблема в непонимании что Keeper ничего не меняет относительно Зукипера. Для Кипера все так же нужны выделенные ноды, которые имеют свой собственный быстрый диск.
-
Понял.Спасибо большое
-
что за приватной?
я разбанил natamya, я не знаю почему я забанил этого пользователя, возможно случайно. -
На кластере более 10 тысяч таблиц, представленных в разных схемах, но по 1 шарду. 1. Физическая изоляция. 2. Снижения нагрузки на zk, сейчас более 10млн znode
-
То есть если развернуть его отдельно, то проблем с работой не будет?
-
я не понял каким образом вам номера шардов помогут ходит в разные зукиперы.
в смысле сейчас КХ умеет работать с несколькими зукиперами, там в пути надо указать что это др. зукипер.
Т.е. я бы делал так,
детачнул часть таблиц (или баз)
сделал копию зукипера (скопировав файлы ЗК, или расщепив ЗК кластер из 6 нод на ходу (это легко)).
добавил второй зукипер в конфиг.
А потом просто поменял пути у детачнутых таблиц. -
да, не будет
-
https://github.com/ClickHouse/ClickHouse/issues/31919
https://github.com/ClickHouse/ClickHouse/issues/32259Zookeeper & 5000 Replicated tables · Issue #31919 · ClickHouse/ClickHouseIt's not an issue just an observation. 1 replica create database test_zoo; -- Let's create 5000 tables for i in `seq 5000`; do echo -n $i ""; \ clickhouse-client -...
-
Номера шардов для безопастности, что-бы не промахнуться. Это дало бы логическое разделение, при котором какой-либо шард не смог-бы законектится по старой метадате.
-
Можно ли заставить anyLast брать очередность записей по ключу сортировки?
-
Так значение ключа одинаковое, там нет последнего.
Вот ключ (a,17), у другой записи тоже (a,17), они равны -
Я понимаю, но если я в ключ вставлю timestamp (хотя это вроде не очень хорошо, но всё же)
-
какая версия КХ
-
-
timestamp станет частью ключа, и у записей будет разный ключ
-
timestamp надо вставлять не в ключ, а просто доп колонкой, и использовать его в SELECT argMax(column, timestamp) GROUP BY ключ
-
можно типа ORDER BY (-datetime) (не так в тупую, но это возможно)
но на самом деле вам этого не нужно.
запросы ORDER BY DESC и так нормально работают c ORDER BY (datetime) -
18.10.3
-
-
18.10 не умеет работать с 2мя зукиперами
-
скорее всего это настраивается сеттингами
-
ладно ) пойду дальше копать , а ДБА клика далеко ) ушел в запой )
SELECT t.*
FROM default.sensors_ym AS t
WHERE (sensor_serial = '10000581HIT') AND (type = 'press')
ORDER BY datetime ASC
LIMIT 10
10 rows in set. Elapsed: 49.631 sec. Processed 2.70 billion rows, 241.71 GB (54.45 million rows/s., 4.87 GB/s.) -
Вот хотелось бы этого избежать
У меня есть табличка с логами (который хранит только последние 3 месяца) и mv из этой таблички типа AggregatingMergeTree
Если делать argMax на MV, то ведь он будет учитывать только последние 3 месяца из таблички логов, так? -
а как быстро отработает select t.timestamp from [всё остальное]?
тут вроде недавно уже было обсуждение, что в случае LIMIT и SELECT * быстрее сначала вытащить десять нужных значений одного поля из индекса, а потом SELECT * WHERE timestamp in (...) -
а order by какой у таблицы?
-
ORDER BY (datetime, master_serial, sensor_serial, type)
-
то есть у вас high-cardinality значение на первой позиции индекса, а WHERE идет по другим полям
-
вероятно при создании таблицы не понимали юз кейс , видимо надо переделать
-
ну понятно, проблема вовсе не в desc/asc
если записи WHERE (sensor_serial = '10000581HIT') AND (type = 'press') далеко от конца/начала datetime или их вообще нет, то нужно весь индекс/все таблицу просканировать -
спасибо, напишу дба пусть исправляет )
-
Ну там надо все данные перелить по новому ключу 👍
-
материализованное представление с новым ключем временно не решит проблему ?
-
Ну есть проекции сейчас
-
Но лучше переделывать
-
-
в 38 раз проще и быстрее сделать тестовую таблицу, вставить тестовых данных, и проверить, я минуты за 3 справлюсь
-
да но ) как быть с объемом ? тестовая таблица будет 1 млн записей, а боевая 6 млрд , это на тесте не скажется ?
-
если с головой подходить и не заполнять все поля рандомным мусором, то можно сделать тествую таблицу на 100млрд.(и уложится в 3 минуты)
-
через буфер лить ? )
-
-
да куча вариантов генерить данные прямо в КХ , numbers, range, random для любых типов данных
-
create table A(K Int64, s1 String, s2 String) Engine=MergeTree order by s1 as select number, '', '' from numbers(1e9);
-
insert into metric_definition(metric_id, name, machine_id )
select generateUUIDv4() metric_id, toString(number%55555) name, generateUUIDv4() machine_id from numbers(30000); -
insert into metrics select '94cf81ba-1b39-4cf5-8127-ab65f6b2b1b7', toDateTime('2021-09-01 00:00:00') + number date, date, rand()%103/44 from numbers(2592000);
-
Спасибо ) но я хотел сам 😉
-
А почему вариант, именно на своих данных, потестить, а не на сгенерированных ?
-
Привет. Подскажите, пожалуйста. Мы используем КХ версии 22.3.2.1 на тестовых стендах в docker. Собран кластер из двух нод, на котором для ~100 топиков кафки выполнены скрипты вида https://ghostbin.com/tpN18
На стендах ограничены ресурсы, КХ никак не нагружен (нет запросов SELECT, нет данных в кафке), а потребление памяти постоянно растет. Как можно посмотреть для чего он использует память? -
-
Я с нее начал, пока мне ни чем не помогла. Кеши ни чем не заняты, MemoryResident и MemoryDataAndStack постоянно растут.
-
Да, согласен, я забыл, что он аггрегирует по sort key
Вопрос тогда по доке в альтинити (https://kb.altinity.com/engines/mergetree-table-engine-family/aggregatingmergetree/), тут написано, что будет брать последний non-null value, получается тут учитывается порядок вставки? -
А можно как то подробнее узнать что тут MemoryResident и MemoryDataAndStack?
-
Ну по ощущением это берётся из OS https://github.com/ClickHouse/ClickHouse/blob/0f5f75a7844e4cd1a6acc484ee4e15b1a839e319/src/Interpreters/AsynchronousMetrics.cpp#L657ClickHouse/AsynchronousMetrics.cpp at 0f5f75a7844e4cd1a6acc484ee4e15b1a839e319 · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Кажется тут какая то пролема на стороне верстки документации https://clickhouse.com/docs/ru/operations/utilities/clickhouse-local/clickhouse-local | ClickHouse Docs
clickhouse-local}
-
Похоже на то.
-
DB::MergeTreeBackgroundExecutor<DB::MergeMutateRuntimeQueue>::routine(DB::TaskRuntimeDataPtr) [Queue = DB::MergeMutateRuntimeQueue]: Code: 241. DB::Exception: Memory limit (total) exceeded: would use 1.92 GiB (attempt to allocate chunk of 4362015 bytes), maximum: 1.00 GiB. (MEMORY_LIMIT_EXCEEDED), Stack trace (when copying this message, always include the lines below)
---
Я понимаю что 1Gb это вообще не о чем. Но это тестовый стенд, вообще без нагрузки. А съедается и больше 4, если не ограничивать -
Система не предназначена для работы с 4 гб вообще. Ну где то в чатике где 2-3 месяца назад был человек с вопросами и ему отвечали, как уменьшить потребление памяти
-
В документации есть такое
You can use ClickHouse in a system with a small amount of RAM, even with 2 GB of RAM, but it requires additional tuning and can ingest at a low rate.
Кто бы подсказал как это настроить -
You need to have 4GB SWAP.
You need to change <mlock_executable>true</mlock_executable> to false in config.xml
You need to set mark_cache_size=500MB -
Как схлопнуть стейты в AggregateFunction? Только через OPTIMIZE?
-
вопрос непонятен. AggregateFunction где? в таблице или в запросе?
-
В таблице, я так понимаю
То есть есть MV, туда делается argMaxState и все эти стейты сохраняются -
ну optimize да, но вообще подразумевается что это не нужно, что запрос будет с groupby и argMaxMerge
-
argMaxMerge долго (относительно) работает
Поэтому я хочу делать Optimize и запрос с finalizeAggregation с final и с флагом do_not_merge_across_partitions_select_final -
ну ОК.
Но вы должны понимать что вы не можете постоянно вызывать Optimize, это очень дорогая и долгая операция -
Получается так, что селекты работают намного быстрее, если таблица финализирована, если нет, то примерно раза в 2, 1.5 быстрее, чем argMaxMerge
-
Нууу, в моем случае он выполняется примерно секунд 15-20
-
И раз в день вызывать OPTIMIZE вроде звучит разумно, при такой скорости
-
а в этом смысле. В общем optimize просто инициирует незапланированный мерж, т.е. если 30 партов в партиции, то например после оптимайз станет 25 и дубликаты останутся, а optimize final мержит до упора (пока есть что мержить или есть свободное место), дубликатов в итоге не останется, но и мерж может занять часы или дни.
-
Понял, спасибо
-
-
тоже думаю на эту тему. Допустим лежат в таблице какие-то аггрегированные данные. Они туда попадают через MV. Все достаточно стабильно, изменений почти нет. Но иногда - бывают. Не хотелось бы из-за этого каждый раз делать select final. Хочу сделать дневные партиции и периодически смотреть в system.parts, где партов в партишене больше 1-й. И для таких партиций запускать прицельно optimize final. Дневные партиции не такие большие, а событие прихода обновлений не такое частое. Вроде должно работать достаточно приемлемо.
-
есть. Обычно упоротые пользователи КХ делают в этом случае дневные партиции, и например запросы за сегодня делают с from final, а по ночам(в начале след.дня) запускают optimize final для вчерашней партиции, и запросы к старым данным делают без final.
я так никогда не делал, у меня groupby быстро работает. -
-
-
-
либо вы описывате ровно тоже самое что я сказал, либо я совершенно не понимаю о чем вы
-
-
-
Кстати, а в этом случае не наступит ли ситуация, когда будет слишком много стейтов и из-за этого argMaxMerge будет страдать по производительности?
-
argMaxMerge ничем не отличается от любой другой агрегатной функции, sum, avg.
Если КХ может сделать sum по 1млрд записей, то argMaxMerge делает тоже самое, ну может в два раз медленее потому что надо обработать state. Обычно проблема в наличии groupby , для groupby надо построить хеш таблицу и там перекладывать стейты. -
Понял, спасибо большое
-
Всем привет!
Использую full join
Он работает как left.
Выводит только данные первой таблицы. Начитался документации
Попробовал global all full outer join- такой же результат.
Может кто-то сталкивался? -
Господа, кто-нибудь когонибудь знает из этого списка? Как потыкать палочкой, чтобы заапрувили?
https://github.com/SeasX/SeasClick/pull/4Added Support for Fetch Modes by iliaal · Pull Request #4 · SeasX/SeasClickCouple of feature enhancements to simplify data retrieval Added ability to fetch dates as strings (date as Y-m-d and datetime as Y-m-d H:i:s similar to how it is returned by HTTP client) via DATE_...
-
-
Спасибо! Попробую.
-
Обновил Tabix, это релиз на посмотреть мои на работки, есть что по править и допилить, но в целом уже рабочий вариант.
Сейчас мне интересно подключается он к серверам или нет, т/к пришлось много "ветвится и отлаживатся" под разные версии CH, разницу ловить между 21.x и 22.x и т/д и т/п.
Ограничения:
- Google Chrome
- CH 19+
- Not readonly user
Весь код в мастре, собирается без проблем.
Собранный и готовый: http://dash.tabix.io
Короткий видео обзор
Обсудить на githubtabix.ioTabix preview release, dash.tabix.io Discussion: github.com/tabixio/tabix/…
-
Привет, ищу парня.
-
Нашли группу для знакомств) 😂
-
Тут секса итак хватает
-
Да такого)
-
Вот вы тут шутите, а не в каждой группе на такие "поиски" получишь высокооплачиваемого специалиста :)
Но, ввиду того как написано предложение, фидбек конечно будет очень не очень, думаю. -
Вот так и рождаются приколы про айтишников
-
"Я написала в группу где одни парни, так меня нах послали, гребаные айтишники"
-
👍😂
-
А Вы думаете она вакансию закрыть хочет?)
-
Скорее сама работу ищет ...
-
Я думаю что будь я девушкой и у меня было бы желание искать человека с деньгами но не очень много... Ммм.. как бы помягче сказать, вычислительных способностей, я бы искал по айтишным группам как раз
Но вообще вряд-ли тут этот случай -
😂
-
Всем привет! Помогите пожалуйста разобраться с мутациями и памятью. Есть таблица:
engine = AggregatingMergeTree PARTITION BY month
ORDER BY (objectHash, month)
Прежде чем запускать мутацию сделал optimise final и дождался завершения (то есть количество партиций и партов стало равным).
Запустил мутацию, которая бежит по всей патриции без учета ключа, и она потребляет слишком много памяти (отвалились в это время остальные запросы по totalMemoryLimit, и на графиках после запуска видно было как растет потребление памяти). Хочу разбить эту мутацию на несколько. Для этого хочу изменить таблицу на
engine = AggregatingMergeTree PARTITION BY month
ORDER BY (objectHash%10, objectHash, month)
И запускать последовательно несколько мутаций с Where objectHash%10 = i. Но даст ли это результат? Кажется, что при выполнении мутацию, будет всё равно использована целиком вся партиция, и тогда не получу никакой пользы. Я правильно понимаю, что мне нужно также изменить ключ партиционирования чтобы это заработало? -
вообще работает. Таблицы обычные? или дистрибьютид? Какая версия КХ?
-
покажите что за мутация, сколько памяти, мутации не должны использовать много памяти.
-
Большое спасибо за комментарий. Нашел что там в мутации делается подзапрос который вычитывает всю партицию, и видимо из-за него всё отваливалось по памяти.
Я правильно понимаю, что в целом мутация должна последовательно читать отдельные блоки, а не считывать всю партицию целиком, как я предположил до этого? -
Сделал в итоге на том же объёме данных 400 мсек вместо 44 сек
-
да, мутация последовательно обрабатывает по 8 тыс. строк из парта, несколько партов могут процессится одновременно (это настраивается). Обычно мутации используют мало памяти.
Если запустить подряд много мутаций они начинают объединятся в одну, с очень-очень длинным выражением, и парсер выражения начинает жрать память (я видел 50 тыс. мутаций объединились и там сотни мегабайт выражение было, падал сервер по ООМ со 100ГБ ОЗУ), в современных КХ это починили - 13 May 2022 (143 messages)
-
-
Коллеги, привет
Подскажите пожалуйста, у нас сейчас кластер clickhouse состоит из одной шарда и трех реплик(хостов соответственно 3)
Мы хоти переделать кластер немного иначе - 3 шарды и по одной реплике в каждом шарде
Могут ли быть какие-то проблемы с данными и если да, то как поправить? -
Привет. Для внешнего словаря с ShellCommandSource есть возможность сменить таймаут ожидания выполнения команды с 10 секунд?
-
Привет!😉
Подскажите, пожалуйста, по следующему вопросу
Заливаю в витрину CH строку в JSON-формате, которую буду парсить через JSON-функцию (картинка 1)
Но есть случаи, когда у меня несколько JSON-словарей для одного поля (картинка 2) - как в таких случаях правильно объявить тип поля в витрине? Думал передавать как Array(String), но первый элемент такого массива не первый JSON, а первый символ - то есть '[' -
-
-
-
https://clickhouse.com/docs/ru/sql-reference/aggregate-functions/reference/anylast/
https://clickhouse.com/docs/ru/sql-reference/aggregate-functions/#obrabotka-null -
argMaxIf(<колонка>, <поле сортировки>, условие то колонка не нулл)
-
Коллеги, добрый день! Проясните, пожалуйста момент. Допустим выполняю select с использованием первичного индекса. Кликхаус определил между какими засечками может лежать нужным мне результат и получилось, например, что нас интересует 100 гранул. Кликхаус будет погранульно искать результат или сперва выгрузит в память все строчки всех гранул, а потом только по ним будет искать?
-
Логично предположить - что по порядку, обрываясь на достижении LIMIT, или в конце.
-
согласен, что логично) но конкретно у меня ощущения возникают обратные. хотел уточнить
-
Всем привет , можно ли это сделать более оптимально ?
может есть одна функция какая нить ? -
select firstSignificantSubdomain('www.instagram.ru')
-
спасибо , посмотрю
-
Не совсем понятна задача в общем виде, но конкретно для этого случая можно ещё сделать splitByChar('.', 'instagram.ru')
-
Всем привет, кто может подсказать решение проблемы?
После запроса во фронте не отображаются данные таблицы ( через postman, client - данные таблицы выдают в полном объеме), ребут службы не помогает, проблема на всех репликах, проблема на всех ПК.
2022.05.13 13:10:10.839376 [ 22503 ] {745364f3-90e7-447e-add6-23d899ccd510} <Error> executeQuery: Code: 420. DB::Exception: Cannot UPDATE key column id. (CANNOT_UPDATE_COLUMN) (version 22.3.3.44 (official build)) (from 10.15.231.138:5$
ALTER TABLE test.archive_float32 UPDATE id=5 WHERE id= 5472), Stack trace (when copying this message, always include the lines below):
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0xb3712fa in /usr/bin/clickhouse
1. DB::MutationsInterpreter::prepare(bool) @ 0x15b399b1 in /usr/bin/clickhouse
2. DB::MutationsInterpreter::MutationsInterpreter(std::__1::shared_ptr<DB::IStorage>, std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, DB::MutationCommands, std::__1::shared_ptr<DB::Context const>, bool) @ 0x15b321bd in /$
3. DB::InterpreterAlterQuery::executeToTable(DB::ASTAlterQuery const&) @ 0x159c4971 in /usr/bin/clickhouse
4. DB::InterpreterAlterQuery::execute() @ 0x159c30d2 in /usr/bin/clickhouse
5. ? @ 0x15d27d3a in /usr/bin/clickhouse
6. DB::executeQuery(DB::ReadBuffer&, DB::WriteBuffer&, bool, std::__1::shared_ptr<DB::Context>, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_strin$
7. DB::HTTPHandler::processQuery(DB::HTTPServerRequest&, DB::HTMLForm&, DB::HTTPServerResponse&, DB::HTTPHandler::Output&, std::__1::optional<DB::CurrentThread::QueryScope>&) @ 0x1663cee7 in /usr/bin/clickhouse
8. DB::HTTPHandler::handleRequest(DB::HTTPServerRequest&, DB::HTTPServerResponse&) @ 0x16641692 in /usr/bin/clickhouse
9. DB::HTTPServerConnection::run() @ 0x168c8bdb in /usr/bin/clickhouse
10. Poco::Net::TCPServerConnection::start() @ 0x19b7de4f in /usr/bin/clickhouse
11. Poco::Net::TCPServerDispatcher::run() @ 0x19b802a1 in /usr/bin/clickhouse
12. Poco::PooledThread::run() @ 0x19d3d269 in /usr/bin/clickhouse
13. Poco::ThreadImpl::runnableEntry(void*) @ 0x19d3a5c0 in /usr/bin/clickhouse
14. start_thread @ 0x7fa3 in /usr/lib/x86_64-linux-gnu/libpthread-2.28.so
15. clone @ 0xf94cf in /usr/lib/x86_64-linux-gnu/libc-2.28.so -
какой-то вопрос слишком абстрактный, какие-то проблемы могут быть. Миллион ньюансов может всплыть. Вы выбрали ключ шардирования? Как данные на шарды переливать будете? Приложение готово читать из распределённых таблиц? DDL запросы готовы к работе с шардами?
-
-
в source <max_command_execution_time>10<max_command_execution_time>
-
Ещё раз всем привет. Может ли маленький размер гранулы (16 строк) оказать негативное влияние на поиск по таблице с несколькими сотнями миллионов строк (мб и > миллиарда)?
-
*негативное влияние на СКОРОСТЬ поиска
-
Может замедлять анализ индекса.
Плюс увеличивается размер индекса в памяти -
КХ обрабатывает блоками по 64К строк. 100*8192 строк, они поделятся между 16 потоками, и те начнут обрабатывать в кусками по 64к
-
что такое данные таблицы ?
-
про размер индекса знаю. проверял его размер, в моём случае получилось суммарно со всех партов около 2ГБ. В оперативку влезает, всё норм. Волнует именно вопрос замедления селекта. Типа раз гранул в 500 раз больше, то и мб и их чтение замедляется
-
так не надо задать этот кортеж и тогда не будет проблем.
ищите тут в чате, можно вручную этот список отредактировать -
понял, спасибо. а этот параметр в 64к строк конфигурируется, или он захардкожен?
-
Спасибо. Размещал внутри <executable>..</executable>, где оно игнорировалось.
-
можно ли уже на рабочей таблице изменить этот список, если можно то как?
-
да, может. На самом деле смысла меньше 256 задавать нету. Потому что компрессия блоков минимальная 64 КБ, в любом случае КХ будет прочитывать больше строк
-
параметр max_block_size
-
спасибо!)
-
даже если поставить CODEC(NONE) все равно блоки есть и при маленьких index_granularity КХ читает очень много лишних мегабайт
-
т.е. лучше всего оставить дефолтное значение index_granularity?
-
[Question] Add column to SummingMergeTree table · Issue #3054 · ClickHouse/ClickHouse
Hello. As I know I can add a column to an existing SummingMergeTree table using Alter table statement. But is it possible to add this new column to the primary key or to the aggregated columns ? Fo...
-
данные в таблице*
-
"select * from таблица" показывает ничего?
-
ничего не показывает, в логах ошибок нет, в таблице всего 7 строк.
-
Проблема видимо в столбце id т.к. при обращении к другим столбцам, данные отображаются.
Запрос по которому создавалась таблица:
CREATE TABLE test.archive_int32 ON CLUSTER cluster_test
(
id UInt32,
ts DateTime64(6),
value Int32 CODEC(Delta(4), LZ4),
qvalue UInt8
)
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/test/archive_int32', '{replica}')
PARTITION BY toYYYYMM(ts)
ORDER BY (id, ts)
SETTINGS index_granularity = 8192 -
если еще раз выполнить запрос, все равно пусто?
-
-
пусто, restart сервиса ch не помогает, рестарт страницы фронта не помогает, открытие с другого компа тоже, проблема на всех репликах
-
а из КХ клиента не пусто?
-
нет
-
верно, через client данные есть и при обращение через http get, тоже данные есть
-
так UI тоже http get делает, в смысле баг в /play ?
-
-
возможно и баг
-
и я не понял при чем тут ALTER TABLE test.archive_float32 UPDATE id=5 WHERE id= 5472)
-
Видимо слишком неправильно задал вопрос
Спрошу немного иначе, что там нужно сделать, чтобы изменить схему работы кластера на целевую? -
после выполнения данного запроса, получил exception и play перестал отображать данные в таблицах archive, на всех репликах.
Если указывать явно столбцы, без id, то данные в play отображаются. -
-
CREATE TABLE test.archive_int32
ALTER TABLE test.archive_float32 -
Прошу прощения, не тот скрипт создания прислал, вот от таблицы archive_float32:
CREATE TABLE test.archive_float32 ON CLUSTER cluster_test
(
id UInt32,
ts DateTime64(6),
value Float32 CODEC(Delta(4), LZ4),
qvalue UInt8
)
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/test/archive_float32', '{replica}')
PARTITION BY toYYYYMM(ts)
ORDER BY (id, ts)
SETTINGS index_granularity = 8192 -
а если в браузере открыть console в developers tools то видно ошибки если выбирать id ?
-
Добрый вечер! Посоветуйте, пожалуйста, годные папиры по кликхаусу, с максимально приближённым материалом к рабочим задачкам, а не условные доки с «как создать табличку и написать запрос к данным»
-
А какие ещё есть задачки в кликхаусе ? Кроме создать табличку и написать запросик ?
-
ошибка есть
-
С более сложными запросиками к табличкам, которые чаще встречаются в работе, чем создайте табличку и напишите свой первый запросик
-
https://youtu.be/Op9_gEPyc8o
https://youtu.be/1AJ41Xc1lIQ
https://youtu.be/efRryvtKlq0
https://youtu.be/JSLhU_LJ5VE002. "Как используют ClickHouse в мире" – Александр ЗайцевПолтора года назад система управления базами ClickHouse стала открытым ПО. За это время сотни компаний начали ей пользоваться. 12 декабря в Яндексе прошла большая встреча, на которой мы подвели промежуточные итоги. Компания LifeStreet занимается поддержкой ClickHouse и сталкивается с самыми разными кейсами. Александр Зайцев рассказал, в каких индустриях и проектах используют ClickHouse, какие особенности имеет работа с СУБД в разных областях. Другие видео встречи https://events.yandex.ru/events/meetings/12-dec-2017/
-
Я к тому, что каждая статья == дока, примеры из которой есть в официальной доке
-
Вот что-то подобное и искала, но предпочтительнее текст
В любом случае, спасибо❤️ -
а покажите результат из ClickHouse-client
-
тест??? в 2022 году? вы что буквы читать умеете? офигеть
-
Да…
-
Не знаю почему, но гораздо проще воспринимаю текст, нежели туториалы, скринкасты, и так далее
-
-
Доклады вообще прикольно в оффлайне смотреть, на самом деле
-
я просто шучу. Нету текстов, не написали еще.
-
видео есть, часов 100
-
Вот и я удивилась, что не смогла ничего найти, даже грустно стало
-
Придётся, значит, смотреть!
-
некому и некогда писать, бежать надо.
-
Кликхаус не тормозит же, да
-
-
-
А что насчет функции автонотации ? читабельно?
-
Я смотрел вебинары Алексея Миловидова с автопереводом. Вполне
-
AI особенно умен если мешать в неразборчивой речи тех.термины на двух языках
-
баг в джаваскрипте в коде (play)
select arrayJoin([5,5,5,5472,5472,5472,5]) id ;
https://github.com/ClickHouse/ClickHouse/issues/37191play ui shows nothing (js error play:579 Uncaught TypeError: response.data[0][0].startsWith is not a function) · Issue #37191 · ClickHouse/ClickHouse22.3.4.20 select arrayJoin([5,5,5,5472,5472,5472,5]) id ; empty result browser console VM7 play:579 Uncaught TypeError: response.data[0][0].startsWith is not a function at renderResult (VM7 play:57...
-
спасибо!
-
хорошо что пазл сложился, а то я бы еще неделю думал, че это
-
-
Вставки в Join Table Engine синхронные или нет?
-
а раньше через сколько отваливалось?
-
у нас странное поведение системы, как будто данные в джоин тейбл не сразу доступно после инсерта
-
-
следует ли ожидать просадки по скорости селекта, когда параллельно в таблицу грузятся данные?
-
-
с диском то понятное дело) вопрос больше в том, не влияют не до конца слитые вместе дата парты на скорость селекта?
-
Раньше работало, по логам смотрю в районе 4 часов
-
Влияют. Несколько партов быстрее, т.к. идет параллельное чтение.
-
on cluster ?
-
да
-
а из одного парта нет параллельных чтений? конечно есть
-
на on cluster не влияют settings.
надо установить materialize_ttl_after_modify = 0 в профиле дефалтного пользователя и рестартовать КХ (потому что ddlworker стартует и читает профиль в момент старта КХ).
или не использовать on_cluster -
возможно из-за
было
SELECT name, value FROM system.settings WHERE name LIKE '%receive_timeout%'
┌─name─────────────────┬─value─┐
│ receive_timeout │ 300 │
│ http_receive_timeout │ 1800 │
└──────────────────────┴───────┘
было
select name, value from system.settings where name like '%receive_timeout%';
┌─name─────────────────┬─value─┐
│ receive_timeout │ 300 │
│ http_receive_timeout │ 180 │
└──────────────────────┴───────┘ -
ок, спасибо! эту мутацию с чистой душой можно прибить?
-
да
-
Привет! Тестирую projections, при включенном флаге allow_experimental_projection_optimization число читаемых рядов значительно сокращается, но при этом падает скорость чтения. В итоге без проекции читается ~300kk строк со скоростью 2.4ГБ/сек, а с проекцией - ~115к строк со скоростью 3МБ/сек. В итоге прирост получается всего в 2 раза - так должно быть или я что-то делаю неправильно? Почему так сильно падает скорость чтения?
-
allow_experimental_projection_optimization включен по умолчанию
-
У меня версия 20.10.5, в ней ещё не включен)
-
не надо пробовать проджекшины в 20.10
-
Почему? Там что-то очень сильно сломано?
-
да
-
Хорошо, спасибо
-
У кого-нибудь ReplacingMergeTree теряет данные? Есть такая таблица
CREATE TABLE default.some_table (
`key_hash` UInt64, /* = cityHash64(String, String) */
`is_allowed` UInt8,
`created_at` DateTime
)
ENGINE = ReplacingMergeTree(created_at)
ORDER BY key_hash
SETTINGS index_granularity = 1024
При вставке в нее теряются уникальные key_hash, примерно половина. Версия 20.12.3.3. Ключей должно быть 15+М, после вставки остается 5-7М, результат колеблется -
как выглядят запросы вставки и выборки?
-
Спасибо! )) В тотале все сходится. Причина в интервальном условии на created_at. Сначала в подзапросе, а потом во внешнем запросе. Условие это набирает больше значений в исходной тяжелой таблице, в которой мержи происходят редко, а целевая мержится быстро и без дублей получается меньший результат.
-
20.12.3 вообще у всех селектов неправильный результат, надо 20.12.8.5
https://github.com/ClickHouse/ClickHouse/issues/1813720.12.3.3 Less amount of data is returned if "read backoff" is in effect. · Issue #18137 · ClickHouse/ClickHouseConsider following: 1 master server with Distributed table (tracking_distributed), 2 shards, previously was 4 shards, but during chat discussion i've reduced them to 2 for easier debugging ...
-
⭐️ Tabix need help
У кого есть ClickHouse за SSL, и кто может проверить что Tabix соединяется - проверьте плиз
https://beta.tabix.io/?
Должен соединится с CH если SSL сертификату доверяет ваш браузер -
-
-
Да сорри https://beta.tabix.io/?
-
говорят их подчистят и выложат
-
-
Спасибо!
Но тут видимо readOnly <> 2
Setting max_execution_time should not be changed. -
¯\_(ツ)_/¯
-
Tabix делает запрос на сервер curl "https://github.demo.trial.altinity.cloud:8443/?output_format_json_quote_denormals=1&output_format_json_quote_64bit_integers=1&log_queries=1&enable_http_compression=1&add_http_cors_header=1&result_overflow_mode=throw&timeout_overflow_mode=throw&max_execution_time=10&max_result_rows=90000&max_result_bytes=10000000&user=demo&password=demo&query=SELECT%20version()%20as%20version"
Если валится - то нихт )) -
Поднял свой валидный SSL (летсинспипт) на отдельной DNS записи - смог подключится к дефолтному CH
https-Tabix.IO -> https-igorstrykhar.io получилось -) -
Если будет возможность проверьте пожалуйста еще раз, что httpS получилось решить - буду очень благодарен!
-
Вот такую ошибку даёт на серверы, которые Denny указал
-
На эти не получится, только на серверы где нормальный user
Tabix вообще не может работать с readOnly user ((
ReadOnly = 2 сможет, другими нет (
Tabix нужно указывать настройки output_format_json_quote_denormals=1&output_format_json_quote_64bit_integers=1 и т/д если не смог -> значит нихт -
Ребятушки! Имею на диске папочку detached весит около 30ГБ не знаю можно ее херить или нет. Может подскажите как быть?
-
да
если там давно лежат файлы (посмотрите даты), то смело удаляйте.
https://kb.altinity.com/altinity-kb-useful-queries/detached-parts/ -
КХ-у не нужны файлы в detached
-
он их не испольует
-
А есть способ узнать используются ли они шобнаверняка?
-
Это все началось с того, что я настроил clickhouse-backup
-
КХ-у не нужны файлы в detached
он их не использует,
КХ никогда сам, без команды пользователя не использует файлы в detached -
вторая черепашка врет
-
Не понял отсылки, простите.
-
анекдот-загадка про трех черепашек есть такой
-
А это, все равно не понял, как это соотносится. В любом случае, спасибо за помощь, пошел курить маны
-
-
Так бы сразу и сказал, что с clickhouse-backup'ом это, скорее всего не связано.
-
(-:
-
Эзопов язык, это не для наших групп.
-
История такая: есть CH развернутый в GKE через clickhouse-operator, сейчас он находится в одном кластере с приложением и я хочу его мигрировать в отдельный. 2 шарда по 3 репилки, по одной на зону. Я настроил clickhouse-backup, с намерением не торопясь протестировать и оптимизировать новый кластер, развернуть на нем данные и переключить туда приложение с минимальными простоем, потому что данные в CH льются из Kafka.
И вот, где-то после этого, у меня начало пропадать место в этот чертов detached. Не могу понять что за хрень. Усложняется все тем, что я ни хера не понимаю в базах данных (ну, почти) -
что лежит в detached ? ignored_ ?
-
Ща позырю...
-
- 14 May 2022 (52 messages)
-
Всё, продуплил шары. Тогда вопрос: я просто удаляю всю папку и я счастлив, или надо какую-то "особую" команду?
-
Здравствуйте, подскажите пожалуйста:
два дня назад обновились на версию 22.1.3
и вот что сегодня обнаружили: утечку по памяти, причём это не словари.
Как проверить, что держит память? -
-
большое спасибо, сейчас буду выяснять виновника)
-
чето не нашли нужного кейса в статье. еще нет ничего почитать?
-
Этот график показывает что? Что такое memory tracker?
Как rss выглядит из линукса? Как выглядел до обновления?
Есть какфка? Есть live view? Есть rabbit? -
-
красная линия, время обновления кх.
Метрика берется из ch exporter, ее забирает прометей. Не помню, встроенный ли метрик сервер в кликхаус или отдельно стоит.
Имя метрики: ClickHouseMetrics_MemoryTracking.
Да, кх работает с rabbitmq, забирает сообщения из кролика и складывает в таблицу.
Кафки - нет, Live view тоже -
с какой версии на какую обновлялись?
-
С 21.12.что-то на 22.1.3
-
Я помню что эта метрика показывала минус 400tb. Очень показательная метрика.
-
Модельки не билдятся, валятся по памяти, как видно по графику, на данный момент ch съел где-то на 8-9Gb больше от нормального аллоцированного объема
-
Если сказать detach table таблице с engine раббит то что с графиком?
-
модельки? В смысле?
-
Не хватает памяти материализовать таблицы, раньше хватало
-
Вот метрика с метрик сервера кубернейтса. Потребление оперативной памяти подом
-
Добрый день!
Есть данные биржевых сделок в формате
Время
Бумага
Сумма
Как эффективно выбрать данные по бумаге в виде "свечей"? Т.е. разбить заданный интервал на одинаковые кусочки, для каждого кусочка выбрать первое значение, минимальное, максимальное, последнее.
В общем случае запрос вот такой:
SELECT t1.price AS open, m.high, m.low, t2.price as close, open_time FROM (SELECT MIN(timeInMilliseconds) AS min_time, MAX(timeInMilliseconds) AS max_time, MIN(price) as low, MAX(price) as high, FLOOR(timeInMilliseconds/(1000*60)) as open_time FROM ticks GROUP BY open_time) m JOIN ticks t1 ON t1.timeInMilliseconds = min_time JOIN ticks t2 ON t2.timeInMilliseconds = max_time
Но для ClickHouse это вряд ли хороший вариант. -
а кусочки заранее известной длинны?
-
Да, одинаковой длины
-
-
а в чем проблема сейчас что типо плохой перфоманс или что?
-
Да не сказал бы. Но на больших объемах не гонял, и смущает двойной джойн
-
-
-
select toStartOfInterval(timeInMilliseconds, interval 1 hour) open, MIN(timeInMilliseconds) AS min_time, MAX(timeInMilliseconds) AS max_time, MIN(price) as low, MAX(price) as high, argMin(price, timeInMilliseconds) as open, argMax(price, timeInMilliseconds) as close from ticks group by open
-
В данном случае - чтобы найти первую и последнюю запись внутри куска.
Подозреваю, что это можно сделать с помощью window function -
запрос выше думаю вам поможет
-
Да, похоже. Попробую, спасибо!
-
не, argMin/max гораздо кайфовее чем оконки
-
Argmin и argMax потребляют меньше памяти чем wf. Wf все записи окна держат в памяти и медленее
-
Да я и смотрю. Почитаю внимательнее про них
-
-
{"2022-04-26 11:51:33": {"start": "2022-04-26 11:51:33", "reason": "manual_change"},
"2022-03-01 00:41:19": {"Model": {"Type": 0, "Email": null}, "Message": null, "Success": false},
"2022-03-02 12:44:19": {"Model": {"Rrn": null, "Type": 1, "Email": null}, "Message": null, "Success": true}} as json
подскажите, а что ожидает в качестве аргумента функция JSON_QUERY?
пытаюсь достать значение reason вот таким выражением JSON_QUERY(json, '$..reason')
на что получаю ошибку:
Code: 36. DB::Exception: Unable to parse JSONPath: While processing '{"2022-04-26 11:51:33": {"start": "2022-04-26 11:51:33", "reason": "manual_change"}, "2022-03-01 00:41:19": {"Model": {"Type": 0, "Email": null}, "Message": null, "Success": false}, "2022-03-02 12:44:19": {"Model": {"Rrn": null, "Type": 1, "Email": null}, "Message": null, "Success": true}}' AS a, isValidJSON(a) AS valid_json, JSON_QUERY(a, '$..start') AS reason, version(). (BAD_ARGUMENTS) (version 21.11.8.4 (official build)) -
хотя онлайн парсер нормально распознаёт
-
У вас получилось ? Я просто пытаюсь уже минут 30 у меня не выходит
-
-
select JSON_QUERY(tupleElement(t, 2), '$.reason')
from (select arrayJoin(JSONExtractKeysAndValuesRaw('{"2022-04-26 11:51:33": {"start": "2022-04-26 11:51:33", "reason": "manual_change"},
"2022-03-01 00:41:19": {"Model": {"Type": 0, "Email": null}, "Message": null, "Success": false},
"2022-03-02 12:44:19": {"Model": {"Rrn": null, "Type": 1, "Email": null}, "Message": null, "Success": true}}')) as t) -
Варианты достать конечно есть, но я хочу именно через JSONPath одной функцией
-
-
может вот это?
Before version 21.11 the order of arguments was wrong, i.e. JSON_QUERY(path, json) -
Ну тут только про порядок, но у меня и версия 21.11.8.4
-
Хвастаетесь?
-
-
Сорри!
-
-
Его здесь нет
-
-
Добрый день.
Столкнулась с вопросом, как выбрать order by для таблицы в Clickhouse.
Допустим, есть транзакционная таблица. Как такового, primary key у нее нет.
Допустим, данные вносятся ежемесячно.
Как должно быть:
Mergetree order by <перечень ключевых полей> partition by <дата>
или
Mergetree order by tuple() partition by <дата>
или просто
Mergetree partition by <дата>
От чего зависит выбор ключа order by?
Если есть хорошие ссылки, поделитесь пожалуйста. -
Наверное я бы посоветовал ещё разочек прочитать доку и понять что такое PK Order BY и Partition by
-
Ну и первый вариант самый нормальный, но партиции можно по месячные сделать
-
Но всё зависит от данных уже
-
How to pick an ORDER BY / PRIMARY KEY / PARTITION BY for the MergeTree-family table
How to pick an ORDER BY / PRIMARY KEY / PARTITION BY for the MergeTree table.
- 15 May 2022 (83 messages)
-
Спасибо, почитаю :)
В целом конечно понимаю, для чего order by. Просто на транзакционных данных объемы за месяц небольшие. И непонятно, зачем ещё их привязывать к пятью ключам.
Надеюсь, документация поможет :) -
если объемы небольшие то берите любой вариант. например по дате. тут нет задачи соблюдать уникальность ключа
-
В order by дату?
-
например да. вообще если у вас данных в таблице мало то это неважное решение которое ни на что не повлияет.
морочится про ордер бай нужно если потом сложно делать селекты или есть работа с дубликатами -
Мне надо подумать, т.е. order by - это типа индекса для селектов.
-
это в прямом смысле то как будут упорядочены данные. если просто сделать select * from table то они вот в таком порядке выйдут
-
не путайте человека, выборка select * без явного order by является недетерминированной операцией, нет стопроцентной гарантии, что такая выборка будет отсортирована по индексу
-
100% гарантии нет. но работает именно так.
-
-
смотрите, какие запросы вы будете писать к этим данным. что в where постоянно будет, то и кладите в order by или partition by. low-cardinality поля двигайте в начало индекса
-
Всем привет! Забился сервер с КХ на 100% по памяти. Не могу подключиться теперь к КХ что бы почистить его. Пишет просто Connection refused. Кто-то сталкивался, как решать?
-
Рестартануть кх.
-
не помогает, он сам постоянно пытается рестартонуться и падает. Почистил партиции в файловой системе, потом рестартонул и так уже все норм, подключается)
-
всем привет
в логах начали всплывать ошибки
DB::Exception: There is no column rp_contest.null in table. (NO_SUCH_COLUMN_IN_TABLE) (version 22.4.4.7 (official build))
подскажите, пожалуйста, чего ему надо и как это лечить -
Посмотрите свои запросы на вставку. Судя по всему идёт попытка вставить null в не nullable колонку
-
в том то и дело, что это nullable колонка
-
А колонку сразу создавали nullable или, может, через alter меняли?
-
сразу
попробовал выполнить optimize table … final settings optimize_throw_if_noop=1
таже ошибка -
Обновитесь до 22.4.5.9
https://github.com/ClickHouse/ClickHouse/issues/3668722.4 Vertical merges of wide parts are broken · Issue #36687 · ClickHouse/ClickHouseVertical merges of wide parts fail if there is an array in the table and not all columns are present in parts. CREATE TABLE aaa ( a Array(Int16), b Int8 ) ENGINE = MergeTree ORDER BY tuple() settin...
-
Коллеги, добрый день! Заметил, что в директории /var/lib/clickhouse/store остаются пустые папки после удаления соответствующих таблиц. Так и должно быть? Есть способ "из коробки" очистки КХшного мусора с диска?
-
спасибо!
-
Например?
-
Что например?
-
Имя папки
-
-
Всем привет. Подскажите, пожалуйста, кто использует вот этот тул для backup/restore:
https://github.com/AlexAkulov/clickhouse-backup
Я когда пытаюсь cделать restore, то предварительно выкачиваю backup from s3 bucket. Потом делаю
backup restore <directory name>
Получаю следующую ошибку:
error can't restore '<database_name>.<table_name>': error during filepath.Walk for partition '201905_25403_32885_1': lstat /data/clickhouse/backup/2022-03-11T09-44-05/shadow/<database_name>/<table_name>/201905_25403_32885_1: no such file or directory
Причина в том, что backup-тул заархивировал все или почти файлы с данными. Я могу это конечно в скрипте разархивировать. Но может есть какой-то флаг в этом туле, чтобы он мог из архивов делать restore. Или еще какие-то детали есть.
Помогите, пожалуйстаGitHub - AlexAkulov/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages supportTool for easy ClickHouse backup and restore with cloud storages support - GitHub - AlexAkulov/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages support
-
в смысле выкачиваю? он сам выкачивает clickhouse-backup download
clickhouse-backup list -- работает? версии одинаковые? -
ну эти остаются, так задумано
-
Понял, спасибо
-
посоны, как перекачать 870млн строк из одной таблицы в другую с такой же схемой?
-
INSERT INTO tbl1 SELECT * FROM tbl2
-
невозможно долго
-
мб есть какие-то махинации с партициями?
-
мне необходимо проставить PRIMARY KEY, из-за этого приходится перекачивать 870млн строк
-
чтож у вас там за строки такие, что всего 1ярд записей переливать долго?
-
или сервер дюже слабый?
-
проставить? Вы знаете что такое PRIMARY KEY?
-
t2.xlarge
-
я понимаю, что его нельзя “проставить”. Мне нужен способ как из одной таблицы перелить в другую такую же где уже есть primary key в схеме
-
Вы знаете что такое PRIMARY KEY?
-
не густо =(
-
это префикс у ORDER BY
-
я могу поменять, сколько нужно ресурсов, примерно?
-
в смысле у вас есть ORDER BY (a,b,c,d,e,f,g), а вы хотите PRIMARY KEY (a,b,c) ?
-
вопрос на SO https://stackoverflow.com/questions/72248622/how-do-i-update-a-clickhouse-table-to-be-able-to-sample-from-itHow do I update a Clickhouse table to be able to sample from it?
I'm trying to sample rows from a clickhouse table. Below you can find the table definition CREATE TABLE trades ( `id` UInt32, `ticker_id` UUID, `epoch` DateTime, `nanoseconds` UInt3...
-
моя схема, нужно включить SAMPLE
-
в схеме неправильный ORDER BY, как исправить – не знаю
-
Я видел, что есть такая возможность, но по привычке использовал aws s3 cp ..
-
не могу сказать, не использовал ни разу КХ с меньше 128гб на инстанс 🤷♂️
-
в этом случае 1млрд rows будет ок?
-
А чем PRIMARY KEY поможет с SAMPLE ?
-
по другому не работает, мне нужно:
PRIMARY KEY intHash32(id)
SAMPLE BY intHash32(id) -
clickhouse-backup list работает:
~clickhouse-backup list
2022-03-11T09-44-05 151.17GiB 11/03/2022 09:44:07 local tar -
еще один стрелок в ногу
-
версии одинаковые
-
как не стрелять?
-
внимательно читать https://kb.altinity.com/altinity-kb-queries-and-syntax/sampling-example/
потом тестировать на тестовой таблице.
с
PRIMARY KEY intHash32(id)
SAMPLE BY intHash32(id)
у вас таблица в размерах увеличится раз в n и все будет дичайше тормозитьSampling ExampleClickhouse table sampling example
-
если делать SAMPLE BY на текущей схеме, то отвечает ошибкой
-
sampling дохрена непростая штука
у вас сейчас какой ORDER BY ? -
который бы мне починил кликхаус
-
тут моя схема https://stackoverflow.com/questions/72248622/how-do-i-update-a-clickhouse-table-to-be-able-to-sample-from-itHow do I update a Clickhouse table to be able to sample from it?
I'm trying to sample rows from a clickhouse table. Below you can find the table definition CREATE TABLE trades ( `id` UInt32, `ticker_id` UUID, `epoch` DateTime, `nanoseconds` UInt3...
-
предполагаю, что должно быть
```
CREATE TABLE trades
(
`id` UInt32,
`ticker_id` UUID,
`epoch` DateTime,
`nanoseconds` UInt32,
`amount` Float64,
`cost` Float64,
`price` Float64,
`side` UInt8
)
ENGINE = MergeTree()
ORDER BY intHash32(id)
PARTITION BY (ticker_id, toStartOfInterval(epoch, toIntervalHour(1)))
PRIMARY KEY intHash32(id)
SAMPLE BY intHash32(id)
``` -
питер тут?
-
кто тут кто тут?
-
ну это очень странный вопрос, сколько там ваш 1млрд весит? +-100Гб?
вот я поставил переливку таблицы: 77 столбцов, в среднем 1 строка ~1kb данных
переливается ~552.80 thousand rows/s, т.е. 1 млрд уйдёт за полчаса гдето - по мне это не долго -
16gb
-
т.е. пока обсуждали в чате оно должно было несколько раз уже перелиться?))
-
гуд. А как-то надо тюнить кликхаус дополнительно, если я сделаю 128гб какой-нибудь инстанс?
-
я не умею в облака, чтобы тупо переливать select * память то не особо нужна - цпу+диски, мб коллеги кто с облачным работает точнее подскажут
-
вот попробовал:
Elapsed: 273.547 sec. Processed 132.38 million rows, 133.62 GB (483.94 thousand rows/s., 488.48 MB/s.)
потребление выше 2Гб Озу не поднялось ни разу -
интересно сколько таблица станет после переливки, 160ГБ или 640ГБ
-
Кстати, КХ при инсерте сразу жмёт парты, или только при мердже ?
-
и жмет и сортирует прямо в момент инсерта, поэтому инсерту нужна память чтобы отсортировать в памяти все записи блока.
можно настроить разную компрессию для маленьких партов и для больших. Т.е. типа LZ4 пока парт меньше чем 10ГБ, а после например ZSTD2 -
почему?
-
ну отсротирована таблица была по x,y и поэтому значения близкие значения хорошо сжимались (были рядом) , а теперь у вас таблица будет отсортирована по рандому, и жаться не будет.
Вы бы потренировались сначала, на тестовой таблице, на тестовых данных, sampling дюже непростая штука и ее очень сложно и мало кому нужно использовать. -
на тесте стало меньше
-
нет, это не так. Партиции остаются те же, сортировка идет внутри партиции
-
PARTITION BY (ticker_id, toStartOfInterval(epoch, toIntervalHour(1)))
ORDER BY (ticker_id, epoch)
1. непонятно зачем вам вообще был нужен ticker_id в order by, потому что у вас патриционирована по этому полю и всегда одно и тоже значение в партиции.
2. Таблица была отсортирована по epoch это значит что значения тикера шли отсортированные по времени. -
1. это ошибка
2. отсортировано по epoch внутри партиции -
да и я согласен что эта схема неправильная, может эта правильная?
-
спасибо. Не понимаю почему, но если использовать clickhouse-backup для скачивания, то restore выполняется успешно
-
так download что-то делает, я не помню, или распаковывает или меняет json с описанием
-
видимо, да. Спасибо
- 16 May 2022 (126 messages)
-
Коллеги, добрый день. Забавная фича или бага, что думаете?
select true = 1
учитывая что в доке указано что булевого типа в КХ нет, его заменяет UInt8 -
-
ну имеется ввиду что хранится как UInt8
-
hi all , i want to query on table which has json as data type with where clause , but it is not working !
create table testj( A Int64, device JSON ) Engine=MergeTree order by A;
insert into testj (device) format TSV {"brand_name":"oppo","brand_id":"1235","country":"india"}
insert into testj (device) format TSV {"brand_name":"apple","brand_id":"1236","country":"usa"}
SELECT * FROM testj WHERE device.brand_name = india
and getting this error :
Missing columns: 'india' while processing query: 'SELECT A, device FROM
testj WHERE device.brand_name = india', required columns: 'A'
'device.brand_name' 'india' 'device', maybe you meant: ['A','device'].
(UNKNOWN_IDENTIFIER) -
hi, you need to use quotes to mean a string value instead of some column name
-
CREATE TABLE IF NOT EXISTS user_activity_event (
event_date DateTime('Europe/Moscow'),
event_type Enum8(
'COURSE_VIEW' = 1,
'LIBRARY_DOWNLOAD' = 2,
'LIBRARY_VIEW' = 3,
'COURSE_CLICK_BUTTON' = 4,
'COURSE_CREATE_ORDER' = 5
),
object_id UInt32,
object_owner UInt32 NULL
created_at DateTime('Europe/Moscow') DEFAULT now('Europe/Moscow')
) ENGINE = MergeTree()
ORDER BY (event_date, event_type, object_id)
PARTITION BY toYYYYMM(event_date)
Добрый день вот такая структура таблицы.
Пользую Yandex Data STREAM
Там нет типа ENUM только string И вот я пытаюсь тип Enum перевести в string
alter table user_activity_event modify column event_type String;
и получаю ошибку.
Code: 524. DB::Exception: ALTER of key column event_type from type Enum8('COURSE_VIEW' = 1, 'LIBRARY_DOWNLOAD' = 2, 'LIBRARY_VIEW' = 3, 'COURSE_CLICK_BUTTON' = 4, 'COURSE_CREATE_ORDER' = 5, 'OTHER' = 6) to type String is not safe because it can change the representation of primary key. (ALTER_OF_COLUMN_IS_FORBIDDEN) (version 22.3.5.5 (official build))
Гугление говорит, что надо пересоздавать базу данных можно ли как-то это обойти? -
Никак не обойти
-
Если бы колонка не была в order by, можно было бы
-
Но вы можете попробовать сделать конвертацию из строки в enum на вставке
-
Т.е. делать insert в null таблицу и конвертировать колонку в Materialized View
-
-
-
примерно так: создаёте таблицу src_user_activity_event с теми же колонками, что у вас, только event_type String и Engine=Null, потом пишете create materialized view to_user_activity_event to user_activity_event as select event_date, КОНВЕРТАЦИЯ , object_id, object_owner, created_at from src_user_activity_event. Конвертацию делаете через функцию multiIf
-
-
-
все так, псоставьте 22.3 вместо 22.1
были issue связанные с этим -
спс!
-
-
у вас винда ?
-
Попробуйте через docker-compose развернуть. И тут кажется проблема с локальным клиентом.
Изолируйте от системы и 99% все заработает -
https://github.com/rongfengliang/clickhouse-docker-compose как быстрый пример. Есть и другие вариантыGitHub - rongfengliang/clickhouse-docker-compose: clickhouse-docker-compose
clickhouse-docker-compose. Contribute to rongfengliang/clickhouse-docker-compose development by creating an account on GitHub.
-
Можно ли сделать из внешней postgresql таблички табличку в КХ с движком join?
-
можно сделат ьсловарь который будет позож на join
-
Понял, спасибо
-
Привет!
Подскажите, пожалуйста, кто знает, какого формата должны быть данные в питоне, чтобы залить их в ClickHouse как Array? -
Подскажите пожалуйста как восстановить таблицу ? Пытаюсь восстановить таблицу на реплике, по следующему методу:
DETACH TABLE table_name;
SYSTEM DROP REPLICA 'replica_name' FROM ZK PATH '/table_path_in_zk/';
ATTACH TABLE table_name;
SYSTEM RESTORE REPLICA table_name;
SYSTEM SYNC REPLICA table_name;
Но SYSTEM RESTORE REPLICA table_name; говорит:
Received exception from server (version 22.1.3):
Code: 49. DB::Exception: Received from localhost:9000. DB::Exception: It's a bug: replica is not readonly. (LOGICAL_ERROR)
Хотя: SYSTEM SYNC REPLICA table_name; говорит обратное:
Received exception from server (version 22.1.3):
Code: 164. DB::Exception: Received from localhost:9000. DB::Exception: Cannot SYNC REPLICA, because replica is readonly. (READONLY)
Таблица на самом деле в read only. Спасибо -
Добрый день
Вопрос по внешним словарям
в качестве источника - таблица в клике
в условии - dictGet из другого словаря
словарь создается, при попытке загрузки данных (dictionary reload) падает ошибка Code: 36. DB::Exception: Unexpected key in dictionary source configuration
Можно ли использовать dictGet при создании словаря? -
покажите как словарь создаете? через XML ?
или как?
вообще у меня получалось несколько словарей lookup делать через вложенные dictGet -
create dictionary __tmp_dictionary_2022_05_16_17_36_40_944(
a UInt64,
b UInt32,
c UInt32,
d UInt8,
book_id UInt8) PRIMARY KEY a, b, c
SOURCE(CLICKHOUSE(TABLE '__tmp_table_2022_05_16_17_34_18_099' WHERE
'book_id = 6
AND c in (20220725, 20220919) AND dictGet('dict_one', 'g', toUInt64(a)) in (102020604)
AND dictGet('dict_two', 'r', toUInt64(b)) in ('AE')'))
LIFETIME(MIN 0 MAX 0)
LAYOUT(COMPLEX_KEY_HASHED_ARRAY) -
одинарные кавычки внутри одинарных кавычек
WHERE "book_id= ... dictGet('...', ... "
попробуйте -
и второй dictGet кавычками вообще не закрыт
то есть открывающие есть, а закрывающих нет -
можно использовать heredoc $$ текст $$ https://clickhouse.com/docs/en/sql-reference/syntax#heredeocSyntax | ClickHouse Docs
syntax}
-
заэскейпил одинарные ковычки через back slash
проблема с словарями - нужно обращаться к ним database.dict_one
спасибо за помощь -
да, словари созданные через SQL это db.dict_name
словари через XML это просто dict_name -
можно к SQL словарям обращаться без db, будет использована current база (это давно добавлено)
-
потому что вы пытаетесь решить проблему которую так не решить.
зачем вы вообще это делаете? -
Потому что нуб в CH. Пересоздали таблицу, вроде все ок стало. Спасибо
-
А как там преобразовать string в Enum ?
-
-
Через multiIf: multiIf(условие 1, значение для условия 1, условие 2, значение для условия 2, ... значение при несовпадении всех условий)
-
Если у вас приходят указанные строки, то так: multiIf (event_type = 'COURSE_VIEW', 1, event_type = 'LIBRARY_DOWNLOAD' , 2, event_type = 'LIBRARY_VIEW' , 3, etc ...., 0) as event_type
-
Привет всем. Имеет ли смысл для улучшения сжатия в ORDER BY добавлять actionable_id в этом примере данных?
Структура таблицы:
user_id uint32, current_id uint32, actionable_id uint32
ORDER BY (user_id, current_id)
Пример данных:
user_id | current_id | actionable_id
1 | 1 | 10
15047 | 1 | 32
9 | 1 | 81
10 | 1 | 13
1 | 2 | 10
15047 | 2 | 32
9 | 2 | 81
10 | 2 | 13
При условии, что в каждом уникальном current_id никогда не дублируется actionable_id? -
Здравствуйте
-
помогите, как сделать команду связанную с базой данных по типу такого инвентаря
-
🏢 Хранилище
———————————
52 💠 — сапфир
1 🏆 — кубок -
IMHO тут лучше DELTA codec лучше применить
-
точно, надо попробовать. спасибо
-
вопрос не ясен
что такое "команда связанная с базой данных"?
имеется ввиду SQL запрос или что? -
Ну типа смотри, инвентарь где сохраняются предметы с базы данных
-
А можете подсказать сильное ли будет снижение производительности при запросе вида SELECT COUNT(*) FROM actions WHERE current_id = 2 GROUP BY user_id ? при условии использовании delta codec на current_id
-
-
я имел ввиду дельта кодек на actionable_id
но в принципе и на current_id можно сделать дельту
нет оно не влияет почти на производитительность
у вас в основном на GROUP BY время CPU уйдет
и на WHERE current_id = 2 на сравнение -
можно попробовать LowCardinality(uint32) использовать вместо кодека...
-
@BloodJazMan
-
извините, я не понимаю о чем вы говорите
-
хм как же обьяснить
-
вызываешь команду инвентаря где хранятся предметы из базы данных, они тратятся когда передаешь или покупаешь что-то у бота или когда тебе их передают то они добавляются
-
-
я работаю на sqlite3
-
Я же правильно понимаю, что LowCardinality создаёт словарь, и чем больше уникальных значений, тем хуже в плане производительности для словаря?
-
ну, а clickhouse тут причем?
это задача для sqlite или postgresql
в кликхаус можно историю сгрузить
https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/collapsingmergetreeCollapsingMergeTree | ClickHouse Docstable_engine-collapsingmergetree}
-
ну он словарь на блок создает, так что серьезные проблемы тогда когда больше сотен тысяч на блок
-
Гениально. Спасибо.
-
Уффф завелось, Есть еще типы array есть splitByChar(separator, s) который просто строку поделит с разделителем и мы получим массив строк, а можно в CH как-то каждое значение в массиве преобразовать в нужный тип ? мне надо в INT
-
cast(['1','2','3'] AS Array(Int64))
-
arrayMap(x->toInt...(x), splitByChar(....))
-
DB::Exception: Checksum doesn't match: corrupted data. Reference: 468023eceeaf0d17e14c15d87f1b3416. Actual: 0a2247d069df18fcfce942b1a2589306. Size of compressed block: 27746. The mismatch is caused by single bit flip in data block at byte 23278, bit 7. This is most likely due to hardware failure. If you receive broken data over network and the error does not repeat every time, this can be caused by bad RAM on network interface controller or bad controller itself or bad RAM on network switches or bad CPU on network switches (look at the logs on related network switches; note that TCP checksums don't help) or bad RAM on host (look at dmesg or kern.log for enormous amount of EDAC errors, ECC-related reports, Machine Check Exceptions, mcelog; note that ECC memory can fail if the number of errors is huge) or bad CPU on host. If you read data from disk, this can be caused by disk bit rot. This exception protects ClickHouse from data corruption due to hardware failures.
-
Господа эксперты. Подскажите, что это за такая крутая чексумма, которая может аж локейшн бита указать ?
-
-
даже не знаю как пошутить
-
-
Ну так в чем проблема пройтись по всем битам, пофлипать каждый, взять хеш и посмотреть, где совпадёт
-
-
Size of compressed block: 27746
-
ну тоесть 27746*8 раз посчитать хеш ?
-
интересный способ. хотелось бы узнать правда ли так
-
-
-
никак. Set engine вообще штука одноразовая. Попользовался, пересоздал.
-
сast ( .... as Array(Int64))
-
Можно еще посчитать контрольную сумму по "колонкам". И определить проблемное место по пересечению несовпавших контрольных сумм колонки и строки.
-
в парте есть файлик с checksum-ми
есть код на go который может поправить -
GitHub - marliotto/clickhouse-bitflip
Contribute to marliotto/clickhouse-bitflip development by creating an account on GitHub.
-
Спасибо, но... мне не надо править. вопрос был про то как чексумма позволяет найти бит. Парт я уже удалил.
-
переключает все биты по одному пытаясь понять сколько битов надо изменить
-
понял, спс.
-
Вобще, интересно. Неужели НАСТОЛЬКО часто, что заморочились подобной штукой
-
есть доклад Миловидова зачем все это, они несколько месяцев дебажили проблему
-
и что в итоге оказалось ?
-
космические лучи ?
-
оказалось это в сетевом обоудовании
-
ППЦ
-
Отъявленные баги и как их избежать на примере ClickHouse / Алексей Миловидов (Яндекс)
Приглашаем на HighLoad++ Foundation — крупнейшую в России профессиональную IT-конференцию. Подробности и билеты: https://bit.ly/3HYVSKS 🔥В программе — более 130 докладов, каждый из которых решает конкретную задачу. Но конференция — это не только доклады. На HighLoad++ Foundation вы легко сможете пообщаться с топами IT-индустрии и найти ответы на свои вопросы. Ждем вас 13 и 14 мая 2022 г. в Крокус-Экспо! -------- При поддержке AvitoTech мы впервые публикуем все видео с HighLoad++ 2019 в открытый доступ. Учитесь, вдохновляйтесь и перенимайте лучшие практики у спикеров, не выходя из дома. -------- Календарь конференций - https://ontico.ru -------- HighLoad++ 2019 Тезисы и презентация: https://www.highload.ru/moscow/2019/abstracts/6091 Если вы пишете код, готовьтесь к проблемам. Проблемы обязательно будут и ожидать их стоит со всех сторон — и из вашего кода, и от компилятора, и от операционной системы, и от железа. Если вы отмасштабировали кластер до космических масштабов, то ожидайте космические баги. Особенно, если речь идёт про данные из интернет-трафика. ... -------- Нашли ошибку в видео? Пишите нам на support@ontico.ru
-
Забавно. но у меня не кластер ни разу. память с EDAC. Жёсткий диск простой сата (магнитный)
-
битый cpu ?
-
ну даже не знаю. как проверить? вмятин не видно
-
не знаю,
я просто возвращаю такие сервера хостеру , и беру точно такой же, но другой 🙂 -
причём по логам в едаке вобще тишина
-
If you read data from disk, this can be caused by disk bit rot.
-
На серверных дисках обещают одну ошибку на 10^15 bit прочитанных (125Tb), вероятно дальше може быть bit rot на диске
-
ну это понятно. но я не очень представляю как такое возможно. там же тоже чексуммы на каждом углу
-
Я думаю в целевой надёжности чексуммы учтены производителем
-
кажется у дисков не настолько хорошие чексуммы (не 128 бит), и они могут пропустить гниение с некоторой вероятностью
-
SELECT session_id
FROM postgresql('host', 'dbname', 'logs', 'username', '123123')
LIMIT 1
Пытаюсь прочитать хоть что-то из большой таблички Постгри, падает с ошибкой таймаута. В табличке ~4млн записей. Если пытаться прочитать из маленькой таблички, то всё ок -
Приветствую, други! Подтолкните к решению, пожалуйста
Был создан MATERIALIZED VIEW v_name TO t_name select* from kafkaqueue
В t_name был некий не нуловый столбец для которого в kafkaqueue прилетели нуловые значения и эти данные застряли во вьюхе
Приёмник t_name был беспощадно поальтерен, но при попытке после извлечь из вьюхи застрявшие данные вижу фигу CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN
1) правильно понимаю, что данные застряли именно во вью, а не в kafkaqueue ( запрос к вью показывает данные, к kafkaqueue нет)?
2) Есть возможность проальтерить вью без потери данных которые там застряли? К примру переделать на без TO -
В kafkaqueue данные льются сессиями и нового пока не доливается, пока вопрос именно вытащить застрявшие
-
не гниение, а кручение. Мне тут сказали, что на одометре в машине, RPM - это Redhat Package Manager
-
сколько секунд в сообщение с ошибкой?
-
Сначала пытался через dbeaver, там по дефолту таймаут 30 сек, потом через веб UI, там я от нгинкса получил таймаут (не знаю сколько, по ощущением около минуты)
-
во вью ничего не может застрять. Вью работает в момент инсерта
-
при чем тут КХ тогда? пишите в nginx
-
нууу, я к тому, что он даже с limit 1 не может ничего забрать
-
Или прежде чем сделать лимит КХ вычитывает всю табличку?
-
Причем с мелкими табличками всё работает
-
limit делается на стороне КХ.
т.е. КХ час сосет данные из PG, затем делает limit.
у вас клиент (beaver/nginx) не ждут этот час а отваливаются через минуту (30 сек). КХ тут при чем? -
А, лимит на стороне КХ, тогда всё понял, спасибо
-
limit не проталкивается в PG по причине что код общий для всех баз, некоторые базы умеют limit, некоторые top, некоторые ни top ни limit, поэтому так
-
Вроде и понимаю, но в доке
Материализованные (MATERIALIZED) представления хранят данные, преобразованные соответствующим запросом SELECT
Т.е. именно хранят или я могу смело сделать детач, поменять запрос вьюхи , сделать аттач и всё поедет? -
А что насчет блока where? Так же?
-
Запрос к первичной таблице на кафкадвижке отдаёт ничего, а вью данные показыват
-
да
https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7597
https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf -
Так-так, спасибо
-
проталкиваются функции и операторы которые есть во всех базах (типа ANSI SQL)
-
Понял, спасибо
-
Подскажите пожалуйста, а для всех readonly юзеров можно передавать/устанавливать add_http_cors_header ?
Или в у вас в конфиге сервера указано разрешение?
В коде по умолчанию отключен CORS M(Bool, add_http_cors_header, false, "Write add http CORS header.", 0) -
/report
- 17 May 2022 (193 messages)
-
Подскажите, что в кх, кроме словарей и temp таблиц, может перманентно держать память?
-
Ну какую то часть могут мутации постоянные откушивать.
-
не подскажите как увидеть память аллоцированную мутациями? и они её не возвращают что ли?
-
сами мутации есть?
select * from system.mutations -
select * from system.mutations where is_done <> 1
- неоконченных нету. А так есть, да -
-
Всем привет!
Можно ли настройку stream_flush_interval_ms применить к конкретной таблице?
Или же только применима для всех потоковых таблиц? -
Всем привет пытаюсь сделать вьюшку на массив поля q1 чтобы из String преобразовывать в Array, но почему-то постоянно только пустые значения записывает. Что я делаю не так ?
create table user_activity_event3
(
event_date DateTime('Europe/Moscow'),
object_id UInt32,
q1 Array(String)
)
engine = MergeTree PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, object_id);
create table user_activity_event3_src
(
event_date DateTime('Europe/Moscow'),
object_id UInt32,
q1 String
)
engine = Null;
create materialized view to_user_activity_event3 to user_activity_event3 as select event_date, object_id, splitByString(',', q1) from user_activity_event3_src;
INSERT INTO user_activity_event3_src (event_date, object_id, q1)
VALUES ('2022-05-17 09:46:22', 12, '1,2,3,4,5,6'); -
нейминг полей во вью для этого поля сделайте
create materialized view to_user_activity_event3 to user_activity_event3 as select event_date, object_id, splitByString(',', q1) as q1 from user_activity_event3_src; -
-
Добрый день, в продолжение темы Materialized View прошу подсказать по решению проблемы с MV:
1. Есть основная таблица с событиями от пользователей с примерно 50 млн записей в сутки
2. Создал AggregatingMergeTree таблицу с сессиями пользователей, в которую передаёт данные Materialized View (примерно 400 тыс записей в сутки)
3. Для удобства также создал вьюху на MV, где используются Merge-суффиксы для выборки данных.
На тестовом сервере всё было хорошо... С запросами, которые агрегируют данные (средние длительности сессий и т.д.) даже в разрезе периода (session_date) и любых других полей и на боевой базе всё работает как надо и даже быстро, однако в некоторых запросах для дальнейшей работы требуется именно когорта сессий с определёнными параметрами - и вот тут возникает проблема - даже такой запрос при раскомментировании условия user_state перестаёт работать (а вместе с этим и все остальные, построенные на этой когорте), упираясь в память (30Гб на запрос) а фильтры требуются практически по всем полям.
Memory limit (for query) exceeded: would use 27.94 GiB (attempt to allocate chunk of 4456448 bytes), maximum: 27.94 GiB: While executing AggregatingTransform (version 21.4.6.55 (official build))
Запрос напрямую к MV (не через обычную вьюху, но с теми же Merge-функциями) не решает проблему.
Предполагаю, что влияет именно количество полей, которые ради фильтрации сессий CH приходится мержить, однако большинство из них действительно только так получаются, поскольку на момент создания сессии, ничего, кроме её id, неизвестно.
Понимаю, что скорее всего неправильно сделано всё, от запроса на создание MV до запроса на выборку... возможно, я неправильно понимаю суть работы AggregatingMergeTree или неправильно запрашиваю из неё данные... В общем, прошу подсказать, что я делаю неправильно, в какую сторону рыть и какие узкие места устранить (от более экономных агрегирующих функций до дополнительной MV, при извлечении данных из которой уже ничего не придётся мержить) для решения этой проблемы.
Всё, что понимаю в настоящий момент о MV - исключительно благодаря "Everything you should know about materialized views" by Denny Crane и нескольким видео об использовании CH в принципе от Алексея Миловидова, Александра Зайцева и т.д. по "околоэтой" теме, если есть что-то более свежее/подробное/с примерами использования - буду очень благодарен за ссылки!
Спасибо!CREATE TABLE stat_event_sessionON CLUSTER cluster( `session` String, - Pastebin.comPastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
-
мы решили подобную задачу через dbt макрос в итоге
-
-
Агрегацию основной таблицы или агрегацию уже MV?
-
Исходя из названия этой группы, не должно. 😉 Вангую, что это просто я что-то делаю не так... Возможно, совсем... 😊
-
основной таблицы да. AggregatingMergeTree как-то медленно работа. я пришел к выводу что причина в том что у нас кейс когда мало событий в сессии, типо 3-5 а эта тема когда аггрегируются сотни тысячи. ну или хз
-
Ну у меня количество "событий" и "сессий" всё же критично отличается - на два порядка... Вроде, для этого оно и надо, но конкретных рецептов приготовления пока не очень нашёл, думаю, партиционирование уже упростило бы многое, но по агрегируемому полю оно невозможно... :-(
-
ага, похожая была проблема. я закастовал все в лоу-кардиналити и другие подобные штуки. сделал индексы и норм работает. в итоге. и в реальном времени данные доступны
-
Спасибо, и так попробую, но, вдруг, все решается как-то проще и я просто этого не знаю?!
-
Есть какой-то способ объявить колонку не Nullable и когда инсертится Null заменять его на какой-то default?
-
ifNull()
-
Но это в блоке селект, а я хочу задать такое поведение при создании таблицы
-
Так, вроде, DEFAULT даже в синтаксисе прописан...CREATE TABLE | ClickHouse Docs
create-table-query}
-
прописать DEFAULT для колонки
-
Хммм... Как-то не отработало
Может я не так проверяю, секунду -
создавать из селекта хотите?
-
А, всё, понял
Я проверял для Array(), для него default не нужен, он туда сам пихает [] -
-
Добрый день.
Есть вопрос по функционалу with rollup. Не могу понять, как в результируюющем датасете отличить строки-итоги от строк-результатов-groupBy в случае, если в groupBy есть nullable колонка. Пример результата, где строки выглядят одинаково – но одна это итог по 2019 году, другая это просто группировка по ‘месяц’=null:
Есть ли какой-то подход, чтобы подсветить какую-то из этих строк как «отличную от другой»?
Запросы, на всякий случай:
create table test1.tmp_rollup
(year String, month Nullable(String), value Int64)
Engine = MergeTree Order By (year);
insert into test1.tmp_rollup
VALUES
(2019, 'май', 1),
(2019, 'июнь', 2),
(2019, null, 5),
(2020, 10 , 1);
select year, month, sum(value)
from test1.tmp_rollup
group by year, month with rollup -
Добрый день. Может кто-нибудь знает, есть ли функционал named_collections в 21.8.13.1.altinitystable? Никак не удается найти
-
-
21.11
-
спасибо
-
в ifNull обернуть?
-
arrayMap(x->toInt8(x), splitByString(',', ifNull(course_additional_info, '')) as course_additional_info,
Вот так падаем -
ошибку скиньте
-
Code: 62. DB::Exception: Syntax error: failed at position 1338 ('(') (line 39, col 16): (x->toInt8(x), splitByString(',', ifNull(course_additional_info, '')) as course_additional_info, arrayMap(x->toUInt16(x), splitByString(',', ifNull(lib. Unmatched parentheses: ((((((. (SYNTAX_ERROR) (version 22.3.5.5 (official build))
-
так скобок не хватает, перепроверьте открывающие и закрывающие
-
-
-
Functions for Working with Nullable Values | ClickHouse Docs
functions-for-working-with-nullable-aggregates}
-
оберните стркоу этйо функцией https://clickhouse.com/docs/en/sql-reference/functions/functions-for-nulls#assumenotnullFunctions for Working with Nullable Values | ClickHouse Docs
functions-for-working-with-nullable-aggregates}
-
коллеги, привет! Можно ли в clickhouse сделать count по всем элементам массива по всем строкам?
Например строки с массивом:
['а','б','в']
['а','б',]
['б','в']
Надо собрать в строки:
(элемент) (количество таких элементов во всех массивах)
a 2
б 3
в 2 -
Должен помочь arrayJoin
-
select arrayJoin(array) as element, count() as c from <table> group by element
-
спасибо, думала что arrayJoin не подойдет, сейчас попробую
-
-
Никто не в курсе? (
-
Как селектить Array(boolean) поля из постги?
КХ ругается, что не понимает что это
Could not convert string to t: 't'. (version 22.1.3.7 (official build))
Я понимаю, что КХ не знает boolean, но и закастить на UInt8 со стороны КХ это невозможно? -
Вы делали как рекомендовано, в отдельном конфиге? При запуске сервера в логах никаких ошибок нет?
-
нет, найкидал в config.xml )
в логах при старте ничего нет
я в том же конфиге дописал TTL к query_log, оно спокойно подхватилось. -
можно, почему нет
-
а вы после перезапуска дропали?
-
и после перезапуска дропал. После следующего все-равно поднимается
-
А все работает как в SQL NOT NULL ???
В целом != так же выглядит как в SQL <> ??? -
Попробуйте по документашке сделать в отдельном файлике в /etc/clickhouse-server/config.d/ с патчем на remove.
Может в той директории уже есть какие-то патчи, в которых повторно задан metric_log? -
multiIf(x is not null, 'not null', 'null')
или
multiIf(isNotNull(x), 'not null', 'null') -
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-system-tables-eat-my-disk/
возможно ваш кусок XML применяется до вендорского
1. вы удалялете
2. они добавляют
надо
1. они добавляют
2. вы удалялете -
КХ уже знает булеан.
просто мапинга для pg типа нет -
Грусть (
Понял, спасибо -
Как можно узнать тип поля в результате произвольного запроса?
Желательно без создания временной таблицы. -
desc (select 'a')
select 'a' as x, toTypeName(x) -
помогло, спасибо
-
добрый день! обновились до CH 22.3.5 и словили странное: sequenceCount/sequenceMatch перестал работать, когда запрос обращается к Distributed таблице (если выполнить этот же запрос на шарде - все красиво). Мы сейчас пытаемся воспроизвести на чистую и зарепортать баг, но быть может кто-то уже сталкивался/знает как лечить?
-
всем привет, решили обновить столбцы на боевой базе uint16 -> uint32
-
на одном из серверов кластера на одном из дисков - мало места
-
DB::Exception: Exception happened during execution of mutation '0000000000' with part '20220512_3289_16170_6' reason: 'Code: 243. DB::Exception: Cannot reserve 160.53 GiB, not enough space. (NOT_ENOUGH_SPACE) (version 21.10.2.15 (official build))'. This error maybe retryable or not. In case of unretryable error, mutation can be killed with KILL MUTATION query. (UNFINISHED) (version 21.10.2.15 (official build))
-
и все, ничего дальше не сделать
-
если пробовать локально вернуть столбец в исходное состояние, то получаем:
Code: 517. DB::Exception: Received from localhost:9000. DB::Exception: Metadata on replica is not up to date with common metadata in Zookeeper. Cannot alter. (CANNOT_ASSIGN_ALTER) -
пробуем освободить место на диске и дропнуть 1 партицию, получаем:
Code: 72. DB::Exception: Received from localhost:9000. DB::Exception: Cannot parse number with multiple sign (+/-) characters or intermediate sign character: Cannot parse UInt32 from String: while executing 'FUNCTION if(isNull(_dummy_0) : 3, defaultValueOfTypeName('UInt32') :: 2, _CAST(_dummy_0, 'UInt32') :: 4) -> if(isNull(_dummy_0), defaultValueOfTypeName('UInt32'), _CAST(_dummy_0, 'UInt32')) UInt32 : 1'. (CANNOT_PARSE_NUMBER) -
раньше у нас поле country_id было uint16
-
потребовалось расширить до uint32
-
дефолтное значение тоже поменяли
-
CAST(visitParamExtractUInt(geoip, 'country_id'), 'UInt32')
-
и судя по тому, что это единственное UInt32 поле, то не нравится именно это
-
что делать?
-
select * from system.mutations where not is_done
-
да, вижу 2 запроса
-
попробовать kill mutation?
-
вообще странная политика КХ, у нас настроен storage policy, 3 диска по 4Т
-
понятно все.
в общем когда я задаю вопрос с SQL я хочу увидеть точный копи-пейст ответа. Мне не интересны пересказы. -
-
блин, плохое качество
-
она не странная. Она работает как запрограммирована и сдизайнена.
-
сейчас загружу куда-нибудь
-
-
-
@den_crane 0 rows in set. Elapsed: 0.010 sec.
-
отпустило, что ли?
-
судя по всему да
-
видимо в итоге хватило места
-
у нас эта таблица с TTL
-
видимо в какой-то момент хватило
-
Дело не в TTL, дело в том что КХ резервирует место для мутаций, и если КХ пытается мутировать 20 партов одновременно, а места есть на 10, то для остальных 10 будет ошибка, но когда первые 10 мутированы, то вторым 10ти хватит места
-
ясно, спасибо
-
Есть таблица CollapsingMergeTree. Нужно обновить колонку в которой нули
мы делаем
ALTER TABLE reporting.chats_mutable
UPDATE platform = joinGet('reporting.temp_join_1', 'platform', chat_id)
WHERE platform = 0 AND toYYYYMM(dt) between '202104' and '202107'; -
при этом в temp_join_1 они все есть
-
Данные обновляются кусками
-
т.е. если я перезапущу запрос
-
он обновит еще несколько строк
-
и в какой-то момент перестают обновлять что-либо
-
UPDATE асинхронный, может еще первый не добежал
-
я проверят
-
мутации заканчиваются почти сразу
-
секунд за 10
-
там мало строк
-
всего 20-30 миллионов
-
reporting.chats_mutable replicated ?
-
Да
-
'reporting.temp_join_1' на всех репликах одинаковая?
-
Ее нет на репликах
-
опа
-
Ну она ж джоин. Я так понял они не реплицируется?
-
да и деда мороза тоже нет.
-
нужно создать таблицу на всех нодах и залить одни теже данные в каждую
-
таблица должна быть на 100% одинаковая везде
-
Понял, спасибо
-
Как вообще реплицируется альтер тейбл?
-
все реплики выполняют одно и тоже
-
Аааа, он не данные реплицирует
-
А как он теперь к консенсусу придет, если везде разный результат?
-
кто-то заканчивает мерж(мутацию) первым и записывает в зукипер контрольную сумму результируещго парта.
остальные реплики (последние) проверяют свою сумму с той первой, если несовпдает, они начинают все заново, если 3 раза неудачно завершилось, они сдаются и скачивают парт с первой реплики (с победителя гонки). -
Понял, это очень полезно, спасибо
-
Не значит ли это что остальные реплики стянут данные в итоге с той где таблица есть?
-
Добрый день.
Подскажите по поводу аутентификации zookeeper и clickhouse.
Запускаю в докере. Использую имедж bitnami/zookeeper:3.6 где уже есть енвы под креди и юзера (ZOO_CLIENT_PASSWORD,ZOO_SERVER_PASSWORDS) но они почему-то не работают.
Из доки как я понимаю говориться что поддерживают 2 вида аутентификации для Server-Server
(ZooKeeper supports Kerberos or DIGEST-MD5) и как я понял DIGEST-MD5 наданный момент не работает ?
https://cwiki.apache.org/confluence/display/ZOOKEEPER/Server-Server+mutual+authentication
из Server-client тоже не совсем понятно ,пропускает спокойно.
Или там ещё дополнительно ACL ками нужно рулить ?
Может кто-то сталкивался ? -
Где-то давно был issue по этому поводу, была такая же проблема.
-
из 19 года открыт в репе bitnami/zookeepe )
https://github.com/bitnami/bitnami-docker-zookeeper/issues/13
на офф репе также есть такие же.
Просто интерестно, есть уже какие-то варианты решения ?. Как в остальных из этим вопросом? Или это чисто у меня где-то завтык.ZOO_ENABLE_AUTH=yes has no effect · Issue #13 · bitnami/bitnami-docker-zookeeperI am trying to enable SASL authentication without SSL for the communication between Zookeeper nodes themselves and also Kafka to Zookeeper. I am using docker-compose to start up a single-node ensem...
-
Решений нет
-
это также значит что та реплика где таблица стянет с тех где ее нет
-
т.е. если ALTER TABLE мутация прошла с ошибкой - она все равно записывает хэши в зукипер?
-
поставил на виртуалке, а клиент Windows terminal
-
херней вы занимаетесь.
у вас работает alter ? нет, ну и делайте как вам говорят, создавайте таблицу везде -
ну я уже скидывал amosbird
они отказываюстя править...
нахрена вообще было это добавлять непонятно -
Очень самокритично с вашей стороны называть попытки разобраться в работе кликхауса - херней :)
-
потому что КХ меняем ландшафт, пока мы пытаемся рисовать карты наступления (разобраться в работе КХ)
ну смотрите КХ лог, смотрите system.mutations на репликах. -
Пытаюсь понять как это работает выступая в роли переводчика между нашей дев-тим и этим каналом :)
-
я не использую joinGet для этого. Это слишком опасная балалайка (засегфолтит в раз) и она не умеет составные ключи.
я делаю replicatedMergeTree без макроса shard (она будет одинаковая на всех нодах) и сверху словарь. -
IPv4CIDRToRange(ipv4, Cidr)
а обратной функции случаем нет? -
Спасибо
-
-
Это нормально ?
-
кажеться, что очень медленно
-
для такой таблицы
-
-
это не таблица это план запроса...
у вас там 15 партов из 15 просканировалось
что у вас в ORDER BY? -
account_id, dt
-
SELECT count() FROM chats;
-
Занимает столько-же по времени
-
мне отдельный нужен индекс?
-
нет, это не нормально.
set send_logs_level='trace';
вашзапрос -
ой, там 15 из 675 я попутал маленько... то есть оно правильно отрезало по Minmax
-
select count() вообще не должен обращаться к диску. Какая версия КХ?
скорее всего это https://github.com/ClickHouse/ClickHouse/issues/34779weird magic with projections + minmax index · Issue #34779 · ClickHouse/ClickHousecreate table test ( id Int64, d Int64 ) Engine=MergeTree partition by (intDiv(d, 10000)) Order by id; set max_partitions_per_insert_block=0; insert into test select number, number from numbers(1e8)...
-
[<SERVER>] 2022.05.17 12:21:36.616846 [ 37399 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Debug> executeQuery: (from 10.0.0.122:33988, using production parser) SELECT count() FROM chats cm WHERE dt between '2021-04-01' and '2021-07-31';
[<SERVER>] 2022.05.17 12:21:36.617455 [ 37399 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> ContextAccess (default): Access granted: SELECT(dt) ON reporting.chats
[<SERVER>] 2022.05.17 12:21:36.617724 [ 37399 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> InterpreterSelectQuery: FetchColumns -> Complete
[<SERVER>] 2022.05.17 12:21:36.617956 [ 37399 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Debug> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Key condition: (column 1 in [18718, +inf)), (column 1 in (-inf, 18839]), and
[<SERVER>] 2022.05.17 12:21:36.618262 [ 37399 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Debug> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): MinMax index condition: (column 0 in [18718, +inf)), (column 0 in (-inf, 18839]), and
[<SERVER>] 2022.05.17 12:21:36.618481 [ 3470 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210401_20210426_0_36167_923_42164 with 199 steps
[<SERVER>] 2022.05.17 12:21:36.618510 [ 1607 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210426_20210430_36168_41372_825_42164 with 29 steps
[<SERVER>] 2022.05.17 12:21:36.618577 [ 3470 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210430_20210430_41373_42113_300_42164 with 5 steps
[<SERVER>] 2022.05.17 12:21:36.618597 [ 1607 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210430_20210430_42114_42162_12_42164 with 1 steps
[<SERVER>] 2022.05.17 12:21:36.618681 [ 1607 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210528_20210531_39103_43658_740_43664 with 24 steps
[<SERVER>] 2022.05.17 12:21:36.618715 [ 3470 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210501_20210528_0_39102_975_43664 with 219 steps
[<SERVER>] 2022.05.17 12:21:36.618746 [ 1607 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210531_20210531_43659_43662_1_43664 with 1 steps
[<SERVER>] 2022.05.17 12:21:36.618826 [ 1607 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210626_20210630_36687_41794_763_42389 with 26 steps
[<SERVER>] 2022.05.17 12:21:36.618839 [ 3470 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210601_20210626_0_36686_785_42389 with 201 steps
[<SERVER>] 2022.05.17 12:21:36.618885 [ 3470 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210630_20210630_41795_42382_310_42389 with 5 steps
[<SERVER>] 2022.05.17 12:21:36.618889 [ 1607 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210630_20210630_42383_42387_1_42389 with 1 steps -
[<SERVER>] 2022.05.17 12:21:36.618975 [ 3470 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210726_20210730_36374_41499_841_43626 with 28 steps
[<SERVER>] 2022.05.17 12:21:36.619007 [ 1607 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210701_20210726_0_36373_902_43626 with 193 steps
[<SERVER>] 2022.05.17 12:21:36.619046 [ 3470 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210730_20210731_41500_43623_323_43626 with 14 steps
[<SERVER>] 2022.05.17 12:21:36.619074 [ 1607 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Used generic exclusion search over index for part 20210731_20210731_43624_43624_0_43626 with 1 steps
[<SERVER>] 2022.05.17 12:21:36.619148 [ 37399 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Debug> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Selected 15/164 parts by partition key, 15 parts by primary key, 672/672 marks by primary key, 672 marks to read from 15 ranges
[<SERVER>] 2022.05.17 12:21:36.619286 [ 37399 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Debug> reporting.chats (d65d428d-342e-4992-b049-7fd6c8d06c19) (SelectExecutor): Reading approx. 5364776 rows with 2 streams
[<SERVER>] 2022.05.17 12:21:36.620104 [ 30830 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> AggregatingTransform: Aggregating
[<SERVER>] 2022.05.17 12:21:36.620120 [ 30830 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> Aggregator: Aggregation method: without_key
[<SERVER>] 2022.05.17 12:21:36.620213 [ 33672 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> AggregatingTransform: Aggregating
[<SERVER>] 2022.05.17 12:21:36.620226 [ 33672 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> Aggregator: Aggregation method: without_key
[<SERVER>] 2022.05.17 12:21:36.627469 [ 33672 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Debug> AggregatingTransform: Aggregated. 2705201 to 1 rows (from 0.00 B) in 0.006711844 sec. (403048849.169 rows/sec., 0.00 B/sec.)
[<SERVER>] 2022.05.17 12:21:36.627472 [ 30830 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Debug> AggregatingTransform: Aggregated. 2651143 to 1 rows (from 0.00 B) in 0.006795591 sec. (390126922.000 rows/sec., 0.00 B/sec.)
[<SERVER>] 2022.05.17 12:21:36.627480 [ 30830 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Trace> Aggregator: Merging aggregated data
┌─count()─┐
│ 5356344 │
└─────────┘
[<SERVER>] 2022.05.17 12:21:36.629143 [ 37399 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Information> executeQuery: Read 5356344 rows, 10.22 MiB in 0.011213097 sec., 477686405 rows/sec., 911.11 MiB/sec.
[<SERVER>] 2022.05.17 12:21:36.629162 [ 37399 ] {cb710acf-78e7-44bf-8478-fb80f6d9e91a} <Debug> MemoryTracker: Peak memory usage (for query): 0.00 B.
1 rows in set. Elapsed: 0.335 sec. Processed 5.36 million rows, 10.71 MB (15.97 million rows/s., 31.95 MB/s.) -
Сорри за длинный копипаст
-
векрсия 21.7.5.29
-
-
А что имеется ввиду под "сверху словарь" ?
-
Лучше бы просто в пастилу закатали
-
-
сами должны запуститься
-
-
-
Добрый день. Подскажите, пожалуйста, в чем может быть ошибка?
Не выходит создать таблицу, хотя подключение к серверу проходит корректно.
Код исполняется в JupyterLab.
class simple_ch_client():
def __init__(self, CH_HOST, CH_USER, CH_PASS, cacert):
self.CH_HOST = CH_HOST
self.CH_USER = CH_USER
self.CH_PASS = CH_PASS
self.cacert = cacert
def get_clickhouse_data(self, query, connection_timeout = 1500):
r = requests.post(self.CH_HOST, params = {'query': query,
'user': self.CH_USER, 'password':self.CH_PASS},
timeout = connection_timeout, verify=self.cacert)
if r.status_code == 200:
return r.text
else:
raise ValueError(r.text)
my_client = simple_ch_client(CH_HOST, CH_USER, CH_PASS, CH_CASERT)
q = f'''
CREATE TABLE IF NOT EXISTS direct_table ON CLUSTER {CH_DB_NAME}
(
Date Date,
CampaignName String,
Impressions UInt64,
Clicks UInt64,
Cost UInt64
)
ENGINE = MergeTree()
ORDER BY Date
'''
my_client.get_clickhouse_data(q)
ОШИБКА:
———————————————————————
ValueError: Code: 170. DB::Exception:
Requested cluster 'clickhouse_cluster' not found.
(BAD_GET) (version 22.3.5.5 (official build)) -
Так он же пишет, что приходит запрос create table direct_table on cluster clickhouse_cluster, но такого кластера в system.clusters нет.
-
system.clusters смотрите
-
Да, но такой кластер есть. Он вообще только один
-
вроде первый раз надо все просканить
а потом просто при мержах будет фильтровать -
ON CLUSTER 'cluster-name'
в кавычках вроде имя кластера должно быть
ну и в system.query_log смотрите какой именно запрос с клиента вашего передался -
Привет, подскажите бд у кликхаус перенести можно? если да то как
-
С одного и того же сервака делаю запрос к распределённой таблице. В первый раз отрабатывает за 37мс, второй - за 69110. Пытаюсь разобраться в причинах с помощью EventsProfile. Возникло три вопроса:
1. Как трактовать в 67500 раз бОльшую продолжительность чтения с диска всего при 4 SlowRead-ах? Серваки при этом идентичные.
2. Почему в рамках одного и того же запроса в одном случае по сети шлётся 4кб, а в другом - 4.7мб? Или там что-то типа пингов, объём которых пропорционален времени запроса?
3. Почему в system.query_log согласно query_duration_ms запрос выполнялся 69110, а в EventsProfile метрика RealTimeMIcroseconds 345434710? Это же в 5000 раз больше. -
-
а вы на инициаторе все эти числа смотрите? у вас вообще запрос тот же самый и вернул то же самое?
-
Запрос возвращает всего одну строку и одну и ту же оба раза, да.
Кластер из двух шардов по две ноды, выполняю на первой ноде первого шарда, а query_log смотрю на двух нодах второго шарда через clusterAllReplicas where query_id != initial_query_id and initial_query_id in (...)). -
-
-
Я так понимаю, что это ожидание окончания чтения с диска. Но если бы данные читались настолько медленно, то там по идее должна была бы быть куча SlowRead-ов и ReadBackoff-ов, но их нет. В магию не верю, поэтому наверное что-то не так понимаю в метриках или в механике происходящего)
-
Joined.
-
Привет, подскажите как в ClickHouse проверить является ли значение текстового поля числом?
-
cast сделай? или регуляркой)
-
Обновил Tabix
- Поддержка httpS+http
- Поддержка ReadOnly
Должно все работать с единого url
http://dash.tabix.io
К trial.altinity.cloud подключается ) -
toUInt32OrNull is Null
-
Ок, работает, спасибо большое!!! только в моем случае я так использую: toUInt32OrNull is not Null
-
тоже можно
-
У меня поломан чутка локальный clickhouse, поэтому вылезает такая ошибка. В целом работать самому ClickHouse она сильно не мешает, но похоже tabix от нее становится грустно и он не выполняет никакие запросы.
-
А так спасибо вам за tabix
-
Ого, а другие Ui, jetbrains могут подключится и показать структуру?
Просто без sys.cols не возможно получить структуру db ) -
dbeaver смог (ну все базы показал), но имхо я уже привык и без структуры жить и хотелось бы что бы tabix тоже мог наплевать на нее
-
Подумаю, не простая задачка )
Попробую в несколько проходов сделать, может получится
Select * from sys.cols limit 50k
If false limit 5000
If false limit 1 ;) -
Да я думаю можно просто сделать fall back что как будто ни баз ни таблиц нет.
-
Вдруг у пользователя нет доступа к системным таблицам вообще. (сделать сложно но можно)
-
😉 Лучше не нужно лишних ограничений - мне уже хватает в коде ветвления если версия CH ... то ... а если это то ...то ...
Будет возможность, попробуйте плиз залил [Version: 22.05.18 ] в dash.tabix.io правку - проще оказалось чем думал
Обязательно system.databases + system.tables + system.parts
system.parts -подумаю как выкинуть тоже, но пока нужен
Не обязательные:
- system.functions
- system.clusters
- system.dictionaries
- system.columns -
Да, кажется работает.
Спасибо! - 18 May 2022 (186 messages)
-
что вы подразумеваете под словом "перенести"?
с сервера на сервер?
https://clickhouse.com/docs/en/operations/backup#clickhouse-copier
или с диска на диск?
https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings#server_configuration_parameters-path
или переиеменовать?
в новых версиях для Atomic
RENAME DATABASE
https://clickhouse.com/docs/en/sql-reference/statements/renameData Backup | ClickHouse Docsdata-backup}
-
КРАСАВЧЕГ! вот просто хочется обнять =)
-
-
Привет,
вот тут написано
For Summing / Aggregating
All dimensions go to ORDER BY, all metrics - outside of that.
The most important for filtering columns with the lowest cardinality should be the left most.
If number of dimensions is high it’s typically make sense to use a prefix of ORDER BY as a PRIMARY KEY to avoid polluting sparse index.
Не могу понять, как перечисление в Primary key тех же самых полей, что и в Order by поможет avoid polluting sparse index.
Что означает avoid polluting sparse index?
Как изменится логика, если поля агрегации будут перечислены только в order by или же и там, и в Primary key?
Поля фильтрации достаточно перечислить только в order by? -
Вот этот раздел тоже слабо в голове укладывается :((
Вроде слова понятные, а по смыслу непонятно. Поясните пожалуйста на пальцах, что имеется ввиду:
For Replacing / Collapsing
You need to keep all ‘mutable’ columns outside of ORDER BY, and have some unique id (a base to collapse duplicates) inside. Typically the right-most column is some row identifier. And it’s often not needed in sparse index (so PRIMARY KEY can be a prefix of ORDER BY) The rest consideration are the same.
Examples:
ORDER BY (tenantid, site_id, eventid) -- utm_source is mutable, while tenantid, site_id is not PRIMARY KEY (tenantid, site_id) -- eventid is not used for filtering, needed only for collapsing duplicates
Ещё, подскажите пожалуйста,
Replacing - это когда мы заменяем секцию со старыми данными на секцию с актуальными?
А collapsing? -
IMHO иееется ввиду разреженные значения индекса, когда у вас значения в кусках данных случайно распределены ... и поэтому сканирование замедляется потому что сжатие хуже
PRIMARY KEY это основные поля ускоряющие выборку если они есть в WHERE
а ORDER BY обязан содержать все из PRIMARY KEY но дополнительно может содержать еще поля, которые будут учавствоваоть в сортировке и за счет этого колонки которые не входят в PRIMARY KEY могут сжиматься лучше -
Спасибо
-
Спасибо! А collapsing (второй вопрос) не подскажете?
-
В primary key низко кардинальные поля
По возрастанию кардинальному
3-4 поля обычно достаточно остальное обычно не имеет смысла
В order by
Все из primary
И дор поля для которых сортировка приведёт к улучшенному сжатию
Не надо туда все поля писать
Если primary не указан он берётся из order by в create table -
Агрегирующий движок тупо делает агрегацию
Для всех строк
Хранит не результат агрегации а внутренние состояния чтобы потом в select доагрегировать можно было -
Collapsing
Схлопывает по sign все строки с одинаковым order by значениями полей -
А replacing заменяет
На любую строку
И на последнюю если versioning -
почему не дает влить бекап ? переношу с сервера на сервер, базу и таблицу создал как тут https://hub.docker.com/r/yandex/clickhouse-server
-
что значит схлопывает по SIGN? Когда это происходит, при селекте? Простите, совсем непонятно :((( возможно, чего-то базового не знаю.
-
Я думала replacing - это когда мы принудительно партицию стираем, а вместо нее другую из источника заливаем. Но, судя по ответу, это что-то другое. Поясните пожалуйста.
-
Я пояснил
Перечитайте ещё раз
Парты и партиции это разные вещи
Почитайте про system.parts и system.partitions
Парты иммутабельны
Создаются при вставке
Потом объединяются с другими более старыми партами в фоне
Путём сортировкой слиянием
Порождая новые парты
А старые ставя как active=0
И удаляя через 480 секунд
Разновидности движков это всего лишь логика которая действует при вставке и слияниях -
спасибо
-
Replacing
Видя несколько строк с одинаковыми значениями полей из order by
Выбирает только одну строку
А replacingversioning
Выбирает строку с максимальным значением поля которое указано как version
В параметрах движка в create table -
-
Добрый день!
У меня вопрос по нормализации данных в кликхаус
Нужно ли распределять данные по нескольким таблицам как в обычных БД?
Или с учетом полей Low Cardinality можно делать просто широкие таблицы и повторяющиеся значения будут оптимизированы ? -
У join есть определенные ограничения, см документацию. Поэтому по возможности рекомендуется денормализовать данные или использовать словари
-
Collapsing и Replacing касается только движков CollapsingMergeTree и ReplacingMergeTree? Просто MergeTree - нет?
-
Всем привет
Есть ли какие-то туториалы по настройке Replicated + clickhouse-keeper? -
И стоит ли его использовать или лучше zookeeper?
-
Добрый день!
Подскажите, пожалуйста, есть какая-нибудь возможность/параметр, чтобы ClickHouse игнорировал/заполнял <null> колонки, которых нет в Parquet, но определены в таблице?
Т.е. обойти ошибку "DB::Exception: Column "clmn" is not presented in input data: While executing HDFS."
Нигде не нашел подобной информации.. -
всем привет) можете плз напомнить, какой командой можно оценить запрос в кх - порядок его выполнения? кажется я где-то видел что, такая команда существует, но в доке и гугле что-то не могу найти
-
EXPLAIN Statement | ClickHouse Docs
explain}
-
во, спасибо!)
-
Всем привет! А в кх есть функция чтобы до запуска запроса оценить время его выполнения и объем памяти который будет обрабатываться?
-
Всем привет!
У меня есть набор range данных, которые я бы хотел использовать в качестве словаря:
| from | to | product |
|------|----|---------|
| 1 | 5 | ball |
| 6 | 10 | doll |
| 11 | 15 | car |
Есть возможность использования такого range-словаря, чтобы передавать число и получать соответствующее значение product? Нашёл инфу про range-hashed словари, но в DictGet всё равно требуется передача ключа, а range - дополнительное условие. Есть workaround?Storing Dictionaries in Memory | ClickHouse DocsThere are a variety of ways to store dictionaries in memory.
-
просто MergeTree не касается. от слова вообще
просто MergeTree
это связли два парта по Х и Y строк
и получили один парт из X+Y строк отсортированных по ORDER BY -
use a prefix of ORDER BY as a PRIMARY KEY to avoid polluting sparse index
имеется ввиду что полей в orderby у summingMergeTree может быть много, типа 50, а в PRIMARY KEY добавлять стоит только 3 первых (префикс), таким образом 47 полей не будут загрязнять индекс, индекс будет маленьким в размере и займет небольшое кол-во ОЗУ и места на диске, в любом случае в индексе не имеет смысла хранить больше 5 полей (из опыта). -
ORDERBY секция используется мержами идентификации уникальных записей (типа первичный / уникальный), ReplacingMT в мержах остаются только один экземпляр для набора ORDERBY
-
это в документации надо читать, тут вам напоют
-
всю ошибку в студию
-
чего там настраивать-то?
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-zookeeper/clickhouse-keeper/ -
О, спасибо, не смог найти это
-
есть, но надо руками перечислять поля
-
Подскажите: я правильно понимаю, что коннектор для Tableau от Altinity предназаначен для использования c Tableau Desktop, а для создания live connect / extract на серверной стороне всё равно нужно установить драйвер clickhouse-odbc, и, таким образом, это невозможно сделать в Tableu Online?
-
есть еще Altinity видео на ютубе про zookeeper/keeper (но я его не смотрел)
-
Ага, нашел (для истории)
https://altinity.com/webinarspage/all-about-zookeeper-and-clickhouse-keeper-tooAll About Zookeeper (And ClickHouse Keeper, too!)Join Altinity’s in-depth webinar to learn about ZooKeeper (why it's necessary, how it works), ClickHouse Keeper (the new built-in replacement), and best practices for both of them.
-
такого нет и врядли будет (это очень тяжело предсказать), есть explain estimate
-
2022.05.18 10:07:15.558361 [ 25001 ] {} <Error> database.table_local (9d6098aa-ffa6-4fac-85c4-bfcf62e5b7d8): auto DB::StorageReplicatedMergeTree::processQueueEntry(ReplicatedMergeTreeQueue::SelectedEntryPtr)::(anonymous class)::operator()(DB::StorageReplicatedMergeTree::LogEntryPtr &) const: Code: 235. DB::Exception: Part 20220518_28722_28722_0 (state Active) already exists. (DUPLICATE_DATA_PART), Stack trace (when copying this message, always include the lines below):
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0xb6fbffa in /usr/bin/clickhouse
1. DB::MergeTreeData::renameTempPartAndReplace(std::__1::shared_ptr<DB::IMergeTreeDataPart>&, DB::MergeTreeTransaction*, SimpleIncrement*, DB::MergeTreeData::Transaction*, std::__1::unique_lock<std::__1::mutex>&, std::__1::vector<std::__1::shared_ptr<DB::IMergeTreeDataPart const>, std::__1::allocator<std::__1::shared_ptr<DB::IMergeTreeDataPart const> > >*, DB::MergeTreeDeduplicationLog*, std::__1::basic_string_view<char, std::__1::char_traits<char> >) @ 0x16a33c08 in /usr/bin/clickhouse
2. DB::MergeTreeData::renameTempPartAndReplace(std::__1::shared_ptr<DB::IMergeTreeDataPart>&, DB::MergeTreeTransaction*, SimpleIncrement*, DB::MergeTreeData::Transaction*, DB::MergeTreeDeduplicationLog*) @ 0x16a359ab in /usr/bin/clickhouse
3. DB::StorageReplicatedMergeTree::fetchPart(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, unsigned long, std::__1::shared_ptr<zkutil::ZooKeeper>) @ 0x1673433a in /usr/bin/clickhouse
4. DB::StorageReplicatedMergeTree::executeFetch(DB::ReplicatedMergeTreeLogEntry&, bool) @ 0x16726271 in /usr/bin/clickhouse
5. DB::StorageReplicatedMergeTree::executeLogEntry(DB::ReplicatedMergeTreeLogEntry&) @ 0x16715724 in /usr/bin/clickhouse
6. ? @ 0x167dc11f in /usr/bin/clickhouse
7. DB::ReplicatedMergeTreeQueue::processEntry(std::__1::function<std::__1::shared_ptr<zkutil::ZooKeeper> ()>, std::__1::shared_ptr<DB::ReplicatedMergeTreeLogEntry>&, std::__1::function<bool (std::__1::shared_ptr<DB::ReplicatedMergeTreeLogEntry>&)>) @ 0x16c23a25 in /usr/bin/clickhouse
8. DB::StorageReplicatedMergeTree::processQueueEntry(std::__1::shared_ptr<DB::ReplicatedMergeTreeQueue::SelectedEntry>) @ 0x16757a13 in /usr/bin/clickhouse
9. DB::ExecutableLambdaAdapter::executeStep() @ 0x167dcc71 in /usr/bin/clickhouse
10. DB::MergeTreeBackgroundExecutor<DB::OrdinaryRuntimeQueue>::routine(std::__1::shared_ptr<DB::TaskRuntimeData>) @ 0xb6d4fe5 in /usr/bin/clickhouse
11. DB::MergeTreeBackgroundExecutor<DB::OrdinaryRuntimeQueue>::threadFunction() @ 0xb6d4ced in /usr/bin/clickhouse
12. ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::__1::__list_iterator<ThreadFromGlobalPool, void*>) @ 0xb7aa47a in /usr/bin/clickhouse
13. ThreadFromGlobalPool::ThreadFromGlobalPool<void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda0'()>(void&&)::'lambda'()::operator()() @ 0xb7ac464 in /usr/bin/clickhouse
14. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0xb7a78a7 in /usr/bin/clickhouse
15. ? @ 0xb7ab2dd in /usr/bin/clickhouse
16. start_thread @ 0x8ea7 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
17. __clone @ 0xfddef in /usr/lib/x86_64-linux-gnu/libc-2.31.so
(version 22.4.4.7 (official build)) -
есть, просто передавать в rangehashed заглушку (обычно передают key=1)
-
для того, чтобы в выборку попадали только поля, которые есть в parquet'е?
И, если parquet'ы разнородные по полям (данные за несколько лет, и постепенно прирастали полями), то при выборке еще нужно учитывать, чтобы читались только те файлы, где эти поля есть?
Я правильно понял? -
#вакансия
Добрый день! Хотела бы предложить вам две вакансии
💊 Компания ФК ПУЛЬС — фармдистрибьютор № 1 на российском рынке. Уже 25 лет мы формируем новые стандарты качества в дистрибьюторском бизнесе и любим дело, которым занимаемся!
Наш IT департамент насчитывает уже больше 160 человек.
Сейчас мы ищем ClickHouse DBA
Вилка: до 260 000 на руки.
Формат работы: Можно удаленно, гибрид или офис.
Адрес офиса: г. Химки, ул. Ленинградская, д.29
График: 5\2 с 9 до 18, но можно обсуждать
🔹Задачи:
- Установка, настройка кластера и сопровождение ClickHouse;
- Обеспечение непрерывной работы, диагностика и устранение неполадок ClickHouse;
- Восстановление кластера в случае аварии;
- Настройка системы мониторинга и анализа ошибок в части работы ClickHouse;
- Внедрение систем миграций БД;
- Настройка кластеров Apache Kafka, контроль и обеспечение непрерывной работы;
- Контроль пайплайна данных Kafka -> Clickhouse.
🔹Что мы хотим видеть от кандидата:
- Опыт администрирования и настройки Clickhouse и Kafka от 2-х лет;
- Опыт настройки мониторинга;
- Опыт взаимодействия с разработчиками, участие во внедрениях как плюс;
- Базовые знания unix систем.
🔹Что мы предлагаем:
- Оформление на работу согласно ТК РФ;
- Полностью белая зарплата, выплата три раза в месяц;
- Интересные и сложные задачи;
- Возможность обучения и посещения конференций за счет компании;
- ДМС.
Контакты для связи: @psheni, y.pshenichnaya@puls.ru -
#вакансия
Также ФК ПУЛЬС ищет Разработчика баз данных ClickHouse
Вилка: до 180 000 на руки.
Формат работы: Можно удаленно, гибрид или офис.
🔸Задачи:
- Создание структур данных и витрин для отчётов (ClickHouse);
- Участие в разработке ETL (NiFi, Kafka);
- Написание SQL запросов для отчётов (ClickHouse, PostgreSQL);
- Взаимодействие со смежными подразделениями по вопросам настройки метрик, подготовки отчетов и т.д.
🔸Что мы хотим видеть от кандидата:
- Уровень работы с ClickHouse от middle;
- Уровень разработки SQL (Postgresql, MSSQL) от middle;
- Опыт работы с Kafka;
- Будет плюсом опыт работы с NiFi и Java. -
надо грепать логи на обеих репликах по 20220518_28722_28722_0
тут что-то странное случилось, реплика скачала парт и обнаружила что у нее такой есть уже. Это часто у вас? -
ну да, есть такая штука input function, из нее можно делать select поэтому получается insert into .... select ..... from input(.. .... )format Parquet
-
каждые несколько минут регулярно
-
а зукипер далеко? в другом датацентре?
-
зукипер на тех же хостах что и кликхаус
-
а ну нельзя так. Зукиперу нужен отдельный хост с отдельным диском. КХ мешает зукиперу работать.
-
спасибо, попробуем.
но при этом зукипер должен быть близко (в пределах одного датацентра), чтобы не было лагов сети? -
да, типа летенси должна быть <30ms (чем меньше тем больше инсертов сможете делать)
-
Хотя бы для начала вынести данные кипера на отдельный от КХ диск (В рамках той же машины)
-
ещё подскажите пожалуйста есть ли какой-то особый подход чтобы перевести существующий кластер КХ на новые хосты зукипера и при этом не потерять данные которые в моменте пишутся в Replicated таблицу?
просто обновить адреса зукипера в конфигах это слишком резкий подход? -
Добавить в существующий кластер зоокипера новые ноды, дождаться синхронизации, поменять в конфигах, удалить старые
-
КХ переключается на другую сессию зукипера если в текущей ошибка, т.е. будет (возможна) ошибка инсерта
я останавливаю заливку, КХ обычно быстро переключается (из-за репликации и мержей) -
Здравствуйте, изменил настройки сервера <logger> в директории config.d (изменил пути к логам + уровень логирования). Вопрос: нужно ли перезагружать сервер при изменении этих настроек? Можно ли как-то убедиться, что изменения "подхватились" (может через какой-то хитрый SELECT или еще как-то)?
Спасибо -
Только глядя в логи.
И зависит от версии, сначала КХ умел без перезагрузки, потом его разучили, потом снова научили. -
спасибо!
-
спасибо большое! понятно :)
-
Не могу создать ReplicatedMegreTree таблицу из примера с альтинити, бесконечно долго (до таймаута) жду ответа от запроса. Настроил вроде правильно
-
Добрый день.
перешел на jdbc 0.3.2
java.lang.IllegalArgumentException: Only singleton array is allowed, but we got: [671754, 874503, 874502, 167962, 493592...
clickHouseDAO.executeSQLByHost(this.clickHouseHost, insertDenormalizedDataSql, (connection, statement) ->
statement.setArray(ONE, connection.createArrayOf(JdbcTypes.BIGINT, studyIndexInfo.getIds().toArray(new Long[]{}))));
как победить? -
select * from system.zookeeper where path = '/' работает?
-
на лидере да
-
чта? какой лидер, вы о чем?
-
-
Всем хорошего времени суток, есть ли ограничение на кол-во таблиц в базе? Заранее благодарен!
-
How much is too much?
ClickHouse Limitations.
-
Нууу реплики ж отличаются как-то
-
каша, какая каша.
надо сначала добится чтобы киперы собрались в кластер.
select * from system.zookeeper where path = '/' должен работать на всех нодах -
спасибо!
-
проверяйте сеть, порты
-
Сегодня выяснил что на наших серверах 32 гига памяти под CH. Есть ли какой-то нижний порог рекомендуемой памяти?
-
имхо, если меньше 128 не стоит даже заморачиваться с КХ. Взять что-нибудь попроще.
https://clickhouse.com/docs/en/operations/requirements#ram
https://clickhouse.com/docs/en/operations/tips#ram -
Спасибо
-
-
нет.
и вообще вам это не нужно. UInt256 это страшная штука, это как стратегическое ядерное оружие, я даже на тестовых контейнерах в докере не пользуюсь, страшно. -
К сожалинию нужно(
Кстати, UInt256 шикарно работает для нас. В базе считаем большие числа.
Спасибо за ответ, пойду перегонять) -
С помощью UInt128 можно пересчитать все атомы во Вселенной ;)
Не хватает? -
Не хватает. Есть строковые данные, которые не помещаются в UInt128, но поместились бы в UInt256. К сожалению, процессоры с поддержкой 256-битной арифметики пока не выпускают, так что пользы от UInt256 будет не так много.
-
во вселенной не хватит, в млечном пути наверное можно
-
с трудом конечно можно понять зачем нужны UInt128 и 256 и тем более в orderby, там граблей вагон, в какой-то момент выяснится что все вообще работает неправильно и индекс битый потому что UINt256 сравниваются неправильно
-
Хеши можно хранить, и они будут относительно человеко-читаемы
-
А строчки прямо все разные?
Если вдруг нет, можно смотреть сюда https://clickhouse.com/docs/en/sql-reference/data-types/lowcardinalityLowCardinality Data Type | ClickHouse Docslowcardinality-data-type}
-
дада, я уже это слышал, "нам в табло надо показывать", тут правда есть проблема что никто не поддерживает UInt256
-
драйвер превратит в строку, которая покажется в tableau.
А внутри кх это будет все те же 16/32 байта -
Условно разные, но их больше 100_000. Например, база цифробуквенных серийных номеров.
-
Упаковка таких ключей в int значительно ускоряет запросы
-
Анализируем систему которая с такими числами работает. Для очистки совести - 256 юзаю только там где необходимо, из-за этого и нарвался на то что прийдется перегодять терабайтную таблицу)
-
и что это на самом деле числа? с арифметическими операциями?
-
Здравствуйте)
Планируем собирать метрики с 2 разных сущностей, и чтобы построить общую воронку, эти метрики нужно как-то соединять
Проблема в том, что соединение этих сущностей многие-ко-многим, что порождает 2 джойна больших таблиц (каждая прирастает на овер 16 млн строк в сутки) через таблицу с маппингом (всего около 20тыс строк, прирастает медленно)
Соответственно, чтобы соединить данные нужно выполнить следующее: джойн 1 большой таблицы с маппингом -> получаем большую таблицу, (вариативно)группировка результата, джойн 2 большой таблицы
Сейчас в кликхаусе получше обстоят дела с джойнами (появился джойн для больших таблиц, джойн во внешней памяти), но все равно скрипты будут получаться достаточно громоздкими (нельзя использовать несколько джойнов подряд и нужно уходить в подзапросы)и из-за большого размера таблиц растет риск уронить запрос по памяти
Возможно кто-то уже сталкивался с подобной проблемой?
Мы также рассматривали возможность скидывать метрики с обеих сущностей в одну супер-большую таблицу, но тогда неочень понятно как их соединять: 2 подзапроса опять же породят 2 таблицы из одной, которые затем соединятся через таблицу с маппингом через 2 джойна. Кроме того мы чаще работаем с данными каждой сущности по отдельности, соответственно нужно будет добавлять специальное поле, чтобы иметь возможность быстро фильтроваться по метрикам. Также структура метрик у этих сущностей имеет существенные различия, поэтому будут полупустые колонки, заполненные значениями только для какой-то одной сущности -
А вы не хотите сразу заливать в несколько таблиц через MV? Тогда для запросов к отдельным сущностям вы будете пользоваться отдельными таблицами, а когда к объединенным данным - то к сгруппированной.
-
Вариант с супер широкой таблицей выглядит радужнее. Пропуски в метриках? - ну и ладно. Можно попробовать уложить метрики в словари.
Широкую табличку можно сделать через MV -
а как это решит проблему с соединением сущностей?
все равно придется цепляться через маппинг -
Мы делаем что-то очень похожее, но необходимости в джоинах не возникло
-
что вы подразумеваете под соединением сущностей?
-
и для воронок есть встроенная функция КХ
-
join не нужен. На самом деле вы клеите все ивенты по какому-то id в одну строку, это group by а не join
поэтому масса вариантов, grouparray , WF
маппинг в словарь и мапить лучше в момент инсерта -
Ребята, я тут уже задавал вопрос про директорию /var/lib/clickhouse/data/database/detached мне дали ссылку в которой говорится, что файлы начинающиеся на ignored_ можно спокойно удалять.
-
Вопрос: можно просто удалить соответствующие директории из ОС или надо делать какой-то особый запрос к СУБД?
-
У нас есть нулевой шаг воронки, на нем сущность = профиль интеграции
Следующие шаги воронки, сущность = id провайдера
При чем с разных профилей можно попасть на разные провайдеры + на провайдер можно попасть напрямую, минуя профиль -
у вас просто одна таблица - profile_id, provider_id, action/event
-
Этого достаточно чтобы строить воронки вдоль и поперек
-
да, из ОС, все что в detached можно сносить.
если лень из ос то можно через SQL, там в статье был пример -
Большое спасибо!
-
Да, сложение/вычитание в базе прямо. Планирую на сумирующий матвью уехать.
-
и что там? биткоины? сложно представить для чего нужно 128 бит, не говоря уж про 256
-
У нас есть UserId, но этих пользователей нужно потом раскидывать по кучкам (b2b2c модель), соответственно тех людей, которые с 0 шага перешли на первый мы без проблем таким образом распределим по нашим провайдерам (основная сущность), но вот чтобы посчитать конверсию нулевого шага, где у нас другая сущность (профиль) возникают проблемы
-
EXPLAIN | ClickHouse Docs
explain}
-
ну вы наизобретали разных терминов, которые у вас там используются (профиль, шаг0, пользователь, провайдер) это все шелуха. Абстрактно мы все тут в этом чате решаем одну и туже задачу, клеим кучи ивентов в строку и обсчитываем воронки, и не нужны джойны, просто вам надо осознать задачу под другим углом
-
Система отдает много этих цифророк 256 разрадности, надо их компактно упаковать и про запросу шутро посчитать вот на математике думал сначала побить на 4 столбца по 64 бита (мб выиграл бы в компресси), потом решл юзать 256 бит, раз уж поддерживается. Ну и клик тут идеально вывозит
-
вопрос не в этом, просто любопытно для чего может понадобится 256 бит, что можно считать в таких числах? Это перебор даже для коллайдера и астрофизики.
-
-
хуавей
-
У нас тоже b2b2c. Вы наверное задачу в терминах реляционных баз представляете. А вам нужно ее как огромную таблицу фактов с приклеенными атрибутами
-
понятие сущности тут выпадает вообще
-
это технические ограничения системы, уже есть профиль, уже есть провайдер (система живет больше 10 лет)
соответственно наши аналитики не могут сказать, сносите все и пилите заново с одной сущностью, а пытаются каким-то образом подстроить аналитическую систему -
Ничего заново пилить не надо
-
на уровне аналитике вы можете хоть зеленых человесков рисовать
-
вопрос в хранении данных и как их потом запрашивать
-
вы ничего не поняли.
-
извините, но так на вскидку кажется что нужно нормально написать запросы и посмотреть на структуры данных 16млн в день это не так чтобы овер много.
ну и посмотреть на типы данных. может нужно закастовать в лоукардиналит и инты (в том числе внутри мапов и эрреев)
далее если всё равно много вычислений то можно написать материлизацию со сплитами (чтобы по памяти не падало) я так думаю сделать для сложных маркетинговых расчетов. но так и не доьрался так как каждый раз нахожу способы ускорить через нормальное написание запросов.
подзапросы вообще зло. из-за них код хрен поймешь. используйте with / cte по гайдланам гитлаба -
-
Крипта. Там decimals предсавление: UInt256 бит на число + Uint8 на колличество знаков после зарятой.
-
-
Добрый день, аналитику на ClickHause перевели? А отчётные формы на чем решили сделать, если не секрет? :)
-
:) спасибо, все понятно!
-
а сколько, если не секрет?
-
не знаю секрет это или нет. поэтому не скажу
-
Спасибо!!! Доработаю ))
-
👍👍😄
-
=) да нормальный процесс..
-
Всем привет!
Кто может подсказать почему не выполняются ALTER операции для некоторых таблиц?
Проблема:
Пытаюсь добавить/изменить/удалить столбец в таблице, но получаю timeout.
Тестил в VS Code c clickhouse-driver (python), получаю:
clickhouse_driver.errors.ServerException: Code: 473.
DB::Exception: Locking attempt for ALTER on "test_db.test_table" has timed out! (120000 ms) Possible deadlock avoided. Client should retry..
Тестил в DBeaver:
SQL Error [159] [07000]: Read timed out, server ClickHouseNode(addr=http:localhost:8123, db=default)@-550109806
При этом остальные таблицы большего и меньшего размера выполняют ALTER корректно, а также копия данной таблицы работает с ALTER исправно.
В чем тогда может быть проблема с данной таблицей? -
Допустим есть Distributed таблица, и есть шарды. Можно ли при запросе определить лагающие реплики?
-
Или просто замерить время ответа каждой реплики. Допустим прямо в запросе.
-
А что за гайдлайны? Как найти?
-
одна операция в одном алиасе. то есть пишите вверху оди with и дальше каждое вычисление отдельным блоком. все джойны желательно через using вообще если перфекционизмом заниматся:) https://gitlab.com/gitlab-data/analytics/-/blob/master/transform/snowflake-dbt/models/marts/pumps/subscription_product_usage_data.sql
ну я вот так пишу, просто рандомная моделька кусок -
спасибо)
-
Выглядит - офигенно. Но вот всмысле читать - не очень удобно как по мне
-
да не. читать 100% удобнее, просто непривычно ну и разные стили по отступам может вам другой комфортнее.
тут самое важное это простота отладки. в конце модели всегда делается select * from last_cte и можно подставить любой промежуточный шаг и посмотреть. -
-
Вот это интересно, ага
-
-
-
Добрый день! DataLens + самописный портал
-
Пару часов назад я задавала вопрос про соединения метрик 2 разных сущностей через таблицу с маппингом многие-ко-многим
Большое спасибо всем за участие
Как оказалось, описание нашей проблемы было несовсем корректным)
Но все равно было найдено хорошее решение, вдруг кому-то оно тоже пригодится
Метрики пользователей с 0 шага (сущность профиль) и метрики пользователей с последующих шагов (с сущностью провайдер) будут писаться в общую таблицу со всеми метриками
Таблица с маппингом многие-ко-многим будет реализована 2 словарями: словарь 1 - к уникальному профилю цепляется массив с возможными провайдерами, словарь 2 - к уникальному провайдеру цепляется массив с возможными профилями
При инсерте метрик пользователей в общую таблицу будут заполнятся 2 дополнительные колонки из словарей: для метрик 0 шага массив с провайдерами из словаря 1, для метрик последующих шагов массив с профилями из словаря 2
Таким образом, мы получим возможность быстро и незатратно по памяти считать воронки как в разрезе профилей, так и в разрезе провайдеров (с помощью функций работы с массивами и функциональности array join) -
Добрый вечер, вы пишите парты и партиции разные вещи, но в документации написано, что парты и есть партиции:
https://clickhouse.com/docs/ru/operations/system-tables/parts/
Подскажите, где мне почитать о том, что они разные. Описание таблицы system.partitions также не нагуглила.
Посоветуйте пожалуйста.system.parts | ClickHouse Docssystem_tables-parts}
-
так указано же, что в этой таблице в колонке name лежит имя парта, в колонке partition — имя партиции, к которой этот part принадлежит.
и там разные значения. -
Поняла, спасибо
-
partition — это то, на что вы нарезаете таблицу в зависимости от ваших нужд
part — это то, из чего движок собирает партицию для своих нужд -
Поняла
-
Добрый вечер! Кто-то сталкивался с ошибкой в Clickhouse «DB::Exception: Size of filter doesn't match size of column.: While executing MergeTreeThread. (SIZES_OF_COLUMNS_DOESNT_MATCH) (version 21.12.4.1 (official build))»? В интернете не могу найти вменяемые ответы, в особенности как исправить
-
-
-
Ну в запросы, а так кликхаус MPP система
-
а какая версия КХ ? вообще это нормально, alter не смог наложить блокировку и отвалился через 2 минуты
-
Вот, например, запрос:
-
-
┌─explain─────────────────────────────────────────────────────────────────────────────────┐
│ CreatingSets (Create sets before main query execution) │
│ Expression (Projection) │
│ Limit (preliminary LIMIT (without OFFSET)) │
│ Sorting (Sorting for ORDER BY) │
│ Expression (Before ORDER BY) │
│ Aggregating │
│ Expression (Before GROUP BY) │
│ Filter (WHERE) │
│ SettingQuotaAndLimits (Set limits and quota after reading from storage) │
│ ReadFromMergeTree (db1.videos_categories) │
│ CreatingSet (Create set for subquery) │
│ Expression (Projection) │
│ Limit (preliminary LIMIT (without OFFSET)) │
│ Sorting (Sorting for ORDER BY) │
│ Expression (Before ORDER BY) │
│ Filter (WHERE) │
│ SettingQuotaAndLimits (Set limits and quota after reading from storage) │
│ ReadFromMergeTree (db1.site1) │
└─────────────────────────────────────────────────────────────────────────────────────────┘ -
-
-
-
для начала попробовать обновить до 22.3.4.20
-
парты (куски) физическое представление таблицы (директории на диске)
партиции логическое
вы создаете таблицу partition by toYYYYMM(D)
потом делаете
insert ... ( D.... ) values ( 2020-01-01 .... )
insert ... ( D.... ) values ( 2020-01-02 .... )
insert ... ( D.... ) values ( 2021-01-01 .... )
создается 3 парта, в двух партициях (toYYYYMM(D)).
парты (куски) сливаются /мержатся в бOльшие куски в рамках партиции
т.е. в какой-то момент два первых превратятся в один
станет два парта, по одному в партиции -
Denny, я ведь не могу никак повлиять на parts? Они же мержатся в своей логике. И как бы это просто для информации, или нет?
Если я, допустим, хочу какой-то кусок заменить. Я могу стереть партицию и внести ее заново. -
Можно detach делать партов и нужный кусок убирать
-
А ещё вот такой вопрос, когда таблицу с mergetree создаю из-под sqlalchemy, как в order by прописать tuple(). Может, кто-то делал?
-
Как это?
Кусок же нужно логически выделить. Чтобы потом его заменить на аналогичный, но новый.
А как по part понять, что в нем смержилось и чему он эквивалентен в источнике?
По партиции-то понятно. -
Парт сам по себе - атомичен и неизменяем. Он мерджится в другие парты. Пока не смерджился - можно удалять детачем. Виртуальная колонка _part вернет информацию о парте
-
Но когда он смержился, это же ведь уже другой парт?
-
order_by=func.tuple_() попробуйте
-
Спасибо!
-
Да, когда 2 парта смерджатся, то получится новый парт, а 2 старых удалятся
-
Подскажите, а в Tabix можно подключиться к кластеру Clickhouse, созданному в Yandex.Cloud? Постоянно ошибка подключения, хотя все данные по идее корректны
-
ага
-
на парты вы не должны хотеть влиять.
есть варианты, можно сделать replace партции -
Ну да я почитала, понятно.
-
А replace вобще много времени занимает?
Быстрее сделать replace партиции или удалить и заново insert? -
replace это операция для подмены партиции из другой таблицы, это немного не то что инсерт
-
Ну допустим мы положили в таблицу данные инсертом за год.
Прошел день, мы во вторую такую же таблицу положили изменившиеся с тех пор данные за последние три месяца инсертом.
Скажем, нашли партиции с расхождениями.
Что теперь быстрее?подменить партиции из первой таблицы партиция и из второй.
Или detach партиции из первой, сделать туда insert.
Интуитивно кажется, первый способ быстрее :)
Хотя понятно, пример может и надуманный. -
22.1.3.7
тогда вопрос по механике блокировки:
если, например, выполнить три запроса c alter, то они будут выполняться по очереди? И чем больше накидывается ALTER запросов, тем дольше ждать, пока все не будут выполнены? -
DDL locks are possible and should be resolved or documented as normal behavior · Issue #25273 · ClickHouse/ClickHouse
create table xx ( A DateTime, B Float64, C UInt8, D UInt8) Engine=MergeTree order by A; insert into xx select now(), 1/(number+1), 1, 1 from numbers(1000000000) ; alter table xx modify column B Flo...
-
👍
- 19 May 2022 (265 messages)
-
извините, но в ссылке которую вы прислали написано "кусок данных",
кусок данных это не партиция
partition это одно из полей этой таблицы
грубо говорят, партиции это префикс в имени парта и еще minmax индекс внутри парта по полям из PARTITION BY
чтобы при сканировании партов можно было ОЧЕНЬ БЫСТРО отбрость лишние -
Здравствуйте, мы возвращаемся с нашей проблемой утечки памяти. Мы подняли стейджинг с одной таблицей, которая подключена к кролику. Проблема действительно в ней. Если детачить, то память не освобождается. Обновились на 22.2 проблема остаётся. Куда копать?
-
22.3 ? и 22.4 пробовали?
-
22.3 lts все таки
-
А чего 22.2 ? есть 22.3 , 22.4, завтра 22.5 выйдет.
Какой формат данных? Json? На простой таблице и 2х полей тоже самое? Надо воспроизводить и писать в ишью в гитхабе шаги. Чем быстрее напишете, тем быстрее починят. Возможно что течет в какой-то конкретной конфигурации, например с какой-то версией кролика. -
нет, там прост ов 22.3 без обратной совместимости.
-
Формат данных Json, exchange type - topic, используем rabbitmq_queue_base,
RabbitMQ 3.7.14.
Возможно кролик и не виноват, у нас еще в бд есть внешние дикты. -
Здравствуйте, хочу сделать так:
create table tutorial.temp1 (arr Array(UInt32)) ENGINE = MergeTree() ORDER BY tuple();
INSERT INTO tutorial.temp VALUES (
select range(start_ticket_number, end_ticket_number) from tutorial.distributions);
Получаю это:
Code: 62. DB::Exception: Cannot parse expression of type Array(UInt32) here: select range(start_ticket_number, end_ticket_number) from tutorial.distributions): While executing ValuesBlockInputFormat. (SYNTAX_ERROR) (version 22.1.3.7 (official build))
Есть ли варианты исправить. -
INSERT INTO tutorial.temp VALUES (
select range(start_ticket_number, end_ticket_number) from tutorial.distributions);
тут VALUES( убрать нужно
а то бессмысленная фигня получается =)
SYNTAX ERRЩК yt ghjcnj nfr IMHO -
"Е мае" о вот это человек, вот это тебе огромное спасибище, вот это я тупил, еще раз СПАСИБО)
-
Не помогло, всё та же ошибка.
ZooKeeperClient: Code: 999. Coordination::Exception: Received error in heartbeat response: Connection loss (Run time inconsistency). (KEEPER_EXCEPTION) -
-
а как узнать размер primary index таблицы, который был загружен в оперативку?
-
Посчитать по system.parts можно
-
parts | ClickHouse Docs
system_tables-parts}
-
а точно, есть специальная колонка
-
Всем доброго дня, вопрос следующий: есть ли какие-либо бест-практис решения по организации полнотекствого поиска в clickhouse?
-
нет его в кликхаусе. можно только накостылить
-
Использовать что-то вроде iLike + LIMIT ?
-
Inverted Indices (RFC) · Issue #37216 · ClickHouse/ClickHouse
We already have "data skipping" indices in ClickHouse. Data skipping index is a data structure (aggregation, data sketch, etc) that is created for every data granule (or every n g...
-
это не полнотекстовый поиск, просто поиск по подстроке. если устраивает - то ок
-
Это пока единственное что подходит хоть как-то
-
На гитхабе есть пара форков с поддержкой lucene и Sphinx, afaik. Но это не мейнстрим со всеми вытекающими
-
Привет.
Используем clickhouse-backup с s3 в качестве стораджа.
Проблема такая, при ресторе, бекапер не дожидается пока скачается бекап и падает с timed out waiting for the condition через 5 минут.
В конфиг файле есть таймаут в секции clickhouse, а есть ли такой же в секции s3? -
лог покажите?
что такое "wating for the condition"
при ресторе -
-
@BloodJazMan {"level":"info","timestamp":"2022-05-19T10:12:38.426Z","msg":"action found: Command=download%!(EXTRA string= , string=20220518T144441_chi-cluster-replicated-0-0), Status=in progress, Error="}
{"level":"info","timestamp":"2022-05-19T10:12:38.426Z","msg":"action in progress, waiting..."}
{"level":"error","timestamp":"2022-05-19T10:12:38.426Z","msg":"can't perform restore","error":"timed out waiting for the condition"} -
потому что он data skip
а ваши IP тупо размазаны по всем system.parts
и при проверке просто ни один парт не может быть отброшен
проверьте через clickhouse-client
SET send_logs_level='trace';
SELECT ip FROM ips WHERE ip=... -
это какой то странный лог, clickhouse-backup логи в JSON не выдает
-
У меня есть обёртка над clickhouse-backup. Которая поллит backup/actions?last=1 и собирает в резалт файл.
В логах самого бекапера ничего особо интересного, там включен дебаг и видно, как в с3 уходят реквесты и приходят респонсы.
2022/05/19 10:46:42 info DEBUG: Request s3/GetObject Details:
---[ REQUEST POST-SIGN ]-----------------------------
GET /click-backups/20220518T144441_chi-cluster-replicated-0-0/shadow/mcdo_prom/samples_5m/default_1.tar HTTP/1.1
Host: minio-gateway-svc.platform-miniogw.svc.cluster.local:9000
User-Agent: aws-sdk-go/1.40.31 (go1.17.3; linux; amd64)
Authorization: AWS4-HMAC-SHA256 Credential=1kS9LL6OgDeBp5WlaapK/20220519/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=c611e576a6ded681aebee3df18f272e374b9dbff14362f2e85175c1a30f5ef33
X-Amz-Content-Sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
X-Amz-Date: 20220519T104642Z
Accept-Encoding: gzip
-----------------------------------------------------
2022/05/19 10:46:42 info DEBUG: Response s3/GetObject Details:
---[ RESPONSE ]--------------------------------------
HTTP/1.1 200 OK
Content-Length: 120462336
Accept-Ranges: bytes
Content-Security-Policy: block-all-mixed-content
Content-Type: application/x-tar
Date: Thu, 19 May 2022 10:46:42 GMT
Etag: "500e229f5b66c74168b092715b5618fe-8"
Last-Modified: Wed, 18 May 2022 15:00:22 GMT
Server: MinIO
Vary: Origin
X-Amz-Request-Id: 16F07BD15CA36E2D
X-Xss-Protection: 1; mode=block -
у вас S3 debug включен
а лучше бы вы его выключили
а включили в конфиге
general:
log_level: debug
и расшарили вместо логов поллера, именно лог stdout / stderr того что clickhouse-backup server выдает -
хорошо, спасибо. Моменто море
-
@BloodJazMan
вот что он пишет
default.ips (SelectExecutor): Key condition: unknown
default.ips (SelectExecutor): Selected 3/3 parts by partition key, 3 parts by primary key, 297/297 marks by primary key, 297 marks to read from 3 ranges
default.ips (SelectExecutor): Reading approx. 2416992 rows with 2 streams
при этом когда я делаю идекс ALTER TABLE ips ADD INDEX ip ip TYPE minmax GRANULARITY 2; он кажется срабатывает
default.ips (SelectExecutor): Key condition: unknown
default.ips (SelectExecutor): Index ip has dropped 138/150 granules.
default.ips (SelectExecutor): Selected 3/3 parts by partition key, 3 parts by primary key, 297/297 marks by primary key, 24 marks to read from 6 ranges
default.ips (SelectExecutor): Reading approx. 196608 rows with 2 streams -
Коллеги, приветствую.
Кто-то поднимал КХ под posthog? -
Cпасибо. Дело было не в бобине. Дело закрыто
У меня PollImmediate cваливался через 5 минут. -
ПХ хочет работать с кластером, настроил кластер по статье с ведущим инстансом + 4 инстанса под шарды (2 шарда/2 реплики в шарде)
Не проходят миграции. По статусу кластера - он собрался.
Пробую накатить через мастера таблицу, но на шардах она не создаётся.
Может кто направить на истинный путь? -
Смотрите доку по поводу create table … on
cluster
Зукипер настроили? -
Привет! Может кто-нибудь подсказать, как работает функция toStartOfInterval(date,INTERVAL 20 day), точнее от какого дня она начинает отсчитывать заданое количество дней (например, 20, как указано)
-
зависит от версии кх
-
а, нет, там только при интервале в час, зависит от версии
-
-
вроде бы весь диапазон от 1970-01-01 до нужной DateTime бьется по выбранному интервалу и выбирает последний перед нужной DateTime
-
Всем привет! прошу прощения за нубский вопрос
Подскажите, есть ли возможность вставлять в таблицу данные ИЗ json формата. Мне хочется что-то типо такого:
INSERT INTO my_table
SELECT
toFixedString(unhex(substring(address, 3, 66)), 20) as address,
data,
some_more_data
FROM [{address: " looong bla bla", data, some_more_data: "somedata"}, {address: " looong bla bla bla", data, some_more_data: "somedata2"} ] -
А при инсерте по http интерфейсу можно ли в ответ получить сколько строк заинсертилось?
-
зукипер поднят.
запрос
SELECT * FROM system.clusters LIMIT 2 FORMAT Vertical;
показывает, что шарды есть -
ух, вот этого и боялась((
спасибо! -
но я бы проверил, потому, что, например, тут в первом backward incompatible change было изменение для интервала по часам, может быть в какой то версии работает по другому2021 Changelog | ClickHouse Docs
ClickHouse release v21.12, 2021-12-15
-
конечно, но очень на правду похоже, т.к. разбиение на интервалы не от 01.01.22 и не от сегодняшнего дня
-
беру запрос на создание таблицы и развёрнутого в кубере инстанса.
Там всё работает и поднялось.
Пытаюсь продублировать снаружи, но опыта с кластером КХ нехватает. Конфигурится он конечно хреново. -
-
-
-
@BloodJazMan
Я ещё разок надоем. Крокодил не водится, не растет кокос...
Делаю download бекапа для соседнего пода кликхауса, чтобы сделать рестор толкьо схемы.
Но в ответ получаю вот что.
Направьте, куда ещё можно посмотреть.
Команда curl -XPOST
http://chi-cluster-replicated-0-1:7171/backup/download/20220518T144441_chi-cluster-replicated-0-1
Логи кликхаус-бекапера:
2022/05/19 14:20:32 debug api.status.inProgress -> len(status.commands)=0, inProgress=false
2022/05/19 14:20:32 debug api.status.Start -> status.commands[0] == {download%!(EXTRA string= , string=20220518T144441_chi-cluster-replicated-0-1) in progress 2022-05-19 14:20:32 }
2022/05/19 14:20:33 info SELECT value FROM system.build_options where name='VERSION_INTEGER'
2022/05/19 14:20:33 info SELECT * FROM system.disks;
2022/05/19 14:20:33 debug api.status.stop -> status.commands[0] == {download%!(EXTRA string= , string=20220518T144441_chi-cluster-replicated-0-1) error 2022-05-19 14:20:32 2022-05-19 14:20:33 unexpected end of JSON input}
2022/05/19 14:20:33 error Download error: unexpected end of JSON input -
Investing in cryptocurrency is one of the best way of earning when you do it with the right platform and with the right expert trader. I recommend Mr Freche to anyone who is interested in trading bitcoins. DM Him via link
https://t.me/joinchat/AwXYFkKXaaBmNGJk -
если есть вариант что хешированные а и б не влезут в память, то лучше второй, вот только вместо sum лучше anyIf(special value)
-
-
To join on Zoom: https://clickhouse.com/company/events/v22-5-release-webinar/
We will live stream to Clickhouse channel too: https://www.youtube.com/channel/UChtmrD-dsdpspr42P_PyRAw -
None
-
а почему не сделаете "будущую трансляцию"? что бы напоминалку можно было сделать и подписаться?
-
да
-
cc @blinkovivan )
-
регистрация предполагалась через сайт https://clickhouse.com/company/events/v22-5-release-webinar/
-
я про ютуб
-
-
-
удобная, но боюсь не проинтерированная в чудный мир бизнес-технологий… (и с Zoom кажись тоже)
-
окей, но я все время пропускаю начало из-за этого)
-
Я поискал в истории чата, вижу много раз уже обсуждали, но свой случай не нашёл.
В общем есть связка clickhouse + rabbitmq.
1. в docker-compose завёл два сервиса clickhouse и rabbitmq соответственно
2. создаю таблицу с движком rabbitmq и типом точки обмена direct
3. удаляю таблицу (или базу даже, не важно)
4. меняю тип точки обмена (или удаляю просто настройку, по умолчанию fanout становится)
5. создаю таблицу с новыми настройками
6. падает конекшн между clickhouse и rabbitmq и больше восстановить не получается.
Казалось бы можно откатиться к рабочему варианту и пересоздать ту таблицу которая работала, но фига с два, так как удалить таблицу уже не получается, базу тоже. -
-
-
/report
-
А так-то вообще веселее было когда путаны услуги предлагали, а не криптоинвесторы
-
А когда будет ?
-
-
-
ongoing
-
Эх, помним еще те времена, когда были релизы и митапы на русском.(Теперь понятно, что можно о них забыть). Но грустно наблюдать 38 зрителей сейчас. На русском помнится 1000+- было.
-
та нафиг на русском)
-
-
больше аудитории будет
-
ну для начала, они были не такими частыми...
-
-
Ну про память, что будет софт ограничение и хард ограничение можно выставить для пользователей (ну как я понял)
-
хз, мы так частно не обновляемся, чтобы каждый релиз смотреть, а вот раз в полгодика зайти на митап и получить классные обновления круто)
-
согласен
-
так и так же было )
max_memory_usage
max_memory_usage_for_user -
-
Ну выглядит это так
-
Вообщем, что добавят не хард ограничение
-
ну есть у нас 2 трешолда на юзера. один хард - один софт.
я не понял что происходит при пробитии софт -
/report
-
что такое "ведущий инстанс"?
чем он отличается от всех остальных?
нет такого понятия как "мастер" в clickhouse
запрос покажите SQL который запускаете? -
когда памяти будет не хватать запрос с самым больших оверкоммитом будет убит (получит ошибку)
-
ок, так бы и написали на слайде
-
-
-
download значит скачать на ноду
а не в клиент через curl получить
вы stdout / stderr
можете зайти на контейнер с clickhouse-server на поде /chi-cluster-replicated-0-1-0
и сделать
SELECT * FROM system.backup_actions ? -
версия clickhouse-backup какая?
-
а чего никто не спросил как КХ в облаке работает? ему не нужен шардинг и решардинг.
-
ты про clickhouse cloud serverless? ;)
-
эм, даже не знаю какой ответ ты ожидаешь. Ну давай: нет, я про bigquery спрашиваю.
-
так все, "secret-sauce"
-
-
я думаю там просто полностью отделен компьют от стораджа
-
s3 cache еще сильно экспериментальный + копирования лишние есть в s3 клиенте, разница с локальными дисками может быть заметной
-
да, у нас такие же мысли когда будет поддержка EFS (было обещано пару месяцев назад)
а то щас есть сетапы где NFS по три раза данные хранит
ну и по три раза мерджит -
просто нужно в кавычках писать =) в этом случае
-
и что? у них там не 100500 тысяч клиентов с мишин критикал, можно прям на ходу на котиках тренироваться
-
а может там как раз уже тот самый NFS на нереплицированных данных и везде запрещенные внутренниви флажгами мерджи проме одного с периодическим детач-атач на нодах.
-
-
так это не решает проблему решардинга и самого наличия шардов
-
Может там вместо решардинга и шардов просто реплики и просто используются parallel_replicas
-
и память резиновая?
-
тогда гиганская system.parts и проблема с анализом запросов
-
Ну, приват бета, так что есть ограничения.
-
Да, но с точки зрения реализации это можно хоть прям щас сделать. А для честных шардов нужны cloud tables делать (впрочем может за год и могли их сделать).
-
я не делал, но думал что либо вирт папки с линками на стороне сервера, либо пермишны на стороне НФС... но мне стало страшно уже на стадии репликации. это можно поддерживать если это клауд.
на много он-прем энтерпрайзах можно и с ума сойти -
из parallel_replicas issue
This task will also help to implement distributed processing over shared storage.
In most simple case, multiple computation nodes over shared storage can look as replicas, and we split data processing over them.
Плюс дней 5 назад решили починить их для случая использования локальной реплики. -
Посоветуйте пожалуйста схему для таблицы, в которую будут писаться span-ы OpenTelemetry
Если я сделаю партицию на каждый час, то сильно больно будет?
Проблема в том, что хочется искать по trace_id, а он генерируется случайно.
Тут два варианта вижу: либо заставить trace_id генерировать так, чтобы он рос со временем (типа UUIDv6) и делать его ключом сортировки, либо делать маленькие партиции и индекс по trace_id (но с другим ключом сортировки) -
можно и так отсортировать
-
в чем проблема отсортировать по trace_id?
-
оно не будет постоянно в фоне пересортировывать?
слышал что сортировать по рандому не оптимально -
множественные партиции == очень медленные селекты за большой период.
-
вы неправильно услышали, и вообще нет пересортировок
-
А вы смотрели на примеры схем которые уже есть?
https://github.com/jaegertracing/jaeger-clickhouseGitHub - jaegertracing/jaeger-clickhouse: Jaeger ClickHouse storage plugin implementationJaeger ClickHouse storage plugin implementation. Contribute to jaegertracing/jaeger-clickhouse development by creating an account on GitHub.
-
у вас похожие данные будут рядом потому что они один traceid
-
traceid связывает кучу трейсов (это корень дерева) или это span делает и я путаю?
-
правильно
-
смотрел, ещё у uptrace смотрел
смущает что выбраны разные подходы -
ORDER BY (service, -toUnixTimestamp(timestamp)) -- они хотят конец моментально показывать, поэтому делают так
-
я бы попробовал наш обычный хак
order by (toStartOfHour(timestamp), traceid)
зависит конечно от того сколько времени хранить собираемся -
подскажите, пожалуйста, где про это почитать/посмотреть
ну или хотя бы ключевые слова для поиска
хочу разобраться (наверное я пересортировку спутал с мержем партов) -
при инсерте записи сортируются в памяти, пишутся на диск, мержи просто идут по отсортированным наборам и делают сюрприз мерж
-
есть первичный индекс, но он разрежен и хранит только каждую n-ю запись (8192)
-
а ну кстати у них тоже https://github.com/jaegertracing/jaeger-clickhouse/blob/main/sqlscripts/jaeger-index.tmpl.sql
PARTITION BY (
{{if .Multitenant -}}
tenant,
{{- end -}}
toDate(timestamp)
)
ORDER BY traceID
SETTINGS index_granularity = 1024 -
-
зря они конечно делают SETTINGS index_granularity = 1024 , только память тратят.
-
Вот только про это хотел спросить
-
тут правда все зависит от того сколько записей хранить. Может эти хранят 10 дней и им ОК.
-
-
Ребята а подскажите пожалуйста, что может быть не так у нас MV вставляет из кафка таблицы в ReplicatedMergeTree из которой на вставку должна забирать другая MV и вставлять в агрегированную таблицу, так вот почему-то эта вторая MV как будто не тригерится ? :disappointed:
-
эти еще интереснее SETTINGS index_granularity = 128
расход памяти на индекс можно посчитать примерно, миллиард записей - traceid = 16 байт, миллиард / index_granularity = 1024 -> миллион, * 16 = 16 мегабайт
миллиард записей - traceid = 16 байт+id 8 байт, миллиард / index_granularity = 128 * (16+8) = 1000000000/128 * (16+8) = 187 мегабайт -
Привет всем!
Переезжаем на новые сервера в связи с чем встал вопрос в сравнении эффективности выполнения запросов. Подскажите, пожалуйста, как можно это измерить?
Пока в голове только 1 вариант, запустить один и тот же запрос на разных серверах и засечь время выполнения, но может есть какие-то еще варианты?
Как я понимаю, функция explain в clickhouse для этого не очень подходит -
-
спасибо 🙏
-
Как-то упоминалось, что операции над полем партиционирования не влияют на фильтрацию.
но для полей в order by это не верно, так? т.е. если сделать, например, фильтр по lower(field) вместо исходного значения, то то, что field указан в order by уже не будет иметь значения -
Индекс используется если функции монотонные. Lower не вроде не монотонная из за турецкого языка, хотя я не знаю точно.
-
-
-
Да. Наверное нет
-
Открытый вопрос, использовать CH для замены mysql где все таблицы replacingMergeTree изза частых апдейтов, здоровая идея?
-
Ноу
-
куда смотреть? Нужны частые апдейты, но и аналитика нужна, и записей не оч много - 4-5 миллионов на самых больших таблицах.
-
Тут надо пояснить, что такое частые и для чего вы используете КХ
-
Потому что смысл как-раз таки может быть.