- 01 January 2023 (17 messages)
-
С новым годом!
-
Привет
Новогодний вопрос, делаю insert FORMAT TabSeparated, блок для вставки данных начинается со слова settings, из-за чего CH походу начинает это интерпретировать как некую команду и начинает ругаться:
Expected one of: SET query, compound identifier, list of elements, identifier. (SYNTAX_ERROR) (version 22.3.15.33 (official build)) -
это баг или фича?
-
Если я правильно понял, что вы используете синтаксис без ключевого слова values, то, возможно, есть смысл вставить перевод строки перед данными.
Если не поможет, приведите пример запроса. Если длинный, то через pastebin.com (сюда ссылку). -
после каникул попробую сделать пример повторяющийся
-
так-то все это делается питонячьим скриптом через post-запрос
-
сам запрос в урле, данные в теле запроса
-
insert into some_table (field1, field2) FORMAT TabSeparated
-
а в значении что-то вроде
settings.xml \t some string \n -
и куча других строк
если строку с settings убрать вниз - то все отрабатывает -
уверены что HTTP запрос верный,
через curl пробовали тоже самое сделать?
https://clickhouse.com/docs/en/interfaces/http/
вот тут много примеровHTTP Interface | ClickHouse DocsThe HTTP interface lets you use ClickHouse on any platform from any programming language in a form of REST API. The HTTP interface is more limited than the native interface, but it has better language support.
-
конечно верный, не один терабайт данных так уже налили
-
вдобавок тупо строку, начинающуюся с settings просто ниже перенес - и запрос заработал нормально
-
если что, тело запроса gzip-нутое
-
что-то не воспроизводится
clickhouse-client -q "CREATE TABLE test_post_settings (s String, v UInt64) ENGINE=MergeTree() ORDER BY v;"
root@f31bdea2832b:/# printf "settings\t1" | curl --data-binary @- "http://127.0.0.1:8123?query=INSERT+INTO+test_post_settings+FORMAT+TabSeparated"
root@f31bdea2832b:/# printf "settings.xml \t1" | curl --data-binary @- "http://127.0.0.1:8123?query=INSERT+INTO+test_post_settings+FORMAT+TabSeparated"
gzip правда не пробовал... -
интересно, попробую повторить попозже
-
Добрый вечер, есть 4 таблицы идентичных по структуре, надо во все выполнить одинкаковый запрос запрос и вывести результат, как это можно реализовать? Пыталась гуглить всякие loop процедуры и т.п., но ничего подобного не нашла
Запрос по типу SELECT count(*) as $ FROM table_$. $ - в данном случае номер таблицы. Название всех таблиц содержит tablename_number - 02 January 2023 (33 messages)
-
Merge table engine
merge table function -
вроде про union речь
-
Merge Table Engine | ClickHouse Docs
The Merge engine (not to be confused with MergeTree) does not store data itself, but allows reading from any number of other tables simultaneously.
-
Добрый день! Гуглил гуглил. Но так и не понял можно ли в кликхаус из коробки лить данные прометеуса и потом их также анализировать в графане? Или может кто подскажет есть ли лучшее решение для персистентного хранения метрик с ттл?
-
GitHub - VKCOM/statshouse: StatsHouse is a highly-available, scalable, multi-tenant monitoring system
https://github.com/VKCOM/statshouseGitHub - VKCOM/statshouse: StatsHouse is a highly-available, scalable, multi-tenant monitoring systemStatsHouse is a highly-available, scalable, multi-tenant monitoring system - GitHub - VKCOM/statshouse: StatsHouse is a highly-available, scalable, multi-tenant monitoring system
-
Посмотрите на этот проект
-
Спасибо, посмотрю. Правда у меня сразу возник вопрос как в эту систему налить данные с помощью vector.dev
-
посмотрите еще https://victoriametrics.com/ . не clickhouseVictoriaMetrics: Simple & Reliable Monitoring for Everyone
Incredibly fast time series database and easy-to-use high performance monitoring solutions simple and reliable for everyone. VictoriaMetrics Database Solutions.Incredibly fast time series database and easy-to-use high performance monitoring solutions simple and reliable for everyone. VictoriaMetrics Database Solutions.
-
У меня проект небольшой. Не хочу плодить сущности в каждой из которых надо неплохо разбираться
-
qryn: the polyglot monitoring and observability stack
Lqryn is the polyglot monitoring and observability stack for ClickHouse (formerly known as cLoki). qryn can ingest and analyze logs, metrics and traces from any agent supporting Loki/LogQL, Prometheus/PromQL, OTLP/Tempo, Elastic, InfluxDB and many more!
-
Добрый день! Может тут кто подскажет. Использую clickhouse-operator версии 0.20.1
Пробую при помощи него создать ClickHouseInstallation из данного примера
По итогу развертывает новый экземпляр клика, но при запуске падает с ошибкой:
2023.01.02 12:45:58.331012 [ 1 ] {} <Error> Application: DB::Exception: Either 'password' or 'password_sha256_hex' or 'password_double_sha1_hex' or 'no_password' or 'ldap' or 'kerberos' or 'ssl_certificates' must be specified for user clickhouse_operator.: while parsing user 'clickhouse_operator' in users configuration file: while loading configuration file '/etc/clickhouse-server/users.xml'
2023.01.02 12:45:58.331025 [ 1 ] {} <Information> Application: shutting down
2023.01.02 12:45:58.331030 [ 1 ] {} <Debug> Application: Uninitializing subsystem: Logging Subsystem
2023.01.02 12:45:58.331219 [ 47 ] {} <Information> BaseDaemon: Stop SignalListener thread
Stream closed EOF for clickhouse/chi-settings-03-cls1-0-0-0 (clickhouse)
Бага в операторе?clickhouse-operator/05-settings-03-2-user2.yaml at master · Altinity/clickhouse-operatorThe Altinity Operator for ClickHouse creates, configures and manages ClickHouse clusters running on Kubernetes - clickhouse-operator/05-settings-03-2-user2.yaml at master · Altinity/clickhouse-oper...
-
Текст ошибки вы читали?
-
Читал. Я последний раз клик использовал года 4 назад. Сейчас возникла потребность быстро развернуть инсталяцию клика на потестить и тут такое
-
Не совсем понимаю как интерпретировать ошибку
-
Кажется дошло
-
Прошу прощение за беспокойство. Пофиксил кажется
-
Привет специалистам! Воможно ли при проблемах с лидером Зукипера (рестартовал какое-то время и был недоступен ЗК кластер), что инсерты могут быть дуплицированы? Мы заметили что при рестарте Зукипера, появились одинаковые записи в таблице в то же самое время. Таблицы ушли в Read-only на какое то время.
-
Добрейшего нового!!!
При выполнении запроса падает с ошибкой
12:20:10 :HTTPDriver for http://:8123 returned response code 500)
12:20:10 Code: 373. DB::Exception: Session is locked by a concurrent client. (SESSION_IS_LOCKED) (version 22.12.1.1752 (official build))
Что то гугл пока молчит. Есть Мысли? Гдето может параметр какой подкрутить. Заранее спасибо -
GitHub - metrico/qryn: qryn is a polyglot, high-performance observability framework for ClickHouse (formerly cLoki). Ingest and analyze logs, metrics and traces from any agent supporting Loki, Prometheus, OTLP, Tempo, Elastic, InfluxDB and more!
qryn is a polyglot, high-performance observability framework for ClickHouse (formerly cLoki). Ingest and analyze logs, metrics and traces from any agent supporting Loki, Prometheus, OTLP, Tempo, El...
-
нет, просто в новых версиях clickhouse пароль для пользователя обязателен, а шаблон 2 года не менялся
-
какой язык и какая клиентская библиотека?
ошибка означает что у вас несколько паралельных запросов с одинаковым session_id параметром
https://clickhouse.com/docs/en/interfaces/httpHTTP Interface | ClickHouse DocsThe HTTP interface lets you use ClickHouse on any platform from any programming language in a form of REST API. The HTTP interface is more limited than the native interface, but it has better language support.
-
хотя не, шаблон правильный, странно что у вас ошибка возникла
-
-
Нет, по блокам связаный
-
а что значит блоки в данном случае?
если я одним select достаю данные из разных partition -
max_block_size настройка вам нужна
-
Ну давайте, логически подумаем, как читать параллельно ? Блоками ? Какие блоки могут быть в Clickhouse ? Какого они могут быть размера ? Разве только партиции ?
-
Чтобы найти соседа, есть оконные функции
-
-
-
Это dbt 1.3.1 в 4 потока. Драйвер dbt-clickhouse 1.3.1. Там данных много несколько миллиардов с вложенными запросами. Обработка пишет в null далее это все захватывается матвью в стейджинг. Как отрабатывает переливается в таргет схему. Вот если данных много и запрос выполняется больше 10-15 минут то возникает эта ошибка. Дбт выдает в консоле ошибку. Но в бд в процессах все еще запрос выполняетсЯ.
-
Создайте issue об ошибки на github'e драйвера
-
https://github.com/ClickHouse/dbt-clickhouse/
вот тут создайте issue
приведите минимальный пример dbt скрипта на котором восроизводитсяGitHub - ClickHouse/dbt-clickhouse: The Clickhouse plugin for dbt (data build tool)The Clickhouse plugin for dbt (data build tool). Contribute to ClickHouse/dbt-clickhouse development by creating an account on GitHub.
- 03 January 2023 (13 messages)
-
Всем привет и с Новым годом!
Подскажите, пожалуйста, в чём может быть дело: при выполнении любого запроса (даже select 1;) кликхаус виснет. Крутится ↙️ Progress: 0.00 rows, 0.00 B (0.00 rows/s., 0.00 B/s.). Выходить приходится через Ctrl+C. Вот лог ошибки. Перезагрузка сервера помогает, но только где-то на пять запросов. потом всё снова виснет.2023.01.03 16:36:27.071945 [ 2413 ] {e4350ab5-2768-4451-bbdc-dfab63bf1490} <Erro - 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.
-
-
Клиент и сервер версии 22.12.1. Всё стоит на ноутбуке. Сетевых хитростей нет, но у меня есть база данных, в которой были таблицы MaterializedPostgreSQL. Они брали данные с другого сервера, на котором стоял постгрес. Теперь тот сервер с постгресом не работает. Похоже, что ошибка происходит из-за того, что MaterializedPostgreSQL стучится к тому серверу и не получает ответа. Поскольку всё это было в экспериментальных целях, сейчас можно удалить эти базы. Однако после выполнения DROP DATABASE, эти базы появляются снова. Можно ли их полностью удалить?
-
сами по себе они не могут появляться
у вас там docker?
оно там случайно не создается через /docker-entrypoint-initdb.d/ ? -
Нет, не докер. Просто поверх дебиана стоит. Уточню: базы не появляются снова, а выдают ошибку при удалении:
LAPTOP-KKAUEF7C.localdomain :) drop database postgres_db1;
DROP DATABASE postgres_db1
Query id: aeed5580-821f-4301-933e-8bc77e7ae078
0 rows in set. Elapsed: 0.031 sec.
Received exception from server (version 22.12.1):
Code: 1001. DB::Exception: Received from localhost:9000. DB::Exception: pqxx::broken_connection: connection to server at "81.163.22.203", port 5432 failed: Connection refused
Is the server running on that host and accepting TCP/IP connections?
. (STD_EXCEPTION) -
а это...
https://github.com/ClickHouse/ClickHouse/issues/41922can't DROP DATABASE with ENGINE=MaterializedPostgreSQL after successfully create · Issue #41922 · ClickHouse/ClickHouseDescribe what's wrong following queries SET allow_experimental_database_materialized_postgresql=1; CREATE DATABASE db1_postgres ENGINE = MaterializedPostgreSQL('postgres-host.domain...
-
вообще все эти Materialized
experimental
соответсвенно на продакшен не годятся... -
Да, это оно. Тогда мне поставить 22.3 и из неё удалить?
-
может не получиться даунгрейд сделать...
там всякие Ordinary \ Atomic могут мешать...
но попробуйте... -
Даунгрейдил до 22.3, получилось удалить эти базы. Похоже, всё работает, спасибо!
-
Привет, подскажите, https://hub.docker.com/r/clickhouse/clickhouse-server/#:~:text=How%20to%20extend%20this%20image эти скрипты сработают для образа или контейнера?
-
/docker-entrypoint-initdb.d
это для контейнера
делаете скрипты для создания схемы
и через volume в контейней в /docker-entrypoint-initdb.d/ монтируете
при старте исполняется -
Благодарю
- 04 January 2023 (25 messages)
-
всем доброго времени дня
можете подсказать пож-та
это нормально, что потребление ОЗУ стабильно растет, за 2 недели поднялся с 20 до 67% (после того как отключил swap) и продолжает расти? -
Доброе утро, у вас случаем никакие таблицы не джоинятся?
-
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-who-ate-my-memory/
от версии зависит
это может быть и memleak -
а можно график с количеством запросов и процессор, ( по возможности IO)
-
ну и смотрите что по времени у вас 22 dec случилось что память резко отдали...
-
это мог быть и рестарт
-
swap отключили
-
гхм, извините в как вы RAM Usage считаете?
это RSS или какой то другой параметр типа VIRT? -
((node_memory_MemTotal_bytes{instance="$node",job="$job"} - node_memory_MemFree_bytes{instance="$node",job="$job"}) / (node_memory_MemTotal_bytes{instance="$node",job="$job"} )) * 100
формула для ram -
из прометея node_exporter
-
то есть swap Отключили с рестартом clickhouse ? так?
-
да
-
Всем привет.
Можно ли как-то при помощи select from mysql(...) вытащить из мускуля поле datetime со значением меньше 1970 года?
В КХ есть DateTime64, с диапазоном 1900 - 2229 гг. но при использовании select from mysql(...) КХ datetime поля вытаскивает сначала в DateTime.
Есть ли способ указать дефолтный тип для каста datetime полей из мускуля в клику (в стрингу нам тоже подошло бы)?
Сделать вьюху на стороне мускуля возможности нет.
select from jdbc пробовали - не подходит по другим причинам -
settings:
mysql_datatypes_support_level decimal,datetime64 1 Which MySQL types should be converted to corresponding ClickHouse types (rather than being represented as String). Can be empty or any combination of 'decimal', 'datetime64', 'date2Date32' or 'date2String'. When empty MySQL's DECIMAL and DATETIME/TIMESTAMP with non-zero precision are seen as String on ClickHouse's side.
у меня этот сеттинг изменен, чтобы время атоматически конвертировалось из datetime64. Но можно такую колонку прислать как строку, и уже на стороне КХ разобрать как вам надо. -
Мы из этого юзаем date2string, чтобы даты раньше 1970го была возможность затянуть. Попробуем комбинировать с datetime64
-
всем привет. подскажите пожалуйста, не могу понять что за ошибка. использую питоновский модуль clickhouse_connect, client.command'ом дергаю с csv файла queries... текст ошибки:
Code: 62. DB::Exception: Syntax error (Multi-statements are not allowed): failed at position 76 (end of query): ; -
мб запрос показали бы?
-
-
-
ну в логах можно найти запрос, который падает с ошибкой
-
наверное объединяете каким-то образом запросы и разделяете их, и скорее всего это не поддерживается
-
-
-
спасибо
-
Кажется, он говорит, что нельзя много запросов в одном отправлять
- 05 January 2023 (91 messages)
-
-
https://clickhouse.com/docs/en/optimize
попробуйте разобраться в чем разница между sorting key и primary key
и как работают data skip indexes
станет сильно понятнее куда копать... -
Всем привет, как изменить тип данных из стринг на интежер?
-
alter table db.table modify column column_str UInt32;
как пример -
а как можно сохранить 00 в начале стринга
-
например 0011555851
когда на инт переводишь эти нули исчезают
это можно решить? -
ну нет
число 100 есть, а числа 00100 нет насколько мне известно
посмотрите типизацию
https://clickhouse.com/docs/en/sql-reference/data-types/int-uint/#int-rangesUInt8, UInt16, UInt32, UInt64, UInt128, UInt256, Int8, Int16, Int32, Int64, Int128, Int256 | ClickHouse DocsFixed-length integers, with or without a sign.
-
=) в десятичной системе нет в двоичной 00100 бывает =)
-
SQL Error [48] [07000]: Code: 48. DB::Exception: Alter of type 'MODIFY_COLUMN' is not supported by storage Log. (NOT_IMPLEMENTED) (version 22.11.1.1360 (official build))
, server ClickHouseNode(addr=http:192.168.122.22:8123, db=default)@-1884179265 -
ну, чтобы тебе понять всю глубину твоего вопроса
тебе надо попытаться представить как внутри хранятся числа и строки
и в чем разница
сколько байт уходит на хранение 0011555851 как строки и сколько байт для 11555851 как числа... -
как решить?
-
можешь в chat.openai.com
спросить что значит эта ошибка... -
ну, прочитать что написано в ошибке понять что это значит...
дальше решение само придет -
ты не искал
и не хочешь думать, это плохо
у тебя таблица типа engine=Log
она не может менять структуру и типы полей
https://clickhouse.com/docs/en/engines/table-engines/log-family/
почитай тутLog Engine Family | ClickHouse DocsThese engines were developed for scenarios when you need to quickly write many small tables (up to about 1 million rows) and read them later as a whole.
-
зарегайся уже на chat.openai.com
-
По какой причине узел кластера переходит в статус Inactive в system.distributed_ddl_queue и как его вернуть в Active без рестарта? Не нашел команд для манипуляций с distributed_ddl_queue
Возможно были проблемы с ZK, но это не точно. Сейчас ZK работает нормально, команды расползаются по кластеру, только нода инициатор сидит в inactive и не исполняет. -
Telegraf умеет складывать в клик, vector умеет складывать в клик
-
Вектор да, я даже так сделал, но я хотел чтобы потом можно было воспользоваться готовыми шаблонами для графаны. Мне подсказали qryn вроде хороший комбайн. Только пока завести не получилось
-
потому что это readonly таблица нет там никаких манипуляций, это просто прокси таблица к ZK в котором по определенному пути distributed_ddl лежит
смотрите на проблемном узле
SELECT event_time, ProfileEvent_ZooKeeperHardwareExceptions FROM system.metric_log WHERE ProfileEvent_ZooKeeperHardwareExceptions > 0 AND event_date = today()
active = 0
обычно значит что не успело в течении 180 секунд ваш distributed ddl исплониться -
а что конкретно в qryn у вас не заводится?
-
У меня была схема , но я не проверял как оно работает на деле. Сейчас поищу связку софта.
-
Вообще данные послать не могу на ендпоинты. Ни логи ни метрики
-
ошибку какую то выдает ? какую?
qryn со своей стороны какую то ошибку выдает? -
Там говорит парсер не подходит. Я прямо с docker_logs в loki
-
Можете прислать как у вас работает если у вас вектор и с docker_logs вы сорс берете
-
Спасибо. Заметим, что chatgpt на такой вопрос по делу ответить не может
-
у меня никак не работает, я надеялся из вас ваши ошибки вытянуть чтобы понять в чем у вас косяк...
советую с ошибками тогда идти в issue на github в qryn
там Лоренцо нормально саппортит это все... -
Да я скорее нуб и просто опозорюсь ) попробую сам разобраться сначала
-
Ребят, короче такая история. Сижу туплю как сделать из
quantity | date
1 | 2022-01-01
3 | 2022-01-03
вот это:
quantity | date
1 | 2022-01-01
1 | 2022-01-02
3 | 2022-01-03
подскажет кто? -
SYSTEM RESTART REPLICAS
на проблемном узле помогает?
еще желательно grep DDLWorker /var/log/clickhouse-server/clickhouse-server.log глянуть на проблемном узле -
ORDER BY Clause | ClickHouse Docs
The 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.
-
Спасибо!
-
клиентское приложение какое?
или вам в отчеты?
ORDER BY WITH FILL
внутрь subquery
плюс WINDOW FUNCTIONS
ну и LAG попробовать if(field=0,LAG (...) OVER , field) -
services:
type: docker_logs
docker_host: /var/run/docker.sock
include_images:
- sm_bot
- sm_cmds
- sm_director
loki:
type: loki
inputs:
- services
labels:
forwarder: vector
endpoint: http://qryn:3100/loki/api/v1/push
encoding:
codec: json
qryn | {"level":30,"time":1672907807529,"pid":19,"hostname":"c959eb2fcdbb","name":"qryn","reqId":"req-3","req":{"method":"POST","url":"/loki/api/v1/push/loki/api/v1/push","hostname":"qryn:3100","remoteAddress":"192.168.64.5","remotePort":37844},"msg":"incoming request"}
qryn | {"level":50,"time":1672907807530,"pid":19,"hostname":"c959eb2fcdbb","name":"qryn","reqId":"req-3","err":"undefined parser\nError: undefined parser\n at Parser.fn (/app/parsers.js:265:15)\n at ContentTypeParser.run (/app/node_modules/fastify/lib/contentTypeParser.js:175:27)\n at handleRequest (/app/node_modules/fastify/lib/handleRequest.js:41:33)\n at runPreParsing (/app/node_modules/fastify/lib/route.js:528:5)\n at next (/app/node_modules/fastify/lib/hooks.js:168:7)\n at /app/node_modules/@fastify/cors/index.js:130:12\n at resolveOriginOption (/app/node_modules/@fastify/cors/index.js:88:129)\n at onRequest (/app/node_modules/@fastify/cors/index.js:90:3)\n at Object.onRequestCors (/app/node_modules/@fastify/cors/index.js:32:7)\n at hookIterator (/app/node_modules/fastify/lib/hooks.js:246:10)","msg":"undefined parser"} -
похоже на ошибку в qryn
либо на ошибку в конфигурации qryn
думаю вам расковырять надо строку со стекттрейсом
и покажите как вы qryn то подинмаете?
его тут нет нигде -
qryn:
container_name: qryn
image: qxip/qryn:latest
ports:
- 3100:3100
environment:
- CLICKHOUSE_SERVER=ch
- CLICKHOUSE_AUTH=username:usersecret
- CLICKHOUSE_DB=qryn
- DEBUG=true
depends_on:
clickhouse:
condition: service_healthy -
В qryn все по дефолту
-
У меня и на метриках такая же фигня. На ендпоинт прометеуса в qryn пишу
-
вот ваш стектрейс
undefined parser
Error: undefined parser
at Parser.fn (/app/parsers.js:265:15)
at ContentTypeParser.run (/app/node_modules/fastify/lib/contentTypeParser.js:175:27)
at handleRequest (/app/node_modules/fastify/lib/handleRequest.js:41:33)
at runPreParsing (/app/node_modules/fastify/lib/route.js:528:5)
at next (/app/node_modules/fastify/lib/hooks.js:168:7)
at /app/node_modules/@fastify/cors/index.js:130:12
at resolveOriginOption (/app/node_modules/@fastify/cors/index.js:88:129)
at onRequest (/app/node_modules/@fastify/cors/index.js:90:3)
at Object.onRequestCors (/app/node_modules/@fastify/cors/index.js:32:7)
at hookIterator (/app/node_modules/fastify/lib/hooks.js:246:10)
судя по всему что-то не то с заголовком Content-Type
надо трафик снять через tcpdump и посмотреть что идет на endpoint в этом заголовке -
Добрый день, коллеги! Есть ли какое-нибудь обучение по CH в Казахстане, а именно в Алматы? Либо онлайн, проверенные. Буду благодарен за информацию!
-
Онлайн на английском (но если группа большая может быть и на русском что-то можно было бы устроить)
https://altinity.com/clickhouse-training/
Ну и
https://clickhouse.com/learn/ClickHouse Training Built For Your Use Case — AltinityLearn about ClickHouse architecture, optimize SQL queries, design high-performance analytic apps with Altinity Developer Training. Lab exercises included!
-
ребят, подскажет кто по INTERPOLATE? не работает , ругается на синтаксис
-
Всем привет, столкнулся с проблемой создания словаря из базы монги с авторизацией.
Есть предположение что авторизация в монге осуществляется через базу 'admin', а данные для словаря лежат в другой базе и в конфиге указывается откуда брать данные для словря -
Может есть другой интерфейс авторизации в монгу?
-
select user_api_key_id,date_in_period, quantity from table order by user_api_key_id WITH FILL, date_in_period WITH FILL INTERPOLATE выдает ошибку синтаксиса
-
может кто подсказать?
-
host_metrics:
type: host_metrics
collectors:
- cgroups
scrape_interval_secs: 15
metrics:
type: prometheus_remote_write
inputs:
- host_metrics
endpoint: http://qryn:3100/api/v1/prom/remote/write
default_namespace: service
qryn | {"level":50,"time":1672913134587,"pid":19,"hostname":"a80da3112272","name":"qryn","reqId":"req-4","err":"Unsupported Content-Encoding: snappy\nFastifyCompressError: Unsupported Content-Encoding: snappy\n at Object.preParsing (/app/node_modules/@fastify/compress/index.js:315:24)\n at next (/app/node_modules/fastify/lib/route.js:552:16)\n at preParsingHookRunner (/app/node_modules/fastify/lib/route.js:575:3)\n at runPreParsing (/app/node_modules/fastify/lib/route.js:526:5)\n at next (/app/node_modules/fastify/lib/hooks.js:168:7)\n at Object.onRequest (/app/node_modules/@fastify/compress/index.js:205:5)\n at hookIterator (/app/node_modules/fastify/lib/hooks.js:246:10)\n at next (/app/node_modules/fastify/lib/hooks.js:174:16)\n at /app/node_modules/@fastify/cors/index.js:130:12\n at resolveOriginOption (/app/node_modules/@fastify/cors/index.js:88:129)","msg":"Unsupported Content-Encoding: snappy"} -
ну тут более понятно
Unsupported Content-Encoding: snappy
это способ сжатия который
попробуйте на gzip переключиться со стороны той штуки которая в remote/write пишет -
В общем по дефолту что-то не работает ничего из того что я пробовал. В метриках ему не нравится snappy хотя он нигде не включен и непонятно как его отключить
-
Да я бы отключил, только в векторе нет такой настройки
-
метрики кто пишет?
-
Опять же вектором. С докера собираю. В консоль если вывести все красиво. А передать в qryn не получается
-
https://vector.dev/docs/reference/configuration/sinks/loki/#configuration
compression = "gzip"
поставьте попробуйтеLoki sinkDeliver log event data to the Loki aggregation system
-
vector | 2023-01-05T10:13:38.631858Z ERROR vector::cli: Configuration error. error=unknown field compression, expected one of endpoint, default_namespace, buckets, quantiles, batch, request, tenant_id, tls, auth, aws, acknowledgements for key sinks.metrics
-
Это же локи. А на снаппи жалуется в метриках. А там компрессии нет поля такого
-
Вектром в прометеус работает из коробки
-
ну судя по https://github.com/metrico/qryn/blob/master/docker/docker-compose.yml
они с opentelemetry коллектором в основном тестируют
я думаю вам надо ваш docker-compose и стек ошибки показать в github qrynqryn/docker-compose.yml at master · metrico/qrynqryn is a polyglot, high-performance observability framework for ClickHouse (formerly cLoki). Ingest and analyze logs, metrics and traces from any agent supporting Loki, Prometheus, OTLP, Tempo, El...
-
а заодно в github vector сделать issue На тему того что комперсиию в prometheus_remote_write было бы не плохо настраиваемой сделать
-
У вектора нет sink opentelemetry так что и тут потестить не получится
-
Когда vector в qryn слал через since: Loki, тоже проблема была
-
Не решили?
-
Сжатие убрал и все завелось
-
Но я так чисто потестировать ковырял. В целом работает или нет.
-
Подскажите плз, опасно ли апнуться с версии 22.10.2 на 22.11 или 22.12 - много ли неожиданностей нас может ждать? Хочется апнуться из за бага с lowerUTF в 22.10.2
-
Дак обновитесь до 22.10.4.23 и потестите
-
-
Сталкивался ли кто-то типом hstore от постгреса? Делаем импорт из источника постгрес базы и есть поле типа hstore. Сейчас оно импортируется как String, например,
"А"=>"2400", "PAN"=>"XXXXXXXXXXX67XX", "RRN"=>"066842979174"
Можно ли это привести, например, в json? -
regex вам поможет. Ищите в доке функции extractAllGroupsHorizontal/Vertical Там есть хороший пример как такие данные свернуть в удобную структуру.
-
Спасибо
-
-
-
-
А логи смотрели, логи контейнера, логи кх
-
так вот в нем и последнее сообщение это
-
нашел в чем дело
следовал инструкции https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-system-tables-eat-my-disk/ -
-
А что внутри?
-
<?xml version="1.0"?>
<yandex>
<query_log>
<database>system</database>
<table>query_log</table>
<engine>ENGINE = MergeTree PARTITION BY (event_date)
ORDER BY (event_time)
TTL event_date + INTERVAL 7 DAY DELETE
</engine>
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
</query_log>
</yandex> -
-
а разве нет логов у контейнера?
-
есть и в нем нет ошибки
-
-
-
-
-
-
примаунтить volumes логов для отладки мб, чтобы хоть увидеть что там пишет
-
да видимо
-
Доброй ночи, подскажите возможно ли в кликхаусе использовать такую конструкцию?
SELECT case column_value_1 when column_value_1 LIKE ('%неизвестность%') then 'известность' else column_value_1 end ...?
При попытке использовать ругается так: First argument and elements of array of second argument of function transform must have compatible types: both numeric or both strings.: while executing 'FUNCTION caseWithExpression, кастуй в стринг/не кастуй, всё время вылазит -
Тип в значения после then и после else должен совпадать, покажите тип колонки column_value_1 (например describe table)
-
if(col like ‘pattern’, ‘str ’, toString(col)) ?
- 06 January 2023 (36 messages)
-
Доброго дня.
Подскажите, а откуда КХ пытается прочитать типы при загрузке из CSV?
У меня есть валидный csv файл, в котором количество колонок-хедеров соответствует количеству колонок в строках с данными. Но получаю вот такое
SELECT *
FROM file('/var/lib/clickhouse/user_files/test.csv', 'CSVWithNames')
LIMIT 2
Received exception from server (version 22.8.6):
Code: 117. DB::Exception: Received from localhost:9000. DB::Exception: The number of column names 96 differs with the number of types 93: Cannot extract table structure from CSVWithNames format file. You can specify the structure manually. (INCORRECT_DATA) -
Ниоткуда, поэтому и предлагает указать руками
-
Коллеги, не нашел в настройках выгрузки csv из S3 указание кодировки. У меня в файле win1251, и кириллица поплыла, можно ли где то указать кодировку
-
-
В итоге заработало после того, как мы сделали ALTER другим ролям. Появилась гипотеза, что существует кеш ролей и он не всегда понимает, что пришло время обновиться.
-
Подскажите, у меня есть таблица вида id, timestamp, val и id повторяются c разными timestamp. Мне нужно выбирать самую новую запись для каждого id. Нужно использовать MV? Записи в таблицу только добавляются и потом никак не меняются. Записи могут добавляться очень быстро.
-
argMax
-
+ GROUP BY?
-
ну вы дополнительной инфы не дали, select argMax(id, timestamp) from table
-
В каком смысле "поплыла"? Вы загружаете данные в ClickHouse или выгружаете из него?
Если вы загрузили данные в cp1251, то они так и хранятся и так и достаются.
Способа их перекодировать в utf8 прямо в ClickHouse нет (ну либо я о нем не знаю) , проще подготовить данные в нужной кодировке. -
да, csv в 1251 и функция S3 в базу кидает кириллицу в некорректной кодировке
-
а давайте спросим у chatGPT - https://pastila.nl/?01c55537/3949274e41cf86f5d81f8b04afd3ade2
Ну как обычно - главным образом фантазии первокурсника на экзамене. Однако
SELECT convertCharset('text in windows-1251 encoding', 'Windows-1251', 'UTF-8'); вроде как рабочий вариант -
Приветствую! Всех с наступившим НГ!
Помогите, пожалуйста, со следующим кейсом
Есть клик-кластер: 2 шарда (по две реплики) + отдельно кластер keeper'a (3 ВМки)
Версии везде 22.1.3.7
Одна из keeper-нод приказала долго жить.
Keeper ВМ'ка будет пересоздана с чистого листа, но теперь вопрос, что лучше/безопасней, добавить новую keeper-нод'у с новым ID, убрав старую из конфигурации, или забустрапить существующую под старым id/hostname?
—
Спрашиваю, так как есть сомнения, что метаданные нормально создадуться если забустрапить keeper ноду под старым именем|id -
если уж апгрейдить, то тогда и до 22.12
-
это лучше проверить на стенде, сомнения у вас обоснованные...
там еще есть такой момент что конфигурация списка хостов хранится внутри storage у keeper
и есть ключ force-recovery
чтобы стартовать
но как именно он себя ведет, непонятно -
Да, именно.
Времени на полноценную проверку у меня нет, к сожалению
Так что, видимо, безопасней будет добавить keeper-ноду в кластер -
если добавить новую ноду в конфиг... то тоже не факт что будет работать
говорю же - конфиг не перечитывается с состоянием нод
и при старте список нод из storage приоритетнее чем данные из конфига
якобы это так NuRaft работает
но в упор не понимаю каким образом NuRaft как протокол должен влиять на то что приритетнее при построении кластера. конфиг или база =( -
> Времени на полноценную проверку у меня нет
это зря
clickhouse team конечно объявляют что keeper production ready
но как именно они его эксплуатируют и что делать в каждом конкретном кейсе пока не ясно -
Добавление новых нод/миграцию я тестировал, был переезд на новый набор keeper-серверов в два этапа - сначала расширение с 3-х до 6-ти, затем уменьшение с 6-ти до 3-х. Все по нодно. Успешно.
-
то есть просто конфиг меняли в XML и перегружали keeper?
-
да, но, опять таки, за один раз одна нода выводилась/вводилась, с лагом между операциями
-
Начал получить такие ошибки при сборке витрин через дбт
Cannot open file /var/lib/clickhouse/store/53b/53bd3071-eb96-4c67-9a17-ae1912cb57f9/tmp_insert_all_60_60_0/price_change_from_price_ago_30d_percent.bin, errno: 24, strerror: Too many open files. (CANNOT_OPEN_FILE) (version 22.12.1.1752 (official build))
Как победить. Клик поднять в кубике на обраpе altinity -
Это не по юлимитам ошибка?
-
Ну и вы как собирали? У вас физически файлы в сторе есть? Выносили стор на pvc?
-
Всем привет. Может кто сталкивался с такой проблемой: на одной из таблиц уменьшилии TTL примерно на год,записи и партиции удалились, файлы на тачке с ch в папке конкретно этой таблицы удалились, по запросу size из system.parts используемая память тоже уменьшилась на ~1Тб. но физически занимаемое место не уменьшилось никак, а даже через примерно час приросла на ~1тб…
-
Вы там бекапы не имеете?
или FREEZE TABLE -
Я и спрашиваю, куда копать. Я не собирал образ. это вопрос к девопсу. Как я понимаю надо править юлимиты
-
Ну я бы посмотрел физическое наличие в поде этого диска, его содержимое. Потом на всякий случай увеличил бы юлимиты до адекватного значения, по дефолту это часто опускается
-
Спасибо! Я временно уменьшил количество потоков ДБТ с 4 до 3. вроде пока проблема ушла. У меня еще есть необходимосить держать таблицу с дневными партициями по ключу сортировки с большой гранулярностью. В итоге при работе с массивамми много файлов вычитывается.
-
Нет…
-
Ну тогда сравнивайте что находится в system.parts и на диске
-
Что именно сравнивать? Не совсем понял
-
bytes_on_disk из system.parts
и контент /var/lib/clickhouse/store/... -
парты на диске с партами в system.parts. В system.parts есть колонка "path", а все реальные парты вашей таблицы очень просто найти через find . -name some_column_from_table_in_Q.bin Дальше делаете подходящий join и находите свои потеряшки.
Clickhouse активно работает с хардлинками, возможно где-то какой-то парт захардлинкался лишний раз. -
у вас что в качестве kubernetes?
cloud или baremetal?
короче вам надо как то ulimit выставить
или fs.file-max
как это сделать сильно зависит от вашей инсталяции kubernetes -
Спасибо. пошел в девопсу)
- 07 January 2023 (16 messages)
-
Как дедуплицировать таблицу? У меня MergeTree с PRIMARY KEY (id) и при этом ряды с одинаковыми id присутствуют.
-
потому что PRIMARY KEY
это не UNIQUE как в других базах
читайте про ReplacingMergeTree в доке
попробуйте разобраться как работает -
🔥Инфографика для маркетплейсов🔥
Привет, в поиске крутого дизайнера?
Меня зовут Даниил - я дизайнер инфорграфики.
Сделаю так, чтобы ваши карточки продавали!
Так же предоставляю отдельные услуги по фотошопу: поменять фон карточки/фото, поменять цвет любого предмета, удалить предмет и тд.
Цены ниже рынка🔥 -
Привет. Попробовал тут поставить КХ новомодным curl https://clickhouse.com/ | sh и получил внезапно version() 22.13.1.1476. Предполагал, что будет последняя релизная с гитхаба (сейчас там v22.12.2.25). Это так и задумано? Откуда вообще берется эта версия?
-
Дак вы уберите | sh, и посмотрите с какой ссылке скачивается
-
парты из system.parts по проблемной таблице совпадают с тем что есть на диске в /var/lib/clickhouse/data/default…
-
у вас база ordinary от старой версии? Нынче парты живут прежде всего в data/store
Там у вас точно нет подозрительных партов уровнем выше в /var/lib/clickhouse/ ? -
вот только счас нашел что есть файлы в папке /var/lib/clickhouse/shadow/71/data/default/ именно по этой таблице , и в том числе файлы которые удаленные по ттл
-
что это за директория и отчего они там появились?
-
а ведь вас сразу спросили про ALTER TABLE… FREEZE Но вы не сознались
https://altinity.com/blog/introduction-to-clickhouse-backups-and-clickhouse-backupIntroduction to ClickHouse Backups and clickhouse-backupThis article will explore the plumbing involved in backing up ClickHouse and introduce the clickhouse-backup tool for automating the process.
-
Support multiple dbt threads (session id per thread) · Issue #127 · ClickHouse/dbt-clickhouse
When I run dbt Concurrency: 4 threads I get :HTTPDriver for http://...*:8123 returned response code 500) 16:09:35 Code: 373. DB::Exception: Session is locked by a concurrent client. (SESSION_IS_LOC...
-
В общем пока просто они не тестировали, добавили в бэклог.
-
да извиняюсь, но я не помню чтоб кто то делал freeze этой таблицы у нас…
-
и как вообще можно это увидеть кроме как в shadow посмотреть
-
Никак. В этом замысел. Freeze просто делает хардлинки. Почти мгновенно появляются "копии" партов, не занимающие место. После этого Clickhouse к ним уже не имеет никакого отношения, у него есть свои "копии", которые он мерджит и удаляет по мере необходимости. Предполагается что судьба файлов в shadow в ваших руках - забекапили и удалили. Ну или не удалили.
-
и то есть получается что кто то все таки сделал freeze на таблицу? или как то ещё по другому это могло произойти? и как их лучше удалить ? сделать unfreeze?
- 08 January 2023 (36 messages)
-
Всем привет
Вопрос по таблице github_events на https://play.clickhouse.com/ - насколько долго она будет поддерживаться в актуальном состоянии? И кто ее поддерживает? -
И в BigQuery по github есть также таблицы:
bigquery-public-data.github_repos.commits
bigquery-public-data.github_repos.contents
bigquery-public-data.github_repos.files
bigquery-public-data.github_repos.languages
bigquery-public-data.github_repos.licenses
Планируется ли добавление таких же в клик?
В BigQuery вообще непонятен принцип обновления и нет некоторых репозиториев -
-
Перетащить из старого конфига в новый, видимо
-
из файла хмл юзерс в такой же файл, и пароли сохранятся?
-
-
-
Он никак не связан с Bigquery, наличие похожих таблиц не обеспечивается.
-
Либо если задавали пользователей в config.xml то соответствующий блок с пользователями такой же указать в новом конфиге
-
если вы уже дошли до ковыряний в fs, то ничто вам не мешает сделать rm -rf
Unfreeze сделает то-же самое, но с непривычным синтаксисом, в котором все равно надо указать имя каталога -
пользователей создавали через create user
-
-
там-же вам не только пользователи нужны, но и все про них - весь RBAC. Воспользуйтесь clickhouse-backup и сделайте restore -rbac на другом сервере.
-
точная схема
clickhouse-backup create_remote --rbac --schema
clickhouse-backup restore_remote --rbac --schema
но сервер надо рестартануть, иначе rbac из бекапа применить нельзя к сожалению... -
Joined.
-
Joined.
-
Joined.
-
зашел сейчас сделать rm -rf как вы сказали, но clickhouse уже сам в 4 часа ночи удалил лишние парты из shadow… и у меня вопрос: это ожидаемое поведение? по какому принципу он это делает?
-
предполагаю что по тому-же самому по которому какой-то неведомый демон делает freeze. Вы точно уверены, что там где-то в недрах различных кронов-планировщиков не затесался запуск clickhouse-backup или чего-то подобного?
-
будем искать, огромное спасибо за помощь!
-
ни по какому принципу он это не делает. это ручками тольок делаетя ALTER TABLE ... UNFREEZE ...
или физически как сказали выше clickhouse-backup еще может удалить... -
Добрый день! Подскажите удалось ли Вам найти проблему ? сейчас имею похожее поведение у таблицы есть парт у которого delete_ttl_info_min и delete_ttl_info_max равны 2023-01-05 00:00:00 , но ch не удаляет ни парты ни данные…
-
-
Добрый вечер! Кто сталкивался с таким кейсом: кластер(к8с) Clickhouse 1 реплика 1 шард жили и все было хорошо, но пришло время расширяться. Поставили зукипер, увеличили через конфиги до 3 реплик и шардов. Все обновили, кажется без проблем. Подключаемся через бобра, а старых схем/таблиц нет. Захожу в под(volume старые) данные на месте, а запросы к ним не идут(для новых все пусто) . Кто сталкивался с этим или знает где почитать?
-
По вашему вопросу кажется, что начать нужно с понимания, что вообще такое кластер в ClickHouse. Посмотрите здесь https://altinity.com/webinarspage/2019/7/31/introduction-to-the-mysteries-of-clickhouse-replication , например.Webinar: Introduction to the Mysteries of ClickHouse Replication
Built-in replication is a powerful ClickHouse feature that helps scale data warehouse performance as well as ensure high availability. This webinar will introduce how replication works internally, explain configuration of clusters with replicas, and show you how to set up and manage ZooKeeper, which is necessary for replication to function. We'll finish off by showing useful replication tricks, such as utilizing replication to migrate data between hosts.
-
логи контейнера clickhouse-operator смотрите в deployment clickhouse-operator
таблицы с каким движком были? MergeTree раз без zookeeper
значит они не отреплицировались а просто схема пустая скорее всего создалась... или даже не создалась, смотря какая версия operator
сначала надо было ZK добавить и сконвертировать MergeTree в ReplicatedMergeTree
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-converting-mergetree-to-replicated/
а потом уже конфиг менять -
Спасибо. Да, mergeTree были. Обязательно для всех на ReplicatedMergeTree переходить(просто сразу для всех не требуется переходить, а что-то само со временем перельется)?
-
ну если хотите репликацию то да
если собираетесь просто самостоятельно данные по репликам вставлять, раскидывать то не обязательно конвертировать
поверх этих табли надо еще CREATE TABLE ... ON CLUSTER '{cluster}' ENGINE=Distributed(...)
сделать
если хотите SELECT делать со всех серверов... -
-
@BloodJazMan Получается если вернуться сейчас к схеме 1 шард 1 реплика и если таблица с MergeTree то проблем не будет, т. к. в системных таблицах клик об этом не хранит записи, а ЗК просто почистить(в моем случае проще переустановить), после чего подключить ЗК и конвертировать таблицы. Правильно понял? Спасибо
-
да можно так сделать
удалите ZK
поменяйте spec.configuration.clusters.layout
удалите лишние PVC которые могут остаться если у вас policy: Retain в volumeClaimTemplates -
да, pvc с retain, спасибо
-
-
и итоге должен остаться один стейтфулсет -0-0-0
к которому уже подключаете ZK
через chi.spec.configuration.clusters[].zookeeper
и конвертите таблицы в ReplicatedMergeTree
только учтите, что решардинга нет
и на втором и далее шарде будет просто схема
и не забудьте правильно {shard} в zk path для replicated воткнуть -
Сколько тонкостей)
-
частый =)
ну как бы надо как то масштабироваться... масштабируются...
просто у клика replicated и distributed это ортогональные штуки которые контроллируются в полуручном режиме
оператор конечно помогает это немного упростить
но надо понимать как оно работает и что происходит при изменении yaml манифестов - 09 January 2023 (162 messages)
-
Есть какие нибудь курсы по клику?
Чувствую что теперь в конторе я назначен 'виноватым' за клик, а я нихрена не понимаю. -
где-то попадалась новость, что Яндекс Практикум обещали скоро запустить курс по CH
-
Поддерживаю вопрос, с такой же формулировкой
-
-
Открываете Ютуб и пишите Clickhouse доклады, и можно смотреть вечно :) А главное узнать можно многое
-
Да и сейчас он есть, но мы работает только с заграничными юр лицами.
-
Это не курс, а доклады. А это всё-таки разное
-
-
Ну тут как бы открываешь документацию, понимаешь что такое MergeTree, после того как понял задаёшь вопрос в чатике ORDER BY и PRIMARY KEY одно и тоже ? Тут тебе отвечают, что это разное... Потом узнаешь что такое MV, приходишь сюда, и тебе кидают ссылку на видос про MV https://www.youtube.com/watch?v=ckChUkC3Pns&t=9353s . Вот и курс готов :)
-
Прекрасно.
Но когда это курс, а не видосик то будет не 'узнаешь', а тебе разъясняют. -
И это видео мне кидали, и у меня 'щелкнуло' что это.
-
Вот это видео можно посмотреть. https://www.youtube.com/watch?v=efRryvtKlq0&list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&index=44&t=201s&ab_channel=HighLoadChannel
-
*башка пухнет. Клик с тарантулов грохнулись на мою голову.
-
думать вообще больно угу....
-
Не, думать я люблю. Но в одном месте не знаешь это одно. А тут сразу два. И ещё надо понять как это в го прикрутить.
-
а куда ты торопишься то? или ты о себе заявил как об эксперте который досконально знает обе системы?
-
Всем добрый день. Подскажите как выяснить какие процессы отъедают память и по сколько.
Словари, лайввью, primary key from parts уже отпрофилировал, мержи и мутации просмотрел, Кэши почистил, но все равно непонятно куда утекает порядка 40-45 Гб оперативки. Какие еще способы есть чтобы понять какие процессы самого КХ потребляют память и в каких количествах.. Логи почти все отключены, а основной лог запросов переделан в mergeTree. Запросов на чтение и запись почти нет (у основных пользователей еще утро-ночь) КХ 22.8.4.7 lts -
Тут уже были и все попообовали - https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-who-ate-my-memory/ ? Там постепенно добавляется
-
на самый крайний случай (подтормаживает если гранулярность сильно низкая) можно включить memory profiler перегрузить сервер
и посмотреть растет память или нет...
и построить flamegraph через https://github.com/Slach/clickhouse-flamegraph/GitHub - Slach/clickhouse-flamegraph: CLI utility for build flamegraph based on system.trace_logCLI utility for build flamegraph based on system.trace_log - GitHub - Slach/clickhouse-flamegraph: CLI utility for build flamegraph based on system.trace_log
-
-
Все попробовал. ~30 Гб занято словарями, мержами, запросами. но суммарно занято 60Гб в оперативке. Вопрос: сам КХ на свой процесс 30Гб потребляет что ли? Как то много...
-
Всех с прошедшими )
Сталкнулись с проблемой следующего характера.
Поднимается клик - отрабатывают миграции где первым параметром стоит SET FLATTEN_NESTED = 0
Далее проводятся работы (загрузка данных) и все ложится нормально по структуре.
Далее если перезапустить клик - nested структуры разваливаются (становятся плоскими).
Ну логично что косяк где то в запуске сервера. Видимонужно кудато прописать
SET FLATTEN_NESTED до запуска? -
да, может
https://github.com/Altinity/clickhouse-operator/issues/1064#issuecomment-1360930379Install to specific namespace but monitor all ns · Issue #1064 · Altinity/clickhouse-operatorHello! Can't install operator to kube-system. We use kube-system ns only for infra(k8s specific) apps. Is it possible to install operator to custom namespace (for ex clickhouse-operator), b...
-
как считаете потребляемую память?
у вас 60gb RSS?
или может у вас 30gb buffers? -
в профиль дефолтный
в /etc/clickhouse-server/users.d/flattern_nested.xml
<clickhouse>
<profiles><default><flatten_nested>0</flatten_nested></default></profiles>
</clickhouse> -
Доброе утро. Всех с прошедшими НГ и рождеством!
Подскажите, пожалуйста, может кто сталкивался с подобной проблемой. При смене мастера ZK все реплики во всех шардах сваливаются в RO пока мастер ZK не вернется на старую ноду. Может что-то в настройках надо поменять или версию CH обновить? -
А его руками прописать надо? Или в /etc/clickhouse-server/config.xml прописать можно?
-
я же написал в какой файл надо XML положить?
если не хочется с users.d возиться тогда в users.xml а не в config.xml прописывайте -
понял! спасибо!
я просто не в курсе как он понмает что и как из users.d надо забирать ) -
Всем доброй рабочей недели)
Столкнулся с проблемой что запросы по ключу сортировки не распараллеливаются при поиске значения по этому ключу, может кто подскажет куда смотреть?
Вот содавал ишью на гите, там подробней https://github.com/ClickHouse/ClickHouse/issues/44487Distributed query is not parallelizing when order key in where · Issue #44487 · ClickHouse/ClickHouseWhy is a query not parallelized when searching by the order key of a distributed table? For example: I have distributed table (test.distributed_table referencing test.local_table order by z) CREATE...
-
это by design архитектура
но в новых версиях clickhouse 22.11+
есть
insert_keeper_max_retries=10 (пока не документировано)
и при кратковременная потеря кворума в ZK должно работать -
а вы посмотрите в /var/lib/clickhouse/preprocessed_configs/
там два файла
почитайте их
там написано их каких файлов они собраны... -
Понял. Спасибо!
-
Только в нашем случае кворум то есть, просто по какой-то причине мастер перепрыгнул на другой узел кластера ZK и все встало :(
-
что-то непонятно вы как то фактор распаралеливания считаете...
время initial_query_start_time и query_start_time вообще может отличаться а может и не отличаться...
оно там с точностью о секунды
есть конечно
query_start_time_microseconds
и
initial_query_start_time_microseconds
но в issue вы про них ничего не сказали...
вам надо
в
SELECT hostName(), type, event_time, initial_query_id, query_id FROM clusterAllReplias('{cluster}',system.query_log) WHERE event_date=today() AND (query_id='....' OR initial_query_id='...')
посмотреть для полноты картины -
в смысле все встало?
ну оно восстановиться должно
там session expired скорее всего случился... в момент перевыбора мастера...
а потом должно восстановиться... а не встать на мертво
смотрите логи zookeeper там обычно ясно почему перевыборы мастера случились -
ушло в RO и пока не перезапустили нового мастера, чтобы вернуться к старому так все и висело в RO минут 15.
-
ну смотрите в логи zookeeper
-
ок. спасибо! попробуем воспроизвести и глянуть логи.
-
сколько zookeeper нод в zk кластере?
как они прописаны в настройках clickhouse?
если переходит в RO
смотрите
SELECT * FROM system.zookeeper WHERE path='/' FORMAT Vertical
с той ноды где RO
чтобы проверить что clickhouse может из ZK читать...
ну и SYSTEM RESTART REPLICAS
еще может помочь
НО, повторюсь, если есть КВОРУМ в ZK и все настроено корректно. то клик сам из RO выходит -
5 нод в ZK.
прописаны так:
<zookeeper>
<node>
<host>10.10.7.220</host>
<port>2181</port>
</node>
<node>
<host>10.10.8.210</host>
<port>2181</port>
</node>
<node>
<host>10.10.8.104</host>
<port>2181</port>
</node>
<node>
<host>10.10.8.209</host>
<port>2181</port>
</node>
<node>
<host>10.10.8.213</host>
<port>2181</port>
</node>
</zookeeper>
Спасибо за советы! Попробуем наши версии с нашими настройками в тестовой среде погонять. -
Ну на самом деле, в ишью, я просто смотрю время выполнения скрипта, по ключу сортировки это время примерно *2, если искать значение не по ключу сортировки, а фулсканом по другому полю, то все хорошо.
А query_start_time я смотрю на шарде, потому что ожидаю что разница initial_query_time и query_start_time как раз и будет тем самым временем отработки другого шарда -
Добрый день!
Вставляю данных из JSON. В таблице поле типа Дата, а в файле приходит Дата и Время, как сделать чтобы нормально парсилась дата? -
-
Собсвенно так оно и есть, если смотреть по примеру в ишью, то query_start_time > initial_query_time, а если фильтровать не по полю сортировки, то query_start_time = initial_query_time
-
SELECT toDateOrZero(JSONExtract('{"date_time":"2022-05-13T11:37:25"}', 'date_time', 'String'))
-
Получается, если не устанавливать оператор в ns kube-system и устанавливать каждый в свой ns, он будет отвечать кждый за свой индлстанс? А как из этих кейсов лучше для оператора? Или он хорошо себя чувствует в каждом кейсе?
-
не, у меня
INSERT INTO {table} FORMAT JSONEachRow -
то есть тут если только каким-то ключем вроде date_time_input_format
-
Подскажите, когда мы делаем сэмплирование для таблиц, например SAMPLE BY cityHash64(id), мы жертвуем только памятью? И каким количеством памяти? Можно ли спокойно вешать SAMPLE BY на все таблицы где есть редкая потребность в таких запросах?
-
добрый день, подскажите какой engine лушче подходит чтобы собрать кластер на один шард три реплики с автоматической репликацией таблиц между репликами? основной приоритет не потерять инфу и иметь ее консистентной между репликами
пока для меня выглядит лучше всего ReplicatedMergeTree отсюда
https://clickhouse.com/docs/en/guides/sre/keeper/clickhouse-keeper-uuid/ -
Абсолютно то что нужно, посмотрите заранее на счет обновлений и удалений строк.
-
Добрый день!
Проблема с парсингом Decimal из json с массивом.
Но если парсить сначала в String, а потом переводить в Decimal, то работает
Это не баг?
ClickHouse-QA :) with ('[{"index":517,"amount":5.000000}]') as json
SELECT
JSONExtract(data, 'index', 'UInt32') as index,
JSONExtract(data, 'amount', 'Decimal64(9)') as amount
FROM (
SELECT arrayJoin(JSONExtractArrayRaw(json)) as data);
WITH '[{"index":517,"amount":5.000000}]' AS json
SELECT
JSONExtract(data, 'index', 'UInt32') AS index,
JSONExtract(data, 'amount', 'Decimal64(9)') AS amount
FROM
(
SELECT arrayJoin(JSONExtractArrayRaw(json)) AS data
)
Query id: 3e3120ba-58ce-4173-bbd0-4e24885d2d6c
┌─index─┬─amount─┐
│ 517 │ 0 │
└───────┴────────┘
1 row in set. Elapsed: 0.002 sec.
ClickHouse-QA :) with ('[{"index":517,"amount":5.000000}]') as json
SELECT JSONExtract(data, 'index', 'UInt32') as index,
toDecimal64(JSONExtract(data, 'amount', 'String'), 9) as amount
FROM (
SELECT arrayJoin(JSONExtractArrayRaw(json)) as data);
WITH '[{"index":517,"amount":5.000000}]' AS json
SELECT
JSONExtract(data, 'index', 'UInt32') AS index,
toDecimal64(JSONExtract(data, 'amount', 'String'), 9) AS amount
FROM
(
SELECT arrayJoin(JSONExtractArrayRaw(json)) AS data
)
Query id: fbcf55a9-97c2-4b41-bf42-ded745a2bcfb
┌─index─┬─amount─┐
│ 517 │ 5 │
└───────┴────────┘
1 row in set. Elapsed: 0.002 sec. -
JSONExtract Это вроде бы зависит от c++ double с плавающей запятой, float должен вроде бы сразу распарсить
-
У вас проблемы во версии, вы её не указали при отправке сообщения, на последней версии всё хорошо https://fiddle.clickhouse.com/47e012f2-8a0c-4188-9dc4-f6a6957674a5
-
Спасибо!
Да, в последней версии и правда все ок.
У меня версия:
22.10.2 -
каждый за свой namespace
но есть проблема, CRD общий с одной версией, так что несколько версий разные операторов. могут со временем не ужиться вместе, хотя мы стараемся чтобы была совместимость... -
Всем привет , подскажите плиз , это норма что такой запрос не исполняется ? каунт по 22кк чисел
Понятно что я в запросе не каунт считаю , а немного для другого его юзаю -
-
Ребят а подскажите как одним запросом убить все запросы в кх на текущий момент ?
-
Может это лучше подойдёт ? https://clickhouse.com/docs/en/operations/named-collections/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
-
KILL QUERY WHERE 1=1
-
респект
-
Но они не убиваются в 99% случаев
-
норма, numbers это таблица генератор, откуда КХ знать что дальше не будет чисел указанных в WHERE? поэтому запрос будет работать до конца
-
так вон же , там where number between ...
-
и? в этой таблице не хранятся данные
-
да что то не убиваются
-
-
а как сделать чтоб он сканил именно как я ему сказал
-
если хотите более менее понятного выполнения добавьте в неё лимит
-
Ну это уже функционал КХ такой, что не на каждом этапе выполнения запроса, запрос можно убить ...
-
Блин , все равно долго (((.
Есть какой то способ сгенерить 22кк чисел быстрый) -
select * from numbers(10,20)
-
лучший)
-
А merchant_id много ?
-
-
О, похоже и правда подойдет. Но вот как туда динамически класть креды из secrets пока не пойму. (у меня CH в k8s через clickhouse-operator)
-
Динамически вроде не получится. Только при запуске
-
Но я не помню
-
я существо только с read only (( эх
-
А как вы вообще хотите использовать ? такой запрос
-
Интересную ситуацию наблюдаю с clickhouse-operator. Сейчас уменьшил число реплик и следил за логами в операторе:
...обновление конфигов
...запустились функции на го
и потом поехало для всех реплик
I0109 11:03:47.406459 1 schemer.go:206] HostDropReplica():Drop replica: chi-service-service-2-0 at 2-0
E0109 11:03:47.483009 1 connection.go:200] Exec():FAILED Exec(http://chi-service-service-2-0.default.svc.cluster.local:8123/) dial tcp: lookup chi-service-service-2-0.default.svc.cluster.local on ...: no such host for SQL: SYSTEM DROP REPLICA 'chi-service-service-2-0'
Получается, что первым пропала реплика, а потом полетел запрос. Хм... Может я опять что-то не понимаю( -
кажется нашел. В конфиге поддерживается конструкция:
from_env="VARIABLE_NAME" -
Всем привет!
Подскажите, плиз, как сейчас обстоят дела с инструментами управления миграциями? Слежу за flyway, но потерял надежду на мердж в мастер. Есть ли какие-то альтернативы?
Ключевые требования:
1 Инструмент помнит свое состояние и может сам определить, катить патч версии N на БД X или нет. Т.е. накат ограничивается командой вроде flyway migrate
2 В инстурменте есть аналог repeatable скриптов, как в flyway. Т.е. он следит за хэшами файлов и в случае изменения накатывает скрипты из этих файлов на БД повторно. Т.о. получится хранить все CREATE OR REPLACE объекты в своих файликах. -
bytebase смотрели ?
-
только KILL QUERY WHERE 1 SYNC
но может не сработать
потому что эта штука только выставляет флаг и ждет когда выполняющиеся запросы этот флаг прочитают
а они могут и не прочитать
GROUP BY и ORDER BY операции например не отменить через KILL QUERY ;( -
Кролик недоинсерчивает часть ивентов , я это связываю с тем что клик падает из за перенагрузки.
Благо у нас есть инкремент на event_id.
У меня есть min event id и max event id , между ними разница условно 22кк , а каунт строчек где то 21.99kk.
Алгоритм такой , гененерю 22кк event id , приджойниваю к ним event id которые есть , соответсвенно нахожу номера ивентов которые нет .
докидываю ручками из сыряка -
Это не вам вопрос был :(
-
-
Да, быстро глянул, показалось что это карьерный самосвал, когда мне нужна дачная тачка)
-
Ну получается, что да
-
GitHub - golang-migrate/migrate: Database migrations. CLI and Golang library.
Database migrations. CLI and Golang library. Contribute to golang-migrate/migrate development by creating an account on GitHub.
-
liquibase
-
Всем привет, столкнулся с подобным впервые...
Внешний словарь не подгружает данные, и выдаёт ошибку
error querying the database: code: 130, message: Array does not start with '[' character: while converting source column external_id to destination column actual_markets: while executing 'FUNCTION _CAST(external_id :: 7, Array(String) :: 17) -> _CAST(external_id, Array(String)) Array(String) : 16'
DDL словаря:
CREATE DICTIONARY <DATABASE>.<DICTIONARY>
(
`parsed_at` DATE,
`reg` String,
`category` String,
`market_type` String,
`actual_markets` Array(String),
`title` String,
`weight` Float32,
`external_id` String,
`price` Float64,
`rank` UInt64
)
PRIMARY KEY parsed_at,
reg,
category,
market_type,
external_id,
title,
weight
SOURCE(CLICKHOUSE(HOST 'clickhouse' PORT 9000 USER 'default' PASSWORD '[HIDDEN]' DB 'DATABASE' QUERY `SELECT\n formatDateTime(parsed_at,
'%Y-%m-01') AS parsed_at,
\n substring(oktmo,
1,
2) AS reg,
\n toString(category_id) AS category,
\n market_type,
\n groupUniqArray(market_ext_id) as actual_markets,
\n title,
\n weight,
\n external_id,
\n round(avg(price_for_kg),
2) AS price,
\n ROW_NUMBER() OVER (\n PARTITION BY parsed_at,
\n reg,
\n category,
\n market_type\n ORDER BY\n parsed_at,
\n reg,
\n category,
\n market_type,
\n price\n ) rank\nFROM\n <DATABASE>.<TABLE> AS f\nWHERE\n reg != ''\n AND price_for_kg > 0\n AND deleted_at IS NULL\n AND category_id IS NOT NULL\n AND parsed_at between '2021-05-01' and '2021-12-31'\nGROUP BY\n parsed_at,
\n reg,
\n category,
\n market_type,
\n external_id,
\n title,
\n weight\nORDER BY\n parsed_at ASC,
\n reg ASC,
\n category ASC,
\n market_type ASC,
\n price ASC\n`))
LIFETIME(MIN 0 MAX 10000)
LAYOUT(COMPLEX_KEY_HASHED());
Кто с таким сталкивался и в чём может быть проблема?
ClickHouse server version 22.12.1.1752 (official build). -
Простите за "Качественную" типографию запроса в конструкции SOURCE, копировал из бобра
-
market_ext_id
какого типа Nullable ? -
В исходной таблице, да.
-
всем привет!
в документации clickhouse на русском и английском версиях написаны противоположные утверждения, которому верить?
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/custom-partitioning-key/
https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/custom-partitioning-key/
Partitioning does not speed up queries (in contrast to the ORDER BY expression).
Это позволяет оптимизировать работу с данными, так как при обработке запросов будет использоваться только необходимое подмножество из всевозможных данных.Custom Partitioning Key | ClickHouse DocsIn most cases you do not need a partition key, and in most other cases you do not need a partition key more granular than by months. Partitioning does not speed up queries (in contrast to the ORDER BY expression).
-
ну видимо на выходе тоже Null появляется
в данных
https://fiddle.clickhouse.com/6ed2b762-7f4f-4173-a955-9313a0790463
coalesce в помощь... -
русская мене точная
правильно выбранные PARTITION BY запросы все таки ускоряет ... за счет того что производится PARTITION prunning
просто всякие деятели прочитав про ускорение, начинают горордить PARTITION BY date
на ровном месте и получают замедление
вот и добавили warning
просто неправильный PARTITION BY это вторая по популярности ошибка при создании таблиц в CH
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.
-
Спасибо!
-
Добрый день. Clickhouse 22.12.
Делаю инсерты с async_insert=1 и wait_for_async_insert=1. Стандартный таймаут ожидания 120с , при этом в system.processes отмечаются инсерты, которые уже должны быть давно закончены с ошибкой по таймауту, а не висеть 5-6 минут.
Это нормальное поведение ? -
Здравствуйте, а подскажите почему так
select 0/0 = 0/0,
NaN = NaN,
nullIf(0/0, NaN) -
в русской версии некоторых статей даже нет
-
посмотрите в таблице
SELECT * FROM system.asynchronous_inserts WHERE has(entries.query_id,'query_id_from_system_processes') FORMAT Vertical
а у вас там elapsed какой в system.processes?
а в settings в этих inserts в system.processes точно async_insert стоит? -
тогда почему NuN = NuN истинна?
-
тьфу
изивните
NaN Это не Null
вы nullIf Делаете же... -
ну nullIf просто возвращает null при равенстве двух аргументов.
Вот у меня первый аргумент 0/0, и второй NaN чистый
и при сравнении через эту функцию, равенства не происходит, а если просто отлельно сравнить два NuN, то всё ок -
в общем, немного понятно, но лично для меня всё равно выглядит крайне странно это
-
ощущение, что Nan чистый, более "нановее", чем 0/0
и поэтому не равны они) -
https://fiddle.clickhouse.com/7c590e79-6598-41ca-875b-aa820e2e1f31
Да =( блин... там было какое то конкретное обоснование, забыл. в голову ничего не лезет, извините еще раз
попробуйте
isNaN( )
вместо equal -
ну да, я тоже к этому пришёл
-
А хорошо ли использовать clickhouse для логов?
-
Вполне
-
А как лучше партиционировать?
-
без фанатизма лучше партиционировать
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.
-
Подскажите, пожалуйста, каковы шансы что этот фикс будет бэкпортнут в LTS? https://github.com/ClickHouse/ClickHouse/issues/43319
Он вроде как в мастер смерджен и все. Или только ждать новой версии?Decimal and Nested type checks are broken for capnp format · Issue #43319 · ClickHouse/ClickHouseI use kafka engine and capnp schema to insert data to my clickhouse servers. After upgrade from the clickhouse 21.8.15.7 to 22.3.12.19 my capnp deserlialization was broken with the following errors...
-
формат не популярный.
у вас что сломалось? Decimal или Nested?
для Nested там же вроде как настройка про flatten_nested
https://github.com/ClickHouse/ClickHouse/issues/43319#issuecomment-1318861386
в общем скорее следующего релиза ждать 23.1Decimal and Nested type checks are broken for capnp format · Issue #43319 · ClickHouse/ClickHouseI use kafka engine and capnp schema to insert data to my clickhouse servers. After upgrade from the clickhouse 21.8.15.7 to 22.3.12.19 my capnp deserlialization was broken with the following errors...
-
спасибо за ответ!
печально. нужен функционал от 22.3 минимум, а апдейтнуться не можем, т.к. все ломается при обновлении. разработчики говорят, что нужны и Decimal и Nested, и оба сломались в новой версии. -
ну ждите 23.1
-
ок. спасибо!
-
Сам исходный запрос отрабатывается, нормально и никаких Null значений там нет.
-
Чем ещё может быть обусловлена такая ошибка
-
Спасибо
-
тем что на выходе не получается массива а получается непонятно что
error querying the database: code: 130, message: Array does not start with '[' character: while converting source column external_id to destination column actual_markets: while executing 'FUNCTION _CAST(external_id :: 7, Array(String) :: 17) -> _CAST(external_id, Array(String)) Array(String) : 16'
конкретно результат хочется в виде [...]
а получается что-то другое...
посмотрите на данные в запросе SELECT
что там? везде массив как положено? -
Тут ещё самое странное что ошибка гласит что-то вроде ...в ходе конвертации исходного столбца external_id в конечный actual_market... Но я не конвертирую это поле в actual_market, я конвертирую market_ext_id..
-
Этот словарь работал себе работал а потом хоба и перестал(
-
Смотрите, наконец кто-то попробовал переписать h3 чтоб работало побыстрее. Клик использует эту библиотеку для географии
https://grim7reaper.github.io/blog/2023/01/09/the-hydronium-project/ -
да, в settings = {"AsynInsert":"1" .... , }, а в elapsed доходит до 400 секунд
-
ну тогда пишите issue на github
-
Наврал , я Вам вывод дал select * from system.processes.
И там в settings : {"AsyncInsert":1",...}
При это в выводе Вашего запроса - ничего нет. вообще.
Загружаю курлом, параметры передаю таким образом &async_insert=1 -
(
-
да действительно странное...
попробуйте
создать отдельную таблицу не словарь
и сделать в нее INSERT .. SELECT ваш селект из словаря... -
Добрый день
Есть у кого-нибудь опыт использования движка:
VersionedCollapsingMergeTree?
На сколько он эффективен на таблице 10-15 млрд строк (это почищенный объем RMT движком из 24 млрд строк, но все еще встречаются дубли)? -
если вы не используете SELECT ... FINAL
то от дублей вы ни в Replacing ни в Collapsing не избавитесь
вы понимаете вообще как оно работает? -
FINAL в доке оч не рекомендуют на больших объемах. Скорее группировка, разве не так?
Да, теоретически понимаю. Оч отталкивает момент, что у тебя все строки, прежде чем выпялятся движком, сначала доп.задубливаются. И не очень бы хотелось увидеть х2 объема таблицы, например. Но на сколько реален такой сценарий? или все таки движок пошустрее? -
строки не дублируются нарошно... строки вычищаются в соответсвии с логикой которые дает движок, для одинаковых значений набора полей из ORDER BY ...
внутри двух партов которые мержатся между собой
и внутри одного\нескольких партов при вставке (несколько если большая вставка больше миллиона записей за один INSERT) -
Ну в VersionedCollapsingMergeTree нам же необходимо задублить строку с меткой -1, прежде чем вводить новую - это я и назвал задубливанием
Вы мне кажется про RMT рассказываете, с ним неплохо знаком -
ну так это вы делаете а не движок сам
и да. по сравнению с Replacing у вас вырастает размер данных
смотрите там механизм простой в Collapsing
-1 для DELETE
1 для INSERT
для UPDATE
-1 старые значение
+1 новые значения
разница с VersioningCollapsing и обычным Collapsing в том
что если есть одинаковый набор значений ORDER BY колонок
то колонка Version дополнительно помогает разобраться в каком порядке строки отсортировать перед схлопыванием... -
Я понимаю, что вы хотите мне помочь. Спасибо!)
Но доку я читал, теоретически все понятно.
Написал, чтобы услышать - есть ли здесь участники, которые на практике применяли этот движок на больших объемах и с какими нюансами столкнулись? Остались ли на нем? -
Сам движок работает как описано выше. Нюансы начинаются при его реальном использовании в запросах-отчетах, но вы про них ничего не говорите. Само по себе число строк ни о чем не говорит. Может они лежат мертвым грузом, а запрос у вас всего за пару месяцев на 3% от всех данных.
Зависит от того где вы будете брать старые данные для -1. Зависит от skip индексов и прунинга партиций. От количества колонок в запросе.
У нас работает на 3.5 ярда строк, order by id. Старые данные для -1 берутся из самой таблицы ELT процессом. Skip индекс есть, но мы с ним осторожны. Выборка преимущественно через group by (без final), потому как все отчеты требуют суммирования. -
Добрый! Пока не решил. На днях займусь снова....
-
Добрый день! Пишу самодельные логи в базу, в которой есть поле json. При выполнении запросов к базе через стандартный клиент, который идет с докер-образом получаю что в поле json как-будто содержатся все поля в каждой строке, но те, которые не были заданы просто пустые. Хотя в базу я передаю разные схемы данных в json. Почему так и как исправить?
-
Ну так и есть
-
Чтобы исправить, нужно использовать другую БД
-
А как глазами это анализировать? Нечитабельно. Можно скрыть пустые?
-
Не хочу зоопарк бд
Хочу писать логи в кх и метрики. Потом может понадобится анализ -
Я не знаю как вам ответить на ваш запрос
-
Ну так уберите через WHERE пустые значения
-
которые вам не нужны
-
У меня сам json никогда не пустой. Но схемы данных в каждой строчке разные и разных местах пусто получается
-
Вы используете формат данных JSON
-
Он в колонки получается превращается в кх?
-
Вы можете обратиться через where к значению в JSON'e
-
Да
-
Просто в тарантуле и постгре не так. Я думал можно поведение кх настроить как там
-
При выводе на экран. Как там хранится мне ьез разницы. Главное чтобы быстро и сжатие норм
-
Есть ли какая-то функция которая если ее применить к значению json при селекте выкинет все ключи со значениями null?
-
И допустим конвертнет в стринг. Чтобы формат вывода был одинаковым
-
В графане чтобы смотреть можно было
-
Не знаю, попробуйте найти что-нибудь в Issue на github'e
- 10 January 2023 (86 messages)
-
60 Гб RSS, посмотрел через ps
-
30 гигов на словари, требуют +30 гигов при загрузке новой версии словаря, потому что грузится в новую память а потом меняется
но старая память должна отдаваться системе
у вас RSS константный получается?
вы его кроме как через ps мониторите как то?
графики есть? -
Графики может и есть, но и без них, в цикле если запускать ps, видно что память не возвращается после загрузки словарей, а они раз в час обновляются
-
если сервер рестартануть, после старта словари грузятся и сколько RSS показывает тогда?
-
Во время загрузки сервера примерно 30 гб становится занято всего, потом со временем поднимается до 60. Вот момент потери этих 30 не получается выявить.
-
SELECT formatReadableTimeDelta(loading_duration), formatReadableSize(bytes_allocated), name FROM system.dictionaries
что показывает?
сколько времени ваши словари обычно грузятся? -
Самый долгий 9 минут, остальные секунды
-
-
так давайте разбег по памяти проверим
SELECT arrayMap(x -> formatReadableSize(x), quantiles(0.5,0.9)(value)) FROM system.asynchronous_metric_log WHERE name='MemoryResident' AND event_date=today() -
поправил запрос
-
Отключены эти логи, увы не смогу посмотреть пока.
-
в общем сначала убедитесь в профиле нагрузки по памяти нормально на отрезке 10+ часов
графики RSS найдите где нибудь... и дальше уже имеет смысл разговаривать
пока не очень понятно что может стрелять
тем более вы говорите что попробовали все отсюда
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-who-ate-my-memory/
но конкретных цифр пока нет -
там в clickhouse какой нибудь Engine=Kafka есть?
SELECT database, table, engine FROM system.tables WHERE database!='system' AND engine NOT ILIKE 'memory%' AND engine NOT ILIKE '%MergeTree'; -
Добрый день коллеги, подскажите что будет быстрее работать по функциям поиска, фильтрации, поиска уникальных значений как key,так и value - может кто то тестил или есть знающие люди поэтому поводу, работа с map(String, String) или array(tuple(String,String))
-
один фиг
и то и другое подтормаживать будет потому что и там и там под капотом массивы...
и если у вас там не дай бог тыщи элементов то это больновато будет -
Всем привет!
Получаем такую ошибку:
Error: HttpCode:500 ; ;Code: 999. Coordination::Exception: Connection loss, path: /clickhouse/task_queue/ddl/query-0000007558: While executing DDLQueryStatus. (KEEPER_EXCEPTION) (version 22.3.15.33 (official build))
Подскажите, как её оттраблешутить или пофиксить.
Запускаем в докере официальный имэдж, если это имеет значение. -
Благодарю!
-
zookeeper установлен? запущен?
SELECT * FROM system.zookeeper WHERE path='/'
что показывает? -
zookeeper, тот который вместе с сервером идёт:
<keeper_server>
<tcp_port>2181</tcp_port>
<server_id>1</server_id>
<log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
<snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>
<coordination_settings>
<operation_timeout_ms>10000</operation_timeout_ms>
<session_timeout_ms>30000</session_timeout_ms>
<raft_logs_level>trace</raft_logs_level>
</coordination_settings>
<raft_configuration>
<server>
<id>1</id>
<hostname>10.0.0.101</hostname>
<port>9444</port>
</server>
<server>
<id>2</id>
<hostname>10.0.0.102</hostname>
<port>9444</port>
</server>
<server>
<id>3</id>
<hostname>10.0.0.103</hostname>
<port>9444</port>
</server>
</raft_configuration>
</keeper_server>
</clickhouse>
вывод сейчас пришлю... -
-
-
-
Да она работает по протоколу Clickhouse и всегда будет долбиться в TCP
-
А через http только sql_alchemy, заточенная под клик?
-
Вроде вот этот работает на http https://github.com/ClickHouse/clickhouse-connectGitHub - ClickHouse/clickhouse-connect: Python driver/sqlalchemy/superset connectors
Python driver/sqlalchemy/superset connectors. Contribute to ClickHouse/clickhouse-connect development by creating an account on GitHub.
-
спасибо
-
ну ... должно работать, cickhouse-keeper у вас заведен как embedded внутри clickhouse-server? или как standalone процесс?
-
Как embedded
-
а как прописана секция <zookeeper>
в настройках? -
SELECT * FROM system.zookeeper WHERE path='/clickhouse/task_queue/ddl/query-0000007558' FORMAT Vertical
что нибудь показывает? -
не лучший вариант
если что-то в embedded упадет, то и сам clickhouse-server свалится... я бы разнес... но сути ошибки это не меняет
потерялся коннект между clickhouse-server и clickhouse-keeper во время исполнения ON CLUSTER запроса... -
Вот так:
<zookeeper>
<node>
<host>10.0.0.101</host>
<port>2181</port>
</node>
<node>
<host>10.0.0.102</host>
<port>2181</port>
</node>
<node>
<host>10.0.0.103</host>
<port>2181</port>
</node>
</zookeeper> -
можно попробовать ограничить только одной нодой
<zookeeper>
<node>
<host>127.0.0.1</host>
<port>2181</port>
</node>
</zookeeper>
чтобы по сети не пробовало ломиться а всегда конектилось к самому себе... -
0 rows, но со времени этой ошибки, мы уже кластер заново подняли с пустой базой)
-
Спасибо! Попробуем
-
Добрый день, спасибо за советы, разобрался. Проблема была в секции PRIMARY KEY, а именно в порядке следования ключей, видать нововведение...
-
что-то странное, у вас complex key hashed
значит словарь строится по полям которые в ORDER BY
но там по идее рекордсет то по именам полей должен при загрузке просто связываться... а не по порядку их следования...
я бы на вашем месте привел старый и новый SQL
и сделал issue на github -
нашли сегодняшний ответ Алексея https://coder.social/ClickHouse/ClickHouse/issues/33935ClickHouse,ClickHouse
ClickHouse,ClickHouse | A setting to allow case insensitive column, table and database names.
-
Жил-был кластер 2 шарда по 2 ноды, основные пользователи - скрипты-писатели и скрипты-читатели (последние на каждый запрос открывают новое TCP соединение). Аналитик вручную запустил запрос на чтение огромного количества данных, понял что не дождётся его завершения и скомандовал kill query. Однако, вместо отмены запроса нода перестала отвечать, а мониторинг нарисовал такие вот красивые графики (рост числа подключений и их падение чётко совпадают с началом и завершением запроса kill query).
Можете подсказать, почему КХ мог так отреагировать на отмену запроса? -
-
Вопрос хороший, тоже интересно было бы послушать комментарии
-
если KILL QUERY был вызван без SYNC
то он ничего не килял, а только флаг выставил который потом запрос select мог прочитать а мог и не прочитать
версия ClickHouse какая?
Files to insert это похоже на график из Distributed таблиц, типа данные в distributed попадают, а в underlying таблицу уже нет
посмотрите логи в /var/log/clickhouse-server/clickhouse-server.log там могут быть ошибки на INSERT которые идут из distributed в целевую таблицу
какой у вас database engine?
SELECT name, engine FROM system.databases WHERE name NOT IN ('system','INFORMATION_SCHEMA','information_schema')
что показывает? -
KILL QUERY без SYNC
Версия КХ 21.11.11.1
Files to Insert - да, это из Distributed, привёл график из-за того, что эти вставки вроде тоже учитываются в коннекшенах. Пока было это подвисание запросы падали с Broken pipe и Too many simultaneous queries и Cannot schedule task.
Движок базы - Atomic. -
atomic по идее лоичтися
были какие то фиксы в 22.12 связанные с тем что KILL QUERY приводил к большим Load average
попробуйте до 22.8 или 22.12 обновиться -
Спасибо, надо будет глянуть фиксы. Вдруг чего ручками подкрутить удастся.
22.12 - это совсем экстрим для прода (прошлый раз пробовали осенью на полугодовалую 22.3 обновляться и всё равно через несколько дней пришлось откатываться из-за сломанных кафка-движков), а вот на 22.8 можно будет попробовать. Вы какую из LTS-ок прошлогодних рекомендуете сейчас использовать? -
Добрый день. Посоветуйте, пожалуйста: создал таблицу с данными, в которой один столбец это сырой JSON, а остальные - MATERIALIZED - столбцы с JSONExtract-выражениями поверх этого json.
Что хочу - чтобы в запросах SELECT * FROM материализованные колонки отображались первыми в списке. Сначала они у меня совсем не отображались, но я нагуглил параметр asterisk_include_materialized_columns - теперь они отображаются, но после исходного не-материализованного столбца. Есть ли возможность, чтобы столбцы возвращались в порядке объявления, либо, мб, есть возможность вообще спрятать столбец из select * - запроса? -
select * except (column) from ...
Откройте статью про select - там много интересного.
Но на вашем месте я бы попробовал новый тип JSON. Он пока экспериментальный, но у нас работает стабильно. -
спасибо! JSON попробовали, но с ним сейчас неудобно работать из BI-тулов (Apache Superset, в частности).
-
можно алиасы ставить внутрь тупла. Все удобнее, чем пачки jsonextract писать. И места при хранении меньше занимает.
-
а почему меньше места занимает? я вроде читал, там просто все уникальные пути в JSON отдельными столбцами хранятся и всё.
а с materialized можно LowCardinality(String) использовать, кажется, оно должно существенно место экономить и перф запросов улучшать. -
я не знаю что вы вкладываете в понятие "один столбец это сырой JSON", но если предположить что это обычный String, а не ephemeral, то вы помимо распарсенных данных, храните еще и строку с разнородными. А она сжимается плохо.
-
а, вы про это. да, тут согласен.
-
-
Привет! а есть какой-то правильный способ по определению порядка и количества полей сортировки? то есть, если будет поле А - 1000 значений и поле Б - 1м значений, я отсортирую табличку по А получу 30к гранул, а если по А и Б - 60к гранул. Как это связать с операциям IO, чтобы они не были бутылочным горлышком от слишком большого количества гранул? и будет ли фильтр по А работать одинаково с т.з. скорости в первом и втором случае без Б?
Если кинете видео или лекцией или статьей про поиск золотой середины - будут премного благодарен. -
Вы всегда получите одинаковое количество гранул
-
кол-во гранул зависит только от числа строк (index_granularity=8192)
-
Зависит что вы называете переливкой. Если у вас есть в mysql одна хорошенькая табличка с подходящими индексами, и данные туда только добавляются, но никогда не меняются, то все очень просто - mysql() table function, делайте select всего что там есть нового и insert в КХ таблицу.
Но если у вас в MySQL кто-то спроектировал чертову связку из 100 таблиц по 110-й нормальной форме, данные в которых меняются на глубину до года и более, то да - проблемы будут, и с этим придется делать что-то более сложное.
Готовы ли вы сворачивать нормализованные связки таблиц в одну широкую на стороне mysql? Как часто вам надо переливать данные?
Сможете ли (захотите ли?) вытащить из mysql поток транзакций через binlog? Если говорить про правильные современные подходы, то это где-то тут. Почитайте про CDC. -
https://github.com/Altinity/clickhouse-sink-connector
Как пример CDC подходаGitHub - Altinity/clickhouse-sink-connector: Altinity Sink Connector for ClickHouseAltinity Sink Connector for ClickHouse. Contribute to Altinity/clickhouse-sink-connector development by creating an account on GitHub.
-
Сейчас мы пользуемся insert from select и делаем это по крону.
Пробовал MaterializedMySQL, даже жили некоторе время с ним, но там много багов и реплики постоянно падают.
Поэтоу решил спросить, может кто-то уже использует какое-то решения -
Правильного нет. Есть оптимальный для задачи. Путей для творчества тут масса. Можно начать читать например отсюда - https://kb.altinity.com/engines/mergetree-table-engine-family/pick-keys/ Но в каждом конкретном случае десятки факторов могут поменять этот порядок для достижения каких-то иных оптимизаций.
-
так. супер, спасибо! один вопрос отпал с гранулами, а сортировка влияет вообще на хранение чего-то? и вопрос с избыточной сортировкой остается - она существует?
-
и вопрос с избыточной сортировкой остается - она существует?
Существует, но обычно это больше 5-10 колонок в ORDER BY -
Спасибо!
А работает ли этот тул с кластерным КХ? -
мы прошли аналогичный путь. Решение от Алтинити прекрасно, но требует жесткой схемы, schema registry и девопсов имеющих время на все эти красоты. Опять же оно только таблички копирует (т.е. делает все что MatMySQL, но лучше), а хотелось бы большего - собирать из этих исходных широкие таблицы джойнами. В результате пришлось написать свой CDC на чисто clickhouse-sql.
-
Должен,
Разве что ключ шардирования должен "включать" колонки из ORDER BY -
Спасибо
-
а вы эту штуку вместо Kafka-engine + MatView тоже используете?
-
не вместо, а вместе. Данные через Maxwell's Daemon уползают в кафку, оттуда через Engine=Kafka+MV в clickhouse, там объединяются в AggMT (где это возможно), складываются в RockDB для join=direct, или же кладутся в самодельную очередь на основе MergeTree с офсетами как у кафки. И вот поверх этой очереди уже и идет сборка широких таблиц.
-
а если поле с высокой кардинальностью - не будет влиять на эффективность? (3 млн уников на 40ярдов строк)
-
все колонки в индексе после высокардиналоного уже не имеют особого смысла
-
Добрый день
Можете, пожалуйста, пояснить, что за kafka connect consumer, что-то я ничего определённого не нахожу?
Нашёл это сообщение в попытке найти решение проблемы огромного количества дублей из kafka. Оказывается в некоторые дни в декабре бывало по ~10k дублей. Используем версию 21.8.8.29 . -
Спасибо!
-
GitHub - ClickHouse/clickhouse-kafka-connect: ClickHouse Kafka Connector
ClickHouse Kafka Connector. Contribute to ClickHouse/clickhouse-kafka-connect development by creating an account on GitHub.
-
Добрый вечер, может кто-то подсказать, почему разное поведение почти одинаковых запросов? (запрос сделан специально для показа проблемного места с IN)
1. Работающий запрос: https://fiddle.clickhouse.com/86324e31-4c51-455c-9eda-47ccae8dc4f2
2. НЕ работающий: https://fiddle.clickhouse.com/a92903fa-863b-40f5-b910-207c3e32b578
Опытным путем установил, что не работающий запрос выполняется, если таблицы в WITH и в основном запросе находятся на разных серверах. Если на одном сервере - не работает -
Если интерес спортивный, то мне тоже интересно (но не так сильно).
Если же интерес практический, то так делать не нужно - оператор IN ожидает набора строк, а не массив. Если у вас массив - используйте has() - но это медленее. Для IN нужен итератор по строкам. Который вы и сделали из массива через arrayJoin в "работающем запросе". -
А зачем он нужен ?
-
exactly-once гарантии
-
Уже можно использовать в продакшн?
-
это случай из жизни :))
решение проблемы мы с ребятами нашли, только не смогли понять почему разное поведение.
И если IN ожидает набор строк, то почему вот это решение работает?: https://fiddle.clickhouse.com/6a145b9c-da34-4efb-beb6-109233e8e0d0 -
возможно потому что (select 4) - это одна строка. У меня таких примеров тоже хватает. Но с новыми версиями становится лучше. Страданий в этом месте почти нет.
-
это же скаляр, как он может быть строкой?
-
В КХ нет скаляров. Любой скаляр - это набор строк размером 1.
-
-
Не пробовал, учитывая что оно в бете наверное можно но осторожно
-
Тем не менее, "псевдоскаляры" имеют поведение отличное от табличных алисов
WITH x AS (SELECT 1) и WITH (SELECT 1) as y
Имеют разное поведение, и y например будет закеширован для многократных обращений -
Так в том-то и проблема, что на тестовой среде ничего интересного не поймаешь, а в продовую кафку ставить неведомо какой плагин никто не даст.
- 11 January 2023 (158 messages)
-
Всем привет. Подскажите, как можно вытащить последовательности из массивов следующим образом:
-
А по какому принципу вы их хотите получить? например 2, 3 набор отличается от остальных(то что сразу бросается в глаза)
-
arraySort(arrayDistinct([1,1,2,3,1]))
-
Скорей всего, алгоритм такой.
Берём 1 ...
Дальше ищем справа от него число больше на 1, берём его.
Дальше снова ищем справа от него число больше на 1, берём его и т.д.
Какое то тестовое задание на Clickhous'e -
для 2-3 набора не подходит
-
Тогда вторая строка не подходит :(
-
да, не подходит. Но какое ТЗ, такое ХЗ )))
-
Это можно решить, но мне лень :)
-
а главное зачем)
-
Чтобы за кого то пройти тестовое задание на Clickhouse :)
-
эххх, может быть лучше было спросить про ключи сортировки, гранулярность, индексы…
-
😂
-
Так это разные запросы наверное
-
Тогда вот так. Ну и последние значения уберите
-
Важно наличие идущих следом (необязательно подряд) событий с шагом 1 (по возрастанию, начиная с 1). Если 2 таких шага (например 1, 2) разделяются несколькими другими шагами (например 1, 4, 3, 2), то значения между ними пропускаются и остаётся только (1, 2). Если бы после (1, 4, 3, 2) шла "3", то вывод был бы (1, 2, 3)
-
Спасибо, Константин
-
Раз уж вы тут, то набили бы данные на fiddle вместо картинок. Чтобы проявить уважение к желающим решить эту задачку, чтобы им не приходилось это делать за вас.
Я бы попробовал развернуть массивы в строки через arrayJoin, и там работал через window function - так обычно нагляднее и привычнее для многих. Там просто можно обратиться с предыдущей строке.
Если же вам нужно смотреть на предыдущее значение в массиве, то нужно иметь два массива - основной и укороченный через arrayPopFront, и пользоваться функцией arrayMap.
Попробуйте сделать подход с этими советами и выложить на fiddle. Дальше вам тут все помогут. -
Проблема оказалось в другом. Похоже не эту, либо она же - https://github.com/ClickHouse/ClickHouse/issues/22923
Дело в том, что после вставки данных в CH с Engine=Kafka, срабатывает мат. представление MV_1, которое должно перекладывать данные в следующую таблицу. И вот в MV_1 у нас содержится секция WITH. Ошибка исчезает после пересоздания представления (без изменения) и через какое-то время возвращается вновь. Что можете посоветовать?WITH statement can be missed in distributed query processing · Issue #22923 · ClickHouse/ClickHouseHow to reproduce Which ClickHouse server version to use latest master/arcadia Non-default settings, if any SET prefer_localhost_replica=0 (Without it a local stream is created instead of a remote o...
-
Добрый день! Имеется база данных в CH являющаяся репликой базы PostgreSQL через MaterializedPostgreSQL. Данные в PSQL добавляются через upsert. Есть задача - создать витрины данных (materialized) в CH для последующей визуализации (применить GROUP BY, JOINы к исходным). Правильно я понимаю, что в данном случае нужно использовать
CREATE MATERIALIZED VIEW table_name ENGINE = MergeTree AS SELECT ... и обновлять данные через DROP / CREATE (из-за upsert) или есть более оптимальное решение? -
Добрый день, столкнулся с проблемой из-за чего не получается нормально делать JOINs. Есть таблица
created_at: timestamp
data: JSON
вот такой запрос отрабаотывается нормально
SELECT
created_at,
data.app.start_time AS start_time,
FROM data__my_table
а вот такой уже нет
SELECT
my.created_at,
my.data.app.start_time AS start_time,
FROM data__my_table AS my
Code: 47. DB::Exception: Received from localhost:9000. DB::Exception: There's no column 'my.data.app.start_time' in table 'my': While processing my.data.app.start_time AS start_time. (UNKNOWN_IDENTIFIER)
но при этом запрос вида
SELECT
my.created_at,
my.data AS my_data,
FROM data__my_table AS my
тоже работает -
Прежде всего лучше забыть про такой способ создания MV, и всегда использовать синтаксис с To и самостоятельно созданной таблицей хранения.
Если вы хотите отказаться от полного пересоздания, то надо научиться делать инкрементальные обновления.
MaterializedPostgreSQL вставляет не только строки с данными, но и строки коррекции с _sign=-1 Используя этот стобцец вы можете построить агрегацию, которая будет вычитать старые значения, и прибавлять новые. Например обычный сумматор выглядит не как sum(value), а sum(_sign*value). Про count() можно забыть и использовать sum(_sign), и так далее. Не всегда просто подобрать агрегационную функцию, но в большинстве случаев это реализуемо. Задавайте вопрос по конкретным столбцам и агрегационным функциям. -
Вот в том числе поэтому она пока и не объявлена в продакшн. Живите с этим. Например так:
SELECT
my.created_at,
my.app.start_time AS start_time,
FROM (select *,data.app.start_time as start_time from data__my_table) AS my -
тааак, а если start_time был только пример и ключей в JSON у нас гораздо больше?
-
но спасибо в любом случае
-
а какие-то есть ограничения на числа? например только целые или только целые положительные?
-
но кстати не работает.
-
Будут только целые положительные числа.
https://fiddle.clickhouse.com/29a28640-1bfd-4a2f-a2bb-d9500a2f8c04 -
-
Всегда начиная с 1-го шага
-
[2, 3, 1, 4, 2, 3] -> [1, 2, 3]
-
так тогда начиная с 1-го шага - это неправильный результат
с первого шага должно быть
[2,3,1,4,2,3] -> [2,3,4] ? -
Наверное, я неясно выразился. Под 1-м шагом я имею ввиду элемент равный 1. Должно быть именно так: [2, 3, 1, 4, 2, 3] -> [1, 2, 3].
-
-
Всем привет, подскажите плиз какой пропертей можно подтюнить таймаут в запросе чтобы функция remote(...) не рвалась через 300с:
Code: 209. DB::NetException: Timeout exceeded while reading from socket ***, receive timeout 300000 ms): While executing Remote. (SOCKET_TIMEOUT) (version 22.12.1.1752 (official build)) -
Это у вас клиент отпал
-
А не remote
-
У всех начальных массивов есть хотя бы одна 1
-
да вроде нет, это запускаю через дбт, и там таймаут выставлен больше, + он же явно пишет причину "While executing Remote" , но ешё раз проверю..
-
-
Проверьте свободное место вашего хранилища
-
Диск заполнен полностью
-
подскажите, пожалуйста, есть смысл обновляться с версии 22.8.5.29?
видел тут предостережения о кривости каких-то версий, вышедших в последнее время. Как сейчас? -
как можно проверить это?
-
эээээ, ну это как бы или через df или du, гугл в помощь
-
Зайти на сервер
-
и посмотреть
-
ВСем добра! Начали натыкаться на ошибку по количества максимально открытых файлов при расчете витрин. Не думаю что в нашем случае это должно быть блоком при работе с КХ. Вопрос, кроме как расширять лимит, может есть лучшие беспрактисы, чтобы нивелировать даанную проблему?
-
Ошибка too many parts ?
-
или too many open files ?
-
На все эти вопросы есть ответы в этом чате, поищите
-
вот это
-
Вот первый в поиске по чату
-
1
-
Посмотрите ответы на его сообщенеи
-
Добрый день, подскажите пожалуйста умеет ли Click отправлять логи system.query_log и system.session_log в syslog ?
-
Integrating Vector with ClickHouse | ClickHouse Docs
How to tail a log file into ClickHouse using Vector
-
Добрый день!
А есть ограничение на длину json для JSONExtractArrayRaw?
Похоже не может распарсить длинный массив -
Всем добрый день! Нашла хороший курс ClickHouse здесь: https://education.biconsult.ru/courses/22/
-
А это разве курс не для проджектов?
Те не выглядят как будто там Хардскилы дают по ch -
-
Коллеги а почему в место курса вы не читаете документацию? Она очень подробная и есть на русском
-
Потому что документация иногда и особенно на русском такая, что потом и в сорцы залезть приходится)
-
А мне понравилось. Основная мощь Кх для меня это встроенные Энжины. А их поведение описано подробно в доке. А найти специалиста который залез в исходники а потом рассказал как там все работает - это сложная задача
-
Привет, нужно использовать в КХ данные из postgres, но чтобы данные в materialized view в КХ обновлялись с учётом новых данных в postgres. По идее хорошо подходит MaterializedPostgreSQL и репликация postgres в КХ, но смущает, что этот функционал указан как экспериментальный. На сколько этот функционал готов к продакшену и есть ли какие то моменты, при которых не стоит его использовать?
-
Самое правильное в таком случае, это прочитать все ишью - https://github.com/ClickHouse/ClickHouse/search?q=MaterializedPostgreSQL&type=issues
Если все еще не страшно, то можно использовать. -
Хорошее предложение, не подумал об этом, спасибо!
-
Вопрос про JSONExtractArrayRaw.
Нужно распарсить из json массив, в котором есть поля с большими значениями, например формата UInt128
Но видимо при парсинге по умолчанию используется формат UInt64, потому что числа больше 18446744073709551615 не парсятся:
WITH '[{"a":99999999999999999999}]' AS json
SELECT JSONExtractArrayRaw(json) AS data
https://fiddle.clickhouse.com/e37b0857-250b-4362-8713-c5cb7cbd9aa4 -
а есть ли какой-то roadmap или понимание, когда object JSON будет готов к продакшну?
-
Всем привет!
Создал словарь и при попытке извлечь из него данные получаю ошибку:
SQL Error [241] [07000]: Code: 241. DB::Exception: Memory limit (total) exceeded: would use 69.09 GiB (attempt to allocate chunk of 134217760 bytes), maximum: 69.04 GiB
Причем как бы я не расширял параметры
max_server_memory_usage
max_server_memory_usage_to_ram_ratio
Ошибка возникает вновь и вновь. Не подскажите, какие еще есть способы решения проблемы? Спасибо! -
подскажите по ReplicatedMergeTree + Distributed. пишу сразу в 3 ноды кластера и получаю дубликаты записей. помогает OPTIMIZE TABLE FINAL DEDUPLICATE, но вопрос мой это ожидаемое поведение? и как избегать дубликатов при записи сразу в несколько нод?
-
max_memory_usage смотрели?
-
И вы уверены, что у вас есть память на такой словарь?
-
Да, тоже правил параметр
RAM на хосте 125гб, хост весь под клик, словарь строится по таблице, которая весит 24гб, не смотря на то, что количество строк 624к для меня все равно странно, что не получается обработать данные по словарю -
и как? что было, менялось число недостаточной памяти?
-
Да, к примеру сейчас выделил еще больше памяти (75гб) и судя по ошибке ему нужно 81гб, хотя до этого указывалось 69, а еще ранее 61 и т.д
Т.е с увеличением памяти клику нужно еще больше, чтобы обработать словарь
Я понимаю, что, если такая ошибка всплывает при построении запроса, то в большинстве случаев нужно переписать сам запрос или пересмотреть структуру хранения, уже сталкивался с таким
Но в случае со словарем не совсем понятно как решить проблему -
так словарь покажите, он у вас полностью поднимается в память)
вам так памяти ни на что не хватит если полностью 24гб таблицу развернуть в память -
DDL вы имеете ввиду?
-
если вы указываете способ размещений в памяти - хранить в оперативной памяти(там несколько возможностей), то ваша таблица будет весить не 24ГБ пожатых на диске, а много больше
-
Понял, спасибо
При создании я указывал
LIFETIME(MIN 0 MAX 1000)
LAYOUT(HASHED()) -
Спасибо за наводку!
Нашел необходимый вариант пересоздания словаря и все взлетело) -
Всем привет!
Код выбрасывает ошибку, с чем это может быть связано? Это баг?
CREATE TABLE test (sourceAddress Nullable(String)) ENGINE=Memory;
INSERT INTO test VALUES ('192.168.0.1');
INSERT INTO test VALUES ('192.168.1.1');
INSERT INTO test VALUES ('169.254.1.356');
INSERT INTO test VALUES (NULL);
SELECT sourceAddress FROM test
WHERE isNotNull(sourceAddress) AND isIPv4String(sourceAddress) AND isIPAddressInRange(sourceAddress, '192.168.0.0/24')
Соответственно ошибка
DB::Exception: The arguments of function isIPAddressInRange must be String: While processing isNotNull(sourceAddress) AND isIPv4String(sourceAddress) AND isIPAddressInRange(sourceAddress, '192.168.0.0/24'). -
Коллеги подскажите почему может зависать запрос DROP TABLE IF EXISTS для таблицы ENGINE = Kafka
-
-
написано же, что жолжно быть типом данных String, а у вас Nullable(String)
-
assumeNotNull(sourceAddress)
-
Зачем вам вобще Null нужен? Если в наборе значений есть какое-то неиспользуемое (а тут оно точно найдется), то лучше не использовать Nullable
-
не помогло
-
так была создана таблица, с этим ничего поделать не можем
-
помогло, у вас ip невалидный в 3-й строке
-
даже, если все ip валидные, то не помогает
-
https://fiddle.clickhouse.com/7ee2537e-e2a7-4397-b2f2-1f7d238d132e
В КХ все условия выполняются, пишите подзапрос -
Все работает с нормальными адресами - https://fiddle.clickhouse.com/d08b8977-dfed-4adf-bb3d-c219f32b218d
Но в чем сложность убрать этот Nullabel? Создаете новую колонку, наполняете, переименовываете на место старой. -
https://fiddle.clickhouse.com/04951d63-9020-403a-b227-f7e5cde19547
тогда почему такой запрос падает с ошибкой -
-
да проблема в том, что там могут быть и не валидные адреса
-
по сути, данный запрос должен отобрать только валидные адреса и с ними уже проводить дальнейшие действия
-
IPv4StringToNumOrNull(s)
Same as IPv4StringToNum, but if the IPv4 address has an invalid format, it returns null. -
функции нет в версии 21.6.5.37
-
я не понимаю, почему этот запрос падает с ошибкой
ведь в подзапросе мы выбрали только те ip, которые являются ipv4 -
видимо баг такой с оптимизацией, на 21.9 уже проходит
-
https://fiddle.clickhouse.com/a7ea03cb-d67e-43ca-940c-d727e8291040
на свежих версиях проходит и с assumeNotNull -
Здравствуйте, у меня в таблице хранятся гео координаты (lat, lon) , как из таблицы получить все координаты лежащие в радиусе 1 км от заданной точки.? Честно с математикой у меня не очень, смотрю в доке на функции для работы с гео и ничего не понимаю.
-
коллеги! Kafka + Clickhouse
доставка ивентов до clickhouse нужна.
connect ограничен по типам данных при работе через jdbc, неудобна
движок таблицы кафка - увеличивает нагрузку на сам кластер клики сверх надобности
остается кастомный код...
но если у меня такая потребность - вдруг была еще у кого? встречали ли ещё какие готовые решения?)
я б лучше к опенсорс контрибьютил, чем своё с нуля -
Можно сделать гео хэши
-
Тогда это будут квадраты
-
Functions for Working with Geographical Coordinates | ClickHouse Docs
greatCircleDistance
-
По идее вот эта функция https://clickhouse.com/docs/en/sql-reference/functions/geo/coordinates#pointinellipsesFunctions for Working with Geographical Coordinates | ClickHouse Docs
greatCircleDistance
-
подскажите можно ли реализовать шардинг с частичной репликацией\балансировкой? то есть если у меня Х нод то каждая запись точно хранится на любых двух.
-
-
https://github.com/Altinity/clickhouse-sink-connector
https://github.com/housepower/clickhouse_sinker
https://github.com/eBay/block-aggregator
Но по поводу их работы - ничего сказать не могу. Мы писали свой перекладыватель, но столкнулись с проблемой что там появлялись дубли. Мы взяли идею из block-aggreagtor и применили у себяGitHub - Altinity/clickhouse-sink-connector: Altinity Sink Connector for ClickHouseAltinity Sink Connector for ClickHouse. Contribute to Altinity/clickhouse-sink-connector development by creating an account on GitHub.
-
Привет!
А можешь файлом приложить скрипт создания таблиц (с указанием на каких нодах запускался)? Попробую подсказать. -
Если я правильно понял вопрос, то да, можно.
Например, имея кластер из 6 нод и выполняя дробление данных на 3 шарда, каждая из записей будет храниться на 2 из 6 нод -
Спасибо. Это уже оказался не наш вариант. Надо экономить место как оказалось 😁
-
Планируете хранить каждую запись 1 раз?
-
https://zhuanlan.zhihu.com/p/461792873?utm_id=0
Надо топология как тут. Но видимо масштабировать потом и добавлять новые ноды это приключениеHow to setup ClickHouse distributed cluster with 3 shards and 2 replicas on 3 server nodesOfficial Site: ClickHouse - fast open-source OLAP DBMSClickHouse is an open-source, high-performance columnar OLAP database management system for real-time analytics using SQL. It supports distribut…
-
На двух нодах. При любом размере кластера.
-
Если ориентироваться на пример, который по ссылке, то я не вижу препятствий для ReplicatedMergeTree + Distributed.
-
Препятствия что без описаных там workarounds сам по себе ch не дает добавлять дважды одну ноду в кластер
-
А так буду тестировать...
-
Коллеги, нуждаюсь в совете
У меня есть таблица с тайм-сериес данными, например логами
Я их группирую с toStartOfInterval() и count()
Хочу найти такое время в котором нет значения — дырки в последовательном списке.
Придумал что можно сгенерировать список дат с numbers() по диапазону, от них взять такие же toStartOfInterval(), но дальше нужно как-то сджойнить два результата и в этом месте я уже теряюсь
Наверняка это не уникальная задача, вдруг вы сталкивались, подскажите пожалуйста -
Поделитесь как решили?
-
дырки в списке - это задача gaps and islands. Гуглите. Вот первое что мне попалось. На stackoverflow есть несколько примеров специфичных для clickhouse. Ну и тут в чате этот вопрос поднимался уже раз 10 с прекрасными ответами.
-
Первая мысль взять предыдущий интервал и отнять от текущего, разница должна быть 1 юнит, там где 2 и более юнитов = пропуск. Взять предыдущий интервал можно через оконные функции или asof join
-
спасибо!
-
мм, тоже интересно, нужно попробовать завернуть все это в оконную функцию, плохо понял пока как, но буду искать, спасибо!
-
Поменял тип словаря на direct, более чем устраивает
-
А по времени отрабатывает как, тоже нормально?
-
Да, быстро
Это и был главный критерий) -
neighbor есть оконка
-
Спасибо
-
-
Документация у Clickhouse такова, что иной раз думаешь: лучше бы не было.
-
А зачем вам искать есть ли данные или нет ? Вы можете использовать ORDER BY FILL и заполнять пропуски, а потом уже отфильтровать
-
-
пойду гуглить что это
-
Секция ORDER BY | ClickHouse Docs
select-order-by}
-
Всем привет, а можно как-то отследить/ускорить процесс truncate?
-
👍
-
Кто-нибудь сталкивался с подобным поведением клика? Не можем понять куда память забирается. В это время на нём крутятся очень маленькие запросы, дело не может быть в них. И резко память очищается.. куда можно посмотреть? Какие процессы могут память скущивать? Это не запросы, мониторим уже их несколько недель..
-
-
по всем приметам что-то выполняется, и завершается.. но никаких запросов подходящих не видим.. что это может быть..
-
а что у вас в system.merges?
-
там что-то конкретное посмотреть?
-
-
memory_usage
-
не-а.. я сам не спец, просто наши девопсы похоже в чаты не хожи) я сам пошел..
-
-
Нету в чатике по Clickhouse, ну тогда страшно за ваш Clickhouse
-
Всем привет!
Возникает ошибка, причину которой не понимаю
Ошибка при таком запросе с groupArray:
select visitID, groupArray(click_link) as click_link_arr
from srch_clr
where action = 'click_link'
group by visitID
Если сделать просто select * from srch_clr, то запрос отрабатывает
Не понятно почему не найден столбец clientID в блоке, когда он там есть -
-
А вы ошибку по чату искали ? Или хотя бы гулили ?
-
Всем привет!
Подскажите, плжалуйста, возможно ли в конструкции ALTER USER foo ADD HOST IP каким-то образом указать массив IP адресов, вместо того, чтобы для добавления каждого IP делать отдельный ALTER USER?
Есть N юзеров и X IP в белом списке, хочется вызвать N альтеров, вместо N*X. -
иногда такая ошибка возникает при неправильном составлении списка колонок при group by. посмотрите внимательно - не затесалась ли там колонка без агрегации? Особенно учитывая что у вас window function + group by. В старых версиях с этим было не так хорошо. Попробуйте сделать еще один уровень вложенности подзапросов, чтобы разделить group by & WF
-
Можно. add host ip '192.168.1.1', ip '192.168.1.2'
В документации на алтер указано - [,...] -
проморгал, спасибо! 🙏
-
Сделал промежуточную CTE, не помогло.
Далее сгруппировал еще по колонке clientID, которую он говорил, что нет ошибка что нет DateTime. Сгруппировал в итоге по visitID_, clientID_, DateTime и запрос отработал, но это конечно не то что нужно. В группировке нужно только visitID_
А версия 21.12.4.1 старовата на данный момент? -
Вы бы дали пример в виде текста на pastila.nl На этих картинках ничерта не видно
-
Спасибо, пока проблема вроде решилась. А была она в подзапросе в where. Без него работает. В итоге вынес подзапрос в отдельный CTE и заменил на join
- 12 January 2023 (235 messages)
-
Скажите, а кликхаус научился делать multiple join или проблема ещё актуальна?
-
SELECT *
FROM
(SELECT 1 AS `column`) AS `T`
JOIN
(SELECT 1 AS `column`) AS `T2` ON(`T2`.`column` = `T`.`column`)
LEFT JOIN
(SELECT 2 AS `column`) AS `T3` ON(`T3`.`column` = `T`.`column`) -
Всем привет,как решить? DB::Exception: default: Not enough privileges. To execute this query it's necessary to have grant SHOW USERS ON *.*. (ACCESS_DENIED) (version 22.6.7.7 (official build))
-
дать права на show users)
-
привет!
а кто-нибудь наступал на грабли с использованием odbc коннектора к postgres?
в докер-образе на основе ubuntu все работает, а под alpine проверка через isql нормально проходит, а когда делаю select из кликхауса - "Code: 1000. DB::Exception: Received from localhost:9000. DB::Exception: No message received. (POCO_EXCEPTION)", в стектрейсе примерно тожсамое. -
А чем не устраивает коннектор в Clickhouse ?
-
в смысле? я из кликхауса цепляюсь в постгрю... мне в кликхаус не надо по одбс
-
Ну а почему просто не использовать табличную функцию postgresql() ?
-
хм, прикольно
пойду покурю мануал
спсб -
Добрый день.
Возник вопрос о правельном приготовлении шардов.
Есть кластер, достаточно большой, который планируем расширять за счет добавления новых шардов.
Данные поступают из Кафки.
Не возникнет ли в будующем серьезных проблем если distributed таблицы будут использоваться только для запросов SELECT а INSERT от кафки будет заливать новый каждый новых шард до определенного уровня? -
Не вполне понятна ваша мысль про "будет заливать новый каждый новых шард до определенного уровня".
В общем случае правильно SELECT через Distributed, а INSERT вы сами распределяете по шардам. -
Условно сейчас кластер это 4 реплики по 100ТБ
Вот и хочется при достижении условных 98% по месту добавлять новый шард в 100Тб -
вместо бесконечного расширения места
-
Автоматического решардирования в кх нет, будет тяжковато
-
-
При вашем флоу нужно будет при каждом добавление шарда, делать полные перелив данных, и на это ещё надо будет место х2
-
Если запросы будут обращаться к данным одного месяца-года, то будут работать диски только одного шарда. Это будет медленнее, по сравнению с вариантом, когда вы размажете данные по всем шардам и в рамках одного запроса отработают диски всех шардов. Если это несущественно, скажем вы делаете систему для храненения данных "на всякий случай" с маленькой интенсивностью запросов, то почему бы и нет.
-
Вот да именно такой кейс, запросов почти нет.
-
Спасибо за ответы.
-
Всем привет!
Не совсем понял по документации про опцию POPULATE при создании материализованного представления.
Выдержка из документации:
Если указано POPULATE, то при создании представления в него будут добавлены данные, уже содержащиеся в исходной таблице, как если бы был сделан запрос CREATE TABLE ... AS SELECT ... . Если POPULATE не указано, представление будет содержать только данные, добавленные в таблицу после создания представления. Использовать POPULATE не рекомендуется, так как в представление не попадут данные, добавляемые в таблицу во время создания представления.
Подскажите, правильно ли я понял что если я создам представление с этой опцией, то в него (представление) попадут только данные которые уже есть в исходной таблице, и после создания представления оно не будет обновляться при добавлении данных в исходную таблицу? -
не правильно, при создании будет выполнено наполнение теми данными которые уже есть в таблице источнике, а дальше мв будет продолжать наполняться по мере вставок в источник
-
непонятно тогда вот эта строка из документации
Использовать POPULATE не рекомендуется, так как в представление не попадут данные, добавляемые в таблицу во время создания представления.
Что это значит? -
-
-
это было как раз второе предположение)
спасибо) -
всем доброго
кто нить настраивал связь с postgresql по доке https://clickhouse.com/docs/ru/engines/database-engines/materialized-postgresql/ ?
настроили, начал раздуваться каталог pg_wal плоть до того, что сожрало все место (каталог весил более 300 Гб при суммарном весе баз постгреса ~100 Гб)
каталог раздувался при изменении таблицы в базе, для которой не была настроена связь...
можете пнуть в верном направлении? -
Ребята, кто сталкивался с подобной проблемой ?
Есть 2 идентичных кластера КХ, если две идентичные кафки
В одном кластере - все прекрасно
Во втором кластере - КХ не читает из кафки (при этом топики данными заполняются, и сама кафка работает отлично)
Куда можно копнуть ? -
Ну ищите на Github'e проблемы https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aissue+is%3Aopen+MaterializedPostgreSQLIssues · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Я бы посмотрел эррор логи кх
-
-
Добрый день. Вопрос по мониторингу через Прометей: надо ли устанавливать на сервер с clickhouse cluckhouse_exporter или достаточно раскомментировать параметры prometheus в конфиге и перезапустить clickhouse server?
-
-
найти коммит в котором добавили функцию и посмотреть в какие теги он включён
-
привет, подскажите, мув партиций это мнгновенная операция на метаданных или ресурсоемкая с копированием?
https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition/#alter_move_to_table-partitionМанипуляции с партициями и кусками | ClickHouse Docsalter_manipulations-with-partitions}
-
Это для тех, кто дружит с гитом. Для остальных чтение ченджлогов.
-
спасибо
-
Фраза в доке "Для таблиц должна быть задана одинаковая политика хранения (диск, на котором хранится партиция, должен быть доступен для обеих таблиц)." намекает что копировать никто ничего не собирается.
КХ, когда порождает новый парт, обычно делает hardlink'и для всех файлов в парте. Так что эта операция не совсем атомарная, и не совсем на метаданных, однако достаточно быстрая. -
понял, спасибо
-
Подскажите ещё пожалуйста, у нас логи экспортируются в Клик. Есть поле типа Nullable(Date), но в нём некоторые значения представлены как \N. Это что-то у нас кастомное ошибочное в экспорте, или это штатно-стандартное представление нуллов или что-то в этом роде для поля такого типа в Кликхаузе?
-
-
добрый день. помогите, пожалуйста, советом:) select ('v1','v2')::Tuple(a String, b String) c, tupleElement(c, 'a') c_a, c.1 c_1, c.a; - tupleElement(c, 'a') работает, обращение c.a - нет. смогу обойтись без tupleElement? спасибо!
-
Можно периодически его чистить или понизить уровень логгируемых событий.
-
Спасибо
стояло trace, что видимо слишком дофига
поставил error -
Привет ребята ,
при резервном копировании моих таблиц с помощью clickhouse-backup я вижу такие журналы, как ALTER TABLE FREEZE...
повлияет ли это на что-нибудь, если я использую этот инструмент для резервного копирования на производстве?
я имею в виду, как это работает, замораживает ли таблицу до тех пор, пока не будет запущено резервное копирование конкретной таблицы? -
GitHub - AlexAkulov/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages support
Tool for easy ClickHouse backup and restore with cloud storages support - GitHub - AlexAkulov/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages support
-
100 мегабайт слишком много?)
-
Во проблемы у людей у меня по 100 гигов был вот тогда я паниковал
-
-
-
-
-
-
Оно делает хардлинки в shadow, не трогая ничего в основной таблице. Но если их там забыть, то потом будете искать пропавшее место диске, как тут спрашивали пару дней назад.
В доке вроде все достаточно точно описано про freeze - https://clickhouse.com/docs/en/sql-reference/statements/alter/partition/#freeze-partition Вы это читали? -
У меня похоже не рабтают настройки flush_interval_milliseconds которые должны быть выставлены по умолчанию.
Эту часть файла config.xml я не трогал. -
-
-
-
-
Привет!
Почему в таблице созданной вот так не происходит слияния строк даже после optimize final?
Это может быть связано с тем, что Processed is null?
https://pastila.nl/?0e974800/cd1b5168dfe178686a3aae9d7f302c5d -
-
я только что прочитал эту статью, так что единственная проблема здесь связана с дисковым хранилищем, если я правильно понимаю, есть ли возможность установить для него время ожидания, чтобы теневой файл был удален через некоторое время?
-
Вы сами (точнее программа backup) удаляет файлы из shadow. Clickhouse не будет их удалять ни по каким настройкам. Только явный запуск unfreeze с указанием раздела, или аналогичный rm -rf
-
хорошо спасибо за помощь
-
Разобрался, оказывается для распределённых нужно делать так:
optimize table table_1 on cluster my_cluster final; -
Всем привет, подскажите пожалуйста, в документации по clickhouse настройке пользователей, ролей и прочего, пишут, что использовать предпочтительно grants, такой вопрос, как через grants задать ip который может слушать сервер, чтобы отправлять с этого ip данные
Что-то нигде найти не могу, есть настройки в user.xml <ip></ip>, но как сделать через grants нигде не написано -
alter user add host
емнип -
ALTER USER user_name HOST IP '192.168.1.0/24'
-
привет, а для того чтобы попробовать async_insert что-то дополнительно включать надо ?
> INSERT INTO test_insert SETTINGS async_insert=1 VALUES(1);
Syntax error: failed at position 25:
INSERT INTO test_insert SETTINGS async_insert=1 VALUES(1);
Expected one of: token, OpeningRoundBracket, Dot, FORMAT, WITH, SELECT, VALUES -
-
Asynchronous Inserts (async_insert) | ClickHouse Docs
Inserting data into ClickHouse in large batches is a best practice. It saves compute cycles and disk I/O, and therefore it saves money. If your usecase allows you to batch your inserts external to ClickHouse, then that is one option. If you would like ClickHouse to create the batches, then you can use the asynchronous INSERT mode described here.
-
-
спасибо
-
Насколько понимаю вот этого должно хватить:
https://clickhouse.com/docs/ru/operations/server-configuration-parameters/settings#server_configuration_parameters-prometheusКонфигурационные параметры сервера | ClickHouse Docsserver-configuration-parameters-reference}
-
здравствуйте, скажите пожалуйста, для "ip_trie" не планируется в ближайшее время PRIMARY KEY по нескольким ключам(как у LAYOUT(COMPLEX_KEY_HASHED()))?
-
у меня почти 10G логов на 30Mb данных.
Похоже то что в стандартном конфиге у меня не работает автоочистка, хотя везде установлен flush_interval_milliseconds (по умолчанию).
Вопрос по решению из статьи
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-system-tables-eat-my-disk/ -
yandex - исторически. можно не обращать внимания и считать что тут написано clickhouse.
В статье все правильно написано, так и делайте.
в config.xml ничего класть не надо и менять его тоже не стоит - затрут при переустановке. Все что вы хотите поменять кладите в файлики с произвольным именем в каталог config.d, ровно как показано на вашей картинке -
flush не про очистку, а про запись в таблицу из памяти
-
А кх как то на лету видит изменения в конфигах или рестарт только?
-
Всем привет!
Подскажите, пожалуйста, мне нужно создать составной словарь, в котором одна из колонок будет являться и частью ключа, и атрибутом. Возможно ли такое?
Мануал прошерстил вдоль и поперек, но не смог найти конкретный ответ (хотя склоняюсь, что невозможно) -
Добрый день. Подскажите пожалуйста - есть ли возможность в функции EXPLAIN кх провести анализ сколько времени уходит на какую часть запроса?
-
На удаление вам надо TTL описать
-
Это было то что нужно, большое спасибо!
-
Добрый день!
При создании представления есть ли разница установить настройку join_use_nulls или делать для полей cast(field,’Nullable(Int32)’)
? -
видит, но многие настройки могут быть применены только при старте.
т.е. вы меняете порт 9000 в конфиге на 9999, кх это видит и меняет внутри у себя в переменной что порт= 9999, но используется эта переменная только при старте КХ
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-server-config-files/#settings--restartServer config filesHow to manage server config files in Clickhouse
-
Спасибо
-
если у меня в основном конфиге написано <clickhouse> то мне в доп-конфиге тоже стоит яндекс на кликхаус переименовать, или будет работать хоть как?
-
почти нет.
join_use_nulls иногда работает не так как хотелось бы https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aissue+is%3Aopen+join_use_nulls -
Спасибо!
-
можно мешать их как угодно, это типа синонимы
-
-
хаха 🙂 нет, это мегазадача. Все процессы происходят одновременно в стриминге, т.е. главный вопрос надо решить: что такое время? секунды CPU?
-
хм, EMНИП у ip_trie ключ это IP адрес сети. Какой смысл там делать какой-то другой ключ?
-
склейку нужно сделать как по дипазону 192.x.x.x/24(IP) так и по еще одному Int полю справочника
-
-
8 минут прошло ?
-
ну в каталоге /shadow оно или в /backup
-
вот теперь прошло, пасиб. почистилось
-
Почему в партицированной таблице с движком ReplicatedReplacingMergeTree команда OPTIMIZE TABLE table ON CLUSTER '{cluster}' FINAL может не схлопывать дубликаты по ключу? Даже мутация не появляется. Запрос select * from table final возвращает коректные данные и если убрать партиции с таблицы все тоже работает как надо. Версия 22.3.12.21.altinitystable
-
Можно ли как-то использовать dictGetString() не для атрибута, а для ключа в словаре? Или для одной из колонок в составном ключе словаря?
-
У вас optimize_skip_merged_partitions случайно не включено?
Я тоже сталкивался с подобным. На 22.10
Поборолся оптимизацией по одной партиции. Список партиций в которых больше 1-го парта построить не трудно. -
например места свободного нет для мержа.
--optimize_throw_if_noop arg If setting is enabled and OPTIMIZE query didn't actually assign a merge then an explanatory exception is thrown -
нельзя. идея в том что вы уже передаете ключ, поэтому знаете его, правда это так для некоторых словарей типа rangehashed
-
там кстати все забавно, не попадут данные инсерта который в момент запуска create mat.view
типа
T0: insert1 start |
T1: insert1 end |
T2: insert2 start |
T3: | create matView start -- it misses insert2
T4: | create matView end / matView populate started
T5: insert2 end |
T6: insert3 start |
T7: insert3 end |
T8: | matView populate end
т.е. 2 стадии: 1 matvew создается моментально и начинает долгий populate
будут потеряны инсерты которые начались но не закончились в краткий момент стадии 1.
пока идет долгий популейт инсерты будут перехвачены триггером. То что было создано инсертами до create matview будет перехвачено populate
У populate много проблем, например из-за on cluster populate выполнится на всех репликах и тупо умножит все данные. -
Доброго, а может кто подсказать, чем https://hub.docker.com/r/altinity/clickhouse-server отличается от оригинального кроме бейз образа?
-
там altinity билд. Он отличается от оригинального. Алексей Миловидов считает что Альтинити билды убогие и их использовать нельзя (мое мнение иное)
-
@den_crane Тебя в чате банили ?
-
Принял спасибо
-
нет. Меня банил телеграм, за что банил телеграм неизвестно, я подозреваю за ссылки на pastila.nl. Потому что поудалялось куча моих сообщений со ссылками.
причем бан странный, в некоторых чатах писать было можно, контактам писать нельзя даже если я с ними общался раньше, но я не в их адресной книге -
А почему они по мнению Миловидова убогие?
И в чём их отличие? Я полагал, что они отличаются лишь наличием дополнительных полезных\критичных по вашему мнению коммитов в своём составе. -
-
-
КХ очень тяжело собрать правильно и протестировать сброку тоже. Любые альтернативные билды могут падать там где работает оригинальный
-
Леша полагает, что они неправильно собраны. Но собираются они почти так же, но главное — все те же тесты прогоняются, плюс еще куча тестов от Альтинити. Так что они не убогие, а наоборот
-
Каждый продавец хвалит свою телегу :)
-
Зачем вообще собирать КХ, если он уже собран и есть оф репа? Что такого есть в альтинити билдах чего нет на packages.clickhouse.com?
-
версия от алтинити идет без диска
-
какого диска?
-
это шутка была
-
олды тут. спасибо
-
-
-
Да это шутка про игры. Что раньше игры часто не работали без диска, чтобы новые игроки покупали новые диски. И пиратки работали без диска
-
а как же диски с ubuntu ?
-
В клике нет транзакций
-
Именно транзакции ? Ну легче ответить, что их нет
-
-
А что нужно?
-
А что вам именно нужно сделать ?
-
-
Это про видимость наверное
-
Это про видимость данных скорее всего?
-
ну тут нужно перестроить мышление немножко по-кликхаусовски, задача решается одним инсертом)
-
В транзакции ты их меняешь, а пока она идёт - остальные со старыми работают?
-
Так уже интересно) можно намекнуть
-
Да
-
https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/collapsingmergetree/ как один из вариантовCollapsingMergeTree | ClickHouse Docs
table_engine-collapsingmergetree}
-
Всем привет!
Есть CSV файл, в колонках которого есть строки такого типа:
"column1", "Картина "Три Медведя"", "column3"
То есть могут быть строки с двойными кавычками внутри
КХ при попытке их считать падает с ошибкой.
Подскажите пожалуйста, есть ли способ все же считать такие данные не редаектируя CSV файл? -
Удалять дорого, потому что колонки хранятся отдельно, и вместо точечного удаления придется переписывать большой кусок.
Есть движки как привели пример выше, позволяющие фоном реплейсить, аггрегировать, схлопывать строки. При этом в запросе всё равно придется доаггрегировать потому что конечный результат не гарантируется. -
CustomSeparated
-
Кажись так сделать нельзя а кликхаусе.
-
Всем привет, помогите разобраться пожалуйста.
У меня есть ес2 инстанс с кликхаусом, на нем я настроил s3 bucket в качестве диска по гайду с оф сайта.
Я думал что в случае если инстансу станет плохо, то я смогу просто создать новый инстанс, добавить уже существующий бакет и всё заведется, но видимо это не так.
Я попробовал создать еще один инстанс, подключил к нему бакет, и соответственно существующей таблицы (которую я создавал еще на прошлом инстансе) я не вижу
Я еще узнал, что по пути /var/lib/clickhouse/disks/s3_disk/диск хранятся мета данные диска, попробовал просто скопировать их на новый инстанс, но тоже не завелось.
Подскажите, как правильно восстанавливать данные с такого бакета? -
а что должно быть в итоге ? просто можно выключить двойные кавычки --format_csv_allow_double_quotes arg If it is set to true, allow strings in double quotes.
-
У меня такая ситуация, что есть большая таблица, по ней строится словарь с двумя колонками:
id
adr
С типом flat как бы я не выставлял max_array_size он всегда выдавал ошибку
identifier should be less than (значение max_array_size)
С типом hashed Ошибка всегда такого рода:
DB::Exception: Memory limit (total) exceeded: would use 74.71 GiB
Причем как бы не увеличивал до практически потолочных значений, всегда выходит ошибка "would use n GIB"
Cache не подходит, т.к извлечение данных из словаря >2 минут
Данный словарь в целом работает только с типом direct, при котором в рамках запроса он отрабатывает долго, т.к ключ словаря id, а атрибут искомый adr. Если adr указать в составной ключ, то данные отдаются почти мгновенно, но тогда их не получится использовать в рамках запроса через dictGet()
Переписывал вместо словаря в запрос, выполняется быстрее чем сейчас, но гораздо медленнее, чем когда таблица словаря весила в 3 раза меньше и словарь был с типом hashed, поэтому хочется попробовать как-то остаться в рамках словаря)
Можете ли что-нибудь посоветовать? -
никак.
в каталоге data/ в файлах хранятся ссылки на s3 -
делаю SELECT FROM S3 с форматом CSVWithNames
автоматическа Schema Inference падает с ошибкой
если схему задаю руками – ругается на строки, в которых есть двойные кавычки в тексте
в идеале – считать строку как она есть -
у вас случайно PREALLOCATE не включен?
-
format_csv_allow_double_quotes – не помогло
-
есть словарь cached
-
в смысле? все равно ошибка?
-
да
-
Вижу что там через sign поле обновляются данные
-
а создание этих ссылок на новом хосте не поможет ни чем?
-
судя по документации – этот параметр true по дефолту
-
Для hashed типа?
Не выставлял его, значит по умолчанию false -
Да. Вы выставляете данные, они там так и лежат с sign=-1 или sign=1, пока не случится фоновая операция (мерж), при которой две строки одинакового ПК с sign=-1 и sign=1 взаимоуничтожатся.
-
cat test.csv |clickhouse-client --format_csv_allow_double_quotes=0 -q 'insert into csv format CSV'
select * from csv;
┌─A─────────┬─B───────────────────────┬─C─────────┐
│ "column1" │ "Картина "Три Медведя"" │ "column3" │
└───────────┴─────────────────────────┴───────────┘ -
и еще уточняющий вопрос.
я правильно понял, что если удалить инстанс с кликхаусом который использовал бакет N в качестве диска, то файлы в этом бакете я не смогу никак использовать кликхаусом с другого инстанса? -
да. PREALLOCATE просто на этапе построения словаря может неадекватно память выделять в определённых условиях. а вы данные дедублицируете перед тем как словарь строить? ну в смысле у вас id уникальный приходит в словарь?
-
вы их не можете создать, их надо взять со старого хоста
-
А чё кликхаус умеет с дисками в S3 через fuse работать ? Может только в yandex cloud у них там драйвер специфичный, много что из posix умеет в aws может не завестись
-
и да и нет, вы неправильные вопросы задаете. Вы не рассказываете что за задача, вам картину повесить надо, а вы рассказыаете что перфоратор у вас не той марки.
-
Да, id уникальный
Исходная таблица для словаря на 24гб, с кол-вом строк 640к
Меня несколько удивляет, что не хватает выделенных 75гб RAM, если тип hashed использовать
Есть ли смысл прямо указать preallocate 1? -
фусе для s3 не умеет хардлинки
-
А сколько данных в вашей большой таблице (uncompressed)? Шанс то есть ее в ваш RAM затолкать? Если есть, то учтите что hashed жрет памяти больше других. Попробуйте sparce_hashed или hashed_array - может они влезут.
Если нет, то попробуйте кропотливо настроить параметры cache - все лучше чем direct будет. Хоть какое-то количество хитов вам обеспечит. -
нет. preallocate ускоряет построение
-
layout = cached
-
окей, сорян, под конец дня поплыл и тяжело формулируются мысли)
есть ес2 инстанс, на нем кликхаус, в качестве диска используется s3 бакет.
задача - в случае смерти инстанса, иметь возможность восстановить данные из БД. -
Пробовал по-разному писать layout(cache()) — всегда долго извлекает данные из словаря
-
Понял
-
Пробовал — не влазит ни один из указанных вами типов
-
регулярные снепшоты ebs , восстанавливаете снепшот
-
а addr у вас сколько уникальных на словарь? в процентах
-
размер сколько указывали и сколько вообще строк , процент горячих строк?
-
точно, забыл про снепшоты, спасибо.
я же правильно понял, что на ebs хранится только мета инфа о БД? -
да (если все данные на s3)
-
вы правы, я не правильно сначала понял
выключил двойные кавычки и заработало
Спасибо -
100% )
627,5к уникальных строк -
жаль
-
https://clickhouse.com/docs/en/operations/backup/ а system в соседний банкет копировать и восстанавливать сначала его а потом бакетBackup and Restore | ClickHouse Docs
- Backup to a local disk
-
LAYOUT(CACHE(SIZE_IN_CELLS 700000)) указывал так изначально когда тестил
-
Без шансов?)
-
я читал это, но я так понял, что в этих кейсах нужно сначала подготовить бэкап, чтоб было что восстанавливать
-
ну я хотел предложить построить два словаря)
id -> addr_id (hash)
addr_id -> addr -
700000 это кстати не про строки, но это не важно.
что по второму и 3му вопросам? -
Ну как бы да.
-
теперь падает когда в строке есть запятая 🗿🗿🗿
не знаете, можно ли и это как-то обойти?) -
И снепшоить просто так диски базы без скидывания Кеша на них так себе затея скорее всего данные будут побиты.
-
можно подробнее про скидывание кэша? где почитать?
-
наверное легче заменить в глобально удалить кавычки
-
>Данный словарь в целом работает только с типом direct, при котором в рамках запроса он отрабатывает долго, т.к ключ словаря id,
>а атрибут искомый adr. Если adr указать в составной ключ, то данные отдаются почти мгновенно, но тогда их не получится использовать в рамках запроса через dictGet()
вот это тоже непонятно, почему? У вас таблица order by (adr ) ? -
нет. Это будет аналогично ребуту (откату на 30 секунд назад). Как будто бекап сделали не во время T, а во время (T-30) сек,
ядро имеет параметр dirty_pages_centisecs чего-то там и оно 30сек. -
Да в кликхаусе нету жёсткого PIRT , только чекпоинты. Такие штуки нужны где транзакции и куча данных в памяти может болтаться и pitr нужно
-
Да, order by adr
По вашим вопросам тяжело ответить, если под горячими строками, вы имеете ввиду частые записи при выборке из словаря, то процентов 50 от общего кол-ва точно будет
Размер вы имеете ввиду размер кэша в кол-ве ячеек?
Указывал первично CACHE(SIZE_IN_CELLS 700000) и после этого значения выше на порядок -
да нету никаких чекпоинтов, не надо бредить
-
А гарантий какие-то есть, что после ребута там структуры данных не покараптит оно ?
-
Ну и хорошо, а почему клик пытаются как acid rdbms использовать ?
-
Вон уже 2 человека спрашивают про транспорт таблспейс и про видимость данных в транзакциях.
-
Насчет order by (adr) в исходной таблице, вы, наверное, к тому, что если там указан order by adr, то и из словаря по adr должно быстро обсчитывать?
Но условно при составном ключе в словаре select * from dict работало быстрее, нежели при ключе с id
Это я про тип direct и complex_key_direct -
т.е. проблемы с cache и с direct из-за orderby у таблицы.
-
Хм, не очень понимаю
С чем связана проблема? -
с тем что поиск по id очень медленный
-
сделайте копию таблицы с order by id
и проверьте direct снова на ней -
Да, действительно логично же..)
Пойду пробовать править исходную -
Да, спасибо, об этом и подумал
-
ну вот если послать в неожиданный ребут линукс и кх , что будет?
-
ну я вот тоже считаю что транзакции необходимы, и возможны, они уже готовы на 90% два года назад были, теперь на 95% готовы, ими занимается один человек один день в году, низкоприоритетная задача.
это кстати не имеет отношения к ACID, ACID и транзакции перпендикулярны. -
Думаю ничего хорошего не будет.
-
да все время в хецнере ребутаются железки, никто не умер.
У КХ подстелено соломки. -
в общем-то если понимать как КХ создает парты при инсертах и мержах, все становится очевидно
-
можно потерять несколько последних инсертов, но это != покараптить данные
-
вертика тоже например может потерять несколько минут последних, если эл-во во всем шкафу рубануть
-
при загрузке скажет last good epoch 2020-01-01. procceed?
-
кстати вспомнил, у меня последние n раз КХ не стартовал после хардресета из-за engine=Log таблиц, но это смешной баг минуты на 4, который не чинят уже два года
-
А когда S3 диски использовать ? Есть смысл?
-
ИМХО никогда.
s3 диски дороже в 10 раз чем HDD диски в хецнере. -
Я видел только 1 кейс когда за S3 стораджом какое-то кросс дц хранилище объектное и 1 url у всех.
-
ну clickhouse cloud весь на s3, там все данные в s3
-
-
есть кеш, на диске. Если второй раз пойти за кусочком колонки, то этот кусочек либо возьмется из дискового кеша ноды, либо скачается с s3
-
с s3 можно забирать нужный кусок объекта, не надо весь объект тянуть
-
-
-
вообще в s3 все что вам кажется файлами в сотни гигабайт это объекты по 5 мб.
-
да не так object storage работает
-
вам кажется что вы положили в s3 файл, но это внутри это куча объектов, и вы можете кусок от файла попросить.
и каталогов в бакете нет. Это все плоская таблица где-то внутри s3 с поиском по префиксу, и слеши там чистая условность -
получается что есть где-то индекс партицй с указанием смещения, анализируется запрос и берутся нужные куски?
-
-
нет, не так.
вот есть файлик mycolumn455.bin
он лежит на диске, КХ может прочитать кусок файла, гранулы, смещения гранул лежат в файле mycolumn455.mrk.
теперь кладем файл mycolumn455.bin в s3, имя у s3файла в бакете будет рандомное r56767fdgd_3453676ddfg
в файлик mycolumn455.bin положим полный путь в s3файлу (вообще полный).
дальше через s3 api можно точно также попросить кусок (нужные гранулы) от r56767fdgd_3453676ddfg
это все довольно быстро работает, летенси конечно чуть больше чем у hdd (раз в 10) на коротких запроса , но дисковый кеш это митигейтит. -
-
имя рандомное и все файлы всех партиций лежат вперемешку внутри одного каталога, потому что так проще из-за отсутвия хардлинков в s3.
-
фактически при мутациях и мержах можно в новый парт в файлик положить ссылку на старый s3файл
-
в общем остается маленький кусок, положить все метаданные в зукипер и локальный диск станет не нужен. Насколько я понимаю это уже делается в приватном репозитории, и возможно нам этого не дадут https://github.com/ClickHouse/ClickHouse/issues/32513#issuecomment-1368241078
-
Спасибо за описание 👍
-
Насколько эффективно ClickHouse сжимает строки с повторяющимся текстом? Блоки повторения от 5 до 700 символов
-
zstd хорошо сжимает.
вы можете сделать так
mycol String Codec(ZSTD(1)) или mycol String Codec(ZSTD(3))
1 быстро , 3 выше уровень компресии, макс уровень 22, но там будет очень медленно. - 13 January 2023 (116 messages)
-
Подскажите, как мне быть с примером из документации
INSERT INTO json_as_string (json) FORMAT JSONAsString {"foo":{"bar":{"x":"y"},"baz":1}},{},{"any json stucture":1}
но что, если в таблице у меня есть еще поле ID uint и date ? -
как в таком случае быть с FORMAT JSONAsString ?
-
SELECT
opp.created_at,
JSONExtractUInt(JSONExtractString(opp.data, 'app'), 'start_time') AS opp.start_time,
opp.application_instance_name AS app,
opp.application_hostname AS host
FROM TABLE1 as opp
LEFT JOIN
(
SELECT
SUM(JSONExtractUInt(data, 'total_volume_remaining')) AS cqty,
JSONExtractUInt(data, 'order_id') AS oid,
JSONExtractUInt(JSONExtractString(data, 'app'), 'start_time') AS start_time
FROM TABLE2
) AS cancel ON (opp.oid = cancel.oid) AND (opp.start_time = cancel.start_time)
и получаю
Code: 47. DB::Exception: Received from localhost:9000. DB::Exception: There's no column 'opp.start_time' in table 'opp': While processing opp.start_time AS --opp.start_time. (UNKNOWN_IDENTIFIER) -
что не нравится CH?
-
а что это за синтаксис такой интересный - "AS opp.start_time" ?
Нужно или "as start_time" или "as ``opp.start_time`` ".
Судя по остальному коду, вам скорее всего нужен первый вариант. -
as start_time
-
typo
-
sorry
-
всё равно не работает
-
вы мне помогали с object JSON, перешёл на JSONAs stirng и всё равно JOINs не могу делать
-
-
SELECT
created_at,
JSONExtractUInt(JSONExtractString(data, 'app'), 'start_time') AS start_time,
application_instance_name AS app,
application_hostname AS host
FROM data__lt_sparrow_opportunity as opp
LEFT JOIN (
SELECT
SUM(JSONExtractUInt(data, 'total_volume_remaining')) as cqty,
MAX(JSONExtractUInt(data, 'time_stamp')) as rp_ts,
JSONExtractUInt(data, 'order_id') as oid,
max(created_at) as cancel_created_at,
JSONExtractUInt(JSONExtractString(data, 'app'), 'start_time') as start_time
FROM data__lt_sparrow_order_response_cancel_confirm GROUP BY oid, start_time ) AS cancel
ON opp.oid = cancel.oid AND opp.start_time = cancel.start_time -
запрос на самом деле намного больше, но вот базовая, урезанная часть, которая по идее должна же работать ( и работает в PG.
-
-
вобще вот этот синтаксис вида select c1... from table as t1 join ( ) t2 on ... в сложных случаях мне никогда не нравился. делайте select ... from () as t1 join () as t2 on ... как и написано в документации на join. Оно и ошибок меньше и скорее всего быстрее будет.
-
колонка start_time внутри JSON
-
│ CREATE TABLE lightlog.data__lt_sparrow_opportunity
(
created_at UInt64,
application_name String,
application_hostname String,
application_instance_name String,
application_start_time UInt64,
data String CODEC(ZSTD(3))
)
ENGINE = MergeTree
ORDER BY created_at
TTL toDateTime(fromUnixTimestamp64Nano(created_at)) + toIntervalHour(48) -
я не вижу тут колонки start_time. никак. хоть убейте. Виджу строки и UInt64. Это все
-
JSONExtractUInt(JSONExtractString(data, 'app'), 'start_time') AS start_time
-
там лежит JSON в виде строки
-
это не колонка. Это переменная. Вы ее вычисляете. Ее нет в таблице. Давайте остановимся и вы подумаете
-
ок, согласен, колонки такой нет, но когда я делаю
JSONExtractUInt(JSONExtractString(data, 'app'), 'start_time') AS start_time, -
разве нельзя потом к этой "переменной" обратиться как opp.start_time
-
нельзя. делайте подзапрос. я это уже сказал
-
я понимаю, что CH особенный, но вроде бы это как бы основа SQL
-
сейчас буду разбираться, спасибо за подсказку
-
Прикрутил CH к AD. Роли мапятся к доменному пользователю сразу, а реальные права прилетают в течение часа. То есть добавляю пользователя в доменную группу безопасности, захожу клиентом(dbeaver, clickhouse-client), вижу что роль появилась, но права от этой роли подтягиваются в течение часа по факту. В доках ничего внятного не нашел. Кто-то с подобным сталкивался?
-
Добрый день!
Вопрос про интеграцию ClickHouse с LDAP. Можно ли делать bind до ldap-сервера и поиск там под одной специальной учеткой ("admin" на стороне ldap, логин и пароль которого указан в конфигах кх, например), для любого авторизующегося в кх пользователя? Т.е. например user1 пытается войти в КХ как "user1, password1", и далее в ldap заходит admin и ищет запись о таком юзере с таким паролем.
Сейчас пока удается настроить у себя только чтобы bind делался с данными самого юзера
Вот здесь, кажется, аналогичный вопрос https://github.com/ClickHouse/ClickHouse/issues/26220LDAP: use special account to perform search in the directory · Issue #26220 · ClickHouse/ClickHouseProblem Currently Clickhouse offers the following scenario of LDAP login: Directly bind with the user's login and password. While bound find the user's groups. I have 2 problems wit...
-
У меня 3 таблицы в кликхаусе
Их создавал просто копированием схемы из MySQL
1) дата хранится в visit_last_action_time в формате 2023-01-13 06:10:49
2) дата хранится server_time в формате 2023-01-13 06:09:13
3) нет даты
Нубский вопрос по запросу показывающему размер таблиц:
SELECT table,
formatReadableSize(sum(bytes)) as size,
min(min_date) as min_date,
max(max_date) as max_date
FROM system.parts
WHERE active
GROUP BY table
Сейчас этот запрос логично не показывает ни начальную ни конечную дату в моих 3х таблицах.
Как мне добавить поле с датой чтобы они были в общем формате и отображались в этом запросе. Я так понимаю должна быть какая-то "дата по умолчанию" у записи чтобы на ней отрабатывали min и max -
-
вот тут есть ответ, что это за дата https://clickhouse.com/docs/en/operations/system-tables/partsparts | ClickHouse Docs
system_tables-parts}
-
спасибо
-
А зачем надо реализовывать поиск под специальной учеткой?
-
правильно я понимаю что мне с моими данными так просто это не сделать (и скорее всего мне это не нужно) и это можно только с таблицами system?
-
Такое ограничение на стороне LDAP-сервера
-
min_date (Date) – The minimum value of the date key in the data part.
max_date (Date) – The maximum value of the date key in the data part.
Это относится не только к таблицам system -
ну если сейчас у меня везде 1970 года, значит реагировать не на что. И моя дата в случайном столбце для такой задачи не подходит
-
у вас дата стоит в ключе? в партицировании?
-
нет, прост создал поля с типом DateTime
-
-
спасибо!
-
Всем привет! Подскажите пожалуйста, наблюдаем высокую назрузку СPU с завидным постоянством. Почитал в интернетах, написано, что это нормально https://kb.altinity.com/altinity-kb-setup-and-maintenance/high-cpu-usage/ и в целом сделано, чтобы запросы были быстрее. Но хочется быть уверенным, что на нашей стороне нет косяков, связанных с неоптимальными запросами.
В связи с этим - на что в первую очередь обратить внимание при рефакторинге скриптов? Что больше всего жрет СPU? -
+ непонятно, есть ли где посмотреть загрузку по СPU? Есть системная таблица system.query_log , но там только потреблемая память
-
Добрый день. Где теперь размещаются установочные deb-пакеты ClickHouse ? Получаю ошибку при обновлении версии:
-
Всем привет, подскажите, я создал нового пользователя, могу зайти через clickhouse-client, когда задаю ему логин, пароль
после ALTER USER name HOST IP 'что-то' больше не могу зайти, только получается зайти с этого айпишника на базу, как сделать доступ и с локального сервера и с этого айпи? -
Всем доброго здравия,
Хотел попросить совета по следующей проблеме:
Каким образом стоит подходить к задаче по реализации в Клике пагинации по-страничной?
Слышал о том, что можно пагинировать по CSV,
Или даже можно использовать отдельную таблицу.
Хотелось бы услышать ваше мнение, какие существуют распространенные практики. -
Ну грубо говоря никак, лучше не делать, а так ищите по чатику 10000 раз были вопросы и 1001 ответ, что это всё плохо
-
🤔
-
Так и делаю, пока не нашел какого-то общего мнения
-
В чем может быть проблема? По тем же кредам через python подключаюсь без проблем, подключение по HTTPS на этом порту висит, есть ощущение что флаг secure только TCP
-
#vacancy #job #opensourceteam hi al, new year new beginings? Looking for developer to join our OpenSource team to work on Clickhouse. Support clickhouse from outside and be a true opensource ambassador (remote in USA & Europe or relocation Finland/Germany)
https://aiven.io/careers/job?gh_jid=4061730101Careers - Jobs | AivenSee the list of our open positions and build your unique success story.
-
консольный клиент не использует http интерфейс, ему нужен порт нативного (по дефолту 9000)
-
понял, думал какой то флаг потерял для переключения на https
-
Привет. Когда я добавляю предопределенный http интерфейс у меня перестает работать обычный.
<http_handlers>
<rule>
<url>/custom_metrics</url>
<methods>POST,GET</methods>
<handler>
<type>predefined_query_handler</type>
<query>SELECT 'Metric_count_events', count() FROM db.events FORMAT TabSeparated</query>
<content_type>text/plain; charset=utf-8</content_type>
</handler>
</rule>
</http_handlers>
#: curl 'http://localhost:8123/ping'
There is no handle /ping
ClickHouse client version 22.3.15.33 (official build).
Прочитал еще раз документацию. Добавление <defaults/> решило проблему -
Привет всем
Хотел спросить, нормальная ли практика для клика джойнить таблицы со вложенными запросам? Мне казалось, что лучше побольше полей сделать чтоб вытаскивать разом.
Ну и второй вопрос, есть ли какой то гайд по клику или обучение может, помимо документации? -
Всем привет, пытаюсь поставить CH на FreeBSD 13.1 используя эти инструкции: https://clickhouse.com/docs/en/install/#self-managed-installInstalling ClickHouse | ClickHouse Docs
You have three options for getting up and running with ClickHouse:
-
curl https://clickhouse.com/ | sh
-
-
-
-
Добрый день! На одном из хостов был сбой хранилища. При старте сервера получаю ошибку "Suspiciously many (893) broken parts to remove". Реплику запустил используя max_suspicious_broken_parts. Таблицы ReplicatedMergeTree. Версия Clickhouse 21.9.6.24.
Вопрос, как корректно/достоверно проверить согласованность данных на проблемной реплике и есть возможность средствами Clickhouse до синхронизировать данные на проблемную реплику с оставшихся рабочих. -
всем привет
в таблице system.part_log постоянно вижу такого рода строки
event_type = NewPart
part_name = 202301_2696947_2696947_0
partition = 202301
path_on_disk = /opt/clickhouse-hdd/hdd/data/my_database/my_table/tmp_insert_202301_2696947_2696947_0/
error = 389
правильно ли я понимаю, что это логи дедупликации партов?
таблица если что реплицированная -
-
Как раз самая нормальная практика - это джойнить два подзапроса предварительно отфильтровав только нужное, а не целые таблицы. И не надо брать все столбцы, а только те, которые вам реально нужны. И чем меньше столбцов сможете взять - тем лучше. Чем меньше данных вы читаете - тем быстрее работает запрос. Меньше столбцов, меньше строк. Вся оптимизация запросов прежде всего про это.
Если вы уже прочитали всю документацию (лучше на английском - там полнее), со всеми её разделами, то еще можно посоветовать kb.altinity.com - огромное количество полезных советов. Так-же можете на основном сайте алтинити почитать блог. И блог на clickhouse.com И куча видео на youtube. И презентации по выходящим версиям. Информации более чем - было бы желание читать. -
КХ это сам делает. Сравнивает парты на разных нодах (используя ZK для синхронизации) и выкачивает недостающее. Скорее всего вам ничего дополнительно делать не надо.
-
Спасибо! Проверим дополнительно в коде корректность данных на реплике. Подскажете, правильно я понимаю, что запрос SYNC REPLICA https://clickhouse.com/docs/ru/sql-reference/statements/system/#query_language-system-sync-replica, как раз принудительно запускает такую синхронизацию?Запросы SYSTEM | ClickHouse Docs
query-language-system}
-
Привет! Вижу много тулзин для миграций, какая из существующих на текущий момент предпочтительна? Спасибо
-
Как я понимаю смысл этой команды в ожидании, а не в запуске. Например вы хотите быть уверенны что синхронизация завершилась, и только потом делать что то иное.
-
Добрый день
Подскажите, пожалуйста. Я правильно понимаю, что для синхронной вставки данных в распределённую таблицу можно указать такие настройки?
CREATE TABLE table_distributed AS table
ENGINE = Distributed(...)
SETTINGS
fsync_after_insert=0,
fsync_directories=0; -
-
Спасибо.
Ну если я правильно понимаю, то выборка подзапроса должна быть по ключам, иначе фулскан получим. А когда мы имеем вложенный селект внутри join, то КХ не умеет вроде индексировать по ключам в этом селекте. Или я неправильно что то говорю? -
добрый день.
вопрос: есть ли годные пакеты (или какие то другие решения) query builder для КХ под node js?
при работе с postgres в качестве query builder использую knex. Захотелось подобного на кликхаусе, knex не поддерживает кх. поискал библиотеки в интернете - нашел несколько оч слабо популярных и судя по всему заброшенных.
далее, увидел на оф сайте кх odbc-bridge, подумал, что это может решить мою проблему, попробовал его установить и использовать, но чот пошло не так, при запуске curl с оф гайда кх мне в ответ прилетает "Server and library-bridge have different versions: '0' vs. '1'", ну и я так подумал, что эта тулза мне не поможет -
Не то. Наличие подзапроса в общем случае не влияет на алгоритм выборки, если не брать в расчет особо изощрённые баги.
-
ORM видел
https://github.com/zimv/node-clickhouse-ormGitHub - zimv/node-clickhouse-orm: 🍔Clickhouse orm for Nodejs🍔Clickhouse orm for Nodejs. Contribute to zimv/node-clickhouse-orm development by creating an account on GitHub.
-
этот тож видел, но он мало популярный
-
-
-
да, так и думал, просто мб существует уже что то годное
-
Я лично не нашел быстрого удобного решения, потому в ноде сам запросы собираю
-
-
В distributed таблице ничего нет. Это прокси и очередь. И сама идея сравнения так себе. Если вам надо сравнивать данные то select ... except. Если ddl, то выковыривать тексты из system.tables и запускать diff
-
-
1 колонка Json = много колонок , так что вы можете спокойно сравнивать любой объект json'a
-
это как раз и получается вариант со сравнением каждого поля отдельно. Какого-то варианта сравнить весь объект целиком, не перечисляя все поля вручную, нет?
-
SELECT
sipHash64(toJSONString(CAST('{"a": 1}', 'JSON'))) AS h1,
sipHash64(toJSONString(CAST('{"a": 2}', 'JSON'))) AS h2,
h1 = h2 AS equals -
-
-
-
-
-
Добрый день. Репозиторий по ссылке недоступен:
https://packages.clickhouse.com/deb/pool/stable -
По адресу ссылки отображается сообщение: Not Found
-
issue на github'e создайте
-
Аа
-
Нет
-
просто перенесли в другое место https://packages.clickhouse.com/deb/pool/main/c/clickhouse-server/
-
Спасибо !
-
А за русской докой следит только комьюнити
-
А вот тут полный список https://packages.clickhouse.com/deb/pool/main/c/clickhouse/
-
Object(json) под капотом имеет обычный tuple. Его можно сравнивать целиком (и даже на > если внутри типы подходящие). Поэтому просто сравниваете целиком как есть. Если и правда одинаковые - совпадет. Но должно быть очень точно - там при вставках постоянно меняется внутренняя структура.
SELECT countIf(d != d) AS r FROM TABLE
0 -
у меня не получилось сравнить
Code: 49. DB::Exception: Received from . DB::Exception: ColumnObject must be converted to ColumnTuple before use: While processing CAST('{"a": 1}', 'JSON') = CAST('{"a": 2}', 'JSON'). (LOGICAL_ERROR) -
почему-то если в where сравнивать одну и ту же колонку в JOIN таблицы с собой, то получаю ILLEGAL_TYPE_OF_ARGUMENT
select * from table1 oo1 JOIN table1 oo2 USING oid where oo1.Fld = oo2.Fld -
откуда cast?
-
ну это для примера
-
-
-
так это не работает. Нужно делать полноценную mergetree и вставлять в нее. И никаких cast. Магия пока случается только при вставках. Они там думают как сделать лучше, но пока так.
-
понял, спасибо. энивэй если задача стоит сравнить две jsonины полностью, то может имеет смысл от них хэш писать где-то рядом при вставке и потом по нему сравнивать
-
Как удалить из базы повторяющиеся строки?
Есть большая база содержащая дату, хост, цифры.
Есть дупликаты полностью повторяющие "близнецов"
При потытке клонировать таблицу как
INSERT INTO table_clone SELECT date, fqdn, any(number) FROM table_orig GROUP BY date,fqdn;
сервер падает из-за нехватки памяти.
`Progress: 52.43 million rows, 5.71 GB (3.60 million rows/s., 391.45 MB/s.) (7.6 CPU, 43.45 GB RAM)
Code: 32. DB::Exception: Attempt to read after eof: while receiving packet from localhost:9000. (ATTEMPT_TO_READ_AFTER_EOF)` -
How to delete duplicate rows in SQL ( Clickhouse)?
so I created a table using clickhouse, but it has duplicates in it. The following query gives me the duplicates in my table select *, count() AS cnt from my_table GROUP BY * HAVING cnt > 1 In
-
спасибо!
-
https://kb.altinity.com/altinity-kb-setup-and-maintenance/who-ate-my-cpu/#processes-retrospectively
https://kb.altinity.com/altinity-kb-setup-and-maintenance/high-cpu-usage/Who ate my CPUQueries to find which subsytem of Clickhouse is using the most of CPU.
-
да
-
sync replica этого не делает. Описание кривое в доке
Это просто ждем пока все таски из replication_queue которые существовали до старта sync replica завершатся, и возвращаем управление. Это операция для тестов внутри CI, пользователям она малопригодна.
Вашу проблему надо решать на уровне SQL просто сравнивая system.parts используя clusterAllReplicas типа
select shard_num, node, database, table, engine, uniq(partition), min(min_date), max(max_date), count(*) parts, sum(rows) rows, sum(marks) marks, sum(bytes_on_disk/1024/1024) mb,
sum(primary_key_bytes_in_memory_allocated)/1024/1204 pk_mb_alloc, sum(primary_key_bytes_in_memory)/1024/1204 pk_mb_mem
from lf.parts all inner join (select shard_num, splitByChar('.',host_name)[2] as node from system.clusters where cluster='cluster') using node
where table like '$[?table]' and node like '$[?node]' and active group by shard_num, node, database, table, engine order by shard_num, table, node
это нерабочий запрос, это заготовка -
нет, это про кеши линукса параметры
что вы называете синхронной вставкой? -
select * from system.mutations where not is done \G
- 14 January 2023 (34 messages)
-
Нужно чтобы по завершении инсерта, данные гарантировано разошлись по всем шардам, пусть и медленнее. Инсерт выполняется в мат. вью
-
параметр называется insert_distributed_sync
-
Он же для всего кластера устанавливается. А мне нужно только для конкретной таблицы распределённой
-
нет, не для кластера.
это пользовательский параметр его можно установить в профиле пользователя который делает инсерты, либо прямо в конкретном инсерте.
в любом случае те параметры которые вы упомянули вообще не из этой сказки. Они заставляют ядро линукса сбрасывать кеш при записи в дистрибьютид таблицу, когда она пишет данные к себе во временное хранилище, а когда случится реальный запрос в шард неизвестно, может вообще никогда.
параметр insert_distributed_sync напротив возвращает управление когда данные записаны в настоящие таблицы в шардах, причем в этом случае дистрибьютид таблица не записывает себе на диск данные, а просто транслирует в шарды. -
Ясно, спасибо!
-
-
-
Спасибо!
-
Всем привет
как удалить ненужные значения в таблице clickhouse? использую MergeTree, что-то я не могу найти команду
допустим у меня есть 200 строк, которые я хочу удалить, как это сделать? по дате например -
-
если версия свежая то можно DELETE FROM, по классике
-
это и то что выше - разные механизмы. в документации соответственно
https://clickhouse.com/docs/en/sql-reference/statements/alter/delete
https://clickhouse.com/docs/en/sql-reference/statements/delete/ALTER TABLE … DELETE Statement | ClickHouse DocsDeletes data matching the specified filtering expression. Implemented as a mutation.
-
а есть способ удалить по дате? если у меня datetime, потому что как я понимаю, лайк не работает с датой
-
-
-
@m1khal3v спасибо большое
-
Спасибо огромное
-
-
ClickHouse/test.py at 573d3283b09c8ac7752b5cbf4634f117e2667d78 · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Добрый день. Столкнулась с тем, что в Clickhouse union all настраивается параметром в конфигурации.
Может кто-то знает, почему нет по умолчанию? Это как-то противоречит колоночному хранению? Или функционал union all в Clickhouse закрывается каким-то другим более удобным функционалом?
Например, запросы выполняются последовательно, результат пишется в таблицу последовательно. Таким образом это эмитирует union all.
Может быть неэффективно держать результаты нескольких запросов в памяти, чтобы потом объединить их union all.
Если есть обсуждения/видео на эту тему, поделитесь пожалуйста. -
Так что вам мешает поставить настройку в distinct? Просто изначально distinct не был реализован
-
Хотелось понять, как было задумано и для чего, чтобы разумно использовать.
-
Изначально union distinct не существовало, по этому дефолтных union это union all
-
Понятно, спасибо
-
Спасибо
-
А, блин, оно и в доке уже появилось в списке параметров табличного движка. Но только в англоязычной
-
-
На регулярной основе — не стоит, так как здорово тормозит и нагружает базу очень непропорционально количеству удаляемого/изменяемого. Мы ввели однажды удаление через alter table delete при нажатии пользователем далеко спрятанной кнопки удаления данных (потенциально очень редкое событие) — и то пришлось переделывать вскоре, когда заметили, что счётчик активных мутаций никогда не пустой.
В общем я бы советовал этот метод только как экспериментальный и с обязательным мониторингом количества незаконченных мутаций. -
-
Рассматриваю альтернативный способ "soft delete" (колонка is_deleted) , так как использую ReplacingMergeTree. И потенциально удаленных данных не должно быть много. Но не до конца понимаю как это скажется на производительностью общей массы запросов, так как все запросы придется выполнять с условием по этой колонке.
-
Пошел читать про CollapsingMergeTree, сходу не понял как оно работает
-
Вот тут про удаление
https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/collapsingmergetree/#table_engine-collapsingmergetree-collapsingCollapsingMergeTree | ClickHouse Docstable_engine-collapsingmergetree}
-
-
В 2 словах:
У вас появится столбец sign, который либо 1, либо -1
Обычные строки вставляете с sign = 1
Когда хотите строку удалить, добавляете строку с такими же значениями полей из ORDER BY, но только sign = -1
Данные не удалятся сразу, какое-то время (до следующего мерджа соответствующих партов) у вас будет лежать обе строки, тогда при выборке придётся использовать спец приемы (там в доке есть) либо тупо добавить final
Запросы с final лучше запускать с SETTINGS do_not_merge_across_partitions_select_final =1
Final делает слияния только при выборке, то есть физически обе строки все ещё останутся, но в запросе их не будет - 15 January 2023 (84 messages)
-
Спасибо, дочитал и тоже понял :)
Сейчас использую `ReplacingMergeTree` и это проще, не требуется sign = -1. Зато тут есть возможность удалять данные. -
-
😊
-
Если хранить в кликхаусе очень длинные строки, каких проблем с производительностью стоит ожидать?
-
Пропопорционально объёму, если выборку делать по этому полю. Ну или почти нет, если в WHERE этого поля нет.
-
-
Можно через dictionary. Но с ограничениями на условия вытекающие из логики обращения к словарям.
-
То есть, произвольный SQL запрос никак не удастся выполнить для различных движков баз данных?
-
Вопрос странный. Только в том случае, если соответствующие функции есть в другом движке баз данных.
-
Есть несколько путей, но я не очень понимаю что вы подразумеваете под произвольным запросом. Поясните подробнее с примером.
-
Делаете свою пользовательскую функцию, где скриптом делаете абсолютно любые действия, включая выполнение запросов. Можно хоть звёзды на фотографиях считать. Но по понятным причинам это будет работать совсем не быстро.
-
Например, создал базу CREATE DATABASE test ENGINE=SQLite('test.db'), и чтобы можно было выполнять через ClickHouse произвольные запросы в ней, UPDATE, DELETE, PRAGMA, и т.д., на удалённом сервере, чтобы не делать отдельное соединение к этой базе данных для таких запросов.
-
Вот есть функция https://clickhouse.com/docs/ru/sql-reference/table-functions/sqlite, но она же только для выборки данных подходит?
-
insert тоже должен работать. синтаксис такой - insert into function sqllite()
почитайте про движок базы данных - https://clickhouse.com/docs/en/engines/database-engines/sqlite там больше написано. -
Только SELECT и INSERT, а требуется ещё и возможность выполнения в той базе данных и других SQL-запросов, используя соединение с ней через ClickHouse.
-
Да, похоже это единственный способ, спасибо за информацию.
-
А что такого ценного есть в sqllite, чтобы так заморачиваться? Я понимаю когда у вас есть данные в виде файла и их надо прочитать. Но если вам нужно key-value storage в рамках КХ, то я бы предложил посмотреть на EmbeddedRocksDb
-
То, чего нет в CH. Спасибо за наводку, посмотрю RocksDB.
-
А если не секрет - что такого умеер скулайт?
-
Умеет ли кликхаус автоматически создавать таблицу, на основании данных из другой?В первой таблице есть колонка с текстом, во второй нужны колонки, получаемые путём парсинга текстовой колонки из первой таблицы
-
-
Функции | ClickHouse Docs
funktsii}
-
Спасибо
-
-
Быстрые UPDATE и DELETE одиночных записей. Быстро достать одну запись по PRIMARY KEY.
-
-
-
-
-
По документации не понятно, как обновлять и удалять записи в RocksDB: https://clickhouse.com/docs/ru/engines/table-engines/integrations/embedded-rocksdbДвижок EmbeddedRocksDB | ClickHouse Docs
EmbeddedRocksDB-engine}
-
Да, рассмотрю этот вариант, в принципе одиночные эти записи надо доставать с большим количеством статистической информации, поэтому скорость по ним уже не особо важна, упирается всё в скорость CH по статистике.
-
умеет конечно. а в чем тут вобще может быть проблема? Это стандартный функционал. Я все что угодно пишу на КХ sql
-
Разве можно создать таблицу, в качестве аргумента передавая результаты селекта?
-
Есть какая-нибудь таблица или эмпирические данные, соотношение эффективности сжатия/падения производительности при разных уровнях сжатия ZSTD?
-
CREATE TABLE | ClickHouse Docs
Creates a new table. This query can have various syntax forms depending on a use case.
-
Когда структура хранится записями
-
-
-
ровно так. А как надо иначе?
-
-
-
-
-
В строках, чаще всего - JSON.
Если он там парсится успешно, нужно писать в другую таблицу -
-
Да, из generic таблицы строить конкретику
-
что-то странное. вы бы написали это как-то подробно и с примерами. Можно сделать как угодно, вот тут особенности КХ точно не при чем. Берете любой язык программирования и пишите. Да хоть бы и bash.
JSON парсится автоматически и раскладывается по колонкам. -
Так это не я написал, это исходный вопрос.
В изначальном вопрос шел вопрос про исполнение этого в кликхаусе -
Хотел обойтись только средствами КХ, без стороннего микросервиса
-
-
-
Привет.
Обновил clickhouse до 22.13.1.2186 (official build) и обнаружил, что куда-то делось 2 гига места на диске. Покопал и обнаружил, что исполняемый файл /usr/bin/clickhouse теперь весит 2.4 гига! Хотя прежняя версия весила 400 мегов. Откуда такие размеры бинарника? -
Не подскажите, как устанавливали? Deb или просто голый бинарник скачали?
2.4 гига весит, потому что в нем присутсвуют дебажные символы. Обычно они поставляются отдельно в пакете common-static-dbg. Видимо, CI поломался -
curl https://clickhouse.com/ | sh
sudo ./clickhouse installFast 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
-
Понятно. Если сильно размер волнует, то можете натравить strip на бинарник.
-
По мне так executable UDF - это довольно тяжелое решение. Object('JSON') работает достаточно прилично для задачи, описанной выше by @AlessandrD, похожей по описанию на хранение логов. Ничего дополнительно делать не надо.
-
удалять обычным delete, в последних версиях он работает. Обновлять повторным insert с тем-же самым key.
-
Всем привет, есть ли возможность при использовании MaterializedPostgreSQL преобразовывать на лету колонки как в обычных Materialized view?
-
Надеюсь, что всё починят и можно будет установить релиз без отладочных символов.
-
это НЕ РЕЛИЗ, вы устанавиливаете night build
-
Меня настораживает, что про 22.13 нигде не написано. Ни на гитхабе, ни в пакетах...
-
это night build
-
бл...
-
а тут https://clickhouse.com/docs/en/install/#self-managed-install ни слова про это...Installing ClickHouse | ClickHouse Docs
You have three options for getting up and running with ClickHouse:
-
стоит. Зависит что вы понимаете под длинными строками. Если строки по 10мегабайт, то надо много памяти на мержи.
-
вот да. вообще не очевидно...
-
нету.
берете один день своих данных и заливаете в таблицу в которой три столбца с разными кодеками или в три таблицы и проверяете.
очень часто может оказаться что ZSTD(1) и ZSTD(3) вообще не отличаются по размеру, естественно что тогда надо использовать zstd1
есть еще одна фича, что КХ может при мержах менять компрессор в зависимости от размера парта, это позволяет экономить cpu при инсертах и первых мержах.
т.е. инсерт создает lz4, дальше парты мержаться, мержаться, используется мало CPU , а когда размер доходит например до 20ГБ и начинаем жать ZSTD(3)
https://kb.altinity.com/altinity-kb-schema-design/codecs/ -
-
нету https://github.com/ClickHouse/ClickHouse/issues/39851
НО можно сделать view as select ... from s3( ) и прописать это вью как источник local словаря -
подожду, когда выйдет 22.13 и поставлю его ручками...
-
🙂 22.13 не выйдет. Вместо него выйдет 23.1
-
Спасибо!
-
а там что-то существенное изменится, раз старший номер версии изменится?
-
год на календаре
-
23.1 = январь 2023
-
-
я тестирую 6 месяцев августовские LTS и все равно после выкатки в прод находится какая-то херня.
-
Я правильно понимаю, что 22.8 Altinity stable ожидается нескоро?
-
не знаю, я лично наверное пропущу 22.8 и буду ставить через год 23.8
слишком много херни типа
https://github.com/ClickHouse/ClickHouse/issues/44500
https://github.com/ClickHouse/ClickHouse/issues/43816
https://github.com/ClickHouse/ClickHouse/issues/43865 -
Вообще собирались в ближайший месяц-два апрувить, но с особенностями, да
-
А есть где нить исправленное? А то у нас есть баги что только в 22.8 и выше фикшены
-
Подскажите как оформить структуру данных.Раз в секунду приходит сообщение с небольшой текстовой строкой, записывается timestamp, отправляется в КХ.Но хранить требуется только те записи, когда строка, в сравнении с прошлым сообщением, изменилась.Как эффективно использовать кликхаус в таком сценарии?
-
нету, не исправлено
-
window view (проще до КХ)
- 16 January 2023 (154 messages)
-
ClickHouse митап в Тель Авиве: https://www.meetup.com/clickhouse-tel-aviv-user-group/events/289599423/ClickHouse Meetup at the CHEQ office in Tel Aviv, Mon, Jan 16, 2023, 6:00 PM | Meetup
We are very excited to be holding our next in-person ClickHouse meetup at the CHEQ office in Tel Aviv! Hear from CHEQ, ServiceNow and Contentsquare, as well as a deep dive
-
Привет.
Иногда db.Query() из github.com/ClickHouse/clickhouse-go/v2 возвращает ошибку
read: read tcp 127.0.0.1:34032->127.0.0.1:9000: i/o timeout .
Параметры подключения к Кликхаусу дефолтные:
db, err := sql.Open("clickhouse","clickhouse://default:xxxx@127.0.0.1:9000/xxxxx")
а там read_timeout 5 минут. Ну и вообще запросы обычно отрабатывают за доли секунды... В чём может быть проблема? -
В логе ошибок в это время такое:
2023.01.16 05:55:20.313982 [ 450467 ] {} <Error> ServerErrorHandler: Code: 210. DB::NetException: Connection reset by peer, while reading from socket (127.0.0.1:34010). (NETWORK_ERROR), Stack trace (when copying this message, always include the lines below) -
Добрый день!
Подскажите, пожалуйста, а есть какая-нибудь документация для реализации такого?
select JSONExtract.... from http( . )
Не нашёл, как реализовать from http() -
-
Спасибо большое!
-
На странице https://clickhouse.com/docs/en/sql-reference/statements/alter/view/ сказано что MODIFY QUERY работает только для MV созданных без TO. Как тогда менять запросы для MV созданных с TO? Только удалять и заново создавать MV?ALTER TABLE … MODIFY QUERY Statement | ClickHouse Docs
You can modify SELECT query that was specified when a materialized view was created with the ALTER TABLE … MODIFY QUERY statement. Use it when the materialized view was created without the TO [db.]name clause. The allowexperimentalaltermaterializedview_structure setting must be enabled.
-
Denny [Altinity] in ClickHouse не тормозит
неправильно в доке написано. ЕЕ как раз можно использовать только для TO https://github.com/ClickHouse/ClickHouse/issues/15206 датагрип просто использует antlr файл из исходников КХ, который описывает синтаксис КХ (сам кх его не использует), и этот файл покрывает не весь синтаксис и устарел
-
-
Думаю нужно попробывать 2 варианта
1. Дать просто фулл доступ на system
2. Дать доступ на всё
Нужно сравнить, отображается ли вся информация об таблицах или нет -
GRANT SELECT ON system.* TO zabbix ?
-
Да
-
пересоздал - не показывает метрики клиентских бд
походу *.* только -
Привет, при создании UDF - как потом посмотреть её DDL?
-
select *
from system.functions
where origin = 'SQLUserDefined' -
Привет,
Пытаюсь создать бэкап БД CH v22.8.12.45.
Настройка конфига
1 <clickhouse>
2 <storage_configuration>
3 <disks>
4 <backups>
5 <type>local</type>
6 <path>/var/lib/clickhouse/backup/</path>
7 </backups>
8 </disks>
9 </storage_configuration>
10 <backups>
11 <allowed_disk>backups</allowed_disk>
12 <allowed_path>/var/lib/clickhouse/backup/</allowed_path>
13 </backups>
14 </clickhouse>
Делаю бэкап, файл db.zip появляется в указанном месте
BACKUP DATABASE db TO Disk('backups', 'db.zip')
Восстанавливаю
RESTORE DATABASE db AS db_restored FROM Disk('backups', 'db.zip')
и получаю
Code: 76. DB::Exception: Received from 127.0.0.1:50501. DB::ErrnoException. DB::ErrnoException: Cannot open file tmp31426aaaaaa, errno: 13, strerror: Permission denied. (CANNOT_OPEN_FILE)
Насколько понимаю, нехватает прав на чтение временного файла. Ch стартует из под пользователя clickhouse, у которого есть, соответсвенно, все права на каталог /var/lib/clickhouse. Непонятно в чем причина ошибки и куда смотреть? -
Здравствуйте.
Помогите разобраться почему у меня кх вылетает? -
-
всем привет, подскажите плз что может быть не так в настройках
создаем тестовую таблицу в кластере и оно создается вот так
CREATE TABLE testcluster.test
(
id UInt32
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}')
ORDER BY id
SETTINGS index_granularity = 8192 -
UUID почему-то не подставляется
-
а такой макрос точно есть?
SELECT * FROM system.macros -
там нету, но у нас на продакшн сервере тоже нету его ... но оно подставляется и все работает )
-
причем в system.tables у этой таблицы uuid на месте ...
-
Подскажите, пожалуйста, как задать порядок вывода строк в результате union all (иначе он просто случайный) - не хочет сортировать даже при явном указании поля для сортировки https://fiddle.clickhouse.com/56157760-5ad2-4a2a-af17-1ef57a775eea - получилось только если выделить весь запрос в подзапрос и его целиком отсортировать, но этот вариант сильно замедляет запрос
-
походу это глюк версии чтоли .... в system.zookeerer в path /clickhouse/tables проставляется UUID таблицы, но в SQL таблицы вместо него просто {uuid} в результате таблицы не реплицируются
-
Всем прривет! Подскажите пожалуйста каким методом можно достать словарь из массива, при условии, что в одном событии таких массивов может быть несколько?
-
Добрый день!
Подскажите, пожалуйста, можно как-то для распределённой реплицированной таблицы проверить на каких машинах она ATTACHED, а на какие нет?
На некоторых могли отсоединять, а ходить по всем как-то муторно -
Всем Привет,как заполнить столбец из другой таблицы в кликхаус?
-
-
Доброго дня. Столкнулся со странным поведением поля типа JSON. Есть две таблицы одинаковой структуры, в них по такому полю.
Запрос
SELECT OrderId, t1.JsonField, t2.JsonField FROM table1 t1 JOIN (SELECT * FROM table2) t2 USING OrderId WHERE JsonField != t2.JsonField
Срабатывает верно и сравниваются поля из разных таблиц, в ответе тоже поля из разных таблиц
А если сделать вот так:
SELECT OrderId, t1.JsonField.Guid, t2.JsonField.Guid FROM table1 t1 JOIN (SELECT * FROM table2) t2 USING OrderId WHERE JsonField.Guid != t2.JsonField.Guid
То получим ошибку Missing columns: ‘JsonField.Guid’ на where
Если вернуть первое условие и сделать такой запрос
SELECT OrderId, t1.JsonField.Guid, t2.JsonField.Guid FROM table1 t1 JOIN (SELECT * FROM table2) t2 USING OrderId WHERE JsonField != t2.JsonField
То ошибок не будет, условие сработает, но в результатах вместо t2.JsonField.Guid будет значение из такого же поля t1
Если поля в разных таблицах назвать по-разному, то в третьем варианте будет ругаться на несуществующее поле, если отключить алиасы - тоже самое
Есть ли возможность после JOIN добраться до вложенных полей из колонки второй таблицы? -
"Detached tables are not shown in system.tables."
Поэтому берете clusterAllReplicas, и считаете counts по всем своим таблицам. Если большинство таблиц приатачено правильно, то нехватка будет видна сразу. -
Добавить новый столбец с данными из другой таблицы? Сначала создать словарь с нужными данными, а потом alter table add column, update column set value=dictGet() where ...
-
Спасибо, то что надо!
-
Добрый день! Есть ли в КХ что-то для сравнения версий в виде строк?
Чтото типа класса Version с С -
Не надо использовать select * в подзапросе.
* - это список колонок, так как это указано в определении таблицы. Никакие внутренние туплы тут не раскрываются. Если вы делаете подзапросы - явно указывайте все элементы туплов, которые вы хотите выдать наверх. Нет щастья и красоты. Но пока так. -
-
типа найти массив в подзапросе или найти элемент в массиве?
если искать элемент в массиве, то has(array, element) -
uuid подставляет командой on cluster
-
Подзапрос возвращает единичные элементы, присутствующие в массиве, определяются как arr Array(UUID) ... id UUID.
-
это все так и задумано в стандартном sql
-
нету ничего, сами через splitByChar('.', version) с массивом работайте
-
ага, но почему если выносить запрос с union-ами в подзапрос и его сортировать по некому индексу, то на реальных данных в три раза дольше все?
-
а сколько строк в результате?
-
-
ок
-
3 🙂
-
если 3 тогда не знаю
-
select * from (
select 1, store1.1
union all
select 2, store1.2
union all
select 3, store1.3
)
order by 1 - 16 секунд, если убрать select *, то 7… store1 - это tuple, который генерируется из кучи подзапросов, они при одном прогоне и дают 7 секунд, но почему обращение к этому tuple дает настолько разные результаты при добавлении сортировки 3 строк, я не понимаю -
ну вот так, например, работает
SELECT has([1,2,3], (SELECT number FROM numbers(2,1))) -
-
Спасибо.
Правда, даже если задать в подзапросе конкретное поле типа JsonField.Guid, то нужно давать ему алиас, потому что обращение типа t2.JsonField.Guid в верхнем запросе выдаст данные из первой таблицы или ошибку. -
каскадные вьюшки есть? обычно такое происходит когда несколько вью на одном топике
-
Коллеги, привет! Хелп , сос, вот уже пару недель лихорадит дико только одну ноду нашего кластераБ каждый час идет алерт о превышении нагрузки больше 90 %, как вычислить процесс, который такой перекос создает?
-
Если подзапрос возвращает более одной записи, то ошибка Code: 125. DB::Exception: Scalar subquery returned more than one row
SELECT has([1,2,3], (SELECT number FROM numbers(1,2))) -
-
да есть каскадные view -> kafka -> mv -> events -> mv1 -> table1
-> mv2 -> table2 -> mv4 -> table4
-> mv3 -> table3 -
вот так можно делать
смотрите, имеют ли 2 массива хотя бы 1 общий элемент, если вам надо, чтобы полностью входил массив в другой массив, то это hasAllМассивы | ClickHouse Docsfunctions-for-working-with-arrays}
-
Работает, спасибо за помощь.
-
Какая-то ошибка в вашем коде. Что видно в логах или system.errors?
Kafka engine выгребает блок и пропускает его через несколько MV. Где-то там случается ошибка. Все завершается, offset не продвигается ибо КХ поддерживает at-least-once, а не exactly-once.
Не стоит злоупотреблять цепочками MV и сложными join в MV, подключенных к Kafka Engine -
а если сделать
select * from (
select 1, store1.1
limit 10000000
union all
select 2, store1.2
limit 10000000
union all
select 3, store1.3
limit 10000000
)
order by 1 -
Добрый день, как вывести название месяца на русском? Пробовал дописать 'Europe/Moscow'- не помогло
WITH toDateTime(now()) AS date_value
SELECT monthName(date_value);
monthName(date_value)|
---------------------+
January | -
>через несколько секунд повторяет запрос
запрос? что ? вы о чем ? можете показать копи/пасту? -
никак, там в коде только на англ.
просто напишите [Янв, фев, март][month(date_value)] -
Добрый день
Подскажите пожалуйста такую вешь:
Есть таблица, ReplacingMergeTree, например 100М строк
всплыл косяк, и нужно сделать ALTER UPDATE для одной колонки у 90% строк.
Какой вариант будет более адекватным:
1. Делаем ALTER UPDATE для каждой строки
2. Делаем DICTIONARY c нужными данными и делаем ALTER UPDATE ... UPDATE docDt = dictGetOrDefault(...) WHERE dictHas(...) -
2
-
не помогло( та же разница 7 vs 16 секунд
-
насколько store1.1 большой? это массив?
-
Спасибо
-
Насколько понял, groupArray() на большом количестве данных будет гораздо хуже обычного запроса id1 IN (SELECT id2 )? Может лучше тогда разместить массив в другой таблице в виде обычных записей? Сам массив небольшой, а вот подзапрос может много записей вернуть. Практическое использование массивов в запросах практикуется в CH?
-
tuple из 18 чисел select tuple(val1…val18) from result, а result в свою очередь выдает эти 18 чисел в одну строку
-
Словарь в 90М строк с LAYOUT(HASHED) - это не перебор? Или стоит ограничить аппетит и побить на куски поменьше?
-
в смысле сам store1 это tuple, store1.1 это просто число типа 2354385
-
объемное ,скидываю скрин
-
да нормальный словарь 90млн.
в общем-то можно делать или cached или direct словарь https://kb.altinity.com/altinity-kb-schema-design/backfill_column/
у нас клиент 500млрд. проапдейтил у себя через cached словарь, неделю alter шел. -
Супер, спасибо, поизучаю
-
Коллеги, добрый день! Есть необходимость отслеживать статус выполнения запроса по системным таблицам proccess и query_log. Но я не знаю, на какой из нод выполняется запрос. С distributed таблицами не вышло. Каждый раз при обращении к distributed таблице получаю разный результат. Вариант с clusterAllReplicas оказался рабочий. Я пошла по верному пути? Или всё-таки использовать clusterAllReplicas неэффективно, и есть лучшие варианты решения?
-
Или результат IN (SELECT id ) всё равно весь размещается в памяти, и тогда разницы не будет?
-
with в целом это просто сахар, я не использую, лень вспоминать как он пишется.
select ['янв', 'фев', 'м', 'а'][month(today())]
--
янв -
я не про это.
вы пишете "через несколько секунд повторяет запрос"
что вы имеете в виду? -
Похоже что так и есть: https://clickhouse.com/docs/ru/sql-reference/operators/in
"Не перечисляйте слишком большое количество значений (миллионы) явно."Операторы IN | ClickHouse Docsselect-in-operators}
-
запись дублируется через несколько секунд
-
Хотя нет: "Если множество большое - лучше загрузить его во временную таблицу (например, смотрите раздел Внешние данные для обработки запроса), и затем воспользоваться подзапросом."
-
с distributed не вышло потому что вы используете неправильный кластер в distributed, он у вас смотрит только на одну из реплик
clusterAllReplicas это нормально, другого пути нет. Ну и внутри clusterAllReplicas этот же самый distributed. Но будет проблема когда одна из реплик недоступна, запрос к clusterAllReplicas будет выдавать ошибку. -
теперь понятно.
Надо в лог КХ смотреть. -
принял, спасибо
-
добрый день, а можно ли запретить вход в КХ для юзера, который нашелся в ldap-сервере, но которому не смаппилась ни одна роль? Т.е. чтобы нельзя было зайти вне роли
-
Проблему с недоступными нодами решила через settings skip_unavailable_shards=1. С неправильным кластером я не поняла, он у меня один, да и в clusterAllReplicas я его же указываю, и всё работает.
-
например вы что-то поменяли в таблице table3, mv3 не может вставить и случается ошибка, офсет в кафке не комитается и через пару секунд будет происходить чтение тех же данных. При этом каждый раз вставка в table1 будет отрабатывать. Надо быть супер осторожным если используете такие цепочки. Любой чих и у вас будут дубли в table1
-
спасибо за подробный ответ
-
Можно ли запросить данные, чтоб выбрать только измененные данные.
т.е. из
1
5
5
4
4
6
выбрать
1
5
4
6 -
-
ALTER COLUMN MATERIALIZE
-
а там можно сделать WHERE ?
-
-
А не лучше для этого использовать DISTINCT?
-
-
-
У вас вставка идет по одному инсерту? Если да - передайте на пакеты
-
-
-
-
-
-
-
-
Я не верю, что он три строчки сортирует дополнительные 10 секунд, а значит где-то под капотом кх скорее всего заново генерирует эти массивы/кортежи (я попрбовал оба варианта), ибо при добавлении еще нескольких union all время запроса линейно увеличивается. Странно, учитывая, что массив должен материализовываться в отличии от обычного cte (что в принципе мы и наблюдаем без сортировки)
-
ну таблица system.query_log не реплицируется же
у вас M шардов и N реплик и в remote_server описан кластер X
когда вы делаете запрос в distirbuted( X, ) у вас запрос улетает в M кликхаузов, и вы видите частичный результат
когда вы делаете запрос в clusterAllReplicas( X, ) у вас запрос улетает в M*N кликхаузов, и вы видите полный результат -
Поняла, спасибо за подробный ответ!
-
можно, но вариантов как это сделать много, сколько строк в запросе надо обработать?
-
Всяко может быть.
И 10 и 10 000 -
-
Повторяющихся (т.е поле по которому отбрасываем) тоже может быть и все разные и все одно значение
-
Спасибо. Почитаю
-
скорее всего какой-то баг
что дает такой запрос
select * from (
select materialize(1) aaa, store1.1
limit 10000000
union all
select materialize(2), store1.2
limit 10000000
union all
select materialize(3), store1.3
limit 10000000
)
order by aaa -
баг в кх или у меня? дает тот же результат (порядка 15 секунд вместо 7 без select * from)
-
временно поменять ее на default / alter ... update / снова поменять на MATERIALIZED
да это стремно: инсерты будут падать возможно и селекты будут возвращать возможно больше колонок -
в КХ
возможно что-то меняется в пайплайне и запрос начинает выполняться меньшим кол-вом потоков -
Спасибо
-
CREATE VIEW view.memcpu
(
timemsk DateTime('Europe/Moscow'),
CPU % Float64,
RAM % Float64,
`RAM free,
bytes` Float64,
`RAM total,
bytes` Float64
) AS
WITH
mem AS
(
SELECT value AS memfree
FROM system.asynchronous_metrics
WHERE metric = 'OSMemoryAvailable'
),
memall AS
(
SELECT value AS memtotal
FROM system.asynchronous_metrics
WHERE metric = 'OSMemoryTotal'
),
usr AS
(
SELECT value
FROM system.asynchronous_metrics
WHERE metric LIKE '%OSUserTimeCPU%'
),
sys AS
(
SELECT value
FROM system.asynchronous_metrics
WHERE metric LIKE '%OSSystemTimeCPU%'
),
cpu AS
(
SELECT
now('Europe/Moscow') AS timemsk,
sum(user) AS user,
sum(system) AS system,
round(user + system,
1) AS allcpu
FROM
(
SELECT
round((sum(value) / count()) * 100,
1) AS user,
0 AS system
FROM usr
UNION ALL
SELECT
0,
round((sum(value) / count()) * 100,
1)
FROM sys
)
)
SELECT
cpu.timemsk AS timemsk,
cpu.allcpu AS CPU %,
round((1. - (mem.memfree / memall.memtotal)) * 100,
1) AS RAM %,
mem.memfree AS `RAM free,
bytes`,
memall.memtotal AS `RAM total,
bytes`
FROM cpu,
mem,
memall; -
-
Ребят, всем привет!
Вопрос: нужно ли пересоздавать MV после переименовки таблиц из которых берутся данные ? -
Всем привет! Подскажите, пожалуйста, как/куда вынести пароль/пользователь для подключения к postgres engine.
Пример:
CREATE TABLE postgresql_db.postgresql_replica (key UInt64, value UInt64)
ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgresql_replica', 'postgres_user', 'postgres_password')
PRIMARY KEY key; -
да
-
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
-
Спасибо, видел. А если пароля нет, а только есть секрет в к8с
-
from_env
-
<clickhouse>
<macros>
<replica from_env="REPLICA" />
<layer from_env="LAYER" />
<shard from_env="SHARD" />
</macros>
</clickhouse>
Типо такого?
Есть ещё какой-нить вариант? -
типа такого
-
-
Кстати тоже не нашел как делать классические рекуррентные.
Видимо всем оконок хватает -
не поддерживаются коррелированные подзапросы
используйте джойны -
-
положите связку tbl1.id -> tbl2.id в словарь и подтягивайте в запросе
-
Insert Local Files | ClickHouse Docs
You can use clickhouse-client to stream local files into your ClickHouse service. This allows you the ability to preprocess
-
define большую
-
Спасибо надо попробовать
-
👍🏻
-
-
Server config files
How to manage server config files in Clickhouse
-
Спасибо
-
Спасибо, решил уже другим способом, более оптимальным.
-
-
With l as (), l2 as (), ...
Select ... -
Стандарт же
-
Артем, спасибо большое, теперь вижу свою ошибку
-
Добрый вечер. Подскажите пожалуйста какой нибудь источник по оптимизации запросов в клике?
-
-
Спасибо, это читал)
-
а дальше сам
-
подскажите пожалуйста, запустил ALTER MODIFY TTL чтобы добавить TTL Recompress в табличку в зависимости от времени жизни данных и секономить память.
В результате в кластере (2х2) ноды на одном шарде память на диске высвободилась, а но втором шарде наоборот – потребление памяти на диске растет. Посмотрел вес таблички в system.parts – она стала компактнее на 300гб. Вопрос – что могло отъесть память на диске? -
ALTER MODIFY TTL закончился?
в директориях shadow и backup есть что-нибудь? -
-
-
похоже бекап
Спасибо за наводку - 17 January 2023 (141 messages)
-
Приветики
-
Всем привет, может кто-то подсказать из-за чего вылазит ошибка аутентификации при работе с словарем?
SQL:
SELECT dictGet('dict-test', ('date'), 2323641414416316)
Error:
default: Authentication failed: password is incorrect or there is no user with such name: While processing dictGet -
скорее всего неправильная аутентификациия в настройках словаря
-
Всем привет! Подскажите, пожалуйста, что не так делаю:
Секрет создается таким образом и он нормально создается и доступен в к8с:
apiVersion: "kubernetes-client.io/v1"
kind: ExternalSecret
metadata:
name: test-ch
spec:
backendType: systemManager
data:
- key: /test/test_ch_password
name: TEST_CH_PASS
Потом пытаюсь им воспользоваться в операторе, но пишет что не может найти такого секрета(если просто текстом вставить пароль все работает)
...
configuration:
users:
testch/k8s_secret_password: test-ch
...
apiVersion: "clickhouse.altinity.com/v1"
kind: "ClickHouseInstallation"
metadata:
name: test-ch
...
clusters:
- name: test-ch
secret:
valueFrom:
secretKeyRef:
name: "test-ch"
key: "TEST_CH_PASS"
Пытался так, но тоже без успеха:
configuration:
users:
testch/password:
valueFrom:
secretKeyRef:
name: "test-ch"
key: "TEST_CH_PASS" -
Добрый день. Запустил chroxy, подключился, в указанную папку для кэша на диск ничего не сохраняется, ошибок в процессе работы нет. В плагине grafana-clickhouse от Altinity отсутствует вариант выбора источника "proxy" как в документации, есть server и browser. Выбрано server. chproxy 1.21.0, plugin 2.5.3. Выглядит всё так, будто и нет никакого кэширования запросов
-
-
попробуй source_table в скобки заключить
-
не работает, он тупо хочет select или еще один сte, а insert не воспринимает даже в этом месте
-
insert into target_table select t.* from (source_table) as t
-
есть предположение, что нужно перечислить колонки в селекте вместо звёздочки и, возможно, колонки в инсерте
-
он ругается еще до этой строчки, он на нее даже не смотрит, а хочет после блока WITH либо продолжение CTE либо SELECT, все что внутри insert вообще без разницы пока что
-
не совсем понял... у тебя insert into где стоит ?
-
ты же писал, что source_table это сte,
-
with
result as (select …)
insert into target from select * from result -
insert into target_table select t.* from (cte писать здесь) as t
-
а вынести сte нельзя?
-
попробуй сначала так :) судя по доке я вижу только CTE на селект
-
я так сделал, ему все равно на insert - ругается ДО insert’а Code: 62. DB::Exception: Syntax error: failed at position 8063 (end of query) (line 180, col 2): . Expected one of: token, Comma, SELECT. - тут вроде много дата инженеров, как вы делаете insert’ы из сte?
-
ну, я не знаю тогда, я это вижу как
insert into target_table select t.* from (WITH test1 AS (SELECT i + 1, j + 1 FROM test1)
SELECT * FROM test1) as t -
спасибо за подсказки, но в этом варианте пока что та же ошибка(
-
Вообще нормальные выражения (в других БД) могут выглядеть и так
INSERT INTO x WITH y AS ( SELECT * FROM z ) SELECT * FROM y
или
WITH y AS ( SELECT * FROM z ) INSERT INTO x SELECT * FROM y -
Без полного запроса можно очень долго "гадать" в чем ошибка. А вот например упростить его до таблицы system numbers и показать его в https://fiddle.clickhouse.com/ будет сильно продуктивнее имхо. Ну или показать запрос целиком
-
Добрейшего! Есть такой кейс. Нужно перемножить два массива данных. ДЕкартово произвевдение. Делаю через нулл таблицу и матвью. Вижу что все равно все затягивается в оперативку и потом уже сливается в матвью полным куском. Как распределить такие вычесления? Есть мысли, беспрактис. Буду очень признателен. Уже не знаю куда копать...
-
согласен, ибо работает
-
Помогло имя кэша (longterm) указать в блоке users:, появились файлики
-
и так тоже
INSERT INTO users2
WITH xxx AS (SELECT * FROM users WHERE uid = 1231)
SELECT * FROM xxx
; -
вот теперь сработало, спасибо большое!
-
Привет всем! Такой вопрос: возможно ли как то соединить два клика между собой так, чтобы данные из одного стримились в другой? Хотим сделать один клик как хранилище данных, к которому подключаются другие клики, которые выполняют роль стендов. Или на роль хранилища данных лучше взять не клик?
-
Всем привет! Подскажите, пожалуйста, что не так делаю:
Секрет создается таким образом и он нормально создается и доступен в к8с:
apiVersion: "kubernetes-client.io/v1"
kind: ExternalSecret
metadata:
name: test-ch
spec:
backendType: systemManager
data:
- key: /test/test_ch_password
name: TEST_CH_PASS
Потом пытаюсь им воспользоваться в операторе, но пишет что не может найти такого секрета(если просто текстом вставить пароль все работает)
...
configuration:
users:
testch/k8s_secret_password: test-ch
...
apiVersion: "clickhouse.altinity.com/v1"
kind: "ClickHouseInstallation"
metadata:
name: test-ch
...
clusters:
- name: test-ch
secret:
valueFrom:
secretKeyRef:
name: "test-ch"
key: "TEST_CH_PASS"
Пытался так, но тоже без успеха:
configuration:
users:
testch/password:
valueFrom:
secretKeyRef:
name: "test-ch"
key: "TEST_CH_PASS" -
Привет. Не знал такой факт, но получается, в базе с ENGINE = Memory можно создавать таблицы с любыми движками, например MergeTree как в примере ниже. Проверял - всё работает.
CREATE DATABASE mem_db_1 ENGINE = Memory;
USE mem_db_1;
CREATE TABLE tdb_table_1
(
id UInt64,
column1 String
)
ENGINE = MergeTree()
PRIMARY KEY id;
Это считаеться "нормальным"? Или это что то вроде бага? -
Много серверов==кластер. Если вам просто для тестов, то можете сделать как на Replicated, так и на Distributed. Зависит от того что у вас там уже собрано и как.
-
Всем привет:)
Кто может нам помочь настроить репликацию БД из MySQL(MariaDB) в Clickhouse. MySQL находятся на одном сервере с Clickhouse. Объем БД ~50Гб.
Одно из рассматриваемых решений: Altinity Sink Connector - кто сможет и готов, напишите, пожалуйста, в лс - @yulia_tgm - и сразу сроки и стоимость😊 -
добрый день, помогите, пожалуйста, разобраться с фильтрацией.
В таблицу складываются опросы датчика с определённой периодичностью. Значение датчика изменяется гораздо реже, чем период его опроса. Необходимо из этой таблицы получить только те записи, когда произошло изменение значения параметра. Через neighbor() это получилось сделать, а вот через оконную функцию возвращается ошибка ILLEGAL_AGGREGATION.
Возможно ли фильтровать селект по значению из оконной функции и если да, то как? Попытка засунуть в подзапрос ошибку не убрало.
https://fiddle.clickhouse.com/39e41791-fb3c-4371-b88c-d860887795f9 -
-
Константин, спасибо!
не понимаю, почему у меня не проходило это :( по всей видимости какая-то другая ошибка -
потому что вы в секции where пытались сделать условие по оконной функции, я перенес её на уровень выше
-
я так тоже пробовал, да, видимо, в скобках запутался 😳
-
Это так и задумано. Это специальный движок чтобы ci кх работал быстрее, его обычным пользователям нет смысла использовать, ci работает в стрессовом режиме, там настолько все перегружено что запросы которые выполняются меньше 100мс в обычном ноуте, работают несколько минут в ci.
-
Всем привет, подскажите ,пожалуйста, как распарсить строку ( удалить v , сплит по точке -сделаю, выделить полученный после сплита массив в отдельные признаки)
-
Если у вас один сервер и почти нет данных, то решение на основе Altinity Sink Connector включающее в себя несколько сложных кластерных компонентов, скорее всего, для вас будет слишком тяжелым и дорогим решением.
На вашем месте я бы все-таки попробовал Engine MaterializedMySQL (при всей моей нелюбви к ней). Ну или написал бы что-то простое на докачке по монотонно возрастающим id. -
Спасибо! Наверное все таки нашел один баг. Если создать таблицу как выше, вставить в нее данные, то в файловой системе вижу /var/lib/clickhouse/data/mem_db_1/tdb_table_1 (со всеми файлами внутри). Теперь если грохну сервер КХ с помощью Ctrl+C, затем запущу опять сервер, затем команды: use mem_db_1; show tables - уже не показывает эту таблицу. Но в файловой системе папка /var/lib/clickhouse/data/mem_db_1/tdb_table_1 остается (с содержимым внутри). Это наверное баг? Есть какая то команда типа OPTIMIZE? чтобы удалить такой garbage?
-
так Database Engine=Memory, делает ровно ОДНО, не создает файлы в каталоге metadata.
-
Понятно. Спасибо.
-
отдельные признаки? может быть поля? колонки? строки?
-
Каждую цифру в свою колонку
-
Сплит по точке
-
сколько колонок может быть максимально?
-
Нет ограничений, можно обрезать строку по 11тый символ и с оставшимся работать
-
-
-
Да не, 11 максимум, нет речи о 1000
-
нет ограничений, замечательно. Предположим в 1й строке 8 колонок, во второй 128. Как это в SQL выглядеть должно?
select '4.5.1.1345' s, splitByChar('.', s) x, x[1] a, x[2] b, x[3] c, x[4] d, x[5] e, x[6] f, x[7] g;
┌─s──────────┬─x────────────────────┬─a─┬─b─┬─c─┬─d────┬─e─┬─f─┬─g─┐
│ 4.5.1.1345 │ ['4','5','1','1345'] │ 4 │ 5 │ 1 │ 1345 │ │ │ │
└────────────┴──────────────────────┴───┴───┴───┴──────┴───┴───┴───┘ -
это про хранение таблиц на ДИСКЕ.
-
Нулы ,если символов меньше,чем 11
-
А это разве тот же человек с engine=memory?
-
Вообще итоговая задача сравнить версии между собой,может есть идеи как это сделать иначе?
-
-
Кстати, а где можно прочесть про это более детально?
-
-
select '4.5.1.1345' s, splitByChar('.', s) y,arrayResize(cast(y, 'Array(Nullable(String))'), 11, null) x, x[1] a, x[2] b, x[3] c, x[4] d, x[5] e, x[6] f, x[7] g;
┌─s──────────┬─y────────────────────┬─x───────────────────────────────────────────────────────┬─a─┬─b─┬─c─┬─d────┬─e────┬─f────┬─g────┐
│ 4.5.1.1345 │ ['4','5','1','1345'] │ ['4','5','1','1345',NULL,NULL,NULL,NULL,NULL,NULL,NULL] │ 4 │ 5 │ 1 │ 1345 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
└────────────┴──────────────────────┴─────────────────────────────────────────────────────────┴───┴───┴───┴──────┴──────┴──────┴──────┘ -
круто,спасибо! а если первый символ V, как его убрать?
-
нигде, никто не хочет писать о том что колонки небесплатны
-
Какие-то косвенные метрики мб тогда?
-
?
-
-
select 'v4.5.1.1345' S, replace(S, 'v', '') s, splitByChar('.', s) y,arrayResize(cast(y, 'Array(Nullable(String))'), 11, null) x, x[1] a, x[2] b, x[3] c, x[4] d, x[5] e, x[6] f, x[7] g;
┌─S───────────┬─s──────────┬─y────────────────────┬─x───────────────────────────────────────────────────────┬─a─┬─b─┬─c─┬─d────┬─e────┬─f────┬─g────┐
│ v4.5.1.1345 │ 4.5.1.1345 │ ['4','5','1','1345'] │ ['4','5','1','1345',NULL,NULL,NULL,NULL,NULL,NULL,NULL] │ 4 │ 5 │ 1 │ 1345 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
└─────────────┴────────────┴──────────────────────┴─────────────────────────────────────────────────────────┴───┴───┴───┴──────┴──────┴──────┴──────┘ -
👍👍👍спасибо!
-
да есть у нас клиенты у которых 20 тыс колонок, есть ограничения, они понятны, они менеджебл, тут рассказывать 4 часа, я не буду делать это в чате.
-
память расходуется, и random IOPS
-
-
скорее я не хочу рассказывать про недостатки и недоделки
-
Энивей, скорее всего я впервые от вас и услышал про небесплатность колонок, и это вылилось в то что я на всякий случай клик пускаю на nvme-дисках 😅
-
@BloodJazMan
-
Доброе время суток.
получаю ошибки
<Error> void DB::StorageKafka::threadFunc(size_t): Code: 252. DB::Exception: Too many parts (300). Merges are processing significantly slower than inserts: while pushing to view my_db.my_table. (TOO_MANY_PARTS), Stack trace (when copying this message, always include the lines below)
Подскажите в какую сторону смотреть. -
Запрос
SELECT
partition,
count()
FROM system.parts
WHERE table = 'event'
GROUP BY partition
ORDER BY partition DESC
Выдал такой результат
202301 300
202212 7
202211 5
202210 4
Понимаю, что уперлись в лимиты, но пока не могу сообразить, что делать. -
Вставлять бОльшими пачками и реже.
-
Сервак дев или прод?
-
Эта ошибка происходит даже с записью раз в несколько часов
-
прод. Данные КХ забирает сам из кафки.
-
-
А в system.merges нет долгих активных мерджей для этой таблицы?
-
А поднятие лимитов поможет, но не повторится ли ситуация
-
Вы можете этот показатель партов мониторить например :D
-
Неа
-
-
Такой запрос
SELECT database, table, elapsed, progress
FROM system.merges
выдал такой запрос
my_db my_table 2878.548249417 0.22796318565136667
my_db my_table 2878.548250673 0.26899671683658827 -
Правильно понимаю, что мерджится очень долго?
-
Ну, эта ошибка вылезает в том случае, если количество партов внутри одной партиции превышает лимит (по умолчанию 300). Т.е. КХ объединяет парты медленнее, чем вставляются новые. Соответственно, либо идёт частая вставка, либо медленное слияние.
Как вариант медленные диски, очень мелкое партиционирование (что одна вставка порождает много мелких партов, которые параллельно мерджатся), может быть 100500 параллельных мерджей в других таблицах. -
select * from system.replication_queue
-
в 2023 году в 99% случаев у Too many parts (300) одна причина, мержи не идут из-за того что есть проблема репликации (потерян парт и все застряло).
-
select table, round(elapsed*(1/progress)-elapsed,2) estimate ,elapsed, progress, is_mutation,formatReadableSize(total_size_bytes_compressed) size, formatReadableSize(memory_usage) mem
from system.merges order by progress desc -
посмотрю сейчас
-
Результат запроса
my_table 9037.7 3470.895005267 0.27748070896796356 0 189.00 GiB 29.11 MiB
my_table 10914.3 3470.895030401 0.24128251485181915 0 147.10 GiB 767.09 MiB -
Значение колонки progress потихоньку увеличивается
-
а процессор загружен сильно?
есть колонки с CODEC ? -
189.00 GiB -- кто-то запустил optimize table final ?
-
Да, как только появилась ошибка, админ запустил оптимизацию
-
CODEC при создании не использовался
-
стабильно 2 ядра загружено КХ
-
админ молодец, заболела голова - давайте выстрелим в ногу.
КХ планирует мержи раз в секунду и плюс при каждом инсерте, optimize в случае too many parts это самое худшее что можно придумать -
Самый прикол, что на странице написано, что Optimize не решает проблему too_many_parts))
-
Админ по приколу решил это сделать видимо - безысходность
-
Будем знать. Я так понимаю, тут остается только вариант ждать, когда КХ все прожует и посмотреть все ли нормально с дисками?
-
-
сколько места свободного на диске?
-
Привет! Подскажите. У меня есть запрос, который выводит две колонки. В одной из колонок массив. Можно ли его преобразовать в строки? Чтобы, например, если в колноке строки массив из 5 элементов, получилось на выходе 5 строк?
-
т.е. когда mysql не стартует за 10минут, вам все очевидно?
я тут 4 часа трахался с mysql неделю назад -
/dev/mapper/ssd-clickhouse 6.0T 5.4T 307G 95% /home/clickhouse
/dev/mapper/cold-clickhouse 9.1T 1.7T 6.9T 20% /home/clickhouse/data-cold -
Нет, но как бы как хостить клик лично мне из документации неочевидно.
-
Да и база решений более наработанная, имхо. Все известные баги и приколы описаны и переведены в киллерфичи)
-
и кто должен для Кликхауза это все сделать и описать? Clickhouse,inc? Идите в облако, там все проблемы решены
-
а, нашел: arrayJoin
-
А если сделать поиск по последней строчки лога, то на гитхабе есть ответы как это починить
-
Да бож упаси мне выпендриваться, дали инструмент - уже отлично. Так, отметил, не более.
-
-
я думаю у КХ дока на 1000 страниц уже
-
что это /dev/mapper/ssd-clickhouse 6.0T 5.4T 307G 95% /home/clickhouse ? там данные КХ есть?
-
Честно говоря, по моему опыту, ClickHouse один из самых неприхотливых продуктов в плане эксплуатации, но за счёт чуть большего объема ручной работы, чем в других кластерных решениях. Я лично не считаю это недостатком, но, очевидно, у всех свои предпочтения 🙂
-
Но мы сильно большие кластеры не держали, так, буквально серверов 50-70
-
Да там данные КХ
-
Так места возможно для мержей не хватает. Это в логе кх видно
-
Вот не знаю. Место уменьшается со временем не стремительно. Пока решили понаблюдать подождать. Прогресс потихоньку двигается
-
300 Гб вроде должно хватить
-
Максимальный размер парта по умолчанию вроде что-то около 150 Гб?
-
Потому что мержи резервируют место *2
Т.е. Ахиллес не догонит черепаху -
Это externalsecret
Он требует отдельного обработчика
Оператор работает с kind: Secret -
- Есть какие-то обходные пути сейчас?
- Есть в планах его добавить? -
-
оптимальность зависит от задачи - https://kb.altinity.com/altinity-kb-queries-and-syntax/distinct-vs-group-by-vs-limit-by/DISTINCT & GROUP BY & LIMIT 1 BY what the difference
Page description for heading and indexes.
-
SELECT id, argMax(value, date) GROUP BY id как вариант
-
Добрый день, есть ли возможность сделать SELECT * FROM 'table_name' переменной из другого запроса? где table_name список полученный другим запросом
-
-
Спасибо, за ответ пойду другим путём
-
если переменные таблицы похожи по маске и запрос одинаковый, то можно воспользоваться Engine Merge (не путать c MergeTree).
-
Ну план был брать таблицы из системной таблицы с списком таблиц
-
Просто именна на перёт не известны
-
Нормальный план, я так делаю описанным выше способом. Ничего сложного нет - простой скрипт на bash.
-
Там не планируется доступ к консоле, типо сервис купить
-
Какая консоль? Что это? Это же все запускается как обычный клиент.
-
Шел можно из клиента кх запускать?
-
😂
- 18 January 2023 (98 messages)
-
Можете подсказать, на сколько хорошо подходит ClickHouse для того, что бы производить статистику по тексту
Например есть 2 текста:
Саша на шоссе
Шоссе упало на облака
Нужно получить количество слов, что то по типу
шоссе - 2
на - 2
Или в данном случае лучше использовать ElasticSearch? -
база данных статистику по тексту 🤦♂️
-
ну можно же по идее слова разделять по строкам в бд и преобразовывать 🧐
-
чем не статистическая база
-
Будет что то на подобии
||word||
|саша|
|на|
|шоссе|
И дальше уже подсчет
Тут больше вопрос в сторону того, стоит ли овчинка выделки, или просто взять эластик не парясь с разделением и сделать уже там на уровне БД -
map / reduce - все примеры начинаются именно с этой задачи. Примеров масса.
-
Вопрос немного странный про базу. При чем тут база? Вы же будете это писать на каком-то языке с каким-то набором функций. Если писать это на Clickhouse SQL, то придется изучить его. Вот этот ваш map/reduce тут выглядит примерно так
- https://fiddle.clickhouse.com/10523ac1-b227-4463-b738-aa50e03f50d5
Если вы любите функциональное программирование, то все хорошо. Если нет - умрете. -
Насколько помню external secret в итоге environment variables в контейнер прикидывает
Соответственно можно через xml
Погуглите from_env как внутри xml конфигурационных файлах кликхаус использовать -
добрый день. небольшой вопрос по юзерам на репликационном кластере: есть роль с определёнными правами. если создаю юзера только на одной ноде, то роль нерабочая, она не даёт доступа в таблицы, в которые есть доступ у роли. если создаю юзера на всех нодах, то тогда всё работает, хоть и появляется с задержкой. так и должно быть? если да, то как ограничить доступ некоторым юзерам на определённые ноды?
-
Всем привет. Подскажите, можно ли при OPTIMIZE передать несколько partition_id?
Хотелось бы сделать что-то вроде
"""PARTITION ID in ('202202', '202203')"""
У таблицы:
"""PARTITION BY toYYYYMM(create_stamp)""" -
-
Добрый день. Есть таблица user | event(view, click) | date. Я выбираю юзеров группируя по дате и считаю count событий. Вопрос такой, можно ли в выборку добавить поле с условием, например мне нужно количество view. до первого события click.?
-
Вам потребуется добавить логику для вычислений (какой вопрос такой ответ)
-
Логику где-то отдельно кодом или внутри запроса можно? Например подобным способом не сработало select date, select(min(date) )
-
Конечно в sql запрос требуется добавить логику
-
Как я помню, нет
-
Понял, спасибо
-
У меня нет идей, как это сделать, но есть вопрос для чего))
Мне казалось что кластер это нечто целое с точки зрения доступа -
хотели пустить пользователей на одну ноду, а сервисы на другую, чтобы распределить нагрузку.
ну да. мне почему-то показалось можно ограничить. всё равно доступы долетают с задержкой по какой-то причине. -
Посмотрите в сторону ch proxy
-
Если вы используете vpn, то в теории можно пробовать ограничивать доступ к другим нодам на уровне vpn
-
спасибо, попробуем так
-
-
ну и распределите если так вам кажется правильным, при чем тут права доступа? Предполагаете, что ваши пользователи узнают тайный адрес другого сервера и незаконно начнут им пользоваться? Если даже и так, то я бы ограничил это на уровне фаревола.
-
проблема с ролями всё равно наблюдается. добавляю права для роли и они не работают. или же нужно отзывать роль, а затем снова давать, но это не выглядит удобным
-
Добрый день, подскажите, а функция upper() с кириллицей не работает? Есть замена какая-то?
-
select upperUTF8('фывфФ')
-
-
В какой момент эта мат вью должна срабатывать?
-
В идеале как только появится новый файл
Можно интервал 1мин -
Если никому в чатике эта конкретная проблема неизвестна, логично начать с логов сервера. Как минимум там будет бэктрейс.
-
Мат вью это просто триггер на вставку. Про с3 она ничего не знает и по расписанию что-то проверять не умеет. Были планы добавить движок который умеет следить за новыми файлами на с3, но пока только руками такое делается
-
Благодарю 🙏
-
по итогу добавили в графану метрики из этой статьи https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-threads/ и оказалось что "частенько" это было субъективное мнение. пики в 10к присутствуют но не чаще чем раз в неделю
-
Это известная проблема. К сожалению ее непонятно как воспроизвести.
-
Нельзя
-
-
-
SELECT *, formatReadableSize(value)
FROM system.asynchronous_metrics
WHERE metric like '%Cach%' -
-
Добрый день!
Есть функция IPv4ToIPv6(x) , а обратно нет? -
(х)6ʌdıoʇ4ʌdı
https://clickhouse.com/docs/en/sql-reference/functions/ip-address-functions/Functions for Working with IPv4 and IPv6 Addresses | ClickHouse DocsIPv4NumToString(num)
-
под обратно я имел ввиду что то типа IPv6ToIPv4(s)
-
-
-
тогда где логика?
-
v4 в v6 загнать можно а тото же адрес перегнать из формата V6 назад в формат v4 нет?
-
-
Да
-
-
-
Какая задача? Вы можете сделать это ручками при желании, разбейте на части и соберите обратно. Очевидно что в обратную сторону не любой ipv6 можно преобразовать.
-
ну через несколько других функций это понятно
-
но в арсенале функций с IP явно нехватает такой функции
-
да , это очевидно, но как вернуть формат ::ffff:192.168.0.0 назад в 192.168.0.0 ?
-
а также функция isIPv6String в таком случае даёт неожидаемый результат
-
казалось бы? вот например UInt64 можно загнать в UInt8, а с IP такая несправедливость
-
как это связано с моим вопросом?
-
-
-
SELECT reinterpret(reverse(substr(IPv4ToIPv6(toIPv4('192.168.1.2')), 13, 4)), 'IPv4') AS x
┌─x───────────┐
│ 192.168.1.2 │
└─────────────┘ -
это понятно что из любой ситуации можно найти как минимум 2 выхода
-
например так toIPv4( replaceOne( ms_ip_v4, '::ffff:', '') )
-
Можно ip4 преобразовывать в ip6, и потом по определённому шаблону разделять адреса после получения ip6.
-
не понимаю что здесь непонятного.
ipv6 16 байт, ipv4 4 байта, не уместить одно в другое в общем случае. Частный случай, когда ipv6 вдруг случайно можно переделать в ipv4 нахер не нужен был до вас, поэтому не реализован. -
How are you
-
Получается что-то вроде ::ffff:127.0.0.1 на выходе.
-
а что так грубо то?
-
если вам нахер не нужен был, можно было не отвечать!!!
-
потому что я хам.
-
мне очень жаль
-
детская травма
-
бывает
-
последняя версия в 22.8 это 22.8.12.45, попробуйте обновится
когда падает посмотрите netstat -ant , возможно там куча незакрытых коннектов с определенного ip и возможно это не HTTP -
сложно отловить, а тем более застать готового запускать netstat в этот момент живого девопса) а обновление уже запланировали, да, спасибо
-
это бага. К сожалению трудноуловимая.
У вас сколько пользователей (примерно)? И каким пользователем вы даете грант на select для роли? default ? -
спасибо, вы меня успокоили. я уже чуть с ума не сошёл, борясь с ней. для себя вывел, что можно жить с нерасширяемыми ролями.
юзеров 50. даю грант пользователям мною созданным -
я хочу уточнить.
1 у вас пользователь U у него access_management=1 или у него with grant option?
2 вы создали роль R
3 вы создали пользователя u123 грантовали ему роль R
4 теперь вы грантуете пользователем U таблицу T роли R
5 и пользователь u123 не имеет прав на T -
Такой вопрос тем кто углубляться в MaterializedView.
Он срабатывает на добавление данных в базы и обрабатывает только добавленные? -
да
-
Спасибо
-
Когда срабатывает репликация то MaterializedView не тригерится?
-
не триггерится
-
Спасибо.
-
https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7597
https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf -
1. у него with grant option
в остальном все верно. еще уточню. я до гранта роли R какому либо юзеру грантовал таблицу t1, и на неё доступ имеется у юзеров, которым даю роль. очень запутанное поведение. -
Подскажите пожалуйста, как можно избавиться от дубликатов, например сделать отдельную таблицу и туда писать отслеживая основную, есть одинаковые поля, но поле created_at будет разное, в этом проблема, а группировать каждый раз занимает ресурсы и время выполнения всего запроса
-
А движок replacingMergeTree вам для табл не пойдет?
-
-
-
если эту колонку вставлять в инсерте (null конвертнется в 1970 если колонка не nullable)
-
Да, тоже так думаю. Вставка идёт через nodejs библиотеку, там специальный метод для инсерта. Кто его знает, что он подставляет. Но да, скорее всего, тут проблема. Спасибо.
-
скорее всего можно сделать materialized
createdAt materialized DEFAULT now() -
Покажите пожалуйста либу, я заинтересовался, что за либа с специальным методом на инсерт
-
Стандартная либа от команды clickhouse: https://clickhouse.com/docs/en/integrations/language-clients/nodejs/ClickHouse JS | ClickHouse Docs
The official Node.js client for connecting to ClickHouse.
-
Жесть, я оказывается везде не ту либу юзал.
https://www.npmjs.com/package/clickhousenpm: clickhouseClient for ClickHouse. Latest version: 2.6.0, last published: 4 months ago. Start using clickhouse in your project by running `npm i clickhouse`. There are 14 other projects in the npm registry using clickhouse.
-
А официальная https://www.npmjs.com/package/@clickhouse/client.
Это второй факап с кликом. Первый - я выбрал не тот образ докера. Внимательнее надо быть, мдаnpm: @clickhouse/clientOfficial JS client for ClickHouse DB. Latest version: 0.0.11, last published: a month ago. Start using @clickhouse/client in your project by running `npm i @clickhouse/client`. There are 3 other projects in the npm registry using @clickhouse/client.
-
- 19 January 2023 (291 messages)
-
привет, спасибо за гайд, эксперементирую с MV, наткнулся на проблему: если делать batch insert c одинаковыми записями MV перестает вообще работать, использую ReplicatedSummingMergeTree
-
Insert Deduplication / Insert idempotency
Insert Deduplication / Insert idempotency , insert_deduplicate setting.
-
я понимаю что он дедуплицирует инсерты, при этом пишет 1 запись в исходную таблицу, но каунтер в MV перестает вообще работать
-
если исходная таблица replicated то онf задает дедупликацию, это регулируется параметром deduplicate_blocks_in_dependent_materialized_views, про это было в докладе
https://kb.altinity.com/altinity-kb-schema-design/materialized-views/idempotent_inserts_mv/
ну и в современном КХ можно использовать insert_deduplication_tokenIdempotent inserts into a materialized viewHow to make idempotent inserts into a materialized view".
-
да это стоит, кажется кластер развалился совсем отсюда и проблемы с mv, спасибо
-
-
доброго времени дня
подскажите пожалуйста почему то использование RAM стабильно растет (поднялось до 94%). 4го числа убрал метрики с прометея чтобы разгрузить машину -
-
в чем может быть причина?
-
кликхаус стоит в докере
-
интересно что там еще два таких но именно нагрузка на продовом докере
-
нагрузка неравномерная в течении дня, но вот загруженность озу растет равномерно независимо от времени дня
-
Какая версия ?
-
Кафка есть ?
-
кафка есть
-
версия22.6.5.22
-
Была такая проблема https://github.com/ClickHouse/ClickHouse/issues/36367When I use Kafka table: there might be a memory leak after upgrading to version 22.3.3 · Issue #36367 · ClickHouse/ClickHouse
We use clickhosue version 21.12.2.17 before.It works well But we found that after upgrade to 22.3.3, the memory of clickhouse used grow up daily . I don't know if this is a memory overflow ...
-
Абстрактный пример дубликатов в таблице:
user_id value created_at
1 100 2022-12-14T12:36:12
1 100 2022-12-14T12:36:13
1 100 2022-12-14T12:36:14
в данном примере каждый день записываются прошлые данные (я не могу влиять на логику этой записи), поле created_at всегда разное, т.к. пишется в разное время, нужно оставить только одну запись, я пробовал материализ. представление, которое следит за этой таблицей, но в неё тоже попадают дубликаты, если вставлять по одной записи. optimize table тоже не решение видимо, нужно гарантировать, что там не будет дубликатов в любое время -
Какое-то количество дубликатов для RMT останется всегда. Об этом сказано в документации. Так задумано, и это не бага.
Ваши варианты:
- доагрегация при выборке (final или group by) - чуть медленне выборка, но это самый правильный и рекомендованный путь.
- optimize, в том числе недавно появившийся автоматический, по количеству секунд назад в прошлое. Если данные меняются быстро и на большую глубину по времени, то будете грузить дисковую систему непрерывными мерджами. Если меняются только свежие строки (у вас вроде так), то терпимо, но учтите что менее указанной задержки дубликаты останутся.
- дедубликация при инсертах. Смотрите в целевую таблицу, проверяете что там уже такое есть и не вставляете. Тормозит инсерты. Но если order by правильный, а блоки большие, то не так сильно. -
ClickHouse row-level deduplication
ClickHouse row-level deduplication.
-
-
то есть нужно обновить версию Кликхаус? но у меня то версия по свежее
-
ситуация очень похожа
-
и кафка есть и рост медленный но стабильный
-
в RAM
-
final вроде не лучшее решение, так сказал в документации. Сейчас мне приходится работать с тем что дали, 20к записей уникальных среди 300к. Приходится делать подзапрос который группирует по набору уникальных полей, чтобы выполнить дедубликацию, а затем уже из нее выбирать
-
документация старая. final в последних версиях работает пристойно, особенно с do_not_merge_across_partitions_select_final и правильным партиционированием.
Но согласен - лучше без final. Если запросы сами по себе требуют агрегации, то трюк с sign=-1 позволяет уйти от final совсем. Но этот -1 еще как-то надо сделать....
20к записей уникальных среди 300к - это что-то странное. RMT вам должен удалить большую часть дубликатов, так что останется совсем немного. -
Дак пофиксили только после выхода 22.8
-
Но так же и бэкпортили на старые версии
-
то есть есть смысл обновиться и надеятся что все будет хорошо?
-
просто я тоже обновился ранее и пожалел
-
)
-
так я обожаю клик очень помогает, вот и молюсь на него))
-
Я не могу вам сказать, нужно ли вам обновляться и что у вас за проблема, я просто вам сообщил информацию которую я знаю... О других memory leak я не знаю
-
спасибо вам Константин
-
Но в то же время 22.8 Денис не рекомендовал как минимум из-за нескольких серьёзных багов.
https://t.me/clickhouse_ru/307261Denny [Altinity] in ClickHouse не тормозитне знаю, я лично наверное пропущу 22.8 и буду ставить через год 23.8 слишком много херни типа https://github.com/ClickHouse/ClickHouse/issues/44500 https://github.com/ClickHouse/ClickHouse/issues/43816 https://github.com/ClickHouse/ClickHouse/issues/43865
-
тогда вариант вернутся на старую версию
-
и дождаться другой
-
?
-
Обновить свою версию до последней
-
Возможен ещё такой вариант
-
Можно откатиться, можно попробовать последнюю минорную своей версии, можно до 22.8 или 22.12 обновиться.
Мы в итоге откатились. -
а у вас какая если не секрет? кажется тут где то написано но я не увидел
-
21.11
Обновлялись на 22.3, но там как раз с кафкой проблемы начались - в итоге вернулись назад. Сейчас думали на 22.8 обновляться, но там проблемы с Map, которые мы тоже используем. -
вы имели ввиду 22.11.3.47-stable да?
-
а там вам тоже что то не устраивает?
-
21.11.11.1-stable
она потребляет больше ресурсов, чем 22.3
есть проблемы с оконками, решённые в той же 22.3
порой ловим баг с зависанием при отмене запроса, решённый в 22.8
нет пары новых нужных фич -
-
insert into yourtable(...)
select ... from yourtable where ... -
спасибо
-
Привет!
Подскажите, пожалуйста, делаю вставку в csv примерно так:
cat test.csv |clickhouse-client --format_csv_allow_double_quotes=0 -q 'insert into csv format CSV'
в test.csv ровно те же столбцы, что и в таблице csv
а как сделать так, чтобы в ьаблицу csv писалось время вставки?
пробовал сделать столбец _time, в который пистаь now() - логично, что ошибка, тк к-во столбцов то разное теперь
мат.вью - это по сути же будет копия основной таблицы +столбец? как-то очень нерационально использовать место (в день порядка 5млрд записей) -
-
попробуйте сделать столбец _time DateTime materialized now()
-
всем привет
есть словарь, у которого источник - вьюшка типа
SELECT <поле_ключ>, <поле_значение>
FROM <таблица_словаря> FINAL
при каком случае могло ли быть так, что этот словарь не вернул значение по ключу, хотя строка с такой парой ключ-значение в таблице точно есть?
в 2 словах опишу ситуацию:
был запрос, в котором используется фильтрация типа WHERE <поле> IN (SELECT <поле_ключ> FROM <таблица словаря> WHERE <поле_значение> = <какое-то число>
вложенный запрос в этом фильтре точно смог достать ключ из нужной мне строки, но потом я к этому ключу применил dictGetOrDefault(<словарь>, <значение>, <ключ>, <ключ>) и найти эту строку в словаре не удалось, т.к. в результате была строка, где был именно ключ
потом ровно через минуту этот же запрос вернул мне правильный ответ (в результате запроса не было строки с ключом, то есть словарь смог по ключу достать значение)
подскажите, мб это баг какой-то?
версия клика 21.2.9.41 -
а разве это insert into подходит для пакетной загрузки из csv?
-
а какая разница? вы же обычный SQL запрос пишете после ключа -q
-
Insert Local Files | ClickHouse Docs
You can use clickhouse-client to stream local files into your ClickHouse service. This allows you the ability to preprocess
-
-
как варианет - у вас данные в таблице оказались раньше чем обновился словарь
-
-
так а разве словарь не обновляется у меня при вызове? там ведь вьюшка с FINAL
-
у словаря есть TTL
-
-
Dictionary Updates | ClickHouse Docs
ClickHouse periodically updates the dictionaries. The update interval for fully downloaded dictionaries and the invalidation interval for cached dictionaries are defined in the lifetime tag in seconds.
-
-
а, те получаетс к потоку из CSV можно обратиться как
FROM input('id UInt32, type String, author String, timestamp DateTime, comment String, children Array(UInt32)')
? -
ну, поля из примера
-
да
-
супер, моё решение
спасибо большое -
I hope to find someone I love in the new year.🥰🥰
-
input | ClickHouse Docs
input}
-
В таком случае эти сетинги будут использоваться для обоих подключений?
INSERT INTO table SELECT * FROM remoteSecure(table…)
SETTINGS receive_timeout=10000, send_timeout=10000, connect_timeout=10000 -
да, да, спасибо!
чуть выше уже посоветовали подобное решение
не знал про input ((( -
если бы это было так, то смысла в словаре никакого не было бы =)
-
-
ну есть ещё тип словаря direct, это что-то около этой темы
-
ну директ это всё таки не про то когда источник это соседняя таблица внутри кх
-
в том числе такой вариант возможен. если данных очень много и их невозможно поместить в память, но ключ сортировки позволяет эффективно ходить точечно, то почему нет
-
а директ он полностью источник читает в момент вызова или достает только те строки, которые равны ключу? Просто фраза "взаимодействует с источником непосредственно в момент запроса." немного размыто объясняет принцип
-
-
полностью не читает, всё как в обычном селекте по идентификатору
-
-
Это называется update. Если это разовая ручная операция (а не постоянный процесс), то не вижу повода не воспользоваться alter table update.
-
нужно исходные данные тоже сохранить
-
INSERT SELECT
-
-
коллеги, приветствую.
Есть таблица с Nested структурой с двумя уровнями вложенности. Используется для экономии места. В селекте разворачиваю двумя array join. К результату разворачивания применяю оконные функции (ищу изменения в записях на втором уровне вложенности). На тестовых наборах всё отрабатывало нормально. Но как стал запрос применять к порядка 100+ млн записей в результатах оконных функций появились ошибки. Как будто не находит соседнюю строку, при её наличии. Вместо over попробовал neighbor, такие же проблемы, но в других строках. Причём ошибки перемещаются от одних строк к другим, если я изменяю условие в where не влияющее на конечный результат.
Версия КХ 22.12.3.5
Какие могут быть особенности у оконных функций, которые надо учитывать, чтобы избегать подобных ошибок? Что можно посмотреть/проверить, чтобы найти проблему? -
neighbor использовать нельзя - он не уважает блоки. Для отладки можно порождать дополнительные уровни подзапросов и смотреть что там получается. Особенно отделять group by. Ну и вобще вы хоть бы запрос показали на fiddle.
-
если этот запрос не на постоянку то можно SETTINGS max_block_size = -1 использовать, тогда с большой долей вероятности neighbor отдаст вам то что вы хотите увидеть
-
На небольшом количестве данных отрабатывает без ошибок. Выделение на подзапросы проблему не решают. neighbor стал пробовать, когда перешёл на engine=memory. Не подумал, что там будет с блоками подстава. Если я в подзапрос выношу получение и сортировку данных, то во внешнем селекте тоже будет проявлятся неуважение к блокам? Например,
select
timestamp,
field,
neighbor(field, 1)
from
( select timestamp, field from mytable order by timestamp) -
тогда почти так как предлагали. Но можно лучше:
INSERT INTO t SELECT * REPLACE(i + 1 AS i) from t; -
-
не на постоянку это как должно проявляться? для регулярных предварительных расчётов подойдёт? какие есть негативные моменты от использования этой настройки?
-
запускайте это в clickhouse-client. Там хорошо видно что такое блок и какие они бывают. Запрос обрабатывается в несколько потоков. У вас нет последовательной простыни данных таблицы, каждый поток работает сам. neighbor на краях блока дает неверный результат - он не видит данные другого блока.
-
Всем привет. Стоит такая задача
Есть топик на 12 партиций
Кластер на 6 машин
Как лучше организовать чтение из топика?
- сделать на каждой машине 2 kafka table с дефолтными настройками + 2 mat view для переноса данных
- сделать 1 mat view + 1 kafka table с настройкамий kafka_num_consumers = 2 и kafka_thread_per_consumer = 1
Судя по доке алтинити советуют создавать прям отдельные таблицы но мб в новых версиях CH можно сделать через 1 таблицу
Кто чем пользовался, поделитесь) -
делайте вар2 где всего по одному :) И не надо увеличивать количество kafka_num_consumers пока не поймете что тормозит.
И вам надо почитать немного про кафку, что такое перебалансировка партиций в консьюмере. -
Борис, прошу прощения, на что в clickhouse-client нужно обращать внимание, чтобы видеть про блоки? Я в нём и запускаю и вижу только бегущую полоску прогресса и меняющиеся цифры количества строк и мегабайт. Может быть есть где-то описание про работу с clickhouse-client чуть более подробное, чем документация?
Применимо ли ограничение с блоками для оконной функции over() ? Я с ней точно с такой же проблемой столкнулся и к neighbor пошёл только в надежде найти решение... -
Спасибо! Про кафку в курсе, был скорее вопрос как лучше в кластере организовать вычитку. Сделал сначала первый вариант, но почитав доку подумал что используя настроки может получиться гибче и не плодить лишние сущности)
-
не пользовался таким трюком, но если двигаться в ту сторону, то можно попробовать max_threads=1 Будет работать в один поток и тормозить.
-
ага, попробую и это тоже, спасибо. на самом деле, у меня с большим количеством субселектов иногда получалось по всей видимости к одному треду и прийти
-
в clickhouse-client если делать обычный select видны блоки. люди часто удивляются.
но вы так и не показали даже кусочка своего запроса. вы точно там используете lagInFrame() over (rows order by some BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) ? -
Это блоки из нативного протокола, то, что они соответствуют партам в таблице - "случайное" совпадение.
-
Я просто не понимаю откуда мог взяться ваш вариант с двумя MV, отдельно на каждую партицию. Тут все делают специально количество партиций сильно больше чем количество узлов кластера для более равномерной перебалансировке при выпадениях отдельных узлов. В вашем случае можно и 30 партиций сделать. Когда один узел выпадет, то распределятся ровненько по 6 партиций на узел.
-
угу. но доходчивое. просто чтобы помнить про многопоточность. я как раз про это хотел сказать.
-
а, что вывод не в одну "таблицу", а в несколько "таблиц". понятно, да, это вижу и как раз представлял себе параллельные треды, а не блоки данных.
в запросе точно используется
leadInFrame(qty) OVER (PARTITION BY product_id, category_id, subcategory_id ORDER BY event_date ASC ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) as next_qty -
я так никогда не делал - AND 1 FOLLOWING, может оно и работает, но в доке написано:
use lagInFrame/leadInFrame, which are analogous, but respect the window frame. To get behavior identical to lag/lead, use rows between unbounded preceding and unbounded following -
ага, забыл про это, ведь читал же 😳 попробую с этим поиграть.
спасибо огромное! -
Добрый день!
Если не сложно подскажите почему не работает фильтрация на IN есть массив получен из запроса в CTE
https://fiddle.clickhouse.com/75e86d69-a65d-41d8-9424-6919f0b0125b
Received exception from server (version 22.12.3):
Code: 130. DB::Exception: Received from localhost:9000. DB::Exception: Array does not start with '[' character: while executing 'FUNCTION in(name : 0, users_arr :: 1) -> in(name, users_arr) UInt8 : 2'. (CANNOT_READ_ARRAY_FROM_TEXT)
(query: with
(select groupArray(name ) from users) as users_arr
select name from users where name in (users_arr);) -
Потому что для проверки вхождения в массив нужно использовать функцию has
-
Спасибо!
-
ответ про has по сути верный, однако само решение получается ужасное - это будет тормозить. Правильно так:
select name from users where name in (select name from users) ;
если угодно с CTE, то так:
with u as (select name from users) select * from users where name not in u; -
Добрый день! А какой самый простой способ добавить новую колонку с данными? У меня условно есть таблица, где для каждой строки по ключу понятно какое значение проставить.
Я хочу добавить это значение для каждой исторической строки. И при этом эта колонка не описывается SQL функциями (т.е. совсем новое значение :)) -
-
У меня было желание материализовать массив, так как предполагается его использовать более одного раза запросе, поэтому вынес его именно таким образом
-
зависит от размера. Если 100-1000 и может 10000, то OK, но если 1М, то нет.
-
Да понимаю, там предполагается не более нескольких тысяч в массиве
-
-
есть таймлаг
-
-
я как раз uuid и стал использовать, когда перешли на Atomic
-
-
-
Спасибо
-
-
всем привет! У меня есть таблица на движке PostgreSQL и мне надо изменить пользователя postgres. Есть ли для этого какой-то синтаксис (без drop table и потом create table с новым паролем)?
-
А есть какие то готовые альтернативы clickhouse-client? 755мб тащить в docker image не вариант, чем пользуетесь вы?)
root@38dae7413e2b:/# apt-get install --no-install-recommends clickhouse-client
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
clickhouse-common-static
Suggested packages:
clickhouse-common-static-dbg
The following NEW packages will be installed:
clickhouse-client clickhouse-common-static
0 upgraded, 2 newly installed, 0 to remove and 55 not upgraded.
Need to get 265 MB of archives.
After this operation, 755 MB of additional disk space will be used.
Do you want to continue? [Y/n] -
Ну потому что есть только один бинарник Clickhouse. Других альтернатив нету
-
755мб - это много? Там вобще все - сервер, keeper, и еще пяток инструментов. Если вы ставите докер на телефон, то возьмите curl или любой его аналог - все что надо можно делать по http
-
изначально создавать так, чтобы реквизиты из макросов брались, а не были захардкожены в декларации таблицы.
-
-
Реализация по HTTP не удобна тем что нельзя отправить несколько запросов за раз, хотел это обойти использованием CLI инструмента.
Но видимо придется все таки через нее, всем спасибо) -
а поч через треды нельзя отправить?
-
если в вашем коде не используется ';' то разделить текст на отдельные sql при помощи bash очень просто. Немного bash программирования и вы экономите 600мб.
-
имел в виду прям прочитать файл в переменную, в файле несколько запросов через; и отправить их все вместе клику)
Чтобы не делать никакого баш программирования) -
Можете чуть подробнее поделиться идеей? Допустим у меня файл с 2мя запросами и каждый запрос занимает более 1 строки. Если не будет условной точки с запятой то я ведь не смогу сделать split(";") (то что мне в голову пришло) и разделить файл на 2 части
-
конечно же нужна ; между sql, но ее не должно быть внутри строк, чтобы все не спуталось. Парсинг через разделитель в bash делается через IFS
-
спасибо большое, почитаю)
-
-
-
Спасибо!
-
спасибо!
-
select range(
(select cast(min(id),'Nullable(Int32)') from transactions where env = 'prod'),
(select cast(min(id),'Nullable(Int32)') from transactions where env = 'prod')
);
Code: 43. DB::Exception: Illegal type Int32 of argument of function range: While processing range(_CAST(49968097, 'Nullable(Int32)') AS _subquery411188, _CAST(49968097, 'Nullable(Int32)') AS _subquery411189). (ILLEGAL_TYPE_OF_ARGUMENT) (version 22.1.3.7 (official build)) -
-
Всем привет! Подскажите, пожалуйста, как включить настройку "stream_like_engine_allow_direct_select", нужно создать таблицу, которая считывает данные из очереди RabbitMQ.
Сейчас при попытке это сделать, появляется следующая ошибка:
Direct select is not allowed. To enable use setting "stream_like_engine_allow_direct_select" -
Добрый день!
есть таблица событий
t1 (id,date)
итаблица событй1
t1 (id,date)
как событиям t1 приклеить события ближайшее более раннее событие t2
например
1, 2022-01-03
2, 2022-01-05
—
1, 2022-01-03
2, 2022-01-03
2, 2022-01-04
Должнол дать
1, 2022-01-03, 1, 2022-01-01
2, 2022–01-05, 2, 2022-01-04 -
ON t1.id = t2.id and t1.date=t2.date
даст только одну запись
t1.date >=t2.date даст три записи -
Добрый день!
Подскажите, пытаюсь подключить s3 через КХ, в s3 json записи, одно из полей такое: "timestamp": "2022-12-29T06:27:38Z"
Подключаю таблицу как 'JSONEachRow' поле с типом timestamp DateTime, в настройках базы выставлено date_time_input_format='best_effort' как и подставлено в SELECT запрос, но все равно ошибка, что КХ не может распарсить поле:
Code: 27. DB::ParsingException: Cannot parse input: expected '"' before: 'Z","tra ta ta': (while reading the value of key timestamp): While executing JSONEachRowRowInputFormat: While executing S3: (in file/uri <file>): (at row 1)
. (CANNOT_PARSE_INPUT_ASSERTION_FAILED) (version 22.8.12.45 (official build))
Есть идеи, как это можно победить? -
Asof join
-
так я получу три записи ибо по >=проудут обе из второй таблицы
-
Вы проверили?
-
в СУБД в которых можно прокидывать значение в подзапрос кинул бы просто дату внутрь подзапроса и взял бы max
-
сейчас сделаю
-
хм, работает, спасибо!
-
Int32 и Nullable(Int32) это разные вещи
-
-
-
-
-
select range(
coalesce((select min(id) from transactions where env = 'prod'),0),
coalesce((select min(id) from transactions where env = 'prod'),0)
);
Code: 43. DB::Exception: Illegal type Int32 of argument of function range: While processing range(coalesce(_CAST(49968097, 'Nullable(Int32)') AS _subquery413211, 0), coalesce(_CAST(49968097, 'Nullable(Int32)') AS _subquery413212, 0)). (ILLEGAL_TYPE_OF_ARGUMENT) (version 22.1.3.7 (official build)) -
это странно
-
-
-
-
Коллеги, возможен ли CamelCase в названиях таблиц и колонок? Какие проблемы или неудобства?
Никогда такой ерундой не занимался, а тут химические элементы подъехали и в lowercase выглядят убого -
да ничего особого вроде не всплывало у нас, правда у нас этих таблиц/колонок по пальцам пересчитать можно
-
Спасибо. Кавычки нужны при обращении?
-
это реально воспроизводится и на последних версиях
-
-
-
-
пасиба, попробую
UPD: работает. кайф. -
Всем привет! Подскажите, пожалуйста, как включить настройку "stream_like_engine_allow_direct_select", нужно создать таблицу, которая считывает данные из очереди RabbitMQ.
Сейчас при попытке это сделать, появляется следующая ошибка:
Direct select is not allowed. To enable use setting "stream_like_engine_allow_direct_select" -
Так вы пытаетесь читать непосредственно из очереди, а не из таблицы, в которую бы складывались данные из неё.
-
Схема такая StreamLikeEngineTable -> MaterializedView ->MergeTreeFamilyTable, делать выборки только из последней
-
нет
-
Добрый день!
Подскажите, а можно за один проход из таблички где есть
товар/номер заказа/сумма по строке
получить табличку сгруппированную следующим образом
Товар/Сумма по всем продажам товара/ сумма заказа(Полная сумма заказа)где этот товар участвовал
?
https://fiddle.clickhouse.com/7d7e0226-0039-4f59-8edd-c35a14205866 -
Сам спросил, сам отвечаю: date_time_input_format надо было прописывать в настройках при создании таблицы... 🤦♂️
-
SET stream_like_engine_allow_direct_select = 1
-
Здравствуйте, хочу уточнить насчет следующего кейса свою гипотезу: была пересобрана машина для нод одного кластера, мной было настроено все по типу указанного метода в altinity, и на машине пересобранной clickhouse-server запущен, но происходит восстановление всех реплицированных таблиц. При этом я не могу войти в clickhouse-client. Правильно ли я понимаю, что доступа к КХ не будет пока не восстановятся реплицированные таблицы?ZooKeeper Recovery
How to recover when Zookeeper has issues.
-
Посмотрите, что в логах кх происходит
-
Работа с реплицированными таблицами, мерж и fetch операции по таблицам, ошибок нет никаких, видно, что КХ производит pull записей в очередь, и работает с партами.
Т.е. то, что clickhouse-client не поднимается пока не восстановит все данные реплицированных таблиц - это нормально?
Или стоит помимо остановленных скриптов, например, останавливать запись со всех сервисов (мы не отключили некоторые сервисы, но отключили скрипты, так как во время экспериментов обнаружили, что ch зависает в случае отключенной ноды только на операциях drop и truncate,а с сервисов мы пишем в буферные таблицы) в идеале чтобы восстановилась вся репликация более быстрее? -
не совсем понимаю, как у вас тут поле order трактуется
вот эта строка, например
INSERT INTO sales VALUES (2, '001', 10); -
-
Номер заказа, общий на несколько строк товара )
-
-
-
Да нет, восстановления всех данных он ЕМНИП ждать не должен, но инициализация таблиц может занимать действительно +- заметное время (минут 10)
-
Сервис сейчас три часа активен, но доступа с clickhouse-client нет
-
Ну скиньте файлом 1000 последних строк
-
лога
-
ммммм, не могу)
-
ШТОШ, тогда держим за вас кулачки тогда
-
в последних 1000 строках было видно, что между операциями восстановления работают и сервисы, которые пишут в реплику первой ноды, и данные сразу же отсылаются на вторую
-
-
-
есть ли у ASOF подводные камни приводящие вот к такому?
-
-
Хмм, если кх поднял порт 9000 и 8123 то он должен давать подключения к себе
-
и похоже внутри тоже ряд условий игнорируется (в используемых вьюшках)
-
-
точно, косяк
-
Отдельная история, что dbeaver и другие ide довольно фривольно интерпретируют вывод кх, поэтому желательно перепроверять их через clickhouse-client или еще что
-
хмм, приеду проверю, но предполагаю что там будет ошибка Connection refused.
-
там на деле история клубже
на нул это я сделал проверку чтобы вывести как раз то чего не должно быть, так как оно отфильтровывается глубже -
Вроде похоже, но пока с телефона
Спасибо! -
например вот
данные по идентификатору есть -
но если взять отдельно вьюшку к которой клеются данные то их нет
-
-
-
так это ,оконка sum(amount) OVER (PARTITION BY order_number)
-
именно, очень интересно как так
там конечно матрешка запросов и есть повторное использование и таблиц и вьюшек -
отказ от ASOF странность не убирает
-
напрямую во вьюшке такого идентификатора нет, а если вьюшку соединить с нею же но с дополнительной оконкой, то оно появляется
-
карты которые всплывают отфильтровываются тут
SELECT
card_id,
toDate(date) AS transaction_date_m,
sum(sum) AS manzana_amount,
count(sum) AS manzana_cnt
FROM db1.turnover_manzana_last_v
JOIN
(
SELECT tv.loyalty_id, min(tv.created_at) AS dt
FROM tv
GROUP BY tv.loyalty_id
) AS tv ON tv.loyalty_id = card_id
WHERE tv.dt <= transaction_date_m
GROUP BY
card_id,
transaction_date_m -
то есть если вы тут ставите INNER JOIN с этим фильтром, то у вас фильтр как будто бы также не выполняется, правильно понимаю?
-
то есть если кратко, есть запрос
with запрос по картам
запрос по транзакциям 1
запрос по другим транзакциям с фильтром на транзакции 1
запрос объединяющий три из with
это тело вьюшки
далее беру эту вьюшку и запрос с оконкой по ней же
и оппа, выблывают транзакции которые фильтровались в третьем with -
да
-
исключение ASOF не помогает
-
-
-
обманул, INNER убирает фантомов
-
-
-
-
при LEFT без ASOF они тоже есть
-
kmu.card_id- это поле левой вьюшки
-
и при такой выборке ничего нет
-
-
окно тоже не при чем
просто при самосоединении перестает работать фильтр внутри ))) -
а если сделать из вьюшки выборку по user_id и по loyalty_id вот этим (которые не null), какое там значение card_id?
-
такое же
-
если загнать сожержимое вьюшки в таблицы, то все, ожидаемо, работает
то есть проблемма не в самосоединении как таковом -
-
да
-
возможно даже в том что во вьюшке фильтры делаются в подзапросах в секции WITH с использованием результата предыдуих подзапросов в with
-
это проверить быстро не выйдет
-
Привет
Подскажите плз, влияет ли формат вывода на что либо?
select ... from ... format JSON
Сейчас встал вопрос, возвращать напрямую из БД json или перекладывать в модельку уже в приложении
Есть ли какие-нибудь подводные при использовании format JSON? -
Подскажите, пожалуйста, необходимо сделать индекс по DateTime, какой лучше выбрать? В таблице 80млн уникальных пользователей, DateTime - дата регистрации, ключ сортировки order by(user_id)
-
может ли быть подвох в использовании цепочки WITH вкоторой последующие запросы используют предыдущие?
-
о как интересно?
у меня во вьюшке было
from t right jon t2
я сделал t2 left join t
и уже в самой вьюшке получил неотфильтрованные значения -
Всем привет , хочу создать remote табличку из постгри , у одного из полей такой формат данных , в пг это называется interval
Описывая структуру таблицы , и понял что не знаю какой формат задать этому полю.
Подскажите плиз , есть ли похожий формат в кликхаусе , чтобы он не ругался на разные соответсвтия типов -
А версия какая?
-
22.8.11 revision 54460
-
Скорее всего обычный String, кх не имеет сравнимый тип данных
-
Попробовала постучаться на вторую реплику с первой, получаю следующее:
Code: 516. DB::Exception: Received from prod.pdns.internal:9000. DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name. -
Ну значит порт поднят, разбирайтесь что у вас там с юзер конфигами
-
Тогда хз, в чем тут дело
Знаю, что раньше была проблема с тем, что left и right join разные результаты давали при перестановке таблиц -
пока подозреваю цепочку в WITH
но не исключаю что где-то с псевдонимами примитивная ошибка -
А дальше надо по каждому товару получить сумму заказов в которых он участвовал
-
GROUP BY item_id
-
Кстати да, что-то я протупил
Вот так получается итог
https://fiddle.clickhouse.com/12dd9644-cd85-4e0a-81ff-c43155939eaa -
м, нашли косяки.
-
-
Все, взрыв мозда
Присоединяю подзапрос через ASOF INNER и вижу полное соответствие и по номеру и по дате
прицепляю через LEFT и соответствий типа нет
Как такое вообще может быть? -
-
-
Из сомнительного для КХ то, что в разных местах запроса одна и та же таблица используется то для проверки наличия более ранних транзакций, то для сбора сумм
-
И это в одном случае inner, а в другом left
-
А покажите explain syntax …, пожалуйста
-
-
Решил отвлечься и может быть сделать подход с другой стороны
Вернусь, пришлю -
для DateTime хорошо подходит min_max, т.к. это просто число. Но skip index это не тот индекс к которому вы скорее всего привыкли. Если user_id монотонно возрастающий и коррелирован с временем,то индекс будет работать, еслиже user_id - случайное число, то нет. Сделайте стандартное партиционирование по месяцам по этому времени, и на ваших 80М вам скорее всего будет более чем достаточно для приличной скорости запросов.
-
Если очень много, то сломаете компилятор :) Это же все развертывается во время компиляции запроса и потом уже живет в бинарном виде.
Другое дело что любой подзапрос при определенном стечении обстоятельств может поломать оптимизатор, и тогда запрос начнет исполняться в один поток и тормозить. Для этого не надо делать вложенность 10. Смотрите по explain pipeline что там происходит. -
10 там нет. А то что в одном месте нужен идентификатор и первая дата появления а в другом суммы по идентификаторам и датам - это есть
Собственно ничего экстраординарного
Из одной транзакционной таблицы взять только то, что имеет более ранние соответствия в другой и к результату прицепить суммы из этой другой
Усложняется парой справочников с многие ко многим -
Справочники уже ведь стали словарями? Ну и по сути задача на asof join. Он работает нормально.
-
Нет, они не словари, в них всякие даты создания и обновления , привязки к другим
-
Ну вон я выше показывал что asof как то находит что прицепить, а left - нет. Справедливости цеплять не должны оба.
-
Потому что транзакции есть, но они не проходят условия, которые заданы в подзапросе
-
With 1 запрос с условиями
Запрос asof inner 1
Left 1
И вот первый игнорирует условия в 1 -
сверху ничего не нашел, только картинки какие-то. нужна ссылка на fiddle если хотите чтобы это смотрели.
- join запросы лучше вкладывать друг в друга, не джойнить более 2х таблиц (оно иногда работает, но если нет, то лучше так)
- не понимаю при чем тут "даты создания и обновления". Единственный ответ почему джойн нельзя заменить на словарь - не лезет в память. Все остальное можно переписать на словари. И даже те кто не лезут тоже можно (direct). -
:))
-
Словари попробую
-
В fiddle вечность воссоздавать и будет работать :)
-
Различается ли вероятность проблем при реализации подзапрос в секции with и в from?
Меняется ли вероятность при многократном переиспольщовании подзапрос из секции with? -
Сейчас я пытаюсь усечь большой запрос до минимума в котором воспроизводится проблема.
Его уже можно будет показывать -
Иначе много лишнего
-
CTE просто развертываются там где вы их применили. Точно так-же как и функции. Считайте что это такие макросы или cut&paste. Так что разницы нет. Есть разница в структуре подзапросов.
-
порезанный от личного запрос выглядит так
WITH
lcards AS
(
SELECT
ud.id AS ud_id,
ud.user_id AS user_id,
li.loyalty_id AS loyalty_id,
max(parseDateTimeBestEffort(substring(li.created_at, 1, 19))) AS create_dt
FROM logs.user_devices AS ud
INNER JOIN logs.loyalty_info_drafts AS li ON li.device_id = ud.id
INNER JOIN logs.loyalty_info_commits AS lic ON lic.loyalty_info_draft_id = li.id
GROUP BY
ud_id,
ud.user_id,
li.loyalty_id
LIMIT 1 BY user_id
),
tv AS
(
SELECT
u.id AS user_id,
sum(tv2.amount) AS amount,
tv2.account_id AS account_id,
toDate(tv2.created_at) AS created_at,
lc.loyalty_id AS loyalty_id
FROM db1.transactions_v2_t AS tv2
INNER JOIN db1.users_t AS u ON u.user_account_id = tv2.account_id
INNER JOIN lcards AS lc ON lc.user_id = u.id
WHERE (tv2.source_type = 'purchase') AND (tv2.transaction_status_id = 'SUCCEED') AND (tv2.sale_point_name NOT IN ('cafe_in_spar', 'internet_shop', '14')) AND (created_at >= toDate('2022-09-01'))
GROUP BY
user_id,
account_id,
created_at,
loyalty_id
),
m AS
(
SELECT
m.card_id,
toDate(m.date) AS transaction_date_m,
sum(m.sum) AS manzana_amount
FROM db1.turnover_manzana_last_v AS m
WHERE transaction_date_m >= toDate('2022-09-01')
GROUP BY
m.card_id,
transaction_date_m
)
SELECT
m.card_id,
m.manzana_amount,
m.transaction_date_m,
t1.user_id,
t1.amount,
t1.loyalty_id,
t1.created_at,
tsm.loyalty_id,
tsm.created_at,
tsm.amount
FROM m
ASOF INNER JOIN tv AS t1 ON (t1.loyalty_id = m.card_id) AND (t1.created_at <= m.transaction_date_m)
LEFT JOIN tv AS tsm ON (tsm.loyalty_id = m.card_id) AND (tsm.created_at = m.transaction_date_m)
WHERE m.card_id = '2900019313338'
ORDER BY m.transaction_date_m ASC -
дважды используется
tv
но первый раз словно на все вот это плевать
WHERE (tv2.source_type = 'purchase') AND (tv2.transaction_status_id = 'SUCCEED') AND (tv2.sale_point_name NOT IN ('cafe_in_spar', 'internet_shop', '14')) AND (created_at >= toDate('2022-09-01')) -
explain────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ WITH │
│ lcards AS │
│ ( │
│ SELECT │
│ ud.id AS ud_id, │
│ ud.user_id AS user_id, │
│ li.loyalty_id AS loyalty_id, │
│ max(parseDateTimeBestEffort(substring(li.created_at, 1, 19))) AS create_dt │
│ FROM logs.user_devices AS ud │
│ INNER JOIN logs.loyalty_info_drafts AS li ON li.device_id = ud.id │
│ INNER JOIN logs.loyalty_info_commits AS lic ON lic.loyalty_info_draft_id = li.id │
│ GROUP BY │
│ ud_id, │
│ ud.user_id, │
│ li.loyalty_id │
│ LIMIT 1 BY user_id │
│ ), │
│ tv AS │
│ ( -
│
│ SELECT │
│ u.id AS user_id, │
│ sum(tv2.amount) AS amount, │
│ tv2.account_id AS account_id, │
│ toDate(tv2.created_at) AS created_at, │
│ lc.loyalty_id AS loyalty_id │
│ FROM db1.transactions_v2_t AS tv2 │
│ INNER JOIN db1.users_t AS u ON u.user_account_id = tv2.account_id │
│ INNER JOIN │
│ lcards AS lc ON lc.user_id = u.id │
│ WHERE (tv2.source_type = 'purchase') AND (tv2.transaction_status_id = 'SUCCEED') AND (tv2.sale_point_name NOT IN ('cafe_in_spar', 'internet_shop', '14')) AND (created_at >= toDate('2022-09-01')) │
│ GROUP BY │
│ user_id, │
│ account_id, │
│ created_at, │
│ loyalty_id │
│ ), │
│ m AS │
│ ( │
│ SELECT -
│
│ m.card_id, │
│ toDate(m.date) AS transaction_date_m, │
│ sum(m.sum) AS manzana_amount │
│ FROM db1.turnover_manzana_last_v AS m │
│ WHERE transaction_date_m >= toDate('2022-09-01') │
│ GROUP BY │
│ m.card_id, │
│ transaction_date_m │
│ ) │
│ SELECT │
│ card_id AS `m.card_id`, │
│ manzana_amount AS `m.manzana_amount`, │
│ transaction_date_m AS `m.transaction_date_m`, │
│ `--t1.user_id` AS `t1.user_id`, │
│ `--t1.amount` AS `t1.amount`, │
│ `--t1.loyalty_id` AS `t1.loyalty_id`, │
│ `--t1.created_at` AS `t1.created_at`, │
│ loyalty_id AS `tsm.loyalty_id`, │
│ created_at AS `tsm.created_at`, │
│ amount AS `tsm.amount` -
│
│ FROM │
│ ( │
│ SELECT │
│ transaction_date_m, │
│ manzana_amount, │
│ card_id, │
│ loyalty_id AS `--t1.loyalty_id`, │
│ amount AS `--t1.amount`, │
│ created_at AS `--t1.created_at`, │
│ user_id AS `--t1.user_id` │
│ FROM │
│ m │
│ ASOF INNER JOIN │
│ tv AS t1 ON (`--t1.loyalty_id` = card_id) AND (`--t1.created_at` <= transaction_date_m) │
│ WHERE card_id = '2900019313338' │
│ ) AS `--.s` │
│ ALL LEFT JOIN │
│ tv AS tsm ON (loyalty_id = card_id) AND (created_at = transaction_date_m) │
│ WHERE card_id = '2900019313338' │
│ ORDER BY transaction_date_m ASC -
так действительно тяжело - слишком большая простыня.
И все-таки, почему вы не хотите разобрать вот эти стремные места:
FROM m
ASOF INNER JOIN tv AS t1 ON (t1.loyalty_id = m.card_id) AND (t1.created_at <= m.transaction_date_m)
LEFT JOIN tv AS tsm ON (tsm.loyalty_id = m.card_id) AND (tsm.created_at = m.transaction_date_m)
тут три таблицы соединяются в общем контексте. Причем две из них одинаковые, а они с разными типами join. Вы специально пишите такой замысловатый тест парсера ? :)
Я в таких стремных случаях разбиваю джойны на пары, делая дополнительные подзапросы, пока не выловлю проблему. -
было и по парам
первое присоединение имеет цель ограничить выборку из m только теми для кого есть более ранние транзакции в tv -
второе присоединение - это суммы из tv
суммы из m могут быть по датам по которым в tv данных нет -
но я сейчас как раз думаю все вывернуть
-
RMT с -1 ? Я так и не понял как работают эти флажки
-
-
Nginx-ом можно.
-
Сторонними средствами -- понятно. Есть и фиддлер. Но должен же быть способ сделать это внутри самого кликхауза.
- 20 January 2023 (201 messages)
-
@konnectrl @brbrbr интересное изменение, пока ничего не делал а ОЗУ упало с 98 до 65%
-
у вас есть сырые данные и есть агрегации (суммы скажем) через MV. Если в сырые данные поступают обновления, то что делать с агрегациями? Можно пересчитывать заново раз в сутки, а можно обновлять инкрементально. Но для того чтобы прибавить новое значение, надо сначала отнять старое. Для этого и нужны эти -1,1 в исходной таблице.
Обычно такое делатся на основе CollapsingMT, которая во время мерджей весь этот мусор схлопнет и выкинет. Но можно делать на чем угодно, хоть бы и на обычной MergeTree, но лучше на RMT, которая тоже умеет чистить мусор. Послушайте выступление Роберта на этом видеоDecember 2022 ClickHouse Bay Area MeetupJoin us for this session on latest #ClickHouse news. 0:10 Start of Meetup 9:07 Adventures with the ClickHouse ReplacingMergeTree Engine by Robert Hodges 46:28 ClickHouse ReplacingMergeTree in Telecom Apps by Alexandr Dubovikov 1:24:32 Doing Crazy Stuff with ClickHouse by Alexey Milovidov 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
-
-
Не починили. 😞
-
-
-
иерархические словари
-
Hierarchical Dictionaries | ClickHouse Docs
ClickHouse supports hierarchical dictionaries with a numeric key.
-
🤝
-
Бодрейшего дня, друзья)
Можно ли вывести формулу, по которой можно достоверно точно по ключу шардирования определить номер шарда куда легли данные или лягут в дальшейнем? -
если вы про запись в Distributed то вот тут всё описано
https://clickhouse.com/docs/en/engines/table-engines/special/distributed#distributed-writing-dataDistributed Table Engine | ClickHouse DocsTables with Distributed engine do not store any data of their own, but allow distributed query processing on multiple servers.
-
-
-
Всем привет!
Пользуемся CH для ssa отчётности. Запросы поступают от read-only юзеров. Появилась необходимость делать запросы с модификацией опций (обойти ошибку: Cannot modify ... setting in readonly mode), а именно, хотим запускать с SETTINGS distributed_product_mode = 'local'.
Возник вопрос, изменение параметра readonly с режима 1 на режим 2 в конфиге позволит это делать, но какие у этого есть риски? Существуют ли какие-то settings, которые дают возможность readonly юзеру сломать базу?
Может быть есть альтернативные решения? Например включение определённых SETTINGS определённому пользователю? -
подскажите, есть шарды (сейчас два), планируем выделелить сервак под горячие данные, но нет понимания надо будет делать их два или и на одном нормально будет работать? т.е. вопрос по сути в том надо ли сохранять соотношение что в одном шарде и горячий сервак и холодные
-
А есть возможность исполнять аналог хранимок на python в clickhouse ?
-
привет. продолжаю исследовать этот прикол. кажется, он возникает если какая-то нода кластера не успела ответить на селект через распределенную вьюху в течение какого-то времени
ищу в конфигах КХ где можно увеличить время, предоставляемое нодам на выполнение селекта через распределенную вью. возможно кто-то знает такие параметры конфига, в гугле пока не нашел -
inb4: distributed_ddl_task_timeout не помогает, там 180 сек дефолтные, запрос выполняется секунд 10
-
конечно можно выдавать readonly пользователю пресеттинги
-
#vacancy #вакансия #job #parttime
Компания, занимающаяся интернет рекламой, ищет ClickHouse разработчика.
Знание ClickHouse и Zookeeper. Позиция part-time, локация СПб, можно удаленно.
Пишите в личку если интересно. -
<ch>
<profiles>
<readonly>
<distibuted_product_mode>local</distibuted_product_mode>
<distibuted_group_by_no_merge>1</distibuted_group_by_no_merge>
</readonly>
</profiles>
<users>
<readonly>
...
<profile>readonly</profile>
...
</readonly>
</users>
</ch> -
Functions | ClickHouse Docs
There 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).
-
спасибо
-
-
Привет!
Подскажите, пожалуйста
Какой самый быстрый / эффективный способ проверить, что есть not NULL значение, подходящее условию where?
Допустим, после where останется 10 записей: где 10 разных значений в столбце A, и 10 раз повторяется одно значение в столбце B
мне подойдет любое, т.к. важен только факт соответствия условию - что для столбца B есть хотя бы 1 A, которое проходит по условию
any для этих целей подойдет? или есть что-то лучше? -
-
-
добрый день
у нас похожая структура и сделали через Nested -
-
Подскажите у нас клик поедает все ресурсы с запросами final
ресурсы 12 CPU, 48GB RAM, какой-то ssd
время запроса 20 сек, даже на 4M сессиях и буквально 5-10 запросов в параллель полностью вычёрпывают ресурсы clickhouse на проде.
Куда копать? -
Не использовать FINAL
-
вариант годный, но нужно решить проблемку дедупликации.
в датлицу поступают данные по сессиям. могут дублироваться в какой то момент
чтобы построить на них витрину их нужно дедуплицировать. Файнал как бы предоставляет эту. возможность. -
возможно мы не правильно его готовим ) подскажите как решить эту проблему?
-
Вы тогда выбрали не ту базу данных
-
🆓Начни пассивный заработок с сегодня 🆓
Не п2п 😬
Не трейдинг 🙌
Только пассив ✅
💎Бесплатное обучение только для тех кто не регал бинанс 💎
Мы не берём пароль или аккаунт в рост ‼️
🦾Депозит зависит только от вас и % который желаем вами🦾
Пиши сюда @raskrytka_man
Только белый трафик 💯
Только после регистрации 👌🏻 -
да, мне по этому Nested и не подошел, я подумал, может это может быть просто Tuple. проблема в том, что я не имею контроля над входными данными, они стримом из kafka идут, пробую ch - kafka интеграцию
-
витрины на клике нельзя строить?
-
-
нет. причем тут магазины?
-
-
-
а сори не утонил. статистика по сессиям на основе аналитики.
-
-
Оптимайзите затрагиваемую патрицию одним из степов пайплайна построения витрины, и будет вам счастье
-
Привет, некорректно работает вставка в таблицу. Таблица distributed, кластер поднимается в docker из одного шарда и одной реплики. В таблицу пишем с помощью http. В чем может быть проблема? Вот пример поведения:
-
слова умные, узнаваемые но я чот ничего не понял.
-
Получать историю сессий по источникам, отсортированную по дате от старых к новым.
-
У вас витрина считается каким-то образом же?
-
Ну если вы используете final - то вы заставляете движок прогонять через себя все данные и выполнять все мержи чтобы отдать финальный результат
-
-
все так.
-
тогда используйте тип Object('JSON'), оно само там этот тупл построит и перестроит
-
И это разумно делать не в момент запросов к витрине, а после вставок. А потом давать селектить без final
-
Tuple скорее всего не подойдёт, т.к. последовательность key скорее всего будет разная. По крайней мере не гарантированная... :( А мап это изменяемая структура...
Как идею, можно попробовать рассмотреть таблицу с объектом json и через mat view парсить и складывать в таблицу с нужными полями... сама таблица с json может быть типом null и в ней данных не будет при этом...
но я так не пробовал, только читал о таком способе -
А зачем, если клик сам все сделает когда ему надо
-
-
select * from prom3.session final
where source_id = '12123123'
order by begin_date desc
limit 100 offset 1000
и жопец -
-
-
-
Ну если аналитики селектят с final, видимо нужно сразу
-
Я тоже так не пробовал, но я попробовал сгенерить структуру для своей таблицы путем инсерта данных (json) в поле типа JSON и последующего DESCRIBE TABLE. реально на бум просто запустил describe не ожидая того что ch распарсит все поля.
-
А может быть и похер, в принципе.
-
да забыл сказать что в момент запроа идет вставка данных.
вот такие сообщения после начала запроса летят
15:18:39.765 [WARN] Query execution failed: Code: 241. DB::Exception: Memory limit (total) exceeded: would use 42.10 GiB (attempt to allocate chunk of 16777216 bytes), maximum: 42.10 GiB: While executing ReplacingSorted. (MEMORY_LIMIT_EXCEEDED) (version 22.3.8.39 (official build))
, server ClickHouseNode -
-
Вы можете считать это всё в одну таблицу,в конце аттачить посчитанную патрицию к другой таблице, и пускать аналитиков только в эту вторую таблицу
-
Тогда проблема неконсистентных селектов будет решена
-
ну пока это единственный разумный вариант.; сырая таблица для вставки и периодически обновляемая таблица с посчитанными данными.
-
Так довольно часто делают, нормальный вариант
-
я с Nested примерно так же разбирался :)
-
Спасибо за брейншторм )
Как первый вариант думаю сгодится. сейчас еще проблем поднакидаем ) -
Тут может срабатывать дедубликация insert'a и повторная вставка такого же батча не происходит.
Вставьте вторым запросом другое значение и проверьте count
Ну и ещё хорошо бы понимать с каким движком таблица стоит за distributed -
А ещё можно через argMax данные выбирать
SELECT session_id, argMax(session_param1, insert_dt) as p1, argMax(session_param2, insert_dt) as p2
from tbl1
group by session_id -
если полей 100 штукт то надо каждое поле так обернуть в запросе? )
-
Сделайте вью если частый запрос и выбирайте из неё
-
хм. тоже вариант! спасибо!
-
во-первых можно перечислить все поля как кортеж argMax((session_param1,session_param2), insert_dt)
во-вторых можно использовать argMax(tuple(COLUMNS('session_.*')), insert_dt) -
-
там мусор хранится
distributed и matView умножают кол-во вставленных записей -
-
по дефолту у КХ mark_cache раздувается до 5ГБ,
из опыта скажу что пока RES меньше 40ГБ нельзя сказать что что-то ненормально с КХ. -
да. До detach / attach таблицы, или до system start merges, и наверное system restart replica тоже стартанет мержи
-
это однозначно баг в КХ
distributed_ddl_task_timeout -- это из другой сказки, это для запросов create on_cluster. Этот параметр не используется для select -
Да, допетлил что это только про изменения в ddl
А чем помочь проблеме не допетлил
Но за взгляд на проблему спасибо -
тип json экспериментальный, вангую что заработает он в 2025 году, во втором квартале.
я бы его выпилил (из КХ), не стоит усилий эта балалайка. -
маленький апдейт вчера после того как озу до 98% дошло то само упало до 65%
-
@den_crane вот так показало на графане
-
скорее всего рестартовал ваш КХ
select uptime() -
спасибо
-
92526
-
похоже перезагрузился да?
-
ну это секунды если вопрос ко мне
-
получается как потолок то КХ перегружается и наверное теряет оперативные данные
-
1 нет
2 нет -
Ну тут всё просто, вам не нужен КХ :)
-
ну это самое простое решение ) А альтернатива? )
-
starrocks, быстрее КХ, +решардинг, +транзакции, +нормальный SQL, +join-ы
(бесплатно, apache license) -
в КХ возможно будет uniqueMergeTree, там будет не нужен final (он уже готов на 90%) https://github.com/ClickHouse/ClickHouse/pull/44534Add new table engine UniqueMergeTree by ucasfl · Pull Request #44534 · ClickHouse/ClickHouse
Changelog category (leave one): New Feature Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Add new table engine UniqueMergeTree. Closes #41817. Syn...
-
о, они ещё и glog используют, т.е. умеют в syslog. интересные.
-
Они быстро развиваются
-
ну понаблюдаем.
-
https://gist.github.com/den-crane/c9e6eff2611d52196e491dc522e654d4 (ch_vs_starrocks test with random data)test with random data
test with random data. GitHub Gist: instantly share code, notes, and snippets.
-
Транзакций там тоже нет?
-
звуячит конечно сексуально но клик выбирался по довольно простому критерию
есть касандра откуда надо откинуть данные в клик.
строк миллионы. полей под 100 штук.
далее на данные нужно накладывать аналитические запросы (шустро ворочить данные) и строить витрины.
Я правильно вас понял что клин не умеет всего вышеперечисленного и выбор был мимо? -
Подходит, просто со своей спецификой
-
Ну подскажи ее плиз ) очень спасешь серьезнеый проект )
-
Всё же просто использовать Click как конечное хранилище в котором будет просто SELECT без JOIN'a
-
и будет вам счастье
-
Уточни. Мы тут одно решение озвучили.
Сделать зеркальную таблицу куда складывать раз в сутки посчитанные (дедуплицированные) данные за последние сутки. И уже оттуда запросы строить.
Норм решение? -
Да, мы делаем примерно так же
-
-
Мы делаем темп таблицу в которую всё льётся день, в конце дня дедубликация в ней
-
И в большой таблице раз в неделю дедубликацию, для того чтобы убрать дубли в разных днях
-
Нежелательно использовать OPTIMIZE как говорил Denny, но в нашей схеме дедубликации никуда без него
-
только при ваших вводных - 10 параллельных аналитических запросов всё равно могут приводить к нехватке ресурсов
-
Ну тут только ограничивать ресурсы на юзера, в последних обновах это сделали
-
даже без final?
-
Да, потому что 1 запрос может сожрать весь CH
-
ну да)
-
Хм, а почему нежелательно использовать optimize для подготовки витрин, если компьют на CH?
-
то есть чем уже условие тем шустрей.
-
с какой версии примерно?
-
Как рассказывал Denny и возможно это плохой пересказ нормальных слов ...
OPTIMIZE все парты смержит максимально в 1 ... CH такое не любит, так как ему надо читать из разных партов -
Вроде 22.3
-
Но не помню
-
Ну типа есть движок со встроенным функционалом дедупликации через оптимайз — зачем он тогда нужен вообще?) Уж точно не для селектов с final
-
И не для мерджей «когда-нибудь»
-
Он же не доконца мержит, и дубли будут всегда
-
годный вопрос )
-
Вся разница в движках, это разница работы мержа, не более. То есть просто в MT и в ReplacingMT будут идти мержи одинаково, просто механизм обработки данных разный
-
Ну вот у нас в пайплайнах ровно так и делается — оптимайзим aggregating и replacing партиции в конце, чтобы схлопывать строки, проблем с мерджами не до конца вроде нет
-
Если вы данные раз в сутки заливаете и не делаете запросов в этот период и до завершения optimize, то можно делать optimize, а так final всё равно ведь понадобится.
-
Это понятно, да
-
Просто выше написали, что так вообще лучше не делать, и я хочу понять, нафиг тогда вообще нужен этот функционал
-
Потому что некоторые пытаются делать optimize после каждого insert.
-
Ну то есть для расчёта регулярных не real-time витрин это ок
-
Посчитал партицию — схлопнул — закинул в витрину
-
не не это жесть априори
-
На мой взгляд - да, нормальный сценарий для необычных для КХ юзкейсов.
-
У нас на пользователей сервит витрины вообще отдельный кх, в котором ничего не считается. Мы туда просто перекидываем партиции по мере появления
-
а зачем отдельный ? на столько активная вставка идет?
-
Чтобы неаккуртные руки/пайплайны не положили презентационный слой
-
хм. наверно все-таки что то сложное на первом происходит )
-
Ну, да. Буквально всё в нём и происходит
-
тогда вопросов нет. у нас касандра для "всего" )
-
КХ это OLAP, не DWH. Много таблиц, витрины это не совсем подходит для КХ
-
3 таблицы.
1 оч большая 2 так приблуда )
Я прям очень старался влезть в КХ ) -
ну т.е. типа запрос без final у вас у вас быстрее чем с final в 10 раз? В этом проблема?
-
не сравнивали пока
изначально при текте я обнаружил что данные могут заливаться с дублями из касандры.
ОК предложил пользовать файнал в запросах для получени чистых данных
сегождня прилетела задача - запросы с файнал кладут ресурсы.
я сразу к вам )
пока не сравнивал. в понедельник посмотрим.
Если только в этом проблема - решине очевидное. Считать и класть в сторону раз в сутки для потрошения аналитиками. -
А что значит "кладут ресурсы"? 100% cpu? Так это и 1 запрос без final будет делать в ряде случаев, как выше написали.
-
запустили параллельно 3 запроса типа
select * from table
where source_id = '123123123'
order by begin_date desc
limit 100 offset 1000
с начала [WARN] Query execution failed: Code: 241. DB::Exception: Memory limit (total) exceeded: would use 42.10 GiB (attempt to allocate chunk of 16777216 bytes), maximum: 42.10 GiB: While executing ReplacingSorted. (MEMORY_LIMIT_EXCEEDED) (version 22.3.8.39 (official build))
, server ClickHouseNode
и как бы на этом всё -
Так это данных с source_id = '123123123' слишком много.
-
У вас таблица по каким полям отсортирована?
-
ну собственно это нормально, либо делаете очередь и выполняете по 1 запросу в момент времени, либо добавьте в кластер нормально озу
-
46гаков как бы
-
ну чушь же написал для примера
-
В примере главное, что есть order by и limit. Если order by не совпадает с табличным, то беда
-
копейки
-
не тут все норм. ордер по трем полям одно из которых как раз дата начала. Это я как бы в курсе до проектирования был )
-
а я блин спрашивал давно сколько у кого и как понять скока надо )
-
https://clickhouse.com/docs/en/operations/tips/#ram
https://kb.altinity.com/altinity-kb-setup-and-maintenance/cluster-production-configuration-guide/hardware-requirements/ -
-
А дата первая в Order by ?
-
ну от 46 до 64 сам понимаешь не шибко проблема оттопырить ) но если 46 жто коппейки то 64 тоже ни о чем )
-
вторая
-
Щедрый ты ) Мне нравится! )
-
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.
-
странный запрос, не для OLAP базы.
set max_bytes_before_external_sort='10G' -
естественно limit 100 offset 1000, это ад. Пагинацию надо делать по другому
-
UniqueMergeTree скорость инсертов конечно разочаровывает 65.947 sec vs 1.962 sec
https://gist.github.com/den-crane/64ca99b15ca4ea123c137352a306acbd -
Чудес не бывает
-
А если ключи не уникальны ? Мне кажется ещё медленней станет
-
еще тещу, там еще интереснее, если ключи не возрастают монотонно, то там тоже все совсем плохо.
-
Ну по факту если батч обработка, то скорость сильно не решает