- 01 December 2022 (238 messages)
-
Подозреваю, мог накосячить в рамках неоднократной вложенности arrayMap и передать вместо одномерного массива двумерный. Тогда ошибка логично звучит от CH
-
22.9.x, запросы медленнее не стали и кол-во запросов не изменилось
-
Всем привет!
Коллеги, подскажите в каком направлении копать.
Есть таблица, которую нужно перенести в другую базу на том же сервере Clickhouse.
В свойствах исходной таблицы нет никаких кодеков и запрос вида
select total_bytes / total_rows as bytes_per_row from system.tables where name = 'unique_table_name'
выдаёт bytes_per_row примерно 52 байта.
Если просто взять DDL от таблицы, поменять в нём имя базы данных и начать копировать данные запросом insert into ... select from,
то на принимающей стороне показатель bytes_per_row сразу становится около 107 и далее только растёт.
Если же применить ко всем полям принимающей таблицы кодек ZSTD(3), то показатель bytes_per_row падает до 60-64 байт,
но это всё равно больше чем было.
Вопрос - как в исходной таблице добились такой компактности и как это повторить в новой базе? -
База, это что ? Кликхаус или в кликхаусе база данных ?
-
внутри одного сервера разные базы
-
Дак сделайте просто RENAME таблицы и таблица перенесется
-
Moving tables between databases is not supported for Replicated engine
Поэтому двигаем "вручную" -
А если сделать OPTIMIZE FINAL ?
-
Показатель bytes_per_row чуть-чуть ухудшается, так как total_bytes вырастает на 1-3%
до оптимизации
total_bytes|total_rows|bytes_per_row |
3064084651| 28995308|105.67518893056766
после
total_bytes|total_rows|bytes_per_row |
3107667403| 28995308| 107.1782856384902|
Что характерно, для всех остальных таблиц такого эффекта не наблюдается - либо переносятся 1 к 1, либо ужимаются кодеками,
а одна таблица сопротивляется :) -
смотрите глубже - какие есть парты в старой и новой табличке и сколько они занимают и какие типы имеют. Еще можно глянуть поколоночно какие колонки нормально сжимаются а какие нет и копать в эту сторону
-
скопировал целиком одну месячную партицию - разглядываю парты из system.parts,
и там и там по 3 штуки,
данных на принимающей стороне в 2.5 раза меньше - похоже "съел" ReplacingMergeTree-движок,
все числовые параметры плюс-минус совпадают (с коэффициентом 2.5),
единственное что бросается в глаза, то что на источнике у двух партов default_compression_codec равен ZSTD(3), а у третьего - LZ4,
а на приёмнике обратная ситуация - у двух партов кодек LZ4, а у третьего - ZSTD(3)
пошёл смотреть по отдельным столбцам -
подскажите, а есть coalesce только в отношении пустых строк?
что-то такое:
strCoalesce('', 'er', 'ererf') -> 'er' -
if(empty(''), 'er', 'ererf')
-
arrayFirst(x -> NOT isEmpty(x), ['', 'er', 'ererf'])
-
спасибо, я как раз такое хотел оптимизировать-свернуть в красивую функцию =)
-
спасибо
-
какой конкретно select?
всякие там Engine=MySQL, Engine=PostgteSQL базы есть? -
Ребят нпомните ссылку пожалуйста на статью про потимизацию клика?
там были указания как проверить разнаго рода нагрузки на клик.
примеры зпросов и утилит (кажется)
Прям очень надо -
всем привет
подскажите плз, вот я точно где-то видел тему что есть какой-то тип таблицы в которую данные пишутся на 1 чтение, ну типа прочитал и данных нет -
Всем привет!
Интересует такой момент - есть таблица фактов, она огромная и шардированная.
Ещё есть частообновляемое поле, которое для возможности "джоина" этого поля хотим хранить словарём.
Но словарь тоже большой. Вопрос - как хранится такой словарь? Должен ли он также быть распределённым, если он распределён между хостами, то как происходит это хранение (умножение полного объёма на количество нод или же хранится кусками)?
Итоговая цель - уменьшить общую потребляемую оперативную память.
Если есть что-то полезное почитать на эту тему - буду благодарен. -
не могу в документации найти, можно ли убрать привилегию на alter table drop PARTITION?
-
Помогите пожалуйста разобраться с памятью для запросов. Есть max_memory_usage. Пишут, что он ограничивает память используемую для выполнения запроса. Но нигде не написано, что входит в эту память. Есть max_bytes_before_external_group_by которым можно ограничить память используемуею для группировки. Есть join_algorithm = 'auto'. Если сложный запрос с несколькими join можно что-то заставитю кроме сортировок и группировок делать через диск?
-
можете поиграться с типом алгоритма
https://clickhouse.com/docs/en/operations/settings/settings/#settings-join_algorithm
+
уменьшить max_bytes_before_external_order_by
уменьшить max_threads -
судя по всему такого гранта нет
SHOW CREATE TABLE system.grants;
https://fiddle.clickhouse.com/a982efad-aec9-443a-a11d-142c668924fa
не показывает ничего на DROP PARTITION ... -
Привет. Вопрос не совсем по КХ, но по altinity-плагину для Grafana. В запросе в КХ есть использование макросов $from и $to. В самом запросе оно работает, проблем нет.
Но также настроен алерт (legacy alerting), для алерта указана конструкция query(A, 30m, now), то есть, по идее, при проверке алерта запрос должен генериться не на основе выбранного в UI time range, а на основе (now-30m) и now - но на практике (используя Test Rule) я вижу, что нет, используется всё равно time range из UI. Возможно, кто-то сталкивался, и подскажет - это "норма", или мб я где-то туплю? -
какая версия clickhouse-grafana?
обновитесь до последней -
2.5.3, последняя и есть
Grafana 9.3.0, тоже свежая (на предыдущей 9.2.6 поведение было идентичным). -
в test rule если time range now и now-1h
будет now
в реальности без test rule оно пересчитывается нормально на golang части плагина -
> в test rule если time range now и now-1h .. будет now
Не уверен, что правильно понял. В моём случае, например, у меня в UI выбрано "last 7 days", а в алерте указано query (A, 30m, now)
И, в итоге, когда делаешь Test Rule - видно по JSONу, что "общие" from и to графана генерит корректные (таймстемпы для "сейчас" и для "30 минут назад"), но, раскрывая далее детали генерируемого запроса - видно, что упоминаемые в "query" макросы $from и $to в итоговой "rawQuery" превращаются в другие таймстемпы: "сейчас" и "7 дней назад".
> в реальности без test rule оно пересчитывается нормально на golang части плагина
Вы имеете в виду, что функционал "Test Rule" не совсем правдив в данном случае, и на практике плагин будет использовать корректные таймстампы?
Я начал копаться в этом потому, что у меня алерт выпал в "pending" тогда, когда должен был быть "ok" - потому у меня есть некоторые сомнения. -
а попробуйте $__from и $__to
возможно что-то поменялось в grafana и косяк вообще не в плагине -
Вот интересно, а PK который и так все время в памяти включается в эту калькуляцию или нет? Не понятен момент, как КХ в самом начале выполнения запроса вылетает по memory_limit
-
Вы имеете в виду $__fromTime и $__toTime , упомянутые тут https://grafana.com/grafana/plugins/grafana-clickhouse-datasource/ в разделе Macros, верно? Или есть и просто $__from ?ClickHouse plugin for Grafana | Grafana Labs
ClickHouse datasource plugin for Grafana
-
так стоп,
https://grafana.com/grafana/plugins/grafana-clickhouse-datasource/
это точно не altinty pluginClickHouse plugin for Grafana | Grafana LabsClickHouse datasource plugin for Grafana
-
Всё порядке, у меня установлен точно altinity плагин (скрин), то я просто почему-то думал, что https://grafana.com/grafana/plugins/grafana-clickhouse-datasource/ это страница Altinity плагина. Теперь у меня наконец-то в голове сошлось, почему у меня внутри самой графаны один набор макросов, а на той странице какой-то совсем другой :D Извините. Сейчас попробую предложенные вами макросы, отпишусь.ClickHouse plugin for Grafana | Grafana Labs
ClickHouse datasource plugin for Grafana
-
-
этот плагин от grafana labs
можете его тоже пробовать ... сравнивать что для вас удобнее -
Приветствую всех! В активном поиске помощника. Работа удалённо, оклад хороший, нужно вести кабинет в тг боте,
пишите в личные сообщения, без опыта если всему обучу и расскажу покажу -
/report
-
Насколько я могу судить, $__from и $__to не помогли.
Перед этим было: https://gist.github.com/alexandrpaliy/18bb4737ad80bf665334866b751cc380
10: "from": 1669882073497,
47: "to": 1669883873497
но
31: "query": "SELECT\n t,\n ... blablablabla ... FROM $table AS t1\nWHERE t1.time >= $from AND t1.time < $to\nGROUP BY t\nORDER BY t)\nORDER BY t\n",
32: "rawQuery": "SELECT\n t,\n ... blablablabla ... FROM xxx.yyy AS t1\nWHERE t1.time >= 1669872600 AND t1.time < 1669883400\nGROUP BY t\nORDER BY t)\nORDER BY t",
from должен быть 1669882073497 , но в запросе получился 1669872600
Используя $__from и $__to: https://gist.github.com/alexandrpaliy/6d90751193296c593a7fa4e8cd36029f
10: "from": 1669886030037,
47: "to": 1669887830037
но
31: "query": "SELECT\n t,\n ... blablablabla ... FROM $table AS t1\nWHERE t1.time >= toDateTime($__from / 1000) AND t1.time < toDateTime($__to / 1000)\nGROUP BY t\nORDER BY t)\nORDER BY t\n",
32: "rawQuery": "SELECT\n t,\n ... blablablabla ... FROM xxx.yyy AS t1\nWHERE t1.time >= toDateTime(1667295815561 / 1000) AND t1.time < toDateTime(1669887815561 / 1000)\nGROUP BY t\nORDER BY t)\nORDER BY t",
from должен быть 1669886030037, но в запросе получился 1667295815561gist:18bb4737ad80bf665334866b751cc380GitHub Gist: instantly share code, notes, and snippets.
-
В общем, попробую проверить гипотезу, что это действительно проблема только при "Test Rule", и на практике алерт прилетать не будет.
Спасибо за внимание) -
включите дебаг лог на графане
либо через переменную
https://github.com/Altinity/clickhouse-grafana/blob/master/docker-compose.yaml#L59
либо через конфиг
https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#log
from \ to должны браться из json данных которые вы передаете по идееclickhouse-grafana/docker-compose.yaml at master · Altinity/clickhouse-grafanaClickhouse datasource for grafana. Contribute to Altinity/clickhouse-grafana development by creating an account on GitHub.
-
-
мы его не используем. у нас нет distributed или replecated таблиц. Еще куда можно глянуть подскажите?
-
спасибо, попробую. но переживаю, что потом не найду ничего в том логе, панелек/алертов достаточно много :)
-
ну там grep vertamedia сделать можно
-
👌
-
о я нашел, такое поведение в таблице с движком rabbit, а есть возможность создать таблицу с таким же поведением только без подключения к ребиту ?
-
Привет. Скажите, пожалуйста, насчет нормализации данных. Хочу добавить source столбец ко всей таблице. source – по смыслу источник данных, строка, например, source = “metrika”.
Есть ли смысл создавать 2 таблицы для нормализации, типа sources, где хранится строка и ID, и таблицу связи? Сейчас source вообще один для всех миллиардов записей, и максимум source’ов будет до 10. Что-то такое помню, что clickhouse не очень хорошо работает с join -
Погрепал чат, везде ранее рекомендовали жертвовать нормализацией и хранить как строки, типа повторы будут оптимизированы. Тогда так и сделаю, наверное
-
это называется exactly once семантика
engine=Rabbit engine=Kafka - работает в связке с Materialized View
но для engine=Kafka сделать exactly once нельзя
и нужен всегда внешний источник... -
нет такого движка
вы наверное перепутали engine=Buffer которая флашит периодически? -
нет храните тупо как LowCardinality(string)
-
https://clickhouse.com/docs/ru/engines/table-engines/integrations/rabbitmq
Описание
Запрос SELECT не очень полезен для чтения сообщений (за исключением отладки), поскольку каждое сообщение может быть прочитано только один раз.
он же явно использует какой-то стандартный движок для реализации такого поведенияRabbitMQ | ClickHouse Docsrabbitmq-engine}
-
причем я как-то давно работал с движком rabbiMQ он был очень не проработан и мы отказались от этого ... но я запомнил что он давал прочитать данные только 1 раз
-
окей, спасибо!
-
нет
-
Всем привет
Клик начал выдавать такое:
SELECT * FROM landings.client_clicks order by date desc limit 10
SQL Error [159]: ClickHouse exception, code: 159, host: 127.0.0.1, port: 8123; Read timed out
Куда копать?
Спасибо -
Привет! Можете помочь с запросом? Дано: на сервере база, 4 таблицы, и на локальном компе такая же база. Серверная пополняется, локальную надо периодически синхронизировать. Нужен селект который соберет все из серверной базы, чего еще нет в локальной. У меня какие-то многоэтажные конструкции строятся, а ведь наверняка это как-то просто решается... Записи индексируются по полю time_id, на каждый time_id по многу строк на сервере добавляются во все 4 таблицы
-
-
почитайте про snowflake id
генерируйте в приложении при вставке на серверную базу
а дальше просто INSERT INTO local_table FROM remote('server:9000', remote_table) WHERE snowflake_id>( SELECT max(snowflake_id) FROM local_table) -
-
А в логах такое:
DB::Exception: Too many parts (100000) in all partitions in total. This indicates wrong choice of partition key. The threshold can be modified with 'max_parts_in_total' setting in <merge_tree> element in config.xml or with per-table setting. -
В итоге, как оказалось, если использовать $from и $to - то туда подставляются какие-то вообще неведомые мне значения. При том, что в alert query постоянно было указано query(A, 30m, now), мне на одном дашборде туда прилетало now-3h и now-20m, на другом - нечто типа now-24h и now-1h.
Когда заменил ручную конструкцию с $from и $to на $timeFilter - заработало как часики.
Имеет смысл репортить на гитхаб? -
копать в ddl таблицы, смотреть, что это там за партиционирование такое
сделать новую нормальную таблицу, перелить данные туда -
Привет всем!
Подскажите как я могу отключить данный лог?
session_log -
-
А как посмотреть ddl?
<ele ,kfujlfhty -
show create table, либо в system.tables
-
CREATE TABLE landings.client_clicks
date DateTime('Europe/Paris),
host String,
click_id String
)
ENGINE = MergeTree()
PARTITION BY click_id
ORDER BY date
SETTINGS index_granularity = 8192
Вот так вот она создана -
да, зарепотите пожалуйста...
если в аттач сразу .json с дашбордом сделаете . вообще хорошо будет -
убирайте PARTITION BY click_id
-
меняйте на PARTITION BY toYYYYMM(date)
-
Спасибо, буду пробовать
-
Привет! Подскажите, пожалуйста, такое) Хочу попробовать семплирование. Как правильно записать выражение для SAMPLE, если ORDER BY timestamp -- тип поля DateTime?
-
Подскажите, может кто помнит, у CH есть возможность исполнения пользовательских функций из файлов на сервере, написанных на питоне ? Я где-то кажется видел это, но перерыл всю документацию, не могу найти сейчас. Стандартные функции не подохдят, нужно один алгоритм на сторону сервера закинуть. n-граммное сравнение строк, увы, не всегда спасает, на локальной машине все же лучше с моей задачей сравнения строк справлялся алгоритма рассчета расстояния Левенштейна, хочу перенести на сторону базы.
-
благодарю!
-
у вас есть какой то user_id или еще какой то высокардинальное поле которое равномерно по всем партам разбросано?
-
не файлов а функций...
https://clickhouse.com/docs/en/sql-reference/functions/#executable-user-defined-functionsFunctions | ClickHouse DocsThere are at least\* two types of functions - regular functions (they are just called “functions”) and aggregate functions. These are completely different concepts. Regular functions work as if they are applied to each row separately (for each row, the result of the function does not depend on the other rows). Aggregate functions accumulate a set of values from various rows (i.e. they depend on the entire set of rows).
-
Вот, то что и искал. Благодарю )
-
есть, вроде) uid и sessionId, но они не числовые. Нужно числовое использовать же?
-
А мне определенно начинает нравиться кликхаус, хотя заставить комфортно работать с шарпами чутка попотел, потому что имеющиеся либы, мягко говоря, оставляют желать лучшего.
-
не обязательно
можно
SAMPLE BY int32Hash(sessionid) -
напишите свою
-
спасибо!
-
у вас сколько записей в таблице?
-
кстати, а почему нельзя по click_id ?
-
да пока нисколько, но будет много, миллионы) это метрики с умных устройств
-
Пока для клика сделал костыль в виде маппера объектов данных для их вставки к либе DarkWanderer/ClickHouse.Client. ORM-решения слабоватые и багованные. Потом может займусь в свободное время. Пока тарантул дружил с шарпами, лучший из вариантов найденных либ пришлось почти на половину переписать, даже сериализацию - банально не было поддержки UUID.
-
потому что таблица работать перестанет очень быстро с too many parts ошибкой
у вас миллионы записей с одним и тем же click_id?
PARTITION BY сильно_уникальное_значнеие
это куча каталогов на диске с мелкими файлами... которые не мержатся между собой
как вставка так и select очень быстро умрут..
https://kb.altinity.com/engines/mergetree-table-engine-family/pick-keys/How to pick an ORDER BY / PRIMARY KEY / PARTITION BY for the MergeTree-family tableHow to pick an ORDER BY / PRIMARY KEY / PARTITION BY for the MergeTree table.
-
Да, click_id не уникален.
-
привет, подскажите, пожалуйста есть ли аналог filter (where …) из postgres в clickhouse?
-
Всем привет. Возникла проблем с чтением авро схемы через kafka engine. Имеется авро схема следующего формата
'a': 'test',
'b': 'test',
'c': {
'd': 2,
'e': true,
'f': 'test'
}
и возникла проблема, как описать ключ
c
. Думал сделать через Map, но есть проблема, тип у values может быть разный. И описать все вложенные поля тоже не получается, потому что неизвестно сколько их придёт. Есть ли какие нибудь варианты, как это можно решить? -
Добрый день, подскажите пожалуйста, есть база ХХХ atomic, переименовать ее в YYY, запрос не выполняется, в чем может быть причина?
-
Если бы это работало как индексы в привычных SQL, где древовидно раскладывается ключ, то может быть. Но если это предположительно рандомные гуиды, то получится партиционирование по файлу на значение. В этом случае не просто теряется смысл этого партиционирования, но как и указали выше, всему есть предел, потому что идет слишком сильная фрагментация данных и банально начинает влиять работа с файлом разметки через ОС, равно как и раздувается явно идентичное хранилище в самой базе. Так что даже не достигая этого предела самой базы, начнет экспоненциально падать скорость работы по достижению энного числа партиций. Операции чтения/записи файлов, открытие соответствующего потока - это одни из самых ресурсозатратных процедур при работе с низкоуровневыми API системы. Хуже навскидку могу сказать лишь выделение потока процессора.
Не тому ответил изначально. -
Всех приветствую. Кому интересен ЛЕГАЛЬНЫЙ зарабаток - отпишите мне в лс. Расскажу , всё объясню. В день 200 баксов можно делать не выходя из дома.
-
Парсер в DataGrip старый и не знает такой команды, пишите через clickhouse-client
-
tojsonstring?
-
Подскажите, пожалуйста, а когда я создаю materialized view над ReplicatedMergeTree таблицей, у MV тоже должен быть replicated движок или обычный?
-
Версия 2022.2.5 с драйвером 0.3.2.11 работает нормально, чисто линтер голову дурит.
-
1. шардируйте вашу таблицу по некому достаточно кардинальному полю, всякие user_id обычно неплохо подходят.
Словарь тоже шардируйте.
Если он жирный то посмотрите в сторону sparse_hashed (в 3 раза меньше, в 3 раза медленее)
Если все еще жирный, то посмотрите в сторону cache словарей.
Возможно имеет смысл материализовать данную колонку для старых данных, которые маловероятно что обновятся -
А, ну мб поправили.
Но вообще если из странной ошибки датагрип не может выполнить запрос, то зачастую это проблема в парсере самом датагрипе, и можно выполнить через clickhouse клиент -
Если вставка и/или чтение делаются не всегда через одну и ту же реплику с не реплицированным MT, то да
-
Тоже Replicated
Смотрите вебинар
https://kb.altinity.com/altinity-kb-schema-design/materialized-views/#materialized-views -
У меня линтер тоже подсвечивает, что TABLE expected, got 'database' и слово database подчеркнуто красным, но при этом все работает )
-
Мне при инсерте нужно
-
Понял, спасибо большое !
-
Всех приветствую. Кому интересен ЛЕГАЛЬНЫЙ зарабаток - отпишите мне в лс. Расскажу , всё объясню. В день 200 баксов можно делать не выходя из дома.
-
Всех приветствую. Кому интересен ЛЕГАЛЬНЫЙ зарабаток - отпишите мне в лс. Расскажу , всё объясню. В день 200 баксов можно делать не выходя из дома.
-
/report
-
о неет
-
за чтооо
-
Может он разработчик
-
))
-
-
В query_log в profile_events
-
не могу понять что это и где. в квери логе такой колонки нет. это другая таблица? такой нет у нас. её нужно включить?
-
вот тут пример
https://kb.altinity.com/altinity-kb-useful-queries/query_log/Handy queries for a system.query_logHandy queries for a system.query_log.
-
Всем привет, подскажи могу ли я как то сделать partition by по колонке которую агрегирую с помощью движка AggregatingMergeTree в materialized view.
-
Не можете. Будут разные партиции - не будет агрегации
-
$from and $to macros use UI time range in alert queries · Issue #458 · Altinity/clickhouse-grafana
Latest grafana 9.3.0 with legacy alerting. According to https://grafana.com/grafana/plugins/vertamedia-clickhouse-datasource/, "Macros support": $from - replaced with (timestamp w...
-
Спасибо большое, какой то альтернативны я так понял тут нет?
-
Семплирование это очень сложная штука и она полезна только очень большим ребятам типа яндекса, уверен в этом чатике ни у кого нет семплирования. И мало кто понимает как оно на самом деле работает -- без понимания им пользваться нельзя. https://kb.altinity.com/altinity-kb-queries-and-syntax/sampling-example/ https://kb.altinity.com/altinity-kb-queries-and-syntax/altinity-kb-sample-by/Sampling Example
Clickhouse table sampling example
-
ну мы типа яндекса)
-
спасибо!
-
почитаю
-
планируете 600 серверов и 10 тыс. пользователей?
-
нет 🙂 а что под пользователями-то понимается?
-
Тенанты
-
В этом чатике есть люди едва ли не из всех крупнейших IT компаний РФ.
-
Нет. Надо делать иначе. Зачем вам партиции?
-
Поиск будет по этой колонке, так как агрегирую дату
-
ой да бросьте
-
А чего? Алексей прав
-
-
Ну не надо вам этого
-
А почему такое не сделать просто с полем time_id? Типа WHERE time_id>( SELECT max(time_id) FROM local_table) ?
-
-
-
в закреп, а то потеряется
-
Просто получается что дата не в индексе и не партицирована , на скорости это не скажется?
-
Хочется и рыбку съесть и ... с агрегацией
-
-
байты
-
-
Всем привет, ребята.
Короткий вопрос - можно ли как-то MV скопировать вместе с данными ? -
MV не хранит данные. Она получает копию вставляемых данных в отслеживаемую таблицу, что-то с ними делает и кладёт результат в целевую таблицу. Всё.
-
Это раньше так было с явным TO, нынче целевая таблица может быть создана вместе с MV и спрятана за его фасадом. Не знаю, зачем сделали такое "удобство", если из-за него люди перестают понимать, что такое MV.
-
потому что вероятность повторяния time_id не нулевая. ну разве что вы там DateTime64 для этого будете держать...
-
раньше? в 2015 ?
-
Вроде и раньше был вариант без TO, тогда создавалась таблица .innerчё-тотам и результат клался в неё. Т.е. механика была такой же.
-
Ну я точно не вспомню уже когда.
-
Пишите issue на их youtrack, если не писать, то ничего не сделают
-
Конструкции If, то есть countIf(col=5)
-
А можно ли выполнить PARTITION BY по агрегируемому столбцу в AggregatingMergeTree? То есть так: PARTITION BY toStartOfMonth(minMerge(timestamp)) ?
Сейчас кидает ошибку minMerge(timestamp) is found in wrong place -
не можно. Будут разные партиции - не будет агрегации
-
То есть в случае AggregatingMergeTree вообще не нужно использовать partition by?
-
это зависит, иногда обязательно иногда наоборот
-
Вы не правильные вопросы задаёте
-
хм. А как понять, когда обязательно? В доке не наблюдаю данную информацию :(
-
Я делаю эксперименты. Много.
-
и не только рф:)
-
Ну а можно где-то об этом почитать подробнее?
Честно говоря, даже не знаю, какие тут могут быть подводные камни. Может если количество данных у меня суммарное в агрегированной таблице ~ 1 млн, то и партиции не нужны.
То есть агрегация не может схлопнуть несколько строк, если они лежат в разных партициях, я правильно понимаю из вашего прошлого сообщения? -
(*) Я не использую семплирование, но буду :)
Вряд ли такое, конечно... Надо всего лишь из продакшена правильно выбирать данные для стейжинга. -
Это переупоощение. Но да
-
Понятно, спасибо большое за ответы. Буду пытаться еще гуглить и экспериментировать
-
Спрашивайте тут с конкретными примерами. Тут в чатике есть все ответы. Все вопросы уже задавали. Я помню как найти ответы. Поэтому не проблема
-
Именно так, поэтому не повторяются
-
Да, для разовых копирований такое работает. Для непрерывного нет.
-
Понял, попробую, спасибо
-
-
так
-
-
Привет, ребята, позвольте уточнить пару деталей относительно индексов:
- за счет того, что primary key строится поблочно и для каждой колонки есть свои .mrk файлы, то порядок колонки при создании индекса имеет уже куда меньшее значение при поиске данных нежели к примеру в ситуациях с btree? Скажем, если я произведу поиск по колонке, которая находится на втором месте в индексе, я не замечу таких же потерь в скорости, как в btree?
- приводят ли к значительным ускорениям skip индексы, накладываемые на колонки входящие в primary key? Сейчас у нас есть таблица, которая занимает уже более 6 терабайт и primary key, который на 100 млрд записей давал ответы за миллисекунды, сейчас выдает ответы по ~15 секунд -
- порядок колонки вообще никак не влияет, и дело не в .mrk и primari.idx
дело в том что это data skip индекс, то есть он не ищет где ваши данные, а применяется при фильтрации и структуры индекса просто говорят "искомых данных тут нет" поэтому блок можно пропустить...
кроме того, в btree тоже с чего бы порядку в таблице влиять на что-то, в btree кардинальность влияет и селективность
- не надо делать data skip для pimary key полей, primary.idx ИТАК ВЕСЬ в памяти
> Сейчас у нас есть таблица, которая занимает уже более 6 терабайт и primary key, который на 100 млрд записей давал ответы за миллисекунды, сейчас выдает ответы по ~15 секунд
а что вы сделали то для этого? Таблицу поменяли как то ? запросы как то поменяли что выборка стала по другому работать? -
влияет примерно также как в btree.
при поиске по колонке которая далеко от leading position вы находите запись в индексе и прыгаете в таблицу, и чем дальше записи (меньше локализация) тем больше ranges надо прочитать из таблицы, тем медленнее запрос, в итоге для высококардинальных колонок которые в индексе позади другой высокардинальной колонки надо прочитать все засечки, всю таблицу.
Представьте себе таблицу ORDER BY (A , B )
A и B просто два рандома Int64
В индексе будет
1 1
8192 1
16384 1
....
т.е. для B=45645654 надо прочитать все ренджи (все засечки) -
> Сейчас у нас есть таблица, которая занимает уже более 6 терабайт и primary key, который на 100 млрд записей давал ответы за миллисекунды, сейчас выдает ответы по ~15 секунд
скорее всего причина в другом, либо загрузка марков в кеш, либо много партиций сканируется и теряется скорость на random i/o и на загрузке марков -
Спасибо за ответ.
» а что вы сделали то для этого? Таблицу поменяли как то ? запросы как то поменяли что выборка стала по другому работать?
Ничего, объемы данных выросли с ~10млрд до ~500млрд записей в таблице
UPD -
Понял Вас, благодарен за ответ.
-
а я не до конца понял вопрос
да порядок полей в primary key чрезвычайно важен -
ну и чаще всего проблема решаема в частном случае, либо MV, либо проекция, либо bloom
почему в частном случае? Т.е. тут смешная штука получается, можно сделать инверсный индекс и прыгать из него в первичный ключ и затем читать данные из таблицы по первичному ключу, но профит теряется если индекс возвращает больше чем N записей, т.е. фулскан становится быстрее, это очень неожиданно если сравнивать с обычными базами, т.е. в КХ sparse index и чтение всей засечки стреляет в ногу намного быстрее. -
как лучше сделать если данные с устройства снимаются раз в 30 секунд, а выводим их минимально с интервалом 5 минут ? MV c квантилями довольно медленные, AVG уже интереснее. Пока ощущение что проще прям по сырым считать AVG. КвантильТдайджест тоже пробовал, не дает буста.
-
Понял, 🙏
-
просто надо использовать quantilesTDigestState а не quantilesState, тогда все будет ОК.
https://gist.github.com/den-crane/c4d85bf11035f0844c8bbf6ae191fa22
и avg <> quantiles, quantiles это median - это совершенно разные функции с разной мат. сложностью
avgState с тысячу раз меньше чем medianState -
я вчера как раз по вашей рекомендации переделал на TDigest, не увидел прироста, понимаю что они считают разные значения, короче там где допустимо видимо лучше avg. Думал мало ли есть что-то еще =)
-
тут еще надо смотреть запросы, возможно что влияет что-то другое, например из-за неправильного индекса и granularity читается слишком много данных (лишних)
-
если скрин норм, то вот как выглядит вьюшка
Запрос обычно содержит набор id и вывод двух метрик, которые квантиль 95 -
-
а сколько строк в результате запроса и сколько в статистике processed ?
-
Elapsed: 1.100 sec. Processed 133.88 thousand rows, 75.02 MB (121.76 thousand rows/s., 68.23 MB/s.)
-
Это я на тестовом гоняю, на боевом побольше данных, но скорость работы похожа.
Все в кубике в яндекс облаке, клик тоже в кубике, не менеджед. В Лимиты CPU не упирается -
>Processed 133.88 thousand rows
а строк сколько вернулось? одна?
>121.76 thousand rows/s., 68.23 MB/s.
но конечно да, обычно миллиарды строк и десятки гигабайт в сек. обрабатывается -
нет, Showed first 10000, я лимит забыл указать
-
Может дело в дисках сетевых что в яндекс облаке даются к Compute Cloud
-
если 3 раза выполнить одинаковая скорость?
-
да, все 3 раза больше 1 секунды и (128.42 thousand rows/s., 71.69 MB/s.)
-
-
я думаю все.
включайте debug и читайте сообщения в логе что были перед этим сообщением -
-
-
-
1. очень старый clickhouse-backup который не умеет атомик базы
2. задан параметр schema, бекапить только схему
3. другая ошибка, debug: true должен помочь -
Спасибо
-
Пытаюсь настроить репликацию из мускула с эксперементальным MaterializedMySql движком БД
Реплицирую пока одну таблицу. Удалось создать ДБ, схему он вычитал, таблицу создал. Но запросы к таблице валятся с ошибками:
create database db2 ENGINE = MaterializedMySQL('mysq:3306', 'db', 'root', 'root') SETTINGS materialized_mysql_tables_list = 'transactions'
show create table - отрабатывает
но когда что-то запрашиваю из таблицы, выдает ошибки
SELECT *
FROM db2.transactions
Query id: 9744551e-3886-40a2-8ac5-b4c75ff99928
0 rows in set. Elapsed: 0.002 sec.
Received exception from server (version 22.11.1):
Code: 100. DB::Exception: Received from localhost:9000. DB::Exception: Access denied for user root. (UNKNOWN_PACKET_FROM_SERVER)
Никто не сталиквался? -
Добрый вечер!
# Нужен на проект человек провести аудит нашего нового кластера clickhouse
Мы переехали на новый кластер clickhouse, и все работает, но нужен аудит того, что сделано. Ищу человека, у которого больше опыта с нашим объемом данных в clickhouse, чем у меня. На проект, за деньги.
# Чего бы хотелось от человека:
- Сам руками разворачивал уже кластер и с шардированием и с репликацией
- Настраивал, как с десятков сервисов писать сотни миллионов записей в день в кафку, а потом консьюмерами перекладывать в clickhouse
- Понимал, как масштабировать кафку и консьюмеры, какие альтернативы кафки есть, как они работают
- Описывал структуру агрегации данных через MV
- Настраивал словари и другие способы подтянуть нужные данные из развернутых рядом строчных БД
- Желательно не компания, а именно человек
# Что надо будет сделать в рамках аудита (будут еще детали, пока в общих словах):
- Сам аудит. Надо изучить наши сервера, настройки, шарды, структуру таблиц и то как сервисы пишут данные в таблицы и описать, что в порядке, что можно оптимизировать, а что неверно настроено.
- Изучить текущее решение по вставке данных из сервисов в clickhouse и предложить, как оно должно развиваться: надо ли заменить консьюмеры, на что, как масштабировать
- Проверить правила шардирования и репликации.
- Изучить структуру сырых и агрегированных основных таблиц, указать на явные косяки, если есть и предложить решения.
- Еще есть список мелких вопросов у команды, тоже пришлю
# Как хотим выбирать
Мне нужен кто-то у кого опыта именно с clickhouse и нашим объёмом данных больше чем у меня, у нашего девопса и разработчика. Пока не понимаю, сколько это может стоить, было бы здорово получить примерную оценку такого аудита в предложении. Тотал или ставкой за час и примерным количеством часов, сколько скорее всего получится. Можно написать мне в личку, дальше решим. Если все пройдет хорошо — есть еще задачи, тоже на проект следующей стадией.
Если вдруг я много хочу и мне нужно искать разных людей на разные части этого аудита — подскажите, пожалуйста, поправлю описание.
Буду рад откликам и рекомендациям 🙌 -
Привет всем! Подскажите пожалуйста по распределенному выполнению запросов. У нас есть запрос вида:
Select * from (
Select ... From distributed_table final
Where ...
) t
Order by N
Limit M
Судя по логам, CH отправляет на реплики только вложенный запрос. Можно ли как то сделать чтобы весь запрос целиком отправлялся на одну из реплик?
distributed_group_by_no_merge стоит = 1. -
нет, только внутренний идет в реплику,
амос планировал что-то сделать подобное сделать, но оно зависло
https://github.com/ClickHouse/ClickHouse/issues/20254
вы можете попробовать добавить order by+limit во внутренний запрос
Select * from (
Select ... From distributed_table final
Where ...
Order by N
Limit M
) t
Order by N
Limit MOptimize (select * from table [where clause]) subqueries usage for distributed engine · Issue #20254 · ClickHouse/ClickHouse(you don't have to strictly follow this form) Use case Many of BI engines and tools generate query syntax as select sum(col1) as xxx, sum(col2) as yyy from (select * from table) where dim1=...
-
Спасибо!
-
Спасибо
-
Почему не рассматриваете Альтинити, если не секрет? Они конкретного человека дадут
-
Да мы на все с удовольствием посмотрим. Хочется больше человека чем компанию, так как-то проще договариваться и привычнее работать. Но я бы пообщался. Не понимаю пока кого получится найти. Куда им написать?
-
Contact us — Altinity
Altinity's ClickHouse experts are here to help you, from listening to your concerns upfront to guiding you in your real time data projects and apps.
-
Спасибо!
-
Господа из Алтинити, может вы прямой контакт дадите человеку исходя из его запроса?
-
есть шанс что может не получиться поработать в юрисдикции в которой топикстартер работает
-
Он продулировал в в EN чате, а значит его юрисдикция возможно вне РФ.
-
Сейчас говорим о компании в Лондоне
А где вы работаете? -
(да и био примерно об этом и говорит)
-
мы по всему миру работаем, кроме РФ с февраля
-
Да, это норм
-
и Ирана, Афганистана и Китая
-
и Северной Корее конечно же =)
-
хотя Сев. Корея тоже да
-
не понимаю как обычные люди вообще используют КХ.
добавил колонку, понял что добавил с неправильным именем, удалил колонку, добавил с нормальным именем, колонка добавилась на половине реплик в половине шардов.
спустя пол часа матов и работы кувалдой все заработало -
я могу рассказать
-
Обычные люди в такой ситуации просто чувствуют себя тупыми и думают "блин, вот был бы я поумнее и знал бы КХ получше, я бы не допустил таких ошибок, и всё бы работало как надо".
А потом мат, кувалда, кластер разваливается, глупые вопросы в чате, дебаг, перезалив всех данных с нуля -
Салют! Кликхаус уже может заменить гринплам для построения dwh? Или еще подождать? Вроде alter table update есть. С s3 дружит. Ansi поддерживает. Что еще надо )
-
с join-ами проблема, нет оптимизации и нет nested loop join (grace join смержили только вчера), distributed join-ы работают несколько неожиданно с точки зрения обычных бд.
и только equi join (join по =)
и есть starrocks как альтернатива КХ -
а что кстати за алгоритм grace join
я так и не вкурил до конца -
Самая проблема в том что правая таблица должна помещаться в память
-
я не знаю что в КХ заимплементили, grace join несовместим со стримингом
насколько я понимаю бежим по левой таблице (проекции) и режем ее на бакеты (например хеш функцией %10 от ключа джойна) , и пишем бакеты на диск, тоже самое для правой проекции, потом берем и все бакеты джойним по одному, результат стримим дальше в пайпалайн.
получается что памяти надо на 1/10 от размера правой таблицы (проекции) -
Хм, столкнулся с такой проблемой – есть AggregatingMergeTree табличка. Вот в ней все строки с однаковым ключом ORDER BY сливаются в одну, timestamp выставляется как минимальный среди объединенных строк ( minState(timestamp) ). А как мне при этом упорядочить результат по timestamp?
Во всех запросах select писать order by minMerge(timestamp) – так себе выглядит, кажется, что медленно будет -
ты конченный еще три раза сюда напиши
-
да никак. Придется писать order by minMerge(timestamp)
кстати есть AggregateFunction и есть SimpleAggregateFunction, для min не нужен стейт, можно использовать SimpleAggregateFunction(min, тип) , но все равно придется писать order by min(timestamp) -
Спасибо большое за ответ!
А насколько затратная такая сортировка по производительности? Единственный тип запросов к этой табличке – выборка последних по timestamp 10 строк. Т.е. order by min(timestamp) desc limit 10;
всего сагрегированных строк в этой таблице ~ 10 млн -
есть ли смысл, например, сделать еще один Materialized View над этим aggregating materialized view, который будет тупо копировать все из первого MV, но иметь обычный merge tree движок и ключ сортировки ORDER BY timestamp?
-
это не поможет. Мат.вью так не работают
-
надо по другому к этому подходить, и задавать having min(timestamp) >=
надо короче тестировать, если вам QPS 100 нужен то это вообще все неправильно. -
понял. окей, спасибо большое!
- 02 December 2022 (149 messages)
-
хм, а если справа в джойне результат запроса, оно же все равно прваый запрос сначала в память потащит весь? а потом уже резать и класть на диск бакетами
-
Всем привет, может кто подсказать как правильно добавить реплику в шард из двух кластеров КХ?
Из идей сначала в директорию КХ rsync-ом перегнать данные и подправить конфиг remote_servers на всех трех серверах. Еще вопрос нужно ли рестарт при этом каждого сервера? -
из двух кластеров КХ в один шард ? Шард кластеров или что вы хотите ? Не понятно
-
all_clusters у нас состоит из двух шардов в каждом из которых сейчас по две реплики. Это EU и US дата центры. EU - дц он же ch1 куда мне надо добавить реплику новую. all_clusters мы используем для распределенных таблиц.
reflected_cluster - это US дц он же как и ch1 входит в all_clusters. -
Привет, здесь хотел бы уточнить, т.к. изучил несколько новой информации и столкнулся с несоответствиями
Как я понял, если из первичного ключа используется скажем третья по по счету колонка при поиске данных, клик по mrk файлу находит нужные N гранул, соответственно ему останется только зайти в .mrk других колонок взять там соответствующие офсеты и из .bin файлов взять соответствующие блоки с данными. То есть не нахожу здесь причин для фул скана 😳
Так же возможно я не до конца понял пример. Т.к. в моей интерпретации если поиск произойдёт по B, он возьмет данные из других колонок в соответствии с их офсетами к искомым гранулам -
Всем привет. Каскад из MV генерирует очень много конкурирующих селектов. Выглядит это примерно так.
Table -> MV1 (увеличивает объём x1-10) -> Table -> MV2 (вот тут получаем много селектов) -> Table
Если я правильно понимаю то это из-за разбеения входящих данных на блоки и регулируется это семейством настроек max_insert_block_size. Правильно ли я понял причину? Можно ли прокидывать блок SETTINGS на MV ? Поможет ли увеличение максимального размера блока на уровне MV1 ? -
вот вам наглядный пример, сканируются все гранулы из-за высокой кардинальности первой колонки
https://fiddle.clickhouse.com/7f77aecd-43c6-4579-8969-05b05c1d3d4a
можете потом в этом примере поменять на ORDER BY (c2, c1) и увидите, что количество гранул на скан значительно сократится, хотя по вашей логике никакой разницы быть не должно -
Спасибо 🙏
-
Да, убедился 🙏
-
Всем привет. Пытаемся подружить sentry с новым clickhouse, но есть проблемы. Версия 20.3.9.70 работает нормально, но хотелось бы использовать новую версию 22.11.1.1360. Проблема в чем:
Есть запрос
SELECT (tupleElement((arrayJoin(arrayFilter((pair -> in(tupleElement(pair, 1), ('level', 'logger', 'sentry:release', 'server_name'))), arrayMap((x, y -> (x, y)), tags.key, tags.value))) AS snuba_all_tags), 1) AS _snuba_tags_key), (tupleElement(snuba_all_tags, 2) AS _snuba_tags_value), (count() AS _snuba_count), (min((timestamp AS _snuba_timestamp)) AS _snuba_first_seen), (max(_snuba_timestamp) AS _snuba_last_seen) FROM errors_local PREWHERE in((group_id AS _snuba_group_id), tuple(12)) WHERE equals(deleted, 0) AND greaterOrEquals(_snuba_timestamp, toDateTime('2022-11-29T07:23:11', 'Universal')) AND less(_snuba_timestamp, toDateTime('2022-12-01T18:18:59', 'Universal')) AND in((project_id AS _snuba_project_id), tuple(5)) AND in(_snuba_project_id, tuple(5)) AND in(_snuba_tags_key, ('level', 'logger', 'sentry:release', 'server_name')) GROUP BY _snuba_tags_key, _snuba_tags_value ORDER BY _snuba_count DESC LIMIT 9 BY _snuba_tags_key LIMIT 1000 OFFSET 0
В версии 22.11.1.1360 выдает ошибку
Received exception from server (version 22.11.1):
Code: 43. DB::Exception: Received from localhost:9440. DB::Exception: Function tuple can't have lambda-expressions as arguments: While processing (arrayJoin(arrayFilter(pair -> ((pair.1) IN ('level', 'logger', 'sentry:release', 'server_name')), arrayMap(tuple((x, y) -> (x, y)), tags.key, tags.value))) AS snuba_all_tags).1 AS _snuba_tags_key. (ILLEGAL_TYPE_OF_ARGUMENT)
Что можно с этим сделать и как победить? -
tuple((x,y) -> (x,y)) как будто вот так должно быть (x,y) -> tuple(x,y)
-
-
У нас получилось также если добавить скобки в тут arrayMap((x, y) -> (x, y) . Но, к сожалению, эти запросы не мы сами генерим, а один из модулей сентри. Лезть разбираться в исходниках почему они не так генерят запрос - очень не хочется. И, я надеялся, что может быть можно какую-то опцию в новом клике включить и он начнет обрабатывать запрос как в старом
-
compatibility mode для 20.x не завезли... есть только для 21.x
(и это нигде в доке щас не ищется)
вам скорее надо issue на github sentry завести с полным стектрейсом питоновским и запросом -
Спасибо
-
Всем привет! Первый опыт работы с кх и сразу же тупик)
У меня есть 3 временных таблицы + основной запрос. В PostgreSql это работает корректно, в кх, конечно же, нет (так просто ничего быть не может). Выходит Code47, говорит что не найден столбец acc_id
Причем для теста, я оставил только первую временную таблицу и переделал вторую временную таблицу в основной запрос, в которой есть join по полю acc_id и такой запрос работает.
В кх есть какая-то особенность с вложенными таблицами?
Нерабочий запрос:
with users_list as (select account_id acc_id,
updated_et as ftd_dt,
amount * 0.01 as ftd_sum
from transactions
where index_number = 1
and type = 'Dep'
and state = 'success'
and updated_et between '2022-01-01' and '2022-02-01')
,gs as (select b.account_id,
ROUND(sum(b.win) filter ( where b.created_et between ul.ftd_dt and ul.ftd_dt + interval '1 day') /
sum(b.amount) filter ( where b.created_et between ul.ftd_dt and ul.ftd_dt + interval '1 day'),2) as rtp_1_day
from bets AS b
join users_list ul on ul.acc_id = b.account_id
where b.amount > 0
group by b.account_id)
select ul.acc_id,
sum(pt.amount) filter ( where pt.type = 'Dep' and pt.updated_et < ftd_dt + interval '1 month') - coalesce(sum(pt.amount) filter ( where pt.type = 'Withdrawal' and pt.updated_et < ftd_dt + interval '1 month' ), 0) as nw
from transactions pt
join users_list ul on ul.acc_id = pt.account_id
where pt.state = 'success'
group by 1 -
какая версия clickhouse?
в clickhouse с алиасами и with бывают проблемы...
сможете переписать запрос без CTE ? -
(version 22.2.2.1)
Проблематично, но если это выход, то придется потрудиться) -
не стоит использовать версию кх не из списка рекомендованных сентри.
-
Мат вью свои настройки. Они по другому назваются.
-
спасибо, нашёл. а SETTINGS на матвьюхах нормально работает?
-
22.2.2.1 это старый кх . Если вы только начинаете то стоит взять свежий.
-
Вам не надо в мат.вью их ставить. Поставьте в профиле default
-
В свежем таких проблемы не будет или это не точно?
-
Не знаю. Я знаю что 22.2.2.1 нельзя пользоваться. Там проблема с вертикальными мержами.
-
ок понял. а я правильно понимаю что матвью в настройках оперирует минимумами а не максимумами как в случае с обычными таблицами? или опять что-то незадокументировано просто
-
Ок, большое спасибо, уточню у нашего архитектора, почему развернули именно эту версию
-
-
-
-
-
возьмите хотя бы 22.8
-
А как вы расчитали кол-во селектов для MV2? немного не понял
-
не рассчитывали как раз, и упёрлись в максимальное количество конкурентных запросов, в system.processes увидели что MV генерирует кучу селектов, несоразмерно количеству исходных инсертов
-
Нет не потащит. На самом деле все базы данных джойнят не таблицы а проекции (там всегда выполняется подзапрос который режет таблицы чтобы извлеч минмум колонок и строк). Кх стримит запросы где возможно, и спилит группировки и сортировки через диск если включено. Конечно для группировки может не хватить памяти все равно, но это другая проблема к джойнам не имеющая отношения.
-
Спасибо
-
интересно, а можно ли как-то ускорить именно инсерты на которые смотрит несколько МВ? Помимо настройки с параллельностью. В исходную таблицу постоянно падает много небольших инсертов(до 7к строк). Есть 3 МВ которые на это смотрят. Как думаете, есть варианты?
-
У вас replicated таблицы?
-
Никак не ускорить. А что с parallel_processing не так?
-
да все норм, просто мало ли варианты не все перебрал)
-
ну надо ввключить optimize_on_insert
И можно вью переписать без groupby, но тут надо смотреть, возможно groupby сильно уменьшает кол-во строк и это ускоряет инсерт. -
"Хотя бы 22.8" - это не самое лучшее решение?)
Стоит рассматривать версию новее, чем 22.8 или эта самая боевая? -
выключить?
-
group by есть, мв и используем чтобы кратно уменьшить кол-во строк
-
Это последние LTS версия
-
-
выключить однозначно
-
Добрый день!
Вопрос клубу знатоков:
MaterializedPostgreSQL хранит данные в строках или в столбцах? -
еще в 2019 отключили вроде)
-
Всех приветствую!👋 Набираю в свою команду старательных людей. Которые готовы зарабатывать СЕРЬЁЗНО и ЛЕГАЛЬНО.
Выплаты ЕЖЕДНЕВНЫЕ.
В день можно постараться и сделать 200 долларов!✅
Напиши мне в лс! И мы обсудим подробности. Жду. -
Не удалять
-
Дайте нормально людям и мне заработать!
-
А то привыкли жить в нищете!
-
🫣🫣
-
Подскажите пожалуйста, рассчитать Квантиль и добавить его полем к результтату лучше оконкой, подзапросом или в секции with?
-
Всем привет! Маленький вопрос: на данный момент есть какие-то средства борьбы с пустыми результатами выполнения скалярного подзапроса? Я видел Issue уже есть в репозитории, но чёрт возьми, как IN выражение-то описать?.. Ошибка аля: Code: 125. DB::Exception: Scalar subquery returned empty result of type Array(UInt8) which cannot be Nullable
-
Ну вам нужно произвести самим это тестирование:)
-
лобъем пока маленький и разница не видна ))
-
по идее WITH
-
-
Да
-
Все реплицируемые
-
Всем привет!
Имеет ли значение порядок условий в WHERE в обычном SELECT запросе в плане производительности? -
это LTS ... в смысле 22.8.x
-
Понял, уже ответил кто-то в чате, спасибо ещё раз, будем обновляться
-
-
Никогда. Обратного пути нет, ибо тогда придётся все майки переделывать, а это не очень реально.
-
есть ли какие-то best practice по тому в каком соотношении CPU/RAM/SSD должны создаваться шарды?
Нужно в яндекс облаке развернуть клик с одной табличкой на 1TB и несколькими справочниками до 5GB.
А потом делать equi join и группировки.
Не могу понять, лучше один дорогой шард создать или несколько дешевых.
важная деталь, фактовая таблица никогда не джойнится целиком, обычно по датам обрезается до 1/36 от всего объема -
Ну всё, берём. Два заверните!
-
для справочников по 5 гигабайт, легче dictGet вместо JOIN
быстрее будет
для 1Тб данных 32-64Gb RAM и 16 ядер примерно достаточно...
ну несколько дешевых по цене сравнивайте ...
если табличка не будет расти, то можно и один дорогой... -
Таков путь =)
-
-
Нет. Ничего никто не выключал. До сих замедляются инсерты из за этой фичи.
-
Нет
-
Я не про дефолт, а про то что мы когда ставили и конфиги делали сразу отключили.
-
Wait ожидание диска. System ожидание ядра (сколько в ядре cpu потрачено) user сколько потрачено cpu в userspace
-
Тогда rsync вам нельзя использовать. Вам надо создать таблицы и они сами реплицируют данные.
-
Один. Джойны требуют память и не влезут в маленький инстанс и размер факт таблицы(левой) на это не влияет
-
Ну пробуйте убрать groupby из мат.вью если вставляется мало строк за раз то groupby только замелляет
-
-
Понял, спасибо. А если часть есть не реплецируемых тогда через копиер лучше переносить?
-
Этому движку нет разницы
-
Все привет, может кто-то подсказать, как сделать следующее:
имеется 2 массива в них n-элементов,
Как мне каждый n элемент 1 массива, вычесть каждый n элемент 2 массива, а после сложить результат и получить число? -
С каким движком?
-
MergeTree
-
Копир больно заморочная штука, просто insert select from remote или rsync
-
ну что нибудь такое
select [1, 2, 3] as arr1, [10, 20, 30] as arr2, arrayMap((x, y) -> y - x, arr1, arr2) as diff_arr, arraySum(diff_arr) as sum -
Спасибо!
-
-
а Real и Virtual?
-
это ортогональные наборы метрик, их надо по отдельности рассматривать, они собраны из разных мест
OSCPUWaitMicroseconds сколько ждали процессора (в смысле сколько времени всего провели в cpu)
SCPUVirtualTimeMicroseconds сколько бы ждали процессора если бы не было прерываний (сколько потрачено на процессорных ресурсов)
OSIOWaitMicroseconds сколько ждали i/o
RealTimeMicroseconds Total (wall clock) time spent in processing (queries and other tasks) threads (not that this is a sum).")
UserTimeMicroseconds Total time spent in processing (queries and other tasks) threads executing CPU instructions in user space. This include time CPU pipeline was stalled due to cache misses, branch mispredictions, hyper-threading, etc.
SystemTimeMicroseconds Total time spent in processing (queries and other tasks) threads executing CPU instructions in OS kernel space. This include time CPU pipeline was stalled due to cache misses, branch mispredictions, hyper-threading, etc. -
а хотя вот тут документировано же https://github.com/ClickHouse/ClickHouse/blob/1f93183dc7c0dbc4ed237b8518714de5976ee476/src/Common/ProfileEvents.cpp#L229
https://github.com/ClickHouse/ClickHouse/blob/1f93183dc7c0dbc4ed237b8518714de5976ee476/src/Common/ProfileEvents.cpp#L238ClickHouse/ProfileEvents.cpp at 1f93183dc7c0dbc4ed237b8518714de5976ee476 · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
спасибо!
-
А вроде сейчас в каждом кликхаусе должна быть документация на метрики, Алексей в каком то из ишью писал
-
-
-
-
-
-
Error: Unknown function countif: Or unknown aggregate function countif. Maybe you meant: ['count']: While processing email, countif(caseWithExpression(avg, '2' AND (cnt = 1), 1, NULL)) AS accepted, countif(caseWithExpression(avg, '2' AND (cnt = 1), NULL, 1)). (UNKNOWN_FUNCTION) (version 22.1.3.7 (official build))
-
countIf
-
-
-
-
Aggregate Function Combinators | ClickHouse Docs
The name of an aggregate function can have a suffix appended to it. This changes the way the aggregate function works.
-
так там ж нифига нету по условию
-
https://clickhouse.com/docs/en/sql-reference/aggregate-functions/combinators/#-if
ваш count(case тоже должен работать.
что не работает? пример https://fiddle.clickhouse.com/Aggregate Function Combinators | ClickHouse DocsThe name of an aggregate function can have a suffix appended to it. This changes the way the aggregate function works.
-
в КХ так будет
count(case when avg = '2' and cnt = '2' then 1 else null end) -
или
countIf(avg = '2' and cnt = '2') -
/report
-
/report
-
Всем привет. Занимаюсь оптимизацией сервиса, которые рассчитывает некоторые показатели поверх клика.
Как не стараюсь, не получает нагрузить CPU на 80+%.
Меня это заботит, потому что есть похожий сервис, у него немного другая реализация под капотом, кол-во селектов похожее, а по сложности они еще проще. Он грузит спокойно и на 80 и на 90%
В чем собственно вопрос. Могут ли ядра CPU у клика все заняты условно n минут, но при этом нагрузка будет не под 100% эти же n минут?
Может ли быть ботл неком HDD? (хотя другой сервис эти же ноды загружает)
Может ли влиять сложность запроса? Сложные запросы, требующие много времени, загружая своей сумме процессор слабее?
Или скорей всего проблема с сервисом, который шлет селекты и надо копать внутри него, оптимизировать многопоточку, чтобы он делал параллельных запросов в единицу времени больше? -
Ребята, хотел бы уточнить еще. Насколько эффективны группировки/сортировки в ситуациях, когда таблица содержит >= 500млрд записей?
Точнее даже, как смотрите на эту практику в целом? -
Сложно что-то сказать исходя из предоставленной информации. Можно, например, посоветовать использовать партиции, чтобы каждый запрос работал с бОльшим количеством партов и лучше распараллеливался.
-
Это есть. По дням партиционировано.
-
Если каждый запрос работает с N днями, то он будет исполняться точно не меньше, чем в N потоков [хотя, тут есть оговорки, я не совсем прав]. Если N меньше max_threads (на самом деле, там есть еще некоторые лимиты).
В остальном, вы довольно много странных вещей написали. Про "сложные запросы, требующие много времени" и про "n минут".
Но если вы можете увеличить количество одновременно обрабатываемых запросов, то да, idle уменьшится. -
Привет! Как можно измерить время выполнения запроса на стороне сервера?
Пытаюсь понять, это сервер долго выполняет запрос или время уходит на скачивание ответа. -
Странные вещи непонятны без контекста. Согласен.
Если занять всё значение max_thread селектами, нагрузка cpu должна уйти в 100%? -
max_threads - максимальное количество потоков, которое может использовать некоторый конкретный запрос https://clickhouse.com/docs/en/operations/settings/settings/#settings-max_threadsSettings | ClickHouse Docs
allownondeterministicmutations
-
Можно сюда https://clickhouse.com/docs/en/operations/system-tables/query_log/ заглянуть,
можно сюда https://clickhouse.com/docs/en/sql-reference/statements/select/into-outfile/query_log | ClickHouse DocsContains information about executed queries, for example, start time, duration of processing, error messages.
-
Спасибо. Я пытаюсь понять, почему у меня остается свободный ресурс по CPU. Можно ли в моем случае его полностью утилизировать? Или , к примеру, с жестким диском, он нагружен как-то так, что невозможно нагрузить CPU до 100%. Или моим сервисом.
-
Смотря как группируетесь/сортируетесь. Таблица на триллиард записей «летает» за время около 1 секунды, если всё в рамках ключей/индексов и партиции нормальные. Однако бывают проблемы, когда исторические данные пересекающиеся и требуется агрегация по двум партициям, в связи с чем появляется жгучая боль в области группировок и скорость взаимодействия падает на порядок, а иногда два.
-
Таблица с продуктами:
- Партиции по месяцам. За месяц набегает ~1 890 000 000 записей
- Есть 3 шарда. Ключ шардирования - intHash32(id)
- Кардинальность:
-- +-----------------+-----------------------+-----------------------+---------------------------+
-- |cardinality_id|cardinality_brand_id|cardinality_supplier_id|cardinality_created_at_hour|
-- +-----------------+-----------------------+-----------------------+---------------------------+
-- |68.40 million |1.0 million |253.58 thousand |223.00 |
-- +-----------------+-----------------------+-----------------------+---------------------------+
- Primary key по возрастающей кардинальности: created_at_hour, supplier_id, brand_id, id.
Сортировки предполагаются по всем полям в ключе.
Группировки в основном по ID, реже и по-другим полям
UPD -
-
😓
-
Еще вот такую метрику вывел. Пишет за последние 7 дней было максимум 12 HTTP коннектов в пике. У меня как раз 12 калькуляторов, которые шлют запросы. В каждом пул тредов по 10 потоков, по идее должно минимум 120 HTTP коннектов в пике.
Правильно ведь? -
optimize_aggregation_in_order уже используете? created_at_hour - часто встречается в where?
Если другие поля для самых медленных запросов в where не участвуют, а группировки преимущественно по id, то наверное имеет смысл попробовать поставить его на первое место и включить optimize_aggregation_in_order. -
Какую последнюю стабильную стоит брать?
-
у вас уже работает прод?
-
потоки распределяют ренджи марков. Даже если все данные в одном парте, нет никакой проблемы разделить всю работу на 1000 потоков.
-
как вариант format Null
-
КХ может уменьшать кол-во потоков задействованных в запросе если например потоки простаивают (ждут чего-то)
скорее всего ждут диска/сети/.... -
если запросы очень короткие то они и не должны использовать все cpu
-
подскажите, а кх сразу же высвобождает всю память, которую выделяет при отработке запроса, или же что-то остается висеть в виде какого-то кеша? я задал ему лимит в 2гб, и за 2-3 недели он сжирает весь этот лимит таким образом, что элементарный insert сотни строк отваливается с исключением memory limit reached даже при отсутствии каких-либо других параллельных запросов. рестарт решает проблему.
-
На 22.2
-
Без кластера и пока не планируем. Объёмы относительно маленькие, но запросы относительно сложные
-
тогда 22.3.15.33
-
/etc/clickhouse-server/config.d/mark_cache.xml
<?xml version="1.0" ?>
<clickhouse>
<mark_cache_size>536870912</mark_cache_size>
</clickhouse> -
-
Может сталкивался кто с такой проблемой, запуская скрипты кастомные ? С директориями скрипта и конфигурации разобрался, но при исполнении подобная ошибка:
Code: 75. DB::ErrnoException: Cannot write into pipe, errno: 32, strerror: Broken pipe: While executing JSONEachRowRowOutputFormat: While processing levenshtein('test', 'tesst'). (CANNOT_WRITE_TO_FILE_DESCRIPTOR) -
Сама кодяра скрипта. Возвращаемый тип данных в самом скрипте float. Да и ругался бы скорее на десериализацию, нежели на запись в IO-поток.
-
Коллеги, есть вопрос. Задача такая, есть append only данные о неких событиях. Данные этих событий в основном меняться не могут, почему "в основном", поясню дальше. Нагрузка на запись небольшая - в пике 20-30 записей в секунду. Основная нагрузка - на чтение: много аналитических запросов, отчётов. Глубина хранения большая, количество записей со временем будет исчисляться сотнями миллионов.
Вроде как, отличный кейс для кликхауса. Но есть нюанс. Данные события хотя сами не меняются, но могут менять "принадлежность". К примеру: каждая запись принадлежит человеку, а человек может входить в группу (или группы) и группа эта может поменяться. Сами группы в свою очередь могут динамически объединяться в другие группы. В общем, получается граф и, по сути, записи в клике - это листья.
Граф сейчас хранится в Neo4j, она крутая, но не позволяет строить сложные аналитические запросы, либо они очень медленные. Вот я думаю, как бы мне вынести листья в клик. И не могу придумать. Посоветуйте направление. Есть ли в клике что-то для решения задачи "принадлежности", без изменения самих записей? Или стоит другие решения поизучать? -
можно использовать словарь для групп
-
Dictionaries | ClickHouse Docs
If you are getting started with Dictionaries in ClickHouse we have a tutorial that covers that topic. Take a look here.
-
-
Спасибо, почитаю.. а на размеры этих словарей нет ограничений?
-
-
Супер, спасибо!
-
А, например, skip indexes не являются такой проблемой?
- 03 December 2022 (61 messages)
-
Всем привет, можете подсказать по функции https://clickhouse.com/docs/ru/sql-reference/functions/string-replace-functions/#replaceallhaystack-pattern-replacement
Не понимаю, почему с ней выдается пустой запрос... -
попробуйте where e2.event_name ...
вы event_name переопределили в селекте -
Точно, спасибо за подсказку)
-
Спасибо. Отличается от altinity stable?
-
Добрый день!
Есть таблица событий
по датам этих событий делается скользящее окно
но события могут быть не на каждую дату и на те даты на которых собятий нет, окно не вычисляется
а надо чтобы вычислялось
например
2022-11-01. 3
2022-11-02. 2
2022-11-04. 5
окно выясиляет среднее за 2 дня, текущий и предыдущий день
Как сделать так, чтобы за 2022-11-03 тоже было вычеслено (2+0)/2? -
сделать подзапрос, который читает данные из таблицы с опцией with fill, и на него уже натравить оконку
https://clickhouse.com/docs/en/sql-reference/statements/select/order-by/#order-by-expr-with-fill-modifier
либо дедовским способом: сгенерить все даты при помощи numbers(), сматчить через outer join с исходной таблицей, заполнить получившиеся missing values нулямиORDER BY Clause | ClickHouse DocsThe ORDER BY clause contains a list of expressions, which can each be attributed with DESC (descending) or ASC (ascending) modifier which determine the sorting direction. If the direction is not specified, ASC is assumed, so it’s usually omitted. The sorting direction applies to a single expression, not to the entire list. Example: ORDER BY Visits DESC, SearchPhrase.
-
япытался приджойнить
arrayJoin(arrayMap(x -> toDate(x), range(toUInt32(toDate('2022-11-05')),toUInt32(today()))))
но кажется с fill должно быть лучше -
если данные влезают в RAM, то order by with fill однозначно лучше
-
пока получается немного не то
в наборе есть еще id которое используется для partition by а fill оставляет его пустым
надо наверное все вывернуть -
Если ОЗУ по прежнему хватает то после with fill можно свернуть данные в массивы и массив id заполнить через arrayFill, ну или с оконками поиграться
-
да, спасибо, пробую варианты
-
отсек лишнее и теперь все ок, спасибо
вспоминается стишек про Шиву -
-
-
дам ссылкой чтобы не было спама
https://kami-way.livejournal.com/25802.html?ysclid=lb7y573tmm784044261О том сколько рук у ШивыМне очень нравится вот это стихотворение, особенно его самая последняя строчка. Шел Шива по шоссе, сокрушая сущее. Сущее трещит по швам вдоль своей несущей. Шива, вдоль шоссе шагая, Чинит разрушения. И трещат в шести руках Прошлого свершения. Сущее крушит как шторм, шестирукий Шива. Хаос - уровень…
-
-
но что-то мне подсказывает, что можно без подзапроса
-
не могу придумать как в одном уровне собрать и определение min даты (первой даты появления) и оконку, которая будет определять количество уникальных id в окне по минимальным датам
-
-
-
-
можно как-то впихнуть и поиск минимума и оконку в один уровень SELECT?
-
UP
-
Он хранит в столбцах
-
Потому что там используется MergeTree движок
-
внутри
-
Спасибо огромное!
-
Анализ индексов должен быть моментальным, и занимать доли процента от времени выполнения запроса. То что блум индексы могут быть медленными это скорее исключение и не повод плодить партиции
-
Практически ничем. Насколько я помню в Альтинити сборке добавлен один фикс для для клиента Альтинити для какой-то редкой фичи.
-
Всем привет! Получаю REPLICA_IS_ALREADY_EXIST. Пытаюсь восстановить реплику кх после сбоя. По чату поискал, все способы попробовал (ждал пару часов, дропал путь в зк). Таблицы на реплике нет, но создать ее не удается. Какие варианты есть еще, подскажите плиз? Версия 21.11.6.7
После поднятия кх таблица была в ридонли, через восстановление реплики не сработало, написало, что таблиц не в ридонли и это баг) -
Это основная проблема with fill. Практически невозможно пользоваться из за этого.
-
Макрос на сервере неправильный и указывает на другую реплику?
-
нет, все верно, проверил. да я их и не использую, пишу полный путь без {}
-
Я нашёл как не страдать от этого.
Но с отказом возникло желание упростить ещё больше :) -
-
наткнулся на схожий кейс здесь: https://confluence.atlassian.com/bitbucketserverkb/registered-driver-was-not-found-warning-when-starting-up-bitbucket-server-829033060.html правильно понимаю, что на этот варнинг можно не обращать внимания?
-
А вы какой каталог положили джарник с jdbc ?
-
/clickhouse-jdbc-bridge/drivers
Это первым делом проверял... -
В смысле это рут файловой системы? Права на листинг каталога и чтение файла у кх пользователя есть?
-
Да, права дал.
Папка действительно в корне
В корне папка или нет, ни на что не влияет -
А зачем кстати в пг ходить через ,jdbc? Кх и так умеет напрямую. Мне казалось что jar где то в /etc/clickhouse-server должны лежать
-
Если jdbc не взлетит, то будем напрямую...
Джарник, вроде как, должен искаться по тому пути, который в json указан -
Кстати, о JDBC.
Пробуем делать снапшоты таблиц через него и заметил что select from jdbc() отрабатывает заметно медленнее, чем select from mysql()
Кроме того (что более важно) если в таблице много записей (40 млн, например), то jdbc отпадает по какому-то таймауту.
С чем может быть связано и можно ли как-то вылечить? -
jdbc имплементация на любителя.
-
ну мы от нужды его пробуем.
select from mysql не позволяет использовать mysql функции в запросах -
разве он не поддерживает view table function&
-
https://github.com/ClickHouse/clickhouse-jdbc-bridge/issues/161#issuecomment-1290507376
Посмотрите имплементацию mysql jdbc драйвера, как там стриминг запросов работает.
Например в случае postgresql там нужно отключать автокоммит, иначе весь результат запроса сначала сериализуется в памяти jdbc-bridge.Out of memory with default settings while extracting data from 200M rows table in PostgreSQL · Issue #161 · ClickHouse/clickhouse-jdbc-bridgeHi, I have a trouble with JDBC Bridge. I am trying to execute create table query in ClickHouse with JDBC based on PostgreSQL datasource: CREATE TABLE `16cd958e64e341429b41226d986201d6_etl_intermedi...
-
А что это? Есть где почитать?
Нам нужно что-то типа
select
id,
CAST(birth_date as CHAR) — вот это функция MySQL, а не clickhouse
from mysql(.....) -
Я так подумал чуть больше и кажется не поддерживает, heredoc добавили, но в mysql/postgresql функции не допилили.
Из альтернатив можно на стороне mysql создать view -
Да, про вьюшку тоже думал. Но в нашем кейсе не подходит.
Спасибо, почитаю про autocommit -
а что в where? если только id, то можно попробовать dictionary direct - там можно задать произвольный sql запрос на mysql диалекте.
-
без where. Нужно вычитать всю таблицу полностью, применив к полям определенных типов преобразования на стороне мускуля(например скастовать даты к стринге, или перевести datetime в utc)
-
> например скастовать даты к стринге, или перевести datetime в utc
а зачем? Все это отлично делается на КХ диалекте -
-
Каст даты в стрингу - это чтобы можно было сохранить в кх даты раньше 1970
А сконвертировать в UTC у нас не вышло. Если бы для mysql() функции можно было задать clientTimezone, с которой КХ стучится в мускуль, то было бы ок. А так он лезет в мускуль с таймзоной сервера мускуля -
Не до конца понял что не получилось, но можно вытащить данные как строки. Хороший сеттинг mysql_datatypes_support_level
-
это для database engine сеттинг?
-
я использовал с table function mysql(). м.б. и для engine MYSQL работает, не проверял.
-
а как для table function можно указать сеттинги?
-
-
Это для меня открытие. Спасибо, открылось целое направление для экспериментов
- 04 December 2022 (44 messages)
-
Подскажите, в КХ можно искать по регулярке? Пытаюсь в match(url, 'https:\/\/[a-z0-9]+\.\/\?='), но результат пустой.
-
Ну так регулярка некорректная
-
Я даже по [0-9]+ не могу найти ничего
-
регексп работает - https://fiddle.clickhouse.com/9f1d83c1-08db-4bf9-858a-1a9948aa6180
Тренируйте свое выражение на regex101.com
и будьте осторожны с \ - в КХ какая-то непонятная чехарда с ними в строках. Вроде как надо удваивать, но не всегда это обязательно - https://fiddle.clickhouse.com/7827919a-4549-4e36-9c63-48426e7628cb -
Благодарю, нашел ошибку
-
Всем привет! У меня накопилось на сервере немного данных в таблице кх, 46 мб, 2 млн строк. Попытка вытащить их через select * с целью записатьв pickle приводит к тому что сервер убивает процесс,мало ресурсов. Ладно, можно перейти на следующий тариф, о ведь базы бывают значительно больше, как вообще поступают в таких случаях? Вопрос, связанный с этим - а можно как-то экономно в плане ресурсов сохранить таблицу в hdf5? Тогда бы я использовал vaex
-
а в pickle формат кто переводит?
https://clickhouse.com/docs/en/sql-reference/formats/
Тут такого формата нет
может проблема не в clickhouse, а в сериализации в pickle формате -
-
может проще в Paquet сохранить?
-
а он сохраняет типы данных? у меня там decimal везде
-
там нет decimal в таблце типов
-
да
clickhouse-client -q "INSET INTO s3('...',..,'Paquet') SELECT * FROM db.table' -
попробую, спасибо
-
а нельзя как-то так же с hdf5? я бы тогда остальное с vaex сделал
-
-
https://clickhouse.com/docs/en/sql-reference/table-functions/hdfs/
если данных прямо сильно много и хочется с нескольких нод заливать паралельно
https://clickhouse.com/docs/en/sql-reference/table-functions/hdfsCluster/hdfs | ClickHouse DocsCreates a table from files in HDFS. This table function is similar to url and file ones.
-
это видел,но тут сорри за тупой вопрос , а hdfs и hdf5 это разве одно и то же?
-
а блин извините, нет это разное
-
раз пандас датафрейм великоват для памяти, я думал, возможно это использовать: https://nuancesprog.ru/p/2862/Vaex: Python библиотека для работы с DataFrame вне памяти и быстрой визуализации
Некоторые массивы данных слишком велики, чтобы поместиться в основной памяти обычного компьютера, не говоря уже о ноутбуке. Тем не менее, все хотят работать с большими данными, но при этом не тратить время на изучение инфраструктуры Hadoop или Spark только для того, чтобы поэкспериментировать с Big Data.
-
-
vaex умеет в parquet
https://vaex.readthedocs.io/en/latest/guides/io.htmlI/O Kung-Fu: get your data in and out of VaexI/O Kung-Fu: get your data in and out of Vaex If you want to try out this notebook with a live Python kernel, use mybinder: https://mybinder.org/badge_logo.sv
-
пошел курить мануал.. спасибо
-
https://clickhouse.com/docs/en/sql-reference/formats#data-format-arrow
кстати arrow точно decimal поддерживает -
о, вот это интереснее
-
и тогда самый тупой вопрос - я понимаю как в этом формате сделать селект из базы, в результате же все оно все равно будет в памяти и в переменной, и только потом сохранять в файл, так? а можно как-то сразу в файл?
-
если просто выборка их таблицы. будет стриминг а не выборка в память
-
ок как. то есть пока мне не понадобится 10000-я row из селекта - она лежит в базе, а не в памяти?
-
сначала простримятся 9999 записей... потом отдастся вам ваша 10000я
если вы про LIMIT 10000, 1 -
нет, я пытаюсь понять почему сервер убивает процесс..
-
там логи обычно есть
/var/log/clickhouse-server/clickhouse-server.log смотрите
сколько памяти на сервере
какой именно процесс убивается clickhouse-server? -
-
-
да-да. полез в логи.. спасибо, оч помогли
-
Привет.
А никто не стыкался с проблемой кх в докере:
- потушить докер
- перенести папку с данными в фс linux и сменить в конфиге volumes (указать новый путь)
- поднять докер
И тут в бд таблиц нет (
Не подскажите как вернуть таблицы? -
Посмотри в контейнере, вдруг ты данные там оставил?
Можно проверить, откатив твои изменения, на пример. -
Та данные (data папка) и конфиги точно перевёз.
Ну попробую откатить. :) -
Сервер убивает процесс потому что кх это карьерный экскаватор который не может работать в маленькой песочнице. Для того чтобы сделать простейший селект нужно выделить множество буферов для каждой колонки чтобы очень быстро во множестве потоков распаковывать колонки.
То что кх может стартовать с 1гб памяти, не значит что он может работать. Если вы почитаете доку там написано что памяти рекомендуется минимум 16, ещё лучше начинать с 64.
Попробуйте max_threads=16,max_block_size=1000 -
ок, спасибо попробую. а то голову ломаю. он у меня в песочнице делает все что мне надо, вот только забрать накопанное не могу никак, даже в периоды когда все остальные процессы спят
-
Я правильно понимаю, это:
r = client.execute("SET max_threads=16, max_block_size=1000")
один раз перед всеми селектами? -
Либо в селекте в секции SETTINGS, если это питоновский драйвер то туда можно отдельно передать с ключом client.execute('SELECT... ', settings={'max_threads':16})
-
-
не помогло.. как же забрать данные, хмм..
-
-
Ну очки норм задизайнил, куда писать
- 05 December 2022 (178 messages)
-
Human: explain what this SQL does
SELECT arrayFilter( (z,x) -> not arrayExists(i -> x%i=0 and x<>i, r) , (arrayMap(z->z+2, range(20))) as r,r)
AI: This SQL statement uses the arrayFilter and arrayMap functions to check for prime numbers in a range from 0 to 20, as well as the arrayExists function to determine if the number is prime. Specifically, it uses the arrayFilter function to filter all numbers that are divisible by any other number besides itself and 1 within the range of 0 to 20. The arrayMap then adds two to each number in the range. Finally, the resulting array is compared to the original range, and the primes are returned. -
да я тоже видел как код AI пишет, немного офигел
https://www.reddit.com/r/rust/comments/zckt2r/openai_speaks_rust_knows_about_crates/OpenAI speaks Rust, knows about cratesSo there's all this hype about [ChatGPT](https://chat.openai.com/), the AI chatbot from OpenAI. People are using it to solve the advent of code...
-
Всем доброе утро ! Подскажите, каким образом и можно ли в ClickHouse реализовать прохождение по массиву с изменением его элементов ? arrayMap создает новый на базе старого, но нельзя обратиться к прошлым индексам нового массива для реализации алгоритма, как и не позволяет осуществлять присвоение элементам старого.
-
ну никак по обоим пунктам.
иногда можно придумать как сделать новый массив посчитав каждый элемент без аккумулятора (без обращения к предыдущим элементам). -
Понял-принял, благодарю !
-
это не с первого раза или какие-то настройки были дадены? У меня на твой пример оно какую-то фигню пишет, до простых чисел не додумалось.
-
я фигню всякую спрашивал до этого
https://pastila.nl/?007be465/d3de5a95c5bfbc14bac3e15963ce7506 -
кстати по русски ответы тоже внятные весьма
-
Human: Продолжи сказку, жил был маленький Кликхауз очень жадный до памяти.
AI: А вот и сказка. Жил-был маленький Кликхауз, которому было необходимо больше памяти, чтобы делать идеи более высокоэффективными и простыми -
И - тормозил?!
-
из фигни он понял что ты интересуешься кликхаусом. По запросу "explain what this clickhouse SQL does" с первого раза додумывается до простых чисел. Ну что-ж, мы находимся здесь - AI теперь не сказки журналистов, а реальность с которой нам жить.
Но в данном случае есть надежда, что это очередная поисковая система, которая нашла ответ тут - https://github.com/ClickHouse/ClickHouse/issues/17932#issuecomment-741765784 -
А где-то можно тоже с ним пообщаться?
-
прочитайте вот это - https://www.engraved.blog/building-a-virtual-machine-inside/ - и там есть ссылка на GPT3.5 (?) которая еще чуть дальше ушла.
explain what this clickhouse SQL does SELECT arrayFilter( (z,x) -> not arrayExists(i -> x%i=0 and x<>i, r) , (arrayMap(z->z+2, range(20))) as r,r)
It creates an array of numbers from 2 to 21 by using the range(20) function, which returns an array of consecutive integers starting from 0 and ending at the specified number (in this case, 20). Then it adds 2 to each element in this array using the arrayMap(z->z+2, range(20)) function, which applies the provided lambda function (in this case, z->z+2) to each element in the given array (in this case, range(20)). This results in an array of numbers from 4 to 23.
It filters this array using the arrayFilter function, which takes a lambda function and an array as input, and returns a new array containing only the elements for which the lambda function returns true. In this case, the lambda function is (z,x) -> not arrayExists(i -> x%i=0 and x<>i, r), which checks whether the given element (x) is not a prime number. The arrayExists function is used to check whether the element is divisible by any number other than itself (i.e. whether it has any factors other than 1 and itself), and the not operator is used to negate the result (so that the lambda function returns true only for prime numbers).
The resulting array of prime numbers is then returned by the SQL statement. -
Ну получается Denny получил свой код через ИИ ....
-
-
-
поменять имя базы в запросе создания матвью
https://clickhouse.com/docs/ru/sql-reference/statements/alter/viewВыражение ALTER TABLE … MODIFY QUERY | ClickHouse Docsalter-modify-query}
-
вью у меня создавались без имени базы
CREATE MATERIALIZED VIEW IF NOT EXISTS view_name FROM table_name -
ну так имя базы то все равно использовалось и для таблицы источника, и для таблицы назначения, и для самого матвью
имена всех баз можете через SHOW CREATE VIEW посмотреть, там скорее всего для таблиц старое имя базы, тогда надо просто пересоздать матвью с новыми именами бд -
пересоздавать, я не помню ни одного механизма ребута MV
-
-
Здравствуйте, подскажите можно как-то проверить, что дата "пустая", кроме как вот таким сравнением?
-
-
спасибо, не знал о такой фишке
-
-
-
toDateOrNull попробовать
-
спасибо
-
а переименовать их можно? создать бд с старым именем, переименовать вьюхи в новую, удалить старую бд еще раз
-
Понял, спс
-
механизма переименования для MV вроде бы нет (поправь меня, @den_crane, если я что-то не так говорю). Если же не хочется прям делать через инструкции show create, то можно поступить способом следующего типа (при наличии datagrip и подобных ей ide):
show concat(database, '.', name) table_path, engine, create_table_query from system.tables where engine = 'MaterializedView' + добавляете свою фильтрацию на базу и таблицу
и копируете create_table_query. Как еще один из вариантов, - это скриптос на python, который автоматизирует работу с MV -
Всем добрый день.
На сервер с кликхаусом примерно 300 запросов в сек идут запросы. в таблице 600 млн элементов.
запросы отрабатывают быстро 0,01 сек примерно.
но бывает примерно через 2-7 сек возникает спонтанная задержка примерно для 30-60 запросов которые подвисают до 1-3 сек
например выполняя запрос на самом сервере ответ быстрый
20 rows in set. Elapsed: 0.009 sec. Processed 15.16 thousand rows, 181.93 KB (1.68 million rows/s., 20.13 MB/s.)
но в момент задержки
20 rows in set. Elapsed: 1.436 sec. Processed 14.95 thousand rows, 179.35 KB (10.41 thousand rows/s., 124.86 KB/s.)
запрос один и тот же. только в обычном состоянии скорость 20.13 MB/s а в момент подвисания снижается до 124.86 KB/s.
на сервере установлена куча метрик, CPU память, сам кликхаус и многое другое только проблемы никак не корелируются с появляющимися тормозами.
Может кто подскажет в какую сторону смотреть? -
кстати вопрос, у меня с MV случилось странное, сделал такую вьюху
CREATE MATERIALIZED VIEW sparkts_m (`ts` DateTime, `cnt` UInt64)
ENGINE=MergeTree() ORDER BY ts AS
SELECT DATE_TRUNC('second', toDateTime(sparkTS)) AS ts, COUNT(*) AS cnt
FROM mpsiem GROUP BY DATE_TRUNC('second', toDateTime(sparkTS));
данные полились, решил сверить
select count(*) from mpsiem where date_trunc('second',sparkTS) = toDateTime('2022-07-19 23:06:01'); дает 114 записей
select * from sparkts_m WHERE ts=toDateTime('2022-07-19 23:06:01'); дает десятки записей в большинстве которых cnt равно 100000
как будто записи плодятся сами по себе
select sum(cnt) from sparkts_m WHERE ts=toDateTime('2022-07-19 23:06:01'); вместо 114 дает под миллион
чем может быть это вызвано? -
я бы начал с таблицы system.query_log
там находите запросы и смотрите через поля ProfileEvents, там может быть ответ на вопросы -
спасибо поищу
-
вот тут пример как использовать эти поля
https://kb.altinity.com/altinity-kb-useful-queries/query_log/Handy queries for a system.query_logHandy queries for a system.query_log.
-
1. Движок не тот посмотрите в семействе MergeTree был движок с суммой, что то вроде SummingMergeTree
2. Матвью не обновляет старые данные, а производит агрегацию на каждую новую порцию данных. попробуйте добавить в конец запроса final или проводите optimize table - хотя это не очень хорошая практика -
-
с ним с чем?
-
-
и final тоже делали?
-
-
-
-
Добрый день. Подскажите, как подсчитать накопительную сумму уникальных строк от даты1 (общая для всех) до даты2 (каждая из списка дат), имея в качестве источника столбцы 'дата' и строка. Итого будут строки 'дата2' и 'число уникальных строк за период дата1-дата2'. Напрашивается какой-нибудь цикл по датам с условием выборки по датам и уникальным строкам.
-
можно через массивы, тут пример есть вроде подходящий
https://kb.altinity.com/altinity-kb-queries-and-syntax/cumulative-unique/#using-arrays -
-
ProfileEvents и normalized_query_hash отсутствуют у меня в system.query_log
либо старая версия кликхауса либо гдето надо включить их? -
-
CREATE TABLE system.query_log (type Enum8('QueryStart' = 1, 'QueryFinish' = 2, 'ExceptionBeforeStart' = 3, 'ExceptionWhileProcessing' = 4), event_date Date, event_time DateTime, query_start_time DateTime, query_duration_ms UInt64, read_rows UInt64, read_bytes UInt64, written_rows UInt64, written_bytes UInt64, result_rows UInt64, result_bytes UInt64, memory_usage UInt64, query String, exception String, stack_trace String, is_initial_query UInt8, user String, query_id String, address IPv6, port UInt16, initial_user String, initial_query_id String, initial_address IPv6, initial_port UInt16, interface UInt8, os_user String, client_hostname String, client_name String, client_revision UInt32, client_version_major UInt32, client_version_minor UInt32, client_version_patch UInt32, http_method UInt8, http_user_agent String, quota_key String, revision UInt32, thread_numbers Array(UInt32), os_thread_ids Array(UInt32), ProfileEvents.Names Array(String), ProfileEvents.Values Array(UInt64), Settings.Names Array(String), Settings.Values Array(String)) ENGINE = MergeTree PARTITION BY toYYYYMM(event_date) ORDER BY (event_date, event_time) TTL event_date + toIntervalDay(5) SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1
-
-
version 20.1.4.14 (official build)
-
да ProfileEvents нашел а вот normalized_query_hash где брать?
-
-
это просто поле, чтобы объединить семантически одинаковые запросы, литералы там могут быть разные
-
просто запрос приведенный Вами на странице ругается на отсутсвие этого поля
-
ну я говорю, что этот запрос делает топ самых тяжелых запросов с разными метриками
можете убрать группировку, сделать фильтр по дате, когда были ваши запросы и просто раскрыть ProfileEvents без sum, тогда у вас будут все метрики для каждого запроса по отдельности
что-то типа такого
https://pastila.nl/?005d86e3/0318ef431f8ffa64ee9beb03c6a2398e -
ага я понял, спасибо
-
-
Круто, спасибо!
-
но всеравно было бы интересно добавить такое вот поле которое объединяло бы одинаковые запросы.
-
-
да уже поставил задачу
-
Добрый день! Подскажите пожалуйста, как поменять тип данных в ключевом столбце со стринг на int
-
Никак
-
☹️ получается нет обходных путей?
-
есть конечно - создать новую таблицу и скопировать данные через insert select
-
-
Привет! В строковом поле содержатся как строковые значения типа "тестовая запись" так и интовые типа 843953537 нет ли возможности написать селект, который бы доставал только интовые значения?
-
-
спасибо! буду пробовать
-
select toUInt64OrNull(string) as i from table where i is not Null;
-
листал доку, наткнулся на это
мб эти функции завезены, но я сомневаюсь, хотя попробовать стоит
https://clickhouse.com/docs/ru/sql-reference/functions/string-functions#normalized-query-hashФункции для работы со строками | ClickHouse Docsfunktsii-dlia-raboty-so-strokami}
-
Спасибо!
-
Пытался пересчитать конкретный день в таблице ReplicatedMergeTree (партицирована по событиям).
Делал ALTER TABLE table ON CLUSTER cluster DELETE WHERE ... , затем делал INSERT
Сначала вставилась половина данных, после повторения операции данные вообще не вставились.
Думал, что не закончилась мутация, подождал несколько часов, делал OPTIMIZE TABLE ... FINAL, в итоге через 12 часов данные в таблице так и не появились.
Пришлось создать новую таблицу и перезаписать в нее старые данные и добавить новые.
Почему так может быть? Почему INSERT может не вставлять записи в таблицу? -
-
здравствуйте, подскажите что за фокус?
Вычисляю колонку в with и к ней нельзя обратиться больше одного раза в select
получаю ошибку.
Если один раз обращаюсь - всё ок -
Звучит странно
-
У вас запятая стоит в конце, уберите её
-
более чем)
могу заморочиться скинуть сюда пример -
там дальше 1чка
-
там единичка после нее
-
-
это не причина проблемы)
-
-
А если без with , будет работать ?
-
Рестарт кх помогает?
-
-
Sho create table для всех объектов показывает старое имя базы где-то?
-
Insert Deduplication / Insert idempotency
Insert Deduplication / Insert idempotency , insert_deduplicate setting.
-
в таблицах все норм, а вот в materialized view
CREATE MATERIALIZED VIEW new_db.all_events_v
TO old_db.all_events
(
...
AS SELECT
...
FROM old_db.e_stream
... -
Какой движок у mpsiem?
-
Distributed
-
Ну пересозлавайте mv.
-
А в таблице в которую пишет distributed?
-
А почему могут новые ивенты не писаться в таблицы?
-
-
в первом или втором случае?
-
-
Так имя базы неправильное
-
все у вас сделано неправильно. почему движок нерепликейтид у таблицы с мат.вью? Зачем вы в мат. Вью читаете из distributed?
Но причина скорее всего в том что вы повторяете инсерты в distibuted таблицу -
-
Вот именно
-
Всем привет. Подскажите, пожалуйста, есть ли возможность в КХ сделать табличную функцию? По подобию в t-sql. Где ты передаешь параметр, и по нему из другой таблицы в КХ получаем определенное значение?
В документации не нашла что-то подобного. -
Нет
-
Да, нашла на ГитХабе задачу закрытую с тем же вопросом. Действительно - table-valued функции не поддерживаются.
Спасибо -
табличную функцию нельзя, но можно сделать параметризованное view https://kb.altinity.com/altinity-kb-queries-and-syntax/altinity-kb-parameterized-views/
-
external dictionary source=direct ?
-
Я подготовил тестовую кверю
можете попробовать -
это баг, но исправлять его не будут.
он самопочинится когда-нибудь (с выходом нового аналайзер) -
Эххх)
-
Добрый день! Помню уже было но вылетело из головы
есть множество строк с повторяющимися данными но радными датами. Как выбрать ту которая с максимальной датой без подзапроса? -
кстати если обернуть в materialize, то работает
SELECT
toTypeName(bag_field) as type,
materialize(bag_field) as rrr,
materialize(bag_field) as bbb,
1 -
Оо, спасибо)
-
в смысле идентификаторы одинковые значения разные нужно крайнее значение
-
argMax(data_column, version_column)
-
-
А в mv заведётся с materialize?
-
спасибо
-
не знаю, на самом деле with вам не нужен.
в КХ можно и нужно объявлять алиасы в любом месте.
select otherFunc(someFunc() as X) as Y, someFunc1(X), someFunc2(Y)... -
-
Вот так ругается
CREATE TABLE IF NOT EXISTS mnemohuman.a07f6bbe45ef94c7dba329457fc2364be ("status" String, "f7b77656-f771-41ab-87b8-90749e8877af" String, "author" Int32, "id" UUID, "pc" String, "ts" DateTime(), visit_id Int8) ENGINE = ReplacingMergeTree ORDER BY id,author SETTINGS min_bytes_for_wide_part = 0 -
скобок нет ORDER BY ( id,author )
-
-
а как-то без tuple можно?
мока так, но придется разворачивать -
select
argMax(tuple(lid.device_id,lid.loyalty_id,lid.base_phone,created_at),
created_at) -
order by date desc limit 1 by id ?
-
или select argMax(tuple(*), created_at)
-
о, точно же
-
>мока так, но придется разворачивать
а в смысле untuple не хочется -
))
-
Добрый вечер)
Подскажите, пожалуйста, как правильно поступать.
Имеем 4 таблицы, в эти таблицы данные летят с разных компонентов системы, хотим объединять все 4 таблицы в одну, а потом строить графики.
Как бы мы джойны не крутили, как данные не фильтровали, но в выборках за пару дней наш запрос отъедает 45гб ОЗУ.
Собственно вопрос, как в таких ситуациях поступают? Или надо все переделывать и писать со всех компонентов в одну таблицу?)))
Заранее спасибо!) -
Сами задали вопрос, сами на него ответили, зачем знак вопроса поставили - непонятно.
-
сколько у вас данных то если 45Гб за пару дней отжирает?
-
-
ну я сначала хотел узнать.)
на самом деле все выбросить и переделать будет оч сложно, надеюсь найти решение с тем как силами кликача обработать 4 таблицы -
а что в этих 4 таблицах?
все четыре это ивенты но разных типов или это таблица с ивентами и 3 таблицы справочники? -
Разные типы эвентов, то есть сильно разные наборы полей
-
-
Шардов пока нет, но вообще хотели бы, наверное
-
Нет
-
-
так обманул слегка, таблиц 3.
все таблицы содержат messageId и по этой колонке клеим сначала две таблицы inner joinом, потом результат клеим с третьей таблицей. -
-
-
-
фильтры вы же прям в подзапросы прокидываете? данных в таблицах равномерно? я бы делал так
SELECT FROM
(
SELECT
FROM default.AAAA
) A
INNER JOIN
(
SELECT
FROM default.BBBB
) B
INNER JOIN
(
SELECT
FROM default.CCCC
) C
при этом данных меньше всего должно выгребаться из C и больше всего из A. на сколько я помню клик правую часть держит в памяти полностью -
-
-
-
сложно сказать, я не могу ваши данные покрутить) варианты куда поковырять прежде чем придумывать самолёт с одной широкой таблицей есть
-
можете прикинуть/посмотреть, в какой из таблиц после фильтров остается меньше всего данных и в остальных подзапросах добавить к фильтрам еще условие:
where cityHash64(messageId, deviceId) in (
select cityHash64(messageId, deviceId)
from default.XXXX
where ...
group by cityHash64(messageId, deviceId)
) -
с тем же шардированием если будете думать, то подумайте как одинаково + равномерно все таблицы шардировать, т.е чтобы все таблицы можно было спокойно джоинить в рамках одного шарда, в таком случае можно будет делать distributed_product_mode = 'local' + distributed_group_by_no_merge = 1|2
-
-
если все источники ивентов дают вам общий id, то можно все сделать без join на AggregatingMergeTree. Сделайте одну широкую таблицу order by id с полями SimpleAggregateFunction, и лейте данные из каждого источника в эту таблицу. Там есть некоторая сложность с подбором подходящих функций аггрегаций для каждого столбца, но вопрос в приницпе решаемый. В самом крайнем случае придется применить AggregateFunction(argMax,Nullable(...),DateTime)
-
проблема в том что я не могу изменять источник, надо много команд потревожить, можно как-то из таблицы в таблицу перегонять данные? например по крону? нам не столь важно иметь в реалтайме данные
-
А сами эти 3 таблицы менять можете? order by какой у них? Если тот самый id, то можно попробовать join_algorithm = 'full_sorting_merge'
-
-
-
-
только учтите, что full_sorting_merge требует 22.10 (9?) для нормальной работы
-
-
тогда воспользуйтесь советом Константина - вешайте MV на каждую из 3-х таблиц, и сбрасывайте все данные в одну AggregatinMT, как я описал выше. Никого не потревожите, но добавите рисков потерь.
-
-
Круто, спасибо всем большое!
-
Доброй ночи. У меня при выборе SELECT citry выдает латиницей города. Подскажите вариант решения на уровне SQL ? CASE? или есть более эстетичное?(Через словарь, который например может тоже запрашиваться из другой БД СLickHouse ) Создал словарь CREATE DICTIONARY dict_ip2loc_city
(
`ipstart` UInt32,
`ipend` UInt32,
`cntaddr` UInt64,
`mask` UInt8,
`prefix` String,
`country_code` String,
`country` String,
`province` String,
`city` String,
`lon` Float32,
`lat` Float32
)
PRIMARY KEY prefix -
Ну выдает латиницей и выдает. Неплохой вариант. А как надо то? На русском?
Если все что вам надо это конвертнуть 10-20 названий из какой-то строки (и вы задумываетесь про case), то хороший путь это функция transform - https://clickhouse.com/docs/en/sql-reference/functions/other-functions/#transformx-array_from-array_to-default
Если же у вас все города мира, то таки-да - кладите их в табличку и делайте словарь. -
Словарь на весь мир ещё поискать надо.
-
-
-
Вы пытаетесь донести какую-то свою боль считая её очевидной. Каким образом iso code по вашему должен быть связан с названием города?
-
У maxmind вроде есть локализация на русский, вы не их данными пользуетесь?
-
Я нет, бэкенд, который отливает мне данные - видимо да, но на латинице без кирилицы. Но, не в моей власти изменить на кирилицу. Подумал создать второй словарь с ключом на первый в латинице ... но, тут я "приуныл" )
-
Попросите чтобы вам отдавали и на русском тоже
-
Я хочу сложный путь )
-
Хотя бы пусть колонку cityId в формате geoname id выгружают, тогда можно маппинг сделать по открытым данным отсюда http://www.geonames.org/
-
Скачайте словарь maxmind версии free и сделайте себе маппинг en-ru, а дальше как планировали сделать второй словарь
-
- 06 December 2022 (144 messages)
-
спасибо за ответы!
-
Добрый день. Подскажите пожалуйста - как добавить колонку в таблицу с движком EmbeddedRocksDB?
-
Привет! Для уточнения. Правильно ли я понял, что для того, чтобы удалялись дубли, нужно обновиться на 22.11, и использовать min_age_to_force_merge_on_partition_only=true, опцию, а не только min_age_to_force_merge_seconds на 22.10 ?
Пробовали на 22.10 только с первой опцией, и ничего не сработало. Дубли не удалились. -
-
-
Добрый день!
как в КХ решается такая задача?
SELECT tr.*
FROM tr
JOIN tr2 on tr.uid = tr2.uid and tr.age > tr2.age; -
Секция JOIN | ClickHouse Docs
select-join}
-
Добрый день! Вероятно тут будет полезно немного рассказать о топологии таблиц, участвующих в джойне( распределенные они или нет, какой ключ распределения) + привести пример запроса, чтобы понять как ключ распределения(если есть) коррелирует с условием в джойне и полями группировки
-
А разве условия типа больше или меньше не должны быть в секции WHERE?
-
спасибро, слона то я и не заметил )
-
в обычном случае должны
но не всегда это подходит
да и дороже -
"спасибро" - а это "спасибо бро" или "спаси бро":) Понравилось слово:)
-
:)) первое
-
таблицы в разных базах данных
поля для пересечения uint64
```
SELECT
p.a,
p.b,
l.a
FROM
db_49985.table as p
inner JOIN (
SELECT
l.a,
l.ch64
FROM
(
SELECT
COUNT() AS a,
ch64
FROM
db_18665.table l
WHERE
b > 1
GROUP BY
ch64) as l ON
l.ch64 = p.ch64
WHERE
p.b = 100
LIMIT 100
```
запрос примерно вот такой -
-
WHERE
b > 1
GROUP BY
ch64 HAVING b = 100
AS l WHERE p.b = 100
тут несколько странно написано. потеряны скобки? зачем в принципе b в HAVING если вы его уже задаете в WHERE? и зачем ещё раз WHERE p.b = 100? -
-
-
-
-
-
-
кто-0нибудь знает что-то про MaterializedMySQL? ее уже можно в какой-то приемлимом виде использовать?
-
как же вы любите select внутри select... Ну разбейте вы это дело на 3 подзапроса в cte - и отладка будет проще в разы.
with
q1 as (select....),
q2 as (select....)
select .. from q1 inner.... q2 -
-
ну я, например, за годы пользования КХ привык что CTE не работают нормально и подзапросы это clickhouse way)))
-
bf78aad018b0 :) select date, formatReadableSize(tx) as tx, formatReadableSize(rx - Pastebin.com
Pastebin.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.
-
так CTE в clickhouse это просто именованный подзапрос и разницы в работе не должно быть. Нет ?
А так да, для отладки CTE удобней -
Коллеги, подскажите вопрос новичка - сделал таблицу StripeLog, записал данные а select попеременно возаращает разные данные. (видимо из разных 4х нод). Это я записал неправильно или выбираю неправильно?
-
-
нужны: описания движков таблиц, есть ли поверх distributed, как вставляли, как селектили, конфигурация кластера - тогда можно будет дальше гадать
-
-
4 пода:
2 шарда и 2 реплики
CREATE TABLE default.Document
(
.......
)
ENGINE = StripeLog
COMMENT 'Документы';
импорт csv файла через dbeaver с дефолтными настройками. -
стоит балансер перед кх? chproxy?
-
-
о оно. гранд мерси!
-
а нет. не оно. все равно не выдал все таблицы. (
-
Спасибо!
Первое, правда, судя по документации не рекомендуется для миграции (из-за большого потока данных)
Второе выглядит как то, что нужно! -
а покажите тогда селект, который возвращает разные данные
-
SELECT * FROM default.Document ORDER BY DateUpdate
-
-
-
да вот мне подсказывают, что это балансир постоянно кидает на разные поды и как собрать данные воедино - непонятно
-
поменяйте движок таблиц на MergeTree, поверх сделайте Distributed
-
-
-
Ща
-
Всем привет.
Коллеги, подскажите, возможно ли через ODBC https://clickhouse.com/docs/ru/engines/table-engines/integrations/odbc/
Из кликхауса настроить insert в MSSQL БД?
Если судить по задачам на гитхабе и в документации, то работает он работает для КХ только на Импорт, но не на Экспорт. Верно понимаю?ODBC | ClickHouse Docstable-engine-odbc}
-
тут первое, что напрашивается сделать, так это для первой таблицы тоже подзапрос с условием WHERE p.b = 100
написать и поведение станет более предсказуемым
+ тут есть проблема с алиасами в запросе:
когда внутри запрос:
SELECT
COUNT() AS a,
ch64
FROM
db_18665.table l
WHERE
b > 1
GROUP BY
ch64
то правильнее будет написать l.b > 1, если хочется отфильтровать по полю b из таблицы db_18665.table -
Добрый день!
В кликхаусе есть возможность создать иерархические словари
https://clickhouse.com/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-hierarchical/
При их использовании я столкнулся с проблемой, что у одного потомка может быть только один родитель!
т/е случай с регионами работает нормально:
0 (Common parent)
│
├── 1 (Russia)
│ │
│ └── 2 (Moscow)
│ │
│ └── 3 (Center)
│
└── 4 (Great Britain)
│
└── 5 (London)
а случай с семейным древом не работает:
0 grandFather1
│
├── 2 father ──────┐
│ │
1 grandMother1 │
│
├── 6 child
│
3 grandFather2 │
│ │
├── 5 mother ──────┘
│
4 grandMother2
и для 6 child формируется только одна случайная связь, то же самое происходит для каждого из его прямых родителей 2 father, 5 mother
Мне требуется по таким деревьям перемещаться обычно сверху вниз, например ищу всех детей для узла.
Может кто-то сталкивался с подобными ситуациями и может поделиться опытом?
В моем случае кол-во узлов в графе от 100К до 1М.
Глубина графа динамическая и может быть от 2 до 30.Hierarchical Dictionaries | ClickHouse DocsClickHouse supports hierarchical dictionaries with a numeric key.
-
-
#вакансия #DBA #ClickHouse
Вакансия: Администратор баз данных ClickHouse
Компания: Wildberries
Формат: удаленка или гибрид
ЗП от 300-400 net;
Команда Антифрод-решений занимается поиском/анализом пользовательской информации на предмет возможных мошеннических/аномальных действий на маркетплейсе.
Основная цель - вычленить негативные сущности (пользователей, поставщиков, изображения) и одним из методов обезвредить их.
📌 Задачи:
• Администрирование, оптимизация, автоматизация БД;
• Мониторинг БД; Резервное копирование и восстановление, управление правами доступа;
• Участие в расширении технологического стека;
• Написание базы знаний о БД.
📌 Требования:
• Опыт работы с БД Clickhouse;
• Опыт работы с высоконагруженными БД и большими по объему БД;
• Знания принципов работы СУБД, схем баз данных, запросов, индексов;
• Опыт работы с системами мониторинга.
Контакты:
- Телеграмм: @K_katerina73
- Почта: kiseleva.e23@wb.ru -
Привет всем! Подскажите пожалуйста, может кто сталкивался. При запуске N параллельных запросов их скорость деградирует в несколько раз. Загрузка по CPU, памяти, диску и iops меньше чем 50%.
Для теста запускал один тяжелый запрос в 10 потоков. -
Ну да, ожидаемо для Clickhouse
-
Подскажете чем это может быть вызвано? И можно ли с этим что то сделать
-
По дефолту для запроса кх использует половину ядер, вот и считайте так сказать что будет если их 10
-
А как это кстати мониторить? Смотреть cpu wait?
-
а можете ссылку на это в исходниках закинуть? чтобы более подробно вопрос изучить
-
SELECT * FROM system.settings WHERE name = 'max_threads';
-
Спасибо! В таком случае это не должно отображаться в виде высокого CPU Utilization или LA? Такое ощущение что CH не очень оптимально утилизирует ресурсы.
Имеет ли смысл редактировать параметр max_threads, или процессорное время будет и так справедливо делиться. -
В таком случае это не должно отображаться в виде высокого CPU Utilization или LA?
Должно, скорее вы все таки во что то да упираетесь.
> Имеет ли смысл в таком случае редактировать параметр max_threads, или процессорное время будет и так справедливо делиться.
Если у вас очень много легких запросов (или просто параллельных) бывает смысл выкрутить max_threads в 1, тогда можно выжать 10-20% QPS -
48 ядер с гипер трейдингом. Десятки параллельных маленьких запросов и единицы параллельных аналитических (2-8 qps).
-
Ну для маленьких запросов можете поставить max_threads в 1
-
Попробуем, спасибо!
-
-
Felixoid - Overview
Russian Hydrometcenter → Yandex LLC → Yandex.Market Lab LLC → InnoGames GmbH → LINK Mobility GmbH → ClickHouse Inc. - Felixoid
-
(Вангую, что это он @Felixoid)
Насколько я вижу, сейчас собирается любая версия кипера с конкретным бинарником:
https://github.com/ClickHouse/ClickHouse/blob/master/docker/keeper/Dockerfile#L31
https://github.com/ClickHouse/ClickHouse/blob/22.10/docker/keeper/Dockerfile#L31
https://github.com/ClickHouse/ClickHouse/blob/22.9/docker/keeper/Dockerfile#L31
https://github.com/ClickHouse/ClickHouse/blob/22.8/docker/keeper/Dockerfile#L31
С одной и той-же версией 22.4.1.917
В докер-хабе тоже самое: https://hub.docker.com/layers/clickhouse/clickhouse-keeper/22.9.6-alpine/images/sha256-ce7b538862e1e2c667dd00d384dcdc1f853c928e3f61108d158c7a6357d5bc36?context=explore
Ты говорил что у тебя берутся разные бинарники из артефактов сборки. А можешь показать где это делается, а то я не могу понять механизма
(и да, если что - я готов уйти в личку если это тут оффтоп)Felixoid 🚜🇩🇪Гоблин без страны, зато с богатым багажом опыта.
-
Привет!
Подскажите, пожалуйста, если кто-то встречался с подобным – буду безмерно благодарен.
При попытке ренейма колонки, участвующей в сортировке (DDL), вылетает вот такая ошибка (скрин – пытаюсь поменять регистр с id на ID).
Мб есть какой-нибудь действенный воркараунд? Гугл не помог( -
PRIMARY KEY поля нельзя в clickhouse трогать
воркараунд
новая таблица
и INSERT INTO new_table SELECT * FROM old_table -
Всем добрый день.
Пытаюсь настроить сбор данных их ClickHouse c NiFi. Прочилал документацию вот тут https://clickhouse.com/docs/en/integrations/nifi-and-clickhouse/
У меня по какой-то причине не проходит соединение в DBCPConnectionPool, ругается на учетку и ошибку AUTHENTICATION_FAILED.
Запрос курлом работает с этой учеткой.
Учетка только для чтения.
Может кто подсказать, куда нужно копать дополнительно?
ListDatabaseTables[id=07221abe-33cc-13d2-4ce4-55fa83aaabb8] Processing failed: org.apache.nifi.processor.exception.ProcessException: java.sql.SQLException: Cannot create PoolableConnectionFactory (Code: 516. DB::Exception: nifi: Authentication failed: password is incorrect or there is no user with such name. (AUTHENTICATION_FAILED) (version 22.5.1.2079 (official build))
, server ClickHouseNode [uri=https://HOSTNAME:8123/kuma, options={sslrootcert=/opt/nifi/nifi-current/conf/kuma/ca-cert.pem,sslcert=/opt/nifi/nifi-current/conf/kuma/cert.pem,sslkey=/opt/nifi/nifi-current/conf/kuma/private_pkcs8.pem,sslmode=STRICT}]@-1020150139)
- Caused by: java.sql.SQLException: Cannot create PoolableConnectionFactory (Code: 516. DB::Exception: nifi: Authentication failed: password is incorrect or there is no user with such name. (AUTHENTICATION_FAILED) (version 22.5.1.2079 (official build))
, server ClickHouseNode [uri=https://HOSTNAME:8123/kuma, options={sslrootcert=/opt/nifi/nifi-current/conf/kuma/ca-cert.pem,sslcert=/opt/nifi/nifi-current/conf/kuma/cert.pem,sslkey=/opt/nifi/nifi-current/conf/kuma/private_pkcs8.pem,sslmode=STRICT}]@-1020150139)
- Caused by: java.sql.SQLException: Code: 516. DB::Exception: nifi: Authentication failed: password is incorrect or there is no user with such name. (AUTHENTICATION_FAILED) (version 22.5.1.2079 (official build))
, server ClickHouseNode [uri=https://HOSTNAME:8123/kuma, options={sslrootcert=/opt/nifi/nifi-current/conf/kuma/ca-cert.pem,sslcert=/opt/nifi/nifi-current/conf/kuma/cert.pem,sslkey=/opt/nifi/nifi-current/conf/kuma/private_pkcs8.pem,sslmode=STRICT}]@-1020150139
- Caused by: java.io.IOException: Code: 516. DB::Exception: nifi: Authentication failed: password is incorrect or there is no user with such name. (AUTHENTICATION_FAILED) (version 22.5.1.2079 (official build))Connect Apache NiFi to ClickHouse | ClickHouse DocsStream data into ClickHouse using NiFi data pipelines
-
Понял. Спасибо за ответ)
-
запрос curl работает с этой учеткой запущенный внутри того же хоста \ контейнера в котором NiFi поднят?
-
нет, с соседнего хоста. С того же хоста, где развернут контейнер NiFI.
-
учетку создавал в sql: Create user. Ограничения на подсеть у неё нет. Есть ограничение, что эта учетка readonly.
-
а вам не 8443 порт нужен?
-
продукт настроен так. Выключен http интерфейс и включен только https интерфейс, но порт установили 8123 для него
-
а там нигде не надо выставить включение SSL явно?
jdbc:ch:https://HOSTNAME:8443/default?ssl=true
эта строка навела на мысль -
ну включен этот параметр
-
jdbc:ch:https://HOSTNAME:8123/kuma?ssl=true&sslrootcert=/opt/nifi/nifi-current/conf/kuma/ca-cert.pem&sslcert=/opt/nifi/nifi-current/conf/kuma/cert.pem&sslkey=/opt/nifi/nifi-current/conf/kuma/private_pkcs8.pem
Пробовал в url передать пользователя и пароль и в uri тоже
&user=nifi&password=XXX -
В логе клика вижу ошибки, видимо где-то не передается логин и пароль:
2022.12.06 14:05:27.662891 [ 1915109 ] {} <Error> Access(user directories): from: 172.20.21.8, user: nifi: Authentication failed: Code: 36. DB::Exception: Credentials required. (BAD_ARGUMENTS), Stack trace (when copying this message, always include the lines below):
2022.12.06 14:05:27.663099 [ 1915109 ] {} <Error> DynamicQueryHandler: Code: 516. DB::Exception: nifi: Authentication failed: password is incorrect or there is no user with such name. (AUTHENTICATION_FAILED), Stack trace (when copying this message, always include the lines below): -
Эта ошибка для любой проблемы auth одинаковая, чтобы не раскрывать детали проблемы интрудеру
-
Понятно.
Варианты закончились у меня )) Если только попробовать включить опять http интерфейс и так проверить -
У вас сертификаты лежат в /opt каталоге , я не уверен что jdbc такое умеет
-
#jobs #вакансия #ClickHouse
Привет!
Сейчас мы в поиске эксперта для усиления нашей команды ClickHouse в Ozon Tech.
В Ozon около 100 инсталяций ClickHouse. Есть кластер с объемом данных более 2.5 петабайт. Мы часто сталкиваемся с неочевидными проблемами, требующими понимания внутреннего устройства ClickHouse, принципов его взаимодействия с системным уровнем. Внутренней экспертизы не всегда хватает для решения подобных случаев.
🔹Нужно будет заниматься:
- Развивать инструменты и платформу управлениям кластерами Clickhouse;
- Обеспечивать отказоустойчивость кластеров в разных ситуациях (бэкапы, миграции, восстановление данных);
- Находить способы повышения производительности и отказоустойчивости кластеров, разбирать инциденты
🔹Что мы ожидаем от вас:
- Знание SQL и устройства БД, движков, индексов.
- Опыт работы с Git, Kubernetes, Docker, Kafka, Zookeeper, Ansible/Terraform/Helm.
- Понимание внутренностей Unix/Linux систем и инструментов отладки (strace и т.д.)
🔹Будет бонусом:
- Опыт работы с NoSQL базами данных;
- Знание методологии CI/CD
📲Контакт для связи https://t.me/Maria_OzonTechMaryIT рекрутер Ozon Tech 💚 Platform
-
судя по коду умеет.
options.put(ClickHouseClientOption.SSL_ROOT_CERTIFICATE, rootCaFile);
options.put(ClickHouseClientOption.SSL_CERTIFICATE, certFile);
options.put(ClickHouseClientOption.SSL_KEY, keyFile); -
SSL_MODE("sslmode", ClickHouseSslMode.STRICT,
"verify or not certificate: none (don't verify), strict (verify)"),
/**
* SSL root certificiate.
*/
SSL_ROOT_CERTIFICATE("sslrootcert", "", "SSL/TLS root certificates."),
/**
* SSL certificiate.
*/
SSL_CERTIFICATE("sslcert", "", "SSL/TLS certificate."),
/**
* SSL key.
*/
SSL_KEY("sslkey", "", "RSA key in PKCS#8 format."), -
А каким пользователь Линукс nifi запускается?
-
в контейнере 1000:1000. Права на JAR аналогичные
-
Я написал однострочник на джаве и попробовал без nifi
-
без ssl? Я думаю тут затык в том, что обязательно нужен ssl сертификат и логин и пароль.
Так как политика STRICT, то без ssl обрыв соединения идет. -
включил http для клика. Логин и пароль подходит, но теперь ошибка в другой части:
DB::Exception: Cannot modify 'max_execution_time' setting in readonly mode. (READONLY) (version 22.5.1.2079 (official build)) , server ClickHouseNode -
Видимо баг все же. По http все работает нормально, а с https проблемы с пользователем и паролем
-
Добрый вечер ! Вопрос такой: executable UDF, тип данных задан JSONCompact, poolsize скрипту поставил единицу, но CH все равно бьет на чанки запрос из базы данных и кусками по 16384 записи кидает на скрипт, вызывая его многократный запуск (что дает просадку по производительности), вместо отправки всего содержимого. Может знает кто, как заставить CH сразу весь объем данных кидать в UDF ? До смены формата на нативный/бинарный еще доберусь, понять бы тут логику. Или это ограничение stdin/out ?
-
Ну никак, КХ обрабатывает записи блоками.
-
Спасибо ! Значит в рамках текущих ограничений лавировать по оптимизации. Вопрос тогда другой - есть ли возможность прервать выполнение скрипта, если выполняется какое-то условие ? Аналог while/break
К примеру, у меня 2 миллиона многомерных массивов, но совпадение может быть условно в первых ста. Чтобы не обрабатывать последующие. -
каким образом? Скрипт должен для всех строк вернуть результат.
-
Ага, понял. В теории можно в рамках блока по 16384 записи в своей скрипте возвращать значение раньше, не выполняя вычисление для остальных. Условно при результате 1 для свех остальных отдать 0.
-
>но совпадение может быть условно в первых ста.
нет такого понятия первые сто. -
Для скрипта же есть своя логика. К примеру, произвести вычисление и получить значение дробное. Если единица, то 100% совпадение, дальше считать не нужно и можно возвращать результат, заполнив для всех остальных дефолтным значением.
Костыль, но все же. -
Писать результат работы скрипта в отдельное место, а в скрипт передать query_id и попросить его сделать kill query по условию)
-
Вообще интересный подход, но в данном случае не подойдет - вызов идет из вложенного селекта, parent не поймет такого ) Спасибо !
-
ALTER TABLE tbl_replica_local ON CLUSTER sharding_2shard_2repl
UPDATE val = dictGetString('temp_dict', 'enrichment_value', id) WHERE 1
А почему этот запрос вызывает такую ошибку на половине нод? При этом результата от нее нет совсем.
Code: 36. DB::Exception: ALTER UPDATE/ALTER DELETE statements must use only deterministic functions. Function 'dictGetString' is non-deterministic. (BAD_ARGUMENTS) (version 22.5.1.2079 (official build))
Делал опираясь на https://kb.altinity.com/altinity-kb-schema-design/backfill_column/
Что-то сообразить не могу... -
In case of a replicated / sharded setup you need to have the dictionary and source table (dict_table / item_dict) on all nodes and they have to all have EXACTLY the same data. The easiest way to do this is to make dict_table replicated.
In this case, you will need to set the setting allow_nondeterministic_mutations=1 on the user that runs the ALTER TABLE. See the ClickHouse docs for more information about this setting.
Внизу приписка -
Среди основ реляционных баз данных: порядок (хранения) строк значения не имеет
-
Это не про sql
-
слово deterministic ключевое,
оно не на половине реплик такое должно давать, а на всех.... ну и словарь должен быть одинаков
настройка есть, которая позволяет такое поведение сделать
просто у тебя будет проблема для недетерминируемых мутаций, что на выходе получатся разные данные и непонятно как это реплицировать... -
Так и мы речь не про реляционную базу данных ведем.
-
-
> настройка есть, которая позволяет такое поведение сделать
Она позволяет пропустить сейфти чек, а не сделать поведение. поведение ручками делать придется -
А про какую? Иерархическую что ли?
-
Да,
-
-
ну вообще не факт, если вдруг запрос из dictGet будет разное возвращать ... (небольшое расхождение в репликах на репликацию допустимо в distributed) то мутации на разных репликах разное будут делать и это плохо
и вообще если, ты собираешься эти мутации фигачить регулярно, ты встаешь на скользкий путь "творю с кликом фигню, для которой он слабо предназначен" =)
мутации для GDRP изначально делались, типа редкое удаление по запросу ... -
Вот у меня дата-инженеры хотят такой сценарий:
* раз в час например брать срез событий из клика, которые не обогощены еще
* дистинктом выдергивать из них уникальные идентификаторы
* по этим идентификатором из тругого медленного стораджа доставать данные
* после этого напихивать в клик во временную табличку эти данные, делать поверх нее справочник
* и в конце alter table local_table on cluster ... value = dictGet() where условие по дате за последний час.
Я подозреваю, что это потенциальная проблема, как ты говоришь, но детально не осознаю этого, т.к. не понимаю достаточно глубоко механику работы клика в этой части. Кажется тут переписывать будет только одна партиция и больно будет только если событий в партиции будет реально много больше часового объема.
Они начали это делать через joinGet, но он не работает с Distributed, ЕМНИП... -
Я сделал такую схему, чтобы не огрести с евенчуальной целостностью при репликации:
* завел кластер, которые без репликации
* С ним сделал табличку temp_dict_table_local
* сделал табличку на всех нодах temp_dict_table AS temp_dict_table_local ENGINE Ditributed
* поверх temp_dict_table (distributed) делаю словарик
CREATE DICTIONARY temp_dict ON CLUSTER sharding_4shard_1repl (
join_key UInt64,
enrichment_value String
)
PRIMARY KEY join_key
SOURCE(CLICKHOUSE(TABLE temp_dict_table DB 'heap'))
LAYOUT(DIRECT()); -
да это проблема, основная в том что миграции переписывают парты, полностью
соответсnвенно у тебя повышенная нагрузка на диск
плюс миграции конкурируют внутри за background_pool_size треды. максимум миграций одновременно 8 штук. можно тюнить но упираешься в итоге в диск...
не очень понятно почему у вас данные не обогащенные попадают в клик... почему нельзя обогощать до того как в клик вставите?
данные "медленном сторадже" появляются позже? насколько?
может быть лучше как то отследить что данные есть
и делать в клике вместо мутаций
INSERT INTO enriched_table SELECT *, dictGet() FROM not_enriched_table ? -
-
-
-
Если у вас таблица содержит в себе только id записей для обогащения, то несколько неожиданно, что вы решили её сделать distributed, а не replicated
С replicated будет проще жить на любом узле имхо, пока вы делаете этот ворэраунд...
Ну а вообще лучше обогатить данные до вставки -
речь про таблицу, которая под словарь используется?
-
вы скажите своим дата инженерам что нужно усилием вывернуть свое сознание, и подходить к базе с осознанием что данные immutable.
-
✅ Вы ищите сервис для флуда почт?
Рады вам представить сервис с удобной веб панелью и отличным инбоксом! Пробиваем GMAIL на УРА!📤
❓ Зачем нужен флуд почт?
Необходимо, чтобы кто-то пропустил очень важное письмо, которое должно прийти на email (будь это ваш конкурент, неприятель или вы просто решили подшутить над другом?)
💴 Стоимость услуги:
25рублей за 30 минут флуда (около 400 сообщений в инбокс)
❤️ Ссылка на сервис: FLOOD-STUDIO. COM (ПРОБЕЛ УБРАТЬ ПОСЛЕ ТОЧКИ)
БЕСПЛАТНЫЙ ТЕСТ!
🆗 Теги для продвижения:
email flood, email spam, email spam bot, bomb email, email bomber, mail bomb, email flooder, email floods, flood email, email flooding, email flooder online, flood-studio email bomber, flood-studio, flood email spam, email bombing, flooding your inbox, flooding inbox, spam inbox, spam bombed, online email flooder, email flooder online, email flooded with spam, email bomber free online, email bomb services, mail bomb killer -
Да, из которой словарь данные берет
-
Я еще не достаточно авторитетен в клике, чтобы так заявлять, хотя и понимаю это поверхностно, но теперь у меня есть повод ссылаться на этот тезис, т.к. он от экспертов.
-
> * по этим идентификатором из тругого медленного стораджа доставать данные
Насколько медленное? -
Это как-то ускорит (упростит) процесс? мне кажется нет.
Но т.к. репликация асинхронная, то подход с репликацией может не везде и не все данные обновить -
Hadoop
-
@banofbot
-
Мг
Вообще подобный подход (или модифицированный) имеет место быть.
Но как сказал denny желательно такое делать до кликхауса -
Упростит, потенциально можно вообще словарём не пользоваться, а просто работать с таблицей
И вовсе не делать delete, а обойтись только insert'ом, используя какой-нибудь replicatedcollapsingmergetree
Будете писать значения в таблицу с флагом 0 до обогащения, после обогащения записывайте сюда тот же id с флагом -1 и периодически делайте optimize -
Всем привет!
Подскажите, пожалуйста, про partition key - в документации противоречивая информация. С одной стороны, читаю и кажется что оно нам надо (низкая кардинальность партиций и во всех запросах будет явное условие по ней), с другой стороны явно написано - Don't partition your data by client identifiers or names. Что за client identifier тут? Имеется ли ввиду в документации конечный пользователь? Просто в нашем случае как раз напрашивается идея разделить данные по клиентам. Но клиент для нас - одна из немногих организаций, внутренние сотрудники которых пользуются нашим продуктом. Т.е. кардинальность таких партиций в самом лучшем случае на ближайшее время - десятки, в течении ближайших лет - сотни. И абсолютно подавляющее большинство запросов по аналитике будет в рамках одного конкретного клиента. Имеет ли в таком случае смысл партицирования по клиенту? -
Я тоже за это. Но настаивют. Буду выворачивать сознание коллегам 🙂
-
С оптимайзом и движками типа replacing и подобными тоже есть нюансы.
На самом деле таблица то у нас широкая. Это я просто на простых табличках эксперименты ставлю. -
Широкая после обогащения или до?
-
До. Там обогащается может 1% полей только
-
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.
-
если кратко используйте PARTITION BY
только если для ваших запросов будет работать partition prunning
то есть вставка всегда в одну или две партиции
чтение всегда из 1-10 партиций
всего партций на таблицу до пары сотен...
партиция это логическое разбиение дата партов по группам, парты из разных партиций между собой не мержатся после вставки -
спасибо большое!
-
>Просто в нашем случае как раз напрашивается идея разделить
>данные по клиентам. Но клиент для нас - одна из немногих организаций,
вот именно про это и написано. Десятки это слишком много.
https://youtu.be/DP7l6SwkskwClickHouse Meetup Amsterdam, June 8, 2022Slides: https://github.com/ClickHouse/clickhouse-presentations/tree/master/meetup59
-
Спасибо большое! Смутили немного примеры с партицированием по месяцам, там ведь несколько лет и уже тоже десятки ) Думаю тогда для нашего случая понятно, что не нужно партицированием усложнять, просто первой колонкой в order by клиента сделаем. Спасибо всем ещё раз
-
в кликстриме в любой день месяца там только одна партиция заливается, ну или две, но очень недолго
-
К сожалению, не знаю, что такое кликстрим 🤷♂
-
- 07 December 2022 (200 messages)
-
Дмитрий, словарь шардировал, но непонятно как его весь подтягивать к фактовой, а не с 1 шарда.
-
Что-то задумался с утра, а как Clickhouse работает в этом кейсе:
ALTER TABLE tbl_replica_local ON CLUSTER sharding_2shard_2repl
UPDATE val = dictGetString('temp_dict', 'enrichment_value', id) WHERE 1
Query id: b52cc0c1-49f1-4532-9804-bdb5d15ececa
┌─host─┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ s22 │ 9000 │ 0 │ │ 3 │ 0 │
│ s12 │ 9000 │ 0 │ │ 2 │ 0 │
│ s21 │ 9000 │ 0 │ │ 1 │ 0 │
│ s11 │ 9000 │ 0 │ │ 0 │ 0 │
└──────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
Тут s11+s12 - это две реплики одного шарда, s21+s22 - две реплики другого шарда.
Я делаю ALTER UPDATE. Судя по статусу команда успешно отрабатывает на всех нодах.
При этом если одни и те же изменения производятся на двух репликах одного шарда, то в последующем в логах я должен увидеть запись про дублирующие изменения?
Или клик производит изменения только в одной реплике, а от остальных просто получает безошибочный ответ? -
поставит запрос в ZK в distributed_ddl_queue
и выполнит на каждой реплике
ALTER TABLE tbl_replica_local UPDATE ... WHERE 1
ВСЕ ПАРТЫ на всех репликах будут переписаны, для каждой строки вызовется dictGetString во время переписывания...
если в temp_dict будут разные значения на разных репликах для id или не будет для каких то id вообще
получишь разные val на разных репликах и будет куча replication part fetches если таблица tbl_relica_local имеет engine ReplicatedMergeTree
в общем если данных дохрена =) кластер не лажет
но сама миграция будет копошиться в фоне ДОЛГО (8 тредов одновременно на каждой ноде под миграции) -
> будет куча replication part fetches если таблица tbl_relica_local имеет engine ReplicatedMergeTree
да, именно такой Engine. Правильно ли я понял, что в этом случае клик сделает так:
1. на всех 4ех нодах применит эту мутацию
2. по мере отработки мутации обе реплики будут перекрестно стягивать друг у друга изменения и тем самым переписывать только что изменившиеся данные, если они уже успели измениться на этой ноде.
Я исхожу из того, что dict у меня на всех нодах одинаковый, т.к. он построен на базе Distributed таблицы без репликации, в которой 4 шарда на 4ех нодах и данные записаны только на одной ноде, к которой подключился ETL процесс. Т.е. в этом плане мутации ожидаю одинаковые на всех нодах.
Про where 1 это у меня тесты. Разумеется на реальных данных там будет ограниченая выборка. -
-
-
Не правильно.
Во-первых, данные будут в кэше ОС.
Во-вторых, отсутствие кэша засечек - ситуация не совсем нормальная.
Полученный результат тестирования будет максимально бесполезен. -
спасибо!
А как бы вы поступили в данной ситуации. У меня для теста есть пока только одни запрос, а в будущем будет несколько десятков запросов -
можно clickhouse-benchmark использовать
-
А что именно хотите протестировать? Логически
-
как этот самый запрос будет работать, когда другие, на данный момент неизвестные запросы, будут нагружать кластер.
-
Что в вашем понимании значит "как запрос будет работать"? Что вы хотите увидеть, что сравнивать
-
Доброго времени суток,
Подскажите, пожалуйста, какие есть способы для переноса данных из одной таблицы в другую?
насколько мне известно select-insert не применим для больших таблицы и одним запросом это сделать не выйдет.
Имеется Distributed таблица и локальная, данные распределены на трех шардах.
Цель в том, чтобы добавить к новой таблице новые колонки и забить их нужными данными.
Подозреваю, что такой пайплайн не особо жизнеспособен: создать новую таблицу => перенести данные со старой => добавить нужные колонки => заполнить колонки -
подскажите, агрегатная функция any может выдать в качестве результата null?
при наличии в группе nul и not null значений? -
Отдельно стоит выделить, что ключ шардирования, primary key - не меняются, это такая же таблица, в которой меняются лишь часть колонок.
-
Наверное бы хотели, что бы кликхаус всегда читал данные с диска без кэша, то вот этот параметр это делает как я помню. То есть по идее ставите 1 и всегда Clickhouse будет читать с диска https://clickhouse.com/docs/en/operations/settings/settings/#settings-min-bytes-to-use-direct-ioSettings | ClickHouse Docs
allownondeterministicmutations
-
спасибо, вы правы, это то что мне нужно!
-
А почему вы считаете что это то что вам нужно? У вас никогда не будет горячих данных в кэше?
-
я думаю в бенчмарках, главное получить воспроизводимость результатов. Это хоть не полностью, но может помочь.
Иначе 1 запрос будет долгий .... У меня лично если включить настройку запрос работает 17 секуд, если выключить 1.4 секунды ... -
Тогда помимо вашего запроса нужно сделать запрос, достающий кучу данных, вымывающих кэш.
И замешивать их друг с другом.
Кажется, что так будет наиболее реалистично. -
будут.
Но, если при тестировании система будет работать медленнее, чем на проде, это же не так страшно -
Добрый день, столкнулись с проблемой при использовании executable словарей. Используем executable словарь с командой jq, для теста ошибок удалили ей и ожидали получить ошибку загрузки словаря в логах либо в таблице system.dictionaries, но в логах пусто, а статус словаря LOADED без ошибок. Нормальное ли это поведение? и как в таком случае ловить ошибки, что словарь перестал работать из за удаления какого либо пакета на сервере?
-
-
Ну по идее у вас запрос dictGet к словарю не выполнится
-
выполняется и пробует как раз загрузить словарь
-
Не верно. Измененные данные записываются заново, и в таблице лежит полный комплект данных, без всяких incrementals. Поэтому на скорость после не влияет. Но в процессе увеличивает нагрузку на диск.
-
Спасибо большое)
-
Всем привет. Может кто-нибудь знает, можно ли как-то встроенными средствами в клике партицию из одного шарда с "горячими" данными в другой с "холодными" перекидывать раз в месяц?
-
Привет, есть вопрос. На ClickHouse версии 20.5.4.40 ради интереса выполняю конструкцию on cluster (кластер состоит из двух машин) для реплицированных таблиц:
create table if not exists test_db.test_replica ON CLUSTER 'test_shard'
(
test_string String default ''
) engine = ReplicatedMergeTree('/clickhouse/tables/test_shard/{database}/{table}','{replica}')
order by test_string
settings index_granularity = 8192;
И получаю в ответ такое вот:
┌─host──────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ localhost │ 9000 │ 0 │ │ 1 │ 0 │
└───────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
И зависает при 49%. Окей, отменяю. При этом таблица создалась на двух машинах кластера, и со вставкой тестовой проблем нет. Насколько успела поресерчить тут, num_hosts_remaining - это сколько не выполнили задание нод (или машин). Но таблица создалась на двух машинах кластера. Это поведение норм или не норм, какие подводные камни имеются? -
There are N unfinished hosts (0 of them are currently active).
"There are N unfinished hosts (0 of them are currently active)."
-
Допустим, тогда стоит ли игнорировать в логах сообщение уровня Warning с текстом DDLWorker: ZooKeeper NONODE error during startup, зная при этом, что таблицы создались, и единственно верное решение - это обновление КХ?
-
DDLWorker: ZooKeeper NONODE error during startup
Это при старте кх? -
я про то что с чего вы взяли что вы правильно имитируете окружение системы? вероятно что на проде будет работать еще медленнее)
-
нет, при создании таблицы, при этом в system.zookeeper по query одна из веток в статусе waiting, другая finished, но на двух машинах кластера опять же, есть таблица.
-
Хм, ну есть issue на эту тему, и версия около вашей. (и она действительно довольно старая)
https://github.com/ClickHouse/ClickHouse/pull/9927#ref-commit-89037dfFix a race between DDLWorker and DDLWorkerClnr during startup by garneja · Pull Request #9927 · ClickHouse/ClickHouse… that causes DDLWorker to exit because of ZooKeeper NONODE error. I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Bug Fix...
-
Пасибо
-
ALTER TABLE xx FETCH PARTITION
-
я исхожу из того, что это будет худший случай, когда все запросы не будут совпадать по данным
дальнейшие тесты буду делать при разработке. Сейчас задача прикинуть конфигурацию кластра имея 1 запрос и зная кол-во пользователей, которые могут одновременно запускать запросы -
Это да, я думал может кроме этой команды можно где-то в конфигах задать и забыть.
-
Нет, такого нет
-
Привет всем.
Такой вопрос.
Предположим, у меня 20 пользователей параллельно что-то считают на ноде клика.
Я вижу на графике, что CPU под 80%.
Могу ли я сделать какую-то метрику, которая покажет какой вклад дает каждый пользователь? Чтобы на графике красиво строилась кривая для каждого? -
у меня гошный код выдает ошибку
"code: 170, message: Requested cluster 'xxx-qa' not found"
Кластер создается в конфиге на сервере?
Или при создании таблиц/баз это надо было указывать? -
Всем привет! Пытаюсь использовать
ReplicatedSummingMergeTree
.
1.) Вставляю полные дубликаты (по всем полям) в
SummingMergeTree
он их складывает, всё ок.
2.) Вставляю полные дубликаты в
ReplicatedSummingMergeTree
он вставляет 1 раз, а всё остальное игнорирует (не выполняет операцию insert into).
Никто с таким не сталкивался? Это ожидаемое поведение или я что - то делаю не так?
create table if not exists db.table on cluster cluster
(
`Period` DateTime('UTC'),
`Column1` UUID,
`Column2` UUID,
`Value1` Nullable(Decimal(15, 2)),
`Value2` Nullable(Decimal(15, 3)),
`Value3` Nullable(Decimal(15, 2)),
`Value4` Nullable(Decimal(15, 2))
)
engine = ReplicatedSummingMergeTree
partition by toYYYYMM(`Period`)
order by (`Period`, `Column1`, `Column2`) -
а не надо вставлять полные дубликаты. КХ проверяет контрольные суммы блоков и выкидывает дубликаты. Меняйте количество строк. По умолчанию для non-replicated это выключено, а для replicated - включено. Называется insert deduplication - ищите в документации и на kb.altinity.com
-
Понял, спасибо за равернутый ответ.
-
-
прочитайте про snowflake id в гугле
-
ок спасибо
-
-
-
set allow_experimental_object_type = 1;
-
-
у вас запросы в рамках разных сессий проходят
попробуйте через консольный клиент -
-
-
-
-
clickhouse-client в интерактивном режиме
-
я все правильно написал?..
-
-
-
Settings Overview | ClickHouse Docs
There are multiple ways to make all the settings described in this section of documentation.
-
-
мб в вашем клиенте в настройках подключения можно установить session_id
-
это вэб-сайт облака
-
почитаю, спасибо
-
Консольный это clickhouse-client , а не сайте яндекса :)
-
да вот уже понял)
-
а curl'ом можете дергать?
-
-
-
Дак оно ещё в конце добавила формат .... Короче clickhouse-client, datagrip вам помогут
-
всем привет. 👏
нужна помощь (совет).
вот такая ошибка
Too many parts (10092)
Да. искал ответы в чате, но мне не подходят эти ответы.
партиционирование классическое по PARTITION BY toYYYYMM(parseTime)
запрос на вставку вот такой примерно
Insert into table select ...много кода...
пачка формируется отностительно большой (колок 100к строчек +-)
воркеров которые это делают много 160 - следовательно 160 одновременных запросов.
в секунду завершается от 1 до 5 запросов (следовательно 1-5 паралельных вставок).
Нет буферную таблицу не использую, вставки идут в основную. когда-то делал через буферную, но это работает очень плохо и не стабильно. -
-
Дак вам нужно вставлять в одну партицию, а не в сотни
-
А у вас вообще мержи работают ?
-
ClickHouse Connect Driver API | ClickHouse Docs
The ClickHouse Connect Core Driver API
-
Добрый день! Подскажите, не появился ли в кликхаусе эффективный способ подсчета сессий по событиям (есть id пользователя и время). Соответственно начало конец сессии это какое-то константное время между смежными событиями. Понятно, что можно использовать стриминг и формировать id сессий перед записью в КХ. Но может есть какой-то способ использовать агрегируемые таблицы или функционал rockdb, чтобы делать это в запросе КХ и не пожирать слишком память.
-
спасибо
-
на некоторых репликах да (много мержей), на некоторых мало, есть парочка в которых в текущй момент мержей не идет.
-
-
Из разряда бреда: Может зукипер тормозит ?
-
-
Да, есть ... "Пожирать слишком памяти" звучиит странно, но да массивы будут хотеть памяти чтобы вычислить сессию
-
3 ноды кипера по 4 ядра, на каждой нагрузка колеблется от 10 до 30%
-
Думаю, что правильный админ должен сконфигурировать полу-кластер (или 1/3-кластер), в котором будет по одному хосту из каждой шарды (из каждого набора реплик) и выполнить ALTER ... UPDATE над таким кластером.
Update. Денис рассказал (см. ниже), что ClickHouse справляется с этим сам. -
-
Привет всем.
Подскажите. я создал роль , через SQL( CREATE ROLE) . Могу ли я теперь эту роль назначить на пользователя в user.xml ? не нашел директивы. или так не выйдет? -
кажется у меня возникала в этой ситуации ошибка на уровне выполнения запроса "одновременно с ARRAY JOIN не допускаются дополнительные джойны"
но если есть несколько массивов, их можно перечислить через запятую в одном ARRAY JOIN -
это точно правильный ответ? Как это решение сохраняет отказоустойчивость в случае выхода из строя какой-то реплики какого-то шарда?
-
Добрый день! При использовании leadInFrame в случае когда следующей строки нет, выдается java.lang.NullPointerException. В других бд обычно выдается NULL. Это высвечивается как предупреждение, это предупреждение как то надо/можно обрабатывать?
Заранее спасибо помощь! -
Дак вам на github в jdbc драйвер
-
Думаю, что да.
Пользователи, которым не критичен результат UPDATE, ничего не заметят.
Если одна из реплик упадет во время UPDATE, а потом поднимется, то в моем варианте будет сильно лучше. -
При on cluster только одна из реплик в каждом каждом шарде получит alter. Положит в зк в tasks. Все реплики начнут выполнять эту мутацию, если в конце контр.сумма итогово парта совпадет то все закончится, если не совпадет то реплики которые закончили позже первой попытаются снова мутировать исходный парт, после 3 попыток они скачают с реплки которая закончила первой и создала контр.сумму первой.
-
О как ... круто, спасибо.
-
По умолчанию нет. Все агрегатные функции пропускают null. Но может если значений не null в колонке нет.
если использовать any (tuple(column)) то Tuple скроет наличие null -
Только вручную по system.query_log
-
Спасибо за детальное объяснение!
-
Кх это mpp база. Весь исходный датасет режется на части и каждая часть обрабатывается отдельно, результаты сливаются и финализируются. Поэтому тяжело сделать так как вы хотите.
Хотя у window funtions делали какую-то оптимизацию чтобы использовать индекс таблицы для рассчета окна. -
Спасибо
-
Ребят. День как с кликхаусом познакомился)
Более общий вопрос, не понял из документации.
Вариант с управлением через файлы конфигурации(config/users) полноценный?
можно ли через файлы создавать базы, таблицы, вешать роли,гранты на пользователей?
В основном хочется понять можно ли через файлы полноценно управлять пользователями и их привилегиями и автоматизировать это, через тот же ансибл. -
Можно. Если нужен join по самому массиву - попробуйте join (select arrayJoin(..) v) on ...
-
Нет
-
Создание пользователей через файлы это легаси. Там неполноценные grant-ы.
Нельзя в общем. Все делайте через sql -
Нельзя
-
Это в каком jdbc драйвере так? Jdbc драйвер не знает какой sql выполняли, ему пофиг.
-
Кипер на техже нодах с кх?
-
нет. на других впсках в той же сети
-
В system.part_log можно увидеть сколько партов создается (type=New) Посмотрите как запрос плодит парты.
-
Спасибо. Если поднять вопрос автоматизации конфигурации. Модуля КХ для ансибла нет. У КХ есть mysql интерфейс, предполагаю что можно использовать модуль mysql ансибла для управления или может есть другие варианты управления конфигурацией KX?
-
спасибо. гляну. в данный момент не могу, потому что воркеры которые обрабатывали это - уже не работаеют (зкаончили джобы)
-
ClickHouse JDBC Driver clickhouse-jdbc 0.3.2 (revision: 1795272)
-
Хм.. Выглядит как надёжный план угробить кластер.
-
Да пока кластер то не кластер) а какой основной подход, подключаться и выполнять необходимые SQL?
Пока пытаюсь понять возможно ли автоматизировать и стоит ли. -
На самом деле, всё не так плохо. Сырой SQL можно через любой интерфейс выполнять.
Но конфигурирование сервера — это же не только SQL. Там куча кликоспецифичных настроек, явно мускульные не подойдут. Как и готовые запросы, и настройки запросов (если они генерируются). -
Да возможно можно. Там неполная реализация протокола MySQL. Но консольный mysql клиент работает
-
Вроде почти у всех управляющих команд есть on cluster
-
Подскажите, пожалуйста, а в кликхаузе есть способы работать с json-списками такого формата?
[{"key":"firebase_screen_id","value":{"string_value":null,"int_value":-2431518002154509284,"float_value":null,"double_value":null}},{"key":"virtual_currency_name","value":{"string_value":"resources/soft","int_value":null,"float_value":null,"double_value":null}}]
Сценарий — я тяну данные из BigQuery, там это называется nesting, выглядит это вот так (на скрине). В BQ это решается что к нестингу делается подзапрос как мини-таблице в ячейке, в кликхаузе хочется либо так же, либо хоть как-нибудь иметь возможность вытащить, например int_value для firebase_screen_id, чтобы это стало отдельным столбцом (на втором скрине).
То есть мне нужно «найти в списке жсонов тот, где key == firebase_screen_id, достать из него value.int_value и положить это в отдельный столбец»
Если знаете, чем можно тянуть данные из BigQuery в Clickhouse так, чтобы облегчить эту работу с жсонами или вообще сделать все красиво, тоже буду супер рад советам -
-
хороший правильный json. В КХ есть новый тип данных для этого. https://clickhouse.com/docs/en/guides/developer/working-with-json/json-semi-structured/
-
Привет! Кто-нибудь знает способ получить зависимости для view - все таблицы, которые в нём используются.
-
Но есть один нюанс. Приведенный JSON - это массив объектов, а КХ не умеет работать с таким, так как он ожидает для каждой записи отдельную строку с объектом JSON.
-
select dependencies_database, dependencies_table from system.tables where database = ... and name = ....
-
Для view у меня так
-
21.11.11.1 Возможно надо обновиться?
-
Да, вот я как раз хотел написать, что у меня не жсон с жсонами, а массив с жсонами, что все сильно усложняет
Получается, в КХ с этим ничего не сделать?
А можете посоветовать что-нибудь тогда в моей ситуации? Может, можно как-то тянуть и преобразовывать данные, чтобы КХ с ними норм работал? Или лучше уже выбрать другую бд?.. -
а на треугольничек нажать? не ?
│ dependencies_database │ Array(String)
│ dependencies_table │ Array(String) -
если есть возможность выбрать другую бд, берите другую. КХ слишком сложен.
-
Неужели у вас показывает? Нужно именно для VIEW
-
у меня тоже у 99% записей эти поля пустые
-
А можешь кратко +- алгоритм рассказать?
Я так понимаю через данные профилирования можно. Там довольно развернутая информация. Каких свойств будет достаточно? -
угу. В том числе потому и experimental. Придется добавить старых добрых JSONExtract - https://fiddle.clickhouse.com/ff844f98-f7d6-4ecb-b802-92b358d7fd35
-
ну я не проверял, это странно, эти поля именно для этого
-
а где не пустые?
-
sum(`ProfileEvents.Values`[indexOf(`ProfileEvents.Names`, 'UserTimeMicroseconds')]) AS userCPU
https://kb.altinity.com/altinity-kb-setup-and-maintenance/who-ate-my-cpu/Who ate my CPUQueries to find which subsytem of Clickhouse is using the most of CPU.
-
штучные таблицы с движками Distributed, ReplicatedReplacingMergeTree и Kafka
-
Супер. Спасибо
-
Да и для view они не заполнены. Я и спрашивал про какой-нибудь более изощрённый метод получения этого списка)
-
Добрый вечер. Может кто сталкивался уже с таким, объясните, пожалуйста, в чем может быть дело. Периодически теряем данные при записи в кликхаус. Проверил system.query_log и обнаружил, что а определенные моменты времени количество инсерт запросов с QueryStart больше чем с QueryFinish. На клиенте никаких ошибок не появляется, только количество записанных строк равно 0. Пишем в распределенную таблицу с insert_distributed_sync=1
-
Последний на сегодня вопрос.
У меня все юзеры ходят в бд на уровне сервиса под одной учеткой productNameUser. Я могу при запросе в клик как-то формировать id запроса, получать его при выполнении селекта, а потом по нему находить в system.query_log информацию, а на стороне метрик сервиса уже разбираться какой это был пользователь. Мапить пользователя на его query_id.
Не хочется внутри сервиса для каждого пользователя свою учетку держать. -
не знаю, возможно какой-то из explain умеет показывать
-
грепайте лог КХ по query_id
-
можно задавать либо query_id
можно через log_comment
для http можно задавать в user_agent
в log_comment можно что угодно написать
`select * from numbers(10) settings log_comment='{"user":"x"}';
select type from system.query_log where log_comment='{"user":"x"}';
┌─type────────┐
│ QueryStart │
│ QueryFinish │
└─────────────┘` -
Может кто сталкивался
Запрос работает 1-2с
Он же выполняемые в ДатаЛенс 15-20, повторное выполнение в нем же 1.5-3, но стоит поменять дату в условии отбора, снова 15-20
При аналогичных манипуляциях через родного клиента неизменно 1-2с -
даталенс смотрит напрямую в КХ? перед КХ не стоит chproxy?
-
Напрямую
-
Но в запросе есть и left join и join array
-
Но нуллов нет
-
-
Да даже если это просто всего 20 значений результата
-
-
Понял, спасибо за совет
-
select arrayJoin(arrayMap(x->now()+x,range(30)))
-
я про сгенерить сетку и сгруппировать по ней
-
пока не понятно)
-
-
-
ORDER BY time with fill step 1
-
посмотрю, спасибо
-
https://kb.altinity.com/altinity-kb-setup-and-maintenance/cluster-production-configuration-guide/hardware-requirements/
если есть возможность, то чем больше ОЗУ тем лучше -
сделайте комментарий перед запросом -- or /* */ и пишите туда все что захотите. Оно попадет в query_log
-
Settings | ClickHouse Docs
allownondeterministicmutations
-
Большой рахмет
-
спасибо! всем кто ответил)
-
Вы можете поступить проще и добавлять в query логин пользователя из системы через комментарий
-
Вы платите бабки ... Пишите тем кому вы платите :) Никто не знает как там всё устроено :(
-
:) туда написал, это понятно
Но мало ли может кто сталкивался и знает куда копать -
-
-
create table test ( id Int64, d Int64 )
Engine=MergeTree partition by (intDiv(d, 1000)) Order by id;
set max_partitions_per_insert_block=0;
insert into test select number, number from numbers(1e8);
я как-то пробовал 500 тыс. партов сделать. Там любой селект делает прунинг 500мс -
-
зависит от диска. На 100тыс. партов уже долго. Можно detach table / attach table проверять
-
Allow to attach partition from table with different partition expression when destination partition expression doesn't re-partition by arthurpassos · Pull Request #39507 · ClickHouse/ClickHouse
Changelog category (leave one): New Feature Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Allow partitions from tables with different partition exp...
-
вот прям жалко
-
в клауде долгий старт скорее всего из-за блок стораджа
у очень частая проблема с AWS EBS , там лимитированные iops. Регулярно у клиентов наблюдаю старт КХ по 40 минут. -
ну напишите там в коментах что очень надо, ну очень. Обещаете тестировать вдоль и поперек.
Алексей наверное не хочет мержить потому что страшно. -
> Регулярно у клиентов наблюдаю старт КХ по 40 минут.
сколько там итого партов/таблиц? -
видел такое у клиента с 15тыс. таблиц, в каждой по ~12 партиций, всего было <100 тыс. партов.
и скорее всего при большом кол-ве колонок будет хуже (я не уверен, надо теститьт). -
Ну тут gp3, 10к иопсов за глаза должно быть, имхо
-
Кстати, в clickhouse cloud задран размер компакт парта до 512мб, тоже должно немного помочь
-
кстати, искал в чате, но не нашел (возможно, плохо справился): есть ли где-то техническое овервью, как клауд работает? какого типа инстансы поднимаются, как скейлятся от нагрузки, какие лимиты и есть ли они, где хранятся данные и так далее
-
ахаха, и эти люди будут запрещать мне ковыряться в носу? ))))
https://github.com/ClickHouse/ClickHouse/issues/32241#issuecomment-1283169958RENAME COLUMN on compact parts may take advantage of using hard links for non-changed files · Issue #32241 · ClickHouse/ClickHouseDescribe what's wrong Rename table in compact parts is supposed to use hard-linking as it does for wide-parts. However, it does not. Does it reproduce on recent release? yes How to reproduc...
-
Ну теперь можете поднять клауд инстанс, залить ваши данные, а потом начать делать RENAME COLUMN и писать тикеты в поддержку :)
-
хаха , мы только что обсуждали что не Final не работает если сделать select ... from left join right FINAL и я предложил сделать акк. cloud и попросить починить.
-
Уже починили в новом аналайзере
-
ОК
-
Нужно посмотреть блоги и вебинары.
А так по памяти, все данные хранятся на S3 диске, используется write through /read cache disk поверх этого. Возможно инстансы шарятся между тенантами (в system.async_metrics там по 64 ядра и +-8 дисков видны, по памяти они не сильно жирные 256ГБ макс (те на каждое ядро по 4гб памяти)).
3 реплики в трех AZ, шардирования нет.
Ну и многие потенциально опасные фичи выключены.
Крутится все в k8s емнип. (ну хостнеймы там .svc.cluster.local) -
а в бесплатном триале есть нормальная поддержка? )
-
Ну, там точно есть звонок с специалистом по переносу, можете пожаловаться ему, думаю :)
-
Я так понимаю, если интересны более специфические вопросы и опасения (из разряда «хотим налить 5/10/50тб, не лопнет один шард?»), то лучше сразу в суппорт идти с конкретикой?
-
Да, ну 50ТБ на один шард по нашему мнению многовато.
Мы клиентам нашего облака, обычно говорим до 8ТБ на шард.(для облаков)
Впрочем у нас есть клиенты и с 24ТБ на шард. (там возникают некоторые сложности с временем бекапом этого, но мы сейчас думаем над решением этого) -
Ну мы вообще по 2 держим, правда шарды потоньше. Но вы пишете, что шардирования нет - его совсем нет, или при желании есть? :)
-
Ну, пока нет совсем, может будет в будущем.
Просто шардирование это Distributed таблицы и понимание топологии кластера.
Как мне кажется, в clickhouse cloud они хотят, что бы люди не задумывались по поводу Distributed таблицы и тд, поэтому там этого нет.
Может сделают некие ShardedMergeTree таблицы, но это очень большая работа, сейчас бы хотя бы zero copy replication s3 стабилизировать -
Понял, спасибо!
-
Понял, спасибо!
-
Ну, пока нет совсем, может будет в будущем.
Просто шардирование это Distributed таблицы и понимание топологии кластера.
Как мне кажется, в clickhouse cloud они хотят, что бы люди не задумывались по поводу Distributed таблицы и тд, поэтому там этого нет.
Может сделают некие ShardedMergeTree таблицы, но это очень большая работа, сейчас бы хотя бы zero copy replication s3 стабилизировать -
Ну мы вообще по 2 держим, правда шарды потоньше. Но вы пишете, что шардирования нет - его совсем нет, или при желании есть? :)
-
Да, ну 50ТБ на один шард по нашему мнению многовато.
Мы клиентам нашего облака, обычно говорим до 8ТБ на шард.(для облаков)
Впрочем у нас есть клиенты и с 24ТБ на шард. (там возникают некоторые сложности с временем бекапом этого, но мы сейчас думаем над решением этого) -
Я так понимаю, если интересны более специфические вопросы и опасения (из разряда «хотим налить 5/10/50тб, не лопнет один шард?»), то лучше сразу в суппорт идти с конкретикой?
-
Ну, там точно есть звонок с специалистом по переносу, можете пожаловаться ему, думаю :)
- 08 December 2022 (178 messages)
-
Коллеги, здравствуйте!
Ситуация - есть таблица с движком ReplacingMergeTree и полем типа "дата" на первой позиции ключей сортировки.
После даты в списке ключей сортировки идут другие поля с более высокой кардинальностью.
Таблица заполнена историей за последние 3 года. Общий размер невелик - около 500 миллионов строк.
Изредка в эту таблицу нужно повторно перезалить часть данных (менее 1 %), начиная с 2020 года.
И что-то этот процесс в последнее время стал сильно тормозить, 1000 строк может вставляться 1 минуту.
Вопрос - могла ли скорость вставки упасть из-за того что мы повторно вставляем старые данные 2020 года,
которые как бы в самом начале таблицы? -
⛔️Приветствую⛔️
Мы с ребятами зарабатываем арбитражем криптовалют
‼️Новая тема заработка на просадках бирж‼️
Нашей командой было принято решение собрать единомышленников и увеличить наши ряды, так как проводить все сделки мы сами не успеваем
Совершенно новая тема заработка💰
Мы готовы дать возможность заработать, индивидуальное обучение каждому желающему, в замен на процент с чистого заработка который составляет 15%
🛑Деньги за обучение не берём и переводить нам ничего не нужно, только процент с прибыли после обучения🛑
Если ты заинтересован крутиться в теме криптовалют, напиши нам, все предельно чисто и прозрачно✔️
⚜️После обучения, самых перспективных пригласим в наши команды⚜️
Пишите: @simvolMWO -
какой partition by в этой таблице?
-
/report
-
приветствия
такая проблема: подкючил движок кафки как из примераhttps://clickhouse.com/docs/en/integrations/kafka/kafka-table-engine/ Добавил мат вьюху для записи ошибок. В кафку сообщения приходят, консюмер клика к кафке цепляется . Но во вьюхах и таблице записей нет. Запущено в докере. Логи клика и кафки пустые. Подскажите в какую сторону копать -
по месяцам той самой даты
-
"которые как бы в самом начале таблицы" - там нет начала таблицы. Когда вы вставляете старые данные порождается несколько крошечных партов по вашим месяцам. Если данные размазаны по времени, то партов могут быть десятки. это конечно не повод тормозить на минуту, но я бы для начала посмотрел в system.part_log
-
спасибо, буду искать,
пока считаю данные в соседнюю таблицу,
чтобы потом вставить всю пересчитанную историю за 1 раз, а не 1000 insert'ов выполнять -
Здравствуйте. Использую структуру вида Buffer -> MergeTree -> несколько MATERIALIZED VIEW для записи в Distributed таблицы. Есть основания пологать, что некоторые записи теряются, а некоторые дублируются. Проблему с дублями еще пытаюсь локализовать, но может вы подскажете очевидные проблемы такой схемы
-
system.query_views_log включен?
откуда считаете что "данные теряются"?
engine=Distrbuted - мониторите сколько там DistributedFilesToInsert
оно точно успевает распихивать по шардам? -
стойте, а что такое 1000 инсертов? Должен быть один. Если сами не буфферизируете, то можно тот-же Buffer не применить
-
пересчёт истории за 3 года это примерно 1000 дней - каждый день рассчитывается отдельно, получает условную 1000 строк и вставляет ее в таблицу
эта порочная практика работала полгода, и вот сейчас перестала -
Ну так примените Buffer, он для таких кейсов и сделан.
-
спасибо за идею, пойду читать про Buffer
-
system.query_views_log не включен, еще таким не пользовался. Файлы не копятся, с этим все хорошо. По потерям прогнал пачку сообщений через ab, пару раз словил момент, что в Distrbuted оказалось меньше записей. Я в первую очередь хотел посоветоваться на счет рабочая ли подобная схема, а по ошибкам сейчас с дублями воюю, на потери чисто наткнулся в тестовой среде, пытаясь воспроизвести дубли
-
Мир Михаила Онуфриенко
Не вижу в Мире Великой Руси.Пока... По вопросам рекламы: @KristinaTGmarketing
-
там под Distributed что стоит ? ReplicatedMergeTree?
там дедупликация на уровне блоков
если ваша пачка запросов вставляет одинаковые данные то они скипнутся по контрольной сумме -
верно, ReplicatedMergeTree. Просто при записи тестовой пачки записи одинаковые и подавляющее количество раз в Distributed доходят все. Забыл про дедупликацию, может у меня как раз в этом и проблема, спасибо
-
Всем доброе утро!
Подскажите кто-то сталкивался с проблемой, когда пытаешься создать MATERIALIZED VIEW c движком MergeTree и указанием POPULATE не получается записать все данные из-за переполнения оперативы. Может кто знает как этот процесс правильно проводить, может есть вариант при котором получиться агрегировать все данные и записать, может можно как-то разделить процесс на этапы -
не использовать POPULATE)
-
-
-
-
взял отсюда, если интересно, тут можете что-то еще полезно мб для себя найти
https://kb.altinity.com/altinity-kb-schema-design/materialized-views/ -
Спасибо
-
сейчас буду изучать пробовать)
-
тут вообще в этой беседе часто на вопросы по мат вью кидают в ответ этот видос, тоже посоветовал бы глянуть
https://www.youtube.com/watch?v=1LVJ_WcLgF8&list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7597s -
Добрый день, всем. Вопрос про CollapsingMergeTree.
В документации есть такая строка:
select * from UAct final; // старайтесь не использовать final (он подходит только для тестов и маленьких таблиц)
Однако не пояснено, это относится только к тому, когда запрос идет ко всей таблице или для любого запроса. А как final поведет себя при ограниченной выборке?
select * from UAct final where [условие выбирающее несколько сотен записей]
Тоже не стоит использовать final и свертывать вручную или в таком случае final допустим? -
Всем привет. Подскажите, запросы с async_insert не попадают в query_log или это настраивается где то отдельно? верситя КХ 21.11.4.14
-
Про то, что не нужно использовать POPULATE Вам уже выше написали, ну и в доке про это есть
А если хочется решение как залить данные, то всегда можно посмотреть какая таблица под матвью
наприм так:
select * from system.tables where name in (
select '.inner_id.' || toString(uuid) from system.tables where database ='название бд' and name = 'название таблицы'
)а дальше загрузить данные в эту таблицу в необходимом объеме
Ну либо сделать матвью с секцией TO table_name и самостоятельно управлять процессом -
Спасибо
-
Ну вопрос скорее в том, что ретроспективные данные очень сильно нужны, а до этого я собирал их при помощи populate
-
отличие в любом из предложенных вариантов будет только в том, что тебе придется этот шаг сделать вручную и позаботиться о порциях данным, внутри которых происходит аггрегирование, ключи, партиционирование и тд
-
оно будет медленнее в зависимости от того, сколько в запросе участвует партиций, и в зависимости от того, насколько у вас данные уже смерджились, тк FINAL делает мерджи вне зависимости от партиционирования
лучше сделать, как доке написано, искусственное схлопывание удаленных строк через SUM(... * sign) ... HAVING SUM(sign) > 0, оно менее затратно -
Там где агрегация да, понятно что надо SUM(... * sign). Но тут в том-то и дело, что запрос без агрегации. Надо просто записи извлечь без схлопываемых.
-
Ребят, есть структура у поля вида Map(String, Tuple(a Int64, b Float64)), но при дергании в селекте field[‘f’].a падает ошибка (мол поля нет такого), хотя по .1 все работает. Бага?
-
так я и говорю
пусть у вас есть таблица
CREATE TABLE test
(
user_id UInt8,
event_id UInt8,
sign Int8
) ENGINE = CollapsingMergeTree(sign) ORDER BY a
то есть для каждого юзера может обновляться event_id
тогда чтобы вытащить всех юзеров вам надо будет сделать такой запрос
SELECT user_id FROM test GROUP BY user_id HAVING SUM(sign) > 0 -
не совсем так. Недавно появился сеттинг do_not_merge_across_partitions_select_final который значительно ускоряет именно описываемый Александром кейс. Так что я попробовал бы оба варианта на конкретных схемах таблиц, данных и запросах.
-
-
фича. все уже привыкли.
-
как обходить красивее всего?
-
я пишу .1 Это чуть менее понятно, но терпимо. Наверное можно что-то намутить с временными табличками - https://clickhouse.com/docs/en/sql-reference/data-types/tuple/#addressing-tuple-elements
-
Привет!! Подскажите, пожалуйста, как правильно сделать копию таблицы прямо с данными? Чтобы можно было поиграть в ней с индексами и потом смело удалить, вот так CREATE TABLE КОПИЯ ENGINE = MergeTree() AS SELECT * FROM ОРИГИНАЛ получится?
-
устарело это в документации, использовать final можно
смотрите
CollapsingMergeTree
он схлопывает строки для одинакового набора значений колонок из ORDER BY
в момент вставки парта и в момент мержа двух партов (парты из разных партиций не мержатся)
соответсвенно FINAL работает точно также но на этапе SELECT
то есть мы через WHERE определяем какие парты мы читаем
читаем, фильтруем и схлопываем их
слопывание дополнительно жрет CPU и раньше было не паралельным поэтмоу давало пинальти x2-x5 к запросам без FINAL
теперь это где то 20% накладных -
можно сделать таблицу с точно такой же структурой и сделать ATTACH PARTITION ... FROM <таблица исходник> несколько партиций
-
О спасибо! Интуитивно и по синтетическим тестам, которые написал у меня именно так и получалось, что не сильно влияет. Но смущала документация.
-
то есть будет как бы ненастоящая копия? а что-то типа симлинка? можно ли будет потом сделать drop table и не удалятся ли данные?
-
Манипуляции с партициями и кусками | ClickHouse Docs
alter_manipulations-with-partitions}
-
нет, настоящая
https://clickhouse.com/docs/en/sql-reference/statements/alter/partition/#attach-partition-fromManipulating Partitions and Parts | ClickHouse DocsThe following operations with partitions are available:
-
но возможно "копирование" будет сделано через механизм hard link
-
можно еще AS SELECT * FROM original WHERE ...
это гибче если у вас структура другая и другой ORDER BY \ PARTITION BY ... -
нет, не другая, ровно такую же таблицу хочу)
-
Есть ещё вариант с https://clickhouse.com/docs/en/sql-reference/statements/create/table#from-select-queryCREATE TABLE | ClickHouse Docs
Creates a new table. This query can have various syntax forms depending on a use case.
-
спасибо, дорогие ❤️
-
понял. у меня вообще задача с кафки map со значением из нескольких типов подгрузить без танцев. но все равно спасибо
-
тип JSON уже пробовали? У меня он именно для этих целей - быстро и "без танцев".
-
пробовали. есть проблема одна. то что он дефолтные значения для типов использует, если значение не задано. для всех строк.
-
то есть в одной строке может быть x: 1, в другой y: 2 и если считать avg(x) то будет 0.5
-
да, это все понятные недоделки. Null хоть и редко, но нужен. avg тяжелый случай. если там у вас нуля не бывает, то avgIf(x,x>0)
-
0 возможен к сожалению. вот я и думал через Map(String, Tuple(Nullable(Int64), …)) обойтись, но цифорки немного не удобно
-
Добрый день.
Скажите пожалуйста в чем проблема может быть:
Забираю месседжи из kafka через JSONEachRow
Для данных типа:
"row1": {"id": "19167", "type": 2}
работает row1 Map(String, Int64)
Но для "row2": {"url_name": "https://wwww.google.ry/?utm_referrer=ya.ru", "urle_type": 1}
почему то не работает row2 Map(String, Int64),
ParsingException: Cannot parse input: expected '"' before: 'https://wwww.google.ry/?utm_referrer=ya.ru", "url_type": 1}}': (while reading the value of key row2): -
потому что у вас там Map с разными типами... ключ строка, а значения то строка то число... и работать не будет так
-
для "row1": {"id": "19167", "type": 2}, где значение первого ключа - строка, второго - число прекрасно работает
во втором поле все аналогично
"row2": {"url_name": "https://wwww.google.ry/?utm_referrer=ya.ru", "urle_type": 1} -
она не строка, она число, в JSON числа могут быть в кавычках
-
о как..выхода нет?
-
во втором поле у вас не все аналогично url_name это строка
Map(String, Int64) первый параметр тип ключа второй тип значения
попробуйте Map(String, String)
но не факт что сработает, все таки у вас числа явно заданы...
еще есть встроенный тип JSON
https://clickhouse.com/docs/en/sql-reference/data-types/jsonJSON | ClickHouse DocsStores JavaScript Object Notation (JSON) documents in a single column.
-
нет, Map(String, String) пробовал, не работает, попробую JSON
-
clickhouse_sinker?
-
json тоже не сработал
ParsingException: JSON should start from opening curly bracket: (while reading the value of key row2) -
в каком формате вставляете ?
JSONEachRow ? -
да
-
как полностью строка выглядит?
-
там если у вас в одном ключе микс из разных типов, скаляров объектов и массивов. то это не однородные данные с таким JSON сложно работать
сохраняйте отдельно в строку json_string String CODEC(ZSTD(3))
и потом добавляйте поля отдельно через DEFAULT JSONExtract(json_string) -
CreateTime:1670499123340 null {"datetime": 1670498941, "row1": {"id": "83", "type": 1}, "row2": {"url_name": "https://wwww.google.ry/?utm_referrer=ya.ru", "url_type": 4}}
-
Очень интересно, спасибо за информацию. А по поводу ReplacingMergeTree такая же история?
-
да, собственно вся разница в движках *MergeTree семейства
это то как обрабатываются строки с одинаковым ORDER BY значениями колонок при мерже -
это не JSON от слова вообще
он не валидный
CreateTime:1670499123340 null
вот этот кусок это не JSON -
или у вас там три поля?
тогда у вас TSV формат а не JSONEachRow -
TabSeparated?
-
для Replacing Будет замена, то есть выбор рандомной строки
либо строки с максимальным значением поля которое указано как Version -
спасибо за пояснение!
-
да
-
Немного уточню, что без использования ver колонки строка будет не рандомная, а строка из более "нового" блока
-
так совсем все плохо...с JSONEachRow я бОльшую часть данных вытаскиваю, кроме "row2": {"url_name": "https://wwww.google.ry/?utm_referrer=ya.ru", "url_type": 4}
-
а остальные строки как вышлядят?
скиньте кусок данных на pastebin ? -
{
"row1": 1,
"row2": 1670501941,
"row3": 4,
"row4":
{
"id": "546",
"type": 1
},
"row5": 12,
"row6":
{
"url_name": "https://www.gooele.com/?utm_referrer=ya.ru",
"url_type": 4
}
}
CREATE TABLE queue_kafka_topic (
row1 Int64,
row2 DateTime('Europe/Moscow'),
row3 Int64,
row4 Map(String, Int64),
row5 Int64, row6 Map(String, Int64) ) ENGINE = Kafka('{kafka_address}:9092', 'topic_name', 'cosumer-group', 'JSONEachRow') settings kafka_thread_per_consumer = 0, kafka_num_consumers = 1;")
до row6 все попадает в ch.
https://pastebin.com/KMdtxhLZ{ "row1": 1, "row2": 1670501941, "row3": 4, "row4": { "id - 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.
-
а... это парсинг из кафки вообще
попробуйте сделать
row6 String
а в MATERIALIZED VIEW в целевую таблицу добавить row6 Object('json') -
Cannot parse JSON string: expected opening quote: (while reading the value of key row6)
-
Ребят подскажи , как создать корректно mat.view с движком aggregatingmergetree над распределённой таблицей , почему то distributed над ней не хочет работать в mat.view а если тянуть с шардов то агрегация не корретна.
-
Над distributed никак - она данные в себе не хранит. Нужно создавать над локальными табличками и над ними делать еще 1 дистрибьютед
-
А как сделать агрегацию корректно ведь если сделать над локальными нужно делать агрегацию над ними, чтобы было правильно, просто собрать результаты в дистрибьют - не даст правильную агрегацию.
-
Что значит не даст? Простое чтение тоже не даст. Никто не гарантирует что агрегация завершится. Всегда надо доагрегировать во время запроса. То-же самое и с Distributed. Да, вам соберут с шардов что-то не до конца аггрегированное. Пишите group by и применяете свои функции агрегации.
-
-
MV на дистрибьютед сделать всё же можно, но данные будут пойманы только на том сервере, на котором происходила вставка в дистрибьютед таблицу. Если MV вешать на локальные, то данные будут ловиться на тех серверах, куда дистрибьютед таблица их отправит согласно ключу шардирования.
Если делать MV на локальные таблицы или если MV на дистрибьютед, в которую идёт вставка на разных серверах, то агрегационная таблица, в которую будут писать MV, должна быть либо одна реплицированная и тогда вы забираете результат из неё на любом сервере, либо она на каждом сервере, но поверх есть своя дистрибьютед таблица, через которую забираете данные.
Если делать MV на дистрибьютед и вставка в неё только на одном сервере, то и агрегационная нужна только на нём. -
По идее так:
select *
from gr, grhl
where startsWith(gr.full_path, grhl.full_path) -
-
вы бы читали историю чата. хотябы за сегодня. Только что обсуждали - https://t.me/clickhouse_ru/302973Boris in ClickHouse не тормозит
не совсем так. Недавно появился сеттинг do_not_merge_across_partitions_select_final который значительно ускоряет именно описываемый Александром кейс. Так что я попробовал бы оба варианта на конкретных схемах таблиц, данных и запросах.
-
Благодарю. Не всегда есть возможность читать историю, но обычно я стараюсь
-
-
что то сложное написано, ну или я туплю =) - вроде нет никакой проблемы сделать MV поверх Distributed, а саму MV TO другую дистриб таблицу, главное ключ шардирования правильный указать
-
Да - нужно доагрегировать во время селекта. Но нужно понимамать что оно будет нормально работать только в случае есть у вас простые функции агрегации(типо max, min, avg). Если вы хотите так считать uniq - то работать это будет плохо(конечно еще зависит от объемов)
-
Добрый день,
пытаюсь апгрейдиться с 20.3.12.112 до 22.8
Получаю
2022.12.08 10:21:04.877150 [ 1 ] {} <Error> Application: Caught exception while loading m
etadata: Code: 48. DB::Exception: Data directory for system database exists, but metadata
file does not. Probably you are trying to upgrade from version older than 20.7. If so, y
ou should upgrade through intermediate version. (NOT_IMPLEMENTED), Stack trace (when copy
ing this message, always include the lines below):
...
4. DB::loadMetadataSystem(std::__1::shared_ptr<DB::Context>) @ 0x151bb022 in /usr/bin/cli
ckhouse
Чистая правда, older than 20.7
Но все же хочется сапгрейдится.
Стер data и metadata для system, получил
Caught exception while loading m
etadata: Code: 48. DB::Exception: Data directory for default database exists, but metadat
a file does not.
Ну то есть теперь проблема с default, который я не готов стирать. Правильно ли я понимаю, что у меня есть два варианта
1. конвертировать все Ordinary в Atomic по инструкции https://kb.altinity.com/engines/altinity-kb-atomic-database-engine/how-to-convert-ordinary-to-atomic/
2. признать поражение и апгрейдится через 21.8
?
Меня смущает, что я вижу в исходниках всякое convertDatabasesEnginesIfNeed и даже ставлю флаг convert_ordinary_to_atomic, но это не помогает .How to Convert Ordinary to AtomicClickhouse Howto Convert Ordinary to Atomic
-
Добрый вечер. Каким-то образом можно оптимизировать поиск по Array(String)?
-
А какой именно поиск по нему идет?
-
Кстати да. Я просто наступил пару раз на вставку через дистрибьютед и больше так стараюсь не делать)
-
построить bloom_filter skip index
-
Если делать aggMerge над distributed, то возвращается несколько результатов и те странные
-
Только 2, автоматически сконвертировать можно только после апгрейда на новую версию.
Ещё есть вариант 3 — прочитать код и самому поправить метаданные так, чтобы было совместимо и 22.8 запустилась, но по понятным причинам это не рекомендуется.
И там ещё могут быть похожие ошибки в ReplicatedMergeTree при обновлении с очень старых версий -
Ок, спасибо, будем апгрейдится через 21.8
-
Привет. Пишу/читаю в/из S3 - никаких проблем с TSV/CSV.
Делаю тоже самое с parquet - не читает обратно:
insert into function s3('path/test.parquet', 'key', 'key', 'Parquet')
select 'test' as test1
;
select *
from s3('path/test.parquet', 'key', 'key', 'Parquet', 'test1 String')
;
Code: 36. DB::Exception:
Invalid: Parquet file size is 0 bytes:
While executing ParquetBlockInputFormat:
While executing S3.
(BAD_ARGUMENTS) (version 22.3.8.39 (official build))
Если как RawBLOB этот test.parquet прочитать - кракозябры читаются.
Качаю ручками этот test.parquet и закидываю в clickhouse-client - всё норм читается.
Это как-то лечится?
Видел пару похожих вопросов, но ответов не нашел. -
А если попробовать записать ваш файл в другой ключ?
-
>
Invalid: Parquet file size is 0 bytes:
Что там с размером файла на S3? -
парни, вот какой вопрос:
(может это подробно где то написано в документации и я не заметил)
по какому принципу формируется количество партов в партиции? - т.е. какое количество этих партов должно быть минимум?
в моих реалиях вставки идут крупные (по 100к примерно)
коррелирует ли количество партов с количством уникальных первичных ключей на партицию? - т.е. если по первичному ключу получается например 10 уникальных значений - должно ли быть с этим количеством связано количество партов? -
Кол-во партов при вставке зависит от:
В сколько партиций вы пишете данные. (каждая отдельная партиция это новый парт)
Плюс кх нарезает парты по 1 млн строк, те если вы в 1 партицию пишете больше 1 млн строк, то кх создат несколько партов
https://kb.altinity.com/altinity-kb-queries-and-syntax/atomic-insert/ -
каждый INSERT в таблицу создает один парт в одной партиции минимум, дальше зависит от кол-ва строк внутри INSERT и вашего выражения PARTITION BY
> т.е. какое количество этих партов должно быть минимум?
минимум 0
максимум 300 на партицию (PARTITION BY)
нормально 10-50 партов на партицию
> коррелирует ли количество партов с количством уникальных первичных ключей на партицию?
вообще никак не коррелирует
парт просто отсортированный по первичному ключу кусок данных получаемый из INSERT \ Materialized view -
понял спасибо 👍
-
aws ls говорит 292 байта, как и у скачанного файла. В другое место права просить надо, но на чтение есть другие бакеты, и на любой паркетник получаю Parquet file size is 0 bytes. Собственно для этого тестовый и завел, чтобы свой файл через КХ записать, который по идее должен был точно корректно прочитаться, и где я точно знаю структуру.
-
второй вопрос - дано:
2 реплики, воркеры на запись работают только с одной репликой (вставка новых данных, вставка скорректированных данных с -1 и новых с +1).
эта реплика загружена можно считать 100% времени.
какие то мержи идут, но с муравьиной скоростью.
вторая реплика - синхронизирует данные из первой, с ней никакие воркеры не работают совсем. - нагрузка почти нулевая.
вопрос - можно ли ее принудительно заставить заниматься слияниями так, чтобы она использвала все доступные ресурсы для этого? -
А если убрать схему паркета, тоже не читает?
-
Code: 636. DB::Exception: Cannot extract table structure from Parquet format file. Error: Invalid: Parquet file size is 0 bytes. (CANNOT_EXTRACT_TABLE_STRUCTURE) (version 22.3.8.39 (official build))
-
> вопрос - можно ли ее принудительно заставить заниматься слияниями так, чтобы она использвала все доступные ресурсы для этого?
По дефолту кх все мержи пытается выполнить в параллель на всех репликах.
Только если мерж очень старый, или парт уже помержен, то тогда кх попытается его скачать, а не мержить.
Те сделать некоторый offload нагрузки на вторую реплику не получиться. (можете распределить вставки между двух реплик) -
вы занимаетесь преждевременной оптимизацией,
пишите рандомно на обе реплики
выбирайте куда писать в приложении
можно для начала просто round robin
потом что нибудь более умное докрутите... -
Попробуйте поднять 22.8 кх локально и попробовать дернуть этот же паркет, там были баги в автоопределении схемы, но у вас и со схемой вылезает бага
-
это были просто пример - чтобы задать вопрос.
-
вы не контроллируете процесс слияний
максимум можете background_fetch_pool_size увеличить, чтобы парты между репликами быстрее тягать... -
ситуация в том, что есть несколько реплик на которые итак идет запись паралельно, на них же крутстся скрипты питона (дергаются хранимки). слияния на них идут итак медленно (почти не идут).
можно добавить 1-2 реплики, на которые не будет такой нагрузки на запись.
поэтому вопрос - как заставить кх заниматься на 100% слияниями а не гоняниями лысого) -
попробую, но думаю дело не в определении схемы. Я если просто через cat этот файл скармливаю, то норм всё: cat test.parquet | clickhouse-client --query="insert into ... FORMAT Parquet"
-
слияния реплицируется не финальный парт
а само слияние, и оно повторной проводится на целевой реплике
посмотрите
https://clickhouse.com/docs/en/operations/system-tables/replication_queue/replication_queue | ClickHouse DocsContains information about tasks from replication queues stored in ClickHouse Keeper, or ZooKeeper, for tables in the ReplicatedMergeTree family.
-
Есть куча данных, они агрегируются и записываются в клик.
А потом через какое то время прилетают данные, которые предназначены для этой кучи.
В клике нет update.
Кто нибудь решал такую задачу? -
агрегированная куча - это одна запись
-
AggregatingMergeTree | ClickHouse Docs
The engine inherits from MergeTree, altering the logic for data parts merging. ClickHouse replaces all rows with the same primary key (or more accurately, with the same sorting key) with a single row (within a one data part) that stores a combination of states of aggregate functions.
-
я совсем хреново разбираюсь в клике, только начинаю
если я правильно понял, там описано как сделать чтоб клик сам агрегировал?
у меня агрегация в редисе, и задача как перегреировать "запоздавшие" данные и заменить в базе запись -
ну тогда начните с нуля
https://clickhouse.com/docs/en/quick-start
и тут
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/replacingmergetree
https://clickhouse.com/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources/#redisClickHouse Cloud Quick Start | ClickHouse DocsThe quickest and easiest way to get up and running with ClickHouse is to create a new
-
большое спасибо, очень кстати
-
но это все-таки не обясняет как можно решить эту задачу. и можно ли вообще
-
можно, ссылки я привел. их стоит прочитать
-
коллеги, есть кейс, когда я из формы забирают список значений от пользователя и использую их как фильтр в запросе через конструкцию IN. Таких полей несколько, соотвественно запрос выглядит как SELECT ... FROM WHERE col IN ( ... ) AND col2 IN (...) и т.д. Можно в качестве аргумента в IN передать что-то,чтобы это означало отсутствие фильтра?
-
Не у компьютера, проверить не могу, но может попробовать астериск поставить через конструкцию if ? Хотя кажется, что пожалуется на разные типы данных или что такое не поддерживается.
-
Но в другом случае можно попробовать через join на таблицу значений по предшествующему селекту, где уже определенную логику выборки связующих значений можно организовать.
-
ну накостылить я и сам могу, я задался найти элегантное решение :)
-
-
-
Так через join и будет работать, не надо даже in
Right join в помощь -
а пример можно, я чего то не соображу :)
-
Честно, не у компа просто. Там адекватные примеры.
https://clickhouse.com/docs/ru/sql-reference/statements/select/joinСекция JOIN | ClickHouse Docsselect-join}
-
спасибо, конечно, но я джойнить умею, вопрос же о другом задавался
-
Так ваша задача через join и решается нативным способом. Тут использование IN уже костыль скорее.
-
-
Вам нужно сделать выборку по совпадениям значения в диапазоне. Чем не задача родного правого джойна ?
-
Кажется, что вам нужен OR
SELECT 'aaa' WHERE (2 IN (2, 3) AND 33 IN (3, 9) OR ('ALLOWED'='ALLOWED')) -
нет мне как раз нужно, чтобы все условия выполнялись, просто когда пользователь ничего не передал, то этот фильтр не использовался
-
Вот "когда пользователь ничего не передал" вы и установите в true альтернативное условие и добьетесь того, чтобы "фильтр не использовался".
-
как это должно выглядеть? Вот запрос SELECT ...FROM ... WHERE col1 IN (%s) AND col2 IN (%s) AND col3 IN (%s) . Вместо %s будет приходить значения, которые пользователь заполнил в форме. Если для col1 и col2 значения придут, а для col3 нет, то запрос вернет пустой результат
-
Кстати, хороший вариант. Если OR в клике работает по принципу невычисления правого выражения, то рабочий варик.
-
SELECT ...FROM ... WHERE col1 IN (%s) AND col2 IN (%s) AND (some_boolean OR col3 IN (%s))
Вроде бы так, чтобы не нарушать группировку логических операторов -
что должно прийти в качестве условия для col1, чтобы вернулось True, при условие, что значения такого нет в col1? :)
-
-
Господа, планируется создание таблицы, в которую будут постоянно вставляться строки, у которых только 1 поле будет изменяться.
А "читальщику" будет интересна только самая последняя (актуальная) строка.
Вот и думаю что применить, для экономии места:
1) CollapsingMergeTree
2) lightweight DELETE
Ваши советы? -
А что за значение в поле и как это значение будет дальше использоваться
-
И сколько колонок вообще
-
5 колонок все инты (ссылки на записи в других таблицах).
-
а читальщику будет интересно получать последнюю версию 5ой колонки в разрезе других 4х колонок?
-
А сколько строк в секунду?
-
(length(%s) > 0 AND IN(%s))
Хотя синтаксис может быть иной, если не строка, а массив. В любом случае, это костыль, потому что парсинг по типу данных надо добавить, как и создание массива, если это он.
Но мне кажется, вы решаете вопрос пользовательской и серверной валидации через базу данных, если %s это якоря для форматирования запроса строками пользовательского ввода. Мой внутренний безопасник возмущен )))
Проще тогда куски запроса в серверном коде скомпоновать по пользовательским данным, чтобы не вычислять эти выражения на стороне базы и не делать громоздкий запрос. -
думаю что не более 5 строк в секунду, т.к. чаще отображать результат не требуется
-
Ну попробуйте ReplacingMergeTree и читать с FINAL
-
Кажется, что у вас не так много данных будет.
-
Ну да. В этой таблице просто будет формироваться маршрут по обходу древовидной структуры. И читальщик-рисовальщик будет периодически читать инфу о том, что готово к отрисовки.
Можно было RPC сообщения реализовать, но попробуем это через ClickHouse )) -
А зачем такое хранить в КХ?
-
У вас вообще сколько строк получается тогда?
-
возможно потребуется повторное прохождение маршрута для повторной отрисовки
-
-
А ключ сортировки у ReplacingMergeTree может быть составным? (несколько столбцов UInt*)
-
Через кортеж может быть
-
Да, конечно ORDER BY (key_a, key_b)
-
спс
-
echo srvr | nc localhost 2181 | egrep "version|count"
ClickHouse Keeper version: v22.11.2.30-stable-28f72d8ab09ed385570fe76c37047512de58f8a5
Node count: 1516
А что значит Node count? Вот у меня честно-честно нет 1516 инстансов кипера -
В Кипере, как и в Зукипере древовидная схема данных
Node - узел в этом дереве - 09 December 2022 (181 messages)
-
Релизные образы собираются этим скриптом https://github.com/ClickHouse/ClickHouse/blob/master/tests/ci/docker_server.py
Пример команды запуска надо смотреть для релизов. Например, вот https://github.com/ClickHouse/ClickHouse/actions/runs/3647841745/jobs/6160549152#step:5:4
Бинарь скачивается из s3 ниже, конкретно для коммита тега, https://github.com/ClickHouse/ClickHouse/actions/runs/3647841745/jobs/6160549152#step:5:1822 тутClickHouse/docker_server.py at master · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Странно, мне не пришло уведомление...
-
-
второе быстрее
Null значения хранятся в отдельной битмаске в парте
сравнение по битмаск сильно медленнее чем сравнение со скаляром -
А разве клик не будет делать перебор всех значений из всех партов ? Потому что там используется длина String ?
-
подстроки в строках массива
-
так оно и в первом и во втором случае будет колонку вычитывать и сравнивать...
не помню точно, но длина строки хранится в колонке...
optimize_functions_to_subcolumns
точно должен помочь
да
надо сравнить -
-
Ого, прикольно :) Но Null все равно плохо :)
-
Спс
-
Всем привет, можно как-то перенести данные с 1 сервера CH, на другой?
-
-
Спасибо
-
Спасибо, всё ясно-понятно!
-
Добрый день. В логах встречаю такую ошибку при получении посылки от очереди с помощью таблицы с движком RabbitMQ. Информация из посылки успешно кладется в целевую таблицу. Хотелось бы узнать может у кого был опыт и поделится причиной этой ошибки в логах: <Error> void DB::StorageRabbitMQ::streamingToViewsFunc(): Code: 49. DB::Exception: Pos in empty own buffer: While executing RabbitMQ. (LOGICAL_ERROR)
-
версия клика 22.3.2.1
-
Господа, ClickHouse в HTTP ответе возвращает такой хидер:
x-clickhouse-summary: {.....,"result_rows":"0","result_bytes":"0"}
result_rows и result_bytes всегда содержат ноль.
И не могу по этим значениям найти информацию в документации.
Может кто знает для чего эти поля? -
Всем привет! Подскажите пожалуйста, что делать если мутация залипла в обшибках, и kill mutation не отрабатывает за лимит своего времени?
-
-
до 22.8 последней обновитесь
https://github.com/ClickHouse/ClickHouse/issues/38061
и проверьте что RabbitMQ вообще работаетRabbitMQ engine and MsgPack: Pos in empty own buffer · Issue #38061 · ClickHouse/ClickHouseFaced with the following error when trying to use RabbitMQ engine and MsgPack codec: 2022.06.14 19:37:30.170094 [ 567510 ] {} <Error> void DB::StorageRabbitMQ::streamingToViewsFunc():...
-
Попробую
-
какая версия clickhouse?
по идее это значения должны быть идентичны тому что в system.query_log вставляется по завершении вашего запроса
https://clickhouse.com/docs/en/operations/system-tables/query_log/
запррос у вас SELECT или какой то другой?query_log | ClickHouse DocsContains information about executed queries, for example, start time, duration of processing, error messages.
-
ну вы как из исходной таблицы в аггрегированную лить собираетесь? если через MV, то на уровне селекта это домножение делайте. а если вы одну таблицу другой заменить хотите, то непонятно зачем вам в новой sign тогда, историчность изменений всё равно помёрджится
-
22.11.1.1360 (official build)
В любых запросах нули -
запрос какой ? SELECT или какой то другой?
-
в любых
-
кстати, принудительно я не включал вывод в хидеры summary
-
попробуйте ?send_progress_in_http_headers=1 в ваши запросы добавить
https://clickhouse.com/docs/en/operations/settings/settings/#settings-send_progress_in_http_headersSettings | ClickHouse Docsallownondeterministicmutations
-
А как понять стримиться запрос или нет? Я правильно понимаю, что стриминг это когда данные от остальных нодов идут потоком и не ждут конца выполнения?
-
а вот не помню чтобы это было отключаемо вообще
-
не только от остальных нодов
стримминг это когда не надо результаты буфферизировать для обработки в памяти а можно сразу клиенту отдать считая их на лету...
обычноSELECT + GROUP BY / ORDER BY запросы это не стриминговые... -
Не помогло!
* Trying 127.0.0.1:8123...
* Connected to 127.0.0.1 (127.0.0.1) port 8123 (#0)
> POST /?send_progress_in_http_headers=1 HTTP/1.1
> Host: 127.0.0.1:8123
>
< HTTP/1.1 200 OK
< X-ClickHouse-Summary: {"read_rows":"2","read_bytes":"27","written_rows":"0","written_bytes":"0","total_rows_to_read":"2","result_rows":"0","result_bytes":"0"}
<
1 -
Теперь понятно почему мы проигрываем войну на Украине
-
а какой запрос то был??
SELECT 1 ?
и по вашему сколько там должно быть СТРОК
и сколько по вашему там памяти должно выделяться? -
В этом случае какой механизм срабатывания receive_timeout? Запрос он как был у нас с argMin (не стриминговый), так и остался, но почему-то стало по этому таймауту падать в 22.8.
-
SELECT pid FROM process WHERE name = \x27_XXX_\x27'
Выдаёт 1 строку. В таблице всего 2 строки. -
есть еще read_rows , result_rows почитайте что это значит в описании system.query_log в документации
-
read_rows = 2 , когда мне выдаёт всего 1 строку
-
нуда,чтобы вам выдать одну строк ( results_rows = 1) надо две строки прочитать (read_rows = 2)
-
Я понимаю.
Но у меня FORMAT RowBinary и я хотел заранее знать сколько из body читать строк бинарных. -
FORMAT RowBinary и прогресс в заголовках, две разные вообще части кода которые между собой никак не связаны =)
по моему вам надо просто читать пока не кончится... -
да вот так и буду сейчас делать
-
Хотя вот в доке явно написано следующее:
result_rows (UInt64) — Number of rows in a result of the SELECT query, or a number of rows in the INSERT query.
result_bytes (UInt64) — RAM volume in bytes used to store a query result.
Печаль что это не так. -
При ребуте клика столкнулся с такой проблемой:
2022.12.09 11:36:45.844547 [ 16376 ] {} <Trace> SystemLog (system.metric_log): Flushing system log, 8 entries to flush up to offset 542
2022.12.09 11:36:45.855532 [ 16376 ] {} <Debug> DiskLocal: Reserving 1.00 MiB on disk `default`, having unreserved 39.22 GiB.
2022.12.09 11:36:45.858385 [ 16376 ] {} <Trace> MergedBlockOutputStream: filled checksums 202212_72_72_0 (state Temporary)
2022.12.09 11:36:45.859070 [ 16376 ] {} <Trace> system.metric_log: Renaming temporary part tmp_insert_202212_72_72_0 to 202212_713_713_0.
2022.12.09 11:36:45.860304 [ 16376 ] {} <Trace> SystemLog (system.metric_log): Flushed system log up to offset 542
И так вот делает 20-30 минут, вставки через http по одному, но асинхронные, версия клика 22.5
Причем он всё это пихает в RAM и в итоге клик в "простое" занимает 3 ГБ оперативы
Зачем он так? -
у меня пустой кликхаус в докере 3гб занимает в оперативе
-
Ну... Я понимаю, просто он раньше занимал 1Гб и после нескольких крашев (сломанные парты были) начал чудить
+ сам запуск, который занимает минут 20-30 это не очень хорошо имхо -
Привет. Вижу выше похожий вопрос. Есть аналогичная проблема. Развернули в кубе altinity кликхаус и он без нагрузки тоже выполняет эти же действия.
2022.12.09 11:58:42.463028 [ 97 ] {} <Debug> DiskLocal: Reserving 1.00 MiB on disk `default`, having unreserved 9.42 GiB.
2022.12.09 11:58:42.465635 [ 104 ] {} <Debug> system.asynchronous_metric_log (e31bbf3a-a7e3-4224-a58b-0319bcce9dee) (MergerMutator): Selected 6 parts from 202212_9294_9364_14 to 202212_9369_9369_0
2022.12.09 11:58:42.465784 [ 104 ] {} <Debug> DiskLocal: Reserving 1.58 MiB on disk `default`, having unreserved 9.42 GiB.
2022.12.09 11:58:42.466001 [ 54 ] {e31bbf3a-a7e3-4224-a58b-0319bcce9dee::202212_9294_9369_15} <Debug> MergeTask::PrepareStage: Merging 6 parts: from 202212_9294_9364_14 to 202212_9369_9369_0 into Wide
2022.12.09 11:58:42.466224 [ 54 ] {e31bbf3a-a7e3-4224-a58b-0319bcce9dee::202212_9294_9369_15} <Debug> MergeTask::PrepareStage: Selected MergeAlgorithm: Horizontal
2022.12.09 11:58:42.466333 [ 54 ] {e31bbf3a-a7e3-4224-a58b-0319bcce9dee::202212_9294_9369_15} <Debug> MergeTreeSequentialSource: Reading 96 marks from part 202212_9294_9364_14, total 776940 rows starting from the beginning of the part
2022.12.09 11:58:42.467115 [ 54 ] {e31bbf3a-a7e3-4224-a58b-0319bcce9dee::202212_9294_9369_15} <Debug> MergeTreeSequentialSource: Reading 2 marks from part 202212_9365_9365_0, total 10928 rows starting from the beginning of the part
2022.12.09 11:58:42.467357 [ 54 ] {e31bbf3a-a7e3-4224-a58b-0319bcce9dee::202212_9294_9369_15} <Debug> MergeTreeSequentialSource: Reading 2 marks from part 202212_9366_9366_0, total 10920 rows starting from the beginning of the part
2022.12.09 11:58:42.467577 [ 54 ] {e31bbf3a-a7e3-4224-a58b-0319bcce9dee::202212_9294_9369_15} <Debug> MergeTreeSequentialSource: Reading 2 marks from part 202212_9367_9367_0, total 10920 rows starting from the beginning of the part
2022.12.09 11:58:42.467789 [ 54 ] {e31bbf3a-a7e3-4224-a58b-0319bcce9dee::202212_9294_9369_15} <Debug> MergeTreeSequentialSource: Reading 2 marks from part 202212_9368_9368_0, total 10920 rows starting from the beginning of the part
2022.12.09 11:58:42.468026 [ 54 ] {e31bbf3a-a7e3-4224-a58b-0319bcce9dee::202212_9294_9369_15} <Debug> MergeTreeSequentialSource: Reading 2 marks from part 202212_9369_9369_0, total 10920 rows starting from the beginning of the part
2022.12.09 11:58:42.572969 [ 54 ] {e31bbf3a-a7e3-4224-a58b-0319bcce9dee::202212_9294_9369_15} <Debug> MergeTask::MergeProjectionsStage: Merge sorted 831548 rows, containing 5 columns (5 merged, 0 gathered) in 0.107039443 sec., 7768612.9215003485 rows/sec., 215.94 MiB/sec.
2022.12.09 11:58:42.574789 [ 54 ] {} <Debug> MemoryTracker: Peak memory usage Mutate/Merge: 16.45 MiB.
И постепенно заполняет таблицы system.trace_log system.asynchronous_metric_log system.metric_log, забивая диск. Что с этим можно сделать? -
https://clickhouse.com/docs/en/operations/system-tables/
Настроить ttl, перезапустить клик
После этого он старые asynchronous_metric_log переименует в asynchronous_metric_log_0, новые уже будут обрезаться по ttl
Если не жалко, старые можно удалить
Клик по дефолту не ограничивает размер системных лог таблицSystem Tables | ClickHouse DocsIntroduction
-
можно отключить эти таблицы через
spec:
configuration:
files;
turn_off_tables.xml:|
содержимое взять из https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-system-tables-eat-my-disk/ -
Благодарю
-
Вопрос, можно ли как-то зафорсить клик удалить неактивные парты?
У меня их 40к (не знаю как так получилось) примерно по 2к строк в каждой
Пытался через optimize final, не получается
Или можно ли их ручками удалить? -
-
Когда пытаюсь сделать detach part пишет
Code: 232. DB::Exception: No part 20220822_5339825_5344853_3866 in committed state. (NO_SUCH_DATA_PART) (version 22.5.1.2079 (official build)) -
DEACH PART только на active=1 парты действует
-
подождите 480 секунд, удалятся сами...
-
Понял, а как тогда удалить active=0 парты, если их 40тыщ?
-
Они уже 4 месяца там сидят ) Вроде
-
добрый день. вопрос по агг-функциям. хочется странного: узнать уникально ли значение столбца в агрегируемом подмножестве.
что-то вроде count(distinct x) = 1, но чтобы не взрывался по памяти на большой кардинальности, потому что насколько именно больше одного не имеет значения. на данный момент запрос целиком выглядит примерно вот так (сделан через topK(2)(...)):
https://pastila.nl/?01e6e7ff/0ba60d47d7ae1c93fcc746f303c7aa00
еще в рассмотрении`groupUniqArray(2)(...)`, судя по описанию, он не должен использовать кучу памяти
есть более оптимальные варианты? -
если новые постоянно появляются. то увеличивайте кол-во строк на один INSERT (реже вставляйте например больше кол-во)
-
remove_time 2022-08-23 03:10:22
-
если имя_таблицы в backtrace кавычках вот таких `
то там полноценный UTF даже возможен
на диске это все в URL Encode преобразуется
ну и еще ограничено все длиной имени пути файла в файловой системе, так что сильно длинные не надо делать
но чтобы вам спалось спокойнее, лучше тупо символ подчеркивания и латинские буквы с арабскими цифрами использовать -
спасибо!
-
а что у вас стоит в
SELECT * FROM system.merge_tree_settings WHERE name='old_parts_lifetime'? -
name old_parts_lifetime
value 480
changed 0
description How many seconds to keep obsolete parts.
type Seconds -
очень странно
>Inactive parts are removed if they are not used by current queries
у вас там никаких мутаций или еще чего то такого нет?
SELECT count() FROM system.mutations WHERE is_done=0 ?
через lsof
можете посмотреть на файлы партов, они открыты из clickhouse-server процесса? -
Я сейчас запустил optimize final для партиции, он собрал все 138 неактивных партов в этой партиции в один большой неактивный парт...
-
вы же сказали что у вас там их 40 тыщ, откуда теперь 138 ?
-
При этом он не удалил эти 138 неактивных партов
-
Это по всем партициям
-
>Inactive parts are removed if they are not used by current queries
может их читает все еще кто-то ? -
Мутаций нет
-
какая версия clickhouse-server?
имеет смысл попробовать рестартовать сервер
еще может у вас кто-то сделал SYSTEM STOP MERGES
попробуйте SYSTEM STOP MERGES db.table; и тут же SYSTEM START MERGES db.table; сделать? -
Версия 22.5.1
Рестартовал, и там при рестарте он 30 минут мурыжит какие-то tmp_insert
Сейчас попробую -
Вот это он пишет минут 30
-
обновитесь до 22.8 хотя бы
-
Полученный большой парт, который получился после optimize, он удалил ))
Мелкие парты так и остались -
ну ... у вас что-то не то с таблицей, откуда то куча незавершенных insert в системную таблицу
SELECT uuid FROM system.tables WHERE database='system' AND table='metric_log'
systemctl stop clickhouse-server
и удалите
/var/lib/clickhouse/store/<XX префикс от uuid из SQL запроса>/<uuid из SQL запроса>
ну или без рестарта попробуйте
TRUNCATE TABLE system.metric_log SYNC; -
что-то должен был сказать по этому поводу в логах
-
а какая таблица то ? system.metric_log ?
-
uuid 00000000-0000-0000-0000-000000000000 это норм?
-
Нет, обычная таблица, AggregatedMergeTree
-
В том плане, что не системная
-
это НОРМ, если таблица в базе у которой Engine Ordinary
в 22.5 system база должна быть Atomic насколько я помню
SELECT engine, name FROM system.databases; -
В логах там же кошмар творится, все время какие-то записи идут и как среди этого искать то, что нужно я не знаю
-
Да, там Atomic
-
ну grep имя_вашей таблицы /var/log/clickhouse-server/clickhouse-server.err.log для начала
-
Нет, обманул, system там Ordinary
-
где Atomic ? в базе где у вас таблица с uuid=00000-... ?
-
А в таблице с uuid=000 Atomic
-
покажите точно запросы и результаты как есть на pastila.nl выложите
-
-
а теперь запрос и результат где uuid 00000 ?
-
-
А вот там, где куча мертвых партов
https://pastila.nl/?00585198/cc5c3180eddd320190978bc4a9d7ad66 -
это ок. system.metric_log лежит в Ordinary так что такой и должен быть uuid
можете его почистить через TRUNCATE TABLE system.metric_log SYNC -
тут тоже все ок
и вот в этом сообщении видимо вы ерунду написали тогда
https://t.me/clickhouse_ru/303232Alexey in ClickHouse не тормозитА в таблице с uuid=000 Atomic
-
Ааа, всё, кажется понял
Не хватает RAM для мержа
2022.12.09 13:16:58.938215 [ 16332 ] {} <Error> void DB::MergeTreeBackgroundExecutor<DB::MergeMutateRuntimeQueue>::routine(DB::TaskRuntimeDataPtr) [Queue = DB::MergeMutateRuntimeQueue]: Code: 241. DB::Exception: Memory limit (total) exceeded: would use 3.46 GiB (attempt to allocate chunk of 4219524 bytes), maximum: 3.46 GiB. (MEMORY_LIMIT_EXCEEDED), Stack trace (when copying this message, always include the lines below): -
Это из логов ошибок
-
Да, я там уже начал путаться
-
-
Вот это мой случай с кучей неактивных партов. Они появляются после рестарата КХ и висят вечно. Помог апдейт 2.5.1 - 2.5.4.19. сами выпилились
-
Нашёл как заставить правильно работать: https://github.com/ClickHouse/ClickHouse/pull/39567
Нужно активировать wait_end_of_queryAdd result_rows and result_bytes to progress reports by Algunenano · Pull Request #39567 · ClickHouse/ClickHouseChangelog category (leave one): New Feature Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Add result_rows and result_bytes to progress reports (X-...
-
Понял, попробуй, спасибо
-
пичалька
словари есть какие то ?
сколько всего RAM?
можете временно все SELECT стопнуть с сервера (firewall наружу 9000 и 8123 порт например закрыть или listen_host поставить только 127.0.0.1 )? -
Словари мелкие, RAM... 4GB... да, тяжело )))
-
А там и так все стопнуто наглухо
-
Там при запуске КХ вот эти tmp_insert забивают 2ГБ оперативы и висят
-
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-who-ate-my-memory/
вот тут еще посмотрите может найдете что жрет память... -
Понял, спасибо большое!
Сначала попробую сделать апдейт клика, а уже потом посмотрим что и как будет -
Говорят, что починится )
-
Есть ограничение на длину имени таблицы, оно соответствует максимальной длине название папки в linux
-
-
А есть такая оптимизация повторной вставки, которая мешает сработать триггеру?
У меня основная вставка во вспомогательную таблицу (ReplicatedReplacingMergeTree), а из неё MATERIALIZED VIEW переносит данные в основную, с джойном дополнительных атрибутов. Когда этот джойн падает по памяти, остаётся порция данных во вспомогательной таблице, которая не попадает в основную. И повторные вставки во вспомогательную как-будто вообще не выполняются, просто по-быстрому успешно завершаются.
При том в логе у нормальной вставки параметры такие:
query_duration_ms: 7390
read_rows: 903
written_rows: 1806
memory_usage: 886589322
А после сбоя (повторные вставки той же порции данных, которая уже есть во вспомогательной таблице, но нет в основной):
query_duration_ms: 260
read_rows: 871
written_rows: 871
memory_usage: 26778155 -
хороший вопрос кстати, тоже интересно
-
-
если данные повторно вставляются как есть, то есть тот же самый блок, тогда идед дедупликация по контрольным суммам блоков для ReplicatedMergeTree
зачем вам дубли данных? -
-
если я правильно понял, то схема такая
T1 -> MV -> T2
если запрос упал по памяти при работе MV, то в Т1 данные есть, а в Т2 их нет. при повторной вставке в Т1 дедубликация не пропустит данные в Т1, а до MV и Т2 они доедут? -
Всем привет, можно ли как-то посмотреть какие проекции (PROJECTION) есть у таблицы?
-
да
-
пока нельзя к сожалению
можете создать issue На github
ну или https://github.com/Altinity/clickhouse-backup/
попробоватьGitHub - Altinity/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages supportTool for easy ClickHouse backup and restore with cloud storages support - GitHub - Altinity/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages support
-
SHOW CREATE TABLE они там отображаются
-
Спасибо!
-
Здравствуйте! Может кто помочь как дублировать таблицу в Кликхаусе? Гуглю не нахожу
-
INSERT INTO SELECT FROM
-
-
Обновление с 22.5.1 до 22.5.4.19 помогло
Он после рестарта клика прочитал все эти парты и после того как всё прочитал сразу же удалил их -
Помогло, спасибо! )
-
а есть способ дропнуть дубликаты в таблице? гуглю и нашел только лишь один способ:
OPTIMIZE TABLE table DEDUPLICATE BY name
но он требует чтобы после BY были другие колонки, чем мне нужно -
Дубли-то в промежуточной таблице, которая вообще должна переехать на движок null. А в основной данных нет.
Вот нашёл опцию deduplicate_blocks_in_dependent_materialized_views, вроде как ровно про этот случай. -
Ты хочешь по всем колонкам или как?
-
к сожалению нормального способа кроме
SHOW CREATE TABLE db.name;
нет -
Есть CREATE TABLE new_table AS existing_table и CREATE TABLE new_table AS SELECT ...
-
Привет! Подскажите, пожалуйста, может ли тип данных поля, по которому строится индекс, влиять на скорость выполнения селектов с фильтрацией по этому индексу? Я экспериментирую и попробовала сделать таблицу с order by userTimestamp (тип данных DateTime64(3)) и простой селект по userTimestamp за один день работает сильно дольше, чем аналогичная таблица, но с order by timestamp (тип данных DateTime).
-
Очень вряд ли.
Размер типа, конечно, влияет на размер "индекса" (и т.о. потребление памяти, диска и т.п.) Но в таких масштабах это не должно быть заметно.
Скорее, в одной из таблиц данные лежит сильно другие и по-другому (версии, кеш и т.д.) И если сделать две новых, заполнить одинаковым набором данных и погонять несколько раз, получится одно и то же.
(Ну либо есть какая-то супероптимизация для DateTime.) -
Попробовал удалить дубли по дате командой:
ALTER TABLE capacity_planning.service_metrics DELETE WHERE
(SELECT row_number() OVER ( PARTITION BY date_utc)
FROM capacity_planning.service_metrics) != 1
но ничего не удаляется. может кто обьяснить почему? -
Удаление происходит не моментально, в system.mutations вроде можно понять состояние мутации
-
Выдачу подзапроса проверьте, возможно row_number везде 1 выдаёт, он в clickhouse не совсем ожидаемо работает(внутри блока считает)
-
Селект 300к строк по 4 столбцам из 1кк строк с фильтром по DateTime у меня заняло ~70мс, по DateTime64(3) ~50мс
-
+ запрос не очень понятно написан, какое логическое условие в него закладываете?
-
дропнуть те строки где оконная функция не равна 1
-
мы делаем партицию по дате и проходимся оконкой row_number, там где не 1 - дубликат
-
@philipbu
-
а покажите create table :) ?
-
спасибо, попробую еще)
-
-
спасибо)
-
Имхо count() маловато, оно вообще может внутрь данных не влезать. Я бы брал какой-нибудь avg(group_id).
Но по-сути результат будет такой же :) -
ага у меня там 1.64 billion строк
-
Если так, то надо, чтобы было условие на вхождение записей таблицы в подзапрос, а сейчас вывод подзапроса просто сравнивается с 1
-
Да это я случайно вставил код с count(), а так я использовал * и потом по query_log считал время обработки запроса
-
Делал по 5 запросов на таблицу и считал среднее время
-
а как кеш работает? я вижу, что на холодную запрос сильно дольше отрабатывает
-
как кеш почистить?
-
-
SYSTEM DROP MARK CACHE
-
мерси
-
toTypeName
-
Может вам просто replacingmergetree с ключом date_utc поможет?
Это будет делать схлопывание соответствующее ожиданиям более стандартным способом -
потестили с этой настройкой? если я правильно понял то =1 включает дедубликацию на уровне MV, чтобы данные не тормозились на уровне T1
-
Зайди в system.mutations и найди свою мутацию, либо она еще не выполнилась, либо там ошибка при мутации
-
Да, я так тоже понял, что это ровно мой случай.
Но пока не протестил. Думаю, как лучше поступить в пятницу: дождаться очередного сбоя в проде или вызывать его :) -
Спойлер: там ошибка )
-
По-крайней мере, простое добавление SETTINGS deduplicate_blocks_in_dependent_materialized_views=1 в INSERT не помогло. (Может, v20.5 для этого старовата... Но настройка есть.)
@m1khal3v -
Кажется ты не мне это писал )
-
Всё, теперь ты реплицированные MV проверяешь!
(Да, промахнулся. Спасибо.) -
Ну блииин, уже конец пятницы, можно не надо? )
-
uniqUpTo(1)(x)
-
Почта Банк выплачивает по 3000 руб всем своим клиентам которые прошли опрос и оставили отзыв о работе банка.
Доступно всем действующим клиентам.
Акция проводится на официальном сайте - link -
Почта Банк выплачивает по 3000 руб всем своим клиентам которые прошли опрос и оставили отзыв о работе банка.
Доступно всем действующим клиентам.
Акция проводится на официальном сайте - link -
большое спасибо 🙏
-
https://github.com/ClickHouse/ClickHouse/blob/15a3ed2e3bd130d76c1e75acf448879e7b6d1a19/tests/queries/0_stateless/02124_insert_deduplication_token_materialized_views.sql
можно попробовать SET перед инсертомClickHouse/02124_insert_deduplication_token_materialized_views.sql at 15a3ed2e3bd130d76c1e75acf448879e7b6d1a19 · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
для истории напишу: преступление раскрыто - я не поменяла полечко в partiotion by. Нужно, чтобы order by, partiotion by содержали одно и то же поле обязательно
-
это правда тест про токен. вот тест про сабж
https://github.com/ClickHouse/ClickHouse/blob/71fb04ea4ad17432baba7934a10217f5f6a1bde3/tests/integration/test_force_deduplication/test.pyClickHouse/test.py at 71fb04ea4ad17432baba7934a10217f5f6a1bde3 · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Точно, SET работает. Спасибо!
-
круто, у себя тоже теперь включим)
-
Привет! Смотрите, хочу сделать бенчмарк INSERT, но почему-то не выходит. Может кто подскажет?
-
-
⛔Набираем еще один поток в команду для арбитража криптовалюты⛔
Преподавательский состав - это опытнейшие известные специалисты‼
⛔Абсолютно понятная новая тема с высокой доходностью даже для новичков⛔
🗣Не берём денег за курс - всего лишь незначительный процент с вашего дальнейшего дохода‼
А еще мы научим торговать альткоинами и картинками NFT☑
Даже если у вас нулевые знания, мы всему научим
Писать в личку: @AntoNArbitra
☑Ничего оплачивать не надо, только процент с вашего будущего дохода, после того как всему научишься💰 -
-
Приветствую!
Может кто-нибудь сталкивался с тем что grouping sets не работает нормально с функцией max?
https://fiddle.clickhouse.com/5ea6a194-4097-4905-9861-5dbc39036855
В примере два запроса, в обоих есть по два сета группировки
Пустой () и альтернативный (*) для А и (uid, name) для B
Казалось бы, пустой сет должен показать одинаковые значения для обоих запросов, но нет
Для обоих запросов одинаково правильно работает count, sum и даже groupArray, но функция max в запросе А возвращает дефолтные значения, а в B, о чудо, работает корректно...
Буду признателен если кто-нибудь подскажет в чем может быть проблема - 10 December 2022 (26 messages)
-
здравствуйте. столкнулись с проблемой. версия 21.12. в кафку, которую читаем Engine=Kafka + Mat.View, прилетели кривые данные для столбца партиционирования, в логе поток ошибок вида <Error> executeQuery: Code: 252. DB::Exception: Too many partitions for single INSERT block (more than 100). The limit is controlled by 'max_partitions_per_insert_block' setting. Large number of partitions is a common misconception. It will lead to severe negative performance impact, including slow server startup, slow INSERT queries and slow SELECT queries. Recommended total number of partitions for a table is under 1000..10000. Please note, that partitioning is not intended to speed up SELECT queries (ORDER BY key is sufficient to make range queries fast). Partitions are intended for data manipulation (DROP PARTITION, etc). (TOO_MANY_PARTS) (version 21.12.3.32 (official build)) (from 10.35.28.8:42358) (in query: INSERT INTO ... (...l) VALUES). в определение MV добавили WHERE, откидывающий записи с кривыми данными. отключали Engine=Kafka + Mat.View, пересоздавали их, выполнили detach-attach самой ReplicatedMergeTree таблицы - ошибки не уходят. как будто где-то внутри ClickHouse сохраняются куски битых данных, которые он продолжает пытаться вставить. как всё же помощь серверу про эти данные забыть?
-
-
Нужно попробовать понять какое количество партиций образуется при инсерте, и либо увеличить max_partitions_per_insert_block до этого значения, либо каким-то образом уменьшить кол-во партиций
-
Подскажите, средствами чего можно попробовать понять? Вчера споткнунлись о нечто подобное, правда пробовали .tsv’шку залить и какая-то чась даже заливается
-
-
можно попробовать таблицу приёмник на время сделать без партиционирования, и после нескольких вставок посчитать колличество партов, которое бы получилось если бы партизионирование в таблице было
-
можно укрупнить партиционирование, например если сделано по дням, то переделать на месяцы и т.п.
-
оказалось, неправильно эту настройку прописывали, поэтому и эффекта не было. по привычке в файл в каталоге config.d прописывали, а нужно было в каталоге users.d.
-
-
кстати да, тоже сразу не там писали
-
-
-
если кластер - clickhouse-copier. Если не хотите через утилиту или у вас старая версия КХ, - тут только скрипт по конвертированию таблицы в реплицированную + attach партиций к новой таблице.
-
Спасибо! Скрипт самому придётся сочинять или есть какие-то экзамплы?
-
-
-
-
Ещё можно сделать в кластере insert into select from remote(single node)
-
Так и сделали
1. Создали нужные таблицы в кластере уже с ReplicatedMergeTree;
2. создали нужные таблицы с полями;
3. Перелили дату
clickhouse-client --host <src_host> --port 9000 --password <'your_password'> --query "SELECT * FROM <db_name>.<table_name> FORMAT CSV" | clickhouse-client --host <dst_host> --password <'your_password'> --query "INSERT INTO <db_name>.<table_name> FORMAT CSV”
Но печему-то везде это процесс описсан как-то через чур замысловато, а тут изи всё оказывается -
Ну конкретно так я несколько раз натыкался на разрыв соединения, а если лить через функцию remote - все хорошо. Но энивей если уже прошло - значит все ок
-
-
Это объясняет )
-
так то у нас изначально воникла проблемка типа
Code: 252. DB::Exception: Too many partitions for single INSERT block
починили добавлением <max_partitions_per_insert_block>0</max_partitions_per_insert_block> в users -
а функция remote поудобнее? или просто надёжнее?
не совсем понятно, что за функция - это нативный функционал? -
remote, remoteSecure | ClickHouse Docs
Allows accessing remote servers, including migration of data, without creating a Distributed table. remoteSecure - same as remote but with a secured connection.
-
Благодарочка
- 11 December 2022 (42 messages)
-
Добрый день!
Прошу прощения, туплю
два идентификатора в одной таблице могут быть отдельно или парой
во второй соответствие может быть с разными статусами
как выбрать только максимально заполненный вариант? -
-
я бы попробовал макс-на-тупл - max((user_id,status)) или даже argMax(id,(user_id,status)), но вы не дали данных в fiddle, чтобы проверить.
-
-
первая - транзакции, вторая - результат транзакций
но в первой два внешних ключа которые могут быть по отдельности или вместе -
пока кажется проще выкинуть из результата идентификатор транзакции и взять max по всем трем полям
-
или по id nj;t dpznm vfrc
-
SELECT max(f.id) id, max(f.account_id) account_id, max(f.user_id) user_id, max(fm.status) status
-
взял от всего макс
-
был не прав )
-
не подходит
-
У меня все получается, в том как я вас понял https://fiddle.clickhouse.com/8a11fe79-929c-4e05-ace2-21967366556e если нужно чтото иное - поясните
-
пытаюсь понять )
-
не, несколько не то
-
-
-
-
в первой таблице может быть либо id1 либо id2 либо оба. Мне нужно по максимуму, и самый заполненный статус
-
впрочем ладно, мне сами идентификаторы не обязательно, попробую подзапросом или окном просто посчитать количество
-
INNER JOIN
-
нелья
у меня есть все транзакции, и только часть из них связана по одному из двух (или по обоим) идентификатору с таблицей статусов. Если статуса нет, то эта транзакция должна остаться в выборке, просто с нулом в поле. -
в общем пока я просто сделал два LEFT JOIN который выбирают id1, max(status) и еще один который id2,max(status), а снаружи я делаю coalsec(id1,id2),coalsec(status,status)
-
с алиасами конечно
-
Если если ифами каждое поле привести 1 если но не Null
-
и потом суммировать все поля в последнем
-
и сортировать по нему?
-
if (FIELD1, 1, 0) as FIELD1_
...
FIELD1_ + FIELD2_ ... AS sum
Order by sum DESC -
Тогда по идее в топе будут самые заполненные наборы
-
можно и так, но мне же по нему соединение делать
-
и что тогда, типа если sum = 1+id1 OR sum = id2+1
можно не те эквиваленты схлопотать -
Так это другое поле будет
-
Вы можете сами свои веса задать и на основе их строить сортировку
-
-
вот для финальный
(2,15)(5,2)
мне для первой надо найти статус по первой 2 а для второй пары по второй 2 -
-
Всем доброго времени суток. Вопрос не на решение проблемы,
-- Code: 184. DB::Exception: Aggregate function argMax(field2, timestamp) is found
-- in WHERE in query: While processing argMax(field2, timestamp).
-- (ILLEGAL_AGGREGATION) (version 22.9.3.18 (official build))
SELECT
CAST(alias.id, 'UInt32') AS id,
CAST(argMax(alias.field1, alias.timestamp), 'Int64') AS field
, CAST(argMax(alias.field2, alias.timestamp), 'Float32') AS field2
FROM t alias
PREWHERE
alias.field1 = 500 AND
alias.field2 BETWEEN 500 AND 600
GROUP BY alias.id;
Вот на такую ошибку уже есть фикс от разработчиков, или может быть хотя бы уже Issue кто-то создал? Просто конкретно эта ошибка порядком 3ае6**а. Если у кого есть информация как это пофиксить без обновлений или ожиданий оных, то буду премного благодарен -
-
-
-
Ну в коде я так и делаю, собственно говоря. Я для работы использую алиас таблицы, но эта падла его опускает, в ошибке белым по красному написано, что существующие колонки это: CAST(id, ...), CAST(argMax(field1, timestamp), ...), CAST(argMax(field2, timestamp)), алиасы колонок вывода, алиас таблицы он в упор не видит и не хочет. И ладно, с where ещё можно разобраться полумерами, а с директивой order by что делать?) Мне нужно по алиасу просортироваться. Ощущение, что синт.анал. не хочет ключевые слова разбирать, или вообще токенизатор не видит "семантику"...
-
set prefer_column_name_to_alias=1
-
Наоборот, с нулём, завелось
- 12 December 2022 (120 messages)
-
-
зависит от того на каком шарде вы ваш SELECT ... FROM distributed_table запускаете
если запускаете на шард1 то да, схема для шард2 данных шадр2 -> шард1 -> апп
там есть тонкость, что если в запросе GROUP BY есть, то на шард2 данные "предагрегируются" -
отвечу проще, через 1 сервер будет отдаваться
-
-
-
Привет!
У меня вопросы про создание копии таблицы. Есть чудесная статья https://kb.altinity.com/altinity-kb-schema-design/change-order-by/, но мне не понятно:
в эту временную таблицу
example_table_temp
нужно и инсертить данные из исходной, и аттачить партиции, разве только инсерта не достаточно?
после этого написано, что временную таблицу удалить можно, но не сказано, как из временной таблицы данные попадут в "нормальную"🙂
Подскажите, пожалуйста)How to change ORDER BYHow to change ORDER BY.
-
Вы про 4 и 5 шаг ?
В 4 шаге, вы в tmp таблицу данные заливаете
В 5 шаге, вы в новую таблицу делаете аттач -
а, точно, невнимательно прочитала, спасибо
-
Всем привет! Подскажите, пожалуйста, а можно ли в данном запросе зафиксировать результат players_sample?
Суть:
1. Берем сэмпл игроков
2. Берем два одинаковых запроса target и transactions_7d с WHERE на этот сэмпл игроков
3. JOIN'им результаты и получаем число строк меньше, чем в LIMIT players_sample
Т.е. в target и transactions_7d подмножества игроков различаются.
WITH players_sample as (
SELECT
DISTINCT player_id
FROM
luna.adjust_purchase_events
WHERE
1
AND datetime < now() - toIntervalDay(14)
AND game_id = 'hclinic'
LIMIT
1000
),
target as (
SELECT
game_id,
player_id,
sum(revenue_usd) as revenue
FROM
luna.adjust_purchase_events
WHERE
1
AND game_id = 'hclinic'
AND datetime < now() - toIntervalDay(14)
AND player_id in players_sample
GROUP BY
game_id,
player_id
),
transactions_7d as (
SELECT
game_id,
player_id,
sum(revenue_usd) as revenue
FROM
luna.adjust_purchase_events
WHERE
1
AND game_id = 'hclinic'
AND datetime <= now() - toIntervalDay(14)
AND player_id in players_sample
GROUP BY
game_id,
player_id
)
SELECT
count(1) as cnt_rows
FROM
transactions_7d
JOIN target
ON transactions_7d.game_id = target.game_id
AND transactions_7d.player_id = target.player_id
> 174 -
Привет!
После обновления с 21.8.15.15 до 22.3.12.21
Запросы CREATE OR REPLACE VIEW стали отрабатывать очень долго. Можете подсказать были ли изменения в логике этой операции или надо добавлять какую-то настройку чтобы он не прогружал весь запрос целиком? -
-
Да, тк переписывание происходит на уровне AST дерева то, бывало вылезали проблемы с distributed запросами.
https://github.com/ClickHouse/ClickHouse/pull/33645
А вообще собирались включитьTurn on `optimize_functions_to_subcolumns` by default by CurtizJ · Pull Request #33645 · ClickHouse/ClickHouseChangelog category (leave one): Not for changelog (changelog entry is not required)
-
интересную ошибку словил
во вьюшке есть поле
coalesce(u.created_at,…) as created_at
и далее оно используется в группировке
вьюшка объединяет несколько таблиц в которых есть поле с таким же имене
но вроде все работает с прямыми запросами
и с запросами где из этой вьюшки берется все
но тут добавляею ее через
LEFT и ошибка что неизветное поле в GROUP BY -
пришлось в группировку повторить формулу
-
Алиас нужно использовать другой
-
да теперь понятно… но уж много переделывать
-
Да сделайте алиас другой в join'e
-
в смысле тут?
-
JOIN db1.users_v AS u
-
на что это повлияет?
-
SELECT * FROM
JOIN ( SELECT created_at as create_ad FROM db1.users_v ) as u -
так самое интересное что в этом запросе это поле не используется
-
Добрый день. Подскажите пожалуйста правильно ли я понимаю что при drop/create словарей конструкция on cluster не используется и необходимо создавать словарь на каждой реплике по отдельности?
-
неправильно. достаточно посмотреть в документацию - https://clickhouse.com/docs/en/sql-reference/statements/create/dictionary
-
там в пятом пункте
"5. Attach data from the intermediate table to example_table"
для быстрого переноса через ATTACH сделано
и потом
"6. Drop example_table_old and example_table_temp"
все вроде норм по инструкции -
Да-да, спасибо, я криво прочитала)
-
Да, но не очень понимаю как создать словарь на реплике если у каждой реплики свое название а словарь должен смотреть именно а таблицу на своей реплике? в SOURCE как хост записать при конструкции ON CLUSTER?
-
да, словарь смотрит на таблицу на своем сервере. которая должна быть Replicated. Все названия - в описании кластера. При необходимости (если есть шарды), описываете еще один кластер, где все узлы - реплики.
-
Спасибо, попробую👍
-
Добрый день, подскажи почему из table engine buffer, данные не сбрасываются висят даже после max_time, в чём может быть причина - ( основная масса данных перелились ) но на одном сервере осталась часть строк таблице типа буфер.
-
смотрите /var/log/clickhouse-server/clickhouse-server.err.log
там обычно структура underlying таблицы другая -
Если players_sample добавить в финальный JOIN вместо WHERE каждого из подзапросов, то число строк совпадает, но запрос раздувается по памяти.
SELECT
count(1) as cnt_rows
FROM
transactions_7d
JOIN target
ON transactions_7d.game_id = target.game_id
AND transactions_7d.player_id = target.player_id
JOIN players_sample
ON transactions_7d.game_id = players_sample.game_id
AND transactions_7d.player_id = players_sample.player_id -
Спасибо и правда ошибка выпала!
-
-
https://clickhouse.com/docs/en/engines/database-engines/materialized-postgresql/?ysclid=lbkukjp43c38961494 эту доку читал[experimental] MaterializedPostgreSQL | ClickHouse Docs
Creates a ClickHouse database with tables from PostgreSQL database. Firstly, database with engine MaterializedPostgreSQL creates a snapshot of PostgreSQL database and loads required tables. Required tables can include any subset of tables from any subset of schemas from specified database. Along with the snapshot database engine acquires LSN and once initial dump of tables is performed - it starts pulling updates from WAL. After database is created, newly added tables to PostgreSQL database are not automatically added to replication. They have to be added manually with ATTACH TABLE db.table query.
-
CREATE DATABASE <dbname> ON CLUSTER <clustername>
ENGINE = MaterializedPostgreSQL('hostname:5432', 'etl', 'user', 'password')
SETTINGS materialized_postgresql_max_block_size = 65536,
materialized_postgresql_tables_list = 'db.name',
materialized_postgresql_tables_list_with_schema = 1; -
-
-
там таблицы загружаются лениво в фоне, так что может не быть таблицы если при ее загрузке была какая-то ошибка, проверьте логи.
-
логи посмотрел. ни какого криминала не нашёл
-
а какая версия сервера?
-
22.5.2.3
-
на 22.9 бы проверить или 22.8 хотя б, там были фиксы того, что некоторые исключения могли не логироваться
-
в логах postgresql вижу такую ошибку: ERROR","42P01","relation ""pg_publication"" does not exist",,,,,,"SELECT exists (SELECT 1 FROM pg_publication WHERE pubname = '<dbname>_ch_publication')",30,,"parse_relation.c",1028,
-
Добрый день!
будет ли разница в скорости между
drop table
create as select
и
truncate table
insert as select
? -
ну видимо в Greenplum нет таблицы pg_publication, а в коде движка проверяется то, что в ней лежит, в PostgreSQL эта таблица всегда есть
-
в гринпламе такой таблицы действительно нет. печально...
-
Не так уж и печально IMHO. Потому что это не единственное свойство GP, не дающее возможности использовать MaterializedPostgreSQL в CH.
Как вы планировали организовать взаимодействие GP и CH?
Каждый сегмент ходит в CH сам по себе? -
Коллеги, привет!
Помогите, пожалуйста, советом.
Есть база данных на постгресе. Факты и справочники. Задача - перенести на кликхаус. Вопрос: можно ли это влоб переносить или данные должны быть как-то реорганизованы? -
Привет, в кластере на всех содах поменял параметр в users.xml, но в system.settings изменений не вижу. Куда посмотреть? Параметр local_filesystem_read_method был не дефолтный, а теперь вернул дефолт (убрал из конфига)
-
пока взаимодействие реализовано по jdbc
-
А какой тип данных и объем? Переносить можно по разному. От выгрузки в файлик до костылей на питоне.
-
Разные: строки, числа, всё подряд.
-
Объем в данном случае 2,4 Гб. Но вопрос скорее общий.
-
Переносим просто таблицы или из надо до переноса как-то хитро заджоинить?
-
Моя компания делает коннектор между GP и CH https://arenadata.tech/products/arenadata-quickmarts/ , ну и мы думаем над дальнейшей судьбой этой штуки, куда ее правильно развивать.
Так что если расскажите, какая у вас боль, какую проблему пытаетесь решить, буду признателен.
Да, коннектор является частью arenadata'вского дистрибутива GP, отдельно его получить нельзя ;(Arenadata QuickMartsArenadata QuickMarts - кластерная колоночная СУБД, созданная на базе ClickHouse, ориентированная на Enterprise-сегмент, с корпоративной поддержкой, функционалом и контролем качества релизов.
-
Увы, тут всё зависит от ваших дальнейших задач.
В целом вам достаточно просто перенести таблицы -
Понял, спасибо. Дальнейная задача - сравнение быстродействия.
-
да я сплю и вижу как мы переедем на арену с ванильки...
-
Не совсем про это я)
Вы будете много писать и менять в этих таблицах? Или только читать из них?
Тут многое будет зависеть от движка.
Может вы в CH поставите мемори, вы будете быстрее читать из базы, но стабильность может снизиться, относительно постгри -
Я вас не призываю куда-то переезжать, я прошу поделиться задачей, которую вы решаете.
Потому что это может быть полезно.
Ну да воля ваша. -
Будем читать в основном
-
-
лучше конечно заджойнить в широкие денормализованные таблицы. Можно даже маленькие словарики в LowCardinaly(String) собрать.
И над order by подумать. И партиционированием. И skip indexes. Просто так скопировать схему точно не выйдет. 2.4G на все про все - это конечно очень мало, может быть и просто заработает. Но если вопрос "в общем", в расчете на терабайты, то менять придется, и сильно. -
Борис, спасибо! А где про такую переподготовку базы почитать?
-
Вы хотите сравнить скорость на чтение постгреса и Clickhouse? Выйграет Clickhouse:)
-
Ну, эксперимент всё равно надо провести:)
-
Вы не то сравниваете, это как грузовик с гоночным болидом сравнивать.... У них 4 колеса, ну значит можно сравнить ...
-
OLAP MPP vs OLTP, что же быстрей в аналитике данных ? Кхм может то что называется OLAP? Да не бред надо сравнивать :) Но на ваших объемах любая база будет быстрая :)
-
Что-то здесь не так, должно работать.
И клиент и сервер свежие? -
-
-
-
-
у кого-нибудь было такое? как там процесс работает?
-
Ну скорей всего, 18 версия это 18 года версия ....
-
Простая установка
curl https://clickhouse.com/ | shFast Open-Source OLAP DBMS - ClickHouseClickHouse is a fast open-source column-oriented database management system that allows generating analytical data reports in real-time using SQL queries
-
понятно_) спасибо, я все понял теперь
-
Вышли курсы от Clickhouse inc бесплатные https://learn.clickhouse.com/visitor_class_catalog
-
-
когда chunk начинается со строки длиной=13, кх ругается на неполные данные (Code: 33. DB::Exception: Cannot read all data. Bytes read: 12. Bytes expected: 101.: (at row 1)\n: While executing BinaryRowInputFormat. (CANNOT_READ_ALL_DATA) (version 22.10.1.1175 (official build)))
-
-
-
-
я вас понял. задачу сформулирую - вышлю вам в личку
-
Это не переподготовка, это проектирование dwh системы с учетом особенностей КХ. Я такую штуку делаю на теории Kimball - он там 20 лет назад все расписал про денормализацию, широкие таблицы, факты-измерения, куда можно ходить, а куда не надо. Очень многое хорошо ложится на то, что есть в КХ. Если есть желание читать - The Data Warehouse Toolkit
-
Борис, спасибо большое!
-
Ребят, подскажите пожалуйста, а если хотим заменить один сервер клика на другой … rsync всю дату\store скопировали … то clickhouse_id ставить тот же, который был на старом сервере или можем инкрементировать ?
и что делать с zookeeper’ом ? -
Добрый вечер, хочу проверить таблицу.
В Dbeaver выполнил :
CHECK TABLE repbz.tabl ;
В окне "Статистика 1" выводится:
Updated Rows 0
Query CHECK TABLE repbz.tabl
В окне "SQL terminal": " 0 row(s) modified."
Но как пишут https://clickhouse.com/docs/en/sql-reference/statements/check-table/ должен быть вывод вида:
┌─result─┐
│ 1 │
└──────┘
Пожалуйста подскажите где ошибка!CHECK TABLE Statement | ClickHouse DocsChecks if the data in the table is corrupted.
-
указанный в документации вывод относится к clickhouse-client. Dbeaver and DataGrip возможно не знают что такое CHECK, и как правильно отображать его вывод.
-
Спасибо!
-
видимой разницы не будет
drop table ... sync
лучше использовать... -
А что даёт sunc?
-
что такое clickhouse_id ?? тег внутри <macros> ?
-
для Atomic немедленно данные удаляет, а не ждет 480 секунд...
-
<replica>ch1</replica>
-
вот если делаем замену - можно ли инкрементировать или оставляем тот же ?
-
а это где вы такое пишите? у меня <replica> - это часть конфигурации кластера. И там внутри еще много тегов может жить, а не просто константа:
<replica>
<host>example01-01-2</host>
<port>9000</port>
</replica> -
Если название реплики измените, то её надо будет удалить в zookeeper из всех путей с таблицами
Прописать в конфиг кластера новое название, сначала на этом узле
Выполнить
sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data
После запускать кликхаус сервер на нем
Потом менять конфиги кластера на остальных серверах
Если название реплики не менять, то достаточно на сервере выполнить
sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data
И после запускать кликхаус-сервер
Обязательно проверьте все это на dev) -
Судя по всему это в макросе
-
я думаю стоит пока сделает как расширение реплик, воспользоваться https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/replication/#vosstanovlenie-v-sluchae-poteri-vsekh-dannykh, а далее убрать ту реплику из конфигов, удалив её также из зукипераРепликация данных | ClickHouse Docs
table_engines-replication}
-
правильно же мыслю ?
-
… то есть прописываю на новом сервер более полный конфиг с описание всех шардов и реплик, создаю флаг, запускаю
-
и потом … прописываю на оставшихся серверах новую реплику определённого шарда ?
-
Вроде все верно
-
Коллеги привет. Подскажите, пож-та, что по картинке я делаю не так? :) Пытаюсь создать alias для колонки.
-
так такой колонки нет, надо колонку сперва сделать не?
-
Так вы же в нем ссылаетесь на несуществующую колонку. Если хотите обращаться к одной колонке по двум именам , то нужно сделать
test1 Float
test_alias Float alias test1
Alias тут работает не как As -
а, спасибо, теперь понял)
-
Всем привет, подскажите пожалуйста, как можно реализовать следующее.
Есть сервер, на нем MergeTree таблица, в неё собираются разные данные, требуется часть этих данных, которые отвечают определенному SELECTу копировать на другой сервер, как это можно сделать? -
-
-
У нас есть сервер, часть данных с него надо копировать на другой сервер(от него есть ip, логин и пароль для подключения через clickhouse-client)
-
-
remote, remoteSecure | ClickHouse Docs
Allows accessing remote servers, including migration of data, without creating a Distributed table. remoteSecure - same as remote but with a secured connection.
-
О, спасибо, но, я так понимаю это периодически надо будет какой-то скрипт вызывать, а нет подобного, чтобы когда данные попадали на первый сервер, нужная часть сразу попадала на второй?
-
Есть.
Вам бы почитать чего-нибудь про ClickHouse ... -
Если посоветуете что-то, буду очень благодарен.
-
Честно говоря, с любого места. В официальной документации про materialized view. И, наверное, про cluster и distributed table.
Еще про ReplicatedMergeTree. -
Спасибо большое. Кажется нашел, то, что подходит
- 13 December 2022 (112 messages)
-
это в макросах такое пишут
-
Привет всем! Какой инструмент для реализации полных и дифференцированных копий БД clickhouse вы посоветуете?
-
clickhouse-backup)
-
Backup and Restore | ClickHouse Docs
- Backup to a local disk
-
Привет! Подскажите от чего может возникать ошибка при селекте из дистрибьютед таблицы: Received exception from server (version 21.8.8):
Code: 516. DB::Exception: Received from localhost:9000. DB::Exception: Received from host:9000. DB::Exception: default: Authentication failed: password is incrrect or there is no user with such name. -
Наверно, аутентификация не удалась, траблы с логином и паролем
-
Пароли у default пользователя должны быть одинаковы
-
на данный момент пароль default отсутствует - как по умолчанию. Значит требуется установить?
-
Пробовал создать подлючение к базе MaterializedPostgreSQL. первый раз указал не корректные параметры подклюxения, теперь пересоздать не получается
SET allow_experimental_database_materialized_postgresql=1;
CREATE DATABASE postgre ENGINE = MaterializedPostgreSQL(
'****:****,
'****',
'****',
'******'
) SETTINGS materialized_postgresql_schema_list = 'public';
потом сделал drop database postgre
пробую пересоздать и получаю ошибку
SQL Error [76] [07000]: Code: 76. DB::ErrnoException: Cannot open file /var/lib/clickhouse/metadata/postgre.sql.tmp, errno: 17, strerror: File exists. (CANNOT_OPEN_FILE) (version 22.11.2.30 (official build))
Идти на сервер и дропать вручнную? -
Кхмм, кажется что просто не может установить соединение со вторым Clickhouse. Попробуйте через функцию remote выполнить запрос.
Так же проверить настройки, правильные ли адреса указаны -
Я думаю, лучшее решение создать базу с другим названием
-
думаю тут должно быть в порядке - запросы on cluster отрабатывают успешно
-
а на MergeTree может быть создана таблица Distributed?
-
ну так чсебе workaround) Хотелось бы понять в чем пробелма и как рещить на корню)
-
Клик один, без репликаций.
-
всем привет
-
DB::Exception: Cannot create table with column 'pid' which type is 'FixedString(512)' because fixed string with size > 256 is suspicious. Set setting allow_suspicious_fixed_string_types = 1 in order to allow it. Stack trace:
-
что за прикол расскажите плиз.
на 22.3.8.39 такого небыло а тут вот решили новый контейнер собрать и привет -
Да
-
Add a setting allow_suspicious_fixed_string_types to prevent users from creating columns of type FixedString with size > 256. #41495 (Duc Canh Le).
Но зачем?
Они медленно работают? как правильно то надо? -
Там же есть ссылка на issue:
https://github.com/ClickHouse/ClickHouse/issues/41452
If FixedString is used with more than 256 bytes in size, it is suspicious and most likely indicates misusage.A setting `allow_suspicious_fixed_string_types` · Issue #41452 · ClickHouse/ClickHouseUse case If FixedString is used with more than 256 bytes in size, it is suspicious and most likely indicates misusage. Forbid this by default and add a setting to override it; ATTACH queries should...
-
Я почитал конечно.
но "подозрительно" и "похоже на неправильное использование" как то не прояснило ситуацию. -
Привет, есть вопрос:
есть таблица 1 с ключевыми полями ConnectID и waitConnections, DateTime
есть таблица 2 с полями connectID, waitConnections, region, DateTime
Мне надо по записи в 1й таблице получить запись во второй по следующему принципу:
1) Найти в т2 1 запись по следующим условиям: t1.connectID=t2.connectID и t1.waitConnections=t2.waitConnections и t1.DateTime<t2.DateTime
2) Взять полученную запись из п1. (назовем ее victim) и получить еще одну первую запись из Таблицы 2(Назовем ее blocker) по принципу: victim.DateTime>Blocker.DateTime и victim.WaitConnections = blocker.connectID и victim.regions = blocker.regions
Не могу разобраться, как оперировать результатами в подобного рода запросах в CH -
Коллеги, привет!
Хочу перенести базу данных с таблицами с постгреса.
Конфиг постгреса:
listen_addressed = '*'
wal_level = logical
max_wal_senders = 10
max_replication_slots = 10
В кликхаусе:
CREATE DATABASE demo_from_postgres
ENGINE = MaterializedPostgreSQL('IP:5432', 'demo', 'clickhouse_user', 'ClickHouse_123')
SETTINGS materialized_postgresql_schema = 'bookings';
Ok.
Хочу добавить таблицу, которая есть в этой базе в постгресе:
ATTACH TABLE demo_from_postgres.seats;
Ошибка:
Received exception from server (version 22.10.2):
Code: 620. DB::Exception: Received from localhost:9000. DB::Exception: PostgreSQL replication initialization did not finish successfully. Please check logs for error messages. (QUERY_NOT_ALLOWED)
Как её исправить? -
а проблема то в чем?
джойни таблицы, формируй контекст из контекста вытакскивай нужный результат. -
Всем привет
Для полного переноса таблицы из гринплама в клик проверил Postgresql engine и pxf.
Почему pg engine справляется с переносом одной таблицы на 5 гигов в несколько раз быстрее, хотя должен работать только с одной нодой?
Его использовал как инсерт всех записей в новую клик таблицу.
Что вообще должно лучше работать для переноса таблиц из гп? -
Не полностью разобрался, но кажется, что вам нужен ASOF JOIN.
-
Привет, интересует такой вопрос. Нормально ли, что все select запросы к ReplacingMergeTree таблицам я буду вызывать с final? Чревато ли это чем то?
-
тем что запросы будут возвращать данные после final )
-
подскажите инструмент нормальный для копирования единоразового из mysql в кликхаус
-
MySQL | ClickHouse Docs
mysql}
-
это не то, я именно про трансфер данных говорю
-
Чуть переформулирую и дополню вопрос. Нужно соединять через union distinct/intersect некую статистику в таблицах MergeTree с данными, которые могут изменяться(допустим, эмейлы, телефоны и т.д.). Было решено это делать сразу в клике с помощью таблиц ReplacingMergeTree для изменяющихся данных, где все запросы к таким таблицам с final. Есть ли какие то неочевидные подводные камни в такой реализации?
-
-
Всем привет! Создал таблицы при помощи движка постгреса. Есть возможность сохранить их прямо в кликхаусе, чтобы не обращаться каждый раз к постгресу?
-
MaterializedPostgreSQL?
-
Да, я его пробовал. Это то, что нужно. Но при выполнении команды attach table вылезает такая ошибка Received exception from server (version 22.10.2):
Code: 620. DB::Exception: Received from localhost:9000. DB::Exception: PostgreSQL replication initialization did not finish successfully. Please check logs for error messages. (QUERY_NOT_ALLOWED) Подскажите, где хотя бы искать эти логи? -
https://clickhouse.com/docs/ru/sql-reference/statements/select/from/#drawbacks
Вроде все здесь и других быть не должноСекция FROM | ClickHouse Docsselect-from}
-
в таблицах вида system.*_log (system.query_log и т.п.), но они могут быть выключены по умолчанию. https://clickhouse.com/docs/ru/operations/system-tables/Системные таблицы | ClickHouse Docs
system-tables}
-
А можно как то узнать у CH произошел ли break при превышении лимита запроса? (кроме как поменять break на throw)
-
Можно для копирования данных ещё матвью на таблицу с движком Postgres попробовать повесить
-
Но это такое себе дело
-
Спасибо, тогда посмотрю логи!
-
Я бы в логах постгреса искал. Здесь же используется логическая репликация, соответственно надо проверить слоты репликации на постгресе.
+ не вижу настройку materialized_postgresql_schema в документации, используйте materialized_postgresql_table_list под ним же будет создаваться публикация для указанного списка таблиц в постгресе -
Про логи понял, спасибо. А вот materialized_postgresql_table_list - это в КХ?
-
Да, есть подозрение, что кликхаус не все возможные опции создания публикации в пг покрывает пока(эксперементально же пока)
-
Хотя в доке на английском нашёл https://clickhouse.com/docs/en/engines/database-engines/materialized-postgresql/#materialized-postgresql-schema
Проверьте по ченжлогу какие настройки для postgres поддерживает ваша версия кликхауса.[experimental] MaterializedPostgreSQL | ClickHouse DocsCreates a ClickHouse database with tables from PostgreSQL database. Firstly, database with engine MaterializedPostgreSQL creates a snapshot of PostgreSQL database and loads required tables. Required tables can include any subset of tables from any subset of schemas from specified database. Along with the snapshot database engine acquires LSN and once initial dump of tables is performed - it starts pulling updates from WAL. After database is created, newly added tables to PostgreSQL database are not automatically added to replication. They have to be added manually with ATTACH TABLE db.table query.
-
Спасибо большое, буду смотреть!
-
Ещё раз большое спасибо.
materialized view и distributed table прям то что нужно было, всё работает -
Простите: повторю запрос
Add a setting allow_suspicious_fixed_string_types to prevent users from creating columns of type FixedString with size > 256. #41495 (Duc Canh Le).
Зачем?
Они медленно работают? как правильно то надо?
В описании фичи ничего внятного не сказано. -
-
-
-
FixedString всегда тратит для хранения всю длину указанную, добивая более короткие строки до нужной длины \0, поэтому эффективнее просто String
-
Привет всем!
Подскажите что делаю не так?
DB::Exception: Keeper configuration (<keeper_server> section) not found in config
Вот сам конфиг.
<keeper_server>
<tcp_port>2181</tcp_port>
<server_id>2</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>trace</raft_logs_level>
</coordination_settings>
<raft_configuration>
<server>
<id>1</id>
<hostname>node1</hostname>
<port>9181</port>
</server>
<server>
<id>2</id>
<hostname>node2</hostname>
<port>9181</port>
</server>
<server>
<id>3</id>
<hostname>node3</hostname>
<port>9181</port>
</server>
</raft_configuration>
</keeper_server>
Вот как запускаю keeeper
sudo clickhouse-keeper --config /etc/clickhouse-server/enable_keeper2.xml -
услышал спасибо!
просто уменя айдишники такие.
тогда придется тупо забить на эту фичу. -
Здравствуйте! Прошу вашей помощи, скажите, пожалуйста, как нужно изменить запрос, который определял бы последнюю дату, в которую есть отзывы в диапазоне и считал кол-во отзывов именно в эту дату, с учетом того, что не в каждую дату диапазона могут быть отзывы.
Накидал пример в песочнице
https://fiddle.clickhouse.com/f8275b3e-fa42-456d-890b-008d60ad90db -
-
корневой элемент должен быть
<clickhouse>
или
<yandex>
а уже потом остальные элементы вложенные -
думаю вам надо завести issue на github
в clickhouse-backup есть поддержка макросов для path и use_embedded_backup_restore: true -
ОК, спасибо
-
Подскажите, пожалуйста, как можно задать порядок чтения колонок при загрузке данных из CSV?
-
Коллеги, подскажите, что не так в попытке получения данных из Kafka:
CREATE TABLE events_queue
(
message String
) ENGINE = Kafka(...) settings kafka_thread_per_consumer = 0, kafka_num_consumers = 1;
Целевая табличка такая же.
Материализатор:
CREATE MATERIALIZED VIEW events_mv TO events_json AS
SELECT message
FROM events_queue
Выдается ошибка:
<Error> void DB::StorageKafka::threadFunc(size_t): Code: 26. DB::ParsingException: Cannot parse JSON string: expected opening quote: -
https://clickhouse.com/docs/en/sql-reference/table-functions/file/
третий параметр, структура для табличной функции file
или что подразумевается под "чтением CSV"? INSERT INTO table FORMAT CSV ???file | ClickHouse DocsCreates a table from a file. This table function is similar to url and hdfs ones.
-
В Kafka лежит сложный JSON.
-
Спасибо большое!
-
что-то у вас явно не то с данными из kafaka ... какие параметры внутри ENGINE=Kafka ?
поди JSONEachRow пытаетесь вставлять. а прилетает обычная строка какая то -
Лежит:
{
"timestamp": 1670930088859,
"globalId": "f29891f8-bd37-4894-9046-c218da235803",
"vendor": "#####",
"deviceId": "########",
"format": "binary",
"message": {
"recordNumber": 0,
"timestamp": 0,
......
И валится на попытке читать message.
Ида, сейчас указано JSONEachRow -
На что заменить, чтобы читать как строку?
-
то есть лежит многострочныйJSON?
а прочитать пытаетесь как JSONEachRow?
можете в одну строку сжать его? -
Нет.
Можно прочесть данные как String? -
по идее да, лучше так
а уже потом в целевой таблице делать field DEFAULT JSONExtract ... -
А что указать в Engine Kafka вместо JSONEachRow ?
-
Привет!
не могу найти как в КХ миллисекунды превратить в Date формат
перепробовал разные функции to и from
и чето выдает постоянно не то, что ожидается -
Подразумевается, что я читаю CSV вот таким образом.
cat bookings.csv | clickhouse-client --format_csv_delimiter=',' -q 'INSERT into bookings FORMAT CSV' и вот здесь хочется указать порядок, в котором будут читаться колонки -
JSONAsString
-
Спасибо!
-
ну вы попробуйте я на 100% не уверен
-
Из коробки короче не нашел что бы оно работало. Делаю деление миллисекунд на 1000, а дальше уже просто toDate()
-
INSERT INTO booking (field1, field2, field3) FORMAT CSV
-
ну собственно говоря, время с точностью до милисекунд это дробное угу...
с микросекундами и наносекундами тоже самое -
Спасибо!
-
Спасибо, работает.
-
Type Conversion Functions | ClickHouse Docs
Common Issues of Numeric Conversions
-
-
-
Нет, можно создавать хоть миллиард. Сложно так оценить, если вы в MV внесёте сложный 1 запрос, то он может перекрыть 10 простых и т.д.
-
я понимаю, что можно создать сколько угодно, у меня больше вопрос в производительности, как сильно сказывается добавление новых несложных мат вью (агрегация по каким-то полям и простой агрегатор (сумма, количество)) на скорость вставки и потребление ресурсов
-
Замеряйте в вашем кейсе
-
CREATE DICTIONARY some_dict
(
`er_key` UInt64,
`er_value` String
)
PRIMARY KEY er_key
SOURCE(CLICKHOUSE(DATABASE 'heap' TABLE 'some_dict_table'))
LAYOUT(DIRECT())
SELECT dictGet('some_dict', 'er_value', 231)
0 rows in set. Elapsed: 0.003 sec.
Received exception from server (version 22.5.1):
Code: 516. DB::Exception: Received from localhost:9000. DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name: While processing dictGet('some_dict', 'er_value', 231). (AUTHENTICATION_FAILED)
А под какой учеткой ходит клик за словарем?
Как сделать секуьюрно, чтобы не светить пароль в DDL? -
Storing details for connecting to external sources in configuration files | ClickHouse Docs
Details for connecting to external sources (dictionaries, tables, table functions) can be saved
-
Спасибо!
Ох и не очевидно же это по доке ) -
Всем привет чат, а подскажите/расскажите!
Чем prewhere отличается от where, и что лучше использовать в каких ситуациях?
Если вдруг есть какая-то статья на эту тему тоже будет топ 👍 -
Секция PREWHERE | ClickHouse Docs
prewhere-clause}
-
-
https://clickhouse.com/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources/#dicts-external_dicts_dict_sources-executable
... otherwise, the DB user would be able to execute arbitrary binaries on the ClickHouse node.Dictionary Sources | ClickHouse DocsA dictionary can be connected to ClickHouse from many different sources.
-
👍
-
Maybe for security reasons?
-
Добрый, пытаюсь заюзать движок RabbitMQ использую строку подключения amqp://guest:guest@localhost/vhost выдает оошибку
Code: 36. DB::Exception: No username or password. They can be specified either in config or in storage settings.
что то в теме? В доках ничего не написано. Юзер точно есть на кролике. -
А вы раздали пользователю права?
> By default, the guest user is prohibited from connecting from remote hosts; it can only connect over a loopback interface (i.e. localhost). -
-
Нет это разные поды на кубере. Есть внутренние ДНС и айпишники. А юзеру на кролике нужно расширить права или права на уровне клика?
-
Ну если guest, то на кролике
-
пользователь админ
-
В доке кх, кстати, есть про конфиг
https://clickhouse.com/docs/en/engines/table-engines/integrations/rabbitmq/RabbitMQ Engine | ClickHouse DocsThis engine allows integrating ClickHouse with RabbitMQ.
-
-
В кликхаусе есть оптимизатор который переносит из where в prewhere сам, вряд-ли у вас получится думать лучше чем оптимизатор
-
в 22.7 исправлено
-
Легко получится, оптимизатор ничего не знает о природе данных.
Например, у нас WHERE по двум полям. Одно типа UInt32 имеет высокую селективность, оставляет 0.1% строк. Другое - длинная-длинная строка, да еще и с плохой селективностью. В идеале нужно закинуть в PREWHERE первое поле и не закинуть второе.
Почти уверен, что оптимизатор это не осилит.
Disclaimer: это мои домыслы, реальные особенности работы PREWHERE не знаю. -
разобрался. Сейчас другая проблема. Как подписаться на очередь. При создании таблицы он создает новый Exchanges и очередь. В общем что то новое. сижу курю
-
КХ - колоночная база. Если в запросе много колонок - они все и читаются по всем строкам c пропуском некотороых строк по skip index (разного типа), а потом идет full scan оставшихся. Однако можно сначала прочитать только некоторые колонки, проверить условие и сократить обрабатываемое количество строк (на самом деле блоков). Таким образом из остальных колонкок прочитается меньше данных.
prewere как раз и делает этот трюк.
Как использовать - дело ваше. Если знаете что делать. Я вот например как-то делал фильтрацию до final, хоть это и рискованно. Но если знать свои данные, то можно.
Если не знаете - оставьте оптимизатору. Хотя и он иногда ошибается. -
вот это лайк ❤️
спасибо! - 14 December 2022 (200 messages)
-
-
-
INSERT INTO srcTable VALUES ('AAA', 17, 'const');
INSERT INTO srcTable VALUES ('AAA', 16, 'const');
INSERT INTO srcTable VALUES ('AAA', 15, 'const');
INSERT INTO srcTable VALUES ('AAA', 14, 'const');
INSERT INTO srcTable VALUES ('FFF', 13, 'const');
INSERT INTO srcTable VALUES ('FFF', 12, 'const');
INSERT INTO srcTable VALUES ('FFF', 11, 'const');
INSERT INTO srcTable VALUES ('EEE', 10, 'const');
INSERT INTO srcTable VALUES ('AAA', 9, 'const');
INSERT INTO srcTable VALUES ('AAA', 8, 'const');
INSERT INTO srcTable VALUES ('AAA', 7, 'const');
INSERT INTO srcTable VALUES ('DDD', 6, 'const');
INSERT INTO srcTable VALUES ('CCC', 5, 'const');
INSERT INTO srcTable VALUES ('BBB', 4, 'const');
INSERT INTO srcTable VALUES ('AAA', 3, 'const');
INSERT INTO srcTable VALUES ('AAA', 2, 'const');
INSERT INTO srcTable VALUES ('AAA', 1, 'const');
на выходе должно быть:
AAA 1 const
BBB 4 const
CCC 5 const
DDD 6 const
AAA 7 const
EEE 10 const
FFF 11 const
AAA 14 const -
-
-
-
-
Что не так как нужно ? О чём вы ? Это чатик не Яндекса если что
-
На песочнице запрос работает правильно, но в консоле он просто убирает первую и последнюю строку. Что не так?
Песочница - https://fiddle.clickhouse.com/3a76adcc-7652-4dcd-a5e6-ec92735604b0 -
-
-
-
Версии одинаковые ?
-
1. Что вам нужно, это установить новый кликхаус https://clickhouse.com/docs/ru/getting-started/install#dostupnye-varianty-ustanovki . У вас установлена очень плохая версия ... Там миллиард было фиксовУстановка | ClickHouse Docs
ustanovka}
-
-
В песочнице уже может пропачена быть
-
Мы же видим только 2 цифры версии ...
-
Исключительно только скриншотам доверяете?
-
Подскажите, интеграцию с nats.io по части jetstream планируется допиливать, если да, то когда ?
-
Нет, я знаю что версия 22.1 отвратительная версия и проблема скорей всего в ней.
-
Issue на GitHub создайте, тут не сидят разработчики обычно
-
Да есть она и давно потому и спросил. https://github.com/ClickHouse/ClickHouse/issues/39459Add JetStream persistence support for NATS · Issue #39459 · ClickHouse/ClickHouse
PR #32388 implemented support for NATS. NATS has a built-in distributed persistence system called JetStream which enables new functionalities and higher qualities of service on top of the base &...
-
Понадеялся вдруг кто инсайдом обладает
-
Ну я бы предложил тэгнуть Алексея может он не видел это issue и попросить от него ответа. Так же есть Roadmap на 2023 открытое обсуждение сейчас идёт, возможно это issue туда добавить
-
-
А что именно вы хотите регулировать ? Количество потоков выполнения ?
Количество потоков выполнения - max_threads ( https://clickhouse.com/docs/en/operations/settings/settings/#settings-max_threads )Settings | ClickHouse Docsallownondeterministicmutations
-
Клик достался в наследство, хотелось бы понять что вообще может влиять на выполнение..
-
Процессор/Оперативная память/скорость хранилища
-
-
Ну понятие Нормально/не нормально, сложно интерпретировать
-
Здравствуйте чат, подскажите, как нужно изменить запрос, который определял бы последнюю дату, в которую есть отзывы в диапазоне и считал сумму отзывов именно в эту дату, с учетом того, что не в каждую дату диапазона могут быть отзывы.
Накидал пример в песочнице
https://fiddle.clickhouse.com/f8275b3e-fa42-456d-890b-008d60ad90db -
GROUP BY parent_category, category, date
ORDER BY date DESC
LIMIT 1 -
зависит от запроса, зависит от данных. Например insert по умолчанию делается в один поток, select согласно max_threads, но там ещё 100500 нюансов в зависимости от плана запроса и удачности или неудачности сделанных оптимизаций.
Не очень понятно что вы хотите узнать? Что нужно сделать, чтобы занять больше ядер? Короткий ответ очевиден - увеличивать паралелизм запросов. Но как это сделать в вашем конкретном случае - это длинная и большая тема по проектированию схемы данных и запросов под нее. -
я постараюсь вникнуть получше, чтоб понять
-
Увы так не пойдет, мне нужны все записи, не одна
-
ну посчитайте эту дату отдельно - https://fiddle.clickhouse.com/de6b125d-03da-49e8-a717-1289ab2a8155
-
Не совсем то, что нужно, т.к. я не могу делать выборку исходя из какой-то даты в where, у меня есть только диапазон. Можно ли как-то изменить эту конструкцию, чтобы убрать статическое значение даты? sumIf(feedback_count, date = toStartOfDay(toDate('2022-12-02 23:59:00')))
Примерно вот так (но оно, конечно не работает, из-за ограничений стандарта)
sumIf(feedback_count, date = toStartOfDay(anyLast(date))) -
мне по прежнему не понятно что там у вас за дата и как она соотносится с группировкой. попробуйте написать вопрос на хорошем русском языке полной фразой, с необходимыми подробностями.
-
У меня есть условие join'a:
victim as victim
LEFT OUTER JOIN tj.tlock as blocker
on victim.WaitConnections=blocker.ConnectID
and victim.Regions=blocker.Regions
and victim.exactVictimDateTime >blocker.`DateTime`
При попытке выполнения я получаю ошибку:
Code: 403. DB::Exception: Unsupported JOIN ON conditions. Unexpected 'exactVictimDateTime > DateTime': While processing exactVictimDateTime > DateTime.
DateTime и exactVictimDateTime Это DateTime64(6)
Почему не срабатывает операция сравнения на больше меньше? -
вот такой sql тут. посмотрите на ASOF JOIN - https://clickhouse.com/docs/en/sql-reference/statements/select/join/#asof-join-usageJOIN Clause | ClickHouse Docs
Join produces a new table by combining columns from one or multiple tables by using values common to each. It is a common operation in databases with SQL support, which corresponds to relational algebra join. The special case of one table join is often referred to as “self-join”.
-
потому что JOIN в ClickHouse это плохая идея
-
в общем JOIN умеет только equal сравнения =(
-
Надеюсь так будет понятнее
Есть таблица, которая хранит в себе данные для аналитики, в ней 20 столбцов.
Для подготовки запроса нужны только столбцы "category", "parent_category", "product", "date", "feedback_count".
Цель запроса - получить сумму отзывов, сгруппированных по "parent_category", "category", которые были добавлены в последний день между интервалом дат. То есть если в последнюю заданную дату интервала записи нет, то нужно уменьшить дату на 1 день, если в ней тоже нет, то уменьшить ещё на 1 день и так далее.
К примеру: есть категория - "Автотовары ("parent_category")"->"Комплектующие для ремонта двигателя ("category")". Мне нужно получить сумму отзывов товаров в этой категории ("category") на последний день в который есть отзыв в интервале в выборке. Задаю интервал 01.11.22 - 01.12.22. В этом интервале отзывы есть только 03.11.22, 11.11.22, 23.11.22. запрос должен посчитать количество отзывов 23.11.22. -
-
Есть 2 достаточно большие таблицы с одинаковой структурой, в первой 1.2 млрд записей, во второй 500 млн. Данные пересекаются, но около 100 млн записей второй таблицы отсутствуют в первой.
Как эффективно перелить недостающие данные из второй таблицы в первую?
Тип движка replicatedmergetree, соответственно можно insert ignore бахнуть и затем otimize table final. Но объём данных 500 Гб и не хочется впустую такие объёмы гонять.
Может есть более элегантное решение? Например выбрать недостающее через Left join? -
мб как вариант not in использовать в фильтре, ну и добавить еще фильтр, например если записи по месяцам
-
спасибо, попробую вариант с not in
даты хранятся в виде datetime с 2017 года..
отдельное поле с датой не было необходимости делать -
тогда вам правильно советовали про group by category, parent_category, d Но немного неверно сказали про limit 1. Правильнее будет limit 1 by d - https://fiddle.clickhouse.com/f91b0a46-aec2-40c8-86fb-d9714be72267
-
ну нет же
limit 1 by category, parent_category -
Всем привет. Помогите плиз с запросом, не понимаю как можно обойтись без lagInFrame (заменить на подзапрос или как-то еще), но чтобы вывод не поменялся https://fiddle.clickhouse.com/8e632d1d-e960-4445-bd2d-f535be349344
Хелп 😬 -
конечно же. Разговор и написание sql не совместимы :)
-
По итогу надо argMax по дате, не ?
-
-
Пишу с телефона, там надо докрутить ещё последний элемент от джойна
-
ну у вас в запросе есть сравнение соседей, вот тут варианты есть еще, но вы как раз воспользовались одним из
https://kb.altinity.com/altinity-kb-queries-and-syntax/lag-lead/
медленный over()? -
Да, либо anyLast(), но в том запросе, который писал я так не получиться
-
Спасибо! В принципе то, что нужно, сейчас попробую на данных!
-
Товарищи, помогите разобраться.
Запускаю 3 ноды (clickhouse-keeper)
Пишет следующую ошибку:
failed to send prevote request: peer 2 (node2:9234) is busy
Но нигде не запущен порт 9234 (raft-configuration)
И вопрос у меня, clickhouse-keeper на localhost должен работать или нет?
У меня работает на 127.0.0.1
Конфигурация следующая:
<clickhouse>
<keeper_server>
<listen_host>0.0.0.0</listen_host>
<tcp_port>2181</tcp_port>
<server_id>2</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>5000</operation_timeout_ms>
<session_timeout_ms>10000</session_timeout_ms>
<raft_logs_level>trace</raft_logs_level>
</coordination_settings>
<raft_configuration>
<server>
<id>1</id>
<hostname>node1</hostname>
<port>9234</port>
</server>
<server>
<id>2</id>
<hostname>node2</hostname>
<port>9234</port>
</server>
<server>
<id>3</id>
<hostname>node3</hostname>
<port>9234</port>
</server>
</raft_configuration>
</keeper_server>
</clickhouse>
Почему на 127.0.0.1? -
IN всегда лучше JOIN, однако тоже строит хеш и жрет память, и для 500М ключей может сожрать всю RAM. В данном случае я бы еще попробовал select except. Не уверен что это сильно лучше, но попробовать точно стоит.
-
если у вас 3 ноды, то как вы их запускаете?
на 3 разных серверах?
Не должен он коенчно на 127.0.0.1 висеть
что
ss -nlp | grep 9234 говорит? -
tcp LISTEN 0 128 *:9234 *:* users:(("clickhouse-keep",pid=17842,fd=10))
Да, на 3х разных серверах -
root@test-clickhouse-server-2:/etc/clickhouse-server# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:2181 0.0.0.0:* LISTEN 17842/clickhouse-ke -
<listen_host>0.0.0.0</listen_host>
должен быть снаружи <keeper_server> -
Завелось после этого на 0.0.0.0
Но ошибка пока такая же :
failed to send prevote request: peer 2 (node2:9234) is busy
Возможно ли это из - за того что нет вообще пока что remote_servers.xml?
Грешу на файрволл, сейчас попробую открыть порт. -
-
remote_servers
вообще не при делах
вам надо киперы сначала чтобы кворум нашли -
ну вы сначала проверьте что по 9234 порту ходит трафик между нодами, да
-
-
преймуществ кроме гемороя, особо не даст
шард это группа реплик которая содержит изолированный от остальных набор данных -
Спасибо
-
SELECT trim(BOTH '\r\n' FROM '\rHello, world!\n');
-
просто есть такая штука как circular replication
и есть люди которые считают что можно так экономить ресурсы смешивая реплики от разных шардов на одном и том же сервере
но по факту от этого только геморой, потому что потом это умаешься поддерживать и масштабировать -
Спасибо, сейчас всё получилось.
Только вопрос в другом сейчас, на двух нодах из 3х запустил в виде демона.
А на одной не могу. Команда точно такая же только меняю цифру конфига.
sudo -u clickhouse clickhouse-keeper --daemon --config /etc/clickhouse-server/enable_keeper1.xml
Как можно отдебажить это?
2> не пишет ничего в лог....
А без —daemon запускается нормально. -
<logger> внутри <clickhouse>
настройте и логи смотрите
https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings/#server_configuration_parameters-loggerServer Settings | ClickHouse Docsbuiltindictionariesreload_interval
-
Что - то я аж растерялся
Poco::Exception. Code: 1000, e.code() = 0, Exception: Cannot change directory to /opt/cores/, Stack trace (when copying this message, always include the lines below): -
Есть ли какие - то идеи?
Гугл ничего не говорит : с -
-
-
как один из вариантов
select * from system.tables where create_table_query like '%table_name%' -
Благодарю) что-то смотрю)
-
такое ощущение что он в корку хочет упасть...
а /opt/cores недоступен ...
там дальше stactrace идет какой он? -
Poco::Exception. Code: 1000, e.code() = 0, Exception: Cannot change directory to /opt/cores/, Stack trace (when copying this message, always include the lines below):
0. BaseDaemon::initialize(Poco::Util::Application&) @ 0xdc3767e in /usr/bin/clickhouse
1. DB::Keeper::initialize(Poco::Util::Application&) @ 0xdc00339 in /usr/bin/clickhouse
2. Poco::Util::Application::run() @ 0x171c7537 in /usr/bin/clickhouse
3. DB::Keeper::run() @ 0xdc00090 in /usr/bin/clickhouse
4. Poco::Util::ServerApplication::run(int, char**) @ 0x171db89a in /usr/bin/clickhouse
5. mainEntryClickHouseKeeper(int, char**) @ 0xdbfeb93 in /usr/bin/clickhouse
6. main @ 0x7db00d3 in /usr/bin/clickhouse
7. __libc_start_main @ 0x7f46c39ff083 in ?
8. _start @ 0x7ab13ee in /usr/bin/clickhouse
(version 22.11.2.30 (official build))
Вот полный -
блин, как найти в поиске
не делать одиночные записи, а писать во временную таблицу/буфер а в запись уже пачками? -
не знаю зачем им /opt/cores
coredump видимо делать
mkdir -p /opt/cores
chgrp clickhouse /opt/cores
сделайте -
Buffer Table Engine | ClickHouse Docs
Buffers the data to write in RAM, periodically flushing it to another table. During the read operation, data is read from the buffer and the other table simultaneously.
-
Привет! Подскажите, пожалуйста, есть ли какие-то настройки для юзеров в CH, которые влияют на скорость выполнения запросов? Я пробую запускать один и тот же запрос в графане (там свой отдельный пользователь) и под рутом непосредственно на сервере. В графане медленнее более чем в 2 раза :)
-
конечно есть, max_threads может быть ограничено
-
ну вы уточните, разные юзеры в графане и на сервере
-
спасибо, поищу
-
Ну так может быть графана генерирует не оптимальный sql ?
-
Что за проблема при подключении монго?
Type mismatch, expected String, got type id = 16 for column company_id: While executing MongoDB. -
не, там простецкий селект по одному полечку
-
а кто нибудь знает как можно у CH узнать случился ли ...overflow_mode=break или нет во время исполнения запроса?
-
Разобрались. Скажите, а с точки производительности. Как быстро данные будут читаться из монги в клик? У кого нибудь была оценка производительности?
-
Пытаюсь установить из dbeaver-а:
set enable_global_with_statement = false;
ошибка:
SQL Error [113] [07000]: Code: 113, e.displayText() = DB::Exception: There is no session or session context has expired (version 21.8.8.29)
, server ClickHouseNode(addr=db=default)@190269324 -
Всем привет
В бобре, когда пытаюсь запустить больше одного запроса - пишет ошибку
DB::Exception: Session is locked by a concurrent client. (SESSION_IS_LOCKED) (version 22.8.8.3 (official build))
как можно починить? -
У дбивера нет сессии. Добавьте параметр в запрос
-
-
спасибо
мне вроде уже от этого стало лучше -
в результате выполнения этого запроса, параметр оказывается установлен в false, но следующий же запрос параметра снова возвращает true. Т.е. можно установить только на уровне запроса?
select * from system.settings where name = 'enable_global_with_statement'
settings enable_global_with_statement = false; -
Ну или в конфиг
-
Понятно, спасибо
-
Ну или использовать другую штуку для запусков запроса
-
web-клиент умеет?
-
clickhouse-client точно умеет
-
А web фиг знает попробуйте, по идее да
-
ясно, спасибо
-
Товарищи, подскажите пожалуйста)
Хотелось бы попробовать заюзать clickhouse в оффлайне для некоторых задач (IoT) с небольшой нагрузкой.. думаю достаточно простым вариантом для юзера будет поставить приложение БД на arm64 Android TV приставку и подключить внешний SSD в качестве стораджа)
Сможет ли CH там жить? 4Gb ram, 1TB ssd допустим..
вроде бы архитектуру aarch64 он поддерживает, но соберется ли под андройд?
собрать бы как shared lib и запустить фоновым процессом -
Соберется, но хреново (и не юзабельно, ну по крайней мере было раньше).
https://clickhouse.com/blog/running-click-house-on-an-android-phone/
4ГБ все таки совсем немного, может проще найти SBC с настоящим линухом и хотя бы 8ГБ памяти?Running ClickHouse on an Android phoneThis is a brief description of my experiments with building ClickHouse on Android.
-
а никто не встречал реализацию "тарантул+кликхаус"?
А то из кафки в клик без проблем, а с тарантулом странно что ничего не находится -
Спасибо, интересная статья!!)
С настоящим линухом несколько сложнее процесс установки и настройки для обычного пользователя.. все же андройд позволяет это легче провернуть, установить из стора или apk готовое приложение
Ну и цена устройства на линухе уже прилично выше
Андрой тв 4Gb стоит 1.5-2тр, 8Gb памяти стоят 3-5тр и это законченное устройство готовое с ethernet, питанием и корпусом)
Какой-нибудь Raspberry Pi будет дороже в разы, и это конструктор.. да еще и настраивать его юзеру обычному сложно -
Смотрели в сторону duckdb?
Она хотя бы честная еmbedded база -
к сожалению не умеет
-
Спасибо, изучу!
Да хотелось бы взять CH все же, для части клиентов облако, для некоторых специфичных условий ставьте локальную базу.. остальное все универсальное, может и в облако спамить и локально -
А есть какая то тайм сериас база данных с которой легко интегрировать Clickhouse
-
Подскажите пожалуйста, а вот ReplacingMergeTree мержит строчки по понятному алгоритму - где ключ круче, ту строчку и берем.
А вот если мне нужна какая-то более сложная логика мержа, есть ли какой-нибуть мезанизм описать этот мерж? Не обязательно движком каким-нибудь. -
А какой смысл, коли КХ умеет?
-
не круче, а "новее". Поэтому какая бы у вас сложная логика не была, она все равно приведет к одному числу, которое потом и будет сравниваться (ver) с другим, чтобы определить какую строку выкинуть, а какую взять. Сделайте колонку и пишите туда все что навычисляете.
-
ну тут я как раз про ситуацию, что я не хочу выбирать одно или другое полностью по версии, а хочу именно смержить по своему алгоритму, какие-то атрибуты вабрыть функцией макс, другие в массив напихать. Что-то в этом роде
-
(old, new) -> {какая-то логика}
-
ну так сделайте все это и получите число. Все равно в конце будет бинарное сравнение - или одна строка или другая
-
вот не согласен с утверждением про одну строку. С одной строкой все понятно.
Я хочу взять create_date из старой строки, а my_value из новой, например. Про это впрос -
тут только переливать в другую таблицу или на уровне приложения эту логику реализовать, или скриптом
-
aggregateMergeTree не подходит?
-
ад какой. я бы не стал так много логики закладывать на Replacing. Если и крутить что-то сложное, то скорее на VersionedCollapsing. Ну или на Aggregating, там тоже интересно получается, но про другое
-
В collapsing проблема что прошлую запись надо закрыть. А я хотел бы не думать про прошлые записи, но вот если мерж случается, то сделать его по кастомному алгоритму.
-
Всем здравствуйте ,
Я запускаю clickhouse с одним сегментом и одиночной репликацией в kubernetes с оператором altinity.
Мы используем replicatedmergetree в качестве механизма, даже если у нас нет реплик или осколков в нашем кластере, просто чтобы гарантировать, что всякий раз, когда мы хотим масштабироваться, мы можем легко это сделать.
во время мониторинга через оператора высоты я обнаружил одну проблему: время ожидания моего зоопарка слишком велико.
запрос, который мы использовали в нашей панели для получения времени ожидания:
SELECT
(intDiv(toUInt32(toDateTime(concat(substr(toString(event_time), 1, 16), ':00'))), 2) * 2) * 1000 as t,
avg(ProfileEvent_ZooKeeperWaitMicroseconds) as ProfileEvent_ZooKeeperWaitMicroseconds
FROM system.metric_log
WHERE event_date >= toDate(1669703043) AND event_date <= toDate(1669704843) AND event_time >= toDateTime(1669703043) AND event_time <= toDateTime(1669704843)
GROUP BY t
ORDER BY t -
Ребята, всем привет.
Создала MV + AggregatingMergeTree таблицу. В нее падают и insert и update данные.
Если как пример - в таблице ключ это ид_контакта, а в uniqExactMerge кол-во его заказов. Заказ может быть отменен, поэтому по контакту придет update заказа с определенным статусом отмены.
Итогом AggregatingMergeTree - ид_контакта и его кол-во заказов (актуальных)
Подскажите, как тогда правильно настроить расчет uniqExactMerge , чтобы по ключу у меня вычитался отмененный заказ? И возможно ли это вообще при такой конструкции? -
Looks like start of the thread is here https://t.me/clickhouse_en/49123
-
вам там нужен не uniqExact скорее всего, а SUM. новый заказ +1, отмена заказа -1, апдейт 0
-
Uniq минусы не сможет посчитать
-
-
если заказ может быть только отменен и после этого не разотменен обратно, то можно сделать две колонки, одна с добавленными заказами, а одна - с отмененными. если жизнь сложнее, то хуже.
-
Спасибо, попробую
-
Да, но я думал, что смогу получить больше ответов здесь, в этой большой группе
-
Не, если отменили, то все - отменен. По крайне мере кейсов таких не ловили.
Попробую сейчас вариант - status = 'cancel' ? -1 : 1 AS sign.
Спасибо большое -
если события появления заказа и отмены приходят ровно по одному разу, то лучше действительно сумму считать, а не uniq, дешевле будет
-
-
у некоторых функций есть возможность приближенного вычисления
-
Всем привет! Подскажите плиз, что значит такая ошибка?
-
Не понимаю,что мне сделать, чтобы клика перестала ругаться
-
функций может и не быть:
SELECT a, b, c FROM t WHERE x AND y AND z
мне нужно как-то оценить вычислительную сложность подобного запроса и либо пропустить его, либо отклонить с ошибкой без фактического выполнения -
Всем привет, может кто подсказать какой графический интерфейс для КХ юзаете?
какой лучше и т.п. -
вот ссыль навсякий
https://clickhouse.com/docs/ru/interfaces/third-party/gui/Визуальные интерфейсы от сторонних разработчиков | ClickHouse Docsvizualnye-interfeisy-ot-storonnikh-razrabotchikov}
-
какой плагин для графаны?
-
Metabase, его тут нет
-
в плагине который от Altintiy относительно медленно парсится JSON
-
Ок, чекну, спасибо
-
из интересного для аналитиков последнее время
https://querybook.org -
блин
То есть сам КХ не рекомендует его
Это подозрительно -
хаха, просто его не написали)
-
Для аналитиков мы выводим все в графану))
-
А так спасибо за ответы
-
redash использовал раньше
-
Connecting Metabase to ClickHouse | ClickHouse Docs
Metabase is an easy-to-use, open source UI tool for asking questions about your data.
-
еще есть
https://github.com/apache/superset/
и
https://mprove.io/GitHub - apache/superset: Apache Superset is a Data Visualization and Data Exploration PlatformApache Superset is a Data Visualization and Data Exploration Platform - GitHub - apache/superset: Apache Superset is a Data Visualization and Data Exploration Platform
-
SELECT if((SELECT COUNT() FROM abc293e51bd4e488e8c8b493d0fc30871_index WHERE x AND y AND z) < 10000, (SELECT COUNT() FROM abc293e51bd4e488e8c8b493d0fc30871_index), 'error while processing extra large query')
-
-
Правильный) официальный
-
О! Но вроде не альтинити, спасибо
-
GitHub - grafana/clickhouse-datasource: Grafana Plugin for ClickHouse
Grafana Plugin for ClickHouse. Contribute to grafana/clickhouse-datasource development by creating an account on GitHub.
-
Господа, кто нибудь реализовывал генератор ID (инкрементальный) при помощи ZK или CH-keeper?
Вот уважаемый @den_crane вот тут примерно объяснил как:
https://github.com/ClickHouse/ClickHouse/issues/5681#issuecomment-630231111
Но я не особо понял как, т.к. только сегодня постигал азы запуска и настройки keeper.Auto-increment column are not support · Issue #5681 · ClickHouse/ClickHouse(you don't have to strictly follow this form) Use case When inserting data, you need to uniquely identify each row of records using Integer. For example: AUTO_INCREMENT in mysql: CREATE TAB...
-
А к нему клик можно подключить?
-
вы про querybook ?
да, можно там sqlalchemy под капотом
но насколько геморно, пока не понял -
он не объяснил, это просто пример запроса который можно было бы на стороне clickhouse как то имплементировать
но вообще тупая затея с автоинкрементами
погуглите snowflake id и sonyflake id
и просто начните правильно генерить идентификаторы на стороне приложения при вставке в БД -
там в доке указан еще и clickhouse driver, так что мб совсем не геморно
-
МП не особо хочет именно ГУИДы. Ему привычнее инкрементальные id.
Поэтому даже доп. сервис для генерации готовы делать. -
я не говорил НИЧЕГО про GUID
snowflake id и sonyflake id это UInt64 -
Я про размерность не уточнял. Да хоть int16
-
осталось только удачи пожелать вам, сгенерировать монотонно возрастающий числовой идентификатор в int16 в distributed системе =)
вы таки погуглите, вам легче станет
не надо кликхаус фигней всякой мучать -
можно и на стороне КХ генерить что-то типа snowflake id примерно по тому-же принципу. Мы делаем вот так:
create table if not exists some on cluster replicated (
pos DateTime64(3) materialized now64(3),
id UInt64 materialized rowNumberInAllBlocks(),
table LowCardinality(String),
d JSON
) engine = ReplicatedMergeTree('/clickhouse/replicated/db/some', '{replica}')
partition by toYYYYMM(pos)
order by (pos, id);
можно покритиковать. -
now64(3)
будет одинаковый для всего INSERT блока, а не для строки, насколько помню -
Да об этом тут инфы полным полно.
А вот о монотонном упомянул однажды только @den_crane -
разумеется. поэтому rowNumberInAllBlocks() и везде позиция это тупл (pos, id)
-
что такое монотонный в паралельной системе? В кафке монотонность есть внутри партиций, а тут как?
-
Так для этого и нужно вызывать keeper или что то своё, где есть синхронизация (монопольный доступ)
-
-
Так этот id нужен просто для почти статичных данных. Хотим полностью отказаться от postgres (проект масенький).
-
для почти статических данных я привел пример выше - (now64(3),rowNumberInAllBlocks()) - получите более-менее равномерно растущую позицию. Можно и хост в этот тупл добавить. Но могут быть нюансы.
-
Добрый вечер, подскажите по вопросу.
В двух таблицах есть поле - upload_datetime DateTime DEFAULT now()
В первой таблице- оно фиксирует дату появления записи и все.
Во второй - при обновлении таблицы поле меняет свое значение и now() каждый раз показывает.
Таблицы вроде бы +/- похожие, движок MergeTree -
Когда копирую таблицу из MySQL в CH руками или через Airflow, CH видимо преобразует timestamp время к UTC и отнимает 3 часа, как можно избежать этого поведения? В обоих базах time zone по Мск
-
У меня по очереди из тарантула приплывают данные.
но потоки не равномерные.
Планирую писать в клик через буферную таблицу
правильно ли я понимаю принцип?
при запуске микросервиса создать буферную таблицу
CREATE TABLE merge.hits_buffer AS merge.hits ENGINE = Buffer()
с IF NOT EXISTS
потом просто туда пихаю данные и не забочусь ни о чем, они "сами" попадут при нужных условиях? -
2. надо ли как-тодополнительно параметрировать если у нас шардирование таблиц?
-
3. есть ли какая то возможность указать выгрузить из этой таблицы, например когда микросервис падает?
-
OPTIMIZE TABLE buffer_table
по идее должен флашнуть, но уверенности нет
вообще по Engine=Buffer нормальных гарантий от sudden restart clickhouse-server нет, данные теряются
при нормальном shutdown все ок, флашатся
у вас требования к надежности какие?
буферезировать где то на стороне приложения не сможете чтобы сразу в MergeTree или в Distributed вставлять? -
при обновлении строк? alter update?
-
Значения обновляются у всех строк просто при просмотре таблицы, при нажатии f5 в дбивер
-
ну если только в памяти или редис
-
как раз и рассматривал буфер чтоб не терять данные и не терять скорость
-
шадрирование к engine=Buffer отношения не имеет
если вы вставляете мелкими кусками
и вам надо чтобы потом это разлеталось на шарды
то destination table в engine=Bufffer( ... ) параметрах задаете другую таблицу с engine=Distributed которая уже будет указывать на целевую engine=MergeTree таблицу, и при вставке сплитит вставленные данные по шардам и пушит их через INSERT INTO ...
и тогда вставлять можете на любую ноду, хоть раундробином -
а зачем в этом примере CREATE TABLE merge.hits_buffer AS merge.hits ENGINE = Buffer(merge, hits, 16, 10, 100,
задано AS merge.hit?
merge.hit - это же целевая таблица? -
чтобы структура таблиц была идентичной
AS merge.hits это другая таблица уже созданная должна быть -
да merge.hits целевая таблица
-
-
вы наверное добавили столбец после создания таблицы и не материализовали его.
То есть если добавить поле с дефолтом now() и не материализовать это поле, то будет всегда выводится now() -
интересно, спасибо. Думаю да, в эту таблицу добавил по ходу - во второй - было изначально.
-
а как материализуется столбец?)
-
Column Manipulations | ClickHouse Docs
A set of queries that allow changing the table structure.
-
Спасибо большое.
В Гугле немного забанили. -
Может кто-то подскажет. Копирование из одного MergeTree в другое MergeTree с ограничением по кол-ву потоков в 1. Нет ни группировок, ни сортировок. Зачем КХ 6.5 GB оперативы для выполнения запроса. Не то, чтобы ее нет, просто зачем столько и что на это влияет. Может какие-то настройки.
- 15 December 2022 (150 messages)
-
-
https://youtu.be/G9MxRpKlbnI?t=5209
Думаю тут понятно станет вамDecember 2022 ClickHouse Bay Area MeetupJoin us for this session on latest #ClickHouse news. See the meetup invite for more information: https://www.meetup.com/san-francisco-bay-area-clickhouse-meetup/events/289605843 #datawarehouse #Meetup ----------------- Check out more ClickHouse resources here: https://altinity.com/resources/ Join Reddit community: https://www.reddit.com/r/Clickhouse/ ----------------- Learn more about Altinity, sponsors of this meetup. Site: https://www.altinity.com LinkedIn: https://www.linkedin.com/company/alti... Twitter: https://twitter.com/AltinityDB
-
спасибо, гляну
-
Вам на слайд 1 надо глянуть :)
-
-
как-то с учетом документации
https://clickhouse.com/docs/ru/operations/clickhouse-keeper/
нифига не очевидно...ClickHouse Keeper | ClickHouse DocsclickHouse-keeper}
-
Ну я тоже первый раз искал долго, где взять обусфактор :)
-
...ый йод
-
-
Да. Бинарный, судя по всему. Какой вы рекомендуете?
-
Сколько колонок? Order by различается? Тогда надо пересортировывать
Копирование через insert into … select? -
Его и рекомендую
А как вы замеряете что запрос медленне в два раза? system query_log? -
нет) в графане смотрю, что Inspector показывает)) а в clickhouse-client время выводится всегда)
-
аа я поняла, что смотрю total request time, а надо на data processing time же? это и есть время выполнения запроса, да?
-
Там же выбрать можно
-
Всем привет. Не работает lower на кириллице. В чем может быть проблема?
-
lowerUTF8('КиРИЛЛИЦА')
-
select lowerUTF8('русскКИЕ СЛОВА');
-
Так просто. Спасибо!
-
Привет!
Столкнулся с неожиданным поведением операции replace partition – мб кто-нибудь встречался с подобным, распознает сходу и сможет что-то подсказать? Буду безумно благодарен за любые наводки. Гугл молчит 🙁
Вкратце, возможна ли ситуация, когда replace partition операция может не подтягивать те строки, что не успели физически закрепиться в основном движке таблицы (т.е. лежали на момент перемещения партиции с ними в условном WOS)?
Иными словами, в tmp таблицу A сделали 10 крупных последовательных инсертов (по инсерту на партицию), а затем сразу же переместили эти партиции в таблицу Б. Возможно ли, что в таблицу Б не доедет часть строк по этим 10 инсертам (потому что инсерты не успели "закрепиться" в А на момент реплейса)? -
Копируется 30 искодных полей. Ордер различается. В той таблице куда копируется PK по одному полю (order by не задан). Через CREATE TABLE AS SELECT. Печально другое, что объем требуемой памяти растет в линейной зависимости от того объема, который нужно скопировать. Если поставить больше интервал, то получаем выход за допустимый лимит. Чтобы выполнить такую операцию, по сути нужно самому разбить запрос на куски. Вообщем очень странное поведение. Как по мне, так подобная операция должна потреблять константный объем памяти. Да, он может быть меньше или больше, но в любом случае не расти линейно. Выставлены такие лимиты и они собственно не работают.
SET max_memory_usage = 10000000000;
SET max_bytes_before_external_group_by = 1000000000;
SET max_bytes_before_external_sort = 1000000000;
SET join_algorithm = 'auto';
SET max_threads = 1;
SET max_distributed_connections = 1;
SET max_insert_threads = 1;
Хотя еще раз подчеркну, что явных группировок и сортировок в запросе нет -
Привет! Аналогичная проблемы insert через select. Может можно какой то ключик выставить чтоб он вставлял частями?
-
Привет всем! Можете поделиться ссылкой на документацию для Clickhouse как создать кластер?
Уже поднял clickhouse-keeper, сам clickhouse
3 ноды. 3 разных сервера. -
Просветите, пожалуйста, когда используется interserver_http_port. Не сам параметр, а коммуникации CH <=> CH по http.
Update. Прочитал комментарий в конфиге ;)
<!-- Port for communication between replicas. Used for data exchange.
It provides low-level data access between servers.
This port should not be accessible from untrusted networks.
See also 'interserver_http_credentials'.
Data transferred over connections to this port should not go through untrusted networks.
See also 'interserver_https_port'.
-->
Верно ли, что импользуется исключитильно для Replicated таблиц , или для чего-то еще ? -
всем привет! есть вопрос по организации пайплайна.
Есть большая табличка фактов: |dttm|event_id|client_id|...
И есть справочник с клиентскими фичами, которыми необходимо обогатить факты: |client_id|client_feature|
Мутаций хочется избежать, поэтому само обогащение рассматриваю при переносе фактов в след. слой. Обе таблицы - распределенные (distributed).
И тут пока нашёл 2 варианта:
первый через GLOBAL JOIN (но этот вариант смущает из-за джойна как такового, клик - не про джойны)
второй - "натянуть" DICTIONARY на эту распределенную таблицу и обогащать через dictGet('dict_name', 'client_feature', client_id)
Словарь создал c LAYOUT(DIRECT()) потому что весь держать в оперативной памяти кажется тяжеловато (всего в словаре 30-40 млн записей)
В итоге получаю, что через GLOBAL JOIN это работает, а со словарём запрос "уходит в бесконечность", ну или работает оооочень долго
Казалось, что целевое решение должно быть со словарём, но работает всё сильно дольше, чем рассчитывал.
Подскажите пж, где что делаю не так, и как правильнее организовать обогащение в моём случае.
Спасибо!
(факты переносятся в след. слой чанками по 10-15 минут, справочник фич обновляется раз в день) -
select берет указанные вами данные. insert их сортирует согласно нового order by таблицы. Сортировка - тяжелая операция. Должен ли автоматически включаться external sort в этом случае - вопрос интересный. Можно попробовать в запросе явно отсортировать, с тем чтобы к инсерту данные уже пришли сортированные. И может быть придется выключить сеттинг optimize_on_insert, хотя он и не про сортировки.
Или по частям. Ничего в этом сложного нет - пишется внешний цикл на любом языке. Можно даже на bash и clickhouse-client. -
На самом же деле во внешнем цикле проблема есть - останов во время его работы. Ну так она есть и при обычном select/insert для терабайтных таблиц. Недавно тут было обсуждение как это делать сложно и правильно - с промежуточной таблицей.
https://kb.altinity.com/altinity-kb-schema-design/change-order-by/How to change ORDER BYHow to change ORDER BY.
-
Меня не пугают внешние циклы, но странно, что простой запрос не может выполниться из за лимитов
-
И хочется концептуально понять в чем суть подхода используемого КХ в такой операции. Если это заложено в КХ как нормальное поведение, значит это нужно учитывать в архитектуре базирующихся на нем систем. А возможно это какая-то недоделка
-
Всем привет.
Может кто сталкивался с подобной задаче:
Если необходимость быстро записывать логи в промежуточную таблицу (по дням)
Потом данные этого дня обрабатывать и складывать в другую таблицу, очищая этот день в промежуточной.
Как посоветуете решать такую задачу? -
Все зависит, что вы вкладываете в понятие обработки. Возможно вам подойдут материализованные представления.
-
В основном, группировки, функции и фильтры
-
посмотрите в сторону https://clickhouse.com/docs/en/engines/table-engines/special/materializedview/ и TTLMaterializedView Table Engine | ClickHouse Docs
Used for implementing materialized views (for more information, see CREATE VIEW). For storing data, it uses a different engine that was specified when creating the view. When reading from a table, it just uses that engine.
-
Привет всем! Подскажите что делаю не так?
Received exception from server (version 22.11.2):
Code: 62. DB::Exception: Received from localhost:9000. DB::Exception: No macro 'shard' in config while processing substitutions in '/clickhouse/tables/{shard}/radacct' at '20' or macro is not supported here. (SYNTAX_ERROR
keeper_conf.xml
<?xml version="1.0"?>
<yandex>
<listen_host>0.0.0.0</listen_host>
<zookeeper-servers>
<node index="1">
<host>node1</host>
<port>2181</port>
</node>
<node index="2">
<host>node2</host>
<port>2181</port>
</node>
<node index="3">
<host>node3</host>
<port>2181</port>
</node>
</zookeeper-servers>
<macros>
<shard>1</shard>
<replica>rmm</replica>
</macros>
</yandex>
Сам запрос:
CREATE TABLE table_repl (number UInt32) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/table_repl', '{replica}') PARTITION BY intDiv(number, 1000) ORDER BY number -
Привет, внезапно повалили ошибки
Task query-0000504348 is outdated, deleting it
Will not drop partition 88f930e0b4a796c3158928aa5fc3d0c2, it is empty.
куда смотреть? -
-
Очень похоже, что Вам сюда:
https://clickhouse.com/docs/ru/sql-reference/functions/string-replace-functionsФункции поиска и замены в строках | ClickHouse Docsfunktsii-poiska-i-zameny-v-strokakh}
-
спасибо большое!)
-
Привет ребята ,
у меня есть кластер clickhouse с одной репликой, развернутый с оператором ALTINITY K8S, и у меня есть около 700-730 реплицированных таблиц mergetree ()
Мое время ожидания ZOOKEEPER составляет более 7-10 секунд, когда я вижу в панели grafana
но когда я проверяю самые медленные запросы на другой панели grafana, я вижу, что в тот же период времени в списке самых медленных запросов нет запроса на вставку.
Сколько времени должно быть лучшее время ожидания ZOOKEEPER? -
А иногда время ожидания смотрителя зоопарка превышает 40 секунд.
-
я использую эту версию clickhouse: 22.11.2
-
Для репликации физических файлов между серверами используется
-
Вроде больше ни для чего
-
Коллеги, подскажите пожалуйста, как можно ограничить потребление памяти при мерже.
нода падает.
есть запросы, но они не жрут столько оперативы, идет один большой мерж.
память 70Гб, докер его отстреливает.
есть какая то настройка, чтобы указать ему явно не превышать лимит по памяти при мерже? -
отбой. ))
-
а макрос {shard} где-то в конфигах определен?
-
можете ссылку скинуть где почитать?
получается так, для репликации нужно :
remote_servers
macros
zookeeper_servers
верно ли? -
для этого запроса
CREATE TABLE table_repl (number UInt32) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/table_repl', '{replica}') PARTITION BY intDiv(number, 1000) ORDER BY number
нужно чтобы в конфиге были определены
{shard} и {replica}
<macros>
<shard>XXXXX</shard>
<replica>YYYYY</replica>
</macros>
для работы реплицируемых таблиц нужен zookeeper (clickhouse-keeper)
параметры кластера нужно описать в конфиге
в разделах remote_servers и zookeeper -
Подскажите, пожалуйста, как добыть конфигурационый параметр со всех хостов кластера.
Для определенности, http_port.
Если исполнить
select hostName(), getServerPort('http_port') from tdistr2; (где tdistr - Distributed)
то данные вернутся с хостов, на которых в таблице есть хотя бы одна строка, что для меня не очень удобно.
если добавить какой-нибудь агрегат, то поведение станет более сложным; это объяснимо, но не приближает меня к решению задачи. -
Кажется еще, что данные вернуться только с 1 реплики каждого шарда
посмотрите https://clickhouse.com/docs/en/sql-reference/table-functions/cluster/cluster, clusterAllReplicas | ClickHouse DocsAllows to access all shards in an existing cluster which configured in remote_servers section without creating a Distributed table. One replica of each shard is queried.
-
Спасибо! Именно select except спас, другие варианты сильно не умещались в память
-
Да, про реплики верно.
Решением кажется
SELECT hostName(), getServerPort('http_port') FROM cluster('shard_cluster', system, one);
Огромное спасибо!
"shard_cluster" - имя кластера, с которым мы работает, чисто для примера. -
Ребята всем привет. Подскажите, пожалуйста.
Пример : Ключ таблицы AggregatingMergeTree - контакт,
Я для каждого Контакта должна получить minState(дата заказа) и maxState(дата заказа), так я получаю его даты первого и последнего заказа.
И на основании их я должна получить в каком Магазине был сделан первый заказ и последний.
У меня получилось это сделать только с добавлением Магазина в ключ таблицы AggregatingMergeTree и при помощи argMax(магазин, maxMerge(дата последнего заказа)).
Возможно ли данный подсчет вынести на уровень MV, чтобы не вносить Магазин в ключ таблицы? -
на уровне МВ обрабытывается только блок инсерта, а если вы в разные блоки/инсерты вставляете первый и последний заказ, то на уровне МВ этого не сделать
-
-
Ну получается, что без добавления ключа не обойтись. Поняла, спасибо большое.
-
Подскажите, пожалуйста, наткнулся в доке на вот такой момент (скрин) – по дефолту этот параметр равен примерно миллиону строк.
Правильно ли понимать, что во время условного падения на середине инсерта 4 млн строк – лишь 2 млн успешно запишутся, и запрос при этом вернется с ошибкой? Или все же клик как-то откатит таблицу к состоянию до начала жирного инсерта? -
здесь тоже будет только по одной реплике, чтобы забрать с каждой - clusterAllReplicas
-
Мне просто это не важно, но за исправление спасибо, может важно еще кому-нибудь.
-
Ребят, кто нибудь может пояснить за эту ситуацию?
Вопрос в том почему по сути одинаковые функции показывают разный результат? Часть скрипта на скрине скрыта т.к. она не существенна -
Ну так откройте доку, там везде написано
-
Разные движки может? 🤔
-
Всем привет, после попытки использовать lightweight delete у нас начались проблемы при попытках смержить парты, в логах много ошибок подобных этой Code: 49. DB::Exception: Number of rows in source parts (1662158) differs from number of bytes written to rows_sources file (60314). It is a bug. (LOGICAL_ERROR) (version 22.8.4.7 (official build)). Что-то можно с этим сделать ?
-
не надо на это надеется. Считайте, что не откатит. Вставляйте по 1М и желательно в одну партицию. Если повторная вставка будут точно такой-же (идемпотентной), то проблемы почти нет - блоки одинаковые и дубликаты выкинут по контрольной сумме. Но если разные - увы, получите дубликаты.
-
Так все что написано в доке это uniq и uniqCombined вычисляют приближенное значение а uniqExact точное. Вот дока на примере uniqCombined. Все что написано - вычисляет приблизительно 🙂
-
Ну вот они вычисляют приблизительно
-
Из-за этого разные ответы
-
походите тут по ссылкам
https://clickhouse.com/docs/ru/operations/settings/settings/#settings-count_distinct_implementationНастройки | ClickHouse Docssettings}
-
Это именно то, что интересовало. Спасибо огромное за развернутый ответ!
-
-
remote_servers для репликации не нужен
Нужен
Только для engine=Distibuted -
Всем привет! подскажите, а можно расположить реплики в шардах перекрестно на хостах? или для каждой реплики требуется отдельный хост?
Можно ли прописать так:
<shard>
<internal_replication>true</internal_replication>
<weight>1</weight>
<replica>
<host>host-clickhouse-1</host>
<port>9000</port>
</replica>
<replica>
<host>host-clickhouse-2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<weight>1</weight>
<replica>
<host>host-clickhouse-2</host>
<port>9000</port>
</replica>
<replica>
<host>host-clickhouse-1</host>
<port>9000</port>
</replica>
</shard> -
Всем привет! Подскажите, если сервер CH беззвучно падает под нагрузкой, где можно покопать на тему причин? База в целом работает, но порой иногда аналитики пишут не совсем эффективные запросы с т.з. памяти и cpu, и запускают их одновременно) Или падение CH под валом неэффективных запросов - это by design и нормально?
-
Не подскажешь в продолжение, пожалуйста, а есть ли какой-то способ на клике делать жирные ACID инсерты сразу в несколько паритций MergeTree? В моем случае получается, что идемпотентность вставки не гарантирована (даг, условно, упал вчера, а сегодня исходники незначительно поменялись – перезапуск даст другую контрольную сумму) – поэтому в случае падения 100% запишутся дубли(
-
разные есть
select * from(
SELECT map() as mp FROM numbers(3))
where notEmpty(mp) -
Спасибо!!
notEmpty не увидел в доках -
да можно map()!=‘{}’
хз что эффективнее -
У меня все вставки ETL ограничены сверху. Сколько бы не насыпалось потом, при повторе их не возьмут.
-
У нас получается, что таким ограничением тоже не поможешь( Данные к вставке предварительно собираются по типу "витрины" – для этого каждый день с hdfs везутся свежие справочники, которые могут немного различаться день ко дню (также существуют отдельные процессы, периодически "выравнивающие" неконсистентность по определенной исторической глубине)
-
У меня все сделано на КХ - данные ползут через кафку, сохраняются в стейдж таблицах и потом джойнятся если надо. Словари все в памяти. Все работает маленькими блоками непрерывно. Никаких суточных циклов. Это скорее не ETL but CDC
-
Что делать то?
-
углубился, увидел - мержи жрут мало, запросы жрут много оперативы (
тут скорее вопрос - как ограничить время выполнения запроса? и объем памяти запроса? -
-
благодарю 👍
-
-
Здравствуйте, у меня после перезагрузки части серверов
кликхаус не стартует, ругаясь на max_suspicious_broken_parts.
Насколько безопасно повысить в конфиге <merge_tree><max_suspicious_broken_parts>5</max_suspicious_broken_parts></merge_tree> до 150 например? или то, что у меня это происходит - само по себе основание для тревоги? -
Можно вставлять в другую таблицу, а потом аттачить ее парты. Аттач почти атомарный, так что вероятность сбоя весьма мала. Ну или ждать пока насьоящие транзакции допилят.
-
Это отличная идея! Затестируем такое решение.
А так да, мб полный ACID придет со временем – можно было бы массово переезжать с других олап на кх)
Спасиб еще раз) -
Да можно и сейчас. Только придется поменять все подходы.
-
и еще мини вопрос - есть ли опция включить для mergetree / replicatedMergeTree таблиц fsync?
-
-
я извиняюсь, не очень понимаю, как без remote_servers настроить репликацию? в каком разделе конфига тогда указывать хосты?
-
Сейчас – сложно) У нас якорка. Все супер быстро меняется – крутится на вьюхах.
Клик привлек именно скоростью, но с ним пришли танцы с бубном по материализации всего этого динамического добра) -
У вас при создании replicated таблицы есть два параметра
Путь в zk и имя вашей реплики
И ещё есть interserver_http_host
Ваш сервер регистрируется в zk и пушит туда имена портов и читает имена партеры с других реплик
Сами парты читает напрямую as is по http
Через interserver_http_host/port
Поэтому важно чтобы реплики из разных шардов решались по разным zk путям
Это все через macros разруливается
Имена макросов типа {shard} используются в пути
А {replica} используется как имя реплики -
Хосты вы указываете для engine=distributed
-
спасибо. попробую таким образом поднять
-
ого, спасибо. А где это такая дока есть?
-
ClickHouse/MergeTreeSettings.h at master · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
слона то я и не приметил. Спасибо!
-
Всем привет!
Имею проблемы с удалением устаревших данных!
Есть таблица
│ CREATE TABLE cloki.samples_v3
(
fingerprint UInt64,
timestamp_ns Int64 CODEC(DoubleDelta),
value Float64 CODEC(Gorilla),
string String
)
ENGINE = MergeTree
PARTITION BY toStartOfDay(toDateTime(timestamp_ns / 1000000000))
ORDER BY timestamp_ns
TTL toDateTime(timestamp_ns / 1000000000) + toIntervalDay(7)
SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1, merge_with_ttl_timeout = 3600 │
из настроек которой я ожидаю что данные старше 7 дней будут удалены!
Но они упорно не хотят удаляться.
Если посмотреть их
delete_ttl_info_min и
delete_ttl_info_max
select partition, name, delete_ttl_info_min, delete_ttl_info_max from system.parts where table = 'samples_v3' and active = 1;
то они должны быть уже удалены
Подскажите как подебажить проблему?!!! -
Guys , is chatGPT correct ? 😂
-
Ttl тред раз в сутки просыпается
Если нет merges для старых данных -
Если optimize table без final сделать то удаляется ?
-
-
Делал OPTIMIZE TABLE samples_v3 FINAL;
но все заканчивалось
Timeout exceeded while receiving data from server. Waited for 300 seconds, timeout is 300 seconds
И после 1500+ секунд все заканчивалось
Данные не удалялись!!
Но в логах
tail -f /var/log/clickhouse-server/clickhouse-server.log | grep samples_v3
и сейчас идет процесс merge, как я понимаю -
привет. есть длинный подзапрос SELECT с кучей агрегатных колонок, эти колонки зависят друг от друга. и есть SELECT из подзапроса, который, например, выбирает только 1-2 колонки подзапроса.
вопрос: достаточно ли умен оптимизатор запросов кх, чтобы исключить из подзапроса те колонки, которые не попадают прямо или косвенно во внешний SELECT?
пример:
SELECT d FROM (
SELECT countIf(x) a, countIf(y) b, countIf(z) c, a - b AS d
)
будет ли кх считать колонку c в подзапросе или исключит ее, т.к. ее данные нигде не используются? -
вопрос: достаточно ли умен оптимизатор запросов кх, чтобы исключить из подзапроса те колонки, которые не попадают прямо или косвенно во внешний SELECT?
Да -
-
а почему раз в сутки?
merge_with_ttl_timeout = 3600 - не вот этот его вызывает? -
Подскажите пожалуйста, заметил что в движке Atomic если я делаю DROP TABLE ON CLUSTER {cluster} – не удаляется запись из Zookeeper.
Если не ошибаюсь, то в Ordinary запись из Zookeeper удалялась.
Подскажите, возможно есть какая-то опция чтобы включить эту функцию? -
drop table table on cluster cluster sync попробуйте.Она удалится и так, но спустя какое-то время
-
-
Спасибо
Делаю ровно все так, как описано в этой доке -
У нас есть два кластера (КХ 22.4) на которых ежедневно крутятся агрегации, которые создают и удаляют таблицы. (Запросы CREATE TABLE ON CLUSTER и DROP TABLE ON CLUSTER)
Заметил что в зукипере уже 20к+ папок появилось, большинство из которых неактуальны -
p.s. на одном кластере зукипер, на другом кх-кипер
-
Хотя в логах я вижу процесс merge, который привел выше,но вывод
SELECT * FROM system.merges;
пустой -
Всем приветтт;))
-
/me представляет, как все остальные 7252 участника здороваются с Вами :)
-
┌─version()─┐
│ 22.3.3.44 │
└───────────┘
<text_log>
<level>trace</level>
<database>server_logs</database>
<table>text_log_null</table>
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
<engine>Engine = Null</engine>
</text_log>
2022.12.15 17:51:38.340324 [ 55072 ] {} <Error> SystemLog: Custom database name for a system table specified in config. Table `text_log_null` will be created in `system` databas
e instead of `server_logs`
но зачем тогда вообще параметр database если оно всё равно создает в system? O_o -
Может прост ошибка в лог сообщении?
-
Ошибки нет. Кх действительно создал её в system
-
Ну пишите баг репорт поправят
-
Всем привет! подскажите, а можно расположить реплики в шардах перекрестно на хостах? или для каждой реплики требуется отдельный хост?
Можно ли прописать так:
<shard>
<internal_replication>true</internal_replication>
<weight>1</weight>
<replica>
<host>host-clickhouse-1</host>
<port>9000</port>
</replica>
<replica>
<host>host-clickhouse-2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<weight>1</weight>
<replica>
<host>host-clickhouse-2</host>
<port>9000</port>
</replica>
<replica>
<host>host-clickhouse-1</host>
<port>9000</port>
</replica>
</shard> -
парни
хелпаните
пытаюсь с помощью Metabse приконнектить КХ
но все время происходит синхронизация
но
sql запросы выполняются успешно
что мне нужно сделать, чтобы я смог чекать все таблицу графически? -
Connecting Metabase to ClickHouse | ClickHouse Docs
Metabase is an easy-to-use, open source UI tool for asking questions about your data.
-
Привет, при большом количестве alter table DROP PARTITION, появляется больша нагрузка на zookeeper и начинаются задержке в репликации и в итоге таймауты Read timed out к нодам КХ. На что можно посмотреть и как можно оптимизировать сетап?
-
8 нодов КХ, 4+4 репликация, 3 нода ЗК