- 01 July 2021 (184 messages)
-
Пытаюсь на маке установить из бинарника. Скачал, запускаю
sudo ./clickhouse install
Copying ClickHouse binary to /usr/bin/clickhouse.new
Code: 76, e.displayText() = DB::ErrnoException: Cannot open file /usr/bin/clickhouse.new, errno: 1, strerror: Operation not permitted (version 21.8.1.7325 (official build)) -
Думаю как вариант дать доступ терминалу к ФС. Это дополнительные перемешены макос
-
-
-
не посоветуете какой именно тап в брю? там разные есть есть такой старенький https://github.com/arduanov/homebrew-clickhouseGitHub - arduanov/homebrew-clickhouse: ClickHouse for MacOS Sierra and High Sierra.
ClickHouse for MacOS Sierra and High Sierra. Contribute to arduanov/homebrew-clickhouse development by creating an account on GitHub.
-
Надо пробовать. Я бы через докер поставил
-
-
-
В настройках просто подвигайте ползунки )
-
да вот даже с 1ГБ. ну лан, пасибо в общем, попробую действительно с докера еще раз
-
-
-
-
-
Всем привет, подскажите, пожалуйста, где задаётся параметр в настройках сервера allow_experimental_window_function? Версия CH 21.05
-
в /etc/clickhouse-server/config.d/allow_experimental_window_functions.xml
<yandex><allow_experimental_window_functions>1</allow_experimental_window_functions></yandex> -
Привет народ! С места в карьер
2021.07.01 08:20:41.604567 [ 16499 ] {} <Information> banner.messages_local (ReplicatedMergeTreePartCheckThread): Part 202106_4168_4168_0 looks good.
2021.07.01 08:20:41.604649 [ 16497 ] {} <Warning> banner.messages_local (ReplicatedMergeTreePartCheckThread): Checking part 202106_4143_4143_0
2021.07.01 08:20:41.609060 [ 16497 ] {} <Warning> banner.messages_local (ReplicatedMergeTreePartCheckThread): Checking data of part 202106_4143_4143_0.
2021.07.01 08:20:41.626999 [ 16497 ] {} <Information> banner.messages_local (ReplicatedMergeTreePartCheckThread): Part 202106_4143_4143_0 looks good.
2021.07.01 08:20:41.627120 [ 16502 ] {} <Warning> banner.messages_local (ReplicatedMergeTreePartCheckThread): Checking part 202106_4155_4155_0
2021.07.01 08:20:41.630262 [ 16861 ] {} <Error> banner.messages_local (e5e1fb8b-ae1f-4686-9993-4bc6080dba99): auto DB::StorageReplicatedMergeTree::processQueueEntry(ReplicatedMergeTreeQueue::SelectedEntryPtr)::(anonymous class)::operator()(DB::StorageReplicatedMergeTree::LogEntryPtr &) const: Code: 33, e.displayText() = DB::ParsingException: Cannot read all array values: read just 76107 of 125236: (while reading column response.request): (while reading from part /opt/clickhouse/data/store/e5e/e5e1fb8b-ae1f-4686-9993-4bc6080dba99/202106_4143_4143_0/ from mark 0 with max_rows_to_read = 8192): While executing MergeTreeSequentialSource, Stack trace (when copying this message, always include the lines below):
0. DB::ParsingException::ParsingException(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x8609f13 in /usr/bin/clickhouse
1. DB::DataTypeArray::deserializeBinaryBulkWithMultipleStreams(DB::IColumn&, unsigned long, DB::IDataType::DeserializeBinaryBulkSettings&, std::__1::shared_ptr<DB::IDataType::DeserializeBinaryBulkState>&) const @ 0xe9b0b2d in /usr/bin/clickhouse
2. DB::MergeTreeReaderWide::readData(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, DB::IDataType const&, DB::IColumn&, unsigned long, bool, unsigned long, bool) @ 0xf6fd699 in /usr/bin/clickhouse
3. DB::MergeTreeReaderWide::readRows(unsigned long, bool, unsigned long, std::__1::vector<COW<DB::IColumn>::immutable_ptr<DB::IColumn>, std::__1::allocator<COW<DB::IColumn>::immutable_ptr<DB::IColumn> > >&) @ 0xf6fc9b0 in /usr/bin/clickhouse
4. DB::MergeTreeSequentialSource::generate() @ 0xf70e11a in /usr/bin/clickhouse
5. DB::ISource::tryGenerate() @ 0xf8dd6c5 in /usr/bin/clickhouse
6. DB::ISource::work() @ 0xf8dd3ea in /usr/bin/clickhouse
7. DB::SourceWithProgress::work() @ 0xfa44afa in /usr/bin/clickhouse
8. ? @ 0xf91728c in /usr/bin/clickhouse
9. DB::PipelineExecutor::executeStepImpl(unsigned long, unsigned long, std::__1::atomic<bool>*) @ 0xf914036 in /usr/bin/clickhouse
10. DB::PipelineExecutor::executeStep(std::__1::atomic<bool>*) @ 0xf9129bc in /usr/bin/clickhouse
11. DB::PullingPipelineExecutor::pull(DB::Chunk&) @ 0xf920a49 in /usr/bin/clickhouse
12. DB::PullingPipelineExecutor::pull(DB::Block&) @ 0xf920b20 in /usr/bin/clickhouse
13. DB::PipelineExecutingBlockInputStream::readImpl() @ 0xf90e8a4 in /usr/bin/clickhouse
14. DB::IBlockInputStream::read() @ 0xe98a1d5 in /usr/bin/clickhouse
15. DB::TTLBlockInputStream::readImpl() @ 0xf64df4b in /usr/bin/clickhouse
16. DB::IBlockInputStream::read() @ 0xe98a1d5 in /usr/bin/clickhouse
17. DB::ExpressionBlockInputStream::readImpl() @ 0xf652297 in /usr/bin/clickhouse
18. DB::IBlockInputStream::read() @ 0xe98a1d5 in /usr/bin/clickhouse
19. DB::MaterializingBlockInputStream::readImpl() @ 0xee3937d in /usr/bin/clickhouse
20. DB::IBlockInputStream::read() @ 0xe98a1d5 in /usr/bin/clickhouse -
21. DB::MergeTreeDataMergerMutator::mergePartsToTemporaryPart(DB::FutureMergedMutatedPart const&, std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, DB::BackgroundProcessListEntry<DB::MergeListElement, DB::MergeInfo>&, std::__1::shared_ptr<DB::RWLockImpl::LockHolderImpl>&, long, DB::Context const&, std::__1::unique_ptr<DB::IReservation, std::__1::default_delete<DB::IReservation> > const&, bool, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&) @ 0xf62b1d9 in /usr/bin/clickhouse
22. DB::StorageReplicatedMergeTree::tryExecuteMerge(DB::ReplicatedMergeTreeLogEntry const&) @ 0xf40a649 in /usr/bin/clickhouse
23. DB::StorageReplicatedMergeTree::executeLogEntry(DB::ReplicatedMergeTreeLogEntry&) @ 0xf3ff97c in /usr/bin/clickhouse
24. ? @ 0xf46dbac in /usr/bin/clickhouse
25. DB::ReplicatedMergeTreeQueue::processEntry(std::__1::function<std::__1::shared_ptr<zkutil::ZooKeeper> ()>, std::__1::shared_ptr<DB::ReplicatedMergeTreeLogEntry>&, std::__1::function<bool (std::__1::shared_ptr<DB::ReplicatedMergeTreeLogEntry>&)>) @ 0xf7815c5 in /usr/bin/clickhouse
26. DB::StorageReplicatedMergeTree::processQueueEntry(std::__1::shared_ptr<DB::ReplicatedMergeTreeQueue::SelectedEntry>) @ 0xf42862a in /usr/bin/clickhouse
27. ? @ 0xf46e735 in /usr/bin/clickhouse
28. ? @ 0xf58562d in /usr/bin/clickhouse
29. ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::__1::__list_iterator<ThreadFromGlobalPool, void*>) @ 0x86441bd in /usr/bin/clickhouse
30. ThreadFromGlobalPool::ThreadFromGlobalPool<void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()>(void&&, void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()&&...)::'lambda'()::operator()() @ 0x864671f in /usr/bin/clickhouse
31. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x86415ed in /usr/bin/clickhouse
(version 21.1.2.15 (official build))
Колонка на которую сетует кх имеет кастомный ттл.
response.request Array(String) TTL stats_day + toIntervalDay(1),
Я пытался сделать detach part и вот что вышло
Code: 384. DB::Exception: Received from ch2.wpw.sh:9000. DB::Exception: Part 202106_4155_4155_0 is currently participating in a background operation (mutation/merge), try again later.
Потом стопнул мерджи
system stop merges banner.messages_local
но и это не помогло, ошибка та же. Раньше на колонке был ещё индекс, для теста убрал. В system.mutations пусто, в system.merges три записи на TTL_DELETE Horizontal, REGULAR Horizontal и REGULAR Undecided -
В поиске по чату нашел всего два упоминания этой же проблемы, но решения там нет
-
-
CREATE MATERIALIZED VIEW OR REPLACE db.mv_name
пробовали? -
не пробовал, видел это функционал, но хотелось бы просто уточнить, поедет ли он мгновенно?
-
короче нет, такой функционал недоступен
так что краткий ответ
надо стопать INSERT -
спасибо, тоже у себя смоделировал вставку, сейчас сверю
-
добрый день, подскажите плз
привык к реляционным и noSQL базам данных и не могу понять с индексами
все-таки в КХ они по типу btree или нет ?
потмоу-что при сортировке есть упоминания что в начало ORDER BY надо ставить то поле которое максимально изменчивое .... но если это работает по btree с поиском остальных полей по которым идет основное отсечение данных будут проблемы .... все-таки чем руководствоваться ? а то в документация я так и не нашел полного объяснения -
не btree
Просто список значений через каждые N строк -
нет
в CH вообще не btree
в CH - индексы по типу data skip indexes
то есть они работают по принципу, ой у нас тут WHERE над колонкой по которой индекс есть
дорогой индекс, проверь пожалуйста, вот этот кусок данных, а можно ли его не читать чтобы фильтровать и скипнуть -
Всем привет. Сталкиваюсь с проблемой — при удалении из таблицы данных с условием (ALTER TABLE DELETE WHERE ...) и последующей за удалением вставкой часть данных теряется. Как выясняется что данных нет — в query_log появляется запись с written_rows = X, при этом в самой таблице строк = Y < X. Таблица реплицированна на три машины, при этом на двух репликах DB=Atomic, на одной=Ordinary
При этом в логах из необычного разве что There is no part xxx in ZooKeeper, it was only in filesystem
Если таблицу переделать из Replicated в MergeTree, то такого поведения не наблюдается.
Ещё вроде становится лучше если выставить insert_quorum=3, с этой опцией потерь пока не ловили -
ALTER TABLE ... ON CLUSTER делаете? или просто?
-
ну т.е. если у меня таблица например date, clientId, doits
самый идеальный вариант когда я делаю order by (date, clientId) а не (clientId, date) ? правильно ? -
просто
но с опцией mutations_sync=2
то есть изменения завершаются везде, потом вставка -
В начало надо ставить минимально изменчивое, а не максимально.
-
вчера были рассуждения что чтобы отсортировать по DESC длямаксимальнйо скорости нужно date ставить на первое место
-
лучше date, clientid
чем cleintid, date
только потому что обычно вы будете date указывать в запросе примерно всегда
и оно монотонно возрастающее
поэтому primary key легче skip по min max условиям куски данных... читая .mrk
но вы еще про PARTITION BY не забывайте его тоже по toYYYMM(date)
лучше сделать -
спасибо большое .... вроде смыслы понял
-
еще вопрос с партицированием )))
а что лучше или в чем могут быть подводные камни если я например партицирование делаю по дням или по месяцам
в первом случае партиций получается много и вроде как хорошо если я ищу интервалы дат по дням, но если я например возьму интиервал несколько месяцев с середины месяца каждый что будет в итоге выгоднее много партиций по дню или все таки партицирование по месяцам во втором случае читать база будет из 3х партиций например но отбросит данные в начале за 15 дней и в конце за 15 дней .... в первом случае она возьмет 60 дней и ни чего отбрасывать не будет .... но получается нагрузка IO будет в теории выше так как это чтение сразу из 60 файлов ..... правильно понимаю ? -
верно понимаете, в большинстве случаев достаточно партиционирования по месяцу
если сделаете партиционирование по дню, у вас начнут появляться подводные камни связанные с большим количеством файлов (медленный старт ch, медленная подготовка к запросу и т.д.), причем не сразу, а через какое-то время, когда отказываться будет больно
+ к партиционированию популярна практика ставить дату (toDate того же поля что и в partition by) на 1-2 место в pk в зависимости от запросов
отмечу, что это популярный, но все-таки частный случай, в общем случае могут быть и минутные партиции, если действительно нужно -
оо спасибо .... про медленный старт и медленную подготовку запроса это существенный минус
-
Добрый день.
Корректно ли при mutations_sync=0 будут обработаны запросы
неоднократного добавления и удаления строк по одному условию ?
Загружаются чеки, которые могут приходить по нескольку раз
от магазина за дату (состав пакета с чеками может изменяться).
В конечном счете останется последняя добавленная версия ? -
(т.е. перед добавлением по условию вначале удалять строки по этому же условию)
-
кстати про мутацию )
mutations_sync выставлен на 1, если изменяю таблицы, добавление или модификация полей все работает как нужно, НО, если делаю ренейм таблицы она ренеймится только на 1 реплике а констуркцию on cluster не принимает -
слишком частые партиции, убьют вам производительность
у вас будет миллион каталогов в /var/lib/clickhouse/data/database_name/table_name/ -
потому что у вас Atomic только на 2 репликах из 3
-
ну собственно из за IO убьется производительность ... но тут на сколкьо я понимаю очень важно понимать какие интервалы дат берутся
-
у меня пока 1 шард с 2мя репликами
-
а КХ юзаю в яндекс облаке
-
Добрый день, подскажите пожалуйста, копирую базу с помощью clickhouse-copier содержащую таблицу с данными и MATERIALIZED VIEW.
Последовательность следующая:
1. создаю таблицу в базе назначения
2. создаю MATERIALIZED VIEW
3. копирую данные в созданную таблицу с помощью clickhouse-copier
Но к сожалению после завершения копирования выборка из MATERIALIZED VIEW возвращает 0 записей
хотя на источнике данных все возвращается нормально -
materialized view триггерится на инсерты ж вроде? а copier это другое
-
замените clickhouse-copier
на INSERT INTO ... SELECT ... FROM remote()
и тогда получится -
Вся проблема в том что соединение немного не стабильно, не получится ли ситауция при которой перенесу не все данные?
-
Нет ли возможности более изящно наполнить VIEW, не выполняя повторную перегонку?
-
у вас .inner МВ или в dest таблицу?
-
.inner таблицы сушествуют но пустые
-
ну тогда как slach подсказал вам, хороший вариант.
-
то есть запустить копирование прямо в эти таблицы?
-
видимо, да.
-
спасибо за информацию, попробую
-
Есть вопрос про сериализацию и десериализацию.
Какие есть механизмы, чтобы данные превратить в бинарное поле и наоборот?
Может есть возможность сделать SELECT ... FORMAT ... в поле (строку)?
И обратное преобразование?
Есть ли возможность превратить какие-нибудь данные в json? Или лучше в нативные какие-нибудь, чтобы быстро парсило? -
если мне не изменяет память, clickhouse-copier вроде сам использует подход INSERT INTO ... SELECT .FROM remote()...
поэтому странно что у вас materialized view Не стриггерились... -
по логам более похоже что он делает добавление в part таблицы, а далее их соединяет с основной с помощью attach
-
а вы всю БД тащите или только конкретные таблицы?
-
по таблично, но параллельно изменяю ENGINE на Replicated и схему разбития на партиции
-
Ребят у кого получилось сбилдить odbc драйвер под Apple M1?
Пробовал с конфигурацией -DBUILD_TESTING=OFF
Пробовал по этому гайду https://github.com/ClickHouse/clickhouse-odbc/issues/363#issuecomment-871242730 (Тут проблема возникает с неправильным префиксом установки)
Сам драйвер получилось сбилдить, но tableau выдает ошибку:
[iODBC][Driver Manager]dlopen(/opt/homebrew/lib/libclickhouseodbcw.dylib, 6): no suitable image found. Did find: /opt/homebrew/lib/libclickhouseodbcw.dylib: mach-o, but wrong architecture /opt/homebrew/lib/libclickhouseodbcw.dylib: mach-o, but wrong ar
[iODBC][Driver Manager]Specified driver could not be loaded
Generic ODBC requires additional configuration. The driver and DSN (data source name) must be installed and configured to match the connection. -
file libclickhouseodbcw.dylib
что говорит? -
libclickhouseodbcw.dylib: Mach-O 64-bit dynamically linked shared library arm64
-
ну клево
драйвер вы собрали под arm64
а Tableau у вас под Rosetta запускается и собрана под x86_64 -
вот только под x86_64 не получается собрать
-
сейчас попробую заново все собрать с опцией arch -x86_64
-
там рассказно сразу что homebrew даже надо под x64 поставить
-
да,только есть нюанс, его если ставишь под x64, то надо и остальные видимо команды выполнять с префиксом arch -x86_64
-
Кто-нибудь понимает, что эта фигня может значить?
-
При обращении к таблице выдаёт ошибку
Code: 76, e.displayText() = DB::ErrnoException: Cannot open file /data/clickhouse/data/data_flat/flat_temp/20210317-7-3-1_263257_263257_0/simple_date.bin, errno: 74, strerror: Bad message: While executing MergeTreeThread (version 20.10.3.30 (official build)) -
-
-
-
Т.е. простой запрос select * FROM data_flat.flat_temp limit 1 - отдаёт результат
А такой
SELECT min(simple_date)
FROM data_flat.flat_temp
WHERE
ProjectID==7 AND
interaction_type=='session' AND
src=='ga'
limit 1 - отдаёт ошибку -
-
Диск, что ли, посыпался...
-
Вообще похоже. что в dmesg
-
чочо?
-
-
Наверное, это что-то очень плохое?
-
да посыпалась файлуха...
-
Это 100% точно?
Чем спасать, куда бежать? Резервной копии нет. Можно чем-то потыкать? Есть ли шанс на спасение? -
"чтото пошло не так"
-
> Резервной копии нет
Ha-ha classic. (На самом деле сочувствую) -
Оно, конечно, весело, только лучше бы иметь "какую-то тактику", чтобы её попридерживаться )
-
ну разваливающая ФС ето всегда не очень весело
-
а что это за сдвоенные равно ?
-
А что не так-то? Обычное сравнение. Дело не в нём и не в том, что в запросе, а в том, что если КХ вынужден перебирать файлы с датами, то натыкается на битый файл и отваливается
-
обычное это одно равно
-
ну как минимум она хочет файлчек. а в cat /proc/mdstat чего?
-
root@rstat:/data/clickhouse/data/data_flat/flat_temp/20210317-7-3-1_263257_263257_0# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdd1[1] sda1[0](F)
3906884608 blocks super 1.2 [2/1] [_U]
bitmap: 21/30 pages [84KB], 65536KB chunk
md0 : active raid1 sdc1[1] sdb1[0]
937559040 blocks super 1.2 [2/2] [UU]
bitmap: 3/7 pages [12KB], 65536KB chunk
unused devices: <none> -
-
выглядит как диск sda уже вылетел, а на диске sdd данные битые)
-
да
-
Коллеги, а подскажите, Zookeeper пользоваетель системный, если запускать не под root, обязательно должен иметь sudo права?
-
Возможно ли настроить datagrip так, чтобы он показывал с какой колонкой проблемы?
Code: 386, e.displayText() = DB::Exception: There is no supertype for types UInt64, Float64 because some of them are integers and some are floating point, but there is no floating point type, that can exactly represent all required integers (version 20.8.8.2 (official build)) -
-
емнип, нет
-
Понял, спасибо!
-
Ну тут проще уже самому смотреть где вы смешиваете UInt с Float64
-
Привет! подскажите, а можно ли сделать запрос, чтобы выбрать все колонки, кроме перечисленных?
-
да, смотрите здесь
https://clickhouse.tech/docs/ru/sql-reference/statements/select/#except-modifierСинтаксис запросов SELECTСинтаксис запросов SELECT SELECT выполняет получение данных. [WITH expr_list|(subquery)] SELECT [DISTINCT [ON (column1,
-
спасибо!☺️
-
да, уже разобрался. Там просто больше 80 колонок, думал вдруг будет проще вариант
-
это пользовательская настройка, в профилях надо менять
-
переписали clickhouse-copier год назад, теперь он attach делает
-
Привет. Подскажите, пожалуйста, как использовать имя переменной в LIKE выражении?
WITH some_query AS var
SELECT count(), $var FROM table
WHERE some_field LIKE '$var%'
? -
LIKE var || '%', но some_query должно быть константой, в лайк вторым аргументом только константу можно.
-
Строка туда не подойдёт?
-
Сработало, спасибо.
-
Подскажите, когда вставляю данные, иногда сталкиваюсь с тем что блок данных не появляется в клике фактически, в логах при этом вижу
2021.07.01 19:13:24.177819 [ 196994 ] {e0058ecb-c440-42ed-a021-942722ee1610} <Debug> default.my_table (0f3bc8c2-c945-4fa9-9c27-a46012c87163) (Replicated OutputStream): Wrote block with ID '202106_3127737653308942308_5198514521250551707', 1074621 rows
2021.07.01 19:13:24.191290 [ 196994 ] {e0058ecb-c440-42ed-a021-942722ee1610} <Information> default.my_table (0f3bc8c2-c945-4fa9-9c27-a46012c87163) (Replicated OutputStream): Block with ID 202106_3127737653308942308_5198514521250551707 already exists locally as part 202106_287_287_0; ignoring it.
блок записывается и следом игнорится, как он может быть на фс если только что был записан? -
дедупликация
-
дедупликация чего? до вставки за указанное число было 0 строк
-
-
0 rows in set. Elapsed: 0.004 sec.
Синтаксис же такой?
SELECT *
FROM my_table
WHERE _part = '202106_287_287_0' -
SELECT * FROM leads FINAL WHERE approve_at <= '2021-06-22 07:49:44' AND `status`='hold' LIMIT 0, 20 FORMAT JSONEachRow
exec time: [768ms]
res.status: 500
res.body: Code: 241, e.displayText() = DB::Exception: Memory limit (total) exceeded: would use 7.02 GiB (attempt to allocate chunk of 4287312 bytes), maximum: 7.01 GiB: (while reading column simple_operating_platform_string): (while reading from part /var/lib/clickhouse/data/dbname/leads/202011_115570_140157_779/ from mark 0 with max_rows_to_read = 8192): While executing MergeTree (version 20.8.3.18)
Подскажите пожалуйста, почему может выводиться такая ошибка на запрос? -
смержилось, видимо
при инсерте чексумма блока сохраняется, и последующие блоки с той же чексуммой отбрасываются
ищите, почему у вас блоки одинаковые -
если мутация удаляет данные, и затем вставляется такой же кусок данных, он отбросится?
-
-
спасибо. а можно ли сделать чтобы мутация как-то более основательно "забывала" о блоках?
чексуммы чтобы тёрлись и т.д. -
-
но если удаляются строки, то должна пересчитыватсься чексумма?
блок же меняется -
-
нет
дедупликация для идемпотентных инсертов сделана, а не для контроля данных в таблице -
-
-
понял, благодарю.
-
Слишком жирные блоки final обрабатывает. Попробуйте в конец запроса дописать что-то типа settings max_block_size=1000, max_threads=2.
А если колонки status или approve_at есть в order by таблицы, то пропишите условия для них в prewhere а не where. Или даже если нет в order by, но вы точно знаете, что оно не может по final схлопнутся с данными, не попадающими под фильтр. -
Решения лучше, чем почистить всю таблицу я не нашел, поэтому выполнил TRUNCATE, но даже так вывалилась ошибка
Code: 233. DB::Exception: Received from ch2.avs.infrapu.sh:9000. DB::Exception: Unexpected part name: 202106_4155_4155_0_0_5_999999999
В итоге дропнул таблицу полностью со всех реплик и создал заново. Ошибки пропали -
вот что обнаружил
если брать блок определённого размера, то после мутации он может как заигнориться, так и вставиться
проверил поведение несколько раз -
скорее всего блоки чуть-чуть разные
вы проверили, что чексумма одинаковая получается? -
1. Как я могу проверить чек сумму?
2. Может ли блок быть разным если вставка производится из одного и того же файла? -
-
1. Реплицированная
2. Одна крупная вставка. В логах отсвечивает одно и то же количество строк -
-
-
Разный или нет не могу точно сказать, но иногда он отбрасывается, иногда нет, по всей видимости всё таки разный
В зукипере имена у блоков другие - более длинные -
подскажите плз, хочу таблицу сделать партицированной, на сколько я понимаю ее нужно создать и в нее залить данные, но мне выдается ошибка
Too many partitions for single INSERT block (more than 100).
The limit is controlled by 'max_partitions_per_insert_block' setting. Large number of partitions is a common misconception. It will lead to severe negative performance impact, including slow server startup, slow INSERT queries and slow SELECT queries. Recommended total number of partitions for a table is under 1000..10000. Please note, that partitioning is not intended to speed up SELECT queries (ORDER BY key is sufficient to make range queries fast). Partitions are intended for data manipulation (DROP PARTITION, etc).: While executing SinkToOutputStream.
а какой размер max_partitions_per_insert_block ставить ? если это заливка типа
insert into objects_sliced_new select * from objects_sliced -
-
-
просто у меня таблица не партицированная 200 млн записей
-
-
новая по признаку + дата
-
-
-
1768788
-
жесть )
-
-
-
чтобы дропать можно было
-
признак это номер клиента по которому ведутся логи
-
как только клиент отказывается - партиция дропается
-
-
ну не шибко часто но бывает ... хранить данные по клиенту который не платит как то не впечатляет )
-
дешевле хранить ?
-
а стоп ... у меня ж не просто дата а дата до месяца
-
60814
-
все равно много ?
-
-
-
пока клиент платить мы должны хранить
-
как вариант до года округлять
-
получается около 7123 партиций
-
а вообще какой порядок количества партиций - нормально ? 🙂
-
-
так а как удалять если КХ не дает удалять ?
-
я так понял нету функционала DELETE
-
мутациями
-
ALTER TABLE xxxx DELETE WHERE
-
Для удаление пользователей ОК
-
эмммм. .. а где про это почитать ? а то ни разу не натыкался
-
а вот нашел
-
но я тогда не понимаю ... а вчем разница то между стандартным DELETE в любой другой БД ?
-
это как-то лочит доступ к таблице или какие тут нюансы ?
-
-
Поизучал зукипер.
Итак, в момент когда клик после мутации игнорит вставленную партицию, ни на фс, ни в зукипере нет ни одного блока данных (таблицу специально предварительно вычистил)
В логах при этом вижу —
Block with ID xxx already exists locally as part 202106_23_23_0; ignoring it.Block with ID xxx already exists locally as part 202106_23_23_0; ignoring it.
Таким образом после вставки 0 строк, до вставки — тоже 0 -
HTTP клиент.
-
затратная операция + делается асинхронно, а не сразу как в обычных бд
-
она делается в фоне. если КХ упадет,
может быть непонятен стейт данных (какая часть обновилась, какая нет).
вообще чего только не словить
https://kb.altinity.com/altinity-kb-queries-and-syntax/altinity-kb-alter-modify-column-is-stuck-the-column-is-inaccessible. -
-
недавно пр был на тему того, что сбрасывать на 0 экспоненциальный backoff если пулл полностью занят.
-
параметр пользовательский, в профиле пользователя.
Причем https://t.me/clickhouse_ru/220375Slach [altinity] in ClickHouse не тормозитв /etc/clickhouse-server/users.d/allow_experimental_window_functions.xml <yandex> <profiles><default><allow_experimental_window_functions>1</allow_experimental_window_functions></default></profiles> </yandex>
- 02 July 2021 (144 messages)
-
это очень зря пользоваться 21.2 -- самой ранней версией, при наличии 21.1.9.4121.1.9.41_all.deb
это похоже на баг в компактных партах -
можно, есть modify, подробнее в issue в гитхабе
-
подбирать сортивку надо так, чтобы достич самой лучшей компресии, я просто делаю 10 таблиц с разным order by и заливаю 1 млн. строк, обычно нет смысла делать order by длинее чем 3 поля.
-
это дедупликация инсертов.
есть параметр insert_deduplicate - 0 / 1
подробнее в статье про репликациюю -
это чушь и вообще про оптимизиацию select order by
-
берите по месяцу, в крайнем случае можно партиционировать по неделям toStartOfWeek
-
мутации не гарантируют что они завершатся, в гитхабе 100500 ишей про то что мутация, прошла, строки остались, или мутация зависла и не закончилась за месяц и так далее.
-
КХ поддерживает и =/== и <> / != это одно и тоже. И даже коментарии как // так и --
-
обычно системный как сервис, для запуска надо sudo, потому сервис.
Но самому зукиперу рут не нужен, да и вообще никаким приложениям рут не нужен, кроме тех что хотят порты ниже 1024го -
тут проблема в самом КХ, он не показывает где. ошибка
-
размер инсерта значения не имеет, просто для ста последних инстертов в таблицу хранятся контрольные суммы чтобы можно было повторять инсерты
-
max_partitions_per_insert_block=0
-
рекомеднуется 1000 партиций максимум, при 7000 партов ломается альтер, начинается медленный старт КХ, при 20тыс партов select начинают тормозить на анализе партов
-
нету этого и не будет, к сожалению это мало кому нужно
-
Помогите пожалуйста, есть подзапрос, в каждой строке уникальный id, start_date, end_date (даты с первыми днями месяцев). Нужно сделать запрос, в котором на каждый id будет столько строк с датами, сколько месяцев между start_date и end_date.
Не совсем понимаю как в этом случае использовать numbers. -
-
вам для отчета какого то надо?
-
да, чтобы потом по id джойнить другие колонки и протягивать по месяцам
-
SELECT
id,
arrayJoin(arrayMap(i -> (toStartOfMonth(b) + toIntervalMonth(i)), range(toUInt64(toYYYYMM(e) - toYYYYMM(b))))) AS m
FROM
(
SELECT
1 AS id,
toDate('2021-01-01') AS b,
toDate('2021-06-01') AS e
)
┌─id─┬──────────m─┐
│ 1 │ 2021-01-01 │
│ 1 │ 2021-02-01 │
│ 1 │ 2021-03-01 │
│ 1 │ 2021-04-01 │
│ 1 │ 2021-05-01 │
└────┴────────────┘
https://kb.altinity.com/altinity-kb-queries-and-syntax/join-with-calendar-using-arrays -
Звучит разумно, но я получаю эксепшн:
Nested type Array(UInt64) cannot be inside Nullable type: While processing agreement_id, arrayJoin(arrayMap(i -> (toStartOfMonth(start_date) + toIntervalMonth(i)), range(toUInt64(toYYYYMM(end_date) - toYYYYMM(start_date))))) AS month (version 21.6.5.37 (official build))
Возможно это из-за того, что мои start_date и end_date Nullable(DateTime)? -
вместо toUInt64 ( ) надо cast( a - b, 'UInt64' )
-
arrayJoin(arrayMap(i -> (toStartOfMonth(start_date) + toIntervalMonth(i)), range(CAST(toYYYYMM(end_date) - toYYYYMM(start_date),'UInt64')))) AS m
Code: 69, e.displayText() = DB::Exception: A call to function range overflows, investigate the values of arguments you are passing: while executing 'FUNCTION range(CAST(minus(end_date, start_date), 'UInt64') :: 2) -> range(CAST(minus(end_date, start_date), 'UInt64')) Array(UInt64) : 4' (version 21.6.5.37 (official build))
Не понимаю в чём ошибка. Можте вообще лучше dateDiff использовать внутри range? Хот тоже не помогает -
у вас может быть такое что start_date > end_date?
-
нет, такого точно не должно быть. Но интересно, я заселектил toYYYYMM(start_date) и на выходе у меня такое
2020-09-01 -> 202,009
2021-08-01 -> 202,108 -
-
-
arrayJoin(arrayMap(i -> (toStartOfMonth(start_date) + toIntervalMonth(i)), range(CAST(dateDiff('month', start_date, end_date),'UInt64')))) AS m
выдаёт
A call to function range overflows, investigate the values of arguments you are passing: while executing 'FUNCTION range(CAST(dateDiff('month', start_date, end_date), 'UInt64') :: 2) -> range(CAST(dateDiff('month', start_date, end_date), 'UInt64')) Array(UInt64) : 5' (version 21.6.5.37 (official build)) -
-
ну оно и должно быть числом
-
попробуйте dateDiff
https://clickhouse.tech/docs/en/sql-reference/functions/date-time-functions/#date_diffDates and Times | ClickHouse DocumentationFunctions for Working with Dates and Times Support for time zones. All functions for working with the date and time that
-
Кст, насчет дейтдифф - он же инт выдает, а как сделать так, чтоб он флоат выдавал? Мне нужно, чтоб выводились строки с разницей двух действий в 7 суток, но он все , что слегка больше 7 суток просто округляет до 7 дней и выдает лишнюю инфу. Или в таком случае unit = seconds сделать, чтоб разница была в N секунд за 7 суток?
-
Да, делайте по секундам
dateDiff('second',end_date, start_date) <= 86400*7 -
Благодарю)
-
-
константа 86400 извините
-
да, действительно фигня какая то
используйте просто dictGet
https://kb.altinity.com/altinity-kb-dictionaries/altinity-kb-range_hashed-example-open-intervals -
Но как я понял если инсерт будет отличаться от предыдущего, получится другой блок с другим хешем, разве нет?
В моём де случае ситуация противоположная, инсерт и количество строк в блоке одинаковое, но блок в половине случаев отбрасывается, в половине - нет -
под dictGetT имеются в ввиду dictGetUInt8/dictGetString ?
-
нет
там в доке прямо для range_hashed словарей ерунда похоже написана...
устаревшая
https://clickhouse.tech/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout/#range-hashedStoring Dictionaries in Memory | ClickHouse DocumentationStoring Dictionaries in Memory There are a variety of ways to store dictionaries in memory. We recommend flat, hashed an
-
-
-
-
-
parseDateTimeBestEffort
-
такой формат не распарсит навверное
-
Привет, столкнулся со странным поведением селекта. Есть агрегационная таблица со схлопыванием сырых ивентов по часам. Заметили дубли, хотя движок должен был бы их схлопнуть (ReplicatedAggregatingMergeTree). Если брать данные за текущий час, то дублей нет. Если брать данные за предыдущий час - видны дубли. Когда час закрывается, то за тот час когда были дубли - их больше не не будет. Если взять любой другой промежуток времени то дублей никогда не будет. Проблема только когда ставится where hour = toStartOfHour(now() - interval 1 hour). И я заметил, что это каким то образом связано с кол-вом шардов (их 4 и на каждую по реплике). Кол-во дублей равно кол-ву записей на шардах. Т.е. если на 1,2,3 шардах будет по записи, то в результате селекта в distributed таблицу будет 3 записи отдельных (только за предыдущий час)
-
Версия 21.1.2.15. Пробовал менять настройку distributed_group_by_no_merge, но это не помогает. Есть идеи куда копать?
-
DB::ParsingException: Cannot read DateTime: unexpected date: 107-20-21
-
Добрый день, есть вопрос про Map в clickhouse.
Условно говоря, у меня есть таблица с 3 колонками
client_id UInt32
algo_hs Map(String, Array(UInt32)
datetime DateTime('UTC')
В algo_hs лежит словарь с массивами (хешрейт по алгоритму), например:
{
"sha256": [26665000, 22520000, 22537000, 22460000],
"scrypt": [5667659, 5736897, 5668138],
...
}
Планируется доставать average algo_hs по client_id за определенный период.
Скажите пожалуйста насколько Map юзабелен на данный момент (он за эксперементальным флагом на данный момент)
и можно ли делать выборку (avg) по значениям в map? -
Насчет DateTime: я же правильно понимаю, что как в sqlite чисто время (12:23:45) в колонку не получится записать? Искала доугие дата типы, но только DateTime и Date нашла
-
Ну запишется время для +-первого дня unix time
-
Типа 1970-01-01 12:23:45?
Просто я когда чисто время ввела, у меня ошибка вышла, что неправильный формат ввожу -
Да
SELECT
toTime(parseDateTimeBestEffort('12:23:45')),
toTime(now())
Query id: a13db777-6c9c-41c9-87cb-1024d7ebc642
┌─toTime(parseDateTimeBestEffort('12:23:45'))─┬───────toTime(now())─┐
│ 1970-01-02 12:23:45 │ 1970-01-02 11:45:58 │
└─────────────────────────────────────────────┴─────────────────────┘ -
Aggregating/replacing не гарантируют схлопывание. Используйте в запросах FINAL или агрегатные функции. Всё есть в доке или по чатику можно по искать по запросу "схлопывание" и т.д.
-
Окей, поняла, благодарю!
-
привет! версия КХ 21.2.10.48
подскажите, в чем может быть проблема: таблица движка KafkaEngine в связке с MV тянет всего по одной записи раз в 8 секунд, в то время как другие такие же связки читают сообщения с нормальной скоростью. Может ли это быть проблема со стороны КХ, и если да, то куда надо смотреть, или здесь КХ не при делах, и надо смотреть в сторону самой кафки?
Читал https://altinitydb.medium.com/clickhouse-kafka-engine-faq-6248283e7b66 , смотрел параметры background_schedule_pool_size и BackgroundSchedulePoolTask - ничего выходящего за грани я там не увидел
upd: solved -
Сейчас используются агрегатные функции в духе
countMergeIf(count, event_type = 'click') AS clicks,
countMergeIf(count, event_type = 'show') AS impressions
В исходной таблице соответственно count AggregateFunction(count)
Разве так не должно работать без final? -
а у вас случаем ключ шардирования не rand()? Вы можете писать одинаковые данные на разные шарды, и они никогда не схлопнутся
-
Приложение вставляет батчи в локальные таблицы, а потом эти данные уходят в агрегаты
-
Почти rand в целом
-
спасибо, помогло
-
ReplicatedAggregatingMergeTree не схлопывает дубли
он только при background merge будет для полей с типами aggregatingState делать merge для одинаковых значений из ORDER BY -
Возможно я неправильно описал происходящее. Дело не совсем в дублях. Как и подобает aggregatingMT движок суммирует значения по колонкам в order by. И если делать запросы на локальных таблицах, то всё суммируется верно, но если сделать тот же запрос на distributed, то кх не просуммирует каунтеры на каждой ноде в одну строку
-
Он выведет 4 строки (по строке на шард - всего 4 шарда соответственно)
-
Похоже на поведение distributed_group_by_no_merge = 1, когда нода на которой выполняется запрос не суммирует результаты, но он выключен
-
всех приветствую. первый раз сталкиваюсь сейчас с clickhouse. установлена версия 19.16. могли бы подсказать sql ориентированное управление в этой версии не поддерживается? вроде в xml access managment = 1 добавил, но create user не работает. проверил на тестовом сервере поднять последнюю стабильную версию там все ок
-
в 19.16 не было управления доступом через create user
-
access_management с 20.4 версии только доступно
-
-
в запросах к distributed аггрегационные фунции и GROUP BY есть ?
-
Есть всё перечисленное
-
Вот пример. Я только убрал много колонок по которым идет группировка, чтобы не захламлять
SELECT adformat, event_time as hour, countMergeIf(count, event_type = 'click') AS clicks, sumMergeIf(cpc_sum, event_type = 'click') AS revenue_on_clicks
FROM aggregates.events_hour
WHERE toStartOfHour(event_time) = toStartOfHour(now() - interval 1 hour)
GROUP BY adformat -
т.е. если используете аггрегирубщие функции и group by, то дублей нет, если смотрите сырые данные, то дубли есть? я правильно вас понимаю?
-
в сырых дублей нет и суммирование правильное, но если брать из aggregatingMT как я скидывал ранее, то суммирования не произойдёт - вместо одной строки будет 4 строки с одинаковыми колонками, но с разными суммами
-
Например есть два шарда. На первом результат селекта
adformat,clicks,revenue_on_clicks
display,5,0.05
На втором будет
adformat,clicks,revenue_on_clicks
display,2,0.02
Если выполнить схожий запрос на агрегатах, будет не
adformat,clicks,revenue_on_clicks
display,7,0.07
А будет
adformat,clicks,revenue_on_clicks
display,5,0.05
display,2,0.02 -
Но там же GROUP BY adformat. Как там может быть "display" 2 раза?
-
Собственно... В этом и вопрос как такое может быть. В понедельник планирую обновить кх в надежде что этот казус поправится. На стейджевом кластере из двух нод такой аномалии не заметил, хотя версия там такая же, таблицы идентичные и данные такие же
-
либо это мегабаг на стороне кликхауса, либо, что более вероятно у вас в группировке есть ещё какое-то поле, которое на первый взгляд ни на что не влияет и не должно приводить к дублированию строк, но на самом деле оно-то и влияет :) ну и ещё вариант, что в селекте используется arrayJoin или типо того, что может наплодить раздвоение. ну или join какой-то, который вроде словарь и не должен раздваивать, но раздваивает.
либо вы в админке смотрите и видите второй раз туже строку на другой странице или ещё какая хрень :) -
Друзья у меня есть вопросик такого плана. Мне надо перегнать json данные из mongodb в clickhouse. И если с большей частью полей я я разобрался nj вот с одним нет. У меня есть ключ meta с вложенным словарем и туда пихаются куча всяких разных данных и они по большей части рандомные. Какбы мне правильно хранить это поле ? Превращать в строку ? Или есть какото способ который я не могу найти ))
-
Мы пока закрыли это вопрос через добавления FINAL. Пока работает и всё сходится как надо. Смотрю всегда через clickhouse-client в консоли, ибо ну его эти табиксы и прочие админки от юродивых) Самое странное, что раньше всё работало как надо, проблема началась месяц назад, и, конечно, никто ничего не делал ¯\_(ツ)_/¯
-
типо что то вроде этого
"meta" : {
"file_id" : ObjectId("60df02518a2e6020b738dc9b"),
"folder_id" : ObjectId("5bae265d007791646ee1f836"),
"file_name" : "Test",
"common_id" : "nGQZPhNfHeen2jy0xLVzJyxGnJxiq7"
},
"meta" : {
"user_id" : "nGQZPhNfHeen2jy0xLVzJyxGnJxiq7",
"car_name": "mazda"
},
И прям оч все по разному , я хотел каакието общие штуки сделать но их оч мало -
-
а есть create table этого AggregatingMergeTree?
-
я б хранил на вашем месте json как строку в кх
-
-
-
-
Напрашивается исользовать json, тем более, что в кликхаусе куча функций для работы с ним. Будет проблема только если понадобится в этом json проапдейтить какое-нибудь поле.
-
я ненашел там типо данных json? или я вас не понял))
-
Всем привет!
Как понять, к какому timezone относится timestamp?
В бд timestamp, например, в таком виде «1,579,100,244» -
не будет проблем, все в зависимости от того, каким образом будут спроектированы и какие требования выдвигаются бизнесом. Если нужна будет версионность, - да тут надо будет думать, но если менеджер не особо требует, то значит и изменения будут не столь постоянны
-
-
Такого типа и нет. Сохраняйте как строку. В доке пощите json найдёте все нужные функции.
-
-
JSON | ClickHouse Documentation
Functions for Working with JSON In Yandex.Metrica, JSON is transmitted by users as session parameters. There are some sp
-
CREATE TABLE aggregates.events_hour_local (
`stats_day` Date,
`event_time` DateTime,
`event_type` LowCardinality(String),
`ad_type` LowCardinality(String),
`domain_referrer` String,
`campaign_id` UInt32,
`spot_id` UInt32,
`spot_size` UInt32,
`country` LowCardinality(String),
`os_type` LowCardinality(String),
`os_family` LowCardinality(String),
`browser_name` LowCardinality(String),
`browser_family` LowCardinality(String),
`utm_source` String,
`utm_medium` String,
`utm_campaign` String,
`utm_content` String,
`cpc_sum` AggregateFunction(sum, Float64),
`cpm_sum` AggregateFunction(sum, Float64),
`ecpm_sum` AggregateFunction(sum, Float64),
`count` AggregateFunction(count)
) ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/{cluster}/tables/{shard}/aggregates/user_events_hour_local', '{replica}')
PARTITION BY toYYYYMM(stats_day)
ORDER BY (stats_day, event_time, event_type, ad_type, domain_referrer, country, campaign_id, spot_id, spot_size, browser_name, browser_family, os_type, os_family, utm_source, utm_medium, utm_campaign, utm_content)
TTL stats_day + toIntervalMonth(6); -
Локаль сервера, либо укажите timezone при создании поля date/datetime
-
>ad_type LowCardinality(String)
может LowCardinality кривовато работает на Replicated таблицах... -
group by concat(ad_type,'')
-
проверить гипотезу что группируется по словарю на каждом шарде по разному
-
Привет. Вопрос такой: можно ли делать If в where? Мне нужно ввести условие в зависимости от даты события, что-то я не могу придумать, как мне это сделать
-
да, можно, насколько мне не изменяет память
-
можно любую обычную функцию в where
-
кроме агрегатной :)
-
поэтому написал "обычную"
-
не заметил :)
-
тогда еще вопрос (возможно, тупой). Если писать
IF(dt<='2021-06-11',creation_entry_point!='change_avatar', второе условие), то как оформить второе условие? Весь if звучит как "если дата меньше 11 июня, то не учитывать такой энтри поинт, иначе - учитывать". Не могу понять, как сделать "учитывать" -
If (condition, true-result, false-result)
-
-
Здесь даже if не надо, кмк. Вам только where и условие, которое необходимо учитывать. Только вот какой там ORDER BY ключ.... %)
-
+1
-
where (dt<='2021-06-11' AND creation_entry_point!='change_avatar') or (dt>'2021-06-11' AND creation_entry_point='change_avatar')
-
или where (dt<='2021-06-11' AND creation_entry_point!='change_avatar') or (dt>'2021-06-11')
смотря что вам там нужно -
спасибо, это то, что нужно
-
-
Подскажите как максимально ускорить выборку по дате(dt_start), а то на одних и тех же числах остановился пока.
Таблица 100млн строк. Партиций 30. dt_start может изменяться. Уникальных dt_start 5 млн. Добавил индекс минимум с гранулярностью 4, стало лучше.
CREATE TABLE default.new_tab
(
id UInt64,
str1 Nullable(String) CODEC(ZSTD(9)),
str2 Nullable(String) CODEC(ZSTD(9)),
idfk1 UInt32 CODEC(ZSTD(1)),
idfk2 UInt32 CODEC(ZSTD(1)),
idfk3 UInt64 CODEC(ZSTD(1)),
idfk4 UInt16 CODEC(ZSTD(1)),
idfk5 UInt16 CODEC(ZSTD(1)),
idfk6 UInt16 CODEC(ZSTD(1)),
dt_start DateTime CODEC(Delta(4), ZSTD(1)),
str3 String DEFAULT '0' CODEC(ZSTD(9)),
val Nullable(UInt8),
ver DateTime
)
ENGINE = ReplacingMergeTree(ver)
PARTITION BY intDiv(id, 20000000)
ORDER BY (idfk1, id)
SETTINGS index_granularity = 128; -
а какие ещё выборки кроме как по dt_start важны? Если никакие, то её и ставьте в order by. если же этот idfk1 очень важен для вас, то можно сделать партиционирование по дате, как это указано во всех примерах - станет чуть лучше, за счет отбрасывания лишних партов.
-
Естественно выборки по ключу сортировки.
Не могу поставить дату в ключ сортировки, потому что нужно схлопывать по ключу сортировки.
Партиции тоже не могу сделать по дате, потому что слияние в одной партиции, а дата может измениться и новая строка попадёт в другую партицию, и собственно не схлопнется никогда( -
> что слияние в одной партиции, а дата может измениться и новая строка попадёт в другую партицию, и собственно не схлопнется никогда
Replacing сам по себе не избавит вас от дубликатов в запросах, а только лишь поможет экономить место (и скорость как следствие). Схлопывание произойдет "когда-нибудь". Не надо на это рассчитывать.
Если вам нужно точно избавляться от дубликатов, то без final или limit 1 by не обойтись. Но они тоже дают торможение. Так что common practice - партиции по месяцам, final/limit 1 by, и поиграть с prewhere чтобы считать сначала только нужные столбцы, а потом и всё остальное. -
я в подобной ситуации сделал подзапрос - сначала вычислил нужные id по дате (c final), обеспечив дедубликацию, получил разумное количество данных, а потом уже по первичному ключу быстро нашел и вытащил нужные строки почти целиком. prewhere не давал должного ускорения. В таблице было более миллиарда.
-
да, это понятно, подобным образом это и используем. мой вопрос больше не просто как ускорить поиск, без каких-либо преседаний до. а уже когда сделал много приседаний, уже получил адекватный результат, но вдруг есть какой-то инетересный индекс на дату, который я упустил и он может дать мне еще чуть больше ускорения)
-
-
задавайте свои вопросы, автору лучшиго ответа отправите вознаграждение )
-
вы вопросы в чат задайте, хорошо заданный вопрос, половина ответа =) глядишь и деньги сэкономите
-
Условно говоря, у меня есть таблица в которой будет хранится статистика с устройств (компания занимается мониторингом майнинговых железок).
Каждые 5-10 сек прилетает стата. Список температур, скорость кулеров и хешрейт для каждого алгоритма (на одной машине может майнится n валют).
Для примера, вот кусок статы:
{
"temps": [40, 80, 75 ... ],
"fans": [3200, 1000, ...]
"algo_hs": {
"scrypt": [1000, 1500]
"sha256": [ ... ],
}
}
Количество элементов в массивах может менятся.
Задача:
Считать среднее значение статы за определенный период.
Вопросы:
- Стоит ли использовать Array для колонок или пойти старым способом с нормализацией (как я понимаю посчитать avg для одной колонки простой колонки требует подзапросов, ARRAY JOIN, arrayEnumerate)
- Стоит ли нормализировать словарь algo_hs (словари пока experimental, и с ними будет сложнее работать как я понял)
- Как можно удобно посчитать avg нескольких массивов, не городя большое кол-во подзапросов (т.к. avg нужно будет считать для многих полей, и для произвольного количества устройств) -
Задавал один вопрос несколько часов назад, пока игнор :)
-
- array не стоит, пишите в нормальную таблицу
у вас пол-во элементов в массиве одинаковое для temps, fans и algo_hs.* ?
если да
то все просто
CREATE TABLE mainer_stats (
date DateTime,
client_id UInt64,
farm_unit_id UInt32,
temperature UInt32,
fan_speed UInt32,
algo_name LowCardinality(String),
hash_rate UInt64
) ENGINE=MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, client_id, algo_name) -
ссылка на вопрос?
-
может менятся
-
@BloodJazMan вот, по сути дублирует от части предыдущий
-
-
я имею в виду
статистика приходит ..,
и в ней температура каждого юнита, его скорость и его хешрейт? Так?
понятно что юнитов в разное время может быть разное кол-во...
но просто хочу понять что в одном JSON
индекс от одного юнита в temp соответсвует индексу в массиве fan_speed -
да
-
Map юзабелен
будет чуть быстрее массива
но вам массив и map не нужен
храните по нескольким строкам -
Для каких тогда случаев используют массивы и словари в clickhouse?
-
словари используют для Star Schema обычно, чтобы dictGet заменял INNER JOIN
Массивы используют когда хотят компактно хранить не часто используемые данные в одной строке чтобы данные не сильно дублировались -
https://t.me/clickhouse_ru/224918
и там вроде были ответы. не готовое оптимальное решение конкретного кейса, а просто ответы на конкретные вопросы. возможно автор подумал, что комментаторы пойдут дальше чем просто ответы :)Rick Sanchez in ClickHouse не тормозитДобрый день, есть вопрос про Map в clickhouse. Условно говоря, у меня есть таблица с 3 колонками client_id UInt32 algo_hs Map(String, Array(UInt32) datetime DateTime('UTC') В algo_hs лежит словарь с массивами (хешрейт по алгоритму), например: { "sha256": [26665000, 22520000, 22537000, 22460000], "scrypt": [5667659, 5736897, 5668138], ... } Планируется доставать average algo_hs по client_id за определенный период. Скажите пожалуйста насколько Map юзабелен на данный момент (он за эксперементальным флагом на данный момент) и можно ли делать выборку (avg) по значениям в map?
-
Спасите помогите. Я никак не могу коннектится с ДБ user default вот что я использую:
clickhouse-client -u default --password ZMKr1IqPYb8E -d my_db -
Вот ошибка:
ClickHouse client version 21.1.7.1 (official build).
Connecting to database my_db at localhost:9000 as user default.
Code: 516. DB::Exception: Received from localhost:9000. DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name. -
без пароля тоже не пускает?
-
Без пароля пустил
-
сейчас проверю на java
-
-
- 03 July 2021 (9 messages)
-
КХ вам говорит не алиас dt надо использовать а выражение его
-
Доброе утро! Подскажите пожалуйста почему Grafana не может подключиться к ClickHouse-у при таком настройке Docker Compose файла:
version: "3.3"
services:
clickhouse:
container_name: clickhouse
hostname: clickhouse
image: yandex/clickhouse-server
restart: always
ports:
- "8123:8123"
- "9000:9000"
volumes:
- ./clickhouse:/var/lib/clickhouse:rw
- ./clickhouse/scheme/init_schema.sql:/docker-entrypoint-initdb.d/init_schema.sql:ro
networks:
LogServer:
grafana:
image: grafana/grafana
restart: always
ports:
- '3000:3000'
volumes:
- ./grafana:/var/lib/grafana
- ./grafana/dashboards/:/var/lib/grafana/dashboards/
environment:
- GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=vertamedia-clickhouse-datasource
- GF_INSTALL_PLUGINS=grafana-piechart-panel,grafana-worldmap-panel,vertamedia-clickhouse-datasource,yesoreyeram-boomtable-panel
depends_on:
- clickhouse
volumes:
clickhouse: {}
networks:
LogServer:
Получаю ошибку при попытке проверки подключение:
HTTP error Bad Gateway -
-
-
Network во втором контейнере не прописан
-
/report
-
Что-то непонятно зачем так сложно, зачем джойнить таблицу саму на себя? По идее можно взять ваш внутренний подзапрос и просто добавить к ниму условие про 60 дней из внешнего и всё.
-
Понял ошибку, благодарю, все работает
-
Кто ни будь заливал POINT через mymarilyn/clickhouse-driver?
- 04 July 2021 (145 messages)
-
Всем привет, может кто-нибудь сталкивался.
Кликхаус читает сообщения из кафки, сервера по CPU/диску не нагружены, всё в норме работает.
Потом в какой-то момент кликхаус перестаёт мержить парты, их количество доходит до 300 и данные начинают выбрасываться.
Из-за чего может такое происходить? Скриншот с метриками кликхауса прикрепляю. 78 сервер читает из кафки, 75 - реплика для SELECT'ов.
Версия кликхауса 20.3.19.4.
В логах кликхауса ошибок нет. -
ну есть SYSTEM STOP MERGES
посмотрите в query_log почему мержи перестали идти
и в /var/log/clickhouse-server/clickhouse-server.*
Загляните -
а со стотороны kafka ничего не поменялось?
выглядит так что у вас дофига записей пришло и их мержить надо толпу -
всем привет, а есть возможность в select исключать переменные, как в монге ? а то у меня 700 полей и надо только несколько исключить чтобы перелить данные из одной таблицы в другую
-
SELECT Query
SELECT Query SELECT queries perform data retrieval. By default, the requested data is returned to the client, while in c
-
ООоОО вроде все инструкции уже на несколько раз перечитал но на это не натыкался
-
спасибо
-
только версию clickhouse проверьте, по моему это после 21.3 появилось только
-
ок, спасибо
-
Мне поставлена задача освоить стак: Кассандра, Спарк, Кафка. Для аналитики в Табло. Слышал что кликхаус ощущает кафку как часть себя. Есть тут кто, кто использует кликхаус как витрину? И вообще нужны ли мне знания кафки и спарка? Вдруг можно обойтись одним кликхаусом как-нибудь.
-
=) нет, кликхаус ощущает кафку как ням-ням-ням очень фкусненько, дайте мне еще ваших данных =)
если вам поставили задачу, то наверное не просто так, а потому что эти технологии в компании уже используются
так что стоит на них и сосредоточится
а потом и понимание придет, где конкретно вам clickhouse нужен или не нужен вообще -
Контора буржуйская. И там никто даже не думал в сторону кликхауса. Поскольку меня расширяют в дата инженеры, я подумал вдруг инициативу проявлю полезную)
-
-
-
Ну если грубо
То это высоко эффективное final write once хранилище структурированных данных с возмодностью быстрого аггрегирования
В связке с табло
Недавно стало лучше коннектор поверх odbc появился -
-
-
для WHERE делается push down внутрь источника
сортировка и группировка на стороне clickhouse -
То есть невозможно выбрать лишь часть на стороне mssql?
У меня там таблица на 60М записей, а нужно всего около 1000 последних -
SELECT * FROM jdbc() WHERE date>=toDate(now()) ORDER BY date LIMIT 1000
WHERE выберет те данные которые за текущий день на стороне JDBC источника... а ORDER BY и LIMIT сделает на стороне clickhouse -
попробуйте
SELECT
toDate(time) AS dt,
count(*) AS total
countIf(event = 'CREATE_CHAT') AS create_chat
create_chat / total AS percent
FROM tutorial.community_actions
WHERE (dateDiff('day', community_registered_time, time) <= 7) AND (dateDiff('day', time, now()) <= 60)
GROUP BY dt -
Да, помогло, спасибо!
-
Спасибо, попробуем
-
Подскажите плз, а использование движка Buffer - это грабли или потенциально жизнеспособная история? Задача - логирование действий пользователя в живом режиме (частые одиночные вставки), не хочется сооружать дополнительные прослойки и усложнять запись и аггрегации, вроде Buffer должен бы решить проблему. Потеря куска данных в случае аварии не критична
-
В проде буфер, работает ок, но вставляем по 5к, не по одной
-
Buffer нормальное решение. если вы готовы потерять данные из Buffer в момент перезагрузки ClickHouse
-
Спасибо!
-
по одной строке вставлять оно там получается максимум 5-6к запросов в секунду
-
этого за глаза, в моем случае, спасибо
-
И если альтер на таблицу - дропать буфер и создавать новый
-
То есть возможность писать мимо буфера надо оставить для возможных альтеров
-
спасибо, не подумал бы о таком подводном камне
-
добрый день ... перерыл тут документации не нашел .... а есть способ хешированного партицирования ?
поискал функции котоыре могли бы сводить некие значения в заданный диапозон и не нашел -
Как по мне, так спарк + кассандра для аналитики - это мега костыль, чтобы не платить за вертику. Можете сказать своим буржуям, что чтобы не платить за вертику, да ещё и за сервера сильно меньше платить сейчас передовые компании используют кликхаус либо используют его подходы в своих инхаус решениях. И если они про него ничего не слышали, то пусть посмоторят топ 50 бд и динамику его роста или подождут ещё пару лет, когда он уже будет в топ 20 всех бд и про него уже будут знать все :)
-
Выше были примеры с intDiv, если вам это подойдёт
-
Кликхауз - это колоночник, Кассандра - ключ/значение. Как можно кликхаузом заменить Кассандру?
-
Америкосы) европейский филиал. Я хочу опыт в клиехаусе конечно же. Но мне нужны обоснованные аргументы, а не только статистика популярности. Может его набрали конторы у которых и миллиарда строк не бывает?)
-
Спарк используется для процессинга, в том числе для стриминга, это вообще в другую степь
-
https://clickhouse.tech/docs/ru/introduction/adopters/
Да список публичный, может конкурентов найдете как раз :)Adopters | Документация ClickHouseClickHouse Adopters Disclaimer The following list of companies using ClickHouse and their success stories is assembled f
-
слабо представляю как этим можно воспользоваться чтобы sipHash64 свести к 4 - 6 партициям с более менее равномерным распределением
-
sipHash64 % 6
intDiv(sipHash64, max_siphashvalue*1/6) -
ClickHouse/ClickHouse tagged: v21.6.6.51-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.6.6.51-stable
Release notes:
v21.6.6.51-stableRelease v21.6.6.51-stable · ClickHouse/ClickHouseClickHouse stable release v21.6.6.51-stable
-
Но спарком же можно выдернуть некую табличку? Я хз как это довести до витрины пока..
-
Да, обычно так и делают - спарком что-то откуда-то выдергивают и куда-то кладут
-
PARTITION BY intHash64(id) % 10
Только какой смысл так делать?
что вы хотите этим добиться? -
Например, в кликхауз для анализа
-
Вот я хотел в кликхаус
-
у меня много хешей .... 8.5 млрд .... у меня есть запросы где я ищю по 1 - хешу .... и он делает полное сканирование
-
Вот да) это самое)
-
Сортируйте по хешу, или у вас какие запросы вообще? (bloom filter можно попробовать еще)
-
Я уже знаю, что кликхаус уступает экзасолу в роли витрины, но он и платный..
-
сортирую )
-
Классический конвейер - события скидывать в кафку, доставать оттуда спарком, складывать в кликхауз.
-
он на втором месте стоит по сортировке
-
тогда фулл скана быть не должно,
-
На первом что
-
у вас только запросы вида WHERE hash = ?
или еще какая нибудь дата есть? -
показатель по которому идет первичное отсечение данных
-
Ну конкретно не сталкивался что бы спарком из кафки в кх перекладывали, но допустим.
-
у меня where sourceId = [1-7] AND hash IN ()
-
А что мешает? :)
-
И идет full scan ?
Одна из черепашек лжет.
set send_logs_level='trace'
[1-7] что за странное условие такое? -
Т. Е. Пайспарка хватит для кассандры и кафки?
-
Пайспарк может и читать и писать в Кассандру и кафку. И кликхауз
-
Принцип уменьшения энтропии :)
-
Джоинить где лучше? Уже в кликхаусе? Последний наверно вопрос)
-
Всё было хорошо до этого вопроса
-
Смотря что джойнить и с чем.
Основное ограничение в кх это на размер правой таблицы, она помещается в память(те джойнить 2 таблицы по млрд записей так себе) иначе будет медленно -
Ахах)) я не смотрел еще ничего по кликхаусу)
-
-
Спарк джойнит фигово - колоночник. Лучше лукапить в Кассандру если можно
-
Что из спарка, что из кликхауза
-
Ну тогда можете показать сравнение производительности https://clickhouse.tech/benchmark/dbms/ и нагуглить пару историй, как чуваки соскачили с вертики и экономят лямы денег на лицензиях и железе :)Performance comparison of database management systems
ClickHouse is a fast open-source column-oriented database management system that allows generating analytical data reports in real-time using SQL queries
-
Кассандра к дискам много обращается. Хотя этотнаверно вопрос настроек..
-
Может игнайт или тарантул лучше джойнят? Или гринплам
-
Опять же вопрос, про какие джойны мы говорим, если справа относительно небольшая таблица (миллионы записей) кх нормально джойнит
-
Грин плам же вроде медленный.. экзасол умеет джойнить?
-
Ладно, надо проверять.
-
-
У меня тоже прямо на кликхаузе. Работает, но не летает
-
Экзасол вроде стоил дорого, уже нет?
-
Гляну сам) люблю такое)
-
Можете потыкать наших сейлов (https://altinity.com/contact/), тогда у вас будет союзник в вашей войне :)Contact us — Altinity
Our team of ClickHouse experts is here to help you, from listening to your concerns upfront to guiding you in deploying your data analytics projects.
-
Дорого стоит, да
Но говорят, что у них вроде самые крутые джойны. -
Вот так вот даже) спасибо))
-
Таксисты?)
-
Объем данных большой?
-
-
Под кликхауз лучше чтобы большой :)
-
Миллиарды строк.
-
Ну такое себе, может и в вертику залезть
-
Если не широкие таблицы
-
-
У меня пара миллиардов строк в кликхаусе и на виртуалке за 20 евро быстро работает :)
-
-
-
Про оптимизацию и ускорение кликхауса читаю каждый релиз. В других бд - новый релиз - это только новые свисто-перделки.
-
Ээээээээээээээээ, nyet
-
Не мешайте накидывать на вентилятор :)
-
-
Тогда уж накиньте ещё статей про то, как правильно обновлять кластер, когда в новой версии клика прилетают несовместимые изменения 😂
-
как и везде, читать changelog, обновляться на тестовой среде смотреть что сломалось
-
Ну это само собой, что тестовая среда нужна. А потом-то что, только останавливать полностью весь production на время обновления, потому как по частям обновлять не получится?
-
ClickHouse/ClickHouse tagged: v21.3.14.1-lts
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.3.14.1-lts
Release notes:
ClickHouse lts release v21.3.14.1-ltsRelease v21.3.14.1-lts · ClickHouse/ClickHouseClickHouse lts release v21.3.14.1-lts
-
большинство пользователей может обновлять по частям. Естественно большие пользователи с сотнями нод, типа яметрики, делают обновление только на ходу.
-
экзасол умеет какую-то секретную магию, там якобы хеш-джойны даже дистрибьютид быстро работают.
-
и что оно само чинится потом?
-
вот это было смешно сейчас, у меня в неделю 20 митингов по КХ с новыми и старыми клиентами и все в Сев. Америке.
-
Контора американская, но филиал - европейский. Директор удивился, когда я ему сказал, что в тесла вакансиях бывает кликхаус.
-
Недавно общался с ребятами из Японии, которые чето на клике Тод делают
-
Окей, это хорошо. Я посмотрел backwards incompatible changes за последние полтора года, там вроде на самом деле грабли могут в некоторых случаях вылезти только если с древних версий сразу на новые обновлять.
-
Вперед граблей мало обычно.
Вот откатываться назад граблей предостаточно. -
Ну для этого тестовый кластер 100% будем делать, чтобы все имеющиеся запросы на нём полностью тестировать на реальных данных.
-
ребят, подскажите, я могу выполнить ALTER на таблицу с типом Buffer?
не совсем пойму каков синтаксис. В документации говорится о случае, когда нужно сделать ALTER и на буфер и на подчинённую таблицу. А мне нужно только на Buffer -
Проще ренеймнуть буфер и создать новый
-
Какой альтер хотите сделать то?
-
увеличить пороговые значения.
так-то конечно проще, но туда активно пишутся данные, на горячую опасненько -
Ну выведите эту реплику из под лоад балансера, направьте траффик на другую
-
нет реплики, пока что это единственный инстанс )
-
Нет репликации, используется ненадежный Buffer таблица.
Я бы сказал, что судя по вашему сетапу получить пару ошибок при вставке вы не боитесь :)
Какая версия кх, какой движок базы данных -
можно сделать новый buffer сконфигурировать приложения писать туда, когда траффик на старый буффер кончится - пересоздать его.
-
естественно не боимся, "позавчера" в принципе начали работать с КХ, поэтому экспериментируем в некотором коридоре дозволенного.
ClickHouse 21.5.6.6
SummingMergeTree -
думал как раз об этом, раз нельзя альтер сделать на горячую
-
Я про движок базы спрашивал :)
Но судя по версии у вас Atomic
Тогда можете сделать EXCHANGE TABLES
Оно может атомарно свапнуть две таблицы -
По поводу Buffer, лучше смотреть либо в сторону батчинга на стороне приложения либо в сторону кафки
-
Да, Atomic, сейчас проверил
-
создать второй буфер и потом EXCHANGE TABLES ?
-
Да, потом можно подождать и сделать DETACH первому буферу
-
хм.. спасибо, попробую! )
-
Ахаха, у меня ощущение что из списка топ100 компаний в мире проще перечислить кто НЕ использует КХ
даже из отрытых https://clickhouse.tech/docs/en/introduction/adopters/ Bloomberg Cisco Citadel Securities Comcast Cloudflare Deutsche Bank eBay Spotify -
насколько всё плохо с этим?
для батчинга пока только redis приходит на ум, но эт дополнительная логика
кафка сейчас оверхед -
Ну при внезапном падении кх, буфер может не вставить сообщения, что находятся в нем.
При обычной остановке тоже в некоторых случаях такое могло происходить (когда таблица назначения отключалась раньше буффера) -
про внезапное падение ещё ок, об этом мы знали/думали, на то оно и внезапное.
Второй случай уже печальнее... спасибо за информацию -
Flush Buffer tables before shutting down tables (within one database) by azat · Pull Request #24067 · ClickHouse/ClickHouse
Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Flush Buffer tables before shutting down tables (within o...
-
вот жежшь.. не угонишься за обновлениями
пока у нас в dev стадии всё вертелось, два релиза выйти успело -
О, кстати, у меня вопрос про реплики и distributed таблицы есть. Как лучше всего организовать вывод реплик в оффлайн для профилактических работ?
Через балансировщик нагрузки я могу запретить пользовательским запросам приходить на определённую реплику. Но, насколько я понимаю, никто не гарантирует, что клик не пошлёт туда запросы, приходящие на distributed таблицу (в общем случае, так-то приоритет можно задать). Если остановить clickhouse-server на этой реплике, то это прозрачно обработается, или есть возможность, что запрос отвалится с ошибкой? -
а балансировщик у вас кто?
-
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-shutting-down-a-node
> есть возможность, что запрос отвалится с ошибкой?
Да, скорее всего так и будет -
В компании есть обственная система типа как-то интегрированная с DNS, подробностей сейчас не вспомню. Там куча разных опций для health checks, то есть можно clickhouse мониторить через, допустим, HTTP.
-
Спасибо за ссылку!
Remove server (which is going to be disabled) from remote_server section of config.xml on all servers.
Получается, что если сначала эту реплику таким способом убрать, то это автоматически гарантирует, что туда никакие запросы больше не придут. -
Да
-
Я забыл, что remote_server перечитывается без перезапуска.
-
Будем костылить автоматизацию, руками это делать каждый раз совсем не хочется 😂
-
Может теоретически можно как нибудь осторожно файрволлом зарезать, что бы новые соединения по 9000 порту не смогли приходить, а старые продолжали работать.
-
Сначала попробуем реализовать то, что в присланной Вами статье описано. Вроде не должно быть слишком сложно сообщения через кафку между парой-тройкой утилит покидать.
- 05 July 2021 (151 messages)
-
в клаудфлер офисе были неплохие митапы в по клику свое времябыло очень круто и удобно - сто метров от моего офиса =) Года два назад наверное, может даже чутка поболе. А вот насчет Теслы - я сильно удивлен, я не сильно давно подумывал туда зааплаиться на Data Platform Engineer, Database Engineering - там требвания вот примерно такие вот
you will work on all the major open source db platforms (MySQL, Postgres, MongoDB, Redis, Kafka, Elasticsearch) and the 2 most widespread commercial db platforms (Oracle and MS SQL Server). You need to be an expert in MySQL and one other major DB technology. You will eventually be great at all of them.
А вот Блумберг да, четко в требованиях клик вывешивал. Хотя буду честным - из последних трендов очень много народа хотят Сноуфлейк специалиста. Многие мои знакомые переехали в снежинку. Да и наши тоже с вертицы на снежинку съехали -
clickhouse-bulk, kittenhouse посмотрите
хотя проекты в слегка полудохлом режиме -
-
Таймауты легко ставятся в кх, а read таймаут может и на клиенте сработать
-
-
во вкладке advanced у data sources настроек настроить таймаут
-
-
Здравствуйте! Подскажите пожалуйста, с чем может быть связана такая ошибка? Кто знает 🙂 спасибо 🙏🏽
-
Там написано что закончилось место на диске
-
вроде в самой ошибке указана причина, проверьте сколько места у вас на /dev/vdb1
-
-
Слишком много данных в базе данных или все же это какие-то лог файлы все место заняли, написано …/logsLoader/…?
-
ну а что у вас там настроено по данному пути?
-
Я использую яндек облако, сам ничего не настраивал, а они отвечают через год 🥲 вот пытаюсь понять как самому исправить, возможно ли, данных в бд вроде не шипко много
-
logsLoader это имя таблицы в базе ts_db1
-
в консоли яндекс облака смотрите сколько у вас свободного места под clickhouse осталось...
там же вроде не безразмерные диски а фиксированного размера -
-
Всем привет. Вопрос есть по словарям - пересоздаю словарь, данные он тянет из постгреса. Вопрос в том, что я его дропаю и меняю тип поля id с UInt64 на UInt8. При пересоздании наблюдаю тот же тип поля, что и был до этого.
С чем связана может быть проблема?
Смотрю все через datagrip -
-
хм. чет не подумал
-
ща полезу гляну
-
-
Ключ у словаря должен быть UInt64, если он не составной
-
понял. вопрос снят
-
Добрый день.
Как побороть ошибку ?
Code: 252, e.displayText() = DB::Exception: Too many parts (300).
Merges are processing significantly slower than inserts (version 21.6.4.26 (official build))
Ошибку вызывает даже одна операция вставки.
Выражение для ключа партиционирования для таблицы, в которую выполняется вставка:
PARTITION BY ((toYear(dat) * 4) + toQuarter(dat)) - 1 -
вы путаете парты и партции
перестаньте вставлять данные МАЛЕНЬКИМИ кусками, вставляйте большими (100 000 строк за 1 INSERT)
буфферизируйте на стороне приложения или используйте Engine=Buffer таблицы -
Всем привет.
Подскажите, пожалуйста.
Пытаемся подключится в яндекс облаке к кликхаусу, используем golang.
Библиотека для подключения используется github.com/jmoiron/sqlx
connectionString := fmt.Sprintf(
"tcp://%s:%d?database=%s&debug=%s&username=%s&password=%s",
cfg.Host,
cfg.Port,
cfg.Database,
strconv.FormatBool(cfg.Debug),
cfg.Username,
cfg.Password,
)
...
clickhouseDB, errConnect := sqlx.Connect("clickhouse", connectionString)
Как добавить использование сертификатов и параметр --secure ?
Какие ещё возможно нужны параметры для подключения в яндекс облаке? -
SSL/TLS parameters:
secure - establish secure connection (default is false)
skip_verify - skip certificate verification (default is false)
tls_config - name of a TLS config with client certificates, registered using clickhouse.RegisterTLSConfig(); implies secure to be true, unless explicitly specified -
GitHub - ClickHouse/clickhouse-go: Golang driver for ClickHouse
Golang driver for ClickHouse. Contribute to ClickHouse/clickhouse-go development by creating an account on GitHub.
-
Спасибо. Пазл потихоньку складывается :)
-
Вставляю большими кусками. Вначале накапливаю в Memory таблице, потом вставляю. Периодичность вставки - один раз в 5 минут.
Пока решил проблему
ALTER TABLE work.check MODIFY SETTING parts_to_throw_insert=600
Но смущает фраза из документации КХ:
"при этом могут возникнуть проблемы с фоновыми слияниями и производительностью SELECT-запросов -
Всем привет.
Впервые столкнулся с clickhouse plugin для сбора метрик.
Подскажите пожалуйста, что я не так дела?(
Решаю такую задачу - "Нужен график, rpm (запросов в минуту)" -
есть доки по плагину, в доках описан удобный макрос, будет что-то вроде $rateColumns(StatusRes, count()) FROM (select * from $table where $timeFilter and provider = 'whatever')
-
конкретно с этим запросом - мне кажется или делается now() as t? и фактически будет одна строка в выхлопе и все?
-
фе
-
хорошего вы мнения о кликхаус дба!
-
100к, норм перспективы
-
А это тут вообще к чему?
-
Хорошо, спасибо большое :)
-
очень странно
у вас там что в system.part_log и system.merges ? -
ну вы для однго времени выдаете данные вместо time series
-
и SQL у вас там какой то вообще странный
зачем вам now() ?
какое поле у вас время?
зачем там странные count которые должны были видимо быть countIf
Provider - 'teletrain'
тоже какая от странная конструкция -
Я не знал как по-другому указать определённого поставщика.
А про now() я на форуме подобную конструкцию видел.
Только там ещё добавляли toDate -
ну вы вибираете ОДНО И ТОЖЕ время...
вместо того чтобы выбрать данные по столбцу -
-
ALTER MATERIALIZE INDEX
-
ALTER TABLE ... MATERIALIZE INDEX ...
https://clickhouse.tech/docs/en/sql-reference/statements/alter/index/INDEX | ClickHouse DocumentationManipulating Data Skipping Indices The following operations are available: ALTER TABLE [db].name ADD INDEX name expressi
-
А как можно выбрать данные по столбцу ?
-
не знаете как накостылять DELETE через INSERT в EmbeddedRocksDb? а то я что-то нигде не нашел...
-
SELECT имя_столбца
FROM имя_таблицы -
Просто все затереть пустыми значениями (или добавить колонку is_deleted ?)
-
ааа, ну ок, я подумал что есть магический инсерт ...
-
С countIf жалуется на запрос
-
а как жалуется?
прямо кричит. "ой, не могу уже, пойди почитай документацию"? ;)
https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/combinators/#agg-functions-combinator-ifCombinators | ClickHouse DocumentationAggregate Function Combinators The name of an aggregate function can have a suffix appended to it. This changes the way
-
-
есть getMacro('xxx'), а дальше собрать что угодно можно
-
под макросами имеется ввиду system.macros ?
или просто какие то другие поля из БД? -
мне это мало подходит, нужно отрендерить строки с макросами из system.tables
-
system.macros
-
в смысле у вас в system.tables есть engine_full
и вам в нем надо подставить значения макросов?
SELECT replaceAll(engine_full, '{cluster}',getMacro('cluster')) FROM system.tables ? -
Ну можно сделать через getMacro + replaceAll
-
всё так, просто в некоторых местах встречаются разные макросы, и заранее не всегда можно сказать сколько их будет
но ответ мне подходит думаю, спасибо
хотя странно что в клике нет какой-то функции для рендеринга строк с макросами -
Хаюшке 🙋🏻♂️, насколько будет правильно ставить на таблицу TTL год, партицию по месяцам, и на парочку тяжелых колонок TTL по дню? Сейчас так сделано и у меня есть ощущение, что именно поэтому кх не может смерджить какие то куски. Ругается на Cannot read all array values: read just 47299 of 125861 и Part 202107_3406_3406_0 is covered by 202107_3406_3406_1 but should be merged into 202107_3406_3413_1. This shouldn't happen often
-
Всем привет.
Есть таблица AggregatingMT, из неё раз в день переливаем данные в обычную MT при помощи запроса insert into MT select * from AggregatingMT final.
При этом если запрос выполняется штатно ночью, то всё хорошо. Но если пробую выполнить его днём (например, надо что-то обновить, не дожидаясь следующего дня), то почти всегда получаю ошибку ZooKeeper session has been expired.
Я так понял, что скорее всего проблема в настройках ЗК. Подскажите, пожалуйста, куда копать? Есть ли какие-нибудь рекомендации по настройке ЗК для работы с КХ? -
КХ и вертика и сноуфлейк немного для разного. Например клаудфлер не может использовать сноуфлейк, это бессмысленно дорого, или например тесла не может поставить в автомобиль сноуфлейк, а КХ может (это я фантазирую) (такие случаи есть, КХ поставляется как часть аппаратного комплекса, в сотнях тысяч устройств)
-
сколько партов создается инсертом?
ЗК на одной ноде с КХ ? Есть полный лог или трейс инсерта? -
это две разные ошибки, ничего такого TTL вызывать не должен
-
макросы просто не для этого. В КХ есть например функция format(' {} {}....
-
вам sum( =200 ) нужен.
count(X) считает кол-во СТРОК где поле X не null -
тем не менее встречаются друг за дружкой в бесконечном цикле попыток мерджей. Обновился до последней версии, но ситуация та же
-
да
-
TTL на поле с массивом?
-
Да, response.request Array(String) TTL stats_day + toIntervalDay(1),
-
ясно, nested предполагает что кол-во элементов всегда одинаковое во всех полях и плюс надо делать TTL немного иначе
-
есть вот такой формат выхлопа
https://clickhouse.tech/docs/ru/interfaces/formats/#format-template -
В доке к сожалению есть только один пример для простого Int. Можете подсказать как нужно переделать для более сложных типов? Или куда обратиться за информацией. Правильно понимаю что когда кх удаляет массив, то он не сходится по длине с другими nested полями и выдаёт ошибку?
-
да
-
примеры кх в аппаратах можно ?
-
нет, nda
-
После вставки, похоже, не освобождается какой-то ресурс. Вставка выполняется 1 раз в 5 минут
-
Что с if делать?
-
это не if, это "да", давайте в github с этим. Это слишком сложно в чате
-
это только активные или все парты?
-
-
-
Для одной из таблиц количество активных партов растет после каждой вставки и не уменьшается.
-
Может быть постоянный рост количества активных партов по той причине, что перед вставкой вначале удаляются прежние версии данных (по ключу дата+номер магазина) ?
-
что значит "удаляются" ? alter table delete?
-
select * from system.merges
select * from system.replication_queue -
-
-
похоже все ОК. У вас партиционирование не по дате, вы удаляете из и вставляете в кучу партиций и КХ не успевает мержить миллиард мелких партиций
-
Партиционирование по дате:
PARTITION BY ((toYear(dat) * 4) + toQuarter(dat)) - 1 -
По кварталам. Когда было по месяцам toYYYYMM, проблема еще раньше возникла
-
со временем кол-во уменьшается? Вы перезаливаете за все время или за период?
-
А могут помочь настройки: parts_to_delay_insert и max_delay_to_insert ?
-
Не уменьшается. Перезаливка идет только по данным, вновь поступившим от магазинов. Иногда магазины присылают повторно уточненные данные (та же дата и номер магазина). Поэтому перед заливкой выполняется очистка по условию совпадения ключа. Ключ - строка: дата+_+НомерМагазина
-
-
сделайте
set optimize_throw_if_noop=1;
optimize table .... partition тапартициягде300партов final
и покажите вывод -
ахахаа, никакие индексы не используются для удаления, они только вредят
-
-
Code: 388, e.displayText() = DB::Exception: Cannot OPTIMIZE table: Cannot select parts for optimization
-
Видимо они все заблокированы мутацией
-
system.mutaions надо смотреть
-
Спасибо, разобрался. Удаляю по спискам ключей из таблицы которую уже удалил. Поэтому зависли мутации.
Вы очень помогли ! -
-
-
Никак
-
Kill убивает вроде сразу на всех репликах. Все равно скачает, что бы парты были одинаковые.
-
Спасибо!
-
ЗК и КХ на разных нодах.
Судя по логу (по количеству записей Wrote block with ID), было создано 402 парта. Мониторил system.parts во время работы запроса - количество активных партов держалось на уровне 150-155, после схлопывания осталось 9. Все в одной партиции.
Кстати, чуть-чуть обманул в исходных данных. Целевая таблица - не MT, а ReplicatedMT.
Вот свежий трейс:
[ch-node1] 2021.07.05 16:34:42.913683 [ 12862 ] {4f5ead6c-c027-4952-ac2c-eed4a4601194} <Debug> executeQuery: (from 127.0.0.1:41406) insert into rlc.Delta(eventDate, cpName, macroRegion, shoulder, record_id, ts) select mv.eventDate , mv.cpName , mv.macroRegion , mv.shoulder , mv.record_id , toDateTime('2021-07-05 14:00:00', 'Europe/Moscow') as ts from rlc.ComparedRecords mv final where 1=1 and minFit > 0;
[ch-node1] 2021.07.05 16:34:42.918273 [ 12862 ] {4f5ead6c-c027-4952-ac2c-eed4a4601194} <Debug> rlc.ComparedRecords (SelectExecutor): Key condition: unknown, unknown, and
[ch-node1] 2021.07.05 16:34:42.918330 [ 12862 ] {4f5ead6c-c027-4952-ac2c-eed4a4601194} <Debug> rlc.ComparedRecords (SelectExecutor): MinMax index condition: unknown, unknown, and
[ch-node1] 2021.07.05 16:34:42.945698 [ 12862 ] {4f5ead6c-c027-4952-ac2c-eed4a4601194} <Debug> rlc.ComparedRecords (SelectExecutor): Selected 973 parts by date, 973 parts by key, 603770 marks by primary key, 603770 marks to read from 973 ranges
...
[ch-node1] 2021.07.05 17:05:35.203153 [ 12862 ] {4f5ead6c-c027-4952-ac2c-eed4a4601194} <Error> executeQuery: Code: 225, e.displayText() = DB::Exception: ZooKeeper session has been expired.: While executing SinkToOutputStream (version 20.8.3.18 (official build)) (from 127.0.0.1:41406) (in query: insert into rlc.Delta(eventDate, cpName, macroRegion, shoulder, record_id, ts) select mv.eventDate , mv.cpName , mv.macroRegion , mv.shoulder , mv.record_id , toDateTime('2021-07-05 14:00:00', 'Europe/Moscow') as ts from rlc.ComparedRecords mv final where 1=1 and minFit > 0;), Stack trace (when copying this message, always include the lines below):
0. Poco::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x1a80cd70 in /usr/bin/clickhouse
1. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0xff9e75d in /usr/bin/clickhouse
2. ? @ 0x17d76211 in /usr/bin/clickhouse
3. DB::ReplicatedMergeTreeBlockOutputStream::commitPart(std::__1::shared_ptr<zkutil::ZooKeeper>&, std::__1::shared_ptr<DB::IMergeTreeDataPart>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x17d73269 in /usr/bin/clickhouse
4. DB::ReplicatedMergeTreeBlockOutputStream::write(DB::Block const&) @ 0x17d75582 in /usr/bin/clickhouse
5. DB::PushingToViewsBlockOutputStream::write(DB::Block const&) @ 0x174572b6 in /usr/bin/clickhouse
6. DB::AddingDefaultBlockOutputStream::write(DB::Block const&) @ 0x1745d469 in /usr/bin/clickhouse
7. DB::SquashingBlockOutputStream::write(DB::Block const&) @ 0x1745cac4 in /usr/bin/clickhouse
8. DB::CountingBlockOutputStream::write(DB::Block const&) @ 0x173ac6ec in /usr/bin/clickhouse
9. DB::SinkToOutputStream::consume(DB::Chunk) @ 0x181251b3 in /usr/bin/clickhouse
10. DB::ISink::work() @ 0x17ee7950 in /usr/bin/clickhouse
11. ? @ 0x17f20460 in /usr/bin/clickhouse
12. ? @ 0x17f250ad in /usr/bin/clickhouse
13. ? @ 0x17f25976 in /usr/bin/clickhouse
14. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0xffce517 in /usr/bin/clickhouse
15. ? @ 0xffccb53 in /usr/bin/clickhouse
16. start_thread @ 0x7dd5 in /usr/lib64/libpthread-2.17.so
17. clone @ 0xfe02d in /usr/lib64/libc-2.17.so
Received exception from server (version 20.8.3):
Code: 225. DB::Exception: Received from localhost:9000. DB::Exception: ZooKeeper session has been expired.: While executing SinkToOutputStream.
0 rows in set. Elapsed: 1852.302 sec. Processed 2.81 billion rows, 39.29 GB (1.52 million rows/s., 21.21 MB/s.) -
можно ли что-нибудь сделать если запрос вида
select * from system.mutations m where is_done = 0
не выполняется (висит).
при этом по пулам дела обстоят так:
BackgroundPoolTask 16
BackgroundMovePoolTask 0
BackgroundSchedulePoolTask 2
BackgroundBufferFlushSchedulePoolTask 0
BackgroundDistributedSchedulePoolTask 0
это на второй реплике (на первую был брошен килл мутации). в логах классические по кругу:
(ReplicatedMergeTreeQueue): Not executing log entry MUTATE_PART for part 20210523-421_42_42_0_44 because source parts size (30.42 MiB) is greater than the current maximum (0.00 B).
...
(ReplicatedMergeTreeQueue): Not executing log entry MERGE_PARTS for part 20210705-191_50_55_1 because source parts size (55.24 MiB) is greater than the current maximum (4.45 MiB).
будем лечить стандартно
ALTER TABLE ttt
MODIFY SETTING max_bytes_to_merge_at_min_space_in_pool=161061273600, number_of_free_entries_in_pool_to_lower_max_size_of_merge=1,
number_of_free_entries_in_pool_to_execute_mutation=1;
но вопрос, почему select из system.mutations может висеть? -
Можно ли как-то не допустить дубликатов по нескольким полям в MergeTree?
-
При инсерте
-
переделать таблицу на другой движок?
-
в свежих версиях есть OPTIMIZE DEDUPLICATE BY
https://clickhouse.tech/docs/ru/sql-reference/statements/optimize/#by-expression
при инсерте в КХ вообще нельзя избежать дублей
помимо EmbeddedRocksDB -
Ээээээээх)
-
Либо просто не писать дубли 🙂
-
Ооооо Найс, надо попробовать
-
Ну так и хочу этого всячески избежать)
-
Коллеги, а может кто-то скинуть статью, где доходчиво написано про настройку clickhouse-copier? В доке вообще ничего непонятно.
zookeeper кластер установил, настроил. А как его связать с clickhouse?
Куда класть этот злосчастный zookeeper.xml? -
а есть место где это проверяется (то, что убивается на всех репликах)? просто в ЗК они остались...
select count(*) from system.replication_queue rq where type like 'MUTATE_%';
---
1214
сейчас нод прожевывает мерджи, но потом как она поймет что они были убиты? -
select * from system.replication_queue rq where type like 'MUTATE%'
and (table, new_part_name) not in (select table, name from remote('HOST1', system.parts));
в общем при такой проверке все ок, видимо те мутации которые уже прошли остаются в ЗК а остальные удалились при КИЛЛе -
-
https://github.com/ClickHouse/ClickHouse/issues/25998
вот флажок от дурачка ) -
-
-
проверьте права у кликхауса на /var/lib/clickhouse/
-
создайте :)
-
тоже создайте
-
те, кто хотят, чтобы всё само установилось не сидят на фряхе :)
-
-
почитайте здесь
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-data-migration/altinity-kb-clickhouse-copier -
>выполнил по инструкции в доке
по инструкции в доке вы должны были поправить конфиг, но не поправили и получили кучу ошибок ) -
https://clickhouse.tech/docs/ru/getting-started/install/
>Если сервер не стартует, проверьте корректность конфигурации в файле /etc/clickhouse-server/config.xml
тарампарампаУстановка | Документация ClickHouseУстановка Системные требования ClickHouse может работать на любой операционной системе Linux, FreeBSD или Mac OS X с арх
-
Спасибо. Но, если честно, абсолютно непонятная статья. Что это за файлы? Там не объясняется, что это такое, и нет примеров также... 🤔
2. Create a config file for the task (task1.xml)
3. Create the task in ZooKeeper and start an instance of clickhouse-copier -
в /etc/clickhouse-server/config.d/zookeeper.xml
сюда например -
В смысле? Таск прямо в zookeeper.xml писать?
-
нет вы спросили, как связать zookeeper и clickhouse
и куда положить zookeeper.xml чтобы clickhouse его увидел
я ответил, не так вас понял извините
для copier zookeeper.xml свой
формат такой же как в обычном clickhouse
его просто надо на диск положить на сервере где clickhouse-copier запускается и там в доке которую вам скинули показаны пути куда положить можно -
таск отдельным XML файлом
-
А тот zookeeper.xml, что в /etc/clickhouse-server/config.d/zookeeper.xml лежит, это для чего? Это для репликации?
-
да, это для того чтобы ноды clickhouse-server могли реплицировать метаданные для ReplicatedMergeTree и distributed DDL запросы
-
это может быть один и тот же кластер ZK и для clickhouse-copier и для clickhouse-server
-
Добрый вечер. Хотел удалить часть данных, сделал alter table delete, прождал час, результата нет. Посмотрел select * from system.mutations, мутация с ошибкой DB::Exception: Memory limit (total) exceeded: would use 14.19 GiB (attempt to allocate chunk of 371558958 bytes), maximum: 14.08 GiB. Удалил мутации kill mutation, решил удалить партицию, выполнил alter table on cluster drop partition, висит 3 минуты и выдаёт ошибку DB::Exception: Watching task /clickhouse/clickhouse/task_queue/ddl/query-0000000023 is executing longer than distributed_ddl_task_timeout (=180) seconds. There are 2 unfinished hosts (0 of them are currently active), they are going to execute the query in background., выполняю без on cluster, обе ноды говорят DB::Exception: DROP PART|PARTITION cannot be done on this replica because it is not a leader.. Пока выполняется с on cluster в логах сервера ошибка (ReplicatedMergeTreeRestartingThread): void DB::ReplicatedMergeTreeRestartingThread::run(): Code: 49, e.displayText() = DB::Exception: Part 202107_0_1216_999999999 intersects previous part 202107_0_775_5_1215. It is a bug.. Помогите восстановить работоспособность и удалить партицию.
-
Мне кажется проблема не во времени, т.к. There are 2 unfinished hosts (0 of them are currently active)
-
Не меняется, вставка была приостановлена
-
привет, ребята! извините, что так поздно - но я столкнулся с такой же проблемой. подскажите, удалось решить?
-
Там написано вверху, что примеры в документации
https://clickhouse.tech/docs/en/operations/utilities/clickhouse-copier/
Но непонятно, да
Сейчас исправлюclickhouse-copier | ClickHouse Documentationclickhouse-copier Copies data from the tables in one cluster to tables in another (or the same) cluster. Warning To get
-
Мутации удалились?
Проверьте на всех репликах.
И мержи на всех реплликах проверьте.
drop partition реплицируется, достаточно на одной реплике удалить. -
kill mutation я выполнил на всех репликах, на всех и удалились (select * from system.mutations). Межей на репликах тоже нет (select * from system.merges). В зукипере есть вот такая запись
get /clickhouse/tables/0/transactions/replicas/chi-clickhouse-cluster-0-0/queue/queue-0000010121
format version: 4
create_time: 2021-07-05 18:12:12
source replica: chi-clickhouse-cluster-0-0
block_id:
drop
202107_0_1216_999999999 -
Осталось проверить system.replication_queue и system.parts.
Версия КХ одинаковая на всех репликах?
Можно попробовать detach сделать вместо drop (он тоже реплицируется) - 06 July 2021 (229 messages)
-
в insert функции можно использовать?
-
например toRelativeWeekNum от текущей даты с начала года
-
пытаюсь при создании таблицы сделать так
-
date_w UInt32 default toRelativeWeekNum(now(), toStartOfYear(now())),
-
но пишет что второй аргумент должен быть строкой
-
Function toRelativeWeekNum supports 1 or 2 arguments. The 1st argument must be of type Date or DateTime. The 2nd argument (optional) must be a constant string with timezone name: While processing CAST(toRelativeWeekNum(now(), toStartOfYear(now())) AS date_w_tmp_alter8418478887376668738, 'UInt32') AS date_w: default expression and column type are incompatible. (version 21.4.6.55 (official build)
-
если второй аргумент не указывать, выводит огромное число 2688
-
должно быть количество недель с начала года в районе 28
-
из документации "Переводит дату-с-временем или дату в номер недели, начиная с некоторого фиксированного момента в прошлом."
-
-
-
Вам toWeek нужен
-
date_w UInt32 DEFAULT toRelaviteWeekNum(toStartOfYear(now()))
-
Relative это специальные функции, чтобы вычислять разность между датами.
-
Есть ли какой-то варинат джойна нескольких таблиц через SELECT *, чтобы в результате имена колонок не содержали алиасы таблиц с точкой?
И в каких случаях алиасы с точками будут отсутствовать в результате?
Я проверял на нескольких примерах.
1: джойн 2 таблиц через select *, имена колонок не совпадают между таблицами, в результате имена колонок не изменились
2: джойн 3 таблиц через select *, имена колонок тоже не совпадат, но в результате появились алиасы с точками как префиксы всех имён колонок. При этом джойн 1 и 2 таблицы получается без алиасов с точками, 2 с 3-й отдельно тоже. Несколько раз проверял - дело не в совпадающих именах колонок, все уникальны. -
-
Подскажите, привильно ли я понимаю.
Для обновления строки, КХ читает все строки парта, проверяет подходят ли они под условие мутации, если да, то мутирует, пишет ВО ВРЕМЕННЫЙ парт, и потом этот временный сливает с основным, верно? -
Подскажите как мне сохранить вывод в трубой таблицы на другой машине?
Пример запроса
Select * From data_test
Where data > '20201-05-26'
Полагаю нужен Zookeeper, но как с ним скопировать результат на другую машину? -
да, если парт уже полностью объединен, то просто идет перечитывание всего парта и запись нового но уже с обновленными значениями строк попадающих под улосвия...
мутация также применяется и при штатном слиянии
когда из нескольких партов делают один -
Понял, спасибо большое
-
на удаленной машине сделайте
INSERT INTO new_table SELECT FROM remote(...) WHERE ... -
спасибо
-
Всем привет, подскажите пожалуйста можно как-то на clickhouse обратиться к предыдущей строке (с нужной сортировкой и partition by, как в оконной функции lag)?
Что-то типа такого: lag(url) over (partition by user_id order by event_date) -
в новых версиях windows функции есть
попробуйте ровно так как вы написали -
всем привет! Может кто-нибудь подсказать, будет ли работать кейс, когда source table с движком null, а две вьюхи (materialized view) с replicatedMergeTree? Нашла ман от den crane, он описывает только кейс, когда реплицируется и source table и вьюхи (https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf) . Спасибо заранее 🤗
-
О какой версии идет речь? 21.6?
-
https://altinity.com/blog/clickhouse-window-functions-current-state-of-the-art
21.5 и выше
но лучше 21.6 или 21.7
там для distributed таблиц были правки для window funcitonsClickHouse Window Functions -- Current State of the ArtWindow functions are available in ClickHouse! Learn about this long-awaited feature and how it works, based on extensive QA work at Altinity.
-
Понял, спасибо большое за статью!
-
Версия КХ одинаковая везде 21.5.5.12. В system.replication_queue пусто, в system.parts много всего, что там можно проверить? detach ведёт себя так же как drop
-
-
SELECT toDate(parseDateTimeBestEffort('02.04.2021'))
┌─toDate(parseDateTimeBestEffort('02.04.2021'))─┐
│ 2021-04-02 │
└───────────────────────────────────────────────┘ -
спасибо )
-
Vsegda bylo interesno, a kak on reshayet gde den a gde mesyac 😂
-
сначала день потом месяц, для любителей извращений есть
parseDateTimeBestEffortUS -
O, pro US ne obrashal vnimaniye ) spasibo
-
Добрый день. Использую ReplicatedVersionedCollapsingMergeTree. Почему FINAL or OPTIMIZE не работают если записи для одного и того же ID с sign 1 and sign -1 на разных нодах в кластере (данные вставляются через Distibuted tables). Как решить?
-
потому что неправильно выбран sharding_key для Engine=Distributed
схлопывание FINAL как и OPTIMIZE FINAL работает на локальной таблице в рамках одной реплики , для одной PARTITION BY ... -
Distributed ничего не знает про особенности движка локальной таблицы поверх которой он настроен
при SELECT ... он пробрасывает просто FINAL в локальную sub query ... а там соответсвенно никто ничего не знает про другие реплики и шарды -
ок спасибо. поэкспериментирую с sharding_key
-
привет, а есть какая-нибудь возможность прочитать большую выборку из таблицы батчами из запроса с ORDER BY и WHERE по индексным полям
с limit и offset в конце уже довольно медленно ползет, видел что-то по стриминг, но в этом случае весь результат должен быть в памяти? -
Всем привет, как в ClickHouse положить в колонку json с произвольным массивом?
В одном запросе может прилететь 10 ключей, в другом - 20. Хочу положить как String, а клик при инсерте пытается парсить как json. JSONAsString говорит, что инсертить надо только один столбец. -
да, FORMAT JSONAsString и вставка в один столбец
и отдельные столбцы с DEFAULT JSONExtract(...) -
Там вначале документа объяснено что движок соурс таблицы не имеет значения
-
И репликация будет работать?
-
конечно будет.
-
Пуля, спасибо 🤓
-
Ничего не сливает. кх читает исходный парт и пишет временный со ВСЕМИ строками и потом просто временный становится активным, исходный удаляется.
-
insert intl Select ... from remote
Или
Insert into function remote() select ... -
@den_crane можете подсказать по вчерашнему вопросу с ошибкой "ZooKeeper session has been expired"?
-
Спасибо
-
-
Спасибо!
-
Огонь, спасибо, попробую
-
вот тут подробнее про подход
https://eng.uber.com/loggingFast and Reliable Schema-Agnostic Log Analytics PlatformAt Uber, we provide a centralized, reliable, and interactive logging platform that empowers engineers to work quickly and confidently at scale. The logs are tag
-
похоже что просто зукипер перестал отвечать. Надо смотреть нагрузку на диски зукипера и лог зукипера
-
Добрый день,
Подскажите, пожалуйста, что я делаю или понимаю не так о настройке mutations_sync. Задача - перезалить часть данных, сначала нужно все данные по предикату удалить, а после вставить новые. После прочтения документации мне показалось, что при установке mutations_sync=2, команда ALTER DELETE завершается после того, как все данные удалены на всех репликах и партиции перезаписаны.
Выполняю в clickhouse-client
set mutations_sync = 2;
ALTER TABLE mytable ON CLUSTER mycluster
DELETE WHERE device_id = 42540
SETTINGS mutations_sync = 2
Query id: d2cd632a-0848-461b-bc1c-d18659b70d59
┌─host────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ ch_server_1 │ 9000 │ 0 │ │ 1 │ 0 │
│ ch_server_2 │ 9000 │ 0 │ │ 0 │ 0 │
└─────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
2 rows in set. Elapsed: 0.638 sec.
Следом выполняю count(*) WHERE device_id = 42540 и получаю не нулевое количество.
Я что-то не так понял или сделал? -
а что в system.mutations для этой мутации?
-
надо в таблице транзакций добавить поля для бонусов и писать массивы с бонусами
-
в mutations присутствует запись. parts_to_do постепенно уменьшается.
но я ожидал что команда ALTER TABLE вернет управление только когда все партиции перезапишутся. возможно есть разница в выполнении из clickhouse-client и по jdbc? Я выполняю из client, но это исключительно для тестирования. по факту на prod нужно будет выполнять по jdbc и было бы удобно написать в коде что-то типа
client.execute("ALTER TABLE DELETE ....)
client.execute("INSERT ...")
т.е. я хочу записывать новые данные только после того, как удалены старые -
Какие отличия? И что лучше использовать?
-
никаких, что удобнее
-
странно, таблица replicated?
-
да
CREATE TABLE IF NOT EXISTS mytable ON CLUSTER mycluster
(
`device_id` UInt64 NOT NULL,
`data_item_id` UInt64 NOT NULL,
`data_time` DateTime64(3, 'UTC') NOT NULL CODEC(DoubleDelta),
`data_value` Float64 NOT NULL CODEC(Delta, LZ4)
)
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/ts_data_double11', '{replica}')
PARTITION BY toYYYYMM(data_time)
ORDER BY (device_id, data_item_id, data_time)
SETTINGS index_granularity = 8192; -
вы хотите совсем разные сущности хранить в одной широкой таблице?
-
Добрый день. Прошу помочь.
Подключил dictionary (geoip в формате csv) к серверу. И почему-то простой селект на сервере в продакшене, как-то странно форматируется строку с ipv4 в 16-ричный формат. При том что на тестовом сервере всё нормально.
Тестовый сервер -
https://gyazo.com/f66da528a9ca6ffe05b3df6cd3786fe7?token=f32ab0f7d91e347721b38514b13d2d2f
Продакшен -
https://gyazo.com/5cf2ec410e759b61a82cf81d2e00271fScreenshot by GyazoEasily capture screenshots, GIFs, and replays that are ready to share. Download the free app for windows and mac.
-
видимо еще один баг
-
да без разницы как они связаны, смысл какой их пихать в одну таблицу?
-
что лучше использовать в качестве workaround? можно ли по jdbc получить query id и связать его в записями из system.mutations?
-
select version() на обоих?
-
на тестовом сервере 21.6.6.51 , на проде 20.6.4.44
-
вообще вы понимаете зачем мутации? Они не предполагались к использованию как часть бизнес-процессов, поэтому я не хочу обсуждать это, потому что вы упомянули JDBC.
-
это poc по переезду timeseries с кассандры на clickhouse. процесс уже таков и менять его не хочется, если есть хоть какие-то варианты его сохранить. такие delete выпролняются всего 10-20 раз в день, что мне кажется допустимым
-
я понял, это select из словаря. Это не интересно. Это undefined behaviour
-
по моей статисктике мутации успешно завершаются с вероятностью 50%. Поэтому это все бессмысленный разговор.
-
т.е. как-то это поправить толком не получится? всё перегуглил уже
-
а зачем это править? Какая разница что select показывает? Словарь не для этого
-
мне нужно чтоб ipv4 адреса отображались в нормальном привычном формате
-
абаждите, вы покажите проблему с dictGet
-
о, а с dictGet и правда норм работает, спасибо
-
> по моей статисктике мутации успешно завершаются с вероятностью 50%. Поэтому это все бессмысленный разговор.
а вот это интересно и неожиданно. возможно можете посоветовать как быть в таком случае?
имеется таблица с timeseries данными - показания датчиков. в нормальном режиме данные приходят в реальном времени, писать можем батчами раз в N секунд. но иногда с датчиков приходят выгрузки за определенный период и бизнес требования таковы, что все существующий данные по этому датчику за указанный период нужно заменить. т.е. не дописать строки, а все что есть удалить (или сделать недействительным), а после новые записать.
колич датчиков ~100K, input rate ~30K rows/sec. колич таких выгрузок 10-20 в день, т.е. это редкий случай и скорость их загрузки не имеет значения. именно для этого я думал о ALTER DELETE -
-
А что вы хотите чтобы запрос сделал? Выдал ответ?
-
хочу чтобы он парты мержить начал)
-
У меня мерджит
-
-
вопрос вдогонку про вероятность успешного выполнения 50%:
разве стандартное слияние партиций сделано не через мутации? как это работает если мутации то выполняются то нет? можете подробней рассказать что происходит с failed мутациями? они просто скипаются или происходит повторная попытка? -
Добрый день.
Помогите пожалуйста решить проблему с ODBC.
Установлен и настроен ODBC-драйвер для PostgreSQL. Выполняем запрос через isql - всё отлично, всё работает.
Выполняем запрос в ClickHouse (через clickhouse-client) и получаем ошибку:
Code: 86. DB::Exception: Received from localhost:9000. DB::Exception: Received error from remote server /columns_info?connection_string=DSN....
HTTP status code: 500 Internal Server Error, body: Error getting columns from ODBC 'std::exception. Code: 1001, type: nanodbc::database_error, e.what() = ../contrib/nanodbc/nanodbc/nanodbc.cpp:4806: 08S0: SQLTables unable due to the connection lost (version 21.5.5.12 (official build))'
Запрос простейший вида:
SELECT * FROM odbc('DSN=psql_dsn;', 'sometable') LIMIT 1;
Если же запрос изменить, добавив к DSN значения uid и password, т.е.
SELECT * FROM odbc('DSN=psql_dsn;uid=clickhouse;passwd=xxxxxx', 'sometable') LIMIT 1;
тоо всё работает!
Если выполнить рестарт clickhouse-server, то ошибка исчезает на какое-то время, а потом снова появляется. Закономерности пока никакой выявить не удалось. -
Добрый день. Можно ли как то заставить ClickHouse создавать несколько материализованных преставлений параллельно? Я например запускаю создание 10 (все с populate) первый самое большое - занимает до 2ух минут и последней MV создается обычно за 1 сек.Так вот если я запустил создание сразу 10, то они похоже создаются по одному. Т.к тот что обычно занимает 1 сек ждет пока будут созданы все, которые были запущены на создание ранее.
-
привет
подскажите, пожалуйста, есть ли функция, которая добивает переданную строку нужным символом до определенной длины?
например, передали 40000, хочу добить нулям слева, чтобы получить строку длиной 6 символов, т.е. 040000
аналогично: 1000 -> 001000 -
repeat('0', 6- lenght(str)) || str
Но мб есть и другой враиант -
Лучше не использовать POPULATE
-
Ок
-
postgresql движок вам не подходит по какой то причине?
-
Тогда такой вопрос. Возникла идея на базе distirbuted tables построить materialized views, данные в которых обновляются атоматически.
Нашел статью про это https://github.com/ClickHouse/ClickHouse/issues/467
Но в данном случае надо как-то избавляться от устаревших записей в MV, чтобы показывать только актуальные / последние данные: т.е. для какого-то id брать запись с max(version). Как это лучше реализовать?How to use `Distributed` with `MaterializedView` · Issue #467 · ClickHouse/ClickHouseCREATE TABLE IF NOT EXISTS insert_view(...) ENGINE = Null; CREATE MATERIALIZED VIEW data_local ENGINE = AggregatingMergeTree(..., sumState(num1) as num1,sumState(num2) as num2,sumState(num3) as num...
-
-
ReplacingMergeTree
и писать запросы правильным способом.
Отсутствие дубликатов не гарантируется в любой момент времени.
https://kb.altinity.com/engines/mergetree-table-engine-family/replacingmergetree -
Да. PostgreSQL используется как источник данных для ClickHouse, но вот возникла проблема :(
-
Я к тому, что в 21.5 кликхаус должен уметь сам ходить в postgresql без odbc
-
Правильным это каким?
-
Ну я скинул ссылку, там показаны разные способы
-
я бы не стал использовать КХ в этом случае. КХ для иммьютабл данных.
Я бы взял timescaledb. Там можно апдейтить несжатые данные -
хм странно, может места нет
-
наоборот, мутации это особый вид мержа. Ломаются мутации по разным причинам, и вообще кто сказал что мутация выполнится например за 8 часов? Они могут работать очень долго и это ожидаемо
-
но в 21.5 odbc не нужен для PG? там есть движок готовый
-
> Я бы взял timescaledb
он плохо жмет данные и storage получается очень дорогим. clickhouse нравится наличием конфигурируемых кодеков + сжатия, пока навскидку получается в 2.5x меньше затрат на хранение по сравнению с cassandra. timescaledb в разы больше места использует. плюс поддержка ttl с перемещением в s3 позволит сократить расходы еще сильнее.
> и вообще кто сказал что мутация выполнится например за 8 часов
наверное может, но я наивно полагал что время выполнения есть функция от колиства и размера партиций, которые надо поменять
в любом случае спасибо большое за помощь! -
Можно сначала делать апдейты с tombstone колонкой, а потом раз в день удалять все
Но это немного костыль.
https://kb.altinity.com/altinity-kb-queries-and-syntax/delete-via-tombstone-column -
а как работает получение списка партиций
`SELECT * FROM system.parts
WHERE active and database = '<db>'
`,
когда есть таблицы distributed? (и кластер) Сейчас время от времени возвращается результат -
в таком случае упасть не должно?
-
что упасть? мерж проверяет что места * 2 есть и резервирует и потом стартует
-
никак. system.parts ничего не знает про кластер.
-
Т е при применении кластеров нельзя получить список партиций таким способом? Или это еще Distributed не закончил процесс раскидывания данных?
Есть таблица MergeTree, есть Distributed
Так после этого запроса на партиции ответ приходит через раз
create table db.table_local on cluster clickhouse1
(
video_id String,
publication_ts DateTime,
version Date
)
Engine = MergeTree() partition by version order by tuple() SETTINGS index_granularity = 8192
create table db.table on cluster clickhouse1
(
video_id String,
publication_ts DateTime,
version Date
)
Engine = Distributed(clickhouse1, db, table_local, rand())
db тоже создана ON CLUSTER -
каша, какая каша.
Если вы используете инсерт в Distributed и вам нужна гарантия вставки в реальные таблицы, то просто установите insert_distributed_sync = 1
--insert_distributed_sync arg If setting is enabled, insert query into distributed waits until data will be sent to all nodes in cluster.
если вы хотите увидеть сколько еще не раскидано, испольуйте system.distribution_queue
если вы хотите сделать запрос ко всем нодам, используйте from clusterAllRelicas -
есть вопрос, какие обычно причины того что высокий iowait у кликхауса
-
так у вас нет репликации, вы что пытаетесь сделать?
-
На самом деле всегда есть вариант. Можно запустить десяток тредов с использованием between по кускам PK и это будет в целом норм. Если не хочется думать и делать update в лоб, то да, но всегда есть workaround
-
пропускная способность диска, ниже чем clickhouse хочет прочитать \ написать
читает \ пишет clickhouse достаточно много... -
по таблицам - хочу иметь таблицы на нодах 1-8 (в рамках кластера clickhouse1), и иметь для вставки distributed таблицу
по партициям - хочу по запросу
```SELECT * FROM system.parts
WHERE active and database = '<db>'
```
получать список всех партиций
ЧЯДНТ?) -
весь список из 778 пунктов.
1. слишком мелкие инсерты слишком часто.
2. какой-то баран запустил optimize final
3. кто-то использует мутации неправильно
4. один из дисков вышел из строя -
да все делаете не так
-
в 19 версии видимо нет system.distribution_queue, btw
-
19 is out of support
-
Привет. Переливаем данные из одной бд в другую на регулярной основе Python-ом. Какие бест практис на эту тему, чем лучше пользоваться?
-
select * from remore()
-
optimize final нельзя никогда?
-
что-то никак не пойму, вы хотите заменять старые записи, но не хотите использовать движок ReplacingMergeTree, всё так?
-
очень редко, равносильно перезаписи всей бд
-
по-моему логично валить ошибку запроса если нехватает места
-
ммм а как правильно жать данные?
-
они и так жмутся правильно, когда алгоритм решит, что "надо" иначе алгоритм считает, что оно того не стоит и не жмёт.
-
если не жмет никогда без принудиловки тогда что не так? GraphiteMergeTree
-
про графит ничего не скажу, это специфичный движёк, такие нюансы лучше сразу в вопросе указывать
-
Для графит да. Надо использовать optimize in partition final . Есть специальное приложение которое умное и в курсе как делать.
-
я только начинаю изучать clickhouse, но мне кажется, что ReplacingMergeTree есть аналогом UPSERT. т.е. он либо заменит, либо добавит новые строки. если же в истории, которую надо предварительно удалить, была строка с primary key таким, которого нет в новой "коррекции" данных, которую и надо залить, то это строка останется. ReplacingMergeTree не очень подходит. буду изучать можно ли менять бизнес требования и можно ли их изменить
-
Косякнул, из одной СУБД в другую. Из не-клика в клик
-
а чем принципиально отличается от delete? я имею в виду внутреннюю реализацию. я так понял и то и другое мутация, выше писали, что мутации не надежны и могут просто не работать. я понял, что быстрее, но имеет ли ту же надежность (ну или ненадежность :) ) ?
-
>буду изучать можно ли менять бизнес требования
>бизнес требования таковы, что все существующий данные по этому датчику за указанный период нужно заменить. т.е. не дописать строки, а все что есть удалить (или сделать недействительным)
эм, не вижу противоречий если вам нужно удалять данные, то вы можете их просто заменять недействительными, согласно вашим же бизнестребованиям.
а вот уже недействительные записи вы можете в дальнейшем удалять раз в сутки-неделю, чтобы глаза не мазолили -
UPDATE одной маленькой UInt8 колонки сильно быстрее, чем удаление данных
-
ok, буду пробовать. спасибо большое!
-
Так как лучше всего заливать данные например из MSSQL в ClickHouse, используя питон?
-
быстрее всего через bcp экспортировать в TSV и заливать через clickhouse-client
https://docs.microsoft.com/ru-ru/sql/relational-databases/import-export/import-and-export-bulk-data-by-using-the-bcp-utility-sql-server?view=sql-server-ver15
если одноразово
если нет, то можно и через python
нормально большими батчамиМассовый импорт и экспорт данных с помощью программы bcp - SQL ServerИспользование программы bcp для экспорта данных из любого места в базу данных SQL Server, где работает SELECT. Массовый экспорт данных из таблицы или из запроса и массовый импорт из файла.
-
да, но bcp не умеет экранировать, поэтому можно убить кучу времени на него впустую. Я пробовал с одним клиентом, в итоге написали генератор CSV файлов на go который читал MSSQL и писал CSV.
python конечно тут использовать бессмысленно, только CPU насиловать -
а кто-то использует clickhouse для хранения timeseries когда нужны низкие задержки на чтение?
имеется талица device_id UInt32, date_time DateTime, series_id UInt32, value Float32 ORDER BY (device_id, series_id, date_time).
колич строк ~ 1×10^12
все запросы простые - select * from table where device_id = ? and series_id = ? and date_time between ? and ? limit a offset b
rps низкий - 10-20 req/sec, но нужна latency на уровне сотен ms.
подходит ли clickhouse для этого? (чисто интуитивно - да, но это пока на уровне интуиции). кто-то имеет похожие случаи? -
а если из вертики? Тоже через TSV?
-
я из вертики импорчу как TSV
-
по моему личному опыту из вертики быстро и удобно экспортировать в паркет.
-
а по скорости как? я может что делал не так, но экспорт в csv долго работал
-
быстро, я не мерял особо, я делаю так
echo "select * from " |Vsql -q -t -P format=unaligned | clickhouse-client -
Parquet на ClickHouse импортится сейчас медленее TSV
-
Кстати, если уж тут идёт беседа про обновления данных. Мы в конторе планируем посадить на кликхаус систему финансовой аналитики. Там тоже возникают ситуации, когда с бирж приходят корректировки, и надо старые данные "обновить". Ну так вот, во время тестов на относительно небольшом куске данных в 80 миллиардов строк выяснилось, что делать выборку из ReplacingMergeTree правильным способом (с гарантией отсутствия дубликатов) получается как-то слишком медленно.
В качестве обходного пути мы сделали вот что: в таблице, где эти данные лежат, есть колонка с версией. Собственно версии хранятся в отдельной базе данных, в кликхаус периодически подгружаются как словарь и используются в запросах через dictGet. Обновление, в итоге, перестаёт быть обновлением, так как старые данные никогда не меняются.
Работает это гораздо быстрее чем ReplacingMergeTree, но мне интересно, возможно ли это сделать проще? -
КХ читает и разжимает десятки мегабайт, даже если надо прочитать одну строку.
-
Ну и хотелось бы периодически старые версии подчищать в пределах одной partition. Но, читая этот чат, как-то страшно становится 😂
-
Да, решили.
Пользователю не хватало прав. А "клонов" сбросили перезапуском сервера. -
а через пандас датафрейм имеет смысл пробовать или это плохая идея? Без файлов.
-
есть какой-то https://github.com/kszucs/pandahouse я не проверял
-
привет, подскажите пжл
вот такая таблица
CREATE TABLE IF NOT EXISTS INFORMATION_SCHEMA.tables_shard ON CLUSTER '{cluster}' (
`TABLE_CATALOG` String,
`TABLE_SCHEMA` String,
`TABLE_NAME` String,
`TABLE_TYPE` String ,
`ENGINE` Nullable(String),
`VERSION` Nullable(Int16),
`ROW_FORMAT` Nullable(String),
`TABLE_ROWS` Nullable(UInt64),
`AVG_ROW_LENGTH` Nullable(UInt64),
`DATA_LENGTH` Nullable(UInt64),
`MAX_DATA_LENGTH` Nullable(UInt64),
`INDEX_LENGTH` Nullable(UInt64),
`DATA_FREE` Nullable(UInt64),
`AUTO_INCREMENT` Nullable(UInt64),
`CREATE_TIME` datetime ,
`UPDATE_TIME` Nullable(datetime),
`CHECK_TIME` Nullable(datetime),
`TABLE_COLLATION` String,
`CHECKSUM` Nullable(Int64),
`CREATE_OPTIONS` Nullable(String),
`TABLE_COMMENT` String
) ENGINE= ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/tables_shard', '{replica}')
ORDER BY `CREATE_TIME`
;
пытаюсь вставить такие строчку
def,mysql,innodb_table_stats,BASE TABLE,InnoDB,10,Dynamic,2,8192,16384,0,0,6291456,NULL,2021-07-05 15:10:45,2021-07-05 16:46:28,NULL,utf8_bin,NULL,row_format=DYNAMIC stats_persistent=0,
и получаю
Code: 27. DB::ParsingException: Cannot parse input: expected ',' before: 'NULL,2021-07-05 15:10:45,2021-07-05 16:46:28,NULL,utf8_bin,NULL,row_format=DYNAMIC stats_persistent=0,\n\n':
Row 1:
Column 0, name: TABLE_CATALOG, type: String, parsed text: "def"
Column 1, name: TABLE_SCHEMA, type: String, parsed text: "mysql"
Column 2, name: TABLE_NAME, type: String, parsed text: "innodb_table_stats"
Column 3, name: TABLE_TYPE, type: String, parsed text: "BASE TABLE"
Column 4, name: ENGINE, type: Nullable(String), parsed text: "InnoDB"
Column 5, name: VERSION, type: Nullable(Int16), parsed text: "10"
Column 6, name: ROW_FORMAT, type: Nullable(String), parsed text: "Dynamic"
Column 7, name: TABLE_ROWS, type: Nullable(UInt64), parsed text: "2"
Column 8, name: AVG_ROW_LENGTH, type: Nullable(UInt64), parsed text: "8192"
Column 9, name: DATA_LENGTH, type: Nullable(UInt64), parsed text: "16384"
Column 10, name: MAX_DATA_LENGTH, type: Nullable(UInt64), parsed text: "0"
Column 11, name: INDEX_LENGTH, type: Nullable(UInt64), parsed text: "0"
Column 12, name: DATA_FREE, type: Nullable(UInt64), parsed text: "6291456"
Column 13, name: AUTO_INCREMENT, type: Nullable(UInt64), parsed text: <EMPTY>
ERROR: garbage after Nullable(UInt64): "NULL,2021-"
: data for INSERT was parsed from stdin: (at row 1)
правильно ли я понимаю что NULL поддерживается?
https://clickhouse.tech/docs/en/sql-reference/data-types/nullable/Nullable | ClickHouse DocumentationNullable(typename) Allows to store special marker (NULL) that denotes “missing value” alongside normal values allowed by
-
│ input_format_csv_unquoted_null_literal_as_null │ 0 │ 0 │ Consider unquoted NULL literal as \N
-
это все нужно добавить в запрос после SETTINGS?
-
в сеттингах может не сработать, тк парсится в конце. точно поможет прописать в юзер профиль или в коннекш стринг
-
вы как вставляете
-
через --query="INSERT INTO TABLES FORMAT CSV";
-
тогда можете просто --input_format_csv_unquoted_null_literal_as_null=1
-
спасибо, вроде помогло - после выполнения не ругнулось. только почему-то в таблице вместо 326 записей в таблицу попало 19
-
Ребят, подскажите плиз как подключиться к кликхаусу, обложенному самовыписанными сертификатами (есть ca и клиентская пара ключ-сертификат) из ODBC драйвера под Windows. Напрямую официальный виндовый ODBC драйвер для кликхауса, насколько я понял, не умеет в TLS. Попробовал поставить nginx как reverse-proxy, так он ругается на саму строку запроса, которая начинается со знака "?". Целевой получатель данных - PowerBI, если это важно. Может кто-то сталкивался ?
-
Почему вы считаете, что не умеет?
https://github.com/ClickHouse/clickhouse-odbc/blob/master/packaging/odbc.ini.sampleclickhouse-odbc/odbc.ini.sample at master · ClickHouse/clickhouse-odbcODBC driver for ClickHouse. Contribute to ClickHouse/clickhouse-odbc development by creating an account on GitHub.
-
Рабочий крнфг nginx, правда без SSL https://pastebin.com/Q8PTVBQZserver { listen 80; server_name yyy.xxx.zzz; proxy_redirect - Pastebin.com
Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
-
кстати, вопрос: случайно не пофикили проблему авторизации на CH через nginx ? при аllowed netorks не учитывался remote_addr
-
Code: 33. DB::Exception: Received from localhost:9000. DB::Exception: Cannot read all data in MergeTreeReaderCompact. Rows read: 0. Rows expected: 8192.: (while reading column 900.detected): While executing MergeTreeThread.
Подскажите, пожалуйста, при каких условиях может возникнуть такое исключение? -
Какая версия?
-
имеется в виду что то вроде proxy protocol?
-
client(1.1.1.1)->nginx(2.2.2.2)-->CH
-
нужно создать user A allowed network 2.2.2.2/32
-
тк коннект идет с nginx
-
хотелось иметь user A allowed networks 1.1.1.1/32
-
21.3.3.14
-
Хм, мне кажется нужно будет добавить обе сети
Но вообще это либо сделали https://github.com/ClickHouse/ClickHouse/pull/17707
Либо вот фича реквест
https://github.com/ClickHouse/ClickHouse/issues/24796Allow quotas to be keyed by proxy-forwarded IP address; add support for PROXY protocol by alexey-milovidov · Pull Request #17707 · ClickHouse/ClickHouseChangelog category (leave one): New Feature Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Add support for PROXYv1 protocol to wrap native TCP inter...
-
обновитесь на последнюю 21.3
-
21.3.13
-
спасибо!
-
Не обещаю, что решит проблему, но ваша версия сыровата.
-
Issue 24796 то что надно
-
спасибо @unamedrus
-
-
Скок строк то, и я как понимаю сортировка не совпадает с ORDER BY индексом?
-
> primary на одну колонку,
Он может быть насколько угодно колонок -
чисто для хранения timeseries хороша victiriametrics. ради интереса лил метрики о состоянии серваков в victiriametrics и clickhouse. и vm сильно меньше места занимала и шустрее работала. чисто теоретически CH тоже можно подтюнить, чтобы сопоставимые результаты получить, только очень сложно. единственный минус vm - нет update.
-
EmbeddedRocksDB | Документация ClickHouse
Движок EmbeddedRocksDB Этот движок позволяет интегрировать ClickHouse с rocksdb. Создание таблицы CREATE TABLE [IF NOT E
-
Это видел. У кого-нибудь есть уже опыт использования в production? Я что-то начитался ужасных историй про то, как RocksDB начинает память жрать как не в себя, типа вот этого: https://github.com/facebook/rocksdb/issues/4112 и вот не знаю, стоит ли пробовать.Memory grows without limit · Issue #4112 · facebook/rocksdb
Note: Please use Issues only for bug reports. For questions, discussions, feature requests, etc. post to dev group: https://www.facebook.com/groups/rocksdb.dev Expected behavior Process consumes ab...
-
Основной минус роксдб, что оно нереплицированное, так что словарь выглядит удобнее для небольших объемов данных.
-
10кк строк, order by я даже не пробовал, т.к. слишком много колонок, а он тоже один и хз что делать
-
В mysql у вас order by по вторичному индексу?
-
роксдб каким местом к аналитике относитстся? Если роксдб подходит то зачем КХ? Можно просто взять любую базу на роксдб.
-
мдя, почитал тикет. жалобы в стиле "мы встроили эту бд и у нас в приложении течёт память. нет мы не криворукие. нет, мы не знаем почему у вас всё ок и ничего не течёт". не удивительно, что тикет имеет статус "не достаточно инфы" и висит там уже несколько лет и куча комментов "у нас тоже течёт" и "а у нас прямые руки, поэтому ничего и не течёт" :) в общем спорный достаточно тикет :)
-
Ну Вы моё сообщение прочитайте сначала :) Насколько я понял, Владимир советует попробовать RocksDB вместо словаря с версиями.
-
Это я Денису ответить хотел.
-
пожалуйста используйте функцию "ответить", а то ваши сообщения кажутся немного оторванными от контекста
-
Да я думал, что использовал. А оказалось, что нет.
-
Да, там сам чёрт ногу сломит, но оказаться в лагере тех, у кого течёт, тоже не хочется. Ну и вообще, если оно не реплицированное, то увы не подойдёт :(
-
Если старые версии через пару месяцев можно относительно безболезненно чистить в пределах одной partition, то данных на самом деле немного. Только я вижу, что тут часто жалуются на то, что мутации ломаются.
-
Если их выполнять по очереди, в целом жить можно нормально
-
а там разве спрашивали про это ? Какая разница кто там источник для словаря. У меня например http словари, я даже не знаю что там позади, монга или rocksdb. При чем тут источник словаря? Там спрашивали не про это КМК
-
верно, несколько колонок для сортировки, одним order by не обойтись, но он в кх только один как я понимаю
-
не, неправильно вы понимаете
mysql не может использовать несколько индексов для оптимизации сортировки одновременно -
ну сортировка то по одному полю за запрос, мне это и надо
-
в смысле надо одну и туже таблицу читать разными select order by ?
-
-
что за задача такая да еще в КХ?
видимо да КХ этого не умеет и планов на это нет, скорее всего никогда не будет -
проекции смогут иммитировать вторичные индексы, но я не думаю что имеет смысл их использовать для сортировки
-
ну просто я использую его чтобы изменения товаров агрегировать, графики посчитать быстро. Заметил, что он очень хорошо может и like %% по имени товара искать, так что думаю перенести с мускула и эту таблицу тоже, проблема только в сорте, остальное отлично)
-
Нет, КХ не может заменить mysql совсем.
-
-
Там я спросил про то, имеет ли вообще смысл использовать словарь для того, чтобы указать кликхаусу, какую версию данных надо тянуть, или есть более оптимальный подход?
Предположим, что есть вот такой утрированный запрос: SELECT something FROM table WHERE date = ? AND key = ?. В реальности там сотни тысяч строк для каждого ключа, и в запросах проводится дополнительная агрегация, что кликхаус делает очень быстро. Корректировка предполагает полную перезапись данных для пары (date, key). Вместо перезаписи мы хотим сделать дополнительную колонку с версией, а список последних версий вытягивать при помощи external dictionary. Запрос тогда приобретает вид SELECT something FROM table WHERE date = ? AND key = ? AND version = dictGet('versions_dict', 'version', (date, key)). Пишу с телефона по памяти, поэтому за ошибки в синтаксисе прошу не бить :)
При финальной чистке планируем обновлять колонку с версией таким образом, чтобы самую новую версию сбросить в ноль, тем самым получая дефолтное значение dictGet для случая, когда в словаре данных нет. -
И потом уже можно эти все версии грохнуть из хранилища, на основе которого словарь строится.
-
>AND version = dictGet('versions_dict', 'version', (date, key))
это очень медленно и очень затратно.
пожалуй это будет медленее чем ReplacingMergeTree и +agrmax -
попробуйте использовать сторнирование, либо с collapsingMT либо с SummingMT
-
ReplacingMergeTree у нас почему-то гораздо медленнее отработал на тестах. Надо будет ещё раз поковыряться, спасибо.
-
обычно ответ на этот вопрос занимает недели, и несколько часовых митингов с клиентом, чтобы понять их бизнесспроцессы и сказать что на самом деле будет работать
-
-
А можете подробнее рассказать, почему это медленно? Словарь он же весь в памяти лежит, насколько я понимаю.
-
КХ может читать и аггрегировать миллиарды строк в секунду, словарь это пятое колесо, 10 млн. dictGet в сек.
Очень часто мы ускоряем клиентам запросы перенося dictGet на уровень выше (после группировки), запросы ускоряются в 10ки раз. -
Ага, спасибо, теперь понятно.
-
MV не читает таблицу исходную, MV пофигу что там за движок
-
MV получают данные от ИНСЕРТОВ.
-
да я понимаю, я имею ввиду то, что в replacing будут дубликаты вставлять сумм/кол-ва по некоторым id, как бы их сложить MV в таблицу, которая будет агрегировать то что вставляем.
С Collapsing все понятно, там на -1 умножили, сумму отменили, и вставили нужную.
А вот со вставкой в Replacing чуть иначе получается -
да так же, вставили версию 10, отменяем -10, вставляем новое значение 100
-
понял, спасибо)
-
я на -1 НЕ умножаю например, я и в collapsing пишу с минусом, я дописывал в доку https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/collapsingmergetree/#primer-drugogo-podkhodaCollapsingMergeTree | Документация ClickHouse
CollapsingMergeTree Движок наследует функциональность от MergeTree и добавляет в алгоритм слияния кусков данных логику с
-
Идея состоит в том, что слияния при сворачивании учитывают только ключевые поля, поэтому в отменяющей строке можно указать отрицательные значения, которые нивелируют предыдущую версию записи при суммировании без учета поля Sign.
-
Нового тут ничего нет , в вертике точно также сторнируем, по многим причинам, включая то что таблицы с LAP не позволялил update/delete
-
да, этим способом пользуюсь, все отлично считает.
- 07 July 2021 (78 messages)
-
Доброе утро! Столкнулся с периодической ошибкой:
DB::Exception: Asynchronous write error on file /var/lib/clickhouse/store/f8b/f8b15971-20f4-4944-b85f-797a70ec6ba5/tmp_merge_20210706_2203986_2209222_32/country_id.bin
Возникает во время регулярно запускаемого оптимайза. Оптимайз запускаю из за того что данные по тех причинам пишутся с нахлестом. Движок - реплейсинг.
Что можно с этим сделать? -
попробуйте datax
-
А что это?
-
Projects · alibaba/DataX
DataX是阿里云DataWorks数据集成的开源版本。. Contribute to alibaba/DataX development by creating an account on GitHub.
-
-
А поддержка клика есть?
-
-
-
мы используем несколько способов:
1) выгружаем через bcp из mssql и через clickhouse-client ипорт файла - очень быстро и просто, не нужно писать код
2) через DAG в airflow, пришлось написать operator для перекачки данных из mssql > clickhouse -
Интересует наиболее быстрые по времени варианты, объемы довольно приличные
-
То, о чем говорил @den_crane, - это и есть быстрый по времени вариант отчасти, не требующий инструментов сверху
-
-
такс,
создаем кластер, на них таблицы CREATE TABLE ON CLUSTER. Также создаем таблицу Distributed, которая смотрит на созданные ранее таблицы. Данные вставляем в Distributed, она уже раскидывает по нодам. Это верно? Неверно на моменте запроса партиций? -
Привет! Подскажите, пожалуйста, из-за чего может сыпаться 235ая ошибка (part already exists), при этом свежие данные в таблице появляются. Есть распределенная таблица, данные в которую доливает мат вьюха из таблицы с kafka engine и на моменте инсерта вылезает эта ошибка, партиционировение toYYYYMMDD(DateTime)
-
Может не хватать места. Вроде были рекомендации, что для Optimize нужно столько свободного места, сколько занимает таблица.
-
угу, мы вот только что обнаружили что у нас ttl на таблицу отрабатывает странно - парты остаются на диске хотя в кх их не видно и в детач их нет
-
День добрый. Насколько безопасно удалить информацию о партиции в Зукипере?
-
и еще такой вопрос, как рестартануть таблицу типа ReplicatedMergeTree, которая не определила лидера и active_replicas=0
-
при этом она не ридонли и дает из себя получать данные
-
в новых версиях есть https://clickhouse.tech/docs/en/sql-reference/statements/system/#query_language-system-restore-replica
но без нужды я бы в ZK лезть не стал
у вас что-то локально с партом случилось что вы его из ZK вычистить хотите?SYSTEM | ClickHouse DocumentationSYSTEM Statements The list of available SYSTEM statements: RELOAD EMBEDDED DICTIONARIES RELOAD DICTIONARIES RELOAD DICTI
-
насколько новых. SYSTEM RESTORE REPLICA transactions ON CLUSTER cluster - вызывает ошибку B::Exception: Syntax error: failed at position 8 ('RESTORE'): RESTORE REPLICA transactions ON CLUSTER cluster. Expected one of: START TTL MERGES, RELOAD CONFIG, RELOAD DICTIONARY, KILL, STOP FETCHES, FLUSH LOGS, DROP MMAP CACHE, SHUTDOWN, SUSPEND, RELOAD EMBEDDED DICTIONARIES, STOP DISTRIBUTED SENDS, STOP TTL MERGES, DROP MARK CACHE, STOP REPLICATED SENDS, RELOAD SYMBOLS, STOP MOVES, START MOVES, STOP REPLICATION QUEUES, DROP COMPILED EXPRESSION CACHE, RESTART REPLICA, START DISTRIBUTED SENDS, SYNC REPLICA, STOP LISTEN QUERIES, STOP MERGES, START REPLICATED SENDS, DROP DNS CACHE, START MERGES, START LISTEN QUERIES, DROP UNCOMPRESSED CACHE, RESTART REPLICAS, DROP REPLICA, START FETCHES, START REPLICATION QUEUES, FLUSH DISTRIBUTED, RELOAD DICTIONARIES (version 21.5.5.12 (official build))
-
хотим удалить битую партицию, ругается на лидера, которого и нет сейчас.
-
Привет
Подскажите правильный ли подход чтобы хранить последний State для account?
CREATE MATERIALIZED VIEW IF NOT EXISTS account_balance_merged
ENGINE = AggregatingMergeTree() ORDER BY (account)
POPULATE AS
SELECT
account,
anyLastState(balance) balance
FROM account_balance
GROUP BY account;
Почему-то в Select после агрегации хранится не последний баланс -
https://github.com/ClickHouse/ClickHouse/commit/4c391f8e9945df67b171d20612b62b45451ea8b4
21.7 который еще не в зарелиженSYSTEM RESTORE REPLICA replica [ON CLUSTER cluster] (#13652) · ClickHouse/ClickHouse@4c391f8* initial commit: add setting and stub * typo * added test stub * fix * wip merging new integration test and code proto * adding steps interpreters * adding firstly proposed solut...
-
а можно сообщение об ошибке?
вроде в 21.5 уже особо лидер для ZK и не нужен... хотя могу ошбаться не помню -
у меня 21.5.5.12 и там сказано про ридонли состояние таблиц. У меня же не ридонли состояние. Нет лидера и активных реплик по system.replicas
-
Всем привет! Не подскажете, какой лучше взять драйвер для JVM? Интересует скорость вставки и фукнционал, совместимость с JDBC не нужна.
-
B::Exception: DROP PART|PARTITION cannot be done on this replica because it is not a leader.
-
собственно,
SELECT distinct partition FROM cluster({cluster}, system, parts) проблему решил -
Мы из MSSQL тянем через insert select from jdbc(…)
-
и как оно?
-
работает. Мы юзаем только копирование в лоб. Максимум с where version > XXX, полет нормальный. Про скорость не скажу - не меряли. Но у нас в mssql таблицы до 50М записей. Как на бОльших обьемах будет - не знаю
-
Извиняюсь сразу за беспокойство, но подскажите плиз какие-нибудь курсы по кликхаусу на русском. Есть хорошие, чтоб прям стоящие были. А то мы пока нашли только 8 часовые по верхам для начинающих.
И еще небольшой вопрос, а у самого яндекса нема курсов по нему? -
курсов нет, есть канал докладов КХ, а еще есть альтинити
-
у них есть курс как раз 8 часовой, может кто-то дать фидбек, как эти курсы? стоят ли они своих денег (тк цена у них немаленькая)
-
У вас уже есть опыт эксплуатации кликхауса?
-
У нас его подключили уже к платформе, но опыта использования совсем мало.
-
-
Точно индексы не используются при удалении ? Т.е. всегда, независимо от наличия индексов, выполняется полный скан таблицы, даже если по условию WHERE есть полностью покрывающие индексы ?
-
да там аналитику собирать
-
всем привет
у меня есть табличка типа “ключ - значение” (на самом деле это запрос, но пусть будет просто табличка)
и я что-то не могу сформулировать запрос, который вернет все пары ключ-значение, у которых значение больше, например, трех сигм от всей выборки
то есть СКВ-то понятно как посчитать, но вот как это все гм, объединить в одном запросе (а мне надо именно в одном, у меня, к сожалению, есть только графана и ее плагин) - понять не могу -
подзапрос или конструкция WITH до запроса
-
Привет
Подскажите правильный ли подход чтобы хранить последний State для account?
CREATE MATERIALIZED VIEW IF NOT EXISTS account_balance_merged
ENGINE = AggregatingMergeTree() ORDER BY (account)
POPULATE AS
SELECT
account,
anyLastState(balance) balance
FROM account_balance
GROUP BY account;
Почему-то в Select после агрегации хранится не последний баланс -
добавьте в запрос FINAL.
-
ооооооооооооо, точно, WITH
спасибо! -
Можно чуть подробнее
Вычитываю результат с помощью
SELECT
account,
anyLastMerge(balance) balance
FROM account_balance_merged
GROUP BY account; -
мне кажется что anyLast здесь очень плохо будет работать, лучше хранить вместе с timestamp и выбирать по argMax(balance, timestamp)
-
-
при использовании FINAL (после названия таблицы) агрегация не нужна
https://clickhouse.tech/docs/ru/sql-reference/statements/select/from/#select-from-finalFROM | Документация ClickHouseСекция FROM В секции FROM указывается источник, из которого будут читаться данные: Таблица Подзапрос Табличная функция С
-
собственно поэтому он и называется anyLast, а не last :) но для простых случаев на одном инстансе работает ок.
-
-
-
Дмитрий, спасибо!
-
Добрый день, подскажите после остановки этого скрипта, что бы продолжить его мне нужны позиции бинлога, где я могу их получить ?
clickhouse-mysql \
--src-server-id=1 \
--src-resume \
--src-wait \
--nice-pause=1 \
--src-host=10.0.0.4 \
--src-user=reader \
--src-password=q18234ty \
--src-tables=t.a \
--dst-host=127.0.0.1 \
--dst-table=a \
--dst-schema=t \
--pump-data \
--mempool -
Лидер нужен обязательно.
Таблица не подключена к Зукиперу, чините.
Должна быть в system.replicas leader, not readonly, not session_expired, и total_replicas=active_replicas.
Попробуйте system restart replica <table_name> -
пробовал, безрезултатно и ошибки нет
-
SHOW SLAVES на MySQL ничего не показывает вменяемого?
-
Добырй день. Есть таблица table_a с множеством записей - в ней указан order by field_a, field_b. Если сделать select * from table_a order by field_a, field_b limit 100 offset [last page], то все ок - индекс используется. Если сделать view для этой таблицы table_a_view и в описание вьюхи добавить order by field_a, field_b то тоже все ок. Т.е запрос select * from table_a limit 100 offset [last page] отработает нормально. А вот если НЕ добавлять ORDER BY во view definition и выполнить запрос select * from table_a_view order by field_a, field_b limit 100 offset [last page] - то может и память закончится. Я правильно понимаю что в этом случае индексы не используются?
-
и в логах нет ошибок?
-
Ничего вменяемого, дело в том что после перезапуска его я получаю дырку в кликхаусе, репликация продолжиться с того момента как я запущу этот скрипт.
-
насколько я понимаю ни where ни order by не пробрасываются во внутрь вьюхи.
я завёл багу на гитхабе, но что-то мне подсказывает, что это низкоприоритетная таска, хотя в текущем виде вьюхи получаются вообще не юзабельны
https://github.com/ClickHouse/ClickHouse/issues/25418view optimisation · Issue #25418 · ClickHouse/ClickHouseDescribe the situation CREATE VIEW v1 AS SELECT * FROM t1 FINAL SELECT * FROM v1 WHERE date = today() is too slow. Expected performance If a column in view and in table is the same - it needs to do...
-
да, кстати, с FINAL такая же беда на основной таблице
-
пожалуйста используйте функцию "ответить", а то ваши сообщения кажутся немного оторванными от контекста
-
(ReplicatedMergeTreeRestartingThread): void DB::ReplicatedMergeTreeRestartingThread::run(): Code: 49, e.displayText() = DB::Exception: Part 202107_0_1216_999999999 intersects previous part 202107_0_775_5_1215. It is a bug.
-
В зукипере удалили все таски, и рестарт клика помог в плане определения лидера и появления активных реплик, но детач проблемной патриции снова привел нас к ошибке
-
Потере лидера и активных реплик для таблицы
-
Завтра попытаюсь удалить всю инфу по партиции в зукипере и посмотреть на поведение этой таблицы. Иначе вижу только возможность восстановления через обычную таблицу MergeTree
-
И потом снова в репликацию
-
Добрый день! Запустил из консольного клиента несколько дней назад запрос на modify column с UInt16 на UInt32, на довольно большой таблице. Получил в итоге таймаут, но запрос до сих пор висит в show processlist.
Как понять, он там вообще ещё работает или просто завис и надо его убить? -
GitHub - long2ice/synch: Sync data from the other DB to ClickHouse(cluster)
Sync data from the other DB to ClickHouse(cluster) - GitHub - long2ice/synch: Sync data from the other DB to ClickHouse(cluster)
-
Всем привет
Почитал чатик, верно понимаю, что eval() не завезли еще и что-то типа select eval('1+1') -> 2 пока не получится сделать? -
не завезли, и не завезут
eval слишком медленный функционал -
вы что конкретно хотите сделать? зачем вам eval?
-
Решение довольно сложное, не ужели оно единственное?
Не проще мне уж забирать логи с clickhouse-mysql и там смотреть позицию в бинлоге (в случае падения)? -
-
-
Всем привет! В таблице есть столбец с типом данных AggregateFunction(argMax, UInt16, DateTime), Нужно конвертировать в AggregateFunction(argMax, Int16, DateTime). Подскажите что сделать, кх говорит что не может привести типы...
-
Сам себе отвечу 😁
Выполнил тесты, подтверждающие, что индексы не используются при удалении:
Поиск по условию, которое содержится во вторичном индексе в таблице ~7 миллиардов строк: 1.3 сек. Ключ партиционирования был в таблице:
toYear(dat) * 4 + toQuarter(dat) - 1
Мутация (удаление) >1000 секунд (к таблице выполнялись также запросы других пользователей).
После удаления вторичного индекса поиск замедлился до 14 секунд, на скорость мутаций это не повлияло. - 08 July 2021 (127 messages)
-
ну мутации медленные да, индексы туда не догадались прикрутить
-
Вопрос с подвохом, тк типы одинаковые
-
-
ну если вам не нужны те данные, то можно
она создается заново при новом alter table ... freeze -
Спасибо
Т.е. это копия которую создал freeze? -
-
-
да, эта директория появляется после создания резервной копии
-
detach отсоединяет партицию/таблицу/парт
-
-
-
-
-
нет, детач делает так, что таблица забывает о партиции/парте, либо полностью таблица отсоединяется и перемещается в .../table_name/detached
А frteze делает копию парта/партиции/таблицы на конкретный момент времени, далее копируете из директории /shadow/N туда куда вам нужно.
чтобы восстановить, нужно добавить в ../table_name/detached и выполнить attach -
-
-
-
-
-
нет, ничто их них не удаляет данные.
-
-
нет, КХ просто забудет о существовании такой партиции, которую вы отсоединили. select не даст данных из этого парта/партиции/таблицы.
-
-
-
-
зачем?
вы хотите резервную копию? -
-
-
-
-
-
ну в таком случае я бы сделал freeze partition, а потом drop partition. Но возможно, просто detach тоже хороший метод. Насколько я знаю detach реплицируется, то есть данные забудутся на всех репликах, freeze не реплицируется.
-
-
-
-
вам их нужно будет скопировать в другое место(другой сервер/диск), и потом положить обратно?
-
Да.
-
да
-
мб лучше подскажут, почему в таком случае можно/нельзя делать detach. Но пока выглядит так, что и detach подходит, если вы хотите отсоединить данные, и потом их переместить и почистить все в detached.
-
-
Привет, есть вопрос касательно агрегатных функций и NaN, возможно кто-то сталкивался.
Есть таблица, куда идут некторые метрики, по которым рисуются графики. Т.к. масштаб при отрисовке может быть разный, то есть несколько MV, агрегирующие min/max/sum/var/etc по секунде/минуте/часу, чтобы ускорять запросы и не группировать с raw данных.
Проблема в том, что при агрегации хочется пропускать не finite значения (для простоты только NaN) и оставлять в результирующей выборке их только в том случае, если все значения были nan.
Если использовать столбец minIf AggregateFunction(minIf, Float64, UInt8)
и при агрегации minIfState(value, isFinite(value)) AS min,
то работает почти как нужно: nan действительно не учитываются.
Однако, если все значения были nan, то результат получается 0:
SELECT minIfMerge(s) FROM (SELECT minIfState(42, isFinite(NaN)) s);
выдаёт 0
Как лучше всего обойти эту проблему и получить в результате nan? -
-
Привет, для кх есть разница между запросами
select arrayFirst(....) as mynum,
mynum +1 as mynum1,
mynum+ 2 as mynum2
select arrayFirst(....) +1 as mynum1,
arrayFirst(... ) +2 as mynum2
в плане оптимизации есть ли разница между этими запросами, или во втором случае arrayFirst(... ) посчитается 1 раз и поучаствует в обоих расчетах? -
в первом случае три раза будет считаться
во втором два
не знаю будет это исправлено вот тут или нет
https://github.com/ClickHouse/ClickHouse/pull/23367
ну и сделайте EXPLAIN PIPELINE
посмотрите там должно показыватьсяImplement short circuit function evaluation by Avogar · Pull Request #23367 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): New Feature Changelog entry (a user-readable short description of the cha...
-
Добрый день коллеги, есть вопрос как вставлять данные в таблицу из приложения.
Использую clickhouse-jdbc, есть коллекция объектов, перевожу их в json и пытаюсь вставить.
Код примерно как в примере:
val sb = new StringBuilder()
events.map(ev => json.eventToString(ev)).foreach(s => sb.append(s +"\n"))
val stream = new ByteArrayInputStream(sb.toString().getBytes("UTF-8") )
try {
sth.write().sendToTable(table, stream, ClickHouseFormat.JSONStringEachRow)
} catch {
case ex: java.sql.SQLException => log.error("An error occurred when inserting data into clickhouse", ex)
}
получаю эксептион DB::Exception: Format JSONStringEachRow is not suitable for input (with processors)
в юнит тестах не нашел примера, может кто подсказать? -
Здравствуйте, как работаь с explain запросами, точней через что можно их выполнять ?
-
clickhouse-client
-
-
Я что то не правильно пишу или какие настройки кликхауса нужны ?
-
Версия клик хауса 21.6.6.51
-
А дайте запрос.
-
Какой запрос ?
-
-
Ваш запрос, или вы настолько жестоки, что хотите что бы я его руками набирал?
-
EXPLAIN SYNTAX SELECT * FROM system.numbers AS a, system.numbers AS b, system.numbers AS c;
-
да не похоже, ошибки от невозможности приведения сыпятся
-
EXPLAIN SYNTAX
SELECT *
FROM system.numbers AS a, system.numbers AS b, system.numbers AS c
Query id: 51eddd00-e00f-4eca-a801-7748c9cf94cf
┌─explain────────────────────────────┐
│ SELECT │
│ `--a.number` AS `a.number`, │
│ `--b.number` AS `b.number`, │
│ number AS `c.number` │
│ FROM │
│ ( │
│ SELECT │
│ number AS `--a.number`, │
│ b.number AS `--b.number` │
│ FROM system.numbers AS a │
│ CROSS JOIN system.numbers AS b │
│ ) AS `--.s` │
│ CROSS JOIN system.numbers AS c │
└────────────────────────────────────┘
на 21.8 работает.
Вообще подозрительно похоже на эту ошибку
https://github.com/ClickHouse/ClickHouse/pull/25082Fix crash in explain syntax and cross join. by KochetovNicolai · Pull Request #25082 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Bug Fix Changelog entry (a user-readable short description of the changes...
-
Я не знаю точно в чем проблема и почему не работает в клик хаус клиенте, но в редаше получилось сделать запрос
-
ребят подскажите пожалуйста.
столкнулся с такой проблемой: перестали обновляться мат вьюхи, посмотрел логи были ошибки связанные со стартом тредов чтото про cleanup thread, перезапустил под с КХ в кубере, все побежало, но данные за некоторое время так и не попали в мат вьюхи -
-
-
-
Коллеги, всем привет, подскажите плиз работаю в pyspark, нужно загрузить spark df в Clickhouse (размер примерно 5 млрд записей * 30 столбцов) , как это можно сделать? И могу ли я это сделать через pyspark или придется писать tsv файл и уже его в Clickhouse?
-
-
-
select s from table group by s order by count() desc limit 1 - не подходит чем-то?
-
нужная строка лишь одна из многих, которые тоже агрегируются. Думал про anyHeavy() но в доке говорится про недетерминированность результата
-
Интересно почему получается разное количество? С windowFunnel получается больше результатов и они релевантные
sequenceMatch('(?1).*(?2).*(?3)')(toDateTime(sessionTimestamp + (eventOffset / 1000)),
eventName = 'cSearchAddress',
eventName = 'cHouseNumberSearchString',
eventName = 'cAddress',
eventName NOT IN
('cSearchAddress', 'cHouseNumberSearchString', 'cAddress')) as sequenceEventName
windowFunnel(60000)(
toDateTime(sessionTimestamp + (eventOffset / 1000)),
eventName = 'cSearchAddress',
eventName = 'cHouseNumberSearchString', eventName = 'cAddress') AS level -
-
в config.xml настройка interserver_http_host
-
то есть он в зукипер запишет значение этой настройки?
-
Здравствуйте, господа.
Подскажите, сталкивался ли кто-нибудь с таким поведением - если запрос сложный и падает из-за ограничения по памяти, то кликхаус не отдает память обратно. Версия кх - 20.6.3.28
Шаги:
1) имеем max_memory_usage, например, 50 Гб
2) запросу нужно около 70 (эмпирически приверено) и он падает
3) через некоторое время (10-12 упавших запросов) уже простые запросы не пролезают
Через top посмотрел, что после каждого упавшего запроса %MEM вырастает на ~7% и не падает назад.
Если запрос выполняется успешно без ограничения по памяти, то потребление памяти не растет -
и можно ли туда IP-адрес вписать, а не имя?
-
я не очень осведомлён о механизме подгрузки конфига из зоокипера, поэтому не подскажу.
но по умолчанию точно нет, кликхаус в момент обмена данных с другим инстансом будет смотреть этот параметр -
да, обычно используют для задания IP адреса в приватной сети, чтобы кликхаус ходил через неё
-
Server Settings | ClickHouse Documentation
Server Settings builtin_dictionaries_reload_interval The interval in seconds before reloading built-in dictionaries. Cli
-
имя реплики в ZK это часть path
значение куда именно обращаться для скачивания новых партов зареганых в ZK берется из interserver_http_host и тоже сохраняется в ZK при регистрации \ изменении конфигурации реплики -
Добрый день. Чего-то последние релизы (и stable, и LTS) не могут принять от carbon-clickhouse больше 4000 метрик за раз (Attempt to read after eof, сначала пятисотка от HTTP-клиента, потом сегфолтит). Последний раз работало на 20.6.8.5. Не подскажете, куда копать? Или это приколы carbon-clickhouse явные?
-
Здравствуйте! Делали insert from select в дистрибьютед таблицу через clickhouse-client одного из инстансов, в процессе этого потеряли коннект к поду.. Продолжил ли запрос выполняться в этом случае, и можно ли как-то проверить, что он до конца отработал не сравнивая данные в таблицах?
-
возможно умерло что-то в clickhouse
-
Подскажите как в toDateTime загнать миллисекунды?
-
в DateTime нет миллисекунд, мб тебе нужен DateTime64 (и соотв. toDateTime64)
-
Он UnixTimestamp64Milli странно переводит
-
Так используйте fromUnixTimestamp64Milli
-
если под остался жив и вы просто коннект из clickhouse-client потеряли
то смотрите на поде в котором clickhouse-client коннектился, в system.processes
и прогресс как ваш INSERT ..SELECT работает
и ничего не трогайте
у вас под distributed лежит ReplicatedMergeTree?
значит сначала данные у вас будут разбиты по шардам в каталоге /var/lib/clickhouse/data/db/distributed/<shard_host_port>/*.bin этого distributed на ноде инициаторе
данные там на блоки разобьются на миллион записей кажется (могу ошибаться)
и потом это будет пушится по доступным репликам в шардах...
и когда оно доедет до ReplicatedMergeTree
тогда начнет механизм дедупликации ReplicatedMergeTree работать, а именно там хранятся в ZK контрольные суммы 100 последних вставленных блоков
если совпадает, то вставляться не будет...
соответственно, если у вас меньше 100 миллионов успелов вставиться в distributed
то в целом можно заново запустить...
если вы KILL сделали
но надо убеждаться по логам, что данные приехали в тот же шард и у вас нормальное шардирование а не rand() в distributed как любят делать -
спасибо!
-
Спасибо 👍
-
Возможно умерло чтение gzipped RowBinary, потому что отключение компрессии в carbon-clickhouse помогло. Не ясно только, почему всё ломается только от 4000+ записей...
-
а покажите StackTrace от 500й ошибки в clickhouse?
-
было бы круто вообще сам HTTP запрос с 500й увидеть
и segfault тоже посмортреть -
Собраны с разных версий CH. Сегфолтит сразу на 21.3.12.2, на 21.3.14.1 надо подождать, чтобы его добиться)
-
-
-
да похоже беда какая то запара с RowBinary
компрессия gzip На уровне HTTP сделана?
думаю вам надо issue сделать на github
и для наглядности привести .pcap файл с 500м запросом, чтобы было понятно что именно байтово передавалось.... -
Сжимает carbon-clickhouse, вероятней всего на HTTP, да.
Сейчас как раз занят моделированием запроса из абстрактных данных, чтобы убедиться, что проблема не с нашими данными.
Спасибо, буду заводить issue, если воспроизведу на других данных! -
проверьте на всякий случай алгоритм сжатия в accept-encoding заголовке
если там какой нибудь brotli и zstd а не gzip то надо осторожнее -
Добрый вечер. CollapsingMergeTree как лучше всего подружить с Datetime64 данными? Судя по документации то, что слева от UNIX Epoch, поддерживается плохо. Мне лучше тогда хранить эти данные как int64, и потом уже кастовать результат агрегации?
-
какого типа запросы? alter или обычные select/insert? может у вас таблица типа буффер и она не может из-за ошибок, которые вы видите сбросить данные на диск? запросы в студию :)
-
topK | Документация ClickHouse
topK Возвращает массив наиболее часто встречающихся значений в указанном столбце. Результирующий массив упорядочен по уб
-
оптимизируйте запрос, чтобы он не жрал столько памяти
-
гугл в помощь
https://github.com/VaBezruchko/spark-clickhouse-connector
https://stackoverflow.com/questions/60448877/how-can-i-write-spark-dataframe-to-clickhouseGitHub - VaBezruchko/spark-clickhouse-connector: Spark Clickhouse ConnectorSpark Clickhouse Connector. Contribute to VaBezruchko/spark-clickhouse-connector development by creating an account on GitHub.
-
спасибо!
-
Есть таблица, в ней несколько версий по каждому ключу. Задача - выбрать строку с максимальной версией. Для этого попробовали вьюху вида
Select
argMax(v1, version),
argMax(v2, version),
...
From table
Group by key.
Потом я выполнил запрос в такую вьюху и он упал из-за лимита.
Никаких alter/insert, только select -
cleanup thread - это не ошибка, а debug инфа (по крайней мере в основном). фиксите ошибку
-
хотел предложить попробовать другой формат вместо ClickHouseFormat.JSONStringEachRow, но смотрю вам уже ответили :)
https://github.com/ClickHouse/clickhouse-jdbc/issues/681[QUESTION] How to insert collection json strings into a table · Issue #681 · ClickHouse/clickhouse-jdbcHi, how to insert collection json strings into a table? For example, I have a collection of objects, convert them to json strings and send them to a table. // sorry for scala code val sb = new Stri...
-
да, я сам себе ответил :)
-
как вариант создать новую колонку с нужным типом, а в качестве дефолта указать значение существующей, после этого старую удалить, а новую переименовать в старую
-
Что лучше использовать для визуализации в рамках BI? redash/superset или свой вариант
-
superset/redash/metabase
-
Metabase какой то простой сильно
-
они все довольно простые
-
мне больше нравится суперсет
-
у меня в таких случаях используются nullable() типы и не AggregateFunction, а SimpleAggregateFunction и соответственно функции типа anyLast возвращают null только в том случае, если других вариантов нет
-
ага, суперсет сильно сложнее. нужно сильно постараться, чтобы получить то что захочешь :) решил пару недель дать ему второй шанс спустя пару лет. ничего не поменялось :) метабейз рулит!
-
Он не видит datetime64 почему то
-
и если в графике даты по обеим осям, то сгруппировать по часам/дням можно только ту дату, которая по оси x.
-
Там же все примеры на скале, если правильно понял
-
И это тоже проблема
-
а вторая ссылка вроде как раз на питоне?
-
Не припомню в питоне val)))) Но все равно спасибо:3
-
я патчил в двух местах, сам драйвер (от cloudfare) и типы в superset
он еще не понимал Nullable(LowCardinality) но все оказалось решаемо -
она не точная
-
зато детерминированная :)
-
от limit by отказался(
-
Доброй ночи, товарищи. У меня, возможно, тупой вопрос, но как определить, к какому блоку принадлежит строка таблицы, чтобы узнать, какие еще строки попали в один блок с этой строкой?
-
оно же может меняться...
-
никогда не задумывался на эту тему, а в чем практический смысл этого ?
- 09 July 2021 (105 messages)
-
select _part
from <tabble_name>
where <condition> -
Блоки формируются при чтении, вы можете указывать предпочитаемый размер блока при запросе через сеттинг.
-
Можете использовать одну из функций blocknumber ili rownumberinblock https://clickhouse.tech/docs/en/sql-reference/functions/other-functions/#blocknumberOther | ClickHouse Documentation
Other Functions hostName() Returns a string with the name of the host that this function was performed on. For distribut
-
Спасибо, попробую так
-
Вот меня именно принадлежность к одному блоку вставки интересует
-
Этот запрос возвращает имя партов, другое немного
-
Долго обьяснять, расследование небольшое из-за кривизны "временного" наколеночного решения )
-
А набор строк в числе которых была вставлена искомая строка никак не определить?
-
Ну вот этими функциями, но вообще если на это завязана логика, это сеттингами лучше указать напрямую
-
Ааа так вам постфактум узнать после вставки? Нет. Особенно после мерджей. Это надо до вставки делать типа fileİd + вставлять blocknumber
-
Ну, понятно, спасибо )
-
Всем привет!
Подскажите, пожалуйста, почему билды под arm64 (https://builds.clickhouse.tech/master/aarch64/clickhouse) без поддержки MySQL?
select * from system.build_options where name like ‘USE_MYSQL’;
возвращает пустоту
соответственно, запросы а-ля:
SELECT * FROM mysql('host.docker.internal:3306', 'db', 'some_table', 'user', 'passwdord') WHERE blablabla;
не выполняются -
Добрый день!
Помогите понять куда копать.
На клиенте появилась ошибка:
Error during connection to ru.yandex.clickhouse.settings.ClickHouseProperties@69664607, reporting failure to data source, message: Connection reset
В этот момент в клик прилетело много запросов.
Память, CPU, диск не уходили в загрузку на 100%
что могло вызвать такую ошибку -
В чем, к слову, недетерминированность anyHeavy? При наличии нескольких часто встречающихся значений функция вернет любое случайное из них?
-
-
в последних версиях КХ уже есть возможность создавать таблицы на движке:
https://clickhouse.tech/docs/en/engines/table-engines/integrations/postgresql/PostgreSQL | ClickHouse DocumentationPostgreSQL The PostgreSQL engine allows to perform SELECT and INSERT queries on data that is stored on a remote PostgreS
-
Это я знаю. Мне наоборот нужен доступ ИЗ postgres в КХ. Так у КХ свой диалект SQL, и я не уверен что древнее приложение это переварит.
-
Спасибо.
-
Всем привет, создал пустой аналог рабочей таблицы, с другим ключом сортировки. Направил туда вставки с приложения, чтобы не терялись новые данные. Затем инмертом вставил данные из рабочей таблицы.
Проблема в том, что в процессе вставки таблица росла, но по окончанию процесса вместо гигабайт таблица стала в мегабайтах, вместо 7 ярдов строк всего 11 лямов. Что я делаю не так?
INSERT INTO stat_online_index SELECT * FROM stat_online;
INSERT INTO stat_online_index SELECT *
FROM stat_online
Ok.
0 rows in set. Elapsed: 8320.453 sec. Processed 7.01 billion rows, 2.64 TB (842.08 thousand rows/s., 317.43 MB/s.) -
наверное стоит ещё показать как таблицы созданы
-
CREATE TABLE stat_online_index (
`EventDate` Date,
`EventTime` DateTime,
`WebinarHash` String,
`ParticipantHash` String,
`ParticipantName` String DEFAULT '',
`UserId` Int32 DEFAULT CAST(-1, 'Int32'),
`OwnerId` Int32 DEFAULT CAST(-1, 'Int32'),
`PartnerId` Int32 DEFAULT CAST(0, 'Int32'),
`IsPublisher` Int8,
`Duration` Int32 DEFAULT CAST(0, 'Int32'),
`Streams` Int32 DEFAULT CAST(0, 'Int32'),
`Average` Int32 DEFAULT CAST(0, 'Int32'),
`PublishStreams` Int32 DEFAULT CAST(0, 'Int32'),
`PublishAverage` Int32 DEFAULT CAST(0, 'Int32'),
`ParticipantStatus` Int32 DEFAULT CAST(0, 'Int32'),
`ParticipantQuestionsName` Array(String),
`ParticipantQuestionsValue` Array(String),
`ParticipantQuestionsType` Array(Int8),
`ServersIp` Array(String),
`ServersStream` Array(String),
`ServersHls` Array(Int8),
`Ip` String,
`LocationId` Int32 DEFAULT CAST(0, 'Int32'),
`LocationCity` Int32 DEFAULT CAST(0, 'Int32'),
`LocationCountry` Int32 DEFAULT CAST(0, 'Int32'),
`Os` String,
`OsType` Int16,
`IsMobile` Int8,
`Browser` String,
`BrowserVersion` Int32 DEFAULT CAST(0, 'Int32'),
`Resolution` String,
`ResolutionWidth` Int16,
`ResolutionHeight` Int16
) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{shard}/stat_online_index','{replica}')
PARTITION BY toYYYYMM(EventDate)
PRIMARY KEY WebinarHash
ORDER BY WebinarHash
SETTINGS index_granularity = 8192 -
replacing + order by webinarhash, такое ощущение что схлопнулись данные по этому ключу
-
-
-
-
-
-
это из-за движка Replacing, понял
-
да, у вас осталось по 1 записи на вебинар в месяц
-
Всем привет. Хочу получить общее количество запросов, сложив всех поставщиков. Использую такой запрос (на скрине) Но с ним работает не так как нужно. Я ждал, что на выходе как раз будет общее количество запросов 200 и 500.
А тут как я понял он просто подсчитывает сколько их было.
Проверял запрос в gatagrip, там работало по-иному -
Всем привет.
Никак не могу сообразить возможно ли сделать такую штуку:
Есть пользователь с readonly профилем. Возможно ли сделать новую базу в которую этот пользователь сможет писать.
То есть глобально он остается readonly для всех без кроме одной.
Может кто то сталкивался с такой задачей? -
с профилем не подскажу, но можете ему роль сделать, что читать может из всех, а писать только в одну.
-
наверное вы хотели что-то такое countIf(StatusRes IN (200, 500))
-
спасибо
-
Спасибо. Похоже то что надо. Сейчас попробую.
-
Работает точно так же, как мой count, т.е сколько всего было запросов
-
Всех приветствую. Ранее уже задавал этот вопрос, правда ответа не получил. В процессе работы изменял enum, добавлял новое значение в конец.
Так вот, переносил данные на другой хост - обнаружил что старые PARTITION ругаются на то, что енум отличается. Есть идеи как с этим бороться?
У меня идея только деаттачнуть все партиции, изменить к старому виду, аттачнуть старые, после изменить к новому виду и аттачнуть новые партиции. -
в datagrip использовал такой запрос(он как раз считал общее количество запросов)
SELECT
count((StatusRes = '200') + (StatusRes <> '200'))
FROM testproviders.logTrainProvider
WHERE Date > '2022-07-09 06:23:00' and Date < '2021-07-09 12:24:00' -
count((StatusRes = '200') + (StatusRes <> '200'))
это тоже самое что и просто
count() -
-
Вот так отображает "countIf(StatusRes = '200') + countIf(StatusRes <> '200')"
Но тоже подсчитывает количество статусов.
Что я могу делать не так? Или может это проблема плагина, если складывается совсем другое -
countIf(StatusRes = '200') + countIf(StatusRes <> '200')
это же выборка по абсолютно всем StatusRes, = 200 + <> 200, не понимаю что вы хотите увидеть?) -
Общее количество запросов, то что я сейчас вижу на графике, вообще не то. Поясню. У меня только у одного поставщика 400-500 запросов. А в графике с общим количеством запросов я вижу число в 2-2,5 раза меньше. Потому что подсчитывается вообще не то)
-
тогда вам наверное надо убрать группировку по Provider, у вас выводится число запросов из 1 провайдера сейчас
-
Да, похоже в этом и была загвоздка. Спасибо большое :)
-
-
-
Всем привет, а в клике имеет смысл вообще использовать SSD? Или можно спокойно на HDD жить?
-
-
ну там ж нету рандомного чтения много вроде как, или есть?
-
-
Ну, очевидно, что разница будет менее существенной, как у классических строчных реляционных СУБД.. 🤷♂️
-
-
-
Понял, спасибо, ну EBS SSD почти в три раза дороже
-
-
Всем привет. У меня внезапная проблема. Вчера я к своей базе коннектился без проблем. А сегодня выдает ошибку. <Error> Application: DB::Exception: More than one field of 'password', 'password_sha256_hex', 'password_double_sha1_hex', 'no_password', 'ldap', 'kerberos' are used to specify password for user default. Must be only one of them.
-
Всем привет, у мен отчасти выходит очень неприятная ситуация. Я провожу r'n'd в плане перевода данных на новый движок (в сетапе сервака ssd и hdd), и при перекачке данных из старой тааблицы в новую:
INSERT INTO rnd.summing_table SELECT min(mindt), max(maxdt), name, type, value, sum(counter) FROM old_db.merge_table GROUP BY name, type, value
изначально возникала ошибка следующего рода:
memory limit (total) exceeded While executing AggregationTransform
окей, мне пришлось вывернуть настройки max_bytes_before_external_group_by = 10000000000, min_bytes_to_use_mmap_io=0 (чисто из любопытства), но у меня вышло следующее:
Cannot write to file /var/lib/clickhouse/tmp/tmp32301zwraaa, errno: 28, strerror: No space left on device: While executing AggregatingTransform.
В общем, как порешать проблему кроме как обновления сервачков? Я понимаю, что это идеальное решение, но это гиблая затея. Возможно, я упускаю какую-то настройку (снова), а мошт просто мудак и ткните пжл куда смотреть -
кусками вставляй. если упрёшься по итогу в место на диске, надо почистить лишнее и потом вставлять. Если лишнего нет... се ля ви. Хотя мб кодеки помогут на новой таблице, можно до несколько десятков % места сэкономить
-
Кусками u mean делить по периодам, я не помню шоп в клике такое было, но посмотрю, спс
-
use WHERE Luke
-
-
-
Здравствуйте,
Помогите со скриптом лефтджойна:
Левая:
Таймстемп
Правая:
Таймстемп
Текстовое поле
Джойн по Таймстемп
Обе Таблицы 10м.
Джойн не хватило памяти.
Пытаюсь через унион ол и групбай.
Я планирую в первой таблице добить столбец NULL и потом сгруппировать по ts.
Вопрос в том: какую агрегирующую функцию взять, чтобы сделать
select ts, ???AGG???(text)
from (table1 union all table2)
group by ts
Помогите пожалуйста -
а в чем проблема? почему памяти не хватило? попробуйте сбрасывать на диск, если мало памяти.
SELECT now() + interval number second, NULL from system.numbers limit 10
UNION ALL
SELECT now() + interval number second, number from system.numbers limit 10; -
при джойне правая сторона должна умещаться в оперативе. попробуйте добавить оперативы. к тому же 10м - это вообще ни о чём. у вас только 8 гб оперативы что ли?
-
может вы джойните по таймстемпу неправильно и у вас кроссжойн получается? попробуйте добавить в where какое-нибудь условие и посмотреть сколько строк будет.
скиньте ddl таблиц, без этого пока не совсем понятно. -
ClickHouse/ClickHouse description changed: v21.7.2.7-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.7.2.7-stable
Release notes:
ClickHouse stable release v21.7.2.7-stableRelease v21.7.2.7-stable · ClickHouse/ClickHouseClickHouse stable release v21.7.2.7-stable
-
ошибся там 300 млн строк
-
если обе таблицы по 300м, то делайте джойн с условием, например, по одному дню и в цикле пробегаетесь по всей таблице . всё как и в других бд
-
Спасибо! поделитесь, пжлст, опытом как сделать в цикле
-
на sql никак, напишите скрипт, который будет формировать sql запрос с WHERE t > ? and t < ? и двигаетесь по одному дню или даже по часу если всё равно данных много
-
-
да хоть на пхп :)
-
-
танк медленный, крылья не догадались прикрутить
-
что значит безопасно? Результат запроса будет другой если надо делать final для записей с одинаковым ключом в разных партициях.
можно только на уровне запроса, через settings -
max(coalsce( )) ?
-
coalesce
-
что?
-
у вас опечатка
-
а
-
"безопасно" в том смысле, что про некоторые настройки пишут, что оно не протестировано, забаговано, есть подводные камни и т.п. Нет ли тут такой ситуации? А про разницу в работе я понимаю, поэтому и возникла вторая часть вопроса про то, как задать другую опцию для отдельных таблиц. Всех не научишь settings писать. Можно вьюхи сделать для некоторых таблиц типа select * settings, но такое себе.
-
нету известных багов.
-
-
вьюхи работают так себе, я стараюсь их избегать. для каких-то запросов прокидывается условие внутрь, для других нет и падение по памяти. в идеале чтобы можно было эти настройки прямо в самой таблице :)
-
да без поддержки, из-за кросс-компиляции, компилируется на тачке с x86 и там mysqla.lib не та.
надо собирать под arm-м чтобы был mysql -
скорее всего это https://github.com/ClickHouse/ClickHouse/issues/23648External data still broken after #22527 · Issue #23648 · ClickHouse/ClickHouse
Describe the bug After #22527 the post of external data still broken when there is only one line. When there are more then one, \r is appended to the latest. Does it reproduce on recent release? It...
-
а там точно RowBinary ?
-
Точно, там по даже по стектрейсу видно парсер RowBinary)
-
а да, вижу INSERT INTO graphite (Path, Value, Time, Date, Timestamp) FORMAT RowBinary
-
странно почему больше никто не жаловался, у вас какой-то corner-case может, или компрессия у всех выключена
-
https://www.parrot.ru/clickhouse_ru/s2/00001/9574.html#2
В группе сообщения уже нет, думал написать челу, поинтересоваться) -
а сколько памяти у сервера?
-
100+ гигов свободно, падает не по OOM
-
-
я понимаю что не ООМ, у КХ бывает проблема из-за того что запросы одни падают с OOM, а потом дргуие начинают ломать КХ, потому что у первых запросов неправильно dealloc сработал, но это явно не ваш случай
-
В сэмпле конфига, который представлен в ридмихе репозитория carbon-clickhouse, компрессия включена.
Пока добрался до того, что gz-архив (с теми же метриками, что ломают CH при отправке через carbon-clickhouse), отправленный на HTTP-клиент курлом, ничего не ломает. Всё ещё продолжаю расследование) -
наверное tcpdump перспективнее смотреть
-
-
в какой консоли? и что такое драйвер?
что в логе КХ?
версия КХ? -
а кстати у вас КХ далеко от заливалищика? сетевая летенси сколько?
-
В докерах на одной машине. Латенси минимальна, полагаю)
-
ясно, возможно что goшный компресс делает не совсем такой gzip как линуксовый gzip
-
Спасибо.
- 10 July 2021 (24 messages)
-
В последних версиях КХ умеет притворяться PostgreSQL, принимает запросы на postgresql_port
-
Всем, привет.
Помогите обстукать решение, мы только едем на кликхаус.
Такой кейс: есть 2 таблицы фактов из источников (на самом деле больше, но для простоты): таблица платежей из платежной системы и таблица платежей из нашей учетной системы. В 95% случаев операции соответствуют друг другу 1-к-1, в 5% случаев (свякие отмены, проведения двумя платежами, начисление бонусов и пр.) операции 1-ко-многим.
Как эти данные правильно засторить при том, что иногда, возникают ситуации, когда нужно сагрегировать суммы по разным атрибутам, которые есть частично в первой, частично во второй таблице, соответственно напрашивается JOIN? Но как мы уже поняли, хранение в разных таблицах и последующий джоин - это антипаттерн клика, нужны широкие таблицы. -
для начала надо попробовать join.
-
-
А в чем проблема сделать одну широкую? Уникальность в кх не требуется.
-
Вопрос как это сделать правильно, варианты:
1. Все сложить в одну широкую таблицу, ключевые поля объединить, с последующим SummingMergeTree числовых полей.
Минусы: записи схлопываться в фоновом режиме и мы при вычитке никогда не можем быть уверенны, что запись уже схлопнута. -
2. Вообще ничего не объединять, все складывать в одну широкую таблицу, где каждая колонка сообветствует полю исходной таблицы, таким образом получаем струкруру примерно такого вида:
t1.x, t1.y, t1.z, NULL, NULL, NULL
NULL, NULL, NULL, t2.x, t2.y, t2.z
,а необходимые обогащения атрибутами по внешнему ключу дообогащать в соседних колонках на этапе E&L.
Минусы: усложнене E&L, отход от ELT -
Еще был вариант:
3. Все сложить в одну узкую generic-таблицу, как описано здесь: https://habr.com/ru/company/badoo/blog/442616/ - и дальше играться с агрегирующими функциями и лямбдами
Минусы: не очень удобно с этим работать, громоздкие и не тривиальные запросы получаются. -
Непонятны минусы первого варианта. Ключевые поля объединяются, числовые поля разных таблиц становятся массивами (потому как в 5% случаев 1:N). Некоторые поля исходных таблиц возможно обойдутся и без превращения в массивы. Обычный MergeThree. При агрегациях вылезет немного array функций или даже arrayjoin'ов, но в терпимых количествах.
-
спасибо за комментарий, правильно ли я понимаю, что структура для записей из двух таблиц:
t1:
a b c t2_id
и
t2:
id1 x1 y1 z1
id2 x2 y2 z2
должна получится широкая структура:
a b c t2_id [id1,id2] [x1,x2] [y1,y2] [z1,z2] -
да, я бы подумал прежде всего о такой изначальной структуре. дальше надо смотреть насколько сложными получатся arrayXXX запросы, в какой MV это имеет смысл преобразовать, можно ли какие-то исходные аттрибуты сразу превратить в скаляры, итд.
-
В чем проблема сделать одну таблицу с указанием источника?
-
вы имеете ввиду мой вариант 3?
-
извиняюсь за свою чайниковость, что есть MV? 🙄😅
-
Materialized view
-
При селекте вы все равно делаете аггрегацию и вам не важно схолпнклось или нет
Я бы отдельно хранил сырые данные в одной таблице с ttl или с ttl group by
И настроил MV
С аггрегацией для ускорения выборок -
Добрый день. Намереваемся использовать материализованные представления работающие как insert trigger на одной и единственной общей таблице (основной поток данных). Эти представления будут готовить данные для вставки в другие соответствующие таблицы. Есть ли какое-то ограничение на общее колличество таких материализованных представлений и таблиц. Что если их будет 1000 или 2000?
-
Замедление инстертов
-
Скорее всего вам не нужно 1000 вью
-
нужно т.к. у каждого заказчика свои широкие денормализованные view [до 100 колонок максимум].
1. может как-то иначе это можно реализовать чтобы замедление инсертов сильно не сказывалось?
2. А что если иметь 2000 материализованных представлений или более просто как статиские снапшоты данных созданные через POPULATE (без использования insert triggers). На колличество таких тоже есть ограничения? -
Я бы такие специфичные для клиентов вещи не на уровне таблиц в кликхаусе моделировал. Такого типа настройки можно положить в обычную базу данных, и потом уже генерировать запросы на основе выбранных пользователем колонок.
-
А что если кол-во заказчиков вырастет в 10раз? А если в 100 раз?
-
Да. Пожалуй плохой путь :)
-
Ну сами подумайте
Вы вставляете 100 000
Записей
И у вас 1000 mv
Начинают читать этот блок
То есть вам надо обработать 100 миллионов записей
Как думаете сколько ядер вам для этого нужно
И как долго это будет длиться?
То есть ограничения не программные а физические - 11 July 2021 (19 messages)
-
я придумал другое решение с использованием json. в итоге получилась всего одна таблица. реботает отлично. Например:
SELECT
study_id, study_site_id, subject_id, study_event_definition_id, crf_entry_id, row_num,
JSONExtractString(JSONExtractRaw(json_data, 'claimant_first_name'), 'value') as claimant_first_name,
JSONExtractString(JSONExtractRaw(json_data, 'claimant_last_name'), 'value') as claimant_last_name,
JSONExtractString(JSONExtractRaw(json_data, 'law_firm_name'), 'value') as law_firm_name
FROM xdata_view_ordered
WHERE study_id = 1526
LIMIT 100 OFFSET 0
Но есть требование обеспечить доступ к данным используя regular ANSI SQL. Позволить создавать кастомные вью - то их может быть много в зависимости от колва-ва клиентов (т.е. это плохая идея). Избавиться в данном случае от JSONExtractString & JSONExtractRaw не получится? -
Собираю на M1, ловлю вот такую ошибку:
/opt/homebrew/Cellar/mysql/8.0.25_1/include/mysql/mysql_com.h:979:31: error: use of old-style cast [-Werror,-Wold-style-cast]
SHUTDOWN_WAIT_CONNECTIONS = MYSQL_SHUTDOWN_KILLABLE_CONNECT,
Это первая, подобных там еще много. Не подскажете, как можно “полечить”? -
Вы не пробовали через докер? Розетта 2 не умеет запускать x86 образы под M1?
-
пробовал с
yandex/clickhouse-server:21.3.14.1-alpine
КХ валится с непонятной ошибкой
2021.07.09 10:56:54.116706 [ 1 ] {} <Fatal> Application: Child process was terminated by signal 5.
каждый раз при разных запросах к нему.
Потому решил собирать на М1. -
ну там перформанс же прям сильно просядет
-
Это все равно для разработки.
-
А нужна именно версия 21.3? В списке изменений для 21.7 заявлена поддержка сборки на M1.
-
спасибо, сейчас попробую
-
А в тех коммитах, которые в мастере, вообще собирается уже как часть PR validation.
https://clickhouse-builds.s3.yandex.net/0/61bf623a3cb4b19534d8725e6a664849f14f7ad7/clickhouse_special_build_check/report.html вот тут, допустим, есть бинарник для darwin aarch64. -
И, судя по всему, поддержка mysql там просто выключена.
-
мне выше отвечали:
“да без поддержки, из-за кросс-компиляции, компилируется на тачке с x86 и там mysqla.lib не та.
надо собирать под arm-м чтобы был mysql” -
нет, не помогло.
взял yandex/clickhouse-server:21.7.2.7-alpine
снова
2021.07.11 13:14:31.045866 [ 1 ] {} <Fatal> Application: Child process was terminated by signal 5. -
поставьте clang 11. может поможет
-
ClickHouse/ClickHouse tagged: v20.8.19.4-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v20.8.19.4-stable
Release notes:
ClickHouse stable release v20.8.19.4-stableRelease v20.8.19.4-stable · ClickHouse/ClickHouseClickHouse stable release v20.8.19.4-stable
-
Привет! Меня интересует гомоморфное шифрование с операцией сложения. Т.е. есть зашифрованные числа, некая агрегатная функция их суммирует так, что расшифровав ее результат я получу сумму исходных незашифрованных чисел. Есть какие-нибудь наработки в этой области?
Или может быть можно написать собственную агрегатную функцию на c/cpp? -
В кликхаусе такого нет.
Наработки подобного были у IBM и они вроде даже библиотеку выпустили
https://habr.com/ru/company/dcmiran/blog/513388/
> Или может быть можно написать собственную агрегатную функцию на c/cpp?
Написать наверное можно, вмержат в мастер или нет это вопрос.IBM открыла инструмент полностью гомоморфного шифрования для LinuxКомпания IBM опубликовала на GitHub исходный код набора инструментов FHE для Linux. Утилиты работают на платформах IBM Z и x86, поддерживаются Ubuntu, Fedora и CentOS. Полностью гомоморфное...
-
А вам для чего? )
-
Просто идея. Хранить и обрабатывать в облаке метрики в зашифрованном виде без передачи ключей за периметр.
-
https://github.com/google/fully-homomorphic-encryption ещё есть вот это от Гугла.GitHub - google/fully-homomorphic-encryption: Libraries and tools to perform fully homomorphic encryption operations on an encrypted data set.
Libraries and tools to perform fully homomorphic encryption operations on an encrypted data set. - GitHub - google/fully-homomorphic-encryption: Libraries and tools to perform fully homomorphic enc...
- 12 July 2021 (142 messages)
-
к сожалению, нет - не помогло.
собирал так:
clang -v
clang version 11.1.0
Target: arm64-apple-darwin20.5.0
Thread model: posix
InstalledDir: /opt/homebrew/opt/llvm@11/bin
cmake -DCMAKE_C_COMPILER=/opt/homebrew/opt/llvm@11/bin/clang -DCMAKE_CXX_COMPILER=/opt/homebrew/opt/llvm@11/bin/clang++ -DUSE_MYSQL=1 -DCMAKE_CXX_FLAGS="-I/opt/homebrew/opt/mysql/include/" -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
-- The C compiler identification is Clang 11.1.0
-- The CXX compiler identification is Clang 11.1.0
...
cmake --build . --config RelWithDebInfo -
ну можно ваши JSONExtract класть в отдельные колонки... при вставке через DEFAULT
у вас много клиентов, у вас там разные колонки для всех? или все таки одинаковый набор колонок просто внутри JSON они по разному называются? -
Разные. Могут добавляться удаляться.
-
Привет! Мне нужно сделать таблицу, где бы хранились последние версии строк по ID
требуется, чтобы дедубликация прошла на момент вставки чтобы от пользователя не требовалось писать group by + argMax на каждый запрос
пытаюсь использовать:
- table: engine AggregatingMergeTree (id, AggregateFunction(argMax, String, DateTime))
- materialized view, который в него вставляет с argMaxState() group by ID
для AggregatingMergeTree в доке указано, что будет коллапс строк, но в таблице есть дубликаты по ID после срабатывания MV
AggregatingMergeTree
The engine inherits from MergeTree, altering the logic for data parts merging. ClickHouse replaces all rows with the same primary key (or more accurately, with the same sorting key) with a single row (within a one data part) that stores a combination of states of aggregate functions.
верно ли, что все равно нужно писать group by + argMax даже при запросах к MV? -
прямо савсем разные для всех клиентов?
или часть одинаковые для всех? -
Все крайне динамично. У каждого клиента свои поля колонки
-
ну и храните тогда каждого клиента отдельно в своей таблице и добавляйте ему свои поля колонки через DEFAULT ExtractJSON через поля в этой таблице...
-
Наверное не очень хорошо иметь скажем 2000 таблиц или более для этого? Там и репликация и шардирование. Поэтому я решил сделать одну с ключом партицирования по tenant id
-
а что, хранить никак не несвязанные данные и динамически грузить CPU JSONExtract... прямо сильно лучше?
в одной таблице сильно лучше? -
“и добавляйте ему свои поля колонки через DEFAULT ExtractJSON.” А поля заранее надо создавать или они сами создадутся из того что есть в json? Где про это почитать дайте плиз ссылку?
-
поля сами не создаются через ALTER TABLE добавляются с DEFAULT выражением
про подход но в другом use case можно почитать тут
https://eng.uber.com/loggingFast and Reliable Schema-Agnostic Log Analytics PlatformAt Uber, we provide a centralized, reliable, and interactive logging platform that empowers engineers to work quickly and confidently at scale. The logs are tag
-
Спасибо
-
в момент вставки де-дупликация делается, но она идет внутри блока
и потом в фоне идет при background merge
используйте SELECT ... FINAL ...
чтобы финализировать дедупликацию в момент чтения
сейчас это распаралелено и не так уж и медленно -
спасибо!
-
-
clickhouse-copier пробовали?
https://clickhouse.tech/docs/en/operations/utilities/clickhouse-copier/clickhouse-copier | ClickHouse Documentationclickhouse-copier Copies data from the tables in one cluster to tables in another (or the same) cluster. Warning To get
-
Как сказали выше - попробуйте clickhouse-copier. Тестовые прогоны показали что он нормально работает для перегона/решардирования данных. Но из вопроса не очень понятно, вам просто перенести данные надо? Возможно просто детач/атач?
-
Спасибо, попробую
-
Да, просто единоразово перенести данные
-
Есть еще вариант частями переносить insert into select from remote()
Если таблица реплицирована, то можно добавить как реплику и создать таблицу, она сама все скачает и достаточно быстро. На днях так переносил, просто подключаешь новую реплику и все) -
Спасибо, рассмотрю insert into select from remote.
А таблица не реплицирована( -
Еще вам на посмотреть, есть вот такая утилитка (сам пользуюсь для бекапов)
https://github.com/AlexAkulov/clickhouse-backup
Автоматически сделает вам бекап, переносите на другую машину и нею же разворачиваете.GitHub - AlexAkulov/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages supportTool for easy ClickHouse backup and restore with cloud storages support - GitHub - AlexAkulov/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages support
-
добрый день... подскажите плз
а сохранять в КХ ассоциативные массивы с возможностью потом искать по ним есть ? -
Map(key, value) | ClickHouse Documentation
Map(key, value) Map(key, value) data type stores key:value pairs. Parameters key — The key part of the pair. String, Int
-
Привет, может кто подсказать, а есть возможность для postgresql db engine ( https://clickhouse.tech/docs/en/engines/database-engines/postgresql/ ) задавать параметры подключения, в частности, sslmode?
-
Спасибо.
-
Просто мега полезная статья. Спасибо! Похоже это то что нам нужно. Arrays instead of json
-
ну, еще есть
экспериментальная фича
https://clickhouse.tech/docs/en/sql-reference/data-types/map/
https://clickhouse.tech/docs/en/sql-reference/functions/tuple-map-functions/#function-map
она чуть быстрее
и массивы медленные , когда элементов становится много, потому что жрут CPU больше чем обычные строкиMap(key, value) | ClickHouse DocumentationMap(key, value) Map(key, value) data type stores key:value pairs. Parameters key — The key part of the pair. String, Int
-
👍
-
классная статья
было бы круто если бы ребята отдали в опеноср свой Log Admin и Query Service -
Как быть с ' кавычками, вместо таких "? visitParamExtractInt не видит, что парсить
visitParamExtractInt(c_pram, 'count') as count_point
c_pram = {'count': 2} -
-
ну раз у вас жсон такой кривой, то реплейсом сначала :)
-
В ch можно или заново данные заливать?
-
как удобнее
-
Спасибо
-
Добрый день,
Пытаюсь обновить тип AggregateFunction(groupUniqArrayArray(1000), Array(String)) на AggregateFunction(groupUniqArrayArray, Array(String)), т.к. ClickHouse ругается на старый тип. MODIFY COLUMN col type не работает. Можно как-то вручную тип подправить без полного перезаписывания колонки? -
Или как-то по--другому обойти https://github.com/ClickHouse/ClickHouse/issues/26196#issuecomment-87824737721.5.8, 21.6 & 21.7 break *Array aggregation types · Issue #26196 · ClickHouse/ClickHouse
Updating existing table to 21.6 and 21.7 breaks *Array aggregation types. The table contains mater view with the following column strings AggregateFunction(topKArray(10), Array(String)), When tryin...
-
А как в ch сделать реплейс? В доки не нашел
-
For Replacing in Strings | ClickHouse Documentation
Functions for Searching and Replacing in Strings Note Functions for searching and other manipulations with strings are d
-
👍
-
Коллеги, добрый день! Создали дополнительного пользователя в CH с логином и паролем. Через ch-client пытаюсь прокинуть запрос на выборку к распределенной таблице, рандомно отваливается на одном из шардов или реплик с ошибкой авторизации. При этом, сам клиент к серверу подключается. С нераспределенными таблицами проблем нет
ClickHouse client version 20.3.7.46 (official build).
ClickHouse server version 20.3.7 revision 54433. -
с какой ошибкой"отваливается" ?
-
Code: 516. DB::Exception: Received from localhost:9000. DB::Exception: Received from chi-clickhouse-db-org-sim-default-1-1:9000. DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name.
-
а в remote_server прописан юзер/пароль?
-
Здравствуйте,
такой вопрос: в одной таблице массив номеров company_phone, company_email для вакансии, в другой таблице одиночные номера phone, email, id компаний. Можете подсказать, как можно реализовать присвоение id компании по хотя бы одному совпадающему полю в таблицах, куда смотреть вообще? -
посмотрю, спасибо
-
так пользователь с паролем, есть какие то еще ограничения типа ip, network или host_regexp у него?
-
default/networks/ip:
- "::"
- "0.0.0.0/0" -
-
-
Добрый день. Такой вопрос. Упираемся в ресурсы одного хоста. Есть идея сделать кластер реплику и распределить запросы. Как это правильно сделать и получится 2 тяжелый запроса разделить или сложный запрос разделить между хостами?
-
смотрите в стороне dictGet и словарей source = clickhouse и с layout = cache layout
https://clickhouse.tech/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts/
https://clickhouse.tech/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources/#dicts-external_dicts_dict_sources-clickhouse
https://clickhouse.tech/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout/#complex-key-cacheGeneral Description | ClickHouse DocumentationExternal Dictionaries You can add your own dictionaries from various data sources. The data source for a dictionary can
-
Получится при условии что вы настроите репликацию, у вас агрегация будет занимать в n=кол-во реплик раз меньше памяти на каждом хосте
-
Да кластер реплика планировал
-
почему меньше? Одна реплика будет выполнять агрегацию
-
Разве?
-
-
-
а при чем тут оператор?)
-
При том что он настройки создает такие что вас будет рефьюзить если вы по regexp не пролезаете из места откуда коннектитесь
-
А если 2 запроса он сможет их распределить по свободным репликам?
-
то есть, надо либо регэксп настроить, либо убрать вообще?
-
а куда упираетесь? в CPU или в Диск?
-
Для отладки убрать
-
нет. Это вы должны делать, балансером на входе, до КХ
-
А коннект будет через зукипер правильно?
-
нет
-
# Default host_regexp to limit network connectivity from outside
chConfigNetworksHostRegexpTemplate: "(.*)" -
-
спасибо!
-
То есть нужно что-то типа nginx для балансировки еще?
-
да, посмотрите chproxy
-
А чем обычно балансируют?
-
nginx, chproxy, ha-proxy, dns
-
если не понимаете что это конкретно значит
и не хотите потом себя где нибудь на https://t.me/dataleak увидеть
то лучше почитайте
про host_regexp
https://clickhouse.tech/docs/en/operations/settings/settings-users/#user-namenetworksУтечки информацииЗнаем про утечки все! Поиск утечек и мониторинг даркнета: dlbi.ru Админ: @ashotog (реклама не продается, на вопросы "где взять базу?" не отвечаем). Сообщить об утечке: sendleak@gmail.com Группа в ВК: https://vk.com/dataleakage
-
еще раз спрошу
а куда вы упираетесь ? в CPU или в Диск? -
8 ядер . и в проц и в диск
-
И медленно обработка
-
Сегодня вообще падал запрос
-
Думал кластером решить проблему параллельно подзапросов
-
Почему count возвращает 0?
visitParamExtractInt(c_column, 'count') -
потому что visitParam это не совсем json, используй JSONExtract*
-
Но раньше всегда работало с visitParam
-
пробелов не было (вероятно)
-
спасибо
-
-
SELECT
visitParamExtractInt('{"count":1}', 'count'),
visitParamExtractInt('{"count": 1}', 'count')
Query id: 85f3ffbd-bc16-4ff8-b962-b8f22e6fde93
Row 1:
──────
visitParamExtractInt('{"count":1}', 'count'): 1
visitParamExtractInt('{"count": 1}', 'count'): 0 -
👍
-
ZK путь должен совпадать, это должен быть один шард.
репликация работает по именам из uname -f и порту 9009. Т.е. один сервер будет подключаться к uname -f другого по порту 9009
ошибки репликации видно в select * from system.replication_queue
Зукипер должен быть единым ансамблем, а не 3-мя standalone серверами -
-
а в результате что дожно получиться? поля из обеих таблиц?
типа таблица вакансий (company_phone, company_email) [ 555-33, 333-44] , [bbb@c.com]
таблица2 (phone, email, id) 222-3333 , bbb@c.com, 1
а результат ожидается? -
обе ветки выполняются
-
Это как то можно обойти?
-
Так если обе выполняются почему NullIf не срабатывает в правой перед операцией деления?
-
а какой тип у field ?
-
Decimal(18, 6)
-
а так select cast(sumIf( field * sign, 1), 'Nullable(Decimal(18, 6))') / nullIf( sumIf("sign", "another_field" = 2) , 0) from table;
-
в результате должна получиться такая таблица:
(company_phone, company_email, company_id)
[ 555-33, 333-44] , [bbb@c.com], 1 -
тоже самое (Division by zero)
-
самое простое сделать float
https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aissue+is%3Aopen+Division+by+zero+decimalIssues · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
-
select toFloat64(sumIf("field" * "sign", 1)) / nullIf(sumIf("sign", "another_field" = 2), 0) from table;
так заработало, спасибо. Где то можно почитать про логику выполнения деления в КХ например? -
Conditional operators (if/case/ternary) always calculate all branches · Issue #1562 · ClickHouse/ClickHouse
Now ternary operator (function if) always calculates two branches. SELECT 0 = 0 ? 0 : modulo(1, 0) DB::Exception: Division by zero I would like have opportunity to execute this expression. I.e. onl...
-
Благодарю
-
так шарды помогут распределить запрос с подзапросами или нет?
-
-
decimal имеет фиксированное число знаков после запятой
-
наверное никак не сделать в КХ, слишком сложно получается.
-
никак. Это сделано специально.
Только переписывать запросы, if( ), возвращать строки. -
короче как то так сделал ФР...
https://github.com/ClickHouse/ClickHouse/issues/26251Unfold all macros when creating ReplicatedMergeTree · Issue #26251 · ClickHouse/ClickHouseUse case Currently on creation of replicated merge tree, metadata SQL files are kept as-is (except for {database}, {table}) macros. As every replicated merge tree relies heavily on zookeeper path, ...
-
Тогда смотреть тикеты на гитхабе. подобные ошибки уже были
https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aissue+m1Issues · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Здравствуйте, можно ли сделать так что бы в случае недоступности одной из таблиц, таблица distributed смотрела на реплику недоступной таблицы?
-
она и так же это делает, когда реплика в дауне
-
вроде должна сама да
-
Здравствуйте! Существует большое количество словарей с типом подключения PostgreSQL, есть ли возможность вынести часть общих настроек подключения (адрес, порт, логин/пароль и т.д) в какой то общий конфиг, чтобы в случае изменения к примеру данных учетки не пришлось править в каждом словаре отдельно?
-
https://github.com/ClickHouse/ClickHouse/issues/22471
https://github.com/ClickHouse/ClickHouse/pull/23424
Пока только ждатьExplicit secret management in ClickHouse · Issue #22471 · ClickHouse/ClickHouseUse case Passwords/connection data scattered in different parts of the system is difficult/impossible to reuse in other contexts, which is why the same connection data can appear repeatedly in diff...
-
спасибо!
-
Можно еще include_from/incl использовать, но почему-то это плохо документированно. Пароли при этом открытые, но в одном файле
-
похоже то что нужно, спасибо!
-
подскажите, а все вычисления с массивами выполняются в одном потоке? почти все время используется только 1 ядро
пример: -
хотя есть ключ по которому группируется intDiv(number , 100) as inter
и можно выполнять все паралельно -
При отключении одной из нод, distributed таблица становится недоступная для селекта, при этом инсерты идут
-
а если "settings skip_unavailable_shards=1 " ?
-
Привет. Вопрос про изменение большого количества данных и мутациям.
Необходимо изменить существенное количество данных (40к записей).
Была попытка сделать это одной большой мутацией, мутация по тестам занимает 5+ дней, все это время наблюдается сильно повышенная нагрузка, на проде такое не подходит.
При запуске 40к мутаций вместо одной ситуация примерно такая же, но нагрузка чуть ниже.
При запуске мутаций пачками ситуация следущая: 100 мутаций - 20 минут, 1000 мутаций уже 5+ часов.
Подскажите, пожалуйста, как лучше менять такое количество записей? Возможно есть какой-то бест-практис по количеству одновременно запущенных мутаций? <100 <10?
Настройки СH дефолтные. -
40к мутаций??
-
40к строк или мутаций?
-
-
-
1. Можно попробовать объединить мутацию по принципу затрагивания одной партиции.
2. Создать новую колонку с дефолтным значением равным старой колонке или новое значение. Потом старую удалить. Новую переименовать в старую.
3. Дропнуть старые строки и заинсертить новые изменённые. -
Сколько у вас всего строк?
-
Возможно у вас кривые запросы на обновление или ддя поиска этих записей используются индексы, а при мутациях индексы вроде не используются и поэтому эти 40к записей тупо могут долго искаться.
-
Строк 2+ миллиардов. Спасибо за идеи, все потестируем.
-
Про индексы, да, они действительно используются и судя по логам мутации выполняются так долго из-за продолжительного скана.
-
-
> Необходимо изменить существенное количество данных (40к записей).
40к это скок в таблице строк?
https://kb.altinity.com/altinity-kb-queries-and-syntax/update-via-dictionary -
на основе индексов вычисляете order by, а потом добавляете это условие, чтобы апдейты быстрее искались
-
Спасибо!
-
Строк 2+ миллиардов. Спасибо, вариант с dictionary также изучим.
-
Доброй ночи!
пытаюсь подключиться к ch
взял последнюю версию https://github.com/ClickHouse/clickhouse-jdbc/releases/tag/v0.3.1-patch
и получаю ошибку
for 1 sec: java.lang.NoClassDefFoundError: org/apache/http/conn/DnsResolver
Скажите пожалуйста, чего ему еще не хватает?Release Release v0.3.1-patch · ClickHouse/clickhouse-jdbcThis is a patch release for fixing below critical issues introduced in previous release. incorrect database was used in DDL - see issue #648 batch insert without any parameter didn't work - se...
-
Надо брать полный jar - 5мб. который. Shaded
-
Благодарю! 🤝
- 13 July 2021 (105 messages)
-
Спасибо.
отписал в https://github.com/ClickHouse/ClickHouse/issues/21191, посмотрим, ответят ли в закрытый. -
а как запрос выглядит?
есть возможность еще диск подключить и сделать JBOD storage policy и в ручную парты ALTER TABLE ... MOVE PART ?
https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/mergetree/#table_engine-mergetree-multiple-volumes_configure
потом сделать второй сервер...
с отдельным шардом
и сделать ReplicatedMergeTree
сбалансировать входящий трафик на чтение и запись после того как реплику синхронизируете...MergeTree | ClickHouse DocumentationMergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
Приветствую. Подскажите пожалуйста, если делать запрос:
select * from system.zookeeper where path = '/clickhouse/task_queue/ddl';
должно ли тут возвращать пустоту или же старые запросы которые зависали то же тут будут показываться? -
это правда? даже для VersionedCollapsing? в доке вроде "VersionedCollapsingMergeTree предназначен для тех же задач, что и CollapsingMergeTree, но использует другой алгоритм свёртывания, который позволяет вставлять данные в любом порядке в несколько потоков." или речь не об этом?
-
Привет, подскажите пожалуйста, нужно удалить несколько больших таблиц. На max_table_size_to_drop и max_partition_size_to_drop ругается что нет таких параметров. Файл force_drop_table пропадает после первого удаления
-
ClickHouse server version 21.3.2.5 (official build).
-
А где вы пытаетесь установить значение для настроек? И как он ругается?
-
в users.xml profiles->default->max_table_size_to_drop
[ 50 ] {} <Error> Application: DB::Exception: Unknown setting max_table_size_to_drop -
также из partition
[ 50 ] {} <Error> Application: DB::Exception: Unknown setting max_partition_size_to_drop -
Dockerfile:
FROM yandex/clickhouse-server:21.3.2.5
COPY docker_related_config.xml /etc/clickhouse-server/config.d/
COPY ./users.xml /etc/clickhouse-server/users.xml
RUN chown clickhouse /etc/clickhouse-server/config.d/docker_related_config.xml && \
chown clickhouse /etc/clickhouse-server/users.xml
EXPOSE 9000 8123 9009 -
эта настройка для файла config.xml
-
эта тоже
-
понятно, спасибо, попробую, а то я думал чтото с версией не то
-
она даже имеет параметры по умолчанию, можете по поиску ее найти и изменить
-
есть, спасибо большое!
-
С VersionedCMT не работал, тут не подскажу.
-
последовательность 1/-1 не важна, сделайте тест и проверьте.
все равно схлопнутся они в неизвестный момент времени, нужен final или агрегация. -
Всем привет! А подскажите, пожалуйста, может ли clickhouse ходить в zookeeper по ssl ? Есть zookeeper(v3.6.2) со включенным tls, и clickhouse который в него ходит. Последний ругается, что не может ходить в zookeeper, первый что в него прилетают не валидные ssl запросы(
-
-
coalesce не подойдет?
-
добрый день
подскажите, http_zlib_compression_level .... чем больше значение тем выше сжатие ? -
Похоже подходит. Спасибо!
-
у zlib вроде бы на 1 лучшая скорость, а на 9 лучшее сжатие(соответственно аффектит скорость). У них в доке где-то было это дело, посмотрите.
Мб еще кто-то подскажет -
Обычно не имеет смысл идти дальше 1-3
-
спасибо .... да вроде всегда было так ... но я что-то усомнился
-
Добрый день. Подскажите порядок действий чтоб переместить каталог с данными clickhouse ? Я остановил сервер, изменил путь в файле config.xml и скопировал содержимое /var/lib/clickhouse в новое место... но сервер не стартует
-
овнер у папки какой и что кх в логах пишет?
-
Овнер root... по логам щас скажу пока долистаю
-
а должен быть clickhouse:clickhouse
-
Всем привет. Использую engine = Kafka, kafka_format = 'JSONEachRow'. Вопрос - можно ли сделать так, чтобы если в JSON было лишнее поле, то данные все равно вставились бы, а это поле просто проигнорировалось? Лишнее поле - поле которое не определено в структуре таблицы.
-
Спасибо.
-
Да
input_format_skip_unknown_fields -
спасибо большое, ларчик просто открывался))
-
Привет! Подскажите, пожалуйста, как добавить поле в таблицу типа ENGINE = Join?
-
alter вроде бы не работает для join движков.
пересозданием, вероятно -
Привет. Есть несколько похожих таблиц, и я делаю вью (не материализованное) для их объединения через union all. В исходных таблицах есть enum колонки с немного разными наборами. Имеет ли смысл их объединять, приведя прямо в запросе к типу LowCardinality(String), или разницы с просто toString не будет, если прямо в запросе к LowCardinality пытаться приводить?
Ну и аналогичный вопрос, если исходные колонки - это просто String, но известно, что уникальных значений немного. То есть кастить к enum не получится, ибо в исходных таблицах набор может меняться. Словари тоже пока не подходят, хочется уметь быстро генерить вьюхи без дополнительных сущностей. -
И в процессе обнаружилась такая странность с LowCardinality, что оно читает больше данных, чем string или enum, если фильтровать но нему:
select count() from (
select 'test1' as test, number
from system.numbers
where test = 'test1'
limit 1000
) settings max_block_size = 5000, max_threads = 4;
-- Processed 1.00 thousand rows
select count() from (
select cast('test1', 'Enum8(\'test1\' = 0)') as test, number
from system.numbers
where test = 'test1'
limit 1000
) settings max_block_size = 5000, max_threads = 4;
-- Processed 1.00 thousand rows
select count() from (
select cast('test1', 'LowCardinality(String)') as test, number
from system.numbers
where test = 'test1'
limit 1000
) settings max_block_size = 5000, max_threads = 4;
-- Processed 5.00 thousand rows
select count() from (
select toLowCardinality('test1') as test, number
from system.numbers
where test = 'test1'
limit 1000
) settings max_block_size = 5000, max_threads = 4;
-- Processed 5.00 thousand rows
Это не баг, а фича, как обычно? :-)
v21.3.10.1 -
Добрый день! Подскажите пожалуйста
При копировании clickhouse-backup upload 2021-07-13T10-19-50 на s3 бакет возникает ошибка fatal error: runtime: out of memory в чем может быть проблема? -
-
тут вряд ли подскажут, это внешний, не яндексовый, чат
-
-
Всем привет! Подскажите, пожалуйста, поддерживает ли Clickhouse для оконных функций ignore nulls или нет?
-
глядя на код тестов
https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/01591_window_functions.sql
кажется нет, не поддерживаетClickHouse/01591_window_functions.sql at master · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Как я понимаю, LowCardinality экономит только диск и IOPS. Если все уже полняли в память, то разницы особой не должно быть, так что я бы не заморачивался и объединял все в простых String.
Особенность с 5000 в приципе понятна, просили 5000 строк считать через max_block_size - вот и получили. Интересно как оно оптимизирует до 1000 в простых случаях с целыми числами. -
Планируется ли добавить? Или по старинке надо юзать массивы при необходимости скажем посчитать в окне lead/lag value, учитывая что в окне есть Null-values, так?
-
надо пушить, прямо вот о планах "здесь и сейчас" не знаю
вы все таки попробуйте, может получится
использовать лучше postgres синтаксис
если нет, то заведите issue на github с примерами запросов и таблиц -
Если в настоящей таблице LowCardinality, то оно же "поднимает" в память не строки, а словарик и работает с числами
-
Всем привет! Можно ли с помощью движка postgresql клонировать таблицу со всей структурой в clickhouse?
-
Понял, спасибо, заведу issue
-
MaterializedPostgreSQL | ClickHouse Documentation
MaterializedPostgreSQL Creates ClickHouse table with an initial data dump of PostgreSQL table and starts replication pro
-
Спасибо!
-
Привет, как лучше реализовать поиск по md5 хешу?
-
Понятно что можно работать с числами когда нужно сделать group by, а обратный индекс поможет для сравнения числа в словаре со строковой константой. Но как сравнить строки в виде чисел в разных словарях или объединить два словаря (ваш случай) без превращения их в строки?
-
ваш вопрос черезмерно краток, но я могу предположить что вам помогут функции для работы с массивами.
-
Ладно, уточню, у меня есть идентификатор пользователя, который нужно хранить в базе и делать по нему поиск. Так исторически сложилось что это md5. Как ускорить поиск, или сохранить иначе этот хэш, чтобы поиск происходил быстрее?
-
можно сохранить байтиками в FixedString
-
-
-
в FixedString и попробовать bloom filter индекс натравить на эту колонку, но то что это сильно поможет не обещаетя
-
Перевести md5 в десятичный вид?
-
bloom skip index поможет только если эти хешики достаточно редко повторяются
-
у md5 размер 16 байт, он не влезет в 64 бита
-
Да, конечно
Я почему то подумал, что пользователи там уникальные будут -
А если попробовать добавить колонку с sipHash64 от md5 и забросить ее в индекс?
-
IMHO нормально никак, clickhouse для этого плохо подходит
это связано прежде
если есть возможность вместо md5 сделать какой нибудь snowflake-id - int64 будет получше
но тоже, сильно зависит от того насколько эти ваши ID монотонно возрастают в ваших данных по времени... -
пользуюсь табличной функцией cluster для чтения system.query_log со всех нод сразу. Может быть там есть какой-то тайный _столбец, который покажет имя ноды?
select query_start_time as ts,
query_duration_ms as dur, read_rows, memory_usage, query
from cluster('dc2', system, query_log)
where event_date > now() - INTERVAL 1 day
order by ts desc -
hostName()
-
есть функция hostName()
-
лучше использовать функцию clusterAllReplicas если у вас в шарде больше одной реплики
-
а это точно работает для Replicated?
-
query_log не реплицируется, или я вопрос не понял
-
Я хочу мониторить одним запросом все query_log кластера.
как я понял суть табличных функций cluster/clusterAllReplicas - обратиться сразу ко всем узлам кластера, без создания distributed/replicated таблиц. Я и обращаюсь. cluster работает, но hostName() дает только себя, clusterAllReplicas спотыкается на авторизации к другому узлу кластера -
всем привет, кто нибудь использует chproxy? почему при подключении http клиента к chproxy выдает ошибку
http connections are not allowed from 0.0.0.0:... -
красава, спасибо!
-
ну можно было просто IP прописать без хождения в /etc/hosts
-
Не. Тоже была проблема
-
Но лучше домены реальные заводить
-
вот, подвезли сегодня
https://github.com/ClickHouse/ClickHouse/pull/24206
ждите в следующих релизах, пока только в мастереData encryption on VFS level by alexelex · Pull Request #24206 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): New Feature Changelog entry (a user-readable short description of the cha...
-
Вау, отличная новость, спасибо!
-
Коллеги, подскажите, как может такое получиться:
select avg(price) from table => 69,99
insert into new_table select avg(price) from table
select price from new_table => 69,98
тип столбца в обоих таблицах Decimal(10, 2) -
а если посчитать
sum(price), count() FROM table;
sum(price), count() FROM new_table; -
Там не может быть проблемы в том, что avg всегда возвращает float64?
-
Может, поэтому я и попросил посчитать сумму и каунт
-
909.87 | 13
769.78 | 11 -
Какой движок таблицы новой?
-
MergeTree
-
А, я не сразу сообразил
Вы в новую таблицу вставляете уже среднее
SELECT CAST(CAST('69.99', 'Float64'), 'Decimal64(2)') AS x
┌─────x─┐
│ 69.98 │
└───────┘ -
Ну вопрос в конвертации между float64 и Decimal
-
Спасибо, буду разбираться
-
SELECT CAST(CAST('69.99', 'Float64'), 'Decimal128(30)') AS x
┌─────────────────────────────────x─┐
│ 69.989999999999580022705340869995 │
└───────────────────────────────────┘
SELECT CAST(CAST('69.99', 'Float64'), 'Decimal128(3)') AS x
┌──────x─┐
│ 69.990 │
└────────┘ -
Там что-то странное творится, если честно:
SELECT toDecimal64(CAST('69.99', 'Float64'), 2)
Query id: 5cccf2bb-320c-4985-a864-c9e966d5a7bb
┌─toDecimal64(CAST('69.99', 'Float64'), 2)─┐
│ 69.98 │
└──────────────────────────────────────────┘
SELECT toDecimal64(CAST('69.99', 'Float64'), 3)
Query id: ef4a14c8-2c3e-4237-9617-cea6f6041704
┌─toDecimal64(CAST('69.99', 'Float64'), 3)─┐
│ 69.990 │
└──────────────────────────────────────────┘
SELECT toDecimal64(CAST('69.99', 'Float64'), 5)
Query id: 166b3af1-21a7-4075-8095-5a351e1f92ad
┌─toDecimal64(CAST('69.99', 'Float64'), 5)─┐
│ 69.98999 │
└──────────────────────────────────────────┘ -
Мне непонятно, оно обрезает числа или округляет.
-
кто? Decimal? Обрезает, или округляет вниз. Поэтому хранить Decimal до двух знаков - такое себе. И при вставке констант будет такая же история. Вставите 69,99, запишется 69,98
-
Ну если вставляются честные 69.99 то не будет такой истории, тут же дело в том, что в float на самом деле 69.98...
-
а каким образом вставить "честные" 69,99?
-
в строке
'69.99' -
-
А кто запрещает?
echo "'string','69.99'," | clickhouse-local -S "user String, price Decimal64(2)" -q "SELECT * FROM table" --input-format CSV
string 69.99 -
Я бы тогда при запросе трёх знаков после точки ожидал бы увидеть 68.989, но в этом случае результат округляется. Поведение, получается, не всегда одно и то же. Но вообще да, перевод Float64 в Decimal это так себе идея, всё равно проблемы вылезут.
-
А как кластер сконфигурирован? Там пользователь-пароль прописан?
-
Неожиданно, спасибо!
-
А подскажите, чем нужно руководствоваться при выборе sharding key для distributed таблиц? Допустим, что есть таблица со следующими колонками:
date Date
entity_id UUID
bucket_timestamp DateTime('UTC')
measure_a UInt64
measure_b Decimal(18, 2)
Используется PARTITION BY toYYYYMM(date). Мне кажется логичным сделать шардирование по entity_id. Есть какие-то ситуации, в которых имело бы смысл, допустим, ещё и date учитывать для разнесения данных одной сущности по нескольким серверам? -
Исходить нужно из селектов которые будут выполняться. Может вы будете вычислять агрегаты за 5 минут по всем entity, кто ж знает
-
Доброй ночи!
получаю ошибку при вставке в кликхаус
ailed to disable auto commit due to java.sql.SQLFeatureNotSupportedException: Transactions are not supported
Что то с настройкой драйвера или движка atomic? -
Запросы в основном для одной entity_id, но затрагивают очень много дней. Сейчас уже к серверу подключиться не могу для тестов, поэтому накалякаю пример на коленке. Что-то вроде такого:
select
bucket,
sum(measure_a) / count(distinct date) as result
from
table
where
toYear(date) = 2020
and entity_id = <...>
group by
toStartOfInterval(toTime(bucket_timestamp, 'America/New_York'), interval 15 seconds) as bucket
order by
bucket
То есть внутри одного дня бакеты схлопываются до заданной пользователем точности и потом вычисляется среднее значение за год. - 14 July 2021 (190 messages)
-
Можно ли с помощью движка postgresql клонировать базу данных со всеми таблицами и со всей структурой в clickhouse из нужной схемы?
-
Добрый день!
Пытаюсь заимпортить данные из CSV в таблицу через dbeaver.
В данных есть колонка стринговая, в которой могут содержаться и табуляции и запятые.
Пробовал импортировать и как CSV и как TSV - результат один, сам CH не может правильно распарсить колонку и пытается часть стринговой колонки засунуть в другие.
Как быть? -
обернуть все строки кавычками?
-
И после импорта в таблице данные будут уже без ковычек?
-
-
Это как настроить в dbeaver
-
-
-
Да. Предварительно можно в мастере импорта посмотреть на результат.
-
А вообще, если беда только в запятые и табах, то проще всего переделать CSV, чтобы разделитель был редкий, типа |, указать в мастере импорта dbeaver, и тогда и кавычки не нужны.
-
завести issue в dbeaver на github
выгрузить таблицу в CSV
попробовать загрузить через clickhouse-client -
А зачем issue? Верное поведение dbeaver, если в качестве разделителя стоит запятая, а в столбце также есть запятые. Просто разделитель надо сменить.
-
ну тогда еще и в dbeaver надо настроить чтобы кавычки делал правильно если разделитель есть в данных...
-
Привет. Я уже говорил что ORDER BY во view definition работает ок и использует индекс, а если испольовать ORDER BY outside view definition - то индексы не используются. Видимо похожая проблема и с FINAL:
CREATE VIEW MY_VIEW AS
SELECT ... FROM TABLE FINAL ORDER BY ... <— не использует индекс и работает медленно если использую ORDER BY
это планируется исправить? -
Всем доброго дня) Пытаюсь получить среднее значение ответа от поставщика, запрос на скрине. Но получаю данные намного меньше ожидаемых. Такой вопрос, в какую сторону смотреть, какую конкретно допустил ошибку.
-
кажется руки дойдут не скоро
вы уже подписаны на
https://github.com/ClickHouse/ClickHouse/issues/25418
так что остается только пушить время от времени на митапах
или пытаться пофиксить самому если есть знания...view optimisation · Issue #25418 · ClickHouse/ClickHouseDescribe the situation CREATE VIEW v1 AS SELECT * FROM t1 FINAL SELECT * FROM v1 WHERE date = today() is too slow. Expected performance If a column in view and in table is the same - it needs to do...
-
на первый взгляд все выглядит ОК
кликните в "Generated SQL"
и выполните его в clickhouse-client
посмотрите на ваши данные...
ну и еще можно Extrapolation галочку убрать... будут более точные данные за последний промежуток... -
ну вообще FINAL к индексам вообще никакого отношения не имеет...
там в тикете, судя по всему проблема в том что WHERE внутрь VIEW не прокидывается
и соответственно у вас FINAL применяется не для части данных из TABLE
а для всей TABLE как есть
что естественно очень дорого -
Вывод вот такой
-
-
так, а какой вы Unit в закладке Field в правой панели выставили? случано не ms ?
-
там 2 секунды
-
Да, ms выбрал
-
-
-
-
-
Видимо да. Хотелось бы повысить как то приоритет. Или пофиксить в скором будущем :)
-
-
результат в каком клиенте делается? для какого языка?
в запросе случайно
FORMAT CSV
не стоит? -
-
FORMAT Null
добавьте, результатов не будет
а все остальное должно быть точно такое же -
Коллеги, подскажите, пожалуйста, про сохранение состояния агрегатных функций. Есть столбец типа AggregateFunction, запись в него делается с помощью, например, uniqState. При этом uniqMerge, помимо собственно объединения нескольких состояний, осуществляет также получение значение агрегата. Какой функцией нужно пользоваться, если хочется (например, для многоступенчатой агрегации) получить просто объединение состояний, с возможностью записать его в столбец типа AggregateFunction?
-
-MergeState
-
Спасибо, то что нужно
-
всем привет. готовлю КХ для преобразования в реплицируемые таблицы. прописал в конфиге 3 ноды зукипера. Прилетел алерт от заббикса:
ClickHouse: Too many ZooKeeper sessions opened (2 sessions).
Откуда берётся 2я сессия, и проблема ли это? Реплицированных таблиц ещё нет -
zookeper в ансамбле?
-
Кластер из 3 нод. Лидер и 2 фолловера
-
-
Привет!
Кто юзает go-migrate с CH? Как добиваетесь того, чтобы на всех нодах была таблица с миграциями и она была заполнена? Какие best practice? -
-
0_o. Действительно нежданчик
-
ZK сервера в кластере сами по себе? кофиг zookeeper содержит
все как надо ??
server.1=
server.2=
server.3= есть ?? -
Спасибо, да, такой вариант и придумали!
-
ClickHouse/ClickHouse description changed: v21.7.3.14-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.7.3.14-stable
Release notes:
ClickHouse stable release v21.7.3.14-stableRelease v21.7.3.14-stable · ClickHouse/ClickHouseClickHouse stable release v21.7.3.14-stable
-
два варианта
1) не использовать ON CLUSTER в SQL...
и для реплицируемых таблиц писать ALTER TABLE ... ADD COLUMN IF NOT EXISTS и т.п.
2) либо использовать ON CLUSTER всегда
и запускать миграции ТОЛЬКО на одной ноде (любой)
а default.migration_schema создавать самому с Engine=ReplicatedMergeTree -
ну да,
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888 -
SELECT * FROM system.macros
показывает разные replica для одинаковых shard на всех нодах? или есть повторения? -
replica │ ch1 на одном
replica │ ch2 на втором -
Приветствую!
Разобралася как с помощью оператора изменить remote_servers ? -
оператор сам генерирует remote_servers и пишет его в /etc/clickhouse-server/config.d/
-
а версия clickhouse какая?
и откуда брали Zabbix Template? официальный шаблон использовали?
да , в нашем на сессии триггера нет
вообще ошибка из разряда "такой точно быть не должно"
https://github.com/ClickHouse/ClickHouse/search?q=ZooKeeperSession
покажите что у вас в xml файлах в <zookeeper> прописано?Search · ZooKeeperSession · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
У меня собственно возникла эта ошибка , соотвественно нужно внести изменение в remote_user на сколько я понимаю. Пытаюсь понять как это сделать, если работать с операторомSolyar in ClickHouse не тормозит
Почему-то при обращении к distributed таблицам получаю ошибку: DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name. При этом пользователь может залогинится в систему и выполнять DDL запросы. Именно на distributed таблицу получаю такую ошибку. В чём может быть проблема?
-
<zookeeper>
<node index="1">
<host>10.1.0.103</host>
<port>2181</port>
</node>
<node index="2">
<host>10.2.1.95</host>
<port>2181</port>
</node>
<node index="3">
<host>10.252.0.101</host>
<port>2181</port>
</node>
</zookeeper>
<macros>
<replica>ch1</replica>
</macros>
ClickHouse client version 20.12.8.5 (official build). -
ну, вариантов несколько
не прокидывается security context в distribtuted sub-query
то есть вы законектились на сервер под одним юзером, а distributed sub-query до других шардов делается под другим (например default)
и этот другой юзер по каким то причинам не может авторизоваться на других нодах
либо пользователь прокидывается, но не может авторизоваться
одна из причин может быть в то, что для default юзера прописан host_regexp
host_regexp работает так
при TCP коннекте делается DNS запрос с типом PTR на TCP SRC IP, получаем обратный резолвинг доменного имени по IP
дальше это имя сравнивамем по re2 паттерну
kubectl exec -n your-chi-namespace chi-your-chi-name-cluster-name-0-0-0 -- grep -r host_regexp /etc/clickhouse-server/
что возвращает? -
-
Вернуло это
/etc/clickhouse-server/users.xml: <host_regexp> Regular expression for host names. Example, ^server\d\d-\d\d-\d\.yandex\.ru$ -
Есть Merge таблица, которая объединяет другие таблицы. Могут ли эти другие таблицы иметь одинаковую схему, но разные кодеки на колонках? Я пробую ужать данные, и мне интересно, не будет ли проблем.
Старые таблицы (ReplicatedMergeTree) будут иметь старые кодеки, новые - новые. -
Могут
-
Спасибо!
-
Не прописан, закомментирован текст
-
А как проверить первый момент , под каким юзером выполняется distributed sub-query ?
Я законнектился под default юзером... -
посмотрите users.xml
этот самый yandex.ru у вас там закоментарен?
тогда разбирайтесь какие у вас пользователи и какие для них ограничения по ip и network
grep -r "<ip" /etc/clickhouse-server/
grep -r "<network" /etc/clickhouse-server/ -
Под юзером demo та же история, но ему разрешено отовсюду...
<yandex>
<users>
<demo>
<networks>
<ip>127.0.0.1</ip>
<ip>0.0.0.0/0</ip>
<ip>::/0</ip>
</networks>
<password_sha256_hex>ebf22d8bfa40cc5ae972270a06934f34056ea7227859ad7d39c6fe9c4b70f</password_sha256_hex>
<profile>default</profile>
<quota>default</quota>
</demo>
<default>
<networks>
<ip>127.0.0.1</ip>
</networks>
<password>default</password>
<profile>default</profile>
<quota>default</quota>
</default>
</users>
</yandex>
Ок, пойду дальше копать -
У меня в общем-то получилось так что я засетапил себе кластер и для default юзера поставил пароль. Не знаю как это повлияло но я не мог селектить дистрибьютед таблицы, потом я снёс кластер, убрал пароль для default, поправил сетевые политики (regexp) и всё поехало
-
да, наблюдал у себя подобное поведение, но нужен более стабильный и повторяемый подход...
В моем случае работало наоборот:
Снес clickhouse, установил с дефолтными настройками юзера без пароля, накатил пароль и кажется заработало ...
У меня еще ограничение для юзера default только с локальхоста, а новый юзер может откуда угодно подключаться.
regexp у меня не включен. -
-
в логи посмотреть /var/log/clickhouse-server/ на других нодах во время выполнения запроса к Distributed
-
каким setting'ом управляется будет или не будет прокидываться security context?
-
для default
<ip>0.0.0.0/0</ip>
попробуйте добавить -
На других нодах нет записей об этом, а на текущей вот
Сейчас попробую default юзеру разрешить из всех сетей..clickhouse-error - 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.
-
Подскажите, какую BI-систему лучше использовать для связки с clickhouse.
Сейчас мы используем PowerBI + MSSQL server, но это становится дорого для масштабирования.
PowerBI с кликхаусом работает только в режиме импорта, что не позволяет сделать сложные дашборды, которые за большой период делают рассчеты. -
Я остановился на такой настройке для default:
default/access_management: "1"
default/networks/ip:
- "0.0.0.0/0" -
Хотел default ограничить только локальным дебагом, а нового использовать для подключений из вне...
Ок, спс -
С паролем ведь ?
-
недавно в tableau появился connector
https://docs.altinity.com/integrations/clickhouse-and-tableau/tableau-desktop-with-clickhouse/Connect Tableau Desktop to ClickHouseConnect your Tableau Desktop application to ClickHouse
-
Та же ошибка..
-
materialize(hostName())
-
Без, пока отлаживаем
-
в чем тогда смысл этой настройки, если по умолчанию юзер default без пароля имеет доступ ко всему ?
-
а насколько это вообще проблема, и нельзя ли забить?
-
Привет, подскажите а этому queue вообще реально исполнится при таком объеме?
2021.07.14 12:39:47.707916 [ 27 ] <Debug> ttttt.ltttt (ReplicatedMergeTreeQueue): Not executing log entry for part 20210209_20210212_9432_9540_2 because source parts size (5.23 GiB) is greater than the current maximum (4.45 MiB). -
Это мерж, у вас просто другие мержи заняли место в пуле
-
Попробуйте metabase
-
Мы используем superset. Пробовали MetaBase, но не зашло, переключились на SuperSet. Он работаем как визуализатор, без импортов, прямым подключением к базе.
-
зукиперы сами открывают сессию (фолловеры)
-
т.е. ничего аномального, алерт можно дизаблить?
-
да
-
так у вас пароль у default не пустой
-
подключится default нельзя удаленно
-
верно, я установил для него пароль.
Как это связано с ошибкой ? -
ясно
-
оператор генерит remote_servers и там пустой пароль default потому что operator не знает что вы задали пароль default
-
якобы где-то в операторе можно задать пароль default
-
Вот, изначально я и справшивал, как передать это в оператор
-
в смысле вам не надо его выставлять самому
-
он задается средствами оператора, тогда оператор генерит правильный remote_servers
-
ноды КХ ходят к друг другу пользователем default и им нужен пароль
-
по умолчанию оператор предполает что пароль у default равен пустой строке и оператор защищает вход для default сетью, тем regex что показывали выше
-
да, это проблема
Number of sessions (connections) to ZooKeeper. Should be no more than one, because using more than one connection to ZooKeeper may lead to bugs due to lack of linearizability (stale reads) that ZooKeeper consistency model allows.
то есть репликация потенциально будет работать криво -
мнения двух коллег из Altinity разделились :)
и как это вылавливать? -
как этот алерт меряет? кол-во конектов от КХ к ЗК? Или кол-во подключенных к ЗК?
-
метрика специальная в system.metrics с комментариями от Леши
https://github.com/ClickHouse/ClickHouse/blame/9c2aad6c1781b7b4554f792c27089f5f2e4ebcce/src/Common/CurrentMetrics.cpp#L41ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
что у вас возвращает select * from system.metrics where metric like '%ZooKeeperSession%'
-
│ ZooKeeperSession │ 2 │ Number of sessions (connections) to ZooKeeper. Should be no more than one, because using more than one connection to ZooKeeper may lead to bugs due to lack of linearizability (stale reads) that ZooKeeper consistency model allows. │
-
я бы сделал
SELECT * FROM system.metric_log WHERE CurrentMetric_ZooKeeperSession > 1 ORDER BY event_time DESC LIMIT 100 -
а если перестартовать КХ ?
-
-
а кусок конфига КХ про зукипер?
кстати сейчас можно два зукипера разных прописать -
конфиги правильные вроде
должно быть все ОК
надо в логи смотреть
truncate -s 0 /var/log/clickhouse-server/*.log
systemctl restart clickhouse-server
grep -i zoo /var/log/clickhouse-server/ -
кстати да, а точно у вас один <zookeeper>?
grep -i zoo /var/lib/clickhouse/preprocessed_configs/ -
да, 3 нужных ноды
-
в логе вообще нет упоминания про ЗК
-
Спасибо большое за детальное пояснение, а есть способ добавить нового юзера с доступом к распределенным теблицам ?
Просто юзера добавил, а как добавить запись в оператор? -
а что показывает netstat -ant|grep 2181 на сервере КХ ?
-
-
-
все не так. Все distributed запросы выполняются только от одного пользователя который описан в remote_servers. Не имеет значения каким пользователем вы подключились к КХ.
-
т.е. если я создам нового юзера с паролем, а для default оставлю пустой пароль, то я смогу иметь доступ к распределенным таблицам посредствам пользовтаеля default ?
-
чудеса, а если создать любую одну таблицу replicated ?
-
да, конечно
-
супер, спасибо
-
создалась, в ЗК появилась
-
а что netstat ?
-
сейчас найду
отредактируйте configMap с названием etc-clickhouse-operator-files в неймспейсе в котором стоит clickhouse-operator
найдите там
chConfigUserDefaultPassword:
и поставьте тот пароль который вы задали для default пользователя -
tcp 0 0 10.1.0.103:40568 10.2.1.95:2181 ESTABLISHED
tcp 0 0 127.0.0.1:41774 127.0.0.1:2181 TIME_WAIT
tcp 0 0 10.1.0.103:40570 10.2.1.95:2181 ESTABLISHED -
-
скорее всего что-то не так в конфиге.
distributed_ddl описана? -
наверное нет.
-
ну выложите куда-нибудь весь preprocessed конфиг (без паролей)
-
Облом, судя по вот этому куску кода
https://github.com/Altinity/clickhouse-operator/blob/0.15.0/pkg/model/ch_config_generator.go#L316-L319
надо просто не трогать default юзера и не задавать ему НЕ пустой пароль
его по умолчанию ограничивают через host_regexp
и это достаточно надежноclickhouse-operator/ch_config_generator.go at 0.15.0 · Altinity/clickhouse-operatorThe ClickHouse Operator creates, configures and manages ClickHouse clusters running on Kubernetes - clickhouse-operator/ch_config_generator.go at 0.15.0 · Altinity/clickhouse-operator
-
ясно, нужно только включить host regexp )
-
-
password of default user is not propagated to shards · Issue #265 · Altinity/clickhouse-operator
Hi, when creating a cluster where the password of default user is set in the manifest, it will not be propagated to remote_servers.xml. This leads to errors using umbrella tables: From this example...
-
Спасибо еще раз за поддержку и пояснение в деталях !!
Даже в поддержке ) -
вроде все ок, ну попробуйте убрать атрибуты index="1" , они не нужны
-
https://github.com/Altinity/clickhouse-operator/issues/668
Ага, такая же проблема с secure и inter_server secretsSecure remote_servers section · Issue #668 · Altinity/clickhouse-operatorIn order to use secure tcp port(9440 by default) while running distributed queries, it's need to add secure setting in remote_servers settings. It would be great if clickhouse-operator coul...
-
странно, Саша утверждал что для default можно задать пароль в самом операторе.
вот это что такое
defaultChConfigUserDefaultProfile = "default"
defaultChConfigUserDefaultPassword = "default" -
Ну я смотрю сейчас на тот код что скинул Slach и пока не вижу там.
-
дефолт юзер/пароль там для другого может быть можно задать
-
// Username and Password to be used by operator to connect to ClickHouse instances for
-
проще тогда перейти на secret, генерить рандом при создании chi и запоминать где-нибудь, в k8s
-
Хороший вариант...
-
Проблему так и не победил, придется грузить csv)
-
КХ не умеет транзакции, какой jdbc драйвер вы используете?
движок Атомик из другой сказки, он не про это. -
По вашему совету clickhouse-jdbc-0.3.1-patch-shaded.jar
-
OK и где вы его используете? Свой java код или фреймворк?
-
в nifi
https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-standard-nar/1.5.0/org.apache.nifi.processors.standard.PutDatabaseRecord/
пробовал еще через json-jsontosql-putsql (ошибка та же) -
Баг был про это, его исправили
-
Fix several bugs with ZooKeeper client by alesapin · Pull Request #21264 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Bug Fix Changelog entry (a user-readable short description of the changes...
-
Нашел такое сообщение
https://github.com/ClickHouse/ClickHouse/issues/5837
Коллеги, вставку делают через httpHow to post INSERT into Clickhouse with NiFi - steps needed. · Issue #5837 · ClickHouse/ClickHouseHi, I tried to look at this a few months back, and time and other priorities itervened. Looking again, I have hit a dead end. I would have used the JDBC driver, but I get MapMaker dependency errors...
-
не обязательно. Они и через JDBC из nifi делают, просто через PutDatabaseRecord это невозможно.
-
Внутри jdbc отправка тоже идёт http
-
-
-
Значит с объёмами проблем быть не должно )
-
Я видел комментарий в гитхабе что при соблюдении некоторых условий (все записи батча в одну партицию, размер батча не превышает порог) есть гарантия атомарности вставки батча
-
кашакашакаша.
Atomic Database. Атомарные инсерты. И nifi откатываемые транзакции вообще никак не связаны, ну вообще никак.
Так же как visa электрон не связана с молекулой кислорода -
Добрый вечер. По вот этому вопросу может кто-нибудь подсказать? Мне всё ещё интересно, есть ли какие-то ситуации, когда имеет смысл разносить данные одной сущности по нескольким серверам :)
Ниже там есть примерное описание того, какого рода запросы по этим данным планируется делать. -
Это понятно
-
PutDatabaseRecord пытается отключить autocommit , чтобы cделать 2PC. КХ не умеет транзакции, нельзя откатить успешный инсерт.
-
Да вообще в мире nosql с транзакциями плохо
-
Nosql если я не конченый лузер это не про транзакции
-
Ну почему nosql? Вот вертика есть, все примерно тоже самое что и в КХ, и с транзакциями все там хорошо, откатывай хоть 100 инсертов
-
А можно как-то сократить расходы на апдейт поля, сейчас вроде это только новый инсерт?!
-
никто вам не ответит. Например у вас таблица ReplacingMergeTree и надо коллапсить записи по entity_id, в этом случае конечно нельзя шардить по дате.
Я вчера на митинге с клиентом обсудил 4 возможных схемы шардирования для одной и той же таблицы. У каждой свои плюсы и минусы, которые исходят из запросов которые будут делаться к таблице, сама структура таблицы мало вообще кого волнует в этом случае. -
лучше всего сокращает расходы на апдейт, отсутствие апдейтов. Надо просто осознать как делать апдейты не делая апдейты
-
Понял, принял, спасибо
-
Коллапсить в этом конкретном случае ничего не нужно. Данные записываются один раз и никогда не меняются. Меня плюсы и минусы различных подходов как раз и интересуют. О них где-нибудь почитать/послушать можно?
-
Только ручками исследовать для ваших данных, не припоминаю докладов
-
если надо делать очень быстрые мелкие риалтайм запросы которые будут прилетать тысячами в секунду то надо сделать шардирование чтобы кверять как можно меньше шардов в одном запросе.
если наоборот долгие редкие запросы то надо размазать по всем шардам чтобы использовать все шарды в одиночном запросе -
Окей, буду тогда тестировать методом тыка и в trace логи смотреть.
-
Спасибо!
-
-
Yandex Database ?
-
по ydb тут не помогут скорее всего
-
может лучше в чат по ydb?
-
Да. Подсказали только что, у них есть свой чат. https://t.me/yandexdatabase_ru
-
добрый вечер
че то ни как не могу заставить сохранить вот такую цифру 1036.0999999642372,
поле делаю
requestStart Decimal64(18), -
точность 14 знаков после точки ... тут вроде указал 18 ... а пишет
Decimal value is too big: 5 digits were read: 16335e-1. Expected to read decimal with scale 18 and precision 18 -
кмк Decimal64(18) означает что слева от запятой 0 знаков
-
Decimal64(10, 18) а так он вообще не дает создать таблицу
-
вы смешиваете два формата
-
либо Decimal(28, 18)
либо Decimal128(18) -
в Decimal64 невозможно уместить (10, 18), только (0,18)
-
если либо Decimal(10, 18)
то он отдает вот это
Negative scales and scales larger than precision are not supported -
я уже и так и сяк .... (
-
а ну Decimal(28,18)
-
nак сработало ... но я так понимаю это уже Deciaml128 ?
-
create table xx(a Decimal(28,18)) Engine=Memory;
insert into xx values ('1036.0999999642372') ;
SELECT * FROM xx
┌───────────────────────a─┐
│ 1036.099999964237200000 │
└─────────────────────────┘ - 15 July 2021 (240 messages)
-
Добрый день,
CREATE TABLE xxx (
name String,
ts UInt4,
type Int8 DEFAULT -1,
value Int8 DEFAULT -1
)
ENGINE = ReplacingMergeTree(ts)
PRIMARY KEY(name)
ORDER BY (name,type)
SETTINGS index_granularity = 1024;
Делаю запрос
select name,min(value) from xxx group by name order by name limit 10;
почему CH ( 21.1.10.3 ) сканирует всю таблицу и отменяет запрос по памяти?
Ведь name - это primary key и все данные лежат в одной/соседних гранулах достаточно только прочитать первые несколько гранул и выдать результат -
-
-
-
ну наверное потому что у вас name очень высоко кардинальный
и чтобы сделать GROUP BY name
надо в памяти сделать здоровущую hash table
в которой будут в качестве ключей все ваши name
и только потом применить к этому limit
и еще есть ньюанс min(value) для ReplacingMergeTree не имеете особого смысла
попробуйте
SELECT name, value FROM xxx FINAL ORDER BY name LIMIT 10 -
это какая-то реальная задачи или синтетический пример для понимания работы ch? если name - это primary key зачем делать group by?
-
Добрый день. Можно ли использовать CH как dwh для Microsoft sql server analysis services? Если сейчас нельзя, то есть ли такое в планах?
-
можно просто сливать данные инкрементально из MSSQL в ClickHouse (способов много)
и потом поверх этого поставить MDX Mondrian
и вертеть кубы как привыкли...
https://altinity.com/blog/accessing-clickhouse-from-excel-using-mondrian-rolap-engine
глубокой интеграции clickhouse + MSSQL в той схеме как вы хотите, не ждитеAccessing ClickHouse from Excel using Mondrian ROLAP engineClickHouse is a very powerful database for analytics. Microsoft Excel is one of the world’s most popular business applications. There are several ways to bring ClickHouse data to Excel spreadsheets. In this article we will explain how to connect Excel to ClickHouse using the Mondrian OLAP server. This approach has been pioneered in Sergei Semenkov’s[...]
-
oledb судя по посту "vishenka" нужен, его не ждать? Через postges(mysql) интерфейсы тоже не работает?
-
Статью эту читал, спасибо
-
Привет! Подскажите, arrayDifference не хочет в даты. Так и задумано? Придется делать через lambda или есть что-то стандартное?
-
Всем привет. Хотел узнать про uniq и uniqExact.
Есть примерно какие-то бенчмарки на каких количествах uniq дает отличный от uniqExact результат?
На нескольких миллионах у нас было расхождение на 10-20, но хотелось бы узнать при каких примерно кол-вах можно ожидать расхождения -
uniq вычисляет приближенное значение, uniqExact точное. Тут уже смотреть по контексту задачи что вам именно надо - знать точное или приближенное количество документов
-
-
а по clickhouse-benchmark проверяли еще что выгоднее по rps и времени выполнению запроса?
-
-
-
а ведь ещё есть uniqCombined, который автоматически выбирает более оптимальный алгоритм:
>For a small number of distinct elements, an array is used. When the set size is larger, a hash table is used. For a larger number of elements, HyperLogLog is used, which will occupy a fixed amount of memory. -
-
там же ORDER BY (name,type) в таблице ключ сортировки.
-
это помогает при сортировке ORDER BY в запросе... и при выборке WHERE
при GROUP BY это ничего не ускоряет -
ну можете включить optimize_aggregation_in_order
-
если вылетает по памяти, не факт что поможет
-
select database, name,
arrayZip(dependencies_database, dependencies_table)
from system.tables
/*where*/ -
большое спасибо
-
Я к тому, что ваш пример SELECT name, value FROM xxx FINAL ORDER BY name LIMIT 10 выдаст несколько результатов, если для одного name в таблице есть несколько type. А человеку, судя по его запросу, нужен один результат для каждого name, с минимальным value
-
это вероятно для тех, которые созданы без TO
-
С TO тоже, какая разница. Оно выдает сами матвью, а не таблицы назначения
-
у меня они пустые(
-
может смотрите Distributed таблицы? У нас для MergeTree четко все матвьюхи показывает. v21.3.10.1
-
нет
все мв сделаны с TO.
поля пустые. v21.2.9 -
Господа, такой вопрос: есть куча событий относительно изменений состояния сущности - хочется забирать последнее событие для каждой сущности по timestamp + потом прогнать дополнительные аггрегации. Пытаюсь запилить MV на ReplicatedAggregatingMergeTree, но воткнулся в проблему с пониманием maxState/maxMerge аггрегатов - выглядит как будто мне нужно сделать подзапрос с maxMerge до того как я начну считать остальные аггрегаты.
-
может argMaxState какой нибудь сделать?
-
Может, вопрос больше в том как потом сделать штуку в запросе типа minIf(timestamp, state == 'SomeState')
-
-
finalizeAggregation
-
Пытаюсь использовать custom_settings_prefixes. В запросах всё отлично, а если пытаюсь с этим же запросом создать вью (https://kb.altinity.com/altinity-kb-queries-and-syntax/altinity-kb-parameterized-views), то получаю Code: 115, e.displayText() = DB::Exception: Unknown setting ..., и вью не создается.
Надо куда-то обновиться? Сейчас v21.3.10.1. -
Нужно сначала задать настройку а потом создавать view
-
так тоже пробовал. В пределах одной сессии родного клиента. И даже в settings самого запроса для вью прописывал. Не помогает
-
Получается если MV имеет поля типа id, anyState(state), maxState(timestamp), то чтобы сделать запрос к таблице рода SELECT id, minIf(timestamp, state == 'SomeState') мне нужно будет секцию FROM определить как SELECT id, finalizeAggregation(state), finalizeAggregation(timestamp)?
-
id, anyState(state), maxState(timestamp)
Для any и max вам не нужен state
https://kb.altinity.com/altinity-kb-queries-and-syntax/simplestateif-or-ifstate-for-simple-aggregate-functions
SELECT id, minMergeIf(timestamp, finalizeAggregation(state) == 'SomeState') -
может кто-нибудь подсказать?
-
Спасибо! Пойду разбираться )
-
-
этот запрос выполняется асинхронно почитайте про мутации
посмотрите SELECT * FROM system.mutations WHERE is_done=0 -
увидел, спасибо громное!
-
Подскажите, сейчас последняя LTS версия 21.3?
-
Да, следующая будет 21.8 в августе-сентябре
-
>и чтобы сделать GROUP BY name надо в памяти сделать здоровущую hash table
хм, я тогда наверное не правильно представлял себе как CH хранит данные, я думал, что в грануле лежат все записи принадлежащие primary key, те нужно только прочитать строки с одинаковым ключом и дальше их можно уже выдавать, так как в других гранулах этого ключа быть не может
>и еще есть ньюанс min(value) для ReplacingMergeTree не имеете особого смысла
почему? Обратите внимание, кроме Primary key там в таблице есть еще ORDER BY с еще одиним полем, Предположим у нас есть работники Иванов/Петров, и переиодически мы их измеряем в талии,бедрах и груди (. и мы хотим узнать минимальный размер работника. Вроде min как раз для этого и подходит
select * from xxx order by name;
┌─name───┬─ts─┬─type─┬─value─┐
│ Ivanov │ 1 │ 10 │ 100 │
│ Ivanov │ 1 │ 20 │ 200 │
│ Ivanov │ 1 │ 30 │ 300 │
│ Petrov │ 1 │ 30 │ 600 │
│ Petrov │ 1 │ 10 │ 400 │
│ Petrov │ 1 │ 20 │ 500 │
└────────┴────┴──────┴───────┘
select name,min(value) from xxx group by name order by name limit 10;
┌─name───┬─min(value)─┐
│ Ivanov │ 100 │
│ Petrov │ 400 │
└────────┴────────────┘
И таких "работников" у меня 500 миллионов , как найти минимальное значение среди всех измерений? те каким образом построить таблицу, -
А какой период поддержки у LTS версий?
-
А то пока ещё на 20.8 сидим)
-
насколько хуже я сделал теперь? нужно ли отменять дублирующие мутации или теперь сидеть и ждать?
-
1 год у яндекса, два года у нас
-
дубли появились потому что я не знал об асинхронности и мутациях
-
>если name - это primary key зачем делать group by?
Обратитие внимание, помимо primary в таблице есть еще ORDER BY с дополнительным полем, именно это поле и дает несколько разных строк на поле name -
Тогда ещё один вопрос. С 20.8 на 21.8 переехать сразу норм или лучше через 21.3?
-
Можно и сразу, но нужно посмотреть релиз нотсы для версий между
https://docs.altinity.com/altinitystablerelease/releasenotes/releases/21.3/213139/ClickHouse Altinity Stable Release™ 21.3.13.9Details of the Altinity Stable Release 21.3.13.9
-
возможно я неправильно строю таблицу, опишу задачу может кто подскажит в какую сторону смотреть
Есть 500 миллинов работников, мы мх измеряем в трех местах, раз в несколько дней. В один день например измерили всех в талии, в другой день всех измерили в бедрах. периодически нужно получать список всех работников с минимальным размером (не важно какого параметра)
Две проблемы, которые пытаюсь решить
1) Как составить таблицу и запрос, чтобы они были как можно легче с точки зрения производительности
2) Как получить данные в клиента? клиент не может переварить 500 миллионов строк сразу. Мы используем подключение к CH как к Postgres серверу и изначально была идея делать запросы вида
select ..... where name>'' order by name limit 100;
select ..... where name>'<тут последнее значение из первого запроса>' order by name limit 100;
так как полагал, что order by name (который primary key) - это дешевая операция, но видно, что это не так. По сути порядок записей не важен. -
Привет! Помогите пожалуйста разобраться с json. У меня есть строка, которая хранит массив json упрощенный пример: "[{"title":"Sport"}, {"title":"Electronics"}]"
Как мне получить из неё title? Это валидный json, но в доке нет ни одного примера на работу с массивом таким. Может его можно как-то перевести в массив нормально -
насчёт вопроса 2: насколько я понимаю, пагинация в clickhouse делается через max_block_size. Вот пример для питонячего драйвера: https://clickhouse-driver.readthedocs.io/en/latest/quickstart.html#streaming-results
-
arrayMap, потом extractParamString или JSon чето там
-
ну там будет массив, потмоу нужно его развернуть через arrayJoin
-
Так в том-то и проблема что это не массив, а строка в которой записан массив, поэтому arrayMap не могу использовать
-
split сделайте
-
пример выше был с упрощением, там вложенная структура, и просто split не зайдет поэтому
-
Добавил TTL в конфигурацию логов (system.query_log, system.query_thread_log). Но после перезагрузки процесса, я не вижу этого поля в show create table system.query_log. Что надо сделать, чтобы ТТЛ появился? Удалить таблицу и перегрузить процесс?
-
м по шапке надавайте тому кто это делал
-
по итогу в у вас просто огромная странная строка?
-
ну она да большая, и странная, но является валидным json
-
у вас не вложеная структура случаем?
https://clickhouse.tech/docs/ru/sql-reference/data-types/nested-data-structures/nested/Nested | Документация ClickHouseNested Nested(Name1 Type1, Name2 Type2, …) Вложенная структура данных - это как будто вложенная таблица. Параметры вложе
-
Еще вопрос. После изменения метода компрессии по умолчанию (compression -> case -> method: zstd). Он будет сразу применять для новых партов?
-
JSONExtractRaw может это поможет?
-
да наверное я не до конца разобрался извините
-
Привет, есть вопрос, замылился глаз, не знаю, куда б посмотреть
Есть GCP бакет, в нем лежит архив за каждый день
Читаю gsutil и использую clickhouse client в докере, запихиваю все колонки в табличку в стиле
gsutil cat gs:/filename.gz | pv | gzip -d | tail -n+2 | clickhouse-client --tcp_keep_alive_timeout 60 --user $CLICKHOUSE_USER --host $CLICKHOUSE_HOST --password $CLICKHOUSE_PASS --database $CLICHOUSE_DATABASE --query="INSERT INTO table_name(colum1, colum2….) SELECT colum1, colum2…. from input(col1 type, col2 type…) FORMAT CSV”
Размер файла плюс минус совпадает с количеством строк, файл 20 гигов, а строк 183163558
Схема, колонки, ничего не месяется в течении месяца
Но каждый месяц, последний день загружается копейки от всего файла и все
И так каждый месяц, в мае 30 дней загрузились без проблем, 31 2 тысячи вместо 200 миллионов
в июне 29 дней ок, 30 июня 5 тысяч вместо 150 миллионов
Клиент не падает, ошибок не выдает, связь с сервером не прирывается, перезапуск вручную и с локальной машины дают такой же результат
Внутри файла количество столбцов совпадает, то есть незагружаемая строка по составу ничем не отличается от предыдущей.
Что это может быть, в каком направлении стоит взглянуть? -
если все что вам надо - получать сортированный список сотрудников по размеру талии, причем с пагинацией, причем сначала малые, то ваш order by (точнее primary key) и будет этим размером талии. Вот тогда выборка будет быстрой, и можно почти безнаказанно делать последовательные запросы с limit/offset.
-
-
так у меня ведь не только размер талии, а еще два размера. и запросы могут быть дай минимальный размер, дай максимальный размер, дай разницу между размером талии и размером бедер.
По сути любой запрос - это считать группу строк относящихся к одному человеку (3 строки на человека), как-то их обработать (min,max) и принять решение отдавать в клиента эту строку или нет -
глянуть на кластере system.query_log по inital_query_id
-
если критерии выборки столь разнообразны, то от полной переборки таблицы вам никуда не уйти. Считаете свои миллиарды записей, и это будет тормозить на каждом запросе.
В качестве альтернативы можете потратить дисковое пространство и сделать несколько MV с хранением, оптимизированным под каждый конкретный запрос. Т.е. сложные рассчеты/сортировки будут при вставках (и тормозить их), а не при выборке с пагинацией. Если вставка раз в день, то наверное пойдет. Но может у вас есть ещё нюансы, про которые вы пока не рассказали.
Так-же можете посмотреть в сторону projections. Это экспериментальная фича, но суть именно та - оптимизация работы с подобной пачкой связанных MV. -
Там динамическая структура (ну типа в некоторых строках есть в некоторых нет. Походу реально лучше всего будет переложить эту колонку сразу в массив
-
ну немного мал овволдных сорре, если это раковая строка какая то то по шапке надавать тому кто это делает, или попробовать raw заюзать
-
>то от полной переборки таблицы вам никуда не уйти.
да с этим и не спорю, к этому и готовы. Сами данные занимают мало места (там везде Uint32, UInt64 только(, прочитать их полность с nvme диска - вообще не проблема (время нескольких минут)
вопрос в том можно ли как-то ускорить запрос вида
select <тут аггрегации над групой строк> from xxx where name > 'A' group by name order by name limit 100;
Если данные расположены в упорядоченном по primary key порядке, то по сути нужно прочитать 300-600 строк (если предположить, что каждая вторая запись фильтруется) и отдать в клиента. А сейчас это приводит к почти полной вычитке базы -
с чего бы это 300 строк? Именно что для решения вашей задачи нужно прочитать 100% данных. И как вы сами пишете - это несколько минут. Вот столько и будет занимать каждый запрос. 300 строк - это 300 сотрудников. С чего вы взяли что в них будет искомый минимал? Почему не самый последний, с фамилией на на букву Я?
-
Я возможно не понимаю, но моя логика вот такая - name у нас primary key, значит на него в памяти есть индекс (с засечками) и данные лежат в таком порядке
Алексеев - row 1
Алексеев - row 2
Алексеев - row 3
Петров - row 1
Петров - row 2
Яблоков - row 1
Яблоков - row 2
..
Есть запрос
select name,count(*) from xxx group by name where name > 'A' limit 2;
1) По индексу определяем, что читать нужно с Петрова.
2) Прочитали две строчки петрова, выдали в клиента - Петров, 2
3) Прочитаели две строчки Яблокова - выдали в клиента Яблоков,2
4) Два результата у нас есть, ровно столько сколько и просили, завершаем запрос.
Зачем читать другие строки? -
Raw попробовал, но проблема, что CH функции с json кажется работают только объектами json, т.е например {'a':1, 'b':2, 'c': [1, 2, 3] } но не могут, когда у нас всё завернуто в массив [{'a':1, 'b':2, 'c': [1, 2, 3] }]
-
жаль жаль :(
-
но спасибо за помощь)
-
так вы же писали что хотели получить минимальную талию? Просто количество - это очень просто.
-
А в чем проблема?
WITH '[{"a":1, "b":2, "c": [1, 2, 3] }]' AS x
SELECT JSONExtract(x, 'Nested(a UInt32, b UInt32, c Array(UInt32))')
Query id: 855df5d8-90da-4513-8dd0-fcce5558f6af
┌─JSONExtract(x, 'Nested(a UInt32, b UInt32, c Array(UInt32))')─┐
│ [(1,2,[1,2,3])] │
└───────────────────────────────────────────────────────────────┘ -
я хочу получить минимальный размер измерения у каждого сотрудника. Сравнивать этого сотрудника с другими мне не нужно.
Да даже если отвлечься от размеров.
Вот запрос
select name,count(*) from xxx where name > 'A' group by name limit 2;
Уходит в фулл скан,
Ставим опцию
SET optimize_aggregation_in_order = 1;
Все начинает работать быстро, но нам еще нужно как-то упорядочивать данные, чтобы в следующем запросе не получить те же самые данные, добавляем order by
select name,count(*) from xxx where name > 'A' group by name order by name limit 2;
и снова уходим в фулл скан -
optimize_aggregation_in_order, optimize_read_in_order respect subquery ordering · Issue #21756 · ClickHouse/ClickHouse
optimize_aggregation_in_order (and optimize_read_in_order but it's less important) would respect ORDER BY of subquery result set or subquery GROUP BY (if it's also optimized with op...
-
Зачем вам по две строки на сотрудника если нужен минимальный размер?
-
Не совсем понял Вашего вопроса.
У каждого сотрудника несколько строк, каждая строка это результат измерения разных данных проведенные в разние дни. В понедельник всем измерили талию, во вторник всем измерили грудь.
В конце недели нужно получить цифру, какой минимальный размер у каждого сотрудника -
Order by не добавляет. Но ch не имеет constraint-ов, поэтому дубликаты могут быть. Поэтому да, груп бай там может быть, поэтому согласен, мой вопрос был лишним.
-
>select name,count(*) from xxx where name > 'A' group by name order by name limit 2;
Ну уходите не в фулл скан, а в фулл сортировку, это другое
Во вторых если вы используете optimize_aggregation_in_order ORDER BY name скорее всего не нужен -
> а в фулл сортировку
а сортировку чего? результатов или исходных строк?
>Во вторых если вы используете optimize_aggregation_in_order ORDER BY name скорее всего не нужен
вот это бы решило мою проблему, насколько на это безопасно закладываться? Это так задуманно или то, чтоORDER BY не нужен, это просто особенность реализации, которую завтра могут изменить? -
О, спасибо большое! Через Nested получилось, по крайней мере моя задача решается. Но опять, же, оно работает, пока фиксирован уровень вложенности
-
> вот это бы решило мою проблему, насколько на это безопасно закладываться? Это так задуманно или то, чтоORDER BY не нужен, это просто особенность реализации, которую завтра могут изменить?
> насколько на это безопасно закладываться?
Гарантий не дам, но думаю достаточно нормально.
> Это так задуманно или то, чтоORDER BY не нужен, это просто особенность реализации, которую завтра могут изменить?
Просто не сделана фича (я кидал ссылку на issue), что можно использовать комбинацию GROUP BY и ORDER BY in_order -
Ну а что вы хотите в случае динамики?
Ну можете посмотреть на поддержку JSONPATH
https://github.com/ClickHouse/ClickHouse/pull/24148Jsonpath by l1tsolaiki · Pull Request #24148 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): New Feature Changelog entry (a user-readable short description of the cha...
-
ну тогда здорово, и еще один вопрос.
В рамках одной версии клика - поведение всегда детерминировано? те если версию менять не планирую в следующие два года - то могу не беспокоится, что однажды этот запрос сработает неверно? (если конечно на баг какой-нить не напорюсь) -
Да, ну разве что действительно баг.
на самом деле для
SELECT * FROM (SELECT * FROM table ORDER BY xx)
Точно есть гарантии, что порядок сохраняется, так что не вижу причин, что бы он нарушался после GROUP BY in order -
Наверно вопрос уже не первый раз прозвучал
Как сделать аналог ILIKE в кликхаусе? -
можно конвертировать в секунды используя toUnixTimestamp
-
👍
-
В новых версиях ILIKE есть
а так lower(str) LIKE lower('xxdD') -
uniq сильно быстрее на больших объемах, особенно если шардов много, ошибка <1%
-
конечно поможет, у нас у одного клиента расход памяти с optimize_aggregation_in_order уменьшается в 200 раз, запрос правда медленнее в 20 раз.
optimize_aggregation_in_order обрабатывает в streaming , идя по первичному ключу -
все гениальное - просто
а по перфомансу не сильно ударит? -
Ну если str в ключе ORDER BY таблице и вы ищете по префиксу, то ударит, а так скорее всего будет терпимо
-
спасибо
-
есть alter table clear column -- работает моментально, просто удаляет файлы колонки
-
-
group by не использует первичный ключ (по умолчанию) потому что это медленнее, регулируется параметром который написали выше
-
пардон, бампану пару своих вопросов
-
и вот этот
-
Здравствуйте, пытаемся разобраться с кубернетис кластером кликхауса (просьба не судить строго, опыта нет):
Подняли кластер в кубернетис (3 Шарда, по 2 реплики)
Далее пытаюсь создать БД и таблицу:
CREATE DATABASE IF NOT EXISTS db_name ON CLUSTER cluster_name;
CREATE TABLE IF NOT EXISTS db_name.table_1 ON CLUSTER cluster_name
(
time DateTime,
id UInt64,
text String
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/table_1', '{replica}')
PARTITION BY toYYYYMMDD(time)
ORDER BY (toYYYYMMDD(time), id)
CREATE TABLE IF NOT EXISTS db_name.table_1_distributed ON CLUSTER cluster_name
(
time DateTime,
id UInt64,
text String
)
ENGINE = Distributed(cluster_name, db_name, table_1)
Ошибок нет, но таблица создается не на всех нодах -
просто переименовать таблицу и КХ создаст новую используя новый конфиг
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-system-tables-eat-my-disk -
спасибо, теперь понятно что было и что изменилось с включением настройки optimize_aggregation_in_order
-
Спасибо!
-
kubectl get chi -o yaml -n ваш_namespace имя_вашего_chi
можете расшарить через gist.github.com какой нибудь? -
SELECT * FROM system.clusters WHERE name='cluster_name';
что показывает? все 6 нод? -
да
-
table_1_distributed - есть на всех
table_1 - только на 3 нодах -
По-моему, на это можно полагаться только если у нас один шард и один поток. А так у нас может первым вернуться результат не самого первого в общей сортировке блока.
-
> А так у нас может первым вернуться результат не самого первого в общей сортировке блока.
обычный GROUP BY и ORDER BY (+ in_order) же делается с учетом шардов, так что с этой точки зрения никакой разницы -
Добрый день. А тип базы данных может как-то влиять на то как выполняется удаление данных по достижении TTL?
Есть две реплики, в одной база имеет тип Atomic, в другой — Ordinary
Таблица одна и та же — с TTL date + toIntervalMonth(12)
но в атомик данные удаляются ежедневно, в ординари — каждый месяц -
что насчет ttl_only_drop_parts настройки у таблиц?
-
ну вот допустим у нас один шард. И 2 потока. Первый поток прочитал первый блок данных в порядке order by таблицы, второй поток второй блок данных. Так получилось, что второй поток оказался быстрее первого и первым вернул результат. Если в самом запросе нет order by, то разве у нас КХ не выдаст результаты, которые вернул второй поток, если их достаточно по limit? Не дожидаясь первого потока. Ибо зачем?
-
А partition by какой и как выставлена настройка ttl_only_drop_parts?
-
Пока первый поток не отдаст данные дальше второй поток допустим будет отдыхать или сложит данные в памяти куда то. (одна из причин, почему aggregation_in_order может быть медленнее)
Ну я к тому, что ваша проблема никак не относится к GROUP BY ORDER BY in_order
Если бы было так просто, то оно бы вообще ни для каких запросов не работало -
везде 0
но я смотрел глобально, не у отдельных таблиц
как у таблицы посмотреть настройки? -
SHOW CREATE TABLE xxx
-
на каждой реплике
-
в create увы тоже ничего
но при этом очевидно что удаление работат по разному -
PARTITION BY toYYYYMM(date)
-
это реплики одной таблицы?
-
-
Если одна реплика назначает TTL мерж, то все реплики его выполняют, что то у вас не то
-
пытаюсь понять что именно :)
-
-
Ну это логично если выключена ttl_only_drop_parts, в идеале её всегда включать чтобы нагрузку уменьшить
-
попробовал ещё optimize выполнить на реплике где строки лишние — ничего не почистилось
всё равно min(date) = 01-07-2020 -
Materialize TTL тоже пробовали?
-
А не подойдет просто extractAll?
with '[{"title":"Sport"}, {"title":"Electronics"}]' as str
select extractAll(str, '"title":"([^"]*)"'); -
почистилось
но почему не само...
таймаут на очистку стандартный —- 14400 -
👍 Большое спасибо, что-то я затупил и не догадался через регулярку достать
-
Странно, да. Используйте ttl_only_drop_parts и должно быть все ок
-
-
а если я меняю на таблице настройку, она отобразится в show create?
-
-
Привет. А подскажите кто-нибудь почему не применяется настройка max_partitions_per_insert_block? Добавил её в users.xml для default и distributed пользователя (который в кластере используется). Но запрос на вставку через Buffer всё равно падает с ошибкой Too many partitions for single INSERT block (more than 100).
Даже в query_log видно, что max_partitions_per_insert_block = 0.
SELECT
type,
exception,
arrayZip(Settings.Names, Settings.Values) AS settings
FROM system.query_log
WHERE (event_date = '2021-07-15') AND (query_id = '7f733df8-628f-4d59-85da-091ff284ef26')
Query id: e39c287e-71d2-4935-be3b-ed12da9b7ec5
Row 1:
──────
type: QueryStart
exception:
settings: [('receive_timeout','300000'),('send_timeout','300000'),('background_pool_size','96'),('background_schedule_pool_size','32'),('load_balancing','random'),('log_queries','1'),('insert_distributed_sync','1'),('max_memory_usage','10000000000'),('max_partitions_per_insert_block','0'),('normalize_function_names','0')]
Row 2:
──────
type: ExceptionWhileProcessing
exception: Code: 252, e.displayText() = DB::Exception: Too many partitions for single INSERT block (more than 100). The limit is controlled by 'max_partitions_per_insert_block' setting. Large number of partitions is a common misconception. It will lead to severe negative performance impact, including slow server startup, slow INSERT queries and slow SELECT queries. Recommended total number of partitions for a table is under 1000..10000. Please note, that partitioning is not intended to speed up SELECT queries (ORDER BY key is sufficient to make range queries fast). Partitions are intended for data manipulation (DROP PARTITION, etc). (version 21.3.13.9 (official build))
settings: [('receive_timeout','300000'),('send_timeout','300000'),('background_pool_size','96'),('background_schedule_pool_size','32'),('load_balancing','random'),('log_queries','1'),('insert_distributed_sync','1'),('max_memory_usage','10000000000'),('max_partitions_per_insert_block','0'),('normalize_function_names','0')] -
После добавления в users.xml сервер не перезапускал.
-
очень странно
смотрите /var/log/clickhouse-server/clickhouse-server.err.log
на тех трех нодах где не создалась таблица -
скорее всего надо ребутать или делать detach/attach буферной таблице, там шедулед треды давно созданы и работают со старым значением
-
Ребутнуть попробую, спасибо. А то, что в query log я вижу правильную настройку это ничего не значит?
-
Все привет. Подскажите как перегнать данные из таблицы с nested structure в так скажем "транспонированную таблицу". Например из table1 в table2:
table1:
userId UUID
errors Nested(errorId UInt16, auditedAmount UInt16, detectedAmount UInt16),
table2:
userId UUID,
errorId UInt16,
auditedAmount UInt16,
detectedAmount UInt16,
чтобы получить
из такого:
userId: 1
errors.errorId: [101,102,103]
errors.auditedAmount: [1,1,1]
errors.detectedAmount: [0,0,1]
такое:
Row 1:
──────
userId: 1
errorId: 101
auditedAmount: 1
detectedAmount: 0
Row 2:
──────
userId: 1
errorId: 102
auditedAmount: 1
detectedAmount: 0
Row 3:
──────
userId: 1
errorId: 103
auditedAmount: 1
detectedAmount: 1
----------Делал INSERT SELECT ....FROM table1 ARRAY JOIN errors
Таким образом, получается только 1 запись для каждого user_id. Остальные пропускаются.. -
вы видите в query_log инсерты которые делает буферная таблица?
-
Аргумент) Ок, спасибо.
-
select from tabl1 array join errors
-
я так пробовал, не работает
-
в смысле?
-
я делаю INSERT SELECT ....FROM table1 ARRAY JOIN errors limit 2000. Получаю в конечной таблице 17 записей
-
а SELECT ....FROM table1 ARRAY JOIN errors limit 2000 сколько записей возвращает?
-
так и сделал. просто думал, что есть что-то более "высокоуровневое", что бы не делить потом результат) пасиб за ответ.
-
2000 rows in set. Elapsed: 0.065 sec.
) -
для каждого userId у меня чуть более 100 записей
-
какой движок у таблицы в которую вставляете? Поди replacing order by uuid ? И все записи перезатираются
-
вы абсолютно правы! невнимательность. Спасибо большое!
-
вернее у меня Collapsing
-
но проблема такая же
-
select JSONExtract('[{"title":"Sport"}, {"title":"Electronics"}, {"botitle":"xxxx"}]', 'Array(Tuple(title String))').1 x;
┌─x──────────────────────────┐
│ ['Sport','Electronics',''] │
└────────────────────────────┘ -
Здравствуйте!
Подскажите, пожалуйста, есть ли библиотека для джавы для организации пула соединений с кликхаусом или в кликхаусе можно настроить пул соединений? -
любой connect pool, в основном я вижу что используют hikari
НО я не вижу никакого смысла в использовании пула вообще. КХ коннекты очень быстрые. Внутри офф. jdbc драйвера (а вообще их 4 штуки) пулятся http конекты. По тестам select 1 каждый в новом коннекте работает 4-5 мс. -
там есть правда лишний sql при установлении коннекта select version, timezone() надо бы его выпилить чтобы еще ускорится
-
-
-
как-то типа arrayStringConcat
-
перфетто, спасибо, совсем уже видеть доку перестал
-
Большое спасибо.
Не ожидал что хикари подойдет (в доках его не видел кликхауса).
Кстати насчет времени коннекта, похоже сильно зависит от железа под сервер (у нас слабое).
Вот у меня так получается:
Connection time to CH: 16
Method: getData. Work time: 31
Connection time to CH: 21
Method: getData. Work time: 29
Connection time to CH: 22
Method: getData. Work time: 26
Т.е. очень напрягает что коннект столько же времени занимает как и запрос. А этих запросов много бывает. -
а пинг до сервера покажите?
-
Подскажите пожалуйста, в доке есть описание функции date_sub (https://clickhouse.tech/docs/ru/sql-reference/functions/date-time-functions/#date_sub), а при выполнении запроса пишет, что такую функцию не знает:
Code: 46, e.displayText() = DB::Exception: Unknown function date_sub: While processing device_id, session_id, event_datetime AS screen_saver_end_datetime, toInt64(YPathExtract(event_value, '/period', 'Float64')) AS screen_saver_time, date_sub('second', screen_saver_time, toDateTime(screen_saver_end_datetime)) AS screen_saver_start_datetime (version 21.4.1.1-arcadia)Функции для работы с датами и временем | Документация ClickHouseФункции для работы с датами и временем Поддержка часовых поясов Все функции по работе с датой и временем, для которых эт
-
там нельзя unit строкой
select DATE_SUB(day, today(), yesterday()); -
спасибо!
-
для секунд можно просто минус использовать
-
имеешь ввиду: toDateTime(date_string) - number_of_seconds?
-
да
-
спасибо!
-
Ответ от xx: число байт=32 время=6мс TTL=62
Ответ от xx: число байт=32 время=6мс TTL=62
Ответ от xx: число байт=32 время=6мс TTL=62
Ответ от xx: число байт=32 время=5мс TTL=62 -
Подскажите пожалуйста какие есть варианты решения :
При попытке сделать alter :
Metadata on replica is not up to date with common metadata in Zookeeper. Cannot alter
В логе :
Cannot execute alter metadata queue-0000614804 with version 10 because another alter 9 must be executed before
SELECT *
FROM system.replicas :
columns_version: -1 -
обычно должно чиниться c detach table / attach table
-
-
select * from system.mutations where not is_done
-
-
-
там есть колонки с текстом ошибки и колонка parts_to_do
-
-
select * from system.merges
-
-
-
select * from system.parts where name = имя_из_parts_to_do_names
-
-
elapsed: 0.000864935
progress: 0
num_parts: 1
source_part_names: ['all_398834_398834_0']
result_part_name: all_398834_398834_0_398835
source_part_paths: ['/var/lib/clickhouse/store/4eb/4ebf966e-4e12-41ff-9e2c-94af1f89145a/all_398834_398834_0/']
result_part_path: /var/lib/clickhouse/store/4eb/4ebf966e-4e12-41ff-9e2c-94af1f89145a/all_398834_398834_0_398835/
partition_id: all
is_mutation: 1
total_size_bytes_compressed: 13098
total_size_marks: 2
bytes_read_uncompressed: 0
rows_read: 0
bytes_written_uncompressed: 0
rows_written: 0
columns_written: 0
memory_usage: 0
thread_id: 10972
merge_type:
merge_algorithm: -
-
я не понял что значит пусто а потом не пусто ?
-
-
а вы в один и тот же КХ ходите?
-
-
-
всегда вот этот отдает
-
-
читайте лог, ищите там all_398834_398834_0
-
-
DB::StorageReplicatedMergeTree::processQueueEntry(ReplicatedMergeTreeQueue::SelectedEntryPtr)::(anonymous class)::operator()(DB::StorageReplicatedMergeTree::LogEntryPtr &) const: Code: 47, e.displayText() = DB::Exception: Missing columns: 'season_wear' 'site_section' while processing query:
-
-
-
-
-
kill mutation where mutation_id = 00000002
detach / attach -
-
-
.
-
с ней тоже самое ? не поправилось после убийства первой?
-
-
-
-
-
DB::StorageReplicatedMergeTree::processQueueEntry(ReplicatedMergeTreeQueue::SelectedEntryPtr)::(anonymous class)::operator()(DB::StorageReplicatedMergeTree::LogEntryPtr &) const: Code: 47, e.displayText() = DB::Exception: Missing columns: 'season_wear' 'site_section' while processing query:
-
-
надо на реплике смотреть, возможно там тоже надо убивать мутации
-
-
-
Относительно недавно было пофикшено https://github.com/ClickHouse/ClickHouse/issues/23508
В релиз ноутес для 21.6 написано в секции багфикс.
но при этом при попытке заапгрейдится на инстансе, где есть таблицы с флоатинг-поинт ключом партицирования летит все та же ошибка
2021.07.15 16:14:01.401495 [ 33 ] {} <Error> auto DB::MergeTreeData::loadDataParts(bool)::(anonymous class)::operator()() const: Code: 33, e.displayText() = DB::Exception: Cannot read all data. Bytes read: 2. Bytes expected: 8., Stack trace (when copying this message, always include the lines below):
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0x8b6e1fa in /usr/bin/clickhouse
1. DB::ReadBuffer::readStrict(char*, unsigned long) @ 0x8ba928d in /usr/bin/clickhouse
2. DB::SerializationNumber<double>::deserializeBinary(DB::Field&, DB::ReadBuffer&) const @ 0xf43271a in /usr/bin/clickhouse
3. DB::MergeTreePartition::load(DB::MergeTreeData const&, std::__1::shared_ptr<DB::IDisk> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x1028540f in /usr/bin/clickhouse
4. DB::IMergeTreeDataPart::loadPartitionAndMinMaxIndex() @ 0x101147b9 in /usr/bin/clickhouse
5. ? @ 0x1019aa1c in /usr/bin/clickhouse
6. ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::__1::__list_iterator<ThreadFromGlobalPool, void*>) @ 0x8bb0fd8 in /usr/bin/clickhouse
7. ThreadFromGlobalPool::ThreadFromGlobalPool<void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()>(void&&, void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()&&...)::'lambda'()::operator()() @ 0x8bb299f in /usr/bin/clickhouse
8. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x8bae51f in /usr/bin/clickhouse
9. ? @ 0x8bb1a43 in /usr/bin/clickhouse
10. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
11. __clone @ 0x122293 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
(version 21.6.7.57 (official build))
allow_floating_point_partition_key=1 включено в настройках сервера
апгрейжусь с 20.4.4.18 до 21.6.7.56Can't attach table with Int64 partitioning key in ClickHouse v21.3 · Issue #23508 · ClickHouse/ClickHouseWe're trying to upgrade ClickHouse server from v20.11.7.16 to v21.3.6.55-lts (VERSION_GITHASH 11776e9) We have following table: CREATE TABLE db.table ( `id` Int64, `field2` String, `field3`...
-
создавайте issue, там покажите show create table
-
Добрый вечер!
Так же столкнулись с проблемой CPU 100%. Я тут не много тугой. а про какую именно очередь идет речь ? И вопрос, а можно как ни будь пользователям порезать по ресурсам потребление CPU(например уменьшить thread) -
Здравствуйте, кто нибудь разбирается в clickhouse-cpp?
-
А как лучше по матвью получить таблицы-назначения? Парсить data_paths или create_table_query?
-
какую задачу решаете?
-
Хочу визуализировать зависимости между таблицами в виде графа вершины-таблицы и ребра-матвью
-
src и matview достаются запросом Сергея. Хочу понять как лучше dst получить
-
Пока только такое придумал
select name, arrayMap(x -> splitByChar('/', x)[-2], data_paths) from system.tables where name = '...'; - 16 July 2021 (144 messages)
-
Не рабоатает условие host_regexp по фильтрации по хосту источника. Подскажите какие могут быть решения, как можно отдебажить ?
В clickhouse operator указана директива, в clickhouse тоже. Подключаюсь из разных подов (т.е. с разных src host ) с разными именами, везде достутп clickhouse открыт, различные варианты regexp пробовал (даже умышленно ставил неправильный host_regexp), ощущение, что эта настройка игнорируется.
Если указать в
chConfigNetworksHostRegexpTemplate
заведомо не верный паттерн, то clickhouse после переустановки не стартанет.
Развернуто с помощью clickhouse operator 0.14
clickhouse-operator:
cat /etc/clickhouse-operator/config.yaml | grep chConfigNetworksHostRegexpTemplate
chConfigNetworksHostRegexpTemplate: "(.*clickhouse.*)"
Clickhouse cluster:
<users>
<demo>
<networks>
<host_regexp>.*xyz.*</host_regexp>
<ip>0.0.0.0/0</ip>
<ip>::/0</ip>
</networks>
<password_sha256_hex>ebf22d8bfa40cc5ae972270a06934fe1056ea7227859ad7d39c6fe9c497db70f</password_sha256_hex>
<profile>default</profile>
<quota>default</quota>
</demo>
<default>
<networks>
<host_regexp>(.*clickhouse.*)</host_regexp>
<ip>0.0.0.0/0</ip>
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
</default>
</users> -
у них через батчи через внешнюю очередь идет вставка в clickhouse
соответственно 100% CPU на clickhouse Это нормально
100% CPU они получают на SELECT а не на INSERT
соответственно если нет возможности несколько clickhouse зайдествовать и вставлять в разные сервера
то проще мониторить длинну очереди -
Спасибо за ответ. Теперь понятно что 100 утилизация ЦПУ при селектах это нормально. Но при такой утилизации мы заметили, что некоторые таблицы могут переходить в статус readonly и не много растет delay. Плюс мы не можем делать alter на изменение таблиц, начинаем падать по ошибке взаимодействия реплики с zk. То есть 100 утилизация ведёт к проблемам работы реплики и zk
-
-
Да, есть же онлайн валидаторы
-
спс
-
Не удалется crd из k8s удалить.
k8s 1.18
chi-operator: 0.14
При переустановке пишет, что предыдущий crd не удален.
Error: rpc error: code = Unknown desc = release clickhouse-operator failed: object is being deleted: customresourcedefinitions.apiextensions.k8s.io "clickhouseinstallations.clickhouse.altinity.com" already exists
Получается удалить только таким патчем:
kubectl patch crd/clickhouseinstallations.clickhouse.altinity.com -p '{"metadata":{"finalizers":[]}}' --type=merge
Есть ли способ пофиксить это поведение, чтобы удаление было корректно ? -
получилось создать без on cluster. Но это как-то неудобно по всем годам бегать создавать. И неочевидно.
-
всем привет!) подскажите плз, хочу выделить число из стринги через самое простое решение - использовав регулярку '\d+'
SELECT
extract('hard_80_first','\d+')
ПО логике я должен получить в результате число 80 но получаю 'd'.
Видимо у нас какая-то старая версия КХ, потому что в бд другого проекта все работает правильно и в результате функции получается число 80.
Полагаю что эта версия как-то иначе интепретирует паттерн '\d+'.
Подскажите плз, кто - то сталкивался с этим, как можно решить проблему? мб вместо обратной косой черты надо испльзовать что-то другое? -
если вы делаете ALTER ... UPDATE\DELETE или OPTIMIZE ... постоянно
IMHO у вас сломана архитектура... =) и надо искать что-то другое вместо того чтобы пытаться крутить кастыли в кликхаусе -
Неа, мы очень часто добавляем колонки в таблицы :)
-
JSON парсите какой то наверное =)
-
Привет, подскажите пожалуйста такой момент
Есть таблица X с партицированием по колонке dt
Я хочу сделать обычную вьюшку в духе
CREATE VIEW flattened AS SELECT * FROM X FLATTEN BY y
Вопрос: когда будут идти запросы вида
SELECT *
FROM flattened
WHERE dt >= 20210710
кх учтёт эту фильтрацию по dt при запросе к основной таблице через вьюшку? -
-
а сервер при рестарте не будет жаловаться на такие вьюхи с custom settings? Ведь при рестарте настройки не заданы.
-
попробуйте \\d или \\\d... Ну или [0-9]
-
огромное спасибо!!))) я с двумя пробовал а с тремя нет!)) с тремя получилось)))
-
лучше всё-таки [0-9], а то после обновления запросы могут не заработать
-
Да, все верно. По этому и возникает вопрос по утилизации CPU. Вот и хотелось бы ограничить как то потребление ЦПУ. Есть какие нибудь идеи в какую сторону можно было бы покопать?
-
В докере можно ограничивать CPU для контейнера…
-
У нас железяки
-
-
@BloodJazMan Можете помочь с этим ?
-
max_threads и os_thread_priority через SETTINGS или через profiles ограничивать
-
тут закрывающий кавычки не хватает как минимум
запустите какой нибудь kubectl sniff
на 53й порт в поде clickhouse
и посмотрите PTR запросы которые делает сервер в попытке отрезолвить ваши клиентские подключения...
дальше смотрите совпадает он с host_regexp или нет -
Понял пропишу в пользовательских профилях ограничения. Я заметил когда пользователи бегают через дистр таблицу, то на репликах в таблице процессес видно, что user внутренний который прописан в конфиге кластера, а user name (содержит имя пользователя кто сделал селект). В этом случаи настройки профиля пользователя все равно ведь работают
-
ну он и должен быть тот который в remote_servers прописан или default
-
@BloodJazMan А с этим подскажете в чем может быть дело ?
-
А попробуйте и расскажете? (на тесте)
-
crd нельзя удалить пока есть хотя бы один CR ссылающийся на этот CRD
-
попробуйте оператор 0.15.0 поставить
или 0.14.1 -
+
-
странно что финалайзер не отрабатывает
а deployment оператора к этому моменту уже есть? -
-?
-
Хорошо, спасибо
-
нет, нету. На сколько я видел ничего не было от clickhouse
-
Хм, то есть я не могу просто воткнуть ограничения на профиле пользователя(у меня пользователь ский профиль и профиль под которым кластер взаимодействует между репликами это два разных профиля) обязательно нужно устанавливать ограничения на профиль кластера? Блин печаль
-
ну вообще странно, надо бы финалайзеры для CRD посмотреть
-
Где он описан, как его посмотреть ?
-
не очень понимаю что такое профиль кластера
можно попробовать через SETTINGS задавать в соответсвующих query
или через query string параметры если через HTTP запросы делаете
но не уверен что это будет пробрасываться для distributed query select -
В настройках кластера в конфиге прописан пользак default и все реплики через него общаются. Пользователей мы выгнали из профиля default и создали им отдельный профиль с кучей ограничений по памяти, лимитам, времени запроса и тд
-
Добрый день, коллеги!
Вчера наткнулся на баг, который решили здесь https://github.com/ClickHouse/ClickHouse/pull/18381 (в мою версию ещё не вмержено)
Хотелось бы узнать, почему набор партов, среди которых есть wide теоретически может оптимизироваться в compact.
Я думал, эвристика для определения размера партов это некоторое число строк, при меньшем значении которого парт будет compact, иначе wideRestrict merges from wide to compact parts by CurtizJ · Pull Request #18381 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Bug Fix Changelog entry (a user-readable short description of the changes...
-
ну, молодцы
-
Я как понимаю это сарказм :)
-
нет, реально молодцы, мало кто так делает
теперь вы говорите что у вас все равно 100% CPU?
из под какого пользователя и для каких запросов?
по идее system.thread_log это может показать правда сходу я запрос не напишу -
Да. Приходит пользователи и очень часто любят запускать селекты по полям у которых нет индексов и мы на репликах улетаем в 100%. Кто кушает ресурсы сразу видно. На репликах видно, что запрос типо под пользователем default, вызван пользователем test(хотя, я вспомнил лимит так работают, селекты которые делаются больше отведённого времени обрываются).
-
-
-
Здравствуйте коллеги. У меня есть таблица с 3 колонками. Первая колонка название и по этой колонке будет производится группирование, вторя колонка это массив из 11 элементов типа UIint32, третья колонка это дата. Я пишу запрос который группирует по первой колонке т.е. по имени. А массив суммирую по элементам все первые все вторые и т.д. и получается результат название и массив из 11 элементов. Вот запрос :
SELECT
name,
array(SUM(a.ranksCount[1]),
SUM(a.ranksCount[2]),
SUM(a.ranksCount[3]),
SUM(a.ranksCount[4]),
SUM(a.ranksCount[5]),
SUM(a.ranksCount[6]),
SUM(a.ranksCount[7]),
SUM(a.ranksCount[8]),
SUM(a.ranksCount[9]),
SUM(a.ranksCount[10]),
SUM(a.ranksCount[11])) AS ranksCount,
stat_date
FROM
factories.cars a
where
name = 'BMW'
and stat_date >= (today() - interval 2 week)
and stat_date<today()
GROUP BY
name ,
stat_date
ORDER BY stat_date DESC LIMIT 1;
Этот запрос работает правильно, но я бы хотел избавится от SUM и использовать вместо array arraySum. При использование arraySum выдает ошибку. Вот запрос который я использовал с arraySum:
SELECT
name,
arraySum(
a.ranksCount[1],
a.ranksCount[2],
a.ranksCount[3],
a.ranksCount[4],
a.ranksCount[5],
a.ranksCount[6],
a.ranksCount[7],
a.ranksCount[8],
a.ranksCount[9],
a.ranksCount[10],
a.ranksCount[11]) AS ranksCount,
stat_date
FROM
factories.cars a
where
name = 'BMW'
and stat_date >= (today() - interval 2 week)
and stat_date<today()
GROUP BY
name ,
stat_date
ORDER BY stat_date DESC LIMIT 1; -
ну по идее у вас thread_id совпадать должен с id треда в OS
соответсвенно там дальше надо
initial_user_id смотреть и master_thread_id -
то есть я имел ввиду см. top
оттуда получаем pid для clickhouse
оттуда смотрим есть ли что в system.query_thread_log и кто это вообще -
ну да, через SETTINGS max_threads=1
вообще другая производительнсоть для одной query получается
но я не уверен что оно в distributed пробрасывается, смотреть надо -
Если у кого есть какие то мысли не стесняйтесь пишите.
-
какая ошибка?
и судя по всему агрументом arraySum должен быть массив -
Да из за того что в аргументах не массив и выводится ошибка. А ест ли такая функция которая решила бы мою проблему?
-
Не подскажите, где его посмотреть ?
эта проблема через раз появляется
@BloodJazMan -
Спасибо большое, выйду из отпуска начну все тестить и смотреть
-
ну так вы ж его сами патчили
kubectl get crd -o yaml
там смотреть -
Добрый день. Выполняю SELECT итерациями, после каждой итерации пишу результат в excel файл. Из за разбивки по чанкам, некоторые агрегированные данные выгружаются в разные чанки, из за этого получается задваивание строчек в файле. Вопрос есть ли какая то настройка в ClickHouse, которая позволит выгружать итерациями блоки, согласно указанной группировке (на скрине field1, field2), независимо от размера max_block_size? (SELECT очень крупный, увеличение размера блока не помогает)
-
sumForEach попробуйте
-
Всем привет! Пытаюсь обратится к таблице с движком Distributed
Пишет ошибку
DB::Exception: Table default.bauart.pool_11 doesn't exist
Хотя я нахожусь в нужной базе данных, в чем дело? -
ClickHouse/ClickHouse tagged: v21.6.8.62-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.6.8.62-stable
Release notes:
v21.6.8.62-stableRelease v21.6.8.62-stable · ClickHouse/ClickHouseClickHouse stable release v21.6.8.62-stable
-
имя таблицы с точкой?
SHOW TABLES FROM default; таблицу показывает? -
Так обращаюсь select * from bauart.pool_11_main;
-
хм... откуда тогда default добавился в ошибке?
какой клиент?
SHOW TABLES FROM bauart;
что показывает? -
-
Клиент default
-
покажите еще раз запрос
и ошибку
а еще попробуйте запрос выполнить не в datagrip а в clickhouse-client -
CREATE TABLE pool_11_main
(
case String,
event String,
time DateTime,
numeric Int32
)
ENGINE = Distributed(logs, default, pool_11, rand());
У меня в движке была ошибка -
При создании указал базу default
-
Спасибо!
-
Добрый день, ребят, подскажите пожалуйста, как можно решить следующую проблему,
есть таблица с 8 колонками
hash_slice(SHA-256),
event_type(String),
news_id(Uint64),
stream_uuid(UUID),
money(Float64),
money_with_commission(Float64),
created_at(Datetime),
sign Int8
Движок таблицы CollapisngMergeTree(sign)
ORDER BY в таблице (hash_slice, event_type)
Нужно сделать аггрегацию этой таблицы, по toStartOfHour(created_at) и hash_slice
Для этих целей был выбран движок SummingMergeTree((money, money_with_commission))
Для 2-х типов событий все колонки кроме money и money_with_commission заполнены, а вот для третьего заполены лишь hash_slice, event_type, money, money_with_commission. А другие равны Null, CH при агрегации в каких то случаях, видимо когда последнее событие с нулами, при агрегации трет поля news_id и stream_uuid и в агрегационной статистике они равны NULL, а иногда нет, как сделать так, чтобы при агрегации нулы игнорировались если в событиях выше или ниже есть данные в колонках stream_uuid или news_id и при агрегации эти колонки всегда были заполнены? Есть идеи? -
sign для CollapsingMergeTree не может быть UInt8 сделайте Int8
-
Я препутал, да, там Int8, спасибо))
-
уберите для money и money_with_comission Float64 замените на Decimal64
и уберите Nullable
пусть будет просто 0
вторая таблица из первой заполняется через Materialized VIEW? -
угу
-
Спасибо)) А почему именно Decimal64?
-
при суммировании будет не будет ошибок округления из Float
float для денег не предназначен -
спасибо)
-
вообще логика у всех SummingMergeTree или AggregatingMergeTree или Replacing
простая
если при слиянии двух партов у двух строк одинаковые значения для полей из ORDER BY
тогда делается то действие, которое прописано в названии движка
Summing
суммируются поля
Replacing заменяется на одно значение (или на последнее для большего значения поля которое определено как version)
Aggregating
проводится Merge для всех State полей и записывается конечный State в одну строку -
Тогда как я понял нужен агрегейт
-
Прости, что отвлекаю, но есть вопрос, AggregatingMergeTree требует группировку по типу GROUP BY datetime, hash_slice, stream_uuid, news_id, тогда у меня в статистике получается не одна строчка а 2, так как 3-е событие имеет в колонках stream_uuid и news_id NULL, а хотелось бы склеивать колонки по hash_slice и datetime.
-
А чем Summing не устроил?
-
А там проблема в том, что если в конце залетает событые у которого колонки news_id и stream_uuid NULL, summing переписывает их на NULL в агрегации
-
И выходит что у пераых двух событиый данные есть, группирумем по hash_slice, а в агрегации данных нет
-
А интами их никак не сделать? Через coalesce в 0 превращать в мat view
-
Вот так выглядит таблциа, и нужно схлопывать по datetime(часы) и hash, когда делаем агрегацию с summing на выходе получаем вот это
-
-
И как там зафигачить коалески, пока хз
-
Для этого все в интах должно быть кмк
-
Как просуммируются uuid c другим uuid?
-
они не учавствуют в суммировании, SummingMergeTree((money, money_with_commision))
-
Его нет в ORDER BY, поэтому суммируется
-
ORDER BY содержит в себе только datetime и hash_slice, чтобы КХ понимал за что цепляться
-
Добрый день!
Вопрос по отчистке СН. Партиции организованы по суточно, данные требуется хранить определенное время. Можно ли на уровне операционной системы просто удалять файлы просроченных партиций? -
Можно это сделать в кх
merge tree настройка таблицы
ttl_only_drop_parts -
Большое спасибо !
-
ну вы сначала для таблицы TTL выражение задайте только
-
да, прочитал в доке, спс!
-
Коллеги, использует кто-то словарь/движок для mongodb? Для него невозможно указать authSource?
-
Привет, а не подскажете почему такой запрос может вернуть 2 строчки, в одной из которых ids.transaction_id = NULL , а в другой не NULL
select * from post.apple_attribution_event evts
left join (
select distinct x.transaction_id from post.apple_attribution_event x
where x.event_name = 'install'
) ids on evts.transaction_id = ids.transaction_id
where evts.transaction_id = '80a600d6-6bd3-424a-92f2-fc26ab28ad54' -
Господа. Я тут при обновлении с 21.6.5.37 на 21.7.3.14 столкнулся с интересной картиной: сломалась materialized view примерно такого содержания:
CREATE MATERIALIZED VIEW blah_mv
(
...
`ips` AggregateFunction(groupUniqArray(5000), IPv6) CODEC(ZSTD),
...
)
ENGINE = AggregatingMergeTree()
AS SELECT
...
groupUniqArrayState(5000)(remote_addr6) AS ips,
...
FROM blah_main
Жалуется на то, что не может вставить данные неподходящего типа:
Conversion from AggregateFunction(groupUniqArray, IPv6) to AggregateFunction(groupUniqArray(5000), IPv6) is not supported
Собственно, на старой версии КХ эта вьюха вполне себе работала как от неё и ожидалось. Кто-нибудь сталкивался с чем-то подобным? Так стало задумано или всё-таки бага? -
ну похоже что-то пере-оптимизировали
шлите багу -
Может, конечно, и можно довериться тому, что groupUniqArrayState(5000) из запроса всё-таки будет работать ограничителем. Но хочется всё-таки знать наверняка =)
-
-
join в запросе есть? какая версия КХ?
-
нет
21.2.9.41
Еще добавлю что объединиение 3 таблиц, там 3 вью внутри которых ограничение по датам захардкожены.
Обращение к каждой из вью мгновенное. -
не реализован пушдаун для этого https://github.com/ClickHouse/ClickHouse/issues/17413Predicate pushdown weird behaviour · Issue #17413 · ClickHouse/ClickHouse
Description intro: updating CH from 20.4.3.16 to 20.10.3.30 and noticed an issue in performance (degrades in new because predicate fails to get to "data layer" correctly) in lower...