- 02 January 2019 (57 messages)
-
-
Joined.
-
всем привет!
есть ли необходимость убирать из config.xml эту констрокцию при добавлении своих настроек кластера в config.d/clickhouse_remote_servers.xml ?
<test_shard_localhost>
<shard>
<replica>
<host>localhost</host>
<port>9000</port>
</replica>
</shard>
</test_shard_localhost>
или можно оставить как есть? -
в system.clusters отображается и мой кластер и тестовые
│ test_cluster_two_shards_localhost │ 1 │ 1 │ 1 │ localhost │ ::1 │ 9000 │ 1 │ default │ │
│ test_cluster_two_shards_localhost │ 2 │ 1 │ 1 │ localhost │ ::1 │ 9000 │ 1 │ default │ │
│ test_shard_localhost │ 1 │ 1 │ 1 │ localhost │ ::1 │ 9000 │ 1 │ default │ │
│ test_shard_localhost_secure │ 1 │ 1 │ 1 │ localhost │ ::1 │ 9440 │ 0 │ default │ │
└───────────────────────────────────┴───────────┴──────────────┴─────────────┴────────────────────────────┴────────────────┴──────┴──────────┴─────────┴──────────────────┘ -
Можете убрать, он вам не нужен.
-
спасибо за ответ!
-
-
а какой вопрос то?
-
-
вопрос в том, чтоб на выходе получить не просто список адресов, а пронумерованный
-
именно
-
rowNumberInAllBlocks
-
Документация ClickHouse | Документация ClickHouse
ClickHouse is a fast open-source column-oriented database management system that allows generating analytical data reports in real-time using SQL queries
-
Спасибо. Надо больше спать, наверное Я видел эту функцию, но подумал, что она считает количество вхождений записи в партициях
-
-
-
-
-
comments in russian are horribly
-
It's russian channel. If you don't like russian comments, just go to eng channel https://telegram.me/clickhouse_enClickHouse
ClickHouse DBMS discuss and help
-
да при чем тут это, я о том, что кто ж пишет комменты на русском в 2019 ?
-
Много кто :) Я пишу комменты на русском, т.к. внутри команды разработки с английским не у всех хорошо.
-
-
Но например вот тут https://github.com/the-tinderbox/ClickhouseBuilder все на анлийском, т.к. туда не только члены нашей команды ходят. Если код используется только внутри команды, то почему мы должны писать комменты на английском языке, если нам удобней на русском? )GitHub - the-tinderbox/ClickhouseBuilder: Fluent queries builder for Clickhouse. Also has integration with Laravel / Lumen.
Fluent queries builder for Clickhouse. Also has integration with Laravel / Lumen. - GitHub - the-tinderbox/ClickhouseBuilder: Fluent queries builder for Clickhouse. Also has integration with Larave...
-
-
-
Блин, я вообще не понимаю чем плох родной язык. Какое-то русофобство.
-
Святой обязанностью каждого айтишника является продать себя на запад, поэтому все должны ходить строем, писать только на английском и хулить свою страну
-
Простите, злая ирония
-
this looks like a personal snippet, and definitely is not a C++ CH code
-
😱 сколько хейта полетело.... ну ну давайте еще🤘
-
-
если ты работаешь только в сызране и ваш бизнес не уходил дальше города - то да. Но обычно все стремятся покорять мир, у людей есть амбиции, и они хотят чтобы их понимали повсюду. Поэтому "на родном языке" - значит что ваш ларек никогда не станет магазином
-
-
Станет ларек магазином или нет, зависит от товара, а не от языка, на котором в ларьке говорят, если продолжать
-
Ну, бизнесу все равно на чем комменты написаны, зачастую и на чем написан код тоже, это не мешает продавать.
-
тут ларек один выложил на своем языке https://github.com/baidu/openedge ))baetyl/baetyl
Extend cloud computing, data and service seamlessly to edge devices. - baetyl/baetyl
-
Видимо народ не похмелился еще :)
-
К слову, периодически наталкиваюсь на то, что статьи китайцев через гугл-транслейт сильно интереснее по деталям и глубине, чем средние английские
-
но завтра может придти Джон и сказать что ваш код гавно) а не, не скажет, он же не поймет русский))
-
-
У нас в коде осталось чуть-чуть (несколько сотен строк) комментариев
-
на русском в редко используемых библиотеках.
-
Можете помочь доперевести.
-
Переводить можно прямо на GitHub (открываете файл в веб интерфейсе, жмёте edit).
-
Joined.
-
Есть ли в КХ ограничения на джойн таблиц?
-
-
правая часть должна помещаться в память
-
-
и работает медленно, если в правой таблице например 20млн. строк, а в левой 0 строк, то джойн будет идти 5 сек., насколько я понимаю столько занимает построение/размещение хештаблицы в памяти
-
-
словари в бесконечность раз быстрее
-
-
-
ну так есть такой специальный движок, прямо для этого случая engine=Join
-
- 03 January 2019 (71 messages)
-
Joined.
-
-
Доброе, пытаюсь разобраться как сделать бекап через freeze, на сколько я понял больше нет возможности задавать партиции через префикс? Как можно выполнить freeze для всех партиций таблицы?
-
С 18.16.0 появилось:
Добавлена возможность не указывать партицию для запроса ALTER TABLE ... FREEZE для бэкапа сразу всех партиций. -
Добрый день, обновляем продакшн. Ждать каких-то проблем от v18.16.1 или лучше пока v18.14.19 взять?
-
Мы откатывались обратно на 18.14 в итоге :)
-
Что именно поломалось?
-
Если иногда падает соединение с зоокипером - то дальше начинается всякая фигня: https://github.com/yandex/ClickHouse/issues/3891
Вот как выкатят в релиз правки по этой issue - попробуем снова.ALTER timeout on ReplicatedMergeTree · Issue #3891 · yandex/ClickHouseOn release 18.16.0, when applying ALTER TABLE ... ADD COLUMN on ReplicatedMergeTree table, ALTER completed on current replica, but other replicas coudn't download and apply ALTER action. On...
-
Ок. Штука неприятная, но для нас вроде не очень критична (схема базы относительно статична).
-
-
Да, лёгкость с которой это можно делать в КХ стимулирует идеи типа "а давайте вот тут добавим Х колонок" :) У нас пока народ привыкший (по всяким MySQL) к тому что добавление колонок - это обязательно дорого и больно, и поэтому на схему БД не так часто покушаются :)
-
-
Возможно кому пригодиться. Вставка pandas dataframe в clickhouse вот что получилось. В очередной раз подсмотрел у @miptgirl . Маша спасибо за твои видео и гитхаб. Ну и Миловидову Леше за стендапы :) Всех с новым годом!
-
-
есть вот такой проект https://github.com/kszucs/pandahouseGitHub - kszucs/pandahouse: Pandas interface for Clickhouse database
Pandas interface for Clickhouse database. Contribute to kszucs/pandahouse development by creating an account on GitHub.
-
-
-
-
-
-
в какой версии CH ?
вроде работает
select max(positionId) positionId from (select 1 positionId)
HAVING positionId IN ( SELECT 1 FROM system.one) -
это у меня тоже работает. Возможно дело в GROUP BY
-
что про версию-то КХ ?
ладно пофиг, перед запросом
set compile_expressions = 0
set enable_optimize_predicate_expression = 0 -
не помогло. Сейчас попробую запрос сделать попроще чтобы можно было повторить
-
-
-
-
UNION ALL ?
-
-
-
select a, b
union all
select a, toLowCardinality('') b -
-
А почему не использовать clickhouse_driver?
-
Посмотрел что Маша делает через обычный requests и решил что возможно не без оснований.
-
-
Http в принципе хуже, чем нативный драйвер. Есть основания использовать его, никаких сложностей там у нас не возникло.
-
-
-
Не смог сделать тест. На тесте все работает. Вот список вариантов - по мне они все одинаковые но работают по разному на реальной таблице
-
-
Joined.
-
а есть нативный для php? что лучше использовать
-
это абсолютно два разных запроса с точки зрения пайплайнов многопотчности и дистрибьютид запросов, скобки () тянут резултат на инициатора, без скобок группировка выполняется шардами
-
Я питонист, по php упоминалось в этом чате несколько либ.
Зная о популярности такого чуда как php, я предположу, что есть -
я джавист, но есть куски пхп. сейчас использую оф либу. в сомнениях что есть лучше
-
Я бы тоже так думал
-
Joined.
-
Добрый вечер, подскажите как реализовано хранение вложенных данных. Я имею ввиду Nested.
-
-
Насколько эффективно эти массивы сжимаются ?
-
Одинаково все сжимается, пишется в файл, а затем куски по 65кб : 1 мб сжимаются lz4 или zstd
-
норм посты у вас
-
нет там такого контента…
-
Joined.
-
Данные для остальных колонок хранятся так же как и если бы вложенных колонок не было. Получается это идеальный вариант когда нужны джоины ?
-
Как бы предварительно вычислененные джины, правильно ?
-
в 99% случаев джойны и словари используются для того чтобы обогатить данные постфактум, т.е. вы не знаете какая температура была на марсе, поэтому пишете в ивенте Марс, а затем постфактум во время селекта подтягиваете температуру, если вы сразу что-то знаете, и эти знания имьютабл, то конечно написать прямо в таблицу.
-
При выборе предварительный энричмент или постфактум в селект с джийн, что лучше ? Вероятно ответ зависит от размера словаря для джоина и каких-то других параметров. Каких ?
-
а если эвент содержит не температуру на марсе, а радиус марса, его удаленность от солнца и его массу (пусть это все известно сразу, а не постфактум) - следут ли такие данные выносить в словарь? не хотелось бы в каждой строчке ивента все это писать постоянно, когда можно просто написать - марс
-
если в словаре будут все планеты и звезды, то на такой словарь не хватит памяти, т.е. если у вас миллион планет, однозначно надо писать в ивент, если меньше то можно и не писать, а использовать словарь (если у планеты куча атрибутов и они какие-то широкие), тут возможно выигрыш будет в i/o и цпу при записи, по занимаему месту вряд-ли (из-за компрессии).
-
ну миллион не так уж и много. если параметры будут типа UInt32, DateTime и т.д., то даже 20 таких параметров займут меньше 128 байт, а значит и весь словарь будет меньше 128 мегабайт, что вроде не много.
-
разработчики КХ думали иначе, он займет гигабайты.
-
но будет очень быстро работать
-
а откуда гигабайты возьмутся? там создаются индексы по каждому полю?
-
я в общем эту кашу ел, у меня есть словарь на 25 ГБ, наслаждайтесь https://github.com/yandex/ClickHouse/issues/2738
-
Joined.
-
Доброй ночи всем! А подскажите, как можно выбрать строки с limit n, m, но так что бы при повторном запросе результат оставался прежний? Данные в таблице не меняются. Вариант с order by рассматривается, но пока неизвестно будет ли кх сортировать данные, если order by в запросе такой же как при создании таблицы.
-
не будет.
-
там 48 потоков, 35й прочитает из памяти середину, и вернет первым
-
в смысле нужен order by всегда
-
у вашего словаря тип layout'а complex_key_hashed, но ключем объявлен только 'a' (<key><attribute><name>a</name><type>Int64</type></attribute></key>). почему так?
ну и если выбрать тип layout'а flat, то размер словаря так разбухать не должен? (но судя по документации там ограничение на 500 000 элементов) - 04 January 2019 (55 messages)
-
потому что иногда нужны отрицательные числа, тип Int64, а не UInt64.
мне flat например не подходит (500 тыс. подряд.), у меня в том конктретном случае весь диапазон чисел -MaxInt64 до +MaxInt64. -
Ок, спасибо!
-
А если я в запрос передам настройку max_threads = 1, даст ли это гарантию того, что данные будут читаться в один поток и последовательно? Я попробовал, вроде бы результат тот, который мне нужен
-
Есть люди, кто работает с Clickhouse в Digital Ocean?
Интересует ситуация с кластерами в Digital Ocean - были ли проблемы и все такое -
с учетом того что в до обычные виртуалки а не саас то никаких проблем нет вообще
-
в целом везде где виртуалки ксен или квм все одинаково , в рассмотрение опенвз и lxc не берем там свои проблемы есть
-
В Digital Ocean моментами в дневное время сильно сеть падает.
-
роскомнадзор до сих пор не разблокировал их подсеть?
-
ну в кх все дублируется он такое будет просто не замечать
-
На счет роскомнадзора не в курсе. Про сеть имею ввиду локальную между серверами Digital Ocean. Часто падает скорость передачи данных в дневное время.
-
ну процы еще проседают ))) и диск ио как и везде
-
В случае чтения с реплики данные могут отставать на несколько минут.
-
ну в кх такие данные стандартно лежат что несколько минут не влияют на результат
-
Всем привет! При настройке odbc для сторонне словаря - как можно указать несколько условий where? Ну в плане:
<source>
<odbc>
<connection_string>DSN=external_db</connection_string>
<table>accounts</table>
<where>expired <= NOW() and is_trial and …</where>
</odbc>
</source>
в такой записи - словарь фейлится при обновлении -
Joined.
-
всем привет!
экспериментируем с кластером CH
у нас есть 3 шарда и 3 реплики
когда выключили 1 шард и его реплику то данные все равно успешно вставились
при select из Distributed соответственно получили ошибку
DB::NetException. DB::NetException: All connection tries failed.
после того как включили шард 1, select тоже был выполнен успешно и все данные получены без потерь
Где в момент недоступности шарда и реплики находилась эта часть данных?)) -
в другом шарде?
-
для меня тоже это вопрос)
-
Это был ответ
-
Данные размазываются по доступным шардам, что у вас в функции шардирования в дистрибьютид? rand() ?
-
rand (случайный)
-
ну вот и попало в случайный шард из двух работающих
-
-
а как потом данные доехали в снова заработавший шард и его реплику?
-
зачем?
-
я к тому что после включения CH на ранее не доступном шарде и его реплике
данные уже и там оказались -
к стати не уточнил
движек таблиц используем Replicated
и
<internal_replication>true</internal_replication>
для каждого шарда -
поясните пожалуйста?
-
-
ах вот оно что)
спасибо!
даже не предполагал
так как по информации из документации по CH, distributed не хранит данные -
-
у буфера есть срок жизни?
-
-
-
-
-
ага понял
спасибо за ответы! -
-
с CH работать все интересней)
-
Joined.
-
Ребята, а сама система аналитики какая к вашему этому ClickHouse прикручивается? Или все сами пишут себе велосипеды? Как это работает, подскажите плиз.
-
Графана табикс суперсет
-
Табикс как пишется? не гуглится
-
Tabix
-
Ну это самое простое
-
Люди там и сложное прикручивают
-
Спасибо 👍
-
А можно подробнее о проблемах ClickHouse on lxc ?
-
Не знаю, у lxc в целом есть набор проблем с перфомансом , так что для кх его даже не пробовал, да и сильно нагруженные бд с него пришлось смигрировать
-
Уж больно плохой оверхед на файлуху
-
во всех них аналитические запросы на sql явно пишутся? есть системы, где запрос в конструкторе создается. как в самой яндес-метрике или гугл-аналитике?
-
http://youtu.be/7Wcq6_9727A тут было про обзор таких систем:)004. Блиц доклады пользователей ClickHouse
12 декабря в Яндексе прошла большая встреча, на которой мы подвели промежуточные итоги СУБД ClickHouse как открытого ПО. За это время сотни компаний начали ей пользоваться. Специалисты из известных компаний рассказывают о своём опыте использования ClickHouse. Чего удалось достичь и с какими проблемами довелось столкнуться. Другие видео встречи https://events.yandex.ru/events/meetings/12-dec-2017/
-
в суперсет какой-то построитель есть, но я бы не сказал, что он мне подошел.
-
-
Joined.
- 05 January 2019 (47 messages)
-
Redash тоже умеет
-
Доброе утро.
Попытка воспользоваться groupArray с Decimal колонкой заканчивается падением сервера:
Received signal Segmentation fault (11).
Трейс: https://pastebin.com/Am4VwE4E
Версия: 18.16.1
Это известная проблема? -
Спасибо 👍
-
LXC поддерживает работу с разными стораджами и там все настраиваемо, так что если уж и держать СУБД в контейнерах то в нем. Тотже гуглоклауд чуть более чем полностью LXC.
-
L̶X̶C̶ ̶ж̶е̶ ̶л̶е̶ж̶и̶т̶ ̶в̶ ̶о̶с̶н̶о̶в̶е̶ ̶Д̶о̶к̶е̶р̶а̶,̶ ̶т̶а̶м̶ ̶м̶о̶ж̶н̶о̶ ̶т̶о̶м̶а̶ ̶п̶о̶д̶к̶л̶ю̶ч̶а̶т̶ь̶ ̶н̶а̶п̶р̶я̶м̶у̶ю̶ ̶б̶е̶з̶ ̶п̶р̶о̶б̶л̶е̶м̶ ̶с̶ ̶п̶е̶р̶ф̶о̶р̶м̶а̶н̶с̶о̶м̶ наверное, я не прав, есть открытые issues на эту тему
-
Ну перфоманс на мною любимой zfs оставляет желать лучшего.
-
Это не так, LXC и Docker это соверщенно разные вещи.
-
Откуда дровишки?
-
Да ну? :)
-
Здравствуйте! Мне нужно оптимизировать или заменить transform(). Был запрос где для группировки и итоговой агрегации использовался Case. На большом количестве групп запрос выполнялся медленно и был переписан на использование transform(). Но при большом количестве групп например 9 тыс. запрос не влезает уже в max_query_size и все опять тормозит.
-
может тебе словарь заиспользовать?
-
Для каждого запроса группировка меняется
-
-
В консольной клиенте можно файл передать, но это в app на php
-
-
И таблицы метрика нужно выбрать данные по условиям. Таблица вида asset, metric, value. Итоговая агрегацию по группам типа group1 => [ asset1, assetN ]. Группировка приходит в реквесте и групп может быть много и они меняются
-
Кешировать частые группировки?
-
-
На наших инстанцах в гуглоклауде замечен lxcfs и прочая атрибутика LXC) На самом деле в этом нет ничего такого, контейнеры давно выдают, даже ещё во времена когда докера не было и о контейнерах мало кто знал были провайдеры которые сидели на Виртуозо/опенвз и прекрасно себя чувствовали.
-
Присмотрись получше)
-
Ок)
-
-
Это должно быть так, но я сильно не уверен что это везде
-
Lxcfs и в обычной убунте есть в ps ax, а так все провайдеры нынче сидят в основном на квм , отстающие на xen , openvz свой рынок по большей части просрал, lxc ни у одного провайдера в паблике не видел
-
в паблике - это в смысле впс на этом?
-
Ну да
-
-
Aws Firecracker должен взлететь, плагин для контейнеров тоже в активной разработке.
-
Ну почему же? Нормально работает, если хост подтюнить.
-
Это если у вас только Ubuntu.
-
Debian 9
-
h2:~# lxc-ls -1 | wc -l
518 -
Там, правда, именно контейнеры, а не впс.
-
Как их хранить?
-
Ну, напр в словаре, или в отдельной табличке, или вообще не в кх
-
В зависимости от реквеста расчет может быть в разных группах. Попробую с arrayJoin поиграть
-
Вы ведь сначала группируете и считаете по ассетам, а затем во внешнем запросе делаете transform и уже группируете окончательно?
-
Одним запросом
-
ну попробуйте двумя группировкам. Непонятна фраза про max_query_size, ведь падать должно с ошибкой. Можно использовать external data и сделать join с ней.
-
max_query_size по дефолту 265кб. Тестовый sql выходит 600кб при 8тыс групп по одному расчету в группе. Пришлось увеличить параметр
-
Ясно. Ну я бы попробовал join с мемори или с https://clickhouse.yandex/docs/ru/operations/table_engines/external_data/
-
Пока не нашел в php клиенте как это сделать
-
А зачем это делать в кх, почему не в php.
-
Вот тут можно https://github.com/the-tinderbox/ClickhouseBuilderGitHub - the-tinderbox/ClickhouseBuilder: Fluent queries builder for Clickhouse. Also has integration with Laravel / Lumen.
Fluent queries builder for Clickhouse. Also has integration with Laravel / Lumen. - GitHub - the-tinderbox/ClickhouseBuilder: Fluent queries builder for Clickhouse. Also has integration with Larave...
-
Замену и окончательную группировкк?
-
Там даже хелперы есть для создания мемори таблиц из файлов, строк и пр
-
- 06 January 2019 (14 messages)
-
bot
-
bot
-
-
Во время выполнения мерджа, сервер падает и в логах вот такое чудо.
2019.01.06 13:38:07.162302 [ 2 ] {} <Error> BaseDaemon: ########################################
2019.01.06 13:38:07.163710 [ 2 ] {} <Error> BaseDaemon: (from thread 41) Received signal Segmentation fault: 11 (11).
2019.01.06 13:38:07.163776 [ 2 ] {} <Error> BaseDaemon: Address: 0x1151dd000
2019.01.06 13:38:07.163807 [ 2 ] {} <Error> BaseDaemon: Address not mapped to object.
2019.01.06 13:38:07.164788 [ 2 ] {} <Error> BaseDaemon: 0. 0 clickhouse-server 0x0000000104b4e725 _ZN2DBL21deserializeBinarySSE2ILi2EEEvRNS_8PODArrayIhLm4096E9AllocatorILb0EELm15ELm16EEERNS1_IyLm4096ES3_Lm15ELm16EEERNS_10ReadBufferEm + 1413
Проверялось на разных хостах. Сервер 18.16.0, на одном хосте собран из master ветки, на другом поставлен из менеджера пакетов, тоже 18.16.0.
Сегфолт вообще нехорошая штука. issue закинуть? -
@milovidov_an
-
Я не Миловидов, но заранее рекомндую снять и приложить strace
-
Да, обязательно.
Из этого сообщения пока ничего непонятно.
Стек трейс там несколькими строчками ниже... (в вашем куске только последний фрейм).
Также желательно взять строчки выше, которые происходили в потоке 41. Они будут отмечены [ 41 ].
Произошло на нескольких серверах одновременно? А эти серверы объединены в кластер и выполняют распределённые запросы? Тогда имеет смысл посмотреть также последние запросы. -
Также странно, что имя символа не demangled. Если в логе только один стек фрейм - значит вы собрали ClickHouse без libunwind (зачем?).
-
Для полноты нужны стек трейсы со всех серверов, на которых произошла ошибка, чтобы их сравнить.
-
Если ваш сервер падает не один раз, а постоянно - это позволит проще разобраться в проблеме.
-
Ок, я чуть позже вернусь за компьютер и соберу всю информацию.
Сервера не объединены в кластер и этот сегфолт упал именно при выполнении мерджа после запуска optimize table. Сервера standalone на разных OS (mac os собран из master, ubuntu из пакета). -
https://github.com/yandex/ClickHouse/issues/3783 проявляется только на Decimal128. Если вдруг встретите на Decimal32/64 - заведите отдельный тикетSegfault on groupArray with Decimal128 · Issue #3783 · yandex/ClickHouse
SELECT `time` -- groupArray((sensor_id, volume)) AS groupArr FROM ( SELECT (intDiv(toUInt32(received_at), 900) * 900) AS `time`, sensor_id, avg(value) AS volume FROM sensor_value WHERE sensor_id IN...
-
Понял, спасибо. Буду пока кастовать в double перед groupArray
-
- 07 January 2019 (83 messages)
-
опять боты
-
-
-
смотри в сторону ARRAY JOIN
-
select toString(arrayMap(x-> (x,b[indexOf(a,x)]) , a)), toString(b) from (select [1,2,3] a, [5,6,7] b)
-
-
groupArray
-
select project, groupArray(keys), groupArray(values)
group by project
? -
Да
-
а, я видимо не нравильно выразился
-
-
any(a,b)
-
(())
-
Aggregate function any require single argument
-
Я имел ввиду тупл any((a,b))
-
ааа)
-
❤️
-
привет
-
а с отрицательными метриками памяти так и не было прогресса?
-
"metric":"MemoryTrackingInBackgroundProcessingPool","value":"-1294095600”
-
VERSION_FULL ClickHouse 18.16.1
VERSION_DESCRIBE v18.16.1-testing
VERSION_GITHASH 7624b0a20d25ea7021e33908cfcf6fdbc37938d1 -
у нас просто в одном кластере потребление памяти растет постоянно, там минимальная нагрузка
-
как-то так, от рестарта до рестарта
-
-
знакомая картинка https://github.com/yandex/ClickHouse/issues/3976
решение простое compile_expressions = 018.16.1 compile_expressions eats memory · Issue #3976 · yandex/ClickHouseWithout compile expressions CH eats ~3 GB (2 cache_marks + 1 dictionary) With compile expressions upto 30GB (maybe indefinite) RSS (top): 8.5GB metric value formatReadableSize(value) CompiledExpres...
-
у меня такое еще с 12. разница в двух кластерах в том, что в обоих есть словари, но в одном файл со словарем пустой, в другом нет (в остальном идентичны)
-
я пытаюсь по коду понять, релевантно это или нет
-
что за флаг require_nonempty?
https://github.com/yandex/ClickHouse/blob/5152e2b8fa43d71a88825c236339a4503c7b7619/dbms/src/Dictionaries/ComplexKeyHashedDictionary.cpp#L427
и может ли он повлиять на resoure safety?yandex/ClickHouseClickHouse is a free analytic DBMS for big data. Contribute to yandex/ClickHouse development by creating an account on GitHub.
-
в смсле, если бросается исключение, может, не закрывается стрим?
-
всем привет, а если дропнули БД - есть варианты ее восстановить их каких нибуть логов?
-
если не было репликации или если дропнули на всех репликах то нет вариантов.
-
ну да
-
какой то бот удалил все бд с нидерладского ip
-
посмотрите спам на имэйлах компании, новые файлы на сервере, мониторинг трафика на сервере - часто скачивают БД и потом дропают, и потом по первым найденным контактам или прямо на сервере оставляют контакт, с кем связаться для получения данных.
если не видно по графику трафика, что было скачивание - баз уже нигде не найдёте :) -
да сервер нигде не светился, ощущение что перебором нашли
-
-
вот техника дошла, первый раз про такие чудеса вижу.
-
-
не смертельно, но не приятно
-
о, значит нас ждет целая ВОЛНА удалений открытых серверов
-
у вас clickhouse в интернет торчит?
-
-
я думаю, что там тупо светили интерфейсом в свободный инторнет
-
-
торчал да, не успели закрыть )
-
https://cl.ly/8692290f2b4f - вот так вотImage 2019-01-07 at 7.14.39 ПП.png
Shared with CloudApp
-
сделайте nmap на остальные хосты, мало ли что открытого найдется
-
я бы хотя бы логи пока не сротировались схоронил
-
-
погрепать что там он еще делал
-
удалил штук 20 тестовых бд, пару штук не удалил
-
по таблично
-
http://185.107.47.171 tor exit-node :D
-
вот это без шансов
-
да и ладно, вобщем имейте ввиду )
-
раз выборочно, может, кого-то увольняли по-недоброму
-
нет, ценности в них не было
-
-
ну видимо бот - найшел и удалил, непонятно почему часть оставил
-
-
это да
-
ну кстати, там в логах еще запросов от него не осталось?
-
-
остались
-
просто интересно, какие там еще запросы были
-
с этим к сожалению не помогу, главный вывод - держать двери закрытыми с самого начала
-
:D
-
несколько лет уже ходят и сносят базы данных волной, то мускули, то монги, а мы все ненаучимся
-
вот более чем уверен, что ребята сидят и мониторят список популярных dbms и как только выше порогового значения, начинают сканить
-
-
++
-
-
-
получить список бд
получить список таблиц
что там попадать? -
ну вот потому и интересно, что было проигнорено, что осталось (намек на "а там были еще запросы?")
-
DETACH TABLE, DROP TABLE - с 185.107.47.171
DETACH DATABASE, DROP DATABASE - c 144.217.90.68
но получения списка БД и таблиц что-то не вижу -
обращение к system.tables только с моего ip
-
>https://twitter.com/IanColdwater/status/1082386334075867136
проститеIan Coldwater 👻🌿✨It's not dropping tables, it's discarding data that doesn't spark joy.
-
вот ето интересно
-
с двух ip зашли
-
-
-
Joined.
- 08 January 2019 (119 messages)
-
Добрый день. Есть вопрос по вью. Чувствую что-то не так делаю или не понимаю очевидного.
Есть таблица (реплицированная, распределенная) в которую постоянно пишут (пишут в локальные таблицы), на основе ее создаем вью чтобы аггрегировать данные.
CREATE MATERIALIZED VIEW default.MetricStats ON CLUSTER metrics
ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/metrics/{shard}/MetricStats', '{replica}')
PARTITION BY floor(time / 86400)
ORDER BY (time, appId) POPULATE AS
SELECT
uniqExactState(tags.value[indexOf(tags.name, 1)]) AS `os.host`,
uniqExactState(tags.value[indexOf(tags.name, 72)]) AS `container.id`,
uniqExactState(tags.value[indexOf(tags.name, 1131263)]) AS `container.host.hostname`,
appId,
floor(timestamp / 60) * 60 AS time
FROM default.Metrics
WHERE timestamp > now()-300
GROUP BY
time,
appId
Распределенная над вью для чтения
CREATE TABLE IF NOT EXISTS default.MetricStatsDistributed ON CLUSTER metrics AS default.MetricStats
ENGINE = Distributed(metrics, default, MetricStats, rand());
потом выбираем из этой распределенноя (которая над локальными вью)
SELECT
uniqExactMerge(`os.host`) AS `os.host`,
uniqExactMerge(`container.id`) AS `container.id`,
uniqExactMerge(`container.host.hostname`) AS `container.host.hostname`,
appId,
time
FROM MetricStatsDistributed
WHERE appId = 13629
GROUP BY
appId,
time
ORDER BY time ASC
И получаем следующее
┌─os.host─┬─container.id─┬─container.host.hostname─┬─appId─┬──────────time─┐
│ 35 │ 486 │ 1 │ 13629 │ 1546932480000 │
│ 35 │ 486 │ 1 │ 13629 │ 1546932540000 │
│ 35 │ 486 │ 1 │ 13629 │ 1546932600000 │
│ 35 │ 486 │ 1 │ 13629 │ 1546932660000 │
│ 35 │ 486 │ 1 │ 13629 │ 1546932720000 │
│ 35 │ 480 │ 1 │ 13629 │ 1546932780000 │ >>> ТУТ СОЗДАЛИ ВЬЮ
│ 29 │ 287 │ 1 │ 13629 │ 1546932840000 │
│ 27 │ 376 │ 1 │ 13629 │ 1546932900000 │
│ 27 │ 330 │ 1 │ 13629 │ 1546932960000 │
│ 21 │ 309 │ 1 │ 13629 │ 1546933020000 │
└─────────┴──────────────┴─────────────────────────┴───────┴───────────────┘
35 это правильное значение. 29, 27, 21 это мы что-то потеряли. Такое ощущение что что-то во вью попало а потом не дописалось
Я что-то странное хочу или очевидно делаю что-то не так?
Спсб -
-
-
-
хороший парень. создал табличку READ_ME_WARNING с одной записью
PAY 0.5 BTC TO RETURN YOUR DATA (OUR BTC WALLET ADDRESS: 32Qy9tS9YWpK1yKFGWGcV2pUNtzaaSbANs) AND SEND SERVER IP AND PROOF TO hacktarget@protonmail.com -
это нищехостинг, который даже на абузы почти не реагирует :)
-
-
-
+
-
плевок в сторону azure - нищебродское отношение к клиентам и их тикетам, если ты не платишь много денег, то-есть приоритетность и качество решения вопроса зависит от кол-ва денег, потраченное на услуги и пакеты услуг
PS: саппорт индусский и н̶е̶ ̶у̶м̶е̶е̶т̶ не может звонить в РФ, Украину и Белоруссию :D -
Joined.
-
-
-
Согласен. У нас на текущем месте было 3, все ужасны.
Сейчас взяли 4 я оч скептически отнесся, но был оч неправ
Парень - золото -
у меня очень стереотипное отношение к юзерам, без фоток и аватарок ;)
-
-
Joined.
-
Нет идей? Тикет создать как то неправильно будет
-
коллеги, подскажите как юзеру запретить некоторые операции
-
например DROP Database
-
readonly есть
-
ага нашел
-
-
-
почти) не докрутилась страница функций по работе с массивами до конца. По идее, вот решение: SELECT arrayReduce('groupUniqArray', arrayConcat([1, 2], [2, 4]))
-
Правда, результирующий массив перевернут
-
эта функция считает количество уникальных значений в массиве
-
-
гитхаб поиск и больше всего звезд
-
-
Joined.
-
Всем привет! подскажите пожалуйста как программа клиент должна реагировать на ошибку вида "ZooKeeper session has been expired."?
-
просто попробовать записать абсолютно такой же блок данных немного позже? обязательно ли это должен быть идентичный блок данных (во избежание случайной дубликации)?
-
Если отвалилось по ZK значит блок не записался и чексум для дедупликации тоже нет. Просто ретрайте. PS: расчитывать на дедупликацию средствами КХ так себе.
-
спасибо!
а на какую дедупликацию можно рассчитывать? сейчас всё плохо с этим, постоянно хаваем дубли когда сеть нестабильная или ещё какие проблемы -
но сейчас просто мы не формируем идентичные блоки данных и думали что если начнём так делать и ретраить пока не запишем без ошибки то всё станет хорошо за счёт дедупликации ZK
-
а движок replicatedmergetree ?
-
да
-
там кажется около 100 последних блоков хранится
-
пишем в Distributed таблицу
-
короче 100 раз ретрай и приедете
-
где то можно в космос выкрутить параметр этот но я не помню точно
-
печаль, но всё равно хоть какое-то решение, пусть и не 100 процентное
-
сейчас ситуация такая что пишем в Distributed таблицу (под ней два шарда в каждом по две реплики, таблицы ReplicatedMergeTree и internal_replication = false)
-
Там по дефолту рандомно данные по шардам уедут, никакая дедупликация работать не будет
-
да, об этом тоже думали что пора прекратить писать в distributed
вот только прикол в том что дубликация оказалась не на шардах, а на репликах -
В репликах данные разные?
-
replicated_deduplication_window = 100
replicated_deduplication_window_seconds = 7 * 24 * 60 * 60 -
кажется нашел
-
сейчас копаю историю, было давненько
-
@gofort это прям в движке настройка:
https://github.com/yandex/ClickHouse/blob/0eed697623afd251c1908073c4a2850a9bfc9cdc/dbms/tests/integration/test_extreme_deduplication/configs/conf.d/merge_tree.xmlyandex/ClickHouseClickHouse is a free analytic DBMS for big data. Contribute to yandex/ClickHouse development by creating an account on GitHub.
-
это построчная дедупликация? или блочная?
-
не очень понятно чем это лучше чем дедупликация ZK
-
How many last blocks of hashes should be kept in ZooKeeper (old blocks will be deleted). */
-
You can set very big replicated_deduplication_window to avoid duplicating INSERTs during that period of time.
-
а ну это по сути и есть дедупликация через ZK
-
ну я про нее и говорю. по умолчанию она помнит последние 100 вставок
-
если во время ретраев у вас набежит 100 вставок то 101я стрельнет дубликатом
-
ну там zookeper expired, соответственно не встанет, судя по t.me/clickhouse_ru/82705Kirill Shvakov in ClickHouse не тормозит
Если отвалилось по ZK значит блок не записался и чексум для дедупликации тоже нет. Просто ретрайте. PS: расчитывать на дедупликацию средствами КХ так себе.
-
в репликах данные в общем были одинаковые, просто они были продублированы несколько раз
-
Ну, это ОК. Значит у вас проблема только с ретраями.
-
если я правильно понимаю то дубликация возникает только из-за того что я в следующий раз записываю теже даные но в рамках другого блока, так?
-
Там формируется блок для записи и чексумма этого блока проверяется. Поэтому нужно писать ровно тоже самое и в тот же шард
-
в рамках гошной либы возможно ли повторно сформировать такой же блок если tx не сохранился и был rollback?
-
-
ага)
-
-
ClickHouse-Ninja/Proton
High performance Pinba server. Contribute to ClickHouse-Ninja/Proton development by creating an account on GitHub.
-
оО интересно, спасибо
а если мы берём теже самые данные, в том же порядке и делаем tx.Begin, stmt,exec то мы получим такой же блок или нет? -
Да
-
ещё вопросик такой, если запись происходит в distributed таблицу и произошла ошибка, то при повторе tx.Commit данные полетят на тот же шард (при том что шардирование рандомное в таблице указано) или нет?
-
Нет, только если пишите сами в какой-то конкретный шард
-
выходит что даже если сформировать одинаковый блок данных и писать его в distributed таблицу с рандомным шардированием, то можно с лёгкостью получить дубли данных только на разных шардах ...
-
Да
-
хорошо, спасибо большое!
-
спасибо за помощь 🙂
-
Если вам важно отсутствие дублей, и вы не формируете всегда одинаковые блоки при вставке, то самый лучший вариант по моему мнению — это шардировать самому и использовать ReplacingMergeTree или похожий (CollapsingMergeTree). Но при выборке тоже нужно будет удалять дубликаты или делать SELECT ... FINAL
-
правильнее просто блоки одинаковые писать, поэтому так и сделаем 🙂
-
Данные, которые вставлялись в таблицу в то время, когда шел populate, во вьюху не попадут
-
Они не попадают и потом
-
Вернее как я выше написал не все КМК
-
Тоесть populate закончился а данные и через час новые с "пропусками"
-
Добрый вечер!
У меня кластер состоит из 4 шардов без реплик. Пользователю default на всех шардах указал пароль в sha256, в настройках кластера в config.xml везде прописал пароль пользователя default в открытом виде.
Но кликхаус в логах все равно ругается: Password required for user default.
Подскажите, нужно еще что-то сделать?
Версия 18.14.15 -
А пользователю default разрешено ходить с адресов кластера?
-
сейчас проверю
-
А то, помнится, наступал на что-то похожее...
-
-
Здравствуйте. Стал при запуске писать такое, не пойму что делать. Подскажите пожалуйста
-
всем доброго времени суток, а как вывести из таблицы определенной кол-во строк, пропустим определенное их кол-во?
-
-
оу, из доки почему то не понял этого, спасибо, попробую
-
-
Здравствуйте! Есть запросы с сортировкой типа ORDER BY (value=1, value=3, value=6...) DESC на что можно заменить сортировку и сохранить последовательность?
-
Joined.
-
вопрос непотятный, т.е. у вас запрос order by value desc
выводит
6
3
1
а вам надо убрать секцию order by value desc
и что бы вывелось тоже самое
6
3
1 -
-
-
-
на питоне пишете?
-
JS)
-
на самом деле выведет как написано 1, 3, 6
просто этих value=group может быть и 10тыс и sql запрос получается на несколько страниц -
положи в таблицу?
-
а что написать в ORDER BY ?
-
-
дело в том что эта последовательность value=group не отсортирована по порядку
может быть 100, 5, 1001, 2, 10, 22, 6 -
т.е. еще один атрибут нужен у группы, порядок сортировки, 1,2,3 , а не проще на клиенте это все сделать?
-
1. нужно чтобы результат запроса был такой же как и раньше
2. там в запросе дальше еще LIMIT идет -
ну тогда либо join либо словарь
create table X ( val UInt64, group String, wei Int64) Engine = Join(ANY, LEFT, val);
insert into X values(1, 'a', 1),(6, 'b', 2),(3,'c',3);
select val, group from (select toUInt64(1) val union all select 3 union all select 6) any left join X using(val)
order by wei -
а если групп будет 5тыс? 5тыс all select N ?
упрощенно запрос такой
SELECT value, SUM(metric) ... GROUP BY value ORDER BY (value='169', value='117', value='153'...) DESC LIMIT 0,20 -
а у вас сорцы гифок ещё остались? тут с переводами косяк
-
какая разница, на 5тыс. join-ы и словари отлично работают, вот если 5млн. тогда да, уже несколько секунд будет работать.
-
я про то что ты написал
(select toUInt64(1) val union all select 3 union all select 6) -
ты добавил три елемента и написал три select
-
это пример левой таблицы, там где у вас данные лежат
-
а замены я предлагаю заинстертить в X
-
вместе с полем wei -- порядок сортировки
-
еще не понял зачем три колонки в X, про wei понятно. достаточно же group, wei
-
ну значит у меня ваш предыдущий вопрос подмешался в голове, который вы задавали 3 дня назад.
-
он кстати в этом же запросе, пытаюсь соеденить его с LEFT JOIN. сделал более простой вариант в transform() вместо перечисления массивов в коде, сделал slect из таблицы
- 09 January 2019 (229 messages)
-
-
-
-
-
-
-
Привет!
Решаем сейчас задачу предоставления доступа юзеру к определенным строкам таблицы. Т.к. нативно такого (пока) нет, решили сделать так:
1. Создать на репликах отдельную БД, и в ней копию таблицы (по структуре). Юзеру дать доступ только к этой БД.
2. Сделать mat view , который будет класть из основной таблицы основной базы в эту копию только нужные строки.
Взлетит ли? Может есть способ попроще?
Напрягает необходимость поддерживать структуру скопированной таблицы и mat view идентичной основной. Ну и необходимость дублирования данных тоже слегка мешает (хоть их и не много). -
Можно не давать пользователю делать запросы в базу напрямую, а через обертку. Добавить ещё поле в таблицу про права и чтобы обертка делала добавляла where по этому ролю автоматом
-
Ещё был доклад про примерно это у ребят из дойчебанка вроде.
-
http://youtu.be/7Wcq6_9727A вот тут004. Блиц доклады пользователей ClickHouse
12 декабря в Яндексе прошла большая встреча, на которой мы подвели промежуточные итоги СУБД ClickHouse как открытого ПО. За это время сотни компаний начали ей пользоваться. Специалисты из известных компаний рассказывают о своём опыте использования ClickHouse. Чего удалось достичь и с какими проблемами довелось столкнуться. Другие видео встречи https://events.yandex.ru/events/meetings/12-dec-2017/
-
Всем привет. Кто-нибудь сохранял в колонке таблицы данные в виде JSON? как я понял отдельного типа колонок для этого нет и данные хранятся как String? Сильно будет бить по производительности хранить неопределенные на момент проектирования таблицы данные таким образом, а потом во время запроса использовать соответствующие функции для для работы с JSON?
-
-
1. ну массив - это же данные одного типа? у меня могут быть и инты, и даты и строки. Или стоит сделать строковый массив и все это хранить в виде строк, парся при необходимости?
2. мне нужно потом как-то различать параметры. нужно чтобы было некоторое key-value. -
Две колонки. Keys, values
-
Да, в String. Имейте в виду, что парсить JSON можно только на уровне вложенности 1. Лучше всего создать потом несколько новых колонок, с нужным DEFAULT и выполнить OPTIMIZE TABLE ... FINAL, чтобы поиск по нужным колонкам был быстрым.
-
Не понял тебя
-
Из JSON вида {"a":{"b":5}} не получится получить вложенный b
-
На самом деле если структура вложенных ключей простая - то можно, хотя и немного чуднО:
SELECT visitParamExtractInt(visitParamExtractRaw('{"a":{"b":5}}', 'a'), 'b') AS x
┌─x─┐
│ 5 │
└───┘ -
А зачем так сложно?
SELECT visitParamExtractInt('{"a":{"b":5}}', 'b')
┌─visitParamExtractInt('{"a":{"b":5}}', 'b')─┐
│ 5 │
└────────────────────────────────────────────┘ -
А при инсертах - там не очень давно была добавлена возможность читать подключи в Nested поля. Но только для одного конкретного формата.
-
Работает на любом уровне вложенности, но сам уровень контролировать нельзя
-
Не понял зачем final
-
Может и не нужен :), но так он точно материализует default колонки
-
Разве это не пофиксили?
-
Ну с этим двойным вызовом как раз можно контролировать:
SELECT visitParamExtractInt(visitParamExtractRaw('{"b":1,"a":{"b":2},"b":3}', 'a'), 'b') AS x
┌─x─┐
│ 2 │
└───┘ -
Зачем же это фиксить? Это фича, а не бага
-
Так себе фича, имена ведь не обязаны быть уникальными
-
Немного сомнительная фича на самом деле :)
-
RTFM )
https://clickhouse.yandex/docs/ru/single/index.html?#funktsii-dlia-raboty-s-json
3. Поля ищутся на любом уровне вложенности, без разбора. Если есть несколько подходящих полей - берётся первое.Документация ClickHouse | Документация ClickHouseClickHouse-это быстрая система управления базами данных с открытым исходным кодом, ориентированная на столбцы, которая позволяет создавать аналитические отчеты о данных в режиме реального времени с использованием SQL-запросов
-
Я так понимаю так сделано просто чтоб парсер работал максимально быстро.
-
(несмотря на то, что мы сами составляем JSON, обычно именно JSON используется тогда, когда мы "не хотим думать", и тут эта фича становится наоборот очень даже багом, мешающим получить правильный ответ, причем только иногда)
-
Поэтому я и говорю о том, что JSON правильно парсится только с уровнем вложенности 1
-
По-моему то, что парсер "случайно" извлекает ключи и из глубоких структур JSON без возможности контролировать этот процесс - просто побочный эффект использования такого "quick & dirty" парсера.
-
Я так понимаю связано это с тем что в Яндексе просто всегда плоские JSON используются.
-
в этих visitParam
-
По идее можно практический любой JSON при определенных усилиях привести к плоскому. Типа
{"a.b":"4"} вместо {"a":{"b":"4"}}. С таблицами хуже, но тоже можно. -
Это есть в планах. Stay tuned, как говорится :) А если есть ресурсы (особенно в C++) то можете помочь проекту в этом.
-
как импортнуть sql файл на несколько строк ?
-
Да, я видел issue с пометкой что "будет" :) Но надо сейчас, поэтому извращаемся.
-
-
Если там несколько отдельных запросов - то придется по одному.
-
печаль
-
в скрипте через xargs но в этом случае падают комментарии
-
Насколько я помню примерно так CREATE TABLE xxx Engine=... Partition by ... ORDER BY ... AS SELECT ...
-
Да, спасибо. Я ожидал, что сначала запрос, а потом параметры таблицы)
-
Недавно на сервере подошло к концу место, кх перевёл одну таблицу в ro, что нормально, но при попытке записи в другую через clickhouse-client говорил, что всё ок, ничего при этом не записывая. Можно ли как-нибудь отменить поведение второго типа, чтобы кх сообщал о невозможности записи? Версия 18.14.15
-
и вдогонку: как посчитать, сколько свободного места нужно кх для нормальной работы?
-
CH будет объединять куски данных, чтобы производить оптимизации (хранения и чтения). Допустим у вас есть 2 куска размером по N Gb. Оценка сверху - надо места 4 x N Gb ( 2 x N - исходные данные, и 2 x N на случай если объединение двух кусков не дало выигрыша по месту - в какой-то момент на диске будут и исходные данные и объединённые).
-
Спасибо!
-
-
а в Materialized view можно инсерт сделать без селекта?
-
Ставлю КХ из стабильной дебиан репы
deb http://repo.yandex.ru/clickhouse/deb/stable/ main/
, но system.build_options говорить что
│ VERSION_DESCRIBE │ v18.16.1-testing
Это ок? -
-
Привет. Кликхаус как нибудь опирается на знание о выбранном ключе шардирования в distributed или select все равно улетают на все шарды?
-
В последней версии опция чтобы улетали только на нужные шарды, но она предполагает что данные правильно шардированы
-
Приветствую. Возник вопрос по поводу мониторинга скорости отработки запросов. Нашел обертку, реализующую нативный протокол КХ с lz4. По логике вещей, забор инфы на клиент через нативный протокол должен происходить существенно быстрей, чем через JSON (ведь тут сериализация, пусть и быстрая, на стороне КХ, а потом десериализация на клиенте). Простой же бенчмарк на одном и том же запросе (результат - одна колонка) показывает ужасные результаты через нативный протокол (16384 записей приходят за 25 секунд), в то время как через json все укладывается в в секунду. Хочу для начала посмотреть все, что думает об этих запросах (через нативный и через JSON) КХ, а потом уже искать косяки в реализации нативного протокола.Можно было бы, конечно, оставиться на JSON-е и не морочить голову, но при объемах>100к результатов парсинг на клиенте жрет как не в себя оперативу и процессорное время. Ткните, пожалуйста, как правльно проводить бенчмарк на стороне КХ
-
Ну возьмите просто не JSON формат для ответа, а TabSeparated, например, и будет вам быстро и парсится легко и потоково :).
-
(это я к тому, что лучше не связываться с нативным протоколом вообще, если только вы не пишете кусок самого КХ)
-
та я уже думал об этом, и, скорей всего, так и будет.
-
clickhouse-client не берет из системы env переменных как постгресс?
-
Меня взяло то, что в описании сказано, что это, мол, не просто какая-то обёртка над HTTP интерфейсом, а реализация нативного протокола которая взята и портирована из исходников КХ. Но ближе к делу оказалось, что что-то там не так)
-
всем привет, очень простой вопрос, как в clickhouse выбрать данные в +00:00 time_zone?
-
Пробую вот так: при подключении добавляю параметр ?location=UTC
-
Joined.
-
TZ=UTC clickhouse-client --use_client_time_zone=1
-
Добрый день.
Не подскажите разницы между системными таблицами query_log и query_thread_log ? -
А через http?
-
Глобальной настройки нет. Но есть возможность использовать функцию toTimeZone для нужных столбцов.
toTimeZone(t, 'UTC') -
Воспользусь, что @milovidov_an гуру в треде. Мне там чуть ниже посоветовали не морочить голову, и юзать http интерфейс и парсить TSV. Так и быть? Или, может, есть какие-то советы?
-
-
Может сегодня больше народу в канале, продублирую
https://t.me/clickhouse_ru/82672Vladimir Tretyakov in ClickHouse не тормозитДобрый день. Есть вопрос по вью. Чувствую что-то не так делаю или не понимаю очевидного. Есть таблица (реплицированная, распределенная) в которую постоянно пишут (пишут в локальные таблицы), на основе ее создаем вью чтобы аггрегировать данные. CREATE MATERIALIZED VIEW default.MetricStats ON CLUSTER metrics ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/metrics/{shard}/MetricStats', '{replica}') PARTITION BY floor(time / 86400) ORDER BY (time, appId) POPULATE AS SELECT uniqExactState(tags.value[indexOf(tags.name, 1)]) AS `os.host`, uniqExactState(tags.value[indexOf(tags.name, 72)]) AS `container.id`, uniqExactState(tags.value[indexOf(tags.name, 1131263)]) AS `container.host.hostname`, appId, floor(timestamp / 60) * 60 AS time FROM default.Metrics WHERE timestamp > now()-300 GROUP BY time, appId Распределенная над вью для чтения CREATE TABLE IF NOT EXISTS default.MetricStatsDistributed ON CLUSTER metrics AS default.MetricStats ENGINE = Distributed(metrics, default…
-
Native протокол может быть существенно эффективнее, но при условии, что для него есть хорошая реализация. Сам ClickHouse использует его для передачи данных между серверами и между clickhouse-client и сервером. А про эффективность реализаций в third-party библиотеках я не могу быть уверен. Для примера, даже C++ библиотека clickhouse-cpp хоть и довольно эффективная, но будет уступать по скорости реализации в самом ClickHouse.
-
Спасибо за комментарий и за волшебный продукт. На счет реализации вопросов нет, конечно, просто меня подкупило описание репозитория, что мол, это не какая-нибудь вам обертка над http-интерфейсом, а прям выдранная из исходников и портированная на .net реализация.
-
-
-
Партицирование по суткам. В старых сутках куски большие, дольше мержатся
-
В начале нового дня куски маленькие, и мержатся быстро
-
Вчерашний день заканчивает мержиться к 4 утра
-
-
-
Тут ещё важно, какой объем данных вы вытаскиваете. Я бы сказал, что Native протокол становится действительно необходим, когда вы переливаете таблицы целиком (сотни гигабайт данных в сыром виде), или же перешардируете их. В этом случае экономия CPU и сети весьма значительна, если переливка идёт из КХ в КХ. В других случаях этот формат вам только доставит головной боли и ничего больше.
-
Ну и ещё интересный факт — поскольку clickhouse-client содержит в себе и сервер, то он по возможности тоже общается с сервером по native протоколу прозрачно для вас
-
-
Я бы не сказал, что парсинг json результата большая проблема на небольших объемах. Но когда надо распарсить около 300к объектов, то это занимает больше времени, чем сам их забор. Что для юзера веб-интерфейса малоприятно. Вот и ищу оптимальные пути
-
Попробуйте TabSeparated, его легко парсить
-
В нативном протоколе к вам полетят не строки, а колонки, нужно вычитывать большие блоки прежде чем сможете отдавать клиенту что-то построчно
-
Да, попробовал, и это существенно быстрей, чем json, но все же это ещё одно колено
-
Для КХ составить ответ в любом формате не составляет труда, я бы рекомендовал Вам использовать тот вариант, который легче всего парсить на клиенте
-
Это может быть хоть JSONEachRow с ленивым созданием объектов из строки :)
-
300к это даже близко не тот объём, где разница на стороне сервера будет заметна
-
Так оно-то понятно, и у меня нет особых проблем с парсингом. Проблема в его скорости. Пока оптимальным остаётся tsv, но я все же не теряю надежды найти ещё быстрей вариант:)
-
Native, очевидно, колоночный, и не подходит для Ваших целей
-
Попробуйте RowBinary, его парсить легче всего и серверу легко его составлять
-
Но надо будет писать много кастомного кода, возможно, и нужно знать типы возвращаемых данных
-
Скорость и есть проблема, причем обычно самая сложная из всех :)
-
RowBinary, кстати, не сильно сложен. Я писал клиента на плюсах, заняло меньше недели с отладкой. Жаль выложить в OSS не могу
-
ну почему. Я могу могу заполнять поля объекта параллельно. Просто в той реализации нативного протокола существенный косяк в плане скорости забора результата, аж страшно: `262144 records: 316264 ms. IDataReader.ReadAll
262144 records: 309254 ms. ExecuteSelectCommand
262144 records: 6812 ms. JSON
262144 records: 3001 ms. TSV` -
в описании реализации заявлено что это чуть ли копипаста из исходников, вот я и понадеялся что это спасение. И она работает, и под парсинг результата удобно заточена. Но блин, как же медленно. Будто два маленьких гнома вручную переписывают
-
то бишь потенциально он должен быть быстрей TSV?
-
Для компилируемых языков это будет примерно в 100% случаев быстрее, если речь о скорости парсинга
-
Есть нюанс - если много нулевых или околонулевых значений, на больших сетах TSV может оказаться быстрее, потому что "0\t" занимает 2 байта, а double или Int64 - 8. В итоге передача по сети может съесть преимущества от парсинга
-
-
Всем привет, с праздниками))
А не подскажете, есть ли способ преобразования hex - строки в int в строке запроса? -
-
Большое спасибо! Искал эту страницу, похоже))
-
В моем случае значения будут всегда больше ноля. Жаль только, что в документации суховато написано. Но я попробую
-
да не за что. я сам такой же. то до конца страницы не докручу, то посмотрю на решение, и подумаю, что оно мне не подходит
-
В default профиле
-
Интересно. Для 2^16 бинари оказлся медленеей, чем tsv. но дальше - круче
65536 records: 2306 ms. JSON
65536 records: 1095 ms. TSV
65536 records: 1481 ms. Binary
131072 records: 2901 ms. JSON
131072 records: 2228 ms. TSV
131072 records: 1492 ms. Binary
262144 records: 3963 ms. JSON
262144 records: 5214 ms. TSV
262144 records: 2990 ms. Binary -
Главное узкое место всех клиентов использующих Native протокол - это конвертация столбцов в строки. Это очень сложно сделать со скоростью хотя бы близкой с скорости с которой это делает сам КХ. Представтьте что у вас 50 колонок, которые приходят в такой последовательности - сначала 65 тысяч значений для первой колонки, потом 65 тысяч значений для второй и так до 50, потом снова - следующие 65 тысяч значений для первой колонки и т.д И первую строку вы сможете прочитать только когда все 65 тысяч строк для 50 колонок будут прочитаны. Если подумать как это всё безобразие будет представлено в памяти с помощью структур вашего любимого ЯП, как будет выделяться / перевыделяться память и т.п. Короче добиться такой же скорости этой конвертации какой удалось добиться Алексею и его коллегам из Яндекса - почти не реально.
-
Коллеги, есть вопросец.
Подумываем заиспользовать GraphiteMergeTree, чтобы самим не писать логику rollup и downsampling. Единственное, что меня беспокоит это решардинг (т.е. когда в кластер нод докинем, то метрики начнут в другие шарды сыпаться, и downsampling перестанет работать). Есть у кого идеи, как это элегантно порешать, не вынося, например, в клиента функции consistent-hashing и проч. ? -
consistenthahsing есть в КХ, можно использовать как ключ шардирования и инсертить через Distributed.
-
"Короче добиться такой же скорости этой конвертации какой удалось добиться Алексею и его коллегам из Яндекса - почти не реально." не знаю как его, коллеги, но мне кажется, что Алексей находится на этой планете чтобы создать что-то невообразимое, например КХ =). А за комментарий спасибо, прояснилось
-
Но при добавлении шарда часть ключей всё равно съедет, я так понимаю
-
Есть ощущение, что нужен будет clickhouse-copier, и 2x места
-
Угу. Там просто при увеличении числа "корзинок" данные попадают чаще в те же места куда и перед увеличением.
-
Да вроде как это решардирование в вашем случае не особо и нужно.
-
Перед увеличением количества шардов - все данные с одного счетчика лежат вместе. Т.е. будут хорошо схлапываться.
-
Потом после увеличения количества шардов - будет определенный промежуток времени когда будет избыточные данные храниться на каждом шарде. И схлапываться будут только при чтении distributed.
-
но когда-нибудь этот промежуток времени закончится и снова всё будет ок.
-
Кажется так. (но могу и ошибаться, GraphiteMergeTree никогда "не курил").
-
Мне кажется, что если метрика переедет на другой шард, то rollup поломается
-
будет на каждом шарде отдельно схлапывать. Хз, какие-то граничные ошибки наверное возможны.
-
вот про них и речь :)
-
Т.е. если у вас данные со счетчика Х за 2018 оказались на одном шарде, а за 2019 - на другом. То при "недельном" схлапывании в одном шарде будет схопнут один день 31.12 а во втором - 6 дней 01.01-06.01. При этом если будете селект за эту неделю выпонлять - то он выполнит ещё одно схлапывание.
-
Ну а дальше зависит от того даст ли это финальное схлапывание правильный результат из двух частично схлопнутых. Скорее всего - да.
-
Интереснее граничный эффект на втором уровне агрегации, когда недели будут схлопываться в месяцы
-
-
С вашего позволения уточняющий вопрос. Имеется объект class Result {string val1; string val2; string valn;}
Правильно ли я понимаю логику, что оптимальным путем забора инфы в таком формате через нативный протокол будет создание коллекции объектов на основании значений первого столбца collection.Push(new Result (){val1=GetValue(i)}), после чего для каждого объекта из коллекции устанавливать значение следующего столбца collection[i].valn = GetValue(i) -
Я бы сказал что много зависит о того какую функцию для схлапывание использовать. Напрамер при использовании any - я бы не предвидел никаких побочных эффектов. :D
-
Joined.
-
Оптимальным путём будет создание метода getVal1(), который внутри из внешнего массива возьмёт значение для i.
-
Т.е. массивы с данными колонок аллоцируются большими пачками, что уменьшает фрагментацию, и бла-бла-бла
-
Я не специалист в .NET, и не знаю каков оверхед в частности использования классов (не знаю как они представляются в памяти) и сколько будет релокаций при использовании collection.push. Идеально - это сразу взять большой кусок памяти с запасом, и потом заполнять его простыми типами.
-
Так чтоб уменьшить количество реалокаций / фрагментацию.
-
ну, памятью тут GarbageCollector занимается, хотя можно и с unsafe'ом побаловаться. Я просто хочу устаканить сам процесс. По текущей логике добавление объектов в коллекцию будет вызвано столько раз, сколько есть значений в первом столбце. Это дешево. Дороже будет апдейтить оставшиеся пустыми остальные поля каждого объекта инфой из следующих столбцов.
-
Я предполагаю ходить по колекции по индексу, так что особой каши быть не должно
-
Можно попробовать, например так как предлагает Alex. Когда обращение к i-той строке просто читает i-ые элементы какждого из массивов содержаних данные по отдельным колонкам. Но если таких строк будет много, а построчные обращения к данным будут очень интенсивно - то возможно лушче будет и так переформатировать к честному строковому представлению. Чтобы кэш процессора мог нормально работать без постоянных перезагрузок.
-
-
Вроде ясно пока. Спасибо!
-
а что за клиент и что такое abort?
-
-
-
я на ноде киляю
-
-
а какая разница до или после?
-
-
-
clickhouse-client если нажать Ctrl+C - пытается убить запрос.
При некорректном завершении работы clickhouse-client (например `kill -9`) или при разрыве соединения HTTP сервер будет молоть данные до конца. -
Кстати было бы прикольно, если бы можно было задать какую-нибудь опцию в HTTP или в настройках сервера, чтобы запрос убивался сразу же, как только соответствующий HTTP запрос отменен или соединение оборвалось 🙂
-
-
Вроде как в том же MySQL, например, запросы себя так и ведут
-
Да... :) Можете написать что-нибудь от себя: https://github.com/yandex/ClickHouse/issues/1403HTTP interface: kill queries after disconnect. · Issue #1403 · yandex/ClickHouse
If you will just close the HTTP connection with lasting query, the execution of that query is not stopped. May be for DDL queries that bahaviour can be considered as acceptable, but for usual SELEC...
-
Поставил палец вверх 🙂
-
а как mysql узнает что http клиент отвалился?
-
MySQL общается по кастомному TCP протоколу 🙂
-
В любом случае, в HTTP есть возможность, как минимум, закрыть соединение
-
В HTTP/2, возможно, есть возможность отменить какой-то конкретный запрос, но я не смотрел детали
-
послать пакет с флагом, а что с этим пакетом сделает tcp-сервер, это отдельный вопрос :)
-
нафига?
notEmpty(assumeNotNull( -
вот за этим и спрашивал, спасибо
-
ночь полянка в тайге, горит костерок, подходит мужик спрашивает "А, какой автобус довезет меня до лувра?"
-
Ну если клиент корретно закрыл tcp соедиенения - то об этом узнать не сложно. Нужно просто проверить статут сокета.
-
-
Даже если некорректно, то только если не случился kernel panic или не пропала сеть на несколько минут, то всё равно будет всё хорошо. Ну или использовать TCP keepalive
-
-
groupArray
-
Ну могут быть ситуации когда клиент вроде есть, а вроде и нет (по таймауту только можно понять). Но если клиент отправил TCP FIN пакет - то значит что дальше разговаривать с ним не о чем.
-
И какие-то данные для него молоть - пустая трата времени.
-
Ну да, TCP keepalive как раз эту проблему решает.
-
Коллеги, всем привет!
Приглашаем вас на наш 4-ый митап Scale-out databases and engines - обсуждаем распределённые СУБД, их эксплуатацию, разработку и развитие.
В этот раз поговорим об open-source в enterprise-среде - опыт компаний, кейсы внедрений, слухи, скандалы, интриги, расследования. В частности, коллеги из Alytics.ru расскажут о создании data-платформы на базе связки CH + Greenplum.
Москва, 7 февраля, самый центр. Вход свободный, но нужна регистрация по ссылке. Будем рады вас видеть!
https://www.meetup.com/Scale-out-databases-and-engines/events/257153368/Open-source в Enterprise: это фантастика?Thu, Feb 7, 2019, 7:30 PM: Как найти DI TelegraphВход в здание со стороны Газетного переулка напротив церкци, которая за Макдоналдсом.Стеклянная дверь с вывеской DI TelegraphДальше поднимаетесь на 5-й
-
спасибо, то что нужно
-
-
никак, называйте словари по разному
-
Есть параметр -n или --multiquery
printf 'CREATE TABLE IF NOT EXISTS yy(b UInt8) Engine = TinyLog;\nINSERT INTO yy(b) VALUES (1);\nINSERT INTO yy(b) VALUES (2);\n SELECT * FROM yy;' | clickhouse-client -n -
—query же нужен, не?
-
Из stdin тоже умеет читать
-
а ты пробовал так ?
-
вроде не работает в доке же зачем то написано что мультиквери не ест
-
и я зачем то xargs спользвал же
-
-
не умеет
-
Этот пример выше скопировал из консоли. Работает.
-
By default, you can only process a single query in batch mode. To make multiple queries from a "script," use the --multiquery parameter. This works for all queries except INSERT
-
у меня инсерты)
-
Да, с инсертами как-то странно работает. Но работает.
-
странно это как ? данные заменяет ? ))
-
Кажется VALUES должны кончаться новой строкой.
-
Иначе кусок SQL который идет после VALUES игнорит.
-
в доке не написано что хоть как то можно
-
➜ printf 'CREATE TABLE IF NOT EXISTS yy(b UInt8) Engine = TinyLog;\nINSERT INTO yy(b) VALUES (111);\nINSERT INTO yy(b) VALUES (222);\n SELECT count() FROM yy;' | clickhouse-client -n
23
➜ printf 'CREATE TABLE IF NOT EXISTS yy(b UInt8) Engine = TinyLog;\nINSERT INTO yy(b) VALUES (111);\nINSERT INTO yy(b) VALUES (222);\n SELECT count() FROM yy;' | clickhouse-client -n
25
➜ printf 'CREATE TABLE IF NOT EXISTS yy(b UInt8) Engine = TinyLog;\nINSERT INTO yy(b) VALUES (111);\nINSERT INTO yy(b) VALUES (222);\n SELECT count() FROM yy;' | clickhouse-client -n
27
➜ printf 'CREATE TABLE IF NOT EXISTS yy(b UInt8) Engine = TinyLog;\nINSERT INTO yy(b) VALUES (111);\nINSERT INTO yy(b) VALUES (222);\n SELECT count() FROM yy;' | clickhouse-client -n
29
➜ printf 'CREATE TABLE IF NOT EXISTS yy(b UInt8) Engine = TinyLog;\nINSERT INTO yy(b) VALUES (111);\nINSERT INTO yy(b) VALUES (222);\n SELECT count() FROM yy;' | clickhouse-client -n
31
➜ printf 'CREATE TABLE IF NOT EXISTS yy(b UInt8) Engine = TinyLog;\nINSERT INTO yy(b) VALUES (111);\nINSERT INTO yy(b) VALUES (222);\n SELECT count() FROM yy;' | clickhouse-client -n
33 -
clickhouse-client -mn
и тогда концы запросов парсятся по ; -
с инсертами это не работает. Попробуй пример выше.
-
С -mn выполняет только первый инсерт.
-
да странно, я не замечал, видимо по везению всегда писал в разных строках
-
и input_format_values_interpret_expressions не влияет
-
а ну понятно, фактически разделитель перевод строки, но для интерактивного режима есть костыль
Исполняется только один запрос, поэтому всё, что введено после точки с запятой, игнорируется. -
Joined.
-
Joined.
-
Joined.
-
Joined.
-
Последовательно вливаю CSV-файлами по 300К строк через CLI с той же машины, где размещена база.
Через некоторое время появляется ошибка:
File x59 can't be inserted: Code: 210. DB::NetException: Connection refused: (localhost:9000, 127.0.0.1)
И база перестает откликаться на некоторое время. Подскажите, пожалуйста, это может быть вызвано нехваткой ресурсов на машине (это копеечная виртуалка для экспериментов) или проблема в чем-то другом? -
OOM убивает ваш КХ. Раз в 10 мин. упавший КХ стартует назад кроном. Сколько памяти у виртуалки?
-
-
ооо, анриал. У КХ есть параметры типа кушать для начала 5.
-
Понял, увеличу ресурсов. Спасибо!
-
вот этот уменьшите в 10 раз
<!--mark_cache_size>5368709120</mark_cache_size--> -
отключите uncompressed_cache если включали
-
-
отключите <compile_expressions>0</compile_expressions> там возможно утечка в 18.16.1
-
А можно как то вывести на экран настройки, с которыми запущен clickhouse ?
-
Табличка есть же
-
-
-
спасибо!
-
Надо скидывать кейсы с ошибочной работой настройки enable_optimize_predicate_expression сюда:
https://github.com/yandex/ClickHouse/issues/3942
Суть в том, что я знаю, что реализация неудобная и подвержена ошибкам, но так как эта настройка выключена, мы сейчас уже не знаем, сколько проблем там осталось.
У нас внутри статус такой, что некоторые пользователи включают эту настройку вручную для своих запросов.Question: What is the status of enable_optimize_predicate_expression ? · Issue #3942 · yandex/ClickHouseHello This setting is still deactivated by default due to a few bugs. We have made a few test and in certain context, activating the setting allow us to gain a factor of 100 ( 2.3 sec vs 0.026 sec)...
-
ну, видимо, если она результат не портит, то можно включать)
-
-
-
-
-
-
-
-
-
select * from system.settings where value='10000'
-
select * from system.settings where value='10000';
select *
from system.settings
where value='10000'
┌─name──────────────────────────┬─value─┬─changed─┬─description────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ mark_cache_min_lifetime │ 10000 │ 0 │ If the maximum size of mark_cache is exceeded, delete only records older than mark_cache_min_lifetime seconds. │
│ output_format_pretty_max_rows │ 10000 │ 0 │ Rows limit for Pretty formats. │
└───────────────────────────────┴───────┴─────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Ok. 2 rows in set. Elapsed: 0.018 sec. Processed: 0 rows, 0.0B (0 rows/s, 0.0B/s) -
В файл должны все писаться.
-
- 10 January 2019 (179 messages)
-
-
Всем привет!
Подскажите. В плане оптимизации селектов, к примеру, по полю А, что будет оптимальней?
Разбить большую таблицу на партиции с ключом партицирования А, либо включить А в начало первичного ключа? -
Joined.
-
Всем привет. Подскажите плз. Как создать dist таблицу без кластера?
-
просто описать кластер в конфиге и потом создать дист таблицу
-
Кто нибудь подскажет для каких целей полезна таблица system.query_thread_log и много ли я потеряю если выключу логирование ?
-
Там per-thread профилирование запросов
-
разные таймеры, что делали треды во время запроса
-
-
Добрый день!
У меня две реплики работали на версии 18.12.17. Обновил одну на 18.16.1. Теперь она потребляет в 4.5 раза больше памяти чем та, что осталась на старой версии и продолжает расти.
Это ожидаемо? В новых версиях что-то изменилось в плане работы с памятью? В ченджлоге не нашёл ответа. -
-
мы только что пробовали обновиться на 18.16.1, в лог посыпались ошибки, вернулись на 18.14.18
-
понял, спасибо
-
-
Спасибо, вы помогли нагуглить точно такую же жалобу: https://github.com/yandex/ClickHouse/issues/3976
-
Привет всем!
Как понять, почему не удаляюлся данные с помощью ALTER TABLE ... DELETE WHERE ...
в таблице с движком ReplicatedReplacingMergeTree
Мутации сразу становятся is_done=1 строки не исчезают -
на первый взгляд вроде помогло, спасибо!
-
Используем Tableau в связке с КХ с помощью https://github.com/yandex/clickhouse-odbc, часто в логах попадается вот такая ошибка
<Error> executeQuery: Code: 164, e.displayText() = DB::Exception: Cannot drop table in readonly mode, e.what() = DB::Exception (from 172.16.0.170:61687) (in query: DROP TABLE `XT01_58903EC7_5737_44A3_94CA_483644D99DC3_2_Connect`), Stack trace:
что это за таблица и где искать ошибку ?GitHub - ClickHouse/clickhouse-odbc: ODBC driver for ClickHouseODBC driver for ClickHouse. Contribute to ClickHouse/clickhouse-odbc development by creating an account on GitHub.
-
Табло при работе делает много разной магии похожей на такие таблицы, само создало и само удалило
-
так, видно что прав нету прав, как на создание, так и на удаление
-
Господа, хочу я в рамках перехода от одного формата данных к другому узнать, были ли селекты к таблице со старым форматом. Можно ли узнать это не из логов?
-
Joined.
-
Кхм. Ответ на этот и другие загадки вселенной ищите в следующем сезоне "Битвы экстрасенсов"... :) Это я к тому что без логов (прежде всего system.query_log) можно только угадывать.
-
Просто подумал, что может в новых версиях дополнительная статистика есть типа счётчиков запросов по-таблично...
-
А чем плох query_log?
-
В основном, объёмом, пожалуй.
-
Joined.
-
Ну и тем, что некоторые метрики типа "сколько запросов за интервал делалось к таблице с данными по биллингу, дабы выразить своё фе программистам за упавший сервис" - это надо отдельно считать, а не просто сохранять счётчики скриптом по крону.
-
Ребят подскажите, есть такая пробелма - создал на нескольких нодах таблицу devices_local с движком - engine = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/devices', '{replica}',
'ver') ORDER BY device_id, и создал дистрибьютед таблу devices движок - engine = Distributed(wifi, wifi, devices_local, rand());. и соотвтесвенно ожидаю, что данные запросы должны давать равный реультат - select count(*) from devices final;
select count(distinct device_id) from devices;. Но почему то final не удаляет все дубли, когда применяю ее на табле с distributed движком -
Ну можно же чистить так часто как хочется.
-
Это уже считай, ещё одна инфраструктура :-)
-
Ну да - 2-строчный скрипт на баше в кроне, это тоже инфраструктура :)
-
Таки да, ибо требует отладки.
-
Ну хотя бы проверки.
-
Впрочем тут-то и забить можно - дело одноразовое пока что.
-
Ну КХ это база для аналитики, вот им и пользуйтесь чтоб аналитику вести, безо всяких там "сохранять счетчики скриптом по крону" :P
-
Иногда таки проще счётчики, чем развесистый запрос, который заодно уронит сервер по oom...
-
Правда, это пока ещё не тот случай.
-
Но предусмотреть не помешает, по-моему...
-
select count(*) cnt, device_id from devices final group by device_id having cnt>1
-
-
Ваш коллега Алексей спросил то же самое в чатике Табло 🙂 Это скорее всего времянка (которую Табло попросило создать, а КХ видимо разрешил создать -- и должна быть запись об этом в логах -- а вот с удалением незадача случилась). Теоретически может помочь кастомизация настроек ODBC драйвера. Для запрета времянок достаточно двух настроек в TDC файле: 'CAP_CREATE_TEMP_TABLES' value='no' и 'CAP_SELECT_INTO' value='no' Но можно оставить все, которые рекомендуют коллеги.
-
)) да, мир тесен
-
А мы можем нашим комьюнити как-то форсить у табло нативную поддержку CH?
-
Joined.
-
Решилось, движок схлопывал данные только в рамках 1 шарда
-
@milovidov_an
-
-
yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data. Contribute to yandex/ClickHouse development by creating an account on GitHub.
-
это вопрос скорее к уважаемым админам.
-
Вряд ли.
-
не проще форсить в обратную сторону, СH в сторону стандартов SQL ? Все 15 пользователей КХ вряд-ли что-то зафорсят в табло.
-
Может быть сталкивались, а как именно по-разному?
-
-
-
Да, это экспериментальная возможность. Обо всех случаях, когда она плохо работает, следует подробно писать, например, сюда: https://github.com/yandex/ClickHouse/issues/3942 чтобы разработчик смог увидеть.Question: What is the status of enable_optimize_predicate_expression ? · Issue #3942 · yandex/ClickHouse
Hello This setting is still deactivated by default due to a few bugs. We have made a few test and in certain context, activating the setting allow us to gain a factor of 100 ( 2.3 sec vs 0.026 sec)...
-
по моим представлениям, это вендор (разработчик движка) обращается в табло на предмет "сертификации" (условный термин) драйвера (и самого движка?) на совместимость с кодом, который табло генерит и отдает драйверу. как именно происходит эта с позволения сказать "сертификация", и какие еще требования могут быть -- понятия не имею.
-
я чего-то не понял видимо, под нативной поддержкой что понимается? Чтобы табло умел КХ SQL или чтобы КХ odbc драйвер в облачное табло приделали?
-
https://community.tableau.com/ideas/6454 вот сюда бы несколько тысяч голосов)
-
а как мне отменить эту настройку?
я ее "включал" через параметры в http запросе -
какая версия у вас? там был баг что выключить для view можно только рестартом
-
-
млин версия КХ ????????????
-
18.12.17 - enable_optimize_predicate_expression incorrectly masks rows in views · Issue #3149 · yandex/ClickHouse
Haven't tested with earlier versions or master however in 18.12.17 enable_optimize_predicate_expression incorrectly masks other rows. Steps to reproduce: set enable_optimize_predicate_expressio...
-
-
да это оно, 100500 лет назад исправлено
-
-
обязательно рестартить или можно пересоздать вьюшку?
-
я не помню
-
А можете меня добавить в чат Табло, плиз?
-
Я плюсанул
-
Joined.
-
Tableau в России
Всё о Tableau Чат Tableau: @tableau_chat По всем вопросам: @n_smirnova
-
и с title'ами тоже не в порядке
-
а тут есть кто-то из меинтейнеров https://github.com/mailru/go-clickhouse?GitHub - mailru/go-clickhouse: Golang SQL database driver for Yandex ClickHouse
Golang SQL database driver for Yandex ClickHouse. Contribute to mailru/go-clickhouse development by creating an account on GitHub.
-
там сегодня драйвер сломали, мы фикс притащили, кого можно дёрнуть дополнительно?
-
привет
У меня тормозит кликхаус, может кто-то подскажет :-%
создаю таблицу такого вида
CREATE TABLE newsfeed (
uuid UUID,
app_id Int32,
geo_id Int32,
field String,
value String,
md5_value String,
event_date Date,
event_datetime DateTime,
is_init UInt8,
prev_uuid UUID
) engine=MergeTree(event_date, (app_id, geo_id, field), 8192);
и потом по ней читаю вот так
SELECT md5_value
FROM newsfeed
WHERE app_id = ? AND
geo_id = ? AND
field =?
ORDER BY event_datetime desc limit 1;
данных в таблице сейчас всего 80000 штук
если запускать 1 селект, то его время 0.007 sec
если запустить 20 воркеров, которые будут делать такого плана запросы, то время выполнения каждого вырастает до 0.5 sec и очень сильно возрастает CPU usage
вот кусок из лога
2019.01.10 18:52:54.441555 [ 9733 ] {596ee62a-3ba7-460f-9c52-34e2086f1dec} <Debug> executeQuery: (from [::1]:27218) SELECT md5_value FROM newsfeed WHERE app_id = 207052
2019.01.10 18:52:54.442739 [ 9733 ] {596ee62a-3ba7-460f-9c52-34e2086f1dec} <Debug> apptica_stat.newsfeed (SelectExecutor): Key condition: (column 0 in [207052, 207052])
2019.01.10 18:52:54.442857 [ 9733 ] {596ee62a-3ba7-460f-9c52-34e2086f1dec} <Debug> apptica_stat.newsfeed (SelectExecutor): MinMax index condition: unknown
2019.01.10 18:52:54.442927 [ 9733 ] {596ee62a-3ba7-460f-9c52-34e2086f1dec} <Debug> apptica_stat.newsfeed (SelectExecutor): Selected 2 parts by date, 2 parts by key, 2 marks to read from 2 ranges
2019.01.10 18:52:54.443084 [ 9733 ] {596ee62a-3ba7-460f-9c52-34e2086f1dec} <Trace> apptica_stat.newsfeed (SelectExecutor): Reading approx. 16384 rows with 2 streams
2019.01.10 18:52:54.443174 [ 9733 ] {596ee62a-3ba7-460f-9c52-34e2086f1dec} <Trace> InterpreterSelectQuery: FetchColumns -> Complete
2019.01.10 18:52:54.443371 [ 9733 ] {596ee62a-3ba7-460f-9c52-34e2086f1dec} <Debug> executeQuery: Query pipeline:
Union
Expression × 2
Expression
Filter
MergeTreeThread -
-
/cc @bgaifullin
-
это не аналитический запрос.
КХ не предназначен для навигационных запросов по индексу, тем более там нет никаких оптимизаций для ORDER BY event_datetime desc limit 1
этот запрос будет работать все дольше и дольше с каждым днем, нужен фильтр хотя бы event_date >= и event_date в индексе. -
-
set max_threads = 1 перед запросом
mysql лучше возмите -
field), 8192);
замените на меньшее число, пока в кеш марков влезает -
может даже и 128 (у меня в одном месте так работает)
-
-
не помогло(
-
это значит что в индексе лежат отметки для каждых 8192 записей, поэтому ваш запрос
pptica_stat.newsfeed (SelectExecutor): Reading approx. 16384 rows with 2 streams
курочит 16384 записей -
-
уже все перезалили?
-
-
-
2019.01.10 19:12:52.808502 [ 3247470 ] {5fec48e8-872f-4055-a573-d8cd8979c5e6} <Debug> apptica_stat.newsfeed (SelectExecutor): Key condition: (column 0 in [11434, 11434]), (column 1 in [54, 54]), and, (column 2 in ['PrivacyPolicy', 'PrivacyPolicy']), and
2019.01.10 19:12:52.808557 [ 3247470 ] {5fec48e8-872f-4055-a573-d8cd8979c5e6} <Debug> apptica_stat.newsfeed (SelectExecutor): MinMax index condition: unknown, unknown, and, unknown, and
2019.01.10 19:12:52.808642 [ 3247470 ] {5fec48e8-872f-4055-a573-d8cd8979c5e6} <Debug> apptica_stat.newsfeed (SelectExecutor): Selected 5 parts by date, 5 parts by key, 5 marks to read from 5 ranges
2019.01.10 19:12:52.808798 [ 3247470 ] {5fec48e8-872f-4055-a573-d8cd8979c5e6} <Trace> apptica_stat.newsfeed (SelectExecutor): Reading approx. 640 rows with 5 streams
2019.01.10 19:12:52.808861 [ 3247470 ] {5fec48e8-872f-4055-a573-d8cd8979c5e6} <Trace> InterpreterSelectQuery: FetchColumns -> Complete
2019.01.10 19:12:52.809128 [ 3247470 ] {5fec48e8-872f-4055-a573-d8cd8979c5e6} <Debug> executeQuery: Query pipeline: -
-
apt01.apptica.tech 🙂 select * from newsfeed limit 1;
SELECT *
FROM newsfeed
LIMIT 1
┌─────────────────────────────────uuid─┬─app_id─┬─geo_id─┬─field─────────┬─value─┬─md5_value────────────────────────┬─event_date─┬──────event_datetime─┬─is_init─┬────────────────────────────prev_uuid─┐
│ 65a8a3b7-73c1-4de9-b2ca-885fc15b6b53 │ 15 │ 1 │ ContentRating │ Teen │ 9553d6ff3248107191902859d514202e │ 2019-01-10 │ 2019-01-10 19:12:11 │ 1 │ 00000000-0000-0000-0000-000000000000 │
└──────────────────────────────────────┴────────┴────────┴───────────────┴───────┴──────────────────────────────────┴────────────┴─────────────────────┴─────────┴──────────────────────────────────────┘
1 rows in set. Elapsed: 0.151 sec.
вот скорость выборки одной строки при 20 потоках -
а set max_threads=1 меняет что-нибудь?
-
-
apt01.apptica.tech 🙂 select * from newsfeed limit 1;
SELECT *
FROM newsfeed
LIMIT 1
┌─────────────────────────────────uuid─┬─app_id─┬─geo_id─┬─field─────────┬─value─┬─md5_value────────────────────────┬─event_date─┬──────event_datetime─┬─is_init─┬────────────────────────────prev_uuid─┐
│ 65a8a3b7-73c1-4de9-b2ca-885fc15b6b53 │ 15 │ 1 │ ContentRating │ Teen │ 9553d6ff3248107191902859d514202e │ 2019-01-10 │ 2019-01-10 19:12:11 │ 1 │ 00000000-0000-0000-0000-000000000000 │
└──────────────────────────────────────┴────────┴────────┴───────────────┴───────┴──────────────────────────────────┴────────────┴─────────────────────┴─────────┴──────────────────────────────────────┘
1 rows in set. Elapsed: 0.006 sec. -
не очень удобно его тестить, потому что нельзя мультиплай запросы делать
но на первый взгляд не меняет -
все параметры можно задать для запроса прямо урле, и часть через settings в самом sql
-
-
-
-
-
нет, просто КХ аналитическая база, он старается выделить все 100% ресурсов одному запросу, чтобы запрос за 20 мин. выполнился а не за 2 часа.
-
-
-
-
-
-
зачем использовать КХ для такой фигни? чем mysql не устраивает?
-
-
-
какая версия КХ, не видно, если 18.16 отключите compile_expressions и рестартуйте
-
-
-
-
-
ну сжимать по колонкам явно эффективнее, с одним типом данных
-
о
-
-
скорее вопрос что у вас в постгресе за индесы на миллион строк на гиг
-
-
может бинарь общий с соседними таблицами ?) что то задофига для примера данных выше
-
-
-
может дикты какие левые подклчюены по уникальным полям? несоразмерный размер базы к кол-ву записей как раз таки у вас на постгресе
-
-
-
у меня есть база прода на миллион с компейками пользовтаелей, так она на перконе целиком 6 гигов весит, а тут какой то лям новостей
-
-
-
ага )
-
-
-
ща)
-
-
-
-
-
-
это колоночная штука, колонки лучше жмутся, чем строки.
-
-
Connected to ClickHouse server version 18.16.1 revision 54412.
-
-
мы когда прод с логами переводили с марии колумнстора то кликхаус нам места в 2 раза выйграл
-
единственный минус конечно что в марии хотя бы в теории можно было апдейт сделать …))
-
вроде это пофиксили в 18.16.1
если вы про это
Исправления выполнения запросов при включенной настройке compile_expressions (включена по-умолчанию) - убрана свёртка недетерминированных константных выражений, как например, функции now. #3457 -
в кликхаусе тоже можно только тсс)
-
не совсем, в кликхаусе происходит детач и повторный аттач того участка где есть данные для апдейта
-
то есть по факту что бы сделать апдейт одной строки может быть затронут блок в 300 метров
-
так я так же думал сделать, а по итогу получил боль с неаналитическими запросами
-
я не об этом
сделайте и рестартуйте
# cat /etc/clickhouse-server/conf.d/compile_expressions.xml
<?xml version="1.0"?>
<yandex>
<profiles>
<default>
<!-- 18.12.17 It does not work yet -->
<compile_expressions>0</compile_expressions>
</default>
</profiles>
</yandex> -
ну так колоночные базы то впринципе для селектов where uuid=xxxx не используются )))
-
они обычно рядышком стоят, на отдельных серверах себе
-
у меня нет таких запросов
-
ну я образно
-
плюс ваша боль связана с тем что для ваших запросов наверное надо матвью сделать с другим индексом
-
ну либо хотя бы prewhere доабвить в такой запрос
-
данных перелапатит столько же с диска, но быстрее
-
то есть ставят колоночную и рядом что-то типа постгреса, свои запросы в каждую из баз?
-
зависит от проекта, но в целом да
-
стало сильно лучше
-
2019.01.10 19:42:44.753594 [ 266 ] {0f3df0f2-a272-481f-9dc0-dbd6703d40f7} <Debug> MemoryTracker: Peak memory usage (for query): 58.52 KiB.
2019.01.10 19:42:44.753482 [ 184 ] {537dfb36-3f05-4d08-ae31-6232c44eaef9} <Debug> MemoryTracker: Peak memory usage (for query): 40.36 KiB.
2019.01.10 19:42:44.753394 [ 223 ] {99b6aeb2-1462-422f-861a-2aa4caae0816} <Debug> MemoryTracker: Peak memory usage (for query): 46.44 KiB. -
-
-
да, я в курсе, я это нашел.
https://github.com/yandex/ClickHouse/issues/397618.16.1 compile_expressions eats memory · Issue #3976 · yandex/ClickHouseWithout compile expressions CH eats ~3 GB (2 cache_marks + 1 dictionary) With compile expressions upto 30GB (maybe indefinite) RSS (top): 8.5GB metric value formatReadableSize(value) CompiledExpres...
-
-
что память течет и куча лишней работы для вашего запроса (https://github.com/yandex/ClickHouse/issues/3976)
и понял что у вас именно это глядя на rss в вашем htop. -
-
-
нуууууууу, каждый сам хозяин своих проблем 🙂
-
все таки для точечных запросов обычные базы лучше, там поиндексировать можно как угодно и что угодно )
-
а у кх деревце как ни крути, чем глубже тем дольше
-
За все придется платить
-
гайз серьезная проблема. надо решать!1
-
поломали совместимость от версии к версии ооооооч неприятно
-
уже в мастере
-
-
реализацию protobuf опять перенесли :( есть ли шанс увидеть данный функционал в ближайшем будущем или уже не стоит надеяться?
- 11 January 2019 (342 messages)
-
Закинул PR: https://github.com/yandex/ClickHouse/pull/4033
-
Joined.
-
Доброе утро! Посоветуйте, какое максимальное значение можно поставить для параметра "max_concurrent_queries" при 8GB ОЗУ и 4-х ядрах? Ожидается по 2000-5000 запросов в минуту в таблицу с 600 млн записей с простыми запросами.
-
-
-
Да, 100 одновременных запросов выполняются быстро. Если количество одновременных запросов поднять до 300 - появляется ошибка про конкуренцию запросов и показывается этот параметр "max_concurrent_queries"
-
-
-
-
какой ад, участие в формуле 1 на садовой тачке.
-
Нет, запросы разные. Но запросы простые - по 1-му индексному полю с узким временным диапазоном.
-
ClickHouse пока позволяет :)
-
-
-
на 8 гигах оом к вам придет через пару часов. Потом начнет все тормозить потому что данных слишком много и в кеш невлазят, в итоге 3 запроса параллельно будут работать.
-
-
Спасибо всем за советы. Будем ставить железо более производительное :) Все же ради спортивного интереса хотелось бы примерно узнать какие есть рекомендации по параметру "max_concurrent_queries" :) Тем не менее то, что позволяет делать ClickHouse на данном железе просто фантастика.
-
-
5000 запросов в минуту это неправильный сценарий, КХ аналитическая бд, надо одним запросом сразу все окучивать.
-
-
-
А в я.метрике нет API? Там пользователи меньше 5к делают запросов чтения на кластер?
-
если что я не работник яндекса, и даже никогда не видел метрику, подозреваю что в Я 400 серверов с 500ГБ озу в каждом, потянут 5к запросов
-
Да, я понимаю, это был риторический вопрос) я к тому, что 5к надо наверно просто заскейлить а не говорить, что это плохой сценарий. Вполне нормальный для аналитического большого кластера
-
В любом случае 8гб это нереально, 5 гб займут марки еще гиг всякая фигня в кх еще гиг линукс и для кеша диска и выполнения запросов уже ничего не остается. У меня кх сервер который тупо данные заливает, и не выполняет селектов жрет 20гб RES.
-
при 600м записей марки столько не займут :)
-
У меня вот базу на 200гб/30млрд постоянно пишется и мало читается, и КХ занимает 2–3 гига памяти. Конечно, что от запросов зависит, но память под них может и найтись.
-
всем привет,
подскажите, cpp клиент в качестве либы есть где-то? правильно понимаю, что клиент только один - https://github.com/artpaul/clickhouse-cpp ?
кто-то его использовал, есть за и против?GitHub - artpaul/clickhouse-cpp: ClickHouse C++ client libraryClickHouse C++ client library. Contribute to artpaul/clickhouse-cpp development by creating an account on GitHub.
-
Я использовал, но только для написания программ массовой вгрузки данных. На вид и на ощупь очень прикольный. Но моё использование было очень коротким и поверхностным.
-
у меня аналогичная цель, пушить данные в КХ напрямую из приложения, минуя запись в файл
-
вижу, что как минимум тип Nested отсутствует
-
присутствует
-
но заморочено немного, пришлось разбираться
-
readme проэкспайрился?
-
а, не, всё верно
-
Nested же это просто массивы :)
-
а они поддерживаются
-
wooops :)
-
по производительности данных нет?
-
То есть надо создавать параллельные массивы, как-то так:
auto col_ot_b1 = make_shared<ColumnArray>(make_shared<ColumnUInt8>());
auto ot_b1 = make_shared<ColumnUInt8>();
ot_b1.Append(...);
ot_b1.Append(...);
col_ot_b1->AppendAsColumn(ot_b1); -
Точных чисел не помню. У меня была задача переложить кучу данных из Монги в КХ, слегка сконвертировав на лету. Так вот, узким местом оказалась не запись в КХ, а судя по всему парсинг BSON'ов (в одном потоке). Скорость получилась порядка полмиллиона-миллион строк в секунду на одной машине (но это не точно).
-
в один поток вставка шла?
-
в целом, думаю, подойдет, надо попробовать что-то простое написать
-
с клиентом
-
да, с батчингом по миллиону строк
-
У нас прод кластер 128 гиг оперативы на каждом шарде, каждую минуту пишется около 200гигов сырых данных(до сжатия) постоянно выполняются запросы глубиной до года. После перехода на кх не видел пиков выше 25 гигов оперативки. КАК у вас там 20 гигов на запись что то ест?!
-
а сколько у вас шардов при такой интенсивности записей, если не секрет?
-
15 штук на кликхаус
-
-
Годовые запросы в сырую таблицу? Или в агрегаты? Если второе - то вручную строите агрегаты (аля кроны) или через MV с чем-то вроде SummingMergeTree
-
Intel(R) Xeon(R) Gold 5115 CPU @ 2.40GHz
строк очень много, ивенты маленькие, но сейчас сказать точный порядок не могу -
спасибо, но в моем сообщении вопроса про оптимизацию не было 🙂
-
хотя если мне кто нибудь раскажет почему шард на который прилетает запрос, ест меньше оперативки чем подзапросы на соседей и как следствие подзапрос на нем работает намного дольше я буду крайне признателен 🙂
-
-
а как пропускная способность сети на производительность веников влиять будет )
-
Процы курят бамбук
-
+
-
-
-
считайте свой трафик на запись, смотрите мониторинг загруженности канала, если увидите что переполнение бывает то ставьте 10ки
-
сложно так наобум без метрик сказать
-
но честно говоря гигабит в секунду…. у нас вроде шарды вообще медью связаны )))
-
-
-
-
-
-
Ну если у вас по этому же линку гоняются пользовательские запросы и что то ещё то вероятно смысл есть
-
А вообще при возможности их лучше физически разделить
-
-
-
Joined.
-
-
-
Тогда смысла вам от той 10 на самом деле нету )
-
Всем привет! А в каком случае может высыпать Cancelled merging parts?
-
2 десятки это трафик мелкого интернет провайдера беларуси ))))
-
имхо, это может быть просто потому, что в пределах локалхоста нет накладных расходов на TCP и всё что ниже
-
Joined.
-
-
-
-
48 метров в секунду
-
Ну если реплик 2 то уже впритык может быть
-
Кто-нибудь использует fluentd для вставки в КХ?
-
напрямую?
-
или через кафку?
-
В виде
приложение - fluentd - clickhouse -
Или оно не батчит логи перед вставкой?
-
Пару лет назад не батчило. Правда, там не кх был, но тем не менее...
-
Если поток логов небольшой - можно и в буфер, по-моему.
-
-
Судя по доке - всё же буфиризирует перед вставкой. Спасибо, буду пробовать
-
У нас ребята его для вставки в hdfs используют. И говорят при росте трафика столкнулись с тем, что fluent теряет данные. Сейчас вот дебагают почему так
-
Причем вновь вставленные строки подходящие под условие удаления - удаляются. А старые - нет. Вставляю аналогичную строку с Deleted=1, Select final выводит только ее, но это не срабатывает. Grafana отображает данные.
-
Куда копать? Или только Drop table.... поможет?
-
-
Именно так. В реализации нативного протокола КХ клиенту и серверу надо обмениваться несколько раз обмениваться сообщениями. Чем быстрей пинг и толще канал - тем лучше. В идеале - вообще один хост для клиента и КХ, но одна зона доступности AWS тоже пойдёт весьма неплохо, или свои железяки в одной lan сети
-
-
Подскажите, пожалуйта, без RAID/LVM можно использовать несколько дисков; multi data path пока не появилось? В случае с RAID/LVM, первое будет предпочтительнее, или "на вкус и цвет"?
-
Симлинками можно разнести разные базы / таблицы по разным дискам (можно наверное и сразу диск подмонтовать в нужную папку). В документации LVM использовать не советуют:
https://clickhouse.yandex/docs/ru/operations/tips/#raid -
Спасибо
-
Нет. Можно сделать какой-нибудь comma-separated и передеать в КХ как строку, а потом в КХ разобрать строку в таблицу.
-
clickhouse-serer присылает собственные метрики с таймстампом в 59ю секунду кадой минуты. Это имеет побочные эффекты. Как -то можно поменять это?
-
-
-
А NCQ имеет смысл для одного диска? Без RAID то есть.
-
Можно так попробовать (если данных много то OPTIMIZE будет долгим).
ALTER ... ADD column DEFAULT old_column
OPTIMIZE TABLE ... FINAL
ALTER ... DROP old_column -
О, хорошая идея, спасибо!
-
-
Нет
-
Но более мелкие куски в более крупные в фоне мержатся
-
Но нет гарантии, что они когда-нибудь станут как после явного optimize
-
Мы на некоторых серверах с GraphiteMergeTree гоняем OPTIMIZE раз а неделю из-за этого :)
-
Добрый день. А есть уже люди, который начали писать rsyslogom в clickhouse логи?
-
А если у меня есть колонка, которая хеш вычисляет от поля. Она всегда это на каждый запрос делает? Или это разные кейсы
-
Полный (final) не выполняется никогда. Т.е. он регулярно в фоне выбирает части для слияния создавая из двух (или более) старых небольших частей одну новую (большую). В новой части уже будет новая колонка заполнена данными. Чем больше старая часть тем реже она будет выбираться фоновыми слияниями. Если у вас куски УЖЕ большие, то фоновые слияния скорее всего не будут выбирать для слияния - никогда или очень редко. В любом случае без OPTIMIZE дожидаться полной "материализации" добавлненной колонки - можно примерно бесконечно долго (но на самом деле будет работать и без этой материализации - просто будет вычислять на лету из DEFAULT выражения, пока старая колонка на месте)
-
Разные :)
-
Если это колонка типа MATERIALIZED, или с DEFAULT выражением - то она заполняется однократно при вставках или при фоновых слияниях (если до этого отсутствовала). Если это колонка типа ALIAS - каждый раз "на лету".
-
-
Я сам не проверял, но вроде бы NCQ должен наносить пользу и причинять добро и при одном диске тоже.
-
Он же служит тому чтоб изменить порядок выполнения дисковых чтений / записей там чтоб минимилизировать количество перескоков головок.
-
В принципе КХ всегда пишет/читает данные на диск относительно большими кусками, поэтому чтение обычно линейное без большого количества скачков головками, и польза от NCQ теоретически не так велика, но мешать он вроде бы не должен.
-
Добрый день, коллеги.
В чейнджлоге есть вот такое:
» Для таблиц семейства MergeTree появилась возможность указать различный ключ сортировки (ORDER BY) и индекс (PRIMARY KEY). Ключ сортировки может быть длиннее, чем индекс. #3581
Собственно, вопросы следующие:
1. в чем заключается отличие "ключа сортировки" и "индекса" в терминах кликхауса?
2. можно ли изменить индекс (PRIMARY KEY) у существующей таблицы с данными и к чему это может привести? -
А SSD?
-
-
-
MySQL group_concat?
-
-
-
-
о, спасибо.
-
В логе :
default.graphite_tree (StorageReplicatedMergeTree): Cannot select parts for optimization: Entry for part 20171201_20171201_0_7_1_470266 hasn't been read from the replication log yet
Кто сталкивался ? -
ALTER TABLE errors_replicated_index ADD COLUMN testIds DEFAULT experiments
select experiments, testIds from errors_replicated_index where notEmpty(experiments) limit 10 -
-
а что касается второй части моего вопроса, если мне нужно изменить именно индекс(primary key)? только переимпортом данных или create from select?
-
-
У SSD - тоже есть своё NCQ (просто очередь заданий). Тоже должно быть скорее полезным чем вредным. Но повторюсь - я никогда не экспериментировал с этим, поэтому лучше проверять.
-
Да вот тоже не экспериментировали. Спасибо!
-
Есть (была) недокументированная возможность добавлять новые столбцы в PRIMARY KEY, реализована только для нереплицированных таблиц. Так как решили, что новая фича полностью покрывает кейсы использования старой, в новых версиях её уже не будет. Если изменение ключа какое-то более хитрое, то да, только insert select в новую таблицу.
-
да, я хочу (float32, float32, datetime) -> (uint64, datetime)
-
последний идиотский вопрос - create from select не влезает в память. понятно, что можно разделить на несколько запросов, но может есть способ как-то в один запрос это сделать?
-
Не знаю. У меня работает (с) :)
-
create table yyy Engine = MergeTree ORDER BY tuple() PARTITION BY tuple() as SELECT * from numbers(100);
alter table yyy add column c UInt64 DEFAULT number;
select c from yyy;
--100 rows in set. Elapsed: 0.003 sec. -
может связано, что у меня таблица относительно большая - 3млрд записей
-
попробуйте число потоков уменьшить, set max_threads=1
-
Шарды / реплики / дистрибютед?
-
оно в принципе не влезет, данных значимо больше, чем памяти в наличии
-
2 реплики в сумме, шардов нет
-
Привет, подскажите пжл куда копать - есть кластер из 6 нод (3 шарда по 2 ноды с репликацией в каждом). Есть ReplicatedMergeTree таблица и Distributed над ней.
4 ноды кластера версии 18.14.18 revision 54409 - работают без ошибок. На двух нодах 3го шарда обновлен КХ до 18.16.1 revision 54412. В err логе такие ошибки:
2019.01.11 14:24:22.498309 [ 14 ] {} <Error> table_local (StorageReplicatedMergeTree): DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = No message received, e.what() = No message received
Из симптомов еще - на ноды где ошибки пишется меньше данных чем в остальные. С весом на каждом шарде по 1 - на проблемный шард пишется примерно 1/10 данных, вместо положенных 1/3 (1/6 на ноду) (впрочем через weight можно "отрегулировать" )
Вопрос основной - это фишка/баг новой версии? Стоит ли откатываться или апгрейдить остальные ноды? -
Потребление памяти при потоковом селекте должно быть O(1), вот только константа довольно большая :)
-
ок, попробую в один поток. не взлетит - ну, побью запрос
-
спасибо
-
Были несколько ишью про "Not found column". Или это одна из них или что-то новое. Если можете повторить - то можно на github добавить.
-
Откатываться и ждать нового релиза. Этот баг уже исправлен в мастере, но пока не в релизе:
https://github.com/yandex/ClickHouse/issues/3891ALTER timeout on ReplicatedMergeTree · Issue #3891 · yandex/ClickHouseOn release 18.16.0, when applying ALTER TABLE ... ADD COLUMN on ReplicatedMergeTree table, ALTER completed on current replica, but other replicas coudn't download and apply ALTER action. On...
-
спасибо огромное!
-
Workaround: после рестарта реплики или даунгрейда должно починиться.
-
похоже на тот же баг
-
https://github.com/yandex/ClickHouse/issues/3209
если в where указываю, то нормально селектитException: Not found column in block · Issue #3209 · yandex/ClickHouseВерсия 18.12.17. Запрос ` CREATE TABLE default.test ( date_check Date , id1 UInt64 , id2 UInt64 , sign Int8 ) ENGINE = CollapsingMergeTree(date_check, (date_check, id1), 8192, sign); INSERT INTO de...
-
-
Привет, вопрос про VersionedCollapsingMergeTree
В документаци сказано, что cansel row должен быть полностью идентичен той записи, которую он схплонет, помимо поля sign
> The first row cancels the previous state of the object (user). It should copy all of the fields of the canceled state excepting Sign
https://clickhouse.yandex/docs/ru/operations/table_engines/versionedcollapsingmergetree/#example-of-use
При этом в описании алгоритма сказано, что он смотрит на primary key, version, sign.
> When ClickHouse merges data parts, it deletes each pair of rows having the same primary key and version and different Sign. The order of rows does not matter.
Так на что в итоге он смотрит при схлопывании? можно ли не сохранять state всех полей, а просто удалить предыдущую версию через primary_key, version и sign == -1? -
Проблема в том что он удалится "может быть" "когда-нибудь" при фоновых слияниях.
-
А если вставить с правильными значениями - то можно получать правильные агрегации без FINAL
-
Т.е. если вставить например
value=100,sign=1
value=100,sign=-1
value=200,sign=1
А потом сделать select sum(sign * value) то у вас будет правильное значение даже если фоновые слияния не закончены. -
Если же вы встравите просто
value=100,sign=1
value=0,sign=-1
value=200,sign=1
То результат будет невереный до завершения фоновых слияний (будет 300 вместо 100). -
А, спасибо.
Рассчитывал, что версии будет достаточно, чтобы кх осознал, какой строке я делаю cancel -
А вам точно нужен Collapsing?
-
Есть специалисты по движку ReplicatedGraphiteMergeTree ?
-
А почему вы спрашиваете? :)
-
-
Вопрос есть: в какой момент КХ прореживает данные, если партишен уже месяца 4 как не мерджится, правила такие:
<pattern>
<regexp>..............</regexp>
<function>avg</function>
<retention>
<age>0</age>
<precision>60</precision>
</retention>
<retention>
<age>7776000</age><!-- 90 days -->
<precision>600</precision>
</retention>
</pattern>
И в данных все ещё минуты:
SELECT
Value,
Time,
Date,
toDateTime(Time)
FROM graphite201809
WHERE (Date = '2018-09-01') AND (Path = '...................')
LIMIT 10
┌─Value─┬───────Time─┬───────Date─┬────toDateTime(Time)─┐
│ 67847 │ 1535749200 │ 2018-09-01 │ 2018-09-01 00:00:00 │
│ 67847 │ 1535749260 │ 2018-09-01 │ 2018-09-01 00:01:00 │
│ 67847 │ 1535749320 │ 2018-09-01 │ 2018-09-01 00:02:00 │
│ 67847 │ 1535749380 │ 2018-09-01 │ 2018-09-01 00:03:00 │
│ 67847 │ 1535749440 │ 2018-09-01 │ 2018-09-01 00:04:00 │
│ 67847 │ 1535749500 │ 2018-09-01 │ 2018-09-01 00:05:00 │
│ 67847 │ 1535749560 │ 2018-09-01 │ 2018-09-01 00:06:00 │
│ 67847 │ 1535749620 │ 2018-09-01 │ 2018-09-01 00:07:00 │
│ 67847 │ 1535749680 │ 2018-09-01 │ 2018-09-01 00:08:00 │
│ 67847 │ 1535749740 │ 2018-09-01 │ 2018-09-01 00:09:00 │ -
возможно мне подойдет replacing merge tree и argmax при селекте, хочу оставлять последнюю запись для одного primaryKey
Аля, key value. -
Хм. А если вручную запустить OPTIMIZE на таблице и посмотреть что появится в логах? Попробуйте так:
SET optimize_throw_if_noop=1;
SET send_logs_level='trace';
OPTIMIZE TABLE xxx; -
Оптимайз проходил, не поменялось ничего, сейчас выполняю команды, но получаю на 2й:
:) SET send_logs_level='trace';
SET send_logs_level = 'trace'
Received exception from server (version 18.6.0):
Code: 115. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Unknown setting send_logs_level.
0 rows in set. Elapsed: 0.079 sec. -
1я отработала
-
Весь партишен(1ТБ данных) сегодня был прооптимизирован.
-
правила rollup - верные. graphite-clickhouse отображает данные до 13 октября как агрегированные до 10 минут, в датафайлах за сентябрь - минутные точки
-
send_logs_level - в вашей версии ещё не поддерживается, нужно просто заглянуть в /var/log/clickhouse-server/clickhouse-server.log
-
Добрый день, подскажите в запросе
ALTER TABLE [db.]table DETACH PARTITION 'name’
имя партиции можно указать как промежуток? -
или по одной тольок можно деаттачить?
-
Я не ковырял graphiteMergeTree но подозреваю что прореживание там будет происходит только при фоновых слияниях, и что алгоритм выбора частей которые должны быть подвержены слиянию там обычный. Т.е. старые и большие части будут выбираться для слияния реже чем новые и маленькие. Поэтому прореживание старых частей может происходить редко. А если вся партиция слилась в одну часть - то и вовсе никогда не будет сливать / прореживать. Решение - ручные OPTIMIZE старших данных, или даже OPTIMIZE FINAL.
-
По одной.
-
а обязательно делать через кликхаус клиент, или можно просто переместить файлы?
-
В общем случае - обязательно через клиент
-
Сделайте так - будет у вас список запросов. Потом копи-пасте нужного фрагмента (ну или можете WHERE добавить).
select 'ALTER TABLE '||database||'.'||table||' DETACH PARTITION '||partition||';' from system.parts group by database,table,partition ORDER BY database, table, partition FORMAT TSVRaw; -
Спасибо! Подскажите еще заодно, эти запросы среплицируются да?
-
Заглянул. Что искать?
-
Я не ковырял graphiteMergeTree но подозреваю что прореживание там будет происходит только при фоновых слияниях, и что алгоритм выбора частей которые должны быть подвержены слиянию там обычный. Т.е. старые и большие части будут выбираться для слияния реже чем новые и маленькие. Поэтому прореживание старых частей может происходить редко. А если вся партиция слилась в одну часть - то и вовсе никогда не будет сливать / прореживать. Решение - ручные OPTIMIZE старших данных, или даже OPTIMIZE FINAL.
-
^
-
да.
-
Сегодня прошёл именно optimize final и все слилось в один кусок. Данные не проредились
-
Тогда - да, странно. И действительно теперь один новый и большой кусок? Можете ещё включить part_log чтобы легко было дебаговать что именно он сливает.
-
Ок, гляну, спасибо
-
а давно в кх миллисекунды завезли?
-
Так включается (в главном конфиге): https://github.com/yandex/ClickHouse/blob/b23a78c8cb27a483399010599e059a46f492fd81/docker/test/stateless/part_log.xmlyandex/ClickHouse
ClickHouse is a free analytic DBMS for big data. Contribute to yandex/ClickHouse development by creating an account on GitHub.
-
Фотошоп? :)
-
-
очевидно же что ваш клиент криво конверитит,
или toString(_completed_at) или clickhouse-client -
так может там поле стринговое и лежит с миллисекундами?
-
ааа
-
прошу прощения, я кривой
-
-
Всем добрый вечер…
А можно как-то склеить массивы, группируя, при этом?
user_id Int32, params Array(Int32)
По 1 пользователю может быть много таких строк… хочу сделать такой такой group by user_id, чтобы получить уникальные user_id, params, где params состоит из всех значений.. Дальше, arrayReduce-ом уникализирую… -
-
-
Это тоже что и groupArray, но с модификатором Array. Про модификаторы - читайте в доке
-
Можно ещё groupUniqArrayArray ;)
-
-
-
привет всем, вопрос по поводу структуры:
есть в таблице 3 поля:
заказ_в_обработке (0/1/-1) | заказ_подтвержден (0/1/-1) | заказ_отменен (0/1/-1)
т.е. закаказ поступил данные будут 1 | 0 | 0
этот же заказ подтвердили, данные будут добавлены: -1 | 1 | 0
чтобы при суммировании этих строк было 0 | 1 | 0
а теперь нужно еще суммы цены заказов посчитать
1) можно по аналогии: цена_заказа_в_обработке | цена_заказа_подтвержденного | цена_заказа_отмененного
2) можно просто одно поле "цена" со значением а при подсчете статистики просто использовать конвтрукцию типа
SUM( IF(заказ_подтвержден=1, цена, 0) ) AS сумма_цен_подтвержденных
как думаете лучше 1 или 2й вариант, при первом варианте, кол-во полей получается +3, просто потом еще появляется сумма доставки, сумма отчислений, ... и на каждое такое доп. поле, надо еще 3 поля.
или все же лучше использовать if не сильно ли он будет замедлять работу на больших данных? -
правда после выполнения
Code: 32. DB::Exception: Attempt to read after eof: while receiving packet from…и хост отваливается очень грустно:
clickhouse-client -h ch810405
ClickHouse client version 18.16.1.
Connecting to ch810405:9000.
Code: 210. DB::NetException: Connection refused (ch810405:9000, 10.0.104.133) -
ойойой, да нехорошо.
-
На простом примере работает:
SELECT groupUniqArrayArray(x)
FROM
(
SELECT arrayJoin([[1, 2, 3], [4, 5, 6]]) AS x
) -
Стектрейс с сервера нужен.
-
-
Так себе как-то. Почему изначально не сделать 1 поле "order_status" и "инкрементить" .
-
-
Неплохо
-
Да, у меня на руках select запрос, который кладёт сервер) Наигрывается 100%
-
Было бы здорово если бы удалось воспроизвести на каком-то небольшом примере.
-
BTW: точно не OOM-killer?
-
инкрементить чтобы знать какое состояние последнее, а при выборке брать максимальный ?
мне кажется этого кх не выдержит, там около 10 тыс в день заказов и в день по каждому заказу раза 3 статус меняется (еще и около миллиона в день хитов) и если надо будет посчитать сумму заказов подтвержденных за 3 месяца, например...
Вариант 1й - там просто суммирование без вычислений, сейчас работает без проблем (но теперь нужно больше данных писать) -
-
-
-
Если и он, то странно, потому что суть запроса, который я делаю такая:
SELECT
dt,
user_id,
groupArrayArray(params)
FROM
(
SELECT
dt,
user_id,
params
FROM table_1
WHERE (dt = yesterday()) AND (user_id = 12345)
UNION ALL
SELECT
dt,
user_id,
params
FROM table_2
WHERE (dt = yesterday()) AND (user_id = 12345)
)
GROUP BY
dt,
user_id -
-
-
т.е. типа:
в обработке = 0
подтвержден = 1
отменен = 2
но у меня вопрос как раз про суммы, т.к. для статусов 3 поля они как есть так и не увеличатся (некритично), а вот разные виды сумм добавляются -
OOM-killer?
dmesg -
-
-
-
ок, спасибо, я тоже об этом думал, тогда добавлю больше колонок
-
В кликхаусе есть так называемые модификаторы аггрегатных функций, один из низ -If. Т.е. можно написать sumIf(amount, state='processed')
-
нет его
-
Значит должен быть stacktrace :P
-
sumIf(amount, state='processed') возможно так будет приемлемо работать. Но я пока в КХ не сильно знаток
-
Это будет делать предрасчеты? или просто синтаксический сахар?
-
Сахар, но хороший :)
-
спасибо буду знать, но тут вопрос скорее в том какие это будет накладные расходные создавать или просто лучше доп. колонки использовать а там в расчетах будет просто SUM() по колонкам
-
-
У вас объемы для КХ смешные. Разве что вы будете эти суммы лет на 100 считать.
-
Так что не парьтесь (пока) накладными расходами. Важно: если у вас заказы в перемешку с другими событиями - то отфильтруйте их сначала - с помощью WHERE (а если заказов по сравнению с остальными событиями мало - то с помощью PREWHERE).
-
может быть, и это радует, но даже смешные по объему базы можно положить "неверной" структурой и соответствующими запросами
-
Это у вас единственная база или есть OLTP?
-
-
-
кх только для агрегации - для аналитики, статистики, но ей пользуются много пользователей.
Ранее для этого использовали mysql там агрегация была, но mysql с какого-то момента с этим не справляется, слишком большие составные индексы (составной индекс почти по всем полям) -
-
-
-
Ребята а где можно еще почитать про странное поведение между версиями 18.14.12 new и old 1.1.542
new:
SELECT max(adId) AS maxAdId
FROM d_events
WHERE date > '2020-01-01'
┌─maxAdId─┐
│ 0 │
└─────────┘
1 rows in set. Elapsed: 0.013 sec.
old:
SELECT max(adId) AS maxAdId
FROM d_events
WHERE date > '2020-01-01'
Ok.
0 rows in set. Elapsed: 0.007 sec.
Теперь всегда выдает резултат 0 если нету данных? -
Ну вот если бы у вас было 10000 заказов в секунду, то я бы посоветовал сделать статус как битовое поле. 1=processed,2=confirmed,4=cancelled. Потом с помощью groupBitOr получить информацию о том в каких статусах побывал заказ. Использование одного (и к тому же небольшого) поля намного эффективнее, а битовые операции намного дешевле чем тот же max.
-
а amountы для каждого заказа - если не меняются то брать один. Если меняются - то и так придется какой-то if делать.
-
SET allow_experimental_low_cardinality_type = 1;
CREATE TABLE test.table1
(
dt Date,
id Int32,
arr Array(LowCardinality(String))
) ENGINE = MergeTree PARTITION BY toMonday(dt)
ORDER BY (dt, id) SETTINGS index_granularity = 8192;
CREATE TABLE test.table2
(
dt Date,
id Int32,
arr Array(LowCardinality(String))
) ENGINE = MergeTree PARTITION BY toMonday(dt)
ORDER BY (dt, id) SETTINGS index_granularity = 8192;
insert into test.table1 (dt, id, arr)
values (toDate(now()), 1, ['aaa']);
insert into test.table2 (dt, id, arr)
values (toDate(now()), 1, ['aaa','bbb','ccc']);
select dt,
id,
groupArrayArray(arr)
from (
select dt, id, arr
from test.table1
where dt = today()
and id = 1
UNION ALL
select dt, id, arr
from test.table2
where dt = today()
and id = 1
)
group by dt, id -
-
А кто в курсе, судьба per-column конфигурируемого сжатия какова? В частности интересует, будет ли delta-compression
-
например, надо посчитать за 3 дня кол-во заказов в обработке и подтвержденных и отменных и еще суммы их цен с соответствующим разделением и еще суммы доствок с соотвествующим разделении.
если под каждый параметр свое поле - просто суумируем по столбцам и сразу убиваем всех зайцев без каких либо накладных расходов (кроме кол-ва колонок) -
Да. Воспроизвелось :) Но это всё-таки experimental и low_cardinality, так что в определенном смысле простительно. :)
-
Да при таких скоростях, всё простительно, если честно)))) Непростительна только самопроизвольная потеря при записи или утечки памяти))))
-
а альтер запросы сейчас все реплицируются?
-
Не все, например FREEZE не реплицируется. В документации вроде всё должно быть.
-
# cat /etc/clickhouse-server/conf.d/empty_result_instead_of_zero.xml
<?xml version="1.0"?>
<yandex>
<profiles>
<default>
<!-- 1.1.54362 We are not ready for aggregating functions to return 0 insted of an empty set -->
<empty_result_for_aggregation_by_empty_set>1</empty_result_for_aggregation_by_empty_set>
</default>
</profiles>
</yandex>
Релиз ClickHouse 1.1.54362, 2018-03-11
Агрегация без GROUP BY по пустому множеству (как например, SELECT count(*) FROM table WHERE 0) теперь возвращает результат из одной строки с нулевыми значениями агрегатных функций, в соответствии со стандартом SQL. Вы можете вернуть старое поведение (возвращать пустой результат), выставив настройку empty_result_for_aggregation_by_empty_set в значение 1. -
Огромное спасибо!
-
-
1.1.54394 самый стейбл
-
-
июнь
-
-
шашечки или ехать
-
-
билдим из мастера и в прод
-
-
-
-
-
-
-
-
жаль что КХ не спарк.
-
-
-
Спасибо за полезную информацию 👍
-
-
-
-
на всех, все ноды КХ независимы и не знаю друг про друга.
можно создать on cluster -
-
в доке вообще много чего не написано
-
Собираю потихоньку это все, хочу сделать PR.
-
-
Скриптом можно )
-
-
Сейчас реализация снова в разработке. Я думаю, можно ожидать в феврале.
-
-
-
Делают больше.
-
Импорт и экспорт данных в protobuf.
-
У протобафа есть огромный недостаток - потребляемая память
-
До 2-3 раз от сообщения
-
Если бы я что-то похожее делал, то смотрел бы в сторону FlatBuffers либо Cap'n Proto (хотя последним не пользовался)
Хех. А Cap'n proto-то уже есть, похоже. Надо мне чаще смотреть в исходники -
Тут все чинно
SELECT *
FROM system.part_log
┌─event_type────┬─event_date─┬──────────event_time─┬─duration_ms─┬─database─┬─table──────────┬─part_name───────────────────────┬─────────rows─┬─size_in_bytes─┬─merged_from─────────────────────────────────────────────────────────────────────────────────────┬─bytes_uncompressed─┬──────read_rows─┬─────read_bytes─┬─error─┬─exception─┐
│ MERGE_PARTS │ 2019-01-11 │ 2019-01-11 11:57:53 │ 43605327 │ default │ graphite201809 │ 20180901_20180930_1_3_2_1143814 │ 243205159999 │ 1187658212930 │ ['20180901_20180930_1_1_0_1143814','20180901_20180930_2_2_1_1143814','20180911_20180911_3_3_0'] │ 34036679123426 │ 34036679124474 │ 34036679124474 │ 0 │ │
│ REMOVE_PART │ 2019-01-11 │ 2019-01-11 12:06:09 │ 0 │ default │ graphite201809 │ 20180901_20180930_1_1_0_1143814 │ 243205128308 │ 1183465936173 │ [] │ 0 │ 0 │ 0 │ 0 │ │
│ REMOVE_PART │ 2019-01-11 │ 2019-01-11 12:06:09 │ 0 │ default │ graphite201809 │ 20180901_20180930_2_2_1_1143814 │ 31691 │ 273323 │ [] │ 0 │ 0 │ 0 │ 0 │ │
│ REMOVE_PART │ 2019-01-11 │ 2019-01-11 12:06:09 │ 0 │ default │ graphite201809 │ 20180911_20180911_3_3_0 │ 8 │ 1018 │ [] │ 0 │ 0 │ 0 │ 0 │ │
└───────────────┴────────────┴─────────────────────┴─────────────┴──────────┴────────────────┴─────────────────────────────────┴──────────────┴───────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────────┴────────────────┴────────────────┴───────┴───────────┘ -
По проекту, protobuf будет выводиться и считываться потоково, без создания временных объектов-сообщений. Иначе есть шанс, что он окажется медленнее, например, CSV.
-
Cap'n'Proto поддерживается только на чтение (импорт) данных. Потому что разработчикам этой фичи, было необходимо только импортировать данные в этом формате.
-
А парсить обратно его можно без потребления дополнительной памяти?
-
Да.
-
Тогда подскажите как, потому что я видимо чего-то не знаю?)
-
Примерно аналогично RowBinary - читаем нужные байты в нужном порядке. Кстати, есть доступные библиотеки, которые тоже позволяют это делать...
-
Ну то есть не средствами самого protobuf?
-
Да, но из protobuf получаем работу с метаданными (дескрипторы сообщений).
-
Ну, если действительно удастся zero-copy и будет документация как ее сделать - тоже хороший вариант
-
Привет все вопрос про engine Kafka
Не записываются данные в конечную таблицу
Создал
1) Kafka engine таблицу
2) таблицу в которую должны сохранить яться данные
3 материализованное представление
Из уточнений
1) Kafka на сервере доступна по dsn xxx-kafka1-xxx.com:9092
2) данные в kafka хранятся в JSON
3) в созданных таблицах не перечислены все поля, которые есть в сообщениях Kafka
Никакой информации, что что-то не работает в Логах clickhouse не появляется( скорее всего я просто не вижу этого)
Был бы рад содействию в решении проблемы.
Спасибо! -
что подразумевается под JSON ? JSONEachRow ?
-
КХ понимает очень ограниченный json тренируйтесь на простых примерах {a:5,b:6}
-
Сообщения в kafka - это json’ы. Разделитель ‘\n
-
КХ не умеет JSON на input https://clickhouse.yandex/docs/en/interfaces/formats/
-
В json есть вложенные структуры с глубиной до 4
-
Но в примере из документации при создании Kafka engine указывается kafka_format = JSONEachRow.
Т.е на сколько я понимаю, Clickhouse принимает json на вход.
Или я что-то неправильно понимаю? -
отлично, КХ не умеет этого.
https://clickhouse.yandex/docs/ru/interfaces/formats/#jsoneachrow -
все правильно.
у вас в одном json сразу множество строк описано? у меня так не заработало. получилось только когда1 сообщение в кафке содержало 1 строку для таблицы -
у меня одно сообщнюение кафки = одной строке clickhouse
-
Точнее должно быть равно одной строке Clickhouse
-
а для чего разделитель \n нужен?
-
Сообщения в кафке разделены через разделитель
-
Возможно вы подскажете, что должно появиться в логах Кликхаус в случае успешного/ неуспешного подключения к Кафке ?
-
-
я у себя замечал некоторые странности с движком кафки. бывало, что данные в конечную таблицу долго не приходили (в течении нескольких минут), а потом появлялись. бывало, что вроде все правильно настроено, но данные снова не доходят. тогда я пересоздавал таблицы, пересоздавал топики, занова наполнял их данными - и получалось. думаю что причина в том что я что-то неправильно делал так как большого опыта не имею. но попробовать все пересоздать могу посоветовать на всякий случай если не появится идей по-лучше
-
Sergey Спасибо!
-
Хотел бы на всякий случай уточнить: Я хотел бы писать толкько несколько полей из JSON сообщений kafka. С этим не должно быть проблем? Или же это реализовано таким образом, что нужно записывать все поля?
-
незнаю, я у себя все пишу. если таблица с движком кафки должна записывать в себя все данные, может можно не писать в результирующую таблицу не указав лишние колонки в мат. вью?
если возможно, то помогло бы увидеть пример сообщения в формате JSONEachRow и Запросы на создание таблиц. У меня как-то не заполнялось из-за того, что я строку забыл как нулейбл при создании таблицы указать, хотя нулы туда слал. -
Sergey {
"hostname": "s2",
"adhash": "{*********}",
"ext": {
"adhash_ext": null,
"****_ext": {
"*****": "***************************************"
},
"****_ext": null,
"keywords": "*******:*****,*******,1111,******:11111"
},
"*******": 604800,
"*******": 0,
"*******": 0,
"****_****": {
"***_***": {
"****_***": {
"6007": 1111111111,
"6014": 1111111111,
"6016": 1111111111,
}
},
"timestamp": "2019-01-11 22:09:49",
"bid_timestamp": "2019-01-11 22:09:49",
"timezone": "-0500",
} -
это грубый пример сообщения, для таблицы в Clickhouse нужно доставать значения из только из первого уровня вложеннности ( например hostname timstamp, bid_timestamp)
-
Это DDL для создания таблиц
CREATE TABLE IF NOT EXISTS kafka_test.queue (
timestamp String,
bid_timestamp String,
hostname String
)
ENGINE = Kafka
SETTINGS
kafka_broker_list = 'localhost:9092',
kafka_topic_list = 'sometopic',
kafka_group_name = 'somwgroupid',
kafka_format = 'JSONEachRow',
kafka_row_delimiter = '\n',
kafka_num_consumers = 1;
CREATE TABLE IF NOT EXISTS kafka_test.topic (
date Date,
bid_date Date,
hostname String
)
ENGINE = MergeTree(date, (date, bid_date, hostname), 8192);
CREATE MATERIALIZED VIEW kafka_test.consumer
TO kafka_test.topic
AS
SELECT toDate(toDateTime(timestamp)) as date, toDate(toDateTime(bid_timestamp)) as bid_date, hostname
FROM kafka_test.queue; -
КХ умеет JSONEacherow, однострочные json, без вложенности
-
так выглядит 1 мессадж в топике кафки? думаю таблица в кликхаусе не в состоянии выбрать только полян на 1 уровне вложенности проигнорировав сложные поля
-
{
"hostname": "s2",
"timestamp": "2019-01-11 22:09:49",
"bid_timestamp": "2019-01-11 22:09:49"
}
вот с таким сообщением она бы наверное справилась -
@snbulgakov Я ожидал, что Кликхаус где-то ругнется, что что-то не так, но в логах девственная чистота
-
Sergey В любом случае спасибо !
-
Незачто. Вы логи тут смотрите: /var/log/clickhouse-server/clickhouse-server.err.log ? файл вообще пустой?
-
Да, конечно тут)
-
- 12 January 2019 (23 messages)
-
Joined.
-
Всем привет)
Не могу побороть ошибку DB::Exception: Cannot read array from text. Больше ничего не пишет
Есть две одинаковые таблицы в clcikHouse, в одной есть некоторые поля String формата ['aa','bb'] в другой эти поля имеют тип Array(String).
Переливаю данные из одной в другую (insert into table target_table select * from table_str)
Какая то часть данных добавляется, массивы заполнены, потом возникает эта ошибка
Нашел пару подобных ошибок в данной группе, но не помогло. Может кто знает все случаи в каких возникает эта ошибка? и как можно отловить строку на которой падает? -
Joined.
-
бот влил бота
-
Возможно, у некоторых записей в этом поле лежит пустая строка?
-
рекурсия
-
Таблица которая со строками заливал spark, все поля обрабатывались
даже каунтами проверил на длину строк -
Ну самый банальный выход, который приходит в голову: insert from select... order by some_date_field limit X. И уменьшайте X, пока не найдете кривую строчку.
-
у меня 80млн))
-
Начните с 30кк :)
-
а он их не рандомно берет?
-
Нет, если сделаете order by
-
И нет строк, у которых длина этого поля = 0?
-
ну кстати как вариант) спасибо
А ещё вопрос, почему
truncate distributed table выдает DB::Exception: Can't proxy this query. Unsupported query type. -
да, нет таких строк
-
и когда ему пустую строку подсовываешь он выдает ошибку то что должно начинаться с '
-
точнее вот эту
DB::Exception: Cannot parse input: expected [ at end of stream.. -
А "селект фром инсерт... лимит 1" проходит?
-
да
-
Вдруг кому пригодится
В одном из полей попалось значение ['кот д'ивуар']
так что надо проверять поля тщательнее)) -
-
Joined.
-
Ох, это больно
- 13 January 2019 (15 messages)
-
-
Joined.
-
Joined.
-
Куда можно задавать тупые вопросы по кх?
-
-
Нормально, что у меня docker-compose build не собирает мастер?
-
-
-
-
-
-
-
-
С clickhouse_driver кто-нибудь работал? У меня на двух последовательных запросах в базу выдает ошибку:
clickhouse_driver.errors.UnknownPacketFromServerError: Code: 100. Unknown packet 4 from server clickhouse:9000
И причем только на одной странице сайта. остальные запросы выполняются штатно -
- 14 January 2019 (179 messages)
-
Внешний словарь может выступать источником для мат.представления? В качестве источника внешнего словаря пробую файл. Мат.представление должно забирать данные из dictionary-таблицы, но не хочет этого делать. Так и должно быть?
-
не может. MV это триггер на инсерт, вычисляется над вставляемым блоком.
-
Понятно. Какие тогда есть варианты перенести данные внешнего словаря в mergetree?
-
Ну, кроме ручного insert 🙂
-
А зачем? это бесмыссленно,словари ведь маленькие и статичные. Один раз можно и инсертом.
-
Суть задачи следующая :есть в Oracle таблица, содержимое которой постоянно меняется. Пускай, раз в час. Была идея забирать эту таблицу через словарь и складывать полученное в mergetree
-
-
есть табличная odbc функция, и есть engine odbc, тупо запросом раз в час insert select.
-
Заметил одну странность - колонку первичного ключа в clickhouse нельзя переключать с Enum16 на Enum8. Я один на такое наткнулся?
-
https://github.com/mymarilyn/clickhouse-driver/issues/69
Нужны примеры запросов и данные на которых это возникаетclickhouse_driver.errors.UnknownPacketFromServerError: Code: 100. Unknown packet XXX from server · Issue #69 · mymarilyn/clickhouse-driverThis error happens for some queries only. File "/usr/local/lib/python3.7/site-packages/clickhouse_driver/client.py", line 137, in execute columnar=columnar File "/usr/loc...
-
Достаточно вместо данных команды, которой создавалась таблица?
-
-
-
-
-
-
-
-
-
Ну самый банальный выход, который приходит в голову: insert from select... order by some_date_field limit X. И уменьшайте X, пока не найдете кривую строчку.
-
Я вот так определял битую строку
Может поможет -
Уменьшал пополам X
-
-
Минимальный максимальный порог по дате которая в выборке с ошибкой например, и весь кусок выгрузить, или внутрь питоновского драйвера залазите, где вычитка из блока, смотрите блок целиком
-
-
Только учтите что в блоках инфа по массивам из колонок будет представлена, а не построчно
-
Плюс посмотрите аналогичный запрос на срр клиенте, возможно у вас старый питоновский клиент и новый сервер кликхауса
-
-
Новый питоновский вряд ли бы бил unexpected packet)
-
Плюс нативный протокол пакеты не убирал насколько я помню
-
Типы пакетов *
-
-
-
Я точно версионность не знаю у того который из пипа, мы форкнулись давно
-
-
-
-
-
Вроде есть функция гистограммы: https://github.com/yandex/ClickHouse/pull/2521 если нормировать, будет дискретная плотность вероятностиCLICKHOUSE-3547 streaming histogram aggregation by ssmike · Pull Request #2521 · yandex/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en
-
-
-
-
-
select * from system.functions
-
-
а ещё есть table_functions и aggregate_function_combinators
-
-
Гараниируется, что там все существующие функции?
-
в документации об этом ничего не сказано. могу предположить, что да, но моё мнение - так себе источник :)
https://clickhouse.yandex/docs/en/operations/system_tables/#system-functions -
джоины и функции это разные вещи
-
а что за "недокументированный джоин"?
-
-
Какие джойны недокументированы?
Собираю все недокументированное. -
-
-
-
Упоминание о cross join нашлось случайно методом озарения на github. Вроде в пулл-реквестах и вроде от августа того года.
-
CROSS JOIN not documented · Issue #2857 · yandex/ClickHouse
Full cartesian product is quite usefull simetimes. It's supported in ClickHouse, but not documented.
-
нашли пример данных и запрос который валится? интересно у нас проверить
-
-
-
Ребята привет! подскажите можно ли сделать кластер и при этом писать только на определенную ноду. Например - есть разрозненные инстансы приложений, которые по разному грузят диск. Если писать в один КХ - то просто IO не справится. При этом в КХ планируется вести дополнительно какой либо справочник для единой точки входа. Или же проще писать в кластер а КХ сам распределит нагрузку?
-
-
-
saved, спасибо.
-
кажется, чтобы распределить нагрузку на запись, нужно шардироваться, чтение осуществлять с distributed таблицы.
причем шардироваться желательно вручную, потому что запись в distributed обладает надежность уровня insert into /dev/null -
-
а chproxy синхронно пишет ?
-
тут как бы основная претензия к distibuted в плане каких либо гарантий это асинхронность
-
# Requests are spread in round-robin + least-loaded fashion among nodes.
# Unreachable and unhealthy nodes are skipped.
ну такое себе. поретраился, два одинаковых блока записал в разные шарды.
я поэтому шардируюсь вручную на клиенте. -
Шардирование для разных приложений может помочь, но я так понял, что у автора проблема с IO. Из-за чего она может быть? Например, из-за вставки значений маленькими пачками в базу. Значит, надо увеличить банч данных для вставки. Значит, нужна какая-то очередь, желательно, распределенная. Подходит Kafka. Если для каждой ноды КХ будет своя Kafka, и эта нода будет читать данные только из своей кафки не сильно часто, но большими пачками, то IO должно справиться. При этом можно писать в любую ноду кафки.
-
-
+1 за то, что вставляют мелкими пачками строк
-
Ничего не вижу странного. Размер данных по сети может быть меньше или больше размера вставки. Разве нет?)) Размер пачки норм. Просто вставка очень интенсивная.
-
-
Joined.
-
-
Коллеги, вопрос - а как лучше/эффективнее сделать 1 большой MV c группировкой по разным полям или разбить на более мелкие?
-
-
А путь к файлу - относительный или абсолютный? Попробуйте абсолютный
-
уже попробовал. Абсолютный — норм, но это странно: просят же относительный.
-
-
Добро пожаловать в Клуб КХ
-
создал materialized view, в логах появилась ошибка
<Error> HTTPHandler: Code: 393, e.displayText() = DB::Exception: There is no query: while pushing to view,
из-за которой ломается инсерт в основную таблицу. что в таком случае можно сделать? -
с абсолютным путём тоже не работает :( Я поторопился с выводами)
-
-
-
-
что-то оно на синтаксис ругается. а есть дока на это?
-
Можно ли группировать по полю типа массив ?
-
Arr: [1, 2], Val: 100, Arr: [1, 3] Val: 125, на выходе 1: 225, 2: 100, 3: 125
-
-
-
шард встал раком: 3 реплики фетчат друг с друга данные и пытаются всё смержить. при этом кликхаус периодически выжирает ооочень много памяти и перестаёт реагировать на что либо кроме "килл -9".
вставку и чтение остановили. но 2 часа никакого прогресса.
куда можно посмотреть? -
а как быстро это будет работать? ) думаю не очень
-
progess по мержам выше 0.1 вообще мало где поднимается.
началось всё с того, что один мерж висел с elapsed 12k+ (заметили незадолго до начала падений). а потом повалила жесть с перекидыванием нагрузки с реплики на реплику, попытками смержить куски и т.п. -
Несколько мелких, меньше строк быстрее селекты, к тому же можно разный order by сделать.
-
1й. массивы быстро работают, парсинг строк медленнее.
-
А какая версия? В changelog надо смотреть, эта фича появилсь полгода назад.
-
очень старая, к сожалению. 1.1.54343. никак не решались обновиться. и теперь стало поздно :(
-
вернет одно из значений, при построении вычисляется хеш, по этому адресу кладется значение, если ключ повторяется то просто перезатирается значение.
-
а если тупо выключить реплики и дождаться конца мержей?
-
Память выжирает мерж?
-
да, выжирает. и выключение реплик не помогает.
-
Уменшите размер макс. кусков, мне однажды пришлось 45гб поставить
-
max_block_size?
-
это max_block_size или какая-то другая переменная?
-
-
-
Смотрите системную таблицу system.mutations
-
-
-
Тогда смотрите в лог КХ. Такое может быть если условие для мутации некоректно задано (команда мутации не проверяет коректность записи условия в WHERE)
-
-
Я на ошибку в условии команды мутации натыкался, вот issue https://github.com/yandex/ClickHouse/issues/2588
Пока в логе КХ не увидел сообщение - так же было непонятно что делать. ИщитеЗацикливание команды удаления · Issue #2588 · yandex/ClickHouseСоздал реплицируемую таблицу (удалёный сервер) Залил туда данные (из обычной MergeTree через INSERT INTO ... SELECT ... примерно 200кк записей) На ноуте а. пробросил порты для Zookeeper и ClickHous...
-
max_bytes_to_merge_at_max_space_in_pool
-
спасибо
-
Разобрался. Ошибок и правда не было, просто мутация вместо того чтобы перетряхнуть только нужную партицию, петеряхнула вхолостую всю базу. В логах было видно, что она берет каждую партицию, клонирует, применяет мутацию, видит что изменений нет, и переходит к следующей. Вот только что оно само таки завершилось.
@ztlpn , является ли это багом? Стоит ли зарепортить? 18.14.11. -
так а условие вообще в where было по которому можно определить что не надо заходить в партицию?
-
Подскажите, никто не знает, есть ли у ClickHouse какие-нибудь настройки, которые распространяются не только на размер партиции, но и на её возраст :)? Например, запретить удалять партиции моложе 3 месяцев.
-
-
нет. а как определить возраст? например для partition by floor(x/13.75)
-
-
Ну для партиций на основе даты 🙂
-
RecordDate >= или там у вас километровая функция была?
-
-
тогда бага
-
Ссылка на опрос 📢Вы теряли данные в Clickhouse?:
https://t.me/QuanBot?start=poll_1047039_94483 -
А это как? Я только что попробовал в директории docker/builder набрать make build и всё Ок.
-
(оффтоп: с десктом версии можно встроенные в клиент опросы, в меню чата/канала)
-
Я из корня мастера делал docker-compose build, может в этом была проблема
-
а откуда может браться такая вот ошибка, после обновления с 18.12.17 на 18.16.1 , при этом реплики и запись все идут нормально
-
2019.01.14 16:26:01.962230 [ 16 ] {} <Error> default.asks (StorageReplicatedMergeTree): DB::StorageReplicatedMergeTree::queue
Task()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() =
No message received, e.what() = No message received -
в error логе
-
-
Вроде не критично , буду ждать апдейт
-
будет ли существенная разница в скорости выполнения запросов (с указанием времени) к таблицам:
1) create table ... (ts Datetime, ...) ... order by ts...
2) create table ... (ts DateTime, ts_hour DateTime DEFAULT toStartOfHour(ts), ...) ... order by ts_hour
и как вообще каноничнее делать?) -
@milovidov_an Добрый вечер, Алексей. Появилась проблема после сбоя кластера, на репликах в логах ошибки вида ClusterProxy::SelectStreamFactory: Local replica of shard 2 is stale (delay: 38806s.) и не отвечают реплики нормально и отваливаются по таймаутам. И delay не сокращается. Как можно и нужно с этим бороться?
-
Ну вроде как круче, когда соседние записи похожи. А у тебя получается разные будут, раз сортировка по ts. Антипаттерн
-
Нужно посмотреть в таблице system.replication_queue информацию по очередям репликации - и там же найти сообщения об ошибках - почему записи в очереди репликации не могут быть обработаны.
-
А можно как-то корректно очистить очередь? Потому что у некоторых записей кол-во попыток репликации оч большое: num_tries: 18444
-
Да, можно форсировать восстановление реплики без разбора очереди. Но сначала нужно разрбраться в причине ошибки. Какую версию ClickHouse вы используете?
-
1.1.54343
а как запустить форсированно? в last_exception записи вида DB::Exception: No active replica has part 201901_1000788_1000793_1 or covering part, e.what() = DB::Exception -
Необходимо обновить на свежую версию.
-
Joined.
-
Данных очень много, по 50Т на репликах. Страшно обновлять, так как много чего уже изменилось, и влучае фатального падения никто нам не поможет) то есть без обновления мы никак кластер не можем привести в порядок? А обновление может нам дать новых проблем? Или обновление с нашей версии до последней не сулит существенных изменений в самой БД?
-
Версии обратно совместимы по данным. То есть, новая версия поддерживает данные старой версии.
Могут быть несовместимости по мелочам. Посмотрите пункты "обратно несовместимые изменения" в changelog. -
Обновление проверяйте в тестинге.
-
а когда будет свежая версия с фиксом https://github.com/yandex/ClickHouse/issues/3891ALTER timeout on ReplicatedMergeTree · Issue #3891 · yandex/ClickHouse
On release 18.16.0, when applying ALTER TABLE ... ADD COLUMN on ReplicatedMergeTree table, ALTER completed on current replica, but other replicas coudn't download and apply ALTER action. On...
-
Сообщение
No active replica has part 201901_1000788_1000793_1
говорит о том, что такой кусок, либо покрывающий кусок, невозможно найти на активных (живых) репликах.
Посмотрите статус других реплик - подняты ли они, принимают ли соединения, есть ли там нужные данные. -
Это ожидается в ближайшей версии (19.0).
-
А есть какието советы по апгрейду кластера? Как лучше обновить все?
-
возможно и чтото потерялось. Но реплики все доступны. Можно ли как-то заставить кликхаус забыть об этом в нашей версии и чтобы он работал в штатном режиме? Потому что num_tries растет и не падает.
-
Устанавливайте новый пакет и перезапускаете реплики.
Сначала проверяйте обновление на тестинге, потом на продакшене. -
Да, можно сбросить очередь, но реплики будут расходиться.
-
а как это сделать?
-
Очистить содержимое ноды queue у реплики в ZooKeeper.
-
А если реплики будут разных версий - то есть какаято обратная совместимость?
-
вдруг данных успеют записаться по новому, и в результате кликхаус не поймет формат
-
Работа реплик сильно разных версий друг с другом не поддерживается. Но ничего плохого при этом не происходит, репликация просто приостанавливается, и продолжается, когда реплики обновятся. Это сделано специально для возможности обновления без даунтайма (реплики перезапускаются по очереди, но в течение небольшого времени).
-
@milovidov_an Спасибо большое, Алексей, за развернутые ответы! Также спасибо за прекрасный продукт! 👍
-
Что-то я совсем не понимаю, что происходит. По отдельности два запроса работают нормально, а если вместе, то плохо. Может быть дело в том, что отправляю я запросы в БД через клиентское приложение (jQuery -> Django -> clickhouse_driver -> clickhouse) асинхронно, драйвер их перенаправляет КХ, а потом не может понять, на какой из запросов пришел ответ? Просто я то же самое сейчас проделал тупо из терминала и ошибок не было. А когда с клиента запросы льются, то либо один отвалится с Code 100: Unknown packet 4 from server clickhouse:9000, либо другой с Code: 102. Unexpected packet from server clickhouse:9000 (expected Pong, got Data).
Если я прав, то дело не в данных, и драйвер должен вести себя некорректно вплоть до падения всего приложения, если асинхронно и примерно одновременно отправлять быстрый и медленный запрос, или два медленных. Например, SELECT histogram(10) FROM (...) CROSS JOIN (...) WHERE на числовых данных и SELECT ... FROM (...) ANY LEFT JOIN (...) на числовых и строковых. И такое должно быть на любых данных. -
-
-
А можно еще вопрос, а после очищения нужно ребутнуть проблемные реплики или полностью зуу? потому что очередь в system.replication_queue не изменилась
-
А еще, очистили очередь, ребутнули реплики, но они все равно растут и не прекращаются. Может чтото нужно еще сделать?
-
Да, надо перезапустить.
-
Спасибо еще раз!
-
Придётся искать причину.
-
привет всем. я правильно понимю. тип таблицы CollapsingMergeTree
сделал ключ
ORDER BY (sipHash64(devtype), CreateDate, PlayerId)
ожидаю что все строки по этому ключу смержатся. откуда дубль взялся и как с ним боротся( -
я что-то неправильно делаю
-
Скорее всего - ошибка в реализации драйвера или в его использовании. Я не работал с этими драйверами и не могу за них поручиться.
-
Да. Меня разработчики здесь как раз выше и просили предоставить запрос и сами данные, на которых валится.
-
https://clickhouse.yandex/docs/ru/operations/table_engines/collapsingmergetree/
CollapsingMergeTree(sign)
При слиянии, для каждой группы идущих подряд одинаковых значений первичного ключа (столбцов, по которым сортируются данные), остаётся не более одной строки со значением столбца sign_column = -1 ("отрицательной строки") и не более одной строки со значением столбца sign_column = 1 ("положительной строки"). То есть - производится схлопывание записей из лога изменений.
....
Существует несколько способов получения полностью "схлопнутых" данных из таблицы типа CollapsingMergeTree:
Написать запрос с GROUP BY и агрегатными функциями, учитывающими знак. Например, чтобы посчитать количество, надо вместо count() написать sum(Sign); чтобы посчитать сумму чего-либо, надо вместо sum(x) написать sum(Sign * x) и т. п., а также добавить HAVING sum(Sign) > 0. Не все величины можно посчитать подобным образом. Например, агрегатные функции min, max не могут быть переписаны.
Если необходимо вынимать данные без агрегации (например, проверить наличие строк, самые новые значения которых удовлетворяют некоторым условиям), можно использовать модификатор FINAL для секции FROM. Это вариант существенно менее эффективен. -
да уже нашел про финал. как всегда недочитал доки.
-
я думал оно сразу мержит. данные просто за 11 месяц
-
некоторые куски не будут смержены никогда, из-за размера например или просто очередь дойдет через пару лет.
-
вот например я вижу 4 парта для 201801 (150 + 33 + 8 + 1) GB
-
Joined.
- 15 January 2019 (147 messages)
-
а каким образом у вас работает "асинхронность в django" ?
-
А уиды кто генерит?
-
Может второй запрос с таким же улетает а дальше банальная проблема в коде и дохнут оба?
-
Хотя нет, первый умереть не должен, это надо постараться )
-
Нарываюсь на Received exception from server (version 18.14.15):
Code: 15. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Column '0' already exists: (while reading from part /var/lib/clickhouse/data/default/nr_views_t8/20160912_20160928_0_0_0_38620/).
при селектах с условиями типа where d>='2018-12-26 21:00:00' and d<'2018-12-27 21:00:00' ... and a_50p_o=0 and a_100p_o=0, где колонки UInt8.
Если убрать правое условие, запрос выполняется.
Если вынести ограничение по дате в prewhere, запрос выполняется
На 18.16.1 то же самое. Таблица была создана как MergeTree, потом переделана в ReplicatedMergeTree
Структура таблицы со временем менялась, но поля из условия были всегда -
Покажите как именно вы реализовали асинхронность. Можно в личку
-
Привет всем!
При перезагрузке сервров КХ кластера с изменеием конфига (таблица ReplicatedGraphiteMergeTree) один сервер успел перемерджить пару кусков по старым правилам, а второй - нет. В результате 2й сервер постоянно пишет checksum mismatch и мерджит 4 куска непрерывно, сбрасывая результаты. Это длится уже около суток. Поможет ли временный останов 2го сенрвера, что бы он не мерджил а скачал потом эти куски ? На какое время сервер должен отстать, что бы стянуть себе с реплики и не мерджить? -
А может на 1ом партицию детач, на 2-ом просто грохнуть ее, и на 1ом снова аттач. Второй просто партицию скачает и все
-
-
такой вариант попробуем через время, если не разрешится само, так как в партишене весь январь, который читается постоянно, надеюсь на
We will download merged part from replica to force byte-identical result. -
Спасибо!
-
@milovidov_an - все же Clickhouse тормозит?
https://www.percona.com/blog/2019/01/14/should-you-use-clickhouse-as-a-main-operational-databaseShould You Use ClickHouse as a Main Operational Database? - Percona Database Performance BlogThere are some cases where with careful planning ClickHouse has value as a main operational database. Alexander Rubin harnesses ClickHouse strengths
-
Товарищи, а у меня пара вопросов по detach/attach
1. в каталоге detached показываются каталоги ignored_* - что c ними по канону надо делать?
2. При attach не все партиции переностятся из тех, что лежали в detached - это нормально? в них, в целом, данных немного, но очень не хотелось бы на них просто забивать -
В аналитической бд. Пытаются получить одно сообщение из 4млрд. Что за бред?
-
-
В метрике примерно также наверное, получают данные для 1 юзера (id), только у них индекс нормальный, а не как там, по created только, ещё и id стринговый. И одна нода всего.
-
На таймсериес различия на порядок два в пользу кх к сожалению, так что все ок
-
Можно и 20 млрд грузануть с индексом только по created, а потом выбирать по стринговой id и говорить что медленно :)
-
но сравнение же все таки приводят в конечном счете с mysql
в любом случае пост явно информирует, что mysql сдает позиции clickhouse, ибо просто так бы не бросались какашками -
Я после селекта по id закрыл
-
Так они и показывают как не надо использовать ch.
Наоборот хорошо. -
Подскажите, плз, можно ли переименовать колонку в существующей таблице?
-
Нет.
-
Можно вот так
-
Всем привет! Один кусок долго мержиться на ноде (данные с system.merges):
elapsed: 11865.068640084
progress: 0.17395293991257757
num_parts: 10
source_part_names: ['201901_1144003_1145634_6','201901_1145635_1145856_3','201901_1145857_1146704_4','201901_1146705_1147837_5','201901_1147838_1148763_4','201901_1148764_1148918_3','201901_1148919_1149297_4','201901_1149298_1149977_5','201901_1149978_1150167_3','201901_1150168_1150371_3']
result_part_name: 201901_1144003_1150371_7
total_size_bytes_compressed: 144000203938
total_size_marks: 131790
bytes_read_uncompressed: 313667301961
rows_read: 1079587421
bytes_written_uncompressed: 359078264525
rows_written: 1079587421
columns_written: 21
memory_usage: 54231811
thread_number: 31
как можно понять, с чем проблема, почему так долго, и что можно сделать чтобы быстрее такое мержилось? -
не уж то никто не встречал?
-
-
Спасибо, супер!
-
У меня как-то и то и то бывает, в кх лежат сырые показы, а в mysql сгруппированные, я их мониторингом мониторю, чтобы сходились. Без сожаления сношу все из detached, если показы сходятся :)
-
К сожалению, сравнивать не с чем
-
Можно создать рядом такую же таблицу, туда аттачнуть эти куски, посмотреть есть ли они в исходной, и если что заинсертить туда
-
-
никто не сталкивался?
-
Покажите запрос создания вьюхи
-
CREATE MATERIALIZED VIEW local.view__broadcasts ON CLUSTER sports ( site String, match_id UInt32, user_type String, event_date Date, views UInt64) ENGINE = ReplicatedSummingMergeTree('/clickhouse/tables/{shard}/view__broadcasts', '{replica}', event_date, (site, match_id), 8192) AS select site, match_id, user_type, event_date, sum(start) as views FROM (select site, path(url) as pt, event_date, argMax(page_id, page_id) as match_id, multiIf(user_is_mobile = 0, 'web-desktop', lower(user_browser_name) LIKE '%view%', 'apps', 'web-mobile') as user_type, count() as start from local.clickstream_new WHERE is_event = 1 AND event_category = 'broadcast' AND event_label = 'click' GROUP BY site, url, user_type, event_date) WHERE match_id > 0 AND user_type IS NOT NULL group by site, match_id, user_type, event_date
-
-
В ClickHouse можно значительно уменьшить накладные расходы от выборки 1-100 строк по ключу, если:
1. Выбирать только нужные колонки вместо *
2. Уменьшить гранулярность индекса (который 8192 все ставят не задумываясь)
3. Уменьшить max_threads до 1
После этих манипуляций становится реально получить до 1-2k qps на сервер на довольно простых селектах -
Если выполнить запрос после AS - отрабатывает?
-
Да, конечно. Таким образом сделал инсерт старых данных – залилось без проблем.
-
Возможно именно у матвью проблемы с запросами с подзапросами. Создавайте issue. А насчёт попробовать заксотылить - попробуйте тут
http://joxi.ru/Q2KGdVKi4V1vb2
всё что в первом FROM - заменить на обращение к обычной view, а уже во вьюхе - запрос с подзапросом. Возможно поможет1547545483484 (179 kb) uploaded January 15, 2019 Joximade using Joxi.net
-
Received exception from server (version 18.6.0):
Code: 49. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Part 20181001_20181031_1_6_2 intersects next part 20181001_20181031_2_2_1_1634300 (state Committed). It is a bug..
0 rows in set. Elapsed: 235265.541 sec.
это уже починили, кто-то знает ? -
это опытным путем найдено или можно в доке найти такие советы?
-
спасибо, заведу issue.
-
Комбинация и того и другого, плюс опыт CloudFlare и разговоров непосредственно с Алексеем Миловидовым :).
-
Куски перекидываются в detached/ignored_* если, если после рестарта сервер не обнаружил записи о них в ZooKeeper. Такие куски могут появляться, если сервер жёстко перезапускали, и он не успел добавить только что вставленные куски в ZK. Так как в этом случае Ack клиенту ещё не был послан, потери данных нет. Ещё возможный случай - если был вставлен батч-дубликат, тогда кусок с этими данными ещё остаётся некоторое время на файловой системе (но не в рабочем наборе). Тут потери данных тоже нет, т.к. данные уже есть в таблице.
То есть в большинстве случаев ignored_ куски можно смело удалять. Автоматически они не удаляются, чтобы кликхаус не снёс вам пол-таблицы, если вы случайно подключились не к тому ZooKeeper. -
Ах, клаудфлер:3
-
По второму вопросу: в detached может лежать набор кусков, некоторые из которых покрывают друг друга. Тогда при attach добавляются только куски "верхнего уровня", а покрытые куски переименовываются в detached/inactive_*, чтобы при повторном аттаче не возникло дублей (ведь покрытые куски содержат часть строк кусков верхнего уровня).
-
В документации нет советов, но про гранулярность индекса там хорошо расписано, про КХ выбирает только нужные колонки (он внезапно поколоночный) тоже. Про max_threads на запрос тоже есть, по умолчанию создается несколько потоков, для простых селектов которые выгребают мало данных это может быть излишне, поэтому уменьшение max_threads в плоть до одного может положительно влиять
-
-
Спасибо! А что делать с теми кусками которые не переместились после attach ?
-
-
Спасибо большое
-
-
-
Они не inactive_* каталоги выглядят как нормальные части партиций
-
-
Добрый день, есть такой вопрос: как можно сделать 2 конфига graphite_rollup для разных таблиц типа GraphiteMergeTree ??
-
что если перед запросом выполнить
set compile_expressions = 0; -
ничего не меняется
-
Давайте посмотрим на примере. Можете скинуть определение таблицы и полный запрос (можно в личку). Надо ещё проверить, влияет ли на ошибку настройка optimize_move_to_prewhere.
-
Мы делали улучшение в этом месте недавно (но я уже не помню, в какой версии). Также вы можете удалить на сервере исходные куски из файловой системы и перезапустить его - тогда он скачает померженный кусок с реплики.
-
Хорошая статья. Кстати, в Метрике есть key-value запросы из ClickHouse для двух сценариев:
- показать профиль посетителя;
- вебвизор. -
1. С ignored можно ничего не делать или удалить. Это куски, которые были помержены в более крупные и ещё не были удалены. При ATTACH используются уже померженные куски, а старые переименовываются в ignored.
-
Joined.
-
пришлось откатиться обратно, теперь работает норм
-
Нет, мы с этим ещё не сталкивались. Для понимания мне понадобится структура таблицы. Используют ли DEFAULT или MATERIALIZED поля внешние словари?
-
кто-нибудь знает должны ли автоматически аттачиться MATERIALIZED VIEW при рестарте ClickHouse сервера?
-
да, там еще и вьюхи есть, но не было времени разбираться на проде =) не ожидал просто такого. попробую сэмулировать на тесте, напишу
-
Если не удалось записать в лог (в том числе, когда закончилось место), то факт об этой ошибке не прокидывается пользователю.
-
Если в разделе с логами закончилось место, а в разделе с данными - нет, то INSERT будут успешно продолжаться.
-
Да.
-
спасибо большое!
-
В докере крутится ClickHouse версии 18.16.1, детачу view, там же делаю service clickhouse-server restart, и ничего не происходит
-
Причины возникновения таких ошибок починили.
Но для старых кусков, ошибка будет присутствовать, если она возникла раньше. При этом есть два варианта: - не обращать внимания на это сообщение; - починить вручную (detach, attach). -
Нет, это не так. В случае работы через clickhouse-client или по родному протоколу, используется одно соединение на сессию. В случае работы по HTTP используется Keep-Alive:
$ curl -v 'http://localhost:8123/' -d 'SELECT 1'
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8123 (#0)
> POST / HTTP/1.1
> Host: localhost:8123
> User-Agent: curl/7.55.1
> Accept: */*
> Content-Length: 8
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 8 out of 8 bytes
< HTTP/1.1 200 OK
< Date: Tue, 15 Jan 2019 13:05:52 GMT
< Connection: Keep-Alive
< Content-Type: text/tab-separated-values; charset=UTF-8
< X-ClickHouse-Server-Display-Name: milovidov-Pro-P30
< Transfer-Encoding: chunked
< Keep-Alive: timeout=3
<
1
* Connection #0 to host localhost left intact -
-
Да.
-
@milovidov_an отлично, а как это можно сделать? положить 2 файлика рядом или в одном описать 2 конфига?
-
В одном конфиге сделать рядом две секции.
И указать имя секции при создании таблицы:
ENGINE = GraphiteMergeTree(config_section) -
@milovidov_an thx a lot :)
-
Кстати, есть фича реквест, по крайней мере уже несколько людей спрашивали. Есть необходимость видеть информацию по активным соединениям, можно сделать запрос SHOW *** + системную таблицу, там информация переданая на хендшейке + время когда соединение установленно.
-
Типа SHOW CONNECTIONS.
(MySQL это показывает сразу в SHOW PROCESSLIST)
Тоже рассматривал такую возможность, но пока не запланировано. -
А какие планы по ближайшим релизам? Видел коммиты по нескольким join в рамках одного запроса
-
Да. Сейчас там прочто счетчик чтоб в метриках показывать количество соединений, но хочется больше информации.
-
@milovidov_an мне бы хоть какую-нибудь идею почему такое может происходить
-
Ближайший релиз планируем в течение двух недель.
-
Вы делаете DETACH TABLE и перезапускаете сервер?
-
да, если под перезапуском понимается рестарт именно службы "service clickhouse-server restart"
-
Спасибо за ответ. Очень ждём join-ы
-
При DETACH TABLE меняется только состояние сервера в оперативке. Он "забывает" про таблицу. В данных на диске ничего не меняется, и при перезапуске, таблицы снова доступны. Я проверил это поведение только что на своей машине. Но не в Docker.
-
я вижу данные на диске, метаданные тоже на месте, я могу выполнить запрос SHOW CREATE, руками приаатачить обратно, но рестарт не дает ожидаемого эффекта ((
-
в логе какие сообщения про эту MV при старте? Может таблица не существует в этот момент? Какая у вас таблица во from у MV ?
-
Посмотрите SELECT uptime(), чтобы было ясно, что сервер был перезапущен.
-
всем привет!
тоже наступил на грабли в виде
<Error> executeQuery: Code: 159, e.displayText() = DB::Exception: Watching task /clickhouse/task_queue/ddl/query-0000000003 is executing longer than distributed_ddl_task_timeout (=180) seconds. There are 3 unfinished hosts (0 of them are currently active), they are going to execute the query in background
спасибо каналу, ответы нашел, исправил
один вопрос
как теперь в zk почистить зависшие таски?
нужно ручками? -
Да, можно удалить их вручную.
-
Алексей, спасибо Вам за ClickHouse ! Заюзали на днях. В шоке от скоростей!
-
да, с uptime какая-то проблема, судя по этому параметру сервер не перезапускается
рестарт выдает мне такой результат
service clickhouse-server restart
Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/
DONE -
может вы перезапускаете КХ в другом контейнере?
-
да он у меня один, именованный, сложно ошибиться
-
вижу там свои view в метаданных
-
ок, что за контейнер у вас? официальный с докер хаб?
что в логе КХ при перезапуске? -
образ официальный
сделала тест, новый контейнер, без бд, без таблиц, при рестарте в логах такое:
<Error> Application: DB::Exception: Cannot lock file /var/lib/clickhouse/status. Another server instance in same directory is already running. -
а, я посмотрел docker file. На самом деле там нельзя так рестартовать КХ.
В обычном линуксе есть init процесс с pid 1 , в этом контейнере pid 1 это КХ, если убить КХ (1) то контейнер умрет. И стартовать КХ назад будет нето чтобы некому, а просто негде.
Поэтому рестарт КХ === рестарт контейнера.
docker restart {container_name_or_id} -
@den_crane @milovidov_an спасибо за помощь
-
-
postgres_fdw вам в помощь
-
Спасибо. Я об этом читал. Но как я понял из описания это работает только как PG <-> PG
-
нет, в частности например вот есть проект https://github.com/Infinidat/infi.clickhouse_fdwInfinidat/infi.clickhouse_fdw
A PostgreSQL foreign data wrapper for ClickHouse. Contribute to Infinidat/infi.clickhouse_fdw development by creating an account on GitHub.
-
Круто! Спасибо!)
-
-
А есть какой-нибудь пример?
-
Нет, просто он делается человеком который сильно знаком с внутренностями PostgreSQL и есть надежда что получится очень хорошо
-
Звучит интересно. А это можно где-нибудь отслеживать (github там) или это внутренний проект?
-
Я думаю что ребята из Percona, как придет время, везде об этом напишут )
-
@milovidov_an спасибо за ответ
-
Еще вопрос
при добавления нового поля в таблицу
и необходимости добавления оного в первычный ключ
схема не изменилась ?
создать новую таблицу , INSERT SELECT ...
или я что то пропустил и достаточно выполнить ALTER ?
движок Replicated -
-
нет, не изменилась.
появилась такая штука
Для таблиц семейства MergeTree появилась возможность указать различный ключ сортировки (ORDER BY) и индекс (PRIMARY KEY). Ключ сортировки может быть длиннее, чем индекс.
но это для сравнения в движках типа summing / aggregating -
можно, работает.
что показывает select * from system.dictionaries where name = ....
и какая версия КХ -
Висит запрос. Версия 18.16.1
-
своппинг? сколько строк в таблице в КХ ?
-
-
спасибо!
-
смотрите в логах
create table x_r(a Int64, d1 Date, d2 Date, v String) Engine = MergeTree order by (a,d1);
insert into x_r values(1,'2019-01-01','2019-01-05','1-01-05'),(1,'2019-01-06','2019-01-15','1-06-15')
cat x_r.xml
<?xml version="1.0"?>
<dictionaries>
<dictionary>
<name>x_r</name>
<source>
<clickhouse>
<host>localhost</host><port>9000</port>
<user>default</user><password/><db>default </db><table>x_r</table>
</clickhouse>
</source>
<lifetime>60</lifetime>
<layout>
<range_hashed/>
</layout>
<structure>
<id>
<name>a</name>
</id>
<range_min>
<name>d1</name>
</range_min>
<range_max>
<name>d2</name>
</range_max>
<attribute>
<name>v</name>
<type>String</type>
<null_value/>
</attribute>
</structure>
</dictionary>
</dictionaries>
SELECT dictGetString('x_r', 'v', toUInt64(1), toDate('2019-01-01')) AS v
┌─v───────┐
│ 1-01-05 │
└─────────┘ -
-
Спасибо за пример. Попробовал, но все равно запрос так же висит. Посмотрю в логах,может чего найду..
<?xml version="1.0"?> - с этой сторокой файл не переварвиается кликхаусом.
вот такой конфиг у меня для таблицы из примера
<yandex>
<dictionaries>
<dictionary>
<name>x_r</name>
<source>
<clickhouse>
<host>localhost</host><port>8123</port>
<user>default</user><password/><db>default</db><table>x_r</table>
</clickhouse>
</source>
<lifetime>60</lifetime>
<layout>
<range_hashed/>
</layout>
<structure>
<id>
<name>a</name>
</id>
<range_min>
<name>d1</name>
</range_min>
<range_max>
<name>d2</name>
</range_max>
<attribute>
<name>v</name>
<type>String</type>
<null_value/>
</attribute>
</structure>
</dictionary>
</dictionaries>
</yandex> -
Спасибо большое. Табличка нереплицированная, аттач в неё и делал. Что между detach и attach?
-
Ничего. Просто DETACH и ATTACH кусков починит эту ошибку.
-
А есть драйвер к базе на каком-либо языке, который поддерживает асинхронность? Или сам протокол синхронный и даже не планируется асинхронность вводить ни в каком виде ни для нативной версии, ни для HTTP? Если я отправлю 2 запроса подряд, то ответ мне придет совсем вперемешку или просто неизвестно, на какой из запросов этот ответ?
-
-
Этот вроде неплохой https://www.npmjs.com/package/clickhousenpm: clickhouse
Client for ClickHouse
-
-
Можешь походить по репам почитать https://clickhouse.yandex/docs/en/interfaces/third-party/client_libraries/
-
-
-
-
-
-
-
-
-
Задача такая: желательно без лишних затрат ресурсов сделать многопоточный асинхронный клиент с обвязкой на питоне. По 3 из 4 требований boost подходит. Осталась только асинхронность. Хочется просто 1 раз на каждый поток соединиться с базой и потом интенсивно дергать селекты из питона. Чтобы они между собой перепугались. На данный момент питоновский драйвер или мешает в кашу всё, или нужно делать синхронную очередь на питоне, что на порядки медленнее будет.
-
-
-
-
-
- 16 January 2019 (162 messages)
-
-
Почему вот такие вещи случаются и как их предвидеть и бороться с ними?
-
-
Ребят, а когда добавляешь новый шард в кластер, распределенную таблицу всегда пересоздавать нужно? А также если партицирование по месяцам PARTITION BY toYYYYMM(date) - то это как влияет на новый шард? Партиции в него не будут просто сохранятся, пока новый месяц не наступит?
-
Протокол синхронный, в планах было про то что его стоило бы переделать на асинхронный, в протоколе есть вещи которых не хватает
-
Нативный при параллельных запросах открывает по новому соединению (там рулятся настройки времени жизни и максимального количества соединений) и держит их в пуле.
-
Я работал, только с гугл клаудом. Небось проблемы со скоростью?
-
Новый бенчмарк от Mark Litwintschik
https://tech.marksblogg.com/billion-nyc-taxi-rides-clickhouse-cluster.html1.1 Billion Taxi Rides: 108-core ClickHouse ClusterBenchmarks & Tips for Big Data, Hadoop, AWS, Google Cloud, PostgreSQL, Spark, Python & More...
-
-
теперь и вас посчитали
-
Да, можно, например, в хедеры добавить время в наносекундах запроса клиента, чтоб хоть как-то понимать, какой запрос какому ответу соответствует, и не ломать обратной совместимости.
-
Каждому запросу можно присвоить свой идентификатор, это есть в протоколе
-
-
yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data. Contribute to yandex/ClickHouse development by creating an account on GitHub.
-
-
серьезное заявление ) а детали какие? например URL запросов?
-
geocode-maps.yandex.ru
-
нет, он же синхронный, открываете соединение и пишите/читаете из него. Соединений может быть много
-
У нас тоже кликхаус какие то данные на yandex отправляет, еще и наши ip из-за трафика заблокировали, но это же их трафик....😱
-
-
Столкнулся с проблемой, есть таблица которая читает кафку и matview которая сбрасывает эту таблицу в mergetree, но сброс данных происходит очень редко, где то раз в 10 минут, хотя stream_flush_interval_ms = 7500 нашел баг https://github.com/yandex/ClickHouse/issues/2508 но он до сих пор open, есть какаой нибудь рабочий workaround что бы обойти эту проблему?High latency when importing stream from kafka · Issue #2508 · yandex/ClickHouse
After created queue kafka table, target table and consume material view, clickhouse kafka docs, Kafka data is imported but with high latency(around 15minutes). Refer to former issue, lower max_bloc...
-
Joined.
-
а в sudo netstat -ptw что пишут?
-
-
стихийно, к сожалению
-
-
-
Добрый день! У меня следующий запрос:
SELECT *
FROM test.candidates_states
WHERE _status_id = 'employment'
AND _status_set_by_id in (
SELECT _member_ids
FROM test.user_team
WHERE _name = 'Total'
)
в _member_ids лежит массив из строк. Как правильно обратиться к этому массиву для проверки на вхождение в него. -
добрый день, есть такой вопрос: возможно в кликхаусе вычивать сообщения из определенных партиций топика кафки, допустим в одну таблицу читать только из 1й и 3й партиции, а в другую таблицу из 2й и 4й
-
таблицу пересоздавать не нужно, только добавить новый шард в xml файл с описанием кластера.
данные начнут писаться сразу, со следующим инстертом. -
только уменьшение max_block_size , теперь его можно поставить для кафки таблицы, емнип.
-
Последний коммит в мастер не виден на основном сайте. Следовательно, обновляется не чаще, чем при релизе
-
SELECT *
FROM test.candidates_states
WHERE _status_id = 'employment'
AND _status_set_by_id in (
SELECT arrayJoin(_member_ids)
FROM test.user_team
WHERE _name = 'Total'
) -
Отлично! Спасибо
-
Joined.
-
Привет, перешел с MySQL на ClickHouse. В секунду выполняется около 500 инсертов и около 200-300 селектов.
В мускуле в конфиге был установлен параметр который отвечает за запись на диск, данные сначала пишутся в память, а потом только на диск.
В CH как я понимаю для этого есть буферные таблицы.
Данные пишу в буфер, а читаю с основной. Но появилась задержка в выборках т.к данные с буфера доходят в основную таблицы через 30-60 сек (в зависимости от настроек буферной таблицы).
Если чтение повесить на буфер, то появляются жуткие тормоза при выборке.
Как я понимаю это из-за того что буфер во время записи блокируется.
Нужно убрать задержки при выборке (сделать realtime) и убрать тормоза при выполнении запросов выборки.
Как быть? -
В аналитике сутки это уже риалтайм, минута ничто.
-
можно чуть изменить сервис который пишет, что бы писал чуть по реже сразу в таблицу основную
-
не согласен
-
Нет возможности уменьшить кол-во инсертов. Запросы идут от других сервисов.
В мускуле всё работает хорошо, в кх решил перейти из-за больших объёмов данных которые с каждым днём растут.
А тут такая проблема, думаю её можно как-то решить? -
Типа у вас и словари обновляются раз в секунду и Кафка и 100500 других источников и ETL и все быстрее 1 мин?
-
У меня не совсем аналитика, логи храню.
-
я не про словари, а про формулировку, что в аналитике пофиг на актуальность данных.
когда зависят большие деньги, то не пофиг -
Согласен абсолютно. Я тоже хочу все и сразу согласен взять купюрами даже по 10 долларов.
-
Хммм я на совсем несильном железе пишу «логи» из JMeter напрямую в таблицу, 1000+ инсертов сек, но я их пакетами отправляю штук по 100, сжимаю (средствами библиотеки) и на стороне сервера использую chproxy, попробуйте может что из этого поможет
-
Может попробовать в буферной таблице сделать запись каждую секунду?
Таким образом будут собираться пачки по ~500 запросов и залетать на диск -
Всем привет!
Подскажите плиз, кто нить завел MS SISS c CH для перекачки данных из MS SQL -
Привет.
На ежедневной основе нужно будет перегружать несколько партиций данных с PostgreSQL в CH.
Есть следующий вариант:
1) Используя COPY postgres'a сгенерировать нужную CSV'шку.
2) Дропнуть нужные партиции (опять же вопрос как лучше? DROP PARTITION или DETACH с дальнейшим удалением файлов партиции)
3) Загрузить данные в CH командой типа: cat data.csv | clickhouse-client --query="INSERT INTO table FORMAT CSV"
Есть ли еще какие-нибудь хорошие варианты реализации этого? -
Табличная функция odbc
-
Можно немного подробнее?
-
-
Подскажите, почему постоянно падает?
-
-
восстанавливается периодически минут через 10
-
Oom убивает? Сколько памяти у сервера?
-
-
бывают перегрузки
-
У вас 2 гига??? У кликхауза кеш марков 5г по умолчанию. Надо памяти больше и свопа и настроить кх.
-
окей спасибо
-
какой вообще минимум по оперативке? На 8г можно завести?
-
Joined.
-
В тестах работало на 4, но всякие кеши резал
-
ClickHouse никак не взаимодействует с серверами Яндекса. Разве что, если вы настроили HTTP или executable словари, которые туда идут.
Проверьте конфигурацию, а также всё, что происходит на ваших серверах. -
а есть публичные словари?
-
марки - это что?
-
типа засечки, где искать то или иное значение ключа, по которому упорядочены данные.
-
-
Добрый день.
Есть ли тут кто-то, кто использует плагин Clickhouse для Grafana? Конкретно меня интересует работа табличной функции merge() внутри данного плагина. На данный момент я вижу, что если использовать GROUP BY внутри запроса с FROM merge(...), то данные не агрегируются и графики строятся не верные.
Кто-нибудь сталкивался с такой проблемой? -
-
Попробуйте откатиться на версию плагина 1.4.3.
-
к сожалению, не помогло
-
Joined.
-
Здравствуйте, можно ли отключить запись логов в таблицу system.query_thread_log? логируются все по умолчанию
-
-
Публичного geoip словаря от Яндекса нет.
-
Да, настройка log_query_threads, прописывается в users.xml для профиля пользователя.
-
Привет!
-
Можно ли задать FINAL для последней (для указанной) партиции?
-
В запросе SELECT нет возможности задавать FINAL для отдельных партиций.
А в запросе OPTIMIZE можно указать какую угодно партицию. -
Исторические данные оптимизируем, а вот в последний месяц данные идут постоянно
Требуется получить данные за N лет. С FINAL это работает долго. Без FINAL данные за последний месяц приходят искаженными (нужны точные результаты) -
Таким образом было бы очень удобно указать FINAL и партицию, чтобы ускорить запрос
-
Это реализуемо? Имеет ли смысл попататься сделать PULL REQUEST с добавлением этой возможности или проще разделить запрос на отдельных?
-
А есть тут кто-нибудь, у кого ClickHouse бегает на Azure?
-
а какая разница на каких виртуалках он бегает?
-
у них же вроде нет кх as service
-
Огромная. Разное железо, разная виртуализация, разный storage
-
Это реализуемо. Не сразу ясно, как выглядело бы удобное решение. Ведь указывать одну партицию - тоже не исчерпывающий вариант.
PS. Я вообще не люблю использовать FINAL в SELECT. -
У них есть просто аналог EC2
-
ну мне кажется особой разницы нет , там по сути просто цпу память диски, нынче все на хардваре виртуализации, так что не сказать чтобы были сильные разлиция в перфомансе.
-
К сожалению периодически приходят дублирующиеся данные (испоьзуется replacingMergeTree)
-
я гонял много виртуалок в азуре когда давали на тест деньги , никакой разницы с дигитал ошен, ец2 или хетзнер клауд не заметил
-
вообще давно не помню какой то специфики в хардварно виртуализированных впсках
-
Вернее обноленные данные
-
Ну, скажем, у них есть сейчас инстансы на AMD Epic, есть на Intel Broadway, и другие. Номенклатура сильно отличается от Амазона и большинства хостингов.
-
ну у меня сейчас много на эпиках , тоже специфики не заметил , в прошлом году много перевел на них в силу очень много ядер за очень дешево , в квм и lxc отличий не было
-
за последние лет 10 смены интеловых процов , траблы были только с одной волной процов где тупо висло ядро с патчами для openvz
-
Меня в меньшей степени траблы интересуют, в большей — сравнение производительнсти и опыт эксплуатации ClickHouse в Azure. На Амазоне много кто хостится, а на Azure почему-то нет. Почему?
-
может кто сталкивался с билдом КХ на OS X
FAILED: contrib/librdkafka-cmake/CMakeFiles/rdkafka.dir/__/librdkafka/src/crc32c.c.o
/usr/local/bin/gcc-8 -DUNALIGNED_OK -DWITH_GZFILEOP -DX86_64 -DZLIB_COMPAT -I../contrib/zlib-ng -Icontrib/zlib-ng -isystem ../contrib/ssl/include -isystem ../contrib/librdkafka-cmake/include -isystem ../contrib/librdkafka/src -fdiagnostics-color=always -msse4.1 -msse4.2 -mpopcnt -fno-omit-frame-pointer -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-result -Wno-deprecated-declarations -Wno-maybe-uninitialized -Wno-format -Wno-misleading-indentation -Wno-stringop-overflow -Wno-implicit-function-declaration -Wno-return-type -Wno-array-bounds -Wno-bool-compare -Wno-int-conversion -Wno-switch -O2 -g -DNDEBUG -O3 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -MD -MT contrib/librdkafka-cmake/CMakeFiles/rdkafka.dir/__/librdkafka/src/crc32c.c.o -MF contrib/librdkafka-cmake/CMakeFiles/rdkafka.dir/__/librdkafka/src/crc32c.c.o.d -o contrib/librdkafka-cmake/CMakeFiles/rdkafka.dir/__/librdkafka/src/crc32c.c.o -c ../contrib/librdkafka/src/crc32c.c
In file included from ../contrib/librdkafka/src/rd.h:51,
from ../contrib/librdkafka/src/crc32c.c:48:
../contrib/librdkafka/src/tinycthread.h:36:10: fatal error: threads.h: No such file or directory
#include <threads.h>
^~~~~~~~~~~
compilation terminated. -
-
спасибо!
-
потому что у амазона самая большая доля на рынке облаков + он очень старый + он более линуксоориентирован а азуре более виндо ориентирован + у аамазона на порядок больше as service вещей где только больше плати и меньше думай
-
Должно быть отключено по-умолчанию на Mac OS?
-
-
-
Нет, ещё есть несколько мелких исправлений, которые только в master.
-
-
-
> И соответственно нормальные JOIN table ON вместо подзапросов.
Уже есть.
> И множественные JOIN. Может я что-то пропустил, но в планах не увидел
А это ещё будет.
> А предполагается какой-нить аналог CTE запросок через WITH в будущем?
А вот CTE пока не планируются. -
Дело было в порте. Надо указывать там порт, который слушает сервер по tcp. (9000)
-
Понял. Спасибо. А можно ссылку на доку по JOIN table ON
-
Просто пишите JOIN с секцией ON как ожидается.
-
-
А как обходить на CH проблему с Memory Limit? Если делать JOIN с подзапросом, то все ок, если прямым - начинает падать по памяти.
-
Товарищи, в последнем релизе есть поддержка hdfs import/export
Пытаюсь потестить, но он заявляет:
StorageHDFS write is not supported yet
Может что нужно в конфиге изменить? -
Лучше всё-таки с подзапросом.
-
В последнем релизе только чтение.
-
Похоже, что скорее накодить поддержку write :)
-
-
Это-то понятно) Но иногда это не очень удобно. Есть какие-нить workaround? Распределенные запросы? Или какие-нить еще варианты
-
Настройка enable_optimize_predicate_expression должна была бы помогать для этого случая, но я сейчас не рекомендую её использовать,
-
-
-
-
Можно. Также как для атрибутов тип указывайте. Если тип не указан используется date для совместимости со старыми версиями.
-
текущий запрос для одного товара
https://pastebin.com/vRkzPKVkSELECT createdAt, prodlevid, productName, specification, vendor, mainCategory, s - Pastebin.comPastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
-
Два запроса и соединить union all.
-
-
-
Я не вам отвечал. И на другой вопрос. Just in case.
-
-
Да, нашел в исходниках, в тестах такое:
<range_min>
<name>StartDate</name>
{range_hashed_range_type}
</range_min>
прописал у себя вот так
<range_min>
<name>start</name>
UInt32
</range_min>
но все равно он исползует тип Date.
При создании таблицы на этот словарь ругается, что start с типом Date -
<type>UInt32</type>
-
-
Joined.
-
Пока так и делаем
-
когда используешь MySql Engine и пишешь WHERE field IN ('aaaa') кликхаус преобразует в WHERE field IN 'aaaa' и соответственно запрос падает с ошибкой
если IN ('aaaa', 'bbbb') все ок -
не понятно зачем убирать скобки в любом случае
видимо в коде написано при парсинге запроса, если один элемент, то скобки не ставятся -
Это по-дурацки, я посмотрю в код.
-
спасибо
-
Спасибо, я понял, в чем было дело!
Сперва, я так и назвал типы, но сервер не запускался, а все из-за того, что у меня была таблица на этот словарь, у которой структура отличается от новой версии словаря...
Надо внимательней логи читать... -
Joined.
-
Подскажите плиз, FINAL для ReplacingMergeTree будет работать или только для CollapsingMergeTree?
-
Будет.
-
спасибо
-
-
Кто может подсказать как победить проблему в кх кластере, когда рандомные запросы начинают падать с такой ошибкой
<Error> ServerErrorHandler: Code: 210, e.displayText() = DB::NetException: Connection reset by peer: while reading from socket (x.x.x.x:47758), e.what() = DB::NetException, Stack trace:
и дальше небольшой не информативный трейс
где x.x.x.x это айпишник какого нибудь из шардов соседей
канал не забит, ресурсы на сервере целые, одновременно с этим падением в системе обрабатываются запросы за эти же даты без ошибок -
рестарт запроса тоже проходит без каких либо ошибок
-
Имеет смысл посмотреть график потерь пакетов между серверами. Получить его не очень удобно. Один способ - считать дельту счётчика tcp_retransmits. Где-то тут: cat /proc/net/netstat. Но значения могут быть наведёнными, если идут обращения к посторонним недоступным серверам.
Второй вариант - снимать метрики количества ошибок с сетевого оборудования.
Третий вариант - посмотреть с помощью утилиты mtr.
Кстати, какая версия ClickHouse, не слишком ли старая? -
И конечно, посмотрите лог на сервере ClickHouse, который сделал Connection reset by peer.
-
проблемы по сети проверили первым делом, есть небольшой хендшейк по tcp который совпадет по времени, но это уже следствие.
ClickHouse server version 18.14.15 revision 54409.
на сервере который резет бай пир
{be99b680-1979-11e9-a208-d9862abc84cd} <Error> executeQuery: Code: 394, e.displayText() = DB::Exception: Query was cancelled, e.what() = DB::Exception (from 127.0.0.1:37724) (in query: XXX), Stack trace:
.
.
.
<Error> ServerErrorHandler: Code: 210, e.displayText() = DB::NetException: Connection reset by peer: while reading from socket (10.2.0.137:45964), e.what() = DB::NetException, Stack trace: -
https://pastebin.com/C3FXxbWj
полный лог для отвалившегося запроса с этого сервера -
А на сервере 10.2.0.137 (который peer)?
-
это именно с него и лог
-
сейчас сделаю пасту с сервера который инициировал запрос. Может еще важная инфа - запросы идут через Distributed таблицы которые смотрят на ReplicatedMergeTree
-
вот паста на сервере который запрос выполнял - https://pastebin.com/pv2DCNi7
-
аналогичный еррор лог на всех шардах которые участвовали в запросе(только что догадался проверить), то есть если бы не паралельные большие запросы все выглядит так как будто 137 по сети отваливается, за исключением 394 кода на нем
-
executeQuery: Code: 394, e.displayText() = DB::Exception: Query was cancelled, e.what() = DB::Exception (from 127.0.0.1:37724)
это начала всей цепоки умирания запроса -
на драйвер тоже сначала грешили, но один раз словили тоже самое обычным консольным клиентом
-
повторить почти нереально, в среднем 1 запрос в 4 дня появляется
-
Когда в процессе выполнения распределённого запроса, с одного сервера приходит ошибка, то на все остальные серверы отправляется пакет cancel - просьба прекратить выполнение (что видно по сообщению Query was cancelled).
-
Ага, то есть 137 это может быть и не виновник, а виновник какая то другая нода которая его прислала? Просто 394 только на одном сервере(137)
-
Мне тогда надо время ещё раз все логи за это время со всех нод перешерстить, спасибо за наводку!
- 17 January 2019 (159 messages)
-
лучше с подзапросом, потому что не доделано примерно все, не только enable_optimize_predicate_expression
select *
from (select 1 a) any left outer join (select 2 b) on (a=b)
where b = 1
┌─a─┬─b─┐
│ 1 │ 1 │
└───┴───┘
проталкивание не сделано для правой таблицы
set enable_optimize_predicate_expression = 1;
select 1 from (select '666' lp_name) left outer join dim_lp using(lp_name) where lp_key=666;
Elapsed: 6.085 sec. Processed 11.65 million rows
select 1 from (select '666' lp_name) left outer join (select * from dim_lp where lp_key=666) using(lp_name);
Elapsed: 0.080 sec. Processed 65.54 thousand rows
И возможно это хорошо. В секции where пишутся пост-джойн предикаты, джойн (и пре-джойн) пишутся с секции on.
т.е. проталкивать нельзя как минимум предикаты по которым джойнится.
пре-джойн предикаты on (t1.x = 5 and t1.id=t2.id) тоже не работают. -
т.е. при
select 1 from t left outer join s on (t.id=s.id) where s.id is null
where s.id это поле проекции t_s а не таблицы s
поэтому результат отличается от
select 1 from t left outer join s on (t.id=s.id and s.id is null) -
-
Добрый день. Подскажите, пожалуйста, по работе distributed-таблиц.
Есть три шарда, на каждом создана база DB и таблицы dist_T1(Distributed), T1(MergeTree). Запись и чтение идет через dist_T1. При записи все отрабатывает корректно, данные разбиваются согласно ключу шардирования. Но при чтении не идет склейка данных, а идет запрос на один из трех шардов.
Создавалась таблица запросом:
CREATE TABLE db.dist_t1 AS db.t1
ENGINE = Distributed(db_replica, db, t1, sipHash64(name))
Почему чтение из Distributed-таблицы не склеивает данные? Из-за того, что через нее производится одновременно чтение/запись или ошибка настроек:
<db_replica>
<shard>
<default_database>db</default_database>
<host>192.168.0.1</host>
<port>9000</port>
</shard>
<shard>
<default_database>db</default_database>
<host>192.168.0.2</host>
<port>9000</port>
</shard>
<shard>
<default_database>db</default_database>
<host>192.168.0.3</host>
<port>9000</port>
</shard>
</db_replica> -
-
причина - реплика из одного шарда была переделана на 3 шарда без реплицирования и при этом не была переименована.
-
не, сертификат там нужен. Разобрался. Добавил проверку сервера по сертификату, надо запулить в репу.
-
Приветствую. Не подскажите, где то встречал нюанс, что в select при where необходимо писать поля с учётом сортировки при создании таблиц. Т.е. если в создании order (client,datetime). То select * from table where client = 1 and datetime = y. Если в where колонки поменять местами , то результаты могут отличаться?) Так ли это и если да, то почему?)
-
Joined.
-
Почему КХ может отдавать пустые поля в селекте? Вручную проверил: пустых полей в таблице нет.
Запрос такой:
SELECT
sector,
countIf(x<y) as profitable,
countIf(x>=y) as unprofitable
FROM (
SELECT
ticker,
argMin(date, low) AS x,
argMax(date, high) AS y
FROM quotes.stocks
WHERE low!=0
GROUP BY ticker
) ANY LEFT JOIN
(
SELECT
ticker,
sector
FROM quotes.stock_info
WHERE sector!=''
) USING ticker
GROUP BY sector -
-
А как вы проверяли что пустое? Попробуйте length и lengthUTF8 посчитать
-
-
-
-
Joined.
-
а если селекты в джойне местами поменять -- результат ведь изменится? и будет ли тогда пустой сектор вылезать?
-
Так если у вас для таблицы stocks по ключу ticker не будет найдена запись в stock_info - значит в поле из join будет пустая строка
-
Если бы колонка была nullable - был бы null
-
-
добрый день
подскажите, пожалуйста, как правильно произносить названия этих функций?
LAG/LEAD
Лаг/Лед? -
Нет, порядок условий в WHERE (для операторов and, or) совершенно не важен.
-
-
да, как раз пошла с ним поговрить))
но он же с обывательской точки зрения переводит
а мне хотелось - с програмистской)) -
У меня на ажуре кх, просто в виртуалке бежит. Данных не много так что по перфомансу подсказать не смогу.
-
Joined.
-
Всем привет
у меня есть табличка с движком GraphiteMergeTree я кидаю каждую секунду в нее метрики
┌─metric─ ────────┬─value┬──timestamp─┬───────date─┬────updated─┐
│ main.dev.metric │ 24 │ 1547728662 │ 2019-01-17 │ 1547728662 │
│ main.dev.metric │ 22 │ 1547728662 │ 2019-01-17 │ 1547728662 │
│ main.dev.metric │ 17 │ 1547728662 │ 2019-01-17 │ 1547728662 │
│ main.dev.metric │ 7 │ 1547728662 │ 2019-01-17 │ 1547728662 │
│ main.dev.metric │ 4 │ 1547728662 │ 2019-01-17 │ 1547728662 │
...
graphite_rollup выглядит следующим образом:
<yandex>
<graphite_rollup>
<default>
<function>avg</function>
<retention>
<age>0</age>
<precision>60</precision>
</retention>
</default>
</graphite_rollup>
</yandex>
Как движок должен прореживать данные, должно ли у меня уменьшиться количество строк в таблице после прореживания и можно ли его (прореживание) запустить руками, если да, то как??
спасибо -
Всем привет! Кто знает, почему так может быть, кластер состоит из 5 шардов по 3 реплики, и когда идет много чтения (читаем через Distributed-таблицы), то обычно нагружается в потолок одна реплика только из трех, с чем это вызвано и как это можно забалансить между всеми репликами? Данные читаются те, которые уже есть на всех репликах, то есть не только что прибывшие
-
А также было заметно, что одна реплика когда в большом нагрузе и не отвечает - запросы вообще перестают работать. Как сделать реплики отказоустойчивыми и сбалансированными на чтения?
-
Сам по себе упал кликхаус сервер, в логах ошибка
2019.01.17 16:13:51.896733 [ 1 ] {} <Error> Application: Access to file denied: /var/lib/clickhouse/data/master/users_notifications_hide/tmp_delete_201901_124_4608_4368/key.mrk
Что делать? -
Ну либо диск отвалился либо прав нет
-
Вы хотите что бы много одновременных запросов ходили в разные реплики? Или чтобы один запрос выполнялся тремя (это трудно)?
-
Много запросов? Или один?
-
Хотя бы первое, да
-
много запросов
-
Жаль конечно что это чат, уже 180 раз это обсуждали
-
Да, но читать нереально все :(
-
chproxy размажет запросы по разным репликам равмномерно
-
кто-то вроде какой-то FAQ собирался делать
-
-
haproxy юзается. Но все равно реплика одна в потолке всегда от шарда
-
Так владелец рут а кликхаус
-
-
-
Хм, а как он сам мог поменяться?
-
Если запросов много оно и так через дистрибьютед же размажется
-
Ну он не сам, а вы поменяли
-
-
ну только в рамках одного кластера (все первые реплики допустим)
-
нет, я сутки на сервер не заходил.
-
Магии не бывает
-
Если неправильно настроен лоад балансинг в кх , то не будет
-
это да, верно
-
Подскажите, нужно такую команду выполнить?
chown -R clickhouse:clickhouse /var/lib/clickhouse/* -
а дефолтный load_balancing=random это неправильный балансинг уже? То есть этого не достаточно?
-
-
-
HAVING ? не?
-
можно сделать ддл запрос ON CLUSTER и все само найдется
-
в новой версии вроде как пофиксили и можно с не мастера запускать но сам не проверял
-
18.16.1 новая
-
GROUP BY date, value
HAVING date<argMin(date, value)
Так не сработало -
Joined.
-
Ребята привет 👋
-
а чего написало? вообще странное какое-то сочетание group by и having
-
-
-
Кликхаус на центос сложно ставить?
-
я вот на Эльбрус не смог :~)
-
У меня обычный Интел )
-
Это извращенство
-
минуту
-
ты просто завидуешь :)
-
нет. Altinity уже даже пакеты собрали.
-
У меня сейчас куча трейдов в тысяче мускульных таблиц. Целесообразно для выборок все перегнать в кликхаус ?
-
В одну таблицу
-
-
-
Ts, price, volume, action
-
Это стандартные поля в каждой таблице
-
заполмни два правила про бигдату:
1. никаких джойнов
2. максимальная денормализация
3. никаких апдейтов
4. это не OLAP
^) -
-
1. Джойны не нужны
2. Денормал есть
3. Апдейтов нет, пополнение раз в 5 минут надо -
апдейтов в бигдате нету, есть новая версия данных, с этим лучше смирится
-
Извини. Перепутал. Нет апов
-
есть еще промежуточные версии данных.
-
Просто пополнение
-
а что мешало ?
-
А места много надо ?
-
Если например в мускуле все таблицы гиг
-
жмутся данные хорошо если не бинарные будут силньо меньше чем в мускуле занимать
-
Там децималы да сэт
-
компилятор там древний как говно мамонта, 4.8, а чтобы собрать gcc-7 из сырцов они зажали machine description файлы :(
-
тяжела работа в госкомпаниях )
-
нифига, я в интригаторе работаю :)
-
Всем привет! А есть знатоки по ch proxy? У нас проблемка. Подняли ch proxy, делаем через наш http клиент в него запрос, а КХ ругается ошибкой:
DB::Exception: Unknown setting no_cache, e.what() = DB::Exception
. Query: show tables' -
А если выполнить запрос без ch proxy - всё хорошо?
-
ага
-
-
-
это правильный для каких-то случаев.
запрос приходит на одну из нод - инициатор
инициатор смотрит у себя в описание кластера
понимает что у данных три реплики, при random посылает запрос рандомно выбрав одну из
собирает результат -
спасибо
-
Привет! Это я что-то не так делаю, или это баг?
CREATE TABLE t (d Date, z UInt32) ENGINE = MergeTree(d, (z), 1)
WITH (d < '2018-01-01') AND (d < '2018-01-02') AS x
SELECT 1
FROM t
WHERE x
Received exception from server (version 18.12.14):
Code: 1001. DB::Exception: Received from 127.0.0.1:9000. DB::Exception: std::bad_typeid.
Запрос валится только если условие вынесено в WITH и только если оно несколько раз трогает колонку d. И только если d не входит в первичный ключ. -
-
-
csv как лучше отправлять, файлом или по строчно?
-
всегда кучей. не забудь, что есть ограничение на количество инсертов в секунду
-
да уперся видимо в него уже (
-
ну и кстати говоря BULK/ARRAY DML завсегда и везде во всех БД привествуются
-
-
-
я правильнно понимаю, что не используемые данные можно вынести на другой сервер, а для экономии памяти на рабочем хранить только актуальные за определенный срок данные?
-
да, вполне хорошая идея, как по мне
-
-
Насколько я знаю, кортежи нет
-
-
Каждый insert это тяжелая операция с созданием нового парта (файла), потом их надо мержить, поэтому bulk лучше. Но нельзя вставить сразу миллиард особенно в широкую таблицу одним куском -- не хватит памяти, поэтому по умолчанию инсерт будет разбит на блоки по миллиону строк. Если у вас мало памяти вы можете уменьшить max_insert_block_size например до 100тыс. (параметр clickhouse-client).
-
Спасибо!!
-
cat ...|clickhouse-client -q 'insert into tttt format JSONEachRow'
jsoneachrow особый упрощенный формат -
Кто-нибудь сталкивался с ошибкой вида:
ZooKeeper session has been expired.: while pushing to view ...
Интересует, что произойдет тогда с данными? Они не вставятся никуда? Вставятся только в основную таблицу? Вставятся только в таблицы мат вьюшек?
Может кто-то знает как это лечиться? -
Нашел issue на эту тему: https://github.com/yandex/ClickHouse/issues/2621
Только не очень понятно, где конфигурировать параметры таймаутов зоокипера, в confix.xml ветке zookeeper?[MV] неполные данные · Issue #2621 · yandex/ClickHouseверсия: 1.1.54385 ZK: 3.5.2 после обновления - появилось расхождение между таблицей и MV: проверочный запрос: SELECT date, h, shows1, shows2 FROM (SELECT date, toHour(timestamp) as h, sum(ev_type =...
-
Ага, пример конфига зоокипера в исходниках есть. Можно попытаться поиграться с таймаутами.
<zookeeper>
<node>
<host>example1</host>
<port>2181</port>
</node>
<node>
<host>example2</host>
<port>2181</port>
</node>
<session_timeout_ms>30000</session_timeout_ms>
<operation_timeout_ms>10000</operation_timeout_ms>
<!-- Optional. Chroot suffix. Should exist. -->
<root>/path/to/zookeeper/node</root>
<!-- Optional. Zookeeper digest ACL string. -->
<identity>user:password</identity>
</zookeeper> -
В большинстве случаев вставка прошла в таблицу и во все вью у которых имя меньше в лексографическом порядке. Т.е. все предыщие вставки прошли. Но поведение зависит от настройки про параллельную заливку во вью. Сама ошибка никак не связана с таблицей и вью. Чините зукипер, сеть, железо, кол-во транзакций в зукипере порождаемое вставкой (маленькие блоки/много партиций).
-
Существует какой-то способ организовать словарь с составным ключём, но без склейки?….
В основной таблице у меня есть события
дата, пользователь, город, всякие колонки
Я знаю, что активность зависит от погоды. Думаю отыграть словарём с температурой в городах… Типа дата, город, температура..
Ключ у меня дата город… Городить строку вида dt + ‘_’ + city_id не хочется -
-
git clone и вперёд
-
-
-
complex* словари позволяют таплы в ключах.
Точнее они именно для этого. -
спасибо. Почитаю, что найду
-
-
-
Добрый вечер
Если колонка типа String ,в которой содержится дата 26.10.2018
Как преобразовать к типу Date?
Если использовать toDate возвращает 0000-00-00 -
Разобрать substring потом склеить конкатенацией.
-
спасибо,думал есть стандартные средства конверта
-
-
-
Задача: Необходимо из таблицы в формате (name, date, value) для всех одинаковых name вытащить локальный максимум левее глобального минимума, если функция в целом возрастающая (глобальный минимум находится левее глобального максимума).
Что я делал:
1) Для начала - примерный запрос, который разберем по частям
SELECT
name,
prevMax
FROM
(
SELECT
name,
argMax(date, value) as prevMax
FROM db.mytable
WHERE date<x
GROUP BY name
)
INNER JOIN
(
SELECT
name,
argMin(date, value) AS x,
argMax(date, value) AS y
FROM db.mytable
GROUP BY name
HAVING x<y
) USING name
2) Для начала надо составить временную таблицу глобальных экстремумов, где минимум левее максимума. Это делается запросом
SELECT
name,
argMin(date, value) AS x,
argMax(date, value) AS y
FROM db.mytable
WHERE value!=0
GROUP BY name
HAVING x<y
3) Дальше по идее мне надо снова пройтись по таблице, но применяя условие, полученное из второй таблицы. Поэтому использую INNER JOIN
4) Выставляю условие, что ищем левее минимума WHERE date<x и выводим дату максимума
SELECT
name,
argMax(date, value) as prevMax
Проблема в том, что date<x делать нельзя, так как левый запрос ничего не знает о правом.
Any suggestions? -
-
-
а кстати, есть, в каком-то смысле
select toDate(parseDateTimeBestEffort('2019.01.19')) -
только дата в другом формате
select toDate(parseDateTimeBestEffort('26.10.2018'))
так не работает -
а блин, я затупил.
-
Уже исправили в master. Теперь работает даже в таком формате :)
-
есть 2 вопроса
1) можно ли использовать КХ для органиции файлового хранилища(аналог GridFS в MongoDB), ели можно, насколько такой подход правильный?
2) чем пользуется яндекс, в своем яндекс диске, для развертывания хранилища? -
Как устроены облака Яндекса: Elliptics
За последние несколько лет в мире IT появилась модная тенденция – использование всего «облачного» для разработки новых продуктов. Публичных облачных провайдеров...
-
данный софт у себя уж не развернуть, там все ссылки уже не рабочие, на страницы яндекса
эту статью я читал -
в интернете много статей по этой теме. А это лишь ниточка за которую стоит просто потянуть
-
многие используют в этом плане CEPH
-
есть такое дело
-
а на первый вопрос может кто ответить?
-
-
Нет, ClickHouse не подходит ни для хранения файлов, ни для работы с их метаданными. Но может использоваться для двух связанных задач:
- аналитика по логам работы облачного хранилища;
- аналитика по слепку метаданных или логам изменений метаданных.
Считать всякие бизнес метрики. Находить подозрительную активность. Мониторинг сервиса и расследование инцидентов. -
спасибо
.... про аналитику вкурсе -
Вы производите впечатление уверенного человека, который все знает.
-
я про КХ много читал и смотрел видосы ... просто решил спросить про конкретный кейс
-
так же, сами им пользуемся
-
-
Привет, да, клиент умеет сжатие блоков.
- 18 January 2019 (126 messages)
-
-
-
кафка, буффер
-
а чем балк не устраивает ?
-
-
буффер - в смысле, который этот? https://clickhouse.yandex/docs/en/operations/table_engines/buffer/Buffer | ClickHouse Documentation
Buffer Table Engine Buffers the data to write in RAM, periodically flushing it to another table. During the read operati
-
-
в buffer вроде бы тоже рекомендуют пачками вставлять
-
там количество инсертов в секунду поболе будет - несколько сот, а не пара десятков
-
GitHub - VKCOM/kittenhouse
Contribute to VKCOM/kittenhouse development by creating an account on GitHub.
-
kafka other mq?
-
Блоками только куски данных для инсерта называются? Если так, то у меня другая ситуация
-
-
Joined.
-
Если не влезает можно настройки размера запроса для пользователя поправить
-
Да, kittenhouse в режиме reverse proxy как раз для этого и создан.
-
Всем привет. Вопрос то ли по кафке, то ли по materialized view. Пример: КХ слушает брокера. Для того, дабы иметь и сырую инфу с брокера, и аггрегированную (но не слушать два одинаковых потока), надо создать MergeTree таблицу, аналогичную кафке и к ней матвью, а потом еще одно матвью к, например SummingMergeTree таблице, которое будет дергать MergeTree таблицу? Или лучше делать две кафка-таблицы и из них уже тянуть?
-
-
-
не, ну чтоб была таблица с аггрегатами
-
ну в принципе да, зачем усложнять. Не знаю, как с этим бороться, чтоб не из пушки по воробьям
-
Code: 27. DB::Exception: Cannot parse input: expected ; before: \n2019-01-18 11:50:07
————
в чем может быть проблема после отправки файла? -
не хватает ; перед строкой, начинаюшейся с 2019-01-18 11:50:07?
-
дата это вторая строка и до нее перевод строки
-
Коллеги, привет!
Есть КХ 18.16.1
В него пишутся данные из jaeger opentracing серез kafka engine.
Далее клиенты в 5 потоков читают sql из КХ (также немного, редко когда суммарно более 300-400 запросов в минуту по индексам-партициям - быстро и легко).
КХ работает, на виртсервере меряются стандартные метрики (место, память, процессор, иноды).
Но замечено, что раз в сутки (иногда временной интервал побольше) клиенты начинают получать в очень больших количествах (порядка 99% от всей массы sql-запросов) либо ошибки, либо пустые rowset.
Подскажите, какие метрики здоровья именно КХ вы порекомендуете (select count(*) from table, select now()) и на что стоит обратиь внимание?
Благодарю за подсказки! -
Было бы здорово чтоб в документации или где-то еще были примеры по нахождению аномалий с помощью ClickHouse )
-
У нас есть такая штука, статью на Habr бахнем
-
так гридфс тормозная поделка на обьемах просто никакая, какой смысл использовать его не очень понятно.
-
Не совсем аномалии, но "ранжирование наиболее сильно отклонившихся метрик"
-
Нет, каскадно пока ничего не пишется. 1 МВ - 1 таблица
-
Когда ?)
-
Я думаю, что в этом месяце сяду, напишу
-
❤️
-
Спасибо
-
Я так понял, в планах есть реализация возможности прикручивания к кафке нескольких матвью с разными движками? А ля одно матвью собирает сырую инфу, а второе ее аггрегирует? Ну а сейчас самый простой выход - матвью с MergeTree, а потом уже аггрегируй как хочешь, так?
-
-
-
уберите кавычки вокруг массива, должно завестись
-
а вообще при выгрузке обычно указывюат optionally enclosed by а не форсом все в кавычки загоняют
-
это временное решение
-
не завелось
-
Добрый день. Не нашел в документации описания <distributed_ddl> в документации, но ощущаю что он мне нужен.
Где можно узнать, что именно делает этот параметр? -
-
<!-- Allow to execute distributed DDL queries (CREATE, DROP, ALTER, RENAME) on cluster.
Works only if ZooKeeper is enabled. Comment it if such functionality isn't required. -->
<distributed_ddl>
<!-- Path in ZooKeeper to queue with DDL queries -->
<path>/clickhouse/task_queue/ddl</path>
</distributed_ddl> -
в дефолтном конфиге есть описание же
-
позволяет делать распределенные запросы сразу на весь кластер
-
Спасибо :)
default конфиг утрачен, не подумал там искать -
-
И сейчас так можно, но в этом случае эффективнее писать самим, а на таблицу с сырыми данными вешать МВ.
-
-
Спасибо!
-
Поясните, пожалуйста, как работать с runningAccumulate, а то она на меня матерится Argument for function runningAccumulate must have type AggregateFunction - state of aggregate function. Запрос вроде как элементарный, хочу посмотреть органический рост юзеров:
SELECT count, runningAccumulate(count), day FROM (SELECT uniqExact(usersDailyCount) AS count, toDate(firstSeen) AS day FROM -
-
Решили задачу?
-
-
Кто бы мог подумать, что в чате можно нажать Ctrl+F=) Спасибо, попробую
-
я правильно понимаю, что данные /var/lib/clickhouse/data/database/table/ это очередь на вставку?
-
Postgre нарисовал решение с четырьмя селектами и тремя джойнами (один из который вложенный, в КХ придется расшивать через подзапрос). Идея простая: найти для каждого name дату (date) глобального минимума, а потом найти два максимума -- слева и справа от этой даты. Если левый меньше правого, то это он и есть (локальный максимум, а правый тогда будет глобальный максимум).
-
~# /usr/bin/clickhouse-extract-from-config
-bash: /usr/bin/clickhouse-extract-from-config: Operation not permitted что бы это могло значить? -
Решил... Длинно получилось и выполняется почти секунду
-
~# strace /usr/bin/clickhouse-extract-from-config
execve("/usr/bin/clickhouse-extract-from-config", ["/usr/bin/clickhouse-extract-from"...], 0x7ffe9a579d30 /* 10 vars */) = -1 EPERM (Operation not permitted)
fstat(2, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 0), ...}) = 0
write(2, "strace: exec: Operation not perm"..., 38strace: exec: Operation not permitted но зачем? -
Joined.
-
Можно решить скриптом, не длиннее, чем в задаче, сравнением кортежей. Возможно, это будет быстрее, чем длинный вариант.
-
Ребята, а кх много памяти надо? Таблица миллионов на 50
-
-
Ну тогда по идее немного. Пары гигов должно хватить
-
Спасибо 🤝
-
-
На простых запросах проверено — работает 🙂
-
Но вроде тут в чатике у людей в каких-то сложных случаях возникали проблемы или вопросы
-
например если хочется остановить идущий alter … delete , то нужно самому в ZooKeeper лезть, или что-то такое
-
или если делается update с подзапросами, то тоже всё очень медленно будет идти
-
-
Стабильно работает если запросы не сильно сложные
-
Ни одной проблемы с августа с ними не было
-
ок
-
Вообще все ровно наоборот.
MV не каскадируются.
Кафка энжин таблица проталкивает во все мат.вью которые на нее смотрят.
Т.е. создаем одну кафка энжин таблицу и навешиваем на нее несколько MV. -
О. Так я так и думал сделать изначально. Замылился в документации, решил переспросить. Спасибо, буду пробовать
-
Ребята, а КХ сложно обслуживать? По всем параметрам, как база подходит. Будет крутиться на одной машине.
-
На одной машине - максимально просто
-
Я не админ. Программер )
-
Ну всё. Завтра поставлю ))
-
У нас крутиться, нормально. Правда бекапов нет, очень стремно. Потому планируем все же сделать репликацию, хотя одной ноды хватает
-
Коллеги, всем привет!
Приглашаем вас на наш 4-ый митап Scale-out databases and engines - обсуждаем распределённые СУБД, их эксплуатацию, разработку и развитие.
В этот раз поговорим об open-source в enterprise-среде - опыт компаний, кейсы внедрений, слухи, скандалы, интриги, расследования. В частности, коллеги из Alytics.ru расскажут о создании data-платформы на базе связки CH + Greenplum + S3.
Москва, 7 февраля, самый центр. Вход свободный, но нужна регистрация по ссылке. Будем рады вас видеть!
https://www.meetup.com/Scale-out-databases-and-engines/events/257153368/Open-source в Enterprise: это фантастика?Thu, Feb 7, 2019, 7:30 PM: Как найти DI TelegraphВход в здание со стороны Газетного переулка напротив церкци, которая за Макдоналдсом.Стеклянная дверь с вывеской DI TelegraphДальше поднимаетесь на 5-й
-
-
Будет так же, но для КХ: https://www.youtube.com/watch?v=PJXuICqe3FcDeploying Arenadata DB (based on Greenplum) in Google Cloud Platform with Arenadata Cluster Manager
This short demo shows the process of deploying distributed MPP database, Arenadata Database (Greenplum), in Google Cloud Platform using Arenadata Cluster Manager. Arenadata Cluster Manager (ADCM) simplifies deploying and management of data services on premise, in private or public clouds. By splitting data landscape on two independent management layers – infrastructure layer and application layer – your platform becomes flexible, predictable and repeatable. ADCM is a modular system – you can add specific modules to support new applications, containers and cloud providers. You can develop your own modules to support your specific applications and proprietary systems. ADCM comes with open powerful REST API – you can easily integrate ADCM with your infrastructure. Arenadata Database (ADB) is a distributed database based on using MPP (massively parallel processing) principle. It takes its origin from Pivotal’s Greenplum database. ADB suits applications, where there is a large amount of semi-structured and unstructured…
-
Joined.
-
Всем привет! хотим перешардировать данные со старого КХ кластера на новый, но там и там свои ZK кластера, которые “не общаются” между собой.
Вопрос: clickhouse-copier будет работать в случае разных кластеров со своими ZK ? Спасибо! -
я вот смотрю, что для хранения булевых значений используется UInt8 1 и 0. А как быть с кафка-движком, брокер будет продюсить в Json true и false, не хотелось бы морочить голову с пересериализацией инфы, стрим ожидается мощный. Но и хранить булевые значение строкой тоже вроде как не комильфо
-
Копир работает с одним zk кластером и берёт там задания, можете объединить zk в один кластер через dynamic conf
-
dynamic conf позволяет менять конигурацию (добавлять обсерверов например), без ролинг рестарта нод зукипера. По-моему нет способа смержить два зукипер кластера, импротнуть данные КХ из одного зукипера в другой нельзя из-за автоинкременов.
-
Беда пришла в мой кликхаус-дом
-
Не первый раз, но в первый раз горбатая гора имеет столь стремительный уклон
-
из того, что заметил залётного:
SELECT *
FROM metrics
WHERE metric LIKE 'Memory%'
┌─metric───────────────────────────────────┬───────value─┐
│ MemoryTracking │ 1307062507 │
│ MemoryTrackingInBackgroundProcessingPool │ -3493881520 │
│ MemoryTrackingInBackgroundSchedulePool │ 0 │
│ MemoryTrackingForMerges │ 348253156 │
└──────────────────────────────────────────┴─────────────┘ -
отрицательное значение метрики
-
у меня после апдейта была проблема с памятью из за кеша выражений
-
добавил строчку в конфиг и все стало ок
-
паттерн воспроизведения - интенсивно считает hyperloglog агрегации и квантили. Есть ощущение что где-то leak
-
обновлялся с 18.12 до 18.ё6
-
compile_expressions?
-
да compiled_expression_cache_size=500
-
не актуально - 18.6.0 у меня
-
нет там такой настройки
-
строго говоря, оно и на более ранних релизах воспроизводилось
-
но не столь драматично
-
compile_expressions однажды уже включали и выключали.
-
compile и compile_expressions в нули выставлены
-
По поводу этих метрик - тут всё нормально. Отрицательное значение говорит о том, что память была освобождена в контексте BackgroundProcessingPool, а выделена где-то ещё. Это Ок.
Почему растёт потребление памяти - из этих метрик не ясно. -
Нужно смотреть, как изменился профиль нагрузки. Также можно посмотреть график MemoryTracking за более длительное время. Ещё посмотрите график метрик аллокатора (они находятся в AsynchronousMetrics).
-
оу, delete/update записей появился?
-
Мы делиты во всю пользуем. Там есть замечания, но если не косячить самим, то все вполне годно работает
-
-
-
-
-
-
У меня по неделям для нескольких таблиц сделано - без проблем вобщем-то
-
-