- 01 January 2022 (38 messages)
-
А как получить
ch-bench-rust 1,44s user 0,77s system 108% cpu 2,033 total
? -
-
"Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz"
linux 5.11.0-43-generic
cargo build —release
time target/release/ch-bench-rust
Rows: 500000000
target/release/ch-bench-rust 1,12s user 0,67s system 109% cpu 1,634 total
time ./ch-bench-faster
1.062s 500000000 rows 4.0 GB 3.8 GB/s
./ch-bench-faster 0,23s user 0,53s system 70% cpu 1,068 total
Rust драйвер достаточно неплохо написан, так что тут ничего удивительного нет. Думаю, что на запись он тоже не плох, исторически пользуемся Go либой на запись и ее пока хватает, когда упремся будем смотреть на Rust -
Лови Растамана!
-
Может дело в Intel/AMD, магия какая-то
-
-
А у вас на арме?
-
AMD Ryzen 9 5950X
-
-
-
root@intel-bench:~# hyperfine ch-bench-rust ch-bench-faster
Benchmark 1: ch-bench-rust
Time (mean ± σ): 5.309 s ± 1.845 s [User: 4.852 s, System: 0.727 s]
Range (min … max): 2.055 s … 8.683 s 10 runs
Benchmark 2: ch-bench-faster
Time (mean ± σ): 1.435 s ± 0.138 s [User: 0.364 s, System: 0.767 s]
Range (min … max): 1.122 s … 1.588 s 10 runs
Summary
'ch-bench-faster' ran
3.70 ± 1.33 times faster than 'ch-bench-rust'
UPD: на EPYC
hyperfine ch-bench-rust ch-bench-faster
Benchmark 1: ch-bench-rust
Time (mean ± σ): 3.949 s ± 1.324 s [User: 2.133 s, System: 2.188 s]
Range (min … max): 2.672 s … 6.198 s 10 runs
Benchmark 2: ch-bench-faster
Time (mean ± σ): 2.020 s ± 0.091 s [User: 0.348 s, System: 1.399 s]
Range (min … max): 1.893 s … 2.225 s 10 runs
Summary
'ch-bench-faster' ran
1.95 ± 0.66 times faster than 'ch-bench-rust'
Прикольно растовый код работает конечно, каждый раз сюрприз -
вариативность интригует ночень
-
-
-
-
-
-
-
-
-
-
-
native должен учитывать amd/intel
-
-
На запись совсем честный бенч у меня не получится сделать, т.к. в оф. драйвере совмещена сериализация и наполнение данных.
Но если взять CREATE TABLE test_table (id UInt64) ENGINE = Null:
947ms 500000000 rows 4.0 GB 4.2 GB/s
vs
4.057s 500000000 rows 4.0 GB 986 MB/s
hyperfine:
hyperfine ch-write-bench-official ch-write-bench-faster
Benchmark 1: ch-write-bench-official
Time (mean ± σ): 3.998 s ± 0.109 s [User: 2.767 s, System: 1.244 s]
Range (min … max): 3.902 s … 4.228 s 10 runs
Benchmark 2: ch-write-bench-faster
Time (mean ± σ): 1.103 s ± 0.166 s [User: 0.399 s, System: 0.559 s]
Range (min … max): 0.874 s … 1.379 s 10 runs
Summary
'ch-write-bench-faster' ran
3.62 ± 0.56 times faster than 'ch-write-bench-official'
Т.е. на сериализацию разница есть, её не может не быть. -
Ага, я посмотрел бенчмарки, вы их с какой целью делаете?)) Если чтоб просто сделать таблицу с тестами - норм, но вы сравниваете разное и получаете, внезапно, разные результаты. У вас сериализация ровно такая же как и в любой другой реализации нативного протокола на Go, так что особой разницы +- вы не увидите. Есть оверхед на интерфейс совместимости с database/sql, но в плане записи он не сильно критичен, а на чтение оно и не особо нужно в перфомансе (за очень редким исключением). Те в плане бенчмарков можно поставить точку. В том что у вас есть описание нативного формата это огромный плюс для всех, в том числе и для реализции новых драйверов (не все хотят код КХ для этого читать). Думаю, если она повится в каком-то читабельном виде, то ее можно будет поместить на https://clickhouse.com/. Если нужна помощь с техписами, то, при наличии доки, ее можно будет тут найти, и ее помогут превратить в читабельный формат.
Дальше нужно чтоб API у библиотеки был юзабельным, с этим нужно работать, сейчас у вас просто кусок кода который позволяет создать блок с данными и позволяет его пушнуть на сервер. Этим не удобно пользоваться, у database/sql отличный интерфейс, но реализация сильно так себе, можно его и принять за основу. Хороший пример pgx (https://github.com/jackc/pgx) -
Я делаю бенчмарки на оверхед клиента. У нас получилось свести его в ноль благодаря оптимальной архитектуре.
У меня сериализация не такая же как и в любой другой реализации нативного протокола на Go, так как там используется прямая работа с памятью, как и в Rust. Если бы вы посмотрели код, для вас это было бы очевидно.
На микробенчмарках она выигрывает в 60-100 раз, на практике, конечно, все упирается в другое.
По поводу эргономики: не уверен, что блочная вставка через оф. клиент и через ch отличается, тут скорее удобнее с ch работать (на мой вкус). -
https://github.com/go-faster/ch/pull/11
Вот тут можно посмотреть, насколько сериализация отличается. Там как раз результаты benchstat в шапке:
ColFixedStr_EncodeColumn-32 72.5GB/s ± 2% 72.9GB/s ± 0% ~ (p=0.310 n=5+5)
ColFloat32_EncodeColumn-32 6.73GB/s ± 2% 67.61GB/s ± 1% +904.19% (p=0.008 n=5+5)
ColFloat64_EncodeColumn-32 11.2GB/s ± 2% 70.3GB/s ± 0% +525.84% (p=0.008 n=5+5)
ColInt128_EncodeColumn-32 6.57GB/s ± 2% 70.54GB/s ± 1% +974.23% (p=0.008 n=5+5)
ColInt16_EncodeColumn-32 2.98GB/s ± 2% 61.46GB/s ± 1% +1963.38% (p=0.008 n=5+5)
ColInt256_EncodeColumn-32 10.3GB/s ± 5% 46.6GB/s ± 1% +350.56% (p=0.008 n=5+5)
ColInt32_EncodeColumn-32 5.80GB/s ± 2% 67.62GB/s ± 2% +1065.42% (p=0.008 n=5+5)
ColInt64_EncodeColumn-32 11.2GB/s ± 1% 70.2GB/s ± 1% +524.41% (p=0.008 n=5+5)
ColInt8_EncodeColumn-32 1.88GB/s ± 5% 54.23GB/s ± 1% +2778.57% (p=0.008 n=5+5)feat(proto): optimize encoding by ernado · Pull Request #11 · go-faster/chname old time/op new time/op delta ColBool_Raw_EncodeColumn-32 701ns ± 1% 702ns ± 0% ~ (p=0.635 n=5+5) ClientHello_Encode-32 34.5ns ...
-
-
Вообще изначально я радовался новым фичам в клиенте (типа DateTime64, open telemetry, проброс прогресса/логов/событий профайлера с сервера), а скорость это так, побочный продукт уже, мы просто увидели что можно ещё быстрее сделать
Допишу доки, насчёт API как раз думаю, как его улучшить. Дженерики тут сильно помогут для всяких сложных вещей вроде Low cardinality, Map, Nullable, Array и т.д. -
-
Мы не искали, но как раз в этом году появляется задача, где можно допилить драйвер тоже
-
-
-
А так не получится, к сожалению, clickhouse-go нужно поддерживать. Тут, скорее, в обратную сторону лучше;)
-
-
Возможно имеет смысл в clickhouse-go разработать высокоуровневый слой над ch, обратно совместимо для database/sql это возможно сделать.
Но это уже не мне решать, наверное. go-faster/ch я в любом случае буду поддерживать, он используется в довольно критичных местах. -
- 02 January 2022 (32 messages)
-
-
engine = PostgreSQL - это не полноценная таблица, а прокси, который делает запросы к pg по его протоколу. Она ничего не знает о событиях в pg.
Если вам нужны именно события, то ваш выбор MaterializedPostgreSQL. Там все иначе - КХ работает членом pg кластера и получает апдейты через WAL. Тут есть шанс применить MV -
-
О, materializedpsql убрали тег experimental.
-
И я бы задался вопросом, какие изменения. Т к materialized view только про инсерты
-
-
я пока не пробовал - самому интересно что там будет прилетать (и будет ли вобще тригериться MV). но по задумке там скорее всего можно и апдейты получить. Это же WAL, который транслируется в события для ArrgeratingMT. Так что некоторые инсерты будут похожи на апдейты :)
-
Joined.
-
hello
-
I would like to ask a question if possible, how can we change the server time of clickhouse to GMT+3 ?
-
На каком языке лучше документация? Вроде замечал какие-то отличия между русской и английской. На каком более полная, свежая?
-
Я хотел бы задать вопрос, если можно, как мы можем изменить время сервера clickhouse на GMT + 3?
-
You can change option <timezone>Europe/Moscow</timezone> in confg.xml if you have access to it.
-
На английском более полная, чем на русском.
-
спасибо
-
Бывает и на китайском больше описано. Например про bitmap
-
это интересно) спасибо
-
ok , thank you very much.
-
also I would like to join the slack channel but couldnt login to that
-
ClickHouse
ClickHouse DBMS discuss and help
-
will do , thank you very much
-
/stat
-
-
На английском, но могут быть отличия в разных языках, так как приносят контрибьюторы.
И altinity документация очень полезная! -
Здравствуйте. Запустил по мануалу CH в докере на wsl2. Это нормальная постоянная загрузка ЦП?
-
А скок у вас цпу и какая версия кх
-
image yandex/clickhouse-server
4 ядра core i-5 2.5 GHz -
Таблиц много?
-
чистая установка, стартовал ничего не добавлял, запросы не выполнял
-
asynchronous_metrics_update_period_s
flush_interval_milliseconds
https://github.com/ClickHouse/ClickHouse/issues/29053#issuecomment-921872518
ПопробуйтеSometimes got big iowait after upgrade to 21.8 · Issue #29053 · ClickHouse/ClickHouseprev version 21.3 current version 21.8 after upgrading sometimes get big cpu iowait time example: image try to set asynchronous_metrics_update_period_s=60 but its doesnt help
-
-
Я бы начал с docker status
А так же можно зайти внутрь и там htop, либо глянуть аналоги, которые в образе можно использовать
Далее почитать логи CH - 03 January 2022 (70 messages)
-
Ребята, может немного не в тему. Посоветуйте базу для работы с деньгами, транзакциями (хранение денег в системе, переводы между кошельками). Требования:
- ACID (особо важна атомарность, изоляция)
- Максимальная надёжность
- Возможность шардить
- Нагрузка около 1к операций в секунду с таблицей
На данный момент для этого используем Mysql, теоретически должен выполнять задачу свою, тем более опыт с ним есть. Возможно какие-то есть ещё решения, который могут быть использованы в данном кейсе, о которых мы не знаем. -
clickhouse - аналитическая СУБД, в которой нет ACID и нагрузка в 1k запросов в секунду считается высокой. Оставайтесь на mysql или переходите на postgress. Для транзакций.
Однако поток транзакций можно отвести в сторону, в другую базу, чтобы делать там аналитические запросы - запросы, которые затрагивают большое количество записей, например вычисление top100 самых активных кошельков за год. Такой запрос убьет mysql, а чтобы оно работало в postgress вам нужен очень продвинутый dba. Тут КХ вам поможет. Но не вместо транзакционной базы, а вместе с ней. Придется обслуживать два отдельных кластера. -
xtdb :)
-
Ну и еще вариант: если аналитика не динамическая (считаем всегда одно и тоже) то можно считать с помощью всяких там kafka streams к примеру
-
1000 tps это небольшая нагиузка для mysql
Для шардинга возьмите vitess.io
И не слушайте тех кто будет агитировпть за постгрю
Это просто пропаганда из зависти что Моську продали два раза -
Всем спасибо за советы
-
Вы какой уровень изоляции используете? 1к ТПС без шардирования на serializable уже будет на грани, кмк. Поэтому сразу думайте, как будете расширяться (vytess).
-
А использовать repeatable read для денег я бы побоялся.
-
а как шардирование дружит с атомарными транзакциями?
-
Я думаю витес просто форвардит по ключу.
-
Да, но не факт, что он serializable поддерживает?
-
Я бы лично не рисковал использовать Vitess для денег, но я и не настоящий сварщик и вообще это же правда оффтопик
-
-
-
А чем Citus очень кривой? Вроде Microsoft его как-то в своём облаке юзает. Можно где-то почитать о его кривости?
Для аналитики вроде больше Greenplum упоминают, в Citus есть колоночный движок, но я не знаю, насколько оно там всё хорошо работает, т.к. не пробовал.
Когда настолько везёт, что данные умещаются на один сервер, действительно лучше использовать один сервер.
Причем умещаются они даже у LetsEncrypt: https://letsencrypt.org/2021/01/21/next-gen-database-servers.html
Просто взяли сервера с 2ТБ памяти. -
-
Насколько я понимаю, под задачу нужна OLTP, а не OLAP, но опыт в принципе универсалный.
То что он разваливася и сбоил это грустно, мы в своем тесте так и не дошли до Citus, остановившись на монге (нам она как раз подошла под OLTP, но там не было вещей вроде биллинга).
У меня оставалась надежда, что хоть с Citus все более-менее нормально. -
Есть https://github.com/yugabyte/yugabyte-db. Они сильно интереснее чем Citus. Но шардированная реплицируемая БД с транзакциями это очень много компромиссов и зачастую это мало кому реально нужноGitHub - yugabyte/yugabyte-db: The high-performance distributed SQL database for global, internet-scale apps.
The high-performance distributed SQL database for global, internet-scale apps. - GitHub - yugabyte/yugabyte-db: The high-performance distributed SQL database for global, internet-scale apps.
-
Югабайт (Кальвин) заставит делать транзакции предсказуемыми, т.е. интерактивного выяснения, что там лежит прежде чем модифицировать не получится.
-
Calvin использует FaunaDB, внутри YugaByte идеи Спаннера: http://dbmsmusings.blogspot.com/2018/09/newsql-database-systems-are-failing-to.htmlNewSQL database systems are failing to guarantee consistency, and I blame Spanner
(Spanner vs. Calvin, Part 2) [TL;DR I wrote a post in 2017 that discussed Spanner vs. Calvin that focused on performance differences. Th...
-
Ну собственно также как и CockroachDB, TiDB и FoundationDB, хотя они все немного разные, и я лично ни одну из бы не юзал для денег :))
-
Виноват.
-
-
Ну стоит отметить, что вроде цитус улучшали относительно недавно.
Но раньше он действительно был на любителя -
Добрый день. Не подскажете, есть ли способ вернуть определенное количество записей, где сумма значений поля составляет определенный процент от суммы этого поля по всем записям?
-
Две оконки
Одна считает кумулятивную сумму, вторая просто сумму по всем элементам.
В внешнем подзапросе сделать WHERE cum_sum < sum*percent -
мужики никто не знает как адекватно пагинацию сделать? с where id > n fetch first rows будет нормально работать в кх?
-
LIMIT | ClickHouse Documentation
LIMIT Clause LIMIT m allows to select the first m rows from the result. LIMIT n, m allows to select the m rows from the
-
а с какой версией цитуса работали?
-
Не очень совет
Чем больше страница тем больше данных обрабатывается перед отдачей -
where id > xxx limit page_size
-
спс попробую
-
Насколько я помню с 5-й
-
Всех с новым годом!
Подскажите есть какие-то хорощие практики CH как бить запрос для большой вставки которая не влезает в память
INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...
Результирующая таблица ReplicatedAggregatingMergeTree -
Performance | ClickHouse Documentation
Performance According to internal testing results at Yandex, ClickHouse shows the best performance (both the highest thr
-
Это же про перворманс, обычные вставки нет проблем делать. Мне нужно большую таблицу пересобрать как-то
-
ну так делаете или таким же образом как обычные вставки, написав скрипт, или через buffer таблицы, или через дополнительные утилиты по типу clickhouse-bulk, емнип
-
-
Мне кажется вы мне маленько про противоположное. Мне не маленькие запросы нужно склеить, мне большой разбить. Вот как это сделать лучше не понятно, не с offset’ом же по запросу ходить
-
а что в select? Случайно не group by/join? Может там проблема?
-
GROUP BY messageId
-
я вам и говорю про решения проблемы с большим запросом вставки из одной таблицы в другую
-
-
Так а как там buffer и ch-bulk взяжутся, может я чего-то не понимаю
-
Вставлять данные без группировки и ждать когда их схлопнет разве хорошая идея?
-
попробуйте
set max_bytes_before_external_group_by='4G'
max_threads=1
а buffer тут конечно ничем не поможет. -
запись просядет
-
-
-
-
-
-
мы не знаем сколько весит изначальная таблица, сколько оперативки у него на машине, поэтому тут очень много вариантов решения проблем, но каждая со своими изъянами :)
-
Да похоже то что нужно, спасибо
-
Еще один уточняющий вопрос, зачем здесь max_threads=1
-
-
Все благодаря мистеру Фрэнку Стивену, который научил меня, как зарабатывать прибыль с небольшим капиталом в 650 евро. Я получил обратно 12500 евро всего за 48 часов торговли. Свяжитесь с ним и поблагодарите меня позже, после получения прибыли. Нажмите на ссылку ниже, чтобы начать зарабатывать как можно скорее. как можно
https://t.me/+igRmPHZRhQdkZWE0 -
Примного благодарен 🙏
-
Можно разбивать на несколько батчей через хэш + остаток от деления
cityHash64(message_id) % 10 = 0(1, 2...9) 10 раз -
В новых версиях ок,
Кх там делать optimize_on_insert и схлопывает блоками по 1 млн строк -
Интересный вариант =)
Только нужно понимать на сколько батчей бить -
Спасибо и вам, тоже полезно
-
Привет! А никто под М1 в докере кх не запускал? ругается ё
-
-
-
а он не должен быть aarch64?
-
-
спасибо!
-
а в альтините прм образы как часто обновляются? хочется 21.11.5 , только самому собрать?
-
Может странноватый вопрос;) Как понять что CH не запущен в кластере?
Только так?
select * from system.clusters
where cluster not like 'test_cluster%' and cluster not like 'test_shard_%'
and cluster != 'test_unavailable_shard'
-- или так
select * from system.clusters
where host_name != 'localhost' and host_name not like '127.0.0.%'
Поставил тестовую ноду из коробки и вижу в таблице clusters записи... - 04 January 2022 (239 messages)
-
-
-
-
-
-
-
мда уж
-
Межядерные взаимодействия слишком велики, вестимо. Используйте третье поколение :)
Ну или проблема не в кукурузене -
Да остальные клиенты то нормально работают
-
-
-
Ну дык это не удивительно. Вы бы если посмотрели бенчмарки старых поколений, то увидели бы много интересного - на каком нибудь условном Си, го и многих других он готов пошатать трубу интела, а как дело доходило до пэхэпе или пайтона - беда
-
Ну правда там просадка не супер сильная, но всё же явно видна
-
-
О, тогда вряд-ли дело в кукурузене
-
попробуйте раст фронтенд для gcc
-
Здравствуйте. Получаю unmerged парты через этот запрос. Целый день не было Инсертов . Но это цифра не уменьшается
-
Добрый день! Подскажите, как грамотно решить ситуацию, когда требуется динамический (и уникальный для каждого запроса) словарь? Например, пусть есть таблица events с колонками UserID, Amount и мы хотим писать что-то вроде SELECT UserNames[UserID], Amount FROM events. Мы навскидку придумали делать временную таблицу (WITH UserNames AS (SELECT 1 as ID, 'Name' as Name UNION ALL SELECT ...)) и джоинить ее. Работает хорошо, но не покидает ощущение, что можно красивее 🙂
-
Одновременно точно не знаю этот запрос получает парты или партиции
-
select count(*) from system.parts where active;
что возвращает -
возвращает парты
-
Это дает 22К
-
-
-
а почему должна уменьшаться?
-
-
-
там только system БД будет добавлять парты(запросы, метрики)
-
вы что-то перепутали, партиция это набор партов, в партицию ничего не мержиться, только парты между собой
-
Denny Crane [Starship Captain at Altinity (NB,Canada)] in ClickHouse не тормозит
Постоянно мержить до одной партиции очень невыгодно. Такой цели вообще не стоит, все совершенно наоборот. Цель иметь минимальное кол-во кусков, при этом делая как можно меньше мержей. Мержи потребляют дичайшее кол-во дисковых и cpu ресурсов. Merges are eventual and may never happen. It depends on the number of inserts that happened after, the number of parts in the partition, size of parts. If the total size of input parts are greater than the maximum part size then they will never be merged.
-
-
отдельных инсертов или строк? нельзя делать 46 инсертов в секунду. Нужно делать 1 инсерт в 10 секунд. Или реже.
-
скорее всего у вас не успевает вставиться всё и накапливается, должны ошибки в логах наваливать
-
То есть каждые 10 секунд зделать батч инсерт ?
-
Там постоянно пишет : <Debug> MemoryTracker: Peak memory usage (for query): 4.05 MiB.
-
именно. Можете по простому воспользоваться engine = Buffer. Можете в своем коде буфферизировать, можете архитектурно что-то добавить типа кафки.
-
-
ничего удивительного при 46 rps по инсертам. "всегда так бывает".
-
А можно перед дистрибутед таблице поставить буфер таблицу? Сам с кх ещё не работал, но планирую начать в ближ время.
-
Всем привет! А final намного медленнее чем под-запрос с "group by ID + argMax" делать в ReplacingMergeTree, или все же в последних версиях КХ мало разницы чувствуется на большом объеме данных?
-
есть ещё один момент что я отключил воркеры . за 24 часа не было инсертов. но размер этой папки не уменьшилось
-
Зависит от ваших данных, тут можно примеры посмотреть https://kb.altinity.com/engines/mergetree-table-engine-family/replacingmergetree/
-
-
чем больше - тем лучше
-
Это не ошибки. Что-то вроде Too many parts/partitions нету?
-
вроде ускорили - проверяйте сами на своих данных. Более того, в последних версиях работает do_not_merge_across_partitions_select_final, что позволяет не заниматься дедубликацией на старых партициях.
-
пожалуйста скажите что это за папка ?
-
Можно, но лучше конечно писать без Distributed
-
раньше было . я увеличил лимит до 3 тысяч
-
Да, но это требует значительных доработок приложения, а это проблема, особенно когда сразу нужен уникальный ключ записи, можно конечно самому генерить, но это все проблемно.
А почему буфер лучше не юзать? -
это внутри дистрибьютед таблицы
-
Так же интересно услышать о новой функциональности, которую недавно добавили, инсертить можно часто. Какие там минусы проблемы? Мне бы вставить, получить уник ключ и забыть, дальше работать в не блок режиме.
-
получить ключ после вставки? аля как в постгресе?
-
Я не писал что Buffer лучше не юзать. Как стартовое решение норм вариант. Но данные можно потерять если сервер ляжет.
-
Да, Я щас подумал что наверно нет такого, слышал что нет уникальных ключей (изучаю пока)
-
Можно подробности?
-
ClickHouse v21.11 Released
We're continuing our monthly release cadence and blog updates at ClickHouse, Inc. The 21.11 release includes asynchronou
-
а еще нет удаления и апдейта (грубо говоря)
-
Да, Я в курсе, есть апдейт, но медленный
-
Ну и обещают улучшить, но не один конечно, но и не надо
-
Так это неинтересно, с тем же успехом можно накапливать инсерты на стороне клиента и вставлять батчем. Те же гарантии консистентности.
-
Мы как замену эластика изучаем
-
для чего?
-
Вот мне как раз интересно что бы не усложнять бек
-
Вы мягкое с тёплым путаете
-
-
ну мож в эластике графики рисовать и всякую статистику по логам к примеру щупать
-
Много букв, хранить попытки атак / скана ресурсов клиентов.
-
Я не путаю ничего
-
а зачем юник кей?
-
Мы юзаем эластик как олап базу
-
Что бы ссылаться из других таблиц
-
ну такое. а потом в кх джойнить?
-
Не обязательно
-
-
Нельзя, данных очень много и нужна быстрая выборка.
-
можете собирать «ключ» из данных например
-
Нужно нормальное шардирование, а не как в пг
-
Что значит быстрая выборка? Вам надо статистику собирать по атакам?
-
Да, я понимаю, сгенерим сами, не проблема, просто сейчас думаю как проще прикрутить кх сбоку к имеющейся системе, что бы потом смотреть и развивать и мб когда то уехать с эластика.
-
если что то типа кафки есть, то я бы просто сбоку прикрутил и собирал данные и пробовал себя в изучении кх
-
Быстрая, это значит до секунды запрос к любым атакам клиента за месяц, например.
-
никто не знает ?
-
Мы так и сделаем, но без Кафки, есть фоновые воркеры которые пишут и очереди.
-
А сколько у него атак в месяц?
-
ну вот и решение. в бою сразу видно будет подойдет или нет
-
Много, разные клиенты, можно считать что сотни млн в месяц, в каждой может быть млны хитов (запросов), атака это "группа"
-
Мы так и планируем, в начале квартала начнем, пока думаем и изучаем.
-
а не думали в реалтайме это все чекать и результаты уже писать?
-
Нет особо результатов, это уже результат, надо просто хранить и на лету делать разные аналит запросы. Щас в эластике как раз стараемся считать в потоке что бы потом быстро выбирать посчитанные, но это не хорошо, это не то.
-
Все что можно посчитать и сгруппировать уже
-
на лету если считать всякие ивенты (в окнах к примеру) - kafka streams. удобно получается. мы вот комбинируем, kafka streams и aggregatingmergetree для подстраховки
-
Мы понимаем, что можно считать считаем, нужна гибкость запросов, нужен кх, эластик не тянет, ну и руководство и мы хотим попробовать кх 😄
-
Ну если система позволяет - то только пробовать)
-
Такой вопрос ещё. Нужна возможность изменить Стейт записи (атаки, хита), типо удаленным отметить. Думал создать таблицу стейтов и джойнить, это ок или есть другой лучший подход?
-
Тут так не принято. В КХ вы делаете большую широкую таблицу, включая в нее все другие связанные таблицы. Посмотрите в документации на тип Nested и примеры таблиц яндекс аналитики. Это позволяет убрать большинство join и делать быстрые выборки и аггрегации. Обычный последовательный ID мешает построению распределенных систем.
-
CollapsingMergeTree к примеру
-
Я понимаю, а что делать если через некоторое время, мне нужно свойство родительской записи (группы поменять), что делать? Апдейтить млрд записей? Вот я не хочу и хочу поменять одну строку. Джойнить особо не придется тк это грубо говоря папки и файлы и я просто выберу сначала папку, потом файлы.
-
Возможно дикий совет, но может подумать о данных с другой стороны?
-
если в режиме "посмотреть", то я бы сделал простенький ELT скрипт, который выкачивает данные из старой системы (джойнит их прямо в ней) и вставляет в КХ. Сразу делал бы широкую таблицу, и батчинг автоматически получится. Запустил бы раз в минуту по крону. А потом уже принимал решения про кафки и прочие.
-
Не получается. Есть запросы к сайту (грубо) и нужно их анализировать и хранить, они объединяются в лог группы.
-
В общем вы серебряную пулю ищите
-
тухлячок чот тут(
-
джойнить даже и не думайте. тут принято вставлять другую запись и как-то группировать. Смотрите на ReplacingMT & AggregatingMT
-
Мы ничего не ищем, мы работаем и решаем свои задачи. 😄
-
Да, Я читал про них, вообщем то я хотел сделать тоже самое, но руками, да видимо будем юзать их.
-
вставите новую версию. Не проблема. Тут основная идея - иммутабельность данных. У вас лежат данные, никогда не меняются, понихоньку накапливаются, вы по ним делаете выборки и отчеты. Одна из ключевых техник - дедубликация. Так и живем :)
-
Я это все знаю, знаю что такое аналитическая бд, имею большой опыт работы с бд и разработки.
-
Я бы стартанул с того, что бы понять почему и как кх хранит данные и как вытаскивает. И отсюда уже думать как лучше их складывать в Вашем случае. Тоже самое с шардированием, может оно в Вашем случае будет еще хуже чем у пг?
-
А давно эта папка такого размера ? Может у вас левый шард в конфиге кластера раньше был?
-
Я читал все доки и представляю себе все это
-
Меня вот как и Вас поначалу тоже ломало. Потом втянулся 😂
-
Меня не ломает, просто опыта с кх нет ну и в основном опыт с олтп.
-
Я понимаю все особенности и не собираюсь идти со своим уставом, буду советоваться и изучать.
-
я не собирал эту систему с нуля - может быть до меня кто то подключил левый шард. Просто мне нужно знать что это за папка - удалить или оставить
-
Иногда, кстати, если очень нужны джойны и таблицы легко влезают в память, можно рассмотреть использование словарей
-
Или Join движка
-
Но для наилучшей производительности лучше делать так, как советуют и использовать ReplacingMergeTree или аналоги и иметь широкую таблицу со всей нужной инфой. Иногда это нецелесообразно, тогда смотрите совет про словари выше
-
в память не влезает SELECT
потому что видимо у вас там большой GROUP BY и ORDER BY в придачу?
если нет, то должно влезать
сколько у вас памяти? -
выглядит как output папка для distributed таблицы c данными которые не попали в сервер
-
вы в кубере пытаетесь запустить ваш кластер?
-
да кластер работает кубере
-
папка конкретно где находится?
полный путь покажите -
внутри его .bin файлы есть .последняя дата изменения этой папки 27 сентября
-
внутри папки дистрибьютед таблицы
-
data/{database name}/{table name}/
-
ну у вас 69 гигов не скинутых .bin файлов в distributed таблице, в underlying таблицу
в хост с названием
chi-clickhouse-digitalks-0-0
это имя kubernetes service -
этот файл есть у каждого шарда
-
расшарьте
SHOW CREATE TABLE {database name}/{table name} -
долго выполняется
-
можете на сервер зайти и посмотреть
/var/lib/clickhouse/medatata/dmp/event_logs.sql ? -
там DDL таблицы
-
-
SELECT create_table_query, hostName() h FROM cluster('all-sharded', system.tables) WHERE database='dmp' AND name=`event_logs_local
-
Локальные таблицы у меня MergeTree
-
CREATE TABLE dmp.event_logs_local (user_id UUID, pixel_id UUID, new_user UInt8, ip IPv4, time DateTime, headers String, browser String, browser_major String, os String, os_major String, device String, city String, city_id UInt64, country String, country_id UInt64, country_iso String, time_zone String, longitude Float64, latitude Float64, data String, page_url Nullable(String), view UInt8 DEFAULT 0) ENGINE = MergeTree PARTITION BY (pixel_id, toYYYYMMDD(time)) PRIMARY KEY cityHash64(user_id) ORDER BY cityHash64(user_id) SAMPLE BY cityHash64(user_id) SETTINGS index_granularity = 8192
-
>раньше было . я увеличил лимит до 3 тысяч
PARTITION BY (pixel_id, toYYYYMMDD(time)) - кажется вам сюда стоит обратить внимание -
не имею большого опыта с КХ . подскажите пожалуйста какие проблемы могут быть с таким партиционированием ? и по какому ключу лучше было бы это зделать ?
-
каждая партиция - отдельная папка, в ней по 2 файла на каждую колонку, с таким мелким партиционириванием у вас будет миллиард маленьких файлов
- сервер будет очень медленно стартовать
- сжатие данных около нулевое получите
- чтение будет тормозить, у вас по сути надо всегда random read делать чтобы что-то прочитать
в какой-то момент у вас всё станет колом и вы не запустите сервер
если не разбираетесь - самый популярный вариант PARTITION BY toYYYYMM(time)
а какие запросы планируете делать? -
происходит то что описываете вы . некоторые шарды стартуютса очень медленно . SELECT запросы тоже медленно выполняются
если делать ALTER TABLE и менять PARTITION BY . тогда КХ будет заново партиционировать уже умеющие парты ? или это будет относиться к новым данным ? -
есть одно что - количество pixel_id не очень много . максимум 200
-
нельзя поменять PARTITION BY, создаёте правильную таблицу, переливаете данные и меняете их местами
-
ну это не так плохо, а сколько дат уже есть?
-
от сентября до сегодняшного числа . 2021.09.01 - 2022.01.04
-
понятно это спасибо большое
-
уже много получается, ~25000 партиций, лучше до 1000 иметь(в зависимости от вашего железа может быть и меньше)
-
select count(*) from system.parts where active;
дает 22 917
это один из шардов . количество данных у них почти равно -
всеравно плохо)
видимо каких-то pixel_id не было в какую-то дату -
пароль для default пользователя не меняли?
-
кривая схема данных (кривой PARTITION BY)
и изменение константы вместо того чтобы понять что она значит...
сейчас у вас будет никакая производительность в итоге
судя по всему при вставке в distributed таблицу у вас ноды между собой не могут связаться для того чтобы в MergeTree таблицу данные передать...
у вас с одной ноды на другую с default пользователем позволяет коннектиться?
зайдите в контейнер kubectl exec -n clickhouse ... -- clickhouse-client -
-
не менял
-
SELECT у меня чаще бывают именно с условием pixel_id и с датой
-
зайдите внутрь pod
смотрите логи /var/log/clickhouse-server/clickhouse-server.log -
-
так почему бы в ORDER BY не поставить pixel_id на первое место? зачем вам там cityHash64(user_id)? и зачем вам SAMPLE?
-
а там разве не старые данные лежат в дистрибьютед папке?, больше похоже на то что раньше в сентябре криво было настроено а сейчас это уже пофикшено и просто остались старые данные
-
Други, тут такое дело. ПО ОЧЕНЬ НЕ ПРОВЕРЕННОЙ информации:
если запускать CH на амазоне то как будто на 10-15% медленнее работают запросы по сравнению если собрать CH из исходников грепнув clickhouse на clownseeds (или любое 10 символьное значение)
конспирологи спрашивают может ли быть такое что AWS тормозит специально. или это всё брихня? -
@milovidov_an такое возможно?
-
-
Type Conversion | ClickHouse Documentation
Type Conversion Functions Common Issues of Numeric Conversions When you convert a value from one to another data type, y
-
-
Очень маловероятно, но проверить просто.
Берете ec2 инстанс, собираете два билда и сравниваете скорость. -
вроде как конспиролог это проделал, я хотел мнение общества (сам я пользователь не админ)
-
Ну пусть этот конспиролог по этапам все действия распишет и создаст issue на github с результатами, тогда с этим уже можно будет работать.
Может он собрал с включенным AVX512, а в мастере вроде отключено
https://github.com/ClickHouse/ClickHouse/pull/30014add x86 feature avx2/avx512 support for accelerating filter operation by jinjunzh · Pull Request #30014 · ClickHouse/ClickHouseCo-authored-by: @vesslanjin jun.i.jin@intel.com Changelog category (leave one): Performance Improvement Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md...
-
так и форварду
-
чтобы давало +15%?
-
Test Baseline optimized perf improvement
Q1 14.13ms 12.40ms 12.2%
Q2 11.75ms 9.76ms 10.9% -
тут 2
-
AVX, AVX2, and Enhanced Networking are only available on instances launched with HVM AMIs.
-
Вроде все +- новые (не 10 лет которым) используют HVM AMI
-
пойду трясти конспиролога, пусть оформит
-
а прочему он по дефалту не включён если не секрет?
-
можно собрать версию КХ на максималках :D
-
AVX512 поддерживают только +-новые железки, те далеко не все инсталляции кх смогут использовать.
А автоматический "выбор" алгоритма не был реализован в том пр, поэтому выключили пока.
Плюс машины используемые в CI не умеют в AVX512
> Then we can introduce dynamic dispatching for this code. -
Это всё зделал предыдущий разраб . по user_id тоже делается выборка . как вы говорите это логично - буду попробовать заново создать таблицу перенести данные на него
-
это не реализуется на стадии пакетов?
-
да дата изменения папки именно последний раз был в сентябре
-
Это будет жуткий костыль, люди должны будут выбрать другой пакет и тд.
Все это можно сделать в коде, что бы автоматически работало.
Кое где это уже сделано: https://github.com/ClickHouse/ClickHouse/issues/1017FR: dynamic dispatch of SIMD algorithms to support AVX2/AVX512 · Issue #1017 · ClickHouse/ClickHouseI dived into the code and addressed some SSE optimizations. Well done guys, I appreciate that you delivered and shared such a greate AP system. And I found nothing about AVX optimizations, it is on...
-
в пакетах там разделение только по архитектурам разве нельзя сделать под все железки
-
Суть заключается в слове делать.
Кто то должен это сделать, пока таких желающих не нашлось, а у основной команды кх эта задача не самая приоритетная. -
печаль, приоритет
-
сверьте структуру distributed и mergetree таблицы
судя по всему она у вас не совпадает -
исправил это
-
ну ждите теперь, пока у вас ваши 69 гигов не вставленной даты разъедутся
-
@tron_wai,вопрос относительно user_dn_detection для определения DN для member поиска групп,он же в таком виде подставляется CN=Петров Евгений,ou=… ? или просто идет name ? как вообще увидеть что в {user_dn} ? просто даже если явно вставить верный DN ,то почему-то даже аутентификация не проходит,если сделать пустым,то ошибка not enough,нет прав,что верно,как можно произвести debug подключению к ldap?
-
user_dn_detection обычно нужен для Active Directory - там байндится пользователь по одному DN, а member в группе указан другой (основной) DN. Поэтому и есть этот шаг/функциональность.
Вы уверены, что это актуально для вашего сетапа? Как выглядить типичный bind DN, который вы используете? И как выглядят записи списка пользователей в группах? -
-
-
ну вот вместо того что в примере в документации:
<user_dn_detection>
<base_dn>CN=Users,DC=example,DC=com</base_dn>
<search_filter>(&(objectClass=user)(sAMAccountName={user_name}))</search_filter>
</user_dn_detection>
подставте свое:
<user_dn_detection>
<base_dn>OU=Developers Users,OU=Users,DC=local,DC=com</base_dn>
<search_filter>(&(objectClass=user)(sAMAccountName={user_name}))</search_filter>
</user_dn_detection> -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
да,так и понял
-
Проверьте с помощью https://clickhouse.com/benchmark/hardware/
(ссылка, как сделать бенчмарк - внизу страницы)
А что такое clownseeds?
А зачем собирать ClickHouse? Для сравнения железа надо использовать один бинарник (только готовую сборку).Performance comparison of ClickHouse on various hardwareClickHouse is a fast open-source column-oriented database management system that allows generating analytical data reports in real-time using SQL queries
-
если вы скопируете примеры из документации и только свои изменения внесете по минимуму - все должно сработать. если нет, значит детекшн user_dn возвращает ошибку. Можно тогда попробовать вручную выполнить ldap search идентичный тому, что делает clickhouse
-
попробую да, clownseeds это 10ть знаков замены clickhouse чтобы исключить случайную адресную оптимизацию при компиляции.
-
да,уже сделал, все именно так как в документации,я понимаю,что user_dn_detection находит DN для member по user_name ,что в bind,вижу что в user_dn это длинный обьект записывается,поиск в ldap с этим DN отлично находит нужные группы
-
> я понимаю,что user_dn_detection находит DN для member по user_name
Не находит, а должен находить. Это вам нужно проверить. -
-
-
где ошибка? лог есть?
-
-
проверил,дает нужный DN в ldap поиске,я же говорю,что в фильтре явно указал нужный dn и все равно ошибка
-
есть
-
я не понимаю, там несколько фильтров
-
-
-
-
-
ок,попробую,могу и личную переписку перейти
-
-
надо у windows администраторов запросить будет,чтобы с DC выслали,в случае openldap проблем мы не видели
-
да, там будет видно какой запрос сделал clickhouse при этом user_dn detection, и каким был ответ
-
-
что если подставить вместо {user_dn} - заработает?
-
а если явно вставить user_dn в виде верного DN то ведь тоже должен отработать поиск группы?
-
да (удалив секцию user_dn_detection)
-
так писал,что подставил ,точный DN и ошибка аутентификации,точно такая же если оставить user_dn
-
да,ошибка будет такая же
-
-
как менять таймауты КХ оператора ?
-
@BloodJazMan @unamedrus извиняюсь за беспокойство
-
В смысле выходные? В смысле ночь? У кого-то рабочий день и 21:26 например
-
Понял, извиняюсь
-
а можно закрыть 9000 порт httpшный?
-
Iptables, firewall, редирект
- 05 January 2022 (83 messages)
-
Можно но не будут работать клиент программы
-
-
-
не надо их менять
сначала разберитесь что случиось и почему у во время реконсайла kind: ClickHouseInstallation, name: clickhouse исчез (вы его удалили?) -
он не httpшный
но если вы обратитесь по нему через HTTP протокол, вам вернется HTTP ответ что нибудь типа 400 bad request -
не много памяти это сколько?
-
как именно меряете что память отожралась?
-
если у вас отжирается Page Cache и Buffered то это нормальное поведение и ничего страшного в этом нет
если RSS
надо смотреть
у вас в целом запросы выдают какой нибудь Memory required ошибки? если нет, то нет повода для беспокойства -
40 гб примерно
-
-
Подскажите, можно ли как-то за один проход получить данные о максимальном количестве страниц просмотренных юзером за несколько разных интервалов....
Сейчас делаем несколько запросов:
`SELECT g, max(h) from (SELECT user g, toStartOfMinute(time) v, uniq(page) h from hide.klo WHERE time>=today() group by g,v) group by g
SELECT g, max(h) from (SELECT user g, toStartOfHour(time) v, uniq(page) h from hide.klo WHERE time>=today() group by g,v) group by g`
можно как-то оптимизировать данный процесс? -
Union?
-
Думал может есть вариант без union. В принципе сейчас запросы делает скрипт, который объединяет ответы. Тут задача увеличить скорость (и ради интереса узнать альтернативные варианты запросов)
-
вы сейчас про оперативную память или про что вообще?
"примерно 40" это сколько?
и на остальные вопросы вы не ответили -
Если все данные по которым необходимо получить интервалы находятся в небольшом диапазоне(относительно)
Тогда можно считать их в временную таблицу и потом из неё получить через union необходимые группировки.
Тогда у вас будет только один запрос на чтение данных из Таблицы, а не несколько разных как сейчас -
Добрый день
Подскажите пожалуйста
Хочу делать выборку с много-много строк в where in
Когда без особых настроек отправляю в Clickhouse он ругается, мол http request is too large
Как-то можно быстро и без боли замтавить CH принимать огромные запросы? -
Через POST запрос
-
Можно сделать insert в виртуальную таблицу и потом использовать ее в запросе where in
-
Кто использовал grpc интерфейс в кликхаусе? Были проблемы с ним?
-
потом эту таблицу грохнуть ?
в этом случае там также будет работать group by и order by ? -
Она виртуальная, когда соединение закроете она сама грохнется
Конечно будет работать это же таблица и на неё работает все что можно написать в sql -
можно попробовать group by WITH ROLLUP. Не факт что будет быстрее, но попробовать можно. По крайней мере будет компактнее в коде.
-
отправляйте временную таблицу через POST и сразу используйте её в запросе - https://clickhouse.com/docs/ru/engines/table-engines/special/external-data/Внешние данные для обработки запроса | Документация ClickHouse
Внешние данные для обработки запроса ClickHouse позволяет отправить на сервер данные, необходимые для обработки одного з
-
Спасибо за советы, буду проверять
-
-
всем привет
есть кластер СН из двух нод
на обеих нодах создана:
table A (...) engine = ReplicatedMT
на первой ноде есть таблица К() engine = KafkaEngine и MV для перекачки данных из K в A
есть желание создать table A_agg(...) engine = ReplicatedAggregatingMT,
которая будет заполняться с помощью
matview A_agg_mv to A_agg (...) from A
вопросы:
1. Правильно ли я понимаю, что необходимо и достаточно создавать A_agg_mv только на одной из нод?
2. Есть ли разница, на какой из нод его создавать? (на одной в A вставляет mv из KafkaEngine, на второй - механизм репликации) -
Коллеги, подскажите. я в ДокереКомпозе запускаю КХ
clickhouse_server:
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 362144
image: yandex/clickhouse-server
environment:
CLICKHOUSE_DB: Audit
ports:
- "8123:8123"
- "9000:9000"
volumes:
- ./sql/clickhouse/init.sql:/docker-entrypoint-initdb.d/init.sql
- ./data/clickhouse:/var/lib/clickhouse
- ./data/clickhouse/shm:/dev/shm
- ./data/clickhouse/logs:/var/log/clickhouse-server
networks:
- common-net
когда БД не существует, то все создается нормально, контейнер запускается. а со второго раза получаю ошибку
2022.01.05 11:21:07.621397 [ 58 ] {} <Information> Application: It looks like the process has no CAP_IPC_LOCK capability, binary mlock will be disabled. It could happen due to incorrect ClickHouse package installation. You could resolve the problem manually with 'sudo setcap cap_ipc_lock=+ep /usr/bin/clickhouse'. Note that it will not work on 'nosuid' mounted filesystems.
2022.01.05 11:21:07.627975 [ 58 ] {} <Information> StatusFile: Status file /var/lib/clickhouse/status already exists - unclean restart. Contents:
PID: 58
Started at: 2022-01-05 11:18:47
Revision: 54456
и контейнер НЕ стартует. что я делаю не так? -
-
никак
при выборке из buffer выбираются данные из underlying таблицы -
А как узнать количество данных в буффере ? Мониторить инсерты ?
-
контейнер как стопаете?
-
останавливаю проект dockercompose в Visual studio 2022
-
вы параметры очистки буффера при создании создаете
какую проблему вы решаете?
Buffer теряет данные при рестарте, это by design
можно остановить INSERT
и сделать OPTIMIZE TABLE buffer_table
(есть шанс что это не просто игнор а данные флашнутся, но не уверен что работает в новых версиях) -
А почему тогда бы не использовать стандартный docker контейнер ?
-
ну мне нужно запустить в докер композе несколько контейнеров
-
Windows ?
-
подскажите ссылку откуда брать правильный стандартный контейнер?
-
нет все контейнеры линуховые
-
вообщем у меня задача такая. запустить кх и сразу в нем запустить создание таблицы если она не создана
-
sudo docker run -d --restart=always --name clickhouse_1 \
--ulimit nofile=262144:262144 \
-p 0.0.0.0:8123:8123 -p 0.0.0.0:9000:9000 \
-v путь/log:/var/log/clickhouse-server \
-v путь/data:/var/lib/clickhouse \
-v путь/users.xml:/etc/clickhouse-server/users.xml \
-v путь/config.xml:/etc/clickhouse-server/config.xml \
yandex/clickhouse-server -
и руками каждый раз запускать?
-
а как указать скл который создается при старте?
-
вообще то что вы показали, это не ошибка а просто information
смотрите логи дальше в ./data/clickhouse/logs -
Processing configuration file '/etc/clickhouse-server/config.xml'.
Merging configuration file '/etc/clickhouse-server/config.d/docker_related_config.xml'.
Logging trace to /var/log/clickhouse-server/clickhouse-server.log
Logging errors to /var/log/clickhouse-server/clickhouse-server.err.log
Processing configuration file '/etc/clickhouse-server/config.xml'.
Merging configuration file '/etc/clickhouse-server/config.d/docker_related_config.xml'.
Saved preprocessed configuration to '/var/lib/clickhouse/preprocessed_configs/config.xml'.
Processing configuration file '/etc/clickhouse-server/users.xml'.
Saved preprocessed configuration to '/var/lib/clickhouse/preprocessed_configs/users.xml'.
ClickHouse init process failed.
вот в консоли Докера -
этот файл пустой clickhouse-server.err.log
а вот файл clickhouse-server.log -
и вот он не стартует
-
ClickHouse init process failed.
что у вас вот в этом файле написано?
- ./sql/clickhouse/init.sql:/docker-entrypoint-initdb.d/init.sql -
-
файл выше прикрепил. там просто таблица создается. первый раз при запуске она успешно создается, никаких проблем нет
-
Не смотрел в файл но может сделать IF NOT EXISTS ?)
-
-
внутри написано так
create table if not exists Audit.AuditData
(
Number Int64,
ClientName LowCardinality(String),
ServiceName LowCardinality(String),
OperationName LowCardinality(String),
SenderName String,
SenderRegister String,
ReceiverName String,
ReceiverRegister String null,
IdSender String,
IdReceiver String,
DateTime DateTime64(6),
Amount Decimal(30,18),
PaymentSystem LowCardinality(String),
CurrencyName LowCardinality(String),
BalanceSender Nullable(Decimal(30,18)),
BalanceReceiver Nullable(Decimal(30,18)),
UpdateDateTime DateTime64(6) default now64(6)
) engine = ReplacingMergeTree(UpdateDateTime)
partition by (ClientName, toMonth(DateTime))
order by (ClientName, ServiceName, Number); -
а кто будет делать
CREATE DATABASE IF NOT EXIST Audit ? -
environment:
CLICKHOUSE_DB: Audit
вот эта команда делает. уточню еще раз. у меня таблица создается, проблем нет. после остановки и запуска КХ, он уже НЕ стартует -
Кластер КХ из 4 шардов деплойен на кубере через оператор .
SELECT
host_name,
host_address
FROM system.clusters
дает этот результат.
проблема: каждый шард видит свой IP как 127.0.0.1 -
Это нормально, а в чем у вас проблема
-
Проблема возникает когда выполняется Distributed DDL - отдаёт таймаут
-
-
SELECT
host_name,
host_address,
is_local
FROM system.clusters -
А вот так что покажет?
-
-
но запрос выполняется на всех шардах . проблема в основном в этом
-
There are N unfinished hosts (0 of them are currently active).
"There are N unfinished hosts (0 of them are currently active)."
-
читал, это не решает проблему
-
initialization proccess failed
осталось понять почему
очень странно что у вас clickhouse-server.err.log пустой
не должно такого быть
у вас какая хостовая операционная система? windows ? -
да хост на вин 10, Docker Desktop 4.3.2 (72729) is currently the newest version available. Docker Engine v20.10.11
-
возможно проблема в том что вы volume пробрасываете
для данных
и это все создается через 9p
попробуйте volume для данных не пробрасывать и закоментарить вот это
- ./data/clickhouse:/var/lib/clickhouse
- ./data/clickhouse/shm:/dev/shm -
закочентарил эти 2 строки и Да, работает без проблем. но мне нужно данные сохранять на хост машине
-
теперь появились ошибки 2022.01.05 13:51:41.671957 [ 1 ] {} <Warning> Application: Listen [::]:9004 failed: Poco::Exception. Code: 1000, e.code() = 0, DNS error: EAI: Address family for hostname not supported (version 21.11.3.6 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2022.01.05 13:51:41.673272 [ 1 ] {} <Warning> Application: Listen [::]:9005 failed: Poco::Exception. Code: 1000, e.code() = 0, DNS error: EAI: Address family for hostname not supported (version 21.11.3.6 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host> -
что уж
-
-
-
добавьте
environment:
CLICKHOUSE_DO_NOT_CHOWN: 1 -
вроде бы помогло, спс вам огромное!!!!!!!!!
-
неа. все равно останавливается
-
shm уберите, оно вам вообще не нужно...
-
с опцией CLICKHOUSE_DO_NOT_CHOWN: 1 не запускается и первый раз :(
Necessary directory '/var/lib/clickhouse/tmp/' isn't accessible by user with id '101'
Necessary directory '/var/lib/clickhouse/' isn't accessible by user with id '101' -
знакомлюсь кста
-
кликхаус с тремя нодами настроишь?
-
даш кредитку, она тебе и гео-распределенный-high-availability сделает =)
-
уверен? :))))))))
-
Добрый день! Подскажите, можно ли как-то отключить predicate pushdown для выражений, содержащих обращение к словарям (и оставить для остальных)? Сломались запросы в кейсах, когда словарь есть только на одном сервере
-
Лучше переписать запрос (-ы) так чтобы подзапросом выбиралось с удаленных машин - совсем выключить эквивалент положить сеть и всегда сканить всё
- 06 January 2022 (95 messages)
-
Привет! А какой статус у GRPC интерфейса в Clickhouse, уже Stable ?
-
да
-
вот в том и беда, что в подзапросы пушдаун тоже пролазит: в запросе виде SELECT dictGet(‘users’, ‘name’, t.userId) as userName FROM (SELECT userId FROM events WHERE …) t WHERE userName LIKE ‘ivan%’ условие LIKE вместе с dictGet будет передано на шарды (если events - Distributed таблица)
-
Joined.
-
А если в подзапрос фиктивный лимит?
Если не поможет - то группировка и парамка что-то типа distributed_group_by_no_merge
Ну и с обратной стороны можно зайти - сначала из дикта выковырять ид, и подставить инлайном в global in (...) - если рациональное количество конечно. -
принял, попробуем, спасибо!
-
Подскажите, а как добавить колонку в MatView в БД с Atomic движком? С движком Ordinary это работает, а с Atomic -- нет. Версия ClickHouse — 21.12.3.32.
:) create database test_atomic ENGINE = Atomic;
0 rows in set. Elapsed: 0.003 sec.
:) use test_atomic;
USE test_atomic
0 rows in set. Elapsed: 0.001 sec.
:) CREATE TABLE test (date Date, hour Int8, x Int32) Engine = MergeTree ORDER BY tuple();
Ok.
0 rows in set. Elapsed: 0.005 sec.
:) CREATE MATERIALIZED VIEW mv (date Date, x Int32) ENGINE = SummingMergeTree() ORDER BY tuple() AS SELECT date, sum(x) AS x FROM test GROUP BY date;
Ok.
0 rows in set. Elapsed: 0.009 sec.
:) DETACH VIEW mv;
DETACH VIEW mv
Ok.
0 rows in set. Elapsed: 0.001 sec.
:) show tables
SHOW TABLES
┌─name───────────────────────────────────────────┐
│ .inner_id.21030636-49a4-462c-a103-063649a4262c │
│ test │
└────────────────────────────────────────────────┘
2 rows in set. Elapsed: 0.002 sec.
:) ALTER TABLE ".inner_id.21030636-49a4-462c-a103-063649a4262c" ADD COLUMN y Int32;
Ok.
0 rows in set. Elapsed: 0.004 sec.
:) ATTACH MATERIALIZED VIEW mv (date Date, x Int32, y Int32) ENGINE = SummingMergeTree() ORDER BY tuple() AS SELECT date, sum(x) AS x, 1 AS y FROM test GROUP BY date;
0 rows in set. Elapsed: 0.001 sec.
Received exception from server (version 21.12.3):
Code: 80. DB::Exception: Received from localhost:9000. DB::Exception: Incorrect ATTACH TABLE query for Atomic database engine. Use one of the following queries instead:
1. ATTACH TABLE mv;
2. CREATE TABLE mv <table definition>;
3. ATTACH TABLE mv FROM '/path/to/data/' <table definition>;
4. ATTACH TABLE mv UUID '<uuid>' <table definition>;. (INCORRECT_QUERY) -
-
В целом можно, автор проекций уже с ~апреля использует в продакшене и в целом отзывчиво фиксит баги
-
Звучит многообещающе, спасибо!
-
-
В целом pre-production, но некоторые уже используют в проде пару месяцев.
Наверное через пару месяцев выкатят как продакшен фичу.
А вы новый кластер поднимаете? -
-
лучше всего делать MV вместе с TO dst_table
потом DETACH MATERIALIZED VIEW + ALTER TABLE dst_table ADD COLUMN
и потом делать CREATE OR REPLACE MATERIALIZED VIEW -
Ну если новый, то можете пробовать clickhouse-keeper думаю
-
-
@unamedrus, по этим двум вопросам нет ли каких-либо мыслей?
-
Array(UInt64)?
-
увы, много занимает…
-
можно ещё отсортировать как сам массив, так и колонку
-
-
-
масив уже отсортирован… колонку еще не пробовал
-
-
Мр, а какая версич
-
В целом не отличается для варианта с 1 диском
-
Там же еще можно модификаторы на колонки, как именно хранить, дифами, отрезать лидирующие нули и тд CODEC(LZ4HC) по-умолчанию
-
groupBitmap но тут сложно, может и не поможет
-
21.12.3.32
-
а вот тут не очень понятно, metadata-то в нескольких местах будет … как и данные
-
Метадата в одном месть
-
В общем просто сделайте
Alter table xxx Attach partition from -
Для всех партиций
-
-
-
а вот тут вот?
-
данных местами много с вертики тащить 🙁
-
-
Да, не умеет
-
Ручками в remote servers прописываете
-
-
-
Ну уже сделали автодискавери, так что не за горами все
-
-
Не вспоминай 😂 забудь и живи на светлой стороне.
-
-
OLAP и OLTP обычно это сильно разные задачи, и если КХ Вам не подходит, возможно у Вас просто OLTP задача
-
я про автоматическое шардирование
-
Это вроде коммерческая фича КХ ?
-
-
Но я не шарю
-
Репликация в КХ вроде автоматическая все же :)
-
да ну?
-
Репликация данных | Документация ClickHouse
Репликация данных Репликация поддерживается только для таблиц семейства MergeTree: ReplicatedMergeTree ReplicatedSumming
-
-
-
-
ну а причем тут репликация?
-
-
-
“ClickHouse хранит метаинформацию о репликах в Apache ZooKeeper”
-
ну так КХ хранит, для пользователя это прозрачно (пока жив ЗК)
-
Можете так автоматически зашардировать что потом сами не найдете данные)
-
я тебе уже этот вопрос задавал, не надо тут 🙂
-
Такие вообще есть разве?
-
-
А для gRPC интерфейса работает оптимизация асинхронных вставок ? ( Которая появилась осенью и вроде как работала для HTTP протокола и не работала для TCP)?
-
не в курсе
-
Значит я это придумал. Со мной бывает
-
мда уж
-
Ее вообще нет и не было.
-
про внутреннюю эмм
-
df -H
-
-
слева - предел, память очистилась когда clickhouse был перезапущен
-
А какая версия клика?
-
Мы когда обновились до последней стабильной версии проблемы с памятью ушли
-
Если только 10к то зачем uint64? Есть способ уменьшить, скажем, до uint16? Вообще мы хранили в массивах до нескольких миллионов уникальных значений. Проблемы были, но больше с тем, что в одной записи значений могло быть много
-
uint64 - это просто результат работы xxhash и много лени по работе со справочниками….
думаю вообще выкинуть масивы - переписав работу со справочником -
У вас там какие-то строки были изначально? С кардинальностью 10к? выкидывайте xxhash и отдайте в КХ "работу со справочниками" - Array(LowCardinality(String))
-
изначально там масив ключ-значения
там больше подходит Map(LowCardinality(String), String), но go-шный драйвер не поддерживает работу с таким -
Ну так сделайте Tuple(LowCardinality(String), String) - отличия от Map при хранении невелики, если понадобится - соберете в Map прямо в рамках select
-
спасибо, попробую
-
Скоро будет
-
-
-
это будет прекрасно
-
Раз уж тут обсуждается мап, позволю себе поднять старый вопрос: есть ли какие-то планы по работе с map как с хэш-таблицей (в части доступа за единицу вместо линии, если быть точным)? По банальным тестам все выглядит так, что поиск по ключу в map работает медленнее, чем, например JOIN временной таблицы из этих же значений (видимо, потому, что JOIN создает хэш-таблицу)
Или мы что-то упускаем? -
Условно, map это некоторый "сахар" над двумя массивами: ключи и значения. В КХ нет и невозможны индексы в классическом их понимании из-за объема хранящихся данных и особенностей хранения (блоками). Те всегда читаем много и, относительно, oltp - долго.
-
-
да, я так и понял, но не совсем ясно, что мешает на лету превращать Map в хэш-таблицу, если запрос использует индексер? Это ведь O(N), вроде ничего не теряем. А вот из-за того, что это не делается, наблюдаются вот такие приколы:
SELECT count(*) FROM (
WITH map(0, 1, ..., 255) AS lookup
SELECT number, lookup[n.number % 256] FROM numbers(1e8) n
)
1 rows in set. Elapsed: 4.974 sec. Processed 100.03 million rows, 800.21 MB (20.11 million rows/s., 160.88 MB/s.)
SELECT count(*) FROM (
WITH lookupTable AS (SELECT 0 key, 1 value UNION ALL SELECT 2 key, 3 value ... UNION ALL SELECT 254 key, 255 value)
SELECT number, lookupTable.value FROM numbers(1e8) n
INNER JOIN lookupTable ON lookupTable.key = n.number % 256
)
1 rows in set. Elapsed: 1.411 sec. Processed 100.03 million rows, 800.21 MB (70.88 million rows/s., 567.06 MB/s.) -
ну и да, линия вылазит стоит только увеличить N:
SELECT count(*) FROM (
WITH map(0, 1, ..., 1023) AS lookup
SELECT number, lookup[n.number % 1024] FROM numbers(1e8) n
)
1 rows in set. Elapsed: 17.441 sec. Processed 100.03 million rows, 800.21 MB (5.73 million rows/s., 45.88 MB/s.)
в то время, как
SELECT count(*) FROM (
WITH lookupTable AS (SELECT 0 key, 1 value UNION ALL SELECT 2 key, 3 value ... UNION ALL SELECT 1022 key, 1023 value)
SELECT number, lookupTable.value FROM numbers(1e8) n
INNER JOIN lookupTable ON lookupTable.key = n.number % 1024
)
1 rows in set. Elapsed: 1.265 sec. Processed 100.03 million rows, 800.21 MB (79.05 million rows/s., 632.38 MB/s.) -
Бтв прекрасно понимаю все ньюансы (для маленьких Map, для выборки малого процента ключей, для большого кол-ва разных Map и тд строить хэши будет по итогу медленнее, чем поискать за линию, например), но быть может полезно было бы сделать какую-нибудь функцию а-ля hashMap, чтобы можно было проактивно сказать «вот тут буду много искать/искать в большой мапе, давайте конвертить в хэш-таблицу»?
-
та-же проблема - go драйвер не поддерживает… (unsupported Tuple(T) type [map[string]string])
-
Там все плохо с типами которые появились в последние 3-и года. Еще легаси много, добавлю в v2, там будут обратно не совместимые фичи типа нормальных плейсхолдеров для bind, использование контекстов и прочее, типа собственного интерфейса доступа без database/sql
- 07 January 2022 (34 messages)
-
Это не память
Это свободное дисковое пространство -
Почитайте что такое сортировка слиянием
И поищите стать на habr про merge tree
Почитайте в документации что такое system.query_log
Посчитайте по нему как часто и насколько малыми порциями вы вставляете данные
Что выдает у вас select active, database, count() from system.parts group by active,database ? -
значит через два отдельных массива. Хоть это-то поддерживается?
create table test ( a Nested(b LowCardinality(String),c String) ) engine = Memory;
insert into test values (['b1','b2'],['c1','c2']);
select cast((a.b,a.c),'Map(String,String)') from test;
{'b1':'c1','b2':'c2'} -
-
-
-
-
кажется нашёл, и это не связано с кх, похоже на сетевую проблему
-
Привет! Можно ли в кх запросах используя WITH прокидывать в название таблицы
-
Условно так: WITH 'custom_name' AS name
SELECT * FROM name -
Проблематика: не знаю как в графане через variable прокинуть в названии таблицы, и пытаюсь схитрить через WITH , так как напрямую прокинуть нельзя, конкатинировать подобно
FROM ('custom_table', name)
тоже нету возможности -
судя по всему вы хотите некоторый аналог eval
так не получится -
@BloodJazMan даже без извращений по типу EXECUTE ?)
-
Просто как я вижу сам клиент кликхауса поддерживает подобного рода техники
-
Клиент командной строки | Документация ClickHouse
Клиент командной строки ClickHouse предоставляет собственный клиент командной строки: clickhouse-client. Клиент поддержи
-
ну это немного другое
сделайте это через
https://clickhouse.com/docs/ru/interfaces/http/#cli-queries-with-parameters
у вас в качестве клиента какой язык \ библиотека?HTTP-интерфейс | Документация ClickHouseHTTP-интерфейс HTTP интерфейс позволяет использовать ClickHouse на любой платформе, из любого языка программирования. У
-
Видимо нативный клиент CH интегрированный в Grafana
-
Подскажите пожалуйста, для движков MergeTree индексы нормально совмещаются с ключами? Пример: в order by ключе поля c1 и c2, индекс bloom_filter по полю c3, выборка такая: c1 = 1 and c3 = 3.
-
Там же нужно ставить расширения, чтобы с CH работать
-
Нашел решение! SELECT * FROM ${variableCustomName:raw} всем спасибо
-
Но данное решение работает только в графане.
-
Все верно, расширение и стоит, и в качестве сорса используется отдельный коннект к бд
-
Совмещаются. Насколько нормально судить вам:
EXPLAIN PLAN indexes=1 select .... -
Коллеги, подскажите можно ли собрать “сложный” кластер? Например, часть таблиц на медленных серверах, а часть на быстрых, так чтобы можно было обе группы серверов одновременно использовать для запросов?
-
Да, ноды в кх полностью независимы, одна и та же нода может участвовать в нескольких кластерах
-
потому что этот темплейтинг на стороне grafana делается
-
а какой профит пытаетесь достичь?
какое у вас окружение? облака? bare-metal?
сколько у вас серверов в кластере планируется?
обычно несбалансированные кластера получаются когда bare-metal
и железо просто докупается по мере необходимости и новые данные просто льются на новые сервера, а старые данные хранятся на старых
но это надо пару лет чтобы кластер рос линейно
если сразу делать "не сбалансированный кластер",
может проще сделать multi volume storage policy по дискам?
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/#table_engine-mergetree-multiple-volumes_configure ?MergeTree | ClickHouse DocumentationMergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
Идея такая чтобы иметь горячие данные на одной группе серверов с ssd и холодные данные которые нужны редко на 2х серверах с большими дисковыми полками. Железо, не облака.
-
тут проблема в том как вы данные будете между серверами переливать с горячего на холодное
всякие storage_policy они в рамках одного сервера работают между разными дисками...
можно конечно изголяться и делать что-то типа
INSERT INTO slow_distributed_table SELECT ... FROM hot_local_table WHERE _partition_id='YYYYMM'
+
ALTER TABLE hot_local_table DROP PARITITION 'YYYYMM'
но это не транзакционно и будет окно когда в медленных дисках и в быстрых данные дублирются
ну как немного костыльный вариант
"медленные сервера с полками"
на них можно minio поднять
и в горячих серверах сделать s3 диски
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/#table_engine-mergetree-s3
но будет хуже data locality, CPU на дисковых полках обсчетами никакими заниматься не будет и будет простаивать
лучший вариант "экономить на железе"
это пара NVMe на 1-2Tb в JBOD storage_policy под быстрые данные и пара HDD на 5Tb+ тоже в JBOD под холодные
но я так понимаю "сервера" у вас уже давно есть?MergeTree | ClickHouse DocumentationMergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
данных у вас живых уже сколько?
-
Возникала задача развернуть несколько CH разных версий на одном PH, хочется получить одновременно 18,21,dev22 версии и кластреную сборку из 21-вых и чтобы это можно было через один YAML делать.
Подскажите смогу я это сделать через MiniKube и Altinity ClickHouse Operator ? (не разу не работал с кубером )))
Может кто то поделится готовыми примерами yml -
clickhouse-operator имеет некую минимальную версию кх которую он поддерживает/тестируют
И она старше чем 18.
Мб вам в сторону простого docker-compose посмотреть? -
А зачем вам для этого вообще Kubernetes? Самое простое - это описать сервисы в Docker Compose. Пример https://github.com/ClickHouse/clickhouse-go/blob/v2/docker-compose.yml
-
Хотелось сразу operator потрогать - чтобы подумать с UI для него, докеры я по наделал... но хотелось чтобы UI к operator умел тушить, переставлять CH
Если там 18 минимум то ок, 1ю версию я и в docker подинму - 08 January 2022 (104 messages)
-
https://github.com/Altinity/altinity-dashboard
Есть альфа версия простенького дашборда для оператора.GitHub - Altinity/altinity-dashboard: Altinity Dashboard helps you manage ClickHouse installations controlled by clickhouse-operator.Altinity Dashboard helps you manage ClickHouse installations controlled by clickhouse-operator. - GitHub - Altinity/altinity-dashboard: Altinity Dashboard helps you manage ClickHouse installations ...
-
Здравствуйте, помогите пожалуйста перестал работать ноутбук не знаю что делать?
-
Села батарейка bios скорее всего, зайдите в биос и выставьте текущую дату время!
-
А у вас кликхаус случаем не тормозил перед этим ?
-
У моих знакомых как-то ClickHouse на ARM-процессоре тормозил, а потом оказалось, что они шину питания не подключили и процессор только за счет энергии от шины данных работал :)
-
(задёргался глаз)
-
Мой внутренниий инженер говорит "расстрелять"
-
:)
-
Дату выстовил! Теперь появилось это! Не выходит теперь отсюда
-
-
Обратился к одному он мне сказал я не не знаю что делать
-
-
Всем привет. Кто-то видел модуль на кликхаус для вычисления kmeans?
-
Как это сделать?
-
Не знаю как это сделать на этой модели, посмотрите на сайте производителя user manual. Судя по видео сейчас включена uefi загрузка. Что бы она работала нужно чтобы диск в gpt-формате был отформатирован. Если это не так, то диск не будет отображаться в списке загрузочных устройств, что сейчас и наблюдается. Варианта тут два - или диск не подключен или он в mbr отформатирован и тогда нужно в bios включить csm загрузку
-
Вы, конечно, извините, но это вроде канал о CH и вопросах, связанных с ним, а не кружок "очумелые ручки". Или я неправ?
-
Прав! Думал добрые люди помогают своими знаниями! Я просто не знал куда написать! Если подскажите куда написать скиньте ссылку пожалуйста! Я просто живу в селе и возможности нету отдать в ремонт у нас есть один мастер но он не решил эту проблему!
-
Как изменить BIOS с UEFI на устаревшую поддержку - Lenovo B50-70 - Lenovo Support RU
https://support.lenovo.com/ru/ru/solutions/ht503657-how-to-change-bios-from-uefi-to-legacy-support-lenovo-b50-70Как изменить BIOS с UEFI на устаревшую поддержку - Lenovo B50-70 - Lenovo Support RUКак перейти с UEFI на устаревший BIOS на Lenovo B50-70
-
Ссылка На решение
-
Ребята подскажите пожалуйста сдуру разделил csv через ',' вместо , теперь не могу разобраться как импортнуть пробую FORMAT CustomSeparated SETTINGS format_custom_escaping_rule = 'CSV', format_custom_row_between_delimiter = '','' ", как правильно экранировать?
-
а нельзя обратно поменять на нормальные разделители в самом файле?
-
Можно но наверно не быстро 300мл строк
-
Смотря сколько времени уйдёт на костыли (:
-
Ну 300 млн
-
Если нормально написать на питоне
-
То не очень долго
-
Седом можно без проблем
-
пишите котики
-
Да просто уже и в gz упаковал и в том докера закинул и тут сюрприз))
-
Экранирование через обратный слеш \ попробуйте сделать
-
-
попробуйте свою на python сделать
https://clickhouse.com/docs/en/sql-reference/functions/#user-defined-functionsIntroduction | ClickHouse DocumentationFunctions There are at least* two types of functions - regular functions (they are just called “functions”) and aggregat
-
Спасибо, что-то не нашёл этой доки
-
Это вроде недавно добавили, если что то получится можете мне скинуть ?
-
Пока исследую варианты, у нас есть скрипты уже под это, но думал как бы данные не выкачивать
-
Мы делаем K-means в PG
-
"INSERT INTO micro_tickets FORMAT CustomSeparated SETTINGS format_custom_escaping_rule = 'CSV', format_custom_field_delimiter = ''','''" вот так почти работает то-есть экранирование через двумя ' но ломается на пустых значениях когда встречает ','','. Короче сделаю норм CSV :))
-
Добрый вечер) Не подскажете, как можно посчитать произвадение всех значений сгруппированной колонки?
-
Всем привет! Никто не сталкивался с ошибками типа “Code: 439. DB::Exception: Cannot schedule a task: cannot allocate thread (threads=59, jobs=59). CANNOT_SCHEDULE_TASK)” под нагрузкой (идёт довольно много и вставок в процессе перенаполнения данными, и чтений)? Версия 21.11.6.7.
Ресурсы свободные у сервера вроде есть, не очень очевидно в какую сторону копать. -
-
сколько CPU ядер на сервере?
-
128 физических ядер, 256 тредов
-
<!-- Maximum number of threads in the Global thread pool.
This will default to a maximum of 10000 threads if not specified.
of the time, in which case a higher number of threads might be required.
<max_thread_pool_size>10000</max_thread_pool_size>
and to reuse mappings from several threads and queries, -
Попробуйте эту настройку поднять
-
-
а как определяете что "ресурсы еще есть"?
background_pool_size = 256
поставьте
и вообще посмотрите на все настройки
SELECT * FROM system.settings WHERE name LIKE '%_pool_size' -
Или там 256 физических ядер, я уже чего-то забыл, по-моему у нас там два Эпика для Кликхауса, 128 это для Постгреса было :)
Спасибо, по крайней мере понятно в какую сторону копать. Изменение max_thread_pool_size пока не помогло.
“Ресурсы ещё есть” — проц утилизирован на 20%, на диск тоже гигантской нагрузки нет, запросы, которые выполняются, выполняются быстро, т.е. такое впечатление, что искусственный лимит какой-то. -
я подумал что это мем какой-то и ждал подвоха,а тут тех поддержка, лучше бы мем был.
-
> Спасибо, по крайней мере понятно в какую сторону копать. Изменение max_thread_pool_size пока не помогло.
Рестарт был?
ulimit -Sa
ulimit -Ha -
ulimit -Sa
real-time non-blocking time (microseconds, -R) unlimited
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 4127416
max locked memory (kbytes, -l) 132089736
max memory size (kbytes, -m) unlimited
open files (-n) 65635
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 4127416
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
ulimit -Ha
real-time non-blocking time (microseconds, -R) unlimited
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 4127416
max locked memory (kbytes, -l) 132089736
max memory size (kbytes, -m) unlimited
open files (-n) 65635
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) unlimited
cpu time (seconds, -t) unlimited
max user processes (-u) 4127416
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
background_pool_size пока тоже не помог. Рестарты Кликхауса были. -
А когда вы поменяли настройку
Code: 439. DB::Exception: Cannot schedule a task: no free thread (timeout=0) (threads=10000, jobs=10000): While executing ParallelParsingBlockInputFormat. (CANNOT_SCHEDULE_TASK)
Числа в ошибке тоже изменились? -
open files (-n) 65635
Вообще лимит в 65к файлов выглядит подозрительным. -
Это из того, что я уже пробовал менять, он по умолчанию вообще 1024 как и сто лет назад
-
А можете для процесса клика это сделать?
cat /proc/$PID/limits -
И вопрос, вы же раскомментили настройку?
max_thread_pool_size -
https://github.com/ClickHouse/ClickHouse/blob/272ea7fc5be9fea73d24a9d2d12f0418045d064f/programs/server/Server.cpp#L559
И вот это еще можно потрогатьClickHouse/Server.cpp at 272ea7fc5be9fea73d24a9d2d12f0418045d064f · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Вообще не очень понятно, судя по всему нет. Со вставкой такие ошибки встречаются не очень часто, я пока назад вернул 10000, но весь лог и пока было 25000 вроде бы тоже показывал 10000. Ещё есть вариант со вставкой такой: Cannot schedule a task: cannot allocate thread (threads=0, jobs=0)
Для селектов числа совершенно разные
(threads=44, jobs=44)
(threads=32, jobs=32)
и т.д., в пределах 200 -
Она в конфиге дефолтном раскомменченная и установленная в 10000, поменял на 25000, рестартанул clickhouse-server
-
А, ок
Ну я бы попробовал еще такую установить
https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings/#thread-pool-queue-sizeServer Settings | ClickHouse DocumentationServer Settings builtin_dictionaries_reload_interval The interval in seconds before reloading built-in dictionaries. Cli
-
cat /proc/1171195/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 4127416 4127416 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 4127416 4127416 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us -
Спасибо, будем пробовать!
-
Может сразу для среднего геометрического массива кто-то знает способ?)
-
arrayProduct(groupArray(())
Или через логарифмы и сумму. -
Можете подсказать, есть данные по типу
1 2 3 4 5 6
Таблица имеет 3 колонки id, sid, data
Как внести через INSERT INTO FROM INFILE данные из файла, что бы было так
id = 1
sid = 2
data = 3 4 5 6 -
Большое спасибо!
-
FORMAT LineAsString
А потом либо регулярками либо чем еще разбить данную строку
https://clickhouse.com/docs/en/sql-reference/functions/string-search-functions/For Searching in Strings | ClickHouse DocumentationFunctions for Searching in Strings The search is case-sensitive by default in all these functions. There are separate va
-
А можете привести пример синтаксиса?
-
Или вы имеете ввиду это сделать через Memory таблицу?
-
Синтаксиса чего?
Запроса? ну будет похож на что то подобное
https://clickhouse.com/docs/en/sql-reference/table-functions/input/input | ClickHouse Documentationinput input(structure) - table function that allows effectively convert and insert data sent to the server with given st
-
Только в вашем случае будет одна колонка
-
Понял тогда
-
Спасибо
-
тухлячок чот тут(
-
зппп?
-
Нашёл решение получше
INSERT INTO temp FROM INFILE '*.txt.gz' FORMAT Regexp SETTINGS format_regexp='^([^\t]+)\t([^\t]+)\t(.*)$', format_regexp_escaping_rule='Raw', format_regexp_skip_unmatched=1; -
Тоже норм, но кмк сложнее чутка с нужно один хороший регексп писать
-
Привет всем. Есть такой запрос: SELECT match_id, user_id FROM match_users JOIN matches USING match_id WHERE match_id = 321. Можно ли заставить кликхаус не выгружать всю таблицу в память, а отдельными запросами получить только нужную запись из matches?
P. S. Предполагается, что в match_users при выборке с match_id количество записей будет не больше 5 -
А пробывал джойнить запрос ?
-
а-ля SELECT match_id, user_id FROM match_users JOIN (SELECT * FROM matches WHERE matches.match_id = match_users.match_id) WHERE match_id = 321?
-
Ну если тебе нужен 321, то ты можешь matches.match_id =321
-
В данном случае мне действительно нужен только 321. Но есть ситуации, когда нужен подобный запрос:
SELECT match_id, user_id FROM match_users JOIN matches USING match_id WHERE user_id = 1 и тогда уже начинаются проблемы -
Проблемы такого рода, что при выборке по match_users.user_id в основном не более 1000 записей и быстрее их кодом в цикле обойти и получить отдельно каждый matches.match_id, чем дожидаться пока кликхаус join выполнит
-
Я бы сказал, что тогда у вас схема хранения не правильная. https://www.youtube.com/watch?v=y8HsXqQEyfE , не помню на какой минуте, но требуется денормализация данных если вы храните их как таблицы. Если таблица не большая, то можно попробывать словарь для неё сделать.
-
Спасибо, ознакомлюсь. Проблема как раз в том, что таблица уже достаточно большая (около 400 гигабайт) и выгружать её в оперативку для такого запрос дорого и долго
-
Ну так она же не полностью выгружается, а только требуемые столбцы.
-
Вероятно всего у вас не все столбцы весят одинаково и не все требуются
-
Шутка в том, что выгружается почти полностью. Когда планировал архитектуру я ожидал, что JOIN'ы будут работать примерно таким образом:
SELECT * FROM matches WHERE match_id IN (SELECT match_id FROM match_users WHERE user_id = 1)
но получилось необычно)) так что буду копать, спасибо -
А в чём проблема сделать из этого запроса JOIN ? Тестили IN vs JOIN на больших запросах, получили что IN вообще не выполняется :)
-
Да вот в том и проблема, что IN выполняется за 1 секунду, а JOIN на более мощном сервере с необходимым объёмом оперативки для выгрузки таблицы выполняется 250 секунд
-
-
SELECT * FROM mathces as ma
JOIN ( SELECT math_id FROM match_users WHERE user_id =1 ) as mau ON ma.match_id = mau.match_id)
Если примерно такой, то он сделает фулл скан таблицы левой, возможно если добавить снизу ещё например период и партиционирование по этому времени, то должно быть быстро -
Ничего сложного это написать на SQL. Тут - http://www2.cs.uh.edu/~ordonez/pdfwww/w-2004-KDD-sqlkm.pdf - делают на террадате, а в КХ это все сильно проще можно сделать с использованием массивов и/или туплов. Вот примерно так:
-- data
drop table YH; create table YH (Y Tuple(UInt32,UInt32)) engine = Memory;
insert into YH select (number as x, rand32() % 100 as y) from numbers(100);
-- Centroids
drop table WCR; create table WCR ( ts DateTime, j UInt32, C Tuple(UInt32,UInt32), P Array(Tuple(UInt32,UInt32)) ) engine = Memory;
insert into WCR select now(), rowNumberInAllBlocks()+1, Y , [] from YH limit 10,5;
-- k-means
insert into WCR
select now(), j,(avg(Y.1),avg(Y.2)) as C, groupArray(Y)
from (select Y.1+1 as i, argMin(j,L2Distance(Y,C)) as j, Y
from YH, (select * from WCR order by ts desc limit 1 by j) as WCR
group by i, Y order by j)
group by j order by j;
Сошлось за 13 инсертов. Что там получилось - не проверял.
(Из недостатоков - зря оно квадратный корень считает в L2Distance, но так было красивее по коду. groupArray(Y) в проде конечно не должен остаться, да и всякие weight посчитать тоже надо). -
вот так и надо делать - без джойнов, но на подзапросах. Почему медленно - смотрите order by таблиц. Для match_users первым должен быть user_id
-
Тоже не помогает…
<max_thread_pool_size>20000</max_thread_pool_size>
<thread_pool_queue_size>20000</thread_pool_queue_size>
Отдельно странно, что
SELECT *
FROM system.settings
WHERE name LIKE '%thread%'
эти настройки не показывает -
-
Ничего не понятно, что вы хотите
-
With ties
-
LIMIT | ClickHouse Documentation
LIMIT Clause LIMIT m allows to select the first m rows from the result. LIMIT n, m allows to select the m rows from the
-
Благодарю
-
-
Не во всём SQL, хотя есть ещё в Oracle, например, с другим синтаксисом
-
ничосе ничего сложного. Ты кликхаус нинздя, я так не могу
-
-
Joined.
- 10 January 2022 (178 messages)
-
народ, в клике есть база с внешним коннектом , но внешняя база легла и следовательно не стартует клик. есть возможность удалить базу с внешним коннектом у лежащего клика пока внешнюю базу чиним ? колдунство сильное но вдруг ))
-
Не очень сильное колдунство
mv /var/lib/clickhouse/metadata/remote_database.sql /tmp/
systemctl start clickhouse-server
# чиним remote базу
clickhouse-client < /tmp/remote_database.sql -
знающему человеку и колдунство не колдунство )) благодарю, выручил. помогло
-
Здравствуйте. Подскажите, как исправить проблему с сертификатом. КХ в докер контейнере, ошибка вызывается при запросе к удаленному серверу КХ, через remoteSecure
Code: 210, e.displayText() = DB::NetException: SSL Exception: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED -
Всем привет, читаю про MV
В доке написано:
Материализованное представление устроено следующим образом: при вставке данных в таблицу, указанную в SELECT-е, кусок вставляемых данных преобразуется этим запросом SELECT, и полученный результат вставляется в представление.
Правильно ли я понимаю что MV будет само обновляться ? и не нужно его закидывать в cron -
-
Само
-
-
https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings/#server_configuration_parameters-openssl
<openSSL><client>...
задайте правильноServer Settings | ClickHouse DocumentationServer Settings builtin_dictionaries_reload_interval The interval in seconds before reloading built-in dictionaries. Cli
-
"само" ничего не происходит
все "через код"
первый раз аггрегация будет на уровне вставки
второй раз на уровне background merge
третий уровень до-аггрегации еще и через SELECT ... FROM mv FINAL (может быть довольно медленно, народ выкручивается по всякому) -
Если это не ложное посленовогоднее воспоминание, то Алексей на YaTalks (ссылка на видео припинена) говорил, что keeper объявлен production ready.
-
-
Подскажите пожалуйста по кафке. Ходил кликхаус в одну кафку и вроде было все хорошо, добавили вторую табличку с кафкой+второй mat view который пишет в ту же таблицу, что и первая кафка с mat view. И начались проблемы, решистрируем постоянно скачащий lag на кафке до 5минут. При этом вторая кафка вообще пуская, туда попадают данные, только если первая падает. Но это сказалось на производительности кликхауса
-
SETTINGS kafka_broker_list = ‘x.x.x.x’, kafka_topic_list = ‘xxxx’, kafka_group_name = 'clickhouse', kafka_format = 'Protobuf', kafka_max_block_size = 1048576, kafka_num_consumers = 16, kafka_skip_broken_messages = 1000, kafka_thread_per_consumer = 1, kafka_schema = ‘xxx’
-
-
А нагрузку на сеть смотрели ?
-
да, тоже все хорошо, далеко от предела
-
-
-
-
Всем привет!
Есть такая дата 0001-01-01T00:00:00+00:00
Когда делаю инсерт в таблицу кликхауса выдаёт ошибку
clickhouse:DB::Exception: Cannot parse string '1-01-01 00:00:00.000000'
Такую дату например ест нормально 2021-09-24T23:59:09+03:00 так что ошибка не в форме
Подскажите пожалуйста, что можно сделать -
Поддерживаются значения от 1 января 1925 г. и до 11 ноября 2283 г.
https://clickhouse.com/docs/ru/sql-reference/data-types/datetime64/DateTime64 | Документация ClickHouseDateTime64 Позволяет хранить момент времени, который может быть представлен как календарная дата и время, с заданной суб
-
а вам зачем такую дату хранить?
в то время технически еще не было григорианского календаря :) -
-
Ну тогда это должна быть дата "все нули"
-
Прилетело во время парсинга json-а )
-
хм, логично, я что-то не сообразил
-
Но наверное Вы правы, идея у товарища была именно эта, судя по всему
-
Как вариант делать из них стринги? Видимо в DT не получится запихнуть
-
посмотрите с другой стороны
что вы хотите получить в итоге?
если хотите хранить как в источнике - можно хранить String, но тогда на фильтрах будете ломаться или приводить к дате с -orNull
если хотите нормальную дату - можно предполагать, что все "кривые" даты - null или там 1970-01-01..., но тогда потеряете исходную строку
можно совместить - хранить и строку и попытку распарсить в дату, но тогда места будет больше занимать... -
Хочется сохранить формат dt потому-что надо для аналитики и исключать ошибки даты 9999 года ну или 0001 если вдруг будут прилетать
-
Вот этот 1970 раздражает. Если на null поменять случай инсерте пустой даты то не замедлится? Я вроде читал что лучше налы избегать
-
в целом стоит избегать, т.к. это буквально еще один файл с битовой маской (+ раньше нельзя было добавлять nullable столбцы в order by/partition by, а сейчас это мб все еще не prod-ready, видел такое замечание в github)
но если не критично, можно и null использовать, как я и писал -
Критично, как раз ключевая огромная таблица логов. Спс
-
Всем привет! Хотел узнать у вас, можно ли как-то заджойниться с generateRandom? Или как-то иначе сделать мой случай: есть таблица, в которой есть поле id, которое должно быть сидом тут:
SELECT (d % 100) / 100 FROM generateRandom('d UInt8', 1332, 100, 2) gr LIMIT 1;
Вместо 1332 должен быть id. И на выходе должны быть поля id и высчитанное из данных generateRandom рандомное значение d с сидом id. -
Коллеги, хочу сделать процесс, в котором кликхаус будет забирать данные из кафки, потом матвьюха перекладывает эти данные в обычную таблицу. Процесс выглядит так:
*** - Kafka - CH kafka table - CH matview - CH table
Все по доке https://clickhouse.com/docs/ru/engines/table-engines/integrations/kafka/
Сделал данный процесс на старой версии КХ (не помню какая версия), все работало. Была необходимость обновиться до 21.12.3.32 версии (актуальная на текущий момент), процесс падает с ошибкой Code: 620. DB::Exception: Direct select is not allowed. To enable use setting stream_like_engine_allow_direct_select. (QUERY_NOT_ALLOWED)
Пробовал исправить поставив stream_like_engine_allow_direct_select=true, также пробовал ставить kafka_commit_on_select = 1, ошибка не пропала.
https://github.com/ClickHouse/ClickHouse/blob/master/CHANGELOG.md
Кто-нибудь сталкивался с чем-то похожим, подскажите как исправить.Kafka | Документация ClickHouseKafka Движок работает с Apache Kafka. Kafka позволяет: Публиковать/подписываться на потоки данных. Организовать отказоус
-
> Сделал данный процесс на старой версии КХ (не помню какая версия), все работало. Была необходимость обновиться до 21.12.3.32 версии (актуальная на текущий момент), процесс падает с ошибкой Code: 620. DB::Exception: Direct select is not allowed. To enable use setting stream_like_engine_allow_direct_select. (QUERY_NOT_ALLOWED)
Что то странное
direct_select это ошибка если бы вы делали через консоль
SELECT * FROM kafka table LIMIT 1; -
@unamedrus Да, предыдущая версия КХ позволяла сделать запрос к кафка таблице. В этом же нет ничего криминального, из кафки данные забираются в КХ кафка таблицу, мы делаем к этим данным 1 запрос, после с данными не можем работать, они пропадают.
Матвьюха по сути делает то же самое
CREATE MATERIALIZED VIEW matview TO table
AS
SELECT * FROM kafka_table; -
В этом же нет ничего криминального, из кафки данные забираются в КХ кафка таблицу, мы делаем к этим данным 1 запрос, после с данными не можем работать, они пропадают.
Криминал был в том, что люди не ожидали что в таком случае MV не увидит эти данные.
Так что отключили из этих соображений. -
Коллеги, вопрос: попробовали с коллегой нативную репликацию с mysql и altinity mysql reader. Первый работает, но не удалось заставить писать его в Engine=MergeTree. Altinity пишет , но отъедает 90% процессора. Это нормальная нагрузка для Altinity? почему так, интересно…
-
> Первый работает, но не удалось заставить писать его в Engine=MergeTree.
А в чем проблема/идея?
По дефолту там используются VersionedCollapsingMergeTree -
Так, стало хорошо, после того как kafka_num_consumers опустил с 16 до 8. Почему это могло помочь? Партишенов в топике 16, ядер на сервере с КХ больше 16
-
-
-
Потому, что каждому консьюмеру нужна своя партиция в кафке, если этого нет, то начинается борьба за партиции, кто то при этом страдает.
А вообще у вас какой поток сообщений в кафке, 8 консьюмеров это многовато -
У меня как раз 16 партиций. Поток около 20-30к в секудну
-
И вам не хватает 1 консьюмера?
-
> Ходил кликхаус в одну кафку и вроде было все хорошо, добавили вторую табличку с кафкой+второй mat view который пишет в ту же таблицу, что и первая кафка с mat view.
Как я понимаю, вы создали 2 таблицы с kafka_num_consumers = 16 и одинаковым kafka_group_name = 'clickhouse'
Следовательно вам нужны 32 партиции в топике -
Ну в тестах, пытаясь выжать макс производительность всей связки не хватало, где-то в 80-100к упиралост кажется, не помню уже, поэтому сразу слеолао по числу партиций. Не стоит так делать?
-
Они смотрят в две разных кафки
-
Версия кх?
-
Да не знаю даже. Почитали документацию. Настроили репликацию следующим образом: CREATE TABLE System.queue_log(
time DateTime,
callid String,
queuename String,
agent String,
event String,
data String,
data1 String,
data2 String,
data3 String,
data4 String,
data5 String) Engine=MySQL('mysql_ip:3306', 'System_one', 'queue_log', 'system', 'db_pass');
попытки сменить Engine не увенчались успехом. Начали пробовать коннектор от Altinity. -
21.11.5.33 и 21.7.6.39, поведение одинаковое
-
Так подождите, Engine=MySQL не занимается репликацией, это что то вроде VIEW которая смотрит в другую таблицу
-
Ммм. Это объясняет низкую скорость. Поделитесь плз примером настройки инативной репликации.
-
https://github.com/ClickHouse/ClickHouse/pull/11388#issuecomment-638893203
https://kb.altinity.com/altinity-kb-integrations/altinity-kb-kafka/altinity-kb-kafka-main-parsing-loop/
background_message_broker_schedule_pool
SELECT *
FROM system.metrics
WHERE metric ILIKE '%pool%'Better settings for Kafka by filimonov · Pull Request #11388 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the cha...
-
Попробуйте посмотреть в сторону https://clickhouse.com/docs/en/engines/database-engines/materialized-mysql/
Но там есть свои подводные камниMaterializedMySQL | ClickHouse Documentation[experimental] MaterializedMySQL Warning This is an experimental feature that should not be used in production. Creates
-
@tron_wai ,посмотрели логи AD ,ничего не нашли,кроме success log on,каких-то фильтров тоже не нашли,все-таки как понять,какой user_dn передаётся
-
Привет, эксперты. Подскажите, пожалуйста, как легчайшим образом превратить [1,2,3] и [1,2,3] в tuple(1,1), tuple(2,2), tuple(3,3)
-
arrayZip
-
спасибо!
-
а как жили без него? Мне, видимо, надо костыль придумывать, версия 19.14
-
переделал с туплов на массивы и выложил - https://github.com/bvt123/clickhouse-k-means
Надо сделать view к своим данным и запустить bash скрипт.
В понятных случаях алгоритм дает ожидаемый результат. Однако ломается если кластеры очень хорошо отделены друг от друга. Но это сам k-means такой - человеку (в 2D) все понятно, а алгоритм лажает. Зато быстный. -
Боря, спасибо большое. Попробую
-
может тебе имеет смысл как-то в этом PR поучаствовать https://github.com/ClickHouse/ClickHouse/pull/6185/filesIncremental clustering by Quid37 · Pull Request #6185 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en For changelog. Remove if this is non-significant change. Category (leave one): New Feature Short descript...
-
круто =) молодец
-
BackgroundDistributedSchedulePoolTask │ 16
А где этот background_message_broker_schedule_pool меняется? В system.settings его не вижу, но это больше для информации, я понял что дофига консьюмеров делать незачем -
Ну в логе должны быть отражены все запросы, по ним можно понять, что спросил кликхаус, что ответил AD.
Давайте попробуем произвести тот же запрос, что делает кликхаус, вручную, через ldapsearch, с той же машины, и посмотрим на результат. -
arrayMap((x,y) -> (x,y), arr_1, arr_2)
-
в профиле default пользователя
background_message_broker_schedule_pool
И нужен рестарт сервера. (но трогать не стоит) -
Вообще таплы мне нравятся больше, тк таплы быстрее чем массивы работают
-
Спасибо большое, стало понятнее. И я правильно жн понимаю, что кроме kafka_max_block_size больге ничего трогать не стоит для оптимизации кафки?
-
Добрый день, подскажите, как понять в какой момент времени происходит слияние кусков данных в таблице? Например кейс с VersionedCollapsingMergeTree, когда идет отмена данного, но отмена не происходит, потому что строчки лежат в разных кусках данных. Как хотя бы примерно понять, когда будет слияние кусков данных и оно удалится. Т.е это час или два или сутки. Может есть настройка раз в сколько производить слияние (не нашел, но пока что сильно не копал).
-
Там уже лям по дефолту должен быть в новых версиях.
В целом крутить kafka_num_consumers можно, не не ставить сразу в 16, а 2-4 -
Привет. Бинарник не доступен https://builds.clickhouse.com/master/aarch64/clickhouse. Подскажите плиз, может есть какие альтернативные источники?
-
-
А вы для какой платформы хотите7 (apple silicon?)
-
-
Тогда можете посмотреть на наше homebrew
https://github.com/Altinity/homebrew-clickhouse
Там должны быть готовые бинари для последней версии mac osGitHub - Altinity/homebrew-clickhouse: ClickHouse Homebrew tap (by Altinity)ClickHouse Homebrew tap (by Altinity). Contribute to Altinity/homebrew-clickhouse development by creating an account on GitHub.
-
Приветствую. Я тестирую сейчас шардирование. Вопрос такой,как реализовать MV на два шарда ? Я правильно понимаю, что я вешаю на таблицу с данными MV, а на таблицу с данными из MV смотрю с помощью distributed таблицы ?
-
В целом да
Можете еще посмотреть презентацию по MV
https://kb.altinity.com/altinity-kb-schema-design/materialized-views/#presentation -
Спасибо большое
-
Только нужно создать MV на всех шардах-репликах
-
мне тоже, я с них и начал. Но не получилось вычислить avg(Tuple()) без ручного перечисления элементов. Если есть такая функция (или какое-то хорошее преобразование туда-обратно) - конечно стоит на таплах все сделать.
Ещё был минус, что L2Distance считает с квадратным корнем, который в этой задаче не нужен (тут просто сравнивают на больше-меньше). -
Спасибо! 👍
-
Хм, вам нужно найти среднее всех элементов тапла?(и их число может быть большим? те многомерное пространство?))
-
-
Не совсем понял, по какому критерию сворачивать, но вот три варианта
SELECT avgForEach([untuple((number, number))]) AS res
FROM numbers(10)
┌─res───────┐
│ [4.5,4.5] │
└───────────┘
SELECT avgArray([untuple((number, number))]) AS res
FROM numbers(10)
┌─res─┐
│ 4.5 │
└─────┘
SELECT arrayAvg([untuple((number, number))]) AS res
FROM numbers(10)
┌─res─┐
│ 0 │
│ 1 │
│ 2 │
│ 3 │
│ 4 │
│ 5 │
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└─────┘ -
спасибо. нужен первый. До этого бешенного конвеера из untuple [] ForEach я не дошел, хотя был близок :) Логично вобщем-то.
-
Можно попробовать поизгалятся с APPLY, но оно неумеет прямо на untuple работать :(
Зато должно работать быстрее из за того, что собираем массивы только в самом конце(дешево)
SELECT * APPLY avg
FROM
(
SELECT untuple((number, number)) AS tpl
FROM numbers(10)
)
Query id: e88d7c59-2d51-420b-8195-088b4cb3b8f8
┌─avg(tpl.1)─┬─avg(tpl.2)─┐
│ 4.5 │ 4.5 │
└────────────┴────────────┘
SELECT [* APPLY avg]
FROM
(
SELECT untuple((number, number)) AS tpl
FROM numbers(10)
)
Query id: 1ef2d226-1d7e-44d5-8ad1-bfed46ca1e98
┌─array(avg(tpl.1), avg(tpl.2))─┐
│ [4.5,4.5] │
└───────────────────────────────┘ -
а есть мысль как массив обратно в тапл превратить?
-
У меня такое получилось
insert into WCR
select now(), j, tuple(COLUMNS('tupleElement') APPLY avg) as C, groupArray(i)
from ( with arrayMap(j->(j.1, L2Distance(j.2,Y)),WCR) as D
select untuple(Y), i, arrayReduce('argMin',D.1,D.2) as j from YH
global cross join (select groupArray((j,C)) as WCR from (select j,C from WCR order by ts desc limit 1 by j) ) as W
)
group by j order by j; -
> from WCR order by ts desc
Сортировка не очень нравится правда :)
Можно сделать так
WITH (SELECT max(ts) FROM WCR) as max_ts
FROM WCR WHERE ts = max_ts -
Дмитрий, может есть источники предыдущих версий? 21.12, 21.11 и т.д?
-
groupArray((j,C))
Можно переписать arrayZip(groupArray(j), groupArray(C))
https://github.com/ClickHouse/ClickHouse/issues/33156groupArray(column_1,column_2) -> Array(Tuple(column_1, column_2)) · Issue #33156 · ClickHouse/ClickHouseUse case SELECT groupArray((number, number - 1)) FROM numbers(10000000) GROUP BY number % 10000 FORMAT `Null` MemoryTracker: Peak memory usage (for query): 653.52 MiB. 0 rows in set. Elapsed: 1.726...
-
Идете по стрелочкам.
Для других версий откройте бранчи с соответствующим названием. -
Переливаю сейчас данные из одного КХ в другой КХ через remote с помощью clickhouse-client. По счётчикам где то проходит миллион строк и снова зависает ... Это может быть лаг отображения клиента ?
-
там замысел в том, чтобы добыть последнюю пачку рассчетов - несколько строк. Но order by стоит по времени, так что будет быстро работать (хотя да, надо сеттинг добавить)
-
Так в моем случае будет тоже самое
Мы возьмем максимальное время и для него достанем все строки -
Кх записывает на диск блоками по 1 млн строк, вот и подвисает
Можете поиграться настройками
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-data-migration/remote-table-function/#q-can-i-tune-insert-speed-to-make-it-faster -
скорее всего ещё optimize_on_insert включён, он качает блок и сортирует перед вставкой
-
Благодарю 👍
-
Всем привет, подскажите как можно изящно решить данную проблему.
Есть таблица с партициями ( по 1 дню ) около 500кк строк и +-50 столбцов, движок используется ReplicatedMergeTree , своего рода статистика .
Раз в день необходимо изменять 40% записей ( изменение одного столбца, денежная сумма x_sum ) . Раз в отчетный месяц есть необходимость пересчитать партиции ( за прошлый месяц ).
Пробовали банально в лоб использовать ALTER TABLE UPDATE ... WHERE ( без указания IN PARTITION ) но теряли производительность, вставка данных занимала больше времени и фоновые операции ( из-за мутации ) тормозило всё.
Подумываем о двух вариантах как :
1. делать FREEZE партиции ( за предыдущий день), запускать UPDATE для данной партиции, получить mutation_id и в SELECT * FROM system.mutations ждать пока мутация не будет в is_done = 1 ; и вернуть её обратно ( DETACHED оригинальную партиции и ATTACH обновленную )
2. создавать новую партицию и перегонять из оригинальной партиции INSERT с CASE WHEN (обновленное значение поля x_sum предварительно посчитанного ) и подмена партиций на обновленную -
Одну колонку должно быть несложно обновить
А откуда берете результующие значения для этой колонки? -
Коллеги, попробую задать глупый вопрос)
Можно ли попросить кликхаус поставить на пуазу вставку данных вместо того чтобы вернуть ошибку “252 too many parts”
max_delay_to_insert=4
parts_to_delay_insert=300
parts_to_throw_insert=600
Еще вопрос все ли вставляющие запросы умеют падать с такой ошибкой? -
всем привет!
есть таблица MT, в которой есть полей UUID session_guid
поле не участвует в order by и PK
order by (app_id, when) , где app_id нобольшое количество
да в целом для основных сценариев использования и не надо
но иногда надо найти все записи с session_guid по всем app_id за всё время (обычно они все в рамках пары часов +/- расположены, если это как-то поможет)
сейчас есть данные за 2 недели: на 3B записей примерно 400M уникальных session_guid и поиск по session_guid захлёбывается (десятки секунд, а хочется быстрее)
как помочь СН? индекс или отдельную таблицу/mv с order by session_guid или ..? -
В новых версиях кх не будет кидать подобную ошибку на половине инсерта
-
можно
-
Огонь! А как будет? Будет притормаживать?
-
> как помочь СН? индекс или отдельную таблицу/mv с order by session_guid или ..?
Оба варианта возможны.
Можно осторожно попробовать bloom_filter индекс на эту колонку
Или попробовать пихнуть в PREWHERE session_guid = 'xxxxxx' -
Ну притормозится как обычно из за parts_to_delay_insert, но выполнится
-
если кратко, то мы корректируем сумму по данным из внешнего источника, который в свою очередь делает эти корректировки без нашего участия и у нас появляется разбег в суммах
-
Ну хорошо, вам нужно обновить X строк
Как вы мутацию делаете на десять тысяч+ разных строк с разным результатом?
Не индивидуальными мутациями же? -
Как?! Подскажите магию)
-
Так вот же у вас параметры
-
-
-
-
Да не стоит их крутить, вы что то явно не так делаете если они вылезают так
-
Вы просто упретесь в эти лимиты на 600 партов позже и ситуация будет тяжелее
-
-
-
они вылезают только иногда, но по закону подлости в самый неподходящий момент
-
множество мутаций по условию WHERE x = 1 and y=2
и так далее WHERE x = 3 and y=4 -
А, ну так не делайте так
https://kb.altinity.com/altinity-kb-queries-and-syntax/update-via-dictionary/ -
Можете подсказать с какой версии кликхаус сможет сам притормаживать инсерты?
-
спасибо, попробую двигаться в этом направлении
-
Притормаживать умеет давно
Просто в старых версиях, если на половине вставки случалось too many parts то кх кидал ошибку и прерывал вставку. в новых же он проверяет этот лимит только в самом начале, и это точно есть в 21.8 -
Супер!!! Спасибо!!!
-
спасибо, все получилось. проверил и закоммитил с вашими предложениями.
Описал в комментах как работает этот сумашедший синтаксис tuple(COLUMNS('tupleElement') APPLY avg) -
так мы это сразу проверили,но это AD windows,там не работает ldapsearch,мы проверили через adsi,все работает,группы находятся
-
-
-
-
Можно с любого линукса в сети
-
Это довольно долго для меня. Давайте перенесем обсуждение в GitHub issues, и там опишем steps to reproduce.
Я же все это проверял в свое время. -
ок,давайте,заведу проблему
-
INSERT INTO WCR SELECT
now(),
j,
tuple(COLUMNS('tupleElement') APPLY avg) AS C,
groupArray(i)
FROM
(
WITH
arrayMap((j, C) -> (j, L2Distance(C, Y)), W.1, W.2) AS D,
(
SELECT
groupArray(j),
groupArray(C)
FROM WCR
WHERE ts = (
SELECT max(ts)
FROM WCR
)
) AS W
SELECT
untuple(Y),
i,
arrayReduce('argMin', D.1, D.2) AS j
FROM YH
)
GROUP BY j
INSERT INTO WCR SELECT
now(),
j,
tuple(COLUMNS('tupleElement') APPLY avg) AS C,
groupArray(i)
FROM
(
WITH
arraySort((j, C) -> L2Distance(C, Y), W.1, W.2) AS D,
(
SELECT
groupArray(j),
groupArray(C)
FROM WCR
WHERE ts = (
SELECT max(ts)
FROM WCR
)
) AS W
SELECT
untuple(Y),
i,
D[1] AS j
FROM YH
)
GROUP BY j
Можно дальше постараться уменьшить число применяемых функций.(Замена CROSS JOIN на WITH спорна, нужно смотреть что будет по производительности) -
Я тоже колебался между двумя этими вариантами, но остановился на global cross join потому как в шардированной конфигурации нужно отсылать текущий WCR (точнее его кусочек) на шарды, with так не умеет.
И давно хотел спросить - в КХ есть оптимизации, чтобы CTE выражение не выполнялось для каждой строки заново? Скажем rand32() в строках и в with выполняется для каждой строки. А в случае cross join - только один раз. -
WITH x as (SELECT * FROM numbers(10))
Выполниться каждый раз, как будет упоминаться в запросе
WITH (SELECT groupArray(number) FROM numbers(10)) as x
Выполнится только один раз (и должен будет отправить на все сервера тк эт скаляр) -
-
WITH (
SELECT rand() % 100
) AS x
SELECT
number,
x
FROM numbers(10)
Query id: 6ed06ca7-73aa-4179-96a9-5b3acbd85384
┌─number─┬──x─┐
│ 0 │ 32 │
│ 1 │ 32 │
│ 2 │ 32 │
│ 3 │ 32 │
│ 4 │ 32 │
│ 5 │ 32 │
│ 6 │ 32 │
│ 7 │ 32 │
│ 8 │ 32 │
│ 9 │ 32 │
└────────┴────┘ -
Тоже забавное, надо будет кстати эту разницу записать (думаю так сделано только для rand() функции)
-
Дмитрий, скажите, Altinity clickhouse-mysql жрет 90% от двухъядерного проца виртуалки это нормально?
-
Честно, он вроде был сделан для определенного клиента (или даже просто как POC) давным-давно и после этого толком не развивали. (забавно наблюдать, что люди в issue сами решают свои вопросы и закрывают их)
Так что хз.
Если делать стриминг из mysql я бы смотрел либо в сторону MaterializedMySQL либо debezium + Kafka(RedPanda) -
Ок понятно. Спасибо. Буду смотреть в эту сторону
-
> Можно дальше постараться уменьшить число применяемых функций
после вашей правки особо и уменьшать-то некуда.
Там может возникнуть более серьезная проблема, когда на большом объеме данных массив с ключами изначальной таблицы будет слишком большим. Скажем если делить ярд строк на 5 кластеров, то в одном массиве может оказаться 200M элементов. Это наверное нехорошо. Возможно стоит применить bitmap - будет компактнее. -
Хмм, а что если надо с определенной позиции данные забирать?
-
-
> Это наверное нехорошо.
Да, это сильно грустно (особенно учитывая, что в случае с JOIN там этот массив будет размножаться на каждую строку)
Я бы вообще смотрел в другую сторону -> вместо того что бы собрать все значения в 1 массив, побить все по сетке? и джойнить только те, которые находятся ближе чем некоторое заданное наперед X. -
позиции где или чего? (как вы ее определяете?)
-
Mysql, в вашем демоне можно указывать с какой позиции начинать читать бинлог
-
https://debezium.io/documentation/reference/1.7/connectors/mysql.html
В debezium можно достать позицию и отфильтровать по ней. -
Интересно, спасибо, когда такую переливку данных делал, только ваш проект почему-то нашел)
-
размер блока на вставку миллион строк по умолчанию
можно увеличить
max_insert_block_size -
Мы увеличили min(не помню точно названия) и поставили 5 потоков, стало только хуже
-
А так как мы переливаем данные через select insert , то она бесполезно, как мы поняли
-
-
Что значит слить в одну?
-
Есть отношение OneToMany по полю match_id, хотел как в реляционных базах использовать JOIN для запросов, но поскольку одна таблица 1.5 терабайта, а другая 70 гигабайт, у меня нет возможности выгружать ни одну из них в оперативку. В связи с этим, чтобы отказаться от JOIN'ов, хочу иметь все данные в одной таблице
-
скорее всего это нужно сделать до КХ
-
То есть выгрузить все данные и вставлять уже в нужную архитектуру?
-
вы хотите разово сделать одну большую таблицу и туда писать селекты или вы хотите писать в одну таблицу и потом из нее делать селекты?
-
Не совсем понял, а в чем принципиальная разница?
-
в том что если у вас статичные данные, то скорее всего можно несколькими запросами слить две таблицы в одну и из нее делать селекты.
А если у вас динамические данные, то вам нужно перед вставкой в КХ соединить данные и вставлять в одну таблицу. -
Данные статичные. Просто после сливания таблицы изменим запрос на вставку и будем объединять данные
-
тогда сделайте таблицу с нужной структурой, перелейте туда данные несколькими запросами из двух таблиц (чтобы правой таблице хватало памяти) и дальше меняйте запрос на вставку и пишите в новую таблицу
-
Понял, спасибо. Буду пробовать
-
-
Матрица ,)))
-
Таким цветом не скучаешь перед логами ))))
-
-
Вечер добрый, господа.
Кто-то проверял или помнит место в доке, где говорилось откуда конфиг загрузится первым и у кого приоритет?
conf.d или config.d, при условии наличия обоих ? -
-
-
Были вопросы по этому поводу в чате поищите. Были слова brew, arm и т.д.
-
GitHub - Altinity/homebrew-clickhouse: ClickHouse Homebrew tap (by Altinity)
ClickHouse Homebrew tap (by Altinity). Contribute to Altinity/homebrew-clickhouse development by creating an account on GitHub.
-
?
- 11 January 2022 (115 messages)
-
что-то сломались ссылки на загрузку
macOS — curl -O 'https://builds.clickhouse.com/master/macos/clickhouse' && chmod a+x ./clickhouse
FreeBSD — curl -O 'https://builds.clickhouse.com/master/freebsd/clickhouse' && chmod a+x ./clickhouse
AArch64 — curl -O 'https://builds.clickhouse.com/master/aarch64/clickhouse' && chmod a+x ./clickhouse -
задача вроде простая, но чето закопался, нужно сгенерировать последние 30 дней селектом (чтобы к ним джойнить ) другие штуки. у меня какая-то сложная хрень выходит. по идее можно как-то просто массивами или как-то еще. может кто-то сталкивался как в кликхаусе просто сделать?
-
Подскажите, использую настройки
max_bytes_before_external_sort=7000000000, max_bytes_before_external_group_by=7000000000, max_memory_usage=0, distributed_aggregation_memory_efficient=1, aggregation_memory_efficient_merge_threads=1
получаю ошибку:
Code: 241, e.displayText() = DB::Exception: Memory limit (total) exceeded: would use 53.08 GiB (attempt to allocate chunk of 4197703 bytes), maximum: 53.08 GiB: While executing SourceFromNativeStream
место на SSD ещё есть... что поправить? -
select toDate(now()) - interval number day from numbers(30);
-
я обычно ещё max_threads=1 ставлю. Ну или 2. Их там вроде 8 по умолчанию - получается 7*8=56Gb.
а в чем смысл ставить max_memory_usage=0? рекомендуют в два раза больше чем max_bytes_before_external_group_by.
и ещё миловидов как-то проговорился на презентации что можно писать так - max_bytes_before_external_group_by='40G' -
Ну как проговорился, прям на слайде показал 😂
-
спасибо большое!
-
Как раз размышлял над этой проблемой
Пришел к мысли, что возможно не S3 делать на "дешёвых серверах с HDD", а прокидывать блочное устройство по iSCSI в сервер, и по storage_policy туда переливать.
В случае заполнения холодного - делаем новые сервера с iscsi, добавляем в виде диска в кликхаус. А на старом сервере, где был iSCSI-target поднимаем кликхаус, добавляем его в кластер и аттачим данные с локального диска, которые ранее по iscsi экспортили на другой хост. Получается полноценный clickhouse сервер с холодными данными с практически моментальной миграцией
При этом основные сервера кликхауса , на которые идёт вставка и горячие запросы, останутся довольно мощными машинками, с SSD. А холодные данные через полгода-год уедут на дешёвые hdd/cpu
Плюсы в сравнении с s3 - можно переподключить данные впоследствии как обычный диск. Ну и работать мне кажется должно побыстрее s3, как минимум будет работать дисковый кэш
Задача - смигрировать старые данные на дешёвый сторадж
Сейчас холодной хранилки нет вообще, в существующее железо добавить нельзя HDD (все слоты 2.5 и забиты SSD максимального объема)
Можно было бы взять серверов с HDD, сделать на старых серверах detach старых партиций, переместить их на новые дешёвые сервера с hdd и там аттачнуть, но это полу-ручная работа, которую нужно контролировать -
Подскажите, есть возможность распарсить json array в отдельные строки для вставки?
echo '{"data": [{"aaa": "1","bbb": "11"},{"aaa": "2","bbb": "22"}]}'|jq
{
"data": [
{
"aaa": "1",
"bbb": "11"
},
{
"aaa": "2",
"bbb": "22"
}
]
} -
Привет. столкнулся со странной проблемой, при запросе типа
select *
FROM tab
WHERE dt >= 1634320238 and dt <= 1634323838 ORDER BY eid;
получаю ошибку вида
SQL Error [1002]: ClickHouse exception, code: 1002, host: 172.16.36.2, port: 3504; Code: 9. DB::Exception: Size of filter doesn't match size of column.: While executing MergeTreeInOrder. (SIZES_OF_COLUMNS_DOESNT_MATCH) (version 21.11.4.14 (official build))
поле dt типа int32 и согласно официальной документации может принимать значения
Int32 — [-2147483648 : 2147483647] -
а если привести фильтр значения к типу колонки? dt >=toInt32(1634320238), например
-
тот же результат
-
-
-
with '{"data": [{"aaa": "1","bbb": "11"},{"aaa": "2","bbb": "22"}]}' as j
SELECT arrayJoin(JSONExtractArrayRaw(j,'data'));
или даже так:
with '{"data": [{"aaa": "1","bbb": "11"},{"aaa": "2","bbb": "22"}]}' as j
SELECT cast(JSONExtractKeysAndValues(arrayJoin(JSONExtractArrayRaw(j,'data')),'String'),'Map(String,String)'); -
-
optimize_on_insert влияет только на те данные, которые вставляются
в таблице данные в фоне еще будет досхлопываться -
Но то что вставляет будет моментально схлопнуто, не в фоне, верно?
-
Да, сразу схлопнутся только данные из инсерта. Если есть такие же данные на диске они схлопнутся в фоне с новыми
-
Ок, спасибо за пояснение, это я и хотел услышать.
-
Всем привет.
Есть реплицируемая на два сервера таблица с TTL 14 дней. Заметили, что сильно различается количество записей на серверах. Судя по всему, на одном сервере TTL отрабатывает (самая старая запись от 27.12), а на другом - нет (самая старая запись от 05.12).
Данные пишутся кусками пачками по 20к поочерёдно то на один, то на другой сервер.
CH 21.8.8.29
Можете подсказать в какую сторону копать? -
действия с партами реплицируются тоже, если на одном отработал то на втором тоже должен
-
-
да, если железо позволяет, можно iSCSI, но тут тоже наверное надо беспокоиться
можно или нет делать ReadWriteMany режим доступа
или надо нарезать диски через thin provisioning
опять же балансировка нагрузки
в кубах iSCSI CSI пока малость сырой
https://github.com/kubernetes-csi/csi-driver-iscsi
можно наверное через kubernetes и https://github.com/minio/directpv CSI сделать
но там под капотом XFS
и опять же непонятно что с ReadWriteMany чтобы CPU на HDD полках можно было бы задейтвовать...GitHub - kubernetes-csi/csi-driver-iscsiContribute to kubernetes-csi/csi-driver-iscsi development by creating an account on GitHub.
-
тут нет задачи с readWriteMany, холодная хранилка будет не на одной машине
хотим к каждому серверу клика (dell powerage 8x4Tb SSD) докинуть сторадж, просто добавив нод с 4x16Tb HDD -
а какой сетап? puppet/ansible/salt? или кубы?
просто потом переключение этого самого storage, не видится чем то легким
ну и ваш CPU на cold storage IMHO будет обслуживать iSCSI довольно шустро -
Разное количество активных партов.
А part_log к сожалению выключен. -
в кубы это не потащили из-за размера данных, достался сетап на дедиках
к примеру на pvc в цефе это не выживет, малейшая ребалансировка - и перемещение сотни теребайт данных положит цеф
можно конечно сделать отдельные ноды с локал-стораджем под кликхаус
в любом случае миграция такого объема данных - довольно затратная операция, что по времени, что по серверам (и деньгам соответственно)
поэтому нарастить cold storage через сетевое блочное устройство показалось меньшим из зол -
system.replication_queue.
ну и грепать логи с именами партов...
у нас было пару раз расхождение, решилось запретом лидерства у всех реплик кроме одной
https://t.me/clickhouse_ru/221529【D】【J】 in ClickHouse не тормозитпричем там многоуровневое расхождение Т.Т сначала warnings потом ошибки... Part 20210414-421_0_228_4 is covered by 20210414-421_0_228_4_1436 but should be merged into 20210414-421_0_1279_5. This shouldn't happen often.
-
Спасибо.
-
-
не верно понимаете. все работает. смотрите историю канала. скорее всего у вас проблема в jdbc драйвере. попробуйте через clickhouse-client.
-
Работают, вы видимо сидите в датагрипе(или чем-то похожем через jdbc), поищите по чату по слову jdbc много раз была проблема такая
SELECT
now(),
toDateTime(now(), 'Europe/London'),
toDateTime(now(), 'Europe/Moscow')
Query id: 107d3b75-7a7d-4a5a-9ebf-9a0f08cc7a37
┌───────────────now()─┬─toDateTime(now(), 'Europe/London')─┬─toDateTime(now(), 'Europe/Moscow')─┐
│ 2022-01-11 11:18:56 │ 2022-01-11 11:18:56 │ 2022-01-11 14:18:56 │
└─────────────────────┴────────────────────────────────────┴────────────────────────────────────┘ -
Hello!)
Please help me to figure out the following problem: I am using the clickhouse npm package to work with the database from a node.js application. Calling the .query method multiple times creates a lot of connections to the clickhouse. I cannot understand why the client does not use existing connections.
When creating a connection the 'session_check: 0' parameter is used. session timeout 60 seconds.
Thanks a lot!) -
Возможно вам поможет
-
я использую dbeaver и hex, dbt и redash :) в HEX работает из коробки. dbt тестирую в dbeaver нужно разобратся
-
ну dbeaver таже шляпа что и датагрип) в dbt будет нормально работать
-
чтобы проверить, проблема в jdbc или все-таки на стороне CH, оберните дату в toString(dt, 'Europe/Moscow')
-
спасибо большое помогло для dbeaver сейчас в редаше еще поищу
-
Борюсь с импортом данных в через dbeaver из MS SQL, ругается на UUID, пытаясь его сконвертить в название колонок
-
Приветствую, как оптимально перенести таблицу с одного сервера на кластер с 2 шардами ?
-
я бы через scp руками раскидал парты по серверам.
-
Что конкретно будет происходить, если при выборе LowCardinality(String) количество уникальных значений вдруг переплюнет допустим 10/100 миллионов?
-
будет мучительно поднимать словарь с диска и печально лукапить через него. Можно попробовать сгенерить и посмотреть как оно будет.
-
Где то den писал ответ такой, прям красивый, что тип похуй сколько у вас уников, главное чтобы в одной (партиции или партишене или в куске или грануле ) не больше было ....
-
Наверное речь про один парт.
-
Наверное, есть видео где абсолютно спокойно всех комитеров GitHub заносят в LowCardinality
-
Но это только видосик от Алексея :)
-
-
Спасибо, посмотрю!
-
-
-
что имеется ввиду под словами "mysql интерфейс"?
хочется чтобы clickhouse-server притворялся MySQL сервером?
или хочется из clickhouse-server забирать данные из MySQL? -
Попробовал и сгенерил, создает один большой словарь и ложит его на диск.
-
Первое, чтобы clickhouse был mysql сервером. Я так понимаю логины/пароли тут все прежние используются, что и для самого clickhouse. Думаю мой вопрос на этом отпал.
-
А может есть какой-то способ вытеснять парты на другой сервер CH, с медленными дисками, отличны от detach/scp/attach ? Аналогично как они вытесняются на другой сторадж.
-
там теже самые логины и пароли что и для обычного clickhouse
вам только mysql_port надо в config.xml прописать
по умолчанию пользователь default Без пароля -
да, вот я это уже понял))
-
Скорее нет, чем есть
Можете чуть подсластить пилюлю с помощью
ALTER TABLE xxx FETCH PARTITION FROM
или попробовать https://github.com/ClickHouse/ClickHouse/pull/17871Part movement between shards by nvartolomei · Pull Request #17871 · ClickHouse/ClickHouseThis is ready for feedback. Implements part uuid "pinning" and movement between shards. Part of #13574 Outstanding tasks for next PR ALTER TABLE t MOVE PART x CANCEL or similar. ...
-
Подскажите пожалуйста агрегирую данные с подключением словаря, и задача еще после получения агрегата заменить id на значения string из другого словаря, сделал так но мне кажется как то проще должно быть
SELECT SUMM(col1),
dictGet('dict2', attr_2, toUINT64(dictGet('dict_1', attr_1,id))) as atr
FROM Table
GROUP BY atr -
create table logs
(
day Date,
time Float64,
method String,
request String,
....
)
engine = MergeTree PARTITION BY day ORDER BY (day, time, response_code) TTL day + toIntervalMonth(3) SETTINGS index_granularity = 8192, merge_with_ttl_timeout = 3600;
clickhouse-server:19.17.9.6 в gcp
Клик не удаляет логи старше трех месяцев, только если в ручную дропать, почему ttl не срабатывает есть идеи?) -
Добрый день всем. Пытаюсь обновить CH на версию 21,12,3,32, но сервер не стартует.
`2022.01.11 13:41:17.892939 [ 186404 ] {} <Error> Application: DB::Exception: If 'engine' is specified for system table, PARTITION BY parameters should be specified directly inside 'engine' and 'partition_by' setting doesn't make sense
2022.01.11 13:41:48.514880 [ 186471 ] {} <Error> Application: Caught exception while loading metadata: Code: 36. DB::Exception: If 'engine' is specified for system table, PARTITION BY parameters should be specified directly inside 'engine' and 'partition_by' setting doesn't make sense. (BAD_ARGUMENTS), 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) @ 0xa21959a in /usr/bin/clickhouse
1. DB::SystemLogs::SystemLogs(std::__1::shared_ptr<DB::Context const>, Poco::Util::AbstractConfiguration const&) @ 0x133ca5f6 in /usr/bin/clickhouse
2. DB::Context::initializeSystemLogs() @ 0x12ccd74f in /usr/bin/clickhouse
3. DB::Server::main(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&) @ 0xa29fa11 in /usr/bin/clickhouse
4. Poco::Util::Application::run() @ 0x16f53846 in /usr/bin/clickhouse
5. DB::Server::run() @ 0xa292554 in /usr/bin/clickhouse
6. mainEntryClickHouseServer(int, char**) @ 0xa2906e7 in /usr/bin/clickhouse
7. main @ 0xa213a0a in /usr/bin/clickhouse
8. __libc_start_main @ 0x7f4a6c0fb0b3 in ?
9. _start @ 0xa0a782e in /usr/bin/clickhouse
(version 21.12.3.32 (official build))` -
-
-
а в чем проблема? ну вложенные dictGet
что в них сложного? -
идея одна, старая версия clickhouse
вам бы обновиться -
Тоесть так нормально, только начинаю пользоваться, поэтому боюсь привыкнуть к плохому объем не очень большой поэтому могу не заметить
-
да, так нормально, если словари консистентны с вашими данными
если у вас какой нибудь SLOW CHANGED DIMENSION
то можно Range Dictionary использовать -
а на какой версии у вас вторым аргументом получилось колонку запихнуть? На 21.8.8 получаю Illegal type String of second argument of function dictGet, expected a const string or const tuple of const strings. из-за этого испытываю боль
-
Посмотрю я из докерхаба последнюю
-
все четко прописано, надо только прочитать
If 'engine' is specified for system table, PARTITION BY parameters should be specified directly inside 'engine' and 'partition_by' setting doesn't make sense
config.xml кривой
правда непонятно для какой конкретно таблицы в базе system
query_log
part_log
system_log
как это может выглядеть примеры тут
https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings/#server_configuration_parameters-query-log
думаю вам надо просто <partition_by> секцию убрать и перенести ее в <engine>Server Settings | ClickHouse DocumentationServer Settings builtin_dictionaries_reload_interval The interval in seconds before reloading built-in dictionaries. Cli
-
-
system.part_log | ClickHouse Documentation
system.part_log The system.part_log table is created only if the part_log server setting is specified. This table contai
-
что уж
-
Да, спасибо, что-то сразу не понял что это то что мне нужно.
-
добрый вечер. подскажите пожалуйста в чем может быть проблема?
пытаюсь настроить clickhouse-keeper
получаю такие warning:
RaftInstance: failed to send prevote request: peer 3 (ip--70.ec2.internal:9444) is busy
<Warning> RaftInstance: failed to send prevote request: peer 2 (ip--73.ec2.internal:9444) is busy
почему-то прослушиваемый порт на tcp6 висит
tcp6 0 0 :::9444 :::* LISTEN 141851/clickhouse-s
может быть в этом проблема? как его на tcp4 повесить? -
давай давай, злобный бот, покаж сисьски через SQL запрос без join
-
Откройте окошко
-
Сервер КХ может перегреться
-
listen_host как задан?
-
listen_host:
- "::" -
-
Спасибо, помогло. Странно, что предыдущая версия нормально работала.
-
SELECT ' 88 M::::::::::::8888:88888888888888888::::::Mm8 88888 888\n 88 M::::::::::8888M::88888::888888888888:::::::Mm88888 88\n 8 MM::::::::8888M:::8888:::::888888888888::::::::Mm8 4\n 8M:::::::8888M:::::888:::::::88:::8888888::::::::Mm 2\n 88MM:::::8888M:::::::88::::::::8:::::888888:::M:::::M\n 8888M:::::888MM::::::::8:::::::::::M::::8888::::M::::M\n 88888M:::::88:M::::::::::8:::::::::::M:::8888::::::M::M\n 88 888MM:::888:M:::::::::::::::::::::::M:8888:::::::::M:\n 8 88888M:::88::M:::::::::::::::::::::::MM:88::::::::::::M\n 88888M:::88::M::::::::::*88*::::::::::M:88::::::::::::::M\n 888888M:::88::M:::::::::88@@88:::::::::M::88::::::::::::::M\n 888888MM::88::MM::::::::88@@88:::::::::M:::8::::::::::::::*8\n 88888 M:::8::MM:::::::::*88*::::::::::M:::::::::::::::::88@@\n 8888 MM::::::MM:::::::::::::::::::::MM:::::::::::::::::88@@\n 888 M:::::::MM:::::::::::::::::::MM::M::::::::::::::::*8\n 888 MM:::::::MMM::::::::::::::::MM:::MM:::::::::::::::M\n 88 M::::::::MMMM:::::::::::MMMM:::::MM::::::::::::MM\n 88 MM:::::::::MMMMMMMMMMMMMMM::::::::MMM::::::::MMM\n 88 MM::::::::::::MMMMMMM::::::::::::::MMMMMMMMMM\n 88 8MM::::::::::::::::::::::::::::::::::MMMMMM\n 8 88MM::::::::::::::::::::::M:::M::::::::MM'
-
😂
-
Запости в КБ Альтинити 😄
-
-
-
-
Для опции optimize_move_to_prewhere_if_final написано, что она может приводить к неправильным результатам. Кто-нибудь знает почему? Т.е. я понимаю, что может быть выбраны не все парты со значениями, но это может не быть важным к примеру для ReplacingMergeTree.
-
Например вы делаете фильтр по колонке time < x
Если сначала сделать фильтрацию то может так статься, что будут выбраны старые строки. -
Понятно, спасибо
-
ничего странного, в предыдущей версии скорее всего просто не была добавлена такая валидация и был наверняка скрытый баг если PARTITION BY задан в engine и в partition_by теге
-
Не поглядели? latest из докерхаба накатил (21.12.3) и всё также получаю
Illegal type String of second argument of function dictGet, expected a const string or const tuple of const strings. -
const string
это значит что детерменированное значение должно быть
а вы поди туда имя поля засовываете? -
вкурсе, да. просто в примере выше вроде колонку кто-то смог прокинуть, вот и пытаюсь узнать как)
-
21.12.3.32
-
Привет, а я верно понимаю, при использовании (экспорт данных в csv) clickhouse-client и format==CSV нет параметров, которым можно отключить кавычки?
Чтобы в csv вместо ”string”, 55 было string, 55 -
а attr_2 и attr_1 это названия колонок или аттрибутов словаря?
-
-
-
-
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-converting-mergetree-to-replicated/
вам №3, который задокументирован на сайте КХ -
-
-
Спасибо
-
Друзья, есть ли способ подставить пароль при создании внешнего словаря из подзапроса или еще как-то: вместо того, чтобы прописывать его строкой? Или единственный способ скрыть пароль от глаз - создавать словарь в xml файлах?
-
А аггрегированных данных сколько будет? Есть подозрение что мержи не будут успевать, хотя бы денёк на диске храните, чтобы успевало помержить, а потом через TTL пусть двигает на С3.
-
30 гигабайт в день примерно сжатых. Вообще да отличная идея, буду двигать через ttl
-
Добрый вечер. Подскажите пожалуйста, только начинаю разбираться в ClickHouse.
Создал таблицу с вот таким конфигом:
engine = MergeTree
PARTITION BY toYYYYMM(date)
ORDER BY (intHash32(user_id), date)
SAMPLE BY intHash32(user_id);
Согласно документации выражение для сэмплирования должно быть частью первичного ключа.
Когда выполняю запросы вида WHERE user_id = 10 происходит полное сканирование таблицы, поэтому приходится писать WHERE intHash32(user_id) = intHash32(10)
Неужели CH не может самостоятельно оптимизировать запрос с WHERE user_id = 10?
Или я что-то не так делаю? -
Добрый вечер!
Подскажите плиз как узнать какие grants есть у роли ?
В system.roles только id есть -
Добрый вечер.
<Error> void DB::MergeTreeBackgroundExecutor<DB::MergeMutateRuntimeQueue>::routine(DB::TaskRuntimeDataPtr) [Queue = DB::MergeMutateRuntimeQueue]: Code: 40. DB::Exception: Checksum doesn't match: corrupted data. Reference: 2e1936f7140a491d114e11e73cac2c6b. Actual: c629ae8fab71c834040ea7b1c3fe5025. Size of compressed block: 61593. The mismatch is caused by single bit flip in data block at byte 29893, bit 0. This is most likely due to hardware failure. If you receive broken data over network and the error does not repeat every time, this can be caused by bad RAM on network interface controller or bad controller itself or bad RAM on network switches or bad CPU on network switches (look at the logs on related network switches; note that TCP checksums don't help) or bad RAM on host (look at dmesg or kern.log for enormous amount of EDAC errors, ECC-related reports, Machine Check Exceptions, mcelog; note that ECC memory can fail if the number of errors is huge) or bad CPU on host. If you read data from disk, this can be caused by disk bit rot. This exception protects ClickHouse from data corruption due to hardware failures.: (while reading column nickname): While executing MergeTreeSequentialSource. (CHECKSUM_DOESNT_MATCH), Stack trace (when copying this message, always include the lines below):
Как понять где битфлип-то ?? Раньше хоть путь на диске писало -
Ну вам наверное ещё раз нужно прочитать часть про хранения данных
-
Скорее всего семплинг вам не нужен
https://kb.altinity.com/engines/mergetree-table-engine-family/pick-keys/
https://kb.altinity.com/altinity-kb-queries-and-syntax/altinity-kb-sample-by/
https://kb.altinity.com/altinity-kb-queries-and-syntax/sampling-example/How to pick an ORDER BY / PRIMARY KEY / PARTITION BY for the MergeTree-family tableHow to pick an ORDER BY / PRIMARY KEY / PARTITION BY for the MergeTree table.
-
Джентельмены, а не приходилось ли кому-нибудь использовать визуальные GUI для составления сложных SQL-запросов?
Ну, с хитрыми группировками, многоступенчатыми JOINами, многажды вложенными подзапросами -- и прочими радостями?
А если использовали, то что именно -- и было ли это полезно? - 12 January 2022 (157 messages)
-
Доброго дня, сударь. Пользуюсь заморской IDE Jetbrains Webstorm 2021.3.1, зело полезная и удобная программа. И сложные запросы и вложенные подзапросы и даже JOIN (будь они неладны - для Clickhouse лучше не злоупотреблять) приходилось использовать, да не единожды. )
-
Приветвтвую, в ClickHouse новичок, есть такая таблица:
CREATE TABLE IF NOT EXISTS user_value.aggregate
(
time_bucket DateTime,
gamer_id String,
game_id UInt32,
geo LowCardinality(String),
spend Float64,
revenue Float64,
requests UInt64
geo)
) ENGINE = SummingMergeTree()
ORDER BY (gamer_id, game_id, geo, time_bucket)
PARTITION BY toStartOfHour(time_bucket)
Заполняется таким MV:
CREATE MATERIALIZED VIEW IF NOT EXISTS user_value.aggregate_mv
TO user_value.aggregate AS
SELECT toStartOfFiveMinute(ts) AS time_bucket,
gamer_id,
game_id,
geo,
sum(spend) as spend,
sum(revenue) as revenue,
sum(requests) as requests
FROM user_value.event
GROUP BY (gamer_id, game_id, geo, time_bucket)
ORDER BY (gamer_id, game_id, geo, time_bucket);
При попытке суммировать по окну:
SELECT gamer_id,
game_id,
geo,
sum(requests) OVER w AS user_value
FROM user_value.aggregate
GROUP BY (gamer_id, game_id, geo, time_bucket)
WINDOW w AS (PARTITION BY (gamer_id, game_id, geo) ORDER BY gamer_id, game_id, geo, time_bucket ROWS BETWEEN 160 PRECEDING AND CURRENT ROW)
ORDER BY (gamer_id, game_id, geo, time_bucket)
Ругается:
Received exception from server (version 21.12.3):
Code: 215. DB::Exception: Received from clickhouse-server:9000. DB::Exception: Column `requests` is not under aggregate function and not in GROUP BY: While processing gamer_id, game_id, geo, sum(requests) OVER w AS user_value. (NOT_AN_AGGREGATE)
Что я не так делаю? Заранее благодарен! -
Здравствуйте. Вы сумму оконной функцией производите - соответственно группировать столбцы не нужно. Попробуйте так:
SELECT gamer_id,
game_id,
geo,
sum(requests) OVER w AS user_value
FROM user_value.aggregate
WINDOW w AS (PARTITION BY (gamer_id, game_id, geo) ORDER BY gamer_id, game_id, geo, time_bucket ROWS BETWEEN 160 PRECEDING AND CURRENT ROW)
ORDER BY (gamer_id, game_id, geo, time_bucket) -
Работает! Спасибо большое Роман!
-
День добрый!
Лет 5-7 назад пробовал GUI в SQL Navigator или чем-то подобном...
Дико не удобно было, особенно JOINы
С тех пор не пользуюсь. -
Как-то можно заставить кликхаус не трогать экранирование символов при работе с json?
{"data":"{\"message\":\"test\"}"}
Чтоб подобное просто оставалось строкой. -
JSONExtractRaw
-
Помогло, спасибо.
-
Добрый день.
Можно как-то вручную поменять тип колонки когда я знаю что это безопасно и MODIFY COLUMN отказывается делать это? К примеру, поменять тип с AggregateFunction(quantiles(0.5), Int64) на AggregateFunction(quantiles(0.5), Float32). Что-то типа подредактировать файлы ClickHouse если это хранится в одном месте. -
Я даже issue открыл - возможно там понятнее описано.
https://github.com/ClickHouse/ClickHouse/issues/27761Allow type casts between aggregate function states with the same representation · Issue #27761 · ClickHouse/ClickHouseFor example, it is not possible to change column type from quantilesTDigest to quantilesTDigestWeighted CREATE TABLE test ( `foo` AggregateFunction(quantilesTDigest(0.5), Float32) ) ENGINE = MergeT...
-
после перехода на современный стиль написания запросов с with (как у гитлаб) вообще пропала необходимость во вложенных/двойных джоинах и прочей буде. рекомендую короче
-
А средства визуального проектирования запросов, типа, не нужны?
-
по любому нужны. Но если писать многоуровневые дедовские квери то в голове каша и ничего не понятно как ни рисуй.
сейчас развиваем sql магию под себя так что по каждой части запроса сразу видно промежуточные итоги, очень удобно для проектирования сложных расчетов -
Sql магию? Это вы об чем же?
-
настройка к юпитерноутбукам и пр (https://www.sqlalchemy.org/ ) чтобы sql кушали хорошо. Например в HEX можно использовать clickhouse. И там можно прибавлять всякий сахар.
но всё это имеет смысл когда используешь красивый стиль кода -
А, алхемушка! А бэкенд под КХ какой пользуете? От xzkostyan?
-
Datagrip + Clickhouse для исполнения написанного запроса. В остальном проверки выполнения запросов через clickhouse-benchmark и трейсинг логов, до flamegraph еще не дотянулись руки.
-
ну там куча всего. аналитическая часть в DBT но, это не совсем бэкенд.
-
вот я про такой стиль кода https://gitlab.com/gitlab-data/analytics/-/blob/master/transform/snowflake-dbt/models/marts/pumps/subscription_product_usage_data.sqltransform/snowflake-dbt/models/marts/pumps/subscription_product_usage_data.sql · master · GitLab Data / GitLab Data Team
This is the primary project for the GitLab Data team.
-
dbeaver для написания запросов. Лично я люблю запустить их потом через clickhouse-client, потому что в конце выполнения запроса выводится его результат, скорость, количество строк, количество строк участвующий в фильтрации и тд. Это можно и самому посмотреть, но надо лезть в логи запросов, а тут все сразу. Т.е если вам не нужна какая-то статистика, а только результат и время выполнения то dbeaver справляется хорошо.
-
а есть какой-то удобный способ запускать запросы напрямую в кликхаус? или вы через командну строку? о каком клиенте речь подскажите?
-
во нашел походу, затестирую https://tabix.io/
-
https://clickhouse.com/docs/ru/interfaces/http/
если у вас не что то древнее, то можно напрямую через веб интерфейс КХ ходить -
Как я понимаю, адекватные логи выполнения запроса можно получить только через clickhouse-client. Что немного печалит(
-
http://localhost:8123/play - вот еще есть родной WUI, адрес естественно и порт свой указать нужно
-
да норм в text_log собирается. но нужно заморочится настроить фильтры чтобы лишнее не смотреть
-
select * from system.query_log; Не знаю, здесь можно смотреть.
-
clickhouse-client это из консоли
-
Там есть что-то. Но если отлаживаешь запрос то нужно что то детальнее
-
explain?
-
-
Explain тоже интересная штука но без реальных цифр. На самом деле если скрестить Explain и логи из clickhouse-client то как раз и получится какой-то Profiler, как скажем в MSSQL
-
вы чего хотите избежать? чтобы пароль в system.query_log не попадал?
-
ага у меня для отладки запрос который сначала находит мой запрос в query_log и потом идет в text_log собирает инфу.
text_log оказалась супер удобен для отслеживания внешних интеграций. если колонку переименовали например то можно увидеть что гуглдатастудия не может найти колонку -
и это тоже, и чтобы при запросе show create table его не было видно
-
тогда XML словарь
и пароль там через <password from_env="ENV_NAME">
и переменную окружения надо будет как то передать в clickhouse
у вас standalone сервере или контейнеризация? -
Кстати надо заглянуть в эту таблицу. Мы просто облачным решением от Яндекса пользуемся, поэтому все эти таблицы типа query_log query_thread_log какие то урезанные.
-
еще может быть она не включена. нужно ее включить. ну вы запросите с неё данные и увидите может она есть уже
-
-
нет нету. попробую включить
-
ну я еще для удобства юзаю settings log_comment = 'query', тогда в query_log проще найти свои запросы.
-
Ок, спасибо. text_log включил, попробую через него по отлаживать.
-
Вот об этом и был вопрос) возможно ли чисто ddl обойтись) видимо нет)
спасибо за ответ) -
Не нашел в истории сообщений, поэтому быстрый вопрос😀
Есть куча партиций с файлами по 90Мб
Что будет быстрее, вставлять по одной партиции в параллель в 15 потоков
или вставлять сразу 15 партиций, где каждая партиция вставляется в один поток?
Или какоето другое решение будет лучшим? -
строить архитектуру учитывая не только вставку, но и выборку
-
Добрый день! Коллеги, у нас проблема: сыпятся диски. Меняем диски на дисковой полке. Но постоянно получаем ошибки Code: 246. DB::Exception: Received from 127.0.0.1:9900. DB::Exception: Bad size of marks file '/var/lib/clickhouse/data/default/.../data.mrk3': 6840, must be: 1080: While executing MergeTreeThread. Подскажите пожалуйста как нам найти все плохие parition-ы таблицы чтобы через detach./ attach и удаление плохих файлов остались только небитые партишены? Мы можем потерять немного данных (логи) - и наша задача сейчас оставить как можно большее количество
-
скучновато
-
Сделай шардирование на кликхаусе :)
-
Господа, есть ли возможность в КХ понять, какие значения были вставлены в таблицу по query_log?
У меня есть айдишник квери и текст в формате insert into A(a,b,c) values
и вот на values поле query заканчивается.
Может есть способ восстановить заинсерченые значение или просто перепрогнать ту же кверю по айдишнику? -
-
по query_log нельзя, он же не будет хранить миллионы вставленных строк, тогда лог будет больше самой базы
-
Прописываете в profiles.yml подключение к каждому шарду и используете при dbt run флаг --target *название таргета для шарда*. И так на каждый шард. Распараллелить можете в том же эйрфлоу, по таске на каждый шард
-
Спасибо, а если усложнить, и надо много запросов на 1 шард, например разбиваем 1 жирный запрос чтобы в память укладывался через where app_id % 30 = {0..29}. Через dbt run --vars нормально делать? + автогенерация тасок в airflow
-
Привет!
Подскажите про работу ZooKeeper в ReplicatedMergeTree для дедублицирования данных + replicated_deduplication_window
1) У меня есть несколько шардов и я хочу понять если я буду пихать один и тот же батч в разные шарды ZooKeeper отловит это или нет.
Нашел в доке
Для очень больших кластеров, можно использовать разные кластеры ZooKeeper для разных шардов. Впрочем, на кластере Яндекс.Метрики (примерно 300 серверов) такой необходимости не возникает.
То есть дефолтно ZooKeeper общий для всех шардов и тогда (если хеш батча не вылетел из памяти) если пихать в разные шарды один и тот же батч - то ZooKeeper должен не дать его записать?
Но в тоже время в этой доке дальше везде идет как будто ZooKeeper для разных шардов всегда разный?
2) настройка replicated_deduplication_window (кол-во сообщений которые хранятся в ZooKeeper) - она на что настраивается - на реплику/на шард/кластер/на таблицу?Репликация данных | Документация ClickHouseРепликация данных Репликация поддерживается только для таблиц семейства MergeTree: ReplicatedMergeTree ReplicatedSumming
-
dbt_users
DBT users group
Взаимное уважение и без спама.
Для вакансий тег #job
Dual language: russian/english
https://t.me/dbt_users
Вполне живое русскоязычное комьюнити. Там был ответ про union_relations макросdbt_usersDBT users group Взаимное уважение и без спама. Для вакансий тег #job Dual language: russian/english
-
Спасибо, изучу, но на первый взгляд это что-то для объединения, а не разбития запроса)
-
Ну а объединять-то данные потом как будете?))
-
так они пишут в 1 таблицу, объединять ничего не надо) Просто 1 запрос на вставку разбивается на 30 маленьких
-
Короче, почитайте. Может это то, что нужно. У меня таких проблем не возникало, только при initial load. Там тупо циклом с переменным делал
-
У нас не смог стартовать с 50к+. Но сервер весьма скромный был
-
Ну он должен это запихнуть в память скорее всего, буфер пула то нету.
-
Да мы не ожидали и столько много - это было неверное предположение о природе данных
-
проблема: создаю database, создаю там таблицы и ни в одну таблицу не производится insert. в query_log запросы появляются с type = 'QueryStart' и 'QueryFinish'. пользователю дал grant all на все таблицы. сам clickhouse-server рестартил. в чём может быть проблема? или куда ещё можно заглянуть?
-
Можно в data директорию таблиц посмотреть, мб оно в detached или куда-то ещё падает
-
спасибо. попробую
-
какой движок у таблицы? как проверяете что данные вставили?
-
движок mergetree. делаю select * запрос в таблицу. она пустая
-
покажите show create table(можете удалить все поля)
и полностью селект -
-
Привет! Есть ли где нибудь статьи о том как работают под капотом мутации для реплицируемой таблицы? Я запустил альтер, думал что он будет выполняться только на одной ноде, а он на самом деле распределился по всем репликам и мерджит свои партиции самостоятельно в произвольном порядке. Можно ли только на одной реплике включить мутирование, а другие пусть продолжают штатную работу? Когда домутирует подтянут актуальную партицию по сети
-
Привет, для ON CLUSTER - возможно ли динамически имя кластера получать? Как в этом случае использовать ddl если необходимо его и в test и в prod кластере выполнить?
-
Создавать копии скрипта с разным именем кластера - кошмар для version control
-
это же DDL, откуда динамика
-
-
через макросы можно
create table tst on cluster '{cluster}'
select * from system.macros where macro = 'cluster'
┌─macro───┬─substitution─┐
│ cluster │ ch_shards │
└─────────┴──────────────┘ -
Спасибо огромное! Сработало 🥳
-
Все ALTER команды реплицируются, на сколько я знаю нельзя запустить только на одной реплике. Все мержи каждая реплика сама делает, она не может дождаться результата мержа другой реплики
-
смотря какой EXPLAIN
EXPLAIN AST и EXPLAIN PLAN вроде не должны сильно память жрать
EXPLAIN PIPELINE по идее может память отожрать, но прямо МНОГо не должен
а как вы меряете память? через system.query_log ? -
Добрый день, подскажите по поводу профелей настроек. Если я укажу что профиль может юзать 1гб памяти, и выдам профиль 10 учеткам. То каждая эта учетка может юзать 1гб, или все вместе? И каким образом можно реализовать работу, когда условно 50% ресурсов отданы одной группе пользователей, вторые 50% другой
-
Code: 241. DB::Exception: Received from x.x.x.x:9000. DB::Exception: Memory limit (total) exceeded: would use 3.94 GiB (attempt to allocate chunk of 0 bytes), maximum: 2.79 GiB: While executing AggregatingTransform: While processing (WITH '2020-01-01 00:00:00' AS beginPeriod, '2021-12-31 23:59:59' AS endPeriod SELECT count() FROM normal_transactions WHERE (cardId > 0) AND (type < 7)) AS cnt_with_cards. (MEMORY_LIMIT_EXCEEDED)
-
-
-
https://clickhouse.com/docs/en/operations/settings/query-complexity/#max-memory-usage-for-user
это чтобы на весь сервер, но ограничение по пользователю а не по профилюRestrictions on Query Complexity | ClickHouse DocumentationRestrictions on Query Complexity Restrictions on query complexity are part of the settings. They are used to provide saf
-
Добрый день! Подключил к clickhouse s3, добавил policy. И перекинул несколько партиций таблицы на s3. В бакете вижу файлы, перенос завершается успешно. Но когда делаю select в этой таблице получаю ошибку: "Cannot read all data. Bytes read: 1. Bytes expected: 8.: (while reading column InstanceType): (while reading from part /var/lib/clickhouse/disks/s3/data/flamedb/samples_local/20220105_0_1619_285/ from mark 0 with max_rows_to_read = 16384): While executing MergeTreeInOrder. (CANNOT_READ_ALL_DATA)"
-
-
While executing AggregatingTransform:
вы точно EXPLAIN запускаете? оно вроде сами трансформации запускать не должно -
Точно
-
если я на профиль накину настройку max_memory_usage = 1gb, выдам профиль 10 юзерам, и каждый юзер запустит кверю на 500mb, то кверя у юзеров отработает, или упадет по нехватке памяти?
-
В том-то и проблема. Что по факту там выполняется всё, хотя мне нужно было только оценить сам запрос. Может быть и запрос корявый (я в личку скинул, он большой), но всё равно очень странно, что explain так работает...
-
емнип это ограничение на один запрос
-
спасибо. А ограничение на целую группу пользователей можно реализовать каким-то образом?
-
max_memory_usage в профиле указывается, видимо это для всего профиля на 1 запрос
-
Всех приветствую! кто подскажет, куда двигаться? Есть таблица на 100 столбцов, одни из которых ModifiedOn(Datetime), Id, sum. Во все остальные столбцы могут записываться NULL. Необходимо вывести все строки, имеющие последние значения по ModifiedOn (можно сказать "схлопывая" соседние, убирая Null) и просуммировать sum. Как сделать LAST_VALUE(*) over(partition by Id order by ModifiedOn desc) для всех столбцов?
-
argMax(value, ModifiedOn)+group by id?
-
это будет одна результирующая строка
а мне нужно для каждого id вывести строку, которая будет содержать последние не null значения всех столбцов согласно ModifiedOn и просуммировать для каждого id все значения sum таблицы -
select id, argMaxIf(value, ModifiedOn, value is not Null), argMax(value, ModifiedOn) from table group by id
-
а value же для единственного столбца. Как мне это применить для всех? то есть, как я думал, SELECT distinct Id, LAST_VALUE(first_column) over(partition by Id order by ModifiedOn desc), LAST_VALUE(second_column) over(partition by Id order by ModifiedOn desc) и так далее from и таких колонок 100
как это объединить? наверно я плохо объясняю -
Обновился с 21.11.4 до 21.12.3 и проблема ушла )
-
да я примерно понял, мб действительно нужно все поля прописать
-
после 10 вылетает по памяти)
-
Хм. Похоже я опять нашел баг. Я уменьшил количество выражений WITH до 1, затем выполнил запрос. Запрос отработал без ошибок. Я начал увеличивать количество выражений и выполнять запросы. На определенном количестве выражений мне выдало ошибку "AST is too big". Я "включил" дурака и снова добавил все оставшиеся выражения в запрос и попытался его выполнить. Сервер выжрал всю память и упал. Получается, что до какого-то количества выражений производится анализ и блокирует выполнение запросов, так как превышена сложность запроса, а при слишком большом количестве выражений анализ не останавливается и продолжается дальше, что съедает память, и сервер валится. Хотя по идее, если на каком-то выражении уже есть превышение сложности запроса, то анализ должен останавливаться и выдавать ошибку.
-
-
This query is slow. · Issue #32754 · ClickHouse/ClickHouse
This query spend one second before returning an error: SELECT arrayWithConstant(96142475, ['qMUF']); It opens a possibility of DoS.
-
-
-
добрый день! А можно же с помощью оконной функции без подзапросов собрать в отдельном моле агрегаты, типа суммы по какому-то полю для подгруппы полей?
-
есть регион, город, район, число кошек. нужно вывести эти значения и число кошек по городу
-
добрый день, подскажите пжл можно ли сделать поле NULL если изначально оно не NULLABLE?
-
Можно если оно не в ORDER BY или в PARTITION BY ключе
-
a какое выражение? через Nullable?
ALTER TABLE events_shard ON CLUSTER '{cluster}' MODIFY COLUMN session_id Nullable(UUID); -
Да, что то вроде такого
-
так это основа оконных функций - прочитайте какой-нибудь тьюториал:
select регион, город, район, число кошек, sum(`число кошек`) over (partition by `город`) as total -
спасибо! я что-то делал не так. Написал с нуля и все зааботало
-
спасибо, работает 🙂
-
Интересно, что быстрее будет работать оконка или arrayJoin?
select region, city, arrayJoin(groupArray(district)), sum(c) from (select 'mo' region, 'msk' city, 'len' district,
10 c
union all
select 'mo' region, 'msk' city, 'oct' district,
21 c
union all
select 'mo' region, 'troitsk' city, 'sov' district,
11 c)
group by region, city -
на больших объемах юнион точно добавит проблем
-
можно попробовать посмотреть в сторону select * except (id) apply () - не уверен что оно работает для WF, но для обычных аггрегаток должно.
https://clickhouse.com/docs/ru/sql-reference/statements/select/#except-modifierСинтаксис запросов SELECTСинтаксис запросов SELECT SELECT выполняет получение данных. [WITH expr_list|(subquery)] SELECT [DISTINCT [ON (column1,
-
А в каком контексте у меня это можно испробовать?
-
-
в смысле? Как я понял ваш вопрос - вы не хотите перечислять 100 столбцов в запросе. except/apply ровно для этого придумано.
-
-
-
select id, sum(sum) as total, * except (id,sum,DateTime) apply (groupArray(10)) from (select * from table order by ModifiedOn desc) group by id
Тут будет группировка с массивами, по 10 штук последних. Если надо - можно таким-же образом их развернуть назад через arrayJoin -
на 8 млн строках оконка у меня выдаёт 1.3 секунды, array join 0.3
-
юнион тут для генерации данных, вам только эта часть нужна arrayJoin(groupArray(district)), sum(c)
-
интересно, попробую
-
а это на какой версии?
в любом случае - спасибо за тест. значит пока недоделали WF, и надо не лениться, а писать узкие места по прежнему на массивах. -
21.8.11, да, думаю массивы намного лучше оптимизированы и на них можно что угодно посчитать)
-
но мне при этом и детализацию нужно оставить… то есть ЦФО, Москва, Мневники, 10, 120 , где 120 по городу
-
надо будет добавить groupArray(детализация) и развернуть потом, пример на моей таблице где impression_count детализация
SELECT *
FROM
(
SELECT
app_id,
campaign_type,
groupArray(ad_type) AS ads,
groupArray(impression_count) AS ics,
sum(impression_count)
FROM dashboard_stats
WHERE date = yesterday()
GROUP BY
app_id,
campaign_type
)
ARRAY JOIN
ads,
ics -
Оконки пока работают в 1 поток, так что в некоторых случаях массивы будут быстрее
-
sed в консоли
это быстрее питона -
Спасибо!
-
приветики)
-
добрый вечер, есть таблички с csv в заголовке 4 колонки,по факту 3, в базе 4 но у 4й есть дефолтное значение, можно ли доработать команду bash
cat $filename | curl "http://$host:$port/?user=$user&password=$password&input_format_skip_unknown_fields=1&query=INSERT+INTO+db_test.tbl_%24name+%28a%2Cb%2Cc%29+FORMAT+CSVWithNames" --data-binary @-
чтобы вставить 3 колонки в таблицу -
Всем доброго времени суток! Не ругайте сильно если спрашиваю глупости:
Есть 3 таблицы:
event - raw events
aggregate - 5мин аггрегаты
result - финальный результат (ReplacingMergeTree)
Можно ли с помощью Materialazed View при появлении записи в таблице aggregate найти по ключу запись в result взять текущее значение поля вычислить новое используя значение из aggregate (скажем EMA реализовать) и записать результат обратно в result? -
-
SELECT CAST(sumMap([user_id], [1]) AS Map(String, UInt32))
-
да, хитро... спасибо....
-
-
реплицированные сами по себе имеют одинаковую метадату и ордер бай, т.е. смысла под разные типы запросов к разным репликам особо нет
наверно лучше сделать проекции с разным orderby, КХ будет сам выбирать в какую ходить -
в теории вы можете джойнить в MV табличку result и доставать оттуда старые данные, но на практике вы скорее всего просто убьёте производительность и лучше так не делать
-
нет. МВ это триггер на вставку, будет вечная вставка в result
-
---------------------------————————————-
id|datetime| value1| value2|value3|...value N
---------------------------————————————-
1 |2021-01-03 14:38:02.000 |a | NULL |f |
1 |2021-01-03 15:38:02.000 |NULL |c | NULL |
2 |2021-01-03 14:38:02.000 | NULL |d |g |
2 |2021-01-03 15:38:02.000 |b |e | NULL |
вот так лучше. Например: нужно схлопнуть строки так, что бы получилось для id=1|a|c|f|, а для id= 2 |b|e|g|. -
получается что то не то
-
а если строк больше? Куда девать лишние?
-
insert into table (v1,v2,v3) - такой запрос ждет ровно 3 значения
-
в том и дело, что строк с id=1 множество, но в каких то из них столбцы получают null. Надо собрать из них одну с id=1, самым свежим datetime, забрав в результирующую строку самое последнее ненулловое значение
-
такой трюк делается на основе AggregatingMT (для result). Вы туда все пишете и она тихонько "по ночам" соединяет строки той агрегатной функцией, которая вам нужна.
-
Если вам надо не список на 10, а ровно одно последнее - используйте аггрегатную функцию any. Вроде как оно должно пропускать Nulls. groupArray точно их выкидывает.
select id, sum(sum) as total, * except (id,sum,DateTime) apply (any) from (select * from table order by ModifiedOn desc) group by id -
сейчас попробую,спасибо
-
Добрый вечер! А есть в clickhouse возможность удалять старые данные от некого userId по TTL старше 7 дней, но только в случае если есть более свежие данные от этого userId. Идея в том что, если от данного userId перестали поступать данные, то мы будем всегда хранить его последние данные за 7 дней.
-
Нет, такой возможности нет.
Придется вам самим это дело реализовывать. -
Я ранее писал о прожорливости EXPLAIN. В общем подтвердилось, что EXPLAIN действительно фактически выполняет скалярные подзапросы, на что тратится некоторый объем памяти. Но, что удивительно лично для меня, что на пустой таблице EXPLAIN чуть больше полутора десятков таких подзапросов легко жрёт 4 GB и более. Так что имейте ввиду. Самое печальное, что сервер тупо валится и не успевает даже клиенту сообщить о нехватке памяти или ещё о чем.
-
Проблема описана тут - https://github.com/ClickHouse/ClickHouse/issues/33579Server falls when execute EXPLAIN · Issue #33579 · ClickHouse/ClickHouse
Clickhouse run in Docker with 2 CPU and 3GB RAM. All settings are default. When I execute EXPLAIN my query, server falls. Reproduce: Create any table: CREATE TABLE stock ( id UInt64, dd DateTime, v...
-
> Самое печальное, что сервер тупо валится и не успевает даже клиенту сообщить о нехватке памяти или ещё о чем.
а какой лимит на запрос по памяти стоит? -
Это происходит до "выполнения" запроса, так что кх не проверяет там временные или лимиты на память
- 13 January 2022 (170 messages)
-
Спасибо всем кто откликнулся (@simpl1g, @dj_mixer, @bvt123) удалось создать такое (если интересно), events опустил для простоты.
CREATE TABLE IF NOT EXISTS agg
(
gamer_id String,
user_value Float64
) ENGINE = MergeTree()
ORDER BY (gamer_id);
CREATE TABLE IF NOT EXISTS result
(
gamer_id String,
user_value Float64,
updated_at DateTime DEFAULT now()
) ENGINE = ReplacingMergeTree(updated_at)
ORDER BY (gamer_id);
CREATE MATERIALIZED VIEW IF NOT EXISTS mv
TO result AS
SELECT gamer_id,
(SELECT user_value from result where result.user_value = user_value order by updated_at desc limit 1) as old,
user_value + if(isNotNull(old), old, 0) as user_value
FROM agg
ORDER BY (gamer_id);
криво конечно, вроде работает, но боюсь по производительности будет ужос... может кто-то поможет улучьшить? -
Вы правы - криво, ужас и медленно. Тут так не делают. Я же вам предложил применить AggregatingMT.
CREATE TABLE IF NOT EXISTS agg
(
gamer_id String,
user_value Float64,
updated_at DateTime DEFAULT now()
) ENGINE = MergeTree()
ORDER BY (gamer_id);
CREATE TABLE IF NOT EXISTS result
(
gamer_id String,
total SimpleAggregateFunction(sum,Float64),
updated_at SimpleAggregateFunction(max,DateTime)
) ENGINE = AggregatingMergeTree
ORDER BY (gamer_id);
CREATE MATERIALIZED VIEW IF NOT EXISTS mv
TO result AS
SELECT gamer_id,
sum(user_value) as total,
max(updated_at) as updated_at
FROM agg
group by gamer_id;
Выборка должна быть тоже с group by - не все строки будут аггрегированы в бекграунде.
И подумайте об отказе от Float в пользу Decimal. Вы же не научные расчеты ведете? -
-
сум if по идее если инкреметный айдищник есть
-
Это агрегатная функция, т.е. чтобы получилась таблица с исходными данными, надо потом сджойнить по time, user_id?
-
1 создаь инкреметный индекс
2 джойнить с sumif — по сути это умножение будет и долго вычислятся будет -
-
-
Это я примерно сразу понял как делать, но, нет )))))
-
думал, что может через array и без join можно как-то )))))
-
ну если красиво написать через jinja то даже аккуратно будет. главное быстро
-
это в любом случае будет долго. хотя если у вас таблица небольшая то норм. но тогда и на питоне можно сделать там это две строчки:)
-
таблица - несколько млрд. записей, так, что никакого питона )))
-
спасибо, думаю, что сделаю так
-
Так, я от тебя, похоже, не отстану...
Пытаюсь создать инкреметный индекс через окошки:
SELECT *, rank() over (partition by user_id order by time).
Но, слишком много памяти это требует. Может есть что-то более эффективное??? -
Я правильно понимаю, что и без EXPLAIN этот запрос валит сервер по этой же причине? То есть в момент разбора и составления плана запроса не хватает памяти, а КХ в это время не проверяет доступность памяти, что и приводит к неожиданному переполнению памяти и падению сервера?
-
вчера обсуждалось подобное - собираете в массивы через groupArray, а затем развертываете назад через arrayJoin. В промежутке (пока есть массивы) отделяете от нужного массива 10 элементов через arraySlice, а затем их складываете через arraySum.
-
Привет, продублирую вопрос:
Подскажите про работу ZooKeeper в ReplicatedMergeTree для дедублицирования данных + replicated_deduplication_window
1) У меня есть несколько шардов и я хочу понять если я буду пихать один и тот же батч в разные шарды ZooKeeper отловит это или нет.
Нашел в доке
Для очень больших кластеров, можно использовать разные кластеры ZooKeeper для разных шардов. Впрочем, на кластере Яндекс.Метрики (примерно 300 серверов) такой необходимости не возникает.
То есть дефолтно ZooKeeper общий для всех шардов и тогда (если хеш батча не вылетел из памяти) если пихать в разные шарды один и тот же батч - то ZooKeeper должен не дать его записать?
Но в тоже время в этой доке дальше везде идет как будто ZooKeeper для разных шардов всегда разный?
2) У меня ZooKeeper единый на кластер - будет ли у него количество хранимых хешей для дедубликации блоков единым для всех таблиц в кластере или оно там различное?
Иначе говоря, настройка replicated_deduplication_window (кол-во сообщений которые хранятся в ZooKeeper) - она на что настраивается - на реплику/на шард/кластер/на таблицу?Репликация данных | Документация ClickHouseРепликация данных Репликация поддерживается только для таблиц семейства MergeTree: ReplicatedMergeTree ReplicatedSumming
-
Добрый день! Сложилась ситуация, что во всей базе удаление данных по TTL стало запаздывать.
По запросу
select * from system.replication_queue q
where q.merge_type = 'TTL_DELETE'
order by q.is_currently_executing desc
выдается ~200 строк. Причем с is_currently_executing = 1 одна запись. У остальных в postpone_reason
Not executing log entry queue-0003835649 for part all_2469539_2960622_36 because 2 merges with TTL already executing, maximum 2.
Подскажите, с чего начать в данной ситуации? Можно как-то посмотреть статистику выполнения мерджей по TTL?
Судя по create_time из system.replication_queue некоторые мерджи выполняются около суток.
Что можно сделать, чтоб merge по TTL выполнялся быстрее? -
У меня вопрос размером с небольшую статью :)
Есть таблица примерно со 100 полями. Нужно получить одним запросом агрегированные значения по одним и тем же полям, но с различными условиями (срезами). Вроде это все можно получить через -If к агрегатным функциям, но проблема в том, что часть строк может исключаться из выборок в зависимости от других строк по полю reference. То есть есть записи, содержащие ссылку на идентификатор строки. И эти записи должны влиять на "срезы", в которых участвуют строки с такими идентификаторами.
Получается, что нельзя применить оконные функции и нельзя просто через -If отобрать нужные строки для агрегации. Поэтому я через WITH добавил нужные "срезы" и там же в WITH я в отдельных выражения провожу агрегацию с сохранением в скаляр, который в свою очередь уже в конце подставляется в обычный SELECT.
В результирующем SELECT должна быть одна строка с 30+ полями. Соответственно в WITH у меня несколько выражений - это подготовка "срезов", и по одному выражению для вычисления значения поля по нужному "срезу".
При попытке выполнить запрос даже на пустой таблице сервер валится. Попробовал сделать EXPLAIN запроса - то же самое. Выяснилось, что при парсинге запроса и составления плана выполнения КХ не хватает памяти, и он валит сервер.
Понятно, что на боевом сервере памяти будет несколько больше, и тогда, наверное, запрос может быть выполнен. Но возникает вопрос, а правильно ли я решаю эту задачу через WITH? Может быть есть способы лучше?
Таблица примерно такая:
CREATE TABLE stock (
id UInt64,
dd DateTime,
val1 Int64,
val2 Int64,
val3 Int64,
val4 Int64,
val5 Int64,
type Int8,
state Int8,
reference UInt64
) ENGINE = MergeTree()
ORDER BY (dd, id)
PARTITION BY toYYYYMM(dd);
Запрос примерно такой:
with
'2020-01-01 00:00:00' as beginPeriod,
'2021-12-31 23:59:59' as endPeriod,
all_stock as (select * from default.stock where dd between beginPeriod and endPeriod),
cancels as (select reference as transactionId from all_stock where type = 9),
full_returned as (
select id
from (
select t.id,
sum(t.val1 + trc.val1) as val1,
sum(t.val2 + trc.val2) as val2,
sum(t.val3 + trc.val3) as val3,
sum(t.val4 + trc.val4) as val4
from all_stock as t
left join (
select *
from all_stock
where type = 7 and id not in (cancels)
) as trc on (t.id = trc.reference)
where trc.reference > 0
group by id
) as ts
where ts.val1 = 0 and ts.val2 = 0 and ts.val3 = 0 and ts.val4 = 0
),
normal_stock as (
select *
from all_stock
where id not in (cancels) and id not in (full_returned)
),
without_returns as (select * from all_stock where id not in (cancels)),
(select count() from normal_stock where val5 > 0 and type < 7) as field_3,
...
(select sum(abs(val1)) from full_returned where val5 = 0) as field_30
select beginPeriod, endPeriod, field_3, ..., field_30; -
sum (case when условие then 1 else 0 end) as field не работает?
-
-
Я думаю, тут не хватает упрощенного примера с данными и необходимым результатом.
-
👍
-
не очень понятно, что значит вне строки...нужен доп join другой таблицы?
-
Вот же пример:
full_returned as (
select id
from (
select t.id,
sum(t.val1 + trc.val1) as val1,
sum(t.val2 + trc.val2) as val2,
sum(t.val3 + trc.val3) as val3,
sum(t.val4 + trc.val4) as val4
from all_stock as t
left join (
select *
from all_stock
where type = 7 and id not in (cancels)
) as trc on (t.id = trc.reference)
where trc.reference > 0
group by id
) as ts
where ts.val1 = 0 and ts.val2 = 0 and ts.val3 = 0 and ts.val4 = 0
), -
Тут два ключевых слова, упрощенный и данные)
-
-
ничего не понятно. Вам уже пару раз дали хороший совет про "упрощенный" и "дайте данные". Наверное вам стоит задать вопрос на stackoverflow по их стандартам качества вопросов. В чатике очень трудно решать столь непростые вопросы.
-
по мне так не нужно ничего исключать, а наоборот нужно добавить все что нужно для конечного расчета и на уровне if это все делать...все ваши условия прописывать в конкретный агрегат
-
десять разных логинов не ограничить
один юзер с множеством коннектов ограничить можно
ну судя по документации по крайней мере -
Например, есть такие данные:
| id | dd | val1 | type | reference |
| — | — | —— | —— | ————- |
| 1 | 2021-12-30 12:34:52 | 1000 | 4 | 0 |
| 2 | 2021-12-30 12:35:12 | -500 | 7 | 1 |
| 3 | 2021-12-30 12:36:11 | 500 | 9 | 2 |
| 4 | 2021-12-30 12:37:20 | 1000 | 7 | 1 |
1 строка содержит начисление. 2 строка производит частичный возврат этого начисления. 3 строка отменяет этот частичный возврат. 4 строка производит полный возврат.
В какое-то поле отчета сумма по строке 1 должна попасть, а в какое-то поле сумма по строке 1 не должна попасть, так как по ней был совершен полный возврат. При этом нужно учитывать, что возвраты могут отменяться. -
пропишите данные флаги - должна не должа и используйте их при расчетах агрегатов
-
Я не могу задним числом менять строки. То есть данные только добавляются.
-
по данному пример опишите выход...по мне так менять задним числом не нужно ничего, а нужно рассчитать флаг = учитывать или не учитывать значение
-
| id | dd | val1 | type | reference | flag|
| — | — | —— | —— | ————- |
| 1 | 2021-12-30 12:34:52 | 1000 | 4 | 0 | 0|
| 2 | 2021-12-30 12:35:12 | -500 | 7 | 1 | 1 |
| 3 | 2021-12-30 12:36:11 | 500 | 9 | 2 | 0|
| 4 | 2021-12-30 12:37:20 | 1000 | 7 | 1 | 0| для примера -
-
Но в момент вставки записи еще не известно, будут ли возвраты. То есть флаг нельзя рассчитать заранее. Более того, возврат может быть вне периода отчета, тогда он не должен учитываться, например.
-
flag можно рассчитать всегда, вопрос сложности алгоритма и его реализации и возможно алгоритм в вашем случае может через вызовы отдельных процедур/функций
-
Так вся сложность как раз в этом. То есть нужно в момент выполнения запроса учитывать период, и исходя из него учитываются возвраты и отмены для расчета тех или иных агрегирующих значений. Заранее просчитать и сделать, например, материализованную таблицу нельзя, так как период отчета может быть произвольным.
-
-
вам поставили невыполнимую задачу? все решаемо в большинстве случае, в вашем не понятно как получено 1000, какая из строк взята...доп. построения решают все проблемы
-
-
Так я и построил все с помощью WITH. Вопрос в том, насколько это допустимо?
-
советую в взять кусок данных и в excel построить алгоритм расчета :)
-
работает, сервак не падает? посмотрите нагрузку...время и тд...если задача решена и никого не должно особо парить как...будет время поищите оптимальное решение :)
-
Я даже не знаю, сможет ли EXCEL без дополнительных функций решить это. Есть подозрение, что не получится. Просто потому, что разные строки между собой должны коррелировать различным способом в результате.
-
sumIf(val1, type = 4) as sum_all
sum(If(type = 7, abs(val1) * -1, val1)) as sum_with_returns -
-
Некоторые строки должны исключаться другими строками с типом 7. И, нужно проверять, был бы полный возврат или частичный. Если полный возврат, то, к примеру, для count() это должно исключаться. В общем, если для sum еще можно собрать выражение, то для count уже так не получится сделать.
-
-
-
-
-
-
это уже не важно, In Fis - вам нужно детализировать свой алгоритм и рассчитать все флаги, отдельно которые вам нужны для итогового расчете...
-
-
-
если я правильно понял то флаги рассчитываются динамически основываясь на временном отрезке
-
-
это сути дела не меняет, используйте переменные :)
-
Условия работает только в пределах одной строки. Для учета первоначальной строки начисления нужно проверить, были ли произведены возвраты на полную сумму (с учетом отмен), или частично. То есть возвратов может быть несколько, и каждый из них не дает информации по оставшейся сумме - только в совокупности.
-
В поставленной формулировке задача требует рекурсивного обхода. В КХ рекурсии почти нет (есть словарь). Обычно в таких ситуациях делают колонку типа transaction_id, которая есть во всех строках начислений и возвратов. По ней можно сгруппировать и посчитать что хотелось. Так что подумайте над изменением схемы хранения, или можно развлечься со иерархическим словарем, если выборка данных для анализа не сумашедшего размера, а памяти в сервере достаточно.
-
Да, что то вроде этого
-
reference - это по сути и есть transaction_id. Но Просто бывает такая цепочка:
начисление (id) -> возврат (reference на id начисления) -> отмена возврата -> (reference на id возврата)
Можно, конечно, добавить еще одно поле для хранения ссылки именно на id начисления, которое будет присутствовать во всех записях, затрагивающих данное начисление (включая отмены возвратов). Это упростит "сборку" результата для оценки необходимости включения или исключения записи с начислением. Но я не понимаю, как это избавит от рекурсии? Если только использовать оконные функции для группировки. И то, не факт, что это решит все проблемы.
В общем вся сложность в том, что последующие данные могут влиять на критерии включения/исключения предыдущих записей. -
"Так что подумайте над изменением схемы хранения, или можно развлечься со иерархическим словарем, если выборка данных для анализа не сумашедшего размера, а памяти в сервере достаточно."
Могут быть миллионы записей за день. А выборка может быть за квартал, например. -
если у вас будет колонка с id изначального начисления во всех строках (тот самый transaction id), то по нему будет обычный group by. Дальше через if и массивы вы сделаете что угодно.
-
Хм.. А можете дать какой-нибудь пример, как потом с этим можно будет работать через массивы?
-
А какой TTL у вас прописан? Возможно вы не указали ttl_only_drop_parts настройку в таблице?
-
В смысле какой? Прописано типа так: TTL ts + toIntervalDay(14)
Сейчас посмотрел, ttl_only_drop_parts действительно не на всех таблицах стоит. Попробую проставить. Есть еще какие-нибудь рекомендации? -
добрый день! Вопрос про SELECT WHERE IN в postgresql.
Где будет выполнятся условие IN если запрос будет вида: select ... from ... where field IN (select ... from remote_pg_table)?
Может быть я и сам отвечу, поправьте пожалуйста: сначала под запрос отработает в pg, вернется результат и внутри КХ уже сработает IN. -
😂
-
да вроде все очевидно - select sumIf(value,type in [1,2,3]), sumIf(value,type in [4,5,6]) from t1 group by transaction; или я не понял вашего вопроса.
-
ну а как иначе? подзапрос же не видит то, что происходит снаружи
-
можете использовать cte
-
история с k-means завершилась статьей на хабре. спасибо @unamedrus за помощь!
https://habr.com/ru/post/645291/k-means in ClickhouseАлгоритм k-means хорошо известен и применяется когда надо быстро разделить массив данных на группы или т.н. "кластеры". Предполагается, что каждый элемент данных имеет набор численных метрик, и мы...
-
Zkeeper настраивается только для для реплицируемых таблиц? У меня сейчас таблицы MergeTree
-
Вообще мне нужно настроить резервное копирование данных. С чего начать?
-
Можете резервировать партиции
-
Добрый день.
Вчера выполнил ALTER TABLE MODIFY TTL на таблицах с движком ReplicatedMergeTree, но только на некоторых шардах, т.к. были таймауты, решил не продолжать дальше.
Уже второй день, на одной ноде сетка на получение в 100%, место на диске заканчиваетя, в мутациях нет незавершеных, а на диске несколько временных директорий приличных размеров типа
/var/lib/clickhouse/data/stats_s10/events_raw/tmp-fetch_202111_0_486497_355_486845
Подскажите пожалуйста, как понять чем занята нода и как это остановить? Рестарт не помогает -
Допустим, я добавлю поле transactionId во все записи:
| id | dd | val1 | type | reference | transactionId |
| — | — | —— | —— | ————_- | ——————-|
| 1 | 2021-12-30 12:34:52 | 1000 | 4 | 0 | 1 |
| 2 | 2021-12-30 12:35:12 | -500 | 7 | 1 | 1 |
| 3 | 2021-12-30 12:36:11 | 500 | 9 | 2 | 1 |
| 4 | 2021-12-30 12:37:20 | -1000 | 7 | 1 | 1 |
| 5 | 2021-12-30 13:23:12 | 2000 | 4 | 0 | 5 |
| 6 | 2021-12-30 13:24:23 | -500 | 7 | 5 | 5 |
Как можно посчитать начисления (type = 4), которые не были отменены (type = 9) или полностью возвращены (type = 7), просто все начисления, которые не отменены, а также начисления, которые были полностью возвращены?
Поле count_with_returns должно содержать количество 1, исходя из того, что подходит id: 5.
Поле count_without_returns должно содержать количество 2, исходя из того, что подходят id: 1, 5.
Поле count_full_returns должно содержать содержать количество 1, исходя из того, что подходит id: 1.
То есть в отчете должно быть что-то такое:
| beginPeriod | endPeriod | count_with_returns | count_without_returns | count_full_returns |
| —————-- | ————— | —————————- | ——————————-- | ————————-- |
| 2021-12-30 00:00:00 | 2021-12-31 23:59:59 | 1 | 2 | 1 | -
Всех приветсвтую, напомните пожалуйста можно ли выполнить на кластере INSERT INTO local_dest SELECT * FROM local_source? Чтобы каждый шард локально это выполнил?
-
то есть с какой то периодичностью раз в неделю допустим создавать бэкап. Где взять данные с момента бекапа до проблемы?
-
Ну так всё зависит от партиционирования таблиц
-
engine = MergeTree PARTITION BY toYYYYMM(date)
-
партиции по дате настроены
-
структура небольшая, клики и показы хранятся
-
Делаете бэкап, всех патриций,партиция последнего месяца может изменяться, предыдущих не будет
-
│ parallel_distributed_insert_select │ 0 │ 0 │ Process distributed INSERT SELECT query in the same cluster on local tables on every shard, if 1 SELECT is executed on each shard, if 2 SELECT and INSERT is executed on each shard │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ UInt64 │
-
какие еще проблемы могут возникнуть, например задвоение записей может быть?
-
Спасибо, Дмитрий.
-
какую обработку ошибок делают обычно, если, например перестанет писаться статистика, а бэкапы продолжатся делаться
-
Ещё маленькое уточнение, достаточно ли выставить настройку на инициаторе запроса?
-
Да, должно быть достаточно. передастся как сессионная.
-
Thanks
-
Привет
А есть возможность скачать clickhouse-client для apple silicon?
ссылка не работает https://builds.clickhouse.com/master/macos-aarch64/clickhouse
да и вообще для мака вот тут не работает https://clickhouse.com/docs/en/getting-started/install/Installation | ClickHouse DocumentationInstallation System Requirements ClickHouse can run on any Linux, FreeBSD, or Mac OS X with x86_64, AArch64, or PowerPC6
-
На гитхабе забери
-
GitHub - Altinity/homebrew-clickhouse: ClickHouse Homebrew tap (by Altinity)
ClickHouse Homebrew tap (by Altinity). Contribute to Altinity/homebrew-clickhouse development by creating an account on GitHub.
-
-
++
-
-
Я думал об этом, но, вопрос вот в чем, который у меня часто возникает. Я в select делаю группировку, в данном случае по (user_id, time). Как мне запихнуть в groupArray не текущие (user_id, time) а все? Как потом отфильтровать?
-
спасибо, уже разобрался. просто через sed 1,1d $filename, убрал заголовок и формат сделал CSV
-
не делать группировку по time, или делать отдельно во вложенном запросе
select user_id, groupArray(time), arrayConcat(groupArray(v)) from (select user_id,time,groupArray(v) v from table group by user_id,time) group by user_id -
спасибо, буду разбираться
-
Подскажите, хочу перетащить таблицу replicatedMergeTree из одной бд в другую
zoopath и replicaid поменять не выйдет, судя по доке
а у меня там зашито имя БД
А взлетит ли такой вариант
Создать новую реплику, там завести обе БД
Там же рядом создать matview из старой таблицы в новую
Включить эту реплику в состав кластера, чтобы на ней репликация налила первую таблицу
А вторая таблица нальётся с помощью matview
Когда репликация догонится, дропнуть matview и начать писать в новую таблицу
Или есть какой-то другой путь? -
Переименовываете среплицировавшуюся таблицу на новой машине (не на кластере!), потом через alter table move partition переносите данные из неё в новую.
-
-
User_dn_detection does not work for role mapping in AD · Issue #33589 · ClickHouse/ClickHouse
My test stand Clickhouse 21.12.2.17 Active Directory LDS: company.com User_DN CN=ldap user,CN=users,CN=test,DC=company,DC=com Role mapping group CN=clickhouse_role1,CN=groups,CN=test,DC=company,DC=...
-
Из ZK надо будет удалить эту новую реплику, конечно.
-
> а у меня там зашито имя БД
В каком виде? в новых версиях кх это имя материализует в просто строку, так что можете переносить между базами. (ну ZK путь будет старый, ну и что)
Какая версия? -
Версия древняя 19.17.5.18
-
Ок, ну я бы предложил
Сделать DETACH TABLE xxx
заменить макрос с названием базы данных на само название базы данных в .sql скрипте таблицы
Сделать ATTACH TABLE xxx;
а потом уже сделать RENAME TABLE -
У меня как раз явно прописано название, не макрос, вот так:
'/clickhouse/replication/stat.cluster{cluster}/shard{shard}/dbName/tableName', -
А, ну так тогда в чем проблема?
Ну и пусть останется старая база в ZooKeeper -
👍🏻
-
Всем привет, а CH уже поддерживает вторичные индексы?
-
Интересная штука. Изменил представление. Добавил в него тримы в том числе в условиях. Стало дико тормозить. Убил. Попытался пересоздать без них … долго думает и вылетает. Так много попыток. В итоге сделал представление под другим именем. Все ок и быстро. Переименовал. Все ок
-
Привет всем
Host [clickhouse] returned error: Code: 202, e.displayText() = DB::Exception: Too many simultaneous queries. Maximum: 100 (version 21.4.5.46 (official build))
Можете детально объяснить ошибку ? И возможные решения без увеличения максимального числа одновременных запросов -
всем привет! сори за глупый вопрос
пытаюсь прокинуть данные в КХ с яндекс.метрики с помощью logs api. беру скрипт отсюда (https://github.com/yndx-metrika/logs_api_integration), там в конфиге ставлю свой токен, айпишник и.т.п., запускаю и ловлю ошибку:
requests.exceptions.ConnectionError: HTTPConnectionPool(host='*', port=*): Max retries exceeded with url: / (Ca
used by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0000029B1D2CF9A0>: Failed to establish a new connec
tion: [WinError 10061]
в чем может быть проблема? -
Коллеги, вопрос по ReplacingMergeTree - если у нас ключ дедубликации одинаковый, то остается последняя вставленная строка?
-
-
Самая последняя строка из самой последней вставки
Дедупликация происходит во время слияния -
Какая самая минимальная конфигурация для кластера, zero-downtime, fault tolerance?
- 3 сервера, CH+ZK на каждом. при падении любого сервера - кластер переходит в режим READ_ONLY.
- 5 серверов, 2 CH + 3 ZK. при падении любого ZK - кластер переходит в режим READ_ONLY.
Получается что минимум 5 ZK серверов в ансамбле и минимум 2 CH? Или есть варианты? -
-
-
-
Всем привет. В БД как-то коряво записываются некоторые данные и при группировке по показателю возникает вот такое)
первое от второго отличается тем, что в одном из них в конце есть пробел ('x','x ') то есть вот такой кейс.
Подскажите плиз как избавиться от таких дублей.
Есть ли в КХ функция что то вроде: left(x,бери то, что до пробела первого) -
https://clickhouse.com/docs/ru/sql-reference/functions/string-functions/
тебе подойдет чтото из trim -
Спасибо
-
Добрый день!
https://yql.yandex-team.ru/Operations/YeAQBlZ1OyS7_JgfDWF6bSngihMdsDYNH4qwvXPht8M=
У меня есть запрос, где я делаю join двух таблиц с данными из AppMetrica, но получаю ошибку, хотя по отдельности обращения к этим таблицам работают без проблем. Можете подсказать, в чём проблема? -
это не внутренний чат яндекса, нам недоступны ваши ссылки
Скорее всего правая таблица очень большая и запрос падает по памяти, пересмотрите запрос -
Я сова :) сова страгией занимается. А Есом серьёзно то хз, я думал что в кх инкреметный индекс из коробки можно сделать
-
trimBoth(x)
-
Всем привет! Народ подскажите пожалуйста!
Использую clickhouse с плагином для работы с RabbitMQ. Исходя из документации можно в конфигах прописать только 1 пару Логин/Пароль/V-хост для подключения к серверу. т.е. для подключения к другому серверу я должен поднимать отдельный инстанс кликхауса? -
проблема: после переезда на новое железо (более мощное) скорость инсёрта в некоторые таблицы упала примерно раз в 10. из-за чего это может быть и на какие моменты обратить внимание в первую очередь. таблицы весят по 80 ГБ и в них примерно по 4-5 млрд строк. партиционирование по 3 параметрам и в ней около 30000 parts. в соседней схеме есть таблицы с 45000 parts и скорость инсёрта не изменилась
-
Подскажите пожалуйста, как в конфиге для заведения ldap сервера передавать пароль для технической учетки (не пользователя) в секции bind, чтобы потом аутентифицировать пользователя AD user_name?
-
30000 и 45000 партов совсем-совсем не manageable.
У вас сколько партиций? -
Таблица меньше 80 ГБ может вообще не иметь партиций.
-
80гб в сжатом или в разжатом виде?
-
Сжатом
-
-
Кх не будет мержить парты если размер после мержа будет > 100 гб
-
Это ведь в настройках прописано?
-
Максимальный размер парта.
-
Всем привет!
У меня ошибка появляется при выполнении запроса описанного в примерах.
SELECT number AS a FROM numbers(10) WHERE a > ALL (SELECT number FROM numbers(3, 3));
<Error> executeQuery: Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 66 ('numbers'): numbers(3, 3));. Expected one of: DoubleColon, LIKE, GLOBAL NOT IN, end of query, AS, DIV, IS, UUID, OR, QuestionMark, BETWEEN, NOT LIKE, MOD, AND, Comma, alias, IN, ILIKE, Dot, NOT ILIKE, NOT, token, NOT IN, GLOBAL IN (version 21.8.12.29 (official build)) (from [::ffff: MY_IP :p ]:38904) (in query: SELECT number AS a FROM numbers(10) WHERE a > ALL (SELECT * FROM numbers(3, 3));), 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) @ 0x8fe3e9a in /usr/lib/debug/.build-id/89/cb735eabd0b424df213861e4d0fd666e2a0cf1.debug
1. DB::parseQueryAndMovePosition(DB::IParser&, char const*&, char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, unsigned long, unsigned long) @ 0x11571c88 in /usr/lib/debug/.build-id/89/cb735eabd0b424df213861e4d0fd666e2a0cf1.debug
2. DB::executeQueryImpl(char const*, char const*, std::__1::shared_ptr<DB::Context>, bool, DB::QueryProcessingStage::Enum, bool, DB::ReadBuffer*) @ 0x107a414a in /usr/lib/debug/.build-id/89/cb735eabd0b424df213861e4d0fd666e2a0cf1.debug
3. DB::executeQuery(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::shared_ptr<DB::Context>, bool, DB::QueryProcessingStage::Enum, bool) @ 0x107a3d23 in /usr/lib/debug/.build-id/89/cb735eabd0b424df213861e4d0fd666e2a0cf1.debug
4. DB::TCPHandler::runImpl() @ 0x1104343e in /usr/lib/debug/.build-id/89/cb735eabd0b424df213861e4d0fd666e2a0cf1.debug
5. DB::TCPHandler::run() @ 0x110563d9 in /usr/lib/debug/.build-id/89/cb735eabd0b424df213861e4d0fd666e2a0cf1.debug
6. Poco::Net::TCPServerConnection::start() @ 0x13bce56f in /usr/lib/debug/.build-id/89/cb735eabd0b424df213861e4d0fd666e2a0cf1.debug
7. Poco::Net::TCPServerDispatcher::run() @ 0x13bcfffa in /usr/lib/debug/.build-id/89/cb735eabd0b424df213861e4d0fd666e2a0cf1.debug
8. Poco::PooledThread::run() @ 0x13d02279 in /usr/lib/debug/.build-id/89/cb735eabd0b424df213861e4d0fd666e2a0cf1.debug
9. Poco::ThreadImpl::runnableEntry(void*) @ 0x13cfe50a in /usr/lib/debug/.build-id/89/cb735eabd0b424df213861e4d0fd666e2a0cf1.debug
10. start_thread @ 0x76db in /lib/x86_64-linux-gnu/libpthread-2.27.so
11. clone @ 0x12171f in /lib/x86_64-linux-gnu/libc-2.27.so -
пытаюсь по проекциям собрать ключи по которым отсортирована таблица чтобы отдать все столбцы и where column_name in (select ....) не оптимизируется проекциями, хотя where column_name = 'value_1' or column_name = 'value_2' or column_name = 'value_3' оптимизируется. Решил почитать доку и потенциальное решение (a = ALL (subquery) ) не работает.
-
этот синтаксис в 21.9 появился
-
спасибо, на 21.9.2 revision 54449 работает.
а по поводу оптимизаций через проекции подобных запросов: where column_name in (select ....) трюки есть? -
я потестил на 21.8, словил сегфолт в базе 2 раза и больше не трогал их)
-
Понял, спасибо)
-
привет! пытаюсь создать функцию по примеру из доков:
"CREATE OR REPLACE FUNCTION linear_equation AS (x, k, b) -> k*x + b;",
получаю ошибку "Syntax error: failed at position 19 ('FUNCTION'):"
что может быть не так? -
ваша версия Кликхауса?
-
21.9.4.35
-
udf прям из свежего, 21.11 вроде
-
Спасибо 💐
-
привет!
-
Случайно в clickhouse-client для выхода написал русскими символами quit, что получилось, как йгше. Вышел корректно из клиента. Хм... Решил повторить то же самое, но для exit (учше). Также вышел корректно. Подумал, что, возможно, на любую русскую абракадару так реагирует, но нет. Только на две этих команды. В общем, теперь буду знать, что где-то в глубине он, таки, остается русским :)
-
можно «й» просто писать)
-
-
кх и на q и на й реагирует
-
Мало кто знает, но ещё можно писать ЫЕДУСЕ вместо SELECT и ЦРУКУ вместо WHERE :)
-
Если команды выхода - это понятно, то зачем то же самое для языка SQL оставили?...
-
Это шутка была. Впрочем, я не проверял... :)
-
-
Не удивлюсь, если разработчики читают этот чат и в следующей версии добавят
-
Ну вот, а я уже пошел проверять такую новую для меня фичу...
-
Главное в конце нажать клавишу «ЗАБОЙ»
-
ЫУДУСЕ тфьу, ыгь(фьщгте) фы фьщгте АКЩЬ аштфтсу ЦРУКУ скуфеу_феЮ=э2021-12-01э ПКЩГЗ ИН тфьу
(c) Ащьф ЛШТШФУМ -
в телеграм боте для кликхауса такое работает
- 14 January 2022 (154 messages)
-
Да поддерживает но работают они не так как b-tree
Это data skip indexes
Если вам это о чём нибудь говорит
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/#available-types-of-indicesMergeTree | ClickHouse DocumentationMergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
Ошибка ровно то что написано
Поскольку каждая query может читать/писать дофига данных
То общее кол-во запущенных одновременно ограничено сверху
Смотрите system.processes
Анализируйте system.query_log
По written_rows read_rows и memory
Переписывайте запросы -
ЗАБЕЙ
-
-
-
спасибо!
-
Привет! Вот какой вопрос.
Создаем таблицу ReplicatedMergeTree on cluster.
Потом на одном инстансе дропаем табличку, без on cluster.
При этом на нем остается папка с датой таблицы в store/
И не дает создать ее заново.
Вроде бы как эта папка со временем пропадает, но хотелось бы узнать, зачем это так происходит? Может быть мы не правильно как-то конфигурим клик?
Этот кейс всплыл в рамках работы над бекапером -
Если вы про clickhouse-backup то там бага которую пофиксить должны при ресторе таблиц RMT с приставкой ON CLUSTER возникает ошибка DuplicatedUUID:
https://github.com/AlexAkulov/clickhouse-backup/issues/145add support to restore table ON CLUSTER · Issue #145 · AlexAkulov/clickhouse-backupIf we create table, for example CREATE TABLE recipes ON CLUSTER '{cluster}' ( title String, ingredients Array(String), directions Array(String), link String, source LowCardinality(S...
-
-
это Atomic движок, store с соответсвующим UUID будет
делайте
DROP TABLE ... SYNC
для Atomic -
Ну и это да ++
-
нет =) я думаю что тут свои какие то велосипеды =)
-
Когда релиз будет уже - любезный?) Дайте жизни нам смертным)
-
https://github.com/AlexAkulov/clickhouse-backup/issues?q=is%3Aopen+is%3Aissue+milestone%3A1.3.0
трекайте
Осталось пара довольно увесистых issue
экспериментирую
на этой неделе отвлекался постоянно на всякое =(Issues · AlexAkulov/clickhouse-backupTool for easy ClickHouse backup and restore with cloud storages support - Issues · AlexAkulov/clickhouse-backup
-
❤️
-
Да, за основу взят этот самый бекапер, ресторим мы просто поэтапно, на каждом инстансе сначала только метадату, потом на одном только дату и дальше она реплицируется через зукипер.
Вроде бы схема пока рабочая.
Но есть вот пару таких скользких кейсов. -
Чето я запутался, я думал движок на таблицах ReplicatedMergeTree?
-
прошу прощения за поздний ответ:
в данных табличках
партиции парты строки
26 352 29 628 4 779 505 145
18 210 19 936 4 068 401 349
поможет ли optimize table в данном случае?
в 2 других таблицах количество партиций и партов больше раза в 2, но строк меньше 1 млрд, там скорость записи приемлемая, хоть и осталась на прежнем уровне до переезда -
Нет, слишком много
-
Перенесите partition key на первую позицию order by и у вам запросы ускорятся, те не нужно будет лазить по десяткам тысяч разнвэ партиций
-
спасибо, попробуем
-
Понятно, Atomic это движок баз.
Окей, спасибо!
Ждём нового релиза! -
-
-
Указать схему, не ?
-
-
Всем привет. После обновления с 21.3 LTS на 21.8 LTS попытка чтения таблицы из MySQL по ODBC стала периодически обрываться с ошибкой localhost:9000. DB::Exception: Attempt to read after eof: While executing ODBC.
Коннектор ODBC используем mysql-connector-odbc 5.2.5-8
ODBC выдаёт вот такую ошибку при чтении некоторый сложных unicode-символов
HTTP status code: 500 Internal Server Error, body: std::exception. Code: 1001, type: std::range_error, e.what() = wstring_convert: to_bytes error, -
Привет, подскажите как через драйвер для golang просто выполнить инсерт без prepare/transaction begin/commit. Надо просто сделать
INSERT INTO data FORMAT TSV <data in TSV format>
Но при вызове db.Exec(<SQL query>) выдается ошибка insert statement supported only in the batch mode (use begin/commit).
На драйвере от мейлру такой ошибки нет. -
Вопрос - кому-то получалось запустить UDF с форматом <format>JSONEachRow</format>
-
вылатает с ошибкой
-
``` ``` Code: 117. DB::Exception: Received from localhost:9000. DB::Exception: Unknown field found while parsing JSONEachRow format: now(): (at row 1)
: While executing JSONEachRowRowInputFormat: While executing ShellCommandSource -
хотя output вот такой: {"now()":"2022-01-14 11:25:10"}
-
Привет. Все решилось очень просто... через окошки )))
select user_id, time, sum(value) over (partition by user_id order by time rows between 9 preceding and current row) -
это решение сразу приходит на ум, но вы хотели какие-то "10 последних", не сильно поясняя что под этим понимается. Если так как выше вам подходит, то OK. Но по мне это 10 предыдущих для каждой строки.
-
оу... да... мой косяк )))
-
но если вам так близки WF, то можете и на них - groupArray работает и для них тоже:
select number, arraySum(ss) from
(select number, groupArray(5)(number) over (partition by id) as ss
from (select number, number%10 as id from numbers(1000) order by number desc)
order by number); -
вообще не близки )))
-
Atomic - это движок базы данных
https://clickhouse.com/docs/en/engines/database-engines/Introduction | ClickHouse DocumentationDatabase Engines Database engines allow you to work with tables. By default, ClickHouse uses database engine Atomic. It
-
Спасибо, я разобрался 👍🏻
-
Ещё одна деградация, после обновления с 21.3 до 21.8 — теперь почему-то фейлит обращение к движку HDFS с использованием имени сервиса вместо адреса хоста:
CREATE TABLE _hdfs_engine_table (name String, value UInt32) ENGINE=HDFS('hdfs://hacluster/clickhouse_test.txt', 'CSV');
Received exception from server (version 21.8.13):
Code: 36. DB::Exception: Received from localhost:9000. DB::Exception: Bad hdfs url: hdfs://hacluster/clickhouse_test.txt. It should have structure 'hdfs://<host_name>:<port>/<path>'. -
-
имя порта не задано о чем сказано четко какой формат у урла должен быть
-
очевиднейшим образом это ошибка, появившаяся в 21.8. Url в hdfs может быть в формате hdfs://<servicename>/path
ошибку уже нашёл и отрепортил, коммит, который её добавил отловлен -
а можно ссылку на issue?
-
-
DB::Exception: Bad hdfs url error when creating HDFS table or using hdfs engine with servicename instead of hostname:port. · Issue #33627 · ClickHouse/ClickHouse
There is a degradation in transition from 21.3LTS to 21.8LTS in HDFS engine. As you may know and as the Documentation states (https://clickhouse.com/docs/en/engines/table-engines/integrations/hdfs/...
-
-
-
SELECT * FROM system.mutations WHERE is_done=0;
-
-
-
Бесконечное число причин
Надо смотреть на отдельные проблемы
https://kb.altinity.com/altinity-kb-queries-and-syntax/altinity-kb-alter-modify-column-is-stuck-the-column-is-inaccessible/ -
-
всем привет!) подскажите плз, в связи с чем может возникать ошибка при инсерте большого кол-ва данных. Ошибка происходит где то в момент, когда записано уже 18гб
DB::Exception: Received from clickhouse-2.services:9100. DB::Exception: Timeout exceeded while writing to socket (192.168.128.139:54364) -
Добры день
Подскажите
есть таблица
дата:Значение в моменте
12 - 10
13 - 0
14 - 5
15 - 7
График должен выводить
12 - 10
13 - 10
14 - 15
15 - 22
То есть каждое значение должно содержать сумму предыдущих
Возможно выполнить средствами CH? -
Other | ClickHouse Documentation
Other Functions hostName() Returns a string with the name of the host that this function was performed on. For distribut
-
Лучше такое делать на windowfunctions. runningaccumulate не всегда дает правильный результат. читать тут:
https://kb.altinity.com/altinity-kb-queries-and-syntax/cumulative-unique/
там примеры с uniq, а не sum, но это не принципиально -
Да, с такой же проблемой столкнулся
-
Да, нашёл спасибо, так и решил
-
а тут есть авторы clickhouse-go? я что-то в issues не могу найти ничего релевантного, у меня вот какой вопрос по поводу использования clickhouse.Clickhouse клиента (который OpenDirect() возвращает)
метод WriteBlock(block) для блока разрушающий - после того как его один раз записали, он все свои буфера сбрасывает и повторно его нельзя использовать, хотя это, на самом деле, было бы полезным - например, если кх вернул ошибку, попытаться записать тот же блок в другой шард, или же наоборот, записать один и тот же блок в большинство членов одного шарда чтобы как-никак гарантировать exactly once
Я глубоко пока не лазил, но мне интересно - там какая-то принципиальная проблема или это просто эффект от использования bytes.Buffer под капотом блока? Обсуждался уже такой вопрос?
А иначе получается так, что если приложенька сидит на каком стриме и пишет его батчами в кх, то получаем двойную буферизацию - сначала надо набрать со стрима данных, и потом из них уже блок сделать, а было бы удобно сразу из стрима класть в блок и потом спокойно его переиспользовать если потребуется (запись в кх не удалась или хочется в несколько кх слать). -
select [10, 0, 5, 7] ar, arrayCumSum(ar)
-
не помню такого обсуждения
Основной Мантейнер сейчас активно пишет v2
https://github.com/ClickHouse/clickhouse-go/pull/452
можно создать issue в github и потегать его, может быть ответит
еще можно посмотреть альтернативные реализации
https://github.com/vahid-sohrabloo/chconn
и
https://github.com/go-faster/ch[WIP!] v2 MVP by kshvakov · Pull Request #452 · ClickHouse/clickhouse-goGolang driver for ClickHouse. Contribute to ClickHouse/clickhouse-go development by creating an account on GitHub.
-
-
-
сможете, мастер-мастер репликация, можно в любую реплику писать данные
-
У меня просто интересная ситуация у меня 3 шарда и у каждого по 1 реплике
-
-
а как вы создаёте и на каком сервере пытаетесь выполнить?
-
CREATE TABLE ... ON CLUSTER test ...
-
-
-
"инсерты начинают зависать на попытке создать таблицу"
шиза =)
инсерты отдельно
создание таблиц отдельно
CREATE TABLE ON CLUSTER это НЕ INSERT
он ставит DDL в ZK и ждет пока все реплики его выполнят
если реплика 180 секунд не выполняет, он отваливается
таблица создается одна и таже?
или каждый раз разная? -
https://clickhouse.com/docs/en/operations/settings/settings/#distributed_ddl_task_timeout
но сначала разберитесь. нужен ли вам вообще CREATE TABLE перед каждым INSERTSettings | ClickHouse DocumentationSettings distributed_product_mode Changes the behaviour of distributed subqueries. ClickHouse applies this setting when
-
Да вообще нет но вот как проверить insert в случае отказа одной шарды?
-
on cluster ddl по таймауту ждёт когда создастся таблица, вставка данных немного по другому работает)
-
-
какой такой "одной шарды", вы вставтляете в какую таблицу в Engine=Distributed или в Engine=ReplicatedMergeTree?
-
Distributed
-
если через distributed выберет живую реплику
-
он первую живую в шарде выбирает
-
-
Агааааа
-
-
-
-
-
Еще раз спасибо! Я начинающий кликхаусовод, поэтому не сразу понимаю, сорри.
Мне не просто суммирование требуется (показал так для простоты), нужно вычисление с использованеим текущего агрегата, и результирующего:
0.02*user_value + (1-0.02)*if(isNotNull(old), old, 0) as user_value
user_value - это текущий (по aggrgate)
old - это последний вычисленный из result.
Я схему реальную сделел, если интересно можно тут посмотреть https://gist.github.com/andrey-mishenkin/fd055a472a5e21ad691170f971a0c67d
На локальном mac на 100M вставок, показало 500k записей в секунду... Навероное это мало... Но пока не представляю как по другому можно такое реализовать.My first ClickHouse experienceMy first ClickHouse experience. GitHub Gist: instantly share code, notes, and snippets.
-
вставить и сделать селект)
-
если я вставляю в distributed таблицу он же случайно выберет шард нет?
-
если быть точным, оно вообще сначала никуда не вставляет, а генерирует .bin в каталоге на ноде куда INSERT пришле с именем destination replica
и после этого пытается сделать push это .bin на целевую реплику
как только нода отваливается, оно ждет
мониторьте кол-во временных файлов в distributed
из этих файлов при SELECT тоже чтение идет... но не такое эффективное -
у вас какой ключ шардирования?
-
остаток результата SHARDING KEY выражения поделенное на кол-во шардов
-
У нас там хеш некоторых значений
-
Понял
-
ну если значения "близкие с рандому", то в целом будет равномерно по шардам растекаться
потому что остаток от деления на кол-во шардов в <remote_servers> для заданного кластера будет всегда разным -
-
ну условно у вас рандомный ключ, вставка у вас будет на все 3 шарда, вы читаете данные через distributed таблицу со всех шардов и проверяете что результат совпадает со вставкой
-
-
-
Если вдруг кому интересно - подняли 30 шардов по 2 реплики, на пяти нодах был включен clickhouse-keeper. Настройки дефолтовые, ничего не тюнил. Вставки шли катастрофически медленно, часть процессов вставки прерывались. В общем боль и печаль, глубже погружаться не стал - отключил кхкипер, поставил 3 ноды зукипера и все заработало надежно и быстро. Видимо что то я в конфигах не выставил, но времени глубоко копать небыло - выбран простейший из путей.
-
> 0.02*user_value + (1-0.02)*if(isNotNull(old), old, 0) as user_value
вы тут случайно не проценты считаете? Может вас спасет какая-то вариация формулы сложного процента, и ничего суммировать не придется? Можно счетчик сделать, а потом его испльзовать как степень.
Читать во время инсерта старые данные - плохая затея. Надо что-то накапливать в таблицах, а в финальном select/group by посчитать все что вам нужно, оперируя только накопленными данными. -
Не это не %, это Exponential Moving Evegare (EMA)... понимаю что плохая затея... но тогда надо иметь какой-то запрос запускающийся переодически -
и делающий вычисления... -
CREATE MATERIALIZED VIEW IF NOT EXISTS user_value.user_value_mv
TO user_value.user_value AS
SELECT gamer_id,
game_id,
geo,
sum(spend) as spend_sum,
sum(revenue) as revenue_sum,
sum(requests) as requests_sum,
(spend_sum - revenue_sum) / requests_sum AS user_value_agg,
if(isNotNull(user_value_prev_temp), user_value_prev_temp, 0) as user_value_prev,
user_value_agg * 0.0206 + (1 - 0.0206) * user_value_prev as user_value
FROM user_value.aggregate JOIN (SELECT * FROM user_value.user_value WHERE (gamer_id, game_id, geo) IN(SELECT gamer_id, game_id, geo FROM aggregate))
GROUP BY (gamer_id, game_id, geo, time_bucket)
ORDER BY (gamer_id, game_id, geo, time_bucket);
Делайте так -
Через JOIN
(gamer_id, game_id, geo) IN(SELECT gamer_id, game_id, geo FROM aggregate)
Нужно что бы выбрать из user_value таблицы только те строки. что нам нужны для джойна этого БЛОКА вставки (1 млн строк)
тк (SELECT gamer_id, game_id, geo FROM aggregate) вернет не саму таблицу aggregate, а блок вставки -
Вообще мы сделали в новых версиях 4 EWM* функции для оконок и они довольно быстрые, мб вам подойдут.
-
Спасибо Дмитрий! попробовал - только не нравится ему такое
CREATE MATERIALIZED VIEW IF NOT EXISTS user_value.user_value_mv
TO user_value.user_value AS
SELECT gamer_id,
game_id,
geo,
sum(spend) as spend_sum,
sum(revenue) as revenue_sum,
sum(requests) as requests_sum,
(spend_sum - revenue_sum) / requests_sum AS user_value_agg,
if(isNotNull(user_value.user_value), user_value.user_value, 0) as user_value_prev,
user_value_agg * 0.0206 + (1 - 0.0206) * user_value_prev as user_value
FROM user_value.aggregate JOIN (SELECT * FROM user_value.user_value WHERE (gamer_id, game_id, geo) IN(SELECT gamer_id, game_id, geo FROM user_value.aggregate))
GROUP BY (gamer_id, game_id, geo, time_bucket)
ORDER BY (gamer_id, game_id, geo, time_bucket);
Syntax error: failed at position 820 ('GROUP') (line 13, col 1) -
Я дал идею :)
там нужно добавить алиас для подзапроса и ON условие еще
Плюс подзапрос такой должен быть
SELECT * FROM user_value.user_value FINAL WHERE (gamer_id, game_id, geo) IN(SELECT gamer_id, game_id, geo FROM user_value.aggregate)
Что бы брать последнюю запись -
Спасибо за идею! Буду пробовать (пока это все жля меня новое)
-
Привет, подскажите умеет ли клика как-то элегантно генерить бустрап выборки из исходной?
-
Здравствуйте, нужен ваш совет, у нас есть довольно объемная greenplum таблица, хотелось бы данные из неё перелить в clickhouse , но insert select падает на лимите по памяти, буду благодарен если подскажите способ подобного перелива?
-
Переливайте по партициями. или дробите еще меньше
-
что такое "bootstrap" выборка?
не очень понятно что под этим подразумевается?
какой то ML термин? -
Ага думал об этом варианте, но думал есть что-то удачней, спасибо
-
Падает у вас скорее всего где то в гринпламе (кх не использует много памяти для вставки)
Если гринплам умеет в stream данных в пайп можно вообще попробоватЬ
gp_program —query "SELECT * FROM table" | clickhouse-client "INSERT INTO xxxx FORMAT TSV" -
это сэмплирование с возвращением, к мл напрямую не относится. Скорее к дс в части проверки гипотез
-
Не именно clickhouse падает,
-
У нас тестовый стенд не очень много ресурсов там
-
используете postgresql функцию?
-
Я использовал внешнюю таблицу постгреса и вставлял данные в таблицу clickhouse
-
Ну и 1 гб это какое то издевательство над кх.
Его вообще дизайнили под систему с минимум 16 гб.
Кх собирает 1 млн строк в памяти и потом дампит готовый блок на диск, это основное на что тратит память кх при вставке -
Я бы попробовал через пайп если честно, у меня есть некоторые сомнения в производительности postgresql функций.
-
Плюс 100к строк в секунду это очень грустно и долго будет
-
Ок, спасибо, попробуем увеличить ресурсы
-
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-data-migration/remote-table-function/#q-can-i-tune-insert-speed-to-make-it-faster
Можете конечно попробовать покрутить эти настройки, но у вас памяти совсем не много и так.
│ max_insert_block_size │ 1048545 │ 0 │ The maximum block size for insertion, if we control the creation of blocks for insertion. -
У нас 1 гб лимит на один запрос, так мы под тесты выделяли 10 ГБ, так что увеличим лимит на запрос
-
Может вам не нужен кликхаус если вы 10гб под тесты выделили ...
-
-
Сделайте больше оперативной памяти и установить на GROUP BY ограничение, чтобы запросы не падали по памяти max_bytes_before_external_group_by
-
Спасибо за конструктивное замечание, а сколько вы бы рекомендовали выделить памяти на боевой clickhouse? Я просто новичок в этом деле
-
Зависит от количество данных которые вы планируете использовать
-
Ну хотя бы минимальное количество. Так будут хранится что-то вроде агрегатов в ch
-
?
-
CH не для агрегатов, я не знаю
-
А какие тогда варианты использования больше подходят для ch?
-
И чем плох clickhouse для хранения агрегатов, я честно пока не вижу таких минусов, партицирование удобное, кол-во записей уже ограничено, то есть по сути должен он выбирать из агрегатов достаточно неплохо.
-
А что есть для агрегатов ? Есть агрегатные функции, но если ты будешь считать uniqExact (точные вычисления) они будут по времени как на данных почти .... Кликхаус это про быстро положить и быстро достать ОЧЕНЬ МНОГО ДАННЫХ
-
Нет, там будут строчки по разным группировкам значения разных метрик за день, ну если грубо посчитать несколько тысяч строчек за день, уже сосчитанных другой системой и записанных в clickhouse, будет там несколько метрик hll - это самое трудное их возможно за некий период придется мержить
-
Если у вас grenplum почему не использовать для этого PG ?
-
Мы пока тестируем гипотезу что выборка из clickhouse агрегатов будет быстрее
-
Да в целом есть люди, что кладут в кх готовые витрины и быстро делают по ним агрегации.
-
Только это имеет смысл делать, когда в таблице будут сотни миллионов строк
-
Всем привет, в pandahouse есть функции для создание таблицы в clickhouse ?
-
Вы можете просто выполнить запрос на создания таблицы
-
Спасибо, попробуй!
-
-
Можно с движком File. Правда при каждом селекте всё будет читаться и парситься заново.
-
Хотя я кажется наврал https://clickhouse.com/docs/en/engines/table-engines/special/file/File | ClickHouse Documentation
File Table Engine The File table engine keeps the data in a file in one of the supported file formats (TabSeparated, Nat
-
Табличная функция file точно так умеет: https://clickhouse.com/docs/en/sql-reference/table-functions/file/file | ClickHouse Documentation
file Creates a table from a file. This table function is similar to url and hdfs ones. file function can be used in SELE
-
Да, но, насколько я понимаю, это просто чтение КХ данных из файлов. Т.е. если я хочу всё засунуть в MergeTree, то мне надо что-то типа Live view сделать.
-
КХ не умеет отслеживать внешние файлы и автоматически вставлять данные из них в таблицу. Можно свой скрипт написать который будет это делать.
-
Ага, спасибо.
-
Доброго времени суток, посоветуйте хороший курс или материалы для погружения в тему Кликхауса, с чего начать изучение?
-
А для чего Вам ClickHouse? Если кратко, то это колоночная СУБД с эффективной параллельной поблочной обработкой и с быстрым GROUP BY, поддерживающим распределенное исполнение. Если хочется что-то конкретное, то всегда есть документация, Хабр, ютьюб...
-
Для начала разобраться с этой по блочной структурой данных и посчитать рассчетные показатели за большой период времени для их сравнения по годам. Примерно такая задачка для начала
- 15 January 2022 (69 messages)
-
-
семплирование есть
https://clickhouse.com/docs/en/sql-reference/statements/select/sample/
что такое "семплирование с возвращением", не очень понимаюSAMPLE | ClickHouse DocumentationSAMPLE Clause The SAMPLE clause allows for approximated SELECT query processing. When data sampling is enabled, the quer
-
у таблицы MergeTree из 2 строк получится две строки при background merge, всегда
у таблицы CollapsingMergeTree для одинаковых значений полей из ORDER BY будет "схлопывание" по полю sign
то есть из двух строк с одинаковым ORDER BY и sign 1 + sign -1 получится 0 строк
для -1 и -1 или 1 и 1 получится 2 строки
у таблицы ReplacingMergeTree для одинаковых ORDER BY будет "замена"
из нескольких строк с одинаковым ORDER BY ,, получится одна, любая
у таблица AggregatingMergeTree, SummingMergeTree (более простой вариант aggregating) для одинаковых ORDER BY будет "аггрегация"
из любого кол-во строк с одинаковым ORDER BY ,, получится одна, в которой поля имеющие aggregatingState будут смержены между собой (для summing)
остальные варианты предлагаю внимательно прочитать в документации
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/
слева там оглавление, по типам движковIntroduction | ClickHouse DocumentationMergeTree Engine Family Table engines from the MergeTree family are the core of ClickHouse data storage capabilities. Th
-
-
недавно появился движок FileLog - смотрит за файлами в директории и их оффсетами (как кафка). Но он все ещё экспериментальный и недокументированный - ищите на github. Я пробовал полтора месяца назад - откусывал последний символ в строке. Пришлось читать в формате RowBlob и парсить регеспами в SQL. В последней версии вроде как сделали мощный рефакторинг форматов - может и починили.
create table t ( logrow String) engine = FileLog('..../logs', 'RawBLOB')
settings max_threads=4; -
А верно понимаю, что чистый mergetree ничего не схлопывает и нужен только для быстрого поиска по искомым данным?
-
Сам не схлопывает
-
optimize deduplicate
-
-
ну да, основной кейс кликхауса - сохранили данные в широкую таблицу + таблицы измерений \ справочники
и дальше по этому SELECT ... WHERE ... GROUP BY
быстрый делаем -
а почему этого недостаточно?
да, как промежуточное и финальное хранение данных для последующей выборки и аггрегации -
-
Спасибо
-
> у таблицы ReplacingMergeTree для одинаковых ORDER BY будет "замена"
из нескольких строк с одинаковым ORDER BY ,, получится одна, любая
В документации указано, что будет оставлена последняя вставляемая строка, если не используется параметр ver. То есть это не любая, а именно последняя. По сути это может имитировать UPDATE. -
Да, извините, забыл, да там последняя, либо сортировка по ver
-
Друзья, подскажите, пожалуйста. Есть широкая таблица с некоторыми данными. Для каждой строки этой таблицы могут быть от 0 до нескольких десятков подчиненных записей в другой таблице. Иногда требуется отобрать записи из широкой таблицы в зависимости от данных одной или нескольких записей в подчиненной таблице. В том же MySQL это делается через JOIN. Но в КХ это, вроде как не приветствуется. Следует ли содержать эти подчиненные записи в отдельном поле в широкой таблице в формате JSON, например? Или есть другие способы решения таких задач?
-
-
сколько записей планируется к выборке из основной таблицы в типичном запросе?
-
-
-
-
-
я не спрашивал, сколько у вас будет произведение после JOIN
я спросил сколько у вас в основной таблице за один запрос выбирается строк -
то есть я правильно понимаю, что вы хотите выбрать 1.5 миллиона записей
и джойнить их с 5 миллиардами? =)
мне просто любопытства ради интересно
как думаете сколько такой JOIN будет работать?
вообще не важно в какой БД -
если бы речь шла о сотнях тысяч записей
оно в целом можно было бы делать через
SELECT .. FROM 5bil_table WHERE id IN (
SELECT id FROM 1bil_table WHERE ...
)
GROUP BY ...
и это было бы долго потому что пришлось бы все равно сканировать практически все ваши 5 миллиардов, потому что там явно искомые id в каждый парт напиханы... и data skip index через set или bloom filter не поможет...
но полтора миллиона, я не знаю как такое делать =) может кто другой подскажет -
-
если весь массив в момент в ставки в основную таблицу как то известен, то да
локальность данных и все такое
правда с большими массивами (тысячи элементов и больше) clickhouse также как и строковые БД работают так себе...
и выборки из больших массивов с array функциями это тоже не панацей -
> то есть я правильно понимаю, что вы хотите выбрать 1.5 миллиона записей
и джойнить их с 5 миллиардами? =)
мне просто любопытства ради интересно
как думаете сколько такой JOIN будет работать?
Тут не всё так плохо. Так как в подчиненной таблице мы по ключу же выбираем записи. То есть там не будет фулскан. Во всяком случае MySQL такое прожует. Но да, запрос не быстрый получается. -
тут вопрос даже не в том, чтобы включать "подчиненную" таблицу в основую, а как вобще фильтровать миллиард записей без индексов за пристойное время. В КХ у вас есть 3 возможности фильтрации:
- первичный индекс
- партиции
- skip index
Хорошо работает только первый. Если нужно ставить условия по колонкам не в первичном индексе, то единственный вариант - уменьшать количество строк. Через предаггрегацию. Скажем можно хранить не все данные, а только суммы за день, или за час. Не всегда такое возможно - надо смотреть на требумые выборки. -
Да. Подчиненные записи известны. И в каждой записи основной таблицы могут быть и пустые массивы и массивы с несколькими десятками записей. Но в среднем примерно 5 записей в массиве на 1 запись в широкой таблице.
-
тогда лучше на этапе вставки такое иметь... но риск того что "условия изменились" и теперь надо срочно все переконвертировать, далеко не нулевой
-
В принципе, так как КХ позволяет хранить одинаковые записи в первичном ключе, то можно ключевое поле задать для обеих таблиц одинаковое. Тогда выборка должна и по JOIN быстро проходить?
-
С этим как раз проблем нет. Там структура не меняется. Если, даже она поменяется, то при хранении в формате JSON это не должно особо влиять, как я понимаю.
-
ну там есть оптимизации с JOIN алгоритмом, но фиг его знает как сработает
я давно жду когда кто нибудь JOIN займется, там нетривиальная очень задача сама по себе -
извлечение через JSON медленее может быть чем итерация через массив, потестируйте на ваших данных
-
Во сколько медленнее?
-
Тут возникает такой вопрос. Допустим, мне нужно будет посчитать количество записей в широкой таблице, содержащих в подчиненных некое значение. Если брать две таблицы, это будет примерно так:
SELECT COUNT()
FROM master_table
INNER JOIN slave_table USING (masterId)
WHERE slave_table.field = 'aaa'
GROUP BY masterId
Если подчиненные записи будут храниться в основной таблице, то будет примерно так:
SELECT COUNT()
FROM master_table
WHERE JSON_VALUE(extField, '$[*].field') = 'aaa'
Что из них будет быстрее или медленнее? Какой запрос потребует больше расхода памяти? -
-
-
могут быть быстрее, могут быть медленее, от данных зависит
там JSONSIMD парсер оптимизированный, он быстрый достаточно, но разложенные массивы все таки легче парсить -
-
-
-
Nested это массивы
имеет ограничение
должно быть одинаковое кол-во элементов для каждого Nested поля
думаю не годится для вас
если у вас просто ключ значение, попробуйте новомодный Map -
потому что перепаковать один набор полей в другой набор массивов, весьма не тривиальная задача может быть в общем случае если ее не ограничивать
-
С этого места можно подробнее? У меня заданная структура. То есть количество полей в этой структуре одинаково для всех записей. А вот количество записей в Nested различно.
-
-
имеется ввиду вставке в Nested
вы не можете вставить в одну запись Nested в котором только 2 поля из 3 заданы например
вроде бы так
я давно с nested не работал, года два, может сейчас сделали какой нибудь заполнитель дефолтным для типа значением если поле не указано -
-
да, Nested может "несколько записей" хранить
и даже будет я думаю самым быстрым вариантом из всех
но внутри это массивы
Nested вроде даже в ARRAY JOIN можно использовать (правда не помню точно) -
С этим проблем нет. Все поля известны заранее. И записи для Nested также уже известны и не требуют добавления позже. То есть в INSERT мы можем писать сразу всё.
-
тогда должно получиться
-
Да. Для доступа к записям можно использовать ARRAY JOIN
-
-
-
Подскажите, использую MaterializedPostgreSQL, но в самой таблице PG есть поля которые String|NULL.
Может из-за этого падать CH сервер при репликации из PG в CH.
Сама ошибка:
2022.01.15 13:49:32.647859 [ 235 ] {} <Fatal> BaseDaemon: (version 21.12.3.32 (official build), build id: FA4A7F489F3FF6E3) (from thread 117) (no query) Received signal Segmentation fault (11)
2022.01.15 13:49:32.647912 [ 235 ] {} <Fatal> BaseDaemon: Address: NULL pointer. Access: read. Address not mapped to object.
2022.01.15 13:49:32.647947 [ 235 ] {} <Fatal> BaseDaemon: Stack trace: 0x12b4d6ef 0x12b4f236 0x12b5335a 0x12b5409d 0x12afae60 0x12b0cdae 0x12b0f747 0x12b107b0 0xa25a3b7 0xa25ddbd 0x7f5f77298609 0x7f5f771bf293
2022.01.15 13:49:32.648103 [ 235 ] {} <Fatal> BaseDaemon: 2. DB::MaterializedPostgreSQLConsumer::readTupleData(DB::MaterializedPostgreSQLConsumer::Buffer&, char const*, unsigned long&, unsigned long, DB::MaterializedPostgreSQLConsumer::PostgreSQLQuery, bool) @ 0x12b4d6ef in /usr/bin/clickhouse
Основываясь на данной таблице: https://clickhouse.com/docs/ru/engines/database-engines/postgresql/#data_types-support
Я понимаю что Nullable может быть только int поля, верно ?PostgreSQL | Документация ClickHousePostgreSQL Позволяет подключаться к БД на удаленном сервере PostgreSQL. Поддерживает операции чтения и записи (запросы S
-
скорее просто что-то кривое в MaterializedPostgreSQL в парсинге WAL
думаю стоит создать issue на github
расшарить минимальную структуру таблицы в PostgreSQL и стектрейс полный -
-
cityHash64(uuid)
-
Спасибо!
-
Всем привет!
Прошу прощения за нескромный вопрос, но:
как вывести дату типа DateTime в формате дд/мм/гггг?
Ничего не помогло ( -
Читайте доку.
https://clickhouse.com/docs/ru/sql-reference/functions/date-time-functions/#formatdatetimeФункции для работы с датами и временем | Документация ClickHouseФункции для работы с датами и временем Поддержка часовых поясов Все функции по работе с датой и временем, для которых эт
-
вот пример использования, прямо щас исопльзовал. буковки из доки выше сами подставите formatDateTime(created_datetime),'%g-%m-%d %R')
-
Спасибо!
-
Спасибо😉
-
Приветствую, кто-то использует для кликхауса ? https://github.com/great-expectations, если да, то на что она способна для кликхауса и какие минусыGreat Expectations
Great Expectations has 4 repositories available. Follow their code on GitHub.
-
лично я не использовал никогда
вот тут есть видео
https://www.youtube.com/watch?v=tZWvJZQ_jDo&t=0s[ClickHouse Meetup] Analytic Tools for ClickHouse — SF Bay AreaJoin us for this virtual session on analytic tools for ClickHouse in particular and data warehouses in general. The presentations cover data cleaning and contracts followed by how to build analytic APIs with cube.js. You can ask questions from Youtube. Do note that this is the final version of the live stream (the first 5 mins are removed due to streaming issues). See the meetup invite for more information: https://www.meetup.com/San-Francisco-Bay-Area-ClickHouse-Meetup/events/276499022/ #ClickHouse #AnalyticTools #DataWarehouse #DataCleaning ----------------- Check out more ClickHouse resources here: https://altinity.com/resources/ Join Reddit community: https://www.reddit.com/r/Clickhouse/ ----------------- Learn more about Altinity! Site: https://www.altinity.com LinkedIn: https://www.linkedin.com/company/alti... Twitter: https://twitter.com/AltinityDB
-
Да,я его нашёл, но он больше рекламный
-
Думаю использовать и не только для кликхауза. Вы планируете для чего использовать? Или с чем сравниваете?
- 16 January 2022 (41 messages)
-
Доброе утро! подскажите пожалуйста, таблица ReplacingMergeTree (Слияние происходят в фоне в неизвестный момент времени, на который вы не можете ориентироваться.). Этот фоновый момент как-то можно настроить? Я тестирую на 2 записях и он их не мержит, пока я сам не вызову OPTIMIZE TABLE . я предполагал, что КХ будет в фоне сам мержить?
-
Когда захочет тогда и смержит, все возможные настройки есть в system.settings с комментариями
-
-
Я не пользовался Replacing, а если запустить Select с FINAL, то тоже 2 записи ?
-
-
Select * from table Final, что даёт ?
-
-
Replacing не даёт гарантию, что не будет дубликатов, он всеголишь убирает дубликаты когда он мержит куски данные, чтобы места меньше занимало, а так писать запросы с Final ( мое мнение, возможно ошибочно). Поищите по чату "дубликация" или что то подобное, помню более понятные объяснение от других людей
-
-
Не надо так делать
Пишите запросы так, чтобы они делали нужную вам дедупликацию.
https://kb.altinity.com/engines/mergetree-table-engine-family/replacingmergetree/
https://kb.altinity.com/altinity-kb-queries-and-syntax/altinity-kb-final-clause-speed/ -
Везде в примерах в ручную вызывают optimize. Не пойму это для примера или это бест практис так делать?
-
Для примера
-
У вас в продакшене будет часть данных смержнна, а часть нет. Делайте аггрегационный запрос на выборку (с group by)
-
Да, для полноты примера показано
-
В общем случае лучше иметь какое-то поле, по которому можно будет определить последнее вставленное значение. Это может быть номер версии, дата вставки и так далее. В этом случае можно будет через argMax(val, updated), например, получить последнее вставленное значение. Где val - это поле с нужным значением, а updated - это поле с датой вставки. Как-то так.
-
Коллеги, вопрос. Имеется таблица с отдельной политикой хранения, в которой сейчас один том, а в нём один диск. Необходимо добавить второй диск другого размера. Если я правильно понял, то лучше создать отдельный том под этот диск и добавить второй том в политику.
1. Верно ли я думаю на счёт отдельного тома?
2. После правки конфига нужно будет перезапустить clickhouse-server? -
Вот мой конфиг.
<yandex>
<storage_configuration>
<disks>
<disk_data_01>
<path>/mnt/clickhouse-data-01/</path>
</disk_data_01>
</disks>
<policies>
<policy_rr>
<volumes>
<hdd>
<disk>disk_data_01</disk>
</hdd>
</volumes>
</policy_rr>
</policies>
</storage_configuration>
</yandex> -
А кто будет мержить данные, если я сам не вызову optimize?
-
Кликхаус в фоне в какой то момент времени :)
-
Я не могу ведь делать group by на каждый запрос. Вот есть у меня 2 строчки с одним и тем же primary key и мне надо получить какие-то данные , которые я могу бы получить, будь это одна строка. Но когда я использую group by, то могу только агрегацию по полям (сумма , количество итп).
-
Не примари кей, а ордеринг. Выше вон подсказали функцию argMax которая по полю дополнительному может вам дать последние актуальные данные по вашему апдейту. К примеру при апдейте можете писать аля modified_date столбец
-
-
Но, вы не сможете заменить только один столбец)
-
Если вы зашли познакомиться с КХ, то вам надо внимательно прочитать раздел про агрегатные функции и их модификаторы. Это сильно расширит ваше представление о допустимом. Тут есть не только "(сумма , количество итп)", и не только уже упомянутый argMax, но ещё и any, groupArray и даже groupBitmapState, и много чего ещё. Где-то тут и зарыта основная магия КХ.
Фактически вы почти всегда делаете group by, потому как основной кейс - это выбрать 10-100-1000 миллионов строк а потом (или заранее) их аггрегировать. Если же вам массово и часто надо выбирать 1 строку, то стоит задуматься о другой СУБД. -
-
1. Да, нужно добавить диск и потом его в полиси.
2. Зависит от версии, в последний вроде уже добавлено без рестарта. -
Попробую. Спасибо
-
TTL добавить мб нужно ещё
-
Добавить куда?
-
-
Ну тогда ок
-
Добрый вечер, есть кто использует формат avro для движка Kafka, при работе с debezium коннектором, получаю невнятную ошибку которую не могу понять
DB::Exception: avro::Exception: Invalid data file. Magic does not match
текст ясне, но никуда меня не приводит.
Буду благодарен любой помощи -
Schema registry есть?
-
Написано же магия не совпадает , вы видимо из хогвартса а надо из Средиземья
-
Он для avroconflent типа указывается, судя по доке
-
Ога, у вас возможно там номер схемы в первых рядах сообщения стоит и возможно у вас как раз таки есть schema registry
-
Доброй ночи, парни! Только начал знакомиться с Clickhouse прошу сильно палками не лупасить.
Пытаюсь поднять схему high availability. Что у меня есть 4 хоста shared + replicated, 2 на чтение, 2 на запись, роутинг при падении одного из хостов хочу отдать на haproxy чтоб от время от времяни он проверял доступность.
Правильный ли это метод хочу узнать у знатаков, сколько гуглил, такую инфу не нашел. Заранее благодарю -
можно во все писать и со всех читать. смысла в отдельных репликах на чтение/запись нет
-
-
спасибо, а балансировать haproxy я так понял. Но haproxy мониторит tcp траффик. Как быть если отвалится сервис на самом хосте но резолвить по сети он будет.
-
там хелсчеки вроде можно настроить (в плане слать http запросы)
- 17 January 2022 (199 messages)
-
-
https://clickhouse.com/docs/en/interfaces/http/
https://clickhouse.com/docs/en/operations/monitoring/#clickhouse-server-metrics
можно GET /ping или GET /replicas_statusHTTP Interface | ClickHouse DocumentationHTTP Interface The HTTP interface lets you use ClickHouse on any platform from any programming language. We use it for w
-
-
Добрый день , я новичок в clickhouse, требуется инструментарий для тестирования производительности / нагрузочного тестирования.
-
есть clickhouse-benchmark
https://clickhouse.com/docs/en/operations/utilities/clickhouse-benchmark/clickhouse-benchmark | ClickHouse Documentationclickhouse-benchmark Connects to a ClickHouse server and repeatedly sends specified queries. Syntax $ clickhouse-benchma
-
Еще нужны best practices при развертывании в прод.
-
Благодарю.
-
Насколько я помню на хабре была хорошая статья, а принципы я читал на ya.cloud
-
Переезжаем на ClickHouse: 3 года спустя
Три года назад Виктор Тарнавский и Алексей Миловидов из Яндекса на сцене HighLoad++ рассказывали, какой ClickHouse хороший, и как он не тормозит. А на соседней сцене был Александр Зайцев с докладом...
-
Спасибо ! )
-
-
Ребята, может быть есть у кого конфигурация кликхаус кластера для docker-compose ?
Мне для разработки. Думаю что разрабатывать и тестировать лучше в кластерной конфигурации. Думал сделать 2 шарда и у каждого по 2 реплики.
Насколько это оправдано и реально для разработки и как это лучше сделать ? -
GitHub - ilejn/ClickhouseCluster_DockerCompose: Example Docker Compose configs for Clickhouse Cluster (via ZooKeeper)
Example Docker Compose configs for Clickhouse Cluster (via ZooKeeper) - GitHub - ilejn/ClickhouseCluster_DockerCompose: Example Docker Compose configs for Clickhouse Cluster (via ZooKeeper)
-
только сегодня ночью поднял
-
GitHub - TanVD/ClickhouseCluster_DockerCompose: Example Docker Compose configs for Clickhouse Cluster (via ZooKeeper)
Example Docker Compose configs for Clickhouse Cluster (via ZooKeeper) - GitHub - TanVD/ClickhouseCluster_DockerCompose: Example Docker Compose configs for Clickhouse Cluster (via ZooKeeper)
-
-
-
спасибо
-
Уважаемые специалисты, здравствуйте. Столкнулся с проблемой скорости запросов к словарю. Есть словарь из строковых key, value на 30 миллионов строк. Выбираю value по одному key из таблицы engine=dictionary, получаю результат только через несколько секунд.
1 rows in set. Elapsed: 2.859 sec. Processed 28.96 million rows, 2.30 GB (10.13 million rows/s., 803.25 MB/s.)
layout = COMPLEX_KEY_HASHED, так что все оперативной памяти, да и статус у словаря loaded. Нагрузки на сервер нет, памяти 128ГБ. Почему так медленно? Какая у вас скорость работы со словарем? -
Возможно я косолап, но у меня в композе хреново работало
-
-
Оригинальный конфиг от TanVD у меня не работал никак, в моем есть некоторые изменения. Представляет собой три реплики, шард один.
-
Подскажите пожалуйста как сформировать запрос к ClickHouse. Есть запрос: "SELECT ServiceId, count(*) FROM samples_1day where Timestamp='2022-01-16T00:00:00' and CallStackName = '[unknown_Java]' GROUP BY ServiceId", который считает количество фреймов '[unknown_Java]' и группирует их по идентификатору сервиса. Мне надо добавить еще одно поле, общее количество фреймов для данного идентификатора сервиса, или может сразу посчитать ratio. Как это сделать эффективнее? Спасибо.
-
словари придуманы для dictGet, а не для того чтобы из них добывать 28.96 million rows последовательным чтением. engine=dictionary работает небыстро и нужна для операций контроля работы словаря.
Скажите лучше что вы хотите сделать таким образом? -
Буду смотреть, спасибо :)
-
Хочу приджоинить названия товаров (и другие данные) к истории цен товаров
-
посмотрите на engine=Join - она именно для этого. Похоже на словарь (есть даже joinGet), но работает быстро именно в данном кейсе
-
Спасибо, попробую. А есть примеры использования dictGet в запросах, чтобы понять сценарии, где они пригодятся?
-
@bvt123 Привет, а ты пытался высчитывать на sql для k-means метод логтя или метод силуэта ? https://clck.ru/akMHa
-
Если я правильно понял, что выборка одной записи из словаря занимает несколько секунд, то здесь какое-то явное не то.
Расскажите, как описан словарь в конфигурации. Ну и приведите строку из system.dictionaries
И пример использования. -
CREATE DICTIONARY products_dict
(
product_id String,
name String
)
PRIMARY KEY product_id
SOURCE(POSTGRESQL(
...
query 'SELECT product_id, name FROM products'
))
LAYOUT(COMPLEX_KEY_HASHED())
LIFETIME(3600);
dictionaries:
database: wdm
name: products_dict
uuid: 1464ba09-990c-4e69-9464-ba09990c0e69
status: LOADED
origin: 1464ba09-990c-4e69-9464-ba09990c0e69
type: ComplexKeyHashed
key.names: ['product_id']
key.types: ['String']
attribute.names: ['name']
attribute.types: ['String']
bytes_allocated: 4831830312
query_count: 57912282
hit_rate: 1
found_rate: 1
element_count: 28956140
load_factor: 0.4314801096916199
source: PostgreSQL: ...
lifetime_min: 0
lifetime_max: 3600
loading_start_time: 2022-01-17 03:53:21
last_successful_update_time: 2022-01-17 03:54:46
loading_duration: 84.79
last_exception:
comment:
Вот и я думаю, то или не то. Понравилось, что словарь сам обновляется. Приме использования (немного подрезал, поэтому может выглядеть странно с первым подзапросом):
SELECT ppd.*, p.name
FROM
(
SELECT
product_id,
price
FROM product_prices_daily
WHERE
product_id IN ('97646221','97646318','976464823','97647223','976472425','976474961','976476908')
AND day between '2022-01-13' and '2022-01-14'
) as ppd
LEFT JOIN products_dict as p ON p.product_id = ppd.product_id -
Используйте dictGet
-
-
Подскажите, пожалуйста, как мне использовать dictGet в таком сценарии или какие-то другие сценарии для него. Я не понимаю
-
-
157ms Замечательно! Спасибо!
-
нет, определение k я не делал. Несложно дописать в основной цикл вычисление статистики как для "локтя", так и для "силуэта", чтобы потом построить графики и принимать решение. Но код станет ещё сложнее для понимания. Особенно для "силуэта".
-
работало субоптимально т.к. JOIN загружает всю правую таблицу. кажется что в этом месте не помешала бы автоматическая оптимизация. какая у вас версия КХ?
-
ClickHouse server version 21.12.3 revision 54452
-
Ни в какой версии ClickHouse в этом месте нет автоматической оптимизации. Зато есть ENGINE Join https://clickhouse.com/docs/ru/engines/table-engines/special/join/Join | Документация ClickHouse
Join Подготовленная структура данных для использования в операциях JOIN. Создание таблицы CREATE TABLE [IF NOT EXISTS] [
-
Окей, спасибо за ответ.
-
Все-таки между engine join и dictionary есть существенная разница в способе наполнения данными. С dictionary нужно только прописать источник, а с join engine выстраивать схему наполнения актуальными данными. Или я не прав?
-
А сколько строк у вас словаре и сколько оперативной памяти ? Чисто для себя интересно
-
Roman Ivanov in ClickHouse не тормозит
CREATE DICTIONARY products_dict ( product_id String, name String ) PRIMARY KEY product_id SOURCE(POSTGRESQL( ... query 'SELECT product_id, name FROM products' )) LAYOUT(COMPLEX_KEY_HASHED()) LIFETIME(3600); dictionaries: database: wdm name: products_dict uuid: 1464ba09-990c-4e69-9464-ba09990c0e69 status: LOADED origin: 1464ba09-990c-4e69-9464-ba09990c0e69 type: ComplexKeyHashed key.names: ['product_id'] key.types: ['String'] attribute.names: ['name'] attribute.types: ['String'] bytes_allocated: 4831830312 query_count: 57912282 hit_rate: 1 found_rate: 1 element_count: 28956140 load_factor: 0.4314801096916199 source: PostgreSQL: ... lifetime_min: 0 lifetime_max: 3600…
-
30М строк, 128МБ оперативной, занято словарем 4,5 GB
-
Спасибо
-
Спасибо
-
hash join сначала считает хэши для всей правой таблицы. Для словаря это тоже занимает время.
А engine join позволяет сделать это однократно.
Ну т.е. engine join это слой поверх словаря и его использование имеет смысл.
Еще в принципе можно запретить hash join https://clickhouse.com/docs/ru/operations/settings/settings/#settings-join_algorithm, если в левой таблице совсем мало, а в правой таблице совсем много элементов, это может работать быстрее. Но это домыслы, реально такого никогда не видел.Настройки | Документация ClickHouseНастройки distributed_product_mode Изменяет поведение распределенных подзапросов. ClickHouse применяет настройку в тех с
-
- Join engine набирает данные постепенно (хоть по одной строке, но лучше пачками) и сразу замещает хеш в памяти.
- Словарь обычно считывает весь набор данных целиком (есть улучшения) через какой-то интервал времени.
- join engine может хранть данные как ALL (с повторениями) или как ANY(только один ключ).
- Словарь - только одина строка на ключ
- для всех столбцов join engine строиться один хеш в памяти
- для каждого столбца словаря стоиться свой хеш - занимает больше RAM -
-
А как обновлять данные в таблице с движком JOIN? По документации, если будет прислана запись с ключом, который уже есть в таблице, то она будет проигнорирована. Допустим, мне нужно обновить какие-то данные в какой-то записи такой таблицы. Нужно будет сначала удалить запись, а затем добавить новую? Есть, конечно, вариант использования строгости ALL, но в этом случае потребуется делать группировку, чтобы отобрать последнюю вставленную, которую ещё нужно будет найти по дополнительному полю с датой или с версией. Или я чего-то не понимаю?
-
Собираю кластер clickhouse, пока остановился на 2 шарда + 2 репликик, нужно спланировать конфигурацию серверов.
Подскажите есть ли примерное соотношение ssd + memory + cpu, т.е например на 1 ядро 1 гб озу и 100 гб ssd? -
Приветствую, тестирую шардирования (репликаций нету), при шардирование на 2 сервера скорость выполнение запросов равна единицы, при шардирование такого же датасета на 3 шарда производительность уже равна две единицы. Почему разница в 2 раза, а не в 1.5? С чем может быть это связано
-
-
Insert или Select ?
-
а можно и то и другое?
-
Статьи не знаю.
На каждый запрос по одному или несколько тредов.
Не более https://clickhouse.com/docs/en/operations/settings/settings/#settings-max_threads
Очередь есть при превышении https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings/#max-concurrent-queriesSettings | ClickHouse DocumentationSettings distributed_product_mode Changes the behaviour of distributed subqueries. ClickHouse applies this setting when
-
😘
-
Это может быть связано с ошибкой в эксперименте.
-
Select, про инсерт тоже бы почитал
-
Спасибо
-
https://www.youtube.com/watch?v=Ac2C2G2g8Cg&t=2876s&ab_channel=HighLoadChannel
Тут в начале про Insert есть в рассказе, а про select примерно ответили уже тутЭффективное использование ClickHouse / Алексей Миловидов (Яндекс)Приглашаем на Saint HighLoad ++ 2021 20 и 21 сентября 2021, Санкт-Петербург, DESIGN DISTRICT DAA in SPB Программа, билеты и подробности - https://clck.ru/VmKaW -------- HighLoad++ 2017 Тезисы: http://www.highload.ru/2017/abstracts/2992 ClickHouse чуть более года доступен в open-source. За это время накоплен опыт его использования в российских и зарубежных компаниях. В некоторых из них объёмы данных и нагрузки превышают те, с которыми мы имеем дело в Яндексе. Так как ClickHouse является специализированной системой, при его использовании важно учитывать особенности его архитектуры. В своём докладе я расскажу о примерах типичных ошибок при использовании ClickHouse, которые могут привести к неэффективной работе. На примерах из практики будет показано, как выбор той или иной схемы обработки данных может изменить производительность на порядки. Нашли ошибку в видео? Пишите нам на support@ontico.ru
-
-
Ну и нужно понимать, что один запрос Select может сожрать всю машину под себя.
-
-
-
-
-
Интересный опыт.
Какое у вас типичное количество одновременно исполняемых запросов (не люблю такую формулировку, но что ж поделать) ?
ClickHouse действительно не имеет механизмов, работающих динамически (насколько я знаю), если не считать очеред запросов по max_concurrent_queries -
Вообще в планах на этот год фичи по ограничению и контролю ресурсов
-
Скорей всего когда он забит на 100%, то упирается в производительность жестких дисков из-за этого и падает производительность
-
По разному, обычно немного, но есть крупные клиенты. 11 запросов в секунду, но запросы крайне неоднородные. Бывает за 100мс, а может 30 секунд. Поэтому, если делать статический лимит - то никогда не угадаешь будет ли это 100 запросов по 100 мс или 100 по 30 секунд
-
Он наверное один из лучших видосиков про оптимизацию кликхауса https://youtu.be/efRryvtKlq0
-
То есть должен быть прирост 1.5 ?
-
Я бы, наверное, попробовал установить max_threads в cpu_cores/2 .
-
Да, в моем понимании прирост должен быть 1.5 или чуть менее.
У вас на нет перекоса, на всех шардах близкое количество данных? -
Спасибо. Сейчас, когда у нас отдельный сервис формирует очередь, все хорошо работает. Динамически количество задач(запросов) формируется. Просто не люблю оверинжениринг, и если система что-то сама может - стараюсь перекладывать на нее))
-
Ок! спасибо за все видео
-
Какой ключ шардирования, какие запросы
-
А ваша очередь ближе к ClickHouse или к вашему приложению? Если первое, может, порадуете сообщество, сделав решение открытым?
-
Перекоса нету
-
Да я бы с радостью, но это простенький джава сервис. Мы слушаем сервер через прометэус, смотрим метрики процессора. Так как у нас рандом балансер перед кластером стоит, мы просто отслеживаем среднюю нагрузку на весь кластер, если средняя выше 95% пропускаем N времени.
-
cityHash64(user_id), select c where, select с join, просто select, ну и в каждом запросе есть group by
-
Что то по типу такого, как запустить на кластер ?
SELECT rand() % 10000000 AS k
FROM system.numbers_mt
GROUP BY k -
Ну а так почему нет?
У вас стало больше памяти для page cache, больше cpu для обработки и если делает GROUP BY user_id, то меньше уникальных id на каждом конкретном шарде, что означает более быструю агрегацию -
Но ускорение не только связанных с user_id, но даже если не используется в запросе user_id. Например такой
select event,count()
FROM table
group by event
Даёт так же х2. -
Немного побенчил векторные базы (in-mem в том числе), по аналогии с Billion Taxi Rides: shakti, kdb, clickhouse
https://t.me/inv2004_dev_blog/40 -
Подскажите, как в КХ правильнее из таблицы с "историчностью" вытаскивать данные по состоянию на определённый момент времени. Например, в оракле я делал так:
select MAX(a.attr_name) KEEP (DENSE_RANK LAST ORDER BY a.actdate)
from hist_tab a
where a.id = 79 and a.actdate <= :on_date -
Случайно не argMax?
-
Да. Именно то, что нужно. Спасибо.
-
Настройки | Документация ClickHouse
Настройки distributed_product_mode Изменяет поведение распределенных подзапросов. ClickHouse применяет настройку в тех с
-
Да, вроде вариант. А старые значения удалять через TTL?
-
Если поставить join_any_take_last_row = 1 для движка Join, то старое значение просто перезапишется новым, TTL не нужен, да и не работает для Join
-
-
Добрый день. Есть агрегейтет мт с order by id, id2 каждый ключ и без связки уникальный
Есть view поверх неё с group by id, id2, чтоб собирать все стейты.
Могут быть случае когда запросы к view where id = …
Или where id2 = … не будут пробрасывать индекс, а будут сначала считать всю таблицу, а потом по типу having отфильтровывать результат? -
having тут не причем.
where id = .. будет работать относительно пристойно. where id2= ... (без id) прочитает с диска всю таблицу, как будто индекса нет, но отфильтрует в процессе все что вам надо. а потом уже будет группировка и все что вы напишите. -
Понял, спасибо.
-
можно попробовать добавить skip index по id2 - м.б. звезды (данные) сложатся как надо и скорость будет пристойная. Если нет - можно сделать табличку соответствия id2->id и делать по ней предварительное вычисление, чтобы в where всегда был id.
-
Настроил кластер кликхауса, сделал распеределенные таблицы, с репликацией, все работает все хорошо, но при отключении одной из нод, получаю вот такую ошибку:
Code: 210, e.displayText() = DB::NetException: Connection refused (ch…:9000) (version 21.6.4.26 (official build))
Можно ли сделать так что бы при отключении одной из нод, другие продолжали работать? -
это вы напрямую пытаетесь подключиться к упавшей ноде?
-
Нет, это я к distribution таблице обращаюсь, на живой ноде, под капотом distribution таблицы, реплицируемые таблицы
-
У вас точно шардирование настроено?
-
скорее всего у вас что-то не так с настройками реплик
Выдержка из документации:
Если соединение с сервером не установлено, то будет произведена попытка соединения с небольшим таймаутом. Если соединиться не удалось, то будет выбрана следующая реплика, и так для всех реплик. -
Всем привет!
#job #вакансия
Сбермаркет ищет стажеров-аналитиков!
🍏Локация: Москва, м. Новокузнецкая (можно удаленно)
💚Основной стек: SQL, Python, знание Clickhouse будет крутым плюсом:)
❓Почему мы?
-У нас стажеры решают реальные задачи бизнеса и даже получают некоторую зону ответственности. -Можно прокачивать как свои менеджерские качества, так и технические
-В СберМаркете стажеры комитят код в репозитории и он регулярно проходит код-ревью. Что-то из твоих наработок попадет в продакшн.
Даже при большом росте -мы сохраняем дух стартапа. Поэтому у нас нет токсичности и бюрократии, и мы открыто обсуждаем все возникающие проблемы.
-У нас можно и нужно расти. После успешной стажировки ты сможешь стать частью команды и брать на себя более сложные задачи и увеличивать зону ответственности
🟢Чем предстоит заниматься?
-Исследовать бизнес-процессы, ломать плохие и создавать эффективные.
-Продумывать и считать метрики.
-Исследовать поведение пользователей, проверять и оценивать гипотезы, конвертировать их в проекты и вести их.
-Проактивно исследовать различные домены бизнеса: продукт, операции, маркетинг и т.д.
-Дизайнить, проводить и анализировать A/B-тесты и квази-эксперименты
-Задавать много вопросов :)
✨✨✨С вакансией можно ознакомиться тут: https://www.notion.so/Analytics-Data-Science-Intern-9b605702c09049b7b0057ec2cee109d9
⚡️Присылай CV → https://airtable.com/shrsPTgUE2R5jjQVJ , проверяй почту - возможно письмо с тестовым заданием улетело в спам. Будем рады, если наша большая и дружная команда пополнится в ближайшее время💚Analytics / Data Science InternПривет! 👋🏻 Мы ищем стажеров в команду данных.
-
покажите что в select * from system.clusters
-
Всем привет. Подскажите, пожалуйста, есть ли возможность как-то ограничивать размер БД? Ну типа квот на место на диске.
-
-
у вас кластер шардирован, но не реплицирован. Если у вас лежит 1 шард, у вас будет недоступна часть данных
-
Здравствуйте коллеги. Выполняю запрос инсерт - для перемещения данных от одной таблицы другой. Выдает исключение:
Code: 439. DB::Exception: Received from localhost:9000. DB::Exception: Cannot schedule a task: no free thread (timeout=0) (threads=10000, jobs=10000). (CANNOT_SCHEDULE_TASK) -
-
Но таблицы типа ReplicatedMergeTree у меня корректно работают, данные реплецируются
-
?
-
По размеру не было, не знаю, насколько это необходимо. Про TTL, я думаю, вы и так знаете.
-
а сколько ядер? сколько тредов в настройках?
-
Данные на 2-х шардах совпадают? покажите как они созданы, можно без полей, вы скорее всего что-то где-то захардкодили. И как выглядит ваш remote_servers конфиг
-
закоммитил в репозиторий clickhouse k-means вычисление метрик для локтя и силуэта. Если есть желание проверить - буду рад. Только учтите, что силуэт требует вычисление взаимных расстояний всех точек друг от друга. Это cross join NxN. Если исходных точек будет 10М, то мне даже страшно подумать сколько оно будет работать.
-
😘 вот это огнище
-
Всем доброго вечера!
А скажите, пожалуйста, logs как имя базы не является нерекомендуемым? -
вроде есть таблица в system такая же ... Зачем лишния путаница :)
-
это не таблица, это база.
-
Сейчас буду разбираться и запускать вычисления :) Спасибо
-
-
-
Разобрался со всем, спасибо)
-
Т.е можно удалить папку system и попробовать стартануть сервер?
-
You can drop / rename / truncate *_log tables at any time
-
-
Я понимаю английский. Просто тут написано про таблицы, а не про файлы на диске. А поскольку сервер не подминается, то alter table drop в таком варианте не проходит. Поэтому я и уточнил про фолдер на диске.
-
Всем привет. Есть такая проблема: неоптимизированная таблица в ~5Тб, которую хотелось бы перенести в s3. Возможно ли для этого использовать clickhouse-copier? Если нет, какие возможны альтернативы?
-
А вы ее каким образом перенести то хотите? В каком виде
-
Главным образом -- не потеряв данные
-
https://altinity.com/blog/tips-for-high-performance-clickhouse-clusters-with-s3-object-storage
https://altinity.com/blog/clickhouse-and-s3-compatible-object-storage
Разве что zero copy replication пока не стоит включатьTips for High-Performance ClickHouse Clusters with S3 Object StorageIn this article, we will discuss how ClickHouse clusters can be used with S3 efficiently thanks to two important new features: the ‘s3Cluster‘ table function and zero-copy replication.
-
-
Мы стараемся ориентировать наши stable релизы с LTS от ClickHouse
Так что следующий скорее всего будет 22.3 -
жаль) долго ещё ждать придётся)
-
Ну вроде и не очень, всего пару месяцев :)
-
так пока ещё всё пофиксят месяц минимум)
-
Ну, раньше было еще дольше.
Так что чем богаты, тем и рады -
Подскажите как можно очистить сервер от всех объектов и данных?
-
Добрый вечер)
Пытаюсь создать в клике таблицу с полем типа Polygon.
Попробовал в конце запроса докинуть настройку allow_experimental_geo_types = 1, но возвращает ошибку:
Cannot create table with column 'pg' which type is 'Polygon' because experimental geo types are not allowed.
Не знаете в чем проблема?
@dj_mixer
ENGINE нарочно удалил для скрина) -
Пропишите данную настройку для default пользователя на всех машинках
-
Можете очистить
/var/lib/clickhouse/metadata/*
/var/lib/clickhouse/data/*
/var/lib/clickhouse/store/* -
Эта не пройдет. Её в конфиг профиля и пересоединится надо. Сеттингс не для всего работает (например query id)
-
Понял, спасибо)
-
Интересно ... т.е. бывают настройки, задаваемые в <profiles>, которые нельзя установить через SET?
Вот ведь ... -
Установить можно.
Проблема в другом.
Запросы ON CLUSTER 'xxxx' выполняются внутренним воркером кх который использует default профиль.
При этом настройки там не прокидываются в теле запроса. -
Локально вроде не будет все равно. Experimental все.
Settings вообще до недавно в create не работал -
-
Для ON CLUSTER запросов не пихает.
-
Одна из причин, почему для них нужно всегда указывать базу для таблицы.
-
Вот это поворот ;)
Как бы логично, но больше похоже на баг, чем на фичу. -
Подскажите, а есть ли способ атомарно переносить данные из таблиц с разным партиционированием? Храним данные с дневным партиционированием, так как данные постоянно меняются за последнюю неделю и мы через replace partittion обновляем данные. Планируем добавить таблицу с месячным партиционированием и объединить через Merge таблицу, для того чтобы уменьшить число партов.
Пока в голову приходит только такой вариант, будет небольшой промежуток времени без данных за месяц, может можно оптимальнее?
INSERT INTO monthly_tmp
DROP PARTITIONS daily 01..31
REPLACE PARTITION monthly FROM monthly_tmp -
Атомарно нельзя, но тикетов есть куча на разное гибридное партиционирование
-
но их не будут делать, я спрашивал в issue Roadmap 2022
-
Обязательно бахнем, весь мир в труху, но потом )
-
ждёмс пока) может что-то интересное в облаке выкатят)
-
Атомарнее лучше так:
Insert into monthlytmp
Detach partition from monthlytmp
Drop partition 01
Attach to monthly
При одинаковых схемах monthly / monthlytmp должно быть ок, и переливать можно каждый день -
monthlytmp c дневным партиционированием имеется ввиду? нормально будет аттачить к месячной таблице?
-
Нет. Monthlytmp месячный. Туда вставка из дневной идет.
-
-
а чем тогда detach/attach лучше чем replace?
-
-
Имеет смысл только если данных много ессно
-
-
теперь понял, вставлять по дню в monthly_tmp
-
партицию размером 133.98 GiB за 0.5 сек replace делает
-
если на разных дисках - то нет.
тут больше вопрос хотите ли вы переливать по дням или вас устраивает капитальный перелив раз в месяц.
если второе, сколько времени вам ок на это выделить (сам replace то быстр, но insert-select нет). итд, итп. -
Ну это понятно, но в теории 1 раз жирный инсерт сделать ночью и 1 жирный мерж потратит меньше цпу чем 30 мержей
-
не будет одного жирного мерджа, будут много на каждый Н-ый инсерт
-
Кто-нибудь работал с библиотекой clickhouse-bulk на го?
https://github.com/nikepan/clickhouse-bulk
можно ли как-то передать CA сертификат?GitHub - nikepan/clickhouse-bulk: Collects many small inserts to ClickHouse and send in big insertsCollects many small inserts to ClickHouse and send in big inserts - GitHub - nikepan/clickhouse-bulk: Collects many small inserts to ClickHouse and send in big inserts
-
ну или kittenhouse
-
А kittenhouse не утратил актуальность в свете https://clickhouse.com/docs/ru/operations/settings/settings/#async-insert ?Настройки | Документация ClickHouse
Настройки distributed_product_mode Изменяет поведение распределенных подзапросов. ClickHouse применяет настройку в тех с
-
Всем привет!
Скажите пожалуйста, как мне результат селекта в постгрес перенести в кликхаус? Через copy в csv не получается, потому-что в данных запятые -
Если много способов.
JSON?
TSV (как CSV, но с табами)?
Прямой запрос из ClickHouse в PostgreSQL?
Ну и правильный CSV вообще-то позволяет иметь запятые в полях. -
вроде были тут тесты от создателя kittenhouse, пока async-insert проигрывает
-
async insert вроде еще не lts?
-
В kittenhouse только если самому код поменять
-
Без асинхронной работы с сетью по одной строке во много соединений будет вставлять плохо
-
Shameless plug https://youtu.be/1tYev6PEJXU
-
имеет смысл сделать прокси для kittenhouse, чтобы перехватывать запросы и добавлять им сертификат или bullshit strategy?)
-
А как прямой запрос из клика осуществить? Видимо у меня неправильный CSV )
-
Я бы правда форкнул и прислал пул реквест
-
postgresql | Документация ClickHouse
postgresql Позволяет выполнять запросы SELECT и INSERT над таблицами удаленной БД PostgreSQL. Синтаксис postgresql('host
-
И ещё бы тегнул товарища https://vk.com/bkmz, чтобы не ленился и обновил опенсорс версию заодноIlya Scherbak
ВКонтакте
-
Спасибо!
-
помогите, пожалуйста, разобраться с киттеном
не хочет запускаться -
Не хочет собираться :). Могу лишь порекондовать свой форк, где исправлена сборка: https://github.com/YuriyNasretdinov/kittenhouseGitHub - YuriyNasretdinov/kittenhouse
Contribute to YuriyNasretdinov/kittenhouse development by creating an account on GitHub.
-
Но вообще конечно это должны товарищи из ВК сами были пофиксить, но так и не пофиксили
-
(Склонируйте реп куда угодно и выполните внутри go install -v ./...)
-
о, это вы сравнивали clickhouse-bulk и kittenhouse?)
-
Ну я изначальный автор kittenhouse :). Я, конечно же, буду хвалить именно его
-
Вот и пришло мое время)
Друзья, подскажите пожалуйста аналитику который никогда не юзал клик видосы/каналы/уроки что почитать, чтобы быстрее виянуться в клик и клик-скуль, что-то Аля постгресПро -
https://www.youtube.com/c/ClickHouseDB
https://presentations.clickhouse.com/talks_index.html -
На ютубе что-то одни митапы и хайлоуды без разделения на темы(
-
step-by-step я еще не встречал.
Но можно начать с туториала тогда https://clickhouse.com/docs/ru/getting-started/tutorial/
А дальше по докеTutorial | Документация ClickHouseClickHouse Tutorial What to Expect from This Tutorial? By going through this tutorial, you’ll learn how to set up a simp
-
Понял, Спасибо, для меня после скульсервера достаточно открытием является словари всякие и другие такие штуки)
-
В самых ранних видео про них много было.
-
Могу посоветовать наши видео:
https://www.youtube.com/watch?v=zDIK3Ej86GU
https://www.youtube.com/watch?v=FsVrFbcyb84
https://www.youtube.com/watch?v=1TGGCIr6dMY
https://www.youtube.com/watch?v=6WICfakG84c
И статьи (уже чуть позже, тк более глубокая тема)
https://altinity.com/blog/harnessing-the-power-of-clickhouse-arrays-part-1
https://altinity.com/blog/harnessing-the-power-of-clickhouse-arrays-part-2
https://altinity.com/blog/harnessing-the-power-of-clickhouse-arrays-part-3
На сайте ClickHouse тоже теперь есть уроки (в основном по новым фичам)
https://clickhouse.com/learn/
И у tinybird
https://blog.tinybird.co/categories/clickhouse/
После того, как будут просмотрены-прочитаны статьи
Можно заглянуть на KB и читать все подряд (кроме Setup & maintenance, Kubernetes думаю)
https://kb.altinity.com/
https://www.youtube.com/playlist?list=PLQC2_0cDcSKD1y0Yc6COzhn2bzYEZaYhQ
Первое и третье видео полезны будут.
А дальше уже для любителей.
5,6 про внутреннее устройство, если будет желание.
Опять же про внутреннее устройство и хештаблицы
https://www.youtube.com/watch?v=EoX82TEz2sQHow Fast is ClickHouse-Fast?ClickHouse is famous for its speedy response. We call it "ClickHouse-Fast." Find out how fast that really is in this short video with Altinity CEO, Robert Hodges. #ClickHouse #DataWarehouse #OpenSource ----------------- Learn more about Altinity! Site: https://altinity.com LinkedIn: https://www.linkedin.com/company/altinity/ Twitter: https://twitter.com/AltinityDB
-
Спасибо
- 18 January 2022 (243 messages)
-
Понятно что после драки кулаками не машут, но я для таких случаев держу на каждом сервере пустой файл в несколько гб 5-10. Чтобы в случае проблем с местом и не запуском сервера файл удалить и сервис поднять. А вообще мониторить лучше и когда подходит место к концу - решать заранее вопрос
-
Посмотрите на табличную функцию postgresql
-
Всем привет ,поделитесь пожалуйста плейбуком для развертывания кластера )
-
установка на Bare metal.
-
без понятия как на bare metal
-
GitHub - AlexeySetevoi/ansible-clickhouse: ansible role for clickhouse
ansible role for clickhouse. Contribute to AlexeySetevoi/ansible-clickhouse development by creating an account on GitHub.
-
Вышел патч на новую версию :) https://clickhouse.com/docs/ru/whats-new/changelog/#improvement_22021 | ClickHouse Documentation
ClickHouse release v21.12, 2021-12-15 Backward Incompatible Change A fix for a feature that previously had unwanted beha
-
подскажите пожалуйста
есть таблица в которой 2 нестед массива строк
params Nested(k String, v String)
как мне в селекте вернуть их в виде map{k[0]: v[0], k[1]: v[1], ...} ?
через
groupArray(map(arrayJoin(params.k) as k, params.v[indexof[params.k, k]] as v)) as kv
я получаю массив [map{k[0]: v[0]}, map{k[1]: v[1]}, ...] а нужен именно один мап из набора ключей и значений в нестед массивах
уже голову сломал (( -
привет! нужно увеличить max_query_size, если через clickhouse-client сделать set max_query_size = 10000000, то в текущей сессии запрос исполняется, а если в default profile в users.xml добавить <max_query_size>10000000</max_query_size>, то нет, Max query size exceeded, причём в обоих случаях значение max_query_size в system.settings меняется на нужное, где ещё может быть проблема во втором случае?
-
Добавляй в профиль
-
-
он дефолтный использует
-
-
так туда и добавил )
-
-
Note 2: Log tables with numeric postfixes (_1 / 2 / 3 …) query_log_1 query_thread_log_3 are results of Clickhouse upgrades. When a new version of Clickhouse starts and discovers that a system log table’s schema is incompatible with a new schema, then Clickhouse renames the old *_log table to the name with the prefix and creates a table with the new schema. You can drop such tables if you don’t need such historic data
Сделал запрос
show tables from system
В результате 2365 таблиц. Суффикы у некоторых таблиц больше 500, например, trace_log_540. Т.е это не есть результат обновления CH.
Как я понял drop table работает только с одной таблицей. Может есть возможность дропнуть все старые за раз? -
А запрос через какой интерфейс делаете?
-
да в том же clickhouse-client локально делаю
-
вам нужен cast
with groupArray(toString(number)) as k, groupArray(toString(number*2)) as v
select cast(arrayZip(k,v) ,'Map(String,String)') from numbers(10); -
clickhouse-client -mn -q "SELECT concat('DROP TABLE system.',name,' NO DELAY;') FROM system.tables WHERE database='system' AND match(name, '_[0-9]+$')" | clickhouse-client -mn --echo
-
Спасибо, сейчас попробую.
Искал как раз в документации по "zip" и не нашёл ничего -
_540 это как то дофига =)
такое ощущение что у вас там XML определение trace_log и metadata/system/trace_log.sql по структуре сильно расходятся в части ENGINE или TTL -
И они продолжают увеличиваться. Вот настройка из XML
`
<trace_log>
<database>system</database>
<table>trace_log</table>
<engine>ENGINE = MergeTree PARTITION BY toYYYYMM(event_date)
ORDER BY (event_time)
TTL event_date + INTERVAL 14 DAY DELETE
SETTINGS ttl_only_drop_parts=1
</engine>
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
</trace_log>
` -
а что лежит в /var/lib/clickhouse/metadata/system/trace_log_XX.sql ?
какая версия clickhouse? -
ATTACH TABLE _ UUID '8281452a-ad50-4805-8281-452aad509805'
(
event_date Date,
event_time DateTime,
event_time_microseconds DateTime64(6),
timestamp_ns UInt64,
revision UInt32,
trace_type Enum8('Real' = 0, 'CPU' = 1, 'Memory' = 2, 'MemorySample' = 3, 'MemoryPeak' = 4),
thread_id UInt64,
query_id String,
trace Array(UInt64),
size Int64
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(event_date)
ORDER BY event_time
TTL event_date + toIntervalDay(14)
SETTINGS ttl_only_drop_parts = 1, index_granularity = 8192 -
а в trace_log.sql
ATTACH TABLE _ UUID 'b7afa7b9-ab92-46b9-b7af-a7b9ab9236b9'
(
event_date Date,
event_time DateTime,
event_time_microseconds DateTime64(6),
timestamp_ns UInt64,
revision UInt32,
trace_type Enum8('Real' = 0, 'CPU' = 1, 'Memory' = 2, 'MemorySample' = 3, 'MemoryPeak' = 4),
thread_id UInt64,
query_id String,
trace Array(UInt64),
size Int64
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, event_time)
SETTINGS index_granularity = 8192 -
странно, я думал что TTL будет в trace_log.sql и не удет trace_log_XX.sql
как то странно обрабатывается <engine> из XML
какая версия clickhouse? -
21.12.3.32
-
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-system-tables-eat-my-disk/ Ты по этому гайду сделал ?
-
да, по этому.
-
ну как тупой вариант это
добавить ручками TTL + SETTINGS в trace_log.sql
и рестартовать сервер. посмотрев не создалась ли trace_log_XX -
Привет, ребят, подскажите, пожалуйста - где можно почитать про то как в КХ идет обор нужных партиций, либо как это в плане отображено.
Интересует - работает ли фильтр по ним для переменных типа today() now() , которые не стат параметры. И в случаях если партиция по части значения в колонке. -
explain plan indexes = 1
-
спасибо, попробую
-
Возвращаясь к этой проблеме: существует ли возможность in-place переноса данных из неоптимизированной таблицы в другую с той же структурой, но другими ключами?
-
Из кх в кх? Можно через Distributed, можно ручками скрипт, можно через схему старая таблица -> MV -> новая, но последний вариант зависит от того, используете ли вы POPULATE в MV еще
-
-
in-place? Но как? Там же порядок хранения определяется в order by (фактически в primary key) Т.е. вам надо пересортировать данные и записать их в этом порядке.
-
А их можно пересортировать в рамках одной таблицы? Я так понимаю, что нет. Нынешний ключ сортировки очень неэффективен. Пробовал подход с limit..offset, на больших оффсетах отваливается по таймауту.
-
Нет, пересоздавать таблицу надо, нельзя менять ORDER BY
-
Не понимаю, что не так.
В конфиге:
<metric_log>
<database>system</database>
<table>metric_log</table>
<engine>
ENGINE = MergeTree PARTITION BY (event_date)
ORDER BY (event_date, event_time)
TTL event_date + INTERVAL 14 DAY DELETE
SETTINGS ttl_only_drop_parts = 1, index_granularity = 8192
</engine>
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
<collect_interval_milliseconds>1000</collect_interval_milliseconds>
</metric_log>
=======================================================
Меняю ENGINE с настройками один в один как config.xml в файле metric_log.sql
Перезагружаю сервер. В итоге плодятся файлы
ENGINE в metric_log.sql стал таким:
ENGINE = MergeTree
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, event_time)
SETTINGS index_granularity = 8192
===================================
metric_log_0.sql
ENGINE = MergeTree
PARTITION BY (event_date)
ORDER BY (event_date, event_time)
TTL event_date + INTERVAL 14 DAY DELETE
SETTINGS ttl_only_drop_parts = 1, index_granularity = 8192
==================================================
metric_log_1.sql
ENGINE = MergeTree
PARTITION BY event_date
ORDER BY (event_date, event_time)
TTL event_date + toIntervalDay(14)
SETTINGS ttl_only_drop_parts = 1, index_granularity = 8192
Все последующие mextric_log_xx.sql такие-же как и metric_log_1.sql
Пока пришлось остановить вообще логирование. -
Добрый день, есть задача собирать/хранить данные по рекламным кампаниям из различных систем(Яндекс.Метрика, ADWords и пр.). Данные поступают уже предагрегированые за сутки, примерно раз в день нужно будет получать данные по всем метрикам за прошедшие сутки(либо несколько дней) и сохранять в разрезах рекламынх аккаунтов. После этого эти данные довольно интенсивно будут выбираться по определенным аккаунтам для определенного анализа, причем хочется добиться именно высокой скорости выборки. Например, нужно что-то проверить по 1000 аккаунтов, для этого надо выбрать в память за один запрос некоторые метрики, причем для каждого из аккаунтов они могут быть различные. Рассмариваем 2 схемы - в одной из них данные по рекламным системам хранятся в каждой отельной таблице в развернутом виде, а во втором в одной таблице в виде массивов ключей и значений как советуют тут - https://www.youtube.com/watch?v=5KQsNmRTQmg
Вопрос какая схема будет предпочтительней с точки зрения SELECT?Разгоняем обработку событий до 1.6М/сек. Опыт Badoo / Александр Крашенинников (Badoo)Приглашаем на Saint HighLoad ++ 2021 20 и 21 сентября 2021, Санкт-Петербург, DESIGN DISTRICT DAA in SPB Программа, билеты и подробности - https://clck.ru/VmKaW -------- HighLoad++ Moscow 2018 Тезисы и презентация: http://www.highload.ru/moscow/2018/abstracts/4132 Три года назад на Highload++ я рассказывал, как мы построили масштабируемую систему near-realtime обработки событий. С тех пор она эволюционировала, в процессе росли объёмы, и нам приходилось решать задачи, сопутствующие любому проекту с нагрузкой — масштабирование, отказоустойчивость и прочие. В определённый момент мы достигли точки, когда потребовались радикальные меры, а именно — смена технологического стека. В докладе я расскажу, как мы заменили связку Spark + Hadoop на ClickHouse, в три раза сэкономили железо и увеличили нагрузку в пять раз (с 300 000 событий в секунду до 1 600 000 в пике). -------- Нашли ошибку в видео? Пишите нам на support@ontico.ru
-
-
А версию меняли сервера?
-
-
второй вариант не очень потому что массив будет читаться весь и всегда.
лучше попробуйте новый map, ну или либо отдельные колонки заводите.
если слишком динамичная схема можете попробовать EAV (id, key, value) -
можете второй + материализовывать часто запрашиваемые метрики в отдельные колонки
-
ребят а почему теперь нельзя создавать таблицы с пустыми полями внутри? причем потом в нее инсертить поля с null можно, в чем идея? это оч сильно неудобно
-
мы сами ответственны за наполнение массивов, поэтому будем хранить только те метрики, которые реально нужны, так что чтения "лишних" данных не будет. За вариант с map спасибо, посмотрим.
-
покажите create table
-
можно, но нужно тип указать
-
Друзья, можете подсказать по MergeTree. Предположим у меня 2 реплики и 2 куска в партиции, один сервер смежрил эти 2 куска в один, что при этом будет делать вторая реплика? Она тоже смержит или скопирует смерженый кусок с соседнего сервера?
-
А как указать тип?
-
покажите create table
-
Я не могу, nda же
-
-
ну Nullable(UInt16)
-
замажьте имена... и картинкой
-
если CTAS, то надо cast (xxx as Nullable(String) в селекте
-
-
смотрите /var/log/clickhouse-server/clickhouse-server.err.log
там должна быть причина с warning скорее всего
grep -r metric_log_1 /var/log/clickhouse-server/
что показвыает? -
select cast(User_first_payment_at as Nullable(<ваштип>))
-
-
Добрый день!
Странный баг наблюдаю. Версия: 21.11.5.33
Есть вот такой запрос: SELECT dictGetString('dict.geo_city_en','country_name', toUInt64(2997838)) as country FORMAT JSON
Если выполнять в консоле, то все работает нормально.
Если выполнять его через http то падает сервер c ошибкой:
2022.01.18 12:20:49.613177 [ 93 ] {58b0300a-75f1-4455-bfbd-65d10bcd17f9} <Debug> executeQuery: (from 10.0.72.3:34832) select dictGetString('dict.geo_city_en','country_name', toUInt64(2997838)) as Country_DictName FORMAT JSON
2022.01.18 12:20:49.613654 [ 93 ] {58b0300a-75f1-4455-bfbd-65d10bcd17f9} <Information> executeQuery: Read 1 rows, 1.00 B in 0.000460057 sec., 2173 rows/sec., 2.12 KiB/sec.
2022.01.18 12:20:49.614070 [ 253 ] {} <Fatal> BaseDaemon: ########################################
2022.01.18 12:20:49.614090 [ 253 ] {} <Fatal> BaseDaemon: (version 21.11.5.33 (official build), build id: 76A10A4F605EF849249F2E8673661F7254B779DA) (from thread 93) (query_id: 58b0300a-75f1-4455-bfbd-65d10bcd17f9) Received signal Segmentation fault (11)
2022.01.18 12:20:49.614108 [ 253 ] {} <Fatal> BaseDaemon: Address: 0x8 Access: write. Address not mapped to object.
2022.01.18 12:20:49.614122 [ 253 ] {} <Fatal> BaseDaemon: Stack trace: 0x130e5bd3 0x9bdfe58 0x130d34ad 0x130d7ac0 0x1313c948 0x15d6e96f 0x15d70d61 0x15e85709 0x15e82e40 0x7fa0ebd90609 0x7fa0ebc8a293
2022.01.18 12:20:49.614174 [ 253 ] {} <Fatal> BaseDaemon: 2. DB::CascadeWriteBuffer::nextImpl() @ 0x130e5bd3 in /usr/bin/clickhouse
2022.01.18 12:20:49.614184 [ 253 ] {} <Fatal> BaseDaemon: 3. DB::WriteBuffer::finalize() @ 0x9bdfe58 in /usr/bin/clickhouse
2022.01.18 12:20:49.614214 [ 253 ] {} <Fatal> BaseDaemon: 4. DB::HTTPHandler::processQuery(DB::HTTPServerRequest&, DB::HTMLForm&, DB::HTTPServerResponse&, DB::HTTPHandler::Output&, std::__1::optional<DB::CurrentThread::QueryScope>&) @ 0x130d34ad in /usr/bin/clickhouse
2022.01.18 12:20:49.614227 [ 253 ] {} <Fatal> BaseDaemon: 5. DB::HTTPHandler::handleRequest(DB::HTTPServerRequest&, DB::HTTPServerResponse&) @ 0x130d7ac0 in /usr/bin/clickhouse
2022.01.18 12:20:49.614234 [ 253 ] {} <Fatal> BaseDaemon: 6. DB::HTTPServerConnection::run() @ 0x1313c948 in /usr/bin/clickhouse
2022.01.18 12:20:49.614241 [ 253 ] {} <Fatal> BaseDaemon: 7. Poco::Net::TCPServerConnection::start() @ 0x15d6e96f in /usr/bin/clickhouse
2022.01.18 12:20:49.614248 [ 253 ] {} <Fatal> BaseDaemon: 8. Poco::Net::TCPServerDispatcher::run() @ 0x15d70d61 in /usr/bin/clickhouse
2022.01.18 12:20:49.614254 [ 253 ] {} <Fatal> BaseDaemon: 9. Poco::PooledThread::run() @ 0x15e85709 in /usr/bin/clickhouse
2022.01.18 12:20:49.614261 [ 253 ] {} <Fatal> BaseDaemon: 10. Poco::ThreadImpl::runnableEntry(void*) @ 0x15e82e40 in /usr/bin/clickhouse
2022.01.18 12:20:49.614271 [ 253 ] {} <Fatal> BaseDaemon: 11. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
2022.01.18 12:20:49.614282 [ 253 ] {} <Fatal> BaseDaemon: 12. clone @ 0x122293 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
Что я не так делаю ? -
Баг похоже. А если добавить wait for query end? (Точное название в хелпе хттп)
-
http://stage_ch_haproxy.stage_octo:8123/?wait_end_of_query=1&database=statistic&user=default&password=****&wait_end_of_query=1&query=select dictGetString('dict.geo_city_en','country_name', toUInt64(2997838)) as Country_DictName FORMAT JSON
Также (
Возможно проблема связанна с тем что у нас словарь достает данные из S3 ? -
Тогда б в консоли валилось. А если формат Csv?
-
CSV работает
-
Ну баг пилите, явно с форматированием проблема
-
Окей, кстати таких ошибок нет в версии: 21.10.5.3
Только что проверил. -
-
¯\_(ツ)_/¯
-
3, 5, 7.... остальное от лукавого
-
Добрый день. А подскажите по индексам в кликхаусе, из документации не понял до конца. Есть.таблица, в которой нужна сортировка по одному полю (дата/время) и просто индекс по нескольким другим полям, пишу так
PRIMARY KEY (SrcAddrIPv4, DstAddrIPv4)
ORDER BY TimeFlowStart
и получаю ошибку
DB::Exception: Primary key must be a prefix of the sorting key, but its length: 2 is greater than the sorting key length: 1. (BAD_ARGUMENTS) -
-
primary key может быть меньше чем order by.
наоборот нет -
-
-
так тут поля одни и те же в order by и primary key, или я что-то не понимаю про primary key?
PRIMARY KEY — первичный ключ, если он отличается от ключа сортировки.
а у вас не отличается -
-
отличается, я же поле добавил в конец
-
зависит от корреляции полей... в идеале вначало нужно выводить то, что всегда есть в запросе в where
-
можете дополнительно навешать скип-индексы
-
в where src=a OR dst=a
-
при OR вообще мало что поможет. вы проверьте если selectivity низкий может вам prewhere поможет
-
-
-
тут будет full scan, и непонятно чем тут prewhere поможет. Я бы переиграл схему хранения, сделав избыточность - две строки из одной: (src ipv4, ts dateTime, data String) order by src, тогда выборка будет быстрой
-
prewhere позволит сначала пройтись по этим колонкам и только потом читать другие нужные в тех гранулах где найдены эти срц/дст
-
Тут довольно понятно описано, что и как https://habr.com/ru/post/539538/
-
не будет, у там OR
-
раньше это было одним и тем же. теперь primary key можно делать короче, потому что он в памяти лежит полностью
-
Тут не понял, а dst где?
-
Тут только про ORDER BY же
-
Всем привет!
Кто-то может поянить эту штуку https://clickhouse.com/docs/ru/sql-reference/table-functions/postgresql/?
У меня есть пустая таблица в кликхаусе и запрос в постгрес, нужно результат запроса запылесосить в эту таблицуpostgresql | Документация ClickHousepostgresql Позволяет выполнять запросы SELECT и INSERT над таблицами удаленной БД PostgreSQL. Синтаксис postgresql('host
-
Точно не про первичный индекс идёт рассказ
-
Позволяет выполнять запросы SELECT и INSERT над таблицами удаленной БД PostgreSQL.
-
insert into your_table select * from postgresql(host, port, db.., table_name)
-
Такой запрос на стороне клика выполняется?
-
конечно
-
Он получит данные из pg в ch.
-
Ок попробую, спасибо!
-
в клике есть разница в производительности count(1) и count(*) ?
-
я знаю что такое prewhere, но вы справедливо заметили, что OR все портит. Ну выбрала она src по индексу и что? dst вне индекса и связано OR -> начинаем читать все подряд.
-
Всем привет.
Возникла проблема при коннекте к amazon S3.
При использовании движка таблицы S3 или табличной функции s3 при любом запросе выдаёт следующую ошибку:
DB::Exception: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Bad URI syntax: bad or invalid port number: 0 (version 21.8.10.1.altinitystable (altinity build)): While executing S3 (version 21.8.10.1.altinitystable (altinity build))
Не совсем понимаю, с чем связана ошибка и как её можно исправить. -
select * from tbl
prewhere src=a or dst=b
where type=aaaa
будет быстрее если выбирается малый процент после условия в prewhere -
не будет больше dst. развертываем одну строку src, dst, ts, data в две строки ip, ts, data, где ip будет сначала src, а потом dst. Количество строк увеличится вдвое, зато будет работать индекс.
-
У меня весь запрос, это дата, src or dst, доп полей не надо
-
А значения через двоеточия передаются? В примере просто вообще не понятно. У меня вот есть
"host='rt-is-pgdb-p3.trcont.ru' port=5432 dbname='account_prospective' user='u_tereshkindv'" Как это будет выглядеть? А таблица в постгресе вообще account_prospective.public.trc_agent_plans -
тогда вам prewhere не поможет. можете сделать partition по toDate(TimeFlowStart) например а primary key ipAddr, ну и делать по две строки как Борис сказал
TimeFlowStart, ipAddr, srcdstflag -
postgresql(‘host:port’, ‘database’, ‘schema.table’, ‘user’, ‘password’)
-
если вам надо 1 раз, то я бы рекомендовал через пайп - psql | clickhouse.
-
Теперь понял, спасибо
-
а сам запрос покажите
-
DB::Exception: Unable to connect to any of the replicas (version 21.8.12.29 (official build))
-
Наверное с этим bad or invalid port number: 0
-
Вообще один раз да, а как через пайп это сделать?
-
значит недоступен хост/порт из клика, через psql можете подключиться с сервера?
-
psql генерит CSV, clickhouse-client - читает (TSV на самом деле)
-
А да, я так сначала сделал, но видимо из-за запятых в данных падает при вставке
-
Да такой формат работает из терминала
psql "host='rt-is-pgdb-p3.trcont.ru' port=5432 dbname='account_prospective' user='u_tereshkindv'" -
запятые не должны быть проблемой - они эскейпятся. Смотрите как у вас экспорт идет из pg.
-
в 21.12 проверьте на всякий случай
-
Я так делаю обычно \copy (select * from table) TO 'путь' (format CSV);
-
select *
from s3(
's3://some_name/bucket_name/data-locker-hourly/t=installs/dt=2022-01-14/h=12/app_id=some_id/part-00000-4ce28849-e1ce-48d3-a04f-2c42a82ede56.c000.csv.gz',
'key_id',
'secret_key',
'CSV',
'app_id String',
'gzip'
) -
Не совсем понимаю, где именно находится хост/порт, который недоступен.
-
там формат нужен через https
"https://#{bucket_name}.s3.#{aws_config[:region]}.amazonaws.com/#{events_path}/t=#{event}/dt=#{date}/h=*/part-*.gz" -
пинганул хост вставил в запрос теперь ClickHouse exception, code: 159, host: rc1a-z7nhduhuudskxq2w.mdb.yandexcloud.net, port: 8443; Read timed out
-
А, понял. Попробую так.
-
вы это на сервере с кликом всё пробуете делать или в локальном терминале?
-
В dbeaver
-
я не знаю как реагировать, это не ответ на вопрос) скорее всего это значит локально, что значит что сервер кликхауса может не видеть сервер постгреса, в отличие от “dbeaver”, и в таком случае вам может быть проще разобраться в CSV и psql | clickhouse-client, чем разбираться с сетью
-
-
Есть оконные функции
-
Кстати ещё подскажите пожалуйста
GRANT SELECT ON <имя базы данных>.* TO <имя пользователя>;
Это права для пользователя на чтение, а как дать права для создания таблиц и т.д -
GRANT | Документация ClickHouse
GRANT Присваивает привилегии пользователям или ролям ClickHouse. Назначает роли пользователям или другим ролям. Отозвать
-
А в 21.12 работает все хорошо.
-
Да там просто ALL вместо SELECT )
-
а как назывется аналогк row_number? и чтобы был partition по студенту например?
-
https://clickhouse.com/docs/ru/sql-reference/functions/other-functions/#function-rownumberinblock есть такие штукиПрочие функции | Документация ClickHouse
Прочие функции hostName() Возвращает строку - имя хоста, на котором эта функция была выполнена. При распределённой обраб
-
так и называется, row_number
SELECT
number,
row_number() OVER (PARTITION BY group)
FROM
(
SELECT
number,
number % 3 AS group
FROM numbers(10)
)
Query id: c89a1914-4891-4ec6-a55e-eb067bf790e6
┌─number─┬─row_number() OVER (PARTITION BY group)─┐
│ 0 │ 1 │
│ 3 │ 2 │
│ 6 │ 3 │
│ 9 │ 4 │
│ 1 │ 1 │
│ 4 │ 2 │
│ 7 │ 3 │
│ 2 │ 1 │
│ 5 │ 2 │
│ 8 │ 3 │
└────────┴────────────────────────────────────────┘ -
Кто-нибудь знает какое максимальное количество max_memory_usage можно установить?
-
-
Какой часовый пояс у вас у CH? select timezone()
-
При вставке такая история:
parsed text: "<DOUBLE QUOTE><DOUBLE QUOTE>" -
вообще какое хотите ставьте
-
format_csv_allow_single_quotes = 0 пробовали? или format_csv_allow_double_quotes
-
Добрый день, подскажите пожалуйста, как заставить выполнить подзапрос на локальной таблице при обращении к distributed:
Запрос вида: SELECT a FROM distributed_table WHERE bitmapContains((SELECT groupBitmapAndState(field) FROM local_table WHERE param = 'some'), b)
Таблицы совершенно разные (distributed_table не смотрит на local_table). -
Попробовал, не помогло
-
тогда скорее всего какой то решенные issue
если на продакшене нельзя обновиться на 21.12 то обновитесь до последнего 21.11 -
если разово выполнить то можно добавить _shard_num=<нужный вам шард>
-
Не совсем, нужно чтобы каждый шард выполнил подзапрос локально. Ищу решение.
-
Я знаю про in, join что они могут делаться на каждом из шардов. А про ваш случай, впервые слышу. Bitmap как я помню написали Китайцы, поищите на китайской версии доки возможные решения.
-
Тут не в битмапах дело, на их месте может быть любой подзапрос к локальной таблице.
-
Как же не хватает Den Crane тут (
-
Создай issue и он там тебе ответит :))
-
Жду пока тут, есть ещё, уверен, много знающих
-
Кстати, да! Он мне через issue помог разобраться с запросом.
-
# cat query.sql | clickhouse-client
Code: 62. DB::Exception: Syntax error: failed at position 262140 ('4435254'): 4435254, 2402984, 2515436, 3139174, 2917865, 2997295, 4501400, 783027, 787959, 1430640, 2874554, 2922500, 3101446, 3111016, 4506577, 2628313, 241701, 1974531, 7. Max query size exceeded
При этом max_query_size в профиле увеличено:
# clickhouse-client -q "select * from system.settings where name = 'max_query_size'"
max_query_size 524288000 1 Which part of the query can be read into RAM for parsing (the remaining data for INSERT, if any, is read later) \N \N 0 UInt64
Если указать clickhouse-client --max_query_size 10000000, то запрос отрабатывает.
Почему в первом запросе срабатывает дефолтовый лимит в 256 Кб? И не подхватывается настройка max_query_size из профиля. Версия 21.8.10.19. -
Если у меня дата в формате 2021-05-11 какой тип указать в таблице?
Ошибка: ERROR: DateTime must be in YYYY-MM-DD hh:mm:ss or NNNNNNNNNN (unix timestamp, exactly 10 digits) format. -
-
Кстати да, спасибо ахах
-
-
Europe/Berlin
-
причем в 2 строках он по 4 часа добавил, а в одной 3
-
Все, победил, поставил в поле DateTime таймзону, которая стоит в бд из которой приходят csv
-
я правильно понимаю логику, если мне нужно в существующей таблице добавить колонку domain, которая при INSERT должна вычиляться как domainWithoutWWW(page_url) и записываться
То я добавляю колонку с DEFAULT expr и чтоб записать все исторические данные запускаю ALTER TABLE t MATERIALIZE COLUMN domain -
можно и без альтер, КХ при запросе на лету подсчитает
-
подсчитает и запишет или каждый раз будет считать?
-
Будет считать,
Пересчитает и запишет при мерже (или MATERIALIZE или UPDATE xxx = xxx WHERE 1) -
Спасибо
-
-
Меня сильно смутило полное отсутствие DELETE/UPDATE (я не смог ничего найти про них)
Как то грустновато получается -
;) форк приватный
так что особо не потестируешь -
ага, предлагают только drop/replace partition
-
О, ну хотя бы так
-
А откуда инфа про 3 летняя давность?
-
ну это примерно, 2.5 года самой компании, пилить немного раньше начали, вот и выходит года 3
-
ну hydrolix (другой форк кх) в последний раз когда я проверял были на 21.3
-
-
ну можно попробовать в
grep -r table_name /var/lib/clickhouse-server/ | head
но логи конечно тоже могли отротироваться давно -
а есть про них какие-то отзывы? а то что-то скудно в интернете
-
-
Для кровавого энтерпрайза обещали сделать промежуточный формат, когда часть колонок будет хранится в compact-like виде
-
а тикет есть где следить и надеятся?
-
Support of dynamic subcolumns in tables. · Issue #23516 · ClickHouse/ClickHouse
Inroduce new data type Object(<schema format>), which will get the name of format for semi-structured data (JSON, XML, etc.). Initially it will work only with MergeTree tables. Maybe ...
-
кстати вот про firebolt пару дней назад как раз написали)
https://altinity.com/blog/database-on-fire-reflections-on-embedding-clickhouse-in-firebolt -
ну тогда опять таки нужно set unused сюда...
-
Да и всякие кровавые интерпрайзы к нам приглашаем, благо вашего собрата у нас уже немало :)
Плюс вашу SET UNUSED мб с помощью такого можно будет сделать.
https://github.com/ClickHouse/ClickHouse/issues/9436"ephemeral" or "dematerialized" columns · Issue #9436 · ClickHouse/ClickHouseSpecial type of column. This column can be INSERTed and can be referred in default expressions of another columns, but it is not stored in a table and cannot be SELECTed. Use case Calculate other c...
-
это не то же... больше про мап, плюс инпуты везде менять.. а тут простой случай в виде много таблиц с 1000-5000 плоских колонок на много партиций...
-
Ну, я думаю если такой способ хранения колонок будет сделан, то он будет доступен сразу для разных колонок. как например sparse сделали же и для обычных.
-
т.е. тип текущей колонки можно менять на ephemeral? не похоже. суть была в том чтоб избежать большого кол-ва ненужных мутаций с удалением старых данных...
-
Сейчас можно менять на MATERIALIZED допустим, не вижу причин почему бы нельзя это было делать на ephemeral (если они будут добавлены)
-
-
-
Только что попробовал сделать так же с помощью ALIAS
И вроде inode не поменялась
/var/lib/clickhouse/data/default/xxx_test_alias# ls -li ./all_*/*
1352383 -rw-r----- 1 clickhouse clickhouse 214 Jan 18 18:47 ./all_1_1_0/checksums.txt
1352381 -rw-r----- 1 clickhouse clickhouse 65 Jan 18 18:47 ./all_1_1_0/columns.txt
1352380 -rw-r----- 1 clickhouse clickhouse 7 Jan 18 18:47 ./all_1_1_0/count.txt
1352382 -rw-r----- 1 clickhouse clickhouse 10 Jan 18 18:47 ./all_1_1_0/default_compression_codec.txt
1352376 -rw-r----- 1 clickhouse clickhouse 4004915 Jan 18 18:47 ./all_1_1_0/key.bin
1352377 -rw-r----- 1 clickhouse clickhouse 2976 Jan 18 18:47 ./all_1_1_0/key.mrk2
1352375 -rw-r----- 1 clickhouse clickhouse 992 Jan 18 18:47 ./all_1_1_0/primary.idx
1352378 -rw-r----- 1 clickhouse clickhouse 4004915 Jan 18 18:47 ./all_1_1_0/value.bin
1352379 -rw-r----- 1 clickhouse clickhouse 2976 Jan 18 18:47 ./all_1_1_0/value.mrk2
489396 -rw-r----- 1 clickhouse clickhouse 188 Jan 18 18:47 ./all_2_2_0/checksums.txt
489354 -rw-r----- 1 clickhouse clickhouse 65 Jan 18 18:47 ./all_2_2_0/columns.txt
489238 -rw-r----- 1 clickhouse clickhouse 3 Jan 18 18:47 ./all_2_2_0/count.txt
489193 -rw-r----- 1 clickhouse clickhouse 860 Jan 18 18:47 ./all_2_2_0/data.bin
489194 -rw-r----- 1 clickhouse clickhouse 80 Jan 18 18:47 ./all_2_2_0/data.mrk3
489395 -rw-r----- 1 clickhouse clickhouse 10 Jan 18 18:47 ./all_2_2_0/default_compression_codec.txt
489180 -rw-r----- 1 clickhouse clickhouse 16 Jan 18 18:47 ./all_2_2_0/primary.idx
ALTER TABLE xxx_test_alias MODIFY COLUMN value ALIAS 0;
/var/lib/clickhouse/data/default/xxx_test_alias# ls -li ./all_*/*
1352383 -rw-r----- 1 clickhouse clickhouse 214 Jan 18 18:47 ./all_1_1_0/checksums.txt
1352381 -rw-r----- 1 clickhouse clickhouse 65 Jan 18 18:47 ./all_1_1_0/columns.txt
1352380 -rw-r----- 1 clickhouse clickhouse 7 Jan 18 18:47 ./all_1_1_0/count.txt
1352382 -rw-r----- 1 clickhouse clickhouse 10 Jan 18 18:47 ./all_1_1_0/default_compression_codec.txt
1352376 -rw-r----- 1 clickhouse clickhouse 4004915 Jan 18 18:47 ./all_1_1_0/key.bin
1352377 -rw-r----- 1 clickhouse clickhouse 2976 Jan 18 18:47 ./all_1_1_0/key.mrk2
1352375 -rw-r----- 1 clickhouse clickhouse 992 Jan 18 18:47 ./all_1_1_0/primary.idx
1352378 -rw-r----- 1 clickhouse clickhouse 4004915 Jan 18 18:47 ./all_1_1_0/value.bin
1352379 -rw-r----- 1 clickhouse clickhouse 2976 Jan 18 18:47 ./all_1_1_0/value.mrk2
489396 -rw-r----- 1 clickhouse clickhouse 188 Jan 18 18:47 ./all_2_2_0/checksums.txt
489354 -rw-r----- 1 clickhouse clickhouse 65 Jan 18 18:47 ./all_2_2_0/columns.txt
489238 -rw-r----- 1 clickhouse clickhouse 3 Jan 18 18:47 ./all_2_2_0/count.txt
489193 -rw-r----- 1 clickhouse clickhouse 860 Jan 18 18:47 ./all_2_2_0/data.bin
489194 -rw-r----- 1 clickhouse clickhouse 80 Jan 18 18:47 ./all_2_2_0/data.mrk3
489395 -rw-r----- 1 clickhouse clickhouse 10 Jan 18 18:47 ./all_2_2_0/default_compression_codec.txt
489180 -rw-r----- 1 clickhouse clickhouse 16 Jan 18 18:47 ./all_2_2_0/primary.idx -
попробуйте так:
ldapsearch -x -H 'ldaps://corp.dev.com' -b 'dc=corp,dc=dev,dc=com' -D 'CORP\spetrov' -W -LLL -s sub '(&(objectClass=group)(member=CN=Петров Сергей Иванович \284049577\29,ou=Developers Users,OU=DEV,DC=corp,DC=dev,DC=com))' -
на днях помержен был этот PR, который тут применим, и может исправить ситуацию: https://github.com/ClickHouse/ClickHouse/pull/33401Update LDAPClient.cpp by IlyaTsoi · Pull Request #33401 · ClickHouse/ClickHouse
Create a function escapeForLDAPFilter and use it to escape characters '(' and ')' in a final_user_dn variable that we receive from the LDAP server. This is necessary...
-
-
-
ldapsearch сама часть библиотеки OpenLDAP
-
-
да, и их надо заменять на спец экранирование, см PR, и то, на что я их заменил
-
а что делать с user_dn ? будет ли что-то в виде парсинга ?
-
в каком смысле парсинг? Он вычисляется при помощи отдельного search, и потом подставляется, но с PR-ом этим, он будет экранироваться правильно (скобки)
-
-
-
а все увидел мерж,спасибо
-
Друзья, подскажите пробовал ли кто-то делать что-то похожее: 2 таблицы одна для свежих данных которые приходится часто передобавлять заново PARTITION BY toYYYYMMDD и другая PARTITION BY toYYYYMM для старых данных, с одинаковой структурой и перемещать куски из одной в другую в конце месяца
-
Доброго времени суток!
Приключилась неожиданная проблема: обновили кластер с 21.9 до 21.12, никаких ошибок не возникло. Но любые внешние клиенты при попытке выполнения любых запросов падают в серверную ошибку. При чем не важно нативный драйвер или HTTP, ошибка одинаковая и не поддается идентификации или гуглению. При этом запросы через clickhouse-client на сервере выполняются успешно! -
-
HTTP драйвер
Caused by: ru.yandex.clickhouse.except.ClickHouseUnknownException: ClickHouse exception, code: 1002, host: ****, port: 8123; std::exception. Code: 1001, type: std::out_of_range, e.what() = unordered_map::at: key not found (version 21.12.3.32 (official build))
Нативный драйвер с расширенным стек трейсом:
ServerException('
DB::Exception: std::out_of_range: unordered_map::at: key not found. Stack trace:\n\n0. std::logic_error::logic_error(char const*) @ 0x192404ad in ?\n1. ? @ 0xad576e9 in /usr/bin/clickhouse\n2. ? @ 0xad576a0 in /usr/bin/clickhouse\n3.
DB::SettingsProfilesInfo::getProfileNames() const @ 0x1337c9f1 in /usr/bin/clickhouse\n4.
DB::SessionLog::addLoginSuccess(StrongTypedef<wide::integer<128ul, unsigned int>, DB::UUIDTag> const&, std::1::optional<std::1::basic_string<char, std::1::char_traits<char>, std::1::allocator<char> > >,
DB::Context const&) @ 0x1337c2f6 in /usr/bin/clickhouse\n5.
DB::Session::makeQueryContextImpl(
DB::ClientInfo const*,
DB::ClientInfo*) const @ 0x1337250a in /usr/bin/clickhouse\n6. DB::TCPHandler::receiveQuery() @ 0x13fe9624 in /usr/bin/clickhouse\n7. DB::TCPHandler::receivePacket() @ 0x13fde8f6 in /usr/bin/clickhouse\n8. DB::TCPHandler::runImpl() @ 0x13fd7a4f in /usr/bin/clickhouse\n9. DB::TCPHandler::run() @ 0x13fec4b9 in /usr/bin/clickhouse\n10. Poco::Net::TCPServerConnection::start() @ 0x16f3d6af in /usr/bin/clickhouse\n11. Poco::Net::TCPServerDispatcher::run() @ 0x16f3fb01 in /usr/bin/clickhouse\n12. Poco::PooledThread::run() @ 0x1704e889 in /usr/bin/clickhouse\n13. Poco::ThreadImpl::runnableEntry(void*) @ 0x1704bf80 in /usr/bin/clickhouse\n14. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so\n15. __clone @ 0xfe96d in /usr/lib64/libc-2.17.so\n') -
Добрый вечер, конечно делали)
-
Делают,
dirty-clean таблицы.
Разве что нельзя делать ATTACH между таблицами с разными PARTITION BY выражением. -
Спасибо за подсказки! Буду изучать!
-
Первый анонимный бот в телеграм - @nonameous_bot! С ним можно разыграть друга или признаться в любви, пошутить над коллегой, поделиться секретом и все на что хватит вашей фантазии! Попробуйте сами!
-
Кажется, что связано с сессиями и session key
-
Попробуйте сделать запрос через curl
И его же вместе с передачей параметра сессии http://192.168.1.27:8123/?database=test1&session_id=12345 -
@unamedrus Можно вас попросить уточнить, вы говорили что:
“нельзя делать ATTACH между таблицами с разными PARTITION BY выражением”
подскажите, это относится к партициям или к кускам или и к тем и к другим? -
Не важно указывать новую сессию, или нет, запрос выполняется. Создали новую учётку -- и для неё всё заработало из приложухи, а со всеми старыми учетками запросы падают в ошибку. Мы щас будем пересоздавать их, но вопрос -- что пошло не так?
-
К таблицам с разным PARTITION BY выражением. (вы не можете между ними перемещать партиции/парты)
-
Думаю с таким нужно в облачную поддержку, вообще странное что то