- 01 February 2023 (153 messages)
-
Клик имеет обратную совместимость?
У нас 2 сервера (2 гарда) v.19.3.
Хочу перевести на 23 -
-
???
-
парни есть кто не спит ? вопросик по мониторингу есть
-
Не могу понять, как заполнить все нули предыдущими не нулями, последовательность 1,0,0,2,0,3,0,0,0. Должно получиться 1,1,1,2,2,3,3,3,3. Цифры взяты из столбца.
-
papa karlo имел в виду, что так делать не стоит, и ваши шансы на успешный апгрейд минимальны. Но если есть желание - можно попробовать.
Теоретически новый clickhouse должен заработать на старых данных, но какие конкретно грабли вылезут в ваших конкретных SQL - неизвестно. Если у вас очень простые запросы и структуры таблиц, то может и заработает.
По хорошему, имеет смысл делать апгрейд раз в полгода или год (по LTS версиям) тщательно просматривая список несовместимостей, и принимая решение по каждой индивидуально.
В вашем "запущенном" случае, возможно стоит построить отдельный кластер, перелить данные и отладить SQL запросы на новой версии. Если данных очень много - перелить часть на тестовый кластер и отладить там. -
У нас совершенно тупые и мелкие запросы.
Сейчас как раз и хочу переделывать. -
У нас агрегация пятиминутных данных вне клика, хочу переделать на материал виев переделать.
-
Да много чего хочу перекинуть на клик...
А пока там только инсерт и селект простейшие по шардам -
Тестовый шард в тестовом окружении есть.
-
Спасибо. Значит критичного НЕТ не прозвучало, значит надо просто протестится
-
Нашел один сниппет у себя, может сможете его к своему кейсу применить.
WITH t AS
(
SELECT
toDate('2022-01-01') AS d,
1 AS v
UNION ALL
SELECT
toDate('2022-01-04') AS d,
2 AS v
UNION ALL
SELECT
toDate('2022-01-09') AS d,
3 AS v
)
SELECT
d,
v
FROM t
ORDER BY d ASC WITH FILL
INTERPOLATE ( v AS v )
Query id: 44f96091-c4d6-45f1-be1d-e1c91ca1b01e
┌──────────d─┬─v─┐
│ 2022-01-01 │ 1 │
└────────────┴───┘
┌──────────d─┬─v─┐
│ 2022-01-02 │ 1 │
│ 2022-01-03 │ 1 │
│ 2022-01-04 │ 2 │
└────────────┴───┘
┌──────────d─┬─v─┐
│ 2022-01-05 │ 2 │
│ 2022-01-06 │ 2 │
│ 2022-01-07 │ 2 │
│ 2022-01-08 │ 2 │
│ 2022-01-09 │ 3 │
└────────────┴───┘ -
Спасибо!
-
я бы примерно так попробовал бы начать
with
lagInFrame(val) OVER (PARTITION BY val ORDER BY val ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as prev,
if(val = 0, prev, val) as myval
select
myval
from
table -
Всем привет, можно ли дедуплицировать данные с помощью replicated_deduplication_window?
Или возможно есть другое решение
В общем идея такая:
Есть два цода, в них по кластеру клика с одинаковыми данными.
КХ пишет данные из кафки 1 цода и 2 цода одновременно
На время работоспособности 1 цода, во 2 цоде, в кафке, пустые топики
Но когда переключили на второй цод, то данные в топиках кафки будут одинаковые.
Думаю как избавиться от дублей.
1. Есть топорное решение - на момент переключения цода скейлить кафку в 0 в цод1.
2. Решить через параметр replicated_deduplication_window
Тут тоже есть вопросы:
- в kafka engine max_block_size = 64535 это тот же самый блок, который движок будет хешировать и в дальнейшем сравнивать с другими блоками из кафки?
- Параметр хоть и глобальный, но правильно ли я понимаю что он применяется конкретно на таблицу?
- Если да, то исходя из самого большего топика, можем выставить в ~350 блоков ( 20 000 000÷64535~= 309 будет генерится за минуту) . Стоит ли в такую выкручивать или надо выставлять больше?
- Насколько я могу понять, выкручивание этого параметра будет мне стоить CPU, сети и небольшой нагрузкой на zk. IO не будет затронуто
Заранее благодарю за ответы -
with [4,0,0,2,0,3,0,0,0] as a
select val, argMaxIf(val,row-1,val != 0) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
from (select arrayJoin(a) as val
,row_number() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as row) -
это counter потому что
а не gauge -
replicated_deduplication_window
нужен для дедупликации блоков при повторной вставке точно таких же данных
то есть вы делаете INSERT
в середине что-то идет не так (сеть моргнула)
и вы не знаете. вставил сервер данные или нет
вы вставляете данные повторно
и если точно такой же блок данных с такой же контрольной суммой был вставлен ранее, то ваш второй INSERT просто игнорируется...
ну вот это window это время в течении которого в ZK будут контрольные суммы партов вставленных храниться для ReplicatedMergeTree таблицы -
На сколько я понимаю, оно показывает текущее использование памяти, и почему-то превращается в петабайты, хотя между ними проскакивают и мегабайты 520Мб - это как раз правильное значение.
На самом деле оказалось, что дело в битых данных в trace_log: в логах заметил, что крашится мердж на последних партах этой таблицы с сообщением
[Queue = DB::MergeMutateRuntimeQueue]: Code: 241. DB::Exception: Memory limit (total) exceeded: would use 256.00 PiB (attempt to allocate chunk of 288230376155744279 bytes)
и поскольку смерджить оно пытается постоянно, то и постоянно в логе валятся ошибки а мемори трекинг взлетает до указанного значения. Это влияет на остальные запросы которые иногда ошибочно прибиваются из-за превышения лимита.
+ если ORDER BY trace_log тоже выдавал ошибку unexpected EOF, хотя без сортировки было все ок.
Я просто сделал транкейт на таблицу trace_log - и проблема сразу решилась: с памятью все ок, запросы не падают, ошибки пропали. -
тогда это баг
судя по bug tracking надо версию clickhouse обновить до 22.3 как минмум
https://github.com/ClickHouse/ClickHouse/issues/41917#issuecomment-1264121675Memory limit (total) exceeded: would use 275.91 PiB (attempt to allocate chunk of 4826417 bytes), maximum: 56.63 GiB · Issue #41917 · ClickHouse/ClickHouseClickHouse version: 22.3.3.44 Machines Memory: 62G OS: CentOS 7.6.1810 Hello! I often receive this error during the time when I use ck. I thought it could be solved by setting max_server_memory_usa...
-
Window это не время, вы наверное с другим параметром путаете
replicated_deduplication_window
The number of most recently inserted blocks for which ClickHouse Keeper stores hash sums to check for duplicates. -
Либо в документации ошибка
-
тьфу ... да, извините, это не время конечно, это кол-во блоков
https://clickhouse.com/docs/en/operations/settings/merge-tree-settings/#replicated-deduplication-windowMergeTree tables settings | ClickHouse DocsThe values of mergetree settings (for all MergeTree tables) can be viewed in the table system.mergetreesettings, they can be overridden in config.xml in the mergetree section, or set in the SETTINGS section of each table.
-
все ок в документации =)
-
Собственно вопросы остаются открытыми, как приблизительно работает replicated_deduplication_window я знаю:)
-
если вы вставляете данные из Kafka
то по моему нет гарантии что при потере ДЦ данные будут вставляться теми же самыми блоками в replicatedmergetree
для engine=Kafka нет exactly once семантики -
Оу, точно
‘’’нет гарантии что при потере ДЦ данные будут вставляться теми же самыми блоками в replicatedmergetree’’’
Об этом я не подумал -
https://kb.altinity.com/altinity-kb-integrations/altinity-kb-kafka/altinity-kb-kafka-main-parsing-loop/
вот надеюсь поможет для лучшего понимания как engine=Kafka работает -
exactly once есть в kafka-connect-sink
https://clickhouse.com/docs/en/integrations/kafka/clickhouse-kafka-connect-sink/#configuration-optionsClickHouse Kafka Connect Sink | ClickHouse DocsThe official Kafka connector from ClickHouse.
-
Я обновлялся до последней: 23.1.2.9. У меня просто ощущение, что оно не могло из-за битого файла правильно определить правильный объем памяти. Поскольку я на обычном селекте с сортировкой получал "неожиданный конец файла". А неправильная память - это следствие.
А вот как "убились" данные в trace_log - ума не приложу. -
Это не подходит, так как инстансы Кафки разные :/
-
23.1 такая себе версия
по ссылке перейдите
22.3 последнюю там как минимум рекомендуют -
Салют
Помогите оптимизировать селект
У меня есть таблица с результатами пингов (там окол 200к пингов в секунду прилетает). Я часто выгребаю оттуда данные для графиков и тд.
Допустим, хочу на графике отобразить даныне за месяц - клик будет выгребать полдня. Вопрос: можно ли как-то в клике понижать гранулярность выдачи? В графике за месяц не нужны абсолютно все записи, ведь масштаб очень большой. Все равно не оторазить все тысячи записей.
Еще такой момент, допустим я построил граффик за два месяца, вижу там интересный период, выделяю его, в клик уже запрашивается другой период, поменьше, точность там уже по сути должна быть больше так как период меньше, но ‘плотность’ та же.
Можно ли такое провернуть в клике? -
> - Насколько я могу понять, выкручивание этого параметра будет мне стоить CPU, сети и небольшой нагрузкой на zk. IO не будет затронуто
да, все правильно понимаете, если ZK на выделенных машинах, то беспокоится смысла нет, но чем больше кол-во блоков. тем больше времени уйдет на взаимодейтсвие с ZK и может время вставки увеличиться, но у вас кафка, так что вы этого не заметите... -
Да похоже другого варианта, кроме как скейлить в 0 кафку, нету
-
Да, я перешел - почитал. Там же и пишет: Such bizarre numbers are usually a sign of corrupted data... У меня как раз "поломка" была в таблице трейс лог. После чистки - стало ок. Больше вообще ничего не менял.
А вот по версиям вопрос. 23.1.2.9 - последняя стабильная. Я думал такую можно безопасно использовать. Где можно увидеть именно рекомендуемые для продакшена? -
из самого простого можно SAMPLE BY в SELECT использовать
ну и в зависимости от масштаба разный SAMPLE BY брать...
https://clickhouse.com/docs/en/sql-reference/statements/select/sample/
почитайте про Materialized View+AggregatinMergeTree и Projections в документации
https://clickhouse.com/docs/en/sql-reference/statements/create/view#materialized
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/aggregatingmergetree/
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/#projections
также был GraphiteMergeTree
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/graphitemergetree/
в котором есть rollup (старые данные со временем компактифицируются через какую нибудь функцию типа avg)SAMPLE Clause | ClickHouse DocsThe SAMPLE clause allows for approximated SELECT query processing.
-
разные разное рекомендуют =)
stable в clickhouse означает "тесты зелененькие"
есть LTS релизы когда больше внимания bug fix уделяется чем фичам...
это обычно в марте и в августе релизы .3 и .8
https://clickhouse.com/docs/en/faq/operations/production/Which ClickHouse version to use in production? | ClickHouse Docswhich-clickhouse-version-to-use-in-production}
-
Спасибо, сейчас изучу
-
Привет) Подскажите, при выгрузке в ORC/Parquet - они сами жмут или надо дожимать gz/bz2?
-
Правильно ли я понял, sample можно использовать только если я указал sample expression при создании таблицы и это никак не пофиксить?
-
Вижу что можно изменить его
https://clickhouse.com/docs/en/sql-reference/statements/alter/sample-by/ -
да, извините затупил, забыл про это
вместо
SAMPLE BY
можно
WHERE datetime64_field % 10 = 0
или
WHERE rand() % 10 = 0 -
да можно
-
а если мне нужен какой то определенный период? WHERE (created_at < ‘2022-12-19T22:09:52+03:00’ create_at > ‘2022-12-19T22:09:52+03:00’) and created_at % 10 = 0
или лучше период засунуть в prewhere? -
WHERE (created_at < ‘2022-12-19T22:09:52+03:00’ AND create_at > ‘2022-12-19T22:09:52+03:00’) AND rand() % 10 = 0
выберет 10% от всех данных... -
добрый день, можно ли в клик делать группировку по массиву, у меня есть товары, ценники, выделяю 5 сегментов ( 500-1000, 1000-1500, 1500-2000, 2000-2500, 2500-3000). потом получаю информацию по этим группам, выручку, кол-во продаж, рейтинг. но сейчас на каждую группу уходит отдельный запрос, там в where указывается ценовой диапазон. Хочу получить данные одним запросом. есть ли такая возможность?
-
наверняка можно, но только не понятно, что вы и как считаете, поэтому предложить нечего
-
вы можете делать что-то вроде
sumIf(metric, price BETWEEN 500 AND 1000) metric_500_1000,
sumIf(metric, price BETWEEN 1001 AND 1500) metric_1000_1500
и тд -
Aggregate Function Combinators | ClickHouse Docs
The name of an aggregate function can have a suffix appended to it. This changes the way the aggregate function works.
-
не плохая идея, надо попробовать
-
-
Подскажите пожалуйста, как очистить таймзону из datetime?
-
я бы подождал марта и следующей LTS. почитал бы ридми и решал
-
Может быть вам нужно это toTimeZone(datetime_column, 'UTC')
-
он сместит время, надо чтоб такое же осталось, я понял, что поможет timeZoneOffset
-
мы таки запустили qryn для Clickhouse - если кому-то интересно -https://www.producthunt.com/posts/qrynqryn - Polyglot Observability for Logs, Metrics and Traces | Product Hunt
qryn, polyglot observability on ClickHouse. Use APIs you are familiar with such as Loki, InfluxDB, Prometheus, Elastic, OTLP, for logs, metrics, traces and get started in a quick and easy way either self-hosted or with one of our integration partners.
-
opensource версия на https://github.com/metrico/qrynGitHub - metrico/qryn: qryn is a polyglot, high-performance observability framework for ClickHouse. Ingest and analyze logs, metrics and traces from any agent supporting Loki, Prometheus, OTLP, Tempo, Elastic, InfluxDB and more! (formerly cLoki)
qryn is a polyglot, high-performance observability framework for ClickHouse. Ingest and analyze logs, metrics and traces from any agent supporting Loki, Prometheus, OTLP, Tempo, Elastic, InfluxDB a...
-
переезжали с 22.3 на 22.8, никаких подводных камней не было, но всё зависит от того какой функционал вы используете и какое у вас железо. вот например
-
-
Здравствуйте, при работе с TSV (FORMAT TabSeparated) столкнулись с проблемой: при попытке вставки данных из tsv файла падаем на вставке 2-й записи, Code: 27. DB::ParsingException: Cannot parse input: expected '\n' before: '\t {начало 2-й записи}.
При этом работает вставка данных из файлов с одним рядом (1-й записью). Подскажите, что можно сделать -
Количество ожидаемых столбцов не соответствует описанию в DDL
-
То есть грубо говоря, это кликхаус с поверх апи ?
-
ну если совсем грубо :-) а так это всеядная апп которая использует кликхаус как storage
-
-
Я сейчас ввел такой конфиг:
<?xml version="1.0"?>
<yandex>
<s3>
<data_transfer_first>
<endpoint>https://first-data-transfer.s3.us-east-1.amazonaws.com/</endpoint>
<access_key_id>...key_id...</access_key_id>
<secret_access_key>...secret...</secret_access_key>
</data_transfer_first>
<data_transfer_second>
<endpoint>https://second-data-transfer.s3.us-east-1.amazonaws.com/</endpoint>
<access_key_id>...key...</access_key_id>
<secret_access_key>...secret...</secret_access_key>
</data_transfer_second>
</s3>
</yandex>
и почему-то могу использовать только второй бакет -
кх 22.7
-
и где вы это хотите использовать? в табличной функции s3( ...) или в табличном движке?
запрос покажите
и ошбку
эти настройки применяются в по префиксу URL
то есть если у вас URL
начинается с https://second-data-transfer.s3.us-east-1.amazonaws.com/
то применятся настройки data_transfer_second
если с
https://first-data-transfer.s3.us-east-1.amazonaws.com/
то
data_transfer_first -
как S3 engine
чего-то со вторым хочет работать, а с первым нет
креды проверил – точно все правильно
ошибка – якобы файла нет. Хотя он есть
DB::Exception: The AWS Access Key Id you provided does not exist in our records. -
ну есть такая вещь как IAM еще
может у вас с вашего сервера на S3 конкретно на этот бакет нельзя обратиться -
было бы наверное access denied ?
-
не факт
-
понял
перепроверю тогда
Спасибо -
ну то есть самый нормальный вариант с указанными кредами соединиться напрямую через
s3 табличную функцию
или aws s3 вызвать на сервере где clickhouse-server запущен (или внутри контейнера) -
пробнул с кредами в функции – такая же ошибка
хотя на другом кх-кластере, который в этот же S3 смотрит – нет ошибки
поэтому или доступ с сервера поломан, либо баг -
Добрый день!
Подскажите где можно подробнее посмотреть про kafka engine, документация на Altinity от 2020 года и настройки предлагаемы для пула потоков click показывает как устаревшие и не использует.
Проблема в том, что встроенный движок чтения из kafka плохо справляется с большим потоком данных из kafka и теряет 97% данных.
Трейс еще не смотрел, включу сегодня. -
не должен он ничего терять,
отлично он справляется
думаю проблема в том какая у вас структура целевой таблицы в которую через Materialized View из Engine=Kafka данные вставляются -
Структура корректно сделана, данные идут без проблем, если объем сообщений в миллионах.
За час в kafka пришел 1 миллиард сообщений.
Клик его вычитывал 8 часов и в итоге смог залить в таблицы только 30 миллионов.
При меньшей нагрузке все без потерь идет. -
толи лыжи не едут, то ли я того...
создаю таблицу с двумя полями, а клик разбивает поле cookie на два:
cookie.name, cookie.value.
CREATE OR REPLACE TABLE temporary.attribution
(
date Date,
cookie Array(Tuple(name Nullable(String), value Nullable(String)))
)
ENGINE = MergeTree
PARTITION BY toDate(date)
ORDER BY date
может кто встречал такое, подскажите плиз как лечить.
версия 22.8 -
-
ClickHouse столбцовая СУБД, поэтому массив Nested, простой Nested, и т.д. всё равно будут представлены отдельными столбцами 🙂
-
Вставлять при этом в них действительно можно массив туплов и вроде должно работать правильно
-
<Error> void DB::StorageKafka::threadFunc(size_t): Code: 41. DB::ParsingException: Cannot read DateTime: neither Date nor Time was parsed successfully: while executing 'FUNCTION parseDateTimeBestEffort(JSONExtract(message, 'message', 'meta', 'timestamp', 'String') :: 12) -> parseDateTimeBestEffort(JSONExtract(message, 'message', 'meta', 'timestamp', 'String')) DateTime : 11': while pushing to view db.view_good (8951a48b-4951-4b91-9f14-2b206af5a06b). (CANNOT_PARSE_DATETIME)
А как-то можно понять на каком конкретно сообщении из кафки клик споткнулся?
По ошибке не ясно.
Попробовал посмотреть где консьюмеры остановились - там нормальное время указано. Сделал селект на даты - они нормально парсятся...
Может какой-то статус запросить, чтобы понять какие конкретно партиции читает этот инстанс баз?
Или какой-то иной способ дебага этой ошибк? -
просто это ж KeyVal, а он создает Key, Val как отдельные столбцы, как я потом соберу все в кучу? только по индексу выходит...
-
https://kb.altinity.com/altinity-kb-integrations/altinity-kb-kafka/error-handling/
вот тут есть пример отлавливания ошибок -
оу ееее,
есть конфиг который управляет разбитием Nested на столбцы:
https://clickhouse.com/docs/ru/operations/settings/settings/#flatten-nested
может кому пригодитсяНастройки | ClickHouse Docssettings}
-
-
Всем привет - не подскажет кто-нибудь, где можно почитать более подробное описание команд backup/restore со всеми вариантами настроек, в особенности касательно варианта использования с ON CLUSTER clause? Описание на офф сайте очень скудное и даже простейшие эксперименты показывают, что некоторые вещи работают далеко не так, как там описано.
-
ошибки то какие говорит при этом?
у нас без проблем клик на engine=Kafka
миллионы сообщений в секунду вставляет -
что конкретно ? мы создали backup конфиг и после рестарта все работает как и ожидалось
-
Хорошо, вот test case: есть кластер, допустим, на два шарда по две реплики в каждом. В нём сделана база, в ней одна ReplicatedMergeTree таблица и одна смотрящая в неё Distributed таблица. Ко всем нодам по одинаковому пути смонтирован сетевой диск для backups, который прописан в секции storage_configuration. Пробую делать backup на одной ноде - всё нормально, пробую on cluster - не работает.
Ещё один момент - как заставить backup делаться в файл с расширением, отличным от .zip и чтобы сжатие было именно то, которое задано в команде? Т.к. при указании любого другого имени вместо файла создаётся каталог и никакое сжатие ен включается. -
а что оно пишет в логах когда выполняется ON CLUSTER ?
-
на текущий момент поддерживается zip, поскольку только он создаёт рекурсивно архив
-
Вот такая ошибка выдаётся при попытке сделать backup database on cluster:
Code: 999. DB::Exception: Received from localhost:9000. DB::Exception: DB::Exception: Code: 999. Coordination::Exception: Node exists, path: /clickhouse/backups/backup-2e55c972-9646-4e03-bffc-e8b77106c358/repl_part_names/1082c8f1%2D6287%2D4fd6%2D8729%2Df8ffdbdb48d0/01: While collecting data of table test.events_local for backup. (KEEPER_EXCEPTION),. (KEEPER_EXCEPTION)
Ну а касательно расширения - ну там как бы ошибки никакой нет, просто вместо файла создаётся каталог и никакого сжатия. -
Супер. Идея огонь. Попробую прикрутить.
А вот интересно - не нашел ответ. В default режиме если в SELECT перекладывающем в MV из кафки происходит ошибка - что с этим сообщением становится? он его скипает или пытается периодическ вычитать заново? -
частично ответ есть:
kafka_skip_broken_messages — Kafka message parser tolerance to schema-incompatible messages per block. If kafka_skip_broken_messages = N then the engine skips N Kafka messages that cannot be parsed (a message equals a row of data). Default: 0.
но если равно=0, то что он дальше делает? -
нигде пока...
разве что тесты и исходники смотреть -
То есть опять, как всегда, великий и могучий open source копать. Печаль...
-
даже более того =)
PR вот сюда https://github.com/ClickHouse/ClickHouse/tree/master/docs/en/sql-reference/statements сделаете
вам будут несказанно благодарны все участники сообществаClickHouse/docs/en/sql-reference/statements at master · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
это ошибка киппера - он пытается создать директорию, которая уже существует - проверьте /clickhouse/backups/backup-2e..... Киппер на том же хосту ?
-
Нет, ZooKeeper на отдельных хостах.
-
ZooKeeper или clickhouse-keeper ?
-
ZooKeeper
-
возможно проблема в нём и он не создаёт бекапы. По любому, проверьте если эта папка создана предыдущими бекапами ?
-
Сделал чистый прогон - остановил ClickHouse на всех нодах, вынес все данные из ClickHouse через rm -rf в каталоге с данными и в каталоге под backups, снёс ветку /clickhouse в ZooKeeper, запустил кластер, залил скриптами тестовые данные, команда backup database test on cluster '{cluster}' to Disk('backups', 'test-cl') вы даёт ровно ту же ошибку.
-
То есть никаких хвостов ни в ClickHouse, ни в ZooKeeper на момент теста команды не было.
-
а если заменить на clickhouse-keeper ? Или это геморой ?
-
Ну в production у нас пока замена на clickhouse-keeper не планируется. На стенде попробовать можно, но это уже вопрос не 10 минут однозначно.
-
чтобы исключить все варианты
-
Я понимаю - чуть позднее попробую, отпишусь по результатам.
-
👍
-
стоит сделать
какой то docker-compose.yaml
и SQL для воспроизведения
и зарепортить issue на https://github.com/ClickHouse/ClickHouse/issues
выглядит как конкурентная попытка писать в один и тот же ключ в zookeeper с разных нод
версия clickhouse-server какая?
попробуйте до 23.1 обновиться -
-
-
а вам этого мало?
-
да как-то хотелось бы иметь честные try except, ну нет так нет :)
-
python + requests + json.dumps + try/except
-
Эта штука работает JSONEachRow и подобных форматом.
У меня JSONAsString - т.е. ошибки на этапе чтения как я понимаю нет. В итоге эта вьюха всё читает безошибочно.
А вот если во вьюхе JSONExtract делает - то неясно как ошибку идентифицировать. 🙁 -
а у тебя невалидный JSON чтоли приходит?
или валидный но в котором данных нет? -
Я в кафке смотрю. Он валидный. Через jq. его прогоняю валидный.
Поле достаю. Достается.
Делаю на него parseDateTimeBestEffort('') - работает.
Но ошибку вот такую победить не могу.
<Error> void DB::StorageKafka::threadFunc(size_t): Code: 41. DB::ParsingException: Cannot read DateTime: neither Date nor Time was parsed successfully: while executing 'FUNCTION parseDateTimeBestEffort(JSONExtract(message, 'message', 'meta', 'timestamp', 'String') :: 12) -> parseDateTimeBestEffort(JSONExtract(message, 'message', 'meta', 'timestamp', 'String')) DateTime : 11': while pushing to view db.view_good (8951a48b-4951-4b91-9f14-2b206af5a06b). (CANNOT_PARSE_DATETIME) -
тоже сталкивался, по этому решил уйти на python.
-
У меня создана табличка.
и такая вьюха
CREATE MATERIALIZED VIEW db.view_good ON CLUSTER sharding_3shard_2repl TO db.events_good
(
`msg_client_timestamp` DateTime,
...
) AS
SELECT
parseDateTimeBestEffort(JSONExtract(message, 'message', 'meta', 'timestamp', 'String')) AS msg_client_timestamp,
...
FROM db.kafka_good -
Всем привет! такой вопрос. Есть s3 диск, есть своя storage_policy для него. Что-то никак не могу придумать и найти, как запретить некоторым пользователям использовать settings storage_policy = '...' при создании таблиц?
-
я через обычное mysql подключение делаю insert into table format TabSeparated далее перевод строки и затем csv и работает
-
-
Привет народ! а как выключить трейс логи на совсем? из конфига кусок выпилил, total_memory_profiler_step обнулил, а логи все равно лежат в системной таблице
-
-
сделал, не помогло
-
что не помогло?
табличку то после этого грохнули через DROP TABLE system.trace_log ON CLUSTER '{cluster}' SYNC?
настройки из конфига помогают не пистаь в таблицу
а чистить ее руками все равно придестя -
она пополняется )
-
таблицу DROP Делали?
после этого сервер ребутили? -
конечно
-
сначала ансиблом делал, потом пошел и руками на кластере создал файлики с такими значениями - похрен ему
-
grep trace_log /var/lib/clickhouse/preprocessed_configs/config.xml
что показывает? -
Data will be stored in system.trace_log table with query_id = empty string.
<!-- Collect random allocations and deallocations and write them into system.trace_log with 'MemorySample' trace_type.
<!-- <trace_log>
<table>trace_log</table>
</trace_log> -->
Regardless of this configuration, the addresses are visible in the system.stack_trace and system.trace_log tables
<trace_log>
</trace_log> -
пойду искать где это кусок последний
-
это тот кусок, что я взял по ссылке и раскрыл как xml в виде <trace_log><remove>0</remove></trace_log>
-
все равно пишутся
-
а, не, все норм )
-
там же тег, а не атрибут
-
у вас конфиги чтоли в yaml ?
-
В ансибле?
-
В клике нет
-
Привет! Подскажите, кто-нибудь пользуется clickhouse-keeper в докере? При запуске получаю ошибку Our server id 3 not found in raft_configuration section
if (!result.config && !allow_without_us)
throw Exception(ErrorCodes::RAFT_ERROR, "Our server id {} not found in raft_configuration section", my_server_id);
предполагаю, это потому что ip в конфиге не совпадает с ip внутри контейнера, не вижу в коде можно ли отключить эту проверку -
у вас один keeper instance или кластер ?
-
вообще в raft_configuration сервера лучше задавать через DNS имена
-
кластер их 3х нод, использую dns имена
-
тогда попробуйте на первой ноде стартовать с ключем --force-recovery
суть в том что raft configuration есть на диске в XML и в базе keeper
и то что в базе типа приоритетно, нафига так сделано, до сих пор не ясно... -
Спасибо, попробую
-
Пользуемся. Взял last image с docker hub - там отдельно есть имаджи для keeper. Полёт нормальный. Может в конфиге проблема.
-
Всем привет!
Может кто сможет подсказать, пожалуйста, как мне из такого параметра посчитать сумму всех значений в параметре 'c'.
"dr_fin":[{"n":"1x2","c":1},{"n":"2x2","c":1},{"n":"3x1","c":1}] ? -
Если вдруг кому будет интересно в будущем.
Нормально из лога понять на каком конкретно сообщении происходит такая ошибка невозможно.
Как можно упростить поиски:
устанавливаем на кафка табличке опции:
kafka_max_block_size = 1,
kafka_num_consumers = 1,
Это надо сделать, т.к. дефолтные батчи как правило сильно больше и копаться в топике придется глубоко и долго.
запускаем цепочку.
таким образом клик по-одному сообщению дойдет до проблемного. Оффсеты на проблемных партициях остановятся.
Можно зайти в эти партиции в кафке и посмотреть сообщения.
Либо можно попытать удачу и сделать запрос в таблицу кафки, но тут нет гарантий получить результат.
На каждой ошибке клик будет рестартовать кафка-клиент, что будет приводить к ребалансингу и последующему чтению.
Полагаю клик продолжает читать со следующей партиции.
Тут по нюансам чтения я плаваю конкретно. Может опытные коллеги меня поправят.
https://kb.altinity.com/altinity-kb-integrations/altinity-kb-kafka/altinity-kb-kafka-main-parsing-loop/ - тут описан цикл чтения данных.
А свой null я нашел 🙂 -
Поведение с ребалансингом консьюмер группы во время ошибки записи в MV и перечитыванием батча - кстати очень интересная затея.
В моем случае она привела к тому, что на кафка брокерах на сетевых интерефейсах появилась знатная расчестка под 100мегабит при обычных 2-5 мегабитах. - 02 February 2023 (182 messages)
-
Приветствую всех, помогите с составлением запроса
Есть 3 таблицы
sessions (id)
bets (session_id, amount)
wins (session_id, amount)
Таблица session имеет по одной записи на сессию, bets, wins могут быть в множественном числе со связующим ключом session_id
Хочу построить запрос, который позволит вывести суммарное значение sum(bets.amount), sum(wins.amount) для каждой сессии, join в данной ситуации не срабатывает, подскажите, какой запрос нужно делать -
Обычный group by session_id тоже не работает? Два запроса можно сделать? Если надо именно один
То есть ‘select … group by… union all select …group by’ -
Не сработало, пока сделал так
SELECT
id session_id,
user_id,
game_name,
game_provider,
bets,
wins,
created_at
FROM slot_sessions AS sessions
INNER JOIN
(
SELECT SUM(amount) bets, session_id FROM slot_bets GROUP BY session_id
) AS tbets
ON tbets.session_id = sessions.id
INNER JOIN
(
SELECT SUM(amount) wins, session_id FROM slot_wins GROUP BY session_id
) AS twins
ON twins.session_id = sessions.id
WHERE user_id = 2610 -
Помогите, не могу разобраться как решить замену (подстановка предыдущего значения, если семафор это ноль) в моëм примере:
https://fiddle.clickhouse.com/a2b71383-7b2e-422e-9a2f-a76b8a70c0de
сейчас
1675149120 2023-01-31 0603 0 tag2
1675149240 2023-01-31 0603 1 tag4
1675149300 2023-01-31 0603 2 tag5
1675149360 2023-01-31 0603 1 tag6
1675149420 2023-01-31 0603 0 tag7
1675149180 2023-01-31 0603 2 tag3
1675149480 2023-01-31 0603 0 tag8
1675149540 2023-01-31 0603 0 tag9
1675149660 2023-01-31 0603 1 tag2
1675149600 2023-01-31 0603 1 tag1
1675149060 2023-01-31 0603 0 tag1
должно стать
1675149120 2023-01-31 0603 0 tag2
1675149240 2023-01-31 0603 1 tag4
1675149300 2023-01-31 0603 2 tag5
1675149360 2023-01-31 0603 1 tag6
1675149420 2023-01-31 0603 1 tag7
1675149180 2023-01-31 0603 2 tag3
1675149480 2023-01-31 0603 2 tag8
1675149540 2023-01-31 0603 2 tag9
1675149660 2023-01-31 0603 1 tag2
1675149600 2023-01-31 0603 1 tag1
1675149060 2023-01-31 0603 1 tag1 -
Доброе утро, кто сталкивался с тем что кх не может достучаться до jdbc bridge?
2023.02.02 10:02:25.414537 [ 94 ] {5fa76cee-380c-4854-85e0-b21681a9820b} <Debug> executeQuery: (from [::1]:45024) SELECT * FROM jdbc.crm_area LIMIT 10
2023.02.02 10:02:25.415746 [ 94 ] {5fa76cee-380c-4854-85e0-b21681a9820b} <Trace> ReadWriteBufferFromHTTP: Sending request to http://localhost:9019/ping
2023.02.02 10:02:25.417495 [ 94 ] {5fa76cee-380c-4854-85e0-b21681a9820b} <Trace> JDBCBridgeHelper: clickhouse-jdbc-bridge is not running, will try to start it
При этом jdbc доступен
curl -i http://localhost:9019/ping
HTTP/1.1 200 OK
Date: Thu, 02 Feb 2023 07:03:47 GMT
Content-Length: 4
Server: Jetty(9.4.z-SNAPSHOT)
Ok.
Версия бриджа старая - 1.0.1 - не работает, ошибка выше
Если запускаю свежую версию - 2.1.0, то запросы работают, бридж доступен.
Ранее старый бридж так же работал, но теперь кх отказывается его видеть.
Что то где то могло закешироваться касательно бриджа? -
Ошибка с трейсом
https://pastila.nl/?00ea0713/0df928f86eda16e7bac844d8a6542356 -
можно сделать что то типа
CREATE DICTIONARY slot_session_cached_dict AS SELECT session_id, user_id, game_name, game_provider FROM slot_session
PRIMARY KEY session_id
SOURCE (CLICKHOUSE(database 'default' table 'slot_sessions' ))
LAYOUT(CACHE(...))
и
SELECT session_id, user_id, game_name, game_provider, SUM(bets) AS total_bets, SUM(wins) AS total_wins
FROM (
SELECT
session_id,
dictGet('default.slot_session_cached_dict','user_id',session_id) AS user_id,
dictGet('default.slot_session_cached_dict','game_name',session_id) AS game_name,
dictGet('default.slot_session_cached_dict','game_provider',session_id) AS game_provider,
sum(amount) bets,
0 wins
FROM slot_bets
WHERE user_id=2610
GROUP BY session_id
UNION ALL
SELECT
session_id,
dictGet('default.slot_session_cached_dict','user_id',session_id) AS user_id,
dictGet('default.slot_session_cached_dict','game_name',session_id) AS game_name,
dictGet('default.slot_session_cached_dict','game_provider',session_id) AS game_provider,
0 bets,
sum(amount) wins
FROM slot_wins
WHERE user_id=2610
GROUP BY session_id
)
GROUP BY session_id, user_id, game_name, game_provider
запросы в UNION ALL будут паралельно работать
правда таблицы будут кажется сканиться ПОЛНОСТЬЮ... хотя если там ORDER BY session_id может и будет слегка побыстрее -
фиг знает, а что мешает то новую версию брижжа использовать?
точно на 9019 висит старый бридж?
может локалхост как нибудь не так
ss -nltp | grep 9019 или netstat -nltp | grep 9019
что показывает?
может localhost как то не так резолвится... и кликхаус ломится например на ipv4 а бридж слушает ipv6? -
https://fiddle.clickhouse.com/42a0875d-ec8c-4f2d-8715-30480f4b076c
так то, что Вы хотите? -
Да, спасибо!
-
Привет ))
Возможно кто-то сможет подсказать по вопросам установки clickhouse на сервер , это очень поможет, а то немного в тупике ☺️
установила clickhouse на ubuntu 20.04, статус running. работает также на хосте сервера , создала учетку root c grant правами, и пользователя с доступом по хосту нашего сервера , у default права = 0.
в итоге через созданных пользователей могу зайти по хосту сервера на порт 9000, а при авторизации в dataGrip по порту 8123 могу зайти только через default учетку. Как получить возможность заходить в datagrip через других созданных пользователей ?)) -
Мы как раз и готовимся к переходу на новую версию. Но перед этим в случае проблем прорабатываем сценарии отката.
netstat -nltp | grep 9019
tcp6 0 0 127.0.0.1:9019 :::* LISTEN 24057/java -
-
не забыли указать откуда подключение разрешено?
show create user root
┌─CREATE USER root─────────────────────────────────────────────────────────────────┐
│ CREATE USER root IDENTIFIED WITH sha256_password HOST LOCAL, IP '10.10.10.0/24' │
└──────────────────────────────────────────────────────────────────────────────────┘ -
Привет! а есть кто опытный, вдруг статью писал с исследованием перфоманса: ClickHouse с большими табличками + Словари для того, чтобы на лету потом по этому словарю делать груп-бай и фильтр. (типа словарь может часто меняться, не хочется пересчитывать историю)
-
-
Пересадил джаву на ipv4, используя параметр -Djava.net.preferIPv4Stack=true
netstat -ntulp | grep 9019
tcp 0 0 127.0.0.1:9019 0.0.0.0:* LISTEN 24655/java
Ошибка та же -
ага, указано также только ip без узла. но что-то не хочет..
только я указываю ip нашего сервера , а нужно может дефолтный ? -
Судя по Avro vs. AvroConfluent, нужет ProtobufConfluent. Но такого нет.
-
А в чем вопрос? Словарь лежит в памяти и это будет достаточно быстро. Быстрее джойнов в кх не слышал
-
Всем привет. В докере, network host mode, кликхаус после перезапуска не открывает сетевые порты. Раньше всё нормально было. В логах идут ошибки "Too many parts (300)..." - может из за этого сервер не открывать порт? Как можно чекнуть прогресс мёрджа?
-
нужно указать ip с которого идут подключения, т.е. там где datagrip запускаете
-
может быть он просто отбрасывает инсерты?
-
оу поняла , попробую , спасибо большое!
а такой вопрос, чтобы создать общую учетку там для разрабов и аналитиков то это параметр при создании ANY? -
Спасибо за ответ. Вопрос в том, как это люди делают оптимально и всё же равно будет падение скорости со словарем / без, какие-то бенчмарки, поэтому и спрашиваю про статью, если кто-то провел RnD, это бы мне сэкономило N дней для такую же проверку =)
-
netstat -tulpn | grep 8123 пусто. 9000 порт тоже
-
В целом спасибо, помогли, понял что кх идёт сначала в localhost ipv6 и не находя там ничего, не пытается поретраить. Если отключить ipv6 в системе, кх начинает корректно видеть бридж. Буду думать что с этим делать
-
посмотрите
/etc/hosts
там обычно localhost
как ipv6 любят теперь прописывать
если это убрать то можно и ipv6 не отключать... -
@aoparin все поняла,получилось , спасибо ))
-
Всем привет.
У меня есть таблица, которая заполняется с помощью питон-скрипта данными с гранулярностью 1 минута.
Я создал матвью на движке AggregatingMergeTree, запрос в котором агрегирует данные из таблицы выше с гранулярностью 1 час.
Если я заполняю исходную таблицу инсертом из IDE DataGrip, матвью заполняется, но если делаю тот же инсерт из питон-скрипта, матвью не реагирует на этот инсерт.
Подскажите, в чем дело? Как это исправить? -
пожалуйста, рад, что разобрались
-
если мы говорим про одну большую таблицу и рядом словарь в памяти, то здесь достаточно все тривиально уже
Если вы обрисуете точнее задачу, будет проще -
ааа ну это короче там вот штука наверное, а да .... Ну короче наверное мы не ванги :) Хотя бы SQL создание MV покажите
-
Скорей всего разница в преобразование данных
-
CREATE MATERIALIZED VIEW agg_mv ON CLUSTER 'cluster'
(
id UInt64,
timecode_60 DateTime,
currency AggregateFunction(argMax, Nullable(String), DateTime),
cost_per_hour AggregateFunction(max, Nullable(Float64))
)
ENGINE = AggregatingMergeTree
PARTITION BY toYYYYMM(timecode_60)
ORDER BY (id, timecode_60)
SETTINGS index_granularity = 8192
AS
SELECT
id AS id,
toStartOfHour(timecode) AS timecode_60,
argMaxState(currency, timecode) AS currency,
maxState(cost_per_hour) AS cost_per_hour
FROM table
GROUP BY id,
toStartOfHour(timecode); -
еще такой момент:
таблица table имеет движок Distributed, она объединяет таблицы на движке ReplicatedMergeTree на 6 нодах -
Табличка большая с транзакациями, пересчет-поставка с новыми полями — дорохо =)
бизнес-заадча: есть идеи, как посмотреть бизнес по этим транзакциям. каждая идея - группировка транзакций по-разному. всё это в BI засунуто, то есть хочется, чтобы через выбиралку "хочу смотреть вот так" - подтягивалась своя логика расчета поля группировки.
f(*args), где аргументов будет условно 3 и дальше есть варианты, где есть комбинации с 1 заполненным полем и с 3, там где 1 - типа приоритетнее (вот тут не понимаю, как обыграть, придется или 2 дикта делать и потом coalesce или как-то можно по-хитрому диапазон?) -
А вы точно вставляете в одну и туже таблицу ?
-
TWIMC по поводу OR в JOIN
@AlekseiSaff try to rewrite join condition to have OR on the top level (using https://en.wikipedia.org/wiki/De_Morgan%27s_laws). So condition should looks like (cond1 AND cond2 AND cond3) OR (cond4 AND cond5 AND cond6) OR (cond7 AND cond8 and cond9) (some conds can be the same)
Particular example:AlekseiSaff - OverviewAlekseiSaff has 10 repositories available. Follow their code on GitHub.
-
upd. мой косяк с кредами для одного из бакетов
все абсолютно норамльно работает с конфигом для двух бакетов
Спасибо -
да, в первую очередь это проверил
доходило до того, что я копировал запрос из скрипта и запускал его из IDE, из IDE всё работает, а из скрипта нет -
А данные через скрипт в таблице исходной то появляются?
-
-
да
-
точно не скажу, но когда я из кафки забирал данные джисоном, а не по конкретным полям, я забирал их в виде строки, а после с помощью матвью обрабатывал эти строки как джисоны и извлекал нужные мне поля
не решение, а скорее костыль, но вдруг поможет -
-
splitByRegexp
-
Он не разбивает на строки, как string_split..
-
Здравствуйте, подскажите как правильно почистить из схемы system таблицы query_log, query_thread_log, trace_log и прочие*_log. Можно ли дропнуть на кластере? В доке указано, что КХ их пересоздаст. Или так нельзя?
-
-
-
ещё можно настроить ttl. https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-system-tables-eat-my-disk/
-
Здравствуйте!
Есть ли способы детально посмотреть, как происходит взаимодействие клика и MySQL сервера при использовании MySQL table engine / function? В частности, посмотреть отправляемый запрос.
Столкнулись с тем, что при добавлении WHERE с фильтром на одну из колонок типа DateTime рвётся соединение от клика к mysql (SQL Error [1000] [08000]: Poco::Exception. Code: 1000, e.code() = 2013, mysqlxx::Exception: Lost connection to MySQL server during query), воспроизвели на версиях 22.12.2.25 и 22.7.2.15 (прод + стенд для обкатки новых версий). При этом при использовании других колонок (в том числе того же типа) соединение не рвётся, при отсутствии фильтров вообще -- не рвётся, что колонка не nullable на обеих сторонах проверили, min-max на источнике в диапазоне 2021-2023, таймауты для table engine выставили в 300 (5 минут) какие нашли -- connection_wait_timeout, connect_timeout, read_write_timeout. -
-
ну через tcpdump трафик снимите на clickhouse server в сторону mysql сервера на 3306 порт
а потом в wireshark
он умеет mysql смотреть
ну или pt-query-digect на снятый pcap натравить
вообще там простой алгоритм
все операции GROUP BY и ORDER BY делаются на стороне clickhouse
а в конечный запрос на MySQL
по максимуму стараются прокинуть WHERE условия, чтобы выбрать нужный кусок таблицы... -
Спасибо!
-
поперчите arrayJoin’ом
-
Благодарю, а чем этот запрос лучше того, что у меня получился? Я работаю с кликхаус буквально несколько дней и абсолютно не знаю тонкостей
-
быстрее должно быть и памяти меньше жрать
JOIN в clickhouse такое себе.. тем более что в вашем случае он не нужен -
-
Без всяких библиотек просто по HTTP отправляйте запросы INSERT - https://clickhouse.com/docs/ru/interfaces/http/HTTP-интерфейс | ClickHouse Docs
http-interface}
-
А почему так? Можно полюбопытствовать?
-
Это самый простой способ. Если не нужно читать, то и обертки становятся ненужными. Если нужно читать, то можно либо взять готовую библиотеку, либо сделать свою реализацию. Все библиотеки для питона являются обертками для HTTP API
-
у вас данные в питон откуда берутся?
как потом вставляете, сколько строк в одном INSERT запросе? -
не все
есть либы для TCP Native протокола... -
а сейчас у вас медленно? или вы еще не пробовали?
-
Мне, к сожалению нужно. Читаю с помощью clickhouse_driver и pd.dataframe. А затем пишу через insert_dataframe
-
clickhouse-driver ? Или еще есть?
-
https://clickhouse-driver.readthedocs.io/en/latest/
Вот эта работает с нативным портом точно -
clickhouse-local + python (subprocess)
-
1. Читаю из того же клика client.query_dataframe
2. Преобразую несколько колонок с помощью функции по парсингу user_agent
3. Пишу обратно в другую таблицу.
300к строк около 100 секунд. -
то есть вы берете данные из clickhouse
потом что-то с ними делаете (что кстати?) в pandas
потом обратно пишете в clickhouse?
и? что по вашему там тормозит?
профайлить пробовали через py-spy ? -
-
о !
так вам нужен regexp_tree словарь тогда скорее всего
https://clickhouse.com/docs/en/sql-reference/dictionaries/external-dictionaries/regexp-tree/
правда это в clickhouse-servrer 23.1 только вошло
и все делается тогда одним запросом
INSERT new_table SELECT dictGet('db.regexp_dict', ...) FROM old_tableRegExp Tree Dictionary | ClickHouse DocsRegexp Tree dictionary stores multiple trees of regular expressions with attributions. Users can retrieve strings in the dictionary. If a string matches the root of the regexp tree, we will collect the corresponding attributes of the matched root and continue to walk the children. If any of the children matches the string, we will collect attributes and rewrite the old ones if conflicts occur, then continue the traverse until we reach leaf nodes.
-
ну еще clickhouse-sqlalchemy которая поверх clickhouse_driver
-
Он юзер агента вытаскивает в python'e
-
Это уже обертка над библиотекой. То есть не самостоятельная библиотека.
-
ну =) скорее всего там какая то либа а-ля
https://github.com/ua-parser/uap-python
которая на regexp_tree ложитсяGitHub - ua-parser/uap-python: Python implementation of ua-parserPython implementation of ua-parser. Contribute to ua-parser/uap-python development by creating an account on GitHub.
-
user_agents
Сейчас замеряю - смогу сказать -
если будете новую фичу клика юзать чтобы клик сам все сделал
то вот скрипт который конвертит ua-core yaml в regexp_tree формат
https://gist.github.com/hanfei1991/6a6dae16f1f3fc5d778450da7f874e10convert.pyGitHub Gist: instantly share code, notes, and snippets.
-
Читал, но пока не использовал. Да и версия у нас постарше.
-
в общем думается мне что у вас 90% времени скрипта занимает как раз парсинг этих самых user agents
а не вставка -
Есть ли какие то особенности при группировке по полю из словаря?
Например, есть ip и есть словарю ip->city и группировка идет по городу.
Или есть user-agent и группировка по браузеру.
Если по ip все вроде понятно, то по user agent нет.
Там довольно длинная строка.
И насколько это все будет шустро работать?
Прочитать данные, распарсить каждую строку, сгруппировать.
Или лучше при вставке разбирать? -
Проверил. Работает медленно именно парсинг
29895 rows
--- 8.494282007217407 seconds one part execute ---
--- 0.9648690223693848 seconds read from CH---
--- 0.7914137840270996 seconds insert to CH---
Вопрос явно не к CH. Пойду к доктору. Пусть делает что-то с руками и головой. -
For the record, проблема была в том, что таймауты выставлены не в тех единицах измерения. В доке написано, что это секунды, на практике -- нет.
Это уже было в старых issues: https://github.com/ClickHouse/ClickHouse/issues/34168#issuecomment-1229881249
Заменили в таймауте 300 на 300000, и всё заработало.Lost connection to MySQL server during query · Issue #34168 · ClickHouse/ClickHouseHello, Since upgrade CH version 21.4.xxx to 22.1.xx we have the following error when running MySQL selects that takes more than 5 seconds. In MySQL we see 6 incoming connections but clickhouse is t...
-
Повторю вопрос, а то он затерялся, а ответа пока не нашел.
У меня есть таблица, которая заполняется с помощью питон-скрипта данными с гранулярностью 1 минута.
Я создал матвью на движке AggregatingMergeTree, запрос в котором агрегирует данные из таблицы выше с гранулярностью 1 час.
Запрос для матвью:
CREATE MATERIALIZED VIEW agg_mv ON CLUSTER 'cluster'
(
id UInt64,
timecode_60 DateTime,
currency AggregateFunction(argMax, Nullable(String), DateTime),
cost_per_hour AggregateFunction(max, Nullable(Float64))
)
ENGINE = AggregatingMergeTree
PARTITION BY toYYYYMM(timecode_60)
ORDER BY (id, timecode_60)
SETTINGS index_granularity = 8192
AS
SELECT
id AS id,
toStartOfHour(timecode) AS timecode_60,
argMaxState(currency, timecode) AS currency,
maxState(cost_per_hour) AS cost_per_hour
FROM table
GROUP BY id,
toStartOfHour(timecode);
Таблица table имеет движок Distributed, она объединяет таблицы на движке ReplicatedMergeTree на 6 нодах
Если я заполняю исходную таблицу инсертом из IDE DataGrip, матвью заполняется, но если делаю тот же инсерт из питон-скрипта, матвью не реагирует на этот инсерт, хотя данные в исходную таблицу долетают
Подскажите, в чем дело? Как это исправить? -
А матвью над какой таблицей сделан? Над локальной или distributed? И вставка в какую таблицу идет локальную или distributed?
-
При использовании table function в конец запроса подставляем SETTINGS external_storage_rw_timeout_sec = 300000.
-
матвью обращается к distributed таблице. Вставка данных также в distributed таблицу идет, а там уже распределяется по нодам
-
Матвью создана на всех нодах? Датагрип и питон вставляют всегда в одну и туже ноду? Никакого балансера перед ними нет?
-
матвью создана на всех нодах (в запросе присутствует ON CLUSTER)
у меня 6 нод с портами 8124-8129, обвязаны кластером с портом 8123 (с зукипером), я к 8123 обращаюсь и вставляю, а там уже всё распределяется в соответствие с внутренней логикой (увы, я не в курсе деталей какой, не я создавал) -
Мне кажется что матвью нужно делать над локальной таблице. Если я ничего не путаю, то при вставке в дистрибьютед таблицу(чего вообще лучше не делать), вставка на других нодах будет происходить уже в локальный таблицы(это можно проверить по query_log)
-
что значит фраза "тот же инсерт из питон-скрипта"? Вы тестируетесь на простом блоке данных? Он тот-же самый?
-
блок данных тот же самый
из питон скрипта означает, что у меня есть скрипт, который раз в период запрашивает сырые данные из одной таблицы, обрабатывает их и инсертит в другую - целевую таблицу, на которую ссылается матвью -
если это тест на двух каких-то строках, то попробуйте их поменять. Возможно сработал block deduplication. Но может что-то хитрее. Вы там используете нерекомендованные техники - MV without To, вставка в Distributed. Наверное еще что-то нетривиальное тоже есть.
-
А что находится на 8123?
-
Всем привет!
А расскажите плз как работают буферные таблицы. Интересует момент рестарта CH… сбрасывается ли содержимое в файловую систему или же теряются данные из буферов? -
When the server is stopped, with DROP TABLE or DETACH TABLE, buffered data is also flushed to the destination table.
-
спасибо
-
Добрый вечер. Подскажите как можно реализовать подобный сценарий для БД. Нужно в БД хранить только изменившиеся данные (это может определить провайдер данных), но при запросе за период нужно возвращать данных с заданным периодом (т.е недостающие данные необходимо интерполировать). Здесь самая загвозка в том, что клюем данных является колонка время/дата т.е значение не поменялась а дата/время должно тикать. Может есть уже решения?
-
Секция ORDER BY | ClickHouse Docs
select-order-by}
-
-
сделал как вы сказали, локально на каждой ноде матвью заполняется, но теперь собрать данные с матвьюх со всех нод не получается
-
-
А как это проявляется? Наверно нужно сделать еще 1 дистрибьютед таблицу над agregatingmergeetree и читать из нее
-
так вы прочитайте как работает alter delete, а потом выполняйте)))
-
странно, что матвью на инсерт из ИДЕ реагирует, а вот из скрипта - нет
-
Перечитал ещё раз, но понимания не добавилось. Или смысл в том что переписываются партиции, но старые при этом не удаляются?
-
ну создаются новые, старые помечаются на удаление, через 8 минут будут удаляться.
-
А возможности пофорсить это удаление нет? Или посмотреть где-то идет ли оно вообще?
А то пару часов минимум уже висят эти 2 Tb и пока нет тенденции к уменьшению. -
посмотрите в system.parts для этой таблицы, висят там, поле is_active?
посмотрите shadow
Вообще выполнилось ли удаление system.mutations?
Что в system.merges? -
добрый день! немного тангенциальный тематике чата вопрос, но быть может кто-то сталкивался: хотим с помощью Altinity/clickhouse-operator завести N шардов + 1 сервер перед ними (не шард, на нем будут исключительно distributed таблицы, эдакая точка входа, если позволите). по сути все, чего хотим, это стащить в этот 1 сервер сгенерированный оператором servers.xml. в документации примеров таких не нашли, а костылить совсем не хочется. можно ли такое провернуть?
-
Вот про system.merges я забыл - мутации удалились, но незавершенные мержи ещё висят и я так понимаю вовсю шарашат.
Спасибо! -
именно в группировке ничего такого различий нет... группировке на вход уже готовые значения подаются на вход после dictGet
если же у вас парсинг user agent через regexp
то опять же, это именно вычисления, а не группировка, группировка позже идет -
-
ну...
можно два кластера в
spec:
configuration:
clusters:
- name:
объявить
для одного chi
и по моему в таком случае system.clusters будет содержать
оба кластера -
о, это вариантик, попробуем, спасибо!
-
они ведь получат "общий" servers.xml, там будут оба кластера?
-
regexp dictionary очень грубо говоря это такой «костыль» (плохое слово тут, но не знаю как сказать)
когда уже есть строка с user agent?
И лучше при вставке разборать user agent на нужные составляющие?
Или regexp dictionary норм, ну будет в 2 раза медленне и ок?
Или в любом случае делай бенчмарк сам? :) -
только по моему вам это нафиг не надо
там отдельно же на весь chi создается kubernetes сервис
по умолчанию type: LoadBalancer
к которому можно обращаться...
и выбирать из ваших disbtibuted нормально -
да, в среднем не особо надо, перетаскиваем легаси конфигурацию, которая вот такая вот, к сожалению. переделать на православный способ с дистрибьютед таблицами на каждом шарде не выйдет, имена таблиц совпадают. короче говоря, знаем, понимаем, но поделать ничего не можем 🙂
-
да все верно
если есть возможность парсить при вставке, лучше парсить при вставке
можно даже опять же средствами regexp_tree
делаете поля типа
user_agent LowCardinality(String),
browser LowCardinality(String) DEFAULT dictGet('dict_name','browser', user_agent)
и при вставке вставляете только user_agent из которого уже browser вытащит что надо из словаря -
спасибо
-
и чего такого в том что имена distributed таблиц совпадают?
вы видимо не понимаете как оно работает
это всего лишь прокси таблица на чтение которая умеет разбивать запрос исходный на кучу паралельных запросов к шардам
и вытасикавает с шардов предаггегированные данные
финализируя аггрегацию на ноде инициаторе запроса...
а на вставку это опять же прокси таблица, которая сплитует данные по SHARDING KEY в RawBinary формате во временные .bin файлы а потом тупо делает INSERT INTO ... FORMAT RawBinary запросы к целевым шардам
то есть в целом нет разницы с какой ноды вставлять и или с какой ноды читать... главное ресурсы равномерно распределять... -
это я все понимаю, проблема более банальная. на шардах есть таблица TableA (MergeTree), на выделенном сервере – TableA (Distributed), соотв просто перенести Distributed на каждый шард не выйдет. Мы можем переименовать таблицы и т.д., но это затронет другие сервисы, соотв сделать аккуратно будет сложнее. Это выход, не поймите меня неправильно, но, как всегда с миграциями важных историй, хочется делать вещи по одной и последовательно, отсюда и вопрос, можно ли воспроизвести текущую структуру
-
Спасибо, вопрос со сбором данных решил, но появился другой вопрос.
Грубо говоря, у меня данные лежат на 3 шардах. Я создал матвью на каждом шарде и дистрибьютед таблицу над agregatingmergeetree. При чтении из дистрибьютед таблицы, иногда (1 раз из 4) не подгружаются данные с 3 шарда. С другими дистрибьютед таблицам такого не наблюдал.
Может есть идеи с чем это может быть связано? -
ну попробуйте
не получится два cluster внутри одной chi
можно две разных chi
в той в которой distributed
просто отдельно через
spec:
configuration:
files:
config.d/remote_cluster.xml: |
<remote_servers> <other_cluster_name>... прописать сервера из кластера где MergeTree ручками используя имена сервисов которые создаются для каждой реплики <other_cluster_name></remote_servers> -
А точно нет ошибки в настройке путей в зукипере? И точно ли таблички создались на всех репликах всех шардов
-
вот это прям понятно как сделать, просто хотелось, чтобы remote_servers составил оператор (как он делает для шардов "первой" chi), дабы избежать хардкода. но в целом количество шардов мы меняем очень редко, так что, вероятно, так и поступим. спасибо за наводку!
-
на счет настройки путей не в курсе, попрошу проверить, а таблицы абсолютно точно создались везде. Как я сказал, 3 раза из 4 данные читаются со всех нод, но иногда игнорируют конкретный шард и его реплику
-
вопрос по Kafka Engine. Может быть там есть какой-то параметр, позволяющий байндится не ко всем партициям, а только к некоторым (например к четным). Хочется реализовать шардирование записи, отправляя данные из "четных" кафкиных партиций на отдельную шард группу.
-
по идее это можно сделать через kafka_num_consumers
-
Подскажите как делать группировку значений по __interval из графаны
-
Но как? Этот параметр просто увеличивает паралелизм.
А нужно, чтобы определенный Kafka Engine отказывался байндится к (допустим) нечетным партициям. -
да, что то я погорячился, а нужно именно конкретные партиции отправлять? или достаточно просто распределить равномерно?
-
не знаю, но вкину
Мб в подключении через librdkafka мб можно как-то указать что-то? -
замысел именно в какой-то политике (четные, третьи, итп). Т.е. нужен мапинг кафкиного шардинга (партиционирования) на шардинг clickhouse.
-
явно вроде нельзя указать какой конкретно парт слушать, но вроде бы он сам должен разобрать парты по нодам если они будут смотреть в одну группу
https://clickhouse.com/docs/en/integrations/kafka/kafka-table-engine#working-with-clickhouse-clusters -
Привет! Есть сценарий, когда раз в несколько часов хочется вливать в базу небольшой объем данных из какого-нибудь двх (ну, скажем, пару сотен гб), а затем с определенной периодичностью вычитывать эти данные полностью (последовательно от начала и до конца, практически без фильтрации и точно без поиска). Насколько хорошо кликхаус подходит для использования в этом сценарии?
-
а зачем вам для этого КХ?
-
-
Бытро писать, быстро/эффективно последовательно читать. Плюс разным потребителям интересно читать разный состав колонок
-
ну если нужно читать разные колонки, тогда норм
-
А если иногда нужно будет читать все колонки? Ну, я конечно понимаю, какие следствия из этого, мне скорее интересно, насколько хорошо кликхаус способен решить такую задачу (разумеется, не для этого он задумывался). И есть ли какие-то альтернативные базы (относительно широко распространенные), которые дадут высокую эффективность в таких сценариях (разумеется тут ни о каком acid и олтп речи нет)
-
если читать все колонки то и cat file.txt справится
-
а какой clickhouse плагин? altinity или grafana labs?
-
Тогда докину сюда еще условие: мне нужно после проливки данных еще в фоне лить батчами апдейты (ну точнее инсерты, которые какие-то записи оверрайдят) и так же в фоне это все мержить, чтобы при вычитке в основном актуальные данные получать
-
К тому же он мне эти данные не пожмет нормально
-
-
почитайте тогда про ReplacingMergeTree
-
-
Почитал, я вроде как раз его описал. Поэтому вернусь к вопросу: насколько клик эффективен для такого сценария, есть ли какие-то причины не использовать его, есть ли что-то более подходящее в широком пользовании?
-
-
Привет
есть задача сделать материальную вьюху, которая агрегируют данные за сутки
На сколько я понимаю доку, сейчас материализация проходит при мерже
От такого запроса я жду что он будет в результиющей таблице добавлять одну запись в сутки, или по крайней мерее эту одну записаь постоянно обновлять.
но сейчас там творится что попало: несколько записей, котоыре постоянно меняются
Результиющая таблица на движке
ReplicatedSummingMergeTree -
вы уверены что группировка по timestamp? наименование колонок во вью и в таблице совпадает?
-
можете выложить пример на https://fiddle.clickhouse.com/
быстрее подскажут -
взял первый попавшийся, от графана
altinity версия умеет больше? -
колонки совпадают
группировка точно по времени ( в самой таблице данные лежат в дате без часов и минут) -
по своему опыту рекоменду. альтинити
-
Там более или менее паритет по функциям, просто на плагин от графаны я ничего ответить нормально не смогу
-
Хорошо, спасибо за информацию, по альтинити подскажете, как сделать группировку по __interval?
-
в такой постановке, у вас матвью на каждый инсерт выполняет то что указано в SELECT
-
-
да
но у меня не хватает масла в голове чтобы получить ожидаемый результат -
https://fiddle.clickhouse.com/74dd812a-6e4a-4b64-acb3-0930732ab203
я вот вам не поленился ваш пример нарисовать
можете его взять за основу и сделать свой для примера -
Большое спасибо. почему то в этом примере работает все правильно благодаря sum(cnt)
-
ну впринципе, в первом же примере использования таблицы это и написано)
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/summingmergetree/#usage-exampleSummingMergeTree | ClickHouse DocsThe engine inherits from MergeTree. The difference is that when merging data parts for SummingMergeTree tables ClickHouse replaces all the rows with the same primary key (or more accurately, with the same sorting key) with one row which contains summarized values for the columns with the numeric data type. If the sorting key is composed in a way that a single key value corresponds to large number of rows, this significantly reduces storage volume and speeds up data selection.
-
благодарность
-
А есть какие-то рецепты для того чтобы полностью утилизировать диск в таком сценарии при чтении с клика? При чтении последовательно в один поток через курсор и передаче данных из базы в приложение диск не утилизируется. Сделать это в несколько потоков в лоб не получится из-за того что нет эффективного способа читать с оффсета (или я не нашел такого апи). Партиционировать таблицу и читать кучу партиций одновременно – вариант, но больно уж нестандартный
-
https://github.com/Altinity/clickhouse-grafana/blob/a525e3d7ce292a5e9bdd000801daf4b8c5c18cf2/README.md?plain=1#L118
там в панельке выбирается поле с датой и поле для времени
потом можно использовать $timeSeries макрос
он будет автоматически группировать по тому интервалу который вы выбрали
есть отдельный макрос $interval
есть встоенный макрос $__interval_ms вроде бы...clickhouse-grafana/README.md at a525e3d7ce292a5e9bdd000801daf4b8c5c18cf2 · Altinity/clickhouse-grafanaClickhouse datasource for grafana. Contribute to Altinity/clickhouse-grafana development by creating an account on GitHub.
-
Спасибо
-
https://www.youtube.com/watch?v=G9MxRpKlbnI&t=547s
Тут посмотрите как ReplacingMergeTree используется ...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
-
Добрый вечер
Кто то мне можем объяснить если действительно все на столько плохо с Analyzer of ClickHouse что query на столько тупо строиться? как такое может быть если я в тупую прописываю поля для JOIN то получаеться Perf Gain 15x
пример
—————
-- 4.298sec
SELECT day, sum(total) total
FROM (
SELECT toUnixTimestamp(toStartOfDay(FROM_UNIXTIME(1675231133) - toIntervalHour(24 * 90) + number * 24 * 3600), 'Asia/Jerusalem') * 1000 as day,
toUInt16(0) as total
FROM numbers(90)
UNION ALL
SELECT toUnixTimestamp(toStartOfDay(publish_date, 'Asia/Jerusalem')) * 1000 as day,
count(internal_id) as total
FROM fgi.articles_kpis_data f
JOIN kb_prod.entities_data e ON f.kpi_entity_id = e.entity_id
WHERE ((has(e.`groups.name`, 'Interesting List') = 1 AND arrayElement(e.`groups.end_time`,indexOf(e.`groups.name`,'Interesting List')) IS NULL))
AND e.type IN ('EVENT','GPE','LOC','MISC','MONEY','NORP','ORG','PERSON','PRODUCT')
AND publish_date >= toStartOfDay(FROM_UNIXTIME(1675231133), 'Asia/Jerusalem') - toIntervalHour(24 * 90)
AND f.is_near_duplicate = 0
GROUP BY day
ORDER BY day ASC
)
GROUP BY day
ORDER BY day ASC
-- Query Time: 0.330 sec because I specify needed columns from kb_prod.entities_data
SELECT day, sum(total) total
FROM (
SELECT toUnixTimestamp(toStartOfDay(FROM_UNIXTIME(1675231133) - toIntervalHour(24 * 90) + number * 24 * 3600), 'Asia/Jerusalem') * 1000 as day,
toUInt16(0) as total
FROM numbers(90)
UNION ALL
SELECT toUnixTimestamp(toStartOfDay(publish_date, 'Asia/Jerusalem')) * 1000 as day,
count(internal_id) as total
FROM fgi.articles_kpis_data f
JOIN (select entity_id, type, groups.name, groups.end_time from kb_prod.entities_data) e ON f.kpi_entity_id = e.entity_id
WHERE ((has(e.`groups.name`, 'Interesting List') = 1 AND arrayElement(e.`groups.end_time`,indexOf(e.`groups.name`,'Interesting List')) IS NULL))
AND e.type IN ('EVENT','GPE','LOC','MISC','MONEY','NORP','ORG','PERSON','PRODUCT')
AND publish_date >= toStartOfDay(FROM_UNIXTIME(1675231133), 'Asia/Jerusalem') - toIntervalHour(24 * 90)
AND f.is_near_duplicate = 0
GROUP BY day
ORDER BY day ASC
)
GROUP BY day
ORDER BY day ASC -
это вы ещё WHERE в подзапрос не прокинули чтобы всё по феншую
-
-
-
спасибо, а что можно еще в from поправить ?
-
тоже расписать подзапрос с нужными колонками и прокинуть WHERE f.is_near_duplicate = 0 внутрь например
-
-
Супре а можно пример ?
-
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.
-
- 03 February 2023 (182 messages)
-
Добрый день, можно ли как-то в запросе Clickhouse, как-то внедрить подзапрос который отправляется в базу MySQL? Требуется для того чтобы данные внедрить в условие IN, а данные для этого условия хранится в MySQL
-
Добрый день. Можно создать таблицу на движке MySQL и делать запрос в неё.
Пример - SELECT id, date FROM default.table WHERE id IN(SELECT id FROM default.table2), где table2 - таблица на движке MySQL. -
Либо вы можете сразу создать отдельную базу на движке MySQL и точно так же делать в неё запросы
-
-
Коллеги добрый день подскажите, из-за чего может не происходить дедупликация в движке Replacing, distributed таблицу вызываю с Final, но почему то конечный merge, выводит дублирующиеся записи. Поля по которую должны убираться дубликаты есть в ключе сортировки.Оптимайз шардов нет думаю смысла делать ведь дублирующиеся записи лежат как раз на разных щардах, дистрибьют оптимайз нельзя делать.
-
А партиции есть ?
-
+
-
И есть время добавления строки ?
-
Как поля нет, но вставляю пачки по дню
-
Ну есть агрегат мах(дата), но это уже сформированое поле оно просто вставляется как значение
-
Как я помню.
1. Если данные лежат в разных партциях, то не удаляется дубликат
2. Если лежат на разных шардах тоже не удаляется дубликат -
Просто если на разных щардах, то вроде как конечный мёрж , на конечном сервере должен их удалить
-
А вот с партициями
-
Возможно
-
Всем привет. Подскажите как лучше сделать. Есть данные по клиентам. В одном SELECT всегда один клиент. Имеет ли смысл, с точки зрения производительности, для каждого клиента делать отдельную таблицу? Если правильно понимаю, то select в этом случае будет работать быстрее, но не очень понятно как это влияет на скорость мёрджа - по многим клиентам бывают инсерты с одной строкой. Понятно что это не бэст практис для CH, но иногда по ним просто данных больше не набегает.
-
На мой взгляд лучше сделать одну таблицу и поле выбора клиента сделать первым в order by у таблицы, а вторым то, по которому у клиента всегда ищется.
-
добрый день. А можно в существующую и заполненную данными таблицу engine = SummingMergeTree добавить колонку и эту колонку вставить в список агрегируемых, указываемых в engine?
-
А зачем вы указывали список агрегируемых?
Таблица репликейтид? -
Дистрибьютид не умее final (она только передает final вниз) и в принципе не может уметь.
Надо шардировать по ключу чтобы записи попадали на один шард и там схлапывались -
И сколько клиентов ? Три или три тысячи?
-
-
Нет аналайзер не будет этого уметь. Просто все работы по таким оптимизациям заморожены до выхода аналайзера
-
несколько тысяч
-
Никогда не обновлял - страшно )
-
Тогда одна таблица и клиент первым полем в orderby как выше сказали
-
А как посмотреть текущую очередь на мёрдж? Столкнулись с тем, что не уходит ошибка too_many_parts
-
Тестировать надо. Много шансов что не будет работать приложение с новой версией
-
Таблица репликейтид?
-
Если есть где-то дока, то ткните, плиз. Пробовал гуглить - не нашёл
-
Да
-
Ошибки смотрите system.replication_queue
-
И правильно что страшно. Я 6 лет 8 чвсов в день занимаюсь только кх и мне тоже страшно.
-
Вначале я бы посмотрела на вашем месте в эту вот статью, которая немного объясняет про self-managed upgrade в КХ. Да, придется тестировать, сделать отдельное окружение или инстанс той версии, на которую хотите обновляться, посмотреть в changelog еще на incompatible changes и проверить, нет ли там изменений, которые могут затронуть вашу систему.Self-managed Upgrade | ClickHouse Docs
ClickHouse upgrade overview
-
точно также, только уже почти 3 года, но складывается впечатление, что я еще не все знаю о КХ
-
Кажется самый надежный вариант, это развернуть новый КХ и переливать в него данные из старого 😏
-
так все равно тестить и сравнивать результаты запросов.
-
есть ли сделать возможность TTL (1 day) но исключить выходные, чтобы в понедельник были данные за пятницу? :)
-
Да. Там можно любое сложное выражение написать if(выходной, след.понедельник,+1)
-
у вас так много данных что нельзя сделать TTL на неделю и не париться?
-
Угу, к сожалению
-
-
Вобще нет разницы почти, в некоторых случаях http быстрее
-
Добрый день
Подскажите, возможно ли изменить kafka_topic_list для таблицы с kafka engine? Много ли это будет стоить? -
я правильно понял по логике вы хотите, чтобы типа в понедельник данные за пятницу+субботу+воскресенье были
а во вторник были данные только с понедельника?
или что? -
дроп криэйт
-
Благодарю
-
Суббота и воскресенье у нас выходной
-
Да
-
Спасибо!
-
SummingMergeTree с параметром columns - https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/summingmergetree/SummingMergeTree | ClickHouse Docs
summingmergetree}
-
по идее можно так
DETACH TABLE materialized_view_from_engine_kafka;
ALTER TABLE kafka_engine_table MODIFY SETTINGS ...
ATTACH TABLE materialized_view_from_engine_kafka;
должно быть бесплатно -
Да я а курсе. Эта штука опциональная, она не нужна. Суммируются числовые поля которые не в orderby
-
часть числовых колонок не следует аггрегировать ....
-
Почитаю, спасибо
-
у данных тоже выходных нет? или есть?
-
ну это решается через simpleaggregatefunctiion.
Короче если репликейтид таблица то придется переатичавать парты в таблицу с другим списком
Список поменять нельзя по простому, только сложно -
ок! понял, спа!
-
В субботу и воскресенье данных нет
-
Я извиняюсь, а сколько у вас вообще данных, что TTL 1 день вам нужен
-
Несколько терабайт, но расширить место это проблема
-
Не спрашивайте почему
-
что-то типа такого попробовать
TTL date + INTERVAL if(toDayOfWeek(today(),0) BETWEEN 6 AND 7, 3, 1) DAY -
у меня кстати есть задача, там один час нужен данных, все бывает
-
Попробую
-
Как я помню вы работаете в компании, которая занимается рекламой
-
Просто нужны вчерашние данные. В случае понедельника пятничные
-
Там просто данные на входе в etl. Обработаны и больше не нужны
-
Всем доброго времени суток
столкнулся с неприятной проблемой, возможно, не понимаю работу колонки в кликхаузе с типом Array(String), прошу указать на ошибку
есть таблица в постгресе с колонкой, в которой тип данных ARRAY, данные в ней в виде
{"Антонио Бандерас", "Том Холланд", "Рубен Фляйшер", "Марк Уолберг"}
берем эти данные из постгреса с помощью pandas, грузим в датафрейм, получаем колонку с типом данных object и данные в виде
{"Антонио Бандерас", "Том Холланд", "Рубен Фляйшер", "Марк Уолберг"}
грузим этот датафрейм с помощью isnert_df в кликхауз в колонку с типом данных Array(String) и получаем данные в виде
[ "{", "\"", "А", "н", "т", "о", "н", "и", "о", " ", "Б", "а", "н", "д", "е", "р", "а", "с", "\"", ",", "\"", "Т", "о", "м", " ", "Х", "о", "л", "л", "а", "н", "д", "\"", ",", "\"", "Р", "у", "б", "е", "н", " ", " ", "Ф", "л", "я", "й", "ш", "е", "р", "\"", ",", "\"", "М", "а", "р", "к", " ", "У", "о", "л", "б", "е", "р", "г", "\"", "}" ]
не могу сообразить - проблема в пандасе, там данные теряют тип array и потому приходят в кликхауз в таком виде?
или проблема в типе данных кликхауза Array(String)? -
что значит шардировать по ключу? Ключ сортировки у меня сделан, так чтобы именно по нему было дедуплицировано.
-
вот так наверное все таки
TTL date + INTERVAL if(toDayOfWeek(today(),0) IN (1,6,7), 3, 1) DAY -
Так не today а date
-
а я думаю что today()
-
вообще в доке нормального описания алгоритма TTL не хватает
что с чем сравнивается чтобы remove был true -
Ttl выражение это дата когда удалять
-
изучаю system.replication_queue. не очень понятно, как на хосте могут быть записи type = GET_PART и source = этот же самый хост
-
Да, они пришли как строка и распарсились
-
если правильно понимаю, GET_PART - это когда надо с другого хоста среплицировать
-
ошибки есть?
-
сколько тасок там вообще?
-
18810
-
в логах? или в этой таблице?
-
System restart replica таблица; выполните
-
есть предположение, что при вставке надо указывать не {"раз","два",...}, а ["раз", "два",..] т.к. это краткая форма записи типа Array()
-
Поле last_exception
-
отфильтровать - "where isNotNull(last_exception) " ? не фильтрует, выводит строки с пустым last_exception
-
Там не может быть null
Просто банально <>'' -
В кх null это редкость, их вообще нету в системных таблицах
и null не эквивалентен пустой строке, тут не оракл -
С ошибкой только одна таска:
GET_PART │ 2023-02-03 09:56:58 │ 0 │ host1 │ 202107_11_11_0 │ [] │ 0 │ 0 │ 1 │ Code: 234. DB::Exception: No active replica has part 202107_11_11_0 or covering part. (NO_REPLICA_HAS_PART) (version 22.3.15.33 (official build)) │ 2023-02-03 10:20:57 │ 15 │ Not executing fetch of part 202107_11_11_0 because 8 fetches already executing, max 8. │ 2023-02-03 10:25:35 │ │ -
А вам нужна партиция 202107 ? Сколько времени данные храните?
-
нужна. данные вечно храним
-
#вакансия #DBA #ClickHouse
В компанию-фармдистрибьютор мы ищем Администратора баз данных ClickHouse.
ОБЯЗАННОСТИ:
Установка, настройка кластера и сопровождение ClickHouse;
Обеспечение непрерывной работы, диагностика и устранение неполадок ClickHouse;
Восстановление кластера в случае аварии;
Настройка системы мониторинга и анализа ошибок в части работы ClickHouse;
Внедрение систем миграций БД;
Настройка кластеров Apache Kafka, контроль и обеспечение непрерывной работы;
Контроль пайплайна данных Kafka -> Clickhouse.
ТРЕБОВАНИЯ:
Опыт администрирования и настройки Clickhouse и Kafka от 2-х лет;
Опыт настройки мониторинга;
Опыт взаимодействия с разработчиками, участие во внедрениях как плюс;
Базовые знания unix систем.
УСЛОВИЯ:
Уровень дохода по результатам собеседования;
Комфортный офис с современным ремонтом;
Офисный, удаленный или гибридный формат работы, 5\2 с 9 до 18;
ДМС;
Оплата обучения за счет компании;
Скидки на продукцию в аптеке на территории офиса;
Услуги профессионального массажиста в офисе;
Оформление на работу согласно ТК РФ;
Корпоративный транспорт;
Бесплатная парковка для автомобилей сотрудников.
Telegram: @nitanitaanit
/>azhavoronko@spice-agency.ru -
привет!
как в Java принято делать batch-insert Java объектов?
гуглится такой способ
client.connect(server)
.format(ClickHouseFormat.RowBinary)
.write()
.table("my_table")
.data(inputStream)
.execute()
но непонятно где взять нужный сериализатор чтобы сделать inputStream
ткните в доку плиз 🙏 -
Вот этот запрос много строк вернет?
select 'delete '||part_zoo
from (
select zoo.p_path as part_zoo, zoo.ctime, zoo.mtime, disk.p_path as part_disk
from
(
select concat(path,'/',name) as p_path, ctime, mtime
from system.zookeeper where path in (select concat(replica_path,'/parts') from system.replicas)
) zoo
left join
(
select concat(replica_path,'/parts/',name) as p_path
from system.parts inner join system.replicas using (database, table)
) disk on zoo.p_path = disk.p_path
where part_disk='' and zoo.mtime <= now() - interval 1 day
order by part_zoo) format TSVRaw; -
Это подходит если у вас уже есть стрим. Например csv или паркет файл.
если у вас просто список с объектами в джаве то там есть обычный способ добавления по одной строке в батч и отсылка батча -
спасибо, можно еще уточнить что за способ? async_insert=1 или вы имеете ввиду что-то другое?
-
https://github.com/ClickHouse/clickhouse-java/tree/main/clickhouse-jdbc#examples
Вот же batch insert
ps.addBatch(); // parameters will be write into buffered stream immediately in binary format ... ps.executeBatch();clickhouse-java/clickhouse-jdbc at main · ClickHouse/clickhouse-javaJava client and JDBC driver for ClickHouse. Contribute to ClickHouse/clickhouse-java development by creating an account on GitHub.
-
спасибо, jdbc не смотрел, пользуюсь простым http клиентом)
-
там же одно и тоже под капотом. У вас данные откуда? Они в виде чего?
-
забираю данные из другой базы, модифицирую их и получается коллекция POJO в памяти приложения, их и хочу вставлять в КХ
-
Ну в общем-то написать несложно но будет 20 строк вместо 3 в jdbc
-
ага ок, еще раз спасибо
-
не выполнился по таймауту:
-
Всем привет! Кто нибудь пробовал хранить JSON объекты как отдельный тип данных? Поделитесь опытом, как оно себя в проде ведёт)
https://clickhouse.com/docs/en/guides/developer/working-with-json/json-semi-structuredSemi-Structured Approach | ClickHouse DocsUsing a semi-structured approach
-
Экспериментально ведет. Иногда ломается навсегда. И приходится выковыривать данные из таблицы.
-
Я вам предлагал system restart replica сделать вы пробовали? Там очередь укроротится на время. И станет легче.
Вот здесь другой запрос
https://github.com/ClickHouse/ClickHouse/issues/10368Some merges may stuck · Issue #10368 · ClickHouse/ClickHouseThis bug is discovered on Yandex.Metrica servers. If there is assigned merge but some parts in between of the range of parts to merge get lost on all replicas, the merge cannot proceed and the foll...
-
system replica restart таблица; для каждой таблицы надо делать? или только там где ошибка? у нас таблиц несколько тысяч
-
-
Нашёл способ.
/etc/clickhouse-server/users.d/allow_suspicious_low_cardinality_types.xml
<clickhouse>
<profiles>
<default>
<allow_suspicious_low_cardinality_types>1</allow_suspicious_low_cardinality_types>
</default>
</profiles>
</clickhouse> -
Ошибка сама ушла - больше нет этой записи. Хочется разобраться с логикой GET_PART - нормально ли то, что в очереди есть ( и их много )частей который имеют в sorce_replica собственный хост. Т.е. хост хочет сам с себя утянуть парты
-
Всем привет , правильно ли я понимаю что если у меня столбец имеет тип decimal(10,2)
И я делаю какую либо математику над ним , то я не получу число с 3 знаками после запятой ?
Мне на этот процент в дальнейшем нужно умножать , чтобы разбивать на доли , и в таком случае погрешность очень большая получается -
а у вас replication_queue это по всем таблицам?
вы случайно не апгрейдились недавно?
несколько тысяч это охреееннннеееть -
это нормально, это небольшая проблема в отображении
-
Временно поднимал минорную версию в рамках 22.3, но потом откатился, так появились ошибки, что памяти не хватает
-
Replication_queue, да, по всем таблицам
-
часть операций с decimal делается через флоат (например avg)
ну и операции с флоат
SELECT CAST('1', 'decimal(10, 2)') / 3
┌─divide(CAST('1', 'decimal(10, 2)'), 3)─┐
│ 0.33 │
└────────────────────────────────────────┘
SELECT CAST('1', 'decimal(10, 2)') / 3.0
┌─divide(CAST('1', 'decimal(10, 2)'), 3.)─┐
│ 0.3333333333333333 │
└─────────────────────────────────────────┘ -
-
вам надо fetch_pool_size увеличивать
-
ниче не понял, переведите на SQL
-
Смотрю что это за параметр... А про GET_PART можно прояснить - что означает когда в SOURCE_REPLICA собственный хост?
-
Привёл аргумент на который делю ( который больший) к float , спасибо
-
Привет!
Подскажите, если Postgres отдает ответ с типом integer[], ClickHouse может его загрузить во внешний словарь как Array(UInt8) или только как String?
Сейчас получаю такую ошибку
Code: 1001, type: pqxx::conversion_error, e.what() = Could not convert string to integer: value out of range.
для
<attribute>
<name>days</name>
<type>Array(UInt8)</type>
<null_value>[]</null_value>
</attribute>
Я нашел тикет из 2021, что Array для MySQL не поддерживается https://github.com/ClickHouse/ClickHouse/issues/26299 , но не получилось найти в коде текущие поддерживаемые форматы для Postgres -
недавно добавили функций которые умеют принимать result_scale: multiplyDecimal divideDecimal
раньше надо было делать извращения
select 1 / 3::Decimal(38,6) * 1::decimal(10,2);
┌─multiply(divide(1, CAST('3', 'Decimal(38, 6)')), CAST('1', 'decimal(10, 2)'))─┐
│ 0.333333 │
└───────────────────────────────────────────────────────────────────────────────┘ -
Ни в Гугле ни в конфиге не вижу этого параметра
-
c PG может
А почему у вас Array(UInt8) ? сделайте Array(Int64)
mysql вообще не умеет массивы, поэтому и нет -
22.3 ?
<?xml version="1.0"?>
<yandex>
<profiles>
<default>
<background_fetches_pool_size>32</background_fetches_pool_size>
</default> -
В PG изначально хранится битовая строка BIT(366), где каждый бит это день в году: выходной или рабочий день у сотрудника, сотрудников 100к.
Хочу получить для словаря ClickHouse минимальный размер в памяти и скорость получения значения по индексу (номер дня в году).
Какой тип подойдет лучше?
1. Array(Int64) , хотел UInt8 так как он меньше
2. String + substring для получения значения.
3. Bitmap object + subBitmap -
нету маппинга для BIT https://github.com/ClickHouse/ClickHouse/blob/70d1adfe4b7e437a62c59ca44a51fbd186ec7584/src/DataTypes/DataTypeString.cpp#L59
пробуйте через строки и конвертируйте в КХ в массив https://github.com/ClickHouse/ClickHouse/issues/26536#issuecomment-896205649ClickHouse/DataTypeString.cpp at 70d1adfe4b7e437a62c59ca44a51fbd186ec7584 · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
думаю для сотрудников 100к. понадобится много памяти, для массива, возможно проще строкой оставить и парсить после dictGet
-
Коллеги, всем привет
Разворачиваю клик, но есть одно НО. нет sudo
Покурив скрипты установки решил, что будет достаточно скопировать ручками, прописать пути и запустить
споткнулся о скрипт clickhouse install
debconf: DbDriver "passwords" warning: could not open /var/cache/debconf/passwords.dat: Permission denied
Понимаю, что за ошибка, но как обойти при установке клика? можно ли как-то скипнуть создание дефолтного пароля или переназначить папку для кеша? -
установка клика это создание пользователя , каталогов в /var /etc и создание сервисов initD / systemD, все это вам сделать нельзя. Зачем вы ставите клик? Просто берите и запускайте бинарник, без всякой установки.
-
да но, я новичек с кликом, и понимаю, о чем вы говорите
но не понимаю, что делает clickhouse install
эта команда фигурирует в скрипте установки doinstall
В эту команду передаются пути нахождения дата логов конфигов бинарей и т.д.
Описание этой команды не нашел ни на офф инструкции ни на просторах. просто хелп выводит список аргументов, но для чего не описано
Если запускать установку не нужно, как бинарю при запуске передать переаметры нахождения конфигов и прочего? -
/usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml
-
конфиги каталоги относительные от config.xml
остальные пути в конфигах -
возможно вам нужен clickhouse-local который вообще не требует конфигов и каталогов
-
-
У меня задача развернуть кластер из 4х шардов, но судо заказчик не дает
-
заказчик мудак, бегите.
-
как он при рестарте сервера будет КХ автоматически запускать?
-
ну, ))) не разобравшись не могу эскалировать. иначе у заказчика найдется эксперт, который скажет, что уже я мудакк и не разобрался) поэтому стараюсь разобраться. если не получиться уже эскалировать
-
-
да и без рута вам еще мудохаться с лимитами
-
ох)) спасибо , что подсветили
-
cat /etc/security/limits.d/clickhouse.conf
clickhouse soft nofile 1048576
clickhouse hard nofile 1048576 -
ну и в ядро за метриками КХ сходить не сможет, поэтому все метрики типа profile events будут пустыми
-
Если Вам не дают рута, то Вы должны дать рекомендации, что они от рута должны сделать, чтобы кх работал штатно. Думаю, что можно ссылкой на документацию.
Есть ещё один путь - docker. Это в совсем запущенном случае. Но я про запуск докера в проде не знаю. Это не рекомендация, а только идея. -
вот я и пытался понять что происходит внутри clickhouse install но нигде описания не нашел.
-
-
раньше это был баш,
https://github.com/ClickHouse/ClickHouse/blob/13fc7cd080b70ff6286bf8fc6373e65939338f6e/debian/clickhouse-server.init
https://github.com/ClickHouse/ClickHouse/blob/13fc7cd080b70ff6286bf8fc6373e65939338f6e/debian/clickhouse-server.postinst
сейчас тоже +- самое но c++ -
-
Всем привет!
могут ли быть проблемы при вставке TSV если одно значение json?
Column 119, name: dvce_sent_tstamp, type: Nullable(DateTime64(3)), parsed text: "2023-02-01 11:06:48.294"
Column 120, name: refr_domain_userid, type: Nullable(String), parsed text: <EMPTY>
Column 121, name: refr_dvce_tstamp, type: Nullable(DateTime64(3)), parsed text: "<TAB>{<DOUBLE QUOTE>schema<DOUBLE QUOTE>"
ERROR: garbage after Nullable(DateTime64(3)): ":<DOUBLE QUOTE>iglu:com"
: While executing ParallelParsingBlockInputFormat: (at row 1)
. (CANNOT_PARSE_INPUT_ASSERTION_FAILED) (version 22.7.3.5 (official build))
2023-02-01 11:06:48.294 {"schema":"iglu:com.snowplowanalytics.snowplow/contexts/jsonschema/1-0-1","data"
Пытаюсь TSV от Snowplow запихнуть в Clickhouse -
огромное спасибо, буду курить
-
Похоже у вас JSON в колонке где ожидается datetime64
-
не я вижу баги с этим
input_format_tsv_empty_as_default=1 помогло
datetime64 как то странно обрабатывается
но теперь у меня другая проблема если 100 строк вставлять то он как будто \n не видит
Column 124, name: derived_tstamp, type: Nullable(DateTime64(3, 'Europe/Moscow')), parsed text: "2023-02-01 11:06:47.979"
Column 125, name: event_vendor, type: Nullable(String), parsed text: "com.snowplowanalytics.snowplow"
Column 126, name: event_name, type: Nullable(String), parsed text: "application_background"
Column 127, name: event_format, type: Nullable(String), parsed text: "jsonschema"
Column 128, name: event_version, type: Nullable(String), parsed text: "1-0-0"
Column 129, name: event_fingerprint, type: Nullable(String), parsed text: "53d6cbc6dbf7ac417686e0d2f38ec709"
Column 130, name: true_tstamp, type: Nullable(DateTime64(3, 'Europe/Moscow')), parsed text: "dm_and"
ERROR: garbage after Nullable(DateTime64(3, 'Europe/Moscow')): "_ru<TAB>mob<TAB>20"
: While executing ParallelParsingBlockInputFormat: (at row 1)
. (CANNOT_PARSE_INPUT_ASSERTION_FAILED) (version 22.7.3.5 (official build)) -
ClickHouse sometimes fails to parse `DateTime64` columns using `JSONEachRow` depending on the position of keys within the JSON input · Issue #36949 · ClickHouse/ClickHouse
ClickHouse sometimes fails to parse DateTime64 columns using JSONEachRow depending on the position of keys within the JSON input. How to reproduce Using ClickHouse 22.4.4 over the HTTP interface, w...
-
Column 130, name: true_tstamp, type: Nullable(DateTime64(3, 'Europe/Moscow')), parsed text: "dm_and"
видимо парсер для DateTime64 вообще кривой (( -
Да конечно кривой. То что им заливаются сотни петабайт у 20 тыс. пользоватей ежедневно это конечно кривой. У вас там нет tab
-
есть там ТАБ
-
я конечно рад за 20 тыс пользователей у которых tsv грузятся, но не от всей души)
-
Вы чем заливаете? Кхклиентом? Что будет если добавить параметр --input_format_parallel_parsing=0
-
Поймите, я читаю все сообщения гитхаба уже 6 лет в репе кх, я примерно представляю вероятность найти баг в tsv парсере при первой в жизни попытке залить данные. Я думаю проще выиграть в лотерею не играя в лотерею.
-
Я видел сотни таких сообщений как у вас и всегда оказывалось что баг в файле.
-
Обычно баг в tsv парсере бывает типа заливали заливали несколько лет и тут бац невероятное соовпадение и баг в parallel парсере наложился на другой и все упало.
-
Понял вас
Не я уже использовал этот подход в бою на прошлом месте
Но тут дало осечку
Хотя ребята из snowplow могли бы сами уже сделать интеграцию с кликом -
Попробую
-
Http с помощью curl
-
Настройку можно передать в GET-параметрах HTTP-запроса
-
Коллеги, подскажите, как работает “system stop fetches”?
Поясню вопрос: я ожидал, что после выполнения данного запроса будет остановлена репликация на инстансе и спустя ожидаемое количество времени входящая сетевая нагрузка с сервера должна уйти
Однако спустя полчаса она все ещё продолжалась
Я правильно понимаю, что system stop fetches не влияет на текущую очередь репликации (слепок на момент запуска этой команды) и данная команда лишь препятствует взятию в работу новых таксов с типом GET_PART, ATTACH_PART, REPLACE_RANGE,..
? -
-
-
не помогло
curl -H 'X-ClickHouse-User: snowplow' -H 'X-ClickHouse-Key: pass' 'http://clickhouse-01:8123/?input_format_tsv_empty_as_default=1&input_format_parallel_parsing=0&query=INSERT%20INTO%20snowplow_test.good_event%20FORMAT%20TSV' -d @- < 100.tsv -
Набор колонок в TSV точно соответствует тому, что в файле?
Вы можете найти из TSV те строки, что ломают вставку? -
да я в первые 2 строки только и смотрю глазами
-
никто не сталкивался с таким?
-
Вы можете очистить TSV воспроизвести на стейдже?
-
не понял
-
Code: 27. DB::ParsingException: Cannot parse input: expected '\n' before: '_ru\tmob\t2023-02-01 11:06:48.166\t2023-02-01 11:06:48.075\t2023-02-01 11:06:43.083\tunstruct\t768668f0-5310-4b91-ae27-efea72f502d9\t\tdetmir_and_ru\tandr-3.1.1\tssc-2.8.':
Row 1:
еще вот такое в начале пишет -
отрезайте куски по строкам head -n 100 ищите в какой строке ошибка, парсер очень часто неправильное место показывает, потому он так устроен
если ошибка в первой строке то awk-м -F \t разворачиваем строку , в ексель или в гугл спреадшит, рядом колонки таблицы -
Да, конечно это читал. А есть метрики по которым можно определить что все живо.
-
-
у меня подобная тема была, только наооборот, в последней строке. было \n\n
-
https://clickhouse.com/docs/en/whats-new/changelog/2022/
Кликхаус не тормозит. А я торможу.
ClickHouse release 22.12, 2022-12-15
Systemd integration now correctly notifies systemd that the service is really started and is ready to serve requests. #43400 (Коренберг Марк).
.2022 Changelog | ClickHouse DocsClickHouse release 22.12, 2022-12-15
-
Привет!
Сегодня обновился до 22.8
Стал изредка получать ошибку на довольно простых запросах
Poco::Exception. Code: 1000, e.code() = 0, Timeout (version 22.8.13.20 (official build))
В чем может быть причина? Вдруг кто-то сталкивался? - 04 February 2023 (14 messages)
-
Привет, столкнулся с такой проблемой. Пытаюсь закачать в КХ из s3 данные. Есть таблица с engine=s3, смотрит на паркеты. Пытаюсь сделать к ней запрос - и контейнер просто помирает. в логах нашел такое
{} <Error> ServerErrorHandler: Code: 241. DB::Exception: Memory limit (total) exceeded: would use 3.48 GiB (attempt to allocate chunk of 1048591 bytes), maximum: 3.40 GiB
Оперативы на тачке немного (4гб), но паркеты в s3 по размеру не превышают 1Гб, по идее должно влезать
Выставил max_server_memory_usage_to_ram_ratio=2 - не помогает. Никто не сталкивался с таким? -
добавьте памяти, КХ её любит
-
Join есть? Или все один в один? Без вычислений? Order By, group by?
-
там просто селект
-
никаких вычислений просто вставка 1 в 1
-
Хызы. 4 гига маловато.
-
Хотелось бы быть уверенным, прежде чем нарастить ресурсы, что дело в оперативе
-
Честно говоря, 4 гига вообще непонятно как работает;-)
-
с божьей помощью)
-
А по моей проблеме ни у кого идей не появилось?
-
КХ на любой чих жрет оперативку. Любые, фактически, стандартные преобразования он делает в оперативке. Пусть меня поправят гуру, но основная идея вообще КХ ускорить обработку дисковых массивов - как можно быстрее выбрать минимально необходимый объем, засунуть его в оперативку и обработать.
Если выбираете большой объем и начинаете обрабатывать, на маленьком объеме памяти - случается... ну примерно то что у вас случилось -
S3 и hadoop взаимодействия в клике жручие. Добавляйте ram. Еще, полагаю, что в с3 паркеты сжатые (snappy, whatever), а в памяти, конечно, все по-другому
-
Проблема еще в том что паркет блочный и размер блока задан при создании файла
вот https://github.com/ClickHouse/ClickHouse/issues/45741
8Mb паркет требует 16гб в кх и 24 гб parquet-tools
Уже починено https://github.com/ClickHouse/ClickHouse/pull/45878 в след. версии кх -
Спасибо, многое объясняет
- 05 February 2023 (69 messages)
-
Немножко туплю.
В каком месте задаётся вот этот параметр?
output_format_arrow_string_as_string
Config сервера или как-то в запросе? -
Format settings | ClickHouse Docs
format-settings}
-
в профиле пользователя или в default профиле
/etc/clickhouse-server/users.d/output_formats.xml
<clickhouse><profiles><default><output_format_arrow_string_as_string>1</output_format_arrow_string_as_string></default></profiles></clickhouse>
в параметрах cli для вызозова clickhouse-client
или в SETTINGS для query
SELECT .. SETTINGS output_format_arrow_string_as_string=1 FORMAT Arrow -
Второй вариант лучше. Спасибо
-
Подскажите, пожалуйста, нормально будет создать три дб: 1- для сырых данных, 2 - для аналитики(матвью/вью из 1 дб), 3 - для продажников (вью из 1 дб для суперсета) или лучше все создать в 1 дб? Просто хотел разнести данные по основным направлениям использования. Идея в том, чтобы предоставлять просто интерфейс к нужным данным
-
Ну вам надо почитать что такое view в Clickhouse
-
И то что по ним не разграничиваются права
-
ну вообще clickhouse-dbt что-то такое в итоге и делает
подход называется ELT
Extract - Loading - Transform
то есть сырые данные мы трансформирует в винтрины средствами СУБД и дальше работаем с витринами
только не понятно в 3й БД для Sales там именно VIEW ? или Materialized View?
в любом случае ROW POLICY к разным продажникам наверное разные стоит применять если надо какие то разграничения прав -
Зачем? Я нашёл решение проще. Я использую кафку, как общую шину данных и таблицы с движком для кафки и через матвью наполняют таблицы. Дальше на них строятся матвью и вью. Так как в конечном счёте всем нужны данные для графиков, я хочу просто создать отдельные дб только с нужными вьюхами для них и все. Просто не знаю насколько оптимальным будет такое решение
-
нормальное решение
единственное непонятно, сами данные сырые из kafka тоже через MATERIALIZED VIEW сохраняются в отдельных таблицах? -
Да. Kafka Topic -> Kafka Table Engine -> MV ->MergeTree family table
-
Зачем? В моем случае нужны права только к определённой дб.
-
бывает так что из одной таблицы надо одним менеджерам одно показывать, а другим другое...
-
единственное тут замечание
надо уметь мониторить Kafka метрики
а также понимать что когда много MV , то это CPU и память и диск и это не бесплатно... надо смотреть чем треды заняты
эти MV в system.processes не видно -
Спасибо. Думаю в ближайшее время этого будет достаточно. Каждая вью имеет описание и создаётся под конкретные цели и имеет владельца/ев. Проблема не создать вью, а сделать так чтобы это в "мусорку" не превратилось.
-
Спасибо, это учту
-
привет! делаю рандомизированный задасет для тестов (generateRandom) в партицированной табличке. Возможно, надо как-то по-другому insert делать, просто указываю табличку и туда пытаюсь запихнуть 100к записей (кажется, копейки), падает, говорит, Read Timed Out. Подскажите, пожалуйста, как заполнять правильно тестовыми данными.
https://pastebin.com/uK6k6m9DCREATE TABLE dynamic_hierarchy_test( category_stream_name String, hi - 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.
-
у вас generateRandom рандомные данные генерит в потоке
вы их фильтруете... и потом только после фильтрации LIMIT срабатывает
как думаете какова вероятность того что среди рандомного времени выпадет 100000 записей у которых дата в течении месяца?
сделайте так чтобы целевые данные попадали в ваши диапозоны
https://fiddle.clickhouse.com/7dd755a4-1a6e-4fbe-818d-66677fa613f1
сделайте кстати KILL QUERY для старых запросов
посмотрите system.processes
а то у вас скорее всего в фоне запрос до сих пор CPU жрет -
Вот это поворот, спасибо большое, то есть лимит ушел от generate из-за where он просто превратился в бесконечный поток. Пошел исправлять 🙈
//Почему бесконечный, потому что сначала я запускал с нужным объемом в 100м. -
да именно так
в голове на будущее попробуйте разбирать все запросы на стадии и понять что они последовтаельно исполняются
сначала определяем откуда будем данные читать
FROM
потом
JOIN
если есть
SELECT что брать из from
потом фильтрация
WHERE
потом
GROUP BY если есть
потом
HAVING BY если есть
потом
ORDER BY если есть
потом
LIMIT
потом
FORMAT -
Ага, спасибо, это понятно, я просто не понял логику поточной генерации, в доке не отметил.
-
-
Последнюю lts
-
Добый день! Пытаюсь соединиться с бд из спаркового экзекьютера, получаю ошибку:
Caused by: java.sql.SQLException: No client available, server ClickHouseNode [uri=http://10.101.230.12:8123/db, options={url=jdbc:clickhouse:http://10.101.230.12:8123/db,driver=com.clickhouse.jdbc.ClickHouseDriver,jdbcUrl=jdbc:clickhouse:http://10.101.230.12:8123/db}]@-2029630818
локально подключиться получается, в maven-проекте создаётся убер jar c той же версией артифакта (com.clickhouse:clickhouse-jdbc:0.4.0), который потом запускается через spark-submit.
Подскажите пожалуйста, в чём может быть причина? Откуда начинать копать? -
No client available error occured. · Issue #1185 · ClickHouse/clickhouse-java
I'm configuring a placement schedule in the Spark2.4.5-scala2.12 environment. In local tests, the dataframe is inserted well into the Clickhouse table. However, spark-submit does not work o...
-
👋 Приветствую, подскажите по адаптации SQL запроса
Мигрирую с mysql на кх и столкнулся с тем, что подзапросы подобные этому не выполняются. Как то можно адаптировать запрос под кх?
SELECT *,
(SELECT active FROM users WHERE users.id = promo.user_id ORDER BY date DESC LIMIT 1 ) as active
FROM promo WHERE cat=2 ORDER by id DESC LIMIT 0, 50 -
Коррелированные запросы не поддерживаются в КХ, потому что в КХ нельзя быстро найти по индексу одну строку.
Вам необходимо использовать обычный джойн
SELECT *,
FROM promo join (SELECT active, id
FROM users
WHERE id in (SELECT id from promo WHERE cat=2 ORDER by id DESC LIMIT 0, 50)
ORDER BY date DESC LIMIT 1 by id
) as users on users.id = promo.user_id
WHERE cat=2
ORDER by id DESC LIMIT 0, 50 -
Спасибо
-
и в общем такие запросы в КХ с ORDER by id DESC LIMIT 0, 50 лучше вообще не делать, это только в OLTP базах работает.
Т.е. возможно вы зря мигрируете и КХ будет жостко тупить по сравнению с myqsl -
спасибо!
-
toDayOfWeek(t[, mode[, timezone]]) - второй аргумент mode
SELECT toDayOfWeek(today(), 0)
Query id: 1f143220-3dd8-4d36-94f5-fa1fc65b1cee
0 rows in set. Elapsed: 0.002 sec.
Received exception from server (version 22.12.3):
Code: 43. DB::Exception: Received from localhost:9000. DB::Exception: Function toDayOfWeek supports 1 or 2 arguments. The optional 2nd argument must be a constant string with a timezone name: While processing toDayOfWeek(today(), 0). (ILLEGAL_TYPE_OF_ARGUMENT)
30071aae7fbb :) -
ЧЯДНТ?
-
-
-
ошибка говорит о том, что toDayOfWeek поддерживает 1 или 2 аргумента и второй таймзона
-
но в том же мануале (и как тут мне подсказывали) указано, что второй параметер, это mode
-
The two-argument form of toDayOfWeek() enables you to specify whether the week starts on Monday or Sunday, and whether the return value should be in the range from 0 to 6 or 1 to 7.
-
-
чужеродная для КХ штука - не колоночная, а строковая субд. И не кластеризуется.
-
Скорее всего KV, что и требется для словарей. Кластеризация это ясненько.
-
словарь можно не натягивать, а использовать SETTINGS join_algorithm = 'direct'. Хотя это дело вкуса.
-
О, надо поробовать, пока с MT и словарем директ, не хватает производительности. Ну и join для нас пока не выход.
-
Всем привет!
Возникла проблема на кластере (4 ноды, 2 шарда по 2 реплики) - застряла очередь репликации (replication_queue). Там есть десяток записей которые никак не прогрессируют и просто ретраятся (num_tries = 17614942 и растет), при этом таблица ушла в read only. Пробовали сделать DETACH для проблемных партов, но КХ выдает ошибку - Received exception from server (version 22.12.3): Code: 384. DB::Exception: Received from localhost:9000. DB::Exception: Part 20181127_0_12_2_164 has already been assigned a merge into 20181127_0_12_2_165. (PART_IS_TEMPORARILY_LOCKED). system.mutations where is_done = 0 пустая на всех нодах. Я завел тикет на гитхабе с подробным описанием проблемы - https://github.com/ClickHouse/ClickHouse/issues/46046 , но может кто-то сталкивался с проблемой залоченых партов и как ее можно обойти?Replication queue stuck and part has already been assigned a merge (PART_IS_TEMPORARILY_LOCKED) · Issue #46046 · ClickHouse/ClickHouseHello! It seems like our replication queue on prod cluster got stuck somehow, there are few records which don’t go away from it causing the whole server to hang up and eating up all the CPU. We thi...
-
можно попробовать с LAYOUT(CACHED(...))
еще что-то намутить
но надо мониторить эффективность кеша -
TTL есть на таблице?
-
TTL нет, но помогло убить мутацию которая висела в system.mutations с флагом is_done = 1
-
Не это памяти потребляет многовато.
-
EmbeddedRocksDB можно попробовать, но оно по памяти вообще то тоже не бесплатное, если вы понимаете как LSM работает
-
Да это ясно, поэтому задаю вопросы. Мутаций в этих таблицах минимум.
-
документация отражает master ветку, там уже другой toDayOfWeek
у вас toDayOfWeek(t[,timezone])
Converts a date or date with time to a UInt8 number containing the number of the day of the week (Monday is 1, and Sunday is 7). -
-
Коллеги, подскажите, как работает “system stop fetches”?
Поясню вопрос: я ожидал, что после выполнения данного запроса будет остановлена репликация на инстансе и спустя ожидаемое количество времени входящая сетевая нагрузка с сервера должна уйти
Однако спустя полчаса она все ещё продолжалась
Я правильно понимаю, что system stop fetches не влияет на текущую очередь репликации (слепок на момент запуска этой команды) и данная команда лишь препятствует взятию в работу новых таксов с типом GET_PART, ATTACH_PART, REPLACE_RANGE,..
? -
да, новые фетчи не создаются, но уже идущие не прерываются.
-
-
очень медленно работает, потому что не присопоблен пайплайн доставать одну запись
-
Странно. А что быстро работает?
-
У меня получилось 5 млн гетДикт за 3 секунды.
-
в смысле оно не в 8192 раза быстрее чем mergetree
https://kb.altinity.com/engines/altinity-kb-embeddedrocksdb-and-dictionary/#dictget--1million-random-rows -
и direct join тоже не сильно быстрый https://github.com/ClickHouse/ClickHouse/pull/35363#issuecomment-1184773042Special JOIN with StorageEmbeddedRocksDB by vdimir · Pull Request #35363 · 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 direct join algorithm for RocksDB, ref #33582 TOD...
-
Да этой статьей и пользовался. Но mt у меня в принципе запрос с рандом реад не отрабатывает за 5 минут
-
-
я не понял, не отрабатывает пример из статьи или не отрабатывает другой ваш запрос на ваших данных?
-
На моих данных.
-
ну скорее все в MergeTree индекс который не подходит
-
Построен также как в словаре. Если запускать запрос с сортировкой как в mt то очень быстро, а если сортировка не совпадает то очень долго. На реальных запросах, тоже очень долго. Больше 5 минут. На roksdb реальный запрос 2 минуты.
-
-
я не понял тогда в чем противоречие.
Я говорю что rocksDB быстрее всего лишь в жалкие 5-10 раз чем mergeTree
вы говорите что у вас 2 минуты против 5-ти.
я считаю что rocksDB + словарь директ, должы 10-20 млн. dictGet в секунду как минимум выдавать. -
За 5 минут не дождались ответа, в этом и проблемы.
-
- 06 February 2023 (171 messages)
-
Привет. Какой тип хранения словаря выбрать (key - UInt16, value - String[до 20 симв.], кол-во строк ≈10к), если нужно будет делать не только dictGet(...), но и select key from some_dict where value like 'some_text' (т.е. искать по значению-строке, а не по ключу)?
-
А вам точно нужен словарь для такой мелкой таблицы?
-
Нужно регулярно её обновлять из postgres
-
/
-
Можно сделать два dictGet.
Один работает по id, второй - по строке. -
Ключ не может ведь быть строкой, только если строка внутри кортежа, но это всё сильно усложняет. Через select...from всё работает, а данных не так много, чтобы думать над тем, как их хранить, поэтому не буду париться, и выберу Flat
-
Как оказалось может.
Я у себя сделал запрос из словаря по строке. -
а primary key - строка?
-
получается, что в наиболее реалистичном сценарии (100000 random rows) все-таки выигрывает в два раза EmbeddedRocksDB + direct join.
Но уже на 22.12 выигрыш по этим тестам не столь значительный - примерно 10-20%
Потеря кластеризации и выборок по индексу в обмен на призрачное ускорение. -
Всем привет! А почему может быть такое?
insert into history
SELECT
now() as CreatedAt,
JSONExtract(body,'Номер', 'String') as OrderCode,
JSONExtract(body,'GUID', 'String') as OrderGuid,
JSONExtractRaw(body) as Data
FROM queue
settings stream_like_engine_allow_direct_select=1
работает нормально
а
CREATE MATERIALIZED VIEW IF NOT EXISTS consumer TO history AS
SELECT
now() as CreatedAt,
JSONExtract(body,'Номер', 'String') as OrderCode,
JSONExtract(body,'GUID', 'String') as OrderGuid,
JSONExtractRaw(body) as Data
FROM queue
сыпет ошибками
void DB::StorageRabbitMQ::streamingToViewsFunc(): Code: 27. DB::ParsingException: Cannot parse input: expected ']' before: '{\n <тут кусок JSON>’: While executing RabbitMQ. (CANNOT_PARSE_INPUT_ASSERTION_FAILED)
При этом сама queue имеет одну колонку body String и формат JSONAsString -
Надо смотреть на кейсах. У меня пока другая информация.
-
> За 5 минут не дождались ответа, в этом и проблемы.
Там же вам Денни сказал, что если речь идет о минутах, то скорее всего проблема в непопадании в индексы (в том числе из-за недоделанного оптимизатора) и full scan. -
Да я понимаю. Но я не могу под каждый запрс создавать индексы. Rdb пофиг на индексы.
-
-
вы лучше подробности тут дайте, тогда и помогут
-
-
Коллеги, день добрый.
Есть проблема с Zookeeper (версия 3.8.0). Ноды перестают отвечать на команды ruok и рестартуются кубером по кругу (минут через 9-10 работы).
Из подозрительного - большой трафик на запись в диски Zookeeper (4-6 MB/s). Соответственно большие логи.
В кластере Clickhouse 3 копии данных. Как я понимаю, такое можно ожидать при большом кол-ве небольших вставок данных.
И до сегодняшнего дня было подозрение на проблему работы RabbitMQ Engine. Сегодня обновили CH, который пофиксил проблему с RabbitMQ и по логам вроде как прежняя проблема не наблюдается.
Но проблем с Zookeeper продолжаются.
Кто подскажет, как можно подсчитать количество выполняемых вставок во всем кластере CH, как их разбить по таблицам?
Может есть какие-то метрики со стороны ZK?
Под ZK выделен xmx4G. Размер базы данных ~45MB. -
честно, я про это сам с утра узнал, думаю стоит создать issue на github operator
ну и давайте @alexanderzaitsev
спросим -
liveness \ readiness probes через nc сделаны?
есть бага в nc ;)
https://github.com/pravega/zookeeper-operator/issues/475
меняйте на обычный bash и readinessProbe вообще можно убрать
https://github.com/Altinity/clickhouse-operator/blob/master/deploy/zookeeper/quick-start-persistent-volume/zookeeper-1-node-for-test-probes.yaml#L190-L205zookeeper ruok command check occasionally fails · Issue #475 · pravega/zookeeper-operatorDescription The zookeeper liveness and readiness checks use the zookeeper ruok command like so: OK=$(echo ruok | nc 127.0.0.1 $CLIENT_PORT) # Check to see if zookeeper service answers if [[ &qu...
-
Оно работает во всех разумных случаях.
-
так то да , я просто запереживал за тех кто вдруг удаляет дубли в разных партициях таким образом, вот они удивятся
-
да чере зних
-
Спасибо! Сейчас применим.
-
во всяком случае такое "нововведение" тянет как минимум на минорную версию
-
Подскажите плиз, как можно изменить запрос в мат представлении. Структура не меняется.
-
удалить мв и создать новое
-
Всем привет! Падает загрузка clickhouse-client из CSV, причём всегда на отметке 2ч22мин:
Code: 210. DB::NetException: Connection reset by peer, while writing to socket (0.0.0.0:9000): data for INSERT was parsed from stdin
Поднимал receive_timeout, не помогло -
Какой командой загружаете?
-
Пайплю csv в insert, который выполняется clickhouse-client'ом на поде в кубере
-
Я бы попилил на несколько частей чтобы каждаю грузилась по часу. Дело может быть в сети
-
Беда в том, что соседние поды с sql запросами не падают с такими же параметрами клиента, могут жить по 10+ часов для сложных запросов, не падая
-
Но там правда не инсерты, просто расчёты
-
либо scv на хост/под/контейнер с кликом и уже CH клиентом на локалхост заинсертить
-
А в логах самого КХ есть какие то записи об этом?
-
Как раз уходим от этого варианта, раньше так и работало. Часть инсертов нормально работают, а один особенно жирный отлетает
-
тогда только пачками вставка. Либо давайте логи клика. Также может (скорее всего) проблема в сети
-
Единственное интересное, что нашлось:
<Error> TCPHandler: Code: 252. DB::Exception: Too many partitions for single INSERT block (more than 100).
Это сложило инсерт? -
А, вот ещё:
<Error> TCPHandler: Code: 101. DB::Exception: Unexpected packet Data received from client. (UNEXPECTED_PACKET_FROM_CLIENT), Stack trace (when copying this message, always include the lines below):
Но там дальше нет стектрейса 🤔 -
Похоже, что это таки могло. Там как раз чуть больше 100 партиций. Щас попробую слегка поднять значение для этой квери
-
Я думаю да. Я вот не помню, можно ли в логах посмотреть request_id что бы по нему найти запрос. Но если это он - то либо нужно крутить max_partitions_per_insert_block, либо бить на мелкие блоки для вставки
-
Там есть в логах запрос, это точно он, я его просто не стал постить
-
Ок, спасибо, ушёл пробовать)
-
странно что клиент не возвращает эту ошибку, а возвращает другую
-
Видимо поэтому потом UNEXPECTED_PACKET_FROM_CLIENT
-
Привет всем!
Подскажите, есть ли возможность в clickhouse-operator для k8s создавать "пересекающиеся" кластеры?
Например, всего 4 машины, и 3 кластера на них:
* 2 шарда по 2 реплики (хост-0 + хост-1 на одном шарде; хост-2 + хост-3 на другом)
* 1 шард и 2 реплики (хост-0 + хост-1)
* 1 шард и 2 реплики (хост-2 + хост-3) -
обращение к серверу как идет по какому имени? между подом клиента и подом сервера какой нибудь service mesh или ingress не стоит?
-
По IP, прокси если какие-то и есть, то какие-то дефолтные гугловые, специально мы ничего не поднимали
-
разные chi могут быть на одних и тех же нодах
не обязательно все три кластера в один chi пихать
ну и есть еще kubectl explain chi.spec.templates.podTemplates.distribution
или podTemplates.spec
смотрите kubectl explain pod.spec.affinity.podAntiAffinity -
по IP? зачем по IP?
IP пода clickhouse-server?
зачем? он поменяться может...
clickhouse в кубере как развернут? -
Нет, в кубере клиент. Сервер EC2
-
У него не меняется IP
-
хм, а в логах сервера есть что-то по этому поводу?
должно в system.query_log как то отразиться что query не завершилась -
да это могло сложить клиент, но клиент тогда должен был показать это как ошибку
-
Те же ошибки, что в логах, да
-
ну ок
-
версия clickhouse-client и clickhouse-server одинаковые?
-
Да
-
а инсерт в distributed таблицу?
-
Нет, в локальную ReplacingMergeTree
-
Если кто-то наступит на те же грабли: проблема решилось настройкой rabbitmq_max_block_size = 1 в таблице-очереди. Иначе видимо все сообщения читались сплошным потоком без разделения и формат ломался
-
По clickhouse-driver можно вопрос или офтоп?
-
Тут не сильно карают за офтоп и это даже не офтоп
-
ок )
-
Может ищью воздадите об неожиданном поведение ?
-
можно, только конкретный вопрос задавай
но самое лучшее место для этого
https://github.com/mymarilyn/clickhouse-driver/issuesIssues · mymarilyn/clickhouse-driverClickHouse Python Driver with native interface support - Issues · mymarilyn/clickhouse-driver
-
да, сделаю завтра, подготовлю тест-кейс только
-
Когда я создаю сессию
session = Client(host=config.CH_HOST, port=config.CH_PORT, database=config.CH_DATABASE, user=config.CH_USER, password=config.CH_PASS)
вне зависимости доступен клик или нет - вернется абстратный объект сессии.
Естественно мне он такой нафиг не нужен и я сразу делаю
session.execute('Select 1')
чтобы поймать эксепшены.
В случае недоступности возникают 2 эксепшена
NetworkError, ConnectionRefusedError
вот только беда в том что блок try except не может поймать ConnectionRefusedError
потому что оно обрабатывается перед запуском запроса. (и если я правильно прочитал код то и насильно принтится в стдАут)
И собственно вопрос как мне его нормально обработать чтобы трейс в логи не тянуть. -
возможно нужно как то иначе его ловить. Подскажите плиз.
-
Хотелось бы именно в одном поде иметь несколько кластеров.
Чтобы аналитик мог подключиться к одному из подов, и иметь доступ из своей сессии ко всем этим кластерам. -
а зачем вам именно такая странная конфигурация, зачем те два кластера не растянуты на все ноды?
У вас будет сложности и без оператора.
Если вы думаете что все будет видно с любой ноды, то это не так. Вам придется изворачиваться с дистрибьютид таблицами
(но вообще в целом, это можно сделать в операторе, просто это все очень больно) -
не будет такого
кластер это раздельные инстансы clickhouse-server
Один инстанс - один стейтфулсет
можете через files
кастомные кластера сами по именам сервисов определить если сильно хочется... но потом все равно руками придется поддерживать -
У нас основное применение таких кластеров - для таблиц ENGINE = Kafka().
Чтобы не писать в distributed таблицу, мы создаем таблицы вида:
CREATE TABLE IF NOT EXISTS eth_raw_data.kafka_my_logs_shard_1
ON CLUSTER 'prod_shard_1_cluster'
...
ENGINE = Kafka()
SETTINGS
kafka_topic_list = 'my_logs_shard_1',
kafka_group_name = 'my_logs_group_1',
...
и читаем в них.
То есть продюсеры пишут в разные топики для разных шардов. -
поддерживает ли кафка енджин
offset latest or earliest - ? -
прямо в доке про kafka engine это описано
-
а не проще вручную создать таблицы один раз? не создавая кластеры?
-
https://clickhouse.com/docs/en/engines/table-engines/integrations/kafka#configuration
auto_offset_reset
https://github.com/confluentinc/librdkafka/blob/master/CONFIGURATION.md
значения тут
в auto.offset.resetKafka | ClickHouse DocsThis engine works with Apache Kafka.
-
ах, супер, т.е. они используют librdkafka
-
Угу, наверно так и сделаем по итогу.
Раньше был такой подход с множеством кластеров, но видимо при переезде на k8s откажемся от него. -
как человек который делал на это ФР, могу сказать что разумных случаев в разы больше и фича уже 1.5 года как сделана там...
-
Подскажите, как будет работать запрос в такой ситуации, пожалуйста. Есть distributed таблица (шарды без реплик), необходимо приджойнить в запросе другую таблицу, которую шардировать не получится (не имеет смысла) и надо хранить целиком на каждом шарде. Если просто положить ее локально на каждом шарде, то будет ли она использоваться на каждом шарде независимо при выполнении запроса с присоединенной distributed таблицой? Или все таки все выберется из distributed и далее обработается на ноде, на которой выполняется запрос? Если второе, то поможет ли создание кластера с 1 шард и полной репликацией на тех же нодах? Оптимизатор поймет, что можно эту таблицу использовать на каждой ноде независимо до отправки результата на инициатор? Спасибо.
-
спору нет что это разумно, имхо лучше бы на уровне самого CH это было бы сделано, чтобы он сам определил по схеме можно ли такую оптимизацию включать или нет , достаточно тривиальная проверка
-
ну не совсем, часто вы можете знать заранее что у вас нет дупликатов меж шардами (например вставка по регионам), но эт не значит что это поле у вас в order by
-
тоже верно , вот еще почитайте мой коммент
https://github.com/ClickHouse/ClickHouse/issues/39463#issuecomment-1191641779
имхо это самое разумное решениеNew merge tree setting to apply final by default · Issue #39463 · ClickHouse/ClickHouseUse case Migration from other databases and updates/deletes are mimicked by Collapsing/Replacing. Want to use the same SELECT queries without adding FINAL to all the existing queries. Describe the ...
-
В релиз-нотес есть. Всегда можно отключить, если не нужно. Но мы задолбались всем подряд включать )
-
проголосуйте тут https://github.com/ClickHouse/ClickHouse/issues/45517Allow macro or other setting in `kafka_group_name` · Issue #45517 · ClickHouse/ClickHouse
Use case In a traditional replicated cluster, macros can be used to set up the host name etc. But we can also do replication via kafka, as long as kafka_group_name is unique for each node. It would...
-
это в работе
-
прочитал, не понял, ещё раз прочитал и опять не понял.
оно же и так уже в merge-tree settings, куда ещё вы хотите добавить? -
раз ты здесь , скажи будут какито движения по теме https://t.me/clickhouse_ru/306694R-omk in ClickHouse не тормозит
@BloodJazMan по оператору k8s: восстановление Replicated таблиц решили пока подзабить? issue 969
-
> Если просто положить ее локально на каждом шарде, то будет ли она использоваться на каждом шарде независимо при выполнении запроса с присоединенной distributed таблицой?
Или все таки все выберется из distributed и далее обработается на ноде, на которой выполняется запрос? Если второе, то поможет ли создание кластера с 1 шард и полной репликацией на тех же нодах?
не понял разницы, но будет локальная таблица на каждой ноде использоваться. Можно делать кластер (1 шард все реплики), можно руками везде создать и грузитью.
если совсем лень, можно перед запуском запроса сделать темп таблицу на инициаторе и джоинить её, тогда КХ сам разошлет её по шардам.
> Оптимизатор поймет, что можно эту таблицу использовать на каждой ноде независимо до отправки результата на инициатор?
да. Но есть нюансы в многоуровневых запросах с вложенными subquery. Верхние уровни будут выполнятся на инициаторе. -
так... я не понял, эту опцию что ли можно указать при создании таблицы? я походу провтыкал это из за того что в доке опция досих пор отсутствет
-
Оно уже работает в полу-автоматическом режиме в последних версиях оператора. Если вручную удалить pv/pvc и стриггерить reconcile, то новые pv/pvc создадутся, схема правильно создастся, и данные среплицируются.
-
да, при create table xxxx setting do_not_mergeblabla=0
-
Спасибо, буду экспериментировать тогда.
-
не , нфига , я проверял на 0.20.1 , мету руками все равно пришлось переность (часть меты, таблицы , база вроде появилась )
-
а не ерунду говорю, это setting опция сейчас
-
вот , я ж о том ,
-
да, пробуйте
-
-
не понял, поясните плз
-
сейчас можно писать
SELECT A,B,C FROM MYTABLE SETTINGS do_not_merge_across_partitions_select_final=0;
надо добавить это в сеттинг таблицы... -
-
-
Странно, так как я недавно именно таким образом пересоздавал вольюмы с нуля, реплицируя данные с других реплик
-
не туда ответ походу
-
а база обычный атомик ? не экспериментальынй репликатед?
-
они собираются автоматически включать эту фичу выводя из partitionby/order и убрать настройку
-
аха
-
Подскажите пожалуйста, а как лучше автоматизировать создание/запуск ddl в таком случае?
Положим у нас есть 10 шардов, и на каждом мы хотим создать такую таблицу.
Понятно что можно написать скрипт на баше, но мб есть какие-то тулзы / лучшие практики для этого? -
отлично! а если захотим форсить без ключа? куда жалобу писать чтобы настройку оставили?
-
Даже ordinary, думаю.
-
ну я попрошу в PR , такого PR еще нет
-
CREATE TBL xxx ON CLUSTER 'clustername' ?
там можно же макросы использовать в сеттингах? -
там скорее всего именно атомик нерабочий
https://github.com/Altinity/clickhouse-operator/issues/969#issuecomment-1175190016Automatic recovery after complete data loss · Issue #969 · Altinity/clickhouse-operatorThe algorithm for manual recovery has already been described here https://kb.altinity.com/altinity-kb-setup-and-maintenance/recovery-after-complete-data-loss/ Expected behavior delete pvc and delet...
-
не знаю, не видел такого.
-
так не будет работать ? (не пробовал просто интересно)
```
CREATE TABLE IF NOT EXISTS eth_raw_data.kafka_my_logs_shard_1
ON CLUSTER 'prod_shard_1_cluster'
...
ENGINE = Kafka()
SETTINGS
kafka_topic_list = {topicname},
...
``` -
https://github.com/Altinity/clickhouse-operator/blob/426f5b3bd91d3b1ea22f29d7779feb058f0e582a/pkg/model/clickhouse/cluster.go#L158
Может, там код ошибки другой?clickhouse-operator/cluster.go at 426f5b3bd91d3b1ea22f29d7779feb058f0e582a · Altinity/clickhouse-operatorThe Altinity Operator for ClickHouse creates, configures and manages ClickHouse clusters running on Kubernetes - clickhouse-operator/cluster.go at 426f5b3bd91d3b1ea22f29d7779feb058f0e582a · Altinit...
-
Allow macro or other setting in `kafka_group_name` · Issue #45517 · ClickHouse/ClickHouse
Use case In a traditional replicated cluster, macros can be used to set up the host name etc. But we can also do replication via kafka, as long as kafka_group_name is unique for each node. It would...
-
Подскажите пожалуйста, при переносе данных из MySQL в clickhouse использовал clickhouse-mysql, который перенес таблицу и налил ее данными. Если я впоследствии использую migrate-table, то новые данные доливаются, но и старые тоже и множество дублей появляется.
Я в курсе, что можно скриптом все время докачивать, но по ряду причин это не вариант. Возможно ли добавить отсутствующие данные другим путем? -
а как можно kafka engine мониторить?
-
на живой/не живой
-
объем данных
-
Через кафку же
-
ага
-
вот прям сейчас снес pvc, не фурычит
clickhouse: Code: 253. DB::Exception: ....... already exists. (REPLICA_IS_ALREADY_EXIST) (version 22.11.1.1360 (official build))
chop for SQL: CREATE TABLE IF NOT EXISTS qryn.tempo_traces_kv UUID 'af26de48-1a42-4af4-a0e4-6f69ac49c353' ........ -
PV надо снести
-
Хотя, возможно, в атомиках что-то другое из-за UUID опять проявляется
-
ну эьто понятно, данные начисто залилсь ,pv новый создался
-
создалось все таблицы кроме ReplicatedReplacingMergeTree
-
вроде по ошибке понятно что это данные в ZK
-
В этом случае ATTACH делается. Кстати ошибка в логе будет, это не страшно. Но таблица должен потом все равно приаттачиться
-
в смысле schemer.go начал ATTACH TABLE делает сейчас?
-
Похоже, что вместо запятой после кода ошибки теперь точка. Надо поменять условие на более гибкое
-
в логах оператора не грепается строка Trying ATTACH TABLE instead
-
похоже что в этом дело
-
Всем привет. Есть вопрос по производительности. У нас есть таблица вида
CREATE TABLE IF NOT EXISTS table
(
date_key Date DEFAULT toDate(datetime),
datetime DateTime,
id String,
sign Int8,
version UInt32,
field1 String,
field2 Int64,
field3 String,
....
)
ENGINE = VersionedCollapsingMergeTree(sign, version)
PARTITION BY toYYYYMM(datetime)
ORDER BY id
SETTINGS index_granularity = 8192;
Например в ней 50млн записей. И когда достаешь строку по id через
SELECT .*
FROM table AS t
WHERE ((t.sign = 1)
AND (t.version = 1)
AND (t.id = 'some_id'))
этот запрос работает долго - 0.9-1,5 сек. Можно ли его как-то ускорить? -
если вместо * выбирать одно поле SELECT id сколько работает?
explain estimate SELECT .*
FROM table AS t
WHERE ((t.sign = 1)
AND (t.version = 1)
AND (t.id = 'some_id')) -
-
А попробуй 0.20.3 ? У нас на это нет хорошего теста пока (так как фича незадокументирована)
-
0.039 sec vs 1.076 sec.
-
-
-
конкретно в этом кейсе 60 982 843 записей
-
Интересно, что будет если условие Id в PREWHERE перенести
Получение одной строки можно ускорить, уменьшив index granularity
Пачки данных будут меньше, операций процессора под капотом будет больше. Но вытаскивание одной строки будет быстрее.
Если id это случайная строка и искать нужно совершенно разные id, то в этом может быть смысл. -
а можно пример с prewhere?
-
уменьшение гранулярности раздувает размер памяти который используется чтобы primary key хранить, причем сильно
оно не бесплатно -
PREWHERE Clause | ClickHouse Docs
Prewhere is an optimization to apply filtering more efficiently. It is enabled by default even if PREWHERE clause is not specified explicitly. It works by automatically moving part of WHERE condition to prewhere stage. The role of PREWHERE clause is only to control this optimization if you think that you know how to do it better than it happens by default.
-
Неожиданно, но перенос в prewhere помог. Спасибо! А есть какие-то ограничения у этого подхода?
-
-
-
-
-
ну вы доку почитайте...
что такое PREWHERE
я ссылку привел
я немного не в контексте конкретного подхода
вот тут еще можно прочесть
https://www.tinybird.co/clickhouse/knowledge-base/filter-with-prewhereFilter with PREWHERE | ClickHouse Knowledge BaseWondering when to use PREWHERE in ClickHouse? Here's how to optimize filtering with PREWHERE and minimize scan size in ClickHouse.
-
-
ну вообще суть в том что фильтрация по одной колонке, потом читаются только те парты в которых колонка отфильтрвалась...
хорошо работает только на колонках которые имеют низкую кардиналити и значения не размазаны по всем партам
или колонка с высокой кардинальностью, но небольшого размера
когда вы через PREWHERE id=X точно один парт находите... -
не слушайте бред, prewhere сделает медленее, потому что id это PK, т.е. prehwere вынудит проверять id два раза
покажите
explain estimate SELECT .*
FROM table AS t
WHERE ((t.sign = 1)
AND (t.version = 1)
AND (t.id = 'some_id')) -
вот
-
-
из-за какой колонки? t.version ?
-
-
Bump
-
проблема в parts = 62
вы не знаете дату? PARTITION BY toYYYYMM(datetime) ? -
-
-
avgWeighted очень плохая и очень медленная, лучше не использовать,
используйте sum(x * weight) / sum(weight) -
О как, интересно. Спасибо, у нас местами используется, заменим
-
в смысле вы запрос делаете чтобы -1 вставить?
вам не нужны все поля -
тогда промежуточная статистика биться не будет через sum(val*sign)
-
-
непонятно как может prewhere тут помочь
либо очень много строк у которых t.version != 1 -
-
так вообще проще ReplacingMT использовать и не париться с sign и вставками лишних строк
- 07 February 2023 (154 messages)
-
Всем привет.
Почему последний запрос возвращает пустую строку, а не 'name2' (под каждым запросом на скрине напечатал его вывод)? -
Привет.
select extract('name2 asdf','(name1|name2)')
Регулярка неправильная -
простите, это снова я со своим "динамическим TTL", а можно как-то посмотреть, сколько осталось жить конкретной записи?
-
Спасибо
-
Здравствуйте. Например в таблице system.query_log стоит такой TTL event_date + toIntervalDay(7)
Тогда запросом можно проверить select event_date + toIntervalDay(7) <= now(),* from system.query_log limit 10 -
вроде работает
-
Добрый день!
Запустил бд в яндекс облаке пытаюсь подключиться через clickhouse driver следующим образом, но получаю ошибку типа:
NetworkError: Code: 210. nodename nor servname provided, or not known (****.mdb.yandexcloud.net:9000)
порты пробовал разные и 8443 и 9000
Сертификаты установил, через DBeaver подключение проходит
В чем может быть ошибка? -
а есть где-то release notes на minor updates
чем например отличается
22.12.2.25
и 22.12.3.5 ? -
https://cloud.yandex.com/ru-ru/docs/managed-clickhouse/operations/connect
вот это читали?
порт 9440 должен быть если по TCP Native конектитесьДокументация Yandex Cloud | Yandex Managed Service for ClickHouse | Подключение к базе данных в ClickHouse-кластереК хостам кластера Managed Service for ClickHouse можно подключиться:
-
Добрый день
Хочу посчитать стату по дню таким sql - запросом.
select sum...
from t
where
1 = 1
and create_dttm between '2023-02-05 08:00:00' and toDateTime64('2023-02-06 08:00:00',6) - interval 1 microsecond
Делаю такой запрос , выдаёт ошибку
DB::Exception: Syntax error: failed at position 198 ('microsecond') (line 6, col 106): microsecond
Я так понял в клике нет интервала 1 микросекунда , но поле create_dttm у меня datetime64(6)
И если написать вот так and toDateTime64('2023-02-06 08:00:00',6) - interval 1 second , то потеряются данные , которые были с 59.000001 -
попробуйте в скобки взять
( toDateTime64('2023-02-06 08:00:00',6) - interval 1 microsecond ) -
может быть проще будет
where toDate(create_dttm) = '2023-02-05' -
Индекс ж не будет рабоать
-
А у вас есть какой то индекс там?
-
не взлетело
-
-
не ну в постгре к прмиеру так бы не работало.
Ну в клике не индекс а парт -
ошибка то какая?
-
-
-
Ну в КХ все зависит от того как у вас таблица сделана
-
ну вот ответ (((
-
все должно работать
https://fiddle.clickhouse.com/3a4b3b57-7f81-4aab-bc66-5fb34a62edaf
смотрите полный запрос
версия clickhouse-server какая? -
-
-
DateTime64(6)
-
Хм , запрос в ide не запустился.
Версия клика 22.3.3.44 -
в 22.3 microsecond нет
правильный вариант для вас >= X AND < Y
как вот тут посоветовали
https://t.me/clickhouse_ru/310543Mike Minaev in ClickHouse не тормозитну еще вариант where create_dttm >= '2023-02-05 00:00:00' and create_dttm < '2023-02-06 00:00:00
-
-
А нормальное решение вообще ожидается?
Классическая ситуация - мне надо затащить на бэк сводную таблицу, где столбцами будет n дат из столбца (на этапе написания запроса - их кол-во и содержание не известно). Я такое в обычных БД могу сделать спокойно, почему у кликхауса с этим мастхэвом на 10+ый год жизни проблемы? -
а расскажите как вы это делаете в обычных БД? в каких?
какую конструкцию SQL используете ? -
Таки тут мой косяк. Все решения через процедуры. Мне казалось, что можно обычным SQL.
Ладно, рассуждать о том, что это можно было бы просто взять и сделать поставив в БД проверку на превышение итогового лимита с 1к-10к-100к столбцов и пр не буду. Хотя вообще можно было бы сделать, никто бы не обиделся от этого.
Пойду костыли генерить значит и лишнее тащить в бэк, что уж... -
welcome to make pull request
насчет "генерации процедурами" что вы имеете ввиду? stored procedures ? или какой то код на стороне вашего приложения?
если вы внимательно мое сообщение прочтете,
то поймете, что кол-во столбцов довольно важная штука и при формировании ответа столбцы и их тип, задаются в заголовке, по протоколу. практически в любой БД
и при стриминге ответа, если у вас кол-во столбцов зависит от данных, не прочитав все данные нельзя понять сколько у вас в итоге должно быть столбцов
и соответственно, это придется делать в два прохода если будет на стороне СУБД все
у clickhouse конечно есть HTTP форматы ответов типа TSV где столбцов вообще может не быть и типов тем более...
но это просто вывод в "другом формате". кол-во колонок, как и в любой СУБД в ответе ему нужно знать заранее все равно -
Всем привет! Если запущен optimize final на всю таблицу, kill query … будет ждать завершения всего оптимайза, или где-нибудь между партициями может прибить кверю?
-
вы запустили не запрос, а мерджи)
-
Почему неизвестно? Столбцы не из воздуха берутся. Их кол-во определяется distinct-ом по столбу(ам) под pivot-ирование (те же даты, которые из строк разворачиваются в столбец, или дата + что-то). Вот и список столбцов (и их типов тут же). Тут в теории только 1 минус - если столбцов окажется очень много. Ну лимит можно поставить на стороне БД и его в настройку куда-нибудь (distinct показал, что будет 1 млрд столбцов - error). Усё.
А по сути вместо БД этот вполне очевидный и часто востребованный алгоритм надо делать мне снаружи руками зачем-то.
P.S.: [немного оффтоп] Да что-то я подустал, из 30 реквестов (по разным языкам и вопросам) на баги/доработки я видел телодвижения по 1 или 2ум.
Запишу себе в бэклог сделать пуллреквест, в качестве развлекухи на вечер. -
В processlist есть query_id, kill sync вроде тоже не падает) Подумал, что так можно отменить оптимайз. Возникла необходимость транкейтнуть таблицу
-
Да и optimize final вроде ж синхронный и последовательно выполняется
-
ну вы убили запрос?
Он прекратился?
А мерджи прекратились? -
kill … sync просто повисает, в system.merges продолжается суета. Так что да, он не работает) Но я думал, что это пока он не домёрджит текущую партицию, вдруг там коллбеки есть для таких ситуаций
-
поищите и почитайте про stop merges
-
(есть select * except () вместо вашего -column. deleted)
что касается pivot, то проблема в том, что компиляция запросов статическая, поэтому нет возможности обратиться к данным и под данные переписать запрос. Отказываться от статической компиляции ради редко нужной фичи?
Если есть желание делать динамику - да, делайте сами. Запрос на данные, генерация SQL с колонками, второй запрос. Вобщем-то ничего сложного. -
1) Да, я себя поправил еще до вашего сообщения по поводу except. У меня триггер с реляционок, думал что и тут тоже.
2) Я пользователь, мне часто сводки нужно делать в БД, это не редкая фича.
3) PIVOT - сам по себе не стандартный SQL мув, и не реляционный, но реляционки нехотя таки его все-равно затащили под наплывом жалоб от пользователей
4) Вот именно, ничего сложного, можно было бы и не обременять пользователя делать то, что могла бы сама БД
А философствовать про самостоятельность... ну , можно много чего еще делать самому. Брать например сырые данные из БД и всё на бэке самому фильтровать-группировать, ничего сложного ведь. Но что-то ведь не так в этой идее да? -
у меня везде PIVOT делается в BI tool. Там ему самое и место. В КХ делается предагрегация до разумного размера (десятки тысяч строк), а уже внутри BI идет вращение столбцами.
-
Ну вот а можно было бы оптимизированнее - 1 запросом 1 сводку сразу. Зачем пользователя страдать заставлять
-
Потому что приоритет в другом. Написано-же - "не тормозит" на милиардах и терабайтах. У многих страдания именно тут. Если ваши страдания в удобстве динамических манипуляций - питон с пандас к вашим услугам.
-
1) Это какие-то странные рассуждения. А зачем тогда вэб-клиент? А зачем except столбцов добавлен? А зачем то, а зачем се? БД она для кого пишется? Для пользователей, или для того, чтобы разрабы философией занимались про 2 прогона и "не тормозит"?
2) Пандас - это очень убогий и неоптимизированный мусор с отвратительнейшим синтаксисом, я R пользуюсь (data.table/tibble). Питон в целом сам по себе - не для анализа данных. -
У вас что то не сходится. Вы говорите что питон не для анализа данных - поэтому вы им не пользуетесь(не нравится - ок). Но когда вам говорят что КХ не про построение каких то табличек для отчетности - КХ плохой
-
КХ не плохой, я уже восхитился революционным рывком - не парили мозги философией, как это делают старые зомби типа Оракла, а взяли, и добавили EXCEPT. И еще COLUMNS с перечислением через регулярки.
-
Зато есть куда расти
-
И какая-то формулировка у вас очень странная - не для табличек для отчетности. А для чего лол? Он сперва для отчености делался под Яндекс Метрику.
-
Тут надо не в оппозицию ко мне становиться следуя когнитивным искажениям, чтобы посаумотверждаться, а включить голову, осознать, что я сейчас однозначно прав, и дальше требовать с меня пулл-реквест, получить от меня ссылку, зайти и заплюсовать и писать: "да, давно пора, доколе" и т.п.
-
Нашлось более простое решение: drop table
-
хочется апдейтов в CH на самом деле....
-
Есть такое, с PIVOT-иком...
-
-
-
@den_crane и другие эксперты, читаю документацию про временные таблицы https://clickhouse.com/docs/ru/sql-reference/statements/create/table/#temporary-tables "В большинстве случаев, временные таблицы создаются не вручную, а при использовании внешних данных для запроса, или при распределённом (GLOBAL) IN. Подробнее см. соответствующие разделы". Объясните, пожалуйста, что значит внешних данных запроса и про распределенный (GLOBAL) IN. Завтра буду выступать перед начальством. Надо рассказать про пользу от использования временных таблиц :)CREATE TABLE | ClickHouse Docs
create-table-query}
-
Гуглите (гуглом) clickhouse external data
-
-
-
Коллеги, а в последнее время проблем вроде "зависания merge" операций не появлялось?
-
обновились вчера и вот сейчас уперлись в то, что все писатели получают ошибки слишком много партиций. А в таблице system.merges картина как-то не меняется. Есть ощущение, что все зависло.
-
Всем привет, подскажите пожалуйста.
Создал словарь через DDL источник данных mysql.
Ошибся с типом данных ключа, я сделал UInt32, но оказалось что в таблице mysql колонка с ключом может быть с отрицательным значением, соответственно UInt32 надо изменить на Int32.
Я удалил словарь, создал заново с ключом Int32. Словарь создался, но колонка ключа не изменила тип данных, она по прежнему UInt32 -
чисто теоретический вопрос, но поддерживает ли CH downgrade ?
-
-
clickhouse-local - это же обычная консольная программа. Значит её можно запускать стандартными средствами Python/PHP. Например в Python можно использовать subprocess.check_output()
-
словарь как создавали через SQL или через XML?
-
при global in данные с локальной ноды через врем. таблицу передаются в шарды если запрос к дистр.
select * from t_distibuted where F in (select ... from other_local_or_distributed)
каждый шард сам выполнит выделенное
select * from t_distibuted where F global in (select ... from other_local_or_distributed)
инициатор выполнит поздапрос, результат положит во временную таблицу и разошлет в шарды -
через SQL
-
как удаляли словарь? какой командой?
-
drop dictionary
-
Добрый день. Есть ли в clickhouse reduce() с аккумулятором предыдущего значения? Или какой-нибудь хак, чтобы итерируясь по массиву получить доступ к предыдущему вычисленному значению?
-
Background Merges stuck on different replicas from time to time, requiring restart to solve · Issue #44865 · ClickHouse/ClickHouse
Describe the situation Since upgrading from 22.3 LTS to 22.12 Stable (via 22.8 LTS version) we have had two occasions where the background merges of a single replica suddenly stop and do not recove...
-
Большое спасибо за объяснение!
-
layout словаря у вас неправильный, primary key у обычных не complex_key всегда UInt64!!!
-
с 22.8.6.71 до 23.1.3.5
-
увеличивайте background_fetch_pool_size в два раза (надо настраивать в обоих местах обязательно)
-
Сори, лаяут HASHED, создается UInt64 а не как я написал UInt32.
все понял, большое спасибо. -
Пробуем
-
уже 10+ый год жизни? вот время летит.
-
а ничего, что в описании данного параметра сказано, что он устарел и не используется?
-
Судя по статье, в 2009 внутри яндекса уже эксплуатировался, в 2016 в опен сорс вылез
https://ideanomics.ru/articles/25357#:~:text=ClickHouse%20%D0%B1%D1%8B%D0%BB%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%20%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B8%20IT,%D0%B8%20%D1%81%D0%B0%D0%BC%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D0%B1%D0%B0%D0%B7%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85.ClickHouse – стартап родом из Яндекса – стал единорогом - Идеономика – Умные о главномКомпания с российскими корнями ClickHouse формально была основана всего лишь два месяца назад, а уже привлекла второй раунд инвестиций размером в $250 млн, оценка проекта превысила $2 млрд. ClickHouse был создан внутри IT-гиганта «Яндекс» в 2009 году как система управления базами данных, а затем и самостоятельная аналитическая база данных. Изначально использовался для целей аналитического сервиса […]
-
нельзя остановить мержи (точнее можно но не kill query)
-
Летит и правда)
-
подозреваю что в 2009 году там не было SQL
-
Подскажите пожалуйста. Задача - "определение средней стоимости запасов (при наличии частичных продаж)". Все методы подсчета итеративные, никак не получается решить задачу функциями map/reduce кликхауса.
-
Держали контейнером в виде микросервиса думаете? Мб...
-
я про язык запросов
-
Ну я про то же самое. Если не было SQL, а БД уже была, то к ней как-то же обращались. Видимо json в контейнер-микросервис, запрос-ответ... наверное
-
window functions?
вообще есть arrayMovingSum / Average , но они странные -
Добрый день, не могу понять
с первой оконкой все ок
но добавляю вторую и по ней ошибка
SELECT
`2ws`.Date,
toDayOfWeek(today()) AS dw,
sum(`2ws`.sumW) OVER (ORDER BY Date ASC RANGE BETWEEN 6 + dw PRECEDING AND 7 PRECEDING) AS PreWeekSum,
sum(`2ws`.sumW) OVER (ORDER BY Date ASC RANGE BETWEEN dw - 1 PRECEDING AND CURRENT ROW) AS ThisWeekSum
FROM
(
SELECT
Date,
sum(Weight) AS sumW
FROM vSalesSum
WHERE Date >= toStartOfWeek(today() - toIntervalDay(7), 1)
GROUP BY Date
) AS `2ws`
Type mismatch in IN or VALUES section. Expected: Date. Got: Int64. (TYPE_MISMATCH -
если dw - 1 заменить на константу, то все ок
-
ну у вас сравнения
в первом варианте сравниваете RANGE BETWEEN 6 + dw PRECEDING AND 7 PRECEDING числа
а во втором дату и отриц число -
во втором тожже самое dw
-
BETWEEN 6 + dw PRECEDING
и
BETWEEN dw - 1 PRECEDING -
у меня есть подозроеваемый, КХ подозревает что там может случиться отрицательное число
-
вот так съел
-
sum(2ws.sumW) over (ORDER BY Date RANGE BETWEEN abs(dw-1) PRECEDING AND 0 PRECEDING) as ThisWeekSum
-
Приветствую. Вопрос актуален
-
Добрый день.Подскажите пожалуйста - у меня есть таблица в 6 млрд записей - около 150 гб. Хочу создать replacing таблицу и указать order by contact_id. Как прописать partition по контактам чтобы схлопнулись все контакты? На данный момент использую подобную конструкцию - intDiv(cityHash64(contact_id),
186330748219288416) в partition by но все же остаются дубликаты. -
а вы уверены что дубликаты остались? Вы как проверяли? Делали optimize?
-
Да и optimize делал и проверял через select contact_id, count () from table
group by contact_id; -
А почему просто не оставить cityHash(contract_id)?
-
Здравствуйте, а будет ли работать репликация с движком ReplicatedMergeTree в ситуации, когда кластер состоит из двух шардов у каждого из которых одна реплика? если создать вот так
engine = ReplicatedMergeTree('/clickhouse/tables/{database}/{table}', '{replica}') -
макрос реплика = имя хоста на каждом шарде
-
Тогда при вставке данных ругается на количество партиций в одной вставке - более 100. В итоге у нас будет более 2 млрд партиций где-то - т.о. более 2 млрд файлов в памяти (если я правильно все понимаю)
-
select * from system.replicas показывает active_replicas = 2 для этой таблички и обе is_leader = 1. Это нормально?
-
посмотрите, действительно ли дубликаты находятся в одной партиции
_part есть скрытое поле -
Так это разные поля, за партиционирование отвечает секция partion by в CREATE TABLE а за схлопывание - order by
-
Вы имеете ввиду cityHash(contract_id) в partion by или order by?
-
-
Тогда что в partion by поставить?
-
Ну я просто не знаю что у вас там за данные. Если вы хотите что бы у вас не было вообще дублей на уровне таблицы - то тогда можно partition by tuple(), но тогда мержи могут долго идти
-
Мержи с другими таблицами? У меня туда только словарь будет ходить. В любом случае спасибо попробую 👍
-
У вас там неплохой partition by expression, равномерно разбивающий пространство на 100 бакетов. Наверное не стоит его менять без лишней нужды. order by contract_id тоже не скажешь что очень ужасный, но его точно не стоит портить при помощи cityHash.
Непонятно в чем ваша проблема. Поясните с примерами.
Вы уже используете Replacing? with final or some group by? Что не получается?
Если нет final и данные поступают непрерывно, то дубликаты обязательно будут. -
У меня просто replacingmergetree partition by indiv() order by contact_id
-
Какую конструкцию final вы имеете ввиду?
-
как вы обращаетесь к таблице? Должно быть select contact_id,col1 from table final. Если final нет - могут быть дубликаты
-
Обращаюсь обычно обычным селектор без final. Цель - чтобы в таблице не было дубликатов при обычном селекте
-
Просто понимаю что без партицирования такой объем данных хранить нельзя
-
Причина найдена. Вам надо почитать что такое ReplacingMT и как с этим работать. Партиции тут не при чем. И работать без них можно.
-
👍
-
В документации про RMT сами найдете. А вот вам потом для усиления впечатления - https://kb.altinity.com/engines/mergetree-table-engine-family/replacingmergetree/
-
уже два года как все реплики лидеры, если им не запрещено быть лидерами.
-
вам надо думать про distributed таблицу и ключ шардирования, а не про ...
-
Коллеги, подскажите, пытаюсь сделать инсерт в SummingMergeTree: INSERT INTO db.table (timestamp, publisher) VALUES ('2023-01-02 00:00:00','1'). Запрос выполняется, но потом селектом этой записи не выдается, как будто вставки не было.
-
Сумма таки сработала?
-
точно, спасибо
-
подскажите пожалуйста, изучаю репликацию в КХ, кластер из двух нод на базе clickhouse keeper собрал, данные реплицируются.
но если отключить одну из нод то вторая переходит в режим только на чтение :(
а хотелось бы конечно что бы кластер мог дальше работать в штатном режиме без второй ноды, это возможно? -
строки с нулями в метриках не хранятся
-
>это возможно?
нет
надо 3 кипера, чтобы 1 мог быть выключен -
т.е. для создания отказоустойчивости необходимо иметь более 2х нод, что бы можно было провести голосование, так?
-
киперу нужно, да.
-
понял, благодарю
-
вроде бы нужно кол-во нечетных нод, что бы кворум был
-
нет
-
Нужно, чтобы киперов было живо больше половины от сконфигурированного количества.
-
разве тогда не будет просто избыточно? 3 ноды переживут падение одной, 5 нод могут работать при двух упавших. какой смысл делать, например 4?
-
4 - нет большого смысла, в каком-то смысле это даже хуже 3, т.к. и накладные расходы на репликацию выше и вероятность падения двух нод из 4 выше, чем 2 из 3.
-
когда вы проектируете кластер у вас в случае деградации должно оставаться нод > n/2.
Т.е. для 4х нод можно потерять только 1 как и для 3х, соответственно в 4х нет смысла -
-
-
Эта статья уже устарела, описанные ишью были сделаны
-
Ну как бы да, учитывая то, что это сентябрь.
А с учётом того, что уже февраль? Есть смысл переходить? Или лучше ещё подождать? -
На этот вопрос может ответить только девстенд) я вот как раз только попросил коллегр развернуть с кхкипером и потестить нагрузку
-
Понял. Ладно, останусь пока на ЗК, а дев на кипер переведу.
-
непонятно как ментейнить, например как кипер перенести на другие железки не выключая (в смысле я например однажды зукипер перенес на другой континент и зукипер все время был доступен).
-
Если кому не хватает веб-консоли, как в ClickHouse, для других баз данных, сделал PDO Console на PHP: https://github.com/ibnteo/pdoconsoleGitHub - ibnteo/pdoconsole: PDO Console
PDO Console. Contribute to ibnteo/pdoconsole development by creating an account on GitHub.
-
так у ClickHouse встроенная балайка на порту 8123
https://play.clickhouse.com/play?user=play#U0VMRUNUIGNvdW50KCkgRlJPTSBnaXRodWJfZXZlbnRzIFdIRVJFIGV2ZW50X3R5cGUgPSAnV2F0Y2hFdmVudCc= -
Я про неё и говорю, удобная штука, сделал для себя такую же, чтобы точно так же работать с другими базами.
В просмотр таблицы добавил вывод столбцов одной строки в строчном виде (если нажать на номер строки). -
ясно, я криво прочитал
-
🔥 🔥 🔥
Здравствуй мой друг ✋ Если ты еще не веришь, что деньги берутся с воздуха, то я тебе это докажу. Есть актуальная связка на 6-8% за круг в 20-30мин, думаю тебе будет интересно. Беру 20% от прокрута . -
/report
- 08 February 2023 (223 messages)
-
А какой самый простой способ перекладывания данных из пг в постгресс? Переливать данные надо физически
-
из постгрес в кликхаус вы имеете ввиду?
-
Да
-
Сорри
-
я бы сделал copy .... to stdout | clickhouse-client ...
-
ну опять же от объема данных зависит, если в оперативку не влазят то по частям выгружаете в файлы и файлы потом через клиента переносите + есть же в КХ функции postgresql(conn_string,db,table,schema) можно при наличии прямого коннекта прямо из БД в БД вливать
-
Вариант, спасибо
-
Но чего-то более нативного нет?
-
Вот этот вариант более интересный
-
postgresql | ClickHouse Docs
postgresql}
-
Спасибо
-
Первый батч большой. В пг порядка 4тб, но потом надо делать на daily basis
-
Спасибо, почитаю
-
Ест еще вот такое прямое взаимодействие между БД https://clickhouse.com/docs/ru/engines/database-engines/postgresql/PostgreSQL | ClickHouse Docs
postgresql}
-
Но тут я так понимаю данные не перекладываются
-
я бы делал через внешний инструмент ETL чтобы не было сильной связанности между БД.
ПГ -> ETL -> КХ -
Это временное решение, пока девелоперы не напишут коннектор к ch
-
Так что то, что вы предложили по мне ок
-
Спасибо
-
пожалуйста
-
Как вариант debezium + наш clickhouse-sync-connector
-
Всем привет. Кто-нибудь подскажет куда копать? Я ради интереса удалил каталог /clickhouse в зукиппре, и ошибка не изменилась
dwhtest :) select count() from my_fist_bd2.BusinessCard2;
Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Table my_fist_bd2.BusinessCard2 doesn't exist. (UNKNOWN_TABLE)
CREATE TABLE my_fist_bd2.BusinessCard2
(
SysRowDate Date COMMENT 'Дата',
BranchGuid FixedString(36) COMMENT 'Guid филиала',
UserGuid FixedString(36) COMMENT 'Guid пользователя',
UserName String COMMENT 'Пользователь',
UserPosition String COMMENT 'Должность пользователя',
CardType String COMMENT 'Тип визитки',
CardCnt Int64 COMMENT 'Количество визиток'
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/my_fist_bd2/BusinessCard2', '{replica}')
PARTITION BY toYYYYMM(SysRowDate)
ORDER BY (SysRowDate, BranchGuid, UserGuid, CardType)
SETTINGS index_granularity = 8192
Query id: 30f08a97-c7df-414a-a20c-93397ff780a1
0 rows in set. Elapsed: 0.009 sec.
Received exception from server (version 22.8.5):
Code: 253. DB::Exception: Received from localhost:9000. DB::Exception: Replica /clickhouse/tables/DWHtest/my_fist_bd2/BusinessCard2/replicas/10.0.16.16 already exists. (REPLICA_IS_ALREADY_EXIST) -
не надо partition by по контрактам делать...
для Replacing нужен просто ORDER BY contract_id
потому что Replacing означает заменяем строки с одинаковым значением ORDER BY полей -
а как удаляли? после этого должно было все в readonly связанное с ZK перейти...
SELECT database, name, engine_full FROM system.tables WHERE engine_full ILIKE '%my_fist_bd2%' FORMAT Vertical
сколько записей показывает? -
Спасибо, но уже разобрался. Там глупая ошибка.
-
ну вы расскажите в чем она =) для истории
-
когда копипастил конфиг, забыл в настройках поменять макрос replica и на обоих серверах он был одинаковый. Я создавал таблицу на одном, потом пытался создать на другом, а таблица по такому пути только что создана)
-
Опубликовано видео с конференции FOSDEM 2023: https://www.youtube.com/watch?v=JlcI2Vfz_ukFOSDEM 2023 - Building Analytical Apps With ClickHouse
NOTE: The audio is distorted for the first 3:50...it cleans up immediately following. The slides are available at: https://presentations.clickhouse.com/fosdem2023/ Presented at FOSDEM 2023 in the 'Fast and Streaming Data' room, ClickHouse Founder & CTO, Alexey Milovidov, shared the journey of building analytical applications while also exploring your data. We will build a few analytical apps from scratch. This includes the full circle: data collection, processing, and visualization, and most of this is done by ClickHouse and a bunch of one-line shell scripts. The emphasis of this talk is to show how approachable and powerful modern data processing tools are.
-
None
-
добррый день!
-
как нибудь решается ситуация, что оконка не хочет брать в качестве границы окна то, что не является константой в столбце?
SELECT
`2ws`.Date,
`2ws`.sumW,
`2ws`.dw,
sum(`2ws`.sumW) OVER (ORDER BY Date ASC RANGE BETWEEN 6 + `2ws`.dw PRECEDING AND 7 PRECEDING) AS PreWeekSum
FROM
(
SELECT
Date,
toDayOfWeek(Date) AS dw,
sum(Weight) AS sumW
FROM vSalesSum
WHERE Date >= toStartOfWeek(today() - toIntervalDay(7), 1)
GROUP BY
Date,
dw
) AS `2ws`
Exception: Missing columns: 'dw' while processing query: '6 + dw', required columns: 'dw' 'dw'. (UNKNOWN_IDENTIFIER) -
если просто dw псоставить Тоже падает?
-
да
-
версия clickhouse какая?
попробуйте поиграться с вашим CREATE TABLE + SELECT
на разных версиях на
https://fiddle.clickhouse.com -
22.8.2 revision 54460.
-
если в последних версиях не работает
то сделайте issue на github
не должно так быть по идее -
собственно вот
-
-
https://github.com/ClickHouse/ClickHouse/issues/45535
похоже надо ждать когда analyzer выкатят по дефолту
https://github.com/ClickHouse/ClickHouse/pull/45461UNKNOWN_IDENTIFIER error on simple query with window function and expression in ORDER BY · Issue #45535 · ClickHouse/ClickHouseHello, we found a bug after updating to latest Clickhouse version (22.12.3.5). Here is a minimal reprodicible example: SELECT *, count() OVER () AS c FROM numbers(10) ORDER BY toString(number) Code...
-
Понятно! Спасибо
-
Всем привет!
Обновили кх до версии 22.8.13 (перед этим была 22.7.5)
И в кластере рандомно начинают падать ноды при запросах с такой ошибкой:
2023.02.08 08:04:35.046067 [ 2646422 ] {} <Fatal> Application: Child process was terminated by signal 11.
Кто-то сталкивался с таким? -
там в логах, чуть выше, должен быть стектрейс где именно падает... покажите
-
нету (
то есть просто эта строка и нода лежит
у нас такое было месяца 3-4 назад, когда пытались обновиться до 22.8 тогда еще
но в чате вроде сказали что это баг -
есть, вы как клик запускаете? kubernetes ? или standalone сервера?
/var/log/clickhouse/clickhouse-server.err.log
тут смотрите... -
да, в этом логе
standalone сервера -
кластер 4 сервера 2х2
2 шарда, 2 реплики -
ок. выше fatal
или ниже
но вообще signal 11
это вроде OOM Killer
памяти не хватает? -
оперативки по 256Гб
диски (ssd) на 70% заняты -
signal 11 это segmentation fault
в логе точно есть дальше стейтрейс... ищите -
-
-
-
все, пятиминутка ненависти,
вот скажи мне ... индивидум родившийся после 90го года, который не знает как выделить и скопировать текст
как думаешь, твою картинку удобно читать?
а выделить текст внутри нее удобно, чтобы тебе потом пальцем тыкнуть?
давай шарь нормально -
:)
Сек ) -
почему названия файла нестандартные
вы как то переопределяли конфигурацию логирования дефолтную?
что при этом в
tail -n 100 /var/log/clickhouse-server/clickhouse-server.log ? -
2023.02.08 08:26:36.604381 [ 2805149 ] {} <Fatal> Application: Child process was terminated by signal 11.
-
а теперь пошлют на paste-сервисы ж-)
-
для каких-то devops целей 2 файла есть. На могу сказать для каких
-
ну тогда старших позови. и git blame сделай если есть где чтобы понять зачем конфигурацию clickhouse меняли
-
суть одна
лога перед signal 11 нет
началось после апдейта с 22.7 на 22.8
если с таким не сталкивался, ок, поищу еще где-то
Спасибо -
я как раз сталкивался
потому и говорю так уверенно что перед сегфолтом signal 11 клик должен вывалить куда то стектрейс...
погрепай логи по слову Fatal -
Всем привет , у меня задача хранить минимальный и максимальный dttm по транзакциям , и их каунт.
Имеется вот такой примерчик
https://fiddle.clickhouse.com/378c56d8-a6a5-4d81-8338-bf1d941dd0cc
Логика поступления строчек будет плюс минус такая же.
В какой то момент времени приходят данные по транзакциям ( с разным временем и разными ивентами) , каунт считается прелестно , а вот время я так понял агрегирует каким то странным образом -
Я думаю тут нужен не SummingMergeTree а AgregatingMergeTree. Где у вас ключом будет id транзакции. И 3 агрегириющих поля minState, maxState и countState. https://gist.github.com/den-crane/6eff375752a236a456e1b3dc2ca7db62Clickhouse example AggregatingMergeTree, (max, min, avg ) State / Merge
Clickhouse example AggregatingMergeTree, (max, min, avg ) State / Merge - gist:6eff375752a236a456e1b3dc2ca7db62
-
всем привет, подскажите правильный синтаксис для значений по-умолчанию для массивов
CREATE TABLE x (`a.b` Array(Int8) DEFAULT [-1]) ENGINE = MergeTree ORDER BY tuple();
INSERT INTO x VALUES ([null]);
SELECT a.b FROM x;
хочу получать -1, а не 0 -
Да, нужен AgregatingMergeTree, но для min/maх/count лучше использовать SimpleAggregateFunction, и без State/Merge. Там весь стейт - это само значение.
На самом деле можно даже оставить SummingMergeTree - оно стерпит.
https://fiddle.clickhouse.com/906e3183-3202-494c-a78e-9bacff4fd5e9 -
вставляйте тогда null вместо [null]
-
спасибо 🙈
-
кто-то писал свою аналитику? возникла проблема со сбором данных со стороны js и ожиданием ответа
-
А вы прям напрямую в кх решили с клиентов писать?
-
вообще пока что в постгрес
-
-
а как лучше?
-
ну это вопрос обобщенный)
-
извиняюсь за офтоп
-
-
-
собираем на клиенте через js, отправляем в пг запрос и получаем ответ от пг
-
~ # tail -1000000 /var/log/clickhouse-server/server.log | grep Fatal
2023.02.08 08:16:08.070527 [ 2799630 ] {} <Fatal> Application: Child process was terminated by signal 11.
2023.02.08 08:26:36.604381 [ 2805149 ] {} <Fatal> Application: Child process was terminated by signal 11.
2023.02.08 08:40:36.314473 [ 2810484 ] {} <Fatal> Application: Child process was terminated by signal 11.
Пока откатились до 22.7.5.
Во второй половине дня попробую еще -
$site=Site::where('hash',$hash)->where('sites.domain', parse_url($request->headers->get('origin'),PHP_URL_HOST))->first();
вот пример -
а как можно иначе то?
-
По моему все решаемо...
select top 10 *
from system.query_log
where toUnixTimestamp64Micro(event_time_microseconds) between
toUnixTimestamp64Micro(toDateTime64('2023-02-07 12:19:36.241793', 6))
and toUnixTimestamp64Micro(toDateTime64('2023-02-07 12:19:36.370533', 6)) + 1 -
Ну у этого есть куча проблем: главная из них неконтролируемая нагрузка, это если убрать за скобки проблемы с безопастностью, отказоусточиваюстью и тп
-
можно навести на мысль, чтобы можно было дальше пойти читать где-то в хабрах или интернетах
-
если не напрямую писать то как лучше
-
сейчас проблема следующая, мы собираем аналитику js-ом и каждую секунду отправляем с посетителя запрос, когда посетитлей >10 одновременно подключенных, то есть >10 запросов в секунду то время обработки этих запросов непрерывно растет
-
Nginx, logstash, kafka вариантов хватает
-
вот вам простое слово для гугления - KittenHouse Можно даже прямо тут в чате - недавно обсуждалось. Есть решения и посложнее, скажем Кафка, но тоже с отдельным сервисом перед. В любом случае какой-то сервис вам понадобится, и это уже тема для других чатов.
-
спасибо, пошел читать
-
/report
-
Добрый день! Может кто подсказать второй день изучаю кликхаус. Планирую поднять кластер из 3 шардов и по две реплики и на этих же нодах ставлю clickhouse-keeper. Это получилось судя по выхлопу команды
SELECT * FROM system.clusters LIMIT 6 FORMAT Vertical; там все ноды расписаны и их роли (тут вроде все гуд). Баз данных еще не создавал.
Но есть нюанс, далее я смотрю keeper.
Вывод команды напрягает не стыковка:
echo srvr | nc localhost 2181
ClickHouse Keeper version: v23.1.3.5-stable-548b494bcce13462ab61af6a2cfa6b4ff7eb848a
Latency min/avg/max: 0/0/0
Received: 0
Sent: 0
Connections: 0
Outstanding: 0
Zxid: 0
Mode: leader
Node count: 3
как и в echo mntr | nc localhost 2181
zk_server_state follower ( в 5 нодах фоловер 1 лидер)
zk_znode_count 3
zk_watch_count 0
Node count: 3 и zk_znode_count 3, а должно быть похоже что 6.
Вопрос как добиться корректного отображения нод keeper? или уезжать сразу на zookeeper? -
znode это данные это не сервера
вы секцию <zookeeper> в конфигах clickhouse-server прописали ? как?
что показывает SELECT * FROM system.zookeeper WHERE path='/' FORMAT Vertical ? -
Привет. Подскажите, пожалуйста. Сколько приблизительно соединений держит нормально хост (около 96 ядер) на котором установлен только ClickHouse? Данные вставляются скриптом (используя JDBC драйвер) из других БД (не ClickHouse) которые расположены на других хостах (то есть на каждом таком хосте есть БД и скрипт и оттуда данные выбираются и вставляются в хост с ClickHouse).
-
соединений много 4096
но одновременных QUERY
по умолчанию 100
сколько у вас строк в одном INSERT ? -
Спасибо. По поводу строк не могу сказать (буду уточнять).
-
сразу скажу, лучше 1 вставка на 100 000 строк чем 10 вставок по 10 000
-
Received exception from server (version 23.1.3):
Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Table system.zookeeper doesn't exist. (UNKNOWN_TABLE)
а в настройках я использовал только
<clickhouse>
<keeper_server>
<raft_configuration>
<remote_servers> -
это конфигурация clickhouse-keeper
чтобы они друг друга видели
<zookeeper> надо чтобы clickhouse-server видел clickhouse-keeper и мог общаться с ним по ZK протоколу
https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings/#server-settings_zookeeperServer Settings | ClickHouse Docsbuiltindictionariesreload_interval
-
Народы привет! Подскажите есть ли готовые алерт рулы для прометея для встроенных метрик ? может кто то поделиться?
https://clickhouse.com/docs/ru/operations/server-configuration-parameters/settings/#server_configuration_parameters-prometheusКонфигурационные параметры сервера | ClickHouse Docsserver-configuration-parameters-reference}
-
Помогите развернуть таблицу из long в wide. Допустим, есть выдача:
неделя1 сегмент1 12423
неделя1 сегмент2 23432
неделя1 сегмент3 32432
неделя2 сегмент1 23432
неделя2 сегмент2 23432
неделя2 сегмент3 56465
неделя3 сегмент1 67657
неделя3 сегмент2 67576
неделя3 сегмент3 45654
А надо сделать что-то типа:
сегмент неделя1 неделя2 неделя3
сегмент1
сегмент2
сегмент3
Вроде есть вариант через groupArray, но это если ты знаешь точно количество столбцов (недель), а если недель непредсказумое количество? Ничего из нагугленного не помогло -
https://grafana.com/grafana/dashboards/14192-clickhouse/
юзаю этот дашбоардClickHouse | Grafana LabsClickHouse internal exporter metrics
-
Вы бы тут поискали. Только вчера была жаркая дискуссия про pívot.
-
сейчас посмотрел, спасибо. в принципе, надежды мало на самостоятельное SQL-решение просто в силу естественных причин
-
Всем привет, помогите с кверёй, не понимаю почему не работает
—-
with
map(
'0', [0,2,4,6,8],
'1', [1,3,5,7,9]) as is_even,
t1 as (
SELECT number as col1,
toString(number%2) as key
FROM numbers(10)
),
t2 as (
SELECT number as col1
FROM numbers(10)
)
select col1,
arrayFirst( (x) ->
x in is_even[key],
[col1]) as rr
from t2
left join t1
using col1
—-
https://fiddle.clickhouse.com/646b214b-ac83-48c0-8e1d-99b25ddbadd0 -
проявляется в функциях перебора массива только. Т.е. если просто сджойнить и вывести значение value из мапы по ключу, то всё ок
-
вот, например
-
-
mv отрабатывает только на той таблице на той машине, на которой она создана
-
mv на эту таблицу есть на обоих серверах.
-
Замените in на функцию has
https://fiddle.clickhouse.com/0f567e24-1a57-47e8-b0c7-14b7845d0e4c -
ну значит на обоих серверах и будет отрабатывать, у вас mv должно быть создано через TO
-
оооо, мерси
-
Добрый день
Подскажите в чем может быть ошибка с параметрами или отсутвует поддержка параметризации такого запроса?
Запрос:
exchange tables {databaseName:Identifier}.{tableNameTmp:Identifier} and {databaseName:Identifier}.{tableName:Identifier};
Ошибка
Code: 62. DB::Exception: Syntax error: failed at position 17 ('{'): {databaseName:Identifier}.{tableNameTmp:Identifier} and {databaseName:Identifier}.{tableName:Identifier};. Expected identifier. (SYNTAX_ERROR)
Версия клиента:
ClickHouse client version 23.1.3.5 (official build). -
Привет, столкнулись с такой проблемой - в доках не нашел похожего
При переливке таблицы на 12млрд в такую же таблицу, но с добавлением пары новых полей - ловим раздувание партиций в десятки раз,
partition by у нас привязан по модулю (partition-key%256). Подскажите с чем это может быть связано и как такое лечить?
PS Обратил внимание, что вначале партиций было еще больше (какие-то десятки тысяч) спустя несколько дней - их осталось 2к. -
Добрый день, хотим понять как spark.df(jdbs) сохранить в ch без предварительного создания ddl на его стороне. Кто-то пробовал сразу записать df, что бы создалась таблица в формате MergeTree. Сейчас наш код выглядит так df.write.format("jdbc").option("driver", "com.clickhouse.jdbc.ClickHouseDriver").option("url", "jdbc:clickhouse://00.00.0.000:8123").option("createTableOptions", "ENGINE=MergeTree").option("createTableOptions", "ORDER BY id").option("dbtable", "stage.table).mode("append").save()
-
Честно говоря не очень понятно что там вы считаете и как называете. Вы точно не путаете парты и партиции? Вы точно учитываете только active?
И если вы не меняете partition by/order by, то нет смысла копировать 12 ярдов строк, лучше сделать быстрый аттач партов в новую таблицу, и там уже делать манипуляции со столбцами - добавить, заполнить итп. А может вам и старой таблицы хватит. -
Нашел такой способ df.write.format("jdbc").option("driver", "com.clickhouse.jdbc.ClickHouseDriver").option("url", "jdbc:clickhouse://00.00.0.00:8123").option("createTableOptions", "ENGINE = MergeTree() ORDER BY id").option("dbtable", "table").mode("append").save() надуюсь коллегам пригодиться)) но сейчас падает с ошибкой Cannot set null to non-nullable column и .option("createTableColumnTypes","data Nullable(DateTime)") не помогает(( p.s в джобу заходим с --packages com.github.housepower:clickhouse-spark-runtime-3.3_2.12:0.5.0,com.clickhouse:clickhouse-jdbc:0.4.0 и бесит конечно что нельзя указать ORDER BY 1
-
Всем привет
Создаю табличку ReplicatedMergeTree а она не реплицируется
Уже все перерыл не могу найти причину
Вот конфиг
</PROD>
<PROD>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>node01</host>
<port>9000</port>
</replica>
<replica>
<host>node02</host>
<port>9000</port>
</replica>
</shard>
</PROD> -
а DDL таблички?
-
CREATE TABLE db.test_part_record on cluster PROD
(
version UInt8,
timestamp DateTime64(3),
****
) ENGINE = ReplicatedMergeTree()
ORDER BY timestamp; -
Строки удалил по понятным причинам) но логика запроса ясна я думаю
-
так у вас не указана дорога к зукиперу, должно быть что-то типа
engine = ReplicatedMergeTree('/clickhouse/tables/{database}/{table}', '{replica}')
select * from system.macros что возвращает? -
Сейчас попробую
но вроде пробовал уже -
какие макросы у вас настроены ? select * from system.macros
-
-
-
на второй ноде тоже replica PROD назыавется?
-
да
-
ну вот поэтому и не работает, надо чтоб replica был разный
-
1 и 2 например
-
-
всё равно
CREATE TABLE db.test_part__record ON CLUSTER PROD
(
***
)
ENGINE = ReplicatedMergeTree('/data/clickhouse/lib/store/tables/{replica}/{shard}/log_test', '{replica}')
ORDER BY timestamp -
Добрый день,
max(fact) FILTER (WHERE md.min_month_value=dt.month_value) OVER
(PARTITION BY year ORDER BY year_month)
данный код в одной версии отрабатывает клика в другой ругается на синтаксис , правильно ли понимаю что не поддерживается? -
Данные только там где инсерт был
-
ReplicatedMergeTree('/data/clickhouse/lib/store/tables/{table}', '{replica}')
-
вот так напишите
-
а в чем разница?
-
-
базовый путь должен быть одинаковый для репликации
-
а тут макрос {shard} который разный на двух нодвх
-
-
-
Это базовый макрос КХ, его не надо вручную задавать. КХ сам поймет какое имя у таблицы.
-
также как и {database}
-
https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/replication/ вот здесь если поискать по {table} все написаноРепликация данных | ClickHouse Docs
table_engines-replication}
-
-
-
-
-
Пути в кипере есть и одинаковые для обеих таблиц? Кроме имён реплик
-
Как это проверить?
-
Макросы replica точно должны отличаться ? типа PROD1 и PROD2
-
Дописал, да, разные
-
SELECT *
FROM system.zookeeper
WHERE path = '/data/clickhouse/lib/store/tables/'
FORMAT Vertical^I
SELECT *
FROM system.zookeeper
WHERE path = '/data/clickhouse/lib/store/tables/'
FORMAT Vertical
Query id: c8411286-1997-4d6f-b42e-1fa27a413430
Row 1:
──────
name: PROD2
value:
path: /data/clickhouse/lib/store/tables/
Row 2:
──────
name: PROD1
value:
path: /data/clickhouse/lib/store/tables/
Row 3:
──────
name: test_part_dialog_record3
value:
path: /data/clickhouse/lib/store/tables/
3 rows in set. Elapsed: 0.007 sec. -
SELECT *
FROM system.zookeeper
WHERE path = '/data/clickhouse/lib/store/tables/'
FORMAT Vertical
Query id: dde3a9c1-d087-4260-b1f1-0e75d570bfff
Row 1:
──────
name: PROD2
value:
path: /data/clickhouse/lib/store/tables/
Row 2:
──────
name: PROD1
value:
path: /data/clickhouse/lib/store/tables/
Row 3:
──────
name: test_part_dialog_record3
value:
path: /data/clickhouse/lib/store/tables/
3 rows in set. Elapsed: 0.006 sec.
Другая нода -
здравствуйте!
Если кликхаус допустимо остановить, можно ли перенести его данные на другой сервер, перенеся саму папку с данными? -
-
ATTACH | ClickHouse Docs
attach}
-
Ну вы странные пути указали
А вообще реплики общаются через зукипер и interserver_http_host
Remote servers не нужен для двух реплик -
а в конфиге что писать в interserver_http_host
? -
ip/ hostname
-
И какие пути указать
-
это я понял
но какие
на праймари указать хост секондари а на секондарои наоборот? -
-
то есть чтобы перенести базу logs и таблицу loads, можно:
1. на новом сервере создать базу logs
2. в /var/lib/clickhouse/data/logs/ на новом сервере перенести данные со старого
3. сделать attach table logs.loads
? -
ага
-
Спасибо!
-
там возможно еще структуру таблицы придется указать
ATTACH TABLE name FROM 'path/to/data/' (col1 Type1, ...) -
Нет, в каждом конфиге ip своего же сервера
-
Посмотрите в доке, я пока с телефона(
-
ок) спасибо) ща гляну)
-
Всем привет!задача : необходимо сравнивать сумму оборота текущей и прошлой недели минута к минуте накопительный итогом. Метрика week2week. Т.е. в пн текущей недели надо сравнить оборот с пн прошлой недели , во вторник - оборот за пн+Вт текущей недели к пн+Вт прошлой недели и так до воскресенье вечер. Сравнение должно идти минута к минуте (ну или край час к часу) .
Вопрос : реализуемо ли в СН посчитать сумму за период now() - дата начала недели и то де самое ,но минус интервал 1 неделя?
Буду благодарна за любые идеи реализации w2w в СН -
Ну я б в оконные ф-ции глянул.
Думаю, 1440мин х 7 дней в 2 недели КХ в ОЗУ легко засунет.
А там дальше сравнивать -
Я про запрос, с ОЗУ норм все
-
А что конкретно вызывает сложность? Посмотрите функции toHour, toMinute, обрезаете и сравниваете по ним
-
-
насколько критично именно из базы готовый ответ получить?
группировку до минуты легко получить из базы, те суммы - легко получить на любом бэке, которым вы данные получаете..
если, конечно, у вас клиенты напрямую в кликхаус не ходят -
Ну если на лету накопительная сумма по минутам нужна?
Почему оконки лишние? Каждая минута = сумма предыдущих + текущая -
По какой дате делать группировку ,если мне нужна сумма за период от сейчас минус начало недели
-
до минимальной единицы отображения.
то есть вот так:
00:01 10
00:02 12
00:03 18
а дальше любым языком программирования проходите его последовательно, заменяя значение на сумму предыдущих. -
select sum(amount), toStartOfMinute(date_time) as _dt
from records
group by _dt order by _dt asc -
Можно сделать примерно вот так
SELECT formatDateTime(toStartOfHour(timestamp), '%T') as t, sumIf(value, timestamp between now() - INTERVAL 7 DAY and now()) as this_week, sumIf(value, timestamp between between now() - INTERVAL 14 DAY AND between now() - INTERVAL 7 DAY) as prev_week from table group by t -
потому что это считается на лету из таблицы транзакций в 1 запрос без оконок, как выше уже написали
-
-
типа такого:
select sumIf(amount, toDate(created)>=toMonday(now()) AND toStartOfMinute(created)<toStartOfMinute(now())) this_week_sum,
sumIf(amount, toDate(created)>=toMonday(now())-interval 1 week
AND toStartOfMinute(created)<toStartOfMinute(now()) - interval 1 week
) prev_week_sum
from table
where toMonday(created)>=toMonday(now()) - interval 1 week; -
Спасибо всем!!!
-
Всем привет!
Подскажите плиз, может кто сталкивался, в какую сторону копать. Куча GET_PART и минимум экзекуторов, причем такая картина только на одной ноде кластера
SELECT
merge_type,
type,
sum(num_tries) AS num_tries,
sum(is_currently_executing) AS is_currently_executing,
sum(is_detach) AS is_detach,
count() AS cnt
FROM system.replication_queue
GROUP BY
merge_type,
type
Query id: c606e003-ba01-4782-b7e9-bb53ab49d47c
┌─merge_type─┬─type────────┬─num_tries─┬─is_currently_executing─┬─is_detach─┬────cnt─┐
│ Regular │ MERGE_PARTS │ 5 │ 2 │ 0 │ 14232 │
│ │ GET_PART │ 1056 │ 4 │ 0 │ 839890 │
│ TTLDelete │ MERGE_PARTS │ 0 │ 0 │ 0 │ 1 │
└────────────┴─────────────┴───────────┴────────────────────────┴───────────┴────────┘
Пробовал выкручивать background_fetches_pool_size - картина не меняется
SELECT
name,
value
FROM system.settings
WHERE name LIKE 'background%'
Query id: 45b1dd95-0405-4b05-9321-934e26f1a5ec
┌─name──────────────────────────────────────────┬─value─┐
│ background_buffer_flush_schedule_pool_size │ 16 │
│ background_pool_size │ 16 │
│ background_merges_mutations_concurrency_ratio │ 2 │
│ background_move_pool_size │ 8 │
│ background_fetches_pool_size │ 32 │
│ background_common_pool_size │ 8 │
│ background_schedule_pool_size │ 128 │
│ background_message_broker_schedule_pool_size │ 16 │
│ background_distributed_schedule_pool_size │ 16 │
└───────────────────────────────────────────────┴───────┘
Началось после падения zk по нехватке памяти -
А не смотрели в сами ошибки? Может там есть что то полезное?
-
Всем привет, а у кого-то был опыт или может ткнёте а доку по полному восстановлению кластера если есть только бэкапы db которые были сделаны ON Cluster
-
Смотрел, там такое по большей части
Not executing fetch of part 202302_230178_230178_0 because 8 fetches already executing, max 8. -
Всем привет! Может кто знает и подскажет почему в ch так странно отрабатывает (точнее сказать не отрабатывает😔) запрос с NOT IN. Пишу запрос след вида:
“””select distinct app, day
from TestStore
where day = toDate('2022-12-06')
and app in ('Test1', 'Test2')
and (app, day) not in (
select app, day
from TestStore lds
where day = toDate('2022-12-06')
and app = 'Test1'
)
;”””
Он ничего не возвращает (хотя должен вернуть запись с app ’Test2’) пока к условию not in не добавлю “= 1” и тогда все ок… Может кто знает о проблеме или я че то не догнал)) -
Перерыл всё и попробовал все варианты
вообще не пойму что не так с репликацией
она тупа не работает -
Оберните в подзапросе app, day в скобки (app, day)
-
в таком случае ошибка что не совпадает количество колонок слева и справа (Number of columns in section IN doesn't match. 2 at left, 1 at right.)
-
TestStore не distributed поверх шардов?
-
-
-
-
создайте две такие таблицы на каждом из серверов
CREATE TABLE default.table_name
(
`id` UInt64,
`app_id` UInt64
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/table_name', '{replica}')
ORDER BY (app_id)
SETTINGS index_granularity = 8192; -
Я кажется понял
у меня на обоих нодах
is_leader=1
сейчас пытаюсь понять почему так -
у вас две ноды зк?
-
3
-
нет, он engine = ReplacingMergeTree
-
вы про зк или про replicas? Если про replicas, то это норм
-
про репликас
-
выполните то что выше я написал
-
-
Сейчас
-
CREATE TABLE default.table_name ON CLUSTER PROD
(
`id` UInt64,
`app_id` UInt64
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}', '{replica}')
ORDER BY app_id
SETTINGS index_granularity = 8192
Query id: eae3633c-76c8-4bff-8dd7-8243bbac44b7
┌─host──────────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ ****** │ 9000 │ 0 │ │ 1 │ 0 │
│ ****** │ 9000 │ 0 │ │ 0 │ 0 │
└───────────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
2 rows in set. Elapsed: 0.117 sec.
SELECT * FROM default.table_name FORMAT Vertical;
SELECT *
FROM default.table_name
FORMAT Vertical
Query id: 85b5072a-0675-495a-b891-06e39d7421e6
Row 1:
──────
id: 0
app_id: 12331213
Row 2:
──────
id: 0
app_id: 1231231
2 rows in set. Elapsed: 0.002 sec. -
-
-
удалите таблицы, они удалятся сами
-
Короче говоря магия какая то
я делаю точно по документации - и вот не работает) -
Путь кстати остаются почему то
-
Ну давайте начнем с ЗК
echo mntr | nc localhost 2181 -
Я наверное сегодня всё) я уже 4 часа это ковыряю) надо отдохнуть))) спасибо вам огромное ))))
-
-
лол
-
-
-
Короче дело было в создании таблички
Видимо косячил с путями -
ENGINE = ReplicatedMergeTree('/data/clickhouse/tables/{database}/{table}/', '{replica}')
Вот так завелось -
Коллеги ?
-
nope. Сам вот думаю сейчас как то прикручивать
- 09 February 2023 (220 messages)
-
Прикрутить то прикрутил)
Но почему-то это работает на одной ноде из двух только -
Итить background_fetches_pool_size нужно не в профиле, а в основном конфиге задавать. Причем system.settings показывает значение, если задать в профиле, но по факту оно не работает.
-
-
Привет чат, а был у кого-то опыт скрещивания ansible и clickhouse в плане выполнения запросов? Есть некоторое количество DDL которые надо выполнять в определенной последовательности. Роли которые видел в galaxy - они больше про установку конфигурирование.
есть два варианта:
вызывать клиента на хосте
дергать через url
может я что-то упускаю? -
-
-
datagrip, но вообще есть
https://clickhouse.com/docs/en/interfaces/third-party/gui -
-
Добрый день.
Коллеги, нужна помощь в аудите СУБД, решении текущих проблем, а также проектировании новой целевой архитектуры.
Оплата либо за проект, либо почасовая.
Если интересно, прошу писать в личку.
Заранее прошу извинить за подобное сообщение в группе, если оно не соответствует политикам, но политики не нашел. -
спасибо, гляну
-
-
День добрый. А как то можно получить более подробный лог? почему он не видет ноды keeper.
Вот мой весь конфиг который я кидаю в config.d/(файл прикрепил) + дефолтный не тронутый config.xml
С одной ноды до другой могу достучаться с помощью ccclickhouse-node-01:# echo srvr | nc сcclickhouse-node-06.domain.local 9181
Или возможно есть какой-то гайд человеческий по clickhouse + clickhouse keeper чтобы я смог понять что я не так делаю. -
а что еще более подробного вам нужно кроме фразы zookeeper.node.host not found
и стектрейса где это произошло? -
в расшаренном файле по прежнему не вижу секции <zookeeper> которая должна применяться для clickhouse-server
-
вы прочли ссылку которую я вам давал?
https://t.me/clickhouse_ru/310787 ?Slach [altinity] in ClickHouse не тормозитэто конфигурация clickhouse-keeper чтобы они друг друга видели <zookeeper> надо чтобы clickhouse-server видел clickhouse-keeper и мог общаться с ним по ZK протоколу https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings/#server-settings_zookeeper
-
Всем привет! Может кто знает и подскажет почему в ch так странно отрабатывает (точнее сказать не отрабатывает😔) запрос с NOT IN. Пишу запрос след вида:
“””select distinct app, day
from TestStore
where day = toDate('2022-12-06')
and app in ('Test1', 'Test2')
and (app, day) not in (
select app, day
from TestStore lds
where day = toDate('2022-12-06')
and app = 'Test1'
)
;”””
Он ничего не возвращает (хотя должен вернуть запись с app ’Test2’) пока к условию not in не добавлю “= 1” и тогда все ок… Может кто знает о проблеме или я че то не догнал)) -
как же нету?
<zookeeper>
<node>
<hostname>ccclickhouse-node-01.domain.local</hostname>
<port>9181</port>
</node>
<node>
<hostname>ccclickhouse-node-02.domain.local</hostname>
<port>9181</port>
</node>
<node>
<hostname>ccclickhouse-node-03.domain.local</hostname>
<port>9181</port>
</node>
<node>
<hostname>ccclickhouse-node-04.domain.local</hostname>
<port>9181</port>
</node>
<node>
<hostname>ccclickhouse-node-05.domain.local</hostname>
<port>9181</port>
</node>
<node>
<hostname>ccclickhouse-node-06.domain.local</hostname>
<port>9181</port>
</node>
</zookeeper>
Вот же ? -
<host>
вместо
<hostname> -
-
-
Всем привет! Подскажите по удалению данных из таблицы по условию6 пожалуйста!
Есть запрос по мануалу:
DELETE FROM db1.table1 WHERE length(phrase) < 3
но возврaщается exception:
DB::Exception: Syntax error: failed at position 1 ('DELETE')
Может кто знает как то победить? -
А где в мануале такой DELETE?
-
DELETE Statement | ClickHouse Docs
DELETE FROM removes rows from table [db.]table that match expression expr. The deleted rows are marked as deleted immediately and will be automatically filtered out of all subsequent queries. Cleanup of data happens asynchronously in background. This feature is only available for MergeTree table engine family.
-
Попробуйте alter table X delete where …
-
alter table db1.table1 delete where length(phrase) < 3
если это верно, то не работает( -
хотя, процесс же в background'е происходит?
-
Это с 22.8 только есть
-
А что пишет?
Это выглядит как правильный запрос -
стоит почитать что такое мутации и что такое lightweight deletes
https://clickhouse.com/docs/en/sql-reference/statements/alter/#mutations
и чем они отличаются
прежде чем бездумно использоватьALTER | ClickHouse DocsMost ALTER TABLE queries modify table settings or data:
-
known issues / limitations of lightweight deletes · Issue #39870 · ClickHouse/ClickHouse
they will be delayed, then there are a lot of merges happening (=when there is a high inserts pressure, and the pool is busy) they 'touch' all the parts - so if the list of parts is...
-
ошибок нет никаких, только что все готово. ну оно на самом деле вроде работает, кол-во уменьшается
-
ок, спасибо!
-
Потому что операция не синхронная. Ждите )
-
понял, спасибо!
-
Добрый день! Подскажите как изменить конфиг, чтобы LDAP авторизация работала не через CN,а через sAMAccountName?
-
Добрый. На официальном сайте всё есть. Там в одном файле для лдап и ад примеры.
-
Если будут трудности, то ссылку могу где-то через час скинуть
-
Уточняю в лоб это не решается, но там есть специальные фильтры. По идее должно заменить
-
И не на каждой версии клика всё работает хорошо.
-
-
-
там поиска позиции символа справа нет что ли? если есть, то искать справа точку и по это место делать подстроку. ну в начале иф, что точек ровно 2 в строке, если бывт строки другого вида, чтобы лишнего не отрезать.
-
https://clickhouse.com/docs/en/operations/external-authenticators/ldap/#ldap-server-definition
вот тут есть пример для sAMAccountNameLDAP | ClickHouse DocsLDAP server can be used to authenticate ClickHouse users. There are two different approaches for doing this:
-
Тут точно про ClickHouse?
-
No, Sorry
-
увы нет, position умеет только позицию слева
остаются только регулярки IMHO -
background_fetches_pool_size is capped by the profile setting · Issue #43351 · ClickHouse/ClickHouse
It seems background_fetches_pool_size cannot be set as a server setting The only way is default profile + restart. (and these settings marked as obsolete) 22.8.8.3 I have a cluster with 2 replicas ...
-
В корне. Но задавать надо и там и там из-за бага
-
Скип индексы есть. Ну баг. Это в гитхаб.
-
Да я видела пример. По нему не работает
-
ошибки какие?
-
-
В логе тоже только информация о том, что пользователь не найден
-
Версия клика свежая? На 21 версии у меня криво работает рекурсивный поиск пользователей.
-
-
22.3 у нас
-
Подключаетесь к актив директори или лдап серверу?
-
И почему там такой хост сервера, имя ресолвится?
-
#ищу
Менеджера по подбору персонала
Кого придется искать
- Менеджеров по рассылкам
- Менеджер по продажам
- Бизнес ассистентов
Писать в лс -
К серверу
-
На скрине хост изменен
-
<ldap_servers>
<my_ad_server>
<host>xxxxx.xxxx</host>
<port>389</port>
<bind_dn>XXXXX\{user_name}</bind_dn>
<verification_cooldown>0</verification_cooldown>
<user_dn_detection>
<base_dn>OU=DNS Users,DC=xxxx,DC=xx</base_dn>
<search_filter>(&(objectClass=user)(sAMAccountName={user_name}))</search_filter>
</user_dn_detection>
<enable_tls>no</enable_tls>
</my_ad_server>
</ldap_servers>
<user_directories>
<ldap>
<server>my_ad_server</server>
<role_mapping>
<base_dn>OU=adm-dwh-ch,OU=Clickhouse,OU=_System accounts and groups,OU=DNS Users,DC=xxxxx,DC=xx</base_dn>
<attribute>CN</attribute>
<scope>subtree</scope>
<search_filter>(&(objectClass=group)(member={user_dn}))</search_filter>
<prefix>clickhouse_</prefix>
</role_mapping>
</ldap>
</user_directories> -
Cкидываю свой конфиг к АД, все прописано в conf.xml
Еще могу добавить, что если пользователь не находиться, то или не правильно настроен блок ldap_servers или проблемы с рекурсией, c другим пока не сталкивался) -
Спасибо
-
Добрый день. Подскажите пожалуйста есть ли возможность в самом кх вызывать автоматический инсерт селект по времени? Например каждые 20 мин
-
Нет
-
Добрый день.
Подскажите, пожалуйста, флаг is_frozen в таблице system.parts снимается сразу при выполнении unfreeze или после очередного мержа кусков?
Сделал freeze и unfreeze в system.parts вижу часть кусков с is_frozen=1 хотя в shadow/ пусто -
Тоже недавно интересовался, is frozen не отражает реальность после unfreeze, но хардлинки на самом деле удаляются
-
Flag `is_frozen` of data part is not persistent. · Issue #42404 · ClickHouse/ClickHouse
Describe the unexpected behaviour Flag is_frozen of data part disapears from system.parts table after restarting the server or detaching the table. How to reproduce CREATE TABLE test_frozen (id UIn...
-
добрый день!
Помогите, пожалуйста, подсчитать, сколько кликхаусу надо места для завершения mutations.
предыстория: начало заканчиваться место на диске.
было решено удалить старые данные в жирной таблице. Alter c where отработал, но место не добавлялось.
Было видно, что mutation не может пройти изза того, что не мог зарезервировать неполных 10 гиг места.
место добавили, стало свободно около 30 гиг.
дело сдвинулось, и споткнулось след. шагом, что не может зарезервировать 50 гиг.
еще добавили, опять пошло дальше, кликхаус отдал еще места, и опять встал с ошибкой:
SELECT latest_fail_reason FROM system.mutations WHERE is_done = 0\G
Row 1:
──────
latest_fail_reason: Code: 243, e.displayText() = DB::Exception: Cannot reserve 131.22 GiB, not enough space (version 21.5.6.6 (official build))
места и инод дотаточно.
С точки зрения os :
Filesystem Size Used Avail Use% Mounted on
data/db 1.8T 1.6T 205G 89% /var/lib/clickhouse
Filesystem Inodes IUsed IFree IUse% Mounted on
data/db 429845468 35164 429810304 1% /var/lib/clickhouse
С точки зрения кликхауса:
SELECT formatReadableSize(free_space)
FROM system.disks
┌─formatReadableSize(free_space)─┐
│ 204.94 GiB │
└────────────────────────────────┘
диск в кликхаусе только один.
Как понять, сколько ему надо места, чтобы завершить мутации?
Спасибо -
Мутация делает новый временный парт, далее его мутирует, когда парт полностью мутировал он присоединяется в к таблице , астарый удаляется.
Если ваш alter delete трогает все парты, то считайте x2 от размера крупного размера парта -
И зачем вы удаляли через alter delete старые данные, старые они стали по дате? Почему просто партиции полностью не удалить старые?
-
Привычка.
надо переделать.
Про остальное - понял, спасибо.
пойду считать. -
привычка?
В КХ делать удаление на всю таблицу - хз как лечить.
Посмотрите если занято место системными таблицами, типа query_log или еще что нибудь. Можно там сделать DROP PARTITION, и тогда мб появится место. -
оттуда уже брал в прошлый раз, там нет.
буду искать вариант, как добавить свободное место. -
По партициям удаление старых данных возможно только если партицирование по периодам времени есть. Далеко не во всех применениях это так. Зато для них есть TTL.
-
вот прям наш случай :)
-
2* размер самого большого парта
-
нет , обычно надо x2 от масимального размера парта в таблице...
-
kill mutation
drop partition -
про 2* не совсем правда, 2* это мержей, для мутаций то ли * 1.2 то ли *1.1, но меняли туда сюда, проще думать что 2
-
+, что-то напутал пока писал
-
Всем привет, подскажите пожалуйста, правильно ли я понимаю, что после инсерта в MergeTree требуется некоторое время, чтобы свежие данные стали доступны в селекте?
-
всем привет! кто-нибудь сталкивался с репликацией данных между двумя разными кластерами кликхауса?
-
неправильно. Они доступны сразу, одновременно возвращается управление инсерту и данные становятся доступны селектам, даже хуже, если инсерт создает несколько блоков, то селекты увидят уже созданные блоки раньше чем закончится инсерт
-
Не сразу они доступны только в случае использования Buffer таблиц или async_insert?
-
нету такого понятия как кластер в КХ.
Можно любую ноду КХ покдлючить в нескольким зукиперам и насоздавать репликейтид таблиц которые будут реплицировать данные с любых других нод КХ. -
а может проще через кафку ?
-
buffer да
а async_insert по умолчанию синхронный, и управление возвращается только по завершению, но это можно выключить -
а можно вообще выкинуть КХ и взять другую базу.
-
А где та грань, между когда эффективно использовать buffer/async_insert и не использовать?
-
))) ну если кластеры находятся в разных сетевых контурах-как еще=)
-
огласите все меню
-
есть 2 кластера в разных сетях.Надо сделать так ,чтобы таблица и в том и другом одинаково реплицировалась и заполнялась
-
не знаю, я долго пробовал async_insert , и так и сяк, вообще не понимаю зачем он нужен и кто его потребитель.
-
я не вижу проблем, например, только я так понимаю, у вас беспокойство вызывает сетка и последующие replica lag?
-
угу
-
на флешке бекапы носите
-
Ставьте алерты, мониторинг, повышайте observability, ну и бэкапы носите, угу.
-
угу понял-спасибо!
-
Я просто почитал рекомендации, говорят юзайте батчи для инсертов в MergeTree, и не юзайте одиночные вставки, мне казалось что «батчи» это когда используешь буфферную таблицу, а мне очень важно, чтобы все данные, которые я загружаю в таблицу, были доступны максимально быстро, а не через какое-то время на их обработку
-
батчи -- это вставка пореже чем 100 раз в секунду, если у вас одна строка в минуту, у вас соотвественно батчи размером одна строка
-
У меня вставка примерно раз в 3-4 секунды с примерно 1-100 значений (строк)
-
переупрощенное объяснение - желательно один инсерт в секунду на один сервер КХ
-
ну и вставляйте раз 3 секунды, хоть по одной строке
-
Ок, спасибо большое
-
async_insert если что собирает инсерты в течении 200мс.
-
А при каких условиях вообще имеет смысл начинать смотреть в сторону Buffer?
-
ну когда у вас 1000 источников будут лупить раз 3 секунды.
-
у всех по разному, бывают таблицы из 4 полей, а бывают из 4000 полей, это абсолютно разные нагрузки,
нельзя это померить в строках, и все меняют Replicated таблицы, потому что зукипер становится узким местом -
Спасибо!
-
-
Пора увеличивать?
java.io.IOException: Len error. A message from /xxxxxx:51726 with advertised length of 1224736768 is either a malformed message or too large to process (length is greater than jute.maxbuffer=1048575) -
Ну если вас IO Exception не пугает ни сколько то не надо)
-
у нас ЗК сложился
-
-
нет ничего постоянного, чем откладыванием на потом)
-
вот только у меня размеры в ГИГАБАЙТ а в КХ макс 256МБ не?
with advertised length of 1195725856 is either a malformed message or too large to process (length is greater than jute.maxbuffer=1048575) -
это разные деплойменты
-
да сразу умнож на 5
-
это в байтах
1048575 - 1 МБ ? не ? -
хотя 1 224 736 768, это странное число, как-то не верится что можно сделать столько партов с такими именами
-
в коде вроде не менялось, 1<<28
-
таблиц много, партов на таблицу не очень
-
-
есть вариант что КХ думает что это не ЗК а КхК и что то свое шлет? версия 22.6
-
но для каждой таблицы свои транзакции в зк, сколько всего партов не имеет значения.
эта ошибка обычно при выполнении мутации, когда КХ пытается в ЗК создать запись про мутацию и перечислить все парты, получается что если парт называется В5645BFDS657H356456_5544545_666788_211111 и их 10000 то все имена через запяютую больше мегабайта -
это старая ошибка, умирать начало с этого
fsync-ing the write ahead log in SyncThread:2 took 1089ms which will adversely effect operation latency. File size is 134217744 bytes. See the ZooKeeper troubleshooting guide -
и что ЗК говорит про свое состояние сейчас? все 3 лежат?
-
не, они полностью не лежали походу, по ходу диск тупит и все.
Exception when following the leader ошибки -
кто-нибудь знает у сервера есть какая-то настройка, что он интерактивный пароль только принимает с —ask-password от clickhouse-client? -Если указать —password или переменную окружения CLICKHOUSE_PASSWORD, аутентификация не проходит
-
познакомиться с фичами кликхауса, чтобы забыть про медленные OLTP-DB?
-
понимаю
-
ну отключить zookeeper.forceSync временно
(я так делал когда диск вылетел из рейда) -
zookeeper.forceSync - это поможет уменьшить ИО? там проблема в дисках все подряд пишут итд.
какие риски? -
да никаких, риск только при внезапной перезагрузке оси, и надо потерять всех три зукипера, и в конце концов в КХ есть system restore replica и она работает, я уже кучу раз восстанавливал клиентам снесенную базу зукипера.
-
>zookeeper.forceSync - это поможет уменьшить ИО?
да, зукипер ускоряется -
через Java opts?
-
-
bug in FINAL
https://github.com/ClickHouse/ClickHouse/pull/46009
workaround:
SELECT val, ver FROM test FINAL ORDER BY val DESC SETTINGS optimize_read_in_order=0Fix read in order optimization for DESC sorting with FINAL by vdimir · Pull Request #46009 · ClickHouse/ClickHouseChangelog category (leave one): Bug Fix (user-visible misbehavior in official stable or prestable release) Changelog entry (a user-readable short description of the changes that goes to CHANGELOG...
-
не знаю, кажется все параметры можно задать opts
-
спасибо большое, вообще выручили, ща везде сделаем false, YOLO
-
Спасибо большое
-
-
нету,
а к JSON-е будет звучать
select a, toUInt32(a) as b
from (
select * as a from system.numbers
)
order by a limit 1 by b -
спасибо, понял
-
-
-
нет, просто посылайте SQL в post или get
-
где я могу почитать про это подробнее, можете ли подсказать пожалуйста?
-
HTTP Interface | ClickHouse Docs
The 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.
-
Спасибо!
-
-
норм примеры на разных языках и даже через curl еще вот тут есть
https://cloud.yandex.com/en-ru/docs/managed-clickhouse/operations/connectYandex Cloud Documentation | Yandex Managed Service for ClickHouse | Connecting to a database in a ClickHouse clusterYou can connect to Managed Service for ClickHouse cluster hosts:
-
вопрос, там на сервере iowait почти никакой, кроме одного момента, может ли это быть изза слишком большого файла, и что его вызывает?
> fsync-ing the write ahead log in SyncThread:3 took 4901ms which will adversely effect operation latency.File size is 134217744 bytes. See the ZooKeeper troubleshooting guide -
А подскажите, можно ли использовать ReplacingMergeTree для постоянных вставок, хешей и соответствующих им строк, чтобы в основную сырую таблицу куда пишутся записи вместо этих строк писать хеши? По сути использовать как KV своего рода. Не хочу просто поднимать отдельную базу данных для этого. Длина строк слишком высокая чтобы пусть и со сжатием писать в основную таблицу, и кардинальность поля тоже высокая, допустим 100 миллионов.
-
-
-
-
а размеры у зк файлов какие? это логи или снепшоты?
если логи то они просто видимо редко переключаются?
даты файлов и размеры ls -la можно увидеть? -
After snapCount transactions are written to a log file a
# snapshot is started and a new transaction log file is started. The default
# snapCount is 10,000.
#snapCount=1000
snapCount=1000000 -
А вы прочитали что JOIN не для CH ?
-
Да читал, только я не буду джойнить в клике. Я сделаю все выборки, смержу в приложении все хеши в список уникальных, а потом сделаю один select с where ClientId=1 AND hashes IN и список и 100000 уникальных хешей. Но эти хеши скорее всего будут все в соседних гранулах так как будет сортировка по ClientId
-
Мне интересно насколько бодро кликхаус будет схлопывать дубликаты, чтобы таблица не разрасталась, при чтении само собой я буду делать group by hash и any в селекте, так дубликаты не страшны, просто чтобы хотелось бы чтобы поддерживалось разумное кол-во строк в replacing merge tree
-
Как по мне вы делаете бесполезность
-
-
-
-
ребята, доброго дня! Прошу прощения, что так врываюсь. Есть реплика PostgresQL —> Clickhouse. Через MaterializedPostgreSQL.
Вопрос такой где и как можно смотреть состояние этой репликации? Активна она или нет?
Иногда случается, что она просто отваливается без причины будто. В логах что-то ничего по реплике, будто, не видно. -
Нет доступа... Но большие в логе пишутся, 134мб трансакшн лог фсинк ошибку выдал. Если уменьшить snapcount оно уменьшиться?
-
да, уменьшится
-
-
ребят может мне обяснить как с БД(таблицы) и шардами работать в clickhouse.
создал кластер кликхауса + кипер.
Я может чего не понимаю. Но в моей логике данные должны были размазаться по всем шардам по чуть чуть, и при обращении к любой из нод я должен получить все данные?
Мб есть видео или гуид обясняюший все это.
кластер состоит из 6 тачек 3 шарда и у каждого по реплике. -
-
-
в логах /var/log/clickhouse-server/
если повезет
недоделанная и плохо управляемая фича IMHO -
ещё вопрос, когда случилась проблема, есть резкий пик в ЗК метрике называемой "prep_process_time". оно что нибудь отражает? а то я поискал и ничего не понял что это за метрика
-
потому что Replicated означает
что две и более реплики с одинаковым zookeeper path и разными replica name
на каждый Insert block сохраняют в zk \ keeper имя нового data part и потом друг у друга эти data part по http 9009 порту тянут
чтобы собирать данные со всего кластера и всатвлять на весь кластер, вам нужна отдельная таблица "роутер" engine=Distributed
https://clickhouse.com/docs/en/engines/table-engines/special/distributed/Distributed Table Engine | ClickHouse DocsTables with Distributed engine do not store any data of their own, but allow distributed query processing on multiple servers.
-
логи судя по ошибкам в районе 134МБ-280МБ, на других продакшнах так же примерно.
снепшоты большие (таблиц много), в районе 1.78GB-2GB
——
если уменьшить snapCount - snapshot будет браться чаще, в это время ЗК продолжает отрабатывать? -
>если уменьшить snapCount - snapshot будет браться чаще, в это время ЗК продолжает отрабатывать?
да
а что случилось? Нагрузка выросла резко? -
да, теперь грешу на GC, так как диск ОК, а GC вовсю начал работать, увеличим Xmx итд...
-
>снепшоты большие (таблиц много), в районе 1.78GB-2GB
таблиц много, а сколько времени данные хранятся и какие партиции?
и сколько много? -
последние 7 дней дневные, дальше месячные, но итого 15к таблиц, * примерно по 10 партов с среднем, меньше 200к партов...
-
скорее просто нагрузка выросла, память была близка к Xmx, и GC вырос резко
-
тут один клиент у нас у которого 15 тыс. таблиц наконец-то согласился поставить (после года раздумий)
<merge_tree>
<cleanup_delay_period>300</cleanup_delay_period>
<merge_selecting_sleep_ms>60000</merge_selecting_sleep_ms>
<merge_tree>
теперь сожалеет что не сделал этого раньше, все в 0 упало на зукипере -
это CPU, это было сделано сразу, собственно следуя вашему комменту на ГХ
-
это не особо влияет на размер снепшота вроде, ну и на GC/память
-
Да, спасибо, похоже на то. Тяжело контролировать
-
еще рекомендую для 7 дней дневные таблиц посмотреть сколько там
старых блоков и снести
with 'база.таблица`' as tbl
select 'rm '|| path||name from system.zookeeper
where path = ( select zookeeper_path||'/block_numbers/' from system.replicas where database||'.'||table = tbl )
and name not in (select distinct partition_id from system.parts where database||'.'||table = tbl )
and ctime < now() - interval 30 day and mtime < now() - interval 30 day
format TSVRaw; -
КХ хранит автоинкременты для номеров блоков для партиций, и они могут занимать очень много места в ЗК
-
Да точно, спасибо, вот эту часть бы командой в кх. А то мы кроном делаем сейчас иногда оно как то сложно стандартизируется...
Типа system replica cleanolddata -
уже просили не раз добавить drop partition purge типа
-
-
-
Просто не везде доступ к зк есть еще...
-
коллеги, подскажите, нубский вопрос, если в директории много партов, которые нужно зааттачить, можно их как-то перечислить для команды ALTER TABLE ... ATTACH PART?
-
я понимаю, я спрошу в альтинити, clickhouse,inc не хочут это делать.
-
Или delete from system.zookeeper 😂
-
let i=1;for f in `ls -1` ; do echo $i $f;((i++)); echo "alter table csp_ad_fact_event_shard attach part '$f';"|clickhouse-client ; done`
но вообще есть attach partition -
а там парты от разных партций
-
спасибо!
-
проще так нагенерить
select * from system.detached_parts where table='metric_log_18'; -
это перенесенные с другой копии)
-
так это не имеет значения. detached_parts просто файлы из каталога листает
-
а, понял, спасибо
-
Всем привет! Очень интересует вопрос неявных приведений на уровне where-clause запроса.
CREATE TABLE test_table (
value Float32
);
SELECT value FROM test_table WHERE value > 1.1 ORDER BY value LIMIT 1;
-- Row 1:
-- ──────
-- value: 1.1
Насколько это очевидное поведение со стороны CH и как бороться с таким поведением? Только явные приведения типов? -
да, в данном случае только явное приведение типов WHERE value > toFloat32(1.1)
1.1 это литерал который по умолчанию float64 -
Грустно, конечно... Спасибо огромное за ответ!
-
юзайте decimal
-
-
кликхаус изначально очень хрупкий к типам...
это надо держать в голове -
Да, всей командой держим) Хрупкий он не только к типам)
-
Добрый день! Вопрос по альтинити оператору в части восстановления одного шарда. Допустим, что-то случилось и нужно восстановить 2ой шард из снэпшота EBS. Учитывая, что PVC и PV имьютабл, единственным путем видится пересоздать кластер и вручную указать всем подам «их» PVC, заменив у проблемного PVC на кастомный (который возьмет снэпшот в качестве источника)?
-
CREATE TABLE test_table ( value Float );
insert into test_table values ( 1.1);
SELECT value FROM test_table WHERE value > 1.1 ORDER BY value LIMIT 1;
+-------+
| value |
+-------+
| 1.1 |
+-------+
select version();
+---------------------------+
| version() |
+---------------------------+
| 10.3.36-MariaDB-0+deb10u2 |
+---------------------------+ -
-
SETTINGS join_use_nulls = 1
-
Спасибо
-
Привет!
Простой вопрос, есть условия WHERE some IN (), <—— как здесь пустой список правильно указать? -
in (Null)
-
Спасибо большое. Использовал ([]), но стал сомневаться, то ли это, что мне нужно
- 10 February 2023 (150 messages)
-
Привет всем. За неделю вырос zk_approximate_data_size на зукипере с 16МБ до 500МБ. Полез смотреть логи кх, а там
1 нода
<Error> InterserverIOHTTPHandler: Code: 232. DB::Exception: No part 202302_52609_54246_1211 in table. (NO_SUCH_DATA_PART), Stack trace (when copying this message, always include the lines below):
2 нода
<Error> несколько_таблиц_одной_базы: auto DB::StorageReplicatedMergeTree::processQueueEntry(ReplicatedMergeTreeQueue::SelectedEntryPtr)::(anonymous class)::operator()(DB::StorageReplicatedMergeTree::LogEntryPtr &) const: Poco::Exception. Code: 1000, e.code() = 110, Timeout, Stack trace (when copying this message, always include the lines below)
Изчего-то внятного нашел только это https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/replication/?ysclid=ldxtspceyu182994988#vosstanovlenie-posle-sboia
Кто-нибудь сталкивался с подобным? Что еще можно посмотреть?Репликация данных | ClickHouse Docstable_engines-replication}
-
select * from system.replication_queue там есть колонка last_exception
-
на одной ноде пусто, а вот на другой last_exception 335 шт.
-
Row 1:
──────
last_exception: Poco::Exception. Code: 1000, e.code() = 110, Timeout (version 21.9.2.17 (official build))
Row 2:
──────
last_exception: Poco::Exception. Code: 1000, e.code() = 110, Timeout (version 21.9.2.17 (official build))
Row 3:
──────
last_exception: Poco::Exception. Code: 1000, e.code() = 110, Timeout (version 21.9.2.17 (official build))
Row 4:
──────
last_exception: Poco::Exception. Code: 1000, e.code() = 110, Timeout (version 21.9.2.17 (official build))
Row 5:
──────
last_exception: Code: 86. DB::Exception: Received error from remote server /?endpoint=DataPartsExchange%3A%2Fclickhouse%2Ftables%2FURAL%2Fappmetrics%2Freplicas%2Fural-ch1&part=202302_52609_54320_1285&client_protocol_version=7&compress=false. HTTP status code: 500 Internal Server Error, body: Code: 232. DB::Exception: No part 202302_52609_54320_1285 in table. (NO_SUCH_DATA_PART), Stack trace (when copying this message, always include the lines below):
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0x9366e7a in /usr/bin/clickhouse
1. DB::DataPartsExchange::Service::findPart(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x113e0319 in /usr/bin/clickhouse
2. DB::DataPartsExchange::Service::processQuery(DB::HTMLForm const&, DB::ReadBuffer&, DB::WriteBuffer&, DB::HTTPServerResponse&) @ 0x113de800 in /usr/bin/clickhouse
3. DB::InterserverIOHTTPHandler::processQuery(DB::HTTPServerRequest&, DB::HTTPServerResponse&, DB::InterserverIOHTTPHandler::Output&) @ 0x1175729e in /usr/bin/clickhouse
4. DB::InterserverIOHTTPHandler::handleRequest(DB::HTTPServerRequest&, DB::HTTPServerResponse&) @ 0x11757b83 in /usr/bin/clickhouse
5. DB::HTTPServerConnection::run() @ 0x117bbdb0 in /usr/bin/clickhouse
6. Poco::Net::TCPServerConnection::start() @ 0x143720af in /usr/bin/clickhouse
7. Poco::Net::TCPServerDispatcher::run() @ 0x14373b3a in /usr/bin/clickhouse
8. Poco::PooledThread::run() @ 0x144a69b9 in /usr/bin/clickhouse
9. Poco::ThreadImpl::runnableEntry(void*) @ 0x144a2c4a in /usr/bin/clickhouse
10. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
11. clone @ 0xfe9fd in /usr/lib64/libc-2.17.so
(version 21.9.2.17 (official build)). (RECEIVED_ERROR_FROM_REMOTE_IO_SERVER) (version 21.9.2.17 (official build))
Row 6:
──────
last_exception: Poco::Exception. Code: 1000, e.code() = 110, Timeout (version 21.9.2.17 (official build))
Row 7:
──────
last_exception: Poco::Exception. Code: 1000, e.code() = 110, Timeout (version 21.9.2.17 (official build))
Row 8:
──────
last_exception: Poco::Exception. Code: 1000, e.code() = 110, Timeout (version 21.9.2.17 (official build))
Row 9:
───────
last_exception: Code: 86. DB::Exception: Received error from remote server /?endpoint=DataPartsExchange%3A%2Fclickhouse%2Ftables%2FURAL%2FPriceKonkurentHistory%2Freplicas%2Fural-ch1&part=20230210_20230210_87626_87644_4&client_protocol_version=7&compress=false. HTTP status code: 500 Internal Server Error, body: Code: 232. DB::Exception: No part 20230210_20230210_87626_87644_4 in table. (NO_SUCH_DATA_PART), Stack trace (when copying this message, always include the lines below):
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0x9366e7a in /usr/bin/clickhouse
1. DB::DataPartsExchange::Service::findPart(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x113e0319 in /usr/bin/clickhouse
2. DB::DataPartsExchange::Service::processQuery(DB::HTMLForm const&, DB::ReadBuffer&, DB::WriteBuffer&, DB::HTTPServerResponse&) @ 0x113de800 in /usr/bin/clickhouse
3. DB::InterserverIOHTTPHandler::processQuery(DB::HTTPServerRequest&, DB::HTTPServerResponse&, DB::InterserverIOHTTPHandler::Output&) @ 0x1175729e in /usr/bin/clickhouse
4. DB::InterserverIOHTTPHandler::handleRequest(DB::HTTPServerRequest&, DB::HTTPServerResponse&) @ 0x11757b83 in /usr/bin/clickhouse
5. DB::HTTPServe -
список по такому запросу select last_exception from system.replication_queue where last_exception!='' ORDER BY create_time DESC limit 10 \G надеюсь запрос нормальный)
-
можно ли делать ALTER для уже созданного order_by ?
-
Похоже один сервер до другого по DNS не может достучаться
-
В общем нельзя, можно как бы добавить новые поля в конец, когда они добавляются в таблицу.
-
Через альтер?
-
Для новых данных сойдёт
-
Хмммм
-
Manipulating Key Expressions | ClickHouse Docs
The command changes the sorting key of the table to new_expression (an expression or a tuple of expressions). Primary key remains the same.
-
Alter table add column a int, modify order by b,c,a
-
Да, я понял
-
Не подходит
-
Спасибо
-
Со всей сетью вроде бы все хорошо, ну в любом случае благодарю. Будем разбираться.
-
Доброе утром всем 🌞
Нужна помощь в составлении запроса
Есть таблица, куда отправляются данные с таймстемпами. Колонки примерно такие:
provide_id, ts, value(bool)
Мне нужно составить такой запрос, который будет возвращать provide_id, если между его последними двумя записями прошло 10+ часов
Список всех возможных provider_id у меня есть и он не большой (до 15) -
Коллеги, добрый день!
Не могу сам чётко ответить на вопрос, прошу помощи сообщества.
Есть таблица с движком CollapsingMergeTree(sign), имеющая несколько полей в списке ORDER BY.
В таблицу регулярно добавляются записи с одинаковыми полями сортировки,
движок эти записи стабильно сворачивает и оставляет по одной уникальной записи для каждого сочетания полей сортировки.
В некоторых случаях такие повторяющиеся строки приходят в одной вставке INSERT INTO SELECT FROM,
и тогда для каждого сочетания полей сортировки выживает какая-то одна, случайно выбранная строка. Вот эту самую случайность в выборе строки хочется убрать.
Собственно вопрос - если разделить все вставки таким образом есть в каждой конкретной пачке не будет дублей по полям сортировки,
то со стороны движка есть гарантия, что в таблице останется последняя запись по порядку вставки данных?
Или иначе говоря - есть ли гарантия, что в CollapsingMergeTree-движок хранит точно последнюю вставленную строку для каждого сочетания полей сортировки?
Как обычно дописал вопрос и ответ как будто стал очевиден - "Конечно, да" :)
Но всё же подтвердите, пожалуйста :) -
Если данных немного, то можно в лоб решить - для каждого id выбрать максимальный таймштамп, потом выбрать максимальный из тех что не равны первому максимуму, и вычислить время между ними.
-
12+ миллиардов записей 💀
-
само количество строк не очень важно -
главное то сколько раз такой запрос будет выполняться и сколько на это есть времени :)
если разово, то быстрее наколхозить в лоб,
а если надо периодически его вызывать, то надо идти перечитывать что пишут про lag/lead функции - они как-то реализованы не очевидно -
Учитывая что у вас движок CollapsingMergeTree - вы же сами определяете какие строки занулить, ставя им -1. Вопрос: а какие строки нужно оставить, последние? Тогда может вам выбрать ReplacingMergeTree(<max time|max id>) ?
-
У меня получается, что в таблицу последовательно разными запросами вставляются несколько строк с sign=1 и одинаковым набором полей сортировки.
Движок перекрывает старые строки новыми. Отменять записи с помощью sign=-1 код себя не утруждает.
И я рассчитываю, что после оптимизации таблицы остаётся именно последняя из строк.
Собственно мой исходный вопрос можно переформулировать как "А вставляются ли данные в таблицу?" и понятно что ответа кроме как "Да", быть не может. -
привет, помогите понять что я делаю не так:
SELECT count(*)
FROM awesome_table_name
┌───count()─┐
│ 325595952 │
└───────────┘
SELECT count(*)
FROM awesome_table_name
FINAL
┌───count()─┐
│ 190040078 │
└───────────┘
потом делаю OPTIMIZE TABLE awesome_table_name FINAL DEDUPLICATE
он успешно отрабатывает, но количество строк в таблице не меняется
SELECT count(*)
FROM by_destination_daily
┌───count()─┐
│ 325657057 │
└───────────┘ -
оптимизация по умолчанию выполняется асинхронно, и может идти долго
-
Как пример почти в лоб - https://fiddle.clickhouse.com/5936dfda-bb91-4d2d-8ff2-9c60e53d01db
-
3 минуты запрос висел, как будто бы синхронно. да и уже пара часов прошло, и ничего не поменялось. мб какой-то мисконфиг на сервере или в таблице
-
Коллеги, кто может подсказать? Какой тип столбца выбрать для RFC 3389 времени? Или сильно не заморачиваться и взять String?
%Y-%m-%dT%H:%M:%SZ
Будет ли работать партиционирование?
order by CustomerName partition by toYYYYMMDD(Date) -
найдите дубликат, посмотрите, он лежит в одной партиции или в разных?
-
Третий селект кстати в другую таблицу
-
Ровно для этого и сделан VersionedCollapsingMergeTree. Не очень понимаю зачем вобще остался простой CollapsingMergeTree, в каких ситуациях он дает преимущество/экономию
-
про тип данных ничего не скажу,
а про партиционирование - если выражение вообще вычислимо, то партиционирование конечно работать будет, куда оно денется?
другое дело, что после накопления более 3 лет число партиций станет больше рекомендуемой 1000 штук -
обфускатор сломался) меня смущает, что count с final показывает сильно меньшее количество записей, как будто есть еще куда оптимизировать. данные поизучаю, поищу дубликаты, но кажется они все одной партиции
-
Модификатор final делает мердж между партициями. Optimize емнип только внутри партиции.
-
Спасибо за идею про VersionedCollapsingMergeTree.
Но у меня как раз случай когда больше подходит CollapsingMergeTree - номера версии у строки у меня нет и вычислить его трудно, а вставка выполняется последовательно по расписанию -
Возможно вам подойдет now() в качестве версии, хотя для одной вставки будет одинаковое. Лучше брать таймстемп откуда-то еще.
-
Всем привет!
У меня следующая задача:
Есть таблица с сырыми данными, которая хранить временной ряд с гранулярностью 1 минута (name - table_1, columns - (timecode, metric)).
Мне нужно подготовить витрину, где будут храниться данные из таблицы table_1 агрегированные с разной гранулярностью (5 и 10 минут, например).
Для этого я создал таблицу с движком AggregatingMergeTree (name - table_2, columns - (timecode, timespan, agg_metric)), на исходную таблицу навесил несколько Materialized view, каждая из которых агрегирует данные со своей гранулярностью и кладет результат в table_2.
В результате инсерт в table_1 триггерит только 1 случайную матвьюху, что неверно. Ожидается, что инсерт в исходную таблицу будет триггерить все вьюхи.
Что я делаю не так? Вариант с 1 матвьюхой с union всех запросов не работает, кликхаус это не позволяет делать.
Матвьюхи выглядят так:
CREATE MATERIALIZED VIEW agg_5_mv TO table_2
AS
SELECT timecode,
5 AS timespan,
agg_metric
FROM (
SELECT timecode_5 AS timecode,
avgState(metric) AS agg_metric
FROM table_1
GROUP BY timecode_5
);
CREATE MATERIALIZED VIEW agg_10_mv TO table_2
AS
SELECT timecode,
10 AS timespan,
agg_metric
FROM (
SELECT timecode_10 AS timecode,
avgState(metric) AS agg_metric
FROM table_1
GROUP BY timecode_10
); -
да, now() подойдёт, но его придётся хранить, собственно мне достаточно того, что позднее вставленное перекрывает более старые строки,
но я подумаю :) спасибо, еще раз -
зачем вам тут sub queries во FROM ?
-
спасибо большое
-
не нужен, спасибо, уберу, но проблему это не решает
-
почему не решает...
вы говорите что у вас там что-то рандомно тригериться
я вижу что у вас там явно криво для триггера MV определены... -
Коллеги, приветствую. Помогите разобраться.
Есть таблица в клике, у которой engine это postgres. Соответстветнно перед каждым инсёртом в таблицу клика, данные так же вставляются в постгрю. Так вот, если вдруг по какой-то причине запись в постгрис не удалась (а соответственно и в клик), то никаких эксепшенов не происходит, ничего. Клик пишет что типа "все строки успешно загрузились", но их нет ни в постгре, ни в клике.
Данные пишем питонячим скриптом через clickhouse-driver либу.
Это нормальное поведение? -
Да, я дальше планировал TTL прикрутить
-
engine=PostgreSQL
это прокси
> Соответстветнно перед каждым инсёртом в таблицу клика, данные так же вставляются в постгрю.
у вас две таблицы или одна прокси в клике и одна живая в Postgres?
или вы вставляете только в одну таблицу?
через clickhouse-driver?? -
У нас постгрис как прокси да. Нам данные нужны и там.
Мы вставляет через clickhouse-driver для python в кликхаус, в таблицу, у которой engine - postgres. Соответственно данные будут проливаться и в постргю -
звучи так, что вам надо было сделать наоборот
-
вставлять в постгрю?
-
-
> то никаких эксепшенов не происходит, ничего.
точно не типичное поведение
engine=PostgreSQL
никаких данных в клике НЕ ХРАНИТ
вы просто в постгрес значит вставляете через гланды... через ClickHouse
и если там связь с постгрей пропала
клик должен наверх exception прокинуть который должна либа отработать
если не прокинул
то значит вы как то не так проверяете что данные "не вставлись" -
Ну проверяем просто селектом банально
-
CREATE MATERIALIZED VIEW agg_5_mv TO table_2
AS
SELECT timecode_5 AS timecode,
5 AS timespan,
avgState(metric) AS agg_metric
FROM table_1
GROUP BY timecode_5;
CREATE MATERIALIZED VIEW agg_10_mv TO table_2
AS
SELECT timecode_10 AS timecode,
10 AS timespan,
avgState(metric) AS agg_metric
FROM table_1
GROUP BY timecode_10;
Запросы поправил, но всё также наблюдаю дыры во временном ряду в таргет таблице:
('2023-02-10 08:40:00'),
('2023-02-10 08:45:00'),
('2023-02-10 09:00:00');.
Может дело не в ошибочном триггере. Что еще может влиять на результат? -
а причем тут "дыры" в конечных таблицах
это дыры в исходных данных в table_1
SELECT timecode_5, timecode_10, metric FROM table_1 WHERE metric='metric_name' ORDER BY timecode_5 LIMIT 100
сделайте и смотрите какие вам данные прилетуют.. -
В том то и дело, что в исходной таблице дыр нет, это я в первую очередь проверил
-
ну видимо так проверяли...
вообще запросы ваши, которые вы расшарили не соответсвуют той структуре таблицы которую вы показывали
> (name - table_1, columns - (timecode, metric)).
соответсвенно откуда вы там берете и как считаете timecode_5 и timecode_10 вообще не ясно -
а вообще есть понимание что изменение MATERIALIZED VIEW не приводит к пересчету старых данных у целевой таблицы или нет?
-
AggregatedMergeTree с этим вполне справляется
-
если я неправ, поправьте
-
C Чем??? ;))))
AggregatingMergeTree не пересчитывает данные задним числом никогда
это просто удобный механизм хранения hashmap и прочих вспомогательных структур для аггрегатных функций, чтобы их на лету не вычислять по сырым данных и финализировать аггрегацию быстро... -
У меня данные поминутные без пробелов, если я навешиваю на исходную таблицу 1 матвьюху, то при запросе в целевую таблицу AggregatedMergeTree, я получаю временной ряд без пробелов с нужной мне агрегацией и корректно посчитанными значениями. "Финализируется" всё как надо.
При этом если добавляю вторую вьюху, с первой начинают прилетать пробелы. -
https://t.me/clickhouse_ru/311198
вы не ответили как у вас формируются timecode_5 и timecode_10 в table_1
у вас запросы должны CREATE MATERIALIZED VIEW с ошибкой валитсяSlach [altinity] in ClickHouse не тормозита причем тут "дыры" в конечных таблицах это дыры в исходных данных в table_1 SELECT timecode_5, timecode_10, metric FROM table_1 WHERE metric='metric_name' ORDER BY timecode_5 LIMIT 100 сделайте и смотрите какие вам данные прилетуют..
-
Всем привет!
А кто-то бэкапит на s3 кликхаус?/
Как можно использовать роль в авс а не указывать аксесс и сикрет кей -
немного некорректно структуру таблицы описал, прошу прощения
структура исходной таблицы table_1:
timecode - Datetime
timecode_5 - Datetime - получилась в результате toStartOfInterval(timecode, toIntervalMinute(5)) в процессе етл
timecode_10 - Datetime - получилась в результате toStartOfInterval(timecode, toIntervalMinute(10)) в процессе етл
metric - Float64 -
имеется ввиду встроенный BACKUP / RESTORE?
AWS_ROLE_ARN
попробуйте через переменную окружения задавать, которую clickhouse-server будет видеть -
спасибо, а вариант вообще не указывать ключи и только через роль подключаться? потому что как-то вообще не секурно
-
так, у вас ДВА materialized view тащат данные в одну и туже table_2? ;)
SHOW CREATE TABLE table_2;
расшарьте пожалуйста -
имеете ввиду IAM ?
use_environment_credentials посмотрите в доке
https://clickhouse.com/docs/en/integrations/s3/s3-merge-tree/#creating-a-disk -
CREATE TABLE table_2
(
timecode DateTime,
timespan UInt32,
agg_metric AggregateFunction(avg, Float64)
)
ENGINE = AggregatingMergeTree
PARTITION BY toYYYYMM(timecode)
ORDER BY timecode
SETTINGS index_granularity = 8192 -
у вас ORDER BY timecode
а должно быть ORDER BY timecode, timespan -
у вас схлопывается по одинаковому timecode для timespan=5 и timespan=10
и считается среднее -
спасибо большое!
-
Салют, еще раз
Есть таблица, куда отправляются данные с таймстемпами. Колонки примерно такие:
provider_id, device_id, ts
Задача такая: вывести две последние записи по каждому device_id в отсортированном по времени ts порядке по заранее известному провайдеру
Часть запроса я уже написал, но вышеуказанным требованиям он естественно не соответсвует
SELECT ts, device_id
FROM metrics
WHERE provider_id = 'nauka-svyaz'
ORDER BY device_id, ts_int desc -
SELECT ts, device_id
FROM metrics
WHERE provider_id = '22222’
ORDER BY ts_int desc
limit 2 by device_id -
есть ли другой способ? на этот запрос я ловлю read timeout (12+ миллиардов записей в таблице)
-
увеличить таймаут 🤷♂️
-
есть много способов, но суть та-же самая - нужна группировка. Поэтому сначала отсекаем от 12 ярдов нужное вам количество, и только потом делаем группировку.
-
PARTITION BY toYYYYMMDD(ts) , возможно добавить индекс по какой-то нужной колонке
-
идексы и партишн пруниг тут не помогут, т.к. у пациента нет в where условия по времени. Но если это условие в принципе возможно - скажем если нет спящих устройств, а все устройства равномерно шлют свои метрики, то вполне можно делать выборку метрик за последний день/час, и тогда в группировке будет не 12 ярдов, а гораздо меньше. @itsreallyalim
-
это делается чтобы отслеживать спящие устройства
-
Но, это будет что то вроде крон задачи, запрос будет отправлятся регулярно, скажем, раз в 10 часов
-
Всем добрый день.
Возможен-ли вариант , когда вновь-установленному серверу КХ подсунуть диск с базами от "старого КХ" ?
Типа: переезд на более производительное железо и более свежую ОС -
Добрый день. Допустим есть хост с ClickHouse метрики складываются на другой хост где есть Graphite (плюс туда еще собираются и выкладываются системные метрики из другого агента). На какие метрики "принято" смотреть, чтобы понять, что хост с ClickHouse отвалился.
-
heartbeat?
-
Но метрики такой нет heartbeat? как я понимаю.
-
я разобрался с таймаутами (ограничил количество строк по времени), но запрос выводит не совсем то что мне нужно
да, он сортирует по времени и, возможно выводит максимум по 2 device_id, но мне нужно чтобы оба device_id шли друг за другом, отсортированные по времени
прошу прощение что изначально неправильно сформировал требования -
возможен
собственно вся база это файлики в /var/lib/clickhouse/data/
/var/lib/clickhouse/store/
/var/lib/clickhouse/metadata/
но есть ньюанс. в виде всяких штук типа значения макроса {replica}
и вообще надо понимать как ReplicatedMergeTree таблицы работают -
посчитали, эт почистит где то 170 тыс знодов из 7.3 млн... 2.3% где то, я так понял слишком сильно эт снепшот сильно не поменяет. ещё где то есть простор для чистки?
-
спасибо!
-
Привет!))
Раньше работало так, сейчас так не работает.
select *
from table_1
join table_2 on table_1.a=arrayJoin(table_2.b)
Сейчас работает так.
select distinct arrayJoin(table_2.b) as a
from table_1
join table_2 using a
Но так неудобно, потому что потом надо агрегировать поля table_1 по полям table_2.
Может, кто-нибудт знает, как можно ещё сделать?) спасибо))) -
select * from table_1 where a in (select arrayJoin(table_2.b) from table_2)
пробовали? -
Да, так делаю, когда могу обойтись без полей второй таблицы))
Но когда нужно, например, минимум по значениям из таблицы 1 в разрезе полей из таблицы 2, так не подходит((( -
Через tmp можете или движок Join попробовать
-
How are you?
-
привет всем. Может кто знает, как проверить перед инсертом в клик, что запрос валиден и данные точно залетят? Это вообще возможно?
-
Привет, наивный вопрос появился вдогонку. А зачем тогда вообще avgWeighted, и почему оно "под капотом" одно на другое не меняет? Зачем это делать со стороны клиента?
-
создать temporary таблицу
вставить в нее данные
потом аттачнуть из нее данные в целевую таблицу?
удалить temporary? -
Это опенсорс проект, возможно кто то добавил и его приняли и больше не поддерживают
-
понял, спасибо
-
добрый день, заранее извиняюсь за вопрос, в SQL не очень шарю
вот у меня есть таблица данных аналитики которая собирается с нескольких сотен вебсайтов.
У меня есть cube.dev с помощью которого я считаю, к примеру, число посетителей (группировка по столбцам siteId, host)
теперь я хочу считать топ-3 популярных url (столбец path) для каждого сайта.
я мог бы запрашивать данные по каждому сайту с помощью фильтра, но что-то мне подсказывает, что SQL и кликхаус в том числе позволяет сделать это более оптимально, вернув в одном большом запросе необходимый мне top-3 популярных урлов. как это сделать?
пока что я увидел что можно делать группировку по timestamp с детализацией по дням, но это мне не совсем подходит. -
ORDER BY url LIMIT 3 BY url
https://clickhouse.com/docs/en/sql-reference/statements/select/limit-by/#examplesLIMIT BY Clause | ClickHouse DocsA query with the LIMIT n BY expressions clause selects the first n rows for each distinct value of expressions. The key for LIMIT BY can contain any number of expressions.
-
спасибо 🙏
-
Всем привет! А в какой версии корень конфига стал <clickhouse>? Осталась ли поддержка <yandex> для обратной совместимости?
-
Привет!
Подскажите, пожалуйста, а что будет быстрее работать:
Есть колонка (type: String), в ней лежат UUID
мне нужно приджойнить к ней другую таблицу, где такая же схема, как выше (джойн будет по колонке с UUID)
Мне лучше сначала переделать type: String -> type: UUID и потом джойнить, или забить и джойнить строки? -
осталась
точно версию не скажу, будем считать что с 22.x -
скорее всего UUID быстрее будет, тк строчка весит 32 байта, а UUID - 16
-
-
-
судя по
for v in 21.3 21.8 22.3 22.8; do docker run --rm clickhouse/clickhouse-server:$v head -n 30 /etc/clickhouse-server/config.xml; done
да, в 22.x сменили -
Уважаемые коллеги,
В логах clickhouse вижу большое количество сообщений вида:
Warning> CollapsingSortedBlockInputStream: Incorrect data: number of rows with sign = 1 (2) differs with number of rows with sign = -1 (0) by more than one (for key: 19398, 6029, 6673288564376851156). : 1
Используем табличку с CollapsingMergeTree engine и следующими полями группировки:
ENGINE = CollapsingMergeTree(sign) PARTITION BY toYYYYMM(ts) ORDER BY (ts_day, host, session) SETTINGS index_granularity = 8192
При выборе из таблички вижу следующие записи:
SELECT *
FROM requests
WHERE session = 6673288564376851156
┌─sign─┬──────────────────ts─┬─────ts_day─┬─host─┬─────────────session─┬─load─┬─request─┬
│ -1 │ 2023-02-10 17:09:55 │ 2023-02-10 │ 6029 │ 6673288564376851156 │ 1 │ 0 │
│ 1 │ 2023-02-10 17:09:55 │ 2023-02-10 │ 6029 │ 6673288564376851156 │ 1 │ 1 │
└──────┴─────────────────────┴────────────┴──────┴─────────────────────┴──────┴─────────┴
Количество +1 и -1 в столбце sign по одному, лог же утверждает, что c +1 две записи и -1 - 0 записей.
Подскажите как можно диагносцировать причину, т.к. на тестовом стенде воспроизвести такую ситуацию не получается?
Спасибо -
Удалось запустить 21.11.3.6-alpine в докере, users.d с корнем <clickhouse> скушался и смёржился
-
Если в уже существующей инсталляции поменять в оверрайдах yandex на clickhouse, в теории может что-то пойти не так?
-
ну поменять один раз надо, а джоинить наверное не один, так что выгоднее сделать препроцессинг один раз наверное
-
а существующая инсталяция то какой версии?
был момент когда либо <clickhouse> либо <yandex>
но это вроде быстро починили... -
21.11.3.6 как раз
-
-
судя по тестам в этой версии - меняли и все норм
-
tests: switch <yandex> to <clickhouse> · ClickHouse/ClickHouse@8143608
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Спасибо! То, что нужно)
-
Подскажите, пожалуйста, по поводу JOIN
Почему такой джоин у меня не работает
inner join users u
on (u.user_id = t.user_id or u.no_auth_id = t.no_auth_id)
and 1=1
а такой работает
inner join users u
on (u.user_id = t.user_id and 1=1)
or (u.no_auth_id = t.no_auth_id and 1=1)
Unsupported JOIN ON conditions. Unexpected '(u.user_id = user_id) OR (u.no_auth_id = no_auth_id)': While processing (u.user_id = user_id) OR (u.no_auth_id = no_auth_id). (INVALID_JOIN_ON_EXPRESSION)
version 22.8.12.45 -
потому что версия clickhouse старая
OR в JOIN в 22.3 вроде только ввели -
сорри, забыл приложить версию
22.8.12.45 -
Это было бы так, если бы у меня вообще не 1 запрос не отрабатывал, но первый работает, второй нет
-
а можно текстом расшарить запросы а не картинкой?
и подписать какой работает
а какой нет? -
поправил
-
попробуйте оба запроса через
EXPLAIN SYNTAX
пропустить и посмотреть как их клик переписывает... -
выглядит как ошибка в парсинге JOIN
ждем когда analyzer выйдет который такие проблемы должен починить -
А второй запрос нельзя будет прпоусить через EXPLAIN SYNTAX, так как с ошибкой падает
Первый он так пропускает
ALL INNER JOIN users AS u ON ((u.user_id = user_id) AND (1 = 1)) OR ((u.no_auth_id = no_auth_id) AND (1 = 1)) -
Ну ладно, спасибо тебе большое
-
-
вот так работает если 1=1 убрать
-
-
-
нет, стоп
1=1 это одно
а "другие переменные" это другое -
с другими переменными так же
-
select * from t
inner join u on (u.user_id = t.user_id or u.no_auth_id = t.no_auth_id and 1=1); -
вот так работает, судя по всему оно не может спарсить два выражения в скобочках
-
типа условие должно быть в скобочках непрерывным булевым выражением
-
-
хз, как предположение этот варнинг выдается в формате блока заинсерченого, может если по всем блокам - у вас все норм, а вот в блоке получилось несхождение
-
https://clickhouse.com/docs/en/operations/settings/settings/#settings-max_insert_block_size
вот про этот блокCore Settings | ClickHouse Docsadditionaltablefilters
-
Спасибо
-
-
Из какой базы ?
-
-
remote функция в Clickhouse
-
-
-
-
- 11 February 2023 (31 messages)
-
-
-
наконец-то дебивер в стрингах забылся уже
-
Всем привет,
Выгружаю данные в CSVWithNames и импорте через CLI. Из внешнего CH в локальный.
Одна из колонок откуда выгружаюися данные имеет тип Decimal(18, 2) в новой таблице куда импортируются данные имеет тип более короткий - Decimal(2, 2). Типы разные потому что делаются некоторые изменения структуры таблицы для ее оптимизации.
При импорте пишется ошибка:
Decimal value is too big: 1 digits were read: 4e0. Expected to read decimal with scale 2 and precision 2. (ARGUMENT_OUT_OF_BOUND)
Само по себе значение во внешней базе хранится (откуда беруться экспортируются данные) стоит как “4”.
Может ли CH ругаться на то, что на самом деле значение должно быть как “4.00”, а не “4”? -
Я думаю проблема в CSV, попробуйте выгружать в формате Native и вставлять
-
Непонято что имеется ввиду
вот есть
str1
str1
str2
что на выходе надо получить? -
если есть str00, str01 ... str99 то условно quantille(0.95)(str) = str95
-
=) а что во фразе
Decimal value is too big
непонятно??
передающееся значение в целевую таблицу.. больше чем целевая таблица может принять
Decimal(2
и
Decimal(18
все таки разные вещи... уверены что у вас там в колонке нет данных которые в decimal(2 пролежут? -
-
Само значение "Decimal value is too big” понятно, ранее для этой колонки был выбран слишком большой тип. И фактически у нас нет в ней значений больше 2,2. Я проверял значение ряда на который ругается CH и оно “4”, странно, что оно считает его слишком большим для Decimal(2,2).
-
Если кто-то столкнется с такой проблемой, она решается с добавлением слудющей опции - “--output_format_decimal_trailing_zeros=1”, нашел здесь - https://github.com/ClickHouse/ClickHouse/pull/27680/files#diff-1f401411c9a608de67995a3a759cc6bf36e850e6606f533983ab0b8da5da2ec9R632. По умолчанию она отключенаRemove trailing zeros from Decimal serialization #15794 by alexey-milovidov · Pull Request #27680 · ClickHouse/ClickHouse
Changelog category (leave one): Backward Incompatible Change Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Do not output trailing zeros in text rep...
-
decimal (2,2) -- это 0 знаков до запятой, на самом деле это не имеет смысла, потому что минимальное хранение это decimal32 , просто используйте Decimal32( 2)
-
блин =( percent_rank оказывается в window functions не поддерживаются =(
https://github.com/ClickHouse/ClickHouse/issues/46300Support percent_rank() in WINDOW functions · Issue #46300 · ClickHouse/ClickHouse(you don't have to strictly follow this form) Use case Calculate percentiles for non numeric data type Describe the solution you'd like WITH quantile AS ( SELECT value, percent_rank...
-
Всем привет.
У меня очередной вопрос, касающийся AggregatingMergeTree.
Мне требуется интегрировать оконную функцию в запрос в матвью на движке AggregatingMergeTree.
Для того, чтобы разобраться с синтаксисом и логикой работы матвью, я составил запрос, не имеющий никакого смысла, кроме образовательного.
Запрос на создание вьюхи выглядит так:
CREATE MATERIALIZED VIEW agg_mv TO table_2
AS
SELECT id,
timecode,
groupArrayState(timecode) OVER (PARTITION BY id ORDER BY timecode ASC Rows BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS timecode_window
FROM table_1;
Ожидается, что при запросе (написан ниже) к таблице table_2 с мерджем я получу столбец timecode_window, в каждом поле которого лежит 5 значений таймкодов. Но в итоге запрос возвращает массив с таймкодами из блока строк пришедших в источник с инсертом (в моем случае 2 строки).
Пример:
в table_1 вставляются блоки с таймкодами:
'2023-02-11 15:02:00', '2023-02-11 15:03:00'
'2023-02-11 15:04:00', '2023-02-11 15:05:00'
'2023-02-11 15:06:00', '2023-02-11 15:07:00'
Запрос:
SELECT id, timecode,
groupArrayMerge(timecode_window) AS timecode_window
FROM table_2
GROUP BY id, timecode;
После запроса к table_2 вижу / ожидаю увидеть:
для '2023-02-11 15:02:00' - ['2023-02-11 15:02:00', '2023-02-11 15:03:00'] / ['2023-02-11 15:02:00', '2023-02-11 15:03:00', '2023-02-11 15:04:00']
для '2023-02-11 15:03:00' - ['2023-02-11 15:02:00', '2023-02-11 15:03:00'] / ['2023-02-11 15:02:00', '2023-02-11 15:03:00', '2023-02-11 15:04:00', '2023-02-11 15:05:00']
для '2023-02-11 15:04:00' - ['2023-02-11 15:04:00', '2023-02-11 15:05:00'] / ['2023-02-11 15:02:00', '2023-02-11 15:03:00', '2023-02-11 15:04:00', '2023-02-11 15:05:00', '2023-02-11 15:06:00']
Может кто-нибудь подскажет как решить проблему? -
Вероятнее всего, не правильное понимание decimal 😕
Получается, если надо хранить число 4.22, 5.68, то надо Decimal(4,2)? -
-
Вы бы лучше начали с create table. Написали бы AggregateFunction и задумались куда там вставить window function (спойлер - никуда)
Но лучше почитайте что такое MV, и почему они на самом деле Insert Trigger, а не то что вам показалось. Тут в чате уже 1000 раз давали ссылку на pdf (так и ищите) с подробным объяснением. -
А мне не нужны оконки. Гляну может это то что мне надо
-
ну может вам topK
подойдет... но не факт конечно -
спасибо
-
это невозможно.
-
в этом нет особого смысла. Я предлагаю использовать Decimal32( 2) или Decimal(9,2) ,
(3,2) имеет смысл только если вам нужна проверка при вставке, кол-ва знаков до запятой
хранится (3,2) все равно будет в Decimal32 -
спасибо
-
Tt
-
Позволю себе бампнуть вопрос разок, быть может, кто-то подскажет?
-
-
"Проекция" в смысле materialized view?
Тогда нет, не очистится.
https://github.com/ClickHouse/ClickHouse/issues/13931#issuecomment-677908003
MV does not see alter update/delete/drop/truncate.Materialized view has wrong data after ALTER TABLE tablename DELETE WHERE colname = 'SomeValue' · Issue #13931 · ClickHouse/ClickHouse(you don't have to strictly follow this form) Describe the bug Any materialized views on table that has had an ALTER TABLE...DELETE WHERE...run against it has the old data still visible in ...
-
materialized projection
-
-
Эти должны очистится.
Delete производится через mutations и должен их зааффектить.
См. 43 слайд.
https://presentations.clickhouse.com/percona2021/projections.pdf -
Нету
- 12 February 2023 (15 messages)
-
Спасибо
-
Спасибо
-
Скажите, есть ли возможность использовать в clickhouse modelPredict из catboost?
Или только ModelEvaluate? -
-
-
если записывать это единственный ваш сценарий, то точно не уместно
-
Считывание тоже будет, но в разы меньше
-
ну возьмите постгрес
-
Какое решение более производительное для записи? Сейчас постгрес показывает слишком большую задержку при нагрузках, латенси ощутимый
-
у вас очень сферично-вакуумный запрос. может ли КХ проглотить 1000рпс на вставку? при желании можно - https://clickhouse.com/docs/en/optimize/asynchronous-inserts/
нужно ли оно вам или стоит нормально затюнить постгрес? из вводных не понятно -
Согласен, благодарю, лучше использовать каждый инструмент по своему прямому назначению
-
Подскажите как лучше построить запрос для нахождения ip которые входят в любой из диапазонов CIDR.
Т.е. на вход даем массив типа ['1.1.1.1/8','200.2.2.2/24',....] и из таблицы с IPv4 получаем подходящие айпишники, типа 1.1.1.1, 1.2.2.2 и т.д. -
А насколько часто меняется массив по которому нужно искать? Если набор статичный, то можно положить их в ip_trie словарь и проверять dictHas
https://clickhouse.com/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout/#ip_trie -
-
О! не знал про isIPAddressInRange. Тогда вроде всё просто становится
- 13 February 2023 (241 messages)
-
Здравствуйте товарищи, возник наверное банальный вопрос
Делаю аналитику для сессионной игры, есть игровые сессии, есть события внутри сессии. Запросы нужно будет делать `агрегация X по событиям Y для сессий в которых Z` какие бест практис для таких задач?
Я могу:
1. дописывать информацию о сессии в каждое событие, сортировать по sessionID и хранить её как дельту, что позволит очень хорошо сжиматься
2. хранить в отдельных таблицах и либо JOIN, либо IN в момент запроса, что вроде бы не очень хорошо для CH, ну либо так было раньше. -
день добрый! а прямое решение в лоб уже доставляет проблемы? :) или есть подозрение что будет доставлять?
-
А какого прямое решение в лоб? Для меня оба решения достаточно очевидны, и на первых парах, скорее всего проблем не создадут, но наверняка у моей весьма типовой задачи есть типовое решение
-
я к тому, что пока нет проблемы, то и непонятно что решать,
для начала надо MVP сделать - сохранить всё в состоянии "как есть", и выбирать по принципу "лишь бы было",
и когда окажется что "вот в такой структуре вот такой запрос работает за 342 мс, а хочется хотя бы 70 мс",
то будет интересно :)
при этом необязательно ждать когда код в прод уедет и клиенты жаловаться на тормоза начнут,
можно и самому нагрузить решение -
Ну вообще можно конечно попробовать и так и так, но я вообще надеялся, что есть типовое решение, задача звучит очень стандартной для аналитической бд. Это как паттерны в программирование, я же использую их сразу, а не тестирую без них, чтоб потом переписывать код когда возникнет проблема
-
всё правильно, для аналитической базы типовым решением задачи `агрегация X по событиям Y для сессий в которых Z`
будет создание таблицы T со столбцами c1, c2, ..., cN и выполнение по ним запросов типа SELECT aggX(cN) FROM T WHERE event_type = Y and Z
нет проблемы - нет решения :) -
То есть лучше обогащать таблицу событий столбцами связанными с сессией на момент записи, чем писать две таблицы, а потом делать join?
Суть в том, что у каждой сессии 50+ столбцов, которые будут неизменными для всех событий в рамках этой сессии, и исходя из опыта с другими бд, очевидным решением в лоб, было бы хранить сессии отдельно, а потом джоинить их с событиями, однако в контексте CH я часто слышал, что join это зло. -
сегодняшний ClickHouse уже вполне умеет в JOIN, вопрос только в количестве данных, CPU и размере памяти,
но в постановке вопроса никаких цифр нет. Сколько хотя бы строк ожидается в таблицах? -
Сессий порядка одного миллиона, событий в среднем по 200-300 на сессию
Вообще да, новые релизы содержат интересные механизмы JOIN, так что возможно зря я его боюсь -
звучит как "данных будет не очень много", 1 миллион сессий, по 50+ полей это грубо в пределах 1 Гб памяти,
никаких проблем с джойном такого справочника не ожидается, если конечно на сервере не 2 Гб памяти :)
GRACE_HASH заметно экономит память за счёт увеличения времени выполнения запроса, только с числом бакетов надо поэкспериментировать на конкретных данных -
Понял, спасибо, буду пробовать
-
никаких джойнов
дальше там уже смотреть на
https://clickhouse.com/docs/en/sql-reference/aggregate-functions/parametric-functions/#windowfunnel
и
https://clickhouse.com/docs/en/sql-reference/aggregate-functions/parametric-functions/#retentionParametric Aggregate Functions | ClickHouse DocsSome aggregate functions can accept not only argument columns (used for compression), but a set of parameters – constants for initialization. The syntax is two pairs of brackets instead of one. The first is for parameters, and the second is for arguments.
-
да смотрите на
https://clickhouse.com/docs/en/sql-reference/functions/ext-dict-functions/#dictget-dictgetordefault-dictgetornull
вместо JOINFunctions for Working with Dictionaries | ClickHouse DocsFor dictionaries created with DDL queries, the dict_name parameter must be fully specified, like .. Otherwise, the current database is used.
-
Доброго времени суток
Вопрос такой, хочу из google sheets
пробросить табличку, в табличке одна из колонок массив со строками
Вопрос почему Массив интов без проблем загружается, а массив строк выдает ошибку -
-
Пишите все стейты сессий сразу, все джойны и диктгет здесь будут лишними.
-
Там же английским по белому написано, что ожидается кавычка, а обнаруживается e
Нужно каждую строку в кавычки обернуть -
Cпасибо, просто с array(UInt) таких проблем не было
-
-
Числа без кавычек, а строки в кавычках. Естественно, что с UInt такой проблемы нет
-
-
-
Добрый день.
1. Являются ли ATTACH PARTITION FROM (и подобные) атомарными операциями?
2. При запросах выше будет сохраняться дедубликация блоков данных (скопированных) (как, например, для INSERT в Replicated таблиц)? Если да, то какой настройкой её конфигурировать? -
да атомарные, парты иммутабельные, при ATTACH PARTITION FROM парты копиюрются (через hardlink) в новуб таблицу. парты получают новые имена, но дедупликации блоков для репликации нет
это не INSERT -
и для репликейтед таблиц, вместо репликации сначала будет пытаться теже самые парты аттачить на других репликах
но если там нет, то тогда уже будет replication data parts fetch -
-
спасибо
-
спасибо!
-
спасибо!
-
1.да
2. нет insert отличается от attach
вот примерчик https://fiddle.clickhouse.com/1676a922-55d4-4912-9d77-50f223592015 -
Я бы не назвал эту переборку сотен хардлинков атомарной операцией. Оно конечно лучше чем копирование, но до атомартности там еще достаточно далеко.
Допустим есть таблица A и мы хотим сделать B c той-же структурой и теми-же данными. Через MV. Данные летят непрерывно.
Что нужно сделать сначала - подключить MV или сделать ATTACH старых партов? Оба варианта дают дырку/дубликаты, надо останавливать поток, атомарности нет. -
вы путаете атоманость с транзакционностью
поскольку нет транзакций. то CREATE MATERIALIZED VIEW и ATTACH PARTITION FROM ... это две разные. но атомарные операции
которые вместе транзакционностью не связаны
под атомарностью имеется ввиду что нет конкуренции за данные между партами
то что данные в таблицу источник идут в новые парты, это новые данные, которые потом eventually самми по себе не вставятся... и их придется попытаться отдельно как то аттачить -
Добрый день, используется http протокол для инсертов, нагрузка небольшая, в районе 1-2к инсертов в секунду (все летит в буфер), но если в коде поменять хост с 127.0.0.1 на удаленный IP этого же сервера, то прилетают connection refused где-то 1 из 10 запросов, проблема была не проблемой пока не пришлось саму аппу распределять на второй сервер, и со второго сервера точно такие же ошибки. Даже просто курлом долбить с той же тачки по внешнему IP - 1 из 10 отлетит, в traceroute все ок
-
смотрите что у вас там с файрволами и т.п. вещами какие то настройки TCP ядра тюнили или наоборот не тюнили...
-
там просто в iptables блок на все, кроме вайтлиста, там проблема именно в рандомных вылетах, 1 на 10 запросов не проходит, никаких фаерволов нет, ядро не "тюненое"
-
а что-то есть /var/log/clickhouse-server/clickhouse-server.err.log?
-
тишина
-
ладно, возможно не в клике проблема, но именно клик отлетает от таких приколов
-
ну значит проблема не в clickhouse
может глобально дексрипторов файловых не хватает?
netstat -s | grep fail
вроде есть счетчик сфейленных коннектов
еще по умолчанию 4096 коннектов к clickhouse
может ваши 1-2k buffer запросов коннекты не закрывают
но тогда должны быть записи об это в логе -
clickho+ 114241 114239 88 01:48 ? 06:12:58 /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml --pid-file=/run/clickhouse-server/clickhouse-server.pid
# more /proc/114241/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 1073741824 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 256816 256816 processes
Max open files 500000 500000 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 256816 256816 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0 -
попробуйте стопнуть clickhouse и запустить iperf на 8123 порту
iperf -s -p 8123 на сервере
и
iperf -c <ip тот же что используете в клиенте клика> -P 1024 -t 10 -i 1 -p 8123 -
Воспроизвел ошибку, в netstat -s | grep fail ничего нового не обнаружилось
-
там пару сотен ошибок влетело в аппу от кликхауса, но в нетстате нет такого
-
Проблема вроде бы нашлась,
2023.02.13 09:09:06.073906 [ 120031 ] {5b12a2ff-ae6b-4c12-8793-f6f358a9470a} <Error> executeQuery: std::exception. Code: 1001, type: pqxx::data_exception, e.what() = Failure during '[END COPY]': ERROR: invalid byte sequence for encoding "UTF8": 0x00
CONTEXT: COPY tasks_logs, line 3734: "8d8ecc26-a287-4c6b-be0b-e2176d2b670c *****\000\000\000\000 https://*****"
(version 22.5.1.2079 (official build)) (from 65.***.**.**:34211) (in query: INSERT INTO logs.tasks_logs_psql_buffer (****) VALUES ), Stack trace (when copying this message, always include the lines below): -
вообщем-то проблема в аппе, только почему connection refused - неизвестно, возможно не связано вообще
-
приложение на чем написано?
-
проблема не на чем, а кем, там адский треш из глобалок, непонятных конструкций, собственно "разработчик" сам не знает что делает и как оно будет работать, кода 100 строк
-
Всем привет. Кто работал с RabbitMQ Engine можете подсказать, как перенаправить в другую очередь сообщения которые не получилось заинсертить? У меня сейчас проблема, что например отправил 10 сообщений, третее из них не может заинсертиться по причине кривого пайлоада. В итоге два зашли и 8 лежат в unacked. А по факту только одно невалидное было
-
Наверное можно как и с кафкой https://kb.altinity.com/altinity-kb-integrations/altinity-kb-kafka/error-handling/
-
А никак - у тебя сервис уже сожрал это сообщение и не подтвердил, что обработано ОК.. Пока сервис не остановишь, так и будет висеть в унакеде. Ну и от логики сервиса ещё зависит- обычно обработкой ошибки никто не заморачивается и при остановке сервиса эти сообщения уходят в страну вечного /dev/null.
А если заморочиться, вот тогда при возникновении ошибки сервис как раз может выплюнуть данное сообщение в другую очередь, например. -
Я так понимаю, что только пропустить могу их с помощью настройки rabbitmq_skip_broken_messages?
-
нужно сервис написать так, что бы в любом случае все валидно прилетало в очередь да? и никаких вариантов нету?
-
Наверно кафка мощнее в этом плане
-
а x-dead-letter-exchange?
-
Приветствую,нужен партнёр на долгосрок, без доверительного управления, есть возможность удалённого формата!
-
Приветствую,нужен партнёр на долгосрок, без доверительного управления, есть возможность удалённого формата!
-
Да вы правы, ещё для остальных движков это не реализовано https://github.com/ClickHouse/ClickHouse/issues/36035Fallback format and table for streaming engines (Kafka, RabbitMQ, FileLog) · Issue #36035 · ClickHouse/ClickHouse
Use case Put unparsed records into a separate table. The records will be splitted by fallback format, like LineAsString or RawBLOB.
-
мне кажется rabbitmq_queue_settings_list = 'x-dead-letter-exchange=my-dlx' может помочь я попробую
-
Чёт я не находу в документации такой настройки.. Скорее всего дело именно в сервисе.. Кролику по сути похрен, чё в себя всасывать. А вот твой сервис, скорее всего, сломался при обработке сообщения, формат которого он не знает. И так как try/catch придумали трусы, то, сломавшись, он просто уронил внутри себя тред, не подтвердив кролику, что сообщение обработано успешно...
-
это в доке
-
А, так это в клике такая настройка :) А я ищу в кролике :)
-
да я смотрю связку кролика с кликом
-
да, это оно, складыать не распаршеное обратно в кролик в другой exchange который уже можно отдельной таблицей опять же в клик засосать
-
Здравствуйте, появилась проблема после обновления с 20.5.4.40 на 21.8.10.19 относительно реплицированных таблиц:
DB::Exception: Part 202212_124650_182816_12 is covered by 202212_124650_182816_13 but should be merged into 202212_124650_199451_13. This shouldn't happen often.
Смотрела в system.parts, есть парт 202212_124650_182816_13, и он активный, нет парта 202212_124650_182816_12. TTL у таблицы стоит dt + toIntervalDay(7), но при этом я помню, что при обновлении работу сервисов, которые производят частые вставки, не останавливали; по system.replicas нет никаких ошибок касательно zookeeper, а также replicas lag не замечено. Что делать в таком случае? Лог прикладываю, и параметры движка постараюсь тоже приложить.
лог: https://pastebin.com/raw/xAAQJqb5
таблица: https://pastebin.com/raw/9hxPx28z -
сделал по примеру insert into ... select * from ...
все, вроде как, начало отрабатывать, но в какой-то момент зависло и кол-во записей в новой таблице не увеличивается. в чем может быть причина? -
А насколько у вас таблица большая то?
-
7 млрд записей примерно
-
-
спасибо!
-
Ищу сотрудника на постоянную работу,
Очень много работы, поэтому нужно пару человек
Успей написать, плачу хорошо!....☺️ -
Добрый день!
а не подскажете в чем ошибка?
SELECT geoToH3( start_lon, start_lat, toUInt8( 1 ) )
from geoh3_sample
получаю ошибку
SQL Error [1002]: ClickHouse exception, code: 1002, host: 10.128.128.2, port: 8123; Code: 44. DB::Exception: Illegal type UInt8 of argument 3 of function geoToH3. Must be UInt8. (ILLEGAL_COLUMN) (version 22.2.2.1)
в исходной таблице 20 строк с таким датасетом
start_lon|toTypeName(start_lon)|start_lat|toTypeName(start_lat)|
---------+---------------------+---------+---------------------+
29.200306|Float64 |53.201387|Float64 |
29.353187|Float64 |53.279714|Float64 |
29.365974|Float64 |53.495552|Float64 |
29.593901|Float64 | 53.80323|Float64 |
29.684189|Float64 |53.595059|Float64 |
29.729303|Float64 | 53.99012|Float64 |
29.976697|Float64 |55.453727|Float64 |
30.019346|Float64 |53.874334|Float64 | -
попробуйте на более новой версии clickhouse
https://github.com/ClickHouse/ClickHouse/issues/35670h3 hash resolution parameter rejected even through it's a UInt8 · Issue #35670 · ClickHouse/ClickHouseI'm running ClickHouse 22.2.2 on Ubuntu 22. I am trying to create an h3 index of the latitude and longitude fields in a table. SELECT toFloat64(lat), toFloat64(lon) FROM pas_mt WHERE toFloa...
-
спасибо!
-
-
наверное во всех sql нельзя в prepared statements сувать названия таблиц и бд
-
спасибо
-
все равно не получается(
-
силами пайтона :)
-
ты про f строку?
-
Send Query Parameters through POST body · Issue #8842 · ClickHouse/ClickHouse
I'd like to be able to pass Query Parameters through POST body $ curl -sS "<address>?param_id=2¶m_phrase=test" -d "SELECT * FROM table W...
-
Что неправильно, в чем ошибка
-
Можно и F строкой
-
ошибки нет, делаю через clickhouse_driver. возвращается пустой список и все. в новой таблице записи не увеличиваются.
client.execute("SELECT DISTINCT 'ALTER TABLE dwh.positions_all ATTACH PARTITION ID \'' || partition_id || '\' FROM parse_positions.positions_all;' from system.parts WHERE table = 'parse_positions.positions_all'") -
Сделайте через clickhouse-client не мучайте себя
-
как в примере, что Вы скидывали
-
table = 'parse_positions.positions_all'
У вас таблица и бд в одно поле записаны
table = 'positions_all' AND database = 'parse_positions' -
так и сделал. ишью смотрю, пока не въезжаю как это мне поможет)
-
спасибо, поправил. тоже не помогло.
-
Ссылка к тому что есть параметры, просто нету нормальных примеров использования их
-
Коллеги, добрый день
Подскажите пожалуйста по вопросу подключения в кликхаусу
Нужно подключить инструмент к managed CH, и сделать это можно только через sqlalchemy
Ждет вот такую строку:
dialect+driver://username:password@host:port/database
Где взять ссылку я понимаю, но как правильно ввести dialect+driver?.. -
-
-
-
Всем привет!
Есть таблица "План", в которой в колонке "Период" строками записаны даты в формате '01.01.2022'. Хочу поменять тип со строк на даты.
SELECT toDate("Период") FROM "План"
Ругается:"Code: 6. DB::Exception: Cannot parse string '01.12.2010' as Date: syntax error at position 8 (parsed just '01.12.20'): while executing 'FUNCTION toDate(Период :: 0) -> toDate(Период) Date : 1'." -
попробуйте и так и так - это быстро проверить, я не знаю как у вас там настроено)
-
Попробуйте native
-
select parseDateTimeBestEffort('01.12.2010');
-
не получилось, но кажется, нашел в документации инструмента подсказку
-
Супер, спасибо!
-
И теперь хочу поменять тип данных колонки таким образом:
alter table gromov."План" modify column "Период" type date toDate(parseDateTimeBestEffort("Период"))
Syntax error: failed at position 69 ('date') (line 3, col 65): date toDate(parseDateTimeBestEffort("Период")) -
так нельзя писать, оно по умолчанию toDate вызывает на модификацию
-
Дак вам надо update использовать
-
Либо создавать materilized колонку
-
select toDate(parseDateTimeBestEffort("Период")) FROM "План" - но именно так он и возвращает дату
-
Вам единожды надо поменять ?
-
alter table gromov."План" add column "новый_период" Date;
alter table gromov."План" update "новый_период" = parseDateTimeBestEffort("Период") where 1=1 settings mutations_sync = 2;
alter table gromov."План" drop column "Период";
alter table gromov."План" rename column "новый_период" to "Период" -
да
-
Вариант выше тогда для вас, если конечно период не находится в ORDER BY
-
Ух ты! Спасибо! Только теперь ругается на Code: 48. DB::Exception: Alter of type 'ADD_COLUMN' is not supported by storage Log. (NOT_IMPLEMENTED)
-
так движок Log не подразумевает таких изменений, только MergeTree
-
понял. То есть создавать таблицу заново?
-
ну если вам нужен Log, то да, если MergeTree, то тоже да)
-
Артём, Константин, спасибо за помощь!
-
Добрый день!
Подскажите а какой командой можно посмотреть сколько данных легко на какую ноду?
таблицу "роутер" создал.
И еще вопрос как правильно обращаться к кластеру? Нужно устанавливать какой-то балансировщик чтобы раскидывать запросы на разные ноды кластера?
Или это реализовано в драйвере указываешь весь массив нод? -
cluster, clusterAllReplicas | ClickHouse Docs
Allows to access all shards in an existing cluster which configured in remote_servers section without creating a Distributed table. One replica of each shard is queried.
-
Мне именно посмотреть хотелось бы как данные по шардам разделились
-
select count(), hostName()
from cluster('{cluster}', db.table) group by hostName(); -
у вас какой язык?
есть драйвера с клиентской балансировкой
есть без
ну можно через system.parts посмотреть
SELECT hostName() h, formatReadableSize(sum(bytes_on_disk)) FROM clusterAllReplicas('your-cluster-name', system.parts) WHERE active=1 AND database=? AND table=? GROUP BY h -
я в данный момент тестирую через дебивер потом вроде аналитики через питон будут лить.
-
ну значит конетитесь в одну ноду
если вставляете в distributed таблицу, тогда она сама растолкает по шардам -
я тут больше боюсь про то что нода выпала и приложение дальше не может писать. по этому интересуюсь как дальше проксить запросы.
-
-
Link
Chproxy is an HTTP proxy and load balancer for ClickHouse
-
IMHO клиентское приложение должно уметь в реконект и повторную отсылку
-
Либо ставьте перед кластером балансер либо передавайте в датасорс список многие клиенты умеют
-
-
Ну если не будет доступна нода то нужно чтоб оно умело к другим стучаться нодам. вот по этому и интересно было нужно ли гарадать проксю или в драйвере реализовано.
-
Здравствуйте, подскажите пожалуйста Нормально выполняется запрос
select count(), key
from sessions
group by key
Но получаю ошибку, если пытаюсь использовать
with
s as key
select count(), s
from sessions
group by s
Code: 47, e.displayText() = DB::Exception: Missing columns: 's' while processing query: … 21.8.13.6 (official build))
https://fiddle.clickhouse.com/0c0ec89a-9588-4899-954a-796aa1f7d1c7
В чем причина и как исправить? -
Создал колонку с типом Float32. Импортирую CSV через dbeaver. В CSV формат числа представлены в формате "40974,317390988", причём разделитель между колонками - тоже запятая. Числа в таблицу попадают без десятичного разделителя. Подскажите, пожалуйста, как это можно исправить?
-
и вам не кажется это странным?
что разделитель колонки конфликтует с разделителем десятичного знака?
у вас невалидный CSV
сделайте его валидным -
так у вас нет колонки с именем s...
-
Данные представлены в таком виде
44562,01.01.2022,81,17,15,1,"0,060689998315713","182069,99494714",Бюджет 2022 г.
То есть запятая внутри кавычек, она не разделитель колонок, потому что находится внутри кавычек. -
With key as s. Прочитайте про синтаксис with. Там два разных варианта.
-
Добрый день
Подскажите, пожалуйста, как можно в логах найти селект запрос, который кладет клик на лопатки? -
exception_code/type выставить можете
-
Добрый день!
Есть запрос, который возращает 2 столбца с массивами. Возможно ли создать новую таблицу, в которой колонками будут элементы первого массива, а значения колонок - элементы второго массива. Что-то вроде такого:
insert into test select * from
(
select
['tag1', 'tag2'],
['value1', 'value2']
)
format JSONCompactEachRowWithNames
Спасибо! -
ну если предположить, что это должен быть долгий запрос, то начать можно с
select * from system.query_log order by query_duration_ms desc limit 20; -
Извините, ошибся.
https://fiddle.clickhouse.com/6e140903-191b-4a65-a722-80cd01724108
С подзапросом не работает.
with
key as s
select * from(
select count(), s
from sessions
group by s)
Без подзапроса ок.
https://fiddle.clickhouse.com/6d198aa0-37f8-4e58-8327-79de7d0772c6
-
Пробовал сеттинги with крутить, но не помогает. Причем если ключом сделать кортеж, то запрос выполняется.
-
Привет! Вопрос по созданию таблички с интеграцией NATS.
Есть такой жсон, что будет приходить на my_subject в NATS:
{
"id": 1,
"type": "event",
"body": {
"elements": [
{
"field_a": "test1",
"field_b": 1,
"field_c": 2
},
{
"field_a": "test2",
"field_b": 10,
"field_c": 20
},
{
"field_a": "test3",
"field_b": 100,
"field_c": 200
}
],
"total": 3
}
}
Есть какая то такая табличка
CREATE TABLE events (
field_a String,
field_b Int64,
field_c Int64
) ENGINE = NATS
SETTINGS nats_url = 'localhost:4222',
nats_subjects = 'my_subject',
nats_format = 'JSON';
Можно ли сделать так, чтобы кликхаус из жсона доставал массив ["body"]["elements"] и мапил объекты в массиве на строчки в таблице? -
как минимум наверное можно сделать materialized view над events и парсить и вставлять что надо в таблицу целевую ["body"]["elements"]
-
А вы с какой целью выкрутили версию на 21.8? Да, там with не прокидывался вовнутрь подзапроса. Увы.
-
это валидный CSV
но невалидное значение Float32
оно через точку -
Можно ли решить этот вопрос присвоением какого-то типа данных при создании таблицы? Я думал про нумерик, но там должно быть чёткое количество знаков до и после запятой.
-
Там ещё и сомнительно использование float32 для такой точности данных
-
CREATE TABLE t1(
fieldS String,
fieldFloat Float32 MATERIALIZED DEFAULT toFloat32(replace(fieldS,',','.'))
...
) -
но лучше научиться в исходных данных нормально запятую на точку исправлять
-
В общем случае нельзя. Гуглите выше по чату pivot. Уже много раз обсуждалось. Но в частном случае (на фиксированные имена колонок) - можно.
-
Спасибо, посмотрю!
-
Похоже, да, лучше в исходных поменяю. Спасибо за скрипт, но что-то не заработал. Но у меня и версия октябрьская стоит.
Exception: Syntax error: failed at position 297 ('toFloat32') (line 9, col 54): toFloat32(replace(fieldS,',','.')),
"Сумма" Float32 MATERIALIZED DEFAULT toFloat32(replace(fieldS,',','.')), -
я от балды писал
чтобы вы идею поняли и пошли в доке про MATERIALIZED прочитали -
Принял, спасибо!
-
доброго времени суток. я тут обнаружил что блог на clickhouse.com больше rss не умеет. это специально или так получилось?
-
Спасибо!
-
вытащить в массив, arrayJoin, JSONExtract, PIVOT
https://fiddle.clickhouse.com/06bcc1ca-3f31-4fd4-bc3a-15e13ca9cfcb -
Спасибо!
-
теперь известно
<Error> DynamicQueryHandler: Code: 439. DB::Exception: Cannot schedule a task: cannot allocate thread (threads=2, jobs=2): While executing ParallelFormattingOutputFormat. (CANNOT_SCHEDULE_TASK) -
Всем привет, подскажите пожалуйста. Есть таблица на движке MergeTree с ключем ORDER BY (id, post_name). Неожиданно понадобилось проапдейтить поля в post_name. Я же верно понимаю что это сделать невозможно. И нужно создавать новую таблицу, наполнять ее верными данными, потом удалять старую и ренеймить новую. Или есть какой-то другой способ?
-
Мне кажется что никаких ограничений на это быть не должно
-
при попытке сделать ALTER TABLE test
UPDATE post_name = '12345'
WHERE id = blablabla выдает ошибку Error updating database. Cause: ru.yandex.clickhouse.except.ClickHouseUnknownException: ClickHouse exception, code: 1002, host: myHost, port: 8123; Code: 420. DB::Exception: Cannot UPDATE key column post_name. (CANNOT_UPDATE_COLUMN) (version 22.6.3.35 (official build)), остальные поля кроме id апдейтятся корректно -
Есть. Нельзя менять значения, входящие в ключ (если он не отличатся от ORDER BY, то поле ТС туда войдёт): https://clickhouse.com/docs/en/sql-reference/statements/alter/updateALTER TABLE … UPDATE Statements | ClickHouse Docs
Manipulates data matching the specified filtering expression. Implemented as a mutation.
-
Хм, буду знать.
-
Кроме перезаписи в другую таблицу можно ещё попробовать так: https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree#choosing-a-primary-key-that-differs-from-the-sorting-keyMergeTree | ClickHouse Docs
The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engines.
-
Единственное, я не помню, можно ли добавлять в первичный ключ поля. Надо это проверитьсначала.
-
Спасибо. Так сложилось и пока мне недоступно повысить версию. Придется обходить.
-
Ну тогда наверно как вариант (не знаю на сколько он проще чем с новой таблицей, тут все зависит от объема данных). Делаем
create table temp as select * from source_table where column = 'filter_value' Engine = MergeTree() order by tuple
Потом удаляете данные из исходной таблицы
alter table source_table delete where ....
Апдейтете данные в временной таблице, а потом вставляете их обратно -
У меня есть таблица ReplicatedSummingMergeTree, есть Distributed таблица, через которую происходят чтения/запись, есть таблица с движком Kafka, и есть MaterializedView который читает из Kafka и вставляет в таблицу Distributed (а та уже в ReplicatedSummingMergeTree).
Возникла необходимость добавить новый столбец, который будет участвовать в группировке (в таблице ReplicatedSummingMergeTree).
Правильно ли я понимаю, что очередность действий такая:
1. В месте, где мы пишем в топик кафке, необходимо добавить эти самые поля.
2. В таблице ReplicatedSummingMergeTree добавляем поля.
3. В Distributed таблице добавляем поля.
4. Дропаем Kafka таблицу и MaterializedView.
5. Создаем Kafka+MaterializedView таблицы с новыми полями.
Вопросы по пункту 5, если я дропну эти таблицы, у косньюмер группы по идеи в кафке остануться офсеты. После создания их (разумеется, с той же группой), чтение продолжится с того же места?
И вопрос по пункту 2, если я добавляю новые поля, мне также нужно их добавить эти поля и в ORDER BY. Я так понимаю, что я могу сделать ALTER, при этом PRIMARY KEY можно сменить только через clickhouse-copier? -
записей чуть больше миллиарда строк, но колонок не много и данных в них тоже.
-
Спасибо, поизучаю
-
4 пункт лучше первым
сделать -
У меня такой вопрос
Гарантирует ли клик сохранение в query_log записи о запросе со статусом ExceptionWhileProcessing, если при пороговых значениях потребления озу базу отстреливает OOM Killer? -
настройте лимиты так чтобы не отстреливал, ООМ это не нормальная ситуация
-
Как правильно читать свойства из JSONEachRow, если полей не было а потом они появились? Я так понимаю, что нужно как-то toInt64OrDefault() на примере инта? Проблема в том, что когда я создам новый движок, в кафке могут быть ещё строки без новых полей.
-
если отстреливается по MemoryLimit только сама query
то да, это все запишется
если процесс сервера отстреливается по OOM
то он просто физически не успеет system.query_log флашнуть и тогда никто ничего гарантировать не может
более того последний парт 7.5 секунд может не флашнуться на диск -
о каких лимитах, которые можно настроить, идет речь?
-
https://clickhouse.com/docs/ru/operations/settings/query-complexity/#settings_max_memory_usage
https://clickhouse.com/docs/ru/operations/server-configuration-parameters/settings#max_server_memory_usage -
https://clickhouse.com/docs/en/operations/settings/formats/#input_format_skip_unknown_fields
только не помню можно ли это сделать в SETTTINGS в создании kafka таблицы...Format settings | ClickHouse Docsformat-settings}
-
а что будет, если клик дойдет до заданного лимита? будет дропать входящие запросы?
-
query валится с ошибкой и ошибка пишется в system.query_log
-
убивает по логике оверкомита https://clickhouse.com/docs/en/operations/settings/memory-overcommit/
-
короче кто встретится с данной проблемой - ставьте ClickHouse-Bulk и не парьте себе мозги, на локалхосте 127.0.0.1 заместо внешнего IP, на другом сервере аппы уже подымайте этот Clickhouse-Bulk и он пусть балдеет этим всем занимается
-
спасибо вам
-
правильно ли я понимаю, что для такого поведения мне нужно только лишь ограничить max_server_memory_usage каким-то ненулевым значением?
-
всем привет. стоит задача в том, чтобы из КХ достать значения из столбцов, имена которых до этого создались автоматически и я заранее их не знаю, но знаю, что они удовлетворяют паттерну, например hello_*, где вместо астериска может быть какая-то строка. вопрос, как мне выбрать данные из таких колонок? пришла идея, что имена колонок можно получить, сделать describe table <table_name>, обернуть это все в select и уже потом как-то там отфильтровать через where, но использовать describe как вложенный select не получается, падает с ошибкой синтаксиса:
select name from (describe table my_table) where islike(name, "hello_%");
ошибка:
syntax error: failed at position 19 ('DESCRIBE')
сталкивался кто с таки или может есть другой способ сделать select from columns by column prefix? -
либо, даже если у меня и получится провернуть этот трюк и получить имена колонок подходящие под паттерн, я все равно не смогу сделать что-то вроде:
select (
<здесь подзапрос, который вернет имена колонок>
) from my_table;
? -
SELECT Query | ClickHouse Docs
SELECT queries perform data retrieval. By default, the requested data is returned to the client, while in conjunction with INSERT INTO it can be forwarded to a different table.
-
благодарю. видимо эту секцию просмотрел в документации
-
Да, меньшим чем доступная память
-
Привет, подскажите, пожалуйста
В таблице есть несколько set skipping indexes и есть необходимость фильтровать в запросе через ИЛИ сразу по нескольким, судя по трейсу все сводится к перебору всей таблицы, ничего не отсекается
Концептуально возможна фильтрация по нескольким skipping index'ам? По отдельности они прекрасно работают -
union all не сможет Вам помочь?
-
Вопрос производительности, т.к. есть свои тонкости, но union с distinct и последующей сортировкой будет в любом случае повеселее прямого перебора всех значений.
Думал из коробки есть возможность)
Буду смотреть детальнее, спасибо за совет -
Привет. Если разное количество ядер у шардов и реплик, то можно ли как-то заставить дистрибьютэд селекты ходить на жирные сервера, а на более дохлые реплики только если те окажутся недоступны?
-
weight есть в remote_servers
-
Distributed Table Engine | ClickHouse Docs
Tables with Distributed engine do not store any data of their own, but allow distributed query processing on multiple servers.
-
Спасибо, но там описан weight в контексте записи, мол если на школе стоит 2 то он получит 2/3 инсертов. Мне не нужно неравномерно размазывать щарды. Если быть более точным, то есть 4 шарда на 96 ядер и есть их реплики на 32 ядрах. Запрос в дистрибьютэд , насколько я понял, рандомно летит на каждую реплику и может приземлиться на 32 ядерную машину, что "слегка" её оверлодит. Вот я и хотел сказать, старайся читать отсюда, а если не получится, то тогда иди туда.
-
Всем привет, можете кто нибудь подсказать как мне ограничить кх в потреблении оперативки, max_memory_usage и max_cache_size почему то не работают (кх запущен на докере).
Может, нужно где то определить выполнение конфигов но я пока не могу понять где -
Всмысле не работает ?
-
По умолчанию в config.xml указан max_cache_usage на 5 гб
-
Но жрет кх без перебоя под убой
-
У меня 32 гб оперативки но ему мало (я выполняю скрипт по созданию таблицы)
-
всмысле вы пишите CREATE TABLE table_name () ENGINE MergeTree() и он занимает 32 гигабайта ?
-
Я создаю таблицу через AS SELECT
-
Ну так это другой уже вопрос. Кликхаус не может ограничивать память выполнения
-
Вы можете попробывать заюзать max_threads = 1
-
Далее если у вас запрос с GROUP BY то вот ещё настройка max_bytes_before_external_group_by
-
тогда оно длиться будет вечно а ещё может положить ему дисковую подсистему
-
Понял, группировки нет но спасибо
-
Когда используется память выполнения?
-
Скиньте плиз какую-нибудь статью или если влом сам потом поищу, не знал о таком
-
node_exporter стоит на ноде с кликом? чтот мне кажется там всё page cache сожрал
-
Дак вопрос выполнить запрос
-
Все запущено в одном контейнере на локалке
-
Вы можете показать запрос ?
-
Там таблица на 110 колонок
-
JOIN есть ?
-
О_о и вам контора сервер выдать не может?
-
или ORDER BY ?
-
Кстати отбой, он выполнился
-
😂
-
У меня локалка на 32 гб, все тянет, а кх никто пользоваться не хочет, людям проще ждать по 30 мин на постгресе)
-
поставь https://github.com/ClickHouse/clickhouse_exporter чтобы понимать что происходитGitHub - ClickHouse/clickhouse_exporter: This is a simple server that periodically scrapes ClickHouse stats and exports them via HTTP for Prometheus(https://prometheus.io/) consumption.
This is a simple server that periodically scrapes ClickHouse stats and exports them via HTTP for Prometheus(https://prometheus.io/) consumption. - GitHub - ClickHouse/clickhouse_exporter: This is a...
-
Нет, там только приведение типов с текстового на нормальные
-
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.
-
-
Это стандарт :)))))
-
Аа ещё и на виндоус 😐
-
Минут 5 назад выполнился, все не падает
-
Это вообще гадство, бесит даже
-
-
Дак и не упадёт, wsl почистите page cache
-
Такс, вот это уже интересно
-
Сейчас погуглю
-
Если что я недавно в этой среде так что много не знаю
-
Спс что помогаете
-
Коммандос
-
-
Мы легких путей не ищем, тут и так ничего выделять не хотят, ну как и везде
-
А на счет drop_caches спасибо, буду знать
-
Спасиб ребят
-
На одной из нод
select count() from system.replication_queue; - 2976848
на другой очередей нет. С сетью проблем не наблюдается. Объем данных в зукипере пухнет с неестественно большой скоростью. Самое забавное, что на ноде с очередями данные приезжают с ощутимой задержкой. Нагрузки на эту ноду тоже не наблюдается.
Пока из идей только попробовать "переподключить" ноду. Есть идеи?
SELECT
last_exception,
postpone_reason
FROM system.replication_queue
WHERE last_exception != ''
ORDER BY create_time DESC
LIMIT 10
Query id: 1a6ac2b5-9aa9-4c38-87aa-b46f6ebdf0d5
Row 1:
──────
last_exception: Code: 86. DB::Exception: Received error from remote server /?endpoint=DataPartsExchange%3A%2Fclickhouse%2Ftables%2FURAL%2FMsSqlLockEvents%2Freplicas%2Fural-ch1&part=202302_30180_39373_5144&client_protocol_version=7&compress=false. HTTP status code: 500 Internal Server Error, body: Code: 232. DB::Exception: No part 202302_30180_39373_5144 in table. (NO_SUCH_DATA_PART), Stack trace (when copying this message, always include the lines below):
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0x9366e7a in /usr/bin/clickhouse
1. DB::DataPartsExchange::Service::findPart(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x113e0319 in /usr/bin/clickhouse
2. DB::DataPartsExchange::Service::processQuery(DB::HTMLForm const&, DB::ReadBuffer&, DB::WriteBuffer&, DB::HTTPServerResponse&) @ 0x113de800 in /usr/bin/clickhouse
3. DB::InterserverIOHTTPHandler::processQuery(DB::HTTPServerRequest&, DB::HTTPServerResponse&, DB::InterserverIOHTTPHandler::Output&) @ 0x1175729e in /usr/bin/clickhouse
4. DB::InterserverIOHTTPHandler::handleRequest(DB::HTTPServerRequest&, DB::HTTPServerResponse&) @ 0x11757b83 in /usr/bin/clickhouse
5. DB::HTTPServerConnection::run() @ 0x117bbdb0 in /usr/bin/clickhouse
6. Poco::Net::TCPServerConnection::start() @ 0x143720af in /usr/bin/clickhouse
7. Poco::Net::TCPServerDispatcher::run() @ 0x14373b3a in /usr/bin/clickhouse
8. Poco::PooledThread::run() @ 0x144a69b9 in /usr/bin/clickhouse
9. Poco::ThreadImpl::runnableEntry(void*) @ 0x144a2c4a in /usr/bin/clickhouse
10. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
11. clone @ 0xfe9fd in /usr/lib64/libc-2.17.so
(version 21.9.2.17 (official build)). (RECEIVED_ERROR_FROM_REMOTE_IO_SERVER) (version 21.9.2.17 (official build))
postpone_reason: Not executing log entry queue-0003152002 for part 202302_39346_39346_0 because it is covered by part 202302_30180_39625_5264 that is currently executing.
Row 2:
──────
last_exception: Code: 86. DB::Exception: Received error from remote server /?endpoint=DataPartsExchange%3A%2Fclickhouse%2Ftables%2FURAL%2FMsSqlLockEvents%2Freplicas%2Fural-ch1&part=202302_30180_39334_5129&client_protocol_version=7&compress=false. HTTP status code: 500 Internal Server Error, body: Code: 232. DB::Exception: No part 202302_30180_39334_5129 in table. (NO_SUCH_DATA_PART), Stack trace (when copying this message, always include the lines below):
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0x9366e7a in /usr/bin/clickhouse
1. DB::DataPartsExchange::Service::findPart(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x113e0319 in /usr/bin/clickhouse
2. DB::DataPartsExchange::Service::processQuery(DB::HTMLForm const&, DB::ReadBuffer&, DB::WriteBuffer&, DB::HTTPServerResponse&) @ 0x113de800 in /usr/bin/clickhouse
3. DB::InterserverIOHTTPHandler::processQuery(DB::HTTPServerRequest&, DB::HTTPServerResponse&, DB::InterserverIOHTTPHandler::Output&) @ 0x1175729e in /usr/bin/clickhouse
4. DB::InterserverIOHTTPHandler::handleRequest(DB::HTTPServerRequest&, DB::HTTPServerResponse&) @ 0x11757b83 in /usr/bin/clickhouse
5. DB::HTTPServerConnection::run() @ 0x117bbdb0 in /usr/bin/clickhouse
6. Poco::Net::TCPServerConnection::start() @ 0x143720af in /usr/bin/clickhouse -
Row 3:
──────
last_exception: Code: 86. DB::Exception: Received error from remote server /?endpoint=DataPartsExchange%3A%2Fclickhouse%2Ftables%2FURAL%2FMsSqlLockEvents%2Freplicas%2Fural-ch1&part=202302_30180_39332_5127&client_protocol_version=7&compress=false. HTTP status code: 500 Internal Server Error, body: Code: 232. DB::Exception: No part 202302_30180_39332_5127 in table. (NO_SUCH_DATA_PART), Stack trace (when copying this message, always include the lines below):
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0x9366e7a in /usr/bin/clickhouse
1. DB::DataPartsExchange::Service::findPart(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x113e0319 in /usr/bin/clickhouse
2. DB::DataPartsExchange::Service::processQuery(DB::HTMLForm const&, DB::ReadBuffer&, DB::WriteBuffer&, DB::HTTPServerResponse&) @ 0x113de800 in /usr/bin/clickhouse
3. DB::InterserverIOHTTPHandler::processQuery(DB::HTTPServerRequest&, DB::HTTPServerResponse&, DB::InterserverIOHTTPHandler::Output&) @ 0x1175729e in /usr/bin/clickhouse
4. DB::InterserverIOHTTPHandler::handleRequest(DB::HTTPServerRequest&, DB::HTTPServerResponse&) @ 0x11757b83 in /usr/bin/clickhouse
5. DB::HTTPServerConnection::run() @ 0x117bbdb0 in /usr/bin/clickhouse
6. Poco::Net::TCPServerConnection::start() @ 0x143720af in /usr/bin/clickhouse
7. Poco::Net::TCPServerDispatcher::run() @ 0x14373b3a in /usr/bin/clickhouse
8. Poco::PooledThread::run() @ 0x144a69b9 in /usr/bin/clickhouse
9. Poco::ThreadImpl::runnableEntry(void*) @ 0x144a2c4a in /usr/bin/clickhouse
10. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
11. clone @ 0xfe9fd in /usr/lib64/libc-2.17.so
(version 21.9.2.17 (official build)). (RECEIVED_ERROR_FROM_REMOTE_IO_SERVER) (version 21.9.2.17 (official build))
postpone_reason: Not executing log entry queue-0003151987 for part 202302_30180_39332_5127 because it is covered by part 202302_30180_39625_5264 that is currently executing.
Row 4:
──────
last_exception: Poco::Exception. Code: 1000, e.code() = 110, Timeout (version 21.9.2.17 (official build))
postpone_reason: Not executing log entry queue-0043742947 for part 20230213_20230213_128206_128206_0 because it is covered by part 20230213_20230213_128054_128252_10 that is currently executing.
Row 5:
──────
last_exception: Poco::Exception. Code: 1000, e.code() = 110, Timeout (version 21.9.2.17 (official build))
postpone_reason: Not executing log entry queue-0043742928 for part 20230213_20230213_128191_128191_0 because it is covered by part 20230213_20230213_128054_128252_10 that is currently executing.
Row 6:
──────
last_exception: Poco::Exception. Code: 1000, e.code() = 110, Timeout (version 21.9.2.17 (official build))
postpone_reason:
Row 7:
──────
last_exception: Poco::Exception. Code: 1000, e.code() = 110, Timeout (version 21.9.2.17 (official build))
postpone_reason:
Row 8:
──────
last_exception: Poco::Exception. Code: 1000, e.code() = 110, Timeout (version 21.9.2.17 (official build))
postpone_reason: Not executing log entry queue-0001235094 for part 202302_18140_18439_80 because it is covered by part 202302_18140_18467_102 that is currently executing.
Row 9:
───────
last_exception: Poco::Exception. Code: 1000, e.code() = 110, Timeout (version 21.9.2.17 (official build))
postpone_reason:
Row 10:
───────
last_exception: Poco::Exception. Code: 1000, e.code() = 110, Timeout (version 21.9.2.17 (official build))
postpone_reason:
на обеих нодах пусто SELECT * FROM system.replication_queue WHERE last_exception LIKE '%No active rep' - пусто - 14 February 2023 (127 messages)
-
Добрый день!
Как часто ClickHouse выполняет слияние в таблицах (replacing, summing и т.д.)? -
Когда захочет. Считайте, что в произвольный момент
-
Кто-нибудь может подсказать?
при ALTER TABLE xxx.xxx MODIFY SETTING replicated_max_parallel_fetches_for_host = 70;
ошибка
Received exception from server (version 21.9.2):
Code: 36. DB::Exception: Received from localhost:9000. DB::Exception: Cannot alter settings, because table engine doesn't support settings changes. (BAD_ARGUMENTS)
с некоторыми таблицами с движком ReplicatedMergeTree все ок, а с другими такая ошибка -
Ну какая - то же периодичность (хотя бы примерная) должна, наверное, присутствовать? Что - то между 1 секундой и 10 годами =)
-
Наверняка есть какая-то логика. Знающие подскажут. Но если вам это нужно знать, то вы что-то делаете не так
-
Как можно таблицу перевести в режим ридонли? Ну не отключая от зукипера)
-
-
Раз в 4 часа клик смотрит, а не смержить мне, так же в последних версиях реализовали настройку которая говорит через сколько должны быть точно смержены данные
-
Но если вы новичок в кликхаусе, то лучше просто считать, что он сам когда смержит
-
И то клик обычно не мержит данные до 1 парта, а остаются другие парты
-
А что именно хотите сделать с помощью TTL ? Просто удалить или переместить данные ? Например про перемещение есть тут https://altinity.com/blog/2020/3/23/putting-things-where-they-belong-using-new-ttl-moves
-
Ещё можете посмотреть тут https://kb.altinity.com/altinity-kb-queries-and-syntax/ttl/
-
Вообще - просто удалить
-
-
Добрый день
Попробовал задать max_server_memory_usage, но клик отвечает, что такой настройки не существует
Возможно, что это депрекейтед фича?
Received exception from server (version 22.3.17):
Code: 115. DB::Exception: Received from rc1c-nzwzwydtcuhw3jl3.mdb.yandexcloud.net:9440. DB::Exception: Setting max_server_memory_usage is neither a builtin setting nor started with the prefix 'custom_' registered for user-defined settings: Maybe you meant ['max_memory_usage','max_guaranteed_memory_usage']. (UNKNOWN_SETTING) -
Дак вам же написали в ошибки, max_memory_usage ....
-
Да, но max_memory_usage - это история про потребление памяти одного запроса
-
А где это написано ?
-
-
Всем привет! При создании таблицы CREATE TABLE AS ... появляется ошибка "Exception: Estimated query execution time (22.054352900795767 seconds) is too long. Maximum: 20" . Пробовал увеличить max_execution_time в отдельном файле xml в папке config.d, но похоже, это не им регулируется.
-
Попробуйте выполнить запрос через clickhouse-client
-
Спасибо Вам большое! А почему оно так работает - это особенность, или я не там прописывал?
-
У клиента которым вы подключаетесь, возможно стоит какая то настройка ограничивающие выполнение запроса
-
вообще если там internal_replication true то да там weighed round robin на запись на одну доступную реплику из шарда
и там двумя строчками ниже, это уже на чтение приоритет
```
<replica>
<!-- Optional. Priority of the replica for load balancing (see also load_balancing setting). Default: 1 (less value has more priority). -->
<priority>1</priority> -
У меня есть задача создать полную копию прода в дев окружение.
Я нашёл DDL таблиц, но они просто CREATE TABLE и получается, что при повторном запуске уже не выполнится запрос, а упадёт с ошибкой, так вот как можно добавить приписку IF NOT EXISTS к запросом на создания таблиц ? -
Так и добавить. Create table if not exists
-
добрый день. для SummingMergeTree для columns, не указанных в orderBy, хочу получить последнее значение после слияния - либо в порядке следования другого атрибута, либо просто - последней созданной строки, что то типа argmax по time (default now()), - не работает для SimpleAggregateFunction. не знаете - могу как то решить такую задачу? спасибо!
-
добрый день, подскажите где должна быть строка source? CREATE DICTIONARY product_favorite_dict_test (
id UInt32,
name String,
is_new bool,
pics UInt8,
kind_id UInt32,
subject_id UInt32,
subject_parent_id UInt32,
seller_id UInt32,
brand_id UInt32
)
PRIMARY KEY id
SOURCE (CLICKHOUSE(
host '0'
port 9000
user 'default'
password '0'
db ''
table product_favorite secure 1
))
LAYOUT(HASHED())
SOURCE(ODBC(invalidate_query 'SELECT updated_at FROM product_favorite where updated_at > unix_timestamp(now() - interval 30 second)'))
LIFETIME(30); -
Добрый день. Подскажите пожалуйста - есть ли возможность обойти тот факт что в словарях Date32 не поддерживается?
-
-
Для хранения фиксированных данных, например переводы статусов на русский - я использую пару MergeTree+Dictionary и читаю через dictGet
Можно ли такую конструкцию переделать на Join? Подходит ли Join для постоянного хранения? это просто справочные данные (50-100 записей) -
Есть движок join, можете его использовать
-
это настройка конфига сервера
-
внутри ODBC( .. )
в котором вы только invalidate_query вставили
только не source
а connection_string
https://clickhouse.com/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources/#odbcDictionary Sources | ClickHouse DocsA dictionary can be connected to ClickHouse from many different sources.
-
Спсибо!)👍
-
это запрос на обновление словаря, здесь указано в source, но выдаёт ошибки по синтаксису https://clickhouse.com/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-lifetime/Обновление словарей | ClickHouse Docs
obnovlenie-slovarei}
-
дак у вас два SOURCE
зачем тогда второй после LAYOUT ? -
я и в первый вкладывал, тоже самое
-
я не знаю как объяснить, SOURCE один на словарь...
двух их быть не может
доку перечитайте
https://clickhouse.com/docs/en/sql-reference/statements/create/dictionaryCREATE DICTIONARY | ClickHouse DocsCreates a new dictionary with given structure, source, layout and lifetime.
-
Clickhouse поддерживает/есть в планах поддержка вставки из fluvio?
-
CREATE DICTIONARY product_favorite_dict_test (
id UInt32,
name String,
is_new bool,
pics UInt8,
kind_id UInt32,
subject_id UInt32,
subject_parent_id UInt32,
seller_id UInt32,
brand_id UInt32
)
PRIMARY KEY id
SOURCE (CLICKHOUSE(
host ''
port 9000
user ''
password ''
db ''
table product_favorite secure 1
)
ODBC(invalidate_query 'SELECT updated_at FROM product_favorite where updated_at > unix_timestamp(now() - interval 30 second)')
)
LAYOUT(HASHED())
LIFETIME(30); -
софт новый, планов особых ни у кого не было
Либы нет по C++ только Rust API
так что пока он не научится из себя Kafka изображать как RedPanda врятли что-то появится
но никто вам не мешает поднять консюмер на любом языке какой вам удобнее и буфферизировать
а потом вставлять в clickhouse Батчем...
или по одному но в буффер таблицу -
ок. такое ощущение что вы реально не понимаете
вот вы описали внутри SOURCE
CLICKHOUSE(...)
и
ODBC(...)
и ?
как это должен интерпретировать сервер?
откуда ему данные брать? из клика или из ODBC? -
Вы данные хотите брать из Clickhouse или из какой то другой базы ?
-
теперь понял о чем речь, словарь в клик, а таблица в mysql переделал запрос CREATE DICTIONARY product_favorite_dict_test (
id UInt32,
name String,
is_new bool,
pics UInt8,
kind_id UInt32,
subject_id UInt32,
subject_parent_id UInt32,
seller_id UInt32,
brand_id UInt32
)
PRIMARY KEY id
SOURCE (MYSQL(
host ''
port 0
user ''
password ''
db ''
table product_favorite,
invalidate_query 'SELECT updated_at FROM product_favorite where updated_at > unix_timestamp(now() - interval 30 second)'))
LAYOUT(COMPLEX_KEY_HASHED())
LIFETIME(30); -
https://clickhouse.com/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources#mysql , надеюсь вы точно понимаете что такое invalidate_queryDictionary Sources | ClickHouse Docs
A dictionary can be connected to ClickHouse from many different sources.
-
-
добрый день, подскажите пожалуйста как решить такую проблему -
есть таблица фактов ~80 столбцов неизменяемых данных, но пара из них - изменяемые и актуальные данные нужны сразу после обновления этих столбцов
читал эту статью https://altinity.com/blog/2020/4/14/handling-real-time-updates-in-clickhouse, но мб есть более актуальные / другие способы решения? -
ReplacingMergeTree + SELECT .. FINAL
ничего другого тут не сделаешь...
все идет от того что куски данных в кликхаус, иммутабельные
еще и остальные 78 столбцов вам где то хранить надо чтобы новая версия строки из этих 78 неизменяемых столбцов старые данные брала... -
Добрый день. Подскажите пожалуйста - есть ли возможность обойти тот факт что в словарях Date32 не поддерживается?
-
спасибо
-
обновитесь до 22.8
https://github.com/ClickHouse/ClickHouse/commit/97b0a343f88808cba440bae07cb06398608370b3Merge pull request #32971 from kitaisreal/dictionaries-added-date32-t… · ClickHouse/ClickHouse@97b0a34…ype-support Dictionaries added Date32 type support
-
Понял, спасибо 👍
-
-
SELECT arrayJoin(['1', '2', '3']) as constr_s
-
Спасибо, Антон, это будет лучше по производительности union all?
-
Сомневаюсь, что будет принципиальная разница
-
Понял. спасибо
-
Привет, обновились на 22.12 и в логе clickhouse-server.log появилось много сообщений подобного плана:
{} <Information> table_name (5cbfd2bb-e289-434c-b4c5-8f98b631dc14) (Fetcher): Disk for fetch is not provided, getting disk from reservation default with type local
это что-то новое? -
fetcher это репликация
она пытается слить партиции
c другой ноды
тут немного непонятно что за диск имеется ввиду
https://github.com/ClickHouse/ClickHouse/blob/0b55021c68ea7f40887cb1a19de2c105edd9946c/src/Storages/MergeTree/DataPartsExchange.cpp#L525-L533
у вас SELECT hostName(), * FROM clusterAllReplicas('your-cluster',system.disks) FORMAT Vertical одинаковые на всех нодах кластера?
а то может на одной ноде одни диски. на другой другие...
?ClickHouse/DataPartsExchange.cpp at 0b55021c68ea7f40887cb1a19de2c105edd9946c · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Спасибо, да, одинаковые, может что-то отсюда? https://github.com/ClickHouse/ClickHouse/pull/41889Reduce verbosity of part fetcher by Algunenano · Pull Request #41889 · ClickHouse/ClickHouse
Changelog category (leave one): Not for changelog (changelog entry is not required) Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): ... Information ...
-
-
ну этот пулл реквест закрыт, LOG_INFO остается, можно автору pull request написать в комменты спросить в чем суть этого логирования...
по коду какой то парметр в функцию фетчинга не передается, откуда этот DiskPtr берется и почему не передается, быстро понять я не смог -
У меня тоже самое в логи пишется. В строках free_space на 10 гб отличается
-
free_space не должен влиять, сами диски по идее должны быть одинаковые...
-
Да, они идентичные
-
но их несколько?
-
по одному на ноду
-
-
Да
-
Since ALTER query does not allow the partition alteration, the possible way is to create a new table and to move your data
https://github.com/ClickHouse/ClickHouse/issues/15123#issuecomment-696705769ALTER | ClickHouse DocsMost ALTER TABLE queries modify table settings or data:
-
-
Всем привет! Подскажите, как можно дать грант на селект роли/пользователю на вьюху, но чтобы при этом не давать грант на таблицу которая там используется?
-
Добрый день! Пытаюсь запустить clickhouse через docker-compose, на ubuntu в aws, и по логам вижу что он рестартиться. кусок compose, и логи по ссылке. Может кто сталкивался? https://pastila.nl/?00051cbd/6c86d31853abc28b4f4a2589828f509c
-
-
или Distributed, или репликация. Но remote() это не про быстрее и меньше жрет, это про подключения
-
Нам таблицу где где-то миллион строк в день с одного клика в другой прокинуть. Нет задачи реалиайм. Используем remote. Думаем что лучше
-
-
а зачем прокидывать, и почему два клика?
-
Ну один продавая база. Второй аналитика. Прокидывть что-бы модели разные сверху строить
-
Почему нельзя было сделать это все на одной машине в одном инстансе кликхауса?
-
Потому что разные требования к стабильности. Например аналитика использует данные из Salesforce и там может запросто колонка пропасть и билд упадёт. И куча всякого такого. Где нет требований продакшн стабильности.
А прод где-то в 10к раз раз больше по кол-ву данных и нагрузкам -
Разницы в что меньше что жрет, - не особо эээ... Конечный вопрос. Есть разница в том, как постоянно у вас нагружена изначальная таблица, из которой вы забираете. Если вы постоянно вставляете в изначальную, - MV + Distributed на конечную, если нет, - можно remote раз в день
-
привет!
подскажите, плз, если кто сталкивался
есть Null таблица, в которую данные наливаются некоторым сервисом
в эту таблицу смотрит MergeTree вьюха, с ней все ок
пытаюсь привязать еще одну вьюху к этой же Null таблице, но туда попадает какое-то кол-во записей и потом записи перестают попадать в новую вьюху
причем если вторую вьюху направить смотреть в .inner таблицу первой вьюхи, то все ок работает, но это какой-то костыль, кажется, что должно работать и из Null таблицы -
по логам там оно обрывается в середине
2023.02.10 17:11:24.253368 [ 51 ] {} <Information> Application: Integrity check of the executable suc
рестарта не видно
ну варнинги про listen еще видны
docker-compose.yaml можно еще куда то выложить -
да, вроде бы должно работать из Null Таблицы тем более что вы говорите что у вас работает...
а в логах ничего нет случайно? может быть просто SELECT для Matview начинает ошибки какие выдавать? -
в логи пока не лазили
но такой же селект из .inner таблицы соседней вьюшки прекрасно отрабатывает, а та вьюшка из Null таблицы читает без преобразований -
я обновил пастилу, добавил еще логов где они обрываются, а кусок docker-compose в самом начале пастилы вставил. Проблема проявляется только на машинке у заказчика )
-
db_clickhouse_1 | ClickHouse init process failed.
попробуйте закоментировать create_schema.sql
# - ./clickhouse/create_ch_schema.sql:/docker-entrypoint-initdb.d/create_schema.sql
если после этого тоже не стартует, то тогда сильно странно, потому что лог основной обрывается ... -
Всем привет
у меня есть паркет, где одно из полей, вложенная структура. Array of tuples. И все поля в этом тупле именованные.
Но когда я создаю над этим паркетом таблицу в кликхаусе - кликхаус во вложенных структурах не видит имен полей и создает их с именами attr1, attr2, attr3
создаю таблицу в КХ так
create table table1
from engine s3('moi_parket')
В DDL этой таблицы получаю вложенную структуру
hits Array(Tuple(Nullable(String),
Nullable(Int64),
Nullable(Int64),
Nullable(Int64),
Nullable(Int64),
Nullable(Int64),
Nullable(Int64)))
Хотя внутри Hits в паркете у полей есть имена, но в КХ они пропадают. Можно ли сделать, чтобы КХ их определял? -
можно структуру таблицы самому определить без интроспекции...
видимо интроспекция работает не так как вы ожидали -
если я создаю таблицу с именами вручную
hits Array(Tuple(field_name1 Nullable(String),
field_name2 Nullable(Int64),
field_name3 Nullable(Int64) ..
КХ пишет, что не видит таких имён
Column 'hits.field_name1' is not presented in input data.: While executing ParquetBlockInputFormat -
а версия clickhouse какая?
-
22.10.7.13
-
В Вертике например делаю авто инфер схемы точно так же, и он все вложенные имена видит.
-
коментировал эту строчку и после этого стартовал, но странно что схема рабочая, на другом компьютере работает.
-
версии clickhouse например разные...
вообще там где то в логе server.err.log должно быть в чем ошибка...
стопните контейнер
сделайте truncate -s 0 ./clickhouse/logs/*.log на хосте
раскоментарьте схему
и еще раз выложите clickhouse-server.err.log целиком -
миллион строк - это очень мало, это один батч. Если remote работает, то и хорошо - взял/положил. Другое дело, что сама по себе идея вот этой суточной переливки - так себе.
А почему не хотите сделать реплику, выделенную для аналитики? Данные сами приедут через реплицированную таблицу, ничего делать не надо. -
Добрый день!
Есть 6 серверов ClickHouse 22.2.2.1. Настроен ssl.
При всплеске нагрузки увеличивается число подключений и не уменьшается примерно в течение часа. С этим можно что-то сделать? -
Для начала обновиться хотя бы до 22.3
-
-
-
Screenshot (14 февр. 2023 г. 22:36:21)
-
А если не поможет писать issue на гитхабе... но 22.2 это сломанная версия ....
-
-
/*+////////////////////////// CB/////////////////////////////
-
////////////+///////
-
/stat@combot
-
///
-
/++++++++
-
/////////////////////
-
+*/-+++++++++++
-
/stat@combot
-
/stat@combot
-
-
Добрый вечер! Подскажите, пожалуйста, есть какая-то альтернатива groupArray, но чтобы NULL значения тоже учитывались
-
Всем привет! Есть таблица с именами людей и пустыми колонками: A, B и C. Хочу в колонки A, B и C записать результаты джоинов по людям из другой таблицы. Пробовал через ALTER TABLE UPDATE, но ругается:
https://fiddle.clickhouse.com/d4571e63-3218-445c-9d76-701ab4a347b7 -
Вот тут костыль придумали https://github.com/ClickHouse/ClickHouse/issues/43340#issuecomment-1319043688Is groupArray order guaranteed across columns? · Issue #43340 · ClickHouse/ClickHouse
Hello, https://clickhouse.com/docs/en/sql-reference/aggregate-functions/reference/grouparray/ mentions Values can be added to the array in any (indeterminate) order If I have a table like this: CRE...
-
Спасибо большое, пойду тестировать!)
-
ALTER TABLE sales
UPDATE A =
(SELECT scenarios.sales from
sales
LEFT JOIN scenarios on
sales.name = scenarios.name
WHERE scenarios.scenario = 'A');
так у вас этот запрос несколько строк возвращает, так нельзя, непонятно какое значение A присваивать из этих строк -
-
Вы бы рассказали какой у этого словаря SOURCE, а лучше привели DDL.
Для ClickHouse это выглядит так:
SOURCE(CLICKHOUSE(HOST 'node4' PORT 9000 USER 'default' PASSWORD 'default' TABLE 'xml_dictionary_table' DB 'test'))
Если пароли помимо default не работают, это баг, конечно. Но поверить в такое довольно сложно. -
SOURCE(CLICKHOUSE(TABLE ‘Table1’))
-
Ну так укажите пользователя и пароль. Я привел пример выше.
-
-
Всем привет,
Кто-нибудь знает как решить проблему с выборкой данных в DBeaver/Datagrip из AggregatingMergeTree таблицы?
Всегда падает на Unknown aggregate function: groupUniqArrayArray. Если делать такой же запрос через clickhouse-client, то все ок.
Выглядит так, будто бы драйвер не поддерживает некоторые возможности CH -
- 15 February 2023 (104 messages)
-
Всем привет! Подскажите, как можно дать грант на селект роли/пользователю на вьюху, но при этом не давать грант на таблицу которая там используется?
-
Нельзя. view - это что-то типа инклуда/макроса, просто подставляет код в виде подзапроса.
-
Ну Да, просто в некоторых базах можно такое провернуть(
-
Понял, спасибо!
-
на графике не видно что за connections по какому протоколу
ну и запустите
`netstat -tn 2>/dev/null | awk '/^tcp/ {split($4,a,":");if(a[2] != "") count[a[2]]++} END {for (p
ort in count) print "Incoming TCP connections on port " port ": " count[port]}'`
посмотрите на какие локальные порты трафик приходит
может это просто interserver connection для репликации или distributed inserts -
можно сделать materialized view. Это конечно совсем иное и со своими нюансами, но может помочь в этом случае
-
Посмотрю, спасибо!
-
Добрый день.
Есть ли в ClickHouse аналог функции BINARY_CHECKSUM из T-SQL, который возвращает такой же результат ?
Чтобы можно было быстро сравнивать данные
в таблицах ClickHouse и MS SQL -
есть обычные хеш функции в T-SQL
https://learn.microsoft.com/en-us/sql/t-sql/functions/hashbytes-transact-sql?view=sql-server-ver16
и соответсвенно есть
https://clickhouse.com/docs/en/sql-reference/functions/hash-functions/#sha1-sha224-sha256-sha512
и
https://clickhouse.com/docs/en/sql-reference/functions/hash-functions/#hash_functions-md5 -
sha256 использовал уже для сравнения в SQL и КХ, пришлось через оконные функции делать, это очень медленно.
Если нужно сравнить таблицы КХ, то groupBitXor, она супер быстро работает с 64-битными функциями. Распараллеливает на все ядра процессоров.
Нашел аналог в T-SQL: CHECKSUM_AGG и BINARY_CHECKSUM, тоже очень быстро можно сравнить таблицы в SQL запросом типа:
SELECT
[_Fld],
CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM
...
GROUP BY
[_Fld]
Но сравнить результаты в КХ и SQL так нельзя, они разные -
для BINARY_CHECKSUM нет опубликованного алгоритма по которому эта чексумма считается
я по крайней мере сходу загуглить не смог... -
https://fiddle.clickhouse.com/aba3557d-f373-4f43-9325-c932c90dfc61 Добрый день. подскажите, как корректно пронумеровать строки внутри каждого окна, у меня партиция как будто продолжилась на все элементы
-
К тому же BINARY_CHECKSUM 32-битное целое возвращает. Спросил, вдруг существует еще какой-то способ быстрого сравнения данных SQL и КХ
-
Добрый день!
Можно ли пользоваться Live View ? В документации давно уже помечено как Experimental т.е. есть какие то ограничения где про них узнать? Есть ли планы по переводу фичи в Production ?CREATE VIEW | ClickHouse DocsCreates a new view. Views can be normal, materialized, live, and window (live view and window view are experimental features).
-
выгрузить в CSV
https://stackoverflow.com/questions/425379/how-to-export-data-as-csv-format-from-sql-server-using-sqlcmd
https://clickhouse.com/docs/en/sql-reference/formats/#csv
и посчитать контрольные суммы файлов
только выгружать надо чтобы был одинаковый ORDER BY
и одинаковый формат. чтобы кавычки там всякие и десятичные знаки совпадалиHow to export data as CSV format from SQL Server using sqlcmd?I can quite easily dump data into a text file such as: sqlcmd -S myServer -d myDB -E -Q "select col1, col2, col3 from SomeTable" -o "MyData.txt" However, I have looked at the help files for
-
Подскажите как правильно тип поля объявить. Заливаю json. в нем есть поле tags в котором список значений. Но может быть пустым.
т.е варианты:
"tags": []
"tags": [{"id": "string_value", "name": "string_value"}]
объявил поле так
tags Array(Tuple(id Nullable(String), name Nullable(String)))
но что то на пустом списке не взлетает
DB::Exception: Unknown field found while parsing JSONEachRow format: tags: (at row 1) -
непонятно задача описана, окно это и есть группировка с сортировкой, у вас в примере закомментирован неясный результат. подробнее опишите. ну либо я не понял
-
Нужно, чтобы были выбраны первые строки, для каждого блока с единым WID, но их может быть несколько и они могут быть расположены не по порядку (сортировка по времени), в таком случае считаем его новым блоком (окном) и нумеруем строки снова. Сейчас при появлении того же WID не подряд, нумерация строк продолжается.
-
Если подстраиваться под ваше итоговое видение, то у вас блок должен быть не WID скорее всего, а WID+что-то еще, чтобы получить несколько разных значений ts для WID
-
Вы задачу не правильно решаете, вам надо из подряд идущих одинаковых WID оставить первый ?
-
-
Да
-
То есть вы реально думаете что 7500 участников из Yandex'a ?))) Не удивлён почему произошёл слив :)))
-
Добрый день!
-
При инсерте в таблицу КХ начал выдавать ошибку Cannot open file /var/lib/clickhouse/store/c11/.../field.null.mrk2, errno: 1, strerror: Operation not permitted.
Даже не знаю в какую сторону копать. Вроде ничего не меняли в структуре таблицы. Ошибку выдает на поля которые не перечислены в insert -
-
-
нужно из подряд идущих одинаковых WID оставить первый
-
Нашел изменения. В конфиг файле users.xml добавили настройку join_use_nulls, может из-за этого с правами что-то случилось:
<profiles>
<default>
...
<join_use_nulls>1</join_use_null>
</default>
...
</profiles> -
у меня получается сам массив может быть пустой, а не поля в нем с пустыми значениями. То есть что то такое должно быть
tags Array(Nullable(Tuple(id String, name String)))
но так не дает, пишет Nested type Tuple(id String, name String) cannot be inside Nullable type. -
Всем привет, подскажите, можно ли как-то обратиться к внутреннему id строки? Нужен какой-то аналог ораклового rowid
-
Всем 👋 Кто-то имел практику построения миграций данных с MS SQL на ClickHouse? Какие решения наиболее эффективно работают в таком подходе?
-
ну в оконных функциях есть row_number() https://clickhouse.com/docs/en/sql-reference/window-functions/#functions. Еще есть https://clickhouse.com/docs/en/sql-reference/functions/other-functions/#rownumberinblock но я не думаю что это хорошая идея полагаться на номера строк, тк они привязаны к блокам -> поэтому они могут меняться.Window Functions | ClickHouse Docs
ClickHouse supports the standard grammar for defining windows and window functions. The following features are currently supported:
-
Добрый день! Всегда считала, что справочники лучше делать словарями, но тут в чатике прочитала, что если справочник маленький (ок 100 строк), то join выгоднее. Посоветуйте, плз, как же все-таки правильнее? Есть ли какие-то объективные критерии? Спасибо!
-
Мне как раз не row_number нужен. У меня задублились строки и нужно удалить дубликаты, а уникального id в таблице нет
-
Если кому-то интересно), решили проблему перезагрузкой антивируса...
-
Подскажите еще вопрос. Как работает insert? Я работаю с обычным кликхаусом через dbeaver, делаю insert, но падает по таймауту, но данные через какое-то время вставляются, но с дублями. Где искать причину? И как отлавливать и убивать запросы в облачном ClickHouse?
-
https://clickhouse.com/docs/ru/sql-reference/statements/optimize/
OPTIMIZE TABLE table DEDUPLICATE; -
Спасибо!
-
-
Привет! Подскажите, есть ли какая-то функция позволяющая по ip получать регион пользователя?
-
Скорее всего запрос отпал по клиентскому тайм-ауту, а на сервере запрос продолжил выполняться, увеличьте тайм-аут в настройках драйвера dbeaver, по умолчанию там 300 сек
-
берёте базу geoip, создаёте словарь iptrie (https://clickhouse.com/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout#ip-trie) и получаете гео через dictGet()
-
поменял на минуту, но отваливается с ошибкой "failed to respond" через 43 сек
-
Можно ли сеттинги во вьюшки сделать необязательными?
Я делаю параметризованные view, и приходится везде прокидывать сеттинг, иногда просто null кидаю если это необязательный, а хотелось бы что то типа
getSettingOrNull(‘custom_my_setting’)
Или есть возможность переопределить setting записанный внутри view? -
смотрите что в логах кх, какую настройку меняли в клиенте?
-
Socket timeout
-
Подскажите, где логи смотреть
-
/var/log/clickhouse-server/clickhouse-server.err.log
-
Так у меня ж обычный
-
Добрый день. При запросе к КХ через ClickHouse Connect Driver API получаю ошибку clickhouse_connect.driver.exceptions.DatabaseError: :HTTPDriver for .. returned response code 500)
Code: 358. DB::Exception: INTO OUTFILE is not allowed. (INTO_OUTFILE_NOT_ALLOWED) (version 22.8.5.29 (official build)). Хочу выгрузить данные в файл csv. правильно понимаю, что настройка выгрузки не включена на сервере? -
https://github.com/ClickHouse/ClickHouse/issues/2326 Вроде бы INTO OUTFILE рабоает только в нативном clickhouse-clientError: INTO OUTFILE is not allowed · Issue #2326 · ClickHouse/ClickHouse
Hello dier support. When I am doing some query, I am receiving Error: INTO OUTFILE is not allowed echo "SELECT * from test.\stats` where date = '2018-05-04' INTO OUTFILE &a...
-
Благодарю, через clickhouse-client это работает
-
-
-
alter table реплицируется во все реплики шарда. Если нужно на все шарды то нужно on cluster.
Ну и в where вы должны прописать условия удаления.
Или вы просто хотите удалить данные? -
Alter table tbl on cluster 'cluster' delete where x=y
-
Я об этом delete: https://clickhouse.com/docs/en/sql-reference/statements/delete/DELETE Statement | ClickHouse Docs
Lightweight deletes simplify the process of deleting data from the database.
-
Этот тоже поддерживает on cluster, скиньте что написали
-
delete from <table> on cluster <cluster> where <condition>
-
-
смотрите changelog и issues, тесты накатывайте на окружение тестовое если оно у вас есть
-
Привет всем кто может подсказать как работать правильно с настройкой x-dead-letter-exchange в RabbitMQ Engine табличке?
-
создаю таблицу вот так
CREATE TABLE IF NOT EXISTS event.rabbitmq_entry
(
`timestamp` UInt64,
`id` UInt32,
`body` String
) ENGINE = RabbitMQ SETTINGS
rabbitmq_host_port = 'rabbitmq:5672',
rabbitmq_exchange_name = 'clickhouse-exchange',
rabbitmq_routing_key_list = 'myqueue',
rabbitmq_queue_base = 'event_rabbitmq_entry',
rabbitmq_format = 'JSONEachRow',
rabbitmq_exchange_type = 'fanout',
rabbitmq_num_consumers = 1,
rabbitmq_queue_settings_list = 'x-dead-letter-exchange=admin-error-logs'
; -
Если дропнуть вьюху и кафку движок, и потом пересоздать, оно с тех же оффсетов читает?
-
Если консьюмер группа та же
-
С тех же
-
Нет не нормальная