- 01 September 2021 (193 messages)
-
-
Подскажите кто сможет, перевый раз с таким сталкиваюсь. Использую ch в docker контейнере. Вот docker пишет что всё запущено (уже даже перезапускал). Но ни через http ни через datagrip подключиться к ch не получается. ch-client через отдельный контейнер не подключается, но если зайти внутрь контейнера с ch то ch-client работает.
-
У вас, скорее всего, порты не проброшены на машину хоста, или network_mode: host не выбран.
-
Поищите в чатике по listen_host, очень много таких вопросов
-
У нас довольно легко прошло обновление до 21.3. Почитайте документацию Altinity, у них на каждый stable release довольно хорошо расписано какие были изменения между релизами
-
У нас отвалились Materialized View на дистрибьютед таблицах при обновлении с 20.5 до 21.8
-
Там вопросы по первоначальной настройке. У меня же все работало и в один момент перестало на нескольких машинах
-
Так вы не написали что раньше работало) Просто само перестало и ничего не трогали?
-
именно. ночью перестало работать
-
и таких вопросов было много и всегда там оказывалось, что всё-таки были какие-то небольшие изменения, которые ни на что не могли повлиять, но повлияли.
так что стандартный подход: проверяйте порты, файевлол и т.д. -
Подскажите пожалуйста, кликхаус периодически производит дисконект. Через минуту снова работает нормально.
В логах вот это:
2021.09.01 09:50:30.125841 [ 2792599 ] {} <Fatal> BaseDaemon: ########################################
2021.09.01 09:50:30.125870 [ 2792599 ] {} <Fatal> BaseDaemon: (version 21.8.4.51 (official build), build id: F8BD60273E32A369A2F51EADA624A8E2B522CDF0) (from thread 2789598) (query_id: ad26bd21-bdcf-4d65-830f-ef71df44b21d) Received signal Segmentation fault (11)
2021.09.01 09:50:30.125888 [ 2792599 ] {} <Fatal> BaseDaemon: Address: NULL pointer. Access: read. Address not mapped to object.
2021.09.01 09:50:30.125911 [ 2792599 ] {} <Fatal> BaseDaemon: Stack trace: 0x8f8fc10 0x1082597c 0x10618c7c 0x10c6f5d0 0x10c77818 0x10c77db1 0x10c77db1 0x10c77db1 0x10c6d7b0 0x10d59cd4 0x10d6c6fb 0x10d72147 0x8fd8f18 0x8fdaabf 0x8fd61ff 0x8fd9ae3 0x7efebaaf9609 0x7efebaa0f103
2021.09.01 09:50:30.125941 [ 2792599 ] {} <Fatal> BaseDaemon: 1. memcpy @ 0x8f8fc10 in /usr/bin/clickhouse
2021.09.01 09:50:30.125966 [ 2792599 ] {} <Fatal> BaseDaemon: 2. DB::ColumnString::insert(DB::Field const&) @ 0x1082597c in /usr/bin/clickhouse
2021.09.01 09:50:30.125985 [ 2792599 ] {} <Fatal> BaseDaemon: 3. DB::MergeTreeSetIndex::checkInRange(std::__1::vector<DB::Range, std::__1::allocator<DB::Range> > const&, std::__1::vector<std::__1::shared_ptr<DB::IDataType const>, std::__1::allocator<std::__1::shared_ptr<DB::IDataType const> > > const&) const @ 0x10618c7c in /usr/bin/clickhouse
2021.09.01 09:50:30.126009 [ 2792599 ] {} <Fatal> BaseDaemon: 4. DB::KeyCondition::checkInHyperrectangle(std::__1::vector<DB::Range, std::__1::allocator<DB::Range> > const&, std::__1::vector<std::__1::shared_ptr<DB::IDataType const>, std::__1::allocator<std::__1::shared_ptr<DB::IDataType const> > > const&) const @ 0x10c6f5d0 in /usr/bin/clickhouse
2021.09.01 09:50:30.126021 [ 2792599 ] {} <Fatal> BaseDaemon: 5. ? @ 0x10c77818 in /usr/bin/clickhouse
2021.09.01 09:50:30.126040 [ 2792599 ] {} <Fatal> BaseDaemon: 6. ? @ 0x10c77db1 in /usr/bin/clickhouse
2021.09.01 09:50:30.126076 [ 2792599 ] {} <Fatal> BaseDaemon: 7. ? @ 0x10c77db1 in /usr/bin/clickhouse
2021.09.01 09:50:30.126082 [ 2792599 ] {} <Fatal> BaseDaemon: 8. ? @ 0x10c77db1 in /usr/bin/clickhouse
2021.09.01 09:50:30.126104 [ 2792599 ] {} <Fatal> BaseDaemon: 9. DB::KeyCondition::checkInRange(unsigned long, DB::FieldRef const*, DB::FieldRef const*, std::__1::vector<std::__1::shared_ptr<DB::IDataType const>, std::__1::allocator<std::__1::shared_ptr<DB::IDataType const> > > const&, bool, BoolMask) const @ 0x10c6d7b0 in /usr/bin/clickhouse
2021.09.01 09:50:30.126117 [ 2792599 ] {} <Fatal> BaseDaemon: 10. DB::MergeTreeDataSelectExecutor::markRangesFromPKRange(std::__1::shared_ptr<DB::IMergeTreeDataPart const> const&, std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, DB::KeyCondition const&, DB::Settings const&, Poco::Logger*) @ 0x10d59cd4 in /usr/bin/clickhouse
2021.09.01 09:50:30.126139 [ 2792599 ] {} <Fatal> BaseDaemon: 11. ? @ 0x10d6c6fb in /usr/bin/clickhouse
2021.09.01 09:50:30.126146 [ 2792599 ] {} <Fatal> BaseDaemon: 12. ? @ 0x10d72147 in /usr/bin/clickhouse
2021.09.01 09:50:30.126169 [ 2792599 ] {} <Fatal> BaseDaemon: 13. ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::__1::__list_iterator<ThreadFromGlobalPool, void*>) @ 0x8fd8f18 in /usr/bin/clickhouse
2021.09.01 09:50:30.126185 [ 2792599 ] {} <Fatal> BaseDaemon: 14. ThreadFromGlobalPool::ThreadFromGlobalPool<void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda0'()>(void&&, void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda0'()&&...)::'lambda'()::operator()() @ 0x8fdaabf in /usr/bin/clickhouse
2021.09.01 09:50:30.126195 [ 2792599 ] {} <Fatal> BaseDaemon: 15. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x8fd61ff in /usr/bin/clickhouse -
2021.09.01 09:50:30.126206 [ 2792599 ] {} <Fatal> BaseDaemon: 16. ? @ 0x8fd9ae3 in /usr/bin/clickhouse
2021.09.01 09:50:30.126215 [ 2792599 ] {} <Fatal> BaseDaemon: 17. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
2021.09.01 09:50:30.126225 [ 2792599 ] {} <Fatal> BaseDaemon: 18. __clone @ 0x122103 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
2021.09.01 09:50:30.215705 [ 2792599 ] {} <Fatal> BaseDaemon: Checksum of the binary: C0E8A4BA8BCF68C95FE1474C27665185, integrity check passed.
2021.09.01 09:50:50.192258 [ 2789444 ] {} <Fatal> Application: Child process was terminated by signal 11. -
и как часто? раз в пару часов?
-
примерно да
-
линукс наверно сам убивает долговисящие коннекты. максимум часа 4 может провисеть по идее при дефолтных настройках. зависит от дистриба
-
-
-
-
Там же сегфолт, это скорее баг. Надо для начала сделать кейс для воспроизведения (если получится), core-file желательно сохранить. Иначе сложно разобраться. Хотя что-то можно понять по стек-трейсу.
-
-
Всем привет!
Есть два лога
1. Лог с логинами
2. Лог с действиями
Хочу собрать инфу по каждой сессии формате:
* ts логина
* ts последнего действия (после этого логина и до ts следующего логина)
Подскажите, пожалуйста, в какую сторону подумать, чтобы собрать такой запрос?
Думал про ASOF JOIN, но он ищет ближайшее только с одним неточным соответствием -
Привет! Делаю бэкфилл из S3 с логами, по-умолчанию в таблице с S3 engine строки располагаются по времени создания соответствующего файла, но было бы круто читать их в обратном порядке, чтобы сначала подтягивать свежие логи, а потом более старые.
Вопрос: есть ли возможность читать файлы с S3 в обратном порядке? -
Добрый день! подскажите пожалуйста есть ли какой-то готовый анализатор логов CH по аналогии с pgbadger для postgres
-
а если ALL указать https://clickhouse.tech/docs/ru/operations/settings/settings/#settings-join_default_strictness тоже?Настройки | Документация ClickHouse
Настройки distributed_product_mode Изменяет поведение распределенных подзапросов. ClickHouse применяет настройку в тех с
-
Внимание вопрос:
упёрся в max_bytes_to_merge_at_max_space_in_pool, я вообще только недавно узнал про его существование. в общем не мёржатся и я решил поменять схему таблицы пока не сильно поздно. сейчас такая схема:
create table entites
(
t DateTime64(6) DEFAULT now64(6),
entity String,
profile_id UInt64,
...
) Engine = ReplacingMergeTree(t)
ORDER BY (entity, profile_id, uuid);
хочу добавить
PARTITION BY (entity, round(profile_id/1000000))
обычно советуют что-то типа profile_id%10 , но есть ощущение, что через какое-то время опять упрусь в размер парта, а при моём подходе новые партиции будут создаваться на каждый миллион пользователей (сейчас их 10). и в принципе то на то и выходит, только в моей схеме заложен рост.
в общем какие подводные камни могут быть? -
Можно как-то в КХ организовать хранение только N последних записей? Т.е. при вставке сверх лимита, удалять старые записи. В таблице хранятся логи разных пользователей системы. В качестве первой колонки PK - ID пользователя. И вот нужно для каждого пользователя хранить не больше N логов
-
можете сделать обычный джоин или asof, а потом в WHERE дописать нужное условие.
-
можно использовать TTL, а количестве N задавать уже в limit в запросе. так чтобы прям хранить именно только N в кликхаусе вроде нету.
-
Не проходит по памяти (
-
тогда merge join, для него не надо чтобы правая таблица влезала в память
-
А чего бы не партиционировать по дате ? С любой нужной градацией - хоть ежедневные партиции. Что-то типа https://github.com/ClickHouse/ClickHouse/issues/20159 Опять же дропать старые данные удобно.DateTime64 or hourly partitions not being optimized well? · Issue #20159 · ClickHouse/ClickHouse
Describe the situation We have a MergeTree table which has ~300b rows in it over 1 year and looks like: CREATE TABLE logs ( time DateTime64(3) CODEC(DoubleDelta, ZSTD(1)), ... ) ENGINE = MergeTree(...
-
Должен ли файл /var/lib/clickhouse/metadata/system/zookeeper.sql автоматически создаться при старте кликхауса? В файле конфигурации настройки Zk прописаны. В таблице errors Cannot open file /var/lib/clickhouse/metadata/system/zookeeper.sql, errno: 2, strerror: No such file or directory
-
-
используйте функцию "ответить" иначе не понятно то ли вы отвечаете вникуда, то ли задаёте риторический вопрос
-
а entity много уникальных у вас?
-
Я промахнулся с ответом, казалось что выбрал. Но дату в качестве ключа партиционирования крайне рекомендую. Иначе чистить таблицы от устаревших данных будет практически нереально.
-
нет. 5 штук
-
Не должна. Это виртуальная таблица. Это отображение структур памяти.
Ошибка потому что кто-то делал селекты пока таблицы не было. Она создается только когда кх смог подключиться к зк. Это не настоящие ошибки. -
ну у меня нет устаревших данных и у меня ReplacingMergeTree, мне надо перезатирать данные на их новые версии, а при партицировании по дате это невозможно и я буду хранить кучу устаревших данных.
-
t DateTime64(6) DEFAULT now64(6) ?
-
Нельзя
-
да, это по сути дата последнего обновления, её нет в ключе
-
Стало спокойнее, но эта ошибка вылезает каждую минуту. И в таблицах system.replicas у всех реплик стоит is_leader=1
-
Слишком мелкое партиционирование приведет к полной жопе намного быстрее
-
-
Так и должно быть. Начиная с 20.4
-
Кто удручает?
-
-
Ошибок не должно быть. Все таблицы лилеры начиная с 20.4
Показывайте лог с ошибками. -
ну вот, стараюсь, чтобы было не слишком мелкое, но и чтобы в 150гб на партицию уложиться. да и по идее последние пользователи более активны чем предыдущие, значит большинство вставок будет в последнюю партицию. а при остатке от деления практически гарантировано, что будет писать во все 10.
-
из таблицы system.errors: Cannot open file /var/lib/clickhouse/metadata/system/zookeeper.sql, errno: 2, strerror: No such file or directory
-
-
Не надо мне system.errors.
Лог нужен -
2021.09.01 11:43:44.840471 [ 624 ] {} <Error> default.*********_shard (ReplicatedMergeTreeRestartingThread): Couldn't start replication (table will be in readonly mode): Replica /clickhouse/tables/ch-shard-01/**********/replicas/ch101 appears to be already active (host: *******, port: 9009, tcp_port: 9000, database: *****, table:**********_shard, scheme: http, ). If you're sure it's not, try again in a minute or remove znode /clickhouse/tables/ch-shard-01/*********/replicas/ch101/is_active manually. Code: 224, e.displayText() = DB::Exception: Replica /clickhouse/tables/ch-shard-01/**********/replicas/ch101 appears to be already active (host: **********, port: 9009, tcp_port: 9000, database: default, table: ********_shard, scheme: http, ). If you're sure it's not, try again in a minute or remove znode /clickhouse/tables/ch-shard-01/*********/replicas/ch101/is_active manually, Stack trace (when copying this message, always include the lines below):
-
-
Быть может, надо с ZK что то провести?
-
Здравствуйте, подскажите пожалуйста, нормально ли не партицировать таблицу, если не нужны операции с манипулированием отдельными партициями и не планируется много параллельных вставок? Беспокоит то, что образуются большие файлы с колонками в партах (70Гб UInt64 колонки, например). Может ли в какой-то момент это упереться в оперативную память? Или кликхаус вставляет в такие парты без использования оперативки порядка размера файла?
-
И второй вопрос, если вставляется скажем 1000 строк в колонку, которая весит 70Гб на диске (файл .bin в папке парта), то весь ли он перезапишется? Или оно в конец аккуратно дописывает?
-
Привет! Кто сталкивался и использованием s3 бакета в качестве холодного хранилища в кх, подскажите на сколько законно использовать один s3 эндпоинт для всех реплик? Или же наоборот лучше для каждой реплики выделить отдельный эндпоинт (почему?)?
Или все же выбор зависит от задачи? -
тогда забейте, system.errors врет
-
ни в коем случае
-
-
sum(cen) AS cen
почему так есть объяснение тут
https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7597
https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf -
таблица в формате ..... ?
-
формат CSVWithNames
-
1 нормально.
2 не может.
3 без использования
4 Парты иммьютабл (это самое важно в понимании). каждый инсерт создает новый парт, ничего не дописывается, затем когда-нибудь несколько партов слияются, это называется мерж. -
settings format_csv_allow_single_quotes=0
-
сейчас у КХ есть zero copy replication (надо включить параметр), тогда все реплики смотрять на один объект в S3
-
Спасибо, теперь понятно почему там один самый большой парт и много маленьких хвостов, вплоть до сотен мегабайт. Тогда вопрос про слияние - может ли оно как то зафейлиться / очень долго выполняться из-за большого размера партов? Требуется ли в момент слияния 2x памяти на диске от размера партов?
-
Спасибо большое
-
1) не может
2) может
3) требуется
в system.merges это видно и есть все ответы на ваши вопр. -
Есть ли какие то рекомендации по таким непартицированным таблицам в плане уменьшения максимального размера парта? Что это за настройка - не нашел в system.settings like '%part%'
-
1 ) https://clickhouse.tech/docs/ru/operations/settings/merge-tree-settings/#merge-tree-settings
2 ) https://clickhouse.tech/docs/ru/operations/settings/merge-tree-settings/#max-bytes-to-merge-at-max-space-in-pool
это другая секция / файл настроек, другая system таблица
если партов станет 300 то сами понимаете. https://clickhouse.tech/docs/ru/operations/settings/merge-tree-settings/#parts-to-throw-insert -
падает КХ. и рестартует через минуту кроном.
что делал ad26bd21-bdcf-4d65-830f-ef71df44b21d, грепайте лог -
Спасибо за наводку
-
Всем привет, подскажите MODIFY ORDER BY работает в обе стороны? (можно как добавлять столбцы, так и удалять?)
-
Это в настройках самого кх делается, не в DDL таблицы?
-
Только добавлять и только если новую колонку из того же запроса
-
Спасибо
-
-
да, я понял, интересовала возможность откатиться обратно
-
можно с конца, если поля не входят в primary key
-
и в ddl тоже
-
ну нет
-
можно
-
решили по другому сделать, спасибо
-
лучше сразу в github открыть issue.
21.8 очень стабильная и всем будет интересно починить это -
В сессии клиента засетили параметр в 0 - не помогло. Вернули 1 - результат тот же. В csv одинарные кавычки, в таблице их нет.
-
что такое одинарные кавычки по вашему? Пример покажите
-
-
т.е. у вас файл типа
'word','xxx',0,"2010-10-10" -
есть стринги с кавычками и без
-
-
эта картинка это что? Это вход или выход?
-
-
а если "Bing" на входе то в КХ тоже "Bing" ?
-
да, но нам такие кавычки не нужны будут
-
это какой-то бред. Все наоброт должно быть
select * from system.settings where changed -
-
-
вы курлом свой файл скачайте и посмотрите что возвращается
-
возможно там пул коннектов и format_csv_allow_single_quotes не используется из сессии, но это странно
-
-
select from ... url ( ) ... ETTINGS format_csv_allow_single_quotes=0 ?
-
селект с таблицы, где ENGINE = URL
-
я прошу проверить поведение табличной функции url
-
возможно там пул коннектов и format_csv_allow_single_quotes не используется из сессии, но это странно
-
SELECT FROM URL ... SETTINGS format_csv_allow_single_quotes=0 получилось, кавычки появились
-
теперь попробуйте создать еще одну таблицу ENGINE = URL и в ее DDL допишите SETTINGS format_csv_allow_single_quotes=0
-
Спасибо, помогло. Почему-то с самого начала не давал создать с таким DLL
-
#вакансия
Добрый день, коллеги! Меня зовут Женя, я представляю рекрутинговую компанию Marksman. Есть очень крутая вакансию на позицию Администратора баз данных ClickHouse и Elasticsearch
Компания - ключевой игрок в экосистеме маркировки.
Чем предстоит заниматься:
Сопровождение ClickHouse и Elasticsearch;
Установка и настройка СУБД;
Обеспечение непрерывной работы СУБД;
Диагностика и устранение неполадок;
Управление доступом к БД;
Тюнинг работы БД;
Консультации разработчиков по вопросам работы СУБД;
Настройка резервного копирования и восстановления;
Разработка регламентов и инструкций по сопровождению БД;
Настройка системы мониторинга в части работы БД.
Что для нас важно:
Опыт сопровождения ClickHouse или
Elasticsearch от 2-х лет;
Опыт диагностики проблем и тюнига
ClickHouse или Elasticsearch;
Опыт резервного копирования и восстановления ClickHouse или Elasticsearch.
Желательно:
Опыт работы с операционной системой
Linux (CentOS, Ubuntu);
Опыт автоматизации с использованием
Ansible будет плюсом;
Знание английского языка - свободное чтение технической документации.
Что мы предлагаем:
Офис в Москве. Возможен частично-удаленный, либо полностью удаленный формат работы.
Технически сильная команда
Корпоративное обучение
Конкурентная ЗП, оформление по ТК РФ, ДМС, скидки на обучение английского языка
Скажу сразу по поводу вилки зап.платы- ее так таковой нет, ориентир идет на ваши финансовые ожидания и на уровень по рынку
По всем вопросам можно писать мне!) -
Здравствуйте! Есть 2 шарда и свежесозданнная (если это важно) Distributed таблица с ключом шардирования toYYYYMMDD(created_at), которая полностью дублирует данные на оба шарда, вместо того, чтобы их раскладывать по ключу. Никто не сталкивался с подобной проблемой?
Остальные таблицы с идентичной схемой работают нормально -
проверьте что она везде одинаковая, скорее всего имя кластера неправильное
-
абсолютно одинаковые таблицы везде, имя кластера тоже указано верно
-
единственное различие с работающими таблицами, которое я нашла - вместо имени базы данных при создании Distributed таблицы в этот раз было указано имя базы, а в предыдущие разы - пустая строка
-
Всем привет! Столкнулся со странной ситуацией, нужно было из таблицы MATERIALIZED VIEW (ReplicatedSummingMergeTree) удалить данные и залить их новыми за одну и туже дату в эту же таблицу, удалиение прошло успешно ALTER TABLE table DELETE WHERE date = '2020-01-01', но при добавлении данных, данные в MV не добавляются, точнее запрос отрабатывает и не каких ошибок нет, ни в логах ни при инсерте, но при селекте данных не находит, тоесть какбудто они не добавились. В какую сторону копать? Мутации отработали со статусом 1
-
Есть таблица А и B отношение 1 ко многим
Данные связаны по id
На выходе хочу получить json
где у таблицы А в качестве дочерних элементов данные таблицы В.
Как их сгруппировать? -
set insert_deduplicate=0
-
это очень странно, ищите ошибку, попробуйте воспроизвести на маленьком примере
-
#ReplacingMergeTree добрый день, подскажите, хорошая ли идея использовать ReplacingMergeTree для хранения постоянно обновляющихся данных из внешнго источника, которые хочется синхронизировать с CH раз в какое-то время? Количество инсертов ~ 1M/сутки, то есть таблица сама не большая, но данные меняются стабильно - а трекать предыдущие значения и дописывать дельты как-то больно.
-
select a.id, groupArray(B.*)
from ... join on id = id
group by a.id -
1 М в сутки в строках это ?
-
можно ещё в сторону EmbeddedRocksDB глянуть
-
да
-
1М строки? тогда никаких проблем
-
а забират "последние" данные просто с argMax(tuple(val1, val2, ..., valN), version) и не париться?
-
если будете использовать её в качестве джойна, то нужно будет учесть, что JOIN t FINAL не работает
-
это для хранения словаря "того, что уже было" вы предлагаете?
-
по разному, зависит...
например вы знаете что закончили обновлять и запускаете optimize final , дальше просто select
есть например параметры которые ускоряют select final, возможно их можно использовать
и еще 49 вариантов -
если у вас апдейты по ключу, то оно просто перезапишет всю строку, а не так как ReplacingMergeTree потом может быть когда-нибудь в фоне
-
это не совсем правда, нужен подзапрос
select .... from ... join (select * from t final) as t
и это баг, его починят -
ну вот тут напряжение в том, что "закончили обновлять" считай не бывает. есть грубо говоря внешняя база, которую периодически опрашиваем и получаем "актуальные" значения, и поменяться они могут как для свежих записей, там и для достаточно старых
-
я и говорю у меня есть 51 вариант
-
create table test( A Int64, B Int64, C String, D Date, sign Int8, version Int64)
Engine = VersionedCollapsingMergeTree (sign, version) partition by toYYYYMM(D) order by A;
insert into test select number, 1, '1', today(), 1, 1 from numbers(100000000);
optimize table test final;
Elapsed: 15.702 sec. ---<---- 15
optimize table test final;
Elapsed: 16.025 sec. ---<---- each time optimize merges full table
set optimize_skip_merged_partitions=1;
optimize table test final; ---<---- optimize merges nothing because nothing to optimize and enabled optimize_skip_merged_partitions
Elapsed: 0.000 sec.
optimize table test final;
Elapsed: 0.000 sec.
select count() from test where C='1';
Elapsed: 0.150 sec.
select count() from test final where C='1';
Elapsed: 4.941 sec. ----------- 4 sec. FINAL
select count() from test final where C='1';
Elapsed: 4.663 sec.
set do_not_merge_across_partitions_select_final=1;
select count() from test final where C='1';
Elapsed: 0.502 sec. ------------ 0.5 sec. FINAL -
ну final/optimize понятно, но думаю для наших кейсов (учитывая маленький размер таблицы) проще отдать оптимизацию на откуп CH и выгребать с помощью argMax там где надо
-
хотя будем еще бенчмаркать, конечно
-
спасибо!
-
Механика какая? Запросы записываются в бэклог и сравнивает их и при очередном запросе?
-
КХ записывает в ZK контр. сумму инсерта, если у след. инсерта такая же сумма КХ пропускает инсерт.
set insert_deduplicate=0 это отключает.
по умолчанию 100 сумм хранятся неделю
https://clickhouse.tech/docs/ru/operations/settings/merge-tree-settings/#replicated-deduplication-window
https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/replication/
Блоки данных дедуплицируются. При многократной записи одного и того же блока данных (блоков данных одинакового размера, содержащих одни и те же строчки в одном и том же порядке), блок будет записан только один раз. Это сделано для того, чтобы в случае сбоя в сети, когда клиентское приложение не может понять, были ли данные записаны в БД, можно было просто повторить запрос INSERT. При этом не имеет значения, на какую реплику будут отправлены INSERT-ы с одинаковыми данными. Запрос INSERT идемпотентный. Параметры дедуплицирования регулируются настройками сервера merge_treeНастройки MergeTree таблиц | Документация ClickHouseНастройки MergeTree таблиц Значения настроек всех MergeTree таблиц собраны в таблице system.merge_tree_settings. Их можн
-
-
Спасибо
-
в таких случаях пациенты просто несколько раз повторяют попытку и после первой у них начинается проблема
-
Это для примера, данные добавлены недавно
-
кстати replicated-deduplication-window работает совсем не так как написано в доке (я не знал когда ее писал)
там время относительное, и 100 очищается не сразу а периодически -
Чем кто визуализрует данные из CH ?
-
Чем угодно. power bi, tableau, redash, superset, metabase, grafana
-
metabase/tableau
-
Superset
-
+
-
superset
-
set insert_deduplicate=0 помогло, спасибо.
-
ребят
возможно глупый вопрос
но правильно же понимаю, что allow_s3_zero_copy_replication будет работать только на merge_tree движке ? -
да, это настройка для merge_tree движка
-
принял
спасиб большое -
Всем добрый вечер, подскажите как вставить данные в map внутри nested?
Таблица: `
CREATE TABLE test.producers (
id String,
name String,
store Nested(
id String,
test_params Map(String, String)
)
) ENGINE = MergeTree()
`
Попытки вставить: `
INSERT INTO test.producers VALUES ('e69c40f7-22b3-4c83-853a-696df428beda', 'name', ['store.id'], [{'ves':'100'}])
INSERT INTO test.producers VALUES ('e69c40f7-22b3-4c83-853a-696df428beda', 'name', ['store.id'], [map('ves', '100')])
`
Результат в test_params лежит пустая строка -
Вы неправильно вставляете мап. Посмотрите доку. Он вставляется как жсон, только с одинарными кавычками. Ваша форма только в селекте может работать.
-
INSERT INTO test.producers VALUES ('e69c40f7-22b3-4c83-853a-696df428beda', 'name', ['store.id'], [{'ves':'100'}])
Вот попытка вставить как json, такая же пустая строка -
А теперь посмотрите доку как правильно вставлять нестед, а потом покажите вашу ошибку
-
создал у себя вашу таблицу, всё ок вставило с вашим примером
-
какая версия КХ? у меня 21.3.15
-
Доброго времени суток!
Есть таблица с сырыми данными, привезенными Kaffka (на каждый день ~500млн. строк)
CREATE TABLE raw.ts_float_local
(
`id` UInt64 CODEC(DoubleDelta,
LZ4),
`dt` DateTime64(6) CODEC(Delta(8),
ZSTD(1)),
`created_dt` DateTime64(6) CODEC(Delta(8),
ZSTD(1)),
`value` Float32 CODEC(ZSTD(1))
)
ENGINE = MergeTree
PARTITION BY toYYYYMMDD(created_dt)
ORDER BY (id,
dt)
SETTINGS index_granularity = 8192;
Необходимо создать deduplicated слой данных из этой таблицы.
Подскажите, пож, как каким способом удобнеее всего это делать?
Каждый день переливать сырые данные в слой уникальных данных и делать optimize deduplicated не пойдет, потому что при большом объеме данных в итоговой таблице optimize будет падать.
Налету при вставке удалять дубликаты тоже не хватает оперативки -
INSERT INTO test_map VALUES ('e69c40f7-22b3-4c83-853a-696df428beda', 'name', ['store.id'], [map('ves', '100')])
INSERT INTO test_map VALUES ('e69c40f7-22b3-4c83-853a-696df428beda', 'name', ['store.id'], [{'ves': '100'}])
SELECT *
FROM test_map
FORMAT Vertical
Query id: d7ce1a0f-0877-419c-b600-96c5373e187e
Row 1:
──────
id: e69c40f7-22b3-4c83-853a-696df428beda
name: name
store.id: ['store.id']
store.test_params: [{'ves':'100'}]
Row 2:
──────
id: e69c40f7-22b3-4c83-853a-696df428beda
name: name
store.id: ['store.id']
store.test_params: [{'ves':'100'}] -
Действительно все работает, проблема оказывается в ui яндекс клауда который не отображает мне в результате, если делать запрос не в нем, то видно, что все правильно отработало, спасибо большое
-
50 сообщений вверх Денни пояснял этот вопрос. Смотрите про final.
Делаете таблицу ReplacingMergeThree, все выборки с final. Чтобы даром не проверять дубликаты в старых партициях (которые и так уйдут при мерджах), включаете do_not_merge_across_partitions_select_final.
Партиции у вас дневные - это хорошо для select/final, но но плохо, если у вас не стоит TTL на месяц-квартал - получите слишком много подкаталогов партов в директории с таблицей, и выборки будут тормозить.
500М/день - это немало. Пробуйте найти баланс, может быть недельные партиции будут более удачным вариантом.
Или решайте вопрос дедубликации как-то иначе - в своем приложении (оно точно не может не порождать дубликатов?), или же в Кафке - там есть инструменты для этого. -
а в продолжение этой темы
табличный движок MergeTree
но отдает все такую же ошибку
Unknown setting allow_s3_zero_copy_replication
версия кх последняя
ни у кого не было ? -
Подскажите, такая ошибка: Code: 47, e.displayText() = DB::Exception: Unknown identifier: total; there are columns: query, count(): While processing query, count() / total AS ratio (version 21.6.1.1-arcadia)
-
откатился на 21.7.4
заработало
было 21.8.4.51 -
настройку переименовали
allow_remote_fs_zero_copy_replication -
спасиб
видимо доку недосмотрел ) -
Всем привет правильно я понимаю что нет смысла создавать materialized view на селекты с операциями равенства (where row='something') при условии что искомое значение каждый раз меняется
-
обернуть в под селект поидее надо
select count() / total from (select count() total) cross join () -
спасибо! а почему так не получается, не знаешь?
-
прям объяснить наверное не могу) такой синтаксис в КХ с джойнами
-
понял, спасибо))
-
Describe how identifiers in SELECT queries are resolved · Issue #23194 · ClickHouse/ClickHouse
Query analysis in ClickHouse is more complicated than it is in standard SQL due to the following extensions: aliases can be defined and used in any part of the query; expressions can be used in any...
-
спасибо
-
спасибо!
-
-
SELECT version() FROM remote
-
-
-
SELECT hostname() FROM remote
возвращает у меня хост удалённой базы
version() не могу проверить потому что все базы одинковые) -
репликация и S3 работает у семейства Replicated*MergeTree
-
MergeTree ? Именно MergeTree ? параметр для Replicated
-
а это обязально картинки постить ? Лень набирать.
и мы тут не саппортим 21.6.1.1-arcadia -
можно SELECT materialize(version()) FROM remote
-
Подскажите почему для CREATE MATERIALIZED VIEW … TO … запрещен POPULATE
-
потому что он избыточен и не нужен. insert as select делает ровно то что вам нужно
-
Не сделали. Никто не использует pooulate
-
Почему? А если записей навтыкают между запросами, там же засечку не поставить
-
Populate так же все пропустит.
https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7597
https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf -
@bvt123, @den_crane спасибо!
-
добрый день, подскажите пожалуйста такая задача по бд данным:
относительно не большие вставки (10-50к записей пару раз в день), данных в таблице сейчас около 10 млн, записи представляют из себя строки с около 20 колонками, задачи для пользователей, которые назначаются после добавления в полу автоматическом режиме равномерно. задачи могут повторятся, а значит таблица мусорка получается)) самое важное - нужно осуществить быстрый поиск по ней, подсчет обработанных задач по статусу, подойдет ли clickhouse для этой задачи? mysql тормозит при поиске даже за небольшой период, т.к. нужно выбирать по разным комбинациям полей (по отделам, пользователю, выгрузке, статусу и в итоге считать sum count). Не получилось оптимально подобрать индекс в mysql, ранее пробовал clickhouse для записи статистики и агрегации (около 300к в минуту записей), кх подошел, сейчас не знаю
Посоветуйте пожалуйста. заранее спасибо - 02 September 2021 (89 messages)
-
Добрый день! Подскажите пожалуйста, после апгрейда КХ перестал работать odbc коннект:
SQL Error [86]: ClickHouse exception, code: 86, host: , port: 8123; Code: 86, e.displayText() = DB::Exception: Received error from remote server /columns_info?connection_string=DSN%3Ddzone&table=BASEDICT&external_table_functions_use_nulls=true. HTTP status code: 500 Internal Server Error, body: Error getting columns from ODBC 'std::exception. Code: 1001, type: nanodbc::database_error, e.what() = ../contrib/nanodbc/nanodbc/nanodbc.cpp:2788: HY09: [Oracle][ODBC]Invalid string or buffer leng <-25>. (version 21.8.4.51 (official build))'
(version 21.8.4.51 (official build)) -
Всем привет. Я работаю в компании (пока не буду озвучивать) выбираем технологию на старте проекта. Вопрос КХ работает с тайм трекерами? Есть примеры кейсов, где КХ применяли именно как часть тайм-трекинговой стемы?
-
10М совсем немного. такая задача решается при помощи любой СУБД на современном оборудовании. Странно что не получилось с mysql. Может надо купить новый SSD?
Но КХ тоже может. Если вам с ним комфортно, он уже есть в эксплуатации, и самое главное - есть желание углубиться именно в его особенности (а не учиться строить индексы в mysql/postgress), то почему бы и нет?
Делайте по простому - ReplacingMT order by taskID partition by month , select/final с описанной выше оптимизацией по партишенам, чуть подумайте над запросами - может где-то prewhere вставить или подзапрос сделать. Но скорее всего оно заведется и так, прямо из коробки, на 10 миллионах записей. -
-
под Replicated имеется в виду движок самой бд ведь ?
вроде как завелось на Atomic
Но Replicated основан на нем же как раз -
Replicated в данном контексте - это движок таблицы, не путать с движком базы данных, который про DDL. Да, тут есть некоторая терминологическая путаница, однако разобраться можно.
-
Мы компания INNOVA GROUP инновационная IT-компания, лидер в области разработки и внедрения финансовых, высоконагруженных и крипто решений.
Ищем АНАЛИТИКА БАЗ ДАННЫХ со знанием ClickHouse на проектную работу, либо part-time.
Задачи:
- Анализ проблем производительности СУБД и выдача рекомендаций по повышению эффективности работы приложений;
- Развитие и обновление инфраструктуры БД;
- Участие в разработке и поддержке БД внутренних сервисов;
- Анализ возникновения нестандартных ситуаций в СУБД.
Оплата будет обсуждаться лично.
Направляйте свое резюме @hrKamila . -
Добрый день! подскажите пожалуйста есть ли какой-то готовый анализатор логов CH по аналогии с pgbadger для postgres
-
если у вас нет специалистов по кх, то берите классическую субд, когда упрётесь в большие объёмы, тогда легко можно будет переключиться на кх. если уже есть опыт с кх, то делайте сразу на нём.
-
Добрый день
Поделитесь пожалуйста советом.
Из MSSQL, нужно сделать несколько селектов с джоинами и потом забросить это в clickhouse.
Пытаюсь сделать это через Python (clickhouse-driver): выгржаю данные из MSSQL (pyodbc + pandas) в DataFrame, немного причесываю и хочу отправить в Clickhouse. Вот тут возникают проблемы, то с Датой, то еще с чем то. Как вообще оптимально организовать этот процесс? -
спасибо, есть примеры именно с тайм трекингом и КХ?
-
сейчас планируется нагрузка на таблицу ~ 1-2 млн записей в месяц вставок и обновлений (понимаю что КХ не эффективен для update, можно писать только результирующие строки, когда запись уже закрыта и имеет все необходимые значения в полях). 10 млн вы правильно говорите не большой объем для той же mysql при правильно проставленных индексах, но бизнес модель такова, что нельзя просто взять id диалога среди миллиарда диалогов и потом получить по диалогу просто сообщения. у нас это напоминает jira issue, когда есть задача и поля меняются пока задача не будет закрыта, а потом нужно искать эти задачи быстро по многим полям и индексы тут не спасают (не говоря о том что индекс строится по всей таблице, а не по периоду в неделю как мы обычно берем) + проблема поиска a b c | a c b | b c a и т.д. чем больше полей тем больше комбинаций, составной индекс не эффективен и не предсказуем и приводит к огромной индексной таблице - больше чем сама таблица с данными)) одинарный индекс по каждому из полей не всегда mysql оптимально выбирает и запросы тормозят. ssd кстати есть + расширен буфер кеш с 128 мб до 10гб
-
хз. гуглите.
-
Я написал сюда именно потому, что не нагуглил
-
Коллеги, всем привет.
Проблема. Есть две машины, одна 256 гигов оперативы, 24 ядра, хдд 7200 20 версия. Вторая 48 гигов оперативы, 8 ядер, жесткий то ли 15000, то ли еще больше 21.5 версия.
На одной селект 10 минут, на другой 30 секунд, все одинаково в части данных. Что делать? -
кликхаус используется для аналитики, в том числе для трекинга, сколько времени провёл пользователь в приложении или на сайте, длинна сессии и т.д. именно по вашей задаче вам нужно смотреть где подойдёт кх, а где не подойдёт, потому что полностью весь проект на кх вы всё равно не сделаете. так что декомпозируйте свои таски и смотрите уже более предметно.
-
задача тайм трекинга не отличается принципиально от типичного для КХ кликстрима (Яндекс метрика как ориентир). Так что смело можете на нее ссылаться в обосновании применения :)
-
классно, спасибо
-
а почему всё нельзя сделать на кХ раз уж взяли копать технологию, если нет специалиста?
-
я читал что КХ плохо выделяет одинарные запросы, но так ли это важно если речь идёт о времени?
-
потому что если у вас на сайте будет логин, то пользователей вы будете хранить в мускуле/постгре, потому что кликхус не для одиночных вставок и апдейтов
-
большое Вам спасибо
-
напишу руководителю, дальше будем смотреть
-
юзеров можно положить в таблицу с Engine=EmbeddedRocksDB и будут вам быстрые апдейты не отходя от кассы.
-
думал об этом, но там запись надо только целиком обновлять
-
да и обновлять через инсерт, а удалять альтером - мегакостыли в приложении и отказ от стандартных орм
-
- обновлять одно поле в RocksDB довольно просто через insert as select.
- удалять данные вовсе не надо в наше время (ну почти) - достаточно поставить флаг удаления.
- частичная утрата функций ORM - хороший обмен за отказ от поддержания второй СУБД и интеграции между ними. Каждая СУБД - это минимум два инстанса и свой ДБА. -
Подскажите пожалуйста, по какой еще причине могут появиться файлы в директории detached, кроме выполнения "ALTER TABLE X DETACH PARTITION 'YYYYDD'"?
-
в system.detached_parts.reason пусто
-
дело не в одинарности запросов, а в их рейте. скажем инсерты не стоит делать чаще 1 раза в 10 сек. а 100 селектов в секунду - это уже много (сравните с тысячами для mуsql/pg). Зато можно инсертить 100к строк разово и за это ничего не будет, и делать большие сложные запросы.
-
выделенный дба редко бывает даже в командах по 10 разработчиков. обычно у разрабов мозгов хватает, чтобы не стрелять себе в ногу.
2 инстанса в облаках тоже редко кто держит. и так сойдёт.
а в крупных проектах даже не представляю, чтобы кто-то использовал кх как синглсторе, там выхлоп от такого ещё меньше. -
но при этом сам с нетерпением жду, когда кликхаус будет сам как синглстор
-
RocksDB нереплицированная, что сильно уменьшает ее полезность.
И маловероятно что будет такой, китайцы ее делали для своего ограниченного юзкейса. (они там чуть ли не список партов хранят) -
Точно? Как она вышла я делал тест с on cluster, и данные при инсертах появлялись на другом сервере. Перепроверить?
-
Ну а как?)
Вы же путь в ZooKeeper есть не указываете с ZooKeeper она не общается. -
Подскажите из-за чего может при перезагрузке порты ch (8123,9000) занимать процесс dockerd? Из-за чего ch ругается что пор already use. После рестарта докера порты занимает clickhouse-se
-
Файлы? Например ?
-
да файлы с данными как при детаче, например table_name/detached/202108_214322_214335_2/column_name.bin/brk2
-
Так кх в докере? При чем тут докер?
-
Вы в логе поищите по имени. Не должно быть такого без detach part
-
Не может такого быть
-
спасибо, поищу. У нас как раз в прошлом месяце умер зукипер и восстанавливали через SYSTEM RESTART REPLICA, подозрение что из-за этого, так как в основом в детаче партишн 202108
-
да, не может. нашел ошибку в настройках хоста в датагрипе - смотрел туда-же. Эх, а я уже обрадовался :) Так что - правда шансов нет?
-
Шансов нет. Апдейт делит прикрутить легко к нему. А репликацию нет.
-
Возможно.
-
-
Кто-нибудь подскажет в чем могло быть дело.
Было два сервера, подохлее и помощнее.
На подохлее стояла 21.7 версия
На помощнее стояла 20 версия
На дохлом запрос выполнялся 30 секунд, на мощном 10 минут
Обновили мощный до 21.7, все стало тоже ок.
Интересно в чем была проблема, что такого в 20 версии? -
В том и дело что ch в докере, но он запускается и через некоторое время падает с ошибкой Address already use. Netstat показывает что порт 8123 занят процессом dockerd. Если перезапустить вручную докер то порт уже занят clickhouse-server
-
и сам клик начинает работать без ошибок
-
Собран билд без движка. Это macos?
-
freebsd
-
А ну вот так он собран. Там выключен MySQL. Не собирается с ним.
-
Я знаю 43 причины.
-
Черт побери. А так, для того, чтобы понять, долбаться или нет:
Каким образом транслирует запросы в mysql? Прямо или как-то хитро? Если у меня есть manticoreSearch с mysql-интерфейсом, сможет работать через движок mysql? -
Там функция используется? Тогда не будет работать.
-
Какая функция?
У них есть собственная функция MATCH(), то есть запрос выглядит примерно так:
select * FROM table where MATCH('query')
Разного рода mysql-клиенты (PDO, да и родной консольный клиент) вполне работают, вот будет ли работать clickhouse? -
Ну то есть если он просто транслирует запрос в базу, а потом читает результат, то должно работать
-
Кх не просто транслирует. Скорее всего не будет работать.
-
А можно почитать где-нибудь? Хочу разобраться. Или сарказм))
-
ClickHouse/ClickHouse description changed: v21.7.9.7-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.7.9.7-stable
Release notes:
ClickHouse stable release v21.7.9.7-stableRelease v21.7.9.7-stable · ClickHouse/ClickHouseClickHouse stable release v21.7.9.7-stable
-
Так надо смотреть запрос. Постоянно добавляются оптимизации, постоянно ломают что-то. Вы в system.settings посмотрите все параметры которые называются optimize...
Или например в какой то момент в prewhere стали переносить только 2 поля. Потом вернули назад. -
-
Там есть длинное перечисление значений в in ?
-
-
Я знаю тогда почему. Позже напишу.
-
Есть еще одно различие. Я вообще заметил проблему случайно.
У нас данные поставляются неделями. Клиент считает в разбивке месяцев, но последний кусок так как не полный там фильтр date_it BETWEEN и джойны, ну и вообще весь расчет как бы по дням. А в месячных по month_id.
Остальная часть, даже с фильтром и использованием in одинаковая.
Я заметил по нагрузке CPU, CPU на деве давал 1%, а на проде улетал в полку, посмотрел, разница только в версиях, обновили, все стало ок. -
Добрый день. Есть ли в CH native protocol какой-то протокол закрытия соединения? Или можно просто закрыть сокет в любой момент? Спрашиваю потому что CH крэшится при рестарте приложения и подозреваю что клиент неправльно закрывает соединение...
-
Да все так. Это широко известный в узких кругах ишью.
-
А в 21.3.Х он ещё был?
-
-
-
High server load after upgrade to 20.x · Issue #9621 · ClickHouse/ClickHouse
Hello, I have tried to switch from Altinity 19.17.4.11 rpms to Clickhouse 20.1.6.30 rpms on RH7. No changes in config. After a short time system load increases until the system is unresponsive. per...
-
Ещё был.
-
ClickHouse/ClickHouse description changed: v21.8.5.7-lts
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.8.5.7-lts
Release notes:
ClickHouse lts release v21.8.5.7-ltsRelease v21.8.5.7-lts · ClickHouse/ClickHouseClickHouse lts release v21.8.5.7-lts
-
добрый вечер. Подскажите, как это вылечить?
Запросы падают с ошибкой 500
Code: 24, e.displayText() = DB::Exception: Cannot write to ostream at offset 682342: While executing ParallelFormattingOutputFormat (version 21.8.4.51 (official build)) -
Слишком долго отрабатывают наверно. Оптимизируйте заппосы.
-
-
Вы на клиенте эту ошибку получаете?
-
-
Дашборд в Power BI берет данные из КХ по http, там я вижу только ошибку 500, более детальной инфы там не видно. Подробности ошибки я нашел в таблице query_log
Недавно обновился до новой версии. Раньше подобных ошибок не возникало -
Parallel output format надо отключить
-
$ cat /etc/clickhouse-server/users.d/output_format_parallel_formatting.xml
<?xml version="1.0"?>
<yandex>
<profiles>
<default>
<output_format_parallel_formatting>0</output_format_parallel_formatting>
</default>
</profiles>
</yandex> -
Теперь это выходит
Code: 24, e.displayText() = DB::Exception: Cannot write to ostream at offset 682436: While executing TabSeparatedRowOutputFormat (version 21.8.4.51 (official build)) -
Спасибо! Похоже то что надо, правда на плейграунде любопытно себя ведёт:
19.14 - всё ок
20.3 LTS - Cannot execute query in readonly mode (version 21.3.15.4 (official build) (не знаю почему 21.3, хотя выбрана 20.3)
20.8 LTS - Not enough privileges. To execute this query it's necessary to have the grant CREATE TEMPORARY TABLE ON *.* -
В гитхаб. Файлите баг
-
а можете объяснить из-за чего? мне бы починить это побыстрее, может я что-то перенастрою на стороне клиента и будет работать
-
Подскажите по следующему кейсу. Таблица с partition by id, за один insert вставляются все значения партиции, от 100к до 2кк+ рядов, после этого только select, новых вставок больше в эту конкретную партицию не будет.
В день ~10-100 таких партиций.
Знаю что кх любит поменьше партиций, насколько рационально такое использование?
Минусы как я понимаю - хуже сжатие.
Плюсы - я могу быстро почистить базу от лишнего, быстрые селекты из партиций по id.
Что-то ещё я упускаю? -
со временем всё начнёт замедляться и к 10_000 партиций может колом всё стать, лучше так не делать
-
допустим есть таблица в которой хранится где хранится snmp счеткик байт и таймштампы, как посчитать 95 percentile скорости? Те percentile95_of( val(ts2)-val(ts2)/ts2-ts1)
- 03 September 2021 (109 messages)
-
такой запрос не дает результата. выдает мак и мин равные просто value
SELECT
max(value),
min(value) OVER (ORDER BY timestamp ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING),
value,
timestamp
FROM data
WHERE (metric = 'xxxxx.ifHCInOctets') AND ((date >= toDate(1615531649)) AND (date <= toDate(1616633967))) AND ((timestamp >= toDateTime(1615531649)) AND (timestamp <= toDateTime(1616633967)))
GROUP BY
value,
timestamp
ORDER BY timestamp ASC -
решено вот так http://pastebin.fr/95010
-
WF перебор для такой простой задачи. в КХ есть прекрасная функция arrayDifference.
Что-то типа такого - select arrayMap(x,y -> x/y, arrayDifference(value), arrayDifference(timestamp)) from data
начальный ноль может помешать, но вам для последующих процентилей будет нормально. -
-
Добрый день. Есть ли в CH native protocol какой-то протокол закрытия соединения? Или можно просто закрыть сокет в любой момент? Спрашиваю потому что CH крэшится при рестарте приложения и подозреваю что клиент неправльно закрывает соединение... Go и Python клиенты вроде просто закрывают сокет...
-
ребят, подскажите, как сбэкапить кликхаус на локальную машину
-
Резервное копирование данных | Документация ClickHouse
Резервное копирование данных Репликация обеспечивает защиту от аппаратных сбоев, но не защищает от человеческих ошибок:
-
Я делаю через alter freeze, затем скачиваете себе, создаёте такую же схему и выполняете attach
-
Если таблицы маленькие можете INSERT INTO SELECT FROM remote....
-
Выглядит как баг, кх не должен падать даже при некорректном завершении клиентской сессии. Что в логах?
-
я не уверен что это связано с закрытием - пытаюсь все проверить
https://github.com/ClickHouse/ClickHouse/issues/28524Received signal Segmentation fault (11) when reading LowCardinality(String) · Issue #28524 · ClickHouse/ClickHouseI have the following in the logs 2021.09.02 13:04:47.539273 [ 119318 ] {} <Fatal> BaseDaemon: (version 21.7.8.58 (official build), build id: 95F91F78B10AC6F0E542A4C4F8D7B8162144DE39) ...
-
починил. В PowerBI после обновления, начали по другому формироваться запросы, была ошибка в синтаксисе запросов. После исправления, этой ошибки не получаю.
-
а как не скачивая сбэкапить сразу на другую машину?
-
А чем другая машина отличается от вашей? Она тоже другая. freeze, rsync, attach или insert into select from remote самые простые методы. посложнее clickhouse-copier
-
clickhouse-copier | Документация ClickHouse
clickhouse-copier Копирует данные из таблиц одного кластера в таблицы другого (или этого же) кластера. Можно запустить н
-
Я использую вот это софтинку. Работает хорошо. Если надо может сразу на амазон или азур бекапы закидывать. Ну и локально конечно.
В принципе она внутри делает то же что и писали freeze и т.д но не надо руками скрипты писать.
https://github.com/AlexAkulov/clickhouse-backupGitHub - AlexAkulov/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages supportTool for easy ClickHouse backup and restore with cloud storages support - GitHub - AlexAkulov/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages support
-
да вот сейчас читаю об ней, есть пример скрипта, чтобы с другого сервера стянуть на свой бэкап? не совсем пойму по документации как это сделать
-
просто сервер на котором находится кликхаус, по памяти не позволит еще сохранить там бэкап
-
Так бекап кликхауса место фактически не занимает, это хардлинки на существующие файлы (и с этим надо аккуратно, права не менять и т.д)
-
если у меня бд весит терабайт, бэкап будет несколько мегов?)
-
Не занимает пока мержей не случилось
-
я думал это как с постгрешкой, где сжимается процентов на 30-40
-
Это по сути просто снепшот
-
-
Ну это понятно что дельта будет. Но по факту бекап базы размером в терабайт не будет требовать еще терабайт на диске
-
Нет, как я говорил это хардлинки на существующие файлы на момент бекапа. То есть в момент бекапа насколько я понимаю места на диске он занимать будет по факту нисколько (грубо говоря).
Я например делаю так, бекап утилиткой, tar директории бекапа и через пайп сразу на s3, удалить директорию бекапа. -
Привет, ребят
Подскажите, пожалуйста.
При запуске OPTIMIZE FINAL
Получаю ошибку
Cannot OPTIMIZE table: Timeout while waiting for already running merges before running OPTIMIZE with FINAL. Cannot select parts for optimization.
Но через некоторое время, могу запустить и упорядочить данные, убрать дубли в случае ReplacingMergeTree
Как ее избежать? -
а можешь скриптец скинуть?
-
Сейчас в личные сброшу, почищу креденшиалы 😊
-
спасибо)
-
у вас движок Ordinary видимо там нужна какая то блокировка и у вас постоянно видимо идут мержи еще...
не надо "избегать дублей"
OPTIMIZE FINAL перечитывает несколько раз ВСЮ таблицу с данными
максимум можно по расписанию пускать OPTIMIZE db.table PARTITION .... FINAL раз в день ...
используйте SELECT ... FINAL -
там не pull модель, а push используется
то есть вам надо запускать clickhouse-backup на том же сервере что и clickhouse-server и он должен иметь доступ файловой системы /var/lib/clickhouse* -
Привет! Вопрос достаточно странный. Но тем не менее не могу понять куда смотреть.
Есть таблица с TTL месяц, данных льется туда не мало, где-то 5-8 млрд строк за месяц (строки сами по себе объемные), и со временем я заметил, что внутри самой таблички
select * from table limit 1 order by date desc
нет данных старше месяца, как и должно, но размер таблицы всё время увеличиваетсся на диске, если сделать
select sum(bytes) from system_parts where table = 'table'
Куда смотреть, где копать?
(Таблиц на самом деле 5, на 5 шардах, объединенных одной distributed, но я думаю это не имеет особого значения в данном вопросе) -
IMHO размер таблиц растет что у вас просто больше строк за следующий месяц, чем за предыдущий
ну и надо смотрать на размер ативных партов а не просто сумму
SELECT formatReadableSize(sum(total_bytes)) FROM system.tables WHERE name='XXX'
или
SELECT formatReadableSize(sum(bytes)) FROM system.parts WHERE table='XXX' AND active=1 -
Вот буквально только что сделал такие запросы, размер активных партов как раз 11.44ТБ, размер не активных в районе 20-50ГБ, постоянный разный, КХ видимо мерджит и удаляет старые парты, возможно вы правы, буду смотреть дальше
-
да, не активные парты примерно 7 минут хранятся перед удалением...
-
Добрый день.
Подскажите как можно проверить значение столбца AggregateFunction(sum, UInt32) или подобного на дефолтное значение те нулевое не применяя группировку и как следвие аггрегатные функции тк они требуют группировки -
добрый день! подскажите, то что EXPLAIN AST проглатывает FORMAT это фича или баг?
EXPLAIN
SELECT 1
FORMAT CSV
"Expression ((Projection + Before ORDER BY))"
" SettingQuotaAndLimits (Set limits and quota after reading from storage)"
" ReadFromStorage (SystemOne)"
EXPLAIN AST
SELECT 1
FORMAT CSV
┌─explain───────────────────────────┐
│ SelectWithUnionQuery (children 2) │
│ ExpressionList (children 1) │
│ SelectQuery (children 1) │
│ ExpressionList (children 1) │
│ Literal UInt64_1 │
│ Identifier CSV │
└───────────────────────────────────┘ -
Всем привет. Есть поле массив строк
['AVK/003471/60c6c0ab0721a27f157bf1e547978de5.jpg','AVK/003471/7cd424aedc26c497fa45aae131095683.jpg']
Можно ли запросом получить этот же массив, но к каждому элементу добавить префикс также строкой? Нужен concat для каждого элемента массива -
Сам нашел ответ)
arrayMap(x -> concat(‘prefix’, x), arrayField) -
Добрый день. Пытаюсь выполнить alter table t1 delete where (col1, col2, col3) in (select col1,col2, col3 from tablet2). Получаю ошибку в system.mutations :there is no query or query context has expired
-
лучше table2 в dictionary загнать если можно и через dictGet удалять...
потому что иначе слишком тяжелая мутация получится с кучей выборок лишних -
скорее просто недоработка
-
`EXPLAIN AST` doesn't respect `FORMAT` in query body · Issue #28575 · ClickHouse/ClickHouse
ClickHouse version: 21.3.15.4 EXPLAIN works as expected: EXPLAIN SELECT 1 FORMAT CSV "Expression ((Projection + Before ORDER BY))" " SettingQuotaAndLimits (Set limits and...
-
Приветствую!
Создаю на основании исходной таблицы словарь, и получаю такую ошибку. Почему такое может быть?
Code: 48, e.displayText() = DB::Exception: Conversion between numeric types and UUID is not supported: while converting source column item_id to destination column item_id (version 21.3.4.25 (official build))
Исходная таблица:
create table items_new
(
item_id UUID,
name String,
code String,
article String
)
engine = StripeLog;
Типы в словаре такие при создании:
CREATE DICTIONARY europa.dict_items (
item_id UUID,
name String,
code String,
article String
) -
в словарях ключ должен быть UInt64 или tuple
-
Ключ и поля словаря | Документация ClickHouse
Ключ и поля словаря Секция <structure> описывает ключ словаря и поля, доступные для запросов. Описание в формате XML: <d
-
-
Прочитайте доку, там описано:
Совет
Составной ключ может состоять из одного элемента. Это даёт возможность использовать в качестве ключа, например, строку. -
Как я понимаю проблема в хранении и использовать "flat" нельзя и если ключ не формата UInt64, то надо использовать другое хранение, например hashed7
-
Из доки:
В этом случае layout должен быть complex_key_hashed или complex_key_cache. -
-
можно ещё считать хэш от UUID, например использовать xxHash64(UUID), будет быстро работать
-
Т.е в функции dictGet('', xxHash64(UUID)) передавать функцию хэширования?
-
извините, так наверное не вариант, придётся хранить в источнике ещё этот хэш
-
Плюс мне кажется дополнительная нагрузка для вычисления перед получением значения из словаря
-
не особо, оно очень быстро работает
-
-
finalizeAggregation( )
-
спасибо большое!!!
-
там еще другая проблема может быть, 64 битный хеш может давать коллизии для UUID (128 бит)
используйте complex_key_hashed -
-
да, и перелить из одной в другую
-
-
вообще можно, но изменить partition by / order by нельзя
-
-
Подскажите если не сложно, почему для словаря такой структуры
CREATE DICTIONARY dict_items
(
item_id String,
name String,
code String,
article String
)
PRIMARY KEY item_id
LAYOUT(COMPLEX_KEY_HASHED())
При попытке получить 2 атрибута возвращается ошибка
dictGet('dict_items',('code','article'),tuple('8dd81299-9161-11eb-80da-000c293556a6'))
Code: 43, e.displayText() = DB::Exception: Illegal type Tuple(String, String) of second argument of function dictGet, expected a const string.: While processing '1', dictGet('europa.dict_items', ('code', 'article'), tuple('8dd81299-9161-11eb-80da-000c293556a6')) (version 21.3.4.25 (official build)) -
эта возможность в 21.4 появилась
-
21.3 не умеет такого
разницы в перфоманс между одним dictGet с двумя атрибутами и двумя dictGet нету. Просто SQL длинее. -
Как раз писал это вопрос )
-
Те несколько "dictGet" никак не сказываются на производительности?
-
каждый атрибут словаря хранится в отдельной хештаблице, что так что этак бегать по двум (n) хештаблицам.
-
dictGet( ..., (tuple(атрибуты), ключ) это сахар
-
-
-
system.dictioanries
-
Отличная идея. Спасибо!
Думаю да. можно без окон, но как?
select arrayMap(x,y -> x/y, arrayDifference(value), arrayDifference(timestamp)) from data WHERE metric='xxxxx.ifHCInOctets' AND date BETWEEN toDate(1615531649) AND toDate(1616633967) AND timestamp BETWEEN toDateTime(1615531649) AND toDateTime(1616633967) order by timestamp;
не работает потому что это как бы обычный селект порерх значений а не массивов. Received exception from server (version 21.6.5):
Code: 43. DB::Exception: Received from localhost:9000. DB::Exception: The only argument for function arrayDifference must be array. Found Float64 instead.: While processing arrayMap((x, y) -> (x / y), arrayDifference(value), arrayDifference(timestamp)).
Надо как-то сначала сложить в array подзапросом? -
наверное вот так
select arrayMap(x,y -> x/y, arrayDifference(av), arrayDifference(at)) from (select groupArray(value) as av, groupArray(timestamp) as at from data WHERE metric='xxxxx.ifHCInOctets' AND date BETWEEN toDate(1615531649) AND toDate(1616633967) AND timestamp BETWEEN toDateTime(1615531649) AND toDateTime(1616633967) ) ;
но не уверен -
-
УВЫ нельзя ...
проще на стороне MySQL тип поменять
а какой тип у вас не совместим?
для MaterializedPostgreSQL можно конкретно сделать одну таблицу...
но как это работает для 10ков таблиц паралельно не ясно ... -
Ругается на тип JSON
-
можно попробовать https://github.com/long2ice/synchGitHub - long2ice/synch: Sync data from the other DB to ClickHouse(cluster)
Sync data from the other DB to ClickHouse(cluster) - GitHub - long2ice/synch: Sync data from the other DB to ClickHouse(cluster)
-
😮
-
-
не факт что получится, но по крайней мере эта штука лучше кастомизируется
-
или взять Debezium + kafka (redpanda)
-
Я сейчас просто скриптами по крону копирую из MySQL в КХ. Из-за того что кластер 2х2 иногда процесс коряво проходит
-
всем привет
подскажите плз
https://gyazo.com/a3eef0a5fba2d4b4cc8ed7df8552ddff
я так понимаю это плохо ))) но что именно нужно делать чтобы это убрать ?Screenshot by GyazoEasily capture screenshots, GIFs, and replays that are ready to share. Download the free app for windows and mac.
-
это zookeper не справляется или еще что-то ?
-
нормально. Но вы напрасно выкинули order by timestamp в подзапросе во втором примере. Он там конечно же нужен.
-
он там нужен по логике но Code: 215. DB::Exception: Received from localhost:9000. DB::Exception: Column timestamp is not under aggregate function and not in GROUP BY: While processing timestamp ASC
-
SELECT arrayMap((x, y) -> (x / y), arrayDifference(av), arrayDifference(at)) AS s
FROM
(
SELECT
groupArray(value) AS av,
groupArray(timestamp) AS at
FROM data
WHERE (metric = 'xxxxx.ifHCInOctets') AND ((date >= toDate(1615531649)) AND (date <= toD ate(1616633967))) AND ((timestamp >= toDateTime(1615531649)) AND (timestamp <= toDateTime(16 16633967)))
ORDER BY timestamp ASC
)
Query id: 7fd6b73c-9414-438c-a625-297522fa4005
0 rows in set. Elapsed: 0.007 sec.
Received exception from server (version 21.6.5):
Code: 215. DB::Exception: Received from localhost:9000. DB::Exception: Column timestamp is not under aggregate function and not in GROUP BY: While processing timestamp ASC. -
select arrayMap(x, y -> x / y, arrayDifference(groupArray(value)), arrayDifference(groupArray(timestamp)))
from (select value,timestamp
from data
WHERE metric = 'xxxxx.ifHCInOctets' AND date BETWEEN toDate(1615531649) AND toDate(1616633967)
AND timestamp BETWEEN toDateTime(1615531649) AND toDateTime(1616633967)
order by timestamp
); -
SELECT * FROM system.replication_queue
проверьте значения макросов на всех серверах, должны быть разные для replica -
спасибо, работает! Сейчас как-то этот array распаковать что бы прогнать quantile. По правде я первый раз сегодня увидел array фунции
-
у меня там 20 строчек .... но там вроде как похоже на ошибку
Not executing log entry queue-0022395444 for part 12_3133799_3133806_1 because it is covered by part 12_3133343_3133811_67 that is currently executing. -
так сходите в соответствующий раздел документации и почитайте. Конкретно сейчас вам нужна функция arrayJoin или часть функционала select под названием array Join .
-
ARRAY JOIN | ClickHouse Documentation
ARRAY JOIN Clause It is a common operation for tables that contain an array column to produce a new table that has a col
-
больно уж кратенько 😊 но хорошо что есть
-
Добрый день, интересует меня один вопрос кто использовал kittenhouse и clickhouse-bulk на продакшене? Какие впечатления от ипользования? Как использовали kittenhouse при отсутствии Dockerfile собирали сами или внедряли в свой образ рядом с приложением? Может быть столкнулись с нюансами работы или конфигурирования этих проектов?
-
привет! кто может подсказать, есть distributed table на две шарды, шардирование по рандому, пишем в distributed table.
по итогу в один шард данные попадают, в другой нет. в distributed в итоге половина данных -
(я изначальный автор kittenhouse) Продакшн-опыт у kittenhouse, надеюсь, Вам подскажут, хочу подчеркнуть одну вещь, что что kittenhouse что clickhouse-bulk должны находиться на том же сервере, что и приложение, иначе должного эффекта может и не быть, хотя все зависит, конечно.
-
коннект на intersever порт то есть между шардами? и remote_servers правильно прописан?
-
логи посмотрите наверняка там есть
-
ClickHouse/ClickHouse description changed: v21.6.9.7-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.6.9.7-stable
Release notes:
ClickHouse stable release v21.6.9.7-stableRelease v21.6.9.7-stable · ClickHouse/ClickHouseClickHouse stable release v21.6.9.7-stable
-
Вопрос, а все что вошло в релиз на оф сайте публикуется позже или где-то можно увидеть уже описание всего что вошло в релиз?
-
нет, нет
только вручную, нажимаете compare, выбираете версию https://github.com/ClickHouse/ClickHouse/compare/v21.6.8.62-stable...v21.6.9.7-stableComparing v21.6.8.62-stable...v21.6.9.7-stable · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Всем привет, после ALTER TABLE, менялся TTL с переносом данных и перепаковкой, реплика перешла в readonly. Причем один шард ушел в ридонли, а второй нормально отработал и идет процесс. В логах вижу только ошибку вида:
2021.09.03 16:59:54.556924 [ 77 ] {} <Error> statistics.raw_shard (ReplicatedMergeTreeRestartingThread): void DB::ReplicatedMergeTreeRestartingThread::run(): Code: 49, e.displayText() = DB::Exception: Part 20190126_7_12_2_16 intersects previous part 20190126_7_12_1_17. It is a bug., Stack trace (when copying this message, always include the lines below)
есть подозрение на это. Можно как-то полечить это? Поможет ли удаление партиции сбойной?
Версия 21.5.6 -
в дополнение к сказанному: хорошо бы убедиться, что на "больной" шарде с таблицей все Ок, попробуйте вставить непосредственно в нее хотя бы одну строку.
- 04 September 2021 (58 messages)
-
Всем привет. Не отпускает рабочая задачка.
Есть около 10 таблиц вида (ID UUID, Param1Name Param1Type, ..., ParamNName ParamNType, Updated MATERIALIZED now()), которые обновляются с разной частотой (от раза в час до раза в неделю), от 300к до 3кк записей в каждой. Для отображения данных на фронте всё это джойнится по ID, нужные параметры выбираются как argMax(ParamMName, Updated).
Разумеется, работает очень медленно.
Хочу склеить их в одну плоскую таблицу, но не могу придумать как это корректно хранить\обновлять:
1. ReplacingMT с ключом ID не подходит, т.к. обновления столбцов приходят отдельно и если придёт обновление только двух столбцов, то остальные затрутся пустыми значениями.
2. AggregatingMT с ключом ID выглядит лучше, но не могу придумать корректную агрегационную функцию, т.к. 0 или -1 для числовых столбцов и пустая строка для строковых может прийти И в случае обновления этого столбца И в качестве дефолтного значения при обновлении других столбцов - не совсем ясно как определять когда надо учитывать значение, а когда нет.
3. Есть вариант сделать пять столбцов-массивов и вьюху, которая будет выбирать последнее непустое значение через argMaxIf(). Вроде бы вариант рабочий, но размер таблицы может оказаться неприятным сюрпризом.
4. Комбинация 2 и 3 вариантов, когда добавляется ещё одно поле, по которому можно определить какие столбцы обновлялись этой строкой. При выборе значения надо будет использовать конструкции типа argMaxIf(Param3Name, Updated, UpdateType = 3).
Покритикуйте варианты или подскажите более правильное направление, пожалуйста. -
2 вариант + argMax люди пользуются,
Кх Null значения в этом случае игнорирует -
Т.е. использовать Nullable типы?
У меня ведь будут инсёрты вида insert into WideTable values('', '', '', 0, 0, 0, 'insertedVal1', 'insertedVal2', 100500) при обновлении трёх последних столбцов, например. -
А почему именно на том же сервере ? Если использовать как решение для накопления данных в батч, чтобы снять эту задачу с приложения
-
А есть какой-то очевидный способ сгруппировать события входа и выхода пользователя в clickhouse?
-
Зависит от способа использования. Если Вы, допустим, хотите логи приложения надежно доставлять и используете persistent режим у kittenhouse (в котором всё пишется на диск и впоследствии надежно доставляется), то если будут наблюдаться проблемы с сетью, то залогировать их куда-то кроме локальной машины не получится.
Еще один юзкейс это in-memory логи с сервера, и в таком случае лишнее просто выбрасывается. Это опять же очень полезный режим, если хочется, допустим, собирать логи ошибок с каждого сервера, и если их слишком много, то просто выбрасывать лишнее, потому что больше, условно, 8 мегабайт логов ошибок в секунду с сервера вряд ли имеет смысл слать.
То есть, грубо говоря, для сбора логов с серверов (это был один из основных юзкейсов kittenhouse) хорошо подходит только режим с локальной работой, иначе многие полезные свойства, такие как возможность логировать даже логи сетевых ошибок, или умение выбрасывать лишнее, теряются. -
ClickHouse/ClickHouse tagged: v21.3.16.5-lts
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.3.16.5-lts
Release notes:
v21.3.16.5-ltsRelease v21.3.16.5-lts · ClickHouse/ClickHouseClickHouse lts release v21.3.16.5-lts
-
Для накопления в батчи в кликхаусе есть тип таблицы buffer.
-
Vladimir Goncharov in ClickHouse не тормозит
по идее можно обойтись без джойна при мат вью по схеме mat view + AggregatingMergeTree + SimpleAggregateFunction + anyLast + Nullable. создаёте таблицу с ключём, в котором столбцы с общими полями. остальные поля SimpleAggregateFunction(anyLast, Nullable(String)) . и всё строки будут объединяться по общему ключу.
-
Есть-то он есть, но по моим бенчмаркам больше где-то 3000 вставок в секунду голая буферная таблица не выдерживает
-
Я думаю у нас пока меньше 3к будет, спасибо за рекомендации. Пока не упремся в buffer видимо не будем котенка трогать
-
тоже думаем в этом направлении - как избавися от join во время запроса, когда данные поступают разным темпом.
Ваш вар.2 требует функцию anyLast+Nullable - тут все просто. Плохо что получится 10 строк с одним id и group by при выборке. Если вставки редкие, а выборки частые, то это не айс. Да и возня с заворачиванием типов 100 колонок в AggregatedFunction не радует. И Nullable тоже.
Можно попробовать делать join при вставке, прямо в инсерте:
create table upsert_test (
id UInt64,
a UInt64,
b UInt64)
engine = ReplacingMergeTree() order by id;
insert into upsert_test (id,a) select number as id, number*2 as a from numbers(30000);
insert into upsert_test (id,a,b)
select number+10000 as id, at.a as a, number*3 as b from numbers(30000)
left join (select a,id from upsert_test) as at using id
settings joined_subquery_requires_alias=0;
select * from upsert_test final
where id between 29990 and 30010
order by id
limit 20;
В нашем случае точно известно, что данные могут добавляться в течении нескольких часов. Все что старее можно не сканировать. Таким образом подзапрос джойна будет с отсечкой по времени, поэтому правая таблица не будет разрастаться сверх меры. И наверное даже кешироваться при высоком рейте инсертов, но тут не проверял. -
>Плохо что получится 10 строк с одним id и group by при выборке
тут вроде уже не раз писали, что лучше group by чем final. таким образом замена AggregatingMergeTree на ReplacingMergeTree не выглядит как буд-то оно сделает хоть что-то лучше. единственный плюс - отказ от nullable. минусы: join при вставке и то что если во вставляемой пачке идёт сразу несколько строк с одним ключём, то часть данных будет потеряна, потому что последняя вставляемая строка будет джойниться на строки, которые уже есть в базе, но не на строки которые вставляются в той же пачке.
в общем оба варианта хреновые, но какой-то выбрать всё таки придётся :)
лично у меня данных в такой таблице немного и мне бы хватило EmbeddedRocksDB с поддержкой UPSERT, если бы она была -
- где писали что group by лучше final? Вобщем-то все они (вместе с limit 1 by) должны работать по одному принципу, однако в большинстве (но не во всех!) случаях у меня final все-таки побеждал. Плюс выигрыш от оптимизации по последней партиции.
- join сам по себе нужен, про то и говорим. вопрос где его ставить. если инсерт раз в час, а селектов 100 запросов в секунду, то лучше конечно раз в час.
- несколько строк с одним ключом вобще плохо соотносится с replacing. в моей задаче в пачке однородных данных повторений нет и таких пачек немного - 2-3. Но если придется джойнить 10 комплектов разнородных данных (как в задаче топикстартера), то есть шанс наехать на какие-то гонки.
- в EmbeddedRocksDB точно так-же можно сделать этот insert/select/join. И там меньше рисков наехать на гонки. Но кластер ..... -
Друзья! Подскажите, в базе одна большая таблица, каждая партиция YYYYMM занимает место 6TiB и содержит 30 миллиардов строк, очень неудобно их обслуживать, хочу переделать партиционирование на YYYYMMDD. Срок хранения данных 5 лет.
Могут ли возникнуть какие-либо проблемы с партициями YYYYMMDD при таких объемах данных? -
1 месяц 6tb? Это 360тб за пять лет. Это не очень удобно на одном сервере. Новая реплика будет недели наливаться если сломается сервант. 1500 партиций тоже не сахар. И местами очень больно. В алтинити я бы посоветовал клиенту минимум 20 шардов.
-
у нас было много партиций, есть некоторые боли и надо быть очень осторожными, а то КХ стреляет всем чем можно по много-партиционным таблицам (время загрузки, ТТЛ, ДДЛ).
если запросы/перезаливания только на свежих данных, можно делать гибридно (две таблицы, последний месяц дневная, дальше месячные) которые заалиасены под общей таблицей на Merge-Engine.
а ещё можно лайкнуть это и в один прекрасный день это могут и сделать https://github.com/ClickHouse/ClickHouse/issues/16565 -
-
а там можно SQL запрос для графика или датасета указать?
-
-
Вроде как нельзя. Сам он формирует такой запрос, где dict_items это таблица словаря
-
-
-
-
-
join гораздо медленнее
-
-
-
-
-
У меня не веб аналитика, так что изза этого ничего не потеряю
-
Вообще кх умеет переделывать join с таблицей словаря в dictget, но не вашем случае, думаю в случае с limit не получится
-
Те лучше создать view в котором зашить dictget7
-
Нет. Лучше простой join без подзапроса и без лимит.
Нельзя сделать такое Вью. В dictget надо ключи передавать -
Какая версия кх?
-
Для меня тоже оказался сюрпризом запрос который сгенерировал DL
-
это сама тулза (DataLens) такой запрос генерит
-
21.8.5.7
-
Ну вот и спросите в саппорте Яндекса какого хрена
-
можно же dictGet('europa.dict_items', tuple('name', 'code', 'article'), item_id)
-
-
Вопрос не в том как обратиться к словарю. С этим все понятно.
Вопрос был как можно обратиться к словарю использую сервис от яндекса datalinse -
Аа, я понял что имелось в виду. В смысле сделать view в котором dictget прикрутить к основой таблице, тогда да, будет работать
-
лучше туда в саппорт и идите. скажут делать view
-
-
Только что написал.
Была надежда, что кто-то уже решал эту задачу -
Лучше бы конечно чтобы даталенз умел словари и сначала делал groupby по ключу а потом во внешнем запросе dictget и ещё раз groupby. Так намного эффективнее почти всегда
-
Подождем ответа от поддержки. Есть вера, что DL должен быть самым ready с кх
-
Я спрашивал только про 1 партицию YYYYMM на 6Tb для простоты, в реальности там уже есть шардирование на 4 сервера. Если Вы советуете перешардировать 1 партицию на 20 шардов, то с учетом того, что уже есть 4 шарда, получается надо перешардировать на 80 серверов. Я правильно понял, увеличивать кол-во шардов для того, чтобы использовать партиции YYYYMMDD?
-
Лайк поставил!) Интересная идея с Merge-Engine! А устаревающие данные из таблиц с партиционированием YYYYMMDD переливать в таблицы с YYYYMM, верно? Если верно, пробовали ли так делать? Возникли ли какие-нибудь трудности?
-
В смысле 24tb всего в месяц? Серьезно?
-
Да, а что смущает, много?
-
Много. В реальности я с трудом представляю как такой объем засервать на 4х шардах. Или только писать и никогда не кверять. Тут нужен большой кластер если это кликстрим. Ну и обычно настолько сырые данные не нужны на такой период.
-
Советую вам сразу забыть про yymmdd. Или надо очень хорошо понимать что вы делаете.
-
Да, все так, селектят их редко, обычно только последний месяц или последний год и стирать старые данные запрещают
-
Похоже мне придется воспользоваться вашим советом и не думать в сторону YYYYMMDD, - у меня не так много опыта с ClickHouse еще пока
-
Можете в алтинити обратится. У нас есть бесплатный час консультаций. Мы за час все обсудим и возможно расскажем вам как сократить кол-во данных в разы без потери качества.
-
Спасибо!
- 05 September 2021 (14 messages)
-
Можно, руками. Трудности с переливанием зависят от рук. В зависимости от объемов одного запроса, скорости дисков, процессоров, параллельности запросов объем шардов лучше выбирать. У нас есть условно системы с шардами по 4-5 ТБ, есть 20 шардов по 30тб. Но у нас нет заметного qps/запросов.
-
Подскажите, пожалуйста. Как можно в массиве найти последовательность из ивентов ?
-
-
Подскажите пожалуйста. В таблице system.asynchronous_metric_log написана имя колонки name, у меня в базе эта колонка называется metric. Почему?
https://clickhouse.tech/docs/ru/operations/system-tables/asynchronous_metric_log/system.asynchronous_metric_log | Документация ClickHousesystem.asynchronous_metric_log Содержит исторические значения метрик из таблицы system.asynchronous_metrics, которые сох
-
-
-
Повышение в idle? Там метрики собираются раз в сек. было раз в 60 но это параметром можно.
-
В гитхаб ишью
-
Раньше я метрики вообще скрейпил экспортером, перешёл на внутренний эндпойнт, возможно дело как раз в этом. Не подскажете настройку?
-
я не про то. Вы график посмотрите, если у вас мин. использования cpu вырос то это раз, а если нет то это четыре
-
-
тогда какие-то запросы видимо стали больше использовать cpu. Ищите запрос.
-
Спасибо.
С ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof тоже на гитхаб? -
да
- 06 September 2021 (130 messages)
-
-
А как именно обращаться? Я вот на сайте заполнил запрос, а мне назначили zoom-встречу с продажником из Австрии. На 45 мин. Я не в том месте запрос сделал?
-
Всем привет, подскажите пожалуйста не приходилось ли кому то тянуть через океан данные из кафки в холодное резервное хранилище CH. Кейс к примеру такой что есть ДЦ в Штатах и там находится основной кликхауз и кафка, для резерва хотим запустить второй ДЦ в Европе с резервированием БД и определенных таблиц в другом ДЦ у другого провайдера. Сможем ли мы перекачивать эти таблицы или все индивидуально, зависит от объема и надо тестировать?
-
Добрый день! Можете посоветовать курсы по клику - разные уровню. И для администрирования и для оптимизации запросов
-
@critskiy можно ссылку на канал
-
-
спасибо и за оперативность)
-
-
-
Ммм! это, по-моему, чуть круче, чем курсы
-
Всем, привет. Хотим поднять тестовый стенд кликхауса, что бы протестировать загрузку из хадупа в кликхауса и из него в qliksense. 2 вопроса, 1: кто-то занимался такой перекачкой? Буду признателен за фитбек и 2: если в hive инкремент в 65млн(40 столбцов). Сколько примерно кликхаусу нужно памяти и процов для запроса select *, без join.
-
-
Для теста пары ядер и 4-8гб хватит
-
память нужна для больших GROUP BY, JOIN ORDER BY (без лимита)
-
https://github.com/ClickHouse/ClickHouse/pull/27503
https://github.com/ClickHouse/ClickHouse/pull/27217 -
народ, кто знает, как можно оптимизировать следующий код?
select
sum(case when (vv.time_check - tab_1.time_check)< 30 and
vv.time_check >=tab_1.time_check then coeff_weight else 0 end)/100 as Count30Sec,
vv.tr_check_id,
vv.time_check,
vv.date_check as date,
vv.camera_id as camera_id
from tab_1
global inner join
coeffff
ON
tab_1.regno=coeffff.regno
global inner join
(select distinct date_check, speed,time_check,
camera_id,tr_check_id
from all_checks
where date_check = toDate('2021-05-26')
and tr_check_id global in (select distinct tr_check_id from
otobrannye_checks where
checks_speed > 0 and avgSpeed>0)
)vv
ON
tab_1.camera_id = vv.camera_id
where tab_1.date_check = toDate('2021-05-26')
and v.time_check < addSeconds(vv.time_check, 6)
group by
vv.tr_check_id,
vv.time_check,
date,
camera_id -
Проходы под камерой сформированы в табл otobrannye_checks
-
Проблема в тяжелых джоинах, как их можно оптимизировать?
-
отказаться от тяжелых джойнов, добавить памяти, создать доп технические таблички для промежуточных джойнов, убрать вычисляемые выражения из условий --> перенести их в селект например, addSeconds(vv.time_check, 6), еще можно где-то отсортировать по camera_id и где в запросе выборка больше - поставить его выше
-
использовать словари вместо джойнов
шардировать данные по одному ключу чтобы избавиться от GLOBAL -
SELECT * FROM id_val ANY LEFT JOIN (SELECT * FROM id_val_join) j USING (id);
-
м? если это ко мне, то я очень культурна, меня эта тема тоже очень интересует, прям шкурно. Написала то, что пробовала
-
Приветствую, подскажите, есть ли какие рекомендации по дискам? В частности, интересует вопрос, сколько места должно быть свободно для нормальной работы?
Для простоты: есть диск 1Тб, сколько нужно места держать свободным (5%, 10%, или не имеет значения?).
Спасибо -
Это бот-завлекашка, не обращайте внимания.
-
Его уже забанили кстати ;)
-
А как нибудь можно создать словарь на основе таблицы? У меня одна из таблиц как раз состоит из 2 столбцов (ключ-значение)
-
Источники внешних словарей | Документация ClickHouse
Источники внешних словарей Внешний словарь можно подключить из множества источников. Общий вид XML-конфигурации: <yandex
-
А что за параметр LIFETIME?
-
Периодичность обновления словаря
-
А если таблица, на основе которой создается словарь не обновляется? То какой LIFETIME устанавливать?
-
это периодичность подгрузки словарей из таблицы
-
И каким тогда его лучше установить?
-
можете выставить в 0 и тогда словарь не будет обновляться
-
Тут можно поподробнее ознакомиться https://clickhouse.tech/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-lifetime/Обновление словарей | Документация ClickHouse
Обновление словарей ClickHouse периодически обновляет словари. Интервал обновления для полностью загружаемых словарей и
-
всем привет
как конвернуть значение колонки String в Array(String)?
select '["cat1","cat2"]' as col -
может как-то элегантнее можно, но так должно работать
select CAST(replaceAll('["cat1","cat2"]', '"', ''''), 'Array(String)') -
А получается для создания словаря нужен обязательно PRIMARY KEY?
-
вот как раз думал есть что-то стандартное)) в любом случае спасибо
-
ну если бы не двойные кавычки было бы всё стандартно)
-
да, вы по нему достаёте значения из словаря
-
dictGet('dict_auto_weight', 'coeff_weight', cast(regno, 'UInt64')) as Num
У меня просто уникальное поле regno и оно типа String, а dictGet требует UInt64
Как можно это обойти? -
Использовать составной ключ, тут больше инфы https://clickhouse.tech/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure/Ключ и поля словаря | Документация ClickHouse
Ключ и поля словаря Секция <structure> описывает ключ словаря и поля, доступные для запросов. Описание в формате XML: <d
-
@camoron, @unamedrus спасибо!
-
SELECT JSONExtract('["123", "456"]', 'Array(String)')
-
Да, спасибо, это отличный выход, но после создания у меня не видит атрибута coeff_weight Int16 и выдает ошибку Exception: external dictionary 'dict_auto_weight' not found
CREATE DICTIONARY dict_auto_weight (
regno String,
coeff_weight Int16
)
PRIMARY KEY regno
SOURCE(CLICKHOUSE(
host ''
user ''
password ''
db ''
table 's_auto_coef_weight'
secure 1
))
LAYOUT(complex_key_hashed())
LIFETIME(MIN 3600 MAX 5400); -
а как вызываете? ошибка же в том что словарь не может найти, скорее всего имя базы не указываете в dictGet
-
dictGet('dict_auto_weight', 'coeff_weight', tuple('string for regno'))
-
dictGet(‘databasename.dict_auto_weight’…
-
Все равно та же ошибка
-
а что тут? ошибки нет? database совпадает?
select * from system.dictionaries where name = 'dict_auto_weight' -
-
Он даже атрибуты не увидел
-
а вы вызываете как? dictGet(‘default.dict_auto_weight’… ?
-
Так тоже ошибка
-
прокажите столбец last_exception
-
Пустой полностью
-
system reload dictionary default.dict_auto_weight;
-
Не совсем понял
-
перезагрузите словарь
-
Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Not found: dictionary.source.clickhouse.port (version 20.1.16.120 (official build))
-
порт указали для подключения?
-
Нет
-
попробуйте указать
-
Только указывать 9000 а не http 8123
-
Привет, подскажите, такая ситуация
есть архивная таблица, где лежит состояние таблицы за последние пару дней(обновление ежедневное), и на таблице висит ttl archiveDate + interval 2 day
уменьшится ли нагрузка на базу(или улучшится производительность) в случае добавления партицирования по дате архивации? -
-
Считать кол-во точек в строке?
-
Типа уровень вхождения в дерево. Если разделить по точкам
-
Скорее да. Но там надо ещё параметр ttlonlydropparts добавить
-
-
Спасибо!
-
Этот вопрос не имеет отношения к кх. В докере можно запускать приложения замапив данные приложения с хоста, или из датаконтейнера или прямо в текщем контейнере. Поэтому не зная этого нельзя ответить.
-
-
Совместимы в 99.99% кроме случаев описанных в ченджлоге.
-
Спасибо
-
SELECT length(extractAll('param1.param2.param3', '\\.'))
┌─length(extractAll('param1.param2.param3', '\\.'))─┐
│ 2 │
└───────────────────────────────────────────────────┘ -
Спасибо Наверное не правильно выразился. Как развернуть это типа из одной строчки param1.param2.param3 получить три в выдаче
1 | param1
2 | param1.param2.
3 | param1.param2.param3 -
ниче не понял. Что на входе-то?
-
вход:
param1.param2.param3
выход:
1 | param1
2 | param1.param2.
3 | param1.param2.param3
вход:
param1.param2.param3.param4
выход:
1 | param1
2 | param1.param2.
3 | param1.param2.param3
4 | param1.param2.param3.param4 -
Это похоже на statsd какой-то, где в бэкэнде где-то кх.
-
SELECT arrayJoin(arrayMap((x, i) -> arrayStringConcat(arraySlice(s, 1, i), '.'), s, arrayEnumerate(s))) FROM (SELECT splitByChar('.', 'param1.param2.param3') s)
-
Ребят, кто-нибудь сталкивался, что после создания словаря и его использования в селекте подтягивается просто вектор нулей?
-
что такое вектор?
что такое использование словаря? -
select camera_id,tr_check_id, regno, dictGet('bigdata.dict_auto_weight', 'coeff_weight', tuple('tc.regno')) as coeff
То есть появляется поле нулей в самом правом столбце, а должны быть веса -
а если для проверки select * from bigdata.dict_auto_weight where regno='tc.regno' то все ОК ?
-
аааа, дошло
select camera_id,tr_check_id, regno, dictGet('bigdata.dict_auto_weight', 'coeff_weight', tuple(tc.regno)) as coeff -
tc.regno это поле, 'tc.regno' -- строковая контстанта
-
Спасибо, сработало!
-
ого спасибо
-
Добрый день. подскажите плз, есть таблица в каждой строке json по 500к, общий размер таблицы 6Гб, при запросе на последнюю строку по ts получаю что запрос хочет 20 гиг памяти. Запрос select json from table order by ts desc limit 1. Где я свернул не туда
-
тамще-то это ожидаемо.
order by у таблицы какой? -
Добрый день! Рассматриваю Кликхаус в качестве базы для аналитической системы и пытаюсь понять, подходит ли он для наших задач или нет. Хочу услышать ваше мнение. Допустим, у меня есть запросы от пользователей и ответы на эти запросы. Запросы и ответы приходят не одновременно, а с разницей в несколько секунд. Мне нужно считать метрики по склеенным по идентификаторам запросам-ответам (потому что часть нужных полей есть в запросах, а часть в ответах). В связи с этим вопрос: правильно ли я понимаю, что без джойнов здесь не обойтись и, т.к. и запросы, и ответы не являются словарями, джойн по ним в КХ будет работать не оптимально?
-
ORDER BY ts SETTINGS index_granularity = 8192
-
Вам нужно до кликхауса собирать данные и бачами заливать в КХ
-
хм, а select version() ?
и что если set max_threads=1, max_block_size=512 -
тут не нужен КХ, берите mysql.
Если у вас в день меньше чем 100млн. ивентов то КХ это оверкилл. -
версия старая как .... 18.12.17. если что можно и на новый сервер эту базу перенести, set max_threads=1, max_block_size=512 сейчас посмотрю как это задать в dbeaver
-
в новых версиях (старше 19.16) КХ не будет сортировать, а будет использовать сортированность таблицы (индекс)
-
ага. понял. спасибо большое. перееду тогда на новый CH
-
у нас уже сейчас OLTP база, и она не вывозит, мы ищем вариант, на который лучше перейти
-
Добрый вечер!
Стоим переред выбором, какие ноды взять? две AMD Ryzen 9 5950X или одну AMD EPYC 7502P?
По деньгам выходит однинаково, по бенчмаркам 2xRyzen9 должено быть быстрее. Если брать Ryzen, то предполагается использовать distributed таблицы
https://www.cpubenchmark.net/compare/AMD-Ryzen-9-5950X-vs-AMD-EPYC-7502P/3862vs3538AMD Ryzen 9 5950X vs AMD EPYC 7502P [cpubenchmark.net] by PassMark SoftwareComparing AMD Ryzen 9 5950X vs AMD EPYC 7502P
-
сколько ивентов в день?
-
зависит от запросов. Финальная группировка во многих случаях занимает столько же времени сколько и запрос на шардах.
короче в некоторых дизайнах в два раза быстрее будут 2 сервера, а в некоторых один, я предпочитаю 1 шард -
Пока десятки миллионов, но в будущем ожидаем больше. К тому же, метрики ведь не только по дням нужно считать, но и по месяцам, годам... OLTP БД тяжело обрабатывать такие запросы
-
ну в общем джойните в OLTP и заливайте в КХ уже поджойненое в одну широкую таблицу, естественно с задержкой, когда все данные уже приехали в OLTP
-
поняла, спасибо за ответ!
-
спасибо!
-
а если одна нода Ryzen 9 против одной ноды Epyc 7502P?
у Райзена 32 тредов, в Эпика 64, но у райзена каждый тред два раза быстрее.
В итоге в бенчмарках 32 треда Райзена набирают как 64 треда Эпика -
-
32 быстрых, не все этапы пайплайна можно распараллелить
-
-
Да например.
-
-
Есть кто использует datagrip? Обновился до последней версии и бесит один момент, раньше по умолчанию генерился запрос с limit 500. А сейчас просто select *. Который выжирает кучу памяти. Кто знает как вернуть ограничение?
-
Обновился на днях до последнего, все норм при открытии таблиц, лимит проставляется
SELECT t.*
FROM europa.price_change t
LIMIT 501
Скорее всего какие-то дефолтные насстроки -
А у меня как то рандомно, то делает лимит 500 то не делает. Бесит жуть. А у тебя драйвер какой версии? 1.5 или последний?
-
-
Приветствую, можно ли изменять на живой таблице index_granularity, есть ли подводные камни? Вижу что marks_bytes уже кратно превысил mark_cache_size на 1/3 данных. Самые медленные выборки на миллионах строк, если подрастёт время на мелких запросах не страшно.
-
Нельзя. Только пересоздать табл.
На самом деле marks bytes это про все колонки и все партиции если вы читаете только часть колонок то вам не нужно все кешировать -
кто-нибудь сталкивался с тем, что count(xxx) некорректно работает для вьюх?
-
А что такое count xxx? Это кол-во СТРОК где xxx не null.
Вы путаете с uniq? -
Спасибо, тема с mark_cache_size считаю слабо освещена в доках. Вот только вылечил кейс, в котором поиск был по всему диапазону засечек таблицы и они не помещались в mark_cache_size, время ответа взлетало с 0.2сек до 5сек. Хотя свободной памяти было предостаточно.
-
Любой count выводит хрень, во вьюхе больше 200 строк, он выводит на count(*) 2
-
Не видел такого. Есть например https://github.com/ClickHouse/ClickHouse/issues/27578
-
о, похоже
-
Да. Все так. Причем марков может быть 72 байта на гранулу а может 16.
-
спасибо, это оно
-
Мессадж в лог спас бы не одного в такой ситуации.
-
Какой мессадж? Их будет 300млн. в сек.
-
Две крайности )
- 07 September 2021 (89 messages)
-
Добрый день! Подвис процесс удаления матвьюхи, удалить процесс не получается, подскажите что можно сделать? спасибо!
-
Кстати интересно посмотреть на сравнения по соотношению стоимость/производительность для разных вендоров — кажется, что AMD или даже ARM процессоры должны быть эффективнее, но, с другой стороны, у Intel есть AVX-512 и прочие, которых вроде как минимум на ARM нет
-
а в mysqlengine можно добавить экстра колонку? (сейчас падает с ` Unknown column 'dt' in 'field list' ()`)
запрос
create table db.table
(
id UInt16,
dt DateTime default CAST(today(), 'DateTime')
)
engine = MySQL();
т е чтобы dt высчитывался при селекте -
arm пока не быстрее, но может дешевле
https://clickhouse.tech/benchmark/hardware/Performance comparison of ClickHouse on various hardwareClickHouse is a fast open-source column-oriented database management system that allows generating analytical data reports in real-time using SQL queries
-
сделал через extra view
-
кажется что пока под x86_64 в целом больше оптимизаций имплементировано
-
-
-
-
Добрый день. Можно как-то толкнуть мутацию? А то она не шевелится уже минут 10, а ждать не хочется ( нет времени)
-
Друзья, добрый день!
Хотим видеть в таблице только актуальные данные, т.е последние поступившие данные по времени прихода данных. Данныe
схлопываются по колонке id. Подскажите, пожалуйста, правильный подход для реализации такой задачи.
Версия кликхауса 21.3.15.4
Сейчас у нас реализован подход, который возможно избыточен, потому что включает в себя аж 4 таблицы.
Данные вставляются в таблицу db_test.test_null, а на выходе используется db_test.test
--В эту таблицу приходят данныe
create table if not exists db_test.test_null
(
id Int32,
name String,
dt DateTime default now()
)
engine = Null;
create table if not exists db_test.test_amt
(
id Int32,
name AggregateFunction(argMax,String, DateTime),
max_dt AggregateFunction(max, DateTime)
)
engine = AggregatingMergeTree
PARTITION BY tuple()
ORDER BY id;
--матвьюха где берется последее состояние полей и данные вставляются в db_test.test_amt
CREATE MATERIALIZED VIEW db_test._sys_test_amt
TO db_test.test_amt AS
SELECT id,
argMaxState(name, dt) AS name,
maxState(dt) AS max_dt
FROM db_test.test_null
GROUP BY id;
--в таблице db_test.test_amt колонки имеют формат AggregateFunction -> преобразуем к нужному виду с помощью finalizeAggregation
--это финальная таблица
CREATE VIEW db_test.test AS
SELECT id,
finalizeAggregation(name) AS name,
finalizeAggregation(max_dt) AS dt
FROM db_test.test_amt;
insert into db_test.test_null (id, name) values (1, 'b'), (2, 'c'), (1, 'd')
select *
from db_test.test -
SYSTEM DROP MARK CACHE
можно ещё заюзать программу clickhouse-benchmark -
-
#вакансия #удаленка
Вакансия: DBA ClickHouse
Компания: РА Selecty
Город: Москва
Формат работы: remote
Занятость: full time
Компенсация: 150000 - 200000 net., без учета премий
Всем привет! Мы находится в поисках Старшего Администратора СУБД ClickHouse в одну из крупнейших ритейл компаний РФ.
🔸Задачи:
- Администрирование СУБД ClickHouse (single instance, Cluster);
- Автоматизация задач по сопровождению СУБД по средствам Ansible;
- Мониторинг СУБД на базе Zabbix;
- Решение инцидентов, запросов пользователей в части БД как 3 линия поддержки;
🔸Пожелания к кандидату:
- Знание СУБД ClickHouse в части DBA;
- Навыки проведения Backup/Recovery для СУБД ClickHouse;
- Уверенные знания SQL;
- Знания Shell, python, ansible - как преимущество;
- Знания Linux, на уровне администратора, необходимые для поддержки СУБД ClickHouse;
- Навыки работы с Git - будут плюсом.
🔸Условия:
- Гибридный график работы (офис/дом);
- ДМС со стоматологией;
- Оформление по ТК РФ.
🔸Если заинтересует, я здесь 24/7 @papabooo
или на почту andrey.boyko@selecty.ru -
Спасибо
-
Ищите старшего, а зп как для стажера.
-
всем привет!
есть такой ddl:
CREATE TABLE analytics.table
(
`attributed_touch_type` LowCardinality(String),
`attributed_touch_time` DateTime,
`install_time` DateTime,
`event_time` DateTime,
`event_date` Date DEFAULT toDate(event_time),
`event_name` LowCardinality(String),
`event_value` LowCardinality(String),
`event_revenue` Float32,
`event_revenue_currency` LowCardinality(String),
`event_revenue_usd` LowCardinality(String),
`af_cost_model` LowCardinality(String),
`af_cost_value` Float32,
`af_cost_currency` LowCardinality(String),
`event_source` LowCardinality(String),
`is_receipt_validated` LowCardinality(String),
`af_prt` LowCardinality(String),
`media_source` LowCardinality(String),
`af_channel` LowCardinality(String),
`af_keywords` String,
`install_app_store` LowCardinality(String),
`campaign` String,
`af_c_id` String,
`af_adset` String,
`af_adset_id` String,
`af_ad` String,
`af_ad_id` String,
`af_ad_type` String,
`af_siteid` String,
`af_sub_siteid` String,
`af_sub1` LowCardinality(String),
`af_sub2` LowCardinality(String),
`af_sub3` LowCardinality(String),
`af_sub4` LowCardinality(String),
`af_sub5` LowCardinality(String),
`contributor_1_touch_type` LowCardinality(String),
`contributor_1_touch_time` DateTime,
`contributor_1_af_prt` LowCardinality(String),
`contributor_1_match_type` LowCardinality(String),
`contributor_1_media_source` LowCardinality(String),
`contributor_1_campaign` String,
`contributor_2_touch_type` LowCardinality(String),
`contributor_2_touch_time` DateTime,
`contributor_2_af_prt` LowCardinality(String),
`contributor_2_media_source` LowCardinality(String),
`contributor_2_campaign` String,
`contributor_2_match_type` LowCardinality(String),
`contributor_3_touch_type` LowCardinality(String),
`contributor_3_touch_time` DateTime,
`contributor_3_af_prt` LowCardinality(String),
`contributor_3_media_source` LowCardinality(String),
`contributor_3_campaign` String,
`contributor_3_match_type` LowCardinality(String),
`region` LowCardinality(String),
`country_code` LowCardinality(String),
`state` LowCardinality(String),
`city` LowCardinality(String),
`postal_code` String,
`dma` String,
`ip` String,
`wifi` Enum8('null' = -1, 'false' = 0, 'true' = 1),
`operator` LowCardinality(String),
`carrier` LowCardinality(String),
`language` LowCardinality(String),
`appsflyer_id` LowCardinality(String),
`customer_user_id` String,
`android_id` LowCardinality(String),
`advertising_id` String,
`imei` LowCardinality(String),
`idfa` String,
`idfv` String,
`amazon_aid` String,
`device_type` String,
`device_category` LowCardinality(String),
`platform` LowCardinality(String),
`os_version` LowCardinality(String),
`app_version` LowCardinality(String),
`sdk_version` LowCardinality(String), -
`app_id` String,
`app_name` LowCardinality(String),
`bundle_id` String,
`is_retargeting` LowCardinality(String),
`retargeting_conversion_type` LowCardinality(String),
`is_primary_attribution` Enum8('null' = -1, 'false' = 0, 'true' = 1),
`af_attribution_lookback` String,
`af_reengagement_window` String,
`match_type` LowCardinality(String),
`user_agent` String,
`http_referrer` String,
`original_url` String,
`gp_referrer` String,
`gp_click_time` DateTime,
`gp_install_begin` DateTime,
`gp_broadcast_referrer` LowCardinality(String),
`custom_data` LowCardinality(String),
`network_account_id` String,
`keyword_match_type` LowCardinality(String),
`blocked_reason` LowCardinality(String),
`blocked_reason_value` LowCardinality(String),
`blocked_reason_rule` String,
`blocked_sub_reason` String,
`af_web_id` String,
`web_event_type` String,
`device_download_time` DateTime,
`deeplink_url` String,
`oaid` String,
`ad_unit` String,
`segment` String,
`placement` String,
`mediation_network` String,
`impressions` String,
`monetization_network` String
)
ENGINE = MergeTree
PARTITION BY toYYYYMMDD(event_date)
ORDER BY (event_time, event_name)
SETTINGS index_granularity = 8192;
в него пишем запросы по типу:
select appsflyer_id,
groupArray(event_date) as event_date,
groupArrayIf(event_time, event_name = 'event1') event_1,
groupArrayIf(event_time, event_name in ('event2', 'event3')) as event_2,
groupArrayIf(event_time, event_name in ('event4', 'event5')) as event_3,
groupArrayIf(event_time, event_name in ('event6',
'event7')) as event_4,
groupArrayIf(event_time, event_name in
('event8', 'event9', 'event10', 'event11',
'event12')) as event_5
from table
group by appsflyer_id;
начали не пролезать по памяти, поэтому хотим оптимизироваться. подскажите, что можно улучшить в ddl и настройках КХ, чтобы это лучше работало? настройки КХ дефолтные
событий в event_name штук 70, appsflyer_id высококардинальное поле. дальше есть еще часть подзапроса, где разжимаем массивы или используем arrayFilter или прочие штуки для работы над массивами -
Еще есть премиальная часть, здесь только про оклад)
-
-
у вас очень высокий select rate и требование ответа за миллисекунды? Именно поэтому вы хотите сделать всю дедубликацию бекграунд процессом? Если так, то путь с AggregatingMT неплохой. Если же вводные иные, то можно и ReplacingMergeThree select/final (или limit 1 by, или argMax).
-
Простой способ - разнести всё в кластер и пошардировать,допустим, по media_source
-
ок, спасибо за идею. есть еще сложные способы?
-
для чего у вас ORDER BY (event_time, event_name) ? Вы точно этого хотели или "само получилось"? Выглядит подозрительно. Может все-таки поставить ваш apps_id на первое место, а event_time на последнее. Принцип простой - меньшая кардинальность - вперед.
-
хотели считать воронки по event_time, чтобы на id можно было сразу при помощи groupArray получить отсортированное время, а не сортировать на ходу. app_id никогда не используем в секции where.
про принцип спасибо, не усмотрел -
есть простые. Но будет медленнее:
set max_bytes_before_external_group_by='40G'
set max_memory_usage='50G'
max_threads=1 -
хм, спасибо!
-
Добавить мутацию в запрос
-
Мой костыль
-
-
под SQL
имеется ввиду Microsoft SQL?
или MySQL / PostgreSQL ? -
Microsoft SQL
-
трудно очень будет
надо будет городить какие то костыли поверх вот этого
https://github.com/debezium/debezium/tree/master/debezium-connector-sqlserver
и вот этого
https://github.com/itnxs/debezium
шансов что заработает, мало, но не нулевыеdebezium/debezium-connector-sqlserver at master · debezium/debeziumChange data capture for a variety of databases. Please log issues at https://issues.redhat.com/browse/DBZ. - debezium/debezium-connector-sqlserver at master · debezium/debezium
-
-
Добрый вечер, можете рассказать как многопользовательский с разными лимитами для разных пользователей?
у нас сейчас 8 нод через прокси доступ и по 9000(через chproxy) и по 8123 (HAproxy) -
-
Поставьте ему время жизни партиций, чтобы сами удалялись через нужное Вам время или отключите.
Без рестарта вроде как нельзя -
Я так понял, что TTL тоже настраивается при создании этой таблицы и без рестарта не применится. Пока юзаю скрипт, который транкейтит табличку, но меня больше волнует нагрузка. За сутки набегает 4 гига логов
-
Да, это в конфиге прописывается engine, чтобы отключить нужно закоментировать объявление query_thread_log
-
-
Естественно)
-
Joined.
-
там нет много мелких вставок, там одна вставка раз в 7.5 секунд
остальное в памяти...
тоже самое для system.query_log
это все настраивается через flush_interval_milliseconds
переопределите TTL и ENGINE через XML
https://clickhouse.tech/docs/en/operations/system-tables/#system-tables-introduction
кажется это без перезагрузки может работать, можно еще в runtime просто через ALTER TABLE переопределить
можно отключить через remove
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-system-tables-eat-my-disk/System Tables | ClickHouse DocumentationSystem Tables Introduction System tables provide information about: Server states, processes, and environment. Server’s
-
Перезагрузка нужна, насколько я помню.
-
Не спасло (
-
Там можно менять ещё flush_interval_milliseconds для каждой таблички логов
-
Да, наверно с этим пока поэкспериментирую
-
Можно в default профиль написать log_query_threads=0, и не надо никаких рестартов
-
<yandex>
<profiles>
<default>
<log_query_threads>0</log_query_threads>
</default>
<read_only>
<log_query_threads>0</log_query_threads>
</read_only>
</profiles>
</yandex>
? -
-
default достаточно, он наследуется
-
не сработало, конфиг принялся, но логи идут
-
-
смотрите в query_log, может настройки переопределяются
-
Какого плана ожидать запросов на изменение настроек?
Пока ничего -
у каждого запроса есть настройки
в query_log есть поля, там все написано -
Есть КХ-таблица с движком Kafka и форматом AvroConfluent. Добавили в кафка-топик 2 новых поля, пересоздаю кафка-таблицу в КХ, для проверки делаю select * from KafkaTable limit 10; - ругается что в авро-схеме не существует нового поля. При этом по ссылке из avro_schema_registry_url в последней версии топика новые поля вижу.
Это какой-то кэш? Как его сбросить? -
Avro Schema Evolution Support · Issue #11986 · ClickHouse/ClickHouse
I use AvroConfulent data format with schema registry to consume Kafka events to clickhouse. сurrently, Avro schemas are cached once resolved after evolving Avro schema(add fields) clickhouse doesn&...
-
точно можно пересоздать Kafka таблицу
-
Сделал запрос в query_log на поиск запросов в базе system, но ничего нужного нет
-
сделайте
DESCRIBE system.query_log
посмотрите там что-то типа Settings.Names, Settings.Values
или просто Settings в новых версиях -
-
ну теперь
SELECT event_time, query, Settings['query_thread_log'] FROM system.query WHERE event_date=toDate(now()) ORDER BY event_time DESC LIMIT 100 -
-
это настройки в default профиле логироать или нет
ну и в preprocessed_configs/user.xml смотрели?
с каким профилем у вас пользователи коннектятся? -
-
-
-
SELECT user, Settings['query_thread_log'] AS log, count() FROM system.query WHERE event_date=toDate(now()) GROUP BY user, log
-
-
логи чистил час назад
-
Спасибо.
-
-
-
ошибку понял, спасибо)
-
Подскажите, можно как-то понять из-за чего такие ошибки падают периодически? по паре сотен раз за день обычно
2021.09.07 15:09:03.239799 [ 17219 ] {} <Error> ServerErrorHandler: Code: 210, e.displayText() = DB::NetException: Connection reset by peer, while reading from socket (10.64.133.228:28488), Stack trace (when copying this message, always include the lines below):
0. DB::ReadBufferFromPocoSocket::nextImpl() @ 0xe90f053 in /usr/bin/clickhouse
1. DB::TCPHandler::runImpl() @ 0xf695c34 in /usr/bin/clickhouse
2. DB::TCPHandler::run() @ 0xf6a88c9 in /usr/bin/clickhouse
3. Poco::Net::TCPServerConnection::start() @ 0x11d5dfdf in /usr/bin/clickhouse
4. Poco::Net::TCPServerDispatcher::run() @ 0x11d5f9f1 in /usr/bin/clickhouse
5. Poco::PooledThread::run() @ 0x11e96119 in /usr/bin/clickhouse
6. Poco::ThreadImpl::runnableEntry(void*) @ 0x11e91f7a in /usr/bin/clickhouse
7. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
8. __clone @ 0x122293 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
(version 21.3.15.4 (official build)) -
Добрый вечер! Подскажите пожалуйста как при работе с engine HDFS указать пользователя под которым будет читаться паркетный файл? Кластер без kerberos
-
ну если у вас пользователи не под default профилями ходят, тогда надо и в остальных профилях поменять
-
кто-то коннектится на tcp_port или на tls_port
и не отправляет запрос и закрывает соединение 10.64.133.228 это случайно не адрес вашего мониторинга который пытается проверить живость clickhouse? -
Это другой шард
-
-
если настройка не определена в профиле, она наследуется из профиля default
-
-
-
alter drop from и тд, в доке написано, но лучше этого избегать, тяжелая операция
-
-
ну вроде того
-
ALTER TABLE xxxx DELETE WHERE
читайте мутации -
- 08 September 2021 (91 messages)
-
оно размыто по официальной документации довольно сильно
если у вас есть kubernetes
то можно просто использовать https://github.com/Altinity/clickhouse-operator/
если у вас statefull сервера
то можно ansible прикрутить
https://galaxy.ansible.com/search?deprecated=false&keywords=clickhouse&order_by=-relevance&page=1GitHub - Altinity/clickhouse-operator: The ClickHouse Operator creates, configures and manages ClickHouse clusters running on KubernetesThe ClickHouse Operator creates, configures and manages ClickHouse clusters running on Kubernetes - GitHub - Altinity/clickhouse-operator: The ClickHouse Operator creates, configures and manages Cl...
-
-
в целом по шагам
вот так ставится сам clickhouse
довольно просто
https://clickhouse.tech/docs/en/getting-started/install/
вот так ставится zookeeper
https://phoenixnap.com/kb/install-apache-zookeeper
лучше их ставить на разные сервера, или хотя бы чтобы /data/zookeeper и /var/lib/clickhouse были на разных физических дисках
вот так конфигуриуется уже поставленный zookeeper внутрь clickhouse
https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#server-settings_zookeeper
ничего сложного просто файл .xml в /etc/clickhouse-server/config.d/ создаете с перечнем хостов кластера zk
вот так кофигурируется SSL для доступа к clickhouse
https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#server_configuration_parameters-openssl
тоже лучше отдельный файл в /etc/clickhouse-server/config.d заводить
у вас какая задача стоит? глубоко самому разобраться? или просто быстрее настроить?Installation | ClickHouse DocumentationInstallation System Requirements ClickHouse can run on any Linux, FreeBSD, or Mac OS X with x86_64, AArch64, or PowerPC6
-
нет ничего настраивать для этих функций не надо. надо чтобы функция поддерживалась вашей версией clickhouse-server
ну либо была доступна через какой нибудь флаг в system.settings (обычно экспериментальные функции включаются через allow* флаги, перечень которых есть SELECT * FROM system.settings WHERE name LIKE '%allow%' OR name LIKE '%exper%'
список функций поддерживаемых можно через SELECT * FROM system.functions узнать -
спасибо!
-
если query падает out of memory - buffer engine может помочь?
-
Buffer помогает при частых инсертах, out memory лечится уменьшением читаемых данных в запросе
-
https://docs.altinity.com/operationsguide/clickhouse-zookeeper/
https://docs.altinity.com/operationsguide/security/clickhouse-hardening-guide/Care and Feeding of Zookeeper with ClickHouseInstalling, configuring, and recovering Zookeeper
-
не факт что это именно этот запрос память жрет, просто он падает при попытке аллоцировать память
проверьте на всякий случай
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-who-ate-my-memory/ -
Всем привет!) подскажите плз, возможно ли в распределенной таблице использовать конструкцию LIMIT n OFFSET k BY column? пока у меня это не работает, вот думаю есть какой-то способ или нет, мб как с джойнами надо для распр. таблицы GLOBAL куда то всунуть - но пока выдает ошибку
-
Какой объем таблицы из mysql?
Не смотрели в сторону словаря? -
таблицы с движком mysql не хранят данные а каждый раз идет запрос в mysql
Словари же будут хранится в памяти -
MaterializedMySQL пока не советуете?
-
нет
-
багов много пока?
-
Делали китайцы для своих нужд, стоит отступить в сторону - что то не работает и не особо правят это.
А команда Яндекса эту фичу не поддерживает в отличии от MaterializePostrgreSQL (который пилит Ксения и довольно активно правит всякие баги) -
кто-нибудь пробовал partial_merge в join для избежания out of memory?
-
5-10 гб нормально,
В целом словарь нормально от 1кк до 10кк записей в нем -
кто-нибудь в датагрипе боролся с read time out?
-
socket_timeout увеличьте в advanced_settings в подключении
-
как раз пробую, 🤝
-
там 30 сек по умолчанию стоит
-
Всем привет, на одном из серверов перестали отрабатывать ttl на всех таблицах, как на больших, так и на маленьких. Пробовал SYSTEM START TTL MERGES - не помогло. Установлены следующие настройки:
ttl_only_drop_parts | 1
merge_with_ttl_timeout | 7200
Версия CH 21.7.7.47.
Подскажите, куда копать, что посмотреть можно? -
привет всем. можно как-то запретить пользователю/роли создание таблиц MergeTree ?
-
Привет. Не подскажате, а что делать с такой вот ошибкой:
Not executing log entry queue-0000168330 of type DROP_RANGE for part 11_5379_5381_999999999_5382 because another DROP_RANGE or REPLACE_RANGE entry are currently executing.
при этом все парты для этой таблицы отреплицировались, только эта ошибка в system.replication_queue висит -
Здравствуйте. Подскажите пожалуйста. Создал матвью:
CREATE MATERIALIZED VIEW IF NOT EXISTS xl.logsapi_customer_visits (...)
ENGINE = ReplacingMergeTree
ORDER BY (CounterID, intHash32(ClientID), VisitID)
AS SELECT *
FROM logsapi_visits
WHERE
ClientID IN (
SELECT DISTINCT ClientID FROM logsapi_visits
WHERE notEmpty(`Purchase.ID`)
)
AND ClientID IN (
SELECT DISTINCT ClientID FROM logsapi_clients
WHERE Purchases > 0
)
При вставке данных в основную таблицу, в матвью данные не все попадают, не срабатывает условие фильтрации на основе данных другой таблицы:
AND ClientID IN (
SELECT DISTINCT ClientID FROM logsapi_clients
WHERE Purchases > 0
)
Я правильно понимаю, что есть такое ограничения на запрос в матвью? -
так на уже созданных они не будут отрабатывать... попробуйте на таблице сделать materialize ttl (но может быть больно в плане перекладывания всей таблицы если большая).
-
Таблицы созданы давно, как и ttl на них. TTL отлично отрабатывал, но в один момент перестал на всех таблицах.
-
тогда ищите в логах... может у вас потоков не хватает в пуле
-
-
Не помните какой именно? BackgroundPoolSize в пиках до 10, в среднем 5-6 при значении по-умолчанию 16.
-
там скорее проблема с visits. MV не работает с таблицей, MV работает с блоком вставки. когда вы обращаетесь к visits, то это не вся таблица, а только текущий блок.
-
system.part_log включен? там можете узнать когда в последний раз отработал
и уже в те дни логи ковырять -
я прочитал об этом, поэтому добавил фильтрацию на основе данных другой таблицы. Но чет эта фильтрация не применяется
-
Всем привет!
Столкнулся со следующей проблемой:
Есть кластер из 6 шардов без реплик, решили добавить ещё 6 реплик, конфигурация серверов идентичная.
После добавления реплик в кластер и синхронизации данных реплицируемых таблиц на репликах постоянно наблюдаем повышенную утилизацию по cpu.system.
Запросы на репликах отрабатывают примерно в 10 раз дольше, чем на основных нодах и идёт потребление cpu.system а не cpu.user как на основных нодах. Ошибок в логах нет.
Подскажите в какую сторону копать?
Версия 21.7.4.18 -
К сожалению, не включен. Но спасибо за информацию! Пойду логи читать)
-
ищите где оно встало... + materialize ttl на мелкой таблице смотрите
<Trace> MergeTreePartsMover: Selected 4 parts to move according to storage policy rules and 0 parts accordi
ng to TTL rules, 19.57 KiB total
<Debug> DB.TABLENAME (TTLBlockInputStream): Removed 0 rows with expired TTL from part 20210901-14_636_636_1 -
так себе запросы. я не знаю сколько там где строк, но такие запросы не видятся чем-то разумным - слишком большая нагрузка. Скажите лучше чего вы хотите добиться таким образом.
-
хотел, чтобы в матвью вставлялись визиты тех, кто совершал покупки
-
-
skip_unavailable_shards
-
Огромное спасибо, что-то не загуглилось)
-
Всем привет. Подскажите плиз, можно ли нестандартную строку перевести в тип даты с указанием кастомной маски?
'210908102322" -> 'YYMMDDHHmmss'
formatDateTime() в обратную сторону -
понятно. клиентов наверное у вас разумное количество и появляются они не 100 раз в секунду. Я бы сделал словарь по клиентам, и через него проверял что визит ненужный. Словарь сидит в памяти и апдейтится по каким-то правилам - можно подобрать подходящий для вашего случая.
-
спасибо, попробую
-
Добрый день! HDFS engine, один паркетный файл. Без керберус. Корректно работал на версии 19.9.5.36 при обновлении на 21.8.5.7 таблица создается, но селект из неё ничего не возвращает, и нет ошибок. С чем это может быть связано и куда смотреть? Спасибо
-
Создаю так:
-
CREATE TABLE
hdfs_engine_table(id_bs String, cell_id UInt32)
ENGINE=HDFS('hdfs://host:8020/path/file1', 'Parquet') -
дополнительно ничего не конфигурирую
-
-
"и она же distributed"
не может быть такого
Distributed это отдельная таблица которая поверх других строится
если просто добавить столбец без смены PRIMARY KEY
сначала ALTER TABLE для ReplicatedReplacedMergeTree с ON CLUSTER .. чтобы на всех шардах прошло
потом тоже самое делаете для distributed таблцы
если primary key менять надо
то только CREATE new_table
и потом INSERT INTO new_table SELECT FROM old_table на одной реплике в каждом шарде (остальное релпицируется)
потом CREATE TABLE ENGINE=Distributed уже поверх new_table ON CLUSTER
и выбираете уже из новой таблицы а старую удаляете -
а зачем вам добавлять столбец в PRIMARY KEY ...
какая у него cardinality (сколько уникальных значений)? может проще просто добавить столбец? -
Нет, нужно внести этот столбец в ключ, по которому дедуплицируются строки
Насчёт "она же" не верно высказался -
Order by ключ
-
надо добавить колонку и обновить ордер одним запросом
ALTER TABLE table ADD COLUMN column Int32, MODIFY ORDER BY (old_column, column) -
Спасибо большое, кажется то что нужно
-
а примари кей при этом поменяется или он разъедется с ордер бай?
-
PK останется старым
начало ORDER BY должно совпадать с PK, но дальше не обязательно -
тогда это не совсем поможет @BBRSOFF, потому что "нужно внести этот столбец в ключ, по которому дедуплицируются строки"
-
речь про replacing?
-
да. в вопросе было как добавить столбец в ключ Replicatedreplacemergetree
-
-
The engine differs from MergeTree in that it removes duplicate entries with the same sorting key value (ORDER BY table section, not PRIMARY KEY).
-
-
да, извините я спутал PRIMARY KEY и SORTING KEY
sorting key менять можно -
Теперь я запутался, почему мне не подходит этот вариант
-
да, всё верно
ORDER BY отличный от PRIMARY KEY работает для Replacing/Summing/Aggregating таблиц, в них агрегации происходят по order by -
судя по доке - да, по логике - нет :) теперь я запутался. хотя нет. всё круто. сори, что всех заставил усомниться в правильности ответа :)
-
единственный минус, это то что последняя колонка судя по всему не будет в индексе и соответственно для дедубликации будет больше чтений с диска. но это не точно :)
-
кажется сомнительно, КХ ведь запускает мерж не потому что надо какую строку дедуплицировать) а потому что может смержить несколько партов, соответственно в любом случае будет всё читать
-
спасибо! как всегда отличный ответ!
-
-
он может писать дубли, особенно в старых версиях было много багов
-
-
-
-
я пишу несколькими потоками в кафка таблицу через insert и семплирование и потом в хдфс. У меня получается записей больше в итоге чем просто count() поверх запроса для инсерт. Я не могу понять на каком этапе дубли появляются
-
-
Прошу уточнить, сработает ли modify order by, если используется устаревший синтаксис при создании таблиц, но КХ обновлен?
И как поменять ключ шардирования для distributed таблицы, созданной так же в устаревшем синтаксисе? Modify... -
если честно никогда не пробовал писать таким способом
-
modify order by должен отработать, а как поменять ключ шардирования без пересоздания distributed таблицы я не знаю)
-
Окей, завтра попробую, не хотелось бы что-то на ночь завалить)
Спасибо большое -
вариантов нет?
-
-
мне кажется вам стоит почитать про движок SummingMergeTree, можно аггрегировать данные по нужным вам метрикам. Если я правильно понял вас
-
10 гб это совсем мало для КХ
-
Можно сделать рядом таблицу с движком AggregatingMergeTree, которая будет бессрочно хранить нужные вам агрегации (количество действий по пользователю за день, какие-нибудь суммы, строгие значения и т.п.), настроить её заполнение через MaterializedView, а для таблицы с сырыми данными настроить TTL, чтобы записи старше трёх месяцев, например, удалялись.
-
может автор описался и хотел сказать про Tb? 10Гб - это небольшая киношка.
-
Привет! Сможет ли AggregatingMergeTree делать слияние массивов?
-
Сможет, что-то типа такого можно юзать как тип колонки SimpleAggregateFunction(groupArrayArray, Array(UInt8))
-
thx
- 09 September 2021 (164 messages)
-
> сработает ли modify order by, если используется устаревший синтаксис при создании таблиц
нет
> distributed таблицы, созданной так же в устаревшем синтаксисе
у distributed таблиц нет устаревшего синтаксиса -
а можете объяснить что такое INSERT + семплирование?
INSERT INTO kafka_table SELECT ... FROM .. SAMPLE BY ? -
-
Всем привет!
Коллеги, хочу попробовать изучить инструмент, понять для каких он целей и каков функционал.
Подскажите с чего начать можно? может ссылки какие-то или книги? -
доброго времени суток, можете попробовать этот запрос и подсказать если в ваших версиях есть баг?
и есть ли какой-то сеттинг который позволяет исключить?
SELECT
sum(q0.a2) AS a1, -- если поменять порядок то работает
sum(q0.a1) AS a9
FROM
(
SELECT
1 AS a1,
2 AS a2
) AS q0
Query id: 1704a295-39c6-494b-a4cc-a241bfeb635d
Received exception from server (version 21.3.12):
Code: 47. DB::Exception: Received from clickhouse-01:9000. DB::Exception: Unknown identifier 'a1' in aggregate function 'sum(a1) AS a9'. -
должен быть абсолютно одинаковый эффект если в консоли. скорее всего что то ещё грузит память параллельно и вы неудачно попали
-
Коллеги, приветствую!
Появился такой вопрос - каким способом правильнее всего с точки зрения быстроты сделать следующую операцию:
1. Выполнить здоровенный запрос в PostgreSQL
2. Создать таблицу в CH и загрузить в нее результаты запроса.
В голове сразу пару решений - 1) в CH внешнюю таблицу подключить и с нее скопировать 2) сделать здоровенный структурированный файл с разделителями и потом его в CH загрузить.
Мне кажется более красивым первый вариант, но вот смотрю примеры в Интернет и реально много людей работают через CSV файлики. Подскажите как правильнее сделать? Может есть еще варианты? -
исследовать самому и проверить
-
-
Был такой же вопрос , но правдо не такая уж большая таблица . Сделал через python . Как идея была разделить по годам в python и так загрузить batch-ами
-
Коллеги, прошу помощи, уже не знаю куда смотреть.
-
Создать таблицу в клике и сделать селект напрямую через постгрес?
-
-
-
зависит от ваших преференций. Кто-то любит видосики смотреть (https://www.youtube.com/channel/UChtmrD-dsdpspr42P_PyRAw), другим документации хватает. Опять же есть https://kb.altinity.com/
-
-
ок, спасибо, ознакомлюсь
-
Друзья, подскажите:
Есть старенький clickhouse версии 19.16, хочу обновить его до последней версии.
Подскажите, могу ли я просто остановить старый бинарник на всех серверах кластера и запустить самый новый 21.9 ? Быкапа данных нет и сделать достаточно трудно по бюджету. Совместимость по запросам проверил. -
ClickHouse/ClickHouse description changed: v21.9.2.17-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.9.2.17-stable
Release notes:
ClickHouse stable release v21.9.2.17-stableRelease v21.9.2.17-stable · ClickHouse/ClickHouseClickHouse stable release v21.9.2.17-stable
-
Можно, только обратно откатиться не получится
-
А откатиться с потерей свежих данных можно?
-
-
Спасибо!
-
-
Он же вроде ещё pre-production
-
Ребят, сорян за оффтоп, кто знает как в постгресе работать с таким типом?
-
а что это за тип ?
-
Array(Nullable(Smth)), похоже
-
Pentaho Data Integrator - через графический интерфейс два квадратика соединить стрелочкой
-
В последней версии (v21.9.2.17) тоже валится.
-
Unknown identifier in aggregate function error when using same alias in different levels of query · Issue #28777 · ClickHouse/ClickHouse
When same alias names are used in different levels of query in some cases "unknown identifier" errors are received. Does it reproduce on recent release? Yes, reproduces on all bui...
-
Всем привет, я хочу сделать join двух таблиц и в секции ON написать что-то типо table1.price = 10 (например). Мне кликхаус отвечает: No columns in one of equality side. А если ставлю знак >,< - то пишет, что они не поддерживаются. Хотя в документации я видел примеры с такими условиями в on
-
если inner то в where перенесите
-
я просто не понимаю, документация врёт?
-
мб в последних версиях так и можно
-
-
-
🙏
-
>сработает ли modify order by, если используется устаревший синтаксис при создании таблиц
нет
как-то данные по другому хранятся? интересно почему не сработает -
Подскажите как можно при Attach файлы от Detach файлы с одной таблицы в другую без фром, файлы физически помещаются в папку Detashed структура таблиц одинаковая, делаю Attach ругается - Cannot open file /var/lib/clickhouse-hdd/store/188/188f1b05-ad08-4297-988f-1b05ad081297/detached/attaching_202104_7_8_1/columns.txt, errno: 13, strerror: Permission denied
-
права?
-
Даны
-
Permission denied
-
А вот так открыл на все файлы доступы теперь вот Cannot set modification time for file: /var/lib/clickhouse-hdd/store/188/188f1b05-ad08-4297-988f-1b05ad081297/detached/attaching_202104_7_8_1/, errno: 1, strerror: Operation not permitted
-
При чем там нету каталога attaching_202104_7_8_1/
-
здравствуйте, можно ли как-то сделать словарь по таблице в КХ, чтобы он обновлялся не по таймауту, а сразу, как только таблица поменялась?
-
Есть запрос, который согласно system.query_log, использует 12гб оперативки. Оборачиваю запрос во вьюху, делаю селект из вьюхи - падает по памяти (ограничение в 35гб на запрос), по system.query_log использует уже 45гб.
Есть объяснение такому поведению КХ и рычаги управления этим?
КХ 20.8 -
invalidate_query
-
так invalidate_query по таймауту запускается все равно.
-
и можно попасть в окно между апдейтами, когда запрос не увидит данных в словаре, хотя они есть в исходной таблице
-
не видел такой механизм. Только invalidate query в интервале
-
Всем привет!
У меня есть две таблички 1ая хранит значения потребления устройства каждую минуту. 2я события которые произошли в какой то момент времени с устройством.
На графике мне нужно показать данные из обеих табличек, увидеть какие были события во время работы устройства.
Например, есть данные потребления за 00:01:00 и 00:02:00, и событие которое произошло на этом устройстве в 00:01:30.
Правильно понимаю, что ASOF JOIN поможет наложить события на данные потребления и все три временных точки будут в результате запроса? -
и еще вопрос, явный вызов
SYSTEM RELOAD DICTIONARY не смотрит на invalidate_query? Потому что занимает времени столько же, сколько и без invalidate_query (само ```invalidate_query ```очень легкое и занимает ничтожное время) -
хм, просто не понятно, можно ли будет реализовать сжатие данных через неделю, чтобы те данные, которые были сохранены превращались в одну запись с определённым днём (точное время не нужно, нужна лишь дата)
-
-
-
Можно сделать какие-то извращения с апдейтом словаря
1. Сделать скрипт который вызывает запрос на перезагрузку словаря
2. Сделать процедуру напрямую в бд которая будет каким-то образом вызвать этот скрипт
3. Сделать триггер на таблицу, и тригер будет вызывать процедуру -
-
триггеров в кликхаусе вроде как нет
-
-
-
-
статистика - понятие широкое. Какой конкретно запрос по key2?
-
-
-
так а запрос какой ? key2 IN (ID1, id2, id3, ... ) ?
-
-
projections в последних версиях появились как раз для этого случая
https://clickhouse.tech/docs/ru//engines/table-engines/mergetree-family/mergetree/#projectionsMergeTree | Документация ClickHouseMergeTree Движок MergeTree, а также другие движки этого семейства (*MergeTree) — это наиболее функциональные движки табл
-
-
ок, почитаю, спасибо
-
ну тут вариантов немного наверное - придется держать вьюху сортированную по user_id , как первичному ключу. (Собственно что и делают projections автоматически только, как я понял)
-
но возможно достаточно чтобы PRIMARY KEY был chat_id, user_id, так не пробовали?
-
лучше сделать в определении таблицы order by user_id, chat_id - user ведь всегда под руками и его кардиналити должна быть ниже. По возможности не сканировать всю таблицу, ограничивая запросы по времени.
-
пробовали, не очень помогло вроде бы (давно было, может попробую потом ещё раз)
-
то есть первичный chat_id, а order by user_id и потом уже chat_id?
-
Это не поможет, потому что в итоге просканит все блоки все равно, потому что оно не знает какие user_id лежат внутри каждого блока
-
нет, так не получится. просто сделайте order by user_id, chat_id
-
но 90% запросов идут на статистику чатов в целом, это не сломает скорость вывода статы всего чата?
-
сломает. но маловероятно что у вас нет id юзера в запросе. Или узнайте его как-нибудь.
-
Сделайте основную таблицу по key1, а к ней вторую - со статистикой по key2. И вторую заполняйте через MV по мере добавления записей в первую. И то и то будет быстро работать.
-
этот трюк и оптимизировали, когда делали projection. Почитайте про них
-
это обычно две разных таблицы, в одной сырые данные которые хранятся ограниченное время и во второй агрегированные данные которые хранятся долго, materialized view пишет из первой во вторую
-
-
-
-
вам надо одновременно и count и сырые данные видеть? Обычно нужны агрегированные данные для статистики. А по сырым уже какие-то точечные запросы
-
да, не проблема просто суммировать count (по умолчанию 1), а сжатые данные > 1 будут, = SUM(count) — кол-во сообщений
-
ну так если вы можете агрегировать на лету, вам не надо делать запросы по сырым данным
-
Всем привет! У меня есть потребность привести время в формате TimeStamp к часовому поясу UTC-2. Хотел использовать функцию toDateTime, однако не нашел полного списка часовых поясов, которые поддерживаются КХ. Может кто знает как можно решить проблему?
-
список тайм зон можно так глянуть select * from system.time_zones
-
Отличный совет, большое спасибо!
-
Добрый день. Можете подсказать, как сделать ГЕОрепликацию при системе кластеризации ? т.е. у меня есть Distributed таблицы на балансире и Replicated таблицы на каждом из шардов.
-
Всем привет! Пытаюсь понять как работают партиции в КХ. В доке сказано, что при выполнении FREEZE PARTITION создается hardlink в определенной папке, и это есть аналог бекапа. Если мы после этого заапдейтим или удалим часть данных, по логике оно затронет и бекап? Или я что-то упустил?
-
-
-
как оптимизировать тяжелые joinы в кх?
-
Сделать легкими?)
-
В кх на программном уровне правая таблица в RAM при джоине держится. Поэтому, может и есть какое-то специфичное для кх решение)
-
лучший способ - отказаться от них
1. распилить на словари
2. вставлять в кх уже поджойненные данные -
есть какие-то минусы, если всегда использовать partial_merge?
-
Есть еще Join движок, или не рекомендуется?
-
А всё, нашёл, optimize есть и оно само автоматически запускается к тому же
-
кстати, не понял - когда его применять вообще, т к он также в RAM все держит
-
он не про это
-
А зачем он?
-
-
а ок
-
это пнтн
-
а вариант сделать так: сначала записывать сырые данные, потом в полночь искать эти данные, удалять за один день через ALTER, после чего вставлять новую запись с данными за день, какие проблемы могут быть?
-
Объем - проблема)
-
он быстрее работает чем делать джойн с нуля, так как не надо перечитвать правую таблицу. Если данные меняются редко, можно очень сильно сэкономить.
-
объем чего?
-
Записей. Как всего, так и удаляемых. Альтерить то надо по строке..
-
-
Репликацию используете? Лучше на 21.8 обновляйтесь, она LTS
-
Проще collapsingmergetree и забыл.
-
Да, используем
Спасибо! Про LTS хороший совет! -
оно сразу сжимает информацию? просто у каждого сообщения есть свой id, и нужно иногда удалять сообщения за срок (например 1 час)
-
-
В фоне. Главное доступность актуальной версии по флагу sign
-
Теоретически даунгрейд возможен, но это сильно зависит от того, какими фичами вы пользуетесь.
Воздержитесь от альтеров первое время.
TTL используете?
Соберите список настроек из system.settings. Когда все начнет тормозить, будете знать, что можно покрутить. -
Не совсем данные, но по-другому.
-
от TTL отказались, удаляем запросом ALTER partition раз в несколько месяцев
Спасибо!
А как лучше, сразу все инстансы остановить обновить и запустить, или по очереди сервера обновлять? -
insert into … settings max_insert_threads = … - если ресурсы ЦПУ позволяют, optimize_on_insert = 0 - потом будет больше мержей и снова нужны будут ресурсы, но вставит намного быстрее
-
Константин, моё почтение
-
сразу все, слишком большая разница между версиями
-
SYSTEM RELOAD DICTIONARY специально сделан для внеочередного полного обновления словаря.
Для частичного обновления надо update_field указать -
Спасибо! Хорошие советы!)
-
звучит как реизобретение GraphiteMergeTree
https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/graphitemergetree/GraphiteMergeTree | Документация ClickHouseGraphiteMergeTree Движок предназначен для прореживания и агрегирования/усреднения (rollup) данных Graphite. Он может быт
-
Коллеги, а keeper_server через IPv6 работает?
2021.09.09 18:38:04.563034 [ 7394 ] {} <Error> Application: DB::Exception: Cannot allocate RAFT instance
2021.09.09 18:38:18.649318 [ 7413 ] {} <Error> RaftInstance: got exception: open: Address family not supported by protocol -
Подскажите, что указывается в секции [TO[db.]name]?
Из справки:
Материализованные представления
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]table_name [ON CLUSTER] [TO[db.]name] [ENGINE = engine] [POPULATE] AS SELECT ... -
Имя таблицы в которую вы хотите писать данные, если не указать TO, кликхаус сам создаст неявную таблицу, обычно рекомендуется указывать, потом меньше проблем с поддержкой
-
спасибо
-
эта конструкция позволяет пересоздавать матвью без потери данных
-
рекомендую посмотреть, всё что надо знать про матвью
https://www.youtube.com/watch?v=1LVJ_WcLgF8&t=7596s
https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf -
благодарю, посмотрю
-
Всем салют👋, вопрос по мониторингу клика метриками прометеуса... При установке клика сразу под капотом есть возможность включить экспортер метрик, может быть кто-то вкурсе, можно ли к метрикам внутреннего экспортера прикрутить допустим свой query.yml со своими "экзотическими метриками"?🤔
-
Добрый день.
Помогите, пожалуйста, с проблемой. Пытаюсь из клика получить доступ к данным в postgresql. Столкнулся с двумя проблемами:
1. При попытке сделать БД типа PostgreSQL пробую сделать запрос SHOW TABLES и получаю ошибку PostgreSQL table "*****" does not exist: While executing Tables. (вместо звездочек имя таблицы). Причем такой таблицы нету реально, есть партиционированная таблица в pg с похожим именем.
2. При попытке сделать select из таблицы в pg запрос не завершается, хотя все строчки вернулись. Ну, пробую сделать SELECT * FROM postgresql() LIMIT 1. Мне возвращается одна строчка, но запрос не завершается. Лечится только перезапуском клика (в другой консоли вижу вечный запрос в SHOW PROCESSLIST) -
какая версия clickhouse?
если меньше 21.8 то лучше обновиться -
21.8.4
-
а со стороны Postgres таблица из которой выборку делаете она какая то необычная? партиционированная?
-
Да, партиционированная
-
возможно в этом проблема, сможете на docker-compose сделать минимально воспроизводимый пример?
-
Попробую в ближайшее время.
-
пока нет
https://github.com/ClickHouse/ClickHouse/issues/20200Prometheus endpoint improvements · Issue #20200 · ClickHouse/ClickHouse#10571 Prometheus metrics contain illegal character sequence, ensure correct type is reported (some metrics are floats, see ClickHouse/clickhouse_exporter#44 ) #10043 Export sql query results to pr...
-
Спасибо
-
Всем привет! Есть у кого нибудь гайд по добавлению новых нод к существующему кластеру?
Как я вижу порядок действий.:
1. Установить и настроить инстансы БД на новых серверах также как на остальных нодах.(нужна ли перезагрузка для перечитки конфиг кластера?)
2. Добавить в нодах конфиг кластера новые шарды + реплики.
3. Выполнить ребаланс весов в зависимости от кол-во добавленных нод.
4. Создать такие же таблицы. ReplicatedMergeTree и Distributed -
вот прямо седня статья https://habr.com/ru/company/tuturu/blog/576992/Репликация ClickHouse без костылей: ожидание и реальность
Про ClickHouse есть много разной информации, но мало про то, как готовить инфраструктуру с ним. Мы потратили примерно полгода вялого набивания шишек, чтобы это заработало именно так, как нас...
-
в нём можно будет получать информацию по дням, от определённого человека?
-
-
зачем так хитро с графитом? Им вобще кто-то пользуется, кроме тех кто сделал? В КХ есть специально придуманная для вашей задачи AggregatingMergeThree. Почитайте про нее.
Если вкратце, то вы как обычно делаете вставку в основную таблицу по 10-100к строк, затем через MV частично аггрегируете этот блок :
create materialized view metrics ENGINE = AggregatingMergeTree order by (id,ts) as
SELECT id , toStartOfDay(ts) ts, avgState(temp_val) temp_val, countState() qty
FROM metrics
GROUP BY id, ts;
в результате в таблице в которую пишет MV будут лежать не конечные аггрегированные значения, а промежуточные, с типом AggregateFunction. Их можно легко слить друг с другом. Скажем для avg это два числа sum и count (потом можно поделить для получения среднего). Для слияния двух пар состояний мы складываем суммы и каунты. Для других аггрегационных функций состояния сложнее и могут занимать много места (скажем для groupArray - это все элементы массива). Для sum наоборот - все слишком просто и состояние равно результату функции, поэтому придуманы SimpleAggregateFunction, которые легче, но позволяют согласовать синтаксис типов данных в функциях выполняющих доаггрегацию (-Merge).
В обычном процессе мерджинга партов все такие состояния сливаются, и вы получаете почти то, что хотели - аггрегированные за сутки данные. Причем результаты доступны в любой момент, и без скриптов что-то там стирающих в ночи. -
ого, спасибо, запомню
-
А если идет удаление данных из исходной таблицы на MV это же не отражается?
В таком случае надо чистить MV отдельно? -
почистить будет непросто. лучше не удалять. "что написано пером - не вырубишь...." Для суммы есть старый бухгалтерский трюк под названием сторнирование - сделать отрицательную проводку. Просто вставляйте строку с минусовым значением, сумма и уменьшится.
-
Это понятно, что так идеологически правильно.
Но на Alter Delete из исходной таблицы MV никак не реагирует? -
-
-
-
Готов changelog для 21.9:
https://github.com/ClickHouse/ClickHouse/blob/master/CHANGELOG.mdClickHouse/CHANGELOG.md at master · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
файлы/парты immutable. Мутации и вообще любые операции создают новые парты, и удаляю старые, таким образом в shadow остаются старые не мутированные парты.
-
очень просто, создаете реплики в другом датацентре, и настраиваете load_balancing что бы запросы выполнялись на репликах внутри датацентра.
>Distributed таблицы на балансире
а зачем такое извращение? -
а с ReplacingMergeTree будет работать?
-
вообще да, но у вас нет
-
- 10 September 2021 (106 messages)
-
Можно ли добавить в конфиг файл новые шарды, не перезагружая имеющиеся ноды?
-
да
-
3й непонятно что вы хотите после "ребаланса весов" перераспределения данных не будет
см. тут https://github.com/ClickHouse/ClickHouse/issues/13574
4й пункт для новых нод лучше сделать до того как вы туда данные лить начнете =)
remote_servers нужен только для distributed и ReplicatedMergeTree про него ничего не знаетSelf-balancing architecture: Moving parts between shards · Issue #13574 · ClickHouse/ClickHouseIssue: So far ClickHouse as a data store shifts the responsibility of the balancing to an operator to provide inbound data flow in a balanced manner - that is to say, once data is written to any of...
-
как запилить сеттинг в clickhouse-format? :) (—param не работает)
а то в реальной жизни не хватает дефолтных сеттингов?
Code: 306, e.displayText() = DB::Exception: Maximum parse depth (1000) exceeded. Consider rising max_parser_depth parameter., Stack trace (when copying this message, always include the lines below): -
Интересно, спасибо!
-
на КХ посыпались ошибки с сегфолтом на определённых запросах на ровном месте - подскажите куда копать?
Изменений в базе и версии КХ не было, началось сегодня - КХ живёт в виртуалке, на самой ОС никаких ошибок не видно.
в логах такое:
2021.09.10 11:10:22.684744 [ 6685 ] {} <Fatal> BaseDaemon: ########################################
2021.09.10 11:10:22.684909 [ 6685 ] {} <Fatal> BaseDaemon: (version 21.8.5.1, build id: 1BF2B09234CE9706
918B9E76519A9E319B3BA0C9) (from thread 6441) (query_id: 1978f5ff-0bcd-434f-ad29-436bc5348736) Received s
ignal Segmentation fault (11)
2021.09.10 11:10:22.685034 [ 6685 ] {} <Fatal> BaseDaemon: Address: NULL pointer. Access: read. Unknown
si_code.
2021.09.10 11:10:22.685193 [ 6685 ] {} <Fatal> BaseDaemon: Stack trace: 0x39d10dc 0x563bc89 0x563d72a 0x
5637507 0x56379c5 0x5afcd2d 0x5afd61c 0x5a158e9 0x5997e60 0x59e9595 0x5541ba3 0x562dccc 0x562f97d 0x5968
baf 0x5969b4c 0x71cb6e7 0x7229d7d 0x734fc42 0x73024b4 0x7f698397beae 0x7f69823be89f
2021.09.10 11:10:22.685339 [ 6685 ] {} <Fatal> BaseDaemon: 3. ? @ 0x39d10dc in /usr/bin/clickhouse
2021.09.10 11:10:22.685413 [ 6685 ] {} <Fatal> BaseDaemon: 4. ? @ 0x563bc89 in /usr/bin/clickhouse
2021.09.10 11:10:22.685525 [ 6685 ] {} <Fatal> BaseDaemon: 5. ? @ 0x563d72a in /usr/bin/clickhouse
2021.09.10 11:10:22.685684 [ 6685 ] {} <Fatal> BaseDaemon: 6. DB::CHJIT::compileModule(std::function<voi
d (llvm::Module&)>) @ 0x5637507 in /usr/bin/clickhouse
2021.09.10 11:10:22.685814 [ 6685 ] {} <Fatal> BaseDaemon: 7. DB::compileAggregateFunctons(DB::CHJIT&, s
td::vector<DB::AggregateFunctionWithOffset, std::allocator<DB::AggregateFunctionWithOffset> > const&, st
d::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) @ 0x56379c5 in /usr/bin/c
lickhouse
2021.09.10 11:10:22.685940 [ 6685 ] {} <Fatal> BaseDaemon: 8. DB::Aggregator::compileAggregateFunctions(
) @ 0x5afcd2d in /usr/bin/clickhouse
2021.09.10 11:10:22.686014 [ 6685 ] {} <Fatal> BaseDaemon: 9. DB::Aggregator::Aggregator(DB::Aggregator:
:Params const&) @ 0x5afd61c in /usr/bin/clickhouse
2021.09.10 11:10:22.686127 [ 6685 ] {} <Fatal> BaseDaemon: 10. DB::AggregatingStep::transformPipeline(DB::QueryPipeline&, DB::BuildQueryPipelineSettings const&) @ 0x5a158e9 in /usr/bin/clickhouse
2021.09.10 11:10:22.686268 [ 6685 ] {} <Fatal> BaseDaemon: 11. DB::ITransformingStep::updatePipeline(std::vector<std::unique_ptr<DB::QueryPipeline, std::default_delete<DB::QueryPipeline> >, std::allocator<std::unique_ptr<DB::QueryPipeline, std::default_delete<DB::QueryPipeline> > > >, DB::BuildQueryPipelineSettings const&) @ 0x5997e60 in /usr/bin/clickhouse
2021.09.10 11:10:22.686396 [ 6685 ] {} <Fatal> BaseDaemon: 12. DB::QueryPlan::buildQueryPipeline(DB::QueryPlanOptimizationSettings const&, DB::BuildQueryPipelineSettings const&) @ 0x59e9595 in /usr/bin/clickhouse
2021.09.10 11:10:22.686512 [ 6685 ] {} <Fatal> BaseDaemon: 13. DB::InterpreterSelectWithUnionQuery::execute() @ 0x5541ba3 in /usr/bin/clickhouse
2021.09.10 11:10:22.686562 [ 6685 ] {} <Fatal> BaseDaemon: 14. ? @ 0x562dccc in /usr/bin/clickhouse
2021.09.10 11:10:22.686668 [ 6685 ] {} <Fatal> BaseDaemon: 15. DB::executeQuery(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<DB::Context>, bool, DB::QueryProcessingStage::Enum, bool) @ 0x562f97d in /usr/bin/clickhouse
2021.09.10 11:10:22.686815 [ 6685 ] {} <Fatal> BaseDaemon: 16. DB::TCPHandler::runImpl() @ 0x5968baf in /usr/bin/clickhouse
2021.09.10 11:10:22.686931 [ 6685 ] {} <Fatal> BaseDaemon: 17. DB::TCPHandler::run() @ 0x5969b4c in /usr/bin/clickhouse
2021.09.10 11:10:22.687048 [ 6685 ] {} <Fatal> BaseDaemon: 18. Poco::Net::TCPServerConnection::start() @ 0x71cb6e7 in /usr/bin/clickhouse
2021.09.10 11:10:22.687122 [ 6685 ] {} <Fatal> BaseDaemon: 19. Poco::Net::TCPServerDispatcher::run() @ 0x7229d7d in /usr/bin/clickhouse
2021.09.10 11:10:22.687237 [ 6685 ] {} <Fatal> BaseDaemon: 20. Poco::PooledThread::run() @ 0x734fc42 in /usr/bin/clickhouse -
2021.09.10 11:10:22.687365 [ 6685 ] {} <Fatal> BaseDaemon: 21. Poco::ThreadImpl::runnableEntry(void*) @ 0x73024b4 in /usr/bin/clickhouse
2021.09.10 11:10:22.687485 [ 6685 ] {} <Fatal> BaseDaemon: 22. start_thread @ 0x8eae in /lib64/libpthread-2.32.so
2021.09.10 11:10:22.687607 [ 6685 ] {} <Fatal> BaseDaemon: 23. __clone @ 0xff89f in /lib64/libc-2.32.so -
-
https://github.com/ClickHouse/ClickHouse/issues/28524
https://github.com/ClickHouse/ClickHouse/issues/28048Received signal Segmentation fault (11) when reading LowCardinality(String) · Issue #28524 · ClickHouse/ClickHouseI have the following in the logs 2021.09.02 13:04:47.539273 [ 119318 ] {} <Fatal> BaseDaemon: (version 21.7.8.58 (official build), build id: 95F91F78B10AC6F0E542A4C4F8D7B8162144DE39) ...
-
а можете попробовать сделать какой то минимально воспроизводимый пример?
с данными с какими нибудь -
вот тут даже не знаю - там в БД около 100 ГБ данных и запросы с использованием нескольких таблиц
-
Привет, хочу оптимизировать матвью
Есть возможность array перевести в tuple? Хочу фильтровать подзапросы с помощью col_name in () -
А что мешает точно так же с массивом делать? Не думаю что будет разница из-за типа
-
Решили с помощью has, а не in, просто in со списками не работают
-
-
-
-
Да кстати, спасибо
-
-
Покажите запрос
-
джойните или делаете dictGet?
-
ну сделайте dictGet
-
да, словари не предназчены для джойна
-
Ребят, подскажите
Есть редкие запросы insert into select id,b,c from tab final where id in (200К id)
Запрос в одну партицию.
Они выполняются медленно ~15-20сек
Хочу их кратно ускорить. CPU-36 физ ядер, он курит. свободной памяти 200GB.
Сам запрос select долго выполняется.
Видимо, нужны настройки, которые поднимут скорость выполнения.
max_threads=36
max_final_threads=16
max_block_size=65K
max_insert_block_size=1KK -
какой тип и формат у id ?
-
UInt64
-
он в primary key ?
если нет может быть какой то bloom filter index поможет скипнуть парты, но только если id не распределены равномерно...
если равномерно то нет не поможет
попробуйте https://github.com/Slach/clickhouse-flamegraph/
может быть сможете понять куда именно упирается по CPU
в FINAL или в WHEREGitHub - Slach/clickhouse-flamegraph: CLI utility for build flamegraph based on system.trace_logCLI utility for build flamegraph based on system.trace_log - GitHub - Slach/clickhouse-flamegraph: CLI utility for build flamegraph based on system.trace_log
-
в primary
равномерно
cpu нагрузки вообще не показывает, la~1,5 -
то есть max_final_threads не помогает ускорить?
надо профилировать включать trace_log -
помогает, но совсем чуть-чуть
-
Можете направить на путь истинный, таблица делаю с нее Detach партиции переношу в другую таблицу(такую же по структуре на том же сервере), а она не видит партиции, стал смотреть они именуются по разному, как можно это победить
-
?\
-
попробуйте system.trace_log настроить и посмотреть итоги
герцовку можно 50 раз в секунду
и отдельно по тредам еще может быть посмотреть -
trace_log есть, куда смотреть там?
-
ну его настроить надо сначала, там по умолчанию слишком мало данных
вы можете настройки индивидуально применить через SETTINGS или через query stirng для HTTP
чтобы конкретную query спрофилировать
ну и потом визуализировать
вы знаете что такое flamegraph?
утилиту смотрели отсюда
https://t.me/clickhouse_ru/234011 ?Slach [altinity] in ClickHouse не тормозитон в primary key ? если нет может быть какой то bloom filter index поможет скипнуть парты, но только если id не распределены равномерно... если равномерно то нет не поможет попробуйте https://github.com/Slach/clickhouse-flamegraph/ может быть сможете понять куда именно упирается по CPU в FINAL или в WHERE
-
да,читаю, спс
там описаны какие настройки нужны для trace_log? -
прямо в readme по ссылке, настройки не обязательно указывать для всего сервера через XML
можно просто для конкретной query -
потому через query_log смотрите query_id
и задавайте параметры в утилите... -
Приветствую, можете подсказать как можно решить задачу "Узнать что делают пользователи до ИВЕНТА"
-
WINDOW FUNCTIONS
https://altinity.com/webinarspage/fun-with-clickhouse-window-functionsFun with ClickHouse Window FunctionsWindow functions have arrived in ClickHouse! Our webinar will start with an introduction to standard window function syntax and show how it is implemented in ClickHouse. We’ll next show you problems that you can now solve easily using window functions. Finally, we’ll compare window functions to arrays, another powerful ClickHouse feature.
-
Спасибо посмотрю
-
GitHub - retentioneering/retentioneering-tools: Retentioneering: product analytics, data-driven customer journey map optimization, marketing analytics, web analytics, transaction analytics, graph visualization, and behavioral segmentation with customer segments in Python. Opensource analytics, predictive analytics over clickstream, sentiment analysis, AB tests, machine learning, and Monte Carlo Markov Chain simulations, extending Pandas, Networkx and sklearn.
Retentioneering: product analytics, data-driven customer journey map optimization, marketing analytics, web analytics, transaction analytics, graph visualization, and behavioral segmentation with c...
-
Спасибо
-
Подскажите пожалуйста, а возможно создать внешний словарь из таблицы КХ в этой же базе?
Попробовал так:
CREATE DICTIONARY default.client_ids_with_purchases
(
ClientID UInt64,
VisitID UInt64
)
PRIMARY KEY ClientID
SOURCE(CLICKHOUSE(HOST 'localhost' USER '*' PASSWORD '*' DB 'default' TABLE 'purchase_visits'))
LAYOUT(DIRECT())
Получаю ошибку при инсерте в основную таблицу
Code: 516, e.displayText() = DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name: while executing 'FUNCTION dictHas('client_ids_with_purchases' :: 4, ClientID : 0) -> dictHas('client_ids_with_purchases', ClientID) UInt8 : 3': while pushing to view default.customer_visits (86f569ce-6dc0-496e-86f5-69ce6dc0796e) (version 21.8.4.51 (official build) -
Привет, у меня есть таблица в Postgresql, которая отображается в clickhouse с помощью DICTIONARY + SOURCE. В таблице есть поле timestamptz - оно транслируется в поле DateTimeField64.
При выборке из словаря clickhouse вот такой
SELECT toString(KFH_registration_data)
FROM __cl_smpb_new_nsi_farmerpassport_organizations
Мне выдаёт ошибку "Illegal column UInt64 of first argument of function toString"
Не пойму почему и что делать?
+ когда я пытаюсь с помощью всяких Python библиотек (asynch...) получить данные из этой таблицы (без приведения к toString) мне тоже выдаёт ошибку:
" Bad cast from type DB::ColumnVector<unsigned long> to DB::ColumnDecimal<DB::DateTime64>" -
-
да можно, у вас нет случайно ограничения на host_regexp и т.п. вещей для коннекта пользователя?
clickhouse-client -u user --password=password -q "SELECT count() FROM default.purchase_visits"
запущенный на сервере clickhouse работает? -
пароль состоит только из числе, может поэтому?
-
нет не поэтому, вы clickhouse-client проверяли?
а откуда в сообщении об ошибке взялся customer_visits если словарь от purchase_visits идет? -
если toString убрать, то что выдает?
-
разобрался. Там была матвью, в которой словарь использовался, исправил ошибку в имени, и все заработало. Спасибо!
-
-
движок вроде через ALTER TABLE вообще менять нельзя
только sorting key через ALTER TABLE ... MODIFY ORDER BY -
Window Functions | ClickHouse Documentation
[experimental] Window Functions ClickHouse supports the standard grammar for defining windows and window functions. The
-
Всем привет! Пытаюсь воссоздать heatmap на основе статистики рабочего времени чтобы понять сколько человек работал в определенный шаг за день (2 часа) приведу пример как хотелось бы получить(выше на картинке). Сейчас пробовал сделать группировку таким образом но в group_by нельзя вычисляемое похоже(
select toDayOfWeek(start) from clickhousetaskworktime
where
start > '2020-01-01 00:00:00' and
end < '2020-12-31 23:59:59' and
user = 14 group by toStartOfHour(start) ;
формат данных:
user;start(datetime);end (datetime);seconds (int)
Собственное сам вопрос, как можно сделать двойную группировку или как это лучше уложить?) -
Ок, спс)
-
возможно вам это поможет
https://kb.altinity.com/altinity-kb-queries-and-syntax/pivot-unpivot/ -
Выдаёт обычную колоночку DateTime64 с обычными записями. Я нашёл вот такую тему в changelog https://github.com/ClickHouse/ClickHouse/pull/26234
Это кажется про мою проблему как разconvert timestamp and timestamptz data types to DateTime64 in postgres engine by jasine · Pull Request #26234 · 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...
-
большое спасибо за подсказку
-
Кто нибудь подскажет, как это побороть? Tables have different format_version
-
Используем 21.3 altinity, сейчас готовимся к миграции на 21.8 и на altinity prestable тестируем запросы.
Задача выбрать из базы строки, упорядоченные по primary key. ORDER BY работает очень долго , поэтому использовали GROUP BY + optimize_aggregation_in_order и это давало нужный результат. А сейчас сортировка перестала работать. Как можно добиться нужного поведения на новых версиях клика? -
CREATE TABLE item_summary
(
`item` String,
`event_source_hi` Int8 DEFAULT -1,
`event_source_lo` Int8 DEFAULT -1,
`event_state` Int8 DEFAULT -1,
`event_last_seen` UInt32 DEFAULT 0
)
ENGINE = ReplacingMergeTree(event_last_seen)
PRIMARY KEY item
ORDER BY (item, event_source_hi, event_source_lo, event_state)
SETTINGS index_granularity = 8192
SELECT
item,
max(event_last_seen) as lseen
FROM item_summary
GROUP BY item
HAVING lseen > 26928753
LIMIT 10000
SETTINGS optimize_aggregation_in_order = 1 -
SELECT toStartOfInterval(date_create, INTERVAL 1 HOUR) as t,
id_event,
count()
FROM orders
GROUP BY t, id_event
ORDER BY t
Подскажите как сделать, чтоб когда нету ивента, то была строка с 0 в поле count? -
что значит "нету ивента"
-
Подскажите такой вопрос. Пытаюсь понять в каких случаях стоит самому выносить что-то в PREWHERE, иногда прирост довольно хороший получается, но в данном запросе на 30% медленнее выполняется, хотя данных меньше надо прочитать. Может кто знает почему так происходит или что можно почитать по этой тематике?
https://gist.github.com/simpl1g/c82ed2b41eefc0f1c57bc1112b78035fwhere/prewherewhere/prewhere. GitHub Gist: instantly share code, notes, and snippets.
-
как сделали, чтобы в консоле показывал сколько партов прочитано было?
-
set send_logs_level = ‘trace’
-
а, точно
-
вообще в логах он пишет что перенес where в prewhere
но во втором случае у вас и prewhere и where -
его нету в записях на 10.09.2021 00:00
-
Если всё оставить в where, то КХ полностью переносит в prewhere, как в первом примере
-
ну а как вы выберете тогда это значение для определенного промежутка времени если его там не было?
-
его не было в 00:00, но оно есть в 01:00. И когда t = 00:00 в колонку count надо писать 0. Сейчас время 00:00 дропается
-
ну не знаю, можно тогда скрестить все часы и все ивенты, ну и считать тогда, если значения пустые, то 0 считайте.
мб есть способы лаконичнее -
ищу лаконичнее
-
ORDER BY | Документация ClickHouse
Секция ORDER BY Секция ORDER BY содержит список выражений, к каждому из которых также может быть приписано DESC или ASC
-
with fill разве может заполнить конкретными значениями event_id которых не хватает?
-
ну это вряд ли :)
-
Не работает с GROUP BY и toStartOfInterval
-
работает:
with data as ( SELECT toFloat32(number % 10) AS n, now() + interval n day as source
FROM numbers(10) WHERE number % 3 = 1 )
select n, toStartOfDay(source) as t, count() c from data
group by n,t
ORDER BY n WITH FILL; -
так работает, спасибо
-
CHJIT можно выключить
--compile_expressions arg Compile some scalar functions and operators to native code.
--compile_aggregate_expressions arg Compile aggregate functions to native code. -
что за 21.8.5.1 ? Altinity build ?
-
Если именуются по-разному, значит разная структура.
Insert-select только -
У нас собирается КХ из исходников.
Но пока перезалил данные на виртуалку с другой машины и вроде проблема ушла - будем ещё тестировать. Возможно данные побились в базе... -
>У нас собирается КХ из исходников.
Зачем ? -
Политика нашего линукс дистрибутива ))
-
понятно, желаю вам конечно успехов, но жизнь у вас будет трудной и беспокойной
-
-
-
-
Спасибо!
-
А возможно ли создать таблицу целиком на вторичном диске а не на дефаултном?
-
Можно, создайте storage policy только с этим диском
-
понял, спасибо, попробую
-
Подскажите пожалуйста, куда копать. Учусь переносить данные из Постгри в Клик.
Настроил репликацию в Клик:
CREATE TABLE default.from_postgres_table (id Int64,
a String,
b String,
c String)
ENGINE = PostgreSQL('192.168.1.243:5432', 'postgres', 'dict_test', 'postgres', 'postgres');
Работает.
Дальше хочу раскидать данные в Distributed таблицу (хотя и в локальную только на этом шарде тоже самое)
CREATE MATERIALIZED VIEW default.op_tc TO default.click_dict_test_dist AS SELECT id, a, b, c from default.from_postgres_table
и ничего не выходит. При инсерте в Постгрю данные появляются в from_postgres_table и не появляются в default.op_tc
При этом если добавить записи в from_postgres_table напрямую - они отлично перенесутся в default.op_tc...
Чтото не срабатывает (если это триггер на инсерт), но что? ((( -
Вы никакую репликацию не настраивали к сожалению, from_postgres_table не хранит в себе данные, а просто проксирует запросы в ПГ. MaterializedPostgreSQL нужен для репликации
https://clickhouse.tech/docs/ru/engines/table-engines/integrations/materialized-postgresql/MaterializedPostgreSQL | Документация ClickHouseMaterializedPostgreSQL Создает таблицу ClickHouse с исходным дампом данных таблицы PostgreSQL и запускает процесс реплик
-
"from_postgres_table не хранит в себе данные" я это предполагал и потому и хотел повесить на нее мат вью, чтобы при появлении новых записей в PG - они перекидывались в нормальную Кликовую таблицу и с ними можно было эффективно работать.
О MaterializedPostgreSQL читал, даже попробовал. но это же пока совсем экспериментальная фича... -
Вроде бы же такая техника подгрузки данных - достаточно обыденна чтоли (читал про Кафку примерно тоже самое - таблица с соответствующим движком и мат вью на нее), а оно вон как (((
-
Добрый вечер. Подскажите, пожалуйста: запрос типа
SELECT cnt
FROM (
SELECT COUNT(*) AS cnt FROM empty_table
)
WHERE cnt = 0;
выдает пустое множество, хотя если в подзапросе написать SELECT 0 AS cnt - то все ок. В чем дело?
Версия 21.8.5.7 -
SELECT COUNT(*) AS cnt FROM empty_table
что выдает? -
0
-
бага ахаха
используйте limit 1000000000000
select cnt from (select count() cnt where 0 limit 1000000000000) where cnt = 0; -
Я извернулся через запрос типа
SELECT cnt
FROM (
SELECT total_rows AS cnt
FROM system.tables
WHERE database = 'some_db' AND name = 'empty_table'
)
WHERE cnt = 0
,
но при использовании COUNT ни WHERE, HAVING не дают корректный результат при пустой таблице -
Спасибо. А почему такое происходит, где почитать?
-
Wrong query result because of push-down optimization · Issue #28880 · ClickHouse/ClickHouse
21.8.4.51 select cnt from (select count() cnt where 0 order by cnt) where cnt = 0; Ok. 0 rows in set. Elapsed: 0.002 sec. select cnt from (select count() cnt where 0 limit 1000) where cnt = 0; ┌─cn...
- 11 September 2021 (91 messages)
-
Еще раз решил разобраться с MaterializedPostgreSQL, добрался до этапа с ошибкой function pg_replication_slot_advance(unknown, unknown) does not exist, нашел ответ, что нужен минимум 11й Postgres, решил что хватит (применить в реальности не смогу, никто мне промышленные сервера до послелних версий не обновит). Но в наследство осталась пачка неработающих "таблиц" с движком MaterializedPostgreSQL, которые не удаляются командами типа "DROP TABLE default.postgre_replica" - ошибка DB::Exception: Table default.16e0c3e0-1e84-4425-96e0-c3e01e84f425_nested doesn't exist. (UNKNOWN_TABLE).
То есть я так предполагаю при создании MaterializedPostgreSQL должна была создаться и физически таблица для него с таким GUIDопохожем именем, но изза разного рода ошибок до ее создания дело не доходило и теперь остались полуматвью, которые... можно както корректно удалить? Попробовать вычистить их из system.tables? -
А какой у вас дистрибутив ?
-
ALT Linux
-
Он же в rpm может
-
-
Всем привет! Подскажите, пожалуйста, как можно отловить причину ситуации, когда в основную таблицу данные залетели, а в MaterializedView, основанном на этой таблице, данных нет. Во View никаких сложных операций нет. Только дублирование трёх полей из основной таблицы с другим PrimaryKey.
При чем ситуация, когда данные не дошли до View, буквально единичные. Большая часть инсертов отрабатывает как положено. -
Расскажите пожалуйста, а отчего у вас такая политика сложилась ? Есть требования специальные по безопасности или ещё чего ?
-
Я думаю вы найдёте всю информацию на сайте дистрибутива altinux.org - тут я думаю это офтопик
-
привет. подскажите по дизайну базы. есть таблица сырых событий - переходов, с разными атрибутами. и есть два типа выборки из нее: строки целиком (навигация по логу) и агрегирование по разным group by (аналитика). второе работает как надо, а первое заметно медленнее, т.к. выбираются все колонки, и есть задача это ускорить. как обычно делают? дублируют данные лога в отдельную таблицу с движком семейства Log?
-
-
Первое можно сделать через подзапрос с in по ключам из индекса
-
-
Ну а order by какой
-
-
-
Я про order by таблицы
-
-
Сколько строк в среднем извлекаете
-
-
-
тормозит не сильно, но все равно раз в 5 дольше выбирает, чем аналитические запросы. и это заметно, т.к. оба типа запросов вызываются одновременно на одной странице приложения для заполнения двух разных таблиц - одна таблица заполняется, другая еще 3-5 секунд грузит
-
А если выполнить этот же запрос с FORMAT Null по времени сколько будет?
Может вы просто в сеть упираетесь? -
-
-
-
Добрый день. Такой вопрос:
Выполняем 5-10 параллельных вставок insert into selected on tab final.
Вставки одинакового размера.
Вставки в одну партицию.
Параллельно с ними в эту же таблицу и в эту партицию идут вставки Insert values
Могут ли они друг друга аффектить?
Происходит то, что иногда вставки деградируют по скорости в 10 раз. Хочу выяснить почему так может происходить. -
-
-
-
3 реплики, 1 шард.
-
Да, много мелких 5-10к строк.
-
каждая вставка порождает парт. Это отдельный подкаталог с полной структурой файлов таблицы. Друг на друга они никак не влияют, но используют общие iops диска и циклы CPU. После этого бекграунд процесс мерджит эти парты в более крупные. Мерждит - это читает, декомпрессирует, совмещает по порядку order by, компрессирует, пишет. И так постоянно.
Не стоит делать много вставок. Особенно в 5-10 потоков. Нужно делать мало больших вставок, используя для этого какие-то внешние инструменты (kafka, kittenhouse , etc). Хороший размер вставки 100к -
Это очень плохо, рекомендуется вставлять большими кусками не чаще раза в секунду
-
-
Конечно, это понимаю, но у нас вынужденное такое использование.
У нас вставки летят онлайн и постоянные.
Кх зачастую полостью справляется, то есть в секунду 10 потоков по 5-10к строк и они выполняются за 0,2-0,5сек. Это вполне устраивает.
Но иногда(пару раз в день) появляется деградация, скорость выполнения в 10 раз увеличивается. -
-
Нам ранее в этом чате рекомендовали вставлять в memory таблицу которая раз в n секунд идёт в настоящую табличку
-
100к не можем вставлять, так как нужно вставлять быстро обновления делаем по 5-10к, потому что результаты нужны прям вот онлайн.
-
Для накопления в батчи в кликхаусе есть тип таблицы buffer.
-
Это или буффер таблицы если данные не страшно потерять
-
Используете SSD? Включены compact парты? Какая версия кх?
-
Да это понятно, но нам нужно смотреть на данные онлайн(
-
Я правильно понимаю что данные потеряются только если все сильно пойдет не так ?
-
Раз в секунду данные уходят в таблицу и появляются уже в таблице
-
Если кх внезапно упадёт
-
Да, данные на ссд. 21.2.9.41.
-
Оно же в памяти(
-
Buffer работает прозрачно
-
-
-
-
-
-
CollapsingMT. Сначала вставляем обнуление данных, потом вставляем новую строку
-
и у нас последовательно, пока не выполнится insert select на эти данные, обычный insert не будет выполняться.
-
-
-
почему, в collapsingMT нужна последовательная вставка
-
пока накопится 10К строк, пройдет время, а данные нужно использовать сразу после вставки.
данные нужно получать скорее -
-
очень необычно что вы применяете КХ для такой задачи. Но если таки да, то не стесняйтесь - добавляете хороших, дорогих SSD, занимайте их на 50%, делайте шарды.
-
-
Не хранятся, в зк только метаданные
-
-
Мешает архитектурное решение.
Вероятно вам стоит как-то иначе работать с данными текущего дня (или часа), которые летят большим и меняющимся потоком. Скорее всего КХ не является подхоящим инструментом для этой цели. Нужен какой-то буфер. Для такого буфера вам вероятно стоит применить какой-то иной инструмент (mysql, postgress, redis), который решит проблему оперативного и целостного доступа к изменяющимся данным. -
С чтением из буферных таблиц тоже нужно осторожно, потому что чтение блокирует вставку, и если читаете оттуда очень часто, то данные могут вообще не вставляться
-
Не знаю, как Log таблицы блокируются, но это может в теории служить альтернативой буферу, если нужно вставлять часто
-
)))
КХ используем для разного функционала, и решили добавить этот, все было ок, пока не стало приходит сотни тысяч обновлений
немного предыстории:
у нас были большие обновления по 100К+строк в collapsingMT вставляли через insert into select final where id in (100k+ id).
и сразу за ними вставка новых данных через обычный insert values 100k
Там медленно выполнялся сам селект из-за большого количества id в IN.
Решили дробить на меньшее количество id в IN и увеличивать количество потоков вставок.
Такое изменение помогло с ускорением регулярно, но иногда появляется деградация. -
А как часто приходят ?
-
Если есть еще поля, по которым можно select отфильтровать (дата, например), то я бы предложил попробовать использовать их, а выборку по id засунуть в prewhere, может быть КХ пытается в противном случае все по первичному ключу читать
-
Но это конечно гадание на кофейной гуще. С другой стороны, мне же за этот совет не платят, так что отвественности тоже не несу :)
-
это все есть и дата и prewhere
-
это практически не лимитировано, но как правило обновления приходит 1 раз в 2-3сек и сразу на ними вставка новых
-
-
Replicated таблица? Какая версия КХ?
То что вам тут наговорили скорее всего не связано с этим -
если инсерт возвращает ошибку, то конечно не вставилось
-
да, replicated. 1 шард - 3 реплики, все версии 21.2.9.41
пишем только в одну -
включите part_log или посмотрите в логе есть ли параллельно мержи
посмотрите летенси в ZK , и сообщения в логе ZK про слишком долгие запись
на версиях типа 20.8 тоже самое?
в общем есть какая-то проблема которую пока не воспроизвели, не могу найти в гитхабе, потом напишу -
до этого была версия 20.1.3.7, там с такими нагрузками не работали
-
ZK вдруг не на тех же серверах что и кх?
-
нет конечно)
-
параллельные мерджи при запросе вставки? или чего?
-
Мержи в тоже самое время что и инсерт https://github.com/ClickHouse/ClickHouse/issues/26755Background Replicated Merges seems to be stuck from time to time, greatly affecting insert latency · Issue #26755 · ClickHouse/ClickHouse
We have latency-critical application (real-time statistics system with watchdogs), which is sensitive to insert latency. We'd like latency to be less than 5 seconds, or better. In productio...
-
нашел нужные query_id, нашел время в part_log и отфильтровал part_log по этому промежутку времени + по пару секунд с разных сторон, остортировал по event_time
MergeParts показывает после запросов на вставку. То есть во время вставки никаких мерджей не было, как я понял. -
инсерты начались в 13:56:35
-
это абсолютно похожая ситуация, подобные варнинги постоянно в логах реплик
Found parts with the same min block and with the same max block as the missing part 1627030800_61998_62022_2. Hoping that it will eventually appear as a result of a merge. -
Буффер так и работает. Только читать нужно не из таблицы, а из буфера, тогда вам будут доступны данные и из таблицы и те что пока ещё в буфере.
-
а почему именно collapsing используете, а не replacing? так тупо в два раза больше на диск пишется, вместо одной новой строки. или у вас кроме апдейтов ещё и делиты есть?
-
вы наверно джойн используете при чём ту же таблицу, что указана во фром и при этом ожидаете, что несмотря на одинаковое название таблицы во фром будет только вставка, а в джойне вся таблица? так не работает. если хотите заджойнить эту же таблицу её нужно будет во вьюху обернуть, чтобы имя поменялось.
-
Collapsing позволяет удалить записи и изменять Данные в ключе сортировки
-
это я знаю, более того это я и написал в своём комменте. вопрос был про то вы юзаете удаление или нет? или просто оставляете себе такую возможность на будущее?
- 12 September 2021 (4 messages)
-
У меня сейчас 3 таблицы. Одна - основная, куда идёт вставка. И ещё 2 таблицы, обёрнутые во вью и тянущих данные из основной таблицы. Так вот, нашел несколько единичных моментов, когда данные в основной таблице есть, а в в производных таблицах - отсутствуют. Либо присутствуют только в одной производной таблице.
Вот и хочу понять как такое могло произойти. Может есть какие-то логи или что-то в системных таблицах, где видно когда и что вставлялось в основную таблицу и что в производные? -
Да используем
-
Чаще всего просто ошибка вставки во таблицу вью. Либо из-за зукипера либо из-за too many parts. Причем повторять инсерт не имеет смысла рассчитывая на дедупликацию инсертов, потому что дедупликация по умолчанию наследуется от основной таблицы. Поэтому при повторной вставке во вью не вставится.
Ещё одна возможная проблема это просто ошибка в селекте или order by таблицы стораджа. -
Вставки неатомарны поэтому успешная вставка в таблицу и не успешная в случае проблем во вью это ожидаемое поведение. Можно в логах искать ошибки с именем таблицы стораджа вью.
- 13 September 2021 (155 messages)
-
Не понятно, разве ошибку отличную от 200 не вернёт, в случае вставки в таблицу , на которую настроены N мат вью ? И разве это не гарант того, что все данные успешно занеслись?
-
Ошибку вернет.
У многих пользователей фреймворки настроены повторять до успеха. Первая попытка падает с ошибкой вставки, вторая не падает, и все, приехали, данные в таблице и mv разошлись. Я все это объяснял в том самом видео. -
@den_crane Спасибо! Картина стала более ясной.
> фреймворки настроены повторять до успеха
Вот как раз мой случай, хоть и не фреймворк, а самописный буфер.
> Причем повторять инсерт не имеет смысла рассчитывая на дедупликацию инсертов
А если выключить insert_deduplicate? Чем это может грозить? Или лучше зафейленую пачку данных в буфере смерджить со следующей, чтобы не сработала дедубликация?
> Я все это объяснял в том самом видео.
А можно ссылку на видео? Думаю, будет полезно посмотреть. -
projections вроде бы избавлены от проблемы выше, т.к. гарантируют консистентность на уровне партов, но штука пока экспериментальная - сразу в продакшен наверное не стоит
-
Все верно сказали, спасибо.
-
Всем привет, подскажите, пожалуйста, можно ли у clickhouse-copier как-то обойти ограничение сложности запроса не изменяя параметр max_result_rows на кластерах?
При копировании получаю ошибку
DB:Exception: Limit for result exceeded, max rows: 3.00 million -
Привет, подскажите плс, на одной машине крутится 3 докер образа кх, после апа с 21.3 до 21.8 время от времени начали падать все 3 базы(контейнеры продолжают работать, селекты выполняются бесконечно), после ребута конкретно одного образа, все 3 начинают работать, в чем может быть проблема?
-
привет, подскажите, как по правильному обеспечить отказоустойчивое решение, какие бестпрактисы, репликация, чтение с кафки например двух экземпляров?
-
не отрабатывает запрос , ALTER TABLE graphite.data DELETE WHERE Date='2021-09-01'; однако select * from graphite.data WHERE Date='2021-09-01' limit 10; выдает данные
-
ошибку не выдает
-
Можно ли как то поменять у таблицы путь хранения?
-
@nshumshurova , посмотрите в таблицу мутаций, отработала ли уже мутация
-
в system.mutations она выполнена?
-
Подскажите, пожалуйста, как выбрать оптимальное количество партиций.
Неоднократно встречал постулат о том, что количество партиций не должно быть большим, желательно до сотен. В чем проблема если партиций все же много? Скажем, если разбить таблицу с историческими данными по дням? Мы всегда пишем данные за сегодня, т.е. запись идет только в одну партицию. Читаем как правило за послед несколько дней, т.к. 99% запросов читают всего из нескольких партиций. Скоростью остальных 1% запросом можем пренебречь. Это все равно является антипаттерном? Если да, то почему? -
если запросы по большому кол-ву дней то больше будет операций с ФС, что негативно сказывается на производительности запросов.
Так же с большим кол-вом партиций увеличивается время старта сервера.
При правильном индексе партиции по месяцу не просто так рекомендуют, мы в свое время выбрали партиции по дням и теперь сервер поднимается минут 40-60, что очень неудобно(
Из плюсов партиций по дням в нашем случае - удобные операции с данными: у нас данные заливаются дневными интервалами, и в случае чего можно быстро партицию заменить атомарно.
alter modify/delete так же быстрее на меньшей партиции(если указывать именно партицию) - но такое не часто бывает. -
нет, как долго ждать выполнения?
-
ошибок то нет никаких? можно попробовать её кильнуть, и потом выполнить запрос снова( можно добавить еще mutations_sync чтоб он вернул результат когда выполнит на всех репликах)
https://clickhouse.tech/docs/ru/operations/settings/settings/#mutations_syncНастройки | Документация ClickHouseНастройки distributed_product_mode Изменяет поведение распределенных подзапросов. ClickHouse применяет настройку в тех с
-
@crazyproger , спасибо. какие-то еще недостатки кроме долго старта может вспомните?
-
еще вопрос про реализацию мутаций. насколько я понял update/delete не меняет файлы данных (они всегда иммутабельны), а создает новые. если в партиции несколько партов (файлов), и мутация затрагивает данные только из одного парта - ch "пересоздаст" только один парт, или все-таки все парты и партиции? это уже наверное особенности внутренней реализации, но может кто читал код или проверял
-
Коллеги, добрый день, подскажите в какую сторону смотреть (не запускается сервер) были проблемы с зукипером (1 из 5 нод выпадала)
2021.09.13 14:26:18.874421 [ 3075 ] {} <Error> Application: Caught exception while loading metadata: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = JSONException: JSON: begin >= end., Stack trace (when copying this message, always include the lines below):
0. JSON::checkInit() const @ 0x13323bce in /usr/bin/clickhouse
1. DB::FileChecker::load() @ 0x1022cee7 in /usr/bin/clickhouse
2. DB::FileChecker::FileChecker(std::1::shared_ptr<DB::IDisk>, std::__1::basic_string<char, std::__1::char_traits<char>, std::1::allocator<char> > const&) @ 0x1022c993 in /usr/bin/clickhouse
3. DB::StorageLog::StorageLog(std::1::shared_ptr<DB::IDisk>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, DB::StorageID const&, DB::ColumnsDescription const&, DB::ConstraintsDescription const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::1::allocator<char> > const&, bool, unsigned long) @ 0x1022065c in /usr/bin/clickhouse
4. ? @ 0x1022bf17 in /usr/bin/clickhouse
5. DB::StorageFactory::get(DB::ASTCreateQuery const&, std::1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::shared_ptr<DB::Context>, std::1::shared_ptr<DB::Context>, DB::ColumnsDescription const&, DB::ConstraintsDescription const&, bool) const @ 0x10035301 in /usr/bin/clickhouse
6. DB::createTableFromAST(DB::ASTCreateQuery, 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&, std::1::shared_ptr<DB::Context>, bool) @ 0xf64713c in /usr/bin/clickhouse
7. ? @ 0xf6457d3 in /usr/bin/clickhouse
8. ? @ 0xf64685f in /usr/bin/clickhouse
9. ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::1::list_iterator<ThreadFromGlobalPool, void*>) @ 0x8d75738 in /usr/bin/clickhouse
10. ThreadFromGlobalPool::ThreadFromGlobalPool<void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda0'()>(void&&, void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::1::optional<unsigned long>)::'lambda0'()&&...)::'lambda'()::operator()() @ 0x8d772df in /usr/bin/clickhouse
11. ThreadPoolImpl<std::1::thread>::worker(std::__1::__list_iterator<std::1::thread, void*>) @ 0x8d72a1f in /usr/bin/clickhouse
12. ? @ 0x8d76303 in /usr/bin/clickhouse
13. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
14. __clone @ 0xfe9fd in /usr/lib64/libc-2.17.so
(version 21.7.3.14 (official build))
21.7.3.14 with revision 54452 -
Господа, а почему может падать запрос в клиенте через jdbc, выполняющийся более 30 секунд? КХ его продолжает выполнять, с ошибкой read timeout отваливается клиент. На серверах/клиентах, вроде, ничего на 30 указывающего в настройках нету.
-
сокет тайммаут
-
Настройки драйвера JDBC по дефолту 30 сек, при этом сам запрос не умирает на КХ. Измените.
-
в бобре поменял, переподключился - не помогает
-
-
это в бобре
-
да, именно так
-
перезапустите бобра, у меня еще в 0 выстален keepAliveTimeout
-
упс, без перезапуска, заработало
-
invalidate/reconnect, похоже, имеет какие-то ограничения
-
а вот кипэлайв вроде бы и ни при чем, есть какое-то влияние?
-
Подскажите можно ли как то таблицу перенести с одного диска на другой, в дисках и правилах все прописано, но мне нужно именно перенести а не создавать?
-
во многих местах КХ не рассчитан на большое кол-во партиций и не тестировался.
Например оптимизация partition pruning которая обычно работает наносекунды (внутри она просто перебирает все парты таблицы), если партов (НЕ ПАРТИЦИЙ!!!!!!!!!) 100 тыс, начинает работать пол-секунды, дольше чем выполнение запроса.
Например ломаются мутации если партов >7-10 тыс., потому что все мутации (читай почти все alter table) создают в ZK запись, и не могут создать потому что запись и 7 тыс. имен партов, больше 1МБ (ограничение по дефолту в ZK).
В некоторых ситуациях репликация скачивает с ZK список всех партов, у некоторых пользователей с большим кол-вом партов, трафик между КХ и ЗК под гигабит, и они внезапно удивляются тормозам на инсерт и счетам из AWS за трафик.
Список этот бесконечный, поищите тут в чате, я раз десять уже описывал. -
Сохраню вашу мудрость 🧎
-
@den_crane , понял, желание партиционировать по дню отпало :)
а если не затруднит, можете глянуть мой вопрос выше, о внутренней реализации мутаций. мутируют ли отдельные парты или все парты в партиции. заранее благодарю. -
мутируют все парты, но они мутируют созданием хардлинков, т.е. как бы меняются метаданные, читаются и переписываются данные только затронутых партиций или колонок.
и есть alter table update/delete in partition .... для replicated (просто оптимизация чтобы не пересоздавать записи в ZK) -
спасибо. еще понаглею - можете ткнуть в документацию или просто рассказать сколько партов ch стремится иметь в партиции? например у меня партиция 100GB, до какого размера файлов ch будет делать мержи, а потом остановится? есть ли конф параметр и какие-то правило как правильно его выставить
-
на самом деле все зависит от длительности хранения. Многие пользователи партиционируют по дню, или неделе, или даже часу. Я например в одной задаче храню данные около 3 дней и они партиционированы по часу -- правда тут есть другая проблема, при drop partition из ZK удаляются не все данные, поэтому мне приходится переидически удалять из ZK вручную блоки старых дропнутых партиций, иначе ЗК распухает и drop partition для этой таблицы работает очень долго.
-
до max_bytes_to_merge_at_max_space_in_pool https://clickhouse.tech/docs/ru/operations/settings/merge-tree-settings/#max-bytes-to-merge-at-max-space-in-poolНастройки MergeTree таблиц | Документация ClickHouse
Настройки MergeTree таблиц Значения настроек всех MergeTree таблиц собраны в таблице system.merge_tree_settings. Их можн
-
спасибо большое!
-
2021.09.12 20:06:43.992633 [ 862 ] {} <Error> system.metric_log (2a45c34a-0081-4f14-aa45-c34a00810f14): Detaching broken part /var/lib/clickhouse/store/2a4/2a45c34a-0081-4f14-aa45-c34a00810f14/202109_54218_54948_146. If it happened after update, it is likely because of backward incompability. You need to resolve this manually
-
restart не помог
-
https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7597
https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf -
и он как-то восстановился на 3 дня назад
-
удалите всю system.metric_log, зачем она вам
-
version 21.8.4.51
-
-
Find and delete empty .json files in the data directories of Log tables.
https://github.com/ClickHouse/ClickHouse/issues/28578Clickhouse-server cannot start due to json exception · Issue #28578 · ClickHouse/ClickHouseI upgrade from 21.3 (LTS) to the latest version $ sudo apt-get update $ sudo apt-get install clickhouse-client clickhouse-server $ sudo service clickhouse-server restart I got this error: --- error...
-
Добрый день!
У меня есть набор событий от разных сервисов, которые пачками по 10-100к+ могут прилетать в ClickHouse
1) Правильной ли будет практика хранить их в одной таблице в виде подобных колонок с учетом того, что ключей событий будет ограниченное количество:
timeStamp
eventID
eventType
array<keys>
array<values>
2) Удобно ли потом из такой структуры делать аггрегацию (различные срезы по часам, дням, и тп) в postgres?
3) Какие могут быть подводные камни? -
если в записи будет 10 ключей, то array<keys> и array<values> будут в 10 раз больше по размеру чем могли бы если бы хранилось в отдельных колонках, поэтому селекты просто будут работать в 10 раз дольше чем могли бы
-
покритикуйте дизайн мутации данных. имеется таблица 20TB с показаниями датчиков. для упрощения схема такая: (device_id, metric_id, timestamp, value). Иногда от датчиков приходят "коррекции" за определенный период и данные за указанный период нужно перезаписать, т.е. удалить все сущ данные датчика за период и добавить новые:
alter table on cluster delete where device = ? and timestamp between ? and ?
insert into ...
Т.к. механизм мутаций не дает никаких гарантий когда будет мутация выполнена, имеется такая идея - читать не напрямую из распределенной таблицы, а из представления, которое читает из основной таблицы все, кроме того, что должно было бы быть удалено + из доп таблицы с новыми данными. при коррекциях представление пересоздается.
при получении коррекции
1. alter main_table on cluster delete where device = ? and timestamp between ? and ?
1. insert into main_table ... # вставка новых данных в таблицу. судя по документации "Мутации также упорядочены со вставками - гарантируется, что данные, вставленные в таблицу до начала выполнения запроса мутации, будут изменены, а данные, вставленные после окончания запроса мутации, изменены не будут."
insert into temp_table_{device_id} # вставка новых данных во временную таблицу
2. create or replace view on cluster data_view as select * from main_table where not (device = ? and timestamp between ? and ?) union all temp_table_{device_id}
т.е. будет такой динамический view, который отсекает из основной таблицы то, что должно было бы быть удалено + union all на "временные" таблицы.
количество коррекций - несколько в день, т.е. колич временных таблиц ограничено. по мере применения мутации view будет пересоздаваться, какой-то процесс будет это мониторить.
есть ли навскидку проблемы в таком подходе? -
Спасибо, не додумался по гитхабу поискать еще, кажетя, оживает
-
Справедливо! Спасибо!
-
удалила, и рестартовала и все равно старые данные
-
>Иногда от датчиков приходят "коррекции" за определенный период и данные за указанный период нужно перезаписать
насколько иногда и эти коррекции важны вообще?
вообще мутации можно выполнять синхронно alter table on cluster delete where device = ? and timestamp between ? and ? settings mutation_sync=2 -
@den_crane а есть какая-то стабильная версия у клика?
-
ранее вы говорили, что мутации могут неделями висеть. это костыльным способ получить актуальные данные не надеясь на то, что мутация сработает за какое-то прогнозируемое время. даже на небольшой таблице в пару сотен gb мутации висят иногда по полчаса и непонятно как их ускорить. optimize final partition не помогает.
-
Я использую у себя в проде 20.8.
21.8 я начал тестировать и закончу тестирование в апреле и возможно поставлю в прод ее. -
кильнула все невыполненные и снова запустила, к сожалению пока нет результата, репликации нет так что mutations_sync вроде влиять не должен
-
в этом смысле да. То что мутация вообще завершится, гарантий нет.
-
так а мутации завершаются?
-
из запущенных сегоодня не завершаются
-
ну и в что в колонка last_exception в system.mutations
что в system.merges ? system.replication_queue? -
просто у нас клик новый, там меньше 2 недель логов
-
и одна нода
-
и данных не много и он там падает безвозвратно
-
Подскажите такой вопрос. Пытаюсь понять в каких случаях стоит самому выносить что-то в PREWHERE, иногда прирост довольно хороший получается, но в данном запросе на 30% медленнее выполняется, хотя данных меньше читается. Может кто знает почему так происходит или что можно почитать по этой тематике?
https://gist.github.com/simpl1g/c82ed2b41eefc0f1c57bc1112b78035f -
┌─latest_failed_part─┬────latest_fail_time─┬─latest_fail_reason─┐
│ │ 1970-01-01 00:00:00 │ | -
system.replication_queue пусто, system.merges мерджится сегодняшний день
-
-
всем привет! как можно засекьюрить пользователя для репликации указываемый в настройках реплик? Чтобы это было нечитабельное <password>yourpass</password>. Работают ли хешы как в users.xml?
-
а всю строку из select * from system.mutations where not is_done format vertical
select * from merges format vertical -
это не репликация. Это distributed запросы.
>Чтобы это было нечитабельное <password>yourpass</password>.
нет.
>Работают ли хешы как в users.xml?
нет.
Можно сделать пользователя без пароля и запретить ему подключаться не с серверов КХ. -
подробнее про падает
-
Добрый день, такой вот вопрос возник:
В доках к таблице system.parts есть колнки min_date, min_time, max_date, max_time. В их описании упоминается, что эти значения берутся из value of the date key in the data part
Я не совсем понимаю, что значит date key in data part это значение какой-то специальной колонки в таблице или что-то такое?
Юзкейс такой: Хочу сделать ручную ротацию через удаление партиций, для этого мне нужно чётко понимать какие значения колонки timestamp есть в каждой партиции, и ротировать довольно гранулярно (по часам), не подскажете куда смотреть? -
развернули сервер клика в тестовом режиме, новая версия, один юзер, 128 Gb памяти. Залили туда данных, не очень много. Вчера он упал и восстановил свое состояние на 3 дня назад.И еще пару раз днем показывал ожидаемое состояние с нужным набором таблиц и данных. Логи выше, в потом он просто пишет, что у него все хорошо и ругается только на ошибки пропавших таблиц. Там еще в схеме немного менялось, поэтому я точно знаю на сколько дней назад он восстал. Виртуалка + кубер - и рестарт при падении. Какая еще информация вам мб полезна?
-
Это значение колонки которую вы задали в PARTITION BY some_func(x)
-
Понял, спасибо
-
> Вчера он упал и восстановил свое состояние на 3 дня назад.
>И еще пару раз днем показывал ожидаемое состояние с нужным набором таблиц и данных.
у вас Replicated таблицы с зукипером ?
>на сколько дней назад он восстал.
вообще в КХ такого ничего нет, такое ощущение что ZK не в ансамбле и КХ подключается к разным нодам ЗК
>Виртуалка + кубер - и рестарт при падении
можете переформулировать, я не могу понять этой фразы. -
нет, у нас просто mergetree без кластера и зукипера
там одна нода.
Виртуалка + кубер точно не знаю как это организовано, но есть стандартный рестарт после падения
собрали тестовый , чтоб кое-что посчитать отдельно -
ничего не понятно. Та таблица metric_log она вообще не таблица с вашими данными, это просто логи КХ, он их не использует
возьмите 20.8, может баг в 21.8
есть такие проблемы https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aissue+label%3Acrash+label%3Av21.8-affected+Issues · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Добрый вечер!
Делаю запрос с ClickHouse 20.8 в ClickHouse 19.16
SELECT * FROM remote('host:port', db.table)
Получаю ошибку DB::Exception: Unknown setting default_database_engine
С этим можно что-то сделать? -
SELECT * FROM system.settings WHERE changed;
-
SELECT *FROM system.settingsWHERE changed┌─name───────────────────────── - 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.
-
Ну у вас эта настройка указана в дефолтном конфиге, вот кх и передает ее в remote запросе
-
Это я уже её установил, пробовал без неё результат тот же
-
А вы что хотите таким образом сделать?
Данные перелить? -
Да
-
Можно сделать наоборот:
на 19.16
: INSERT INTO TABLE FUNCTION remote('host_20.8', ...) SELECT * FROM local
Можно ли как то заигнорить эту настройку это вопрос на самом деле. -
Спасибо
-
Работает ли optimize_on_insert=1 для MATERIALIZED VIEW?
У меня есть основная таблица(`MergeTree`) и аггрегированная(`AggregatingMergeTree`) и в некоторых случаях не всегда объединяются строки и получаются 2 строки с одинаковым ключом, которые cо временем объединяются
UPD: данные в аггрегат перегоняются через MATERIALIZED VIEW -
выглядит как будто у вас что-то с кубером перемудрили. может там два контейнера подняли и вы периодически конектитесь на правильный с нужным стейтом, а периодически на старую копию. или типа того.
-
Проверю, спасибо
-
Привет, какой linter посоветуете для clickhouse? Я вижу, что много отличий от ANSI и поэтому дефолтные sqlfluff не работает. Есть ли какие то рекомендации на этот счёт?
-
это не из-за optimize_on_insert, вообще optimize_on_insert рекомендуется выключить, это вредная штука.
строки не объединяются потому мержи eventual.
все запросы к SummingMT / AggregatingMT должны выполняться с group by , чтобы домерживать в select -
clickhouse-format <<< 'select 1'
SELECT 1
clickhouse-format <<< 'select 1 from from from from'
Code: 62. DB::Exception: Syntax error (query): failed at position 20 ('from'): from from -
clickhouse-format <<< 'select 1 from from as from'
SELECT 1
FROM from AS from -
Всем привет!
Есть какой-нибудь "официальный" хак для оптимального преобразования UInt256 в hex?
вот так select hex(toUInt64(11)) работает
вот так select hex(toUInt256(11)) не работает
Решил адреса эфира хранить числами, чтобы меньше места занимало, но столкнулся с этой проблемой. -
храните как FixedString(32)
-
А hex(reinterpretAsString(toUInt256(11))) не будет работать?
-
будет, только задом наперед все байты и слова,
-
типа как тут
SELECT hex(reinterpretAsString(toUInt64(1111111)))
┌─hex(reinterpretAsString(toUInt64(1111111)))─┐
│ 47F410 │
└─────────────────────────────────────────────┘
SELECT hex(toUInt64(1111111))
┌─hex(toUInt64(1111111))─┐
│ 10F447 │
└────────────────────────┘ -
hex(reverse(reinterpretAsString(toUInt256(1111)))) )))
-
А вообще да, правильно звучит хранить байтики в FixedString
-
select hex(reinterpretAsString(toUInt256(115792089237316195423570985008687907853269984665640564039457584007913129639935)));
-
-
-
-
select hex(reinterpretAsString(115792089237316195423570985008687907853269984665640564039457584007913129639935::UInt256));
┌─x────────────────────────────────────────────────────────────────┐
│ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF │
└──────────────────────────────────────────────────────────────────┘ -
115792089237316195423570985008687907853269984665640564039457584007913129639935 -- это UInt64 для SQL КХ
-
но это все неправильно, храните как FixedString(32)
-
Вы мой герой)
Подумаю еще поповоду FixedString -
про задом наперед вас не волнует видимо проблема?
-
маленький индеец большой индеец?
-
-
reverse? сомневаюсь
-
-
-
-
-
нету способа
-
спасибо!
-
Добрый вечер!
есть ли опыт настройки внешней авторизации? LDAP хранить роли пользователя и обновляются они часто.
В прилагаемом описании указано что после аутентификации можно маппить роли с субд на роли в AD и правильно ли я понял что локально дублировать или синхронизировать роли пользователей не надо? только правило соответсвия ролей локальных и в AD задается
https://clickhouse.tech/docs/ru/operations/external-authenticators/ldap/LDAP | Документация ClickHouseLDAP Для аутентификации пользователей ClickHouse можно использовать сервер LDAP. Существуют два подхода: Использовать LD
-
Локальные роли должны существовать. Список ролей/групп из LDAP/AD уже надо маппить в локальные (существующие в ClickHouse) роли.
-
Да да
Но самого юзеров локально не надо создавать, и группу им локально синхронизировать ? -
И где храниться набор групп пользователя во время запроса?
-
Существуют два подхода:
- Использовать LDAP как внешний аутентификатор для существующих пользователей, которые определены в users.xml, или в локальных параметрах управления доступом.
- Использовать LDAP как внешний пользовательский каталог и разрешить аутентификацию локально неопределенных пользователей, если они есть на LDAP сервере.
При первом - юзер должен быть уже определен локально. При втором - должен НЕ быть определен локально. -
SHOW | ClickHouse Documentation
SHOW Statements SHOW CREATE TABLE SHOW CREATE [TEMPORARY] [TABLE|DICTIONARY|VIEW] [db.]table|view [INTO OUTFILE filename
-
…или вы про AD?
-
Да да про clickhouse
-
Спасибо за запрос
-
-
Волновал момент возможной подменов прав
-
Получается подменить негде, все в изолированной сессии
-
Ибо могла быть уязвимость в расширении прав
-
да, каждый раз заново. Но есть кеширование, см. verification_cooldown настройку LDAP сервера в ClickHouse
-
Очень хорошо, главное что бы туда низя залезть
-
И поправить текущую сессию
-
Типо расширить себе права
-
-
Вопрос 2
Одновременно Kerberos и Ldap можно использовать? -
-
Ок
-
-
Интересует для сервисов как интеграционные потоки
-
По mTLS нет описания, не поддерживается?
-
-
Отличные планы
-
И неужели скоро аналог pgpl/sql будет?
-
Аналог #hint?
Acid?
Год назад были просьбы и вроде готовы были обсудить сроки в 21году
, а как в этом году ? -
-
Хинты нужны для bi tool
-
Хорошо напишу
-
хинты? А что можно хинтами было бы задать?
Я вижу пока только first_rows / all_rows -
ну может хинт не использовать skip index еще можно сделать, хотя это нужно очень редко
- 14 September 2021 (192 messages)
-
Вообще можно еще много чего. Можно типы джоинов задавать. Сеттинги разные на разные подзапросы. Материализовывать подзапрос или нет, выполнять фильтрацию и групинг на стороне дб линка или своей.
-
3. Хинтов нет и планов по ним тоже нет.
2. Acid в разработке, уже работает прототип.
1. Нет. Из похожего сейчас появились UDF в виде внешних скриптов и в виде SQL выражений. -
Мы использовали hint для однозначного определения плана запроса
-
И ещё задавали степень параллела
-
Как задать число используемых ядер для запроса ?
-
Settings max_threads
-
Спасибо
-
Это весь запрос или можно на подзапрос ?
-
Например когда работаю с внешними таблицами, хочу ограничить число обращений в Postgres
-
Не работает для отдельного запроса или подзапрос
SET max_threads = 2; SELECT ...
Это для соединения -
Вопрос остался актуальным , ограничение числа потоков для запроса и подзапроса
можно ли реализовать? -
Вот такие манипуляции
SET profile = 'postgres';
SELECT ....;
SET profile = 'default';
Не помогут -
-
Нет, говорю же, это нужно хинты допиливать и вообще обработку
-
Вот бы в план на 22год взяли
-
Да хоть каждый год на след брать можно )
-
ACID не убьет ли саму идею?
-
А можно подробнее про АСИД?
1. Появятся WAL?
2. Какой уровень изоляции планируется, snapshot isolation?
3. Это будет работать с Distributed? -
+
-
Ну и как лочить будете внутри? Оптимистик небось какой-нибудь.
-
Нет, там всё очень легко и красиво получается.
MVCC + snapshot изоляция.
Сразу получим бонусы - транзакционная вставка в несколько таблиц, атомарные вставки в таблицу и все materialized views. Консистентное выполнение нескольких SELECT из одного снапшота.
Всё это для MergeTree, ReplicatedMergeTree, и пока без Distributed (там тоже всё ясно, но будет не сразу). -
Вот здесь первый прототип: https://github.com/ClickHouse/ClickHouse/pull/24258[WIP] In-memory MVCC prototype for MergeTree by tavplubix · Pull Request #24258 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Not for changelog (changelog entry is not required) Changelog entry (a us...
-
[RFC] Limited support for transactions in MergeTree tables · Issue #22086 · ClickHouse/ClickHouse
Use case Main use cases: Ability to execute multiple INSERTs (maybe into multiple MergeTree tables, including materialized views, #11909) in a single "transaction". All INSERT que...
-
WAL тоже будет, но он не связан с транзакциями, можно отдельно включать и выключать.
-
wal - а tmp_insert не оно ли?
-
Не, это не лог, это одна вставка, она либо целиком записана и переименована, либо не считается.
-
Граждане, хелп, я чего-то не понимаю, однозначно.
create view x as select bla-bla-bla from remote(bla-bla-bla) union all select bla-bla-bla from remote(bla-bla-bla);
select count(*) from x всегда 0
select count(*) from x where всегда пусто
select * from x limit 10 дает результат -
WAL для in-memory кусков. Которые у нас сейчас в финальной стадии разработки (доступны в релизах, но не полностью готовы для продакшена)
-
Да, эту странность заметил, запрос на вставку по таймауту отвалился, а кол-во строк продолжает прирастать :)
-
wal не помешал бы со всеми вставками
но это, повторюсь, перечеркнет всю идею скоростной вставки -
select * from x where bla-bla-bla limit 10 тоже пусто
-
where превращается в prewhere на ноде назначения, может кто-то объяснить, если не затруднит, что это значит?
-
Почему WAL должен замедлить вставку?
-
ClickHouse ведь мержи когда делает, тоже по несколько раз одни и те же данные с диска читает и пишет, и вроде все живы до сих пор :).
-
Ну, вроде, пока никто не смог факт дублирования записи обойти?
-
Я тогда накину немного ещё: раз есть MVCC и прочее, может быть и апдейты без необходимости вручную использовать ReplacingMergeTree и группировки подъедут? Всё это вроде итак есть с SELECT ... FINAL и прочим, но выглядит так, что ClickHouse мог бы и сам схлопывать лишние строки при чтении партов, как в обычном LSM
-
Дублирование записи для WAL не так уж сильно замедлит вставку, потому что данные все равно наверняка будут сжиматься, как и для обычных партов, и к тому же, как я уже выше написал, ClickHouse итак по много раз данные пишет на диск из-за мержей.
-
Кстати, а auto increment кроме как через словари можно сделать?
-
-
Не, с апдейтами всё сложно. Сразу перелопачивать старые данные нельзя. А если делать это постепенно и мержить в фоне, то возникают ещё сложности с репликацией...
Например, можно рассмотреть частный случай задачи - сделать unique primary key. И она как-то плохо решается :( -
Ну, возможно, а если wal будет compact?
-
Тут не понимаю, что имеется ввиду.
-
Ну, типы хранимых таблиц - compact & wide
-
Хм, но ведь сейчас (вроде?) в ClickHouse нет уникальных индексов. Без них апдейты можно было бы делать относительно безболезненно? Но вообще да, про репликацию я не подумал, спасибо за ответ.
-
У нас есть три вида кусков в MergeTree: wide, compact, in-memory.
Compact уже давно в продакшене по-умолчанию. -
Да, сейчас в проработке вариант, где во время апдейта мы вычисляем маски удалённых строк, записываем их вместе с новыми данными... всё это формирует новый кусок и удаления старых строк применяются при чтении.
-
Точно-точно? Именно compact?
-
Да.
-
Куски данных могут храниться в формате Wide или Compact. В формате Wide каждый столбец хранится в отдельном
файле, а в формате Compact все столбцы хранятся в одном файле. Формат Compact может быть полезен для
повышения производительности при частом добавлении небольших объемов данных.
Это из документации. -
Я подниму вопрос, извините :(
-
Граждане, хелп, я чего-то не понимаю, однозначно.
create view x as select bla-bla-bla from remote(bla-bla-bla) union all select bla-bla-bla from remote(bla-bla-bla);
select count(*) from x всегда 0
select count(*) from x where всегда пусто
select * from x limit 10 дает результат -
select * from x where bla-bla-bla limit 10 тоже пусто
-
Забавно
select * from x where y = (select min(y) from x limit 1) limit 10;
DB::Exception: Limit for result exceeded, max rows: 1.00, current rows: 65.50 thousand. -
Возможно ли в кликхаусе создать алиас для таблицы?
Не нашёл подобного в документации. -
в запросе?
-
Нет, на уровне базы - чтобы к одной таблице можно было обращаться по раным названиям в любых запросах.
-
Merge?
-
О, это подходит.
Но, как я понимаю, этот движок нужен для параллельного чтения из разных таблиц - не возникнет каких-то проблем из-за того, что я использую его для чтения из одной довольно большой таблицы? -
Мне кажется, Merge выступает ровно как алиас, просто еще с доп фичами. Но я сам не юзал
-
может быть view логичнее?
-
тут view очень ограниченное - условия where не прокидываются, поэтому ценность view стремится к нулю на реальных запросах. Не очень понятен изначальный вопрос - про обращения по разным именам к одной и той-же таблице.
-
view, кажется, не логичнее - он, как я понимаю, будет выполнять select * from table, после чего хранить результат этого селекта в памяти
-
так и задача не звучит логичной)
зачем разный нейм для одной таблицы? -
в этом и проблема, нечего пока задавать, у плана нету возможных вариантов.
-
и на весь и в каждом подзапросе можно свои settings
-
Задача следующая:
Есть две таблицы c одинаковой структурой.
Нужно иметь возможность быстро заменять одну таблицу на другую для большого количества запросов в разных местах.
Идея следующая: создать алиас и написать запросы к нему. По мере необходимости делать его алиасом первой или второй таблицы. -
1 нет
2 snapshot isolation
3 нет -
в серверных настроках, прямо в корне задайте asynchronous_metrics_update_period_s=60
-
-
-
Покопаю, спсб
-
Incorrect count optimization with UNION DISTINCT · Issue #27578 · ClickHouse/ClickHouse
ClickHouse chooses a column to calculate count, and then UNION DISTINCT collapses the result set. SELECT * FROM system.databases UNION DISTINCT SELECT * FROM system.databases ┌─name ───┬─engine ─────...
-
а можете подсказать что за она? на что влияет
-
это частота с которой КХ пишет в таблицу system.asynchronous_metrics_log.
была раз в минуту, начиная с 21.8 пишет раз в секунду -
Спасибо!
-
будет медленно. Сейчас множество потоков могут читать фильтровать и группировать независимо разные парты
-
тогда Merge выглядит неплохо, _table есть для условий
Там пушдаун для вью не работает вроде -
возникнет много разных проблем
-
Т.е. так делать не стоит?
-
возникнет много разных проблем, лучше не использовать engine=Merge без крайней необходимости.
он редко используемый и постоянно ломается, сейчас неправильный результат при сортировке например -
ORDER BY does not work as expected with Merge engine · Issue #28198 · ClickHouse/ClickHouse
I have two tables something like the following (ClickHouse server version 20.8.7 revision 54438): CREATE TABLE short (e UUID, t DateTime, ...24 additional columns...) ENGINE = MergeTree PARTITION B...
-
Ок, спасибо.
Таким образом, средствами Clickhouse моя задача сейчас не решается? -
>условия where не прокидываются
прокидываются, если возможно -
да, алиасов объектов нет.
что за задача то? -
недавно сделали? Или какие-то важные нюансы есть? Раньше читало всю таблицу.
-
нерабочая, там будет другой синтаксис
ALTER TABLE {database}.{table} MOVE PART 'all_0_0_0' TO SHARD '/clickhouse/tables/ck_cluster/2/{database}/{table} -
много лет назад сделали
-
Есть две таблицы c одинаковой структурой.
Нужно иметь возможность быстро заменять одну таблицу на другую для большого количества запросов в разных местах.
Идея следующая: создать алиас и написать запросы к нему. По мере необходимости делать его алиасом первой или второй таблицы. -
зачем?
-
Нужно для этих запросов перейти с одной таблицы на другую с возможностью быстро откатить.
-
один сервер? проще Distributed пересоздавать
-
Distributed подходит, спасибо!
-
Привет, подскажите плз простой пример как можно изменить параметры только для подзапроса.
-
не всё можно менять
select * from (select from settings xxx=...) settings xxx=...
что за проблема? -
Не очень понял пример, мне также актуально пример
-
у каждого select можно задать settings, НО не все settings можно менять и не везде.
я не понимаю что за проблему решаем? -
Полагаю, зависит от реализации. Например, писать WAL для каждой колонки, партиции и т.д. отдельно, но согласен, об этом не подумал. В случаях, когда есть одна основная таблица, куда идет вся запись, WAL может замедлить вставку до скорости записи одного HDD, если вся запись сериализуется
-
У меня
ограничить нагрузку на внешние источники
И полезно для ограничения ресурсов на определенную задачу, оставим другим ресурсы -
сейчас пилятся легковесные delete, которые будут в спец. парт писать маски для удаленных записей.
-
эм, чта?, КХ в постре не может задать уровень параллелизма
-
И не надо
-
я не понимаю куда стреляем
-
Снижаем число обращений в источник
-
И не тратим ресурсы на задачу второго плана
-
Но гарантируем минимум потоков, достаточно для выполнения в расчётное время
-
вы точно про КХ говорите? Такое ощущение что я попал в параллельную вселенную и там другой КХ. Или я настолько не разбираюсь в КХ что не вдупляю
-
-
вы про приоритеты в двух разных сессиях?
-
Спасибо за помощь, протестирую эти параметры.
-
NaN и NULL вообще-то разные штуки.
и в чем собственно проблема? Берете и грузите? Что не получается?
у питона 4 разных драйвера для КХ, вы про какой? -
Это для etl процессов важно. Сессии могут быть разные, в этом кейсе одна. иногда сложные запросы много ресурсов потребляют.
И управлять ресурсами удобнее из запроса и не привязываться к параметрам сессии -
Использую clickhouse_driver, если отправлять NaN выдает ошибку "AttributeError: 'float' object has no attribute 'encode'" на просторах интернетов не нашел как решить это, поле в которое отправляю NaN типа String
-
select avg(number) from numbers_mt(10000000000) settings max_threads=1, priority=1;
Elapsed: 2.609 sec.
select avg(number) from numbers_mt(10000000000) settings max_threads=16;
Elapsed: 0.332 sec. -
Да да
🙏 -
NaN -- это только!!!!! про float, причем Nan и None (Null) это вообще совершенно разные вещи.
вам похоже нужен именно None
у String только None (Null) возможен https://github.com/mymarilyn/clickhouse-driver/issues/91
Nan это типа результат выражения 0/0 -
Спасибо, попробую
-
select 1/0 ;
┌─divide(1, 0)─┐
│ inf │
└──────────────┘
SELECT 0 / 0
┌─divide(0, 0)─┐
│ nan │
└──────────────┘
select sum(1) x where 0 settings aggregate_functions_null_for_empty=1;
┌────x─┐
│ ᴺᵁᴸᴸ │
└──────┘ -
Вопрос про репликацию - как восстанавливаются данные после потери одной из реплик?Интересует в контексте durability записи. К примеру имеется две реплики, на первую из них пришел insert запрос, блок записался в первую и был реплицирован на вторую. Сразу после этого первая реплика перезагружается не успев сбросить данные на диск. После рестарта первой реплики она автоматически восстановится и получит недостающие данные со второй? или будет рассинхрон данных между репликами?
-
да, сфетчит парт со второй.
-
отличненько. тогда след вопрос:
какого порядка задержки стоит ожидать от репликации? например insert values (1) into table. через сколько в лучшем случае это появится на реплике при условии идеальной погоды - быстрая сеть, низкая нагрузка? ну чтобы не мечтать о миллисекундах. -
Привет. Тут обнаружилось случайно, что LowCardinality(Nullable()) можно запихивать в order by таблицы, и оно с виду работает. Насколько это норм использовать, когда кардинальность колонки действительно низкая? С виду вставка, запросы, пропуск данных, запросы с final, optimize - всё работает.
-
Не стоит, это баг, оно должно быть закрыто экспериментальной настройкой allow_nullable_key.
Там недавно вроде даже креш был где то рядом -
-
Всем привет. Подскажите, пожалуйста, как я могу получить uuid, по которому располагаются данные таблицы в базе с движком atomic?
-
SELECT * FROM system.tables WHERE is_temporary = 0 SETTINGS show_table_uuid_in_table_create_query_if_not_nil=1
-
Спасибо
-
еще эту же настройку для SHOW CREATE TABLE попробуйте
-
Тоже работает)
-
ну почему бы не мечтать о милисекундах если сеть быстрая и Zookeeper на нормальном диске...
вот если вы 1000 записей по одной умудритесь вставить... тогда да, ZK придется разгребать... -
У меня бывший коллега как-то миллион вставил. Был очень опечален :)
-
-
красавцы, давно за этим проектом слежу
не знал что этим именно ребята из Yandex занимаются =) -
Ну там начинали не мы, но Юра подключился в активной фазе просто.
-
CREATE DICTIONARY
покажите -
SELECT count() FROM dbdbdbdbd.ThisIsView что показывает?
ThisIsView это MATERIALIZED VIEW или обычный VIEW? -
count() из него работает?
-
а что такое "открть созданный словарь" ?
SELECT * FROM DashboardDataMartPlayerDict ?
имя базы данных тут пробовали подставить? -
очень странно, в какой момент ошибка выскакивает? случайно не во время старта? там были всякие приколы с dictGet в default выражениях
-
-
sumIf(point, point = 3)
-
благодарю!
-
в dictGet указывается имя базы данных? db.dict_name? или просто dict_name?
-
A словарь как создан? через XML или через CREATE DICTIONARY?
-
Подскажите в таблице более 500млн записей, делаю перенос с одной таблицы в другую Insert Select где то 5 млн записей переносит и выдает ошибку, есть какой нибудь практичный способ переноса данных?
-
Есть buffer table engine, есть MV (но это больше триггер на вставку), а есть clickhouse-copier. Зависит от вашей задачи.
-
-
превышено время ожидания
-
я тоже так подумал, ждал ждал, но данные не лились, может клиент прерывает
-
через секунду
-
LowCardinality(Nullable()) -- вообще не нормально. Зачем Nullable у строк?
LowCardinality(Nullable()) в order by таблицы -- это баг, это не должно работать. И это роняет КХ.
https://github.com/ClickHouse/ClickHouse/issues/28769 -
был в одной версии КХ баг что поля PRIMARY KEY playerId, brandName не стоят в первых позициях в структуре
-
из какого клиента вызываете?
-
dbeaver
-
поставьте в настройках драйвера в соед. socket_timeout = 600000000
-
О спасибо попробую
-
Подскажите, пожалуйста, а в каком случае КХ может обрезать последние 2 цифры ID, который тащим из ПГ. Тип данных на колонке выбран верно.
-
а что значит "выбран"?
есть postgresql табличная функция https://clickhouse.tech/docs/en/sql-reference/table-functions/postgresql/
если кверять через нее что показывается?postgresql | ClickHouse Documentationpostgresql Allows SELECT and INSERT queries to be performed on data that is stored on a remote PostgreSQL server. Syntax
-
Всем привет,
Вопросец - есть большая табличка, данные по часам. По истечении скажем неск мес часовые уже не нужны - я бы слил их в дневные. Добавил бы таблице TTL c group. А вопрос собсно - там миллиарды строк - если я скажу таблице Alter add ttl - не ляжет ли сразу сервер? Или КХ грамотно запустит в сторонке нечто, что тихонько поползет по таблице и за неск дней мне все сделает? База боевая -
грузим в КХ через файл. Неожиданно при проверке нашлось несколько транзакций дубли ID, которые уникальны в пг. При детальной проверке выяснилось, что у этих ID отрезано 2 последних цифры. остальные колонки "не пострадали".
-
т.е. постгре вообще тут ни при чем.
покажите пример id-шников, как они выглядели в файле, какой тип данных вы используете в КХ -
а вы проверяли на пустой таблице? на тестовых данных из 3 строк? вы вообще можете добавить TTL group by на сущ. таблицу?
-
uint64, а вот файлов уже не смогу предоставить (приложение удаляет), запрос, который формирует файл из ПГ формирует его корректно. вместо 255186430 наблюдаю 2551864
-
а формат файла TSV/CSV/... ?
-
А что, разве нельзя добавить TTL в таблицу без TTL?
-
можно, просто для TTL GROUP BY обычна нужна особая структура ORDER BY
-
Незачем, но мы пока не можем выпилить старое легаси. А LowCardinality(Nullable()) работает также, как обычный Nullable - делает маску null-ов? Просто когда увидел, что работает, подумалось, что null просто делается отдельным элементом словаря, и поэтому тут поведение другое относительно простой Nullable колонки.
-
в общем вам надо
set materialize_ttl_after_modify=0;
alter table modify ttl....
а потом вручную запускать alter table materialize ttl in partition по одной -
TSV
-
аа, эдакий полуручной запуск - но ничего - нормально
-
должно работать, может какой-то древний баг.
Какая версия КХ ? -
А что там с особой структурой? Зачел еще раз док - не вижу нич специального. Ордер бу конечно есть, таблица SummingMergeTree и ордер by куча колонок, но первая - дата
-
21.5
-
Ну собсно, да, создам тест таблцу такой же структуры и попробую добавить ttl. Спасибо!
-
даже не знаю как сказать, group by можно делать только по префиксу order by
вот тут в одном примере ORDER BY (key, toStartOfWeek(ts), toStartOfDay(ts), toStartOfHour(ts)) https://kb.altinity.com/altinity-kb-queries-and-syntax/ttl/ttl-group-by-examples/ -
скорее всего была проблема в выгрузке из PG, в файлах были уже кривые id
-
Да, именно. Отличная статья, спасибо
-
хорошо, завтра прогоню еще раз выгрузки, вдруг всплывет на тестовом стенде
-
Всем привет. Хочу разобраться почему простейший селект SELECT * FROM foo LIMIT 50 на 75к (2МБ) строк ставит весь КХ колом, но после запроса даже KILL QUERY не работает.
Вопрос такой - как сделать, чтобы по таймауту запрос килялся сам, а не висел в system.processes? max_execution_time=20 и cancel_http_readonly_queries_on_client_close=1 ничего не дают независимо от типа подключения, это разве нормально? -
Добрый вечер. Вернусь с проблемой медленной вставки, хотел бы еще уточнить момент.
У нас есть таблица(replacing), где хранятся данные по вставленным id, по этой таблице мы мониторим какие id уже вставлены, а какие нет из источника.
В таблице около 50 строк, в зависимости от таблицы в которую вставляем данные, берется нужный id и источник уже по нему загружает данные в КХ.
Так вот, так как у нас много вставок, эта таблица заполняется данными постоянно, как минимум несколько раз в секунду, и выбираются id оттуда через final.
И перед основными тормозами на вставке в другие таблицы, я вижу как вставка деградирует вставка и в эту маленькую таблицу, хотя вставляется туда всего несколько строк, но очень часто. И запросы на вставку в эту маленькую таблицу оканчиваются одновременно с тем как и заканчивается вставка в основные большие таблицы.
Вопрос, может ли этот инсерт в маленькую таблицу деградировать все остальные запросы, и если да, то как ускорить?
PS: обычно в эту таблицу вставки меньше 100мс -
это нормально.
В контексте запроса выставляется флаг killed, при переключении блоков (65k строк), флаг проверяется и выходим из выполнения.
SELECT * -- полей сколько? Каждое поле аллоцирует 1MB буфер для декомпрессии, если полей много и max_threads=16 например то все они будут аллоцировать память, возможно очень долго. -
так замените select final на argmax / или max
-
типа вы делаете insert table select .... from table final во многих потоках и оно зависает?
и таблица Replicated
и сколько реплик?
вставка на разных репликах? -
прежде чем разбираться с причинами, хотелось бы простейшего - простой таймаут на запрос, чтобы КХ отвисал, но видимо это невозможно, что очень странно, фича то базовая
-
так это нихрена не просто и вообще все работает абсолютно не так как вы думаете, поэтому и нет.
-
ясно понятно, насчет "это нормально", я имел ввиду, что в серьезном, продакшн риди софте, есть опции, они задокументированы, но тупо не работают, и видимо никогда не работали
-
все работает, просто не так как вы думаете.
-
max_execution_time
Максимальное время выполнения запроса в секундах.
На данный момент не проверяется при одной из стадий сортировки а также при слиянии и финализации агрегатных функций. -
Я это читал, спасибо что еще раз напомнили про этот момент, проверил - запрос без ORDER BY some_field DESC действительно быстро работает, а SELECT COUNT(*) FROM foo так же все вешает нафиг, теперь хотябы стало понятно на какой стадии. Но претензии к cancel_http_readonly_queries_on_client_close все еще остаются.
-
эм, `SELECT COUNT(*) FROM foo` не читает таблицу , там сделан хак, он считает по структуре в памяти, parts, в parts есть rows.
-
он просто суммирует rows. select count() работает за наносекунды
-
SELECT count()
FROM fact_event
┌───────count()─┐
│ 1699412607159 │
└───────────────┘
1 rows in set. Elapsed: 0.062 sec. -
- 15 September 2021 (112 messages)
-
привет всем!
есть table_1
есть mat_view_2
я хочу соединить их скриптом:
select * from table_1 t1
left join mat_view_2 mv2 on t1.a = mv2.a
where t1.date between mv2.eff_dt and mv2.exp_dt
and t1.number between mv2.start_range and mv2.end_range
но вылетает ошибка по превышению памяти
подскажите, пожалуйста, как можно переделать такой запрос -
Не использовать * / поменять таблицы местами / увеличить память / переделать структуру хранения данных / отказаться от КХ 🤷♂
-
всем привет
подскажите плз ни как не могу сообразить
есть таблица в которой есть date, uhash
дата и уникальный хеш задачи
каждые сутки на каждую задачу в таблице появляется запись, т.е. uhash каждые сутки должен появлятся в таблице
каким образом лучше вычислить среднее и максимальное время между записями uhash ? -
нет
если говорить про маленькую таблицу, то я делаю insert into values()
их может быть 5-15 в секунду.
select id from table final редкий
Таблицаа replicated, 3 реплики. вставка только в одной реплике. -
всем привет, подскажите такой вопрос
есть table с движком kafka, есть MATERIALIZED VIEW соотв AS SELECT * FROM table с кафкой
сам впорос, в таблицы добавилась новая колонка, достаточно ли при этом было сделать DETACH ATTACH самой view перед и после занесения новой колонки, или же нужно дропать ? -
To секция есть в MV?
-
В гитхаб создавайте ишью и приложите код, чтобы можно было воспроизвести
-
всмысле секция ?
-
Суммирую . Т.е. вы делаете 15 вставок в сек. по одной строке в таблицу в которой 50 строк и иногда инсерты работают очень долго?
-
абсолютно так
-
Create mat. view mvname TO целеваятаблица
-
CREATE MATERIALIZED VIEW IF NOT EXISTS table_consumer TO table AS SELECT * FROM table_queue
вот такое MATERIALIZED VIEW -
точнее так, что пытаюсь выяснить взаимосвязь этих вставок в маленькую таблицу и много вставок в большую таблицу, может ли медленный инсерт на маленькую трогать и инсерт на другую таблицу. В этот момент селектов в маленькую таблицу нет
-
Тогда дропнуть мат.вью, пересоздать Кафка таблицу если надо , добавить поле в таблицу table и снова создать мат.вью
-
Добрый день, в отдельные промежутки времени нагрузка на диск все так же высока, может подскажете какие настройки можно подкрутить попробовать?
И второй вопрос, кх в докер контейнерах, в моменты пиковой нагрузки на диск, все 3 базы перестают отвечать на запросы, и после ребута одного контейнера, все остальные базе начинают отвечать как ни в чем небывало -
спасибо за помощь!
-
Привет
Подскажите такой вопрос
Есть: кластер 2х2, таблица users_all engine distirbuted shard key user_id % 2, таблица users replacing, так же консьюмер из кафки для пользователей который вставляет данные в users_all
Такая проблема: произошел баг, что записи с одинаковым user_id попадали в разные шарды. Как такое может быть ?
Так же при выборке из локальной таблицы на шарде select * from users where user_id = X => возвращается то 2, то 3, то 5, то 1 записей в зависиомсти от фазы луны(записи полностью одинаковые). -
#вакансия Всем привет!💚
Вакансия: Retailers Marketing Analyst (Junior+)
Компания: Сбермаркет
Расположение: г.Москва, м.Новокузнецкая
Формат: офис/ удаленно/ офис+удаленно
Кто мы?
💚Sbermarket.ru (ex-Instamart) – стартап по доставке продуктов из супермаркетов. Мы помогаем людям освободить время под что-то более важное, чем очереди в магазинах. За последние 2 года мы выросли в 70 раз и стали одним из крупнейших игроков на рынке e-grocery.
💚У нас сильная команда, собранная из Яндекс, Avito, Ozon, Mail.ru, SkyEng, Gett, McKinsey, GoldmanSachs и тд. Эти люди будут прокачивать тебя и, надеемся, ты нас тоже научишь многому.
💚Что нужно делать:
Аналитика: Думать над правильными дизайнами исследований для проверки гипотез, внедрять их в текущие процессы, оценивать эффективность проектов (в том числе, при помощи А/Б тестов). Строить понятный и прозрачный репортинг, который позволяет бизнес-пользователям принимать data-driven решения
Маркетинг: сотрудничать с маркетингом и Key Account Manager по ритейлеру для создания стратегии маркетинговых активностей в ключевых каналах digital и offline маркетинга для улучшения бизнес-метрик
Создавать инструменты для эффективных бизнес-решений, которые закроют боли коллег
💚Почему у нас круто?
-Быстро принимаем решения и их тестируем. Без бюрократии и мучительных согласований.
-Развиваемся сами и развиваем команду. Ходим на курсы, тренинги — их оплачивает компания. Если нужно, проводим внутренние митапы.
-Опираемся на исследования и метрики, аккуратно следим за консистентностью и пикселями.
-Делаем полезный продукт, который бережёт время для важного. Им пользуются миллионы людей (мы и сами им пользуемся).
-Уважаем время и силы других. Не проводим созвоны, если не нужны. Готовимся перед выступлением, чтобы сообщать только важное.
💚 Где можно ознакомиться с вакансией?
С вакансией можно ознакомиться здесь: https://www.notion.so/Retailers-Marketing-Analyst-Junior-7ce886c0de6c42beac161455733d4f1c
💚Что дальше?
Отклики можно оставлять на ekaterina.presnukhina@sbermarket.ru или мне в лс @bububup
Мы активно растем, поэтому у нас есть и другие вакансии, которые могут быть интересны джунам и не только;) -
Похоже на спам
-
-
там есть строчка "Будет плюсом опыт работы с Clickhouse" 🙂
-
-
Кажется что тут нужна поддержка самого датагрипа, драйвер тут мало чем поможет
-
В последнее время часто такое вижу с припиской сбер, а что это такое никто не знает.
-
Спасибо, честно дважды пробежал глазами и не увидел
-
Там надо по линке перейти чтобы увидеть 🙂
-
Вот пример как происходит, есть вставки в маленькую таблицу, сначала они быстрые, потом они медленные, параллельно с этим приходят вставки в большую таблицу, они медленные, далее отпускает медленную вставку в маленькую таблицу одновременно с остальными, и дальше все идет нормально - без деградации(вставку в маленькую таблицу быстрые и в большую относительно быстрые)
ПС: количество вставляемых строк так разбито, это все для теста, если сгруппировать их в один инсерт в несколько десятков тысяч строк, то все тоже самое. Как я понимаю, все начинается с деградации вставки в маленькую таблицу. -
-
-
это тестовая система?
что если таблицы не replicated ?
никто не знает что это за проблема и не получается ее воспроизвести -
another table насколько широкая? сколько там полей?
-
нет, прод система(
с nonreplicated попробуем протестировать -
another_table - другие таблицы, их 5 штук полей от 3 до 5, в одной 25 полей.
Да, еще добавлю, что на big_table есть 2 MV -
и во что упираетесь? в диск, память или проц?
-
ни во что, памяти навалом, проц курит все время 2-3% нагрузка, диск аналогично.
-
большая таблица - реплейсинг, а маленькая таблица - лог?
-
обе replicatedreplacing
-
т.е. вы делаете вставки в большую таблицу, на которой висит мат вью и переливает эти же сырые строки в маленькую таблицу, в которой периодически запускается схлопывание десятков тысяч сырых строк в 50 агрегированных и в этот момент у вас происходит деградация вставки в маленькую таблицу?
-
нет, они не связаны никак.
маленькая таблица содержит всего 3 поля и 50 строк.
туда заполняются id последних вставленых значений, на случай падения КХ/сервисов/и прочего.
а большая таблица содержит уже больше 25 полей.
МВ переливает данные из большой в две другие таблицы агрегаты. -
т.е. маленькая таблица никак не связана другими ни на ней нет мат вью, ни у других мат вью она не указана как целевая? она вообще сбоку но периодически деградирует вставка и при это сервер не нагружен? а как в этот момент загружен зукипер?
-
Да, она сбоку, на ней есть view с final на которую прикручен словарь, и редко(пару раз в час) используется этот словарь.
Да, периодически деградирует вставка. Памяти много свободной, максимум CPU idle time 85%. LA максимум 5, на 36 физ ядрах.
ЗК avg_latency 0мс -
-
а что там застряло?
-
echo mntr | nc localhost 2181
zk_version 3.5.6-c11b7e26bc554b8523dc929761dd28808913f091, built on 10/08/2019 20:18 GMT
zk_avg_latency 0
zk_max_latency 2458
zk_min_latency 0
zk_packets_received 5343218233
zk_packets_sent 5444632907
zk_num_alive_connections 3
zk_outstanding_requests 0
zk_server_state follower
zk_znode_count 219655
zk_watch_count 216
zk_ephemerals_count 426
zk_approximate_data_size 40895751
zk_open_file_descriptor_count 61
zk_max_file_descriptor_count 500000 -
-
-
есть что-то типа system restart replica db.table
-
Добрый день
Подскажите, пожалуйста.
Есть ли возможность корректной остановки ноды CH? В доке есть про остановку с помощью kill и остановку сервиса, но хотелось бы чтобы перед завершением все данные сбрасывались на диск, переставали приниматься новые подключения, корректно завершались существующие подключения от других нод и проч, как для Cassandra ‘nodetool drain’ -
Спасибо!
-
max latency - две с половиной секунды - это ок? больше полсекунды гуглится только у тех у кого были проблемы с зукипером.
-
тут за все время же, с момента запуска
-
вот вопрос задавал, остался без ответа, мб знаете?
-
да, можно рестарнатуть и проверить при фризах :) но это вряд ли, но и идей кроме попробовать другую версию кх нету.
-
там же альтерами старые строки не удаляются надеюсь?
-
alter вообще нет
replacing таблицы, там нет вообще удалений -
"И второй вопрос, кх в докер контейнерах, в моменты пиковой нагрузки на диск, все 3 базы перестают отвечать на запросы"
При этом зависоне идет нагрузка на проц? -
А никто не подскажет, насколько плохо делать кластер КХ на виртуалках (KVM) с проброшенными туда дисками, с помощью SR-IOV ?
-
>тут вроде уже не раз писали, что лучше group by чем final.
>где писали что group by лучше final?
сорян за такой долгий ответ:
https://t.me/clickhouse_ru/178098
https://t.me/clickhouse_ru/166938
https://t.me/clickhouse_ru/166951
https://t.me/clickhouse_ru/155697
https://t.me/clickhouse_ru/152077
не претендую на единственно верную стратегию, но для себя на основе этих сообщений решил, что лучше argmax, потому что чутка быстрее, потому что final не работает с Distributed, и потому что запрос можно дополнительно оптимизироватьDenny Crane [Starship Captain at Altinity (NB,Canada)] in ClickHouse не тормозитDistributed таблица не делает final, она не в курсе что надо финализировать дубликаты с шардов Т.е. придется делать argmax/groupby
-
-
Скорее всего идет троттлинг cpu, т.к. кончаются timeshares. У вас ведь стоит ограничения по кол-ву “ядер”?
-
вы про max threads?
-
Нет, про ограничения на кол-во ядер в докере.
-
-
Я спрашиваю, стоит ли у вас ограничение на кол-во ядер в докере?
-
-
sudo docker inspect <container> | grep Cpu
CpuPeriod/CpuQuota -
-
Тогда не знаю 🙂
-
Всем привет. Может кто поможет. Есть кластер из двух реплик. Zookeeper на третьем сервере. Нужно в рамках одной реплики перенести данные с одной таблицы в другую. Можно ли использовать для этого copier?
-
схема таблиц отличается, поэтому как я понял нужно делать view той таблицы, с которой переношу
-
insert into select?
-
свежий комент по похожей проблеме как у вас
https://github.com/ClickHouse/ClickHouse/issues/26755#issuecomment-920125629Background Replicated Merges seems to be stuck from time to time, greatly affecting insert latency · Issue #26755 · ClickHouse/ClickHouseWe have latency-critical application (real-time statistics system with watchdogs), which is sensitive to insert latency. We'd like latency to be less than 5 seconds, or better. In productio...
-
тоже мониторите?
-
проблемы нет, но интересно чем закончится)
-
пробовал изначально так, сразу упирался запрос в память, но в итоге получил данную ошибку
Too many parts (xxx). Merges are processing significantly slower then inserts -
up
-
Тогда это похоже на то, о чем я выше писал, только у меня один инстанс, одно ядро 😄 Но там и база очень маленькая 75к строк ~2МБ. Это я просто PoC делаю. Но все равно, мне кажется такого быть не должно.
-
можно сделать кусками, есть настройки для сброса данных на диск из памяти
-
какой-то настройкой может тюнится?
-
1. хз
2. реплейсинг схлопывает строки в фоне, а не сразу. подробнее читайте доку -
в смысле инсертить отдельными партишенами?
-
дак реплейсинг может вернуть меньше записей, но никак не больше
-
возможно, но в любом случае я уже более мощный инстанс поднимать буду, там потом посмотрим
-
кстати тоже бывает, что просто начинает репликация отставать на таблицах меньше 1К строк, которые пополняются пару раз в день. Репликация отстает всегда на похожее кол-во времени
-
т.е. вы вставили одну запись, а в таблице может быть 2 или 3?
-
вообще это сторонняя проблема которая меня никак не афкеттит, просто как факт
я вставил 10 записей
делаю селект
возвращается то 1, то 3, то 5, то 2. Рандомное количество -
можно и так, можно промежутками дат, в зависимости от структуры таблицы
-
но я правильно понимаю, что ошибка из-за большого количества слияний на уровне движка mergeTree?
-
ну если активно идёт вставка новых строк, то число может скакать вверх-вниз. если вы остановили вставку, а количество записей продолжает скакать вверх-вниз, а не только вниз, то может идти репликация и параллельно сворачивание.
-
этим данным больше месяца
-
мерджи медленнее вставок
-
понял, большое спасибо
-
лучше подскажите почему шардинг перестал работать) кластеру больше двух лет. никаких проблем не было.
-
и как обычно за эти два года ничего не менялось... ну разве что там один маленький параметр подкрутили, который ни на что не должен был повлиять...
тут половина вопросов с такого вступления начинается, а потом оказывается, что кластер разъехался или где-то колонку добавили или место на дисках закончилось :)
PS: вспоминайте последние изменения, даже самые безобидные -
класттер живет своей жизнью
тока селекты выполнялись) -
-
ну если совсем ничего не менялось, то смотрите логи, может там ошибки появились, которых раньше не было.
-
чекал логи, вссе тачки были доступны)
-
тогда только дебаг данных. смотреть какие строки то пропадают, то появляются, анализировать, находить общие между ними моменты.
-
а какая версия кликхауса?
-
20.8.12
-
хм, не думал, что больше двух лет назад уже была эта версия :)
-
ну так мы его апдейтим. он не обновлялся уже месяца 3-4. был чисто спайк за 2 дня с этим шардингом. поттом все само восстановилось
-
2 дня спайк. что ж там такое произошло... обновили все ноды?
-
дефолтный ролинг апдейт накатили. через пару месяцев случился спайк.
-
т.е. спайк произошёл не сразу после апдейта, а через два месяца после него?
-
да
-
ну с такой мистикой на проекте, когда ничего не меняют месяцами, а потом само по себе что-то периодически стреляет, может быть всё что угодно.
будем ждать ответы тех, кто с подобным сталкивался. -
сделайте селект на дистрибьютед таблице, а потом ещё по селекту на каждой локальной базе и сравните в чём отличие.
-
а это нормально, что в thread_ids у процесса вот такое:
[258,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,205,204,205,205,205,205,205,295,205,205,205,205,295,205,204,295,205,295,295,205,295,205,205,205,205,295,204,205,295,205,295,295,205,295,205,205,205,205,295,205,205,205,205,295,204,205,295,295,295,295,295,205,295,295,295,295,295,204,207,207,207,207,295,207,295,205,207,207,207,207,207,207,204,207,295,205,207,204,295,207,295,295,295,207,205,205,205,205,207,207,207,295,295,207,204,207,204,204,204,204,207,207,207,207,207,205,205,205,205,207,207,207,207,207,207,207,207,295,295,295,295,207,207,207,207,204,204,204,204,205,205,205,205,295,295,207,207,204,204,204,204,207,207,207,207,295,295,295,295,205,205,205,205,204,204,204,204,207,207,207,207,295,295, ... ]
?
Итого 563 штук, max_threads=4 -
ну тут их вроде всего и 4, ну может 5 :)
-
- 16 September 2021 (74 messages)
-
Дополню информацию, в system.part_log есть MergeParts по 4-30 сек. Это следствие медленной вставки, или причина?
И как можно ускорить мердж, все настройки по мерджу дефолтные. -
We are getting below error while executing some queries in clickhouse
-------------------------------------------------------------- ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 160, host: clickhouse, port: 8123; Code: 160, e.displayText() = DB::Exception: Estimated query execution time (4132.422197661254 seconds) is too long. Maximum: 500. Estimated rows to process: 2157231: While executing MergeTreeThread (version 20.9.2.20 (official build))
-------------------------------------------------------------
Is there any configuration changes need to be done in config.xml or users.xml file -
Господа, подскажите по мутациям/ перегону данных. Нужно из таблицы A перегнать данные в таблицу B( тривиальная задача, которая для других таблиц решалась много раз). Но в таблицу B вставляется лишь 50% данных из таблицы A. При этом в центри ошибок нет, запрос отрабатывается. Таблица B имеет движок Distributed, кластер, движок ReplicatedMergeTree.
Причем, если удалить данные по условию из таблицы B - то удаление происходит через минут 5. Все это время висит мутация, в которой parts_to_do имеет значение ~6000 и уменьшается.
В чем может быть проблема? Или сразу к админам бежать?) -
Приветствую, стоит задача, чтобы посчитать количество определённых ивентов, которые происходили с 20 до 24 часов, каждый день в течение месяца. Как это можно реализовать ?
-
toHour
-
Спасибо
-
как запустить "фоновый" запрос из clickhouse-client? запускаю insert который отработает за 2-3 дня, есть желание видеть прогресс выполнения, но нет желания отменять запрос в случае есть оборвется ssh коннект к ноде. после раз при обрыве соединения запрос завершился
-
tmux запустите на ноде на которой идет выполнение запроса
вы отвалитесь а сссия на сервере нет -
screen
-
отвечу сам себе, сразу как-то не подумал
nohup clickhouse-client —queries-file 1.sql —progress & -
nohup разве переживет реконект ssh ?
-
да, nohup переживает отключение сессии
-
reconnect к сессии - нет, но он пишет stdout в nohup.out, который можно читать tail -f nohup.out и видеть прогресс
соотв. после реконнекта читаем из файла и все -
-
доброго дня.
если есть смещения времени к UTC, типа +03:00 / +11:00 и т.п., есть хороший способ из кликхауса получить время в нужном часовом поясе, без конструкций типа switch (time) case '+03:00' => 'Europe/Moscow' break;
?
поле объявлено как DateTime('UTC')
хотя, проще будет на существующем бэке привести всё к utc и запросить из базы в этом формате. -
rand()% 100
-
Только стоит упомянуть что в рамках блока это будет одно и тоже значение
-
Кто сказал?
SELECT rand() % 100 AS x
FROM numbers(10)
Query id: 194923dc-644e-49cb-9f56-0815c6f74fd4
┌──x─┐
│ 95 │
│ 27 │
│ 17 │
│ 96 │
│ 96 │
│ 45 │
│ 48 │
│ 70 │
│ 85 │
│ 20 │
└────┘ -
Воу
-
-
-
это норма, мерж читает все данные партов и записывает на диск. больше данных => больше операция
-
-
-
Привет! Подскажите плиз, этот параметр = сколько оперативной памяти «съел» запрос?
-
ок, спасибо
все пытаемся выяснить проблемы долгих инсертов( -
Сколько данных просканировали, если я не ошибаюсь
-
Сколько всего данных отсканили
-
33 млн и 133мб соответственно
-
Спасибо. А потребление памяти clickhouse-client не умеет показывать?
-
либо через send_logs_level=trace, либо в конце запроса максимальное показывает
-
Спасибо, помогло
-
здравствуйте, товарищи! подскажите, плиз, что делать, есть ситуация, когда, как-будто залочилась таблицы Engine = Log, запросы к ней зависают, и их никак не получается убить?
-
что-то подобное здесь уже обсуждали. инсерт блочит вставку и если две матвью пытаются писать в эту таблицу, то дедлок. в этот движок нужно писать только в один поток.
-
Всем привет, может кто сталкивался и может подсказать, пожалуйста, почему такое могло случиться:
при инсерте в КХ получил ошибку DB::Exception: Table is in readonly mode
в это же время в лозах зокипера видел следующее
2021-09-16 15:19:49,412 [myid:13] - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxnFactory@192] - Accepted socket connection from /10.11.33.15:23774
2021-09-16 15:19:49,412 [myid:13] - WARN [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:ZooKeeperServer@882] - Connection request from old client /10.11.33.15:23774; will be dropped if server is in r-o mod
2021-09-16 15:19:49,412 [myid:13] - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:ZooKeeperServer@928] - Client attempting to establish new session at /10.11.33.15:23774
2021-09-16 15:19:49,413 [myid:13] - INFO [CommitProcessor:13:ZooKeeperServer@673] - Established session 0xd7beda7b44d0000 with negotiated timeout 30000 for client /10.11.33.15:23774
есть предположение что хост КХ начал новую сессию и в рамках старой сессии прилетел запрос в зокипер -
может вы попытались вставить из под ридонли юзера?
-
к сожалению нет, юзер был не ридонли, сразу после запрос у меня прошел
-
что за движок таблицы?
-
насчет вставки в один поток знаю, запрос на инсерт, блин только щас увидела что тоже в процессах висит, но почему он завис, вроде селект для вставки сам по себе легко выполнялся и как его дропнуть это процесс? со стороны линукса?
-
поиск по чату "убить запрос"?
-
kill query не работает
-
Slach [altinity] in ClickHouse не тормозит
к сожалению, clickhouse by design не убивает запросы немедленно вместо этого выставляется флаг который периодически тред выолняющий запрос может прочитать (а может и нет) и выйти так что ждите для интеракивного стопа я использую KILL QUERY ... SYNC
-
инсертил в Distributed, который смотрит в ReplicatedSummingMergeTree, ну т.е по факту ReplicatedSummingMergeTree (в ошибке КХ путь до него фигурирует)
-
KILL QUERY ... SYNC?
-
это тоже знаю, ну вот время-то прошло, я и этот процесс пыталась кильнуть, вроде пора бы ему увидеть флажок и отлипнуть уже от этой вставки
-
не, не пора. в том сообщении как раз и написано, что "пора" может и не наступить
-
вот про это забыла, да. а что делать, чтоб пора наступила? или как по-другому грамотнее дропнуть процесс?
-
>поиск по чату "убить запрос"?
-
да, спасибо, я и правда сейчас плохо соображаю
-
поиск по чату "DB::Exception: Table is in readonly mode"?
https://t.me/clickhouse_ru/230862Victor in ClickHouse не тормозитДобрый день, коллеги. Есть проблема. Периодически, в процессе работы в логе возникают сообщения вида: 2021.08.16 11:08:34.917174 [ 1355178 ] {a8adb218-1edd-4e48-ad73-ac944a020b48} <Error> TCPHandler: Code: 242, e.displayText() = DB::Exception: Table is in readonly mode (zookeeper path: /clickhouse/tables/01/some_table_name), Гуглили, крутили всякие настройки - толку нет. Может кто наступал на эти грабли? clickhouse-server-21.5.5.12 Stack trace: 0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0x879d83a in /usr/bin/clickhouse 1. DB::Exception::Exception<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>(int, 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&) @ 0x883c3e3 in /usr/bin/clickhouse 2. DB::StorageReplicatedMergeTree::assertNotReadonly()…
-
Могли бы подсказать, в логах вижу такую запись:
{a1288f42-9ea7-4e0e-b194-ddd3afce5fe9} <Debug> InterpreterSelectQuery: MergeTreeWhereOptimizer: condition "NOT deleted" moved to PREWHERE
но в запросе с таким query_id a1288f42-9ea7-4e0e-b194-ddd3afce5fe9 вообще нет condition NOT deleted
Мб это относиться к другому запросу? Поле deleted есть, но оно не фигурирует в where/prewhere -
может оптимизатор добавил. без самого запроса не понять
-
шаблон запрос такой:
insert into table select id, value, deleted, sign from table final where id in (select id from table where id in (1) and date between group by id having sum(sign)!=0); -
попробуйте без финал. возможно он тригерит такое добавление кондишена. у вас реплейсинг или агригейтинг? какой ордер бай и что в качестве версии используется? в общем ддл таблицы в студию.
-
collapsing, в order by id+date
-
maybe check quotas in users.xml
-
Добрый день, подскажите в чем может быть причина проблемы.
В базе есть таблица (engine MergeTree), перед ней есть буфферная таблица.
После того как были выполнены запросы добавления столбцов:
ALTER TABLE "table" ADD COLUMN IF NOT EXISTS "BrandName" String;
ALTER TABLE "buffer" ADD COLUMN IF NOT EXISTS "BrandName" String;
перестали выполняться вставки новых записей в буффер и соответственно в таблицу. После того как новые столбцы удалили все начало снова сохраняться в нормальном режиме.
Что я сделал не так при добавлении нового столбца? -
version 21.8.4.51 (official build)
-
Спасибо, нашел причину сам
-
Кто нибудь знает как атомарно выполнить пересоздание буферной таблицы?
-
create + EXCHANGE
-
Up
Такой же вопрос
версия 21.2.9.4
Что с ними делать? Они на что-то влияют? -
то есть сделать сначала create buffer2, потом exchange buffer and buffer2 и drop table buffer2?
-
да, старый буфер удалять после того как из него данные точно попадут в основную таблицу
-
получается что exchange в фоне данные перегоняет?
-
он просто переименовывыет две таблицы атомарно
-
а старым будет после create + exchage таблица buffer2?
-
не понял вопроса
-
вы сказали "старый буффер удалить после ..." получается что после exchange таблица buffer2 будет таблицей buffer и то есть старой, которую надо удалить? Просто мог не правильно понять, поэтому переспросил
-
да буффер2 удалить
-
спасибо большое
-
Добрый вечер! Хотим сделать дикт, который будет хранить ключ-значения из нескольких таблиц mysql (ключи не пересекаются). Правильно мыслим, что нужно делать Н таблиц с движком MySQL, одну вью, которая прочитает и соберет данные из Н этих таблиц (через юнион, например), а дикт травить с сорсом clickhouse на эту вью?
-
Супер, спасибо!
-
- 17 September 2021 (158 messages)
-
да был не прав.
Одно и тоже значение будет в рамках строки, а не блока если не передавать аргумент в rand -
Здравствуйте. Вопрос про следующий сценарий: хотим в CH хранить около 5.000.000 строк и 1500 колонок. Со временем количество строк может расти, но сравнительно медленно. Сценарий вставки такой: сначала приходят 100-200 колонок для одной строки, потом еще 300-500, потом еще пачка колонок. Так через несколько итераций собирается строка на 1500 колонок. Колонки могут быть в т.ч. Nested. На запись будет не больше 5RPS. При нормальном использовании даже меньше 1RPS. Во всех доках, которые я нашел сказано, что INSERT для CH - норм, а UPDATE, DELETE - ну такое. В этом сценарии мне стоит опасаться, что при вставках через UPDATE я нарвусь на сильные деградации производительности или можно первую вставку делать INSERT’ом, а остальные UPDATE’ом? Пока склоняюсь к тому, что лучше бетчить: дожидаться получения строки целиком или лучше даже дожидаться нескольких строк, хранить промежуточные результаты во временном хранилищец и потом вставлять в CH INSERT’ом пачкой. Есть ли еще какие-нибудь варианты?
-
Добрый день, посмотрите в сторону движка CollapsingMergeTree или
VersionedCollapsingMergeTree, мб это то, что вам подойдёт -
и просто UPDATE’ами писать в таблицу в этом случае?
-
Нет, там только INSERT'ы и передается флаг sign = -1 (удалить строку), 1 - добавить.
-
А понял. Кажется это то, что нужно. Спасибо!
-
-
Там специальный insert, со старыми данными и новыми, вы как бы шлете старые с флагом -1, и оно их схлопывает само, а новые с 1, они остаются, почитайте, в доках очень подробно об этом. Потом есть специальный подход к выборке через select, чтобы не брать старые данные
-
да, понял
-
выглядит как то, что нужно
-
Привет!
Есть ли какие-то рекомендации или лучшие практики по количеству реплик в шарде?
Планируем довести его до 8 штук: шард из трёх реплик расширяем до 5 чтобы снизить нагрузку на каждую реплику, и в отдельном ДЦ - ещё три, в роли резервной площадки (если в основном ДЦ всё умирает). Беспокоит, не начнутся ли какие-то проблемы при таком количестве реплик.
3 десятка Replicated таблиц, записи 1-3 раза в секунду в каждую (только в основном ДЦ). -
Привет
А есть встроенная функция, которая переведет 60 секунд в 1 минуту и так далее? или просто деление и округление?) -
подскажите, что не так?
если в запросе пишу groupUniqArrayState(mac_address), то получаю ошибку:
DB::Exception: Illegal type AggregateFunction(groupUniqArray, UInt64) of argument of function length.
если пишу просто groupUniqArray(mac_address), то получаю массив с уникальными значениями. -
Всем привет. я правильно понимаю из дока, если нужно поставить clickhouse-client на последнуюю MacOS то это https://builds.clickhouse.tech/master/macos-aarch64/clickhouse?
и есть ли способ поставить только клиент, без сервера? -
ответ на ваш вопрос кроется в ответе на следующий - вы 60 секунд как какой тип данных храните?
-
Есть два массива (array), keys and values. Нужно проверить, есть ли ключ и по индексу ключа взять значение и сравнить/
select * from table where has(keys, key) and values[indexOf(keys, key)] = value
Можно ли сделать эффективнее? -
Знаю про тип MAP, но пока тестирую с массивами.
-
arrayFirstIndex не ?
-
Там ведь функция будет внутри, я думаю это будет помедленнее чем два вызова без дополнительного интерпретатора, но я проверю, спасибо.
-
Добрый день. Используется старая версия, при запросе возникает ошибка где указана другая "No alias for subquery or table function in JOIN (set joined_subquery_requires_alias=0 to disable restriction). (version 20.4.4.18 (official build)) (206)"}. Что может быть не так?)
-
а есть ли решение для?
Code: 76. DB::ErrnoException: Cannot open file /usr/bin/clickhouse.new, errno: 1, strerror: Operation not permitted. (CANNOT_OPEN_FILE) (version 21.11.1.8098 (official build))
похоже пока открытый issue https://github.com/ClickHouse/ClickHouse/issues/25514Proposed changes for "clickhouse install" · Issue #25514 · ClickHouse/ClickHouseCurrently, there are several issues/shortcomings with clickhouse install: 1. If a custom prefix path is specified via --prefix /some/path (and only that path is customized), then at least some of o...
-
алиас добавь после скобки.
-
JOIN (set joined_subquery_requires_alias=0 to disable restriction) as 'alias'
-
Тут вопрос скорее почему отличаются версии
-
8 копий данных звучит как жуткий оверкилл
-
-
Нагрузка на чтение действительно большая - из клика аналитика почти в реальном времени идёт в другие сервисы. А для трёх реплик на резервной площадке просто не придумать более удобного и экономного варианта (с условием, что клик на ней должен подняться с минимальным даунтаймом при уходе основного ДЦ в оффлайн).
-
С 2 ДЦ проблема будет в зукипер кластере
-
отключено
-
-
Добрый день. При переносе с одной таблицы в другую с репликацией упирается в zookeeper.
Cannot allocate block number in ZooKeeper
На сколько я понимаю, инсерты приходят быстрее, чем обрабатываются. Может кто знает решение? -
План такой: держим зукипер только в одном ДЦ (основном), если ДЦ падает - включаем зукипер на втором ДЦ, переключаем местные реплики на него и записываем в него метаданные реплицируемых таблиц с помощью SYSTEM RESTORE REPLICA.
-
а данные в зукипере откуда возьмутся?
-
-
-
Ну, делать развесистый кластер зукипера распределенный между датацентрами тоже как-то так себе идея, мне кажется. Вырастут задержки. Или это нормальная практика?
-
-
Всем привет, возникли проблемы с odbc: HTTP status code: 500 Internal Server Error, body: � std::exception. Code: 1001, type: nanodbc::database_error, e.what() = ../contrib/nanodbc/nanodbc/nanodbc.cpp:1625: HY00: [Oracle][ODBC][Ora]ORA-03114: not connected to ORACLE. В чем может быть проблема? До апдейта кликхауса odbc работал без проблем
-
~40мс
А между серверами в одном ДЦ - ~0.3мс -
Добрый день! Есть вопрос по arrayIntersect. Как быть, если количество массивов для поиска пересечений заранее неизвестно? Массив массивов функция воспринимает именно как один массив.
-
-
Подскажите а какую интеграцию кликхауса и утуба вы хотите ?
-
-
А что значит легко ? Вы про готовое решение где нажал кнопку и потекли данные ?
-
-
да, конечно это технически возможно
-
-
с готовыми не сталкивался. Поставщики решений для такой аналитики используют как базу-получатель BigQuery. Технически средства, которые можно использовать существуют, но нужна команда разработчиков чтобы их задействовать
-
-
Owox вроде обдумывал интеграцию. Спросите, может дошли у них руки. Или на заказ сделают.
-
вообще если у вас разработчиков своих нет, то BigQuery - хороший вариант, много преимуществ
-
кликхауз - это больше вариант когда есть своя хорошая разработка и администрирование, не для покупных решений
-
Подскажите пожалуйста решение проблемы
Сделали копию рядом с текущей таблицей в той же директории. Потом основная таблица удалена и на ее место встала та копия.
Теперь при попытке вновь сделать рядом еще одну копию - не хватает место на сервере (хотя по запросу на вес таблиц в кликхаусе их должно хватать).
Т.е получается если копать дальше в кликхаусе и "забился"
Таблица удалялась простым запросом DROP. Могло что то самостоятельно скопироваться в shadow ? Судя по запросом забит он и папка data.
И если да, то как можно ее безопасно почистить? -
-
А какие персональные данные в Аналитики ?
-
Там их нет по-умолчанию. Если только явно не передавать
-
Google BigQuery to ClickHouse | OWOX BI Pipeline
Станьте первым, кто оценит возможности новой интеграции
-
Подскажите как можно заимпортить через Kafka engine вложенный массив JSON?
типа такого
{
"framework"=>"ios_native",
"events"=>
[{"session_uptime_m"=>128780000,
"category"=>"session",
"message"=>"Report sessions"},
{"session_uptime_m"=>128780000,
"category"=>"session",
"message"=> "Save session"},
{"session_uptime_m"=>128782000,
"category"=>"session",
"message"=>"Sessions successfully tracked"}]
} -
вспомнил. Манзана говорила, что разработали свою CDP, причём хранят данные именно в кликхаузе. Связать вас с их продажниками?
-
давайте
-
Кидайте контакты в личку, передам им
-
-
Форматы входных и выходных данных | Документация ClickHouse
Форматы входных и выходных данных ClickHouse может принимать (INSERT) и отдавать (SELECT) данные в различных форматах. П
-
это я читал
-
пока работает только LineAsString + JSONExtract + Tuple Nested, но выглядит странно
-
возможно, сказала девопсам, мне не ответили, но такое перестало больше появляться))
-
Добрый день, может кто-то намекнуть, куда копать.
При запуске параллельных запросов отваливается клик. Там историческая загрузка через клихаус клиент в нативном формате по дню - около 3 млн строк в день в proccesslist около 0,7G и через Dbeaver запрос с агрегацией - с 10G памяти
less /var/log/clickhouse-server/clickhouse-server.log
2021.09.16 11:55:29.953651 [ 785 ] {} <Information> Application: Setting max_server_memory_usage was set to 0.00 B (141.99 GiB available * 0.00 max_server_memory_usage_to_ram_ratio)
(0.00 B- вот тут я еще не поняла почему 0 , если ratio ниже 0.9 установлено)
free -h
total used free shared buff/cache available
Mem: 141Gi 3.1Gi 121Gi 1.0Mi 17Gi 138Gi
Swap: 8.0Gi 0B 8.0Gi
cat /etc/clickhouse-server/config.xml | grep max_server_memory_usage_to_ram_ratio
<max_server_memory_usage_to_ram_ratio>0.9</max_server_memory_usage_to_ram_ratio>
cat /etc/clickhouse-server/users.xml | grep max
<max_memory_usage>60000000000</max_memory_usage> - для default
<max_memory_usage>20000000000</max_memory_usage> - для test -
-
SELECT * FROM system.settings WHERE name LIKE '%max_memory%'
-
не хватает памяти даже на создание таблицы или таблицу создали, но данные не заливаются полностью, а только часть?
select database,
table,
formatReadableSize(sum(bytes)) as size,
sum(rows) as rows,
max(modification_time) as latest_modification,
sum(bytes) as bytes_size,
sum(bytes_on_disk) as bytes_on_disk_size,
sum(data_uncompressed_bytes) as data_uncompressed_bytes,
sum(data_compressed_bytes) as data_compressed_bytes,
any(engine) as engine,
formatReadableSize(sum(primary_key_bytes_in_memory)) as primary_keys_size,
formatReadableSize(sum(bytes) / rows * 1000000) as size_per_1kk_rows
from system.parts
where active and database != 'system'
group by database, table
order by bytes_size desc -
попробуйте запрос выше, может отличие заметите. например данных раскопресино больше или какие-нибудь неактивные парты висят
-
toStartOfMinute
-
В логе нашлось следующее - "<Error> ladnl.dnl_log.DirectoryMonitor: Code: 8, e.displayText() = DB::Exception: Cannot find column lanode in source stream: While sending batch" - мы проверили - эта колонка есть в таблице везде по кластеру. И в лолкальных таблицах и в дистрибутед. Место съело огромное количество файлов в директории data/db_name/distributed_table_name/shard1_replica1,shard1_replica2 и тому подобные. Перезапуск нод не помогает. КХ так и не видит это поле и не видит на remote . в логе <Warning> ....DirectoryMonitor: Structure does not match. Проверили - порядок и количество полей везде одинаково (в metadata)
-
и какого типа у вас mac_address?
-
>И в лолкальных таблицах и в дистрибутед.
>КХ так и не видит это поле и не видит на remote .
немного запутано. если кх не видит, то как вы его увидели в таблицах? -
show create table - поле есть. но в логах КХ утверждает, что поля нет. и это происходит только на одном из 10 серверов (5 шардов по 2 реплики)
-
UInt64
-
мат вью есть на этой таблице?
что значит "и не видит на remote"? -
-State работает только для типов AggregateFunction(...)
-
Не совсем понял. Что тогда мне нужно подавать на вход этой функции?
Можете привести пример, когда бы эта функция работала? -
вам и не нужен -State, это функции для работы с таблицами AggregatingMergeTree, у которых поля в формате AggregateFunction
-
Нет. Не видит - я выше в логе писал - Error> ladnl.dnl_log.DirectoryMonitor: Code: 8, e.displayText() = DB::Exception: Cannot find column lanode in source stream: While sending batch
-
Ну так вот я и хочу создать такую таблицу, одно из полей которой будет как раз формироваться на основании данной функции
-
больше похоже что вы где-то дальше вызываете length() на этой колонке
-
Да, есть такое дело
-
ну вот на это и ругается) возможно -Merge нужен или через uniqState
-
во первых вам лучше использовать SimpleAggregateFunction, чтоб потом как раз не париться с -Merge / -State
во вторых - читайте доку, там всё есть :)
https://kb.altinity.com/engines/mergetree-table-engine-family/aggregatingmergetree/
https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/aggregatingmergetree/AggregatingMergeTree | Документация ClickHouseAggregatingMergeTree Движок наследует функциональность MergeTree, изменяя логику слияния кусков данных. Все строки с оди
-
Я length вызываю на этапе тестирования для проверки корректности составленного запроса, в mv мне такое поле не нужно будет.
Спасибо. Завтра попробую без него выполнить запрос -
Спасибо, была одна mv, удалили - все ожило.
-
Уменьшение гранулярности индекса для ReplicatedMergeTree (в крайнем случае до 1) ведет к падению производительности запросов на сканирование (1.2 миллиона записей). Это как-то меняется внутри формат хранения данных?
-
если индексы не помогают, то меняйте order by, если он уже оптимален для основного кейса, но для второстепенных - нет и не получится, то юзайте проекции.
https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/mergetree/#projectionsMergeTree | Документация ClickHouseMergeTree Движок MergeTree, а также другие движки этого семейства (*MergeTree) — это наиболее функциональные движки табл
-
и? там же я в users.xml переопределила и по памяти от бросает exception для test пользователя 20.....0 . Вопрос, что когда у клик вполне себе много памяти, и запросов только 2 он падает совсем. Не может это быть из-за количества выбранных строк или из-за количества потоков? таблицы Mergetree
-
Для одних и тех же запросов и данных изменение гранулярности рушит производительность на сканирование. Т.е. с 800 QPS при гранулярности в 8192, до 64 при 1. Но данные те же и запросы те же.
-
Ну вам надо в 8 тысяч раз чаще читать, конечно будет медленно
-
Сканирование идет всей таблицы в любом случае, это фул скан. Гранулярность меняет как-то формат хранения данных?
-
данные отдельно, индексы отдельно, индексы сбоку и не влияют на хранение данных
-
Ну индексу может надо куда-то указывать, что распаковано и лежит отдельно. Просто мысли вслух.
-
то что вы описали называется проекции, а не индексы :)
-
Мне казалось primary key всегда используется, даже при seq scan, но возможно я не прав
-
Попробуйте send_logs_level = 'trace' и посмотреть что читает
-
>и?
проверить, что ваши девопсы сервер перезагрузили и настройки применились.
и я думал, что вы этот запрос из под теста выполните, а не из под пользователя, где всё ок.
и у меня эта настройка не применятся для юзеров, а только на профили
>и запросов только 2 он падает совсем.
а где собственно ошибка о падении? -
ClickHouse/ClickHouse tagged: v21.3.17.2-lts
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.3.17.2-lts
Release notes:
ClickHouse lts release v21.3.17.2-ltsRelease v21.3.17.2-lts · ClickHouse/ClickHouseClickHouse lts release v21.3.17.2-lts
-
Всем привет, не могу понять, как сделать группировку с null, ведь clickhouse считает null при группировке, как настоящее значение.
-
а весь запрос можно? там есть джойн?
-
Можно считать, что нужно из левой структуры данных, с помощь группировки, получить правую структуру. Типа левая и есть первообразная
-
Join вообще не рассматриваю, ибо записей миллионы, лучше с group by и группировкой во внешней памяти страдать
-
тогда пока не вкуряю, что по чём вы там группируете
-
вы объясните логику, вообще не понятно как получить правую таблицу
-
ща подтянутся телепаты и всё порешают :)
-
-
rating общий для любых category_region_id
-
🤣 напишите хотя бы, что у вас в group by и в колонках какие агрегирующие функции. и в каком собственно месте отличие кликхауса от других sql бд.
-
select
marketplace_id,
external_id,
category_region_id,
anyLast(rating) as rating
from test_unified_product_v3
group by
marketplace_id, external_id, category_region_id; -
но у вас же marketplace_id - это значение первой колонки, а не название колонки. по крайней мере у вас так выглядит "первообразная структура", что-то у вас значит с первообразной структурой не так и это запутывает ещё больше.
-
там колонки/строки местами поменяны как я понял
-
пипец. интересно как мы могли дать человеку ответ после первого его сообщения? :)
-
иногда я не понимаю как на некоторые вопросы отвечают)
-
-
Нужно, чтобы в результате агрегации осталось только две строки, у которых category_region_id != NULL и был рейтинг
-
а как отсюда понять какой рейтинг какому category_region_id должен соответствовать? там же null
-
where category_region_id is not null
-
Любой рейтинг пускай, не равный null
-
select
marketplace_id,
external_id,
category_region_id,
anyLast(rating) as rating
from test_unified_product_v3
group by
marketplace_id, external_id, category_region_id
having category_region_id is not null; -
Рейтинг null, а должен быть везде 200 или 100
-
Немного помогает такое, но это костыль
select
marketplace_id,
external_id,
ifNull(category_region_id, 1) as category_region_id,
anyLast(rating) as rating
from test_unified_product_v3
group by
marketplace_id, external_id, category_region_id; -
вам надо из group by убрать category_region_id
-
Если я уберу, то потеряю запись с category_region_id = 2, а она нужна
-
значит вы криво пишите в ваш AggregatingMergeTree и строки, которые содержат рейтинг должны также содержать и category_region_id
-
В это и непонятки, записи с rating не могу содержать category_region_id, там всегда будет null
-
и зачем вы на картинке поменяли колонки со строками, первый раз такое вижу, можно мозг сломать
-
>там всегда будет null
и какому тогда по вашему category_region_id должны соответствовать эти рейтинги? -
Ну ведь у нас колоночная бд, а там данные хранятся в таком виде, так и визуализировал 😉
-
Любому не равному null
-
почему тогда у вас колонка горизонтальная? :) горизонтально обычно строки
-
типа рандомно? один category_region_id будет иметь 100, а другой 200? а при следующем запросе наоборот или также?
-
Я уже согласен и на рандом) Нужен последний добавленный, можно смотреть по дате
-
select marketplace_id, external_id, category_region_id, rating from (
select
marketplace_id,
external_id,
arrayFilter(x -> isNotNull(x), groupUniqArray(category_region_id)) regions,
anyLastIf(rating, isNotNull(rating)) as rating
from test_unified_product_v3
group by
marketplace_id, external_id
) array join regions as category_region_id -
этот костыль означает, что все рейтинги у которых category_region_id не задан попадают в category_region_id = 1.
я не знаю насколько это вообще криво, но если вас устраивает, то и наверно ок. что вы хотите поменять не понятно. -
но лучше конечно подумать как нормально писать данные
-
Работает, спасибо)
-
Правда боюсь предствить, как будет на 100млн строк
-
мега подгонка под ответ, я уже думал, что такое никак и не накостылить :)
-
думаю никак
-
можно что угодно на массивах написать)
-
Эти костыли ради того, чтобы не делать join. То есть поместить в одну биг таблицу кучу разного и попытаься через группировки получить единое состояние, собранное из мелких кусков
-
хотя конечно зависит от количества уникалтных комбинаций
-
то что описали - норм, то что вы реализовали - нет. при вставке рейтинга вам нужно вставлять category_region_id.
-
Очень хотелось бы да, но у рейтинга его просто нет
-
/report
-
Типа есть два разных набора данных из разных регионов, у которых один и тот же рейтинг
-
Можно было бы заюзать внешний словарь и сделать dictGet, но рейтинги тоже под 100 млн
-
если на момент вставки у вас уже есть записи, которые содержат category_region_id но не содержат регион, то лучше сразу селектом достать эти регионы и указывать их у рейтинга, тогда потом запросы будут легче отрабатывать
-
Тоже походит на костыль, ибо рейтинг вообще не связан с регионами. А если добавится третий регион, то нужно делать хук на добавление? Чтобы задублировать все рейтинги с новым регионом?
-
да, после падения как раз и применились, да меняла в profile, потом в юзере применила, там еще квоты можно прописать
запрос из под теста с агрегацией, второй из основного
в логах по времени перед падение пишет <Error> Application: DB::Exception: Suspiciously many (21) broken parts to remove.: Cannot attach table
в настройках стоит по умолчанию 5, но это следствие какой-то другой ошибки или настроек, до этого пару часов спокойно все грузилось.
Еще раз посмотрела логи -
<Error> system.asynchronous_metric_log (a66e295a-ce3c-4a29-a66e-295ace3cba29): Detaching broken part /var/lib/clickhouse/store/a66/a66e295a-ce3c-4a29-a66e-295ace3cba29/202109_151633_151633_0. If it happened after update, it is likely because of backward incompability. You need to resolve this manually начинается с этого , потом еще раз это же, потом там неправильный запрос с отсутсвием поля
Cannot parse input: expected 'columns format version: 1\n' at end of stream
а затем от пишет ошибку отсутсвия это поля для таблицы, которая грузилась параллельно с упавшим запросом. В таблице (назовем история) историии это колонки version нет, в принципе. Потом пишет, что и там ее нет и часть сломанны - вот это Suspiciously many (21) , а потом уже новый лог после перезагрузки
по логам похоже, что-то с больного на здоровое перекинул, сам не понял и умер. -
что-то я не уловил взаимосвязи "падают запросы из за недостаточного количества памяти" и "Suspiciously many (21) broken parts to remove.: Cannot attach table".
судя по всему, когда у вас таблицы то пропадали, то появлялись - это всё следствие этих вот ошибок. а увеличение памяти у юзера - это как мёртвому припарки. вам нужно фиксить проблемы, а не симптомы.
может у вас с дисками проблемы или ещё что. вы писали, что это тестовый сервер. пусть его дропнут и пересоздадут с нуля без вот этого вот наследия. -
Я бы так и сделала, дропнула и пересоздала. Ладно, спасибо, хорошего вечера
-
Yes
-
ClickHouse/ClickHouse tagged: v21.9.3.30-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.9.3.30-stable
Release notes:
v21.9.3.30-stable - 18 September 2021 (49 messages)
-
Доброго всем времени суток.
Подскажите пожалуйста как CollapsingMergeTree понимает какие две строки из трех нужно свернуть?
4324182021466249494 | 5 | 146 | 1
4324182021466249494 | 5 | 146 | -1
4324182021466249494 | 6 | 185 | 1 -
Пример из документации
Если я правильно понял, то ключ сортировки тут тольк UserID (4324182021466249494). Правильно ли я понимаю, что CH еще как-то сортирует данные, и порядок вставики имее значение? -
понимает по порядку вставки
-
-
Большое спасибо, не заметил этот движок
-
ClickHouse/ClickHouse tagged: v21.7.10.4-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.7.10.4-stable
Release notes:
v21.7.10.4-stableRelease v21.7.10.4-stable · ClickHouse/ClickHouseClickHouse stable release v21.7.10.4-stable
-
-
-
-
2021.09.18 08:23:32.038512 [ 1428 ] {} <Error> auto DB::IBackgroundJobExecutor::jobExecutingTask()::(anonymous class)::operator()() const: Code: 243, e.displayText() = DB::Exception: Cannot reserve 3.42 GiB, not enough space, 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) @ 0x88b64ca in /usr/bin/clickhouse
1. ? @ 0xfd9c676 in /usr/bin/clickhouse
2. DB::MergeTreeData::reserveSpace(unsigned long, std::__1::shared_ptr<DB::Space>) @ 0xfd9c4bb in /usr/bin/clickhouse
3. DB::MergeTreeData::cloneAndLoadDataPartOnSameDisk(std::__1::shared_ptr<DB::IMergeTreeDataPart const> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, DB::MergeTreePartInfo const&, std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&) @ 0xfda25cc in /usr/bin/clickhouse
4. DB::MergeTreeDataMergerMutator::mutatePartToTemporaryPart(DB::FutureMergedMutatedPart const&, std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, DB::MutationCommands const&, DB::BackgroundProcessListEntry<DB::MergeListElement, DB::MergeInfo>&, long, DB::Context const&, std::__1::unique_ptr<DB::IReservation, std::__1::default_delete<DB::IReservation> > const&, std::__1::shared_ptr<DB::RWLockImpl::LockHolderImpl>&) @ 0xfdd8a25 in /usr/bin/clickhouse
5. DB::StorageMergeTree::mutateSelectedPart(std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, DB::StorageMergeTree::MergeMutateSelectedEntry&, std::__1::shared_ptr<DB::RWLockImpl::LockHolderImpl>&) @ 0xfb327fe in /usr/bin/clickhouse
6. ? @ 0xfb41b88 in /usr/bin/clickhouse
7. ? @ 0xfd12967 in /usr/bin/clickhouse
8. ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::__1::__list_iterator<ThreadFromGlobalPool, void*>) @ 0x88f8fd8 in /usr/bin/clickhouse
9. ThreadFromGlobalPool::ThreadFromGlobalPool<void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()>(void&&, void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()&&...)::'lambda'()::operator()() @ 0x88faf9f in /usr/bin/clickhouse
10. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x88f65af in /usr/bin/clickhouse
11. ? @ 0x88fa043 in /usr/bin/clickhouse
12. start_thread @ 0x76db in /lib/x86_64-linux-gnu/libpthread-2.27.so
13. clone @ 0x12171f in /lib/x86_64-linux-gnu/libc-2.27.so
(version 21.4.3.21 (official build))
2021.09.18 08:23:32.038548 [ 1288 ] {} <Error> auto DB::IBackgroundJobExecutor::jobExecutingTask()::(anonymous class)::operator()() const: Code: 243, e.displayText() = DB::Exception: Cannot reserve 3.40 GiB, not enough space, Stack trace (when copying this message, always include the lines below): -
-
какая фс? мержи резервируют 2x места для себя, они сейчас идут?
-
ext4, да
-
в ext4 ещё по-умолчанию для рута резервируется сколько-то процентов места, можно уменшить
-
диск что рутовый что под вар на треть забит
-
-
/report
-
Check inodes
df -i -
И используйте свежую версию кликхауса
-
хорошая идея, но нет 1%
-
clickhouse-server --version
ClickHouse server version 21.8.4.51 (official build). -
Странно.
In recent versions we have added better diagnostics on free space. It will show you the filesystem path, the amount of total and free space and inodes. -
-
-
Тогда забейте. Может у вас бекап делался на этот же диск или ещё что-то, что на короткий промежуток времени забило диск. Посмотрите в мониторинге.
-
бэкапа нет... )
-
Optimize тоже не запускали?
-
А зря. Можно сделать хотя бы самый простой инкрементальный, чтобы места много не занимал. Раз в сутки сохранять новые записи за эти сутки в csv и гзипом. Так хоть можно будет восстановить всё кроме последнего дня.
-
у нас резервирование, и на второй сервак льются те же данные, типа дев
-
-
-
не запускали
Вопросик такой, есть где лог по подкапотным операциям кликхауса, время планового того же optimize к примеру -
В конфиге есть путь до файла и уровень логирования. Попробуйте выкрутить на максимум.
-
уже выставлени trace
-
-
Хороший ник кстати у Вас
-
😂
-
😂
-
такой вопрос. есть в таблице кликхауса физическое поля sensor_a и sensor_b, например.
если в запросе написать вот так: sum(sensor_a) as sensor_a, то в дальнейшем в запросе sensor_a - будет уже не физическое поле в таблице, а алиас этой суммы.
есть способ обратится к физическому полю ещё раз, не меняя алиас результата?
например, чтобы получить там же sum(plus(sensor_a * coefficient, sensor_b + coefficient)) / sum(plus(sensor_a, sensor_b)? -
prefer_column_name_to_alias
-
о, спасибо.
-
а его для конкретного запроса как-то можно изменить?
-
да
SELECT 1 SETTINGS ... -
-
Да, должно
Что в system.replication_queue для этой таблицы? -
очередь пустая
-
Ну хорошо, а разница в system.parts есть?
-
да, на одной реплике есть партиция, на второй нет
-
сделайте grep по name парта в эррор логах сервера, где ее нет
- 19 September 2021 (54 messages)
-
Подскажите, когда ожидается UDF в стабильной версии?
-
Когда 20.10 до стейбла дойдёт
-
всем привет!) подскажите плз, если мы создаем мат вью с движком MergeTree обращаясь к распределенной таблице - почему мат вью может не обновляться? мне кажется я где то видел, что мат вью должны работать без проблем с распределенными таблицами как и с обычными, но у меня почему то данные не обновляются
вот DDL создания мат вью) буду признателен за помощь)
CREATE MATERIALIZED VIEW log.adv_spendings_view
ENGINE = MergeTree()
PARTITION BY toYYYYMM(event_date)
ORDER BY event_time
SETTINGS index_granularity = 8192 POPULATE AS
SELECT
event_time,
event_date,
kiss__adv_spendings_justcontrolit__adv_plt AS adv_plt,
kiss__adv_spendings_justcontrolit__adset_name AS adset_name,
kiss__adv_spendings_justcontrolit__campaign AS campaign,
kiss__adv_spendings_justcontrolit__campaign_start AS campaign_start,
kiss__adv_spendings_justcontrolit__campaign_finish AS campaign_finish,
kiss__adv_spendings_justcontrolit__cost AS cost,
kiss__adv_spendings_justcontrolit__impressions AS impressions,
kiss__adv_spendings_justcontrolit__clicks AS clicks,
kiss__adv_spendings_justcontrolit__downloads AS downloads
FROM log.kiss
WHERE event = 'kiss__adv_spendings_justcontrolit'
AND event_date >= '2020-01-01' -
в момент создания MV
данные из log.kiss подтянулись в lo.adv.spending_view ?
POPULATE отработал? -
Обновление данных срабатывает только на insert, либо при создании с указанием populate
-
Спасибо, а не до 21.10?
-
Populate да отработал без проблем - данных там прям немного
-
то что мат вью это триггер на инсерт я в курсе - в том и дело, что при вставке новых данных в основную таблицу эти данные не подтягиваются в мат вью
-
ок. вы вставляете в distributed таблицу?
-
может они подтягиваются но не на том сервере на котором вы смотрите?
у вас на каждом сервере создан отдельный MV? -
у нас есть другая таблица log.events - вобще данные вставляются в нее, а log.kiss - дистрибьютед таблица и пока что запись не переключили в нее как я понял
-
нет, мат вью создается толко на одном сервере, а надо на обоих создавать ?
-
так понятно
если вы вставляете в log.events
то и MV должен быть на log.events
потому что триггер MV ничего не знает ни про какие другие таблицы кроме той что во FROM указана... -
более того log.kiss НИЧЕГО не знает про вставки в log.events, он вообще даже не знает есть ли такая таблица на самом деле и какая там у нее под капотом логика
потому что при SELET из log.kiss просто происходит иницализация нескольких паралельных дочерних SELECT запросов читающих из log.events -
я просто не доконца понимаю как в таком случае работает мат вью если она работает на распределенной таблице, которая фактически состоит из двух таблиц на разных серверах
но если мы скоро переключим запись в распределенную таблицу то тогда мат вью будет правильно работать ? а POPULATE в таком случае подтянет данные которые лежат в log.events ? если я обращаться буду к распределенной таблице? -
а можете плз подсказать бест практис при создании мат вью если у нас распределенная таблица ?
в таком случае надо отдельно на каждом сервере создавать мат вью ? а можем мы потом как то объединить эти данные в третью мат вью ? -
распределенная таблица, это прокси движок
на SELECT он умеет переписывать запросы к underlying таблицам и запускать из на серверах из настройки <remote_serves>
на INSERT на ноде инициаторе в tmp_path создаются *.bin файлы которые потом пушатся в underlying таблицы соответствующих шардов -
сделайте MV на log.events
на всех серверах
сделайте обычную Distributed таблицу поверх этого MV
и читайте из нее
вставляйте в log.events
нет best practice
есть либо понимание того как движки таблиц работают либо отсутствие такового =) -
если вы переключите запись в distributed
то надо сделать MV на каждом сервере
и вам все равно вам нужна будет distributed таблица на чтение из этого MV
потому что на каждом сервере будут лежать разные куски данных -
окей, понял вас, спасибо огромное!)
-
-
-
Добрый день.
Столкнулся с проблемой. При попытке созранить в базе данные , представленные uint256 в колонке через драйвер для golang github.com/ClickHouse/clickhouse-go вылетает ошибка, что тип данных uint256 не пределен. Я понимаю, что там русским по белому написано, что тип не поддеживается, но я пытался обойти через вставку не самого числа, а строки с конрвертацией
values (toUInt256(?))
однако это тоже не работает.
Может кто подсказать правильный путь для работы с такой разрядностью через golang?GitHub - ClickHouse/clickhouse-go: Golang driver for ClickHouseGolang driver for ClickHouse. Contribute to ClickHouse/clickhouse-go development by creating an account on GitHub.
-
А просто как строку пробовали вставить?
-
-
Хм, можно сделать через Null table engine
Либо через input
https://clickhouse.tech/docs/en/sql-reference/table-functions/input/input | ClickHouse Documentationinput input(structure) - table function that allows effectively convert and insert data sent to the server with given st
-
@BloodJazMan @simpl1g
подскажите плз, у нас достаточно много небольших мат вью и хотелось бы сделать так чтобы они работали учитывая что у нас распределенная таблица (и запись скоро будет переключена на другую таблицу) Но хотелось бы это сделать не создавая на каждом сервере MV и поверх distributed таблицу.
Я вот увидел в файле следующий метод но я не могу его доконца осознать:
SERVER2: CREATE TABLE dest (A Int64, B String)
Engine=MergeTree ...;
CREATE TABLE remote_src_log AS remote('SERVER2', default, dest)
CREATE MATERIALIZED VIEW src_log_mv1
TO remote_src_log AS
SELECT A, B
FROM src WHERE A % 2 = 0;
вот если у нас распределенная таблица log.kiss а старая таблица log.events - туда скоро данные перестанут писаться
то мне надо на на любом сервере создать таблицу через remote с подключением ко всем локальным таблицам и после этого создать мат вью, которая будет писать туда данные, а в этом мат вью я уже смогу обратиться к распределенной таблице log.kiss через select при создании и это должно сработать ? или я не доконца понял контекст ? -
а чем мне поможет структура? тип не поддерживается драйвером. Если он на прямую не поддерживается, то и внутри структуры так же
-
к моему сообщению скрин из файла
-
Конвертировать на стороне кх будете из строки которую передавать будете в драйвере
-
-
я скорее тут не доконца понял если этот пример про from distributed to distributed то при создании мат вью тут в селекте мы обращаемся к удаленной таблице ? т.е.: SELECT A, B
FROM src WHERE A % 2 = 0
тут src это распределенная таблица имеется ввиду ? -
Покажите ошибку
-
-
а ваша версия КХ поддерживает UInt256?
-
-
-
select version();
-
этот пример про то что можно писать в другой кластер данные через связку remote + mv, src в данном случае может быть любая таблица, MergeeTree или Distributed
-
-
-
-
да, log.kiss - это распределенная над log.events и в log.events данные скоро перестанут и будут писаться как я понял в другую новую таблицу
сейчас у нас построено (15-20 шт) небольших MV из старой таблицы log.events и когда я создал MV заменив log.events на log.kiss то новые данные перестали писаться в новые MV) -
а зачем переделывать view если данные будут писаться в другую тадлицу?) задачу первоначальную не могу понять
-
не должно,
попробуйте комбинацию
таблица с Null движком с String типом в этой колонке и MV которая конвертирует строку в ваш инт -
вот это уже неправдой попахивает
MV независимы друг от друга, если каскадно друг на друга не ссылаются -
да важна, но сам драйвер по себе не поддерживает =)
вы запрос пробовали свой выполнить в clickouse-client?
точно ваша версия UInt256 поддерживает?
и если не секрет зачем вам так много? ;) что именно за данные вы пытаетесь туда положить? -
консоль исполняет корректно.
тип данных не я выбирал - надо хранить такие -
когда мы переключим запись, то новые данные будут писаться в distributed таблицу, потому и переделываю MV, так как в них бы не писались новые данные
-
извините, не доконца вас понял)
неправда что именно из этого?) что данные перестали писаться? -
что данные перестали писаться в другие MV, после того как якобы сделали один ваш MV
или вы все MV пересоздали с новой distributed таблицей? тогда вы меня извините, я не правильно понял -
ну вообще toUInt256(?)
и передача строки вместо числа, должно работать -
да я пересоздал MV все заменив log.events на log.kiss - распределенную таблицу) и новые MV не работают)
-
Но - не работает
- 20 September 2021 (206 messages)
-
Привет. А кто-нибудь курсе, почему половину датасетов с clickhouse.tech фиг развернешь (ну или я делаю что-то не так)? Версия кликхауса: 21.9.3.30.
1️⃣ Яндекс Метрика: hits_v1 и visits_v1 импортируются нормально, а hits_100m_obfuscated_v1.tsv.xz ломается:
Code: 27. DB::ParsingException: Cannot parse input: expected '\t' before: 'http://bonprix.ru/index.ru/cinema/art/0 986 424 233 сезон\t\t0\t0\t0\t3\t177\t0\t0\t0\t0\t0\t\t0\t0\t15\tD�\t1\t0\t0\t0\t\t\t2630537\t4\t0\t\t0\t0\t0\t0\t-1\t1971-01-01 17:16:06\t0\t0\t0\t0\t\t':
...
Column 13, name: UserAgent, type: UInt8, ERROR: text "http://bon" is not like UInt8
: (at row 1)
. (CANNOT_PARSE_INPUT_ASSERTION_FAILED), 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) @ 0x936713a in /usr/bin/clickhouse
2️⃣ OnTime датасет не импортится из файлов:
On_Time_Reporting_Carrier_On_Time_Performance_1987_present_2017_10.zip
Code: 27. DB::ParsingException: Cannot parse input: expected '"' before: 'N732SK","2930",10140,1014003,30140,"ABQ","Albuquerque, NM","NM","35","New Mexico",86,14107,1410702,30466,"PHX","Phoenix, AZ","AZ","04","Arizona",81,"1525","1515':
Row 1:
Column 0, name: Year, type: UInt16, parsed text: "2017"
...
Column 8, name: IATA_CODE_Reporting_Airline, type: String, parsed text: "<DOUBLE QUOTE>OO<DOUBLE QUOTE>"
Column 9, name: Tail_Number, type: Int32, parsed text: "<DOUBLE QUOTE>"ERROR
Code: 27. DB::ParsingException: Cannot parse input: expected '"' before: 'N732SK","2930",10140,1014003,30140,"ABQ","Albuquerque, NM","NM","35","New Mexico",86,14107,1410702,30466,"PHX","Phoenix, AZ","AZ","04","Arizona",81,"1525","1515'. (CANNOT_PARSE_INPUT_ASSERTION_FAILED) (version 21.9.3.30 (official build))
3️⃣ Criteo Terabyte logs - ссылка ведет на страницу, где лично я не вижу, как их скачивать - https://labs.criteo.com/2013/12/download-terabyte-click-logs/? Нашел в гугле по такому адресу: https://ailab.criteo.com/download-criteo-1tb-click-logs-dataset/ -
-
Привет. Подскажите, пожалуйста.
Как установить максимальный размер для system.query_log.
Вроде бы можно retention size задать. но по доке я не разобрался каким параметром именно для query_log это можно сделать. -
Всем привет. Подскажите, пожалуйста, CollapsingMergeTree ведет себя так же как и ReplacingMergeTree при инсертах? То есть если я делаю несколько инсертов с одинаковым ключем и с единичками в поле sign, но с разными counts в таблицу с движком CollapsingMergeTree, то в фоне происходит сворачивание этих записей и остается только последняя запись. Или для этого можно использовать FINAL в запросе. В документации явного указания на это я не увидел. Там объясняется алгоритм работы удаления с использованием sign. Но когда я просто экспериментировал с такой таблицей, то записи сворачиваются
-
Надо использовать FINAL, все таблицы *MergeTree сливают данные в бэкграунде. У вас видимо данных очень мало и всё быстро под капотом отрабатывает
-
Хелло, господа! подскажите, есть ли какая то разница между выполнением сабселекта и чтением из обычной VIEW с последующей фильтрацией? сабселект отрабатывает, аналогичная вьюха - нет с падением по памяти (Memory limit, ConvertingAggregatedToChunksTransform). тоже не ворк, если оборачиваю сабселект в функцию view(. можно ли заставить вью работать точно также как селект?
в запросе union из нескольких AggregatingMT с вычислением -Merge -
Можно задать TTL например, про размер не слышал https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-system-tables-eat-my-disk/
-
Спасибо. Да, использую final, забыл сказать. Но интересно в чем тогда преимущество replacing именно в такой задаче, когда прилетает какое-то количество inserts, которые являются update, фактически.
-
Спасибо. Похоже то что нужно
-
Если вам нужен чистый апдейт, то наверное replacing лучше. Collapsing позволяет удалять
-
Не все оптимизации могут во вью корректно работать, и получается довольно частая ситуация когда вью работает медленнее. Как это пофиксить хз, не использовать вью например)
-
да, видимо мы медленно идем в эту сторону. мерси. хотелось визуально уменьшать запросы
-
ребят, а truncate в кликхаус работает? или какие способы есть очистить таблицу
-
Раьотает
-
спасибо
-
да, мне нужно и удалять. Я правильно понимаю, что при апдейте между ними нет разницы? Просто удаление у меня редко происходит, а апдейтов очень много. Поэтому если в replacing апдейт происходит эффективнее, то я бы рассмотрел возможность soft delete или другие обходные пути..
И, вообще, хотелось бы понять есть ли разница при апдейте -
вместо максимального размера, надо по дате удалять через TTL в engine параметре в XML config.d
-
👍
-
разницы с точки зрения производительности между Replacing и Collapsing практически нет
все "удаления" и "апдейты" это просто немного разная логика пропусков строк при слиянии партов внутри партиции в background merge trhead pool -
спасибо большое!
-
вы хотите слать всегда sign = 1 для обновления через collapsing? Не звучит чем-то надёжным и идеологическии верным. Что будет если 2 потока пришлют разные значения?
-
-
ну вообще это у вас не все сообщение об ошибке
, а дополнение, которое пишется когда памяти не хватило
и хочется понять где не хватило, но при чтении /proc/self/map выясняется что maps больше чем лимит...
https://github.com/ClickHouse/ClickHouse/blob/287262d5002106f537292a6b82477fae4e6b41ac/src/Common/Exception.cpp#L227
сколько у вас памяти на сервере вообще?ClickHouse/Exception.cpp at 287262d5002106f537292a6b82477fae4e6b41ac · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
-
-
-
А кто-нибудь из nodejs пользовался ClickHouse’ом? Вот здесь 2 библиотеки рекомендуются: https://clickhouse.tech/docs/en/interfaces/third-party/client-libraries/. Ни в одной не вижу поддержки параметризованных запросов, а хотелось бы их, чтобы самому не экранировать параметры.Client Libraries | ClickHouse Documentation
Client Libraries from Third-party Developers Disclaimer Yandex does not maintain the libraries listed below and hasn’t d
-
Привет! Есть ли способ при аггрегации получить список значений колонки, соответствующий первым N значениям другой колонки (например timestamp)?
-
А разве в базе данных не должны хранится уже экранированные данные?
-
Если правильно тебя понял, может помочь функция groupArray(max_size)(column): https://clickhouse.tech/docs/ru/sql-reference/aggregate-functions/reference/grouparray/groupArray | Документация ClickHouse
groupArray Синтаксис: groupArray(x) или groupArray(max_size)(x) Составляет массив из значений аргумента. Значения в масс
-
Или вы собираетесь пользователям давать возможность добавлять данные? Мне кажется не лучая идея
-
да не, все проще const sql = “SELECT … “ + helloSqlInjection + “FROM …”
-
В Питоне, например, все норм
-
-
-
Я вас понял. Просто в CH данные вставляются подготовленные и не пользовательские. Поэтому там в принципе не может возникать подобные сложности. И выборки также, заранее подготовленные в которые параметры берутся не их querystring)
-
а почему сценарий с динамической фильтрацией - плохая идея для CH?
-
У вас должны быть асоцииации параметров их querystring и подготовленных, тогда не валидные параметры просто не попадут в запрос
-
Добрый день! Расскажите, пожалуйста, как сделать группировку по значениям массива?
У меня есть табличка, в ней поле foo со значениями number[]. Хочу сделать group by по каждому значению внутри таких массивов и посчитать их количество
пример:
test-1 | [1, 2]
test-2 | [2, 3]
>
1 | 1
2 | 2
3 | 1 -
Посмотри на функцию arrayJoin - должна помочь :)
-
-
Да, план такой. Из-за необходимости удаления. Поэтому я и засомневался в эффективном обновлении. Пока шлю данные в один поток. Если будет больше, то либо в коде надо это предусмотреть, либо брать collapsingVersioned. Думал так..
-
у вас так работает? просто у меня питон выдает ошибку
-
я не пробовал. Увидел доку только. Мне для ноды нужно
-
-
Вроде бы КХ конфиги на лету читает, так что можно просто удалить?
-
Ну удалил просто и пользователь остался, хотя в конфиге его не ((
-
Я бы попробовал тогда SYSTEM RELOAD CONFIG, хотя скорее всего это не про юзеров.
-
Ну в общем все автоматически, просто надо было подождать ). Спасибо за помощь
-
Ребят кто знает, что за fited?
select distinct city
from bd
where date(dtime) = '{some_date}' and fired -
fired? Вполне может быть каким-нибудь UInt8 полем. Аналогичная запись ... and fired=1.
-
Оказалось булевым, спасибо)
-
sysctl запустить как сказано
-
Всем привет, подскажите, пожалуйста, с чем может быть связана проблема
есть 3 шарда по 2 реплики, внутри каждого шарда replicated табличка,
но есть проблема что в один шард в разы больше пишется данных, хотя запись происходит в distributed табличку следующей структуры:
CREATE TABLE relap_logs.adroom_log
(
`creative_id` Int64,
`for_url_id` UInt32,
`position` UInt16,
`uid` FixedString(8),
`front_uid` FixedString(8),
`is_new_uid` UInt8,
`rec_id` FixedString(19),
`geo_code` String,
`country_code` FixedString(2),
`region_code` FixedString(3),
`city_name` String,
`device_type` Enum8('mac' = 1, 'pc' = 2, 'other_desktop' = 3, 'iphone' = 4, 'android_phone' = 5, 'ipad' = 6, 'android_tablet' = 7, 'other_mobile' = 8) DEFAULT CAST('other_desktop', 'Enum8(\'mac\' = 1, \'pc\' = 2, \'other_desktop\' = 3, \'iphone\' = 4, \'android_phone\' = 5, \'ipad\' = 6, \'android_tablet\' = 7, \'other_mobile\' = 8)'),
`alg_id` UInt16,
`adroom_id` UInt32,
`is_reload` UInt8,
`is_valid_session` UInt8,
`ctime` DateTime,
`event_date` Date,
`domain_id` UInt32,
`widget_id` UInt32,
`event_type` Enum8('show' = 1, 'view' = 2, 'click' = 3),
`adroom_type` Enum8('local' = 1, 'net' = 2, 'local2' = 3),
`payfor` Enum8('cpc' = 1, 'cpm' = 2, 'cpv' = 3, 'promo' = 4),
`relap_revenue` Float32,
`publisher_revenue` Float32,
`brand_safety_categories` Array(String)
)
ENGINE = Distributed('relap_cluster_1', 'relap_logs', 'adroom_log_replicated', adroom_id)
может кто-то подскажет, по какому принципу он распехивает по шардам данные основываясь на ключе шардирования?
Или где я мог ошибиться?( -
У меня нет рута на этой машине, к сожалению
-
остаток от деления adroom_id на число шардов, перекосы по данным лекго могут в таком случае
-
-
Народ можете помочь? Куда копать при возникновении такой ошибки:
Cause: ru.yandex.clickhouse.except.ClickHouseUnknownException: ClickHouse exception, code: 1002, host: clickhouse, port: 8123; Code: 122. DB::Exception: There was an error on [clickhouse-c-1:9000]: Code: 122. DB::Exception: Table columns structure in ZooKeeper is different from local table structure. (INCOMPATIBLE_COLUMNS) (version 21.9.2.17 (official build)). (INCOMPATIBLE_COLUMNS) (version 21.9.2.17 (official build)) -
-
блин, а вот это оч странно, посмотрел у меня там 83501 уникальных значений adroom_id (по которому шардируется)
-
CREATE TABLE test.test_database_sharded ON CLUSTER '{cluster}'
(
timestamp Date,
operator_id UInt64,
funds_movement_id String,
deposit Nullable(Decimal(16, 2)),
payment Nullable(Decimal(16, 2)),
is_deleted UInt8,
ver UInt64 DEFAULT toUnixTimestamp64Milli(now64(3))
)
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/{cluster}/test_database_sharded', '{replica}', ver)
PARTITION BY toYYYYMMDD(timestamp)
order by (timestamp, user_id, operation_id) -
-
а какая разница сколько уникальных значений? тут важно количество записей
-
у тебя где-то есть табличка с таким же путем /clickhouse/tables/{shard}/{cluster}/test_database_sharded ?
-
Да я ее создаю в начале
-
-
-
у вас Atomic?
не могло быть такого что уже пытались таблицу создать
а потом DROP без SYNC сделали с таким же именем?