- 01 November 2021 (112 messages)
-
-
Может КХ эс э сервис в яоблаке ?
-
Вопрос не в том, что нельзя в текущей реализации хэшировать. Нужно чтобы результат хэширования совпадал с результатом в MS SQL. Тогда можно надежно сравнивать содержимое баз данных: OLTP базы MS SQL, которая является источником данных для OLAP базы КХ. OLTP база очень активно изменяется, в том числе данные изменяются "задним числом" и инструментом согласования является сверка по хэшам. Регистрация изменений в данном случае не подходит - их много и быстрее сравнить хэши. Кроме того, регистрация изменений позволяет согласовать данные только двух баз, а сверка хэшей - "накатить" на любой бэкап базы OLAP
-
md5 можно уложить в guid :)
-
guid никак не связан с задачей согласования. Более того, в текущей реализации он может изменяться. Например, магазин два раза выслал отчет за день о продажах, а затем выслал одним документом. Предыдущие два документа будут удалены в системе и останется один. Но с точки зрения учета содержимое документов (суммарно в двух или в одном), одинаковое
-
нет, по тз на кх идет 2 шарда + 2 реплики на 4х серверах хетцнера, а про зукипер естественно забыли
-
я к тому что и md5 и guid занимают 16 байт, если задача както хранить встроенным типом данных - привести 16-байт хэша md5 к guid и хранить его как guid или uniqueidentifier в mssql
-
Для этого md5 (или SHA256) нужно вначале посчитать способом, который даёт одинаковый результат и в MS SQL и в КХ. Текущий алгоритм согласования данных считает хэш по документам за дату (не по каждому документу). И, если обнаружены изменения, в КХ полностью удаляются данные за день и "перезаливаются" новые из MS SQL.
-
... как вариант можно было бы использовать вместо функции приведения типов toString() какую-либо функцию форматирования, которая число представляет с заданным количеством знаков после запятой (даже если там нули). Но подобной в документации КХ я не нашел (
-
ШТА? я имею в виду, может не заниаться поднятием своего КХ в хетзнере, а взять готовый в яндекс облаке ?
-
Да, в 21.10 можно выкрутиться с помощью пользовательской функции типа:
CREATE FUNCTION format_dec AS (x, dec) ->
mid(toString(x*exp10(dec)), 1, length(toString(x*exp10(dec)))-dec)
|| '.' ||
mid(toString(x*exp10(dec)), length(toString(x*exp10(dec)))-dec + 1, 30)
;
SELECT
format_dec(235.1,2)
Работать будет, но это, мне кажется, уже извращение. Лучше бы
set output_format_decimal_trailing_zeros=1 работало, как в документации -
CREATE FUNCTION format_dec AS (x, dec) ->
mid(toString(round(x*exp10(dec),dec)), 1, length(toString(round(x*exp10(dec),dec)))-dec)
|| '.' ||
mid(toString(round(x*exp10(dec),dec)), length(toString(round(x*exp10(dec),dec)))-dec + 1, 30) -
Доброго времени суток. Подскажите пожалуйста где можно найти информацию про 'external group by'? У нас возникает проблема в одном из запросов если одновременни используются и two-level aggregation и external group by. Сам запрос имеет формат:
SELECT k1, t1.p1 as p1, t2.p2 as p2
FROM (
-- 3.4M rows, 200Mb peak memory ysage
SELECT k1, someExpression(pv) as p1
FROM (
SELECT k1, pv FROM inner_table1
WHERE paritionCondition() AND (pn IN ('pn'))
) AS inner_data
GROUP BY k1
) AS t1
FULL OUTER JOIN (
-- 2.5M rows, 3.62 peak memory usage, 2-level agg
SELECT inner_table2.k1, inner_table3.p2
-- 3.4M rows, 60Mb peak memory usage
FROM inner_table2
INNER JOIN (
-- 19M rows, 0Mb peak memory usage
SELECT k2, k3, k4, p2 FROM cnfx_temp_3222 WHERE someCondition()
) AS inner_table3 ON (inner_table2.k2 = inner_table3.k2) AND (inner_table2.k3 = inner_table3.k3) AND (inner_table2.k4 = inner_table3.k4)
WHERE paritionCondition()
) AS t2 using (k1)
WHERE k1 != 0
если отключить exteral group by или two level aggregation то запрос укладывается в 5Gb, но если их не отключать, то требуется больще 30gb памяти. Это выглядит как баг, но не понятся кто его "триггерит" -
складывается ощущение что сначала "256 hashtables per thread" сбрасываются на диск, а потом все вместе загружаются, причем в памяти держатся и запакованные и заспакованные данные
-
🤚, как можно быстро убрать дубликаты из таблицы MergeTree ? Из-за ошибки парсера появились
-
Как я понял, предложили считать хэш на стороне приложения, которое перекладывает данные из OLTP в КХ и сохранять в отдельный столбец, при сверке пересчитывать только на стороне OLTP и сравнивать с этим столбцом
-
OPTIMIZE TABLE ... DEDUPLICATE
https://clickhouse.com/docs/ru/sql-reference/statements/optimize/OPTIMIZE | Документация ClickHouseOPTIMIZE Запрос пытается запустить внеплановое слияние кусков данных для таблиц. Внимание OPTIMIZE не устраняет причину
-
Спасибо
-
Нет, для каждой даты выполняется два запроса:
1. к базе на сервере MS SQL
2. к базе на сервере КХ
Каждый из запросов возвращает хэш-сумму и, если они различаются, дата регистрируется в таблице с целью последующей "перезаливки" из MS SQL. Запросы 1, 2 выполняются в цикле по датам. -
... подобная пара запросов своя для каждого из типов документов, которые изменяют остатки. В результате расчеты остатков в 1С (база MS SQL) и КХ совпадают.
-
Как можно сделать быстро копию табличке ?
-
Сделать create table_copy as table и приаттачить туда все партишны из table
-
а это точно будет копия ?
может лучше:
CREATE TABLE newtable AS oldtable
;
INSERT INTO newtable
SELECT * FROM oldtable -
Да, точно копия: https://clickhouse.com/docs/en/sql-reference/statements/alter/partition/#alter_attach-partition-fromPARTITION | ClickHouse Documentation
Manipulating Partitions and Parts The following operations with partitions are available: DETACH PARTITION — Moves a par
-
👍 спасибо за информацию
-
-
Окей, спасибо по тестим
-
Всем привет! При обновлении clickhouse c с версии 20.3.8.53 до 20.12.8.5 при старте сервера получаю ошибку:
2021.11.01 11:30:53.924108 [ 1 ] {} <Error> Application: DB::Exception: Maximum parse depth (1000) exceeded. Consider rising max_parser_depth parameter.: Cannot attach table `data`.`stream166` from metadata file /clickhouse/metadata/data/stream166.sql
пробовал добавлять параметр max_parser_depth в config.xml и в секцию настроек default profile - не помогло. В ошибке все так же занчиться лимит 1000.
Подскажите пожалуйста есть ли возможность увеличить лимит вызывающий ошибку и как это сделать? -
Действительно быстро, даже не верится ) Таблица 173 G скопировалась за 2 секунды
-
Т.е. фактически копирования нет, линки на старые партиции. И только при изменении данных запись в свои парты.
-
поднять clickhouse-keeper на 3-х из них? Вроде как должно работать......
-
Добрый день.
Тестирую MaterializedPostgreSQL на облочном клике 21.10.2.15.
[1002] ClickHouse exception, message: std::exception.
Code: 1001, type: pqxx::broken_connection, e.what() = connection to server at __ failed:
FATAL: must be superuser or replication role to start walsender (version 21.10.2.15 (official build))
выдал роль репликации пользователю в PG и теперь запрос на создание таблички выдает
[1002] ClickHouse exception, message: std::exception.
Code: 1001, type: pqxx::usage_error, e.what() = Started new transaction while transaction was still active. (version 21.10.2.15 (official build))
Но такую же ошибку начал выдавать ещё до того как выдал права, так понимаю при первой попытке создания таблицы он не погасил запрос/коннект, куда смотреть? Долбить поддержку облака? -
а почему у вас правые таблицы больше левых? В КХ нет оптимизации в этом месте. Надо делать руками.
-
-
Большой кх?
-
-
Сколько таблиц-партиций и терабайт?
-
-
-
И версия
-
-
-
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-zookeeper/altinity-kb-recovering-from-complete-metadata-loss-in-zookeeper/
> 20.3.15.133-1
Старенькая версия
Можете попробовать еще скрипт, что бы не обновляться
https://github.com/Altinity/clickhouse-zookeeper-recoveryGitHub - Altinity/clickhouse-zookeeper-recoveryContribute to Altinity/clickhouse-zookeeper-recovery development by creating an account on GitHub.
-
ага, я это видел, но обновление всё равно в планах было
-
-
Ну тогда смотрите все changelog между версиями
https://docs.altinity.com/altinitystablebuilds/releasenotes/
И помните, что скорее всего вниз вы не сможете сделать downgradeRelease NotesRelease Notes for Altinity Stable
-
-
всем здравствуйте. есть вопрос, насколько оправдано использование кликхауса в качестве хранилища таим-серий с учетом вставки каждого события отдельно(не батчами). сейчас вроде бы справляется, но пока нагрузки особой нету, и ожидаем, что в будущем, в пиках будет приходить от 1-5к запросов в секунду, пики ожидаем раз в 10-30 минут. игровой проект, собираемся хранить логи всех действий игроков.
-
Используйте какой-то kittenhouse или ему подобное, и будут у Вас батчи
-
DOCSUP-14941-Document-asynchronous-inserts by gyuton · Pull Request #30541 · ClickHouse/ClickHouse
Changelog category: Documentation for #27537 and #29087
-
всем спасибо!
-
https://clickhouse.com/docs/ru/sql-reference/statements/insert-into/#zamechaniia-o-proizvoditelnostiINSERT INTO | Документация ClickHouse
INSERT Добавление данных. Базовый формат запроса: INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v2
-
вот как раз из-за этого замечания и возник вопрос
-
Настройки | Документация ClickHouse
Настройки distributed_product_mode Изменяет поведение распределенных подзапросов. ClickHouse применяет настройку в тех с
-
Сказано до 15 тысяч запросов в секунду
-
ещё в новых версиях планируется https://youtu.be/W6h3_xykd2Y?t=4853ClickHouse: онлайн-встреча 19 октября 2021
У нас много новостей :) Расскажем о больших организационных изменениях в ClickHouse, об UDF in ClickHouse и о шифровании хранимых данных в ClickHouse. Программа: 0:00:00 - Таймер 0:10:17 - Открытие 0:14:47 - UDF in ClickHouse 0:38:40 - Шифрование хранимых данных в ClickHouse 1:17:15 - Потрясающие возможности ClickHouse 1:58:02 - Ответы на вопросы Добавляйтесь в телеграмм сообщество неравнодушных к ClickHouse: https://t.me/clickhouse_ru
-
всем большое спасибо, вы очень помогли!
-
А что будет происходить если делать много маленьких инсертов? Начнут падать ошибки выполнения запроса вставки?
-
да, будет не успевать мержить и кидать too many parts
много файлов на диске создается, надо много iops, большой оверхед по ресурсам -
Если в буферные таблицы, то ничего особо страшного. Впрочем, если вставлять слишком быстро по чуть-чуть, то, по моему опыту, заканчиваются доступные соединения в первую очередь и все остальные получают ошибку вроде "too many concurrent queries", или же ошибки ZooKeeper, если совсем мелкие вставки в нижележащие таблицы слишком часто
-
потому-что жизнь зла =) это временные "внешние данные" мы можем котнролировать их размер, то "не до конца"; на самом деле я пробовал менять таблицы местами и как и ожидалось запрос заработал, потому-что размер хеш таблицы получается меньше, но когда понодобится сделать inner join 18M rows x 18M rows он упадет и единственный способ избежать падения - гарантировать что на сервере достаточно памяти чтобы работало без external aggregation. проблема в том что поидее external aggregation должен уменьшать использование памяти а получается наоборот
-
-
Используйте RBAC
https://altinity.com/blog/goodbye-xml-hello-sql-clickhouse-user-management-goes-proGoodbye XML, hello SQL! ClickHouse User Management Goes ProAccess control is one of the essential features of database management. ClickHouse now offers enterprise-class user management that integrates smoothly with role-based access control. Best of all, it's all SQL!
-
-
так а нужна таблица и ее данные?
таблица replicated ? -
в идеале нужна, таблица replicated
-
А как в RBAC для определённой таблицы оставить доступ только некоторым уже существующим, скажем 3, пользователям и сделать её недоступной для всех остальных пользователей?
-
отложите в сторону директорию с таблицей из data и tp.sql из metadata, КХ стартует создайте новую таблицу с такой же структурой, но без projections, и приатачте парты из старой, projections это поддиректории их можно поудалять
либо в ZK удалить мутацию в старой таблице -
понял, спасибо
-
Спасибо. Разобрался
-
Всем привет!
Подскажите, будет ли работать подобная конструкция:
select table1.column1, if(table2.column..) где table2 - это left join -
будет
для left join по умолчанию там будут default значения вместо null
--join_use_nulls arg Use NULLs for non-joined rows of outer JOINs for types that can be inside Nullable. If false, use default value of corresponding columns data type. -
Подскажите, что не так делаю с табличным движком MaterializedPostgreSQL.
Через движёк PostgreSQL всё отлично подключается, селекты выполняются. Через MaterializedPostgreSQL пишет Code: 1001, type: pqxx::usage_error, e.what() = Started new transaction while transaction was still active.
Хотя если указать не ту db, табличку, учётку, пароль то будет ругать именно на это, а не на активную транзакцию. Похожая ситуация описана тут https://githubmemory.com/repo/ClickHouse/ClickHouse/issues/30495 там советуют использовать database_engine, так как он более оттестированный, но сейчас возможности использовать его нет.
version 21.10.2.15 -
Добрый вечер. Не могу найти причину подобного поведения одного из серверов с Кликхаусом:
SELECT *
FROM db.table1
LIMIT (
SELECT 1
)
0 rows in set. Elapsed: 0.007 sec.
Received exception from server (version 21.9.2):
Code: 440. DB::Exception: Received from localhost:9000. DB::Exception: Illegal type Nullable(UInt8) of LIMIT expression, must be numeric type. (INVALID_LIMIT_EXPRESSION)
Пробовал менять параметры в system.settings, не смог избавиться от ошибки -
limit подерживает только константы, там не может быть select
-
Спасибо за ответ, но на других серверах это работает, но там версия 20.*
-
раньше подзапрос возращал UInt8 , теперь Nullable(UInt8)
можете конечно написать
SELECT *
FROM db.table1
LIMIT assumeNotNull(SELECT 1) -
Так тоже не хочет: Syntax error: failed at position 63 ('1'):
-
SELECT *
FROM api_log
LIMIT assumeNotNull((SELECT 1)) -
еще пару скобок надо
select * from table1 limit assumeNotNull((select 1)); -
это могут сломать в любой момент, зачем вам это?
-
Спасибо, работает
-
Не я делаю запросы, программистам нужен вычисляемый LIMIT, SELECT 1 - это чтобы показать саму ошибку
-
пока что самый простой вариант - это буферные таблицы. добавленные данные можно будет видеть сразу после добавления в отличие от китенхауса.
-
короче они абьюзают недокументированную возможность. Пусть делают отдельным запросом.
тестов на это нет. Может сломаться / неправильно работать. -
Спасибо огромное за помощь и информацию, передам👍
-
есть таблица, которая занимает 40% диска, на сервере 50% свободного места.
пытаюсь скопировать данные из старой схемы в новую с помощью INSERT SELECT, но не хватает места. если переносить по частям, то сначала юзается лишнее место, а потом оно освобождается и потом можно ещё скопировать часть.
можно как-то использовать INSERT SELECT, чтобы перенести все данные без разбивания на несколько запросов и ожидания, когда освободится место? я так понимаю, что в процессе создаются промежуточные парты, а потом они через несколько минут удаляются с диска. -
можно на новой таблице поставить setting old_part_lifetime=1;
https://clickhouse.com/docs/en/operations/settings/merge-tree-settings/#old-parts-lifetimeMergeTree tables settings | ClickHouse DocumentationMergeTree tables settings The values of merge_tree settings (for all MergeTree tables) can be viewed in the table system
-
спасибо
-
Всем привет, возник такой вопрос: использую связку из Kafka Engine table, Materialized View, ReplicatedMergeTree table, Distributed table. При записи в kafka абсолютно уникальных значений, хотя бы в одном из полей, например microtime, потери данных в Distributed table не наблюдается, как только я убираю это уникальное поле microtime и передаю абсолютное одинаковые значения во всех остальных, происходит потеря части данных, такое чувство что они схлопываются при вставке Materialized View. Сталкивался кто-то с подобным?
-
Но вот с VIEW так не работает. Буду признателен за помощь или направление куда копать
-
просто выполните 2 запроса, 1 на лимит, второй на селект с этим лимитом
-
Если вставляете 2 абсолютно идентичных набора строк в replicated, они дедуплицируются (если между этими вставками было <= 99 вставок)
-
Спасибо, сброс настройки deduplicate_blocks_in_dependent_materialized_views к нулю, может подойти в качестве решения?
-
Так он не просто так стоит на 1
Какую проблему решаете? Зачем вставляете абсолютно одинаковые строки? -
И обратите внимание, что там есть вторая настройка insert_deduplicate
-
Происходит потеря данных при записи, это единственная зацепка, которую обнаружил. Залогирую все входящее данные, спасибо.
-
Этот параметр не поможет
-
Можно писать виртуальные поля _partition, _offset
В реальности такой проблемы не будет скорее всего, потому что не будет повторов блоков -
Спасибо, буду разбираться со входящими данными
-
-
и что за ошибка?
-
1. да но не больше 3 🙂 , т.е. проблема в том что чем больше кол-во киперов ( и тоже самое для зукиперов ), тем медленнее оно работает, и больше сетевой трафик и ждем самого медленного
2. это ОК. -
-
Ясно. Спасибо за ценное знание про замедление. Я почему-то думал, что CH keeper призван решить эту проблему. Видимо, плохо [не долго] думал.
Придется по непонятным принципам выбрать три бокса для CH keeper ... -
выше уже ни раз обсуждали. буферные таблицы, киттенхаус, аккаммулирование на стороне приложения, асинхронная вставка в новых версиях
-
Спасибо, посмотрю эти решения.
-
Если кратко, то до нескольких тыщ в секунду нормально работают буферные таблицы и асинхронные вставки, дальше нужен либо kittenhouse, либо какой-то другой батчер.
-
Сорри, неправда моя, и к таблице и к вьюхе такой механизм работает. Всем спасибо
-
Пересмотрел видео про CH keeper https://www.youtube.com/watch?v=abhcCRW09Ac&t=13s
Пара вопросов.
1. В списке хитрых конфигураций zk (или CH keeper, это не важно) есть такие, в которых нода CH взаимодействует с двумя кластерами zk. Как выглядит конфиг CH в этм случае?
2. Не очень понял, есть ли возможность увеличения/уменьшения количества нод в кластере CH keeper. Александр упоминал elastic quorum configuration, которого нет, но который когда-нибудь появится, но это про добавление узлов без остановки кластера. А с остановкой можно добавлять/исключать узлы?Zookeeper Replacement Presentation at August SF Bay Area ClickHouse MeetupPresentation by Alexander Sapin, senior ClickHouse engineer at Yandex and lead on Zookeeper replacement. This project replaces Zookeeper consensus with an internal implementation. It is no longer necessary to run Zookeeper for ClickHouse clusters! Slides: https://www.slideshare.net/Altinity/clickhouse-keeper More information: ClickHouse - https://github.com/ClickHouse/ClickHouse ClickHouse Meetup - https://www.meetup.com/San-Francisco-... Altinity (Hosts) - https://altinity.com
-
Support multiple ZooKeeper clusters by fastio · Pull Request #17070 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the cha...
-
Наверное, вы правы, и такая возможность обязана присутствовать.
Ок, спасибо. - 02 November 2021 (129 messages)
-
Кафка еще как вариант.
-
Доброго времени суток. С первого раза не получилось, попробую еще раз. Имеется запрос со следующей структурой:
(group by, 3.4M rows) full outer join (inner join, 2.5M rows)
inner join джойнт подзапросы на 3.4М и 18М строк.
Если отключить two-level aggregation или external group by, то запрос отрабатывает используя 5Gb, а если оставить на усмотрение CH, то запрос умирает сожрав 27Gb памяти. Если поменять местами таблицы в inner join то запрос работаeт (потому-что размер хеш таблицы получается меньше), но когда понодобится сделать inner join 18M rows x 18M rows он упадет и единственный способ избежать падения - гарантировать что на сервере достаточно памяти чтобы работало без external aggregation.
Это выглядит как баг, но не понятно кто его "триггерит". Складывается ощущение что сначала "256 hashtables per thread" сбрасываются на диск, а потом все вместе загружаются, причем в памяти держатся и запакованные и заспакованные данные. По идее external aggregation должен уменьшать использование памяти, а получается наоборот -
Коллеги, доброе утро. Не пойму, как лучше хранить определенные логи.
В изначальном виде там несколько колонок + две колонки с массивами(от 1-го до 10000 элементов примерно, в среднем 1000) и данных около 30000 строк в день.
Поиск будет происходить с фильтрацией и по по обычным полям и по значению в массиве.
Что лучше, развернуть массивы в кучу строк или оставить как массивы?
Есть ли смысл добавлять массив в primary key? не понимаю, как это вообще может помочь при поиске -
я бы развернул такое в обычную таблицу
-
потому что строк в целом не много будет и 100% быстрый поиск?
-
Хочу считать через движок file Select * from file('file', 'JSONEachRow','line String') почему то ругается expected EOF перед второй строкой. Хотя там стандартный \n. В чем может быть проблема? движок file вообще работает с JSONEachRow?
-
-
Спасибо, про сжатие хороший аргумент
-
Приветствую, сделали копию таблицы и на копию запустили OPTIMIZE TABLE table_copy DEDUPLICATE. Как можно посмотреть те строки которые удалились ? Вес таблицы 10 гб
-
-
Задача – посчитать возраст
SELECT
toDateTime64(now(), 0) AS today,
toDateTime64('1951-01-02', 0) AS birth_date,
today - birth_date AS age
- -
upd. разобрался
dateDiff помог:
SELECT
toDateTime64(now(), 0) AS today,
toDateTime64('1951-01-02’, 0) AS birth_date,
dateDiff('year', birth_date, today) AS age -
SELECT fromUnixTimestamp64Milli((
SELECT toUnixTimestamp64Milli(toDateTime64(now(), 0))
) - (
SELECT toUnixTimestamp64Milli(toDateTime64('1993-01-31', 0))
))
я уже думал как-то так предложить, но твой вариант в апдейте получше будет) -
В оригинальной таблице сделать запрос group by having count()>1
-
так оно будет выдавать неправильный результат
SELECT dateDiff('year', toDate('2020-10-24'), toDate('2021-09-22'))
выдаёт 1, но по логике высчитывания возраста должно отдавать 0
вот так результат будет верный
SELECT
toDate('2020-11-02') as bd,
if(
addYears(bd, dateDiff('year', bd, today()) as diff) > today(),
diff - 1,
diff
) as age -
Не очень понял, сколько колонок у вас получается. Если 20000, то это довольно проблематичный дизайн.
В отдельные колонки имеет смысл выделять то, по чему часто будут искать. Остальное лучше хранить вместе. Наверное, map - подходящий вариант. Если только это не syntax shugar и map не разворачивается в колонки, но вроде такого нет. -
Колонок штук 10, плюс 2 колонки массива которые вот решили развернуть
-
У меня основная проблема с датами < 1970го года. Оказалось что не все мои кластера умеют с этой датой рабоать )
-
Если 2 колонки массива развернутся в 20000, то это станет проблемой.
-
спасибо
переделал ) -
В 2000 строк, не колонок
-
О как интересно) а почему не понял? Старые версии кликхауса может?
-
-
избитая тема, все плюсы и минусы разных подходов давно описаны здесь:
https://kb.altinity.com/altinity-kb-schema-design/best-schema-for-storing-many-metrics-registered-from-the-single-source/ -
Понимаю что избитая, тут больше перестраховываюсь.
Спасибо за ссылку -
-
в перовм квартале следующего года появится новый тип поля - JSON, под капотом он будет сам создавать отсутствующие колонки для оптимизации хранения-чтения, всё остальное - временный вариант в ожидании JSON типа.
-
Оо, шикарно вообще
-
поиск по чату "alter enum" выдаст то что вам надо
-
Можно, но мб могут быть небольшие проблемы если ENUM в ORDER BY
-
если здесь не ответят можно попробовать тагнуть лично Алексея или написать на гитхаб в issues
-
старая версия кх?
-
Спасибо, попробую
-
Спасибо
-
версия 21.3.12.2
-
наверно стоит обновиться до 21.3.18.4 перед заведением бага
-
#вакансия #москва #офис #гибрид #удаленка #ClickHouse
Вакансия: DBA / ClickHouse разработчик
Город: Москва (м. Кутузовская)
Компания: Sber
Заработная плата: от 150 000 - 350 000 net
О нас:
Наша команда сейчас находится в поиске Clickhouse разработчика+DBA для создания аналитической платформы для анализа клиентского поведения в мобильном и веб-приложении СберБанк Онлайн. Платформа обеспечивает онлайн обработку данных, построение на лету базовых продуктовых отчетов, мониторинга аномалий, а также детальной BI-аналитики выделенных сегментов. Пользователи – внутренние клиенты Банка (владельцы продуктов, аналитики, UX-исследователи).
Техническая сторона:
• 128 серверов в промышленном кластере;
• 6 серверов в тестовом;
• общий объем данных – более 1 ПБ;
• нагрузка - свыше 10 млрд новых записей в сутки (в пике 150 тыс записей в секунду).
Задачи:
• R&D новых решений - разработка новых представлений, таблиц и запросов для новых бизнес-отчетов (воронки, ретеншн, сегментирование);
• интеграция со смежными системами для обогащения данных;
• оптимизация производительности, обеспечение высокой доступности прикладных сервисов;
• настройка репликации данных;
• аудит и рефакторинг существующих схем;
• текущее администрирование существующего кластера;
• мониторинг работы БД на базе Zabbix и/или Prometheus .
Требования:
• Опыт работы с Clickhouse (разработка или администрирование);
• Linux/Unix, опыт работы с высоконагруженными системами, резервирование;
• базовые знания концепций распределенных систем и стеков технологий больших данных - как Hadoop, Spark, Kafka;
• желательно знание хотя бы одного языка программирования (Python, Java);
• желательно знакомство с системами продуктовой аналитики – GA, Яндекс метрика, Amplitude.
Условия:
• ДМС, страхование от несчастных случаев и тяжелых заболеваний;
• прозрачная система бонусов и премий, достойная зарплата — размер обсудим на собеседовании;
• льготные условия кредитования;
• доступ к различным курсам обучения по развитию как hard, так и soft skill'ов;
• бесплатный спортзал и парковка.
Контакт для связи: @ks_aleshina 😉 -
Всем привет. Рестартнулся весь кластер из-за перебоя с электричеством. Теперь при запуске какждая нода пишет:
<Error> Application: DB::Exception: Cannot create table from metadata file /var/lib/clickhouse/metadata/l0_s1//hits.sql, error: DB::Exception: The local set of parts of table l0_s1.hits doesn't look like the set of parts in ZooKeeper: 9.85 billion rows of 9.86 billion total rows in filesystem are suspicious. There are 170 unexpected parts with 9854837928 rows (156 of them is not just-written with 9854837928 rows), 0 unexpectedly merged parts with 0 rows, 0 missing obsolete parts (with 0 blocks), 1 missing parts (with 4 blocks)., stack trace: -
-
Переход с MergeTree на ReplacingMergeTree без тупого перелива данных возможен ?
-
-
ALTER TABLE ATTACH PARTITION
-
Много строчек и вставок у вас слишком потерялось в zookeeper, аж 10 лярдв и 170 партов
-
Просто создать таблицу с такой же структурой и подключить туда партиции ? Изменив только engine ?
-
Да
-
В данных лежащих в партициях, со временем уберутся дубликаты ?
-
На это не стоит сильно рассчитывать, дубликаты же будут убираться eventually
-
-
> ClickHouse client version 19.3.7.
Сильно старая у вас версия.
<Error> Application: DB::Exception: Cannot create table from metadata file /var/lib/clickhouse/metadata/l0_s1//hits.sql, error:
Кх у вас не стартует же, как я думаю -
Окей, а по вашему опыту, в новых данных через сколько убирается примерно дубликаты ?
-
Не стоит рассчитывать, что дубликатов не будет.
Пишите запрос, как будто они есть
https://kb.altinity.com/engines/mergetree-table-engine-family/replacingmergetree/
https://kb.altinity.com/engines/mergetree-table-engine-family/replacingmergetree/altinity-kb-replacingmergetree-does-not-collapse-duplicates/ -
Добрый день кто может подсказать куда посмотреть
ALTER TABLE FREEZE не создает файлы в shadow как узнать почему?
Таблица в БД есть, доступ к ней есть, данные в ней тоже, операция завершается успешно, но файлов нет -
ну да, а как создать таблицу тогда?
-
ALTER TABLE database.table FREEZE PARTITION 'partition_number'
вы так делаете?
Успешно это когда вот такое сообщение в логе
Freezing part 202110_1213722_1213757_3 -
не хочу всю таблицу сразу, без указания бд, указывал её при подключении ) пол года назад такое работало (иду по своей же инструкции) попробую с указанием схемы
-
Также было бы удобно диапазон партиций указывать временной например с 2015 года до 2020. И фризить их.
-
ALTER TABLE schema.table
FREEZE PARTITION '197001'
Query id: 61035509-6991-4b2a-9514-b87a9d748e51
Ok.
0 rows in set. Elapsed: 0.228 sec. -
-
-
-
-
Добрый вечер. Пробую использовать clickhouse-bulk , но что бы я не передавал в адресной строке, даже если просто вписать адрес, у меня постоянно {"message":"Method Not Allowed"}
как правильно с ним работать? подскажите, пожалуйста. Не нашел документации. -
кто поменял конфиг, и теперь replica макрос отличается?
-
не на том диске ищите?
-
а вы точно на 21.8 обновились?
может на 20.8 ? -
точно )
-
show create dictionary regions_mapping
-
-
cat regions_mapping.sql
-
Полагаю, в clickhouse-bulk данные должны отправляться с помощью POST. Браузер же будет по умолчанию в Вашем случае использовать GET
-
Received exception from server (version 21.8.10):
Code: 390. DB::Exception: Received from localhost:9000. DB::Exception: Table regions_mapping doesn't exist. -
нет такого
-
-
cat regions_mapping.xml
-
-
прям сюда?
-
-
<dictionaries> <comment>Отображение из id-шников геобазы MaxMind в нагенери - 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.
-
Ух точно, забыл, что новый добавляли, спсибо)
-
проверил, конфиг /etc/clickhouse-server/config.xml старый с которым кликхаус стартует
Правда у кластера зукипера одна нода не поднялась, может из-за нее проблемы? -
-
Вы правы! Спасибо! Очевидная причина, а я думал я что то не так настроил...
-
это реально весь словарь? или вы подчистили куски?
я бы попробовал удалить коментарии, не представляю что могло сломаться в таком простом случае -
1001 1
1002 2
1003 3
1004 4
1005 5
1006 6
1007 7
1009 8
1011 9
1012 10 -
по идее вот словарь
-
-
-
я бы попробовал удалить коментарии
-
-
Почему ALTER TABLE 'table_name' UNFREEZE WITH NAME 'backup_name' требует имя? если при создании бекапа мы его не указывали?
-
есть еще такой вопрос, есть ли возможность чистить системные таблицы, они разъелись в 40 гб в сумме или только смириться?
-
-
-
-
Наверное это время сервера, а не ваше
-
так стоит в настройках use_server_time_zone = false
-
не помогло
-
у вас много словарей?
-
-
-
-
-
короче
mkdir /etc/clickhouse-server/dict/
mv /etc/clickhouse-server/regions_mapping_dictionary.xml /etc/clickhouse-server/dict/
в конфиге КХ, не знаю где вы их держите
<?xml version="1.0"?>
<yandex>
<dictionaries_config>dict/*.xml</dictionaries_config> -
-
ааа, писатель jdbc драйвера жжот, все сломал видимо
-
как починить то ? =(
-
откатывать драйвер
-
блин, у меня было 2 хмл, сразными именами и почти одинаковым содержимым, после того как я одну удалил всё заработало
-
-
👍
-
бред какой-то
-
java показывает в таймзоне винды
-
так в винде то корректная таймзона
-
А в кликхаус клиенте все нормально ?
-
не проверял
-
а кто может другую версию драйвера скинуть где корректно работает ?
-
вообще это нормально и так было всегда, пока jdbc не сломали.
Время в КХ это число секунд после 1970 года. У колонки может доп. атрибут TZ.
Т.е. на самом деле там у вас одно и тоже число в обеих колонках.
КХ-клиент! когда показывает на экране число секунд после 1970 в виде строки, использует атрибут TZ и строка получается с учетом TZ
JDBC драйвер просто передавал это число секунд после 1970 года в java-у, java рендрерит в строку с учетом таймзоны локального компа (TZ колонки ни на что не влияла). -
короче свиснул у коллеги старый файл настроек залил и все норм вроде стало
-
-
суть в том, что время то +2 часа от того что он показывает
-
-
select timezone(), toString(now()), now()
-
Я видел твои сообщения на гитхабе. Если преобразовать в строку показывает корректно, текущий таймзон тоже
-
select timezone(), toString(now()), now()
-
Всем привет,
Я агрегирую данные в materialized view c движком SummingMergeTree. После агрегации сырые данные в исходной таблице не нужны и я их удаляю по TTL. Можно ли как то бэкапить MV с таким движком, и, самое главное, восстанавливать? В гугле уже был, но если направите по нужному адресу, будет прекрасно. 🙂 -
SummingMergeTree это обычная таблица, просто у нее необычное имя если она в MV, поэтому можно и бекапить и восстанавливать.
Имя зависит от движка базы данных. show create database ....вашабаза....
Еще очень удобно использовать MV с синтаксисом TO. тогда все еще проще. -
Сорри, я немного не до конца объяснил картину - из исходной таблицы у меня агрегируются данные в несколько MV с интервалами, от 5 минут и до 1 дня. Бэкапить я предполагаю MV которая 5 минут и хотелось бы чтобы при восстановлении остальные MV агрегировали бы эти данные. Проблема, на которую я не могу найти ответ в гугле - т.к. движок у MV SummingMergeTree, то и восстанавливатся она будет с этим же движком (в этом я не уверен, но вроде звучит логично). Поэтому в голове у меня зреет велосипед - восстановить эту таблицу, сделать select * и insert в исходную с движком MergeTree, откуда уже остальные MV сделают агрегацию. Звучит немножко диковато, поэтому хочется верить что существует более простой путь )
-
Доброй ночи! Словил проблему
Coordination::Exception: All connection tries failed while connecting to ZooKeeper. I/O error: 33
Версия клика 21.9, до сегодняшнего ЧП все было ок.
Одна из zk-нод определяется как лидер
(использовал команду echo mntr|nc localhost 2181)
Сервер не подключается, логи выставлены в режим trace и ничего полезного от чего бы я мог оттолкнуться нету.
Стетевое соединение со стороны клика до zk проверил, все в норме.
Поиск по чатику не дал результатов. Куда еще могу посмотреть? -
а с сервера КХ echo mntr|nc ipzk 2181
-
переделайте ваши матвью на каскад, что бы остальные строились на основе первой SummingMergeTree
- 03 November 2021 (183 messages)
-
подскажите, а эта хрень как лечится?
{} <Error> l0_s2.hits (ReplicatedMergeTreeRestartingThread): Couldn't start replication: Replica /clickhouse/tables/l0_s2/hits/replicas/replica_1 appears to be already active. If you're sure it's not, try again in a minute or remove znode /clickhouse/tables/l0_s2/hits/replicas/replica_1/is_active manually, DB::Exception: Replica /clickhouse/tables/l0_s2/hits/replicas/replica_1 appears to be already active. If you're sure it's not, try again in a minute or remove znode /clickhouse/tables/l0_s2/hits/replicas/replica_1/is_active manually, stack trace: -
Bouncing back stronger when it comes to finance I must say that it really makes me happy all thanks to you actually I made about $35,500 with an investment of $4000. And I am here to recommend you all to @DennisonAlbertfx 👇👇👇👇👇https://t.me/joinchat/xVMFbnJ0HfxiODJk
-
Проверил через dns/ip с сервера clickhouse: отвечает с тем же результатом, как если выполнять запросы прям на серверах ZK. На всякий случай отключил внутренний dns-кэш клика, но это ничего не дало. Вы наталкнули меня на мысль помониторить сетевой трафик, возможно там найду проблему. Если будут какие-то еще идеи, то я буду рад их услышать. Спасибо!
-
всем привет. Очень хочется ходить в GSheet из CH напрямую. Всё, чего удалось добиться, это:
CREATE TABLE url_engine_table (
col_String String,
col_Int Int16,
Col_Date String,
Col_DateTime String,
Col_Array Array(String)
) ENGINE=URL(
'https://docs.google.com/spreadsheets/d/{KEY}/gviz/tq?tqx=out:csv&sheet={SHEET_ID}', CSVWithNames)
всё работает, но для такого Sheet должен быть расшарен доступ по ссылке глобально.
Подскажите:
Можно ли как-то ходить CH в GSheet с авторизацией? Вот в Redash например есть системный пользователь, на которого шарится доступ в GSheet. -
>After you have an API key, your application can append the query parameter key=yourAPIKey to all request URLs.
Так не работает?
https://developers.google.com/sheets/api/guides/authorizing -
Подскажите пожалуйста, если я вставляю даные в Buffer на таблицу MergerTree - то в какой момент данные мерджатся на диске? в тот момент когда забираются из буфера? или через какое то время позже?
-
-
Input and Output Formats | ClickHouse Documentation
Formats for Input and Output Data ClickHouse can accept and return data in various formats. A format supported for input
-
Вы предлагаете здесь поискать или какой-то конкретный формат?
-
Здравствуйте, объясните пожалуйста, чем отличается создание матвью с ключевым словом TO и без него?
-
там много форматов разделено двоеточиями. если ни один из них на Ваш не похож - то скорее всего нужен формат Template или CSV
-
с TO более гибко работать можно
-
А можно подробнее:)
-
Без TO — создастся скрытая .inner табличка, в которой будут лежать данные.
С TO можна создать целевую таблицу любого движка и с помощью MV пересылать данные. Можно в любое время удалить или переделать MV, не задевая никак целевую таблицу -
Спасибо
-
если размер данных небольшой - то проще переформатировать
-
гига 3 сырого текста )
-
-
а использование format_csv_delimiter = ‘;’ не помогает?
-
попробую
спасибо -
Добрый день!
Подскажите пожалуйста может кто-то уже сталкивался с такой проблемой.
В Zeppelin при записи в КХ и ds.show() выдает ошибку
paymentSubsCurrent.write
.format("jdbc")
.option("driver","ru.yandex.clickhouse.ClickHouseDriver")
.option("url","jdbc:clickhouse://X.X.X.X:PORT/test")
.option("dbtable","test")
.mode("append")
.save()
java.lang.NoClassDefFoundError: Could not initialize class org.apache.spark.rdd.RDDOperationScope$
zeppelin 0.10.0
spark 3.2.0
scala 2.12.15 -
а весь стектрейс? может там какой-то вспомогательной библиотеки не хватает, например jackson или apache http
-
-
-
Вcем привет, а не кто не стыкался, как можно подключится к clickhouse из под AWS Glue
Как сделать коннекшин или сделать odbc/jdbc? -
Другими словами - как работает Compaction в MergeTree когда есть буфер? и можно ли этим как-то управлять?
-
ребята привет. подскажите, возможно функцию histogram использовать как то с группировкой по полю? типо наподобие такого ( не работает )
SELECT histogram(10)(length), user FROM stathist.messages
GROUP BY user -
MergeTree таблица и мержи не в курсе про буфер.
Вы делаете 100 инсертов по одной строке в течении 1й секунды в MergeTree. В КХ образуется 100 партов. Скорее всего КХ помержит 4 раза по 25 партов в 4 и еще один раз 4 парта в один парт, итого 5 мержей.
Если поставить буфер который копит и сбрасывает раз в 2 секунды и делать инсерты в него, то мержей не будет, потому что все 100 записей будут записаны в MergeTree одним инсертом.
Если у буфера 16 слоев, то конечно будет 16 инсертов, если слой один, то один инсерт, т.е. у буфера задается сколько там внутри под-буферов, для увеличения скорости параллельных вставок -
Всем привет!
Подскажите пожалуйста у меня Докер контейнер не подымается и в логах докера есть только такое
Processing configuration file '/etc/clickhouse-server/config.xml'.
Merging configuration file '/etc/clickhouse-server/config.d/config.xml'.
Merging configuration file '/etc/clickhouse-server/config.d/docker_related_config.xml'.
Merging configuration file '/etc/clickhouse-server/config.d/users.xml'.
Include not found: clickhouse_compression
пол года все работало и тут такое -
в смысле результат неправильный?
SELECT g, histogram(5)(number + 1) FROM ( SELECT number%3 g, number FROM system.numbers LIMIT 200 ) group by g;
┌─g─┬─histogram(5)(plus(number, 1))────────────────────────────────────────────────────────────────┐
│ 0 │ [(1,47.5,16.5),(47.5,87.25,13.125),(87.25,123.25,11),(123.25,162.25,14),(162.25,199,12.375)] │
│ 1 │ [(2,48.5,16.5),(48.5,88.25,13.125),(88.25,124.25,11),(124.25,163.25,14),(163.25,200,12.375)] │
│ 2 │ [(3,49.5,16.5),(49.5,89.25,13.125),(89.25,125.25,11),(125.25,163.5,13.875),(163.5,198,11.5)] │
└───┴──────────────────────────────────────────────────────────────────────────────────────────────┘ -
пробросьте через volume куда нибудь себе
/var/log/clickhouse-server/
посмотрите в /var/log/clickhouse-server/clickhouse-server.err.log -
А есть способ как-то автоматически настроить перенаправление данных из буфера в таблицу на диск и удаление их из буфера?
-
Добрый день, подскажите по поводу шардирования, с свежих версих КХ: каждый шард собирает часть данных и джойнит их или джоин происходит на ноде с которой произашел запрос? (таблицу, что джойниться нельзя разместить на каждой ноде, раньше это было нужно, чтобы как раз не таскать данные с ноды на ноду) То есть будет ли две ноды по 20Гб равны одной на 40Гб, при условии, что джойны довольно серьезные иногда и требуют минимум 30Гб
(или ссылку где почитать) -
вы доку вообще читали? буфер только так и работает. Инсерты надо в буфер делать
по другому буфер вообще не умееет -
Если из Buffer (больше 100 строк) всё одним инсертом вставляется большим в MergeTree, то Codec Delta(1) будет сразу применяться? Расчет будет до записи на диск?
-
Да, НО вам вообще не надо про это знать. Никакой разницы нет для Delta и Codec есть буфер или нет.
-
Ну разница есть и на мой взгляд принципиальная: или сначала на диск пишет данные без кодека и потом перезаписывает с кодеком или сразу пишет с кодеком.
-
дада, будет разница, .00001%
вы какбы на спичках, даже на обрезках спичек пытаетесь экономить -
Всем привет!
Вопрос: в кликхауз сохраняются записи, характеризующиеся следующим набором полей: row_id, amount, status
status имеет идентификаторы 1, 30, 1000
Для одного row_id в таблице может быть не более трех записей с последовательно меняющимися статусами 1 , 30, 1000, т.е. в группировке по row_id получаю, наапример, sum(status) = 1031
Как контролировать то, что не запишется еще одна 1000? т.е. нужно защититься от sum(status) = 2031
Есть возможность построить такой индекс? -
без буфера, проблема для CPU и диска -- это само кол-во инсертов
-
неактивные парты хранятся 8 минут, они жрут кучу места и файлов
-
😂
Есть какие то настройки для этого если Вы можете их рекомендовать? -
вставлять редко и по многу.
-
никак
-
-
Я понял о чем вы
-
я так и знал 😞
-
Просто не очень быстро понимал
-
никак. В КХ нету никаких таких констрейнтов чтобы не замедлять вставку и не делать зависимости между шардами
-
Шарды в КХ не знают про друг друга вообще ничего. В общем случае ваши записи могут оказаться на разных серверах
-
как напишете запрос, может сначала сделать на шардах джойн если у вас данные разложены правильно. Может со всех шардов собрать таблицу для джойна
https://clickhouse.com/docs/ru/sql-reference/operators/in/#select-distributed-subqueries -
djoin
djoin. GitHub Gist: instantly share code, notes, and snippets.
-
с вложенным запросом , действительно работает, спасибо !
-
картинка странная. у hdd порядка 100 rps. конечно с 8 дисками можно добиться в 8 раз больше - ок
у ssd - порядка 50 тыщ rps. даже если по одному числу менять за раз - нужно прочитать сектор, поменять его и записать назад. это всё равно 25 тыщ rps получится
линейная скорость у sata ssd - 500 МБ/с, у серверной памяти - порядка 100 ГБ/с -
windows 2003 как бы намекает
-
Всем привет, а кто контрибьютил в гошный драйвер https://github.com/mailru/go-clickhouse как долго маентейнеры просматривают pull request?GitHub - mailru/go-clickhouse: Golang SQL database driver for Yandex ClickHouse
Golang SQL database driver for Yandex ClickHouse. Contribute to mailru/go-clickhouse development by creating an account on GitHub.
-
получается что Clickhouse в любом случае с буфером или без - сначала пишет на диск - а фоновом режиме применяет compaction?
-
все равно не понятно при чем тут спички. без сжатия на диск нужно записать 100 гигабайт, со сжатием - 2 гигабайта. принципиальная же разница даже при линейной записи.
-
Вы же не за раз записываете 100гб. А если за раз, то у вас хранилище будет в петабайтах, какая разница?
-
всё что идёт на диск - выгодней сжимать
-
"Кто котрибьютил" - там на гитхабе есть кнопка "contributors" для этого.
"Как долго рассматривают" - в том же гитхабе есть эта инфа в коммитах. Надо взять datetime мерджа и вычесть из нее datetime коммита.
Можно не благодарить, но если очень хочется, то благодарности принимаю переводами по номеру телефона :) -
buffer в памяти
codec не настолько влияет на перформанс, проблема в лишних мержах и лишних файлах. -
если данные заливаются большими пачками - либо реально большими пачками накапливаются в буфере и проблем с мерджами нет, то как можно оптимизировать Кодеки? нужно дописывать код кликхауса для этого?
Есть ли какие-то условия по мерджам для того чтобы кодеки начали применяться? -
100 Гигабайт у меня в оперативной памяти спокойно хранится - и не понятно зачем их на диск писать перед применением кодеков и что можно сделать чтобы не писать - вот в этом вопрос
-
👍
-
эм, вы что-то путаете, кодеки применятся перед записью на диск. А мержи в бэкграунде просто будут пытаться объеденить вставленные куски в более крупные
-
спасибо - вот в этом как раз и был вопрос - я хотел узнать когда применяются кодеки
-
боже, что вы несете.
Codec-и надо использовать и с буфером и без буфера, и с маленькими вставками и с большими. Они просто не имеют вообще никакого отношения к вопросу -
Кодек применяется при создании парта
-
Пишем одиночный инсерт, кодек применяется
-
👍
-
Пишем еще один инсерт, кодек применяется
-
Мерж мержит 2 инсерта (парта) в один, кодек снова применяется
-
спасибо огромное - всё встает на свои места
-
вы понимаете что если питание выдернуть, то весь буфер пропадет?
-
понимаю - это уже просто отдельный вопрос - есть ли для этого решения?
-
у меня ETL собирает большие пачки, если один инстанс ETL не доставил до КХ, другой инстанс ETL доставит
ну кафка , для бедных -
Можно в кафку всё писать и потом уже в клик
-
Если у меня допустим 2 сервера кликхаус независимо пишут одинаковые данные от поставщика данных. Пачки могут быть разного размера(из-за разного пинга до поставщика данных) но данные точно полностью одинаковые и вставляются в Buffer. я могу повесить слушателя *KEEPER на таблицу Mergetree(чтобы восстановить один из серверов в случае потери буфера Buffer)? такое решение существует и применимо? я смогу для реализации такой настройки нанять специалиста?
-
Добрый вечер, я сейчас очень туплю, но правильно ли я понимаю, что в случае, когда имеется у меня запрос вида c представлениями:
select a,b,c from view_1 where a in (select a in view_2 where d='some value' and dt>today()-30 group by a order by a) group by a,c
То лучше всего будет сделать таблицу AggregatingMergeTree для таблиц во view_2 или временную таблицу на движке Memory(), куда скидывать результат подзапроса, и ссылаться в результате на времянку? Я предполагаю это как варианты обхода проблемы с проседанием по производительности, потому что по трейсингу логов сейчас видно, как для каждой таблицы внутри view_1 подзапрос каждый раз выполняется заново, тем самым собирая для каждой таблицы во view_2 результат... -
Если надо много запросов в короткий промежуток времени, то можно наверное и временную таблицу сдеелать, а если постоянно делаете запросы то почему не Materialized VIEW?
-
Мне об этом и подумалось, кстати
-
-
А запрос работает если создать простой View?
-
Добрый вечер, расскажите, пожалуйста, про иерархию конфигурационных параметров.
Например, max_concurrent_queries я не могу задать на сессию и не могу прописать в профиле пользователя, он может быть только глобальным.
Это логично, но как узнать, какие еще параметры обладают таким свойством? Документация эту тайну мне не выдала (возможно, не был достаточно настойчив).
Можно ли посмотреть куда-нибудь еще? -
никак, просто знать все параметры.
таким же ствойством обладают все pool параметры (они вообще на сессию не влияют), и нужен рестарт чтобы применились -
Добрый вечер,
Подскажите, пожалуйста, как побороть Memory limit (for query) exceeded: would use 9.32 GiB (attempt to allocate chunk of 0 bytes), maximum: 9.31 GiB: While executing AggregatingTransform. (MEMORY_LIMIT_EXCEEDED)
Если указывать set max_memory_usage с запасом, то работает, но хочеться системно подойти к решению -
-
в общем случае никак. 10ГБ просто мало.
т.е. можно делать группировки и сортировки через диск, но это мало поможет с 10ГБ и миллиардами строк и десятками жирных полей в запросе -
можно как-то изменить лимит?
на машине 160 оперативки -
конечно, просто задайте в профиле пользователя (default для всех)
$ cat /etc/clickhouse-server/users.d/memory_usage.xml
<?xml version="1.0" ?>
<yandex>
<profiles>
<default>
<max_bytes_before_external_group_by>25291027968</max_bytes_before_external_group_by>
<max_memory_usage>50582055936</max_memory_usage>
</default>
</profiles>
</yandex>
например для 160ГБ, я бы поставил max_memory_usage = 120ГБ, max_bytes_before_external_group_by=70ГБ -
спасибо!
-
А почему в max_memory_usage вы не поставили 160ГБ ?
-
ReplacingMT
-
иначе рано или поздно к КХ придет OOM
-
Коллеги есть ли смысл юзать клик как бд для хранения пользовательских данных к которым они сами и ходят. То есть как обычную бд для веб сервиса?
-
Предполагается табличка размером в 100 -200 миллионов и пользовательские селектв где то 20-100 в секунду
-
С выборкой по дате и пользователю
-
так это на запрос лимит. Если один запрос все же отъест 160ГБ, то все остальные, даже маленькие попадают.
-
не должен, потому что там есть total limit = 0.9*160
-
а давно такое появилось? мы периодически ловили оом при неудачных настройках лимитов
-
конечно. КХ это аналитическая БД, 100 запросов с сек, это не ее профиль совсем.
-
около года назад, там не все учитывалось сначала, типа мержи не входили, или всякая лабуда, типа размер памяти расходованной на инсерты неправильный, постепенно улучшается, в общем-то сейчас более менее.
-
можно, сам так и использую на одной из задач, потому что нет экспертизы в касандре, а тут уже известная лошадка
-
а ну тогда понятно, мы к сожалению пока ретрограды и сидим на 19.*
-
на новых версиях говорят есть куча оптимизаций, которые сильно ускоряют запросы. так что не плохо бы и обновиться :)
-
там есть другой параметр <max_memory_usage_for_all_queries>50582055936</max_memory_usage_for_all_queries>
поставьте его 0.8 * ОЗУ -
конечно неплохо, мы даже план написали, осталось реализовать... очень аккуратно)
-
да ладно, я сам недавно обновился с 18.14 на одной задаче, только ухудшения заметил 🙂
-
просто запросы были нормально написаны, а ускорили только кривые запросы :)
-
и теперь при спонтанном ребуте железки, у меня КХ гарантировано не поднимается из-за кучи битых Log таблиц, у которых размеры файлов = 0 из-за ребута
-
>18.14
это просто жесть, я тут до сих пор под впечатлением, что люди сидят на 19.*, а тут 18.14... -
-
-
да фигня есть люди с 1.0... (начало 2017 года)
-
мы только недавно обновили виртуалку c 18.14 на которой стоял CH последние N лет и копил телеметрию с софта
-
:)) просто забыли все что такое есть
-
ну если конечно никак не трогать, то ок, но если там что-то надо допиливать, то это просто неимоверное ограничение на каждом шагу.
-
бывает нужно залезть на какой-нибудь сервак и посмотреть какие-нибудь данные, а там тупо ilike не работает и это начинает напрягать, когда простейшие запросы нужно как-то костылить на старых серверах. в итоге везде обновился и забыл про всё как про страшный сон.
-
а тут же оно как, если в инфрастуруктуре ничего новее нет, то ты и не пользуешь ilike, а автоматом оборачиваешь все что нужно в lowerUTF8() =)
-
-
тоже думал об этом, но не понятно куда её пихать.
вот например недавно я задокументировал JSON_EXISTS, пихать номер версии в туже строку, что и название функции наверное не вариант, потому что она тогда попадёт в левое меню и сделает его не юзабельным. писать в отдельной строчке - документация сильно распухнет в размерах. писать как "примечание", так вообще удвоится. к тому же желательно придерживаться общей стилистики, а а версия нигде не указывается. ещё бывают бекпорты, т.е. нужно будет указывать по несколько версий. в общем те кто сидят на последних версиях - им норм, остальные страдают :)
https://clickhouse.com/docs/ru/sql-reference/functions/json-functions/#json-existsJSON | Документация ClickHouseФункции для работы с JSON В Яндекс.Метрике пользователями передаётся JSON в качестве параметров визитов. Для работы с та
-
да просто мелким шрифтом под именем функции хотябы)
в маркдауне можно так <sup><sub>@since 21.10</sub></sup> -
-
мне больше нравится такой вариант. там справа от названия функции обычно полно места, но для этого надо чтобы кто-то изменил разметку для генерации документации
-
а вы знаете про такую штуку: https://www.jetbrains.com/datagrip/ ? с CH совместимаDataGrip: The Cross-Platform IDE for Databases & SQL by JetBrains
A powerful IDE from JetBrains for SQL on macOS, Windows, and Linux.
-
совместима, если это вопрос)
-
да, но там недоработан функционал
-
-
мы то про неё знаем, а вот она например про JSON_EXISTS ничего не знает
-
вообще это нормальная практика для всех других бд и яп и всего чего угодно кроме кликхауса так что наверно скоро и это сюда приедет.
-
Вакансия - Волгоград / full time, remote
Должность Dev RTB
Компания I-advert.biz
Список задач
🔸Написание bidder, автоматической аналитики на основе данных
🔸Техническая поддержка и сопровождение RTB-интеграций с партнерами
🔸Технический контроль и мониторинг RTB трафика
О нас
Наша рекламная сеть регистрирует и сохраняет десятки тысяч запросов от пользователей в минуту. Это возможно только благодаря команде умных, талантливых и инициативных людей. IT команда активно растет вместе с сервисом, и мы ищем настоящего профессиона, который готов вместе с нами реализовать новые и амбициозные планы, которые позволят сохранить позиции одного из лучший сервисов для наших клиентов.
Требования
🔸Основной стек: clickhouse / golang
🔸python + php + mysql желательны
🔸Крайне необходимо: опыт в сетке directadvert/mgid/adskeeper/adlabs/kadam
ЗП от 200к
Контакт @nefertiti_ru -
Ещё как вариант под разные версию генерить свою доку
-
ну это вообще фантастика :)
-
Раньше был выбор версии. Но дока на обновлялась вовремя ))
-
-
у КХ это просто, если у вас не последняя версия КХ, это ваши проблемы
-
хотя бы доку по старым версиям могли бы выложить. её и так вебархивом можно найти наверно
-
да она была, там не смогли настроить переключалку версий (чисто веб-UI проблема) и поиск чтобы работал внутри версии.
-
бекендеры, что с них возьмёшь 🤦♀️
-
да там хуже, там менеджер рулил этим делом емнип.
в общем-то эта проблема никого не волнует, я вообще не понимаю что за проблема, вы что всю переписку на гитхабе не читаете что-ли? Там всего несколько сотен писем в день. -
Ну вот по факту, вы пользуетесь инструментом и не знаете историю коммитов, как так то
-
в смысле не знаете? у меня в голове вся история фич и багов
-
Соболезную
-
в моей конюшне это выглядит так:
шелдон купер 1-го уровня: следит за стандартами С++
2-го уровня: читает все пропозалы к стандарту С++
3-го уровня: читает обсуждения всех пропозалов на реддит
4-го уровня: участвует в этих дискуссиях
5-го уровня: сам пишет пропозалы -
ну видимо да https://github.com/ClickHouse/ClickHouse/issues/created_by/UnamedRus
https://github.com/ClickHouse/ClickHouse/issues/created_by/den-crane
https://github.com/ClickHouse/ClickHouse/issues/created_by/salttanIssues · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
я сегодня днем подумал о версиях в доке, а сейчас увидел это сообщение, поэтому зареплаил (может совсем не по адресу, сорри)
почему не сделать как, например, делают в доке python? если учесть, что фич много, можно положить под спойлер детализацию (added argument / deprecated / changed behavior с указанием версии)
думаю у многих будут претензии к внешнему виду доки, но как вариант
почему это хорошо - разрабы и крутые dba наверняка и так глубоко знают changelog, а вот обычные пользователям зашло бы -
-
напишите FR на гитхабе об этом.
Со мной бессмыленно это обсуждать, я же не работаю в команде clickhouse -
Для меня написание доки адский труд, потому что мне очень тяжело писать, я точно никакие спойлеры писать не буду, пусть докаписатели на зарплате этим занимаются
-
полностью понимаю
но доку же поддерживают кто-то в более менее актуальном состоянии
пожалуй попробую написать завтра, если не найду ничего подобного -
Сегодня столкнулся с такой проблемой.
Все подчеркнутые значения, должны совпадать, но они не совпадают. Почему так ? Хоть запрос по идее одинаковый по получению данных. Версия КХ 21.7.3.14 -
А если попытаться протестить от основного запроса, то всё работает, как ожидается
-
на первой странице hacker news есть новая статья про clickhouse vs timescaledb - https://news.ycombinator.com/ . Комменты под постом приветствуются :)
-
это что за клиент? Что если обернуть в toString( )
-
это DataSpell, я не думаю что проблема в клиенте
-
а еще нельзя использовать один и тот же аргумент в лябда функциях
x->x , x->x
x->x , y->y
именуйте по разному -
иначе бывает вот такое
select so,
r
from
(select [('y',0),('n',1)] as cg,
if( arrayMap( x -> x.1, cg ) != ['y', 'n'], 'y', 'n') as so,
arrayFilter( x -> x.1 = so , cg) as r
);
┌─so─┬─r─────────┐
│ n │ [('n',1)] │
└────┴───────────┘
select --so,
r
from
(select [('y',0),('n',1)] as cg,
if( arrayMap( x -> x.1, cg ) != ['y', 'n'], 'y', 'n') as so,
arrayFilter( x -> x.1 = so , cg) as r
);
┌─r─────────┐
│ [('y',0)] │
└───────────┘ -
коментируем одно поле во внешнем запросе и результат меняется в другом поле
-
меняем имя аргумента
select --so,
r
from
(select [('y',0),('n',1)] as cg,
if( arrayMap( x -> x.1, cg ) != ['y', 'n'], 'y', 'n') as so,
arrayFilter( y -> y.1 = so , cg) as r
);
┌─r─────────┐
│ [('n',1)] │
└───────────┘ -
Это я в play запустил
-
Окей сейчас попробую
-
гыгы play еще хуже https://github.com/ClickHouse/ClickHouse/issues/10824play.clickhouse.tech displays Int64 incorrectly 9223372033328794000 instead of 9223372033328793741 · Issue #10824 · ClickHouse/ClickHouse
SELECT '- '||toString(max(WatchID))||' -', max(WatchID), toString(max(WatchID)) FROM hits_100m_obfuscated where WatchID = 9223372033328793741 - 9223372033328793741 -...
-
Рил получается вся история фич и багов ..... Помогло
-
ну блин ну зачем мерять
SELECT count(*) FROM rides
Database Query Duration (ms)
TimescaleDB 435
ClickHouse 3
ну издевательство же. -
напишите-напишите. у меня есть ощущение что команда CH просто немного тормозит в переходе к солидному корпоративному уровню с поддержкой старых версий втч их доки. их подход - такой типично гиковский, ну может ещё дело в том что их клиентом до сих пор были только яндексовские команды
-
Здравствуйте, а подскажите пожалуйста, как составить (и можно ли) такой запрос. Есть у меня таблица такого вида:
```
pair String,
price Decimal64(9),
date DateTime,
changeDate DateTime
```
pair повторяются с другими date/changeDate. Как мне вывести pair/price отсортированные по changeDate, но только 1 последнему значению? -
а date тут зачем?
-
1 последнему значению changeDate ?
-
date - дата когда данные закинулись, changeDate - когда они последний раз менялись на источнике
-
да
-
select pair, price, changeDate from .... order by pair desc, changeDate desc limit 1 by pair
-
спасибо, а есть кроме оф доки еще что-то по кликхаусу?
-
по языку запросов
-
ну нету. Ваш вопрос решается практически одинаково в любой SQL базе, и в документациях нету таких ответов.
спрашивайте тут в чате -
спасибо еще раз
-
ещё полезно https://kb.altinity.com/ почитать
-
спасибо за ссылку
-
а это в стандарт sql не входит?
-
limit by ? кажется нет. В некоторых базах и limit-а нет, например в Оракле (раньше точно не было)
-
И только в КХ 3 разных синтаксиса поддерживается. Ад. top / limit / fetch
select * from(select * from (select top 3 * from numbers(10)) limit 5) order by number OFFSET 1 ROW FETCH FIRST 3 ROWS ONLY; -
Больше десяти лет как добавили в оракл лимит
-
я на 11м закончил
а ну да похоже в 12м добавили и limit и fetch
хорошо, у них и PERCENT есть FETCH FIRST 5 PERCENT ROWS ONLY; - 04 November 2021 (115 messages)
-
𝐓𝐡𝐞 𝐬𝐞𝐜𝐫𝐞𝐭 𝐭𝐨 𝐬𝐮𝐜𝐜𝐞𝐬𝐬 𝐢𝐬 𝐭𝐡𝐚𝐭 𝐈 𝐛𝐢𝐭 𝐨𝐟𝐟 𝐦𝐨𝐫𝐞 𝐈 𝐜𝐨𝐮𝐥𝐝 𝐜𝐡𝐞𝐰 𝐚𝐧𝐝 𝐜𝐡𝐞𝐰𝐞𝐝 𝐚𝐬 𝐟𝐚𝐬𝐭 𝐚𝐬 𝐈 𝐜𝐨𝐮𝐥𝐝. 𝐓𝐡𝐚𝐧𝐤𝐬 𝐌𝐫s charmel chavezBTC @charmelchavezBTC 𝐟𝐨𝐫 𝐲𝐨𝐮𝐫 𝐬𝐮𝐩𝐩𝐨𝐫𝐭 𝐢𝐧 𝐦𝐲 𝐭𝐫𝐚𝐝𝐢𝐧𝐠 s𝐡𝐞 𝐢𝐬 the 𝐫𝐢𝐠𝐡𝐭 𝐩𝐞𝐫𝐬𝐨𝐧 𝐭𝐨 𝐰𝐨𝐫𝐤 𝐰𝐢𝐭𝐡 𝐚𝐧𝐝 𝐥𝐞𝐠𝐢𝐭𝐢𝐦𝐚𝐭𝐞 𝐰𝐢𝐭𝐡 𝐡er 𝐩𝐫𝐨𝐠𝐫𝐚𝐦
👇👇
https://t.me/joinchat/Ga2V1yvJFJw4YmM0 -
в Oracle всегда был лимит но писалось по другому rownum<100
-
!report
-
всем привет
подскажите плз
вот у меня вот такая констуркция
CREATE DICTIONARY lotinfo_agency_analitics.dict_clientsBase
(
id UInt64,
fio String
)
PRIMARY KEY id
SOURCE(CLICKHOUSE(TABLE clientsBase DB 'lotinfo_agency_analitics' UPDATE_FIELD 'date'))
вызывает
DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name. (AUTHENTICATION_FAILED)
а что нужно где прописать в настройках чтобы когда он сам к себе обращается ему не нужны были логины и пароли ? -
Не было там лимита до версии 12с
-
а в mssql есть?)
-
механизм был. оператора offset не было
-
Да-да, "механизм", субселект делать
-
а rownum ?
-
А rownum не позволяет сортировать, он сначала выбирает, а только потом сортирует
-
ты прав
-
кто нить встречался ? упорно не могу найти (
-
делайте так
CLICKHOUSE(HOST 'localhost' PORT 9000 USER 'default'
и разрешите default user с локалхоста -
> и разрешите default user с локалхоста
а как разрешить ? у меня
<networks>
<ip>::/0</ip>
</networks>
т.е. получается что со всех ИПов ... или еще что-то нужно прописать ? -
-
там прописано <password></password>
-
тогда должно работать при использовании
CLICKHOUSE(HOST 'localhost' PORT 9000 USER 'default' -
ооо класс спасибо .... на default был прописан шифрованный пароль
-
Коллеги, как вы думаете, что эффективнее
insert into remote() select from local where
или
insert into local select from remote() where -
В простейшем варианте, когда с обоих сторон по одной тачке, одинаково бодрые диски и всё такое?
Второе эффективнее. Первое создаст временную дистриб таблицу, напихает сначала туда, потом отправит.
Второе сразу будет класть партами что получит из селекта. -
Спасибо! where же на удалённом сервере будет фильтровать?
-
Ну есть всякие GLOBAL джойны и подобоное когда нет, не только на удалённом. Но если таким не балуетесь, то да, на удаленном и только.
-
Да, там простой фильтр по колонке.
Понял, еще раз спасибо! -
-
-
Знаю, но это не то, что мне надо
-
-
Потому что у неё есть одна проблема. Она не обрабатывает уже обработанные партиции, даже если они были дополнены.
Ну и у меня чуть другая задача. -
-
-
так а ошибка то какая?
-
Code: 62. DB::Exception: Syntax error: failed at position 223 ('LEFT') (line 4, col 5): LEFT JOIN (
-
а это весь запрос? почему select в скобки обёрнут перед джойном?
-
Всем хорошего дня. Подскажите как заставить КХ загрузить словарь CSV в таком виде
99306,IQ,Maysan,,\'Ali al Gharb,
Постоянно получаю ошибку
Column 4, name: city_name, type: String, parsed text: "<BACKSLASH>"ERROR
Code: 27, e.displayText() = DB::ParsingException: Cannot parse input: expected '\\N' before: '\'Ali al Gharb,\n' (version 21.7.7.47 (official build))
Может хак какой есть? (пробовал разные способы экранировать). Без бэкслеша вообще ничего не может
Code: 27. DB::Exception: Received from localhost:9000. DB::Exception: Cannot parse input: expected ',' at end of stream.: Buffer has gone, cannot extract information about what has been parsed.. -
Чтобы название таблицы для джоина потом указать
Но без скобок таже ошибка -
Добрый день, подскжаите пожалуйста по следующему моменту.
У нас есть в Postgres две таблицы, есть необходимость перенести эти две таблицы из Postgres в Clikchouse объединив данные в одну таблицу, Хотел воспользоваться способом создания двух таблиц в СH c Engine = PostgreSQL, и потом через select s join объединить данные этих двух таблиц и сделать уже insert в таблицу CH. Но одна из таблиц в Postgres имеет jsonb поле, как в таком случае можно настроить маппинг в CH?
или же лучше попробовать в Postgres сделать VIEW который будет равзвертывать jsonb поле в соответствующие поля, и уже на основе данного VIEW делать таблицу в CH? -
без скобок должно работать, у вас может старая версия КХ?
-
21.10.2.15
-
а, понял, с where не будет так работать, надо в подзапрос обернуть
select client_id, … from (select from abonements where..) join (select from table2) using client_id -
То есть без where можно подзапрос не делать а с ним нужно делать? Довольно неудобно
-
я всегда пишу с подзапросом джойны везде, поэтому не замечал никогда этого)
-
-
Есть параметр format_csv_allow_single_quotes его можно поставить=0 тогда экранировать не надо
Есть параметер input_format_null_as_default=0 тогда будет работать экранированный -
все немного сложнее оказалось на стороне CSV. но спасибо за наводку
-
да, я в курсе, rownum моя самая любимое выражение.
Я 10 лет занимался переписыванием запросов, стабилизируя план с помощью предиката rownum>0, оптимизатор не имеет права переносить предикаты внутрь и наружу если есть rownum и мержить select from select. -
не знал
-
ну это естественно, это результат запроса может изменить, поэтому в КХ такой же точно трюк работает
select (select ... from where какой-то хороший предикат limit 10000000000000) where какой-то плохой предикат
и все, плохой предикат нельзя перенести внутрь, под limit -
кажется да, этот параметр как раз делали чтобы ускорить запросы к Merge
-
только теперь кто угодно может зайти без пароля из-за <ip>::/0</ip>, обычно делают локально чтобы можно было ходить без пароля, или локально+все другие ноды КХ
-
не все норм .... мы уже прописали ограничение только на локлхост, спасибо )
-
👍
-
Добрый день, работает ли final для движка ReplacingMergeTree в джойнах?
select t1.*, t2.* from test_table1 t1
join replacing_table2 t2 final on t1.col1= t2.col2
Эта конструкция не работает, или я делаю что-то не так? если джойнить подзапрос
...(select * from replacing_table2 final) t2..
то работает верно -
все так, без подзапроса FINAL не работает при join. Тупо unfinished code
-
Добрый день. Подскажите пожалуйста последовательность при обновлении materialized view с указанной таблицей для сохранения. При ее детаче нет возможности обновить с помошью MODIFY QUERY. Пишет, что не существует. Можно ли просто пересоздать эту view?
-
-
так не надо detach. Прямо меняете и все, в том и суть фичи чтобы можно было на ходу менять.
команда detach выгружает из сервера все знания о таблице или ином объекте, как будто этого объекта вообще нет. -
нет. Не должен, если это поле в groupby
-
-
в какой функции?
-
countIf(status = 'activated' OR status = 'new') as active, any(status) as state
-
-
-
-
в КХ сделан хак из-за дистрибьютид запросов и все предикаты всегда как бы перемещаются из where в having, а затем проваливаются назад из having в where (если можно их провалить)
-
ну т.е. на результат запроса это не влияет, вы просто исользовали неправильное поле.
-
очень даже влияет
-
-
не в этом смысле
-
-
-
да лучше бы, к сожалению таких мест десятки
-
Вроде бы это не запрещено? Если в having есть поле, которое не в group by, то оно просто эквивалентно WHERE. В MySQL также работает
-
Добрый вечер! Напомните пожалуйста команду, которая перемешивает данные в кх, чтобы на каждый запрос выкидывались новые данные?!
-
ну не совсем
select sum(price) from price group by tag_key having tag_key = 1;
+------------+
| sum(price) |
+------------+
| 30 |
+------------+
select sum(price) from price having tag_key = 1;
ERROR 1054 (42S22): Unknown column 'tag_key' in 'having clause' -
Согласен, нужно в SELECT указать эту колонку тоже, в WHERE это не требуется
-
order by rand() ?
-
В общем Amos в какой-то момент решил упростить код с Distributed и написал штуку которая понимает что из having можно передвинуть в where и затем сделал так что инициатор в шарды присылает запрос в котором все предикаты засунуты в having и теперь мы имеем то что имеем
-
А кто такой Amos, кстати?
-
Аmos разработчик КХ который пилит мегасложные фичи.
https://www.youtube.com/watch?v=jJ5VuLr2k5k -
сложные с точки зрения математики, там чистая магия
-
Не подскажете? При попытке добавить колонки в таблицу, из которой производится выборка (materialized view) в другую таблицу, возвращается ошибка, что этой самой matview не существует (вне зависимости удалена она или нет)
-
типа alter table add column кидает ошибку что нету mat view ? Покажите копи-пейст ошибки
-
надо посмотреть. не верится чт там есть что-то недостпное для условного воспитанника мгу
-
Все верно, add column, только on cluster еще
Received exception from server (version 21.8.8):
Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: There was an error on [192.168.56.11:9000]: Code: 60, e.displayText() = DB::Exception: Table xxx.mv_xxxx (c2eac057-851e-43fd-82ea-c057851ef3fd) doesn't exist (version 21.8.8.1.altinitystable (altinity build)). -
Не подскажите, какую нибудь статью про проекции в CH ? Зачем они ? Как использовать ?
-
тут читали?
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/#projection-queryMergeTree | ClickHouse DocumentationMergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
-
-
Да, я не понимаю как их использовать
-
Для запросов которые работаю ежедневно ?
-
Например для дашбордов ?
-
-
-
Projection (RFC) · Issue #14730 · ClickHouse/ClickHouse
Projections are like materialized views, but defined in part-level. It provides consistency guarantees along with automatic usage in queries. This RFC proposes a way to implement projections in Cli...
-
-
-
-
Спасибо, за попытки помочь :)
-
https://kb.altinity.com/altinity-kb-queries-and-syntax/projections-examples/
эта штука позволяет обходится без MV и преагрегировать данные, и сортировать колонки по другому, т.е. можно эмулировать индексы в широких таблицах, просто добавив прожекшин в котором есть поля первичного ключа, но отсортированные по другому полю, и таким образом находить редкие уникальные строки -
Спасибо :)
-
Добрый день!
Вставляю данные через asynch.
При обработке неправильных данных, которые выходят за пределы границ своих типов(например, пытаюсь вставить число -10 в UInt) - получаем ошибку:
Code: 53. Type mismatch in VALUES section. Repeat query with types_check=True for detailed info. Column ie: argument out of range.
После этого все зависает. Похоже что кликхаус зависает.
иногда бывает ошибка если пытаюсь продолжать вставлять другие данные или заменяю(исправляю) текущие(текст ошибки приведен ниже).
Кто-нибудь сталкивался?
Как правильно обрабатывать числа которые выходят из диапазона значений ячейки?
Заранее благодарен любым советам.
*****
Error> TCPHandler: Code: 33. DB::Exception: Cannot read all data in NativeBlockInputStream. Rows read: 0. Rows expected: 100. (CANNOT_READ_ALL_DATA), 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) @ 0x936a17a in /usr/bin/clickhouse
1. DB::NativeBlockInputStream::readData(DB::IDataType const&, COW<DB::IColumn>::immutable_ptr<DB::IColumn>&, DB::ReadBuffer&, unsigned long, double) @ 0x10d49083 in /usr/bin/clickhouse
2. DB::NativeBlockInputStream::readImpl() @ 0x10d49ca2 in /usr/bin/clickhouse
3. DB::IBlockInputStream::read() @ 0x104c3a86 in /usr/bin/clickhouse
4. DB::TCPHandler::receiveData(bool) @ 0x117b6ee2 in /usr/bin/clickhouse
5. DB::TCPHandler::receivePacket() @ 0x117ac3ab in /usr/bin/clickhouse
6. DB::TCPHandler::readDataNext() @ 0x117ae56f in /usr/bin/clickhouse
7. DB::TCPHandler::processInsertQuery() @ 0x117ac908 in /usr/bin/clickhouse
8. DB::TCPHandler::runImpl() @ 0x117a5dff in /usr/bin/clickhouse
9. DB::TCPHandler::run() @ 0x117b8519 in /usr/bin/clickhouse
10. Poco::Net::TCPServerConnection::start() @ 0x1437788f in /usr/bin/clickhouse
11. Poco::Net::TCPServerDispatcher::run() @ 0x1437931a in /usr/bin/clickhouse
12. Poco::PooledThread::run() @ 0x144ac199 in /usr/bin/clickhouse
13. Poco::ThreadImpl::runnableEntry(void*) @ 0x144a842a in /usr/bin/clickhouse
14. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
15. clone @ 0x122293 in /usr/lib/x86_64-linux-gnu/libc-2.31.so -
Возможно ошибка в библиотеке asynch - но пока до конца не разобрался
-
А почему не валидируете данные на питоне ?
-
слишком дорого
-
и ошибки крайне редко - это скорее исключение - но все умирает
-
я бы вам что то подсказал, но мы используем clickhouse-driver и валидируем все входящие данные :(
-
ну вот очень бы не хотелось все данные валидировать 😐
-
Возможно вам подскажут более опытные люди, как это обойти кликхаусом
-
да конечно баг
-
А подскажите, пожалуйста, это ожидаемое поведение, что проекция, созданная с toStartOfMinute(timestamp) не используется для запросов, содержащих просто toStartOfHour(timestamp)? Приходится делать что-то вроде toStartOfHour(toStartOfMinute(timestamp)).
-
Подскажите пожалуйста как лучше сделать ETL в таком случае:
1. Есть source таблица с ReplacingMergeTree и в нее каждый день льются данные за последние 2 месяца (они волатильны).
2. Есть MV которое агрегирует данные (получается данных раза в 3 меньше чем в source).
3. Пользователям нужны данные из MV, но без дубликатов, которые возникают из-за ежедневного обновления окна на 2 месяца назад.
Пока идеи такие:
1. staging-таблица копирующая MV + replace partiotion в MV после ежедневной заливки - вроде ок, но усложняется ETL pipeline
2. ReplacingMergeTree в MV + final. но это удар по перформансу -
Да. Это не реализовано. Тяжело сделать. Сделайте проджекшин в котором оба дименшина, to..hour, tominute..
Это почти не повлияет на размер -
это на какой версии?
не воспроизводится 21.11.1.8636, может питон нужен или много строк за раз
create table async_test( A UInt64 ) Engine=MergeTree order by tuple();
clickhouse-benchmark -c 10 --async_insert=1 <<< "insert into async_test values ( -10 )" -
Хорошо, спасибо за совет.
-
вот ишью про это https://github.com/ClickHouse/ClickHouse/issues/26369Projections are not very smart about datetime dimension. · Issue #26369 · ClickHouse/ClickHouse
create table ptest ( account UInt64, clip UInt64, ts DateTime, v Int64, play Int64, uid Int64 ) Engine = MergeTree order by tuple(); insert into ptest select number%3, number%7, toDateTime('...
- 05 November 2021 (102 messages)
-
Join идёт после from или другого. Join и никак не после where
-
странно что вам помогает ReplacingMT + final. Вероятно у вас аггрегация за один день . При таком как у вас подходе с дубликатами на входе, любая агрегация с суммированием в MV обычно приводит к невозвратной порче данных. Типичное решение - CollapsingMT и сторнирование (вы должны не просто дубликаты присылать, а удаляемые строчки целиком, с флагом -1. В основной табличке Collapsing сделает свое дело, а в аггрегации для MV у вас будет шанс отнять лишнее из счетчика/сумматора). Но это другой подход к ETL, тут нужно не ежедневный слепок базы делать, а слать в КХ полный поток изменений.
Если же вы пригонятете каждый день слепок данных за последние два месяца, аггрегируя их по дням, то чудес нет - надо старые неправильные данные как-то удалять. К вашим двум вариантам можно добавить ещё пару (или десяток) подобных, но все они будут с изъянами. -
Я ишью вмдел. Дособеру данные для воспроизведения
-
Добрый день, подскажите пожалуйсте, можно ли собрать результат запроса в массив значений по ключу группировки?
Пример: есть табличка с полями unique_id и type, хотелось бы собрать ответ в виде unique_id, [type] -
использyйте groupArray(type)
-
Спасибо большое
-
Доброго всем дня! Вопрос не по кликхаузу, но может всё же поможете)) (postgresql)
Есть такая таблица с id пользователя, временем события сессии и типом события. ss - старт сессии, ue - периодические события. Необходимо посчитать среднюю длину сессии по пользователю или длины каждой сессии. По сути от времении каждого ss надо отнимать последнее ue, до нового ss (наоборот только). Но что-то не вывожу(( Помогите, пожалуйста. -
два вложенных запроса с оконками. внутренний создает через lead ещё один столбец "следующее событие". внешний - находит минимальное время события после старта для которого следующее событие это старт.
М.б. в pg такое можно сделать в рамках одного запроса, но в КХ у меня получается только за два вложенных. -
Спасибо большое! Вроде, понял)
-
Чистый clickhouse-driver при упаковке int-ов при помощи питоновского struct в случае их переполнения кинет ошибку: https://github.com/mymarilyn/clickhouse-driver/blob/1114f88fb9f1fccc9a2b517d56da8270340c887e/tests/columns/test_int.py#L34
Так что проверять вроде нет нужды.
asynch должен сделать то же самое по идееclickhouse-driver/test_int.py at 1114f88fb9f1fccc9a2b517d56da8270340c887e · mymarilyn/clickhouse-driverClickHouse Python Driver with native interface support - clickhouse-driver/test_int.py at 1114f88fb9f1fccc9a2b517d56da8270340c887e · mymarilyn/clickhouse-driver
-
У нас сейчас тестовая пода кликхауса со своей нагрузкой случайно решила заглянуть на чужу ноду и радостно потеснила собой все задачи там, подняв load_avg до 22.
При всем при этом сам этот заблудившийся кликхаус работает так же быстро, будто ничего и не случилось и ему норм. Браво, кликхаус не тормозит! 😄 Очень круто. -
Добрый день.
Есть массив массивов с дробными числами, который получается в результате вычисления и округления чисел.
[[0.21,0.08,0.22,0.15],[0.15,0.15,0]]
Если просуммировать то получаю
0.039999999999999925
Должно быть 0.04.
Подскажите, что с этим можно сделать? -
Перестать использовать float . Вы же не физику считаете?
-
-
да, точно, умножение на 1млн помогает. Спасибо
-
либо округлять, в доп к предложенному, это нормальное поведение
-
-
у вас какая назгрузка то?
OLAP или OLTP? -
OLAP, сжатых данных где-то 80Тб + репликация х2
-
-
Учитывая, что singlestore растет из memsql, есть некоторые подозрения, что хранилище на дисках у них менее оптимизировано
-
у них главная маркетинговая фишка что у них лучше сжатие
-
На новых физических принципах? :)
Ну тогда должны быть бенчмарки -
Beyond being closed source, SingleStoreDB’s License explicitly prohibits benchmarking 😂😂
-
-
Спасибо, понятно что магии нет )
-
так, кликхаусовцы! кто забыл выключить тестовый код skynet перед выпуском в прод?!
-
Подскажите пожалуйста у меня есть таблица в которой строки по столбцу "months" содержат значения 0,1,2,3,4,5 и тд
Я хочу повернуть таблицу так чтобы эти значения стали именами столбцов. А строки содержали значения по соответствию из других столбцов. Как на картинке ниже -
-
-
-
https://stackoverflow.com/questions/62306158/pivot-in-clickhouse
https://stackoverflow.com/questions/61781720/pivot-or-equivalent-in-clickhouse
https://stackoverflow.com/questions/66024153/pivot-column-into-nxm-table-in-clickhousePivot In clickhouseI want to do a pivot in clickhouse I have data in the form of rule_name | result 'string_1', 'result_1' 'string_2', 'result_2' 'string_3', 'result_3' 'string_4', 'result_4' I want to pivot it to...
-
так же как специализированные olap движки могут сильно побить обычные на своих задачах, так и специализированные алгоритмы сжатия могут сильно побить обычные на своих задачах - в данном случае сжатия столбцов. в КХ тоже есть такие алгоритмы (delta и пр.), но они совсем простые
-
кстати ZSTD шибко умный и умеет сам и delta и doubledelta, и похоже ZSTD(2) жмет лучше чем delta+LZ4
-
а почему ZSTD2 не выставили по умолчанию? Разве там настолько выше затраты на cpu?
-
Да, он медленнее раза в 2
-
возможно, это не мерял
-
даже если не учитывать компресиию, ZSTD медленее на декомпресии чем LZ4
но я не могу это намерять на проде, в смысле нет разницы в перфомансе запросов, а CPU занят < 20% .
Поэтому у меня ZSTD1 по дефолту на всех базах изначально. Видимо у меня ZSTD/LZ4 занимает очень маленький % от общего и все время выполнения уходит на диск+словари+join-ы -
Amos Bird - kuaishou.com - Projections in ClickHouse - Percona Live 2021
Projections are collections of table columns with different physical layout to speed up queries. They are the main constructs of Vertica. Comment 💬, Share 🔗, Like 👍, and Subscribe ✅ to our channel 📺, and turn on the 🔔 to be alerted to new videos about #OpenSource #Databases... and many other things! https://percona.tv/subscribe At kuaishou.com we have implemented PROJECTIONs support for ClickHouse. It boosts our OLAP analytic capabilities by an order of magnitude. This talk will highlight the design considerations, some implementation details, how it is integrated into #ClickHouse design. Examples and demo of the feature will be shown. You can find more information about #OpenSource #Databases and Percona Database Events in these links 👇👇👇 Watch Percona Live 2021 Talks ⏩ https://percona.tv/PerconaLive2021 Percona Services ⏩ https://per.co.na/Q8eykw Monitor your Database For Free ⏩ https://percona.tv/pmm-yt Kubernetes Operator for Databases ⏩https://per.co.na/kubernetes-operators Connect With us on our…
-
если точнее по нашим измерениям, медленнее на компрессии.
на чтениях почти не было разницы вплоть до 22 -
Спасибо
-
-
CREATE TABLE omg AS SELECT ...
-
🔥 работает!
-
мне кажется, что-то ты путаешь. zstd этого не умел и учитывая обратную совместимость, не должен был научиться. возможно в ch кодек переделан, учитывая его спецнужды
-
zstd = lz+huf, поэтому декомпрессия медленней. при сжатии поиск совпадений занимает (кроме самых быстрых режимов) больше времени чем huf
-
desc (select ....)
-
я не знаю точно про внутренности ZSTD, я просто много раз проверял на реальных данных.
-
На моих задачах (логирование json-ов + аналитика) zstd1 дал выигрыш в 45% по компрессии, за счет 11% падения в ingestion latency, по сравнению с lz4, поэтому он сейчас стоит по умолчанию.
-
JSON, у меня подозрение что ZSTD надо надо применять CODEC-м на все String колонки, не думая, будет ускорение и чтения и записи, потому что меньше I/O
-
и я пробовал JSON-ы жать ZSTD2 вместо ZSTD1, не увидел разницы
-
если на специфичную колонку (toTypeName(columnname))
-
Я посмотрел результаты тестрования, zstd(10) дал выигрыш в 9% по компрессии по сравнению с zstd(1), за счет двухкратного увеличения латенси.
-
Т.е. смысла использовать высокие уровни мало, если надо сохранить скорость.
-
Коллеги, какая команда в кликхаусе по типу having, where обладает условием (ХОТЯ БЫ одно (ANY) имеет [условие])?
-
OR ?
where a = 5 or b = 6 or z = -1 -
Не совсем. Когда есть условие какое-то и мы хотим чтобы оно точно выполнилось, но необязательно у всех переменных. Хотя бы у одного
-
это arrayExists
-
Спасибо!
-
Подскажите
-
SOURCE(POSTGRESQL(
port 5432
host 'postgresql-hostname'
user 'postgres_user'
password 'postgres_password'
db 'db_name'
table 'table_name'
replica(host 'example01-1' port 5432 priority 1)
replica(host 'example01-2' port 5432 priority 2)
where 'id=10'
invalidate_query 'SQL_QUERY'
)) -
как сюда SSLmode подставить?
-
а уже можно дропать данные парта не дропая projection? а то у нас пока отдельные таблицы, батчи, джобы... итд итп... ТТЛу доверия мало.
-
переменные поддерживаются в запросах?
-
типо @i := id
-
разве там такое планировалось? прожекшены хранятся внутри партов, нет парта - нет прожекшена
-
нет, только если with, with 1 as a select a
-
в tabix есть переменные
-
ну мне нужно в подзапрос переменную как-то вставить..
-
а в чём проблема
WITH 'значение' as var ? -
пробую
-
планировалось, как минимум со своими ТТЛъ
-
как то странно, данные в прожекшене в теории не должны отличаться от основной таблицы. Была штука TTL GROUP BY чтобы меньше данных хранилось со временем
-
Вам надо хранить. Месяц сырых данных и аггрегированные 5 лет. Вполне обычный кейс. Это вроде даже было у амоса на слайдах
-
ну так TTL GROUP BY как раз это делает
-
К сожалению он далек от production ready
-
это да, но задумка то что надо
-
/report
-
-
Приди порядок наведи
-
-
в других еще хуже
-
я не понимаю почему вас так спам анноит. Ну спам, и что, ну реклама тоже кругом, и что.
-
да просто реклама наркоты сразу тригерит
-
-
тяжело вам, у нас легализована, всем пофиг
-
ну у вас то не все легализовано, а только трава вроде
-
где-то недавно читал что у ZSTD после T64 лучше результаты
-
-
+
-
там в коде асинч есть стракт - и он в процессе участвует на котором все зависает
-
но в чем проблема я так и не пойму. написана программа с примером вставки после которой ничего больше не работает
-
точнее похоже висит и ждем тайм аут
и после тайм аута ошибки с пингом сыпятся
Exception: Code: 102. Unexpected packet from server 127.0.0.1:9000 (expected Pong, got Unknown packet). Traceback (most recent call last):
Exception: Code: 102. Unexpected packet from server 127.0.0.1:9000 (expected Pong, got Hello). Traceback (most recent call last): -
Что-то не вычитывается из сокета или пишется лишнее, похоже, и всё взаимодействие клиента и сервера рушится
-
-
Через оконные функции
-
я почему-то думал что они ещё не доступны
-
Смотря какая версия у вас в КХ, но вроде они в новых релизах даже не экспериментальные уже
-
ClickHouse Window Functions -- Current State of the Art
Window functions are available in ClickHouse! Learn about this long-awaited feature and how it works, based on extensive QA work at Altinity.
-
спасибо как раз эту статью смотрю и версия кликхауса у меня выше чем в статье
-
Window Functions | ClickHouse Documentation
[experimental] Window Functions ClickHouse supports the standard grammar for defining windows and window functions. The
-
- 06 November 2021 (83 messages)
-
у нее просто есть ограничения, и непредсказуемый результат
-
create table A (A Int64) engine=MergeTree order by A;
insert into A values (1);
insert into A values (1000);
insert into A values (1002);
select A, neighbor(A,-1) from (select A from A order by A) ;
┌─A─┬─neighbor(A, -1)─┐
│ 1 │ 0 │
└───┴─────────────────┘
┌────A─┬─neighbor(A, -1)─┐
│ 1000 │ 0 │
└──────┴─────────────────┘
┌────A─┬─neighbor(A, -1)─┐
│ 1002 │ 0 │
└──────┴─────────────────┘ -
-
и да и нет. Тут да блоки по одной строке, потому что инсерты так были, но блоки формируются исходя из кучи параметров, например макс. размер блока, или например после агрегации могут блоки и по 3 строки получится, и т.д.
-
-
не будет, ваша задача я думаю решается легко на массивах. Просто толком неясно что надо
-
-
-
movingAverage считается либо через WF, либо через groupArrayMovingAvg
-
-
Дык в аниме тянки лучше и бесплатно. Нафиг не нужно. Оставь себе
-
Дык в аниме тянки лучше и бесплатно. Нафиг не нужно. Оставь себе
-
Было бы на что смотреть
-
Чего там не видели?
-
https://gist.github.com/hardstep33/d36c24277846b36a57ea3b65696a073f
Может не все знают, и кому-то будет интересно. dateDiff работает не так как ожидалось. Второй пример работает точнее (при желании можно сделать функцию)
select dateDiff('year',CAST('1983-02-02' as DateTime64),CAST('2021-02-01' as DateTime64))
-- 38
;
select (toYYYYMMDDhhmmss(CAST('2021-02-01' as DateTime64)) - toYYYYMMDDhhmmss(CAST('1983-02-02' as DateTime64)))
/ toUInt64('1' || replaceRegexpAll('MMDDhhmmss','.','0'))
--37.9999CH_date_diff_correctCH_date_diff_correct. GitHub Gist: instantly share code, notes, and snippets.
-
хм. если вам нужна точность - спросите в днях
select dateDiff('day',CAST('1983-02-02' as DateTime64), CAST('2021-02-01' as DateTime64))/365.25; -
А потом делить на 365 или 366 в зависимости от года?)
-
-
Задача посчитать полных лет человеку сколько
-
37.9999 не выглядит корректным приближением для 37+364/365
-
Человеку еще не стукнуло 38, а показывает что 38
select dateDiff('day',CAST('1983-02-01 23:59:59' as DateTime64), CAST('2021-02-01 20:58:59' as DateTime64))/365.25
-- 38.001368925393564 -
А тут все норм:
select (toYYYYMMDDhhmmss(CAST('2021-02-01 20:58:59' as DateTime64)) - toYYYYMMDDhhmmss(CAST('1983-02-01 23:59:59' as DateTime64)))
/ toUInt64('1' || replaceRegexpAll('MMDDhhmmss','.','0'))
--37.99999699 -
наверно корректней сравнить год и откорректировать его на 1 сравнив месяц и день
-
но да, ch для таких задач полезно иметь функцию возвращающую сколько прошло ПОЛНЫХ лет, месяцев и дней
-
как и функцию, добавляющую к дате оные
-
-
По моему очевидно что если результат точнее а скорость вычислений соразмерима (проверил clickhouse-benchmark), то лучше выбрать более точный вариант? Зачем спорите?
-
SELECT (toYYYYMMDDhhmmss(CAST('2021-01-01 20:58:59', 'DateTime64')) - toYYYYMMDDhhmmss(CAST('2020-12-31 23:59:59', 'DateTime64'))) / toUInt64(concat('1', replaceRegexpAll('MMDDhhmmss', '.', '0'))) AS z
Query id: d590aba6-53cf-455d-957e-7769e8eea851
┌──────────z─┐
│ 0.88699699 │
└────────────┘ -
Так нельзя считать
-
если интересуют только полные года, то как раз так и надо
-
можно просто разницу в годах + разницу в месяцах / 100 + разницу в днях / 10000
-
Здравствуйте. А кто-нибудь знает, через какое время может появиться 21.10 stable?
-
Уже вроде давно. Скоро уже 21.11 будет :)
-
Приветствую, как можно произвести адекватное сравнения таблиц с одинаковыми столбцами, но с разной схемой хранения и архивации данных. Просто данные в кэш попадают и всё на этом. Разнице просто нету
-
вы хотели сказать сравнение производительности? Создайте миллиард строк. Скорее всего увидите разницу. На десятках миллионов - наверное нет.
-
ну я решил на 500 млн смотреть разницу, у меня 10 млрд таблица основная
-
set min_bytes_to_use_direct_io=1
-
запрос на котором тестируете случайно не целиком вычитывает данные?
-
целиком
-
-
-
-
Пока я тестирую именно сжатие данных
-
Индексы до фильрации ?
-
да
-
ниче не понять, пример нужен
сохранить сами индексы или сохранить элементы на старых позициях? -
-
все Array функции accept множество массивов, пример давайте
-
пример нужен
-
Как я понял
arrayZip(ar,arrayEnumerate(ar)) as ar_zip,
arrayMap(x->x.1 !=0,ar_zip) -
при этом по ним итерируется одновременно?
-
ваша телепатия круче моей
-
да
-
короче, скорее всего вы пытаетесь изобрести велосипед с кубическими колесами, пример дайте что на входе что на выходе
-
-
-
>arrayZip(ar,arrayEnumerate(ar)) as ar_zip,
arrayZip конечно не нужен -
-
-
Пример на реальных данных на вход и что хотите получить
-
Например на вход [1,2,3] на выходе [3,2,1]
-
я понял, вы суперленивый
филтруем элементы которые не делятся на 3
select arrayFilter(i,j -> j % 3, b, a) from (select [1,6,8,10] a, ['a','b','c','d'] b) ;
┌─arrayFilter(lambda(tuple(i, j), modulo(j, 3)), b, a)─┐
│ ['a','c','d'] │
└──────────────────────────────────────────────────────┘ -
-
https://clickhouse.com/docs/ru/operations/utilities/clickhouse-compressor/#clickhouse-compressor - не хотите потренироваться на кошечках?ClickHouse compressor | Документация ClickHouse
ClickHouse compressor Simple program for data compression and decompression in ClickHouse way. Examples Compress data wi
-
А arrayFilter на вход можно передать больше чем два массива?
-
select arrayFilter(i, j -> j, array.balance, array.active) from (select [1,2,4,5] array.balance, [0,0,1,0] array.active )
┌─arrayFilter(lambda(tuple(i, j), j), array.balance, array.active)─┐
│ [4] │
└──────────────────────────────────────────────────────────────────┘ -
Ну для меня это открытие, ну получается что да можно
-
Спасибо, попробую
-
спасибо
сделал похожим образом
arrayFilter(i, j -> j, arrayEnumerate(abonements_active), abonements_active) as abonements_active -
походу документацию нужно в закреп добавить, каждый день открытия уже открытого :)
https://clickhouse.com/docs/ru/sql-reference/functions/array-functions/#array-filterМассивы | Документация ClickHouseМассивы empty Проверяет, является ли входной массив пустым. Синтаксис empty([x]) Массив считается пустым, если он не сод
-
Я и так каждый день её октрываю, просто даже не мог подумать, что можно сразу несколько массивов передавать
-
SELECT arrayMap((i, j) -> (i + j), array.balance, array.active)
FROM
(
SELECT
[1, 2, 4, 5] AS `array.balance`,
[2, 0, 1, 0] AS `array.active`
)
Query id: 13029896-ba40-47a9-8d0d-3e9b60d7fd8b
┌─arrayMap(lambda(tuple(i, j), plus(i, j)), array.balance, array.active)─┐
│ [3,2,5,5] │
└────────────────────────────────────────────────────────────────────────┘ -
Drop table на проде?)
-
Голый порт без фаерволла в инет
-
В ClickHouse это не так легко — удалить таблицу, если там уже есть много данных :)
-
Ну ладно, партиции почистить ещё)
Но мы же шалим) -
Кстати раньше можно было через ALTER DELETE достаточно данных удалить сначала, а потом уже дропнуть. Не знаю, поправили или нет (и если поправили, то интересно, каким образом)
-
Ну что Вы начинаете, вот я недавно видел шедевр-скрипт который снёс дБ из-за недостатка валидации передаваемого в rm -rf path/$variable, точнее туда просто ничего не передали
-
Кто видел Bumblebee, в цирке не смеется (скрипт удаления дров nvidia по ошибке сносил весь /usr из-за лишнего пробела)
-
Всем привет! Вдруг кто-то сталкивался с такой проблемой, когда при импорте csv файла в базу импортируются не все строки. У меня есть сырые логи rest api (скачиваю их в csv формате), при импорте в базу иногда переливаются все строки, а иногда только часть. Думала, дело в кодировке, но я пробовала utf-8, ISO-8859-1, не помогло. Помогите, плиз, идеями, с чем это может быть связано.
-
добрый вечер, не подскажите может кто сталкивался с таким, после того как закончилась память на сервере кликхауса, после добавления памяти и перезапуска clickhouse выдает такое:
<Error> reports.`.table`: Part /var/lib/clickhouse/data/db/table/20210401_20210425_882973_1797724_3190 is broken. Looking for parts to replace it.
<Error> reports.`.table`: Detaching broken part /var/lib/clickhouse/data/db/table/20210401_20210425_882973_1797724_3190 because it covers less than 2 parts. You need to resolve this manually -
Смотрите ошибки в логах кликхауса.
-
Поищите эту ошибку по чату. Там рекомендовали использовать спец команду для фикса данных.
- 07 November 2021 (51 messages)
-
𝐈𝐭'𝐬 𝐧𝐨𝐭 𝐰𝐡𝐞𝐭𝐡𝐞𝐫 𝐲𝐨𝐮'𝐫𝐞 𝐫𝐢𝐠𝐡𝐭 𝐨𝐫 𝐰𝐫𝐨𝐧𝐠 𝐭𝐡𝐚𝐭'𝐬 𝐢𝐦𝐩𝐨𝐫𝐭𝐚𝐧𝐭, 𝐛𝐮𝐭 𝐡𝐨𝐰 𝐦𝐮𝐜𝐡 𝐦𝐨𝐧𝐞𝐲 𝐲𝐨𝐮 𝐦𝐚𝐤𝐞 𝐰𝐡𝐞𝐧 𝐲𝐨𝐮'𝐫𝐞 𝐫𝐢𝐠𝐡𝐭 𝐚𝐧𝐝 𝐡𝐨𝐰 𝐦𝐮𝐜𝐡 𝐲𝐨𝐮 𝐥𝐨𝐬𝐞 𝐰𝐡𝐞𝐧 𝐲𝐨𝐮'𝐫𝐞 𝐰𝐫𝐨𝐧𝐠.𝐓𝐨𝐨 𝐦𝐚𝐧𝐲 𝐢𝐧𝐯𝐞𝐬𝐭𝐨𝐫𝐬 𝐛𝐞𝐜𝐨𝐦𝐞 𝐨𝐛𝐬𝐞𝐬𝐬𝐞𝐝 𝐰𝐢𝐭𝐡 𝐛𝐞𝐢𝐧𝐠 𝐫𝐢𝐠𝐡𝐭, 𝐞𝐯𝐞𝐧 𝐰𝐡𝐞𝐧 𝐭𝐡𝐞 𝐠𝐚𝐢𝐧𝐬 𝐚𝐫𝐞 𝐬𝐦𝐚𝐥𝐥. 𝐖𝐢𝐧𝐧𝐢𝐧𝐠 𝐛𝐢𝐠 𝐚𝐧𝐝 𝐜𝐮𝐭𝐭𝐢𝐧𝐠 𝐲𝐨𝐮𝐫 𝐥𝐨𝐬𝐬𝐞𝐬 𝐰𝐡𝐞𝐧 𝐲𝐨𝐮'𝐫𝐞 𝐰𝐫𝐨𝐧𝐠 𝐚𝐫𝐞 𝐦𝐨𝐫𝐞 𝐢𝐦𝐩𝐨𝐫𝐭𝐚𝐧𝐭 𝐭𝐡𝐚𝐧 𝐛𝐞𝐢𝐧𝐠 𝐫𝐢𝐠𝐡𝐭.𝐈𝐧𝐯𝐞𝐬𝐭 with @Johnson_Robbison 💯 𝐢𝐬 𝐭𝐡𝐞 𝐛𝐞𝐬𝐭 𝐚𝐧𝐝 𝐬𝐞𝐜𝐮𝐫𝐞𝐝 𝐩𝐥𝐚𝐭𝐟𝐨𝐫𝐦 𝐜𝐨𝐦𝐩𝐚𝐧𝐲 𝐜𝐥𝐢𝐜𝐤 𝐨𝐧 𝐭𝐡𝐞 𝐥𝐢𝐧𝐤 𝐛𝐞𝐥𝐨𝐰 𝐚𝐧𝐝 𝐬𝐭𝐚𝐫𝐭 𝐞𝐚𝐫𝐧𝐢𝐧𝐠 👇👇👇👇👇
https://t.me/joinchat/PFl26iGdxVU4M2M0
https://t.me/joinchat/PFl26iGdxVU4M2M0 -
Всем привет!
Столкнулся с такой проблемой:
Используется Clickhouse 20.9.2.20 в docker-контейнере, коннектится к postgres по odbc.
При использовании контейнера Clickhouse версии 21 и выше подключиться к postgres невозможно с такими же настройками.
odbcinst.ini:
[PostgreSQL ANSI]
Description=PostgreSQL ODBC driver (ANSI version)
Driver=psqlodbca.so
Setup=libodbcpsqlS.so
Debug=0
CommLog=1
UsageCount=1
[PostgreSQL Unicode]
Description=PostgreSQL ODBC driver (Unicode version)
Driver=psqlodbcw.so
Setup=libodbcpsqlS.so
Debug=0
CommLog=1
UsageCount=1
odbc.ini
[DEFAULT]
Driver = psql
[psql]
Description = PostgreSQL connection to db
Driver = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
Database = db_local
Servername = postgres
UserName = admin
Password = password
Port = 5432
Protocol = 9.3
ReadOnly = Yes
RowVersioning = No
ShowSystemTables = No
Сталкивался кто-нибудь с подобным?
Где-то можно почитать, что изменилось касательно odbc в 21 версии? -
Добрый день.
Подскажите, что за процесс идет под именем. Таких логов прилично выводятся.
2021.11.07 12:34:44.454183 [ 3701 ] {} <Trace> db.table (dataProcessingTask): Execution took 313 ms.
Проблема в том, что КХ выедает прилично ресурсов. Ищу причину. -
кажется что нынче ODBC не нужен для походов из CH в PG
https://clickhouse.com/docs/en/engines/database-engines/postgresql/
https://clickhouse.com/docs/en/engines/table-engines/integrations/postgresql/
https://clickhouse.com/docs/en/sql-reference/table-functions/postgresql/PostgreSQL | ClickHouse DocumentationPostgreSQL Allows to connect to databases on a remote PostgreSQL server. Supports read and write operations (SELECT and
-
Спасибо большое! Попробую!
-
Коллеги, для разработки и на стейдже используем КХ в докере.
Переодически случается так, что при кривой остановке контейнера и последующем запуске КХ выдает:
ClickHouse init process failed
Иногда помогало удаления файла status из директории с данными, но конретно сейчас не помогает.
Лень каждый раз накатывать дампы и тп, но отказываться от докера на стейдже и локалке не очень хочется.
Сталкивался кто-то с подобное проблемой? На проде, слава богу, кх в облаке яндекса и таких проблем (тьфу-тьфу) нет. -
Вы пользуетесь init sh?
-
нет, просто запускаю контейнер со всеми настройками по дефолту и пробрасываю директорию на хост
а надо? -
Такая ошибка должна возникать если вы пользуетесь initdb
https://github.com/ClickHouse/ClickHouse/blob/15b9d65221c4e9f632a19aa5d74d19146fa72091/docker/server/entrypoint.sh#L121ClickHouse/entrypoint.sh at 15b9d65221c4e9f632a19aa5d74d19146fa72091 · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
сами мы ничего не используем, полагаемся полностью на ентрипоинт команду
-
ls /docker-entrypoint-initdb.d/
Что в этой папке тогда есть? -
CLICKHOUSE_DB="${CLICKHOUSE_DB:-}"
Пользуетесь ли? -
Увеличил CLICKHOUSE_INIT_TIMEOUT - взлетело
-
Спасибо за ссылку на
https://github.com/ClickHouse/ClickHouse/blob/15b9d65221c4e9f632a19aa5d74d19146fa72091/docker/server/entrypoint.sh#L121ClickHouse/entrypoint.sh at 15b9d65221c4e9f632a19aa5d74d19146fa72091 · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
а что значит невозможно? Ошибка какая?
и драйвера от odbc и pg есть в контенере? usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so ? -
-
-
Пытается подключиться через Unix socket, если нужен tcp, то используйте 127.0.0.1 в качестве хоста (помним про контейнер и/или проверяем, что все проброшено)
-
-
Нужно понять каким образом доступен pg из контейнера с ch
И да, странно, почему сервер localhost а не postgres как в конфиге -
Из контейнера ch: телнет на порт подключается, сам контейнер пингуется, psql подключается без проблем:
root@cc941d9d3aff:/# psql -h postgres -U postgres
Password for user postgres:
psql (12.8 (Ubuntu 12.8-0ubuntu0.20.04.1), server 10.14 (Debian 10.14-1.pgdg90+1))
Type "help" for help.
postgres=# -
Я третий день понять не могу, почему odbc упорно идёт на локалхост)
-
-
1. в clickhouse используется dsn=psql ?
2. а права на файл какие у /etc/odbc.ini ?
3. isql psql из контейнера работает?
4. что будет если вместо /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so сделать /usr/lib/x86_64-linux-gnu/odbc/psqlodbca.so
5. что если вместо имени в Servername написать IP адрес?
ну и нет смысла использовать odbc, встроенный в КХ postrgesql намного быстрее, и не надо париться с установкой дров pg и odbc -
1) да
2) 644 (-rw-r--r-- 1 root root)
3) isql - нет, psql - да
4) Без изменений
5) IP - адрес также не работает, более того, обратил внимание, что если в odbc.ini изменить servername на заведомо несуществующий, то ничего не изменится.
Такое поведение воспроизводится на любой 21.х.х версии. -
удалите odbcinst.ini
>3) isql - нет, psql - да
isql psql -- это одна команда 🙂 . -
isql это программа для ODBC
-
psql это ее аргумент, вы так dsn назвали
-
и конечно ODBC + PG + 21 работает. Я 2 недели назад проверял (https://github.com/ClickHouse/ClickHouse/issues/30413#issuecomment-952181892)
-
Прошу прощения, я подумал, что имеется в виду postgres-client)
root@73eb4cb5bab6:/# isql -v psql
[08001][unixODBC]could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
[ISQL]ERROR: Could not SQLConnect -
вот это и надо чинить и всегда проверять, до того как начали мучать КХ.
уберите например пробелы перед именами параметров
Servername = postgres
Servername = postgres -
Т.е. КХ 21 тут вообще ни при чем если даже isql -v psql не робит.
-
-
-
ну а драйвера в контейнере как появляются?
-
-
я не спорю, ODBC работает совсем по другому в версии 21. Потому что там используется nanodobc либа, а не POCO.
но тут не о чем разговаривать пока isql -v psql кидает ошибку.
вы из контейнера точно видите что там odbc.ini есть и он читаемый? -
возможно в имеджах 20 и 21 разные линуксы и разные ODBC
-
я бы начал с удаления пробелов и удаления odbcinst.ini
-
-
-
-
а пробелы что?
-
-
docker run -d --name odbc --ulimit nofile=262144:262144 yandex/clickhouse-server:21.9
docker exec -it odbc /bin/bash
apt-get update;apt-get install -y unixodbc odbcinst odbc-postgresql vim
# cat /etc/odbc.ini
[DEFAULT]
Driver = psql
[psql]
Description = PostgreSQL connection to db
Driver = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
Database= db_local
Servername = postgres
UserName= admin
Password= password
Port= 5432
Protocol= 9.3
ReadOnly= Yes
RowVersioning = No
ShowSystemTables= No
# isql -v psql
[08001][unixODBC]could not translate host name "postgres" to address: Name or service not known
[ISQL]ERROR: Could not SQLConnect -
-
/etc/clickhouse-server/users.d/allow_projections.xml
<yandex><profiles><default><allow_experimental_projection_optimization>1</allow_experimental_projection_optimization></default></profiles></yandex> -
Спасибо!
-
Не надо так делать. Это ломает некоторые запросы. Сейчас 10 тестов в ci падает из за этого. Лучше включить только в конкретных запросах через settings в конце запроса
-
😱
-
отключите трейс и таких логов будет выводиться меньше
- 08 November 2021 (183 messages)
-
It's amazing trading with someone with excellent skills and knowledge about the market. I enjoyed full profits and easy withdrawals with no complains, and all I do is just invest $800 and received $8000 within 48hours and watch my money grow inevitably with Mr @kelvinsmith_fx_trader ... for more information contact him on the name below👇👇
https://t.me/joinchat/qEQme6fpucA5Njk0
https://t.me/joinchat/qEQme6fpucA5Njk0RE🅰L F🅾REX AND BIN🅰RY TR🅰DE™Incredible win rate, 3-5 accurate signals daily with adjoining funds. Make Money While You Sleep 😍 ✅ Secret Trading〽️Formula✔️ ✅ Account Management 💼🛃✔️ ✅ Get 1 to 3 BTC in 7days T.me/kelvinsmith_fx_trader
-
Не могу найти инфу чем грозит частый alter table update, кто-нибудь может поделиться?
Нужно апдейтнуть довольно таки большое кол-во строк в кх за день (чтобы восстановить статистику скажем так).
Я постарался минимизировать кол-во alter update запросов и тем не менее их получилось 4, но нужно выполнить единожды (а не на постоянной основе) -
Разово нет никакой проблемы. Под контролем, когда вы вручную запускаете, проверяете что закончилось и реально проапдейтилось. Проблемы у тех кто пытается использовать мутации как часть бизнес логики запуская десятки тысяч мутаций подряд.
-
Спасибо ;)
А есть какая-нибудь инфа/статья о том как это работает под капотом и влияет на фс или цпу утилизацию? Ну то бишь в целом где может вдруг выстрелить? Вдруг данных для апдейта очень много и сожрёт всю оперу и убьёт сервер и тд? -
Да просто как обычный МЕРЖ читает все строки в колонке и пишет в новый файл в новом парте.
-
-
Спс
-
Помогите пожалуйста с идеей реализации.
Есть таблица с колонкой со строковыми значениями.
Нужно получить все возможные комбинации этих значений.
Например есть значения a, b, c
Нужно получить таблицу с колонокй комбинаций:
''
'a'
'b'
'c'
'a', 'b'
'a','c'
и т.д., комбинации можно и в массиве хранить -
порядок важен?
-
обычно просто join таблицу саму с собой без указания соединения должно дать декартово произведение. и делаете конкатенации строк
-
кхм... важен в том смысле, что комбинация a, b должна быть в единственном виде. b, a уже не должно быть
-
where a > b
-
и да, нужны вообще все комбинации, именно как число сочетаний.
И a, b, c, d ....
И пропуски любых других строк -
декартово произведение попробуйте
-
всем привет
у меня с утречка взорвался зк (пока не очень понял что триггернуло - то ли объем инсертов скаканул и уложил зк, то ли зк икнул и ретраи инсертов все разнесли, но наверное не суть), и теперь кх начал жаловаться в логах на
Code: 235, e.displayText() = DB::Exception: Part cd344a9912588f9f53a1df27f6e7b72e_29931_29931_0 (state Committed) already exists.
Парты все разные, упоминаются в логе только один раз.
Вижу что похожая ошибка тут упоминалась в https://github.com/ClickHouse/ClickHouse/issues/20964 но чет там особо не пришли к решению
Собственно, хотелось бы понять, что это, свидетельствует ли это о какой-то реальной проблеме, могли ли потеряться какие-то данные и надо ли что-то делать с этим?
Версия 20.12.4 revision 54442. -
Здравствуйте. Я правильно понимаю, что для иерархических внешних словарей можно использовать только числовой ключ? Есть ли планы по использованию строк в качестве ключа?
-
Всем привет!
нашел ошибку в кликхаусе -
задача попахивает рекурсивностью, но рекурсии в КХ нет. Поэтому разворачиваем рекурсию в циклы, а циклы у нас в виде window functions.
with data as ( select arrayJoin(['A','B','C','D']) as col),
data1 as (select c1, lagInFrame(c1) over (order by c1) as c2
from (select groupArray(col) over (order by col) as c1 from data))
select distinct arrayFilter(x->not has(B.c2,x),A.c1) as X
from data1 A cross join data1 B
where length(X) >0
order by X -
не уверен что это ошибка
-
-
SELECT
toDecimal64(0.018, 8),
CAST(0.018, 'Decimal64(8)')
┌─toDecimal64(0.018, 8)─┬─CAST(0.018, 'Decimal64(8)')─┐
│ 0.01799999 │ 0.01799999 │
└───────────────────────┴───────────────────┘ -
0.018 - константа типа float. с ними бывают указанного рода проблемы, которые никого не волнуют, потому что тут все "бухгалтеры", для которых нужен decimal. как вам справедливо указано '0.018' - это константа типа строка, и с ней проблем нет.
-
-
из-за чего кликхаус может начать создавать очень много нод в /log в зукипере?
SELECT
name,
numChildren
FROM system.zookeeper
WHERE path = '/clickhouse/tables/01/db_name.table_name'
┌─name───────────────────────┬─numChildren─┐
│ alter_partition_version │ 0 │
│ metadata │ 0 │
│ temp │ 1 │
│ log │ 615627 │
│ leader_election │ 2 │
│ columns │ 0 │
│ blocks │ 403 │
│ nonincrement_block_numbers │ 0 │
│ replicas │ 2 │
│ quorum │ 3 │
│ pinned_part_uuids │ 0 │
│ block_numbers │ 410 │
│ mutations │ 4 │
│ part_moves_shard │ 0 │
└────────────────────────────┴─────────────┘ -
Вопрос из зала - открывать баг репорт в случае такого сценария?
-
CREATE TABLE main (x String) ENGINE = Memory
insert into main (x) VALUES ('test string 01')
select * from main;
SELECT *
FROM main
┌─x──────────────┐
│ test string 01 │
└────────────────┘
CREATE TABLE main_url
(
x String
)
ENGINE = URL('http://127.0.0.1:9998/', 'JSON')
#Port is not opened!!!
CREATE MATERIALIZED VIEW main_mv TO main_url
(
x String
) AS SELECT x FROM main
insert into main (x) VALUES ('test string 02')
Code: 1000. DB::Exception: Received from localhost:9000. DB::Exception: Connection refused.
select * from main;
SELECT *
FROM main
┌─x──────────────┐
│ test string 01 │
└────────────────┘
1 rows in set. Elapsed: 0.004 sec. -
получается если порт не доступен - то ничего в основную таблицу на запишется
-
Как перейти всеми таблицами оптимально на другой метод сжатия ? Просто перелив ?
-
IMHO надо вешать просто флаг и игнорировать MV - но это не значит что данные надо дропать
-
ALTER TABLE + OPTIMIZE. Можно не переливать.
-
By design.
Insert is successful only if all inserts into dependent materialized views succeeded. -
ну тогда URL Engine бесполезен по дизайну - он не гарантирует 100% коннект
-
надо тогда feature request открыть
-
Привет! Создаю Materialized View и пытаюсь наполнить его, делая вставку из таблицы-источника в саму себя:
CREATE VIEW ...
FROM source_table;
INSERT INTO source_table SELECT * FROM source_table ORDER BY date desc;
Это работает, но через некоторое время этот запрос съедает 128 ГБ RAM и падает. Выглядит так, как будто клик читает исходную таблицу в память, есть ли способ заставить его стримить данные, кроме нарезания запроса по date вручную? -
P.S.: date стоит на первом месте в sorting key, партиционирование по месяцам. Вроде как клик должен сам лить таблицу, сортированную по sorting key, но без ORDER BY появляется огромное количество мёрджей и клик тоже умирает
-
выглядит страшно - из себя в себя. Ну и ответ понятен - order by занимается сортировкой - или относительно быстро в памяти или медленно через диск. Но зачем так? Если вам не нравится POPULATE (мне тоже), то сделайте таблицу Null повесьте аналогичное MV на нее, вставляйте (без order by) туда, MV наполнится. Новые данные пойдут уже пачками нормального размера через основной MV.
-
Да, так точно сработает, спасибо
-
Оказалось, что вставка в себя, несмотря на то, что выглядит страшно, тоже работает - просто нужно было сильно уменьшить max_insert_threads. В графане вижу такую картину
-
-
порядок ровно такой как в SQL - prewhere/where/group by/having/order by/limit Если вам нужна сортировка раньше фильтрации- делайте подзапрос.
Однако ваш вопрос выглядит необычно. Тут все наоборот стремятся фильтрацию вынести вперед, чтобы меньше читать, даже придумали prewhere. А вы по какой-то причине хотите прочитать все данные с диска, отсортировать их, и только потом фильтровать. Зачем?
В подзапрос (на более ранний этап обработки) выносят limit, ровно для того-же - меньше читать и обрабатывать. Но order by???? -
в целом, данные в таблице уже лежат отсортированными по нужным полям, такая последовательность действий нужна для корректной пагинации, т.е. мы хотим запрашивать данные батчами, limit/offset не подходит, поэтому делаем условие по полям, чтобы обозначить, с какого места читать данные и хотелось бы, чтобы данные в разных запросах не теряли порядок, иначе начнется хаос
если нет order by, но таблица отсортирована, всегда ли порядок строкв результате будет одинаков?
Например есть таблица t
a | b
1 | 1
1 | 2
1 | 3
2 | 1
2 | 2
(table with ORDER BY a, b)
И запрос
SELECT a, b
FROM t
WHERE (a > 1) OR (a = 1 AND b > 1);
Всегда ли порядок строк результата будет
1 | 2
1 | 3
2 | 1
2 | 2 -
Точно нет
-
Без ORDER BY нет гарантии сортировки данных в результате запроса
-
там же несколько тредов читают несколько партов и мерджат результат в памяти. Без сортировки не получится получить стабильный результат. А чем не угодил limit/offset?
-
-
Вопрос на ту же тему - order by умеет использовать факт сортировки по первичному ключу? Алгоритмически в этом случае нет необходимости тратить память на сортировку.
-
Настройки | Документация ClickHouse
Настройки distributed_product_mode Изменяет поведение распределенных подзапросов. ClickHouse применяет настройку в тех с
-
да, это проблема. тут пока нет isolation. Придется дедублицировать в REST или даже в клиенте :(
-
технически надо держать константное число буферов чтобы слиять сортированные результаты из многих партиций или многих шардов
-
@den_crane извините что напрямую вас зову, просто не получается никак понять в чем причина этого (кол-во нод в /log не перестает расти, по 20-30 тыс штук в час)
-
Какая версия кх? Вы удалили реплику не дропая таблицы на ней.
-
21.7.6.39
нет, перенес zk-кластер по инструкции https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-zookeeper/altinity-kb-zookeeper-cluster-migration/ -
а сколько реплик кх у вас? все остальное работает?
-
-
-
2. да, сама репликация работает нормально, данные актуальные и инсерты идут нормально
причем даже посмотерть что в этом log не получается, если в консоли zk выполнить /ch/retroview/clickhouse/tables/01/db_name.table_name/log получаешь ошибку WatchedEvent state:Disconnected type:None path:null на клиенте zk и на zk сервере:
2021-11-08 12:14:59,932 [myid:2] - WARN [NIOWorkerThread-4:NIOServerCnxn@364] - Unexpected exception
EndOfStreamException: Unable to read additional data from client, it probably closed the socket: address = /127.0.0.1:51650, session = 0x5000c41cb820005
at org.apache.zookeeper.server.NIOServerCnxn.handleFailedRead(NIOServerCnxn.java:163)
at org.apache.zookeeper.server.NIOServerCnxn.doIO(NIOServerCnxn.java:326)
at org.apache.zookeeper.server.NIOServerCnxnFactory$IOWorkRequest.doWork(NIOServerCnxnFactory.java:522)
at org.apache.zookeeper.server.WorkerService$ScheduledWorkRequest.run(WorkerService.java:154)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829) -
Просто detach/attach таблицы пробовали сделать?
перезагрузить все реплики кх? -
нет, есть документация про это? (что и как лечит detach/attach в случае реплицированных таблиц)
-
Можно попробовать посмотреть в эту сторону
queue_max_wait_ms +
https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings/#max-concurrent-queries-for-userServer Settings | ClickHouse DocumentationServer Settings builtin_dictionaries_reload_interval The interval in seconds before reloading built-in dictionaries. Cli
-
? Просто sql. detach table T; attach table T
Тоже самое что происходит когда кх выключается и включается. Таблица просто исчезнет пока она detach -
очередь будет если запросов больше 100. Если их три то они все равно сразу начнут выполняться
-
Ну а можно зарезать max-concurrent-queries-for-user для power bi до 1 запроса?
-
я не уверен что будет очередь в этом случае. Но проверить то не сложно.
-
правильно ли я понимаю: отключаем таблицу на всех узлах, что после этого должно произойти? кликхаус удалит из зукипера ноды связанные с реплиацией этой таблицы?
-
Нет конечно.
Ладно не парьтесь. Просто пергрузите все ноды кх.
У вас скорее все просто тред который чистит очередь упал или в старом зукипере все еще чистит. -
Добрый день, господа. У меня есть вопрос по поводу Clickhouse.
У меня есть таблица в которую пишется телеметрия с устройств промежутком в 5-10 сек.
Количество записей довольно огромное, поэтому встает необходимость со временем ужимать старые записи (вместо интервала раз в 10 сек до 1-2 часов например).
Скажите пожалуйста есть ли такая функциональность в Clickhouse или как лучше такое реализовать?
Спасибо -
спасибо, помогло
-
Всем привет. Подцепил в SuperSet (опенсорсная визуализация данных) базу ClickHouse
При попытке создать DATASET выдает ошибку. Куда копать не знаю. В ClickHouse не силен. Можете подсказать в чем может быть проблема? -
Добрый день. Так написано же, проверьте конекшн, проверьте базу данных и таблицу. Имеется ли она у вас или нет.
-
Всем добрый день. Сталкивался ли кто-нибудь с ситуацией когда нужно создать арм имейдж под старую версию кликхауса? Сейчас используется yandex/clickhouse-server:20.8.12, но она под армом на локале естественно не работает.
Может кто-нибудь пожалуйста подсказать как сбилдить имейдж с такой же версией кликхауса, но уже под АРМ? -
-
Коннект к кластеру и базе точно есть. Могу выбрать любую другую базу и из нее таблицу. Т.е. те таблицы которые были созданы через экспорт данных из ЯМетрики средствами API не цепляются (как на скриншоте). А те которые были созданы ранее, скажем так, руками, в этом же кластере, цепляются без проблем
-
-
а вы можете посмотреть созданы ли те таблицы, которые вы импортировали в КХ из яндекс метрики?
-
arm сборки не production ready.
вам оно зачем? -
Да. Данные есть, я их вижу в кластере
-
Для девелопменте на арм ноуте.
Продакшн само собой не на арме -
куча вариантов, graphiteMergeTree, ttl groupby, materialized view
-
apple m1 или на самом деле arm ?
-
m1, да
-
Если обобщить то на локале docker compose используется. На линуксовых и интел маках все работает, но вот первый член команды купил себе ноут с м1 и имейдж уже соответственно не работает.
-
ну 20.8 я не видел, надо собирать, а так есть https://hub.docker.com/r/kolsys/clickhouse-server/tags
-
я так же пробовал взять образ `20.10.1.4844-testing-arm` из https://hub.docker.com/r/altinity/clickhouse-server/tags?page=1&name=arm , но на ней ловим ошибки которые явно из-за скачка версии происходят
-
эммм, например?
-
может
-
Code: 342. DB::Exception: Existing table metadata in ZooKeeper differs in primary key. Stored in ZooKeeper: <list_of_fields> (METADATA_MISMATCH)
-
это при прогоне миграций
-
Code: 371, e.displayText() = DB::Exception: Table <table_name> is replicated, but shard #2 isn't replicated according to its cluster definition. Possibly <internal_replication>true<\\/internal_replication> is forgotten in the cluster config.
и такую тоже -
не похоже на разницу в версиях
-
я не понял, это у него на ноуте кластер из 20.10 и там такое?
-
тут нельзя конкретного юзера указать, это распространится на всех пользователей
-
на ноуте докер композом поднимается кластер, да. Версия 20.8.12.
Эта ошибка появляется если пытаешься сбилдить все под 20.10 версией -
это в профиле конкретного пользователя
-
прописать эту настройку ?
-
я не понял ничего
-
ну конечно, что за вопрос
-
при чем тут 20.8 ?
-
у него ноут arm m1 докер 20.10
-
он создает кластер КХ
-
в 20.10
-
и потом миграции падают?
-
Всем привет, кто-то может подсказать как поменять тему документации со светлой на тёмную?
-
Попробую сначала. =)
Есть проект, который в локальном окружении билдится с помощью компоуза. В компоузе поднимается сам проект и два инстанса кликхауса.
Имейдж кликхауса в нем - image: yandex/clickhouse-server:20.8.12
После билда на этом всем создаются таблицы(под словом "миграция" я имел ввиду создание/альтер таблиц)
все это давным давно уже у всей команды на локале работает без проблем.
Теперь к самой проблеме - появился человек с ноутом на м1, у него компоуз уже соответственно ниче не собирает, так как имейдж кликхауса не под арм. Мы попытались найти арм имейдж с такой же версией 20.8.12, но не нашли. Нашли сбилженный под арм `20.10.1.4844-testing-arm`, попробовали на нем, но при создании таблиц ловим ошибки, которые я постил выше.
Мой первоночальный вопрос - как сбилдить арм имейдж для конкретной 20.8.12 версии, чтобы люди на м1 тоже могли локально работать над проектом? -
-
только sql
-
а если ты у себя запустишь сейчас с нуля на 20.8 то всё пройдёт?
-
Да
-
проверил. Не сработало =(
-
вот пример dockerfile который собирает КХ https://hub.docker.com/r/kolsys/clickhouse-server
вам лишь нужно либо замаунтить исходники с 20.8 либо сделать git clone ; checkout прямо в dockerfile -
спасибо, а если роль создана, назначение юзеру роли аналогично только через sql?
-
❤️ Спасибо!
-
да
-
Коллеги, подскажите с проблемой:
Есть источник данных - очередь в rabbitmq, есть PHP обработчик этих данных, которых насыщается, например 10к данными и отправляет их по HTTP интерфейсу в CH,
в это время происходит исключение - проблемы с сетью и ни 200 OK, ни 500 Error не прилетают на PHP HTTP client, от чего PHP отваливается по timeout и снимает ACK с очереди, когда как запрос в CH успешно выполнен. Имеем задвоение данных.
Что мы делаем неправильно и как это делать правильно?
Спасибо! -
таблица Replicated? insert при повторе абсолютно такой же, ровно столько же строк? в тот же самый шард?
-
Не replicated, intert абсолютно такой
задвоенние данных потому что мы не получает ответ от CH из-за проблем с сетью -
>Не replicated,
а какой? -
MergeTree
-
non_replicated_deduplication_window │ 0 │ 0 │ How many last blocks of hashes should be kept on disk (0 - disabled).
cat /etc/clickhouse-server/config.d/dedup.xml
<?xml version="1.0"?>
<yandex>
<merge_tree>
<non_replicated_deduplication_window>500</non_replicated_deduplication_window>
</merge_tree>
</yandex>
+restart -
>задвоенние данных потому что мы не получает ответ от CH из-за проблем с сетью
неполучение ответа это нормальная ситуация и надо строить системы которые к этому готовы и умеют идемпотентность
ну и например у меня балалайка которая в случае любой ошибки включая таймаут просто проверяет сколько вставилось конкретным инсертом -
Согласен полностью. Но по http это давольно сложно.. Вариант с проверкой вставки тоже рассмытриваем..
-
при чем тут http ?
ну и non_replicated_deduplication_window вам однозначно поможет -
Я имел ввиду http интерфейс кликхауса… в смысле, что вот мы отправили инсерт, потерялся ответ, стригирился тайм-аут, и как система должна понять, что данные доставлены и инсерт на стороне кликхауса произошёл, а не например потерялись все данные инсерта?
За дедубликацию спасибо, будем пробовать. -
а как это у вас реализовано?
-
так какая разница HTTP TCP или UDP
забудьте про КХ на секунду.
вот в mysql вы начали транзакцию, записали 100 строк, потом говорите commit; а вам драйвер mysql говорит timeout. И что ? Сколько строк записалось 0 ? 100 ?
и с кафкой тоже самое, запродюсили 1000 месаджей, говорим commit, а он в ответ мы тут попробовали 5000 раз за 30 сек сделать коммит, но фиг знает, может получилось а может нет, разбирайтесь сами. -
ну в КХ дедупликация вставки например есть.
и я уже написал, подперто костылями "ну и например у меня балалайка которая в случае любой ошибки включая таймаут просто проверяет сколько вставилось конкретным инсертом" -
вот я про балалайку и спросил, что это и как она работает, может на гитхабе у вас есть?
-
про дедупликацию топ спасибо!
-
для юзеров созданных через конфиг файлы, RBAC недоступна? нужно дропать юзера из конфига и создавать использую RBAC?
-
аа нет. нету на гитхабе. Там вообще просто баш скрипты и файлы были изначально, потом на чистом jdbc я переписал.
1 это атомарные инсерты https://kb.altinity.com/altinity-kb-queries-and-syntax/atomic-insert/
2 все просто, у каждого инсерта есть уникальный id UInt64, это тупо время + id сервера который вставляет, наверное логично snowflake/sonyflake использовать. И общем можно сделать такой запрос что select count() where .... and id = ? вернет результат за 10мс, там просто свойства партиций и первичного ключа позволяют сделать такой запрос быстро и на клиенте есть информация из полей инсерта.
У других коллег примерно также но там id инсерта коррелирует с первичным ключом, поэтому можно min_max индекс использовать. -
да, но не дропать, а удалять из xml
-
👍🏻👍🏻👍🏻
-
Коллеги, просветите плиз. Можно закинуть результаты выборки в массив и можно получить каждый элемент массива, обратившись к нему по номеру. А аот цикл по элементам массива сделать можно?
-
arrayMap
-
SELECT arrayStringConcat(arrayMap(i -> (x[-i]), arrayEnumerate(extractAll('Misha', '.') AS x))) AS z
┌─z─────┐
│ ahsiM │
└───────┘ -
но в целом arrayEnumerate не нужен и лучше избегать его. Просто arrayMap ( i -> i , массив ) в i будет сам элемент
-
create role test_role;
GRANT create table ON test_db.* TO test_role;
GRANT select ON test_db.* TO test_role;
GRANT insert ON test_db.* TO test_role;
SET DEFAULT ROLE test_role TO test_user;
Role should be granted to set default: Couldn't update user test_user. Successfully updated: none
Не могу юзеру выдать роль, можете подсказать как фиксится? -
????
grant test_role to test_user; SET DEFAULT ROLE test_role TO test_user; ? -
спасибо!
-
-
на ходу в селекте можно
-
вот в селекте и нужно
-
-
rowNumberInAllBlocks()
-
-
это для insert retry ? Чтобы проверить после ошибки что вставилось 50k из 100k и потом попробовать вставить недостающее?
-
там инсерты атомарные, либо 0 либо все.
это чтобы в случае ошибки (включая таймаут) можно было проверить вставилось или нет, чтобы решить повторить инсерт или нет -
с одной стороны инсерты атомарные, а с другой - в проверочном запросе делается select count() - возник когнитивный диссонанс. Вероятно count() был применен просто так, чтобы было что спросить.
-
а так для перфоманса без разницы что спрашивать, плюс просто дополнительная проверка что КХ данные не потерял и инсерт все еще атомарный
-
-- количество строк с ID-шками которые ЕСТЬ в результате подзапроса в мускуль, в разрезе по месяцам ;
select count() cnt,
toYYYYMM(date) month
from table
where id in ( query to engine=mysql table )
group by month order by month;
-- количество строк с ID-шками которых НЕТ в результате подзапросе в мускуль, в разрезе по месяцам ;
select count() cnt,
toYYYYMM(date) month
from table
where id not in ( query to engine=mysql table )
group by month order by month
запросы различаются только "where id in" и "where id not in"
как в один запрос сделать? -
SELECT
count(1),
countIf(1, number IN
(
SELECT number
FROM numbers(3)
))
FROM numbers(10)
Query id: 07dd756e-d71e-4add-8e15-8854879ab006
┌─count(1)─┬─countIf(1, in(number, _subquery6774))─┐
│ 10 │ 3 │
└──────────┴───────────────────────────────────────┘ -
-
Всем привет. Нашел такую вещь, что при передаче в mysql передаются только условия сравнения (>, <, =, !=) и так понимаю что in условие не передается, а фильтруется на стороне клика и нужно делать field = 'value1' or field = 'value2'. У меня таким образом получается очень большой запрос. Как-то можно придумать чтобы результаты подзапроса улетели до mysql и там уже по индексам нормально отфильтровалось?
-
Всем привет!
У нас в яндекс клауде лежат данные в паркете около 150 Гб
Также есть ВМ-ки и Managed Service for ClickHouse и пр.
И вот хотелось бы паркеты засунуть сразу в кликхаус без мороки со спарком и тд.
Если кто-то так делал или знает как такую штуку можно провернуть, то напишите пожалуйста ) -
SELECT * FROM s3('s3//', Parquet)
гуглите -
-
altinity например
-
-
altinity умеет поднимать в aws и gcp (судя по сайту)
-
в Altinity кластере будет возможность сделать пиринг со своим VPC
а так у alibaba-cloud был КХ -
ClickHouse/cloud.md at v21.8.3.44-lts · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Привет, мы запустили закрытое превью такого сервиса поверх AWS. Напиши мне и мы дадим тестовый бесплатный доступ до нашего GA. Мы - это дочерняя компания Яндекса.
-
некий кукбук, который в авс развернёт кластер КХ с зоотехником?
-
-
managed service, как MongoDB atlas
-
-
-
Хм, звучит двояко.
Скорее такая возможность (конкретно VPC endpoint) уже есть и много кто пользуется ею. -
исправил
-
Всем привет! есть таблица
CREATE TABLE employes_full (
`id` Nullable(UUID),
`patient_id` Nullable(String),
`subdivision_id` UUID,
`location_id` Nullable(UUID),
`position` Nullable(String),
`employment_date` Nullable(Date),
`terminate_date` Nullable(Date),
`group_type` Nullable(Int32),
`member_type` Nullable(Int32),
`subdivision_code` Nullable(String),
`subdivision_name` Nullable(String),
`subdivision_parent_code` Nullable(String)
) ENGINE = MergeTree
ORDER BY subdivision_id
есть две вьюхи из кафки
CREATE MATERIALIZED VIEW subdivisions_mv2 TO employes_full (
`subdivision_id` UUID,
`subdivision_code` String,
`subdivision_name` String,
`location_id` UUID,
`subdivision_parent_code` Nullable(String)
) AS
SELECT
id as subdivision_id,
code as subdivision_code,
name as subdivision_name,
location_id,
parent_code as subdivision_parent_code
FROM
subdivisions_queue
CREATE MATERIALIZED VIEW employes_mv2 TO employes_full (
`id` UUID,
`patient_id` String,
`subdivision_id` UUID,
`position` String,
`employment_date` Nullable(Date),
`group_type` Int32,
`member_type` Int32,
`terminate_date` Nullable(Date)
) AS
SELECT
id,
employee_external_id as patient_id,
subdivision_id,
position,
if(
isNull(employment_date),
NULL,
toDate(employment_date)
) AS employment_date,
group_type,
member_type,
if(
isNull(terminate_date),
NULL,
toDate(terminate_date)
) AS terminate_date
FROM
employes_queue
Я ожидал, что обе вьюхи будут заполнять данные в таблице employes_full. В реале только прилетают данные от subdivisions_mv2. Т.е. я делаю что-то не так? или из двух вьюх в одну таблицу нельзя так записать? -
В целом можно, а что в логах есть?
-
SHOW CREATE TABLE employes_queue;
-
ошибок нет
-
select * from employes_queue limit 1
работает? -
да
-
в смысле видно поля? значения?
-
это что-то странное
if(isNull(employment_date), NULL,toDate(employment_date))
в худшем случае можно toDateOrNull(employment_date) as employment_date -
SELECT toDateOrNull('Null')
Query id: c6cc2656-8c44-4e35-9f7d-768e8c7f8706
┌─toDateOrNull('Null')─┐
│ ᴺᵁᴸᴸ │
└──────────────────────┘ -
все получилось, вьюха смотрела на источник из кафки, топик который уже был обработан
-
это помогло)
-
if(isNull(employment_date), NULL,toDate(employment_date))
если x is null тогда null иначе x -- это что странное -
Так это и есть в AWS. Вся экосистема на месте. Приходите.
-
-
Спасибо!
- 09 November 2021 (199 messages)
-
Всем привет. У меня есть distributed table (на ReplacingMergeTree) где находятся 5 ТБ данных на каждой ноде (5 нодов * 5ТБ примерно). Данные партиционированы по дате, TTL год, партиции варируется [1GB, 250GB]. И я хочу обновить одну колонку с String на Point (geo point). И хотел бы у вас спросить как можно это осушествить
-
как можно бы это сделать без проблем с мутациями.
-
Всем привет! Никто не пробовал строить связи между матаданными КХ? Например у меня есть таблица 1, которая через MV пишет в другую таблицу 2. Могу ли я используя какую то системную информацию и вывести информацию что есть цепочка Таблица 1-> MV-> Таблица 2.
-
Добрый день. Для реплицируемой таблицы есть две реплики на двух серверах. Когда один сервер остановлен начинают копиться части, быстро выходим за пределы parts_to_throw_insert и получаем ошибку Too many parts. Как правильно обрабатывать более или менее длительный простой сервера с репликой?
-
Всем привет, а при использовании Buffer какие подводные камни? Хочется иметь прослойку для более менее частой вставки, выглядит как решение.
-
Добрый день.
У меня есть таблица: data, field_1, field_2, field_3. Поля String.
На входе следующий json:
{
"data": {
"k1":"v1",
"k2":"v2",
"k3": {
...
}
},
"filed_1": "v3",
"filed_2": "v4",
"filed_3": "v5"
}
Я бы хотел записать в нее данные следующим образом:
* в поле data - значение ключа data. Все значения в приведены к строкам.
* в поля field_1(2,3) - значения ключей filed_1(2,3) соответственно.
Однако, когда я передаю этот объект на insert c JSONEachRow, то получаю ошибку:
"Cannot parse JSON string: expected opening quote: (while reading the value of key data)"
Как это победить? -
пишите весь JSON в поле JSON
и вставляйте только это поле
а поля data и field_1,2,3 сделайте через DEFAULT JSONExtract...(data, ...)
https://clickhouse.com/docs/en/sql-reference/functions/json-functions/JSON | ClickHouse DocumentationFunctions for Working with JSON In Yandex.Metrica, JSON is transmitted by users as session parameters. There are some sp
-
Коллеги, готовых статей сравнения не нашел, что в КХ быстрее UNION DISTINCT или select distinct и UNION ALL. Есть опыт у кого?
-
Я думаю проще всего будет попробовать самому на ваших данных и даже версии кх :)
-
ну да, получил выигрыш в 15-20 ms на своих объемах данных
-
Можно поинтересоваться выигрыш в пользу последнего варианта?
-
да, UNION DISTINCT чуть быстрее
-
Спасибо
-
-
🏹 Генератор ПЦР!
〽️ Вот как мог бы выглядеть Ваш тест!
🧬 Бот создаст его за считанные секунды.
🚨 Посмотрите уже сейчас.
@fastpcr_bot -
-
Ну отлично тогда, пользуйтесь :)
-
Всем привет!
Подключаюсь к PostgreSQL в соответствии с документацией:
https://clickhouse.com/docs/ru/engines/database-engines/postgresql/
Пробую подключиться, указав схему, как в примере:
CREATE DATABASE db
ENGINE = PostgreSQL('postgres:5432', 'local', 'postgres', 'password', 'billing', 1);
Получаю ошибку:
Code: 36, e.displayText() = DB::Exception: PostgreSQL Database require host:port, database_name, username, password arguments [, use_table_cache = 0]. (version 21.8.10.19 (official build))
Это в документации ошибка или я что-то делаю не так? Как правильно указать схему при подключении? -
А local у вас что значит?
-
-
🏹 Генератор ПЦР!
〽️ Вот как мог бы выглядеть Ваш тест!
🧬 Бот создаст его за считанные секунды.
🚨 Посмотрите уже сейчас.
@fastpcr_bot -
А postgres тогда что?
-
-
-
схему в движок БД добавили только недавно, в 21.8 ещё нет. В движке твблицы должна быть с 21.4
-
спасибо
вставлять только поле со всем json - получилось
поля field_1(2,3) через DEFAULT JSONExtractString заполняться тоже получилось
не получается конструкцией DEFAULT JSONExtractString(json, 'data') получить структуру из ключа 'data' - возвращает пусто
В чем может быть причина? -
вопрос решился изменением JSONExtractString(json, 'data') на JSONExtractRaw(json, 'data')
спс)) -
Прошу прощения, если глупый вопрос, а как тогда подключиться к схеме?
-
не уверен что это можно сделать в вашей версии, 21.9 минимальная
-
-
-
Коллеги, доброго времени
Использую CH в связке с Apach Superset
В Superset есть фильтр, но он с точным соответствием. Для получения поля с условием "Содержит", необходимо создать вычисляемое поле
Помогите, пожалуйста, понять как построить запрос типа - like(url, '%*%'), где вместо * подставляется произвольное значение -
-
Всем Привет. В КХ появился тип MAP, в котором пара ключ/значение хранятся как кортежи (tuple) в массиве, они не отсортированы по ключу, поэтому поиск занимает линейное время. Я хочу понять, почему так было сделано? Есть какая-то причина не делать бинарный поиск по отсортированым ключам (типа как flat_map в boost)?
-
Так вручную можно вставку сделать
-
то есть провести alter с delete и потом вставить те записи, которых нету?
-
Ну да
-
Лучше сделать MV которая через TO пишет в другую таблицу. Тогда легко поддерживать
-
Потому что так сделать было достаточно просто.
А всякие оптимизации вроде на потом запланированы были -
Спасибо. А не в курсе, делает ли это кто-нибудь? У нас есть задача, которой нужен быстрый поиск по ключу/значению. MAP демонстрирует лучшую производительность, чем 2xArray, похоже за счет лучшей локальности. Бинарный поиск бы ее улучшил еще больше.
-
Наверное никто, большие у вас мапы выходят?
-
У нас большой QPS и большие объемы сканирования.
-
Мапы сами небольшие (до 20 элементов).
-
Это не ответ :)
Какого размера у вас мапы в среднем? -
Ну ок,
Просто в случае больших мап бывает имеет смысл посмотреть в разбиении их на несколько мап по меньше. Оно работает лучше если нужно достать 1 колонку -
Да, это сейчас сделано, но для массивов.
-
Ну ок, я понял, просто надо кому-то сделать.
-
Да, либо смотреть в сторону subcolumns и JSON data type это уже делается
-
Еще вопрос, по другой теме. Мы хотим сделать heatmap доступа к партишнам, чтобы попытаться выгрузить холодные парты в облако. Насколько мы посмотрели, через системные таблицы такой информации не получить?
-
Вроде бы это есть в трейс логе, но если его включить, то сильно упадет производительность.
-
Интересный вопрос :)
Можно query_log попарсить думаю на условия в запросах.
Либо в trace_log
> Вроде бы это есть в трейс логе, но если его включить, то сильно упадет производительность.
У нас trace_log включен в продакшене чего и всем клиентам рекомендуем. -
Не так выразился, не trace_log, а лог на уровне trace 🙂
-
Ну, мы рекомендуем так включать.
Может в случае high qps это действительно заметно замедляет, но в обычных условиях все норм -
Если вы готовы к некоторым изменениям кода, то можете попробовать вписывать потенциально затрагиваемые парты у запроса в log_comment запроса
-
Понял, спасибо.
-
Привет! У меня есть 500 миллионов уникальных id в Кликхаусе и таблица в Постгресе на 1.5 миллиарда уникальных id, где каждый день каждому id сопоставляется некоторое значение. Хочется каждый день за приемлимое время эти значения перетаскивать в ту таблицу, которая в Кликхаусе.
Я вижу два варианта -
- внешний словарь (direct) и alias-ы. Буду раз в день делать обычный селект и класть результат выполнения в результирующую таблицу
- etl-ка, которая раз в день будет джойнить таблицы и давать результирующую
Как лучше поступить? -
кто-нибудь поможет? , я не могу понять эту ошибку, которая говорит: DB :: exception: Неверное количество полей в выражении раздела: 1, должно быть: 0., e.what () = DB ::
-
Подскажите, пользовательские функции с какой версии доступны? Пробую пример из документации
CREATE FUNCTION linear_equation AS (x, k, b) -> k*x + b;
и получаю ошибку
Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 8 ('FUNCTION'): FUNCTION linear_equation AS (x, k, b) -> k*x + b. Expected one of: VIEW, LIVE, DATABASE, USER, PROFILE, TEMPORARY, TABLE, ROW POLICY, POLICY, DICTIONARY, QUOTA, OR REPLACE, ROLE, SETTINGS PROFILE, MATERIALIZED (version 21.7.11.3 (official build)) -
-
system.columns
Там есть данные по сжатым и несжатым данным.
SELECT formatReadableSize(sum(total_bytes)), database, table FROM system.columns GROUP BY database, table -
мм, там не данных о размере. возможно parts_columns подойдет
-
why select * from remote not working
-
i am using exact syntax
-
data_uncompressed_bytes+marks_bytes?
-
с использованием точного синтаксиса все еще ошибка
-
why
-
21.10
-
use remote('addresses_expr', db, table, 'superuser', 'password')
-
увы, получаю все время 0.00B
-
wow it worked thanks
-
ну используйту psrts_columns
-
-
-
distributed таблица занимает 0 байт, она ничего не хранит
-
parts_columns это для семейства mergetree
-
-
-
-
а эта таблица создана на этом сервере? вы можете сделать select из нее?
-
-
-
ну вот, как всегда)
чудес не произошло, что просто так данные в системные таблицы не попали -
используйте cluster функцию чтобы посмотреть на всех серверах сразу размер
SELECT formatReadableSize(sum(data_compressed_bytes)), formatReadableSize(sum(data_uncompressed_bytes)), name FROM cluster(‘your_cluster_name’, ‘system’, ‘columns’) WHERE database = ‘’ AND table = ‘’ GROUP BY name -
привет
ребят, кто сталкивался и может помочь, нужен ответ от сапорта clickhouse/яндекс, но через почты они не отвечают
может кто-то уже имел подобного рода проблематику/вопросы и получилось решить, был бы признателен за помощь, спасибо! -
i deleted table and again creating but it gives error saying metadata still available
-
how to clean metadata of zookeeper?
-
Добрый день.
Подскажите разобрались ли вы с вопросом? Столкнулся с такой же ситуацией. Мутация висит, в parts_to_do_names список партов которых нигде нет. -
Добрый, нет, проблему не решили. (благо ALTER TABLE не часто бывают).
Подскажите, тоже реплицируемая таблица? -
Да. При этом мутация висит только на одной реплике. На остальных нет.
Попробую сейчас просто прибить зависшую мутацию -
-
-
а вы где проверяете? в clickhouse-client вроде норм
SELECT
toDateTime(10000, 'Europe/London') AS lon_time,
toDateTime(10000, 'Europe/Moscow') AS mos_time
┌────────────lon_time─┬────────────mos_time─┐
│ 1970-01-01 03:46:40 │ 1970-01-01 05:46:40 │
└─────────────────────┴─────────────────────┘ -
клиент - да, а вот в датагрипе нет, разве он может влиять?
-
датагрип на своей стороне конвертит в свою таймзону поидее
-
очень странное поведение, но похоже вы правы
SELECT
toString(toDateTime(10000, 'Europe/London')) as lon_time,
toString(toDateTime(10000, 'Europe/Moscow')) as mos_time
отдает верный результат -
-
ClickHouse/ClickHouse description changed: v21.11.2.2-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.11.2.2-stable
Release notes:
ClickHouse stable release v21.11.2.2-stableRelease v21.11.2.2-stable · ClickHouse/ClickHouseClickHouse stable release v21.11.2.2-stable
-
колонок много? В смысле какой % данных надо поменять? одну колонку из 100 или 1 колонку из 5 ?
>И я хочу обновить одну колонку с String на Point (geo point)
просто добавляете колонку, с default выражением, дальше alter table update, потом rename колонок. должно работать, проверьте на стейдже -
в системных таблицах видно dependant, тут в чатике был запрос который такое доставал
-
такого быть не должно, это очень странно, все КХ ноды независимы, может нагрузка удваивается на одну ноду, когда вторая в down ?
-
Всем добрый день! Пробую. Не понимаю. ArrayMap возвращает массив. Но как достучаться в цикле до каждого его элемента? Или как построитб цикл по элементам массива каким то иным способом?
-
в доке же все написано. Меняет порядок вставленных строк, ломает дедупликацию вставки, может потерять данные при внезапной потере эл-ва или перезагрузке оси
-
Ну да, вы правы, спасибо.
-
Думал может что то ещё.
-
так понятно?
SELECT arrayMap(i -> concat(toString(i), ' - ahaha'), [1, 2, 3]) AS r
┌─r─────────────────────────────────────┐
│ ['1 - ahaha','2 - ahaha','3 - ahaha'] │
└───────────────────────────────────────┘ -
нет, ничего нового
-
тут надо понять что ваш JSON это не JSONEachRow. JSONEachRow это плоская структура, без вложенностей и в одной строке, без переводов строки.
JSONEachRow конечно быстрее чем JSON -
Если честно, то не очень. Я хотел построить выражение вида select * from fff where ggg =элемент массива. А функции все равно возвращают весь массив целиком.
-
просто .sql файл в котором attach table переложить в любую папку, или мамку, например в /tmp
-
create table XXX(x Int64, ip Array(IPv4)) Engine=Memory;
insert into XXX values ( 1, ['10.10.10.10', '20.20.20.20']);
SELECT
x,
arrayFilter(i -> (i IN (toIPv4('10.10.10.10'), toIPv4('20.20.20.20'))), ip) AS res
FROM XXX
WHERE length(res) > 0
┌─x─┬─res───────────────────────────┐
│ 1 │ ['10.10.10.10','20.20.20.20'] │
└───┴───────────────────────────────┘
SELECT
x,
arrayJoin(ip) AS z
FROM XXX
WHERE z = toIPv4('10.10.10.10')
┌─x─┬─z───────────┐
│ 1 │ 10.10.10.10 │
└───┴─────────────┘
SELECT
x,
ip
FROM XXX
WHERE has(ip, toIPv4('10.10.10.10') )
┌─x─┬─ip────────────────────────────┐
│ 1 │ ['10.10.10.10','20.20.20.20'] │
└───┴───────────────────────────────┘
SELECT
x,
_ip
FROM XXX array join ip as _ip
WHERE _ip = toIPv4('10.10.10.10')
┌─x─┬─_ip─────────┐
│ 1 │ 10.10.10.10 │
└───┴─────────────┘ -
в имя таблицы через .
-
Спасибо большое!
В конечном итоге использовал версию 21.9.5.16, теперь всё ок) -
так нету смысла в этом никакого
потому что это все лежит в 2 двух запакованых .bin файлах, все строки подряд, внутри строк неотсортированные Key
толку-то сортировать, даже чтобы найти конкретную строку надо прочитать 8192 строки целиком, все KEY, все VALUE -
Оно будет загружено в память, да. Но если сканирование ищет конкретный ключ, разве бинарный поиск не будет быстрее (если ключи отсортированы).
Т.е. select id from mapped_table where map_field[‘key_string’] = ‘value’ -
И ключа может не быть в мапе. Тогда бинарный поиск быстрее это обнаружит.
-
ну да все так, мы потратили 10 минут на чтение и распаковку .bin и поиск строки
вы предлагает 3 сек. сэкономить, мудро
в итоге все будет переделано вот так https://kb.altinity.com/altinity-kb-schema-design/best-schema-for-storing-many-metrics-registered-from-the-single-source/#2e-several-baskets-of-arrays
это уже все переделано -
Это если QPS невысок, но у нас он высок, и распаковываем мы намного реже чем читаем.
-
чта? мы всегда распаковываем, ВСЕГДА, КАЖДЫЙ РАЗ
-
хм, ок. Под распаковкой понимается что конкретно? Чтение из памяти?
-
Допустим есть uncompressed cache
-
так им никто не пользуется, он выключен у всех, потому что это не работает. БЫСТРЕЕ каждый раз делать декомпрессию lz4/zstd, на каждое чтение
-
распаковка это декомпресия LZ4
-
намного эффективнее больше держать запакованных данных в кеше чем uncompressed cache, вон чуваки выяснили что если marks держать compressed в marks cache и делать лишние чтения, то это все равно эффективнее
-
В моем случае у нас есть use_uncompressed_cache = 1 (если мы об одном и том же говорим), т.е. я предполагаю, что на вход методам ColumnMap приходит один и тот же разжатый кусок памяти.
-
Можно ссылку на статью?
-
ну вы фантазер, что тут сказать
-
RFC: save memory and improve mark cache hit rate by compressing marks in memory by jorisgio · Pull Request #30434 · ClickHouse/ClickHouse
When using tables with hundreds of billions of rows and 10s of columns, storing all marks in memory can easily use several hundreds of gigabytes. Although mark cache is officially a cache, running ...
-
Я не идеален, но хотелось бы объективных аргументов, чтобы я стал лучше и умней.
-
Всех приветствую! Нашёл интересное поведение
Есть 2 шарда по 2 реплики
сделал rename table (Distributed таблицы) on cluster; на одном шарде (2 репликах) изменения применились, а вот на другом уже 20 минут как висит
сам запрос тоже висит в system.processes. Помимо него, есть выполняющийся процесс optimize table on cluster, но это совершенно другая таблица. Связано ли это и если да, то как? -
ну нету смысла держать uncompressed_cache = 8 GB , мы оперируем терабайтами на каждый запрос, хит рейт = 0
-
Доступ к кешу в сотни раз быстрее, чем к оперативной памяти. Чем больше будем работать с кешем, тем больше throughput. То есть, прочитать немного ОЗУ и с использованием кеша распаковать данные получается выгоднее, чем постоянно читать ОЗУ то там, то сям.
-
select name from system.tables format Null выполняется на том втором сервере?
-
Мир очень разный. В большой компании тяжело притянуть новые технологии, но у нас уже есть КХ и стараемся делать на нем, в качестве general-purpose columnar engine.
-
DB::Exception: Syntax error: failed at position 44 ('FORMAT') (line 2, col 1): FORMAT TabSeparatedWithNamesAndTypes;. Expected one of: end of query, SETTINGS (version 21.8.4.51 (official build)).
-
select name from system.tables
-
Да, всё отдаётся. Запрос выполнился как только завершился optimize
-
который запрос?
-
rename table on cluster
-
обновляйтесь на 21.8.10.19
-
-
Понял,спасибо
-
Коллеги, всем огромное спасибо за помощь. Изучая присланные поимеры поймал просветление: select * from table where c1 in ( select c1 from table where <условие> order by <условие доп>) and c2 in ( select c2 from table where < условие> order by <условие доп). Работает. Но все-таки можно это сделать как то изящнее, с помощью массивоа напртмер?
-
это странное поведение. В чем разница MAP и 2 Array ? Вы как к Array обращаетесь?
В общем я получил ускорение в 20 раз, сделав 20 пар Array, вместо 1 пары -
value_arr[indexOf(key_arr, ‘key’)]
-
чудеса, MAP не отличается принципиально, они хранятся одинаково на диске
я тестил пол года назад, мап проигрывал
https://gist.github.com/den-crane/7a59c05db1c51631bd595900e44f3271Map benchmMap benchm. GitHub Gist: instantly share code, notes, and snippets.
-
Тупл хранит значение в двух колонках?
-
(я в коде не оч)
-
-
да, это видно прямо в ls -l
-
для каждого элемента тупла mrk, bin файлы
-
tuple(a,b,c) это минимум 6 файлов
-
Ок, тогда может быть дело в дополнительных проверках для массива. has(keys, ‘x’) and values[indexOf(…)]
-
Т.к. ключа может и не быть.
-
так а зачем проверка? Ну и я обхожу массивы ArrayFilter потому что один ключ может быть несколько раз (у меня)
-
У нас один ключ - одно значение. Лямбда я не проверял, но на других кейсах производителность была не очень.
-
Предположим у меня один из двух узлов остановлен. Из двух реплик таблицы доступна только одна. Произвожу вставку данных на оставшийся узел, умеренными пачками, скажем раз в 10 секунд по несколько сотен или тысяч записей. Будут ли вновь образованные части таблицы укрупняться в рамках активной реплики до восстановления репликации?
-
конечно будут
-
да нет никакой разницы под капотом, map, arrayFilter, indexOf
-
Это хорошо, а то оказался в недоумении. Возможно у меня что-то заклинило в ZK, теперь уже не разберусь. Пришлось конвертировать реплицируемую таблицу в обыкновенную. Далее настрою репликацию заново.
-
есть тонкий момент, что если реплика хочет скачать парт с другой реплики и этот парт нужен для последовательного мержа, то да может быть проблема, но очень редкий corner case.
и это решаемо. И в современных КХ, КХ сам это исправит -
Может это значимо, по результатам сбоя в ZK в узле .../tables/{uuid}/01/replicas/{replica}/queue скопилось более 100 тыс. элементов для одной реплики и более 50 тыс. для другой.
-
Всем привет. Подскажите, пожалуйста, а кликхаус умеет только с unix timestamp in seconds работать? Я только две функции нашел, toDateTime и FROM_UNIXTIME и все работают с секундами, а хотелось бы из миллисекунд перевести в timestamp. Получается, только на 1000 делить, стандартных функций нет?
-
это ни при чем тут , надо смотреть таблицу system.replication_queue
-
а в чем разница ? intDiv ( , 1000 ) ,
можно заморочится и перевести по другому, но в реальности это не про время вообще, это про числа
тип DateTime64
функции
toUnixTimestamp64Milli
toUnixTimestamp64Micro
toUnixTimestamp64Nano
fromUnixTimestamp64Milli
fromUnixTimestamp64Micro
fromUnixTimestamp64Nano¶ -
Похоже это представление и отражает очередь из ZK. В момент сбоя были те самые 100 тыс. записей.
-
нет никакой очереди в ZK все вообще не так
-
SELECT
database,
table,
type,
any(last_exception),
any(postpone_reason),
min(create_time),
max(last_attempt_time),
max(last_postpone_time),
max(num_postponed) AS max_postponed,
max(num_tries) AS max_tries,
min(num_tries) AS min_tries,
countIf(last_exception != '') AS count_err,
countIf(num_postponed > 0) AS count_postponed,
countIf(is_currently_executing) AS count_executing,
count() AS count_all
FROM system.replication_queue
GROUP BY
database,
table,
type
ORDER BY count_all DESC -
Спасибо. Да просто с приложения на андройде пишется в миллисекундах значение в базу, использовать fromUnixTimestamp64Milli будет читабельней, чем делить и потом оборачивать в FROM_UNIXTIME. В документации не нашел этих функций, видать искал плохо.
-
тут две проблемы.
1. В КХ два типа для времени DateTime (секунды от 1970 - UInt32) и DateTime64 (фракции секунды). Естественно второй занимает в 2 раза больше места в среднем и в 2 раза медленее. Поэтому надо решить что будем хранить.
2. ETL, когда передаете из приложения (или из ETL) время в миллисекундах вместо секунд, вы просто тратите электричество и bandwidth -
Спасибо за запрос. Еще уточню. Из документации: "При репликации, по сети передаются только исходные вставляемые данные. Дальнейшие преобразования данных (слияния) координируются и делаются на всех репликах одинаковым образом."
Отсюда делаю вывод, что при недоступности целевой реплики скопировать на нее исходные данные можно только сохранив эти данные в некоторой очереди и в исходными кусками. Как я понял, вы говорите, что слияние будет производиться до починки реплики. Полного понимания у меня пока нет. -
Спасибо за развернутый ответ. Я вот в проде вижу, что тип у этого поля с датой Int64. Даже не беззнаковый тип. Возможно, есть смысл исправить.
-
нет, не совсем так.
то что видно в system.replication_queue имеет мало отношения к /{replica}/queue потому что replication_queue это отображение памяти КХ и она пестраивается каждую секунду на основе данных из списка партов и данных из ЗК
в ZK /{replica}/queue/ некоторое время в очереди будут добавляться команды, длина тех очередей ограничена
SELECT *
FROM system.merge_tree_settings
WHERE name LIKE '%replicated_logs%'
Query id: 47d194d0-8682-4421-a74a-9eafdfc6d4a2
┌─name────────────────────────┬─value─┬─changed─┬─description────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─type───┐
│ max_replicated_logs_to_keep │ 1000 │ 0 │ How many records may be in log, if there is inactive replica. Inactive replica becomes lost when when this number exceed. │ UInt64 │
│ min_replicated_logs_to_keep │ 10 │ 0 │ Keep about this number of last records in ZooKeeper log, even if they are obsolete. It doesn't affect work of tables: used only to diagnose ZooKeeper log before cleaning. │ UInt64 │
└─────────────────────────────┴───────┴─────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┘
есть клинер который чистит https://github.com/ClickHouse/ClickHouse/blob/master/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp
там есть логика , если реплика lost (неактивна) то чистить ее очередь.
После долгого downtime реплика при старте знает что ее log_pointer сильно отстал от жизни, и ее queue/ почищена, и реплика начинает процедуру синка ее партов со списками партов в зукипере у других реплик, удаляет queue/ и начинает после синка с белого листа (таже самая процедура как при добавлении чистой реплики)
клинер работает периодически, поэтому в зк в /queue/ может быть больше чем 1000
у меня реплики периодически ломаются и иногда разрывается связь между датацентрами ( на часы) , иногда сервер выключен несколько часов, в 99% случаев это вообще не требует ручного вмешательства и никто из потребителей КХ не замечает что что-то не так. -
[ ] marks optional paramters in a documentation
https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form Optional items enclosed in square brackets: [<item-x>].Backus–Naur formIn computer science, Backus–Naur form (/ˌbækəs ˈnaʊər/) or Backus normal form (BNF) is a metasyntax notation for context-free grammars, often used to describe the syntax of languages used in computing, such as computer programming languages, document formats, instruction sets and communication protocols. They are applied wherever exact descriptions of languages are needed: for instance, in official language specifications, in manuals, and in textbooks on programming language theory.
-
для compaсt партов хранятся нули, потому что в compaсt партах все колонки хранятся как одна
-
metadata is stored for 8 minutes after drop
https://kb.altinity.com/engines/altinity-kb-atomic-database-engine/ -
этот парт есть в ЗуКипере.
мутация назначается по данным ЗК.
в современных КХ, сервер автоматически создает парт из 0 строк для таких потерянных партов и проблема решена -
А современный насколько? У нас 21.8.8.1-altinity-stable
-
Надо просто понять что TZ это просто метаданные колонки (и даже не колонки в таблице) , а колонки select-а и insert-а
JDBC драйвер 100500 раз переделали уже, в будущем JDBC драйвер будет показывать время в TZ колонки селекта а не в TZ jvm.
но JDBC драйвер на самом деле ничего не показывает, он передает в java как число секунд, а java при рендеринге в строку, конвертирует в TZ jvm
в КХ все значения DateTime лежат в UTC (число секунд от 1970), TZ это просто намек как парсить и рендерить строки.
дефолтная TZ задается 3 способами, в конфиге, через env переменную TZ, через таймзону сервера (линукс) -
И я правильно понял ваше сообщение что современный КХ эту ситуацию должен сам разрулить? Ибо мутация пару дней висела 😊
-
detach table / attach table попробуйте
https://github.com/ClickHouse/ClickHouse/pull/25820
в 21.8 есть уже Better handling of lost parts for ReplicatedMergeTree tables. Fixes rare inconsistencies in ReplicationQueue. Fixes #10368. #25820 (alesapin).Replace lost parts with empty parts instead of hacking replication queue by alesapin · Pull Request #25820 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the cha...
-
да правильно
-
всем привет, делаю сейчас полную репликацию данных с одной ноды КХ на другую, хотел воспользоваться ограничением канала, появившимся в 21.7, но iftop показывает что утилизируется весь канал, может быть я что-то не так задал?
<default>
<max_memory_usage>20000000000</max_memory_usage>
<load_balancing>random</load_balancing>
<max_replicated_sends_network_bandwidth_for_server>500000000</max_replicated_sends_network_bandwidth_for_server>
<max_replicated_fetches_network_bandwidth_for_server>500000000</max_replicated_fetches_network_bandwidth_for_server>
</default> -
Настройки | Документация ClickHouse
Настройки distributed_product_mode Изменяет поведение распределенных подзапросов. ClickHouse применяет настройку в тех с
-
-
скорее всего нужен рестарт
-
-
-
-
Подскажите, пожалуйста, как можно сделать так, чтобы в Табиксе пользователь видел только те базы, к которым ему прописан доступ? А остальные не видел. В мануале нашел только ограничение получения данных из таблицы...Если можно с примером. (Соло установка, не кластер) Спасибо
-
??????
100000000 / 1024 / 1024 * 8 = 762.939453125 -
-
а ОК, можно дописать в доку
-
похоже на правду )
-
>к которым ему прописан доступ
а каким образом прописывали? XML ? SQL ? -
Xml в users.xml
-
для XML не работает
-
В сторону sql settings копать?
-
show databases;
┌─name────┐
│ arc │
│ colddb │
│ db │
│ default │
│ dict │
│ dw │
│ lf │
│ system │
│ test │
│ test_g │
└─────────┘
create user test identified by 'pass1234';
grant select on test_g.* to test;
$ clickhouse-client -u test --password pass1234
show databases;
┌─name───┐
│ test_g │
└────────┘ -
Спасибо!
- 10 November 2021 (149 messages)
-
Materialized view aggregation field query why must declare, otherwise will report an error
-
дисковый кеш ведь и хранится в ОЗУ, мне кажется вы путаете с процессорным кешем, который имеет микроскопический размер
-
не будет тут бинарный поиск быстрее. я даже больше скажу, тут может быть дешевле сравнить элемент со всеми ключами вместо выхода из цикла при успехе :)
-
Не могу найти с какой версии в клике появился SELECT DISTINCT ON? Чёт на 20.8.18 не очень работает
-
Очень не работает, даже так я сказал бы)
-
Received exception from server (version 20.8.18):
Code: 46. DB::Exception: Received from 192.168.100.14:9000. DB::Exception: Unknown function ON. Maybe you meant: ['or','in']. -
Через год. В 21.8
это тупо алиас на limit by -
Вах спасибо ;) Переделал под limit by как хотел)
-
При распаковке утилизируется одна и та же область памяти (буфер декомпрессора), которая попадает в кеш. Соответственно, доступ к такой памяти осуществляется без задержек в отличие от чтения закешированных данных из прлизвольной области в ОЗУ. Поэтому выигрыш здесь может быть достаточно весомый, так как инструкции процессора не простаивают в ожидании поступления данных из озу, а получают их из кеша процессора.
-
сам процесс распаковки идёт медленней чтения из озу, поэтому ни о каком выигрыше, тем более в сотни раз, тут говорить не приходится
-
Я правильно понимаю, что изменения кодека сжатия будут применяться при мерджах данных, ну то есть при вставке в патрицию ?
ALTER TABLE table_test MODIFY COLUMN column_test CODEC(ZSTD) -
да, будет применяться, для новых партов
-
То есть чтобы изменить всё нужно OPTIMIZE TABLE table FINAL
-
Я проверил, да
-
ну вообще как бы бранч предикшен в CPU и спекулятивное исполнение (пока идет обработка данных из L1, идет подсос данных в L2 и L3 ... и если буфер действительно в CPU кеш пролазит, то за счет branch prediction идет подсос в cpu кеш и меньшее кол-во cpu cache miss соответственно общее время исполнения быстрее...
-
branch prediction на декомпрессии не играет существенной роли, кмк
-
и дело не в объемах, хитах и промахах, а в непредсказуемом потоке данных
-
Хотелось бы тестов, я тоже сомневаюсь, что общая компрессия даст какой-то буст за счёт локальности
-
а тесты - штука не быстрая, я зарядил на 100М записей, надо подождать
-
Есть кликхаус версии v20.5.4.40-stable. Он работал стабильно больше года не считая редких перезагрузок сервера. Недавно он упал. Был поднят без проблем. Хочу узнать в чем может быть причина падения.
1. Таблицы system.crash_log нет.
2. В содержимом папки /var/log/clickhouse-server/ ничего обнаружить не удалось. Только clickhouse-server.log есть временной промежуток в который нет записей. Просто они перестают писаться резко на какой-то момент, и все.
Не подскажите куда еще можно смотреть? -
Всем привет. Подскажите, пожалуйста, какой метод ClickHouseRowBinaryStream стоит взять для корректной записи в поле DateTime64(6) ? Я каких-то специфичных в последней версии не вижу. А writeDateTime под капотом берет UInt32.
-
Messages/kernel log? Вдруг там оом пришёл или ещё чёт отъехало
-
Привет. pull request 24921 refresh материализованного представления - запланирован в roadmap 2021. Какой сейчас есть способ обновить материализованное представление, если в исходной таблице поменялись данные?
-
Я удаляю MV и делаю по новой, но у меня таблица отдельно от MV
-
плохое состояние базы получается в интервале времени от удаления старого до окончания создания нового. Наверное стоит новые данные писать в другую таблицу, а потом делать EXCHANGE TABLES
-
А у нас не постоянно льются данные
-
место на сервере есть?
там должен быть еще /var/lib/clickhouse-server/clickhouse-server.err.log
если вы никакие настройки не меняли и не отключали его -
там нет ничего относительно времени предполагаемого падения
-
коллеги, подскажите. нужно сделать последовательность выпуска продукции, марки в последовательности могут повторяться, важна хронология. Если я сделаю просто groupby по марке, то потеряю хронологию, а как сделать, чтобы при группировке учитывалась хронология с учетом повторяющихся марок?
-
groupArray попробуйте использовать для марок
-
Можно поподробнее, а то из оф. информации не совсем понятно
-
Например у вас есть Время, Марка в таблице.
Вы пишите
groupArray(Марка)
а снизу group by (время) , и вы получаете последовательность марок -
journalctl --xe -u clickhouse-server --no-pager --since="YYYY-MM-DD HH:mm:ss" --until="YYYY-MM-DD HH:mm:ss"| less
вы уверены что время падения правильно определили?
SELECT now() - uptime();
проверьте -
-
-
Тут интереснее насколько постоянно они читаются. Разумеется если аналитики в одном часовом поясе, то проблемы нет.
-
Ссылка в запросах идёт на таблицу, а не на MV.
-
не очень понятно что за чекалка...
но если у вас какой то кастомный сетап, может сначала надо разобраться в его деталях? -
-
-
разумеется мы говорим о dest таблице с аггрегированными данными. Если пересоздание занимает час, а Аналитики сидят в Москве и SF, то после удаления таблицы они целый час будут страдать (точнее повышается вероятность, что они столкнутся с проблемами). В случае постоянно работающего сервиса все ещё хуже. Поэтому правильно делать - сначала создание новой таблицы, а потом exchange.
-
Ну когда я меняю саму табличку в MV, я так и делаю.
-
Здравствуйте, можно ли просто удалить .bin файлы в папке distributed table?
-
Здравствуйте, использую табличную функцию s3:
s3(path, [aws_access_key_id, aws_secret_access_key,] format, structure, [compression])
Получаю ошибку:
Code: 499, e.displayText() = DB::Exception: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Bad URI syntax: bad or invalid port number: 0 (version 21.8.3.44 (official build)): While executing S3 (version 21.8.3.44 (official build)) -
как url указываете?
-
s3://bucket_name/home_folder/data
-
-
можно. Но это незавершенные инсрты.
-
Это часть кх. Он сам запускается если его уронили или он упал.
-
can anyone tell me how can i create a user which can be accessed via loadbalancer in altinity file
-
Нету datetime64? Странно.
Вообще это decimal64. Можно писать как decimal64 -
in k8s cluster
-
Спасибо
-
look to
kubectl explain chi.spec.configuration.users
https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#specconfigurationusersclickhouse-operator/custom_resource_explained.md at master · Altinity/clickhouse-operatorThe ClickHouse Operator creates, configures and manages ClickHouse clusters running on Kubernetes - clickhouse-operator/custom_resource_explained.md at master · Altinity/clickhouse-operator
-
create table sale(ts DateTime('Europe/Moscow'))
1. подскажите пожалуйста как так выходит что на выходе разные даты?
2. ну и время в разных часовых поясах одинаковое? -
Datagrip?
-
да
-
ну тут в чате уже много раз проблема была обозначена, поищите по поиску, скорее всего в jdbc драйвере ошибка.
-
Добрый день. Подскажите. Не получается изменить параметр max_ast_elements через запись в users.xml. Какое бы значение не задавал дефолтное в 50000 не меняется. Рестарт не помогает.
-
вы же в профиль юзера добавляете?
-
<profile><default>
-
profiles*
ну значит все должно быть верно, и насколько я помню, то перезагрузка не нужна -
спасибо.
-
не за что, если не уверены, можете показать конфиг, тут есть люди, которые могут подсказать)
-
реально спасибо. опечатлся в профилях
-
все же очевидно.
Когда в jdbc мы имеем число секунд + tz Moscow мы можем применить TZ и перевести это в другую дату
Когда в jdbc мы имеем число дней +tz Moscow , как мы можем применить TZ ? мы не знаем времени, мы не знаем надо менять дату или нет. -
DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name.
i have 4 pods 2 replicas and 2 shards i dumped data into distributed table and whenever i try to query data via disteibuted table it gives this error with 3 pods and one of the pod gives query outpu succsfully
i try to query from loadbalancer ip so it connects to diffrent pods each time
how can i solve this error i think they want default password but i havent given any password for default anywhere -
i am using altiny oprator
-
did you change password for default user?
-
no i didnt
-
нууу, так как-то не честно ведь:
1. в основе расчета дата со временем;
2. принимает 2е значение и не жужжт toDate(ts,'Europe/Moscow') -
эм. Вы неправильного хотите. Вы хотите чтобы часть делал Сервер и отрезал время, а конвертирует у вас Клиент которому время уже отрезали.
просто конвертируйте прямо на сервере тогда - toString( , 'Moscow') -
я думал (и пока продолжаю так думать) что запрос выполняется на сервере, и там все данные в секундах и с TZ - поэтому ожидаю от сервера верно вернет, а клиент да, уже может переврать при отображении, но т.к. дата (наверно строкой пришла) то тут нечего перевирать.
-
OK. какая таймзона у компа и что возвращает через jdbc
SELECT
timezone(),
toDateTime('2021-01-01 23:00:00', 'UTC') AS ts,
toDateTime(ts, 'Europe/Moscow') AS dt,
toDate(ts, 'Europe/Moscow') AS t
Query id: de2264f9-da78-4565-8f0b-bb5a5fa89dfa
┌─timezone()─┬──────────────────ts─┬──────────────────dt─┬──────────t─┐
│ Etc/UTC │ 2021-01-01 23:00:00 │ 2021-01-02 02:00:00 │ 2021-01-02 │
└────────────┴─────────────────────┴─────────────────────┴────────────┘ -
Я вижу через JDBC
timezone() ts dt t
Etc/UTC 2021-01-01 19:00:00 2021-01-01 19:00:00 2021-01-02
и это правильно. -
Всем привет! Подскажите пожалуйста, а как можно посмотреть прогресс выполнения мутации? Уже достаточно давно висит в таблице system.mutations c is_done=0. В таблице processes пусто. Либо как понять, почему мутация не стартанула? Заранее спасибо!
-
и toString(ts) он мне вместе со временем конвертит :) а мне собственно только дата нужна, т.е. еще и из стринга нужно будет вырезать кусок?
-
OK. какая таймзона у компа и что возвращает через jdbc
SELECT
timezone(),
toDateTime('2021-01-01 23:00:00', 'UTC') AS ts,
toDateTime(ts, 'Europe/Moscow') AS dt,
toDate(ts, 'Europe/Moscow') AS t -
в system.mutation и system.merges
-
Europe/Moscow,2021-01-01 23:00:00,2021-01-01 23:00:00,2021-01-02
-
аааа,
какая таймзона у компа === ВАШЕГО ДЕСКТОПА
вы сами в какой TZ ? -
MSK (Europe/Moscow)
-
тогда какая-то лажа действительно.
У JDBC есть настройка use_server_time_zone_for_dates, она false должна быть -
вот так на CH еще у меня
-
-
а если в true поставить меняется?
-
тут вроде стало верно
-
для меня например
SELECT
toDateTime('2021-01-01 23:00:00', 'UTC') AS ts,
toDateTime(ts, 'Europe/Moscow') AS dt,
toDate(ts, 'Europe/Moscow') AS t
2021-01-01 19:00:00.0 --- время в атлантической канаде
2021-01-01 19:00:00.0 --- время в атлантической канаде
2021-01-02 --- дата в москве
и это все ожидаемо -
какая версия jdbc ?
-
0.3.1
-
проблема в крайних датах после 21:00 когда TZ выкидывает дату на следующий день (19:00 будет все ок для TZ MSK)
-
тут стало еще печальнее
-
Друзья, что подскажете по замене/как заставить работать pandas to_sql?
Сама по себе она не справляется с созданием таблицы. А интерес именно в избегании прописывания способа хранения, иногда просто хочется загнать табличку в базу (MergeTree() без ключей с автоматически определяемыми типами), чтобы с ней уже поработали другие люди или BI-инструмент. -
ну возьмите 0.2.6 и проверьте на нем
-
пробовал эти - другие jetBrains не видит
-
а попробуйте в dbeaver с тем же 0.3.1
-
тут только 0.2.6 видит из коробки. и ответ похож на правду:
toString(ts) |ts |toTypeName(ts) |toDate(ts, 'Europe/London')|toDateTime(ts, 'Europe/London')|toDate(ts, 'Europe/Moscow')|toDateTime(ts, 'Europe/Moscow')|
-------------------+-----------------------+-------------------------+---------------------------+-------------------------------+---------------------------+-------------------------------+
2021-11-09 21:16:54|2021-11-09 21:16:54.000|DateTime('Europe/Moscow')| 2021-11-09| 2021-11-09 21:16:54.000| 2021-11-09| 2021-11-09 21:16:54.000| -
в dbeaver на 0.3.1 МСК => Ок, Лондон не Ок - они равны - все как будто с TZ MSK
-
вас невозможно понять, Лондон это что? Вы у себя у компа в винде поставили Лондон?
внимательно перечитайте вот это https://t.me/clickhouse_ru/243338Denny Crane [Starship Captain at Altinity (NB,Canada)] in ClickHouse не тормозитдля меня например SELECT toDateTime('2021-01-01 23:00:00', 'UTC') AS ts, toDateTime(ts, 'Europe/Moscow') AS dt, toDate(ts, 'Europe/Moscow') AS t 2021-01-01 19:00:00.0 --- время в атлантической канаде 2021-01-01 19:00:00.0 --- время в атлантической канаде 2021-01-02 --- дата в москве и это все ожидаемо
-
SELECT toString(ts), ts, toTypeName(ts), toDate(ts,'Europe/London'), toDateTime(ts,'Europe/London'), toDate(ts,'Europe/Moscow'), toDateTime(ts,'Europe/Moscow')
-
ну так это логично. Объясняю еще раз.
SELECT
toDateTime('2021-01-01 23:00:00', 'UTC') AS ts,
toDateTime(ts, 'Europe/Moscow') AS dt,
toDate(ts, 'Europe/Moscow') AS d
ts: 2021-01-01 19:00:00
dt: 2021-01-01 19:00:00
d: 2021-01-02
с сервера мне внутрь в jdbc приходит число 1609542000 -- это UTC и конвертируется в мою таймзону в макоси == 2021-01-01 19:00:00
с сервера мне внутрь в jdbc приходит число 18629 -- это число дней от 1970 года, это 2021-01-02 -
Дааа! я уже вот так проверил и понял toString(toDateTime(ts,'Europe/London')) - спасибо!!!
-
Мейнтенер jdbc собирается кстати это все изменить. И передавать в java тип time с TZ 1609542000+Europe/Moscow.
Проблема в том что каждое приложение само должно решить как показывать 1609542000+Europe/Moscow,
dbgip может начать показывать в таймзоне Канады и снова покажет 2021-01-01 19:00:00 ,
а dbeaver захочет делать такжк как КХ клиент и будет показывать 2021-01-01 23:00:00 -
интересно, мы пишем как Long, но у нас DateTime64(3)
-
переходы здесь вообще не при чём. мы либо читаем из памяти уже разжатые данные, либо читаем сжатые и распаковываем целый блок перед обработкой
скорость памяти на линейное чтение - 100-200 ГБ/с
скорость распаковки LZ4 - скажем 2.5 ГБ/с на ядро
итого 20 ядер могут распаковать 50 ГБ/с, т.е. даже потратив все вычислительные ресурсы, мы не получим той скорости, что при чтении готовых распакованных данных
хотя для integer compression с использованием simd распаковка может быть гораздо быстрее
и как я понимаю, даже при медленной распаковке выгодней хранить данные сжатыми, чтобы их больше влезло в озу -
DateTime64 это Decimal, а Decimal это просто кол-во фракций, то есть для Decimal64(3) .001 хранится как 1, т.е. для DateTime64(3) это одна милисекунда.
echo "select toDecimal64('1636568096.195',3) format RowBinary"|clickhouse-client |hexdump
0000000 5dc3 0b0f 017d 0000
0000008
echo "select toDateTime64('2021-11-10 18:14:56.195',3) format RowBinary"|clickhouse-client |hexdump
0000000 5dc3 0b0f 017d 0000
0000008
echo "select toUnixTimestamp64Milli(toDateTime64('2021-11-10 18:14:56.195',3)) format RowBinary"|clickhouse-client |hexdump
0000000 5dc3 0b0f 017d 0000
0000008
в смысле в RowBinary это один и тот же набор байт. -
Здрасте
https://www.microway.com/knowledge-center-articles/performance-characteristics-of-common-transports-buses/
100-200 это минимум 6-8 канальная память и машина может иметь несколько сотен тредов в таком случае.Performance Characteristics of Common Transports and Buses - MicrowayPage Discussion History Articles > Performance Characteristics of Common Transports and Buses Memory The following values are measured per CPU socket. They must be doubled or quadrupled to calculate the total memory bandwidth of a multiprocessor workstation or server. For … Continue reading →
-
так сейчас все серверные платформы имеют 6-8 каналов, 4 канала - это уже удел hedt, нет?
если взять 64 ядра по 2.5 ГБ/с - это будет 160 ГБ/с, как раз скорость ОЗУ на такой машинке. вероятно, с учётом SMT будет раза в полтора больше. но ресурсов на вычисления уже не будет оставаться
если 2 cpu - то как я понимаю, будет и два 8-канальных контроллера памяти, они же в cpu встроены -
ГБ/с это что? биты или байты ?
-
Обычно если "Б" большая то байты, а если маленькая то биты
-
байты. я придерживаюсь той же религии, что и Максим :)
-
всякие подсчёты с шинами и попугаями это очень большая теория. те же 64 ядра - там как минимум 4 нума нод... стоит одному потоку читать данные "неоттуда" и все уже в разы хуже.
сидеть и просто умножать нельзя... оно вообще не так работает (разве что если вы тупо параллельные матем. подсчёты не делаете) -
я так долго читал эту переписку и до сих пор не понял как uncompressed cache может быть выгодней в общем случае, учитывая что колоночные данные обычно сжимаются минимум 5-10 раз. есть конечно 5% случаев когда данных так мало что оно все влезает, но тогда смысла использовать КХ не так много... либо данные так ужасно сжимается (тут было у человека когда после мердж общий размер увеличивался), но в основном всегда лучше иметь больше данных в кеше ФС.
-
Если берем планки по 2666MHz, то там уже 170 для 8 каналов в теории, а на практике судя по этой таблице будет еще меньше на 30ГБ
Плюс подозреваю, тк кх данные все таки не в /dev/null пишет, то "параллельная" запись в память может чтение замедлять. -
А вообще вроде была либо статья на эту тему, либо видео от авторов кх.
Они там объясняли почему LZ4 почти "не тормозит" -
Изза чего может быть такое? Если вызываю только select то работает нормально. Если в составе View то происходит ошибка "Cannot detect left and right JOIN keys. JOIN ON section is ambiguous.: While processing service_id = t2.id. (INVALID_JOIN_ON_EXPRESSION) (version 21.10.2.15 (official build))
" -
надо делать либо бакеты и хранить куски Map в разных файлах
либо делать Native/Parquet и хранить Map как подколонки ( последовательности key из разных строк ) с возможностью прыгать в следущую дощечку (как в compact формате) -
view не поддерживают алиАсы таблиц, пишите без алиасов
-
-
как бы её найти? я видел только об ускорении распаковки. хотя если речь о том, что лучше хранить в озу в 5 раз больше данных и постоянно разжимать их - то это и так понятно
-
Мне кажется, что если научить кх доставать только определенные ключи на моменте "расжатия" или создания колонки мапы, то этого уже будет достаточным для 90% случаев.
Те подобный запрос
SELECT map['aa']
Не будет полностью собирать всю мапу, а только один ключ. -
а всё понял это имя для джоина
-
-
да, это теоретический лимит производительности, на практике кпд<100%
я исхожу из того, что данные распаковываются кусками и тут же употребляются, так что дальше L2$ они не провалятся -
последний подсчёт относится к наиболее выгодному для lz4 варианту - когда число ядер, делённое на число каналов, максимально - один сокет с 64 ядрами и 8 каналами озу. с учётом кпд озу, скорость линейного чтения будет заметно меньше 200 ГБ/с
-
Возьмите процессор, собственно только эпики есть 64 сейчас. Они внутри поделены на ccp. Посмотрите сколько там нума нод. И посмотрите тесты реальные по времени доступа и пропускной способности когда данные разбросаны..
-
насколько я в курсе, у последних эпиков 8 чипов с ядрами и 1 чип с контроллером памяти. это одна нума нода, 8-канальная, на все 64 ядра. разве не так?
-
в первом поколении было иначе
-
Необычные случаи оптимизации производительности на примере ClickHouse / Алексей Миловидов (Яндекс)
Приглашаем на Saint HighLoad ++ 2021 20 и 21 сентября 2021, Санкт-Петербург, DESIGN DISTRICT DAA in SPB Программа, билеты и подробности - https://clck.ru/VmKaW -------- HighLoad++ Весна 2021 Крупнейшая профессиональная конференция для разработчиков высоконагруженных систем 17 и 18 мая 2021. Москва, Крокус-Экспо Тезисы и презентация: https://www.highload.ru/spring/2021/abstracts/7653 Правда ли, что распаковать данные — быстрее, чем просто скопировать их? Ответ: "нет и да", а вообще всё сложнее. Как быстрее всего транспонировать Structure of Arrays в Array of Structures и зачем это нужно? Как лучше читать файлы — read, O_DIRECT, mmap, io_uring? Ответ снова нетривиален. Почему MergeTree-таблицы в ClickHouse могут работать лучше, чем in-memory-таблицы? ... -------- Нашли ошибку в видео? Пишите нам на support@ontico.ru
-
Это виртуально объединено (можно в биосах выставлять). Физически задержки разные. Межсокетные больше. Внутрисокетные тоже разные. Любой дев гайд под амд смотрите ну или на форумах
-
в биосе можно выставлять для разных сокетов или для одного? вы в курсе, что архитектура менялась - у первого поколения эпиков в одном сокете была numa, у нынешнего все 8 каналов памяти подцеплены к одному i/o чипу?
далее, для наших расчётов интересны только соотношение числа ядер к числу каналов памяти
numa вносит сложности в управление данными, но нельзя сказать что она однозначно даёт выигрыш наличию или отсутствию сжатия -
Да там их 4 (контроллера). И только один из этих четырёх локальный.
-
давайте всё же уточним, про какое поколение epyc идёт речь
-
Rome, 2
-
-
AMD Rome Second Generation EPYC Review: 2x 64-core Benchmarked
Just in case you have missed it, in our microarchitecture analysis article Ian has explained in great detail why AMD claims that its new Zen2 is significantly better architecture than Zen1:
-
😊 я устал, Я ухожу
-
да, там в других комментах говорится про 25% разницу во времени доступа. признаю, я этого не знал. но к использованию lz4 это отношения не имеет, поскольку нам важна не latency, а bandwidth
-
Latency тоже влияет. Вы же не будете читать одним махом весь кеш же. Поэтому в реальных нагрузках и нет по 200ГБ/с. И еще учитывайте что вы подразумеваете что данные размазаны равномерно. В общем можете колоться и пробовать. Может в вашем случае и будет толк. Но пока таких не наблюдалось.
-
Так latency вроде в районе 40-50 наносекунд в лучшем случае, разве нет?
-
latency не влияет, поскольку из памяти просто читается несколько десятков КБ последовательно и распаковывается уже в кеше cpu
пробовать я ничего не буду, поскольку я спец по низкоуровневой оптимизации и архитектуре cpu, даже не по dbms и тем более не кликхаусу и его эксплуатации -
да. для серверов типично 100
-
Latency обратно пропорционально зависит от частоты RAM, на серверах в основной массе это 2666 МГц DDR4
-
нет, latency особо не меняется уже десятилетия, поскольку зависит от физических возможностей памяти. рост частоты позволяет увеличить b/w, а для latency просто увеличивают число циклов. вы не поверите, но в ddr1 оно было всего несколько тактов, тогда как сейчас в районе 20
-
но при этом у серверных cpu контроллер памяти оптимизирован в сорону большего числа одновременных запросов, а у десктопных - на минимизацию latency
-
Хм, очень интересно, огромное Вам спасибо за замечание
-
банальным поиском можно найти репринты byte, pc week, pc magazine за 80-е и в них рекламные объявления о продаже памяти 100-150 ns с 0 wait states
в начале 80-х у нас был 8088 с 8-битной шиной памяти
в середине 90-х - пентиум с 64-битной шиной и edo-памятью с latency < 100 ns
в конце 90-х - 64-битная sdr-100 память, т.е. 100М/с транзакций, при том что latency была всё те же 50-100 нс
с тех пор в десктопах перешли только на 128-битную память, зато ddr1...ddr5 удваивали число байт, передаваемых за единицу времени. всё это стало возможно, поскольку микросхемы, передающие данные по шине, масштабируются по частоте так же, как сами процессоры, а вот память - хрен
эту штуку ещё в конце 90-х назвали memory wall, и с тех пор все эти уровни кешей приобрели особую важность, cpu сейчас выживают только за счёт кешей, и gpu отличаются от низ в первую очередь отсутствием серьёзного кеширования -
Хм, спасибо огромное, буду знать😉😎
-
вспомнил наконец где я видел измерение.
ну вот мр. миловидов пробовал уже
Т.е. некомпрессед получается выгодней когда не все потоки процессора читают (чтобы увеличить max bw per core).
https://news.ycombinator.com/item?id=25928020
Using LZ4 can easily improve performance even if all data reside in memory.
This is the case in ClickHouse: if data is compressed, we decompress it in blocks that fit in CPU cache and then perform data processing inside cache; if data is uncompressed, larger amount of data is read from memory.
Strictly speaking, LZ4 data decompression (typically 3 GB/sec) is slower than memcpy (typically 12 GB/sec). But when using e.g. 128 CPU cores, LZ4 decompression will scale up to memory bandwidth (typically 150 GB/sec) as well as memcpy. And memcpy is wasting more memory bandwidth by reading uncompressed data while LZ4 decompression reads compressed data. - 11 November 2021 (134 messages)
-
ClickHouse/ClickHouse description changed: v21.11.3.6-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.11.3.6-stable
Release notes:
ClickHouse stable release v21.11.3.6-stableRelease v21.11.3.6-stable · ClickHouse/ClickHouseClickHouse stable release v21.11.3.6-stable
-
Всем привет! В случае, если при массивных инсертах закончилось место на диске default и теперь ловим ошибку "no space left on device while executing parallelformattingOutputFormat, cannot write to file /var/lib/clickhouse/tmp", можно ли пока в качестве скорой помощи на диске что-то руками почистить? Или только объём диска расширять? Есть ли какие-то правила по расчёту объёма диска default? Заранее всем спасибо за помощь!
-
можете начать с логов... КХ их хранит 10 штук по 1Г вроде.
вообще лучше иметь свободное место которое покроет все вставки + мерджи + спиллы (если будут). -
Спасибо! А какие логи точно можно безболезненно снести? Это в /var/log файлики с расширением .log ?
-
-
Огромное спасибо!
-
-
-
Да, это больше скорая медицинская помощь, чтобы хоть пациент в чувство пришёл. А после уже наверное будем диск расширять и разбираться, что именно привело к такой беде
-
Посмотрела-у нас эта папка весит 4 Кб, и вообще в папке /var/log ничего криминально огромного нет. Может в какой другой директории можно что снести?
-
du -sh / рекурсивно
-
Ещё размер таблиц trace_log и query_log в system гляньте
-
Всем привет!
У меня есть схема выгрузки с типами
LongType()),
IntegerType()
StringType()
TimestampType()
Они были добавлены from pyspark.sql.types import ShortType, IntegerType, LongType, StringType, TimestampType
и мне нужно закинуть эту выгрузку в кликхаус, какие типы указывать вместо этих при написании схемы для создания таблицы? -
Добрый день, в каталогах /data/DB/TABLE/detached накопились приличные объемы данных, на разных шардах и репликах по-разному везде. Внутри каталоги виде ignored_*, clone_*, detached_*.
Руками attach/detach не делаем (и не делали), т.е. это результат жизни КХ. Вопрос в чем - можно это все удалить? На одном из серверов объем этого каталога больше, чем нужных данных. -
Коллеги, просвятите, как организовать хранение результатов запросов для последующего использования в других запросах? Есть база метрик, хотелось бы иметь суточные срезы статистики, чтобы не выполнять их многократно позднее
-
Что то бошку ломаю ничего придумать не могу, помогите пожалуйста
ребят как у меня есть 4 поля: время, камера и 2 колонки с координатами, нужно вывести для каждой камеры последнее время, когда обновлялись координаты, как это можно сделать? -
select max(change_datetime), camera_id from t group by camera_id
-
А где взять change_datetime? У меня же просто время
-
SELECT id, max(changingDate) FROM (
SELECT min(date) changingDate, id FROM t GROUP BY id, coord1, coord2
) GROUP BY id -
Сейчас попробую
-
Если я все правильно понял, то это гениально
-
Получается мы формируем группу камера-координаты и ищем мин время когда произошло изменение либо камеры либо координат (назовем это "переключение"), а потом группируем камеры и находим самое позднее переключение, но уже координаты
-
Последнее переключение по группе параметров id-coord1-coord2, у камеры же идентификатор не может меняться?
-
Не может
-
Тогда похоже это то что надо.
-
Да, похоже на то, спасибо большое! А я лез куда то в оконные функции, а оно вот как элегантно получилось!
-
-
Добрый день.
Установил новую версию КХ и при работе через HTTP получаю ошибку 501 без доп.информации, а в файле логов есть сообщение: "Cannot print extra info for Poco::Exception (version 21.11.3.6)"
При этом в интерфейсе DBeaver через JDBC данные на сервере отображаются. Как можно решить проблему с HTTP ? -
Сделай View и селекти с неё)
-
Спасибо, хороший вариант
-
Подскажите пожалуйста
Engine RabbitMQ
создаю таблицу, в settings указываю ```rabbitmq_queue_settings_list = 'x-max-length=1048545'``` (потому-что очередь уже создана с этим параметром)
Ошибка DB::Exception: Unknown setting rabbitmq_queue_settings_list: for storage RabbitMQ (version 21.3.18.4 (official build))
с какой версии поддерживается параметр rabbitmq_queue_settings_list для движка RabbitMQ -
Всем привет. Мне дали доступ к только к базе данных system. Я надеялся, что этого доступа достаточно чтобы делать запросы в таблицы tables и parts.
Возможно ли в Clickhouse выдать гранты так чтобы у меня был свободный доступ ко всем данным в system, но не к пользовательским данным? -
На версии 21.11.3.6 успешно работают HTTP GET запросы, с POST - проблема. Сервер КХ возвращает 501-ю ошибку
-
До обновления версии POST работал нормально. Может настройка какая-то новая появилась ?
-
Добрый день. В базе (не кликхаус) есть столбец с датой, но тип у него явно не даты....
Как в запросе преобразовать этот столбец с типом дата?
Пробовала cast(столбец as date) - не получается(( -
Type Conversion | ClickHouse Documentation
Type Conversion Functions Common Issues of Numeric Conversions When you convert a value from one to another data type, y
-
он там еще может в теле запроса текст ошибки отдать, посмотрите на него
-
а как именно вам его дали? через RBAC?
или как то по другому?
ну то есть сделать пользователя у которого только SELECT права на system.*
вполне реально
версия clickhouse какая? -
смотрел, тело ответа - пустая строка, код ошибки 501
-
Всем привет, коннекчу питон и кликхаус через pandahouse
и какой бы я запрос не сделал, ошибки плюс мину похожие на эту , подскажите как вылечить -
думаю стоит задать вопрос автору https://github.com/kszucs/pandahouse/issues
как сделать поддержку DecimalIssues · kszucs/pandahousePandas interface for Clickhouse database. Contribute to kszucs/pandahouse development by creating an account on GitHub.
-
Здравствуйте, очень сильно разрослась таблица, решил настроить мув старых\холодных данных в s3.
Создал такую таблицу:
create table new
(
id UInt64,
key1 String,
key2 String,
created DateTime,
created_date Date
)
engine = MergeTree
partition by created_date
ORDER BY (key1, key2)
TTL toStartOfDay(created, 'UTC') + interval 1 year to volume 's3'
SETTINGS storage_policy = 'tiered';
перегнал туда данные со старой таблицы (~500GB), запросы по таблице работают, но сама таблица (/var/lib/clickhouse-server/data/new) весит 60KB.
таблица по пути /var/clickhouse-server/disks/s3/data/new весит 880Мб,
таблица по пути /var/clickhouse-server/disks/s3/cache/new весит 809Мб.
Такое чувство, что все данные ушли на s3 (включительно с последним годом)
Я же расчитывал что данные за последний год останутся на диске.
Что я делаю не так? -
да там уже ничего не поддерживается вроде, через sqlalchemy в pandas грузите
-
echo 'SELECT Version()' | curl -vvv 'http://clickhouse-host:8123/' --data-binary @-
что показывает? -
Добрый день! Подскажите пожалуйста выполняю удаление через alter table delete на таблице
Мутация висит и не завершается, выдаёт ошибку Code:49 Sort order of blocks violated for column number 0 left UInt64_9 right UInt64_3? -
как мутация выглядит?
-
-
Версия: 20.11.5.18
GRANT SELECT ON system.* TO my_user_name
SELECT database FROM tables GROUP BY database;
Выдает только system, хотя на сервере 100% есть куча других баз данных с другими таблицами -
Извиняюсь, это уже ответ прежнего сервера (я переустановил). Сейчас верну последний, проверю еще раз
-
Сам запрос?
-
SELECT * FROM system.storage_policies FORMAT Vertical
вроде все правильно в TTL задано -
да
SELECT * FROM system.mutations WHERE is_done=0 FORMAT Vertical -
-
это ответ от новой версии сервера
-
Новая версия почему-то отказывается с портом 8123
-
выглядит так что вам надо еще
SHOW добавить
https://clickhouse.com/docs/en/sql-reference/statements/grant/#grant-showGRANT | ClickHouse DocumentationGRANT Statement Grants privileges to ClickHouse user accounts or roles. Assigns roles to user accounts or to the other r
-
ss -nltp | grep 8123
вы проверьте сначала что у вас старая версия стопанулась или нет? -
ss -nltp | grep 8123
пустой ответ
останавливал сервер перед переустановкой версии -
Используйте clickhouse-driver
-
выше ребята ответили в чем прикол, проблема с алиасами во вью
-
-
так, SELECT engine, name FROM system.databases посмотрите?
если Atomic для той базы данных которая у вас в new таблице
тогда смотрите
/var/lib/cickhouse/storage/db/new
в /var/lib/clickhouse/data/db/new теперь только симлинки для atomic -
там ordinary engine
-
ок. HTTP POST запросы у вас работают
смотрите свой код и что именно он в HTTP отсылает
tcpdump -w clickhouse.pcap port 8123
и запускайте ваш код который 501 возвращает
дальше через wireshark открывайте и смотрите -
странно тогда =(
текущий сторейдж должен оставить последний год на default
если default на 90% занят, тогда перегнать на s3
см. move_factor -
df -h /var/lib/clickhouse/data/
-
/dev/nvme1n1 5,8T 5,0T 617G 90% /var/lib/clickhouse-server
-
-
-
-
-
случайно весь экран захватил ((
-
-
может уже стоит web.telegram.org запустить и скопипастить на pastebin.org ссылочку с результатом?
это явно не формат Vertical -
-
правой кнопкой по выделенному фрагменту и Follow HTTP Stream или Follow TCP Stream
не помню уже точно
вы там явно что-то не то гоните в 8123 порт
строку с No 4 посмотрите, там 308 байт чего то непонятного... -
то что вы показываете, это явно не FORMAT Vertical
-
-
-
Это же PUT а не POST
-
Да, PUT. Не обратил внимание. Но в прежней версии работал..
-
а где-то задокументировано что его можно использовать? Если нет, значит будьте готовы что что-то не будет работать в новой версии
-
-
KILL MUTATION WHERE is_done=0;
SELECT toTypeName(ObjectID), toTypeName(ActionID) FROM db.table LIMIT 1 -
Спасибо всем за помощь ! Действительно, проблема в том, что PUT запрос перестал отрабатывать в новой версии.
Заменил на POST и всё ОК. -
Добрый день, подскажите будет ли профит если в смехе с класера с одной репликой, разделить запись и чтение: то есть один сервер будет работать только на инсерт, второй будет отдан на чтение?
-
https://clickhouse.com/docs/en/interfaces/http/
вот тут сказано
When using the GET method, ‘readonly’ is set. In other words, for queries that modify data, you can only use the POST method. You can send the query itself either in the POST body or in the URL parameter.
про PUT вообще упоминаний в исходниках не многоHTTP Interface | ClickHouse DocumentationHTTP Interface The HTTP interface lets you use ClickHouse on any platform from any programming language. We use it for w
-
-
Подскажите пожалуйста что будет работать быстрей поиск подстроки через Like или через функцию https://clickhouse.com/docs/en/sql-reference/functions/string-search-functions/#position ?For Searching in Strings | ClickHouse Documentation
Functions for Searching in Strings The search is case-sensitive by default in all these functions. There are separate va
-
что такое схема кластера с одной репликой?
один шард одна реплика?
или один шард две реплики?
в любом случае такая схема редкий кейс, когда у вас там какие нибудь аналитики хотят запросы гонять часами...
вставка у вас все равно будет реплицироваться
и будет простой ресурсов
лучше поставьте перед кластером какой то load balancer типа chproxy или nginx
и вставляйте и читайте с обоих нод
получите более равномерное распределение нагрузки -
там код в общем случае один и тот же будет, векторизированный поиск по подстроке
-
Спасибо!
-
Тип полей UInt64
-
Убил мутации заново запустил удаление обратно висит есть какой нибудь вариант удалить?
-
смех в класере: будни саппорта :)
-
точно UInt64??
сообщение об ошибке довольно странное
Code:49 Sort order of blocks violated for column number 0 left UInt64_9 right UInt64_3?
вы как-то запрос в мутации поменяли?
toUInt64(445) ? -
-
так и храните.
Можете еще проверить CODEC(ZSTD) -
-
типа того. Возможно lz4 и так жмет ОК, там же 0000 0000 0000 0000 0000 ffff повторяется для ipv4, но я бы проверил и ZSTD
-
вы бы начали с апгрейда до последнего фикса в вашей 21.3 ветке
-
у вас 21.3.4, обновляйтесь до 21.3.18.4
-
спасибо, в плане хранения это не так важно. я спросил почему: некоторые клиенты у меня получают CSV из кх напрямую как он его отдает, и их ставит в ступор ::ffff: перед v4-адресами. можно как-то им обратный маппинг v6-to-v4 делать на лету в селекте, оставляя v6-адреса как есть?
-
-
То есть в этой версии clickhouse есть баг по delete?
-
без понятия
-
просто нет смысла смотреть на картинки, вы используете раннюю забагованную версию
-
21.3.18.4 stable?
-
все версии КХ stable, если они не testing. Сейчас testing 21.12, т.е. все что ДО 21.12 -- это stable
-
у testing версия пишется типа 21.12.1.4665 (4 знака в последнем числе)
-
zstd определённо лучше сожмёт информацию матчей, и скорость распаковки должна не сильно упасть
-
Хорошо, спасибо, попробуем обновиться
-
Подскажите, может кто сталкивался. Выгребаю данные из клика через python client, метод execute_iter. Получаю ошибку
Unexpected packet from server (expected Pong, got Data)
такое ощущение, что слишком долго читаю из итератора, или неправильно его использую. -
Добрый вечер. Может у кого-нибудь была похожая ошибка,в каком направлении следует смотреть?
-
-
Колонка user.email у меня в бд вообще без данных пока что
-
клиент в одном потоке используется? https://clickhouse-driver.readthedocs.io/en/latest/quickstart.html#async-and-multithreading
-
Кх подумал, что user это nested структура.
-
это фича Nested. Т.е. Nested проверяет что размер массива одинаковый, иначе потом будет нельзя сопоставить где чей имейл
типа ['vasya', 'petya', 'ivan'] , ['ivan@.....']
поэтому используйте пустые строки ['vasya', 'petya', 'ivan'] , ['', '', 'ivan@.....'] -
И ещё вопрос касательно этой колонке в CSV файла, по логике вещей её тоже пока оставить пустой?
-
массив CSV выглядит ['', '', 'ivan@.....']
-
select ['a','b'] format CSV;
"['a','b']" -
Да. Там мультипроцессинг, вроде не должен мешать.
-
до того, как всё через execute_iter не вычитаете, не вызываете client.execute*? https://github.com/mymarilyn/clickhouse-driver/issues/117Partially consumed packet generator leaves client in a broken state · Issue #117 · mymarilyn/clickhouse-driver
cc @xzkostyan >>> from clickhouse_driver import Client >>> >>> client = Client(host='localhost', port=9000, user=&...
-
Как интересно. Спасибо, покопаю.
-
читайте доку, берите подходящие типы. для стринга - стринг и т.д.
https://clickhouse.com/docs/ru/sql-reference/data-types/Введение | Документация ClickHouseТипы данных ClickHouse может сохранять в ячейках таблиц данные различных типов. Зависимость имен типов данных от регистр
-
Спасибо! Так и сделал)
-
Спасибо большое за ответ)
-
Знатоки, ещё вопрос )
При заполнении таблицы получил ошибку "Too many parts (N). Merges are processing significantly slower than inserts."
Как один из вариантов решения предлагается увеличить установленное по умолчанию активное число партиций parts_to_throw_insert
Делается это при создании таблицы:
CREATE TABLE foo
(
A Int64
)
ENGINE = MergeTree
ORDER BY tuple()
SETTINGS parts_to_throw_insert = 600;
Так вот вопрос, я могу изменить это значение, не удаляя и не пересобирая заново таблицу? И если есть ещё адекватные решения этой проблемы кроме добавления buffer таблицы, то это будет супер ) -
можно https://clickhouse.com/docs/en/operations/settings/merge-tree-settings/#merge-tree-settings
в 99% это не лечение, но костыль.
https://github.com/ClickHouse/ClickHouse/issues/3174#issuecomment-423435071MergeTree tables settings | ClickHouse DocumentationMergeTree tables settings The values of merge_tree settings (for all MergeTree tables) can be viewed in the table system
-
ALTER TABLE foo
MODIFY SETTING parts_to_throw_insert = 600; -
Если я при создании таблицы не указывал SETTINGS, то такая тема прокатит MODIFY SETTING parts_to_throw_insert = 600?
-
а не проще проверить?
ответ: да, можно менять -
Спасибо
- 12 November 2021 (124 messages)
-
Добрый день. При загрузке данных через дистрибутивную таблицу в синхронном режиме, как-то можно повлиять на размер кусков ( в строка) улетающих на каждый шард? При распределении через rand(), скажем, 1000000 строк бьются кусками по 10-15к, из-за этого количество партов резко растет.
-
Добрый день!
Подскажите, как лучше настроить RBAC.
У нас есть юзер "ch_loader" который создает новую бд "client", создает роль "client_ro" и выдает ей права "grant select on client.* to client_ro". Но получает в ответ ошибку
Not enough privileges. To execute this query it's necessary to have grant SELECT ON client.* WITH GRANT OPTION
Как правильно настроить доступы, чтобы юзер ch_loader мог выдавать права на созданную им базу другим ролям?
grant select on *.* to ch_loader with grant option;
сделать не можем по соображениям безопасности -
-
Тяжко долго рассказывать про то чем плох чат тут статья про прописные истины про это: https://habr.com/ru/company/productivity_inside/blog/588761/Сообществам разработчиков лучше общаться на форумах, чем в чатах
После примерно года попыток сформировать сообщество разработчиков выражаю свое провокационное мнение: если вы хотите объединить разработчиков с какой-то платформы в сообщество и у вас встает проблема...
-
-
так уже сделали, у альтинити есть база знаний
-
вы здесь ни разу не отвечали и не спрашивали, зачем этот вброс?
Не нравится не читайте, здесь люди помогают друг другу. -
это вброс, реклама статьи)
-
+++
-
-
Я кстати согласен. Хорошо, когда есть чат, где тебе помогут.
Но круто, когда есть общедоступная база знаний, типа StackOverflow.
Проще гуглить.
Когда у меня вопрос, я иду по пути
Поиск по чату в телеге -> поиск в github -> поиск StackOverflow -> задать вопрос в чате -
Вакансия - Волгоград / full time, remote
Должность Developer
Компания I-advert.biz
Список задач
🔸Написание bidder, автоматической аналитики на основе данных
🔸Техническая поддержка и сопровождение RTB-интеграций с партнерами
🔸Технический контроль и мониторинг RTB трафика
О нас
Наша рекламная сеть регистрирует и сохраняет десятки тысяч запросов от пользователей в минуту. И это благодаря команде умных, талантливых и инициативных людей. IT команда активно растет вместе с сервисом, и мы ищем настоящего профессионала, который готов вместе с нами реализовать новые и амбициозные планы, которые позволят сохранить позиции одного из лучший сервисов для наших клиентов.
Требования
🔸Основной стек: clickhouse / golang
🔸python + php + mysql желательны
ЗП от 200к
Контакт @nefertiti_ru -
Пытаюсь настроить параметризированный http handler. Беру настройку конфига из доки:
после чего такие ошибки в логе: 2021.11.12 14:18:01.641177 [ 6147 ] {} <Error> Application: DB::Exception: Listen [::1]:8123 failed: Code: 137. DB::Exception: Unknown element in config: http_handlers.rule.method. (UNKNOWN_ELEMENT_IN_CONFIG) (version 21.12.1.8691 (official build))
Подскажите, что не так делаю? Версия свежая, недавно развёрнутая на тестовой машине. Примечательно, что не параметризированный хендлер отрабатывает . -
Я просматриваю регулярно сюда, несколько раз находил ответы на возникающие вопросы. В процессе посматривания, регулярно натыкаюсь на не раз повторяющиеся вопросы.
Что-то спрашивать в чате и вести осмысленную беседу на отдельно взятую тему, это как-то... неконституциально что-ли. Хотя это только может мои представления. -
#вакансия #powerBI #аналитика
Вакансия: Разработчик PowerBI
Формат работы: проектная работа, гибкий график
Зарплатная вилка: с успешным кандидатом готовы обсуждать индивидуальные условия.
Задачи
1. Разработка дашбордов по основным показателям
2. Внедрение сквозной аналитики
3. Интеграция с источниками данных (CRM, рекламные кабинеты, GetCourse, ERP)
4. Работа с API
для отклика и по всем вопросам писать - @myaksheva -
Всем привет. Подскажите плз, как работает настройка mutations_sync при ALTER TABLE на кластере:
Есть 2 инсталляции CH: single-сервер (H1) и кластерная (3 ноды, H2). Создал таблицу foo с движками: H1 - ReplacingMergeTree, H2 - ReplicatedReplacingMergeTree (указывал ON CLUSTER bar). Делаю запросы:
Для каждого запроса генерировал 1кк записей (около 200 MB получилось примерно).
1. Запрос на H1 (single-server)
clickhouse-client -h $H1 --queries-file=queries.sql
queries.sql:
ALTER TABLE foo DELETE WHERE 1 SETTINGS mutations_sync = 0;
SELECT * FROM foo LIMIT 1
В результате select'a выдается какая-то запись, которая не успела удалиться. Все логично
2. Делаю то же самое, но ставлю mutations_sync = 1. Результат select'a пустой. С mutations_sync = 2 - тоже. Пока все ожидаемо.
3. Запрос на H2 (cluster):
clickhouse-client -h $H2 --queries-file=queries.sql
queries.sql:
ALTER TABLE foo ON CLUSTER bar DELETE WHERE 1 SETTINGS mutations_sync = 2;
SELECT * FROM foo LIMIT 1
В результате select'a выдается какая-то запись, хотя вроде как не должна, т.к. mutations_sync = 2 означает, что запрос должен завершиться на всех репликах, прежде чем он будет закончен (или я что-то не так понимаю?)
4. Делаю то же самое, но убираю ON CLUSTER bar из ALTER TABLE. В таком случае, результат select'a пустой.
Может кто-то объяснить такое поведение? Я так понимаю, что когда в 4 убран ON CLUSTER - то данные успевают удалиться только на одной реплике. Это так или нет? Если так, то как сделать, чтобы alter завершался после того, как мутация будет выполнена на всех репликах?
Ещё в 3 и 4 пробовал вместо (и вместе) с mutations_sync = 2 пробовал replication_alter_partitions_sync = 2 - результат select'a все равное выдается.
BTW: в чем разница между replication_alter_partitions_sync = 2 и mutations_sync = 2 для кластерной инсталляции? -
> BTW: в чем разница между replication_alter_partitions_sync = 2 и mutations_sync = 2 для кластерной инсталляции?
Наверное replication_alter_partitions_sync не влияет на мутации.
> В результате select'a выдается какая-то запись, хотя вроде как не должна, т.к. mutations_sync = 2 означает, что запрос должен завершиться на всех репликах, прежде чем он будет закончен (или я что-то не так понимаю?)
ON CLUSTER работает через помещения запроса в ZooKeeper и ожидание его выполнения, мб по какой то причине в этом случае ожидание мутации работает не совсем корректно. -
статья - так себе. на гитхабе повторяющихся вопросов тоже хватает. нафига использовать какие-то древние форумные движки, если на гитхабе уже давно есть обсуждения, правда они не особо популярны, но точно популярнее форумов.
не нравится чат - можно не использовать его, а использовать обсуждения на гитхабе. -
Спасибо за ответ. Пойду тогда проверять, удаляются ли данные на всех репликах в 4 случае
-
> BTW: в чем разница между replication_alter_partitions_sync = 2 и mutations_sync = 2 для кластерной инсталляции?
Наверное replication_alter_partitions_sync не влияет на мутации.
> В результате select'a выдается какая-то запись, хотя вроде как не должна, т.к. mutations_sync = 2 означает, что запрос должен завершиться на всех репликах, прежде чем он будет закончен (или я что-то не так понимаю?)
ON CLUSTER работает через помещения запроса в ZooKeeper и ожидание его выполнения, мб по какой то причине в этом случае ожидание мутации работает не совсем корректно. -
-
Коллеги, поправьте доку, пожалуйста. Там вместо тега method Должно быть methods
-
нажмите "редактировать"->комит->пуллреквест и всё...
-
Доброго времени суток!
Пытаюсь решить задачу - в 1 таблицу Clickhouse читать из 2х разных топиков kafka, возможно ли это? Открыл страницу документации про интеграцию с кафкой но прямого ответа не нашел https://clickhouse.com/docs/ru/engines/table-engines/integrations/kafka/
Вижу что в конфигурации есть topic_list, но нет примера как использовать.
Допусим есть таблица employee
id | name | fio | department | salary
Есть 2 топика в kafka, в 1м есть поля id | name | fio, во втором id | department | salary. Можно ли это както в clickhouse склеивать в 1 таблицу по id employee ?Kafka | Документация ClickHouseKafka Движок работает с Apache Kafka. Kafka позволяет: Публиковать/подписываться на потоки данных. Организовать отказоус
-
Всем привет. Параметр ЯМетрики goalsID
Для загрузки в ClickHouse базу какое значение имеет?
Имею ввиду String, UInt16, UInt32, ???
Где это можно посмотреть? -
спасибо
-
чтобы писать из 2 разных топиков просто создаёте 2 Kafka Engine + 2 Materialzed View
для склеивания можете попробоваться использовать AggregatingMergeTree -
Спасибо большое! Пойду про AggregatingMergeTree почитаю
-
Склеивать можно
Но вообще не оч эффективно
https://kb.altinity.com/engines/mergetree-table-engine-family/aggregatingmergetree/#last-non-null-value-for-each-column -
спасибо, а не очень эффективно это грубо говоря насколько медленнее? Скажем если грубо 1млн записей в сутки на хорошем сервере, это особо проблем не сделает? Или будет адский лаг или что-то такое?
-
Ну 1 млн не очень много.
Просто в время запроса, вы должны агрегировать и делать GROUP BY id, что не бесплатно -
а процесс попадания данных вам не позволяет через Kafka Stream собирать топик до слкадывания в кх?
-
Вероятно нет, т.к. через пару дней уже делать надо начинать, а с Kafka Stream у нас не работали/не слышали/не установили ) Если только вторым этапом
-
-
а как эта штука работает? Можно склеить силами Kafka 2 топика в 1 ?
-
-
-
Спасибо! Пойду почитаю и стану умнее )
-
Всем, привет!
Кто-нибудь сталкивался с неправильным отображением времени логирования (выводит на 3 часа назад все), текущего и вообще в DataGrip? В настройках стоит UTC3, пробовала менять, пробовала -Duser.timezone=, не помогло) -
dataGrip(java) переводит в таймзону локального компа
скорее всего вы косячите при записи в КХ
UTC3 это 100% неправильно -
Поставила как в документации было,но я пробовала и другие варианты проставить. Бесполезно. Часовой пояс на маке стоит Москва.
-
Т.е. например у вас все даты в UTC, вы пишете в КХ в UTC и КХ прямо на сервере показывает в КХ клиенте UTC, а потом вы запускаете запрос с компа у которого локальное время MSC и используете java, то вы увидите MSC, тут нет никакой ошибки, просто java переводит в TZ юзера. Если вы хотите увидеть UTC в datashit вам надо в нем поставить -Duser.timezone=UTC
-
как, как, все как написано в статье, для того чтобы получить быстрый отклик РазработчикиКХ сделали чат и получили то что им было нужно. И ушли из чата, а чат не удалили и вот получилась херня которая получилась. Я бы конечно удалил чат.
Попробую надавить на них чтобы удалить все чаты. Конечно ужасно жаль что потеряно все что расказали здесь разрабы.
Самая классная штука это news / Usenet groups. Как было хорошо-то, это чистый героин был, все что после этого сосет, причем работало в оффлайн, и индексировалось -
надеюсь это был сарказм? я пока только осваивают апи телеги и ещё не выкачал из этого канала всю инфу, а тут её немало...
UPDATE: после вашего апдейта выдохнул :) -
нет сарказма, я серьезно. Я тоже считаю что сейчас чат потерял смысл. Можно конечно просто выйти из чата.
-
Именно, кому не нравится пусть выходят, тут же не цепью приковали
-
Речь идет про этот канал чтоле? Это лучшая вещь о КХ, что где-то можно спросить.
-
6000 человек считают, что в этом чате бывают интересные вещи
-
про этот и про тот который en
-
Если хотите индексации, пушите создание вопроса на стек-оверфлоу, чтобы находилось в инете.
-
я у себя чищу каналы время от времени, этот пока остаётся
-
я сам обычно спрашиваю именно на stackoverflow
-
так надо чтобы все перешли на stackoverflow
-
Мы так делали, и в принципе работало. Типа, чувак, мы тебе ответим, но создай на СО и кинь сюда ссылку.
-
-
при желании можно распарсить канал, разбить треды на отдельные страницы, загнать в поисковик на индексацию.
-
-
Без чата не ясно где инфу брать, чат просто спасение
-
потому что все похоронено в чате и так будет пока чат существует
-
это проблема курицы и яйца) Чат - спасение, потому что ничего другого нет. Ничего другого нет, потому что есть чат 🙂
-
в общем я отвечаю более развернуто на стековерфлоу и на гитхабе
-
-
Может нужна интеграция с СО?
-
-
со стековерфлоу тоже есть проблема в том что там кроме стековерфлоу по КХ есть еще stackexchange и stackadmin ?
-
вот-вот постоянно добавляются новые фичи, про которые в документации ни слова. хотя бы на хабре раз в месяц статью писали о том, что добавилось новое с примерами, а не "были добавлены новые функции для работы с json", переходишь на пуллреквест - в нём как обычно ни слова в описании кроме того что автор согласен с лицензией. лезешь в тесты и только тогда приблизительно становится понятно, что это за функция.
-
Читайте CHANGELOG на гитхабе )
-
а чат вам чем помогает в этом случае?
-
так там и написано "были добавлены новые функции для работы с json"
-
в чате кто-то кинул ссылку на видео с лёхой, а там чисто случайно узнал про эти функции. чат позволяет постоянно находиться в контексте и чисто случайно узнавать про новые фичи, про которые в чейнжлоге либо слишком скупо описали, либо вообще ни слова.
-
вы же понимаете надеюсь что если какой-то разработчик добавляет фичу без документации, ее мержат и никто включая Миловидова не знает на 100% как ей пользоваться
-
в общем будете закрывать чат, то не забудьте где-нибудь выложить для индексации его историю.
-
Денни, если хотите удержать коммьюнити, и прорекламировать альтинити, почему бы не сделать интеграцию с кб?
-
Вопрос, может перевод на английский, поиск, рекомендация.
-
Может через бот.
-
Ну вот как например то что MV с внутренними таблицами вполне себе живет здравствует при идущем populate и запихивает в себя новые данные паралельно с популяцией, которая в свою очередь судя по графику вообще в два потока бежит, но то не точно. Никто не в курсе кто и когда это добавил и вообще что это есть, а оно вон.
А КХ кемто в плане распространения и в принципе его "внешней политикой" занимается? -
вот эти ребята - https://clickhouse.com/company/ )))
-
clickhouse.com, но что-то их тут не видно
-
Очень много работы по очистке всего.
Плюс ответы за 2020 и раньше уже не совсем релевантные.
Так то новые вещи мы и так заносим в kb -
Подскажите, пробовую создать словарь вот так:
CREATE DICTIONARY default.dict_data (
bcid UInt64 DEFAULT 0,
name String DEFAULT ''
)
PRIMARY KEY bcid
SOURCE(HTTP(
url 'https://somesite.com/data.json'
format 'JSONEachRow')) LAYOUT(HASHED()) LIFETIME(300);
Но когда делаю запрос в select * default.dict_data вылетает ошибка:
Code: 117. DB::Exception: Received from localhost:9000. DB::Exception: Unknown field found while parsing JSONEachRow format: status: (at row 1)
Можно как-то игнорировать поля которых нет в структуре словаря?
SET input_format_skip_unknown_fields=1; – не помогает
clickhouse-client --input_format_skip_unknown_fields=1 – также не помогает 🙁 -
подскажите плиз кто сталкивался
(21.9.5 revision 54449, реплики с ЗК, 2 набора дисков ssd + hdd и мув по ттл)
в какой-то рандомный момент времени мержи зависают в system.merges (и выедают пулл как свой ==16 так и репликации == 8)
пример elapsed 28654.781420539, progress 0 (на hdd все что вижу, если это релевантно)
есть какие-то советы что проверить/посмотреть?
или есть способ как убить конкретный мерж? -
у словаря можно задать settings
CREATE DICTIONARY item_dict ( id UInt64, attr String )
PRIMARY KEY id SOURCE(CLICKHOUSE(HOST 'localhost' PORT 9000
TABLE item_dict_t DB 'dw' USER 'default'))
settings (input_format_skip_unknown_fields=1)
LIFETIME(MIN 0 MAX 0) LAYOUT(HASHED()); -
Спасибо, маэстро.
Как тебе пивка передать ? -
-
Подскажите, возможно ли удалить из MergeTree-таблицы один из ключей сортировки? PRIMARY KEY в явном виде не задан, в секции ORDER BY задано несколько полей таблицы (а именно 6), нужно удалить одно из них из ORDER BY. Т.е. не сам столбец, а просто исключить его из ключей сортировки. Пытаюсь выполнить: MODIFY ORDER BY (<список полей>), получаю ошибку: Code: 36. DB::Exception: Primary key must be a prefix of the sorting key, but its length: 6 is greater than the sorting key length: 5. (BAD_ARGUMENTS)
-
для replicated таблиц не поможет. Надо в ZK удалять на всех репликах.
Что случилось, не последствия, а что случилось? -
можно только последний элемент из order by убрать
-
в очереди репликации source_replica это не локальная машина, при этом в system.merges на ней пусто, а парт по пути присутствует (с мтаймами ~+минута с постановки в очереди)
-
В том то и дело что каких-то явных предпосылок нет - падений и т.п. не было - сетапим новый кластер, еще нагрузку сильную даже не дали
-
Вот как раз последний элемент и пытаюсь убрать. И получаю ошибку.
-
покажите show create table .... кусок про primary key и order by и ваш modify
-
диски сдохли?
sar -d 1 100 -
Average: DEV tps rkB/s wkB/s dkB/s areq-sz aqu-sz await %util
Average: dev259-0 12.72 0.00 102.78 0.00 8.08 0.00 0.04 0.50
Average: dev259-4 12.72 0.00 102.78 0.00 8.08 0.00 0.04 0.50
Average: dev9-1 18.96 0.00 99.43 0.00 5.24 0.00 0.03 0.30
Average: dev9-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-0 34.95 114.03 4173.32 0.00 122.68 0.06 1.64 2.82
Average: dev8-128 34.21 83.47 4116.09 0.00 122.77 0.06 1.66 2.76
Average: dev65-32 38.33 131.71 4128.73 0.00 111.16 0.06 1.56 3.36
Average: dev8-208 34.48 117.63 4071.49 0.00 121.51 0.06 1.65 3.08
Average: dev8-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-32 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-48 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-64 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-80 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-96 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-112 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-144 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-160 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-224 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-176 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-192 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev65-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-240 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev65-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev65-48 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev9-127 421.22 446.60 8237.10 0.00 20.62 31.04 73.69 4.20
Average: dev9-126 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 -
show create table:
CREATE TABLE table
(
...
)
ENGINE = MergeTree
ORDER BY (unid,
user_stfunid,
user_card_unid,
account_type,
account_value,
account_sid)
primary key в явном виде не задан, только ordey by
запрос на modify:
ALTER table lndata.access_accounts MODIFY ORDER BY (unid,user_stfunid,user_card_unid,account_type,account_value)
То есть перечислены все поля, кроме последнего (account_sid)
Ошибка: Code: 36. DB::Exception: Primary key must be a prefix of the sorting key, but its length: 6 is greater than the sorting key length: 5. (BAD_ARGUMENTS) -
перегружайте КХ, что-то знакомое, не помню
-
primary key в явном виде не задан, только ordey by, значит он == ordey by
значит удалять нельзя, потому что надо изменить файлы primary key index на диске -
Понял, спасибо!
-
Как пошагово развернуть локальный КХ и через dbeaver поработать с большим csv?
На Mac OS.
Может кто-нибудь объяснить человеку, который не работал с командной строкой?) -
https://clickhouse.com/docs/en/getting-started/install/#from-single-binary
MacOS x86_64 — curl -O 'https://builds.clickhouse.com/master/macos/clickhouse' && chmod a+x ./clickhouse
MacOS Aarch64 (Apple Silicon) — curl -O 'https://builds.clickhouse.com/master/macos-aarch64/clickhouse' && chmod a+x ./clickhouse
https://habr.com/ru/company/oleg-bunin/blog/551572/
ClickHouse без сервера -
а хотя это про dbeaver, тут сервер надо запустить, но почти тоже самое
-
похоже это баг, populate блокирует инсерты, надо исправить
-
О! Все получилось. Осталось понять, как в localhost найти нужную таблицу.
-
Наоборот же очень удобно, не надо танцевать с бубном для пересоздания и пересчета. drop, create - все
-
или просто нужно создать таблицу и туда можно экспортировать файл?
-
default это база данных.
создать таблицу не сложно из бобра.
А вот как данные в таблицу из бобра закинуть я не знаю. curl-м можно/знаю -
ну в любом случае надо дописать в доку, может у кого-нибудь из-за этого инсерты застрянут на 2 часа пока populate бежит.
-
кажется разобрался, создать через create table, а потом экспортом добавить данные, буду пробовать, спасибо!
-
Попробуйте в DataGrip в настройках драйвера ClickHouse сменить версию на 0.2.4
-
Скажите, пожалуйста, включено ли по умолчанию сжатие данных в Clickhouse? Либо кодеки и уровень компрессии нужно задавать самому вручную?
-
Включено, но можно менять
-
Сжатие lz4 включено по умолчанию, а дальше уже руками что надо тюните
-
Есть ли смысл использовать тогда в самой таблице поля а-ля field UInt32 Codec(T64, LZ4)?
-
Даёт ли это профит при хранении данных в плане занятого места и насколько снижает скорость чтения данных?
-
Место уменьшается, скорость когда как, цифры вам надо проверять на своих данных.
-
Лучше провести тесты на своих данных, всё сильно зависит от низ
-
Спасибо
-
лучше делать field UInt32 Codec(T64, Default)
в этом случае будет сжматься кодеком заданным в конфиге и самое главное это позволит пережать при TTL recomress -
-
Спасибо большое за замечание
-
-
таблица replicated ?
detach table xxxx работает?
когда КХ выключен просто сделайте
mkdir /var/lib/tmp
mv /var/lib/clickhouse/data/база/таблица /var/lib/tmp/
mv /var/lib/clickhouse/metadata/база/таблица.sql /var/lib/tmp/ -
Не replicated. Detach table тоже виснет
-
-
- 13 November 2021 (20 messages)
-
-
-
mark cache
uncompressed cache
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-who-ate-my-memory/ -
от system.part_log зависит что-то?
-
или можно удалять не боясь
-
Ничего не зависит. Можно. https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-system-tables-eat-my-disk/
Кх ее создаст снова. -
-
С футболкой Кликхаус не тормозит, надеюсь?
-
а есть видео где ты настраиваешь zookeper ?
-
Многопоточная обработка данных)
-
да прибейте уже бота
-
ребят, такая ошибка
Code: 216. DB::Exception: Query with id = mysql:[ERRFMT] is already running. (QUERY_WITH_SAME_ID_IS_ALREADY_RUNNING)
Пытаюсб из java клиента через mysql драйвер создавать таблицы. -
Через IF NOT EXISTS
Если таблицы нет, то все ок
Если есть, то такая ошибка -
в моем понимании, если таблица есть, то ошибки не должно быть, иначе смысл IF NOT EXISTS...
-
Подскажите, можно ли создавать 2 MATERIALIZED VIEW которые бы переливали данные в одну таблицу?
-
Да
Можно -
Доброго времени суток!
Столкнулся с подобной ошибкой. Подскажите, как решили?
КХ (21.11.2.2) на удаленном сервере, порт 8123.
Доступ через requests работает, а через clickhouse_driver Client возвращает ошибку:
Code: 102. Unexpected packet from server х.х.х.х:8123 (expected Hello or Exception, got Unknown packet) -
Питоновский драйвер на порт 9000 надо. 8123 это не то
8123 http
9000 tcp
Питон драйвер через tcp -
техподдержка идёт даже в ночь с субботы на воскресенье :)))
-
да, а самое смешное что я прямо сейчас в слаке Альтинити решаю дурацкую проблему у клиента который решил поработать ночью в субботу
- 14 November 2021 (46 messages)
-
У тебя клиент почему то устанавливает query_id параметр
Не уникальный
И есть другие коннекты с таким же query_id -
Спасибо!
-
Спасибо, получалось, что приложение вначале пыталось записать в базу, а потом только пулл конекшеннов создавало)
-
Добрый день! Спасибо вам большое за обратную связь, но к сожалению не помогло. Пробовала прописывать в разделах use_time_zone и разделе VM.
В superset даты отображаются в соответствии с текущем временем (Мск) и временем логирования в таблицах.
А вообще select now делаю, на это ориентируюсь.
У коллег все в норме. -
Попробовала, проверка соединения:
DBMS: ClickHouse
Case sensitivity: plain=exact, delimited=exact
Driver: ru.yandex.clickhouse-jdbc (ver. 0.1, JDBC0.1)
Effective version: UNKNOWN (ver. 0.0)
Ping: 76 ms (keep-alive query results in error)
Code: 516, e.displayText() = DB::Exception: Invalid authentication: it is not allowed to use Authorization HTTP header and authentication via parameters simultaneously (version 21.7.5.29 (official build)). -
Привет всем, я не спец в бд. Подскжите, использование UUID в качестве PK - уменьшит производительность ClickHouse, в сравнении с целым числом? Спасибо!
-
да. Самая большая проблема даже не в том что UUID не монотонный, а в том что UUID 16 байт, против UInt64 - 8 байт. Просто все операции в два - три раза медленее с UUID.
Также прямо сейчас наконец-то задумались как ужасно для btree индексов что UUID не монотонен, и создают аж 4 новых версии UUID.
Рекомендую посмотреть на twitter snowflake и sony sonyflake (там 64 бит и монотонность) потому что время в первых битах
39 bits for time in units of 10 msec
8 bits for a sequence number
16 bits for a machine id -
Большое спасибо! Первый раз строю бд в которой будет более млрд записей, потому думаю над pk - ибо это осноная табица, ее id не относятся ни к чему и нужна только уникальность. Пошел изучать sonyflake)
-
Лучше почитайте описание движка mergetree сначала
-
возможно вы роете не в ту сторону.
1. Зачем вам PK вообще?
2. Вам нужен простой хеш? Просто cityHash64 ? -
Его надо не читать, а прочувствовать))
-
По сути, все что мне нужно, это обязательная уникализация записи. Т.к записи будут добавляться разными скриптами - хочу не допустить конфликта, совпадений записей. Возможно вы правы, и есть иное решение
-
Спасибо, беру во внмание )
Ранее работал только с PostgreSQL -
Uuid который со временем еще и переполнится может если что. Году к 32 так насколько я помню.
-
Попробуйте подумать как не вставлять дубликаты лучше, удалять их на стороне клика не лучшая идея
-
Если надо перенести данные из PG, есть MaterilizePG движок базы данных
-
Ну вот я и задумался над гарантированной генерацией уникальной id записи не на стороне кх 🙂
Я бы мог не использовать Id или PK в целом, но от этих таблиц дльше буду строить связь, вклдывая id в другие таблицы. -
Спасибо! Пригодится еще)
-
Возможности интеграции PostgreSQL с ClickHouse / Ксения Сумарокова (Yandex)
Запись доклада PG Day'21 Russia Подписывайтесь на рассылку на нашем сайте чтобы не пропустить анонс следующей конференции https://pgday.ru/ ----------- Возможности интеграции PostgreSQL с ClickHouse / Ксения Сумарокова Доклад о том, как PostgreSQL может взаимодействовать с ClickHouse – зачем это нужно и какие возможности для этого есть. Будет рассказано о разных вариантах интеграции: реализация специализированных PostgreSQL движков разных видов для разных целей, у каждого свои преимущества. Большая часть рассказа будет посвящена репликации из PostgreSQL в ClickHouse – когда ClickHouse притворяется репликой PostgreSQL базы, причем реплицироваться может как вся база, так и любое подмножество таблиц. Расскажу о том, как реализована репликация – о протоколе логической репликации, подробно про его устройство и о том как он реализован в ClickHouse для репликации из PostgreSQL. Слайды: https://pgday.ru/presentation/281/60f04d3f07516.pdf
-
ну есть конфликт и что? какая разница?
и в чем проблема естественного ключа? -
Не знаю, так-то вы правы, ведь я могу ввообще не создавать уникальной идентификации записи, еси она мне не нужна 🙂
А группировать можно по любому целому числу или по времени
Нашел уже пару статей по вашим рекомендациям, изучаю. Спасибо за ответы! -
ребят, всем привет. Вопрос не технического плана.
А давно кликхаус от Яндекса откололся и стал самостоятельной организацией? -
-
Конец сентября
https://clickhouse.com/blog/en/2021/clickhouse-inc/Introducing ClickHouse, Inc.Today I’m happy to announce ClickHouse Inc., the new home of ClickHouse. The development team has moved from Yandex and
-
-
kafka_max_block_size меняли?
-
Да, его и увеличивал.
-
min_insert_block_size_bytes тоже?
-
min_insert_block_size_rows/bytes не трогал. Буду смотреть , спасибо.
-
с кафкой вообще все по другому. По умолчанию там poll идет какое-то время и флашится kafka_max_block_size
но если мы наконсьюмили 100 записей за период то и зафлашатся 100 записей
параметры https://github.com/ClickHouse/ClickHouse/pull/11388
kafka_flush_interval_ms -
В том-то и дело, что лаг миллиарды, и он уменьшается по 3-4кк, только вот прилетает на ноды по 30к ( всего 5 нод). Спасибо
-
это возможно Distributed так делает, когда режет на 5
зачем у вас Distributed? -
может включить --distributed_directory_monitor_batch_inserts arg Should StorageDistributed DirectoryMonitors try to batch individual inserts into bigger ones.
-
А, вы хотите предложить к конкретной партиции топика привязаться ?
-
нет конечно.
зачем у вас Distributed? -- Это нестандартный подход с кафка engine, и используется когда надо шардить по ключу. -
в 99% случаев с kafka engine просто пишут напрямую в *MergeTree
-
Собственно да, шардим по ключу.
-
ну это вам Distributed и дробит
-
пробуйте включить --distributed_directory_monitor_batch_inserts arg Should StorageDistributed DirectoryMonitors try to batch individual inserts into bigger ones.
-
Добрый вечер, позникла необходимость перенести базу на другой диск в пределах той же самой машины. Я так понимаю что правкой конфига CH и физическим переносом каталогов тут не обойдёшься, правильным ли будет делать это через бекап и последующее восстановление или есть какой-то безболезненный способ?
-
А это с синхронным работает модом для дистрибутивной таблицы ?
-
нет не работает
типа у вас кафка engine ждет что-ли пока все доедет до шардов? -
Ну да, так получается
-
нет, не нужен бекап.
Можно перенести и поправить конфиг
Ну и еще проще остановить КХ, перенести /var/lib/clickhouse/* на другой диск и замаунтить тот диск в /var/lib/clickhouse/ -
Благодарю
-
- 15 November 2021 (144 messages)
-
Всем привет. Разрабатываем систему аналитики, PostgreSQL не справляется, смотрим на clickHouse. Сейчас есть вопросы у нас, кто может проконсультировать по внедрению, напишите, пожалуйста, в личку.
-
мдя
-
-
Зачем? В смысле есть питон и го реализации. На go даже 2.
И речь про именно tcp протокол или native формат?
А ну и cpp есть -
Именно про tcp протокол, да.
Ну была надежда, что появилась дока. -
-
Вы можете начать собирать их не в оракл а в кликхаус)
-
-
У Вас заливка долгая или обогащение?
-
-
И как заливаете?
-
сорри, я просто капитана включил
-
Вообще пока для экспериментов, но мне нужна поддержка трейсинга, прогресса выполнения запроса, отсутствие оверхеда на рефлексию/interface{}, поддержка Map и т.д.
-
-
Ок, вопрос к DE, как лучше настроить экспорт через параллельные потоки
-
Здесь очень помогла бы информация сколько строк/ и сколько в этих строках колонок) заливается в сутки.
-
-
Принципиально КХ очень быстро записывает новые данные, главное отправлять их относительно большими пачками по 5к -50к строк
-
да, важно не сколько в сутки (раз уже оракл с этим справляется), а сколько в пачке
-
Кривой пайплайн будет, надо проверить сколько пачками забираете в оракл в сколько потоков. Возможно, косяк со стороны API...
-
Если не ошибаюсь ЯМ отдает по 10ГБ за запрос, не очень понимаю зачем тут оракл, забирать через ЯМ API можно чем угодно...никто не мешает параллельно запустить кучу запросов и упереться в ширину интернет канала
-
Подскажите пожалуйста, что тут не так?
Запрос:
SELECT * FROM (SELECT * FROM mydb.table1 cc INNER JOIN mydb.table2 dd ON dd.id=cc.table2_id ) d
ORDER BY d.id LIMIT 50 OFFSET 0
Вылетает ошибка:
ERROR [ExceptionsHandler] Syntax error: failed at position 38 ('*') (line 1, col 38): * FROM (SELECT * FROM mydb.table1 cc INNER JOIN mydb.table2 dd ON dd.id=cc.table2_id ) d ORDER BY . Expected one of: UNION, SAMPLE, LIMIT, WHERE, WINDOW, INNER, end of query, HAVING, AS, UUID, GROUP BY, INTO OUTFILE, identifier, OFFSET, LEFT ARRAY JOIN, PREWHERE, JOIN, alias, ORDER BY, array join, SETTINGS, ARRAY JOIN, FORMAT, Dot, WITH, table, table function, subquery or list of joined tables, FINAL, token (version 21.8.5.7 (official build)) -
Подскажите пж
В логах кх куча ошибок типа
<Error> ServerErrorHandler: Poco::Exception. Code: 1000, e.code() = 104, e.displayText() = Connection reset by peer
Что за пир мне неизвестно
Затем решил посмотреть логи ZK ииии походу вот он ответ
Refusing session request for client /10.13.2.80:43890 as it has seen zxid 0x3b00000001 our last zxid is 0x2332cd19c client must try another server
Но самое интересное, кажется что репликация работает валидно.
Вопрос как пофиксить zxid ? -
-
Те прирост 1ТБ в месяц?
-
-
-
-
-
-
Новые данные клик принимает очень быстро(именно новые, не update старых), но в любом случае вашей прослойке необходимо забирать данные из сервиса и отдавать их в клик.
По поводу скорости запросов, надо хорошо продумывать архитектуру таблиц чтобы запросы были быстрыми -
Данные рекомендуется вставлять пачками не менее 1000 строк или не более одного запроса в секунду. При вставке в таблицу типа MergeTree из tab-separated дампа, скорость вставки будет в районе 50-200 МБ/сек
https://clickhouse.com/docs/ru/introduction/performance/#proizvoditelnost-pri-vstavke-dannykhПроизводительность | Документация ClickHouseПроизводительность По результатам внутреннего тестирования в Яндексе, ClickHouse обладает наиболее высокой производитель
-
-
-
😀
-
Привет! как лучше вывести и ввести ноду с репликой в кластер? мне надо поменять диски, чтобы потом реплика налилась с двух оставшихся в шарде надо чтобы в зоокипере она не оставалась в путях, drop database на ноде перед реинсталлом - то что надо? или надо ещё что-то предварительно сделать?
-
https://github.com/ClickHouse/ClickHouse/issues/20868#issuecomment-781356896
вот это мне подойдёт? без первого пункта еслиHow to remove replica from clickhouse cluster? · Issue #20868 · ClickHouse/ClickHouseWe are using 3 replica node clickhouse cluster with node names of ch111,ch112,ch113 and we are using tables with engine Replicated merge tree, I would like to remove ch113 from the clickhouse clust...
-
По моему опыту заливка данных в ClickHouse на один сервер до полумиллиона записей в секунду
Только надо очень прилично буфферизировать записи - чем больше тем лучше
Это конечно не чисто реляционная база (нет транзакций)
но скорость выполнения простых и агрегационных запросов при правильно выбранных ключах впечатляет -
-
Чей API? ClickHouse?
-
Мне кажется имеется ввиду запрос к Апи Я метрики?
-
-
Здесь вряд ли помогут с этим вопросом. Вам надо самим разбираться что именно и как вы запрашиваете.
-
разбивайте на куски поменьше, чтобы параллельно несколько запросов крутились и по статусу progressed отслеживать
-
-
Можно. Проблема в том что это очень ограниченная команда, она меняет только метаданные, т.е. можно добавить колонку и одновременно добавить ее в конец order by. Индекс не меняется. Т.е. в индекс эта колонка не добавится.
-
-
А никак
-
-
Всем привет, такая проблема. Есть статичные (как правло строки и айдишники) данные о событии, а есть динамичные (только числовые).
Хочется поместить все данные в одну таблицу, динамичные данные просто обновлять с помощью добавления новых строк + используя движок summingmergetree.
Но событий очень много, следовательно и обновлять динамичные данные придется часто.
А чтобы динамику вставить в таблицу, надо добавлять её вместе со статикой, чтобы статика при слиянии summingmergetree не потерялась. Следовательно встала проблема как эту статику вытаскивать быстрее всего. Если вытаскивать из кликхауса, то это будет очень медленно (т.к. point queries).
Что можете посоветовать в данном кейсе? -
-
У меня пока только мысли появились в сторону создать materialized view, где будет index_granularity занижен и делать point queries (но это антипаттерн и хз сколько запросов эта система выдержит)
-
Что значит статические? Сколько их? Это дименшины? Тогда external dictionary
-
Мало выдержит. Тыщу в секунду может, может 5 тыщ. Там проблема из-за блоков компрессии и вообще кх не приспособлен для такого
-
а блоки нельзя уменьшить?
-
А проекции не вариант сделать ?
-
-
тыщу в секунду selectов на summingMT?
-
Вопрос был как бы не про это. Я подумал про коллапсинг/replacing и т.д.
-
пример строки:
статика: datetime, campaign_id, key (уникальный), lang, country и еще порядка 10 строк различных (некоторые из них в словари не запишешь)
динамика: cost, event, payout и еще подобных штук 10
так вот чтобы мне например изменить payout, то я добавляю всю строку целиком, а для payout добавляю разницу с предыдущим значением -
для текстов - только lz4/zstd. zstd медленней распаковывает
для чисел в доке КХ вроде неплохо объяснено, поверх t64 можно наворотить lz4/zstd если там данные повторяются, а поверх прочих - даже нужно, поскольку они лишь уменьшают энтропию -
Причем тут самминг. Вообще не про эту таблицу речь была?
-
Так вот самая боль это в вытащить статику, чтобы при слиянии не потерялась
-
https://clickhouse.com/docs/ru/sql-reference/statements/alter/projection/, https://www.youtube.com/watch?v=jJ5VuLr2k5k&t=636s&ab_channel=Percona . Возможно поможет проекция, которая позволит создать дополнительные ключиPROJECTION | Документация ClickHouse
Манипуляции с проекциями Доступны следующие операции с проекциями: ALTER TABLE [db].name ADD PROJECTION name ( SELECT <C
-
В ETL до втставки в кх надо такое делать
-
ну там человек написал, что вроде хочет самминг использовать и как я понял писать в нее через МВ.
мой вопрос про "тыщу"
Тыщу селектов выдержит или чего? -
а если у меня рандомные цифры?
-
Вот тут тесты с direct словарем https://kb.altinity.com/engines/altinity-kb-embeddedrocksdb-and-dictionary/ все числа видны. Там был nvme
-
рандом не жмётся :) но если это цифры в текстовом поле, то zstd их пожмёт - это фактически lz4+huffman
-
а можете пояснить как это? Как я понял, это где-то в другой key-value БД иметь мою строку, оттуда ее быстро достать и уже потом вставить в КХ
-
Даже если выключить сжатие все равно будут блоки компрессии, просто не сжатые. Их правда можно уменьшить но на инсерте, в мержах опять все разьедется
-
Да. MySQL redis Cassandra
-
ну то есть система сразу х2 памяти потребует если не больше)
печально, но куда деваться -
ты перепутал двух вопрошающих, Антон про блоки ничего не спрашивал
-
там просто этих строк миллиарды, но благо те что надо обновлять можно хранить только последние 6 месяцев
-
К сожалению чудес не бывает.
-
Ну я примерно так и подозревал что придется сделать. Спасибо за подсказки
-
-
Нет конечно. Только хуже станет.
-
нет, конечно. если у тебя случайные числа, то они не жмутся. если ты их сохранишь как string - они займут больше места и zstd (а фактичсеки просто huffman из него) сожмёт их до оригинального размера. это понятие энтропии из computer science
-
если я правильно понимаю ваш ответ - то клик жмет данные только в пределах ячейки? я почему-то думал что там история с жатием всей патиции/столбца
-
он жмёт кусок столбца размером в десятки килобайт минимум. если есть повторы между строками - lz4/zstd могут помочь, но вряд ли сильно. в lz4 миним. длина совпадения для сжатия - 4 байта. в старших режимах zstd (с медленным сжатием) размер матча начинается с 2-3 байт
-
hello all, we need to frequntly update the tables that we created on cluster in distributed way but we come to know that distrbuted tables dosent support mutation
is there any better way to update tables on cluster ? -
-
Привет. Кто-либо сталкивался с утечками памяти в clickhouse-odbc-bridge? Мы наблюдаем постоянный рост потребления ото дня ко дню, пока в конечном итоге не словим ООМ. Через ODBC вытягиваются жирные куски, поэтому таймаут (http_receive_timeout) подкручен, но в остальном дефолт.
ClickHouse server version 21.3.12.2 (official build). -
ага. в целом вопрос снят, спасибо
-
Подскажите приаттачится ли партиция взятая с БД на CentOS к табличке в БД той же версии на Ubuntu?
-
Баг
-
Да.
-
В какой версии кх?
-
ClickHouse server version 21.3.12.2 (official build).
-
и да - числовые кодеки (t64/gorilla/*delta) как раз используют корреляцию между числами в близких строках, вы их описание в доке КХ прочли?
-
-
-
Hi, I'm testing clickhouse keeper, I compiled it on 3 servers, but takes a long time to compile.
Are you planning to upload binaries to https://repo.yandex.ru/clickhouse/tgz/testing/ ?
Is there a faster way to install on debian 11 ?
Thanks -
Так и задумано. Данные аггрегируются в фоне при мержах. Во всех движках. Вы всегда должны делать запросы с sum group by что бы финализировать агрегации
-
https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7597
https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf -
т.е. если делаю запрос с sum group by, то в итоге новая запись объединится со старыми верно?
-
You don.t need to compile. Keeper is part of ch distribution.
-
Да
-
с group by понятно, sum это просто агрегатная функция которую использую в select? т.е. имеете в виду, что при select'е с агрегатными функциями всё пересчитается в фоне
-
Да. Давайте вы видео посмотрите и поймёте что такое мат.вью
-
спасибо, большое )) долго искал ответ на этот вопрос. будьте здоровы!
-
Привет всем! Вставляю данные из консоли кликхауса в таблицу login(Engine=Postgres). Таблица login имеет поле id со значением по умолчанию nextval('login_seq'::regclass).
Как при вставке из кликхауса заставить увеличиваться значение в этом поле. При вставке из консоли posgres увеличение происходит. INSERT INTO postgres.login (name) VALUES
Query id: 81b266bd-3745-4316-a8de-c31466dc0458
Ok. -
-
What do you mean with ch distribution? I don't see clickhouse-keeper binary anywhere
-
Ch has a single binary for all applications :) . Just create a symlink and name it as keeper. Or run using space "clickhouse keeper". keeper as an argument. Check other applications, clickhose-client, clickhouse-copier, etc.
-
I see.. I was looking for split packages, this works too. Thanks.
Btw, for me it works well, no issues. When you think it will be released as stable? -
People use it in production. I guess January.
-
There are English chat btw https://t.me/clickhouse_enClickHouse
ClickHouse DBMS discuss and help
-
Can anyone send me the query how to find the new customer who enroll last month
-
Мутация не выполняется но и с ошибкой не падает, просто висит бесконечно, килл и ALTER заново не помог
-
Mutation not progress it's state is_done=0, there are no falls but mutation not progress, I kill this mutation and retry, but it didn't help
-
в ситем мутатионс и мерджес ничего примечательного
-
спасибо, уже все встало на свои места
-
select * from system.metrics where metric = 'PartMutation' она висит
-
тут какие-то действия происходят, но не факт что вообще когда-нибудь выполнятся
-
реплик нет standalone
-
отбой оно отработало
-
здравствуйте!
подскажите пожалуйста по дефолтным значениям колонки.
добавил колонку
alter table numbers3 add column "origin_event_uuid" String DEFAULT toString(generateUUIDv4()) after origin_event_id
с идеей чтобы колонка сразу была заполнена uuid-ами.
в итоге, при каждом селекте значение поля разное.
как сделать, чтобы значение "зафиксировалось"? -
ALTER TABLE numbers3 UPDATE origin_event_uuid = generateUUIDv4()
-
спасибо!
-
-
-
Точно в этом запросе ошибка?
Может быть далее не хватает скобки? -
-
-
уверены что окно это сессия?
Значение по умолчанию у настройки 1? -
пробовал по-разному и 1 и 0
-
настройка применяется в сессии, у вас окно=сессия?
там табикс вроде иначе работает, пост/гет, не знаю точно, там надо по-другому настройку прокидывать. -
я и в users.xml поменял — ничего
-
-
if
-
-
если я напишу if(isDate(toDate(var)), 1, 0)
если toDate(var) вызовет ошибку (не сможет спарсить), то как это должно заработать? -
https://clickhouse.com/docs/ru/interfaces/formats/#skippingerrors это не поможет ?Форматы входных и выходных данных | Документация ClickHouse
Форматы входных и выходных данных ClickHouse может принимать (INSERT) и отдавать (SELECT) данные в различных форматах. П
-
там вся строка игнорируется, что для нашего случая — нехорошо
-
Ну тут только городить огород ... Как я вижу ... Может кто то поможет
-
-
Counter id not null, интсертишь null?
-
да. именно так. хочу посмотреть будет дефолт или нет. потому что из документации явно непонятно
-
-
-
Добрый день! Подскажите, умеет ли CH устанавливать TTL на таблицах RocksDb?
- 16 November 2021 (151 messages)
-
What we do here is bitcoin mining and binary option trade, we manage account and trade for clients with our remote controlled software which enable you earn 100% on the return of your investment (ROI) capital which gives you ten times your capital as profit within 24 hours
👇👇👇👇👇👇👇
https://t.me/joinchat/aiMAaQE_kvxhYzY0
https://t.me/joinchat/aiMAaQE_kvxhYzY0 -
What we do here is bitcoin mining and binary option trade, we manage account and trade for clients with our remote controlled software which enable you earn 100% on the return of your investment (ROI) capital which gives you ten times your capital as profit within 24 hours
👇👇👇👇👇👇👇
https://t.me/joinchat/aiMAaQE_kvxhYzY0
https://t.me/joinchat/aiMAaQE_kvxhYzY0 -
Как я вижу по документации, нет
-
Is there a function with two fields to duplicate
-
нет, не умеет
-
-
непонятен вопрос)
-
-
-
Да, конечно.
-
А как это сделать не подскажите, что нужно включить ?
-
Надо понять из-за чего падает, джойн больших таблиц? Группировка есть?
-
-
-
ну вот и ответ, не джойнить 2 большие таблицы)
Сколько у вас памяти? Какой лимит? Мб можно подять max_memory_usage?
+ смотрите max_bytes_before_external_group_by -
64 Gb ОЗУ
-
-
можно пробовать группировку во внешней памяти max_bytes_before_external_group_by
медленные вариант set join_algorithm='partial_merge';
И конечно же не соединять 2 большие таблицы -
-
насколько я помню дропать можно только по одной партиции
-
а если делать delete по ключу партиционирования, это будет сильно долше?
-
Добрый день.
Периодически падают распределенные запросы с ошибкой
DB::NetException: Timeout exceeded while reading from socket (х.х.х.х:8124):
while receiving packet from х.х.х.х:8124:
While executing Remote. (SOCKET_TIMEOUT) (version 21.9.5.16 (official build))
подскажите какой параметр подкрутить? -
скорее всего да, и это будет много дороже по ресурсам)
-
напишите простенький скрипт на том же питоне который последовательно удалит ваши отобранные партиции
-
через запятую можно указать несколько имён партиций
ALTER TABLE table DROP PARTITION 1, DROP PARTITION 2, DROP PARTITION 3 -
-
-
+
-
Это видимо лучшее решение, просто думал вообще одним запросом просто дропать, видимо придется сначала сходить за партициями, спасибо!)
-
можно запросом запрос оформить через concat
-
и вот вопрос, есть в КХ аналог постресного \gexec ?
-
Вот да, я не нашел.. оформить то сможешь конкатенацией, но выполнять то все равно сторым запросом)
-
всем привет! когда я создаю поле с типом FixedString и вставляю туда строки, как я могу заранее проверить, правильный ли размер у строки: функцией byteSize или функцией length?
-
у вас ошибка TOO_LARGE_STRING_SIZE или какая то другая?
зачем нужен именно FixedString? -
может проще взять обычный LowCardinality(String)
-
Всем привет! Подскажите пожалуйста, существует ли настройка max_bytes_before_external_group_by для Distributed таблиц ? Столкнулся с ошибкой
: Memory limit (for query) exceeded: would use 23.28 GiB (attempt to allocate chunk of 4203484 bytes), maximum: 23.28 GiB: While executing AggregatingTransform. (version 19.17.9.60 (official build))
при выполнении запроса к Distributed таблице. При выполнении такого же запроса к серверу из кластера ошибки не наблюдаю. -
это наш собственный id пользователя, всегда одной длины. хочется эффективно хранить
-
Всем привет! Подскажите, пожалуйста, если в таблице тип колонки LowCardinality, при селекте стоит преобразовывать в этот тип(использовать toLowCardinality)
-
ну если он у вас одной длинны (в байтах)
то храните
непонятно в чем проблема зачем вам заранее пытаться определить длинну? -
нет, только если ошибки какие то, а так оно само распакует
-
спасибо
-
сначала чтобы понять, какой FixedString объявить при создании таблицы. а потом в источнике, откуда мы тянем данные, встречаются казусы типа testtesttesttest... - не хочется из-за таких штук однажды поймать исключение.
поэтому я хочу в ETL-ке заложить проверку на длину строки перед тем, как делать вставку в таблицу -
так вопрос как раз этом =)
длина строки n в байтах это length(n) или byteSize(n) ? -
FixedString(x) - x в байтах всегда
length() в clickhouse это тоже в байтах
чтобы в символах есть
lengthUTF8 и char_length -
есть еще вопрос, при создании новых таблиц создается новый сторадж, однако при удалении таблицы сторадж остается и сейсас у меня куча стораджей
-
ETL же внешний по отношению к clickhouse процесс?
вы всегда будете получать exception если будете длинную строку вставлять в fixed string
фильтруйте до вставки в clickhouse
либо возьмите обычный String CODEC(ZSTD(3))
и не парьтесь -
что такое "новый сторадж"? что имеется ввиду?
/var/lib/clickhouse/storage/XXXX ? -
да счас уже сотня стораджей и ищу пути сокращения их числа
-
да, сделаю фильтрацию перед вставкой. спасибо ☀️
-
DROP TABLE db.table SYNC
удалит все сразу -
это особенность Atomic движка базы данных
-
Чуть не ушло из поля зрения! Но мы всё видим и знаем!!! 😉
Поздравляем Сюнякова Андрея с Президентской медалью, привезённой с "Кубка Губернатора Ленинградской области", прошедшего в минувшие выходные!!!
Ура! Так держать!!!
https://ipsc.by/aleya-slavy-regiona/ -
после обновления на 21.11 в логах наблюдается
2021.11.16 13:45:21.413957 [ 31020 ] {ef8e3f13-569c-41fa-b09e-8b8a2c7f1251} <Error> DynamicQueryHandler: Code: 107. DB::ErrnoException: C
annot open file /var/lib/clickhouse/metadata/system/asynchronous_inserts.sql, errno: 2, strerror: No such file or directory. (FILE_DOESNT
_EXIST), Stack trace (when copying this message, always include the lines below):
Откуда его взять и почему не пришел с обновлением?
Ошибка долетает даже до DataGrip. -
видимо это Data Grip пытается метаданные читать
SELECT * FROM system.query_log WHERE query_id='ef8e3f13-569c-41fa-b09e-8b8a2c7f1251' FORMAT Vertical
посмотрите в clickhouse-client -
вообще system.asynchronous_inserts очень новый фукнционал, скорее всего недопилено что-то
таблицы такой в документации еще нет -
да, он - http_user_agent: Apache-HttpClient/4.5.2 (Java/11.0.11)
Но я ничего такого асинхронного не делал. Непонятно зачем DataGrip туда полез. -
вы сам query то покажите который DataGrip делает?
DataGrip ничего такого страшного не пытался делать, какой нибудь SHOW CREATE TABLE
и т.п. для всех system.* таблиц пытается показать...
но видимо ошибки не ожидает от clickhouse
а clickhouse может для таблиц в system не иметь *.sql репрезентации в метаданных -
Всем привет.
Вопрос по бекапам, я правильно понимаю что делать бекап зукипера фактически бесполезная идея так как сделать бекап с точным стейтом базы фактически нереальная задача? И достаточно делать бекап кликхауса. -
я обычный селект делал к делу не относящийся. А DataGrip действительно зачем-то туда полез:
query: show create table system.asynchronous_inserts FORMAT TabSeparatedWithNamesAndTypes; -
Добрый день.В клх есть тип данных LowCardinality.Скажите,пожалуйста,целесообразно использовать ли данный тип данных при множестве пустых значений в данных и большим количеством строк в CSV файле(более ста тысяч)?
-
100 тысяч уникальных строк?
-
Уникальных строк всего 45
-
Смысл есть
-
А подскажите какие рекомендации по инстансам в awe для шардов кликхауса в eks. Скажем я думаю выделить каждому шарду 64гб памяти, 8 ядер и 4 тб диск, данных будем хранить много, масштабироваться будем шардами. Это нормальное железо, или надо увеличить или перебалансировать?
-
-
Всем привет! Подскажите пожалуйста, существует ли настройка max_bytes_before_external_group_by для Distributed таблиц ? Столкнулся с ошибкой
: Memory limit (for query) exceeded: would use 23.28 GiB (attempt to allocate chunk of 4203484 bytes), maximum: 23.28 GiB: While executing AggregatingTransform. (version 19.17.9.60 (official build))
при выполнении запроса к Distributed таблице. При выполнении такого же запроса к серверу из кластера ошибки не наблюдаю. -
если стопнуть вставки и background merge на clickhouse
то можно и бекап ZK сделать, чтобы состояние консистентное более или менее получилось...
если восстанавливать в clickhouse на пустой zookeeper
то по идее при старте clickhouse он зарегистрирует реплику и все парты которые в этой реплике появятся
восстанавливать "на заполненный zk"
та еще затея
поэтому в clickhouse-backup есть --rm который делает DROP TABLE ... SYNC (чтобы из ZK данные тоже вычистить) и только потом делает ATTACH PART -
Просто как я поняла, данный тип данных лучше всего работает со строковыми значениями,а с числовыми и логическими так себе.
-
Спасибо
-
пустых строк сколько в процентах от общего числа?
-
Спасибо, да, я пробовал при чистом zk восстановить базу через clickhouse-backup, в принципе поведение как вы описываете. Нормально восстанавливает, и в пустом zk делает все нужные записи. Просто думал может я что упускаю и было бы неплохо еще zk бекапировать.
-
35 процентов от общего количества
-
Добрый день, прошу помощи.
Есть кластер clickhouse, 2 шарды, 2 реплики в каждой шарде.
Есть кластер из 3х Zookeeper.(Живет на тех же нодах что и clickhouse)
Ноды: 1U / Dell PowerEdge R440 / 2xSilver 4216 / 8x32GB DDR4 / no HDD @ H330 / 2x10G
Конфиг zookeeper, идентичен рекомендациям в документации.
Нагрузка 312к/с судя по графику
Есть такая ошибка:
message
auto DB::StorageReplicatedMergeTree::processQueueEntry(ReplicatedMergeTreeQueue::SelectedEntryPtr)::(anonymous class)::operator()(DB::StorageReplicatedMergeTree::LogEntryPtr &) const: Code: 235, e.displayText() = DB::Exception: Part 202111_1122984_1122984_0 (state Committed) already exists, 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) @ 0x8fdbc9a in /usr/bin/clickhouse
1. DB::MergeTreeData::renameTempPartAndReplace(std::__1::shared_ptr<DB::IMergeTreeDataPart>&, SimpleIncrement*, DB::MergeTreeData::Transaction*, std::__1::unique_lock<std::__1::mutex>&, std::__1::vector<std::__1::shared_ptr<DB::IMergeTreeDataPart const>, std::__1::allocator<std::__1::shared_ptr<DB::IMergeTreeDataPart const> > >*, DB::MergeTreeDeduplicationLog*) @ 0x10d07ec0 in /usr/bin/clickhouse
2. DB::MergeTreeData::renameTempPartAndReplace(std::__1::shared_ptr<DB::IMergeTreeDataPart>&, SimpleIncrement*, DB::MergeTreeData::Transaction*, DB::MergeTreeDeduplicationLog*) @ 0x10d09088 in /usr/bin/clickhouse
3. DB::StorageReplicatedMergeTree::fetchPart(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, unsigned long, std::__1::shared_ptr<zkutil::ZooKeeper>) @ 0x10a96faa in /usr/bin/clickhouse
4. DB::StorageReplicatedMergeTree::executeFetch(DB::ReplicatedMergeTreeLogEntry&) @ 0x10a8efc9 in /usr/bin/clickhouse
5. DB::StorageReplicatedMergeTree::executeLogEntry(DB::ReplicatedMergeTreeLogEntry&) @ 0x10a6e774 in /usr/bin/clickhouse
6. ? @ 0x10b2e41f in /usr/bin/clickhouse
7. 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::Replicated
Пришел к выводу что дело в zookeeperе, потому,
Что было сделано:
1) Перенесли Zookeeper на ssd диски, ошибка не исчезла.
2) Изменили значения java (Xmx Xms до 4G), ошибка не ушла.
3) Перенесли Zookeeper на отдельные ноды, но ошибка на месте.
Нагрузка происходит примерно таким образом, что запросы пишутся в первую ноду(из 4х) а дальше реплицируются через Distributed, по оставшимся нодам.
Есть ли те кто сталкивался с подобным и победил? -
limit by
https://clickhouse.com/docs/ru/sql-reference/statements/select/limit-by/LIMIT BY | Документация ClickHouseСекция LIMIT BY Запрос с секцией LIMIT n BY expressions выбирает первые n строк для каждого отличного значения expressio
-
-
эт я читал, не понимаю как это можно применить)
-
без тестовых данных могу вам только на пальцах объяснить: группируете по юзер и получаете топ 100. потом делаете запрос с этой сотней айдишников и сортировкой по ревеню и добавляете лимит бай.
-
с подзапросом не сложно сделать)
-
как поставить лимиты времени на хранение данных в системных таблицах
-
можете сделать и на оконках/массивах, но уж лучше с подзапросом
-
можно и без подзапроса, но без данных совсем сложно. Вроде как-то так должно быть, но не проверял:
select user,product,sum(revenue) as total group by user,product order by total desc limit 5 by product limit 500 -
так пробовал, не гарантирует что юзер из топ 100 попадёт в выборку
-
не гарантирует. Но в этом суть limit by. Обычное решение с подзапросом как прозвучало выше.
-
Всем привет!
У меня мутация не проходит уже 8 часов. Висит в system.mutations с is_done=0 мерж не запускается. Мутация создана запросом alter table table_name materialize projection projection_name. На базе развернутой локально все прошло гладко: после мутации сразу же запустился мерж и прошел через пару минут.
Связываю такое поведение с нехваткой памяти хранилища в проблемном окружении. Есть ли способ уточнить причину такого поведения? -
aв system.mutations есть latest_fail_reason ?
-
-
нету
-
народ, а подскажите почему не работают функции snowflakeToDateTime и остальные связанные с работой с такими айдишниками.
В документации всё описано, а на сервере
DB::Exception: Unknown function dateTimeToSnowflake
DB::Exception: Unknown function snowflakeToDateTime64: -
-
-
-
-
Идем в PR
https://github.com/ClickHouse/ClickHouse/pull/27704
щелкаем по merged commit
https://github.com/ClickHouse/ClickHouse/commit/273b8b9bc15496738f895292717f5515c4d945f5
master (#27704)
v21.12.1.8752-testing
v21.10.1.7845-testingfeat: add conversions between snowflake id and dateTime(dateTime64) by jasine · Pull Request #27704 · 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...
-
Спасибо, уже нашли.
Будем ждать когда заедет в лтс или сами бэкпорт сделаем -
в LTS не заедет это точно, тк это фича (те ждать придется 22.3)
-
https://github.com/ClickHouse/ClickHouse/issues/27058#issuecomment-890559229
Можете просто использовать bitshift+ castsnowflake id (not to confuse with Snowflake service) time extract and convert functions · Issue #27058 · ClickHouse/ClickHouseUse case snowflake id is a form of unique identifier used in distributed computing. The format was created by Twitter and it is widely used in many products such as discord api and etc. snowflake i...
-
Тоже вариант, спасибо.
Там в КХ случайно ещё нельзя свои функции хранить? -
Можно, но опять в 21.10
https://github.com/ClickHouse/ClickHouse/commit/8403f381da877b65dbee1c8215c673c8c1e1394eMerge pull request #23978 from Realist007/feature/create-simple-lambd… · ClickHouse/ClickHouse@8403f38…a-function Feature/create simple lambda function
-
Круть нереальная )
-
на некоторыx (например, query_log) можно просто добавить TTL
ALTER TABLE ... MODILY TTL ... -
спасибо
-
Добрый вечер. Тупой вопрос. Есть колонка в одной таблице типа Nullable(UInt256) значения этой колонки хочу вставить в другую таблицу, в колонку с типом Decimal(38, 0). Провожу INSERT через toDecimal256 в результате пишет ошибку. Кто может помочь? DB::Exception: Decimal convert overflow: while converting source column toDecimal256(data_transfer, 0) to destination column data_transfer: while executing 'FUNCTION _CAST(toDecimal256(data_transfer, 0) :: 4, Decimal(38, 0) :: 15) -> _CAST(toDecimal256(data_transfer, 0), Decimal(38, 0)) Decimal(38, 0) : 16'. (DECIMAL_OVERFLOW)
-
Доброго времени суток, коллеги, а может кто - то подсказать по поводу распределенных таблиц. Возможно ли как - то настроить ключ шардирования так, что бы при insert в таблицу Distributed данные распределялись по определенному условию. Например есть два шарда и необходимо, что бы на один шард шли данные у которых в конкретном поле значение 1, а на другой шли данные со значением 2 и 3. Заранее Спасибо за ответ.
-
CH вроде уже выехал :)))
-
Кек
-
Остались непогашенные судимости видимо
-
ну раз там можно указать функцию rand(), то думаю и ваш if тоже влезет
-
Кажется, в условия можно писать выражения. Но это плохо масштабируется
например, тут можно записать ENGINE = Distributed(cluster, db, table, column - 1 = 0)
все со значением column =1 пойдут в один шард, остальное - в другой
Я бы так не делал ) -
Доброго времени суток!
Я новичок в CH, не могли бы Вы мне подсказать:
Каждые N минут (N - мало) мне приходит файл с новой версией данных, которые мне надо грузить в CH. При этом строки могут быть изменены/удалены/добавлены.
Я почитал немного, вроде как лучше использовать CollapsingMergeTree, так ли это? -
измененны - добавлены это не проблема - в этом случае ReplacingMergeTree - ситуация с delete - или удалять через Alter или использовать Collapsing и ставить state -1 для старых данных.
-
можно сделать две таблицы - активная - пассивная. И играться через Merge. https://clickhouse.com/docs/ru/engines/table-engines/special/merge/Merge | Документация ClickHouse
Merge Движок Merge (не путайте с движком MergeTree) не хранит данные самостоятельно, а позволяет читать одновременно из
-
-
-
Всем привет.
Может кто-то сталкивался с проблемой и может объяснить поведение, есть кластер из нескольких нод с версией 21.4.3.21, таблицы на движке ReplicatedReplacingMergeTree
При выполнении запроса получают всегда разный результат, при том что данные не пишутся:
SELECT
AVG(length(arrayCompact(arraySort((x, y) -> y, events, times)))) AS mean_events,
median(length(arrayCompact(arraySort((x, y) -> y, events, times)))) AS median_events
FROM
(
SELECT session,
groupArray(event_name) AS events,
groupArray(time) AS times
FROM event
WHERE time BETWEEN '2021-10-01 00:00:00' AND '2021-10-01 23:59:59'
GROUP BY session
)
Исправляет проблему добавление подзапроса + FINAL (без того либо другого проблема остается):
SELECT
AVG(length(arrayCompact(arraySort((x, y) -> y, events, times)))) AS mean_events,
median(length(arrayCompact(arraySort((x, y) -> y, events, times)))) AS median_events
FROM
(
SELECT session,
groupArray(event_name) AS events,
groupArray(time) AS times
FROM (
SELECT session, event_name, time
FROM event FINAL
WHERE time BETWEEN '2021-10-01 00:00:00' AND '2021-10-01 23:59:59'
ORDER BY session, time
)
GROUP BY session
) -
🤝 Пpивeтcтвуем всех!
Предocтавляем следующие уcлуги:
✅ Снятиe зaпрета на въeзд в РФ
✅ Очисткa крeдитнoй истории
✅ Дocpочное снятиe судимости и очиcткa истopии.
3a подpoбностями бpaщaйтecь в лс -
Возможно из-за того что у вас лямбды одинаковые
-
Если оставить только AVG(length(arrayCompact(arraySort((x, y) -> y, events, times)))) AS mean_events ситуация аналогичная
-
Так а ошибка большая?
-
А если просто день оставить ?, Без времени
-
Между разными запросами прмерно в 0.006 колеблется
-
-
В кликхаус клиенте запускал ?
-
-
Нет, но пробовал без distributed таблицы таже история. Если уменьшить интервал выборки, например до часа, то проблема уходит
-
-
-
-
Date(time) = '2021-10-01' пробовал так ?
-
Аналогично
-
/report
-
!report
-
Может там мёрджи фоне идут потому что реплейсинг схлопывает строки?
-
Именно на этом интервале изменений нет, партиции давно не менялись.
-
Ну и давно прогнали их через OPTIMIZE
-
Тут подобную проблему раньше описывали, там был кривой шардинг, что-то типа рандома. Чувак просто не учёл, что дистрибьютед талица не делает реплейсинга, реплейсинг срабатывает только по отдельности на каждой ноде, но не на итоговом результате. Можете в поиском найти эту историю. Так что можете показать ддл таблицы и дистрибьютед талицы, а мы скажем, где там трабла.
-
Не, это исключено. На шардированной таблице та же самая проблема
-
Если что проблема появляется именно при добавлении arrayCompact, без него все работает как ожидается
-
Но на всякий случай покажите ддлы :)
-
А как запрос выглядит без arrayCompact?
-
Как в примере выше, только без arrayCompact
-
Понятно что у него результат другой, но он воспроизводимый по крайней мере
```
SELECT
AVG(length(arraySort((x, y) -> y, events, times))) AS mean_events,
median(length(arraySort((x, y) -> y, events, times))) AS median_events
FROM
(
SELECT session,
groupArray(event_name) AS events,
groupArray(time) AS times
FROM event
WHERE time BETWEEN '2021-10-01 00:00:00' AND '2021-10-01 23:59:59'
GROUP BY session
)
``` -
Без финала он же выведет кривой результат.
-
В том то и дело что работает идемпотентно и дает одинаковый результат, без arrayCompact. Как только появляется arrayCompact, начинаются проблемы. Единственный способ при котором arrayCompact работает идемпотентно - это добавление подзапроса + final, как я писал с самого начала
-
```
create table clickstream.event_shard
(
id String,
session UUID,
event_name LowCardinality(String),
event_type LowCardinality(String),
time DateTime
)
engine = ReplicatedReplacingMergeTree('/clickhouse/tables/clickstream/{shard}/event_shard', '{replica}')
PARTITION BY toDate(time)
ORDER BY (time, event_name, event_type, cityHash64(session), id)
SAMPLE BY cityHash64(session)
SETTINGS index_granularity = 8192;
create table clickstream.event
(
id String,
session UUID,
event_name LowCardinality(String),
event_type LowCardinality(String),
time DateTime
)
engine = Distributed('cluster_name', 'clickstream', 'event_shard', jumpConsistentHash(cityHash64(toString(session)), 64));
``` -
Возможно без компакта у вас показывает среднюю температуру по больнице, а после компакта откидывается много дублей и на малых данных уже видна разница. Т.е. проблема может быть во все не в компакте.
-
Ааа. У вас ещё и семплинг. Его вроде не рекомендовали из-за сложных багов, а выхлопа с него практически нет.
-
А время вам точно нужно в order by? По нему же будет дедубликация происходить.
-
Это разве имеет отношение к вопросу?)
-
Ну вам можно посоветовать только одно. Для чистоты эксперимента создать таблицу Create table event2 as event engine=mergetree. И с посощью insert select скопировать данные за один день. После этого повторить ваш запрос. Если данные по прежнему меняются от запроса к запросу, то заводить баг. Если не меняются, то разбираться где у вас косяк. Особых вариантов нету.
-
Хотя про "заводить баг" я погорячился. У вас старая версия, такой тикет даже смотреть не будут. Надо будет поднять для теста инстанс с последней версией и воспроизвести на ней.
-
- 17 November 2021 (86 messages)
-
да
-
а как тогда консистентность обеспечивается? ну просто после создания хардлинка, изменяется содержимое исходного файла. получается, для резервного копирования данных, надо останавливать запись в БД?
-
Кх не изменяет файлы, а пишет новые.
Старые удаляются -
в ZK могут содержаться distributed ddl
но для восстановления из backup это не кажется важным
потому что восстановление из backup это disaster операция или какой нибудь CI/CD для staging
и по идее это значит что вам нужны только те данные которые есть в backup и они source of true -
тогда точно имеет смысл, потому что у вас оставшиеся 65 процентов сожмуться дополнительно в dictionary based кодировке
если бы было 90% тогда бы можно было подумать ...
вы просто сделайте два столбца один LowCardinality(String)
и сравните их через
LowCardinality не имеет смысл только когда значений уникальных больше миллиона
всякие там UUID и прочие действительно рандомные идентификаторы -
разве отсечка на миллионе? Вроде говорилось раньше про десятки тысяч?
-
https://www.youtube.com/watch?v=y8HsXqQEyfE&t=1s&ab_channel=%D0%9C%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3 тут вообще в лоу кардиналити запихнули всех авторов с GitHubАлексей Миловидов, ClickHouse - Типичные грабли аналитики на примере данных из Git
Алексей демонстрирует примеры решения аналитической задачи: изучение и упрощение модели данных; выбор структуры хранения; подготовка, обогащение и загрузка данных; как быстро изучить данные и избежать неправильных выводов; применимость данных для конкретных задач. Пример exploratory data analysis - изучение данных в поисках инсайтов без изначально поставленной задачи.
-
ну смотрите, тут скорее вопрос в том сколько записей внутри блока на одно уникальное значение внутри блока
то есть в целом именно кол-во уникальных значений для LowCardinality на всю таблицу оценивать можно, но это грубая оценка
то LowCardinality для миллион строк - миллион уникальных значений, работать не будет
а LowCardinality для 100 миллионов строк - миллион уникальных значений - в одном парте на 100 тыс строк, 10 тыс значений, вполне себе нормально -
> в одном парте
parts или partition? -
parts
-
Добрый день, посоветуйте, пожалуйста, решение. Задача следующая: есть таблица, в которой в одном из столбцов хранятся слова (токены) - keywords. Необходимо реализовать поиск, входные данные - массив слов. Нужно получить строки, в которых входной массив является подмножеством keywords. Пока пробовали хранить просто в строке и запрос строить как "like %word1% and like %word2% and...", также пробовали хранить keywords в Array(String), при запросе использовать hasAll. Вариант с like работает раза в 3 быстрее. Какие ещё есть способы?
-
Like можно ускорить (но не сильно, если ключевые слова высокочастотные)
через ngrambf_v1 DataSkip индексы
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/#functions-support
еще можно попробовать Like заменить на
len(multiSearchAllPositionsUTF8(keywords, ' keyword1 ',' keyword2 '))=2
но тоже скорее всего медленно будет
если слова хранить отсортированными в строке
то можно вместо AND
сделать один LIKE '%keyword1%keyword2%'MergeTree | ClickHouse DocumentationMergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
-
а вы понимает что там дословно написано в сообщении об ошибке, или лучше перевести?
-
-
-
ну ок, у вас запрос типа SELECT ... FROM (SELECT ) JOIN
надо либо FROM (SELECT ...) AS q1 JOIN сделать
либо настройку SETTINGS joined_sub_query_requires_alias=0 поставить -
оно не для таблицы, а для subquery
-
-
ClickHouse server version 21.3.12 revision 54447
Была авария на серверах ZK кластер ZK переходил в режим RO, после возврата кластера ZK в режим RW начали сыпатся ошибки в CH о том что не может найти файл на соседней ноде кусок лога 2021.11.17 12:05:36.381070 [ 18974 ] {} <Trace> HTTPCommon: Failed communicating with clichouse_server_02 with error 'Received error from remote server /?endpoint=DataPartsExchange%3A%2Fclickhouse%2Ftables%2Fshard_01%2Ftable_9865%2Freplicas%2F10.10.10.2&part=20211116_20211116_2373288_2373288_0&client_protocol_version=5&compress=false. HTTP status code: 500 Internal Server Error, body: X�ttl format version: 1
checksums.txt�Code: 76, e.displayText() = DB::ErrnoException: Cannot open file /data/clickhouse/data/default/%2Einner%2Etable/20211116_20211116_2373288_2373288_0/checksums.txt, errno: 1, strerror: Operation not permitted, Stack trace (when copying this message, always include the lines below):
0. DB::ErrnoException::ErrnoException(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, int, std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > const&) @ 0x84ee9ab in /usr/bin/clickhouse
1. DB::throwFromErrnoWithPath(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, int) @ 0x84eed24 in /usr/bin/clickhouse
2. DB::ReadBufferFromFile::ReadBufferFromFile(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, int, char*, unsigned long) @ 0x85397a8 in /usr/bin/clickhouse
3. DB::createReadBufferFromFileBase(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, unsigned long, unsigned long, unsigned long, int, char*, unsigned long) @ 0xe56926f in /usr/bin/clickhouse
4. DB::DiskLocal::readFile(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, unsigned long, unsigned long, unsigned long) const @ 0xe79092e in /usr/bin/clickhouse
5. DB::DataPartsExchange::Service::sendPartFromDisk(std::__1::shared_ptr<DB::IMergeTreeDataPart const> const&, DB::WriteBuffer&, int) @ 0xf30fdf7 in /usr/bin/clickhouse
6. DB::DataPartsExchange::Service::processQuery(DB::HTMLForm const&, DB::ReadBuffer&, DB::WriteBuffer&, DB::HTTPServerResponse&) @ 0xf30ee5c in /usr/bin/clickhouse
7. DB::InterserverIOHTTPHandler::processQuery(DB::HTTPServerRequest&, DB::HTTPServerResponse&, DB::InterserverIOHTTPHandler::Output&) @ 0xf5f2a1b in /usr/bin/clickhouse
8. DB::InterserverIOHTTPHandler::handleRequest(DB::HTTPServerRequest&, DB::HTTPServerResponse&) @ 0xf5f32e1 in /usr/bin/clickhouse
9. DB::HTTPServerConnection::run() @ 0xf668d5f in /usr/bin/clickhouse
10. Poco::Net::TCPServerConnection::start() @ 0x11d138af in /usr/bin/clickhouse
11. Poco::Net::TCPServerDispatcher::run() @ 0x11d152c1 in /usr/bin/clickhouse
12. Poco::PooledThread::run() @ 0x11e4b9e9 in /usr/bin/clickhouse
13. Poco::ThreadImpl::runnableEntry(void*) @ 0x11e4784a in /usr/bin/clickhouse
14. start_thread @ 0x7dd5 in /usr/lib64/libpthread-2.17.so
15. __clone @ 0xfdead in /usr/lib64/libc-2.17.so
(version 21.3.12.2 (official build))' will try to reconnect session
2021.11.17 12:05:36.381196 [ 18974 ] {} <Trace> ReadWriteBufferFromHTTP: Sending request to http://clichouse_server_02:9009/?endpoint=DataPartsExchange%3A%2Fclickhouse%2Ftables%2Fshard_01%2Ftable_9865%2Freplicas%2F10.10.10.2&part=20211117_20211117_2480343_2480343_0&client_protocol_version=5&compress=false -
-
-
-
Словил такую же ошибку при обновление дерева в DataGrip на последней версии КХ
-
SYSTEM DROP REPLICA
а потом SYSTEM RESTORE REPLICA
должно помочь, но это доступно с 21.8 а у вас 21.3
попробуйте
SYSTEM RESTART REPLICAS
на тех нодах откуда не получается достать данные
вообще странно, если clickhouse таблицы были в режиме RO
то вроде бы background merge для них не должен выполнятться и соответсвенно если у вас восстановился ZK правильно, а не какая то устаревшая версия данных, тогда таких ошибок не должно быть -
На тех нодах от куда пытаются файлы достать, файлов нет и папки парта тоже нет
-
Запись в кластер ведётся очень активно
-
-
Привет!
Подскажите, пожалуйста, какой параметр стоит изменить, чтобы избавиться от ошибки DB::Exception: Limit for rows or bytes to read exceeded, max bytes: 9.09 TiB, current bytes: 9.10 TiB: While executing Remote (version 21.8.10.19 (official build))? -
имеется ввиду запись ведется мелкими чанками?
-
простите, вы точно уверен что вам для результата работы нужно прочитать 9 терабайт?
может надо query переписать?
max_bytes_to_read настройка называется, но не советую ее менять -
Всем привет!
Может кто подсказать?
Создаем дикт с SOURCE(POSTGRESQL(
port ***
host ‘***’
user ‘***’
password ‘****’
db ‘***’
schema ‘***’
table ‘***’
))
Дикт создается без проблем, но когда через минуту он идет автоматически обновиться - выдает ошибку
pqxx::undefined_table, e.what() = ERROR: relation «table» does not exist, такое ощущение что при повторном походе за данными он просто игнорирует схему и не знает куда идти -
словари lazy
вы сразу после загрузки пробовали делать
SELECT * FROM db.dict_name? -
сейчас попробую
-
селект выполнился без проблем
-
в смысле данные выдал прямо из словаря?
-
Но вижу в system.dictionaries в столбце source у него стоит PostgreSQL: db.table ; т.е. схема не записывается в сурс дикта,..
Да, выдал данные из словаря. Я выставил ему лайфтайм 120, по идее сейчас он пойдет за данными и выдаст ошибку -
Привет. Подскажите, пожалуйста, как скачать build конкретной ARM версии (не master)?
-
Всем привет!
Возник вопрос по оптимизации работы со словарем.
Есть словарь margin_pricelist у него составной ключ (complex_key_hashed) margin_id, pricelist_id и в нем набор полей margin_id UInt64, pricelist_id UInt64, margin float, active UInt8
Есть таблица margin_pricelist созданная из словаря margin_pricelist
И есть запрос к товарным предложения где
В разделе SELECT цена для клиента получается с наценкой из словаря dictGetFloat32('margin_pricelist', 'margin', (toUInt64(9999), toUInt64(pricelist_id)))
В разделе WHERE есть фильтр доступных прайс-листов для клиента путем запроса pricelist_id IN (SELECT pricelist_id FROM margin_pricelist WHERE active = 1 AND margin_id = 9999)
Так вот поиск по таблице перебирает весь словарь, а так как он очень большой работает недопустимо медленно, как этот запрос можно оптимизировать или есть другой способ? -
Большими и пару раз в секунду
-
нет, это не влияет
-
кх в нынешнем мире - так сексуально, что сюда каждую ночь проникают дерзкие девчонки. а некоторые уже и ночи не в силах дождаться :)
-
похоже в данном случае спасет только кронжоба с system reload dictionary для обновления диктов. Все что можно попробовал, не хочет дикт повторно идти по правильному пути в постгру за данными
-
выглядит как повод для issue на github
а какая версия clickhouse у вас?
обновитесь до последней 21.8
https://github.com/ClickHouse/ClickHouse/commit/ed3f89a7be58b20c146fc8c000f43fb4759b073cMerge pull request #23980 from kssenii/add-postgres-schema · ClickHouse/ClickHouse@ed3f89aAdd missing table schema for postgres dictionary
-
попробуйте хранить 4-байтные хеши слов в массиве. по ним поиск может быть быстрее. а сами слова использовать только для окончательной верификации совпадения
-
попробуйте вместо schema
table 'schema.table'
?
если получится сделайте issue на github -
версия не последняя. да
21.6.5.37 -
да, пробовал так. Данные первый раз забирает успешно, но спустя лайфтайм ошибкой опять вываливается
-
Добрый день. У меня возникла проблема.
—
ClickHouse 21.3.4.25
Есть конструктор запросов, который делает запросы в CH.
— Запросы
1) SELECT ...(Тут большой запрос с куча join)... WHERE field in ('xxx').
2) SELECT ...(Тут большой запрос с куча join)... WHERE field in ('xxx') AND 0 = 0.
Запросы отличаться только условием 0 = 0
— Результат
1) все нормально отрабатывает. Explain поэтому запросу вернул 128 строк. Использовано оперативной памяти по query_log ~4.5GB
2) запрос падает по лимиту памяти 9.8GB. Explain по этому звапросу вернул 233 строки.
В чем может быть проблема? Я не могу убрать 0 = 0 т к это заглушка у конструктора, если небыли переданы параметры. -
https://github.com/ClickHouse/ClickHouse/commit/ed3f89a7be58b20c146fc8c000f43fb4759b073c
попробуйте обновиться до 21.6 последней
если критично
21.6.9.7 последняя версия в этой веткеMerge pull request #23980 from kssenii/add-postgres-schema · ClickHouse/ClickHouse@ed3f89aAdd missing table schema for postgres dictionary
-
скорее всего в clickhouse расчет всегда ведется по всем бранчам логики, short cirсuit logic далеко не везде приехал
https://github.com/ClickHouse/ClickHouse/search?q=short+circuit
0 = 0
всегда будет вычисляться
вне зависимости от field in ('xxx')
вам все таки надо конструктор запросов переделатьSearch · short circuit · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
спасибо! попробую
-
ClickHouse/ClickHouse tagged: v21.11.4.14-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.11.4.14-stable
Release notes:
v21.11.4.14-stable -
Добрый день, прошу помощи.
Есть кластер clickhouse, 2 шарды, 2 реплики в каждой шарде.
Есть кластер из 3х Zookeeper.(Живет на тех же нодах что и clickhouse)
Ноды: 1U / Dell PowerEdge R440 / 2xSilver 4216 / 8x32GB DDR4 / no HDD @ H330 / 2x10G
Конфиг zookeeper, идентичен рекомендациям в документации.
Нагрузка 312к/с судя по графику
ClickHouse server version 21.8.10
Есть такая ошибка:
message
auto DB::StorageReplicatedMergeTree::processQueueEntry(ReplicatedMergeTreeQueue::SelectedEntryPtr)::(anonymous class)::operator()(DB::StorageReplicatedMergeTree::LogEntryPtr &) const: Code: 235, e.displayText() = DB::Exception: Part 202111_1122984_1122984_0 (state Committed) already exists, 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) @ 0x8fdbc9a in /usr/bin/clickhouse
1. DB::MergeTreeData::renameTempPartAndReplace(std::__1::shared_ptr<DB::IMergeTreeDataPart>&, SimpleIncrement*, DB::MergeTreeData::Transaction*, std::__1::unique_lock<std::__1::mutex>&, std::__1::vector<std::__1::shared_ptr<DB::IMergeTreeDataPart const>, std::__1::allocator<std::__1::shared_ptr<DB::IMergeTreeDataPart const> > >*, DB::MergeTreeDeduplicationLog*) @ 0x10d07ec0 in /usr/bin/clickhouse
2. DB::MergeTreeData::renameTempPartAndReplace(std::__1::shared_ptr<DB::IMergeTreeDataPart>&, SimpleIncrement*, DB::MergeTreeData::Transaction*, DB::MergeTreeDeduplicationLog*) @ 0x10d09088 in /usr/bin/clickhouse
3. DB::StorageReplicatedMergeTree::fetchPart(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, unsigned long, std::__1::shared_ptr<zkutil::ZooKeeper>) @ 0x10a96faa in /usr/bin/clickhouse
4. DB::StorageReplicatedMergeTree::executeFetch(DB::ReplicatedMergeTreeLogEntry&) @ 0x10a8efc9 in /usr/bin/clickhouse
5. DB::StorageReplicatedMergeTree::executeLogEntry(DB::ReplicatedMergeTreeLogEntry&) @ 0x10a6e774 in /usr/bin/clickhouse
6. ? @ 0x10b2e41f in /usr/bin/clickhouse
7. 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::Replicated
Пришел к выводу что дело в zookeeperе, потому,
Что было сделано:
1) Перенесли Zookeeper на ssd диски, ошибка не исчезла.
2) Изменили значения java (Xmx Xms до 4G), ошибка не ушла.
3) Перенесли Zookeeper на отдельные ноды, но ошибка на месте.
Нагрузка происходит примерно таким образом, что запросы пишутся в первую ноду(из 4х) а дальше реплицируются через Distributed, по оставшимся нодам.
Есть ли те кто сталкивался с подобным и победил? -
short cirсuit вроде с версии 21.9 пришел? у нас установлена 21.3. и почему при условии которое должно ничего не делать, кроме как возращать всегда true, ломает выполнение запроса? и таже проблема если этот злополучное выражение перенести в having. без 0=0 работает с ним нет.
-
202111_1122984_1122984_0
судя по номерам блоков в парте, скажите, как часто и какими кусками в вставляете?
312k/sec это что? rows per second?
сколько это в queries per second? -
а вы EXPLAIN PIPELINE смотрите или просто EXPLAIN ?
есть возможность сделать EXPLAIN ESTIMATE ?
https://clickhouse.com/docs/en/sql-reference/statements/explain/#explain-pipelineEXPLAIN | ClickHouse DocumentationEXPLAIN Statement Shows the execution plan of a statement. Syntax: EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting = v
-
К сожалению есть только эта информация:
Посмотрел нагрузку на вставку:
все перенесенные на кластер парсеры 80-150К/sec
с одним парсером ~1К/sec, тестовый
и то что я прислал, взятое из грейлога, по каким критериям он считает, точно не скажу -
такое ощущение, что вы меня не слышите
что такое k/sec?
k это тысячи ЧЕГО? -
Смотрел просто EXPLAIN
EXPLAIN - 128 строк - 233 строки
EXPLAIN PIPELINE - 263 строки - 479 строк
EXPLAIN ESTIMATE - выдает ошибку. т к неподдерживает -
Не знаю в чем исчесляется.
В данный момент тестовая нагрузка такая, ошибки так же сохроняются:
-finder-paths='{TYPE}/{YYYY}.{MM}.{DD}/{HH}' \
-reader-workers=1 \
-parser-workers=2 \
-finder-range-level=minutes \
-finder-last-step=1440 \
-xh-storage-mysql-dsn='.....' \
-ch-storage-clickhouse-dsn='tcp://....' \
-aggregator-size=100000 \
-parser-time-rounding=5m \
-finder-time-from='2021-09-01T00:00' \
-config-countries-url='.....' \
-writer-batch-size=50000 \ -
а можете EXPLAIN и EXPLAIN PIPELINE
результаты выложить на pastebin.com куда нибудь? -
Я смотрел чем они отличаются. Все что есть в первом плане, присутствует и во втором. Но почти в конце во втором добавляется целый большой блок.
EXPLAIN
1) https://pastebin.com/6QQZyQRQ
2) https://pastebin.com/qLHr2wMT
EXPLAIN PIPELINE
1) https://pastebin.com/5eKVK8gp
2) https://pastebin.com/ipqZhYFQEXPLAIN SELECT WHERE - 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.
-
Добрый вечер!
Подскажите, пожалуйста, может ли Clickhouse работать с гео данными wkt формата, а именно wkt Multypolygon? Я не могу найти в документации подтверждений , нашел только https://clickhouse.com/docs/en/sql-reference/data-types/geo/. Однако в исходниках clickhouse как будто что-то такое есть (мб только для внутренного использования) https://clickhouse.com/codebrowser/html_report/ClickHouse/contrib/boost/boost/geometry/io/wkt/read.hpp.html
У меня в топике Кафка Полигоны в виде MULTIPOLYGON(((39.730000675456 43.600639579669,39.730834842459 43.601307747678,39.731411517398 43.602232293498,39.732516587512 43.603770581947,39.734297574298 43.60765497366,39.732709706561 43.608214305406,39.731368602053 43.609068829976,39.733417809741 43.611220624431)))
Думаю как можно их преобразовать при консюминге в CH формат PolygonGeo | ClickHouse DocumentationGeo Data Types ClickHouse supports data types for representing geographical objects — locations, lands, etc. Warning Cur
-
Привет!
Подскажите пожалуйста, а как можно в кх такой JSON распарсить?
SELECT
'[10000000000000000000000,4000000000000000000000]' as Json,
isValidJSON(Json) IsValid;
Выдает 0. Хочется сделать хотя бы JSONExtractArrayRaw(Json), но не выходит. Остается только по делиметру сплитить?
кх 21.11.3.6 -
-
судя по всему у вас WHERE 0=0 пытается делаться push down внутрь sub queries и в результате сильно усложняется план запроса
а без условия, такое ощущение что все эти ваши JOIN всегда false ... и где то clickhouse об этом догадался -
-
это не исходники clickhouse это сторонняя либа boost
сам clickhouse читать wkt не умеет -
спасибо, то есть единственный путь это splitByString/SplitByRegexp какой то свой в 10 этажей делать?
-
думаю что придется producer переписать
либо не использовать Engine=Kafka а писать свой консюмер с конвертацией -
ну или producer переписать
или свой consumer с парсингом писать -
https://clickhouse.com/docs/en/sql-reference/statements/create/user/
см. WITH ldap SERVER 'server_name'
server_name вот отсюда
https://clickhouse.com/docs/en/operations/external-authenticators/ldap/
ну и должен быть разрешен <access_management>1</access_management>
для пользователя из под которого CREATE USER запускаетсяUSER | ClickHouse DocumentationCREATE USER Creates user accounts. Syntax: CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [ON CLUSTER cluster_name1] [,
-
нет, любой сервер нельзя
-
и список нельзя?