- 01 April 2021 (116 messages)
-
да, будет писать на диск пока в readonly не придет
причины перехода в readonly
- сильное отставание реплик (одну выключили в другую вставляем, потом включили обратно, включенная реплика таблицы ReplicatedMergeTree будут read-only, сбои с ZK, нет коннекта между репликами для того чтобы куски данных скачивать)
- закончилось место на диске
- сбой диска и RO идет от файловой системы -
Коллеги, доброго утра!
Подскажите, какой клиент для тестирования SQL-запросов подойдёт для Clickhouse?
На данный момент я подключился через ODBC, и нашёл клиент ODBCQueryTool.
Подключение проходит, таблицы/столбцы в клиенте отображаются, но при написании самого простого запроса select * from tablename выводятся ошибки -
clickhouse-client самый native
но он под Linux \ MacOSX только
у вас какая OS ? -
-
dbeaver используйте или datagrip
только timeout настройте
и использование timezone принудительно задайте в advanced параметрах
ну либо через docker run --rm -it yandex/clickhouse-client:latest -h your_host -u user --password=password -
-
Большое спасибо!
Через DBEaver подключился, запросы выполняются. -
JDBC/ODBC Connection попробуйте - https://help.sap.com/viewer/4359a0ef221e4a1098bae432bdd982c1/4.2.7/en-US/45f08f116e041014910aba7db0e91070.html
-
Добрый день всем!
Меня такой ещё вопрос беспокоит.
Предположим, я делаю вставку в таблицу T1, есть матвью MV, которая подвешена на T1 и вставляет в T2. Если у меня возникает ошибка при выполнении кода MV во время вставки в T1, то в T2, очевидно, порция не вставится.
Вопрос в том, откатится ли также и вставка порции в T1? -
В клике нету транзакций. Engine Atomic вроде бы что-то про транзакции, но я хз, не тестил
-
Ну как бы ведь просто вставка пачки в одну таблицу атомарна. Вот у меня вопрос, атомарна ли она с производными вставками через MV.
-
она не то чтобы атомарна
она просто есть 1 файл -
Ну да, тут наверное некорректно говорить атомарно. Но суть в том, что либо принимается целиком, либо нет, если вставляется записей меньше 1млн (вроде такая там есть настройка).
-
Всем привет. Народ подскажите пожалуйста как подружить clickhouse с Google analytics ...
1. Хотим выгрузить сырые исторические данные из GA в кликхауз через API Google analytics и питон
2. Заливать пару раз в сутки новые данные из GA в кликхауз.
Ну а потом уже использовать данные в КХ для строительства дашбордов в power bi.
Кто-то может подсказать куда копать по этим двум пунктам ? -
всем привет, clickhouse - 20.10.3.30, есть таблица ReplacingMergeTree, которая занимала 450гб.
В ней удалили лишние строки и она стала весить 291гб, судя по запросу в system (raw_data │ 291.67 GiB)
Но на диске по факту таблица всё так же жирная -
du -hs /var/lib/clickhouse/store/f8b/
608G /var/lib/clickhouse/store/f8b/
optimize table rtb.raw_data final - отрабатывает нормально. Жду потом больше 10 минут, свободное место изменяется в пределах 5гб +-.
запускаю ещё один optimize и перестало хватать места на него -
OPTIMIZE TABLE rtb.raw_data PARTITION 20210311 FINAL
Received exception from server (version 20.10.3):
Code: 388. DB::Exception: Received from 127.0.0.1:9000. DB::Exception: Cannot OPTIMIZE table: Insufficient available disk space, required 57.87 GiB. Cannot select parts for optimization
свободного места 49гб
сколко нужно свободного места, чтобы нормально сделать OPTIMIZE у такой таблицы? -
1- он отдает сырые данные?
а что не так? тем же питоном и заливайте -
-
Сейчас забираю сырые данные из ga по API напрямую в power bi без промежуточной базы данных .
То есть , каждый когда в power BI запускается обновление данных , то тянутся сырые данные из GA за весь исторический период, а не за последние дни или часы....
Ну и понятно , что такая схема архи ненадёжная , тк когда каждый раз тянешь по 10-20 млн строк , то всегда есть риск , что API Гугла отвалится...
Поэтому , хочется сделать промежуточную базу для хранения один раз скачанных исторических данных из ga...
я в clickhouse вообще новичок , только вчера поставил его на виртуалке , чтобы поэкспериментировать, поэтому опыта по вытягиванию данных в него около нуля.
Мне бы какой-нибудь пример скрипта на питоне , который тянет данные по любой одной метрике из ga и кладёт в кликхауз ... -
Я чесно не оч понимаю какие сырые данные вы там нашли, ga по умолчанию не отдает сырых данных никаких.
Если вы совсем новичок начните с этой библиотеки https://github.com/kszucs/pandahouse на вход принимает pandas data frame пишет в нужную таблицу в кх.GitHub - kszucs/pandahouse: Pandas interface for Clickhouse databasePandas interface for Clickhouse database. Contribute to kszucs/pandahouse development by creating an account on GitHub.
-
Я забираю данные по хитам/ сессиям/ кликам без сэмплирования и с ga:client id.
Это и называю сырыми данными.
Если в самом ga строить отчеты за большие периоды , то они получаются с сэмплированием -
пнтн ну это не сырые данные,если нужно избавиться от семплирования то можно посмотреть в сторону Big query, там есть удобная связка с GA
-
За пандахауз спасибо. С ней немного работал для того , чтобы
вытянуть данные из самого кликхакза в питон
А как залить данные из ga в кликхауз ? -
Хорошо, а что такое сырые данные ?
-
экспортом через API
или из BigQuery OWOX BI такое умеет и databricks
ну или для новых данных сделать рестриминг данных в clickhouse напрямую
https://bitbucket.org/clickhouse_pro/ga2clickhouse/src/develop/
но последний проект заброшен -
Да я понимаю , что экспортом через апи.
Это же очевидно.
Нужен хотя бы пример рабочего кейса , чтобы понять как этот " экспорт через апи " написать под свои нужды. -
-
Добрый день! Нужна помощь 😞
создал справочник с полем username String
при попытке заселектить получаю ошибку Could not convert string to m: 't.test4' -
Судя по ошибке вам 9 гб не хватает
-
Required 57gb. Попробуйте докинуть места
-
ClickHouse/ClickHouse description changed: v20.8.15.11-lts
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v20.8.15.11-lts
Release notes:
ClickHouse lts release v20.8.15.11-ltsRelease v20.8.15.11-lts · ClickHouse/ClickHouseClickHouse lts release v20.8.15.11-lts
-
Всем привет, нужна помощь https://ru.stackoverflow.com/questions/1264543/%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B0-clickhouse-code-10-e-displaytext-dbexception-not-found-column-eqОшибка ClickHouse Code: 10, e.displayText() = DB::Exception: Not found column equals(catalog_id, 1041) in block
Имеется Materialized база, данные реплицируюся нормально, в базе данные есть Если выполнить запрос SELECT DISTINCT P.id, P.name, P.catalog_id FROM products P WHERE P.name ILIKE '%
-
странная ошибка, я бы попробовал убрать distinct и писал бы баг на гитхаб
-
Без DISTINCT та же ошибка
на гитхаб написал уже
https://github.com/ClickHouse/ClickHouse/issues/22432Ошибка ClickHouse Code: 10, e.displayText() = DB::Exception: Not found column equals(catalog_id, 1041) in block · Issue #22432 · ClickHouse/ClickHouseИмеется Materialized база, данные реплицируюся нормально, в базе данные есть Если выполнить запрос SELECT DISTINCT P.id, P.name, P.catalog_id FROM products P WHERE P.name ILIKE '%Легкие%&am...
-
-
-
Доброго дня, подскажите, бо уже голову сломал, в документации не нахожу ).
CREATE TABLE IF NOT EXISTS viewdb.DATABASECHANGELOGREP UUID '5f609046-5355-4fef-8bd2-8cba75e309a7' ON CLUSTER replicated
Вот эту строчку я получаю в логах клика, Но программеры шлют без UUID!
Вопроса собственно 2 - кто подставляет UUID (JDBC, сам CLICK?) - И как этого избежать, ненравится мне UUID - наглядность теряется... -
Кликхаус сам подставляет.
https://github.com/ClickHouse/ClickHouse/issues/6787
> И как этого избежать, ненравится мне UUID - наглядность теряется...
Никак, если использовать Atomic Database EngineAvoid locking in CREATE/DROP/RENAME TABLE; implement RENAME DATABASE · Issue #6787 · ClickHouse/ClickHouseThe idea is to store table data in unique directories that don't contain table name and link to them via symlinks. These directories will be refcounted and may live after table DROP if the ...
-
Можно создавать обычные базы
CREATE DATABASE test ENGINE=Ordinary; -
Привет всем, как узнать текущие настройки TTL на таблице?
-
Show create table
-
точняк, спасибо )
-
Коллеги, никто, случаем, не проводил обоснование и сбор агрументов о переходе на SSD под КХ, не поделитесь методикой, как правильнее замер роста поизводительности проводить для обоснования
-
или смотрет в сторону шардов? увеличение производительности засчет шардов, обоснованней по расходам замены хранилища на более быстрое
-
Шарды всегда дадут больше чем ССД. ИМХО. просто за счет распараллеливания.
-
смотрите куда у вас упираются запросы в IO или Процессор.
если проц - шарды.
если ИО - ССД -
в любом случае NVME которые могут писать/читать 2GB/s дадут какой-то импрувмент по сравнению с рейдом из 10 HDD.
-
Подскажите где я закосячил.
Почему в запросах различается user_count?
select work_shift
, plc
, count(distinct (username)) as user_count
, count(barcode) as track_count
from v_shift_statistics
where timestamp between toDate(1616533200) and toDate(1616792399)
and status in ('Сортировка')
GROUP BY work_shift, plc
HAVING track_count >= 200
ORDER BY work_shift, plc
select work_shift
, plc
, count(distinct (username)) as user_count
, count(barcode) as track_count
from v_shift_statistics
where timestamp between toDate(1616533200) and toDate(1616792399)
and status in ('Сортировка')
GROUP BY work_shift, plc, username
HAVING track_count >= 200
ORDER BY work_shift, plc -
GROUP BY work_shift, plc, username
-
группировка разная -> разные каунты в группах
-
-
Добрый день. Такой баг появляется иногда. Кто сталкивался может, что делать? Или может есть предложения как такому помочь?
2021.03.31 08:19:58.217933 [ 521668 ] {} <Fatal> BaseDaemon: 10. DB::PipelineExecutor::tryAddProcessorToStackIfUpdated(DB::ExecutingGraph::Edge&, std::__1::queue<DB::ExecutingGraph::Node*, std::__1::deque<DB::ExecutingGraph::Node*, std::__1::allocator<DB::ExecutingGraph::Node*> > >&, std::__1::queue<DB::ExecutingGraph::Node*, std::__1::deque<DB::ExecutingGraph::Node*, std::__1::allocator<DB::ExecutingGraph::Node*> > >&, unsigned long) @ 0xf91081c in /usr/bin/clickhouse
2021.03.31 08:19:58.217944 [ 521668 ] {} <Fatal> BaseDaemon: 11. DB::PipelineExecutor::prepareProcessor(unsigned long, unsigned long, std::__1::queue<DB::ExecutingGraph::Node*, std::__1::deque<DB::ExecutingGraph::Node*, std::__1::allocator<DB::ExecutingGraph::Node*> > >&, std::__1::queue<DB::ExecutingGraph::Node*, std::__1::deque<DB::ExecutingGraph::Node*, std::__1::allocator<DB::ExecutingGraph::Node*> > >&, std::__1::unique_lock<std::__1::mutex>) @ 0xf910f09 in /usr/bin/clickhouse
2021.03.31 08:19:58.217959 [ 521668 ] {} <Fatal> BaseDaemon: 12. DB::PipelineExecutor::executeStepImpl(unsigned long, unsigned long, std::__1::atomic<bool>*) @ 0xf914500 in /usr/bin/clickhouse
2021.03.31 08:19:58.217971 [ 521668 ] {} <Fatal> BaseDaemon: 13. ? @ 0xf919005 in /usr/bin/clickhouse
2021.03.31 08:19:58.217983 [ 521668 ] {} <Fatal> BaseDaemon: 14. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x86415ed in /usr/bin/clickhouse
2021.03.31 08:19:58.217995 [ 521668 ] {} <Fatal> BaseDaemon: 15. ? @ 0x86451a3 in /usr/bin/clickhouse
2021.03.31 08:19:58.218014 [ 521668 ] {} <Fatal> BaseDaemon: 16. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
2021.03.31 08:19:58.218032 [ 521668 ] {} <Fatal> BaseDaemon: 17. clone @ 0x122293 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
2021.03.31 08:19:58.311156 [ 521668 ] {} <Fatal> BaseDaemon: Checksum of the binary: F6479E166DD7E8ABFA19525726186F71, integrity check passed.
2021.03.31 08:21:00.535666 [ 96473 ] {} <Fatal> Application: Child process was terminated by signal 11. -
-
Какая версия кх
-
Использую облако
-
В вашей версии оно не поддерживается еще емнип
-
-
Ну если ориентироваться, то лучше пока выбрать 21.1
В 21.3 пока еще много сюрпризов
https://altinity.com/blog/clickhouse-altinity-stable-release-21-1ClickHouse Altinity Stable Release 21.1The latest ClickHouse Altinity Stable Release 21.1 introduces significant new security features like LDAP external users directory, AES encryption functions along with MergeTree features, SQL compatibility, backward incompatible changes, and more.
-
-
Почитайте только изменения и рекомендации для миграции
-
Работает! WITH test1 AS (SELECT * FROM orders) SELECT * FROM test1;
-
Ага, только помните что кх не умеет кэшировать/переиспользовать результат CTE которая возвращает таблицу
-
-
Ага
-
-
https://github.com/ClickHouse/ClickHouse/issues/21992
В некоторых случая ценой небольших костылей можно избежать этогоIndentical subqueries (or CTE) execute only once. (condition pushdown) · Issue #21992 · ClickHouse/ClickHouseAfter #2301 fix, clickhouse execute sub queries from single level of query only once. But it doesn't work in case we are using that sub query in WHERE condition and that conditions is being...
-
ZSTD
-
что 521668 делал до этого?
-
всем привет!
подскажите пожалуйста
DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Malformed message: Invalid HTTP version string, Stack trace (when copying this message, always include the lines below) -
с чем такие ошибки могли быть связаны?
-
началось такое после того как OOM прибил кх по одной реплике по каждому шарду
-
оставшиеся выжившие реплики отстали репликацией и доганялись с такими ошибками
-
и такое вдобавок
2021.04.01 07:36:54.338061 [ 46219 ] {} <Error> stats.teaser_statistics_summ_1585052081: DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 84, e.displayText() = DB::Exception: Directory /var/lib/clickhouse/data/stats/teaser_statistics_summ_1585052081/tmp_fetch_20210401_23646_23646_0/ already exists., Stack trace (when copying this message, always include the lines below) -
может кто знает, почему запрос всякие опострофы возвращает таких образом? типа юникод наверное, но почему не в нормальном виде? это при создании таблицы надо было что-то может сделать или при вытаскивании?
-
это нормально
-
это баг. Можно удалить вручную этот каталог
-
а что КХ клиент показывает? КХ ничего не делает с кодировками, какой поток байт записали такой и отдает, String это просто поток байт, туда что угодно напихать.
-
Спасибо!
-
типа если данные вернуть через php скрипт какой-нибудь, то типа будет все хорошо? правильно понимаю? т.е. включать юникод поддержку на уровне таблицы при создании не нужно... ну ок, сейчас попробую
-
#вакансия #мтс #fulltime
Всем привет!
Команда МТС IT находится в поиске нового коллеги, Разработчика баз данных для участия в проекте, связанном с потоковой обработкой данных (Big Data).
Вилка: от 100 т.р.
Удалёнка: есть
Город: не имеет значение
Задачи:
• сопровождение, доработка и разработка новых схем для СУБД Clickhouse, MySQL;
• проектирование, разработка, анализ, оптимизация архитектуры баз данных, структур данных, таблиц, словарей, ETL процессов;
• анализ параметров оптимальности работы БД;
• участие в проектировании и построении отказоустойчивой инфраструктуры;
• консультации разработчиков ПО.
От Вас мы ждём:
• Опыт проектирования схем БД;
• Опыт оптимизации запросов;
• Опыт поиска узких мест выполнения запросов;
• Опыт тестирования, как нагрузочного, так и целостности изменений;
• Опыт работы с Git flow;
• Опыт использования различных инструментов аналитики данных.
Будет плюсом: опыт работы в телеком компании.
Резюме и вопросы:
Телеграм: @slizkovaa
Почта: ayslizko@mts.ru -
Всем привет!
Подскажите пожалуйста, с каким форматом движок HDFS поддерживает Nested-структуры и Array()?
clickhouse v20.8.14.4-lts, пытаюсь импортировать примерно таким образом:
CREATE TABLE hdfstable AS hdfstabletemplate
ENGINE = HDFS ('datafiles', 'JSONEachRow');
INSERT INTO anothertable SELECT * FROM hdfstable;
И ругается как-раз на nested-поля: Unknown field found while parsing JSONEachRow format: nested_field_name ... -
Всем привет! Кто-нибудь пробовал применять REPLACE из документации https://clickhouse.tech/docs/en/sql-reference/statements/create/table/#replace-table-query
CREATE DATABASE test_base ENGINE = Atomic;
CREATE OR REPLACE TABLE test_base.t2 (n UInt64, s Nullable(String)) ENGINE = MergeTree ORDER BY n;
INSERT INTO test_base.t2 VALUES (2, null);
INSERT INTO test_base.t2 VALUES (3, null);
SELECT * FROM test_base.t2;
REPLACE TABLE test_base.t2 SELECT * FROM test_base.t2 WHERE n < 3;
Ожидалось, что получим test_base.t2 с одной записью n = 2.
Но в итоге падает ошибка DB::Exception: Syntax error: failed at position 28 ('SELECT'): SELECT * FROM test_base.t2 WHERE n < 3. Expected one of: storage definition, ENGINE, AS, UUID, OpeningRoundBracket, ON, Dot, token (version 21.3.4.25 (official build))TABLE | ClickHouse DocumentationCREATE TABLE Creates a new table. This query can have various syntax forms depending on a use case. By default, tables a
-
Hdfs тут вообще ни причем.
Надо понять что jsoneachrow это вообще не json -
У меня данные лежат в файлах, каждая строка - json, это же jsoneachrow формат, разве нет?
-
нет. В правительстве не дураки сидят, jsoneachrow != json
-
-
Я знаю, что jsoneachrow это не json, это на каждой строке валидный json
-
When using these formats, ClickHouse outputs rows as separated, newline-delimited JSON values, but the data as a whole is not valid JSON - именно так у меня данные и лежат
-
ну нет. Надо снова Engine и все такое указывать
-
проблема в том что Nested в jsoneachrow это два, 3, 5, n независимых массива
ваш json никак не лезет в jsoneachrow.
в jsoneachrow никаких вложенных элементов нет -
нет.
https://github.com/ndjson/ndjson-spec
такое в jsoneachrow нельзя {"may":{"include":"nested","objects":["and","arrays"]}} -
{
"field1":"1""nested_field":[
{
"w":240,
"h":400
},
{
"w":192,
"h":160
},
{
"w":240,
"h":120
}
]
} -
Ой , вот так
{
"field1":"1",
"nested_field":[
{
"w":240,
"h":400
},
{
"w":192,
"h":160
},
{
"w":240,
"h":120
}
]
} -
Перевести если в одну строку, конечно
-
jsoneachrow не кушает такое.
-
хм, логично
-
Понятно, а какой формат кушает? Avro или Protobuf?
-
TSV
-
О, хм. Попробовала с engine.
REPLACE TABLE test_base.t2 ENGINE = MergeTree ORDER BY n AS SELECT * FROM test_base.t2 WHERE n < 3;
Получаю DB::Exception: RENAME EXCHANGE is not supported (version 21.3.4.25 (official build))
Значит, что нужно ещё в настройках ClickHouse менять что-то или в принципе оставить надежду?
По документации не нахожу указаний. т_т -
Э. Поняла, нужен linux since 3.15.
-
это про Atomic Database, у вас видимо не атомик.
А вы вообще что делаете? Вы в какой-то дремучий лес залезли, все проще можно сделать, знать бы что вы делаете -
Проверяли функциональность REPLACE на Atomic Database. Нашли в документации фичу, хотели попробовать.)
-
у меня работает
REPLACE TABLE test_base.t2 ENGINE = MergeTree ORDER BY n as SELECT * FROM test_base.t2 WHERE n < 3; ;
SELECT * FROM test_base.t2
Ok. -
скорее всего нельзя делать select из самой себя
-
таблица создается до селекта и выбирается из новой таблицы
-
А какая у вас версия линукса на серверах с кликхаусом стоит?
Нашла в исходном коде про 3.15, но было бы круто знать до какой обновляться, чтобы заведомо заработало. -
типа атомик не работает до 3.15?
у меня debian10
uname -a
Linux chdw1-4 5.6.0-0.bpo.2-amd64 #1 SMP Debian 5.6.14-2~bpo10+1 (2020-06-09) x86_64 GNU/Linux -
и ядро из бекпортов
-
Привет.
А при SELECT'ах как то используется информация о ключе шардирования указанном в Distributed таблице? -
Или CH безусловно пытается выполнить запрос на всех шардах, не пытаясь предсказать по ключу шардирования где они лежат?
-
по умолчанию на всех,
если вы уверены что данные шардированы, есть куча настроек
clickhouse-client --help|grep optimize|grep shard
--optimize_distributed_group_by_sharding_key arg Optimize GROUP BY sharding_key queries (by avoiding costly aggregation on the initiator server).
--optimize_skip_unused_shards arg Assumes that data is distributed by sharding_key. Optimization to skip unused shards if SELECT query filters by sharding_key.
--allow_nondeterministic_optimize_skip_unused_shards arg Allow non-deterministic functions (includes dictGet) in sharding_key for optimize_skip_unused_shards
--force_optimize_skip_unused_shards arg Throw an exception if unused shards cannot be skipped (1 - throw only if the table has the sharding key, 2 - always throw.
--optimize_skip_unused_shards_nesting arg Same as optimize_skip_unused_shards, but accept nesting level until which it will work.
--force_optimize_skip_unused_shards_nesting arg Same as force_optimize_skip_unused_shards, but accept nesting level until which it will work. -
у нас другая ситуация, лили данные шардируя вручную, потом понадобился JOIN двух distributed таблиц, мы то знаем, что обе таблицы на 1 шарде по ключу лежат, а вот clickhouse говорит, что только GLOBAL JOIN
-
Ну потому что в distributed ключ не указан был. Вот хотим указать ключ только ради join
-
так просто distributed_product_mode=local
-
то есть не надо ничего явно прописывать в distributed, clickhouse может поверить на слово, что данные на 1 шарде?
-
ничего не надо просто set distributed_product_mode=local и две таблицы дистрибьютид будут джойнится на прямо шардах
-
понял, большое спасибо, попробуем!
- 02 April 2021 (88 messages)
-
Спасибо большое, попробую
-
Добрый день, подскажите, функции arrayMax, arrayMin в какой версии появились ? В 20.12.4.5 пишет unknown function
-
Здравствуйте! Подскажите пожалуйста кто то использует плагин для Clickhouse data source в Grafana:
https://github.com/Vertamedia/chtable
Не могу использовать плагин. У плагина стоит label Unsigned и при попытке создание панели используя этот же плагин получаю ошибку:
An unexpected error happened TypeError: Cannot read property ‘emit’ of undefinedGitHub - Vertamedia/chtable: Grafana's table plugin for ClickHouseGrafana's table plugin for ClickHouse. Contribute to Vertamedia/chtable development by creating an account on GitHub.
-
всем привет, можно ли при создании таблицы указать в ORDER BY asc или desc?
-
плагин очень старый.
Unsigned это в новых grafana ввели механизм подписи для плагинов
можно попробовать
выставить переменную окружения GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=vertamedia-chtable
или в grafana.ini выставить
[plugins]
allow_loading_unsigned_plugins=vertamedia-chtable
насчет ошибки с TypeError, без полного стектрейса сложно догадаться, возможно какая то несовместимость
сделайте issue на github
доберутся руки может быть попробую решить -
Да сделал уже issue сегодня.
Эту попробовал но не вышло allow_loading_unsigned_plugins=vertamedia-chtable -
нет, это не имеет смысла
ORDER BY для таблицы действительно служит для сортировки вставляемых данных
но эта сортировка всего лишь позволяет через min max алгоритмы при чтении *.mrk быстро отбрасывать *.bin файлы или быстро находить смещение внутри .bin файлов для распаковки из data parts, таким образом снижая кол-во чтений из диска
и для этой операции не важно будет у вас прямой порядок сортировки или обратный... -
после того как grafana.ini поменяли сервер графаны рестартовали?
как grafana запускается? у вас отдельная система? контейнер? что-то еще? -
Всё можете посмотреть тут вот
-
Этой полный докер проект именно с этим плагином
-
вам именно функции эти нужны или результат? arrayReduce не помогает?
-
Спасибо, arrayReduce можно использовать. arrayMax в документации есть, хотел проверить.
-
-
Обновил CH до 21.3.4.25 и завелись Nested в Protobuf
-
-
1. В настройке кх раскоментируйте опцию listen 0.0.0.0
2. В настройках драйвера для кх бобра выключите сжатие
По умолчанию сервер слушает только локалхост. -
Подскажите пожалуйста раскоментировать это так?
-
-
-
-
default
-
-
-
файл users.xml
-
прмо там пароль нужно задавать? Я пытался через запрос ALTER USER default IDENTIFIED BY '123'
-
-
можно и так
-
-
Добрый день! У меня есть 5 полей в таблице:
host, port, ip, body, user_agent
При SELECT * FROM table все поля выводится в 5 колонках.
Подскажите, пожалуйста, возможно ли сделать так, чтобы эти 5 полей вывести в 3 колонках объединяя некоторые?
Например я хочу объединить полей host, port и ip и вывести их в таком виде: -
Грубо говоря:
SELECT [host, port, ip], body, user_agent
FROM … -
А как то можно задавать название для полей host, port и ip для понимание что за значение?
-
concat()
-
Понятно, попробую организовать. Спасибо!
-
Всем привет! Кто-то может поделиться инструкцией, как установить clickhouse? Мне выдали доступ к клауду, а дальше разобраться не получается.
-
Общие инструкции здесь https://clickhouse.tech/docs/ru/getting-started/install/
Какое облако, не яндексовое?Установка | Документация ClickHouseУстановка Системные требования ClickHouse может работать на любой операционной системе Linux, FreeBSD или Mac OS X с арх
-
Спасибо, я это видела, ещё не пробывала. ))
-
есть такое
SELECT formatRow('JSONEachRow', ip, host,port) j, body,user from (select 1 ip, 2 host, 3333 port , 'a' body, 'x' user) ; -
будет. Engine=JOIN хранит данные в ОЗУ в хеш-таблице, которая нужна для джойна.
-
Да, спасибо! Решил задачу)
-
Спасибо за ответ)
-
Привет.
Есть список id-шек в коде. И есть табличка c плохими id-шкам BadIDs.
CREATE TABLE BadIDs
(
`ID` UInt64,
)
ENGINE = MergeTree()
ORDER BY ID
Не могу придумать, как написать запрос, который получит список ID-шек и вернёт только те из них, которые НЕ СОДЕРЖАТСЯ в таблице с плохими BadIDs. -
not in ?
anti join ? -
Да, но как засунуть эти ID-шки в запрос, чтобы они стали "стобцом таблицы"
-
arrayjoin
-
select * from (select arrayJoin([1,2,3,4]) x) where x not in (...)
-
Спасибо!
-
Привет!
Удалось ли решить? -
Доброго дня!
А через DBeaver можно как-то посмотреть EXPLAIN? -
в итоге запрос оказался вот таким:
SELECT ID
FROM GoodIDs
WHERE ID IN
(
SELECT ID
FROM
(
SELECT arrayJoin(arrayMap(x -> toUInt64(x), [1, 2, 3, 4])) AS ID
)
WHERE ID NOT IN
(
SELECT ID
FROM BadIDs
)
) -
-
-
да, в зависимости от того что передали в массив
-
-
-
можно через cast ещё преобразовать
-
-
так выходит много лишнего в памяти ИМХО
-
не совсем понял почему?
-
исходный запрос:
SELECT arrayJoin(arrayMap(x -> toUInt64(x), [1, 2, 3, 4])) AS ID
получил данные массива, преобразовал их к нужному типа и потом исходный массив уже не нужен его можно из памяти удалить.
SELECT
arrayJoin([1, 2, 3, 4]) AS ID,
toUInt64(ID) AS ID2
тут ОБА столбца в доживают до конца запроса , а не только нужный. -
-
так может и лучше будет. И нагляднее. Спасибо!
-
Всем привет,нужен совет
Нужно забекапить таблицы
В базе табличка весит в районе 6гб
При выгрузке в файл (format tabsepareted) в районе 30 гб
Вопрос,в каком формате лучше выгружать,чтоб файл меньше весил,но при этом без проблем можно было восстановить? -
Попробуйте Native
-
Ещё уточняющий вопрос,может глупый,но все же: если понадобится восстановить данные допустим на другом сервере с новыми версиями кх,с этим форматом проблем не будет?
-
Может кто подскажет, почему КХ перестает читать их кафки если отваливается один брокер? Брокера 3, фактор репликации 2. Все брокеры перечислены в списке
-
проблем не будет. Но все равно надо жать, native не сжимает, просто напишите |gzip -3 >myfile.native.gzip
-
какая версия КХ? detach / attach kafka таблицы помогает?
-
Спасибо
-
20.6...
-
ну и как-то цеплять отцеплять не очень кашерно. Ну отвалился брокер, должно дальше работать
-
Добро времени суток
Подскажите, пожалуйста. Такое можно залечить ?
SELECT ...
if( CTR > 0 , ( Sub4.mon / CTR ) * 1000 , 0 ) as eC
JOIN ... Sub4
Спотыкается вот на этом - Sub4.mon
Ошибка такого плана - DB::Exception: Invalid types of arguments 2 and 3 of if (version 20.9.3.45 (official build)) -
судя по всему у вас второй параметр - флоат, а третий инт. надо, чтобы одинаковые типы были
-
Так точно. Залечилось. Спасибо.
-
Я аналирую проблему и задаю вопросы, что бы вам ответить номером тикета
-
короче в современных версиях это починено, причем мне кажется это починено и в 20.6 но в последних 20.6
-
Всем доброго пятничного вечерочка. Подскажите такой момент, CH читает из кафки даанные, кафка как кластер собрана с тремя брокерам, все три брокера прописаны в CH в кафка таблице, я убиваю именно того брокера к какому CH подключен в это время рвутся коннекты в логах CH и он сам переподкллючается к другому брокеру. Так и должно быть? По-другому никак без разрыва соединений? Вот то что в логах
-
Кафка энджин должен читать со всех, если вы верно его настроили
-
Да но в конкретный момент времени он только с координатора и читает.
-
Я его грохаю координатора, у топика кафка назнаачает другого и CH переподключается
-
Ну попробуйте свой конфиг кх энджин показать
-
ENGINE = Kafka
SETTINGS kafka_broker_list = 'kafka-0.internal.aechannel.com:31190,kafka-1.internal.aechannel.com:31191,kafka-2.internal.aechannel.com:31192', kafka_topic_list = 'prod.Trackers_s01_v1', kafka_group_name = 'TrackersGroup_s01_v1', kafka_format = 'Protobuf', kafka_schema = 'logentries_v1:TrackerLogRecord', kafka_num_consumers = 5 -
Тут вроде все ок
-
Ну в общем connection refused по-любому будет?
-
и replication factor =3 ?
Как КХ без переподключения может читать с другого брокера? И зачем ?
Там при смерти брокера начинаются ребалансы и партиции все равно будут переназначены -
RF=2
-
Три накладно немного по диску выходит
-
ну значит невозможно с 1го брокера читать
непонятно что вы хотите и в чем проблема. Адреса кафка брокеров, это не адреса откуда читать данных, это адреса куда подключится чтобы узнать конфигурацию кафки, дальше кафка скажет куда ходить за какими партициями. -
Да я понимаю, вроде больше не хочу ничего. Все правильно работает. Спасибо!
- 03 April 2021 (8 messages)
-
Привет! Подскажите пожалуйста самый простой способ получить все комбинации длины 2 для Array(int)
-
Да, у нас прокси-сервер блочил наше подключение.
-
Добрый день! Можете подсказать что за ошибка выходит при импорте csv ?
-
судя по всему в поле ожидается дата, а в данных за ней идет время
-
-
спасибо)) да проблема была в этом
-
Можете подсказать по clickhouse-jdbc-bridge. Мне нужно добавить драйвер Oracle. Его нужно положить в папку drivers в clickhouse-jdbc-bridge или clickhouse-jdbc-bridge/config? Нужно ли его где пописывать или он автоматически подцепится?
-
https://github.com/ClickHouse/clickhouse-jdbc-bridge/blob/master/misc/quick-start/docker-compose.yml
Папка /driversClickHouse/clickhouse-jdbc-bridgeA JDBC proxy from ClickHouse to external databases - ClickHouse/clickhouse-jdbc-bridge
- 04 April 2021 (17 messages)
-
На каждую строку данных или для одного конкретного массива?
-
arrCol id
[1, 2, 3] 1
[5, 6, 7] 2
a b id
1 2 1
1 3 1
2 3 1
5 6 2
6 7 2
5 7 2
Я пока сделал через ArrayJoin + Self join -
То есть ровно две строки данных на входе, два столбца на выходе?
-
На входе колонка типа Массив
На выходе две колонки с комбинациями элементов массива
Думаю можно через лямбду с двумя range пузырьком сделать :)
И потом arrayjoin -
То есть независимые комбинации для каждого массива. И длина массивов не фиксирована?
-
WITH arrayJoin(arrayFlatten(arrayMap(x -> arrayMap(y -> (x, y), arrayFilter(y -> (y > x), arrCol)), arrCol))) AS combinations
SELECT
combinations.1 AS a,
combinations.2 AS b,
id
FROM
(
SELECT
[1, 2, 3] AS arrCol,
1 AS id
UNION ALL
SELECT
[5, 6, 7],
2
) -
Привет.
А можно ли просто SELECT сделать поверх CSV не вставляя в табличку никакие данные? -
Какой-нибудь SELECT count(*) FROM <csv here>
-
См. табличные функции?
-
File | ClickHouse Documentation
File Table Engine The File table engine keeps the data in a file in one of the supported file formats (TabSeparated, Nat
-
Да, видел file(), но как я понял, это если файл хранится на машине кластера. А у меня в Облаке CH, доступа прямого к нему нет
-
хотя
-
Понял, спасибо большое!
-
s3 | ClickHouse Documentation
S3 Table Function Provides table-like interface to select/insert files in Amazon S3. This table function is similar to h
-
Ага, спасибо!
-
clickhouse-local | Документация ClickHouse
clickhouse-local Принимает на вход данные, которые можно представить в табличном виде и выполняет над ними операции, зад
-
Вот оказывается что есть
- 05 April 2021 (162 messages)
-
-
CREATE TABLE table_name
(
...columns
) ENGINE = MergeTree()
ORDER BY expr
PARTITION BY expr
PRIMARY KEY expr
...
Смотрите: https://clickhouse.tech/docs/ru/sql-reference/statements/create/table/, и документацию по конкретным движкам. Например:
https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/mergetree/Таблица | Документация ClickHouseCREATE TABLE Запрос CREATE TABLE может иметь несколько форм, которые используются в зависимости от контекста и решаемых
-
Речь, видимо, про comment_expression. К таблицам ничего подобного не наблюдал.
-
описать в смысле прокомментировать?
нет такого нет
в оригинальном issue реализовали только https://github.com/ClickHouse/ClickHouse/issues/1815
а вам такая функция зачем?
у вас сгенерированные названия таблиц по которым непонятно что они означают?COMMENT for table definition · Issue #1815 · ClickHouse/ClickHouseAdd optional COMMENT clause to CREATE query. Example: CREATE ... COMMENT 'abc' It's mostly ignored. The only purpose is to be written to .sql file; to show in SHOW CREATE TA...
-
По названиям понятно, но пользователей много и удобно было бы дополнительно описывать таблицу. Но я так понял конкретно на таблицу коммент нельзя сделать.
-
к сожалению нет, забыли реализовать =)
-
Добавление комментариев на уровне таблиц (и других DDL объектов) уже в плане работ, будут добавлены в апреле-мае
-
Всем привет, никто не сталкивался с такой проблемой, когда клиент начинает писать в базу, все ноды в кластере начинают выдавать такое(всё пингуется, конфиги в норме, порты в файрволе открыты, хосты прописаны везде):
2021.04.05 12:30:47.329182 [ 414003 ] {} <Error> DB.table (45b2b589-fe3e-4775-80d5-710ee0181176): auto DB::StorageReplicatedMergeTree::queueTask()::(anonymous class)::operator()(DB::StorageReplicatedMergeTree::LogEntryPtr &) const: Poco::Exception. Code: 1000, e.code() = 113, e.displayText() = Net Exception: No route to host, Stack trace (when copying this message, always include the lines below): -
Ребят, привет, подскажите, если таблица была создана без партиций, могу я удалять старые данные просто удаляя папку 20190630_20190630_69740_69800_3, например?
-
<remote_servers>
в конфигах проверьте
у вас точно все ноды живые?
и <zookeeper> секции
у вас есть коннект до ZK ? SELECT * FROM system.zookeeper WHERE path='/'; что показывает? -
нет, так делать нельзя
убьете базу
что мешает сделать рядом новую таблицу с PARTITION BY перелить данные через INSERT INTO ... SELECT и потом удалить данные и сделать RENAME TABLE ?
еще есть такая вещь как TTL
https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/mergetree/#mergetree-table-ttl
его можно через ALTER TABLE для таблицы добавитьMergeTree | ClickHouse DocumentationMergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
спасибо, база сделана, сделана также ддля просмотра merge, просто данных ОЧЕНЬ много, а места не так много для двойного использования на время переноса, хотелось чистить по мере устаревания
-
ТТЛ тоже сделан в новой таблице, данные теперь пишу в нее, вот думаю, как поступить со старой.
-
а старую таблицу можно добавлять TTL через ALTER TABLE
а потом делать MATERIALIZE TTL -
в старую таблицу можно TTL тоже добавить
https://clickhouse.tech/docs/en/sql-reference/statements/alter/ttl/
пример ALTER TABLE ... MATERIALIZE TTL
https://github.com/ClickHouse/ClickHouse/blob/ac989f3a8fe8e2135e25ac7d6e340b048092e906/tests/queries/0_stateless/01070_materialize_ttl.sql
места на диске для этого надо x2 на размер самого большого data part
SELECT database, table, partition, name, formatReadableSize(bytes_on_disk) FROM system.parts ORDER BY bytes_on_disk DESC LIMIT 10;TTL | ClickHouse DocumentationManipulations with Table TTL MODIFY TTL You can change table TTL with a request of the following form: ALTER TABLE table
-
встарую добавить не получилось, поскольку создана старым методом
-
ну =(
тогда только мучиться
https://github.com/ClickHouse/ClickHouse/issues/14576Migrating data from old Merge Tree Syntax · Issue #14576 · ClickHouse/ClickHouseHello Everyone, I have a table with this signature i will name it as TABLE1 ENGINE = MergeTree(BookingDate, (Year, EmailID, RouteID, OperatorId, TIN, JourneyDate, BookingDate), 8192) and this table...
-
именно :) но я не опускаю руки) попробую составить скрипт для крона с командой DELETE
-
за ,aterialize спасибо, посмотрю с чем его едят
-
я не уверен что TTL и мутации нормально работают со старым синтаксисом...
но попробуйте, расскажите если что то получится
хотя бы на пустых данных попробуйте локально сначала -
Добрый день!
Подскажите какой быстрый способ передачи данных с HDFS в CH?
Версия клика 20.8.4.11. Данные в ORC -
С каждой из нод кластера позвать импорт через функцию hdfs(), предварительно "распилив" список файлов.
-
🤔интересно, спасибо.
А есть подводные камни, как при задержке по сети себя ведет? Допустим если timeout пришел, он пытается прочитать файл с того же места где остановился или читает заново? -
Все живые, все пингуются, телнет проходит, ноды ЗК тоже в норме, селект отобразил норм значение что ЗК есть в нодах кх
-
Всем хорошего понедельника! На улице — весна, и Альтинити активно растет, чтобы помогать делать ClickHouse еще лучше. Кому интересно, посмотрите https://altinity.com/job/clickhouse-support-data-engineer и другие вакансии. Вопросы можно мне в личку.ClickHouse Solutions Engineer
Altinity is looking for database geeks able to assist users in building ClickHouse apps. Strong DBMS and problem-solving required.
-
Всем привет.
Подскажите по deduplicate, пожалуйста, а то никогда им не пользовался.
Потерял часть данных из потока, вычитал их заново из кафки в соседнюю таблицу. Хочу вставить данные из таблицы с повторно вычитанными данными в основную с перекрытием по времени (т.е. потерял за полдня, вставлю за день), а потом запустить deduplicate final.
Вопрос - если в основной таблице более 100млрд записей (вставлять буду миллионов 600) и добавление новых не останавливается, deduplicate final не уронит её? -
полный стектрейс расшарьте
-
0. Poco::Net::SocketImpl::error(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x10a90034 in /usr/bin/clickhouse
1. Poco::Net::SocketImpl::connect(Poco::Net::SocketAddress const&, Poco::Timespan const&) @ 0x10a9040b in /usr/bin/clickhouse
2. Poco::Net::HTTPSession::connect(Poco::Net::SocketAddress const&) @ 0x10a64176 in /usr/bin/clickhouse
3. Poco::Net::HTTPClientSession::reconnect() @ 0x10a4cac5 in /usr/bin/clickhouse
4. Poco::Net::HTTPClientSession::sendRequest(Poco::Net::HTTPRequest&) @ 0x10a4b766 in /usr/bin/clickhouse
5. DB::detail::ReadWriteBufferFromHTTPBase<std::__1::shared_ptr<DB::UpdatablePooledSession> >::call(Poco::URI, Poco::Net::HTTPResponse&) @ 0xe055459 in /usr/bin/clickhouse
6. DB::detail::ReadWriteBufferFromHTTPBase<std::__1::shared_ptr<DB::UpdatablePooledSession> >::ReadWriteBufferFromHTTPBase(std::__1::shared_ptr<DB::UpdatablePooledSession>, Poco::URI, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void (std::__1::basic_ostream<char, std::__1::char_traits<char> >&)>, Poco::Net::HTTPBasicCredentials const&, unsigned long, std::__1::vector<std::__1::tuple<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::tuple<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >, DB::RemoteHostFilter const&) @ 0xe05211a in /usr/bin/clickhouse
7. DB::PooledReadWriteBufferFromHTTP::PooledReadWriteBufferFromHTTP(Poco::URI, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void (std::__1::basic_ostream<char, std::__1::char_traits<char> >&)>, DB::ConnectionTimeouts const&, Poco::Net::HTTPBasicCredentials const&, unsigned long, unsigned long, unsigned long) @ 0xe04e550 in /usr/bin/clickhouse
8. DB::DataPartsExchange::Fetcher::fetchPart(std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, 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::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, DB::ConnectionTimeouts const&, 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::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0xe04cef1 in /usr/bin/clickhouse
9. ? @ 0xdf482e6 in /usr/bin/clickhouse
10. DB::StorageReplicatedMergeTree::fetchPart(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, unsigned long, std::__1::shared_ptr<zkutil::ZooKeeper>) @ 0xdef1cec in /usr/bin/clickhouse
11. DB::StorageReplicatedMergeTree::executeFetch(DB::ReplicatedMergeTreeLogEntry&) @ 0xdeec247 in /usr/bin/clickhouse
12. DB::StorageReplicatedMergeTree::executeLogEntry(DB::ReplicatedMergeTreeLogEntry&) @ 0xded11f1 in /usr/bin/clickhouse
13. ? @ 0xdf453bc in /usr/bin/clickhouse
14. DB::ReplicatedMergeTreeQueue::processEntry(std::__1::function<std::__1::shared_ptr<zkutil::ZooKeeper> ()>, std::__1::shared_ptr<DB::ReplicatedMergeTreeLogEntry>&, std::__1::function<bool (std::__1::shared_ptr<DB::ReplicatedMergeTreeLogEntry>&)>) @ 0xe2296e5 in /usr/bin/clickhouse
15. DB::StorageReplicatedMergeTree::queueTask() @ 0xdf012cb in /usr/bin/clickhouse
16. DB::BackgroundProcessingPool::workLoopFunc() @ 0xe0487f3 in /usr/bin/clickhouse -
17. ? @ 0xe049331 in /usr/bin/clickhouse
18. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x7b6293d in /usr/bin/clickhouse
19. ? @ 0x7b66463 in /usr/bin/clickhouse
20. start_thread @ 0x82de in /usr/lib64/libpthread-2.28.so
21. clone @ 0xfbe83 in /usr/lib64/libc-2.28.so
(version 20.11.3.3 (official build)) -
есть такая штука, называется https://pastebin.com/ кидаете туда логи, а ссылку в чатPastebin.com - #1 paste tool since 2002!
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.
-
ну из стектрейса очевидно
DB::StorageReplicatedMergeTree::executeFetch
нода пытается скачать data part с другой ноды и не может до нее роутинг получить сетевой получить
Net Exception: No route to host
проверяйте <remote_servers>
все хосты на всех хостах
и вы случайно
interserver_http_host руками не меняли?
https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#interserver-http-host
grep -r interserver /etc/clickhouse-server/Server Settings | ClickHouse DocumentationServer Settings builtin_dictionaries_reload_interval The interval in seconds before reloading built-in dictionaries. Cli
-
-
Client Libraries | ClickHouse Documentation
Client Libraries from Third-party Developers Disclaimer Yandex does not maintain the libraries listed below and hasn’t d
-
спасибо
-
-
У вас таблица с партициями (по дате)
-
да уже ответили на мой вопрос, спасибо :) невозможно, если не была создана с партициями
-
Репликация не использует remote_servers
-
Ну drop partition в любом случае у вас возможен
-
Всем привет. Сразу извиняюсь за глупый вопрос, и ленивость тестить.
Если я делаю инсерт через http как это в доке указано
echo 'INSERT INTO t VALUES (1),(2),(3)' | curl 'http://localhost:8123/' --data-binary @-
И в одном из VALUES синтактическая ошибка или неверный тип данных. У меня ведь весь запрос не пройдет или зафейлятся только ошибочные строки? -
Зафейлится блок и все последующие, все предыдущие будут записаны.
-
-
Добрый день!
А подскажите, пожалуйста, из-за чего словарь может не обновляться ? или в какую сторону копать
сорс - вьюха из кх
LIFETIME(MIN 600 MAX 1800)
system reload dictionary - нету
Ожидается что будет по таймеру обновляться
Но сейчас на одной из нод, обновление не проходит. -
system reload dictionary - нету
в смысле не выполняется?
set send_logs_level='trace'
system reload dictionary; -
В смысле принудительного обновления не стоит, все зашито на Lifetime
-
Посмотрите в system.dictionaries может exception есть
-
mysql8 ?
-
Извиняюсь не понял вопроса
Если про сорс то словарь
смотрит на Вьюху в кх -
Спасибо, сейчас гляну
-
блок это по умолчанию 1000000 записей
то есть для коротких INSERT считайте что все зафейлится -
У меня есть поле BigDecimal, мне его нужно перемножить на литерал, потом сагрегировать. Для результата мне сгодится точность double в этом месте. Что будет эффективнее - конвертировать после вычитывания во Float64 и потом делать манипуляции с умножением сложением или оставить как BigDecimal? Есть тест через clickhouse benchmark - он говорит, что все одинаково.
-
Добрый день.
Есть кластер из 12 нод, на всех реплики (отказаустойчивость в деле), отдельно прокся-балансировщик.
Обновили CH с версии 20.3.8.53 --> 21.1.7.1
Начали падать часть запросов с global join (не находило поля из правой таблицы)
Методом тыка выставили optimize_skip_unused_shards = 0 (было 1) и заработало. Но теперь другая проблема, некоторые запросы падают по памяти. Почитали, в 20.3.8 была настройка max_memory_usage_for_all_queries = 34 Gb, сейчас её заменили на max_server_memory_usage через max_server_memory_usage_to_ram_ratio, выставили чтоб на выходе было чуть более предыдущих 34 Gb и всё равно на случайных нодах запрос упирается в этот предел. Так понимаю, что на некоторые нодах прилетает несколько больших запросов, которые не пролезают по памяти и что не пролезает - падает. (would use 35.41 GiB (attempt to allocate chunk of 1073741824 bytes)). Соответственно вопрос, как можно решить проблемы кроме как увеличивать тотал используемой ОЗУ? Стоит лимит на один запрос 10 ГБ, кроме этого что-то можно придумать? Какую-то очередь больших запросов сделать? -
хм, даже если их не упоминалось при создании? видимо по имени папки?
-
вы о чем вообще? В старом синтаксисе нельзя создать таблицу без партиций. Show create table в студию
-
на самом деле нет
-
Добрый день,
Можно ли добавить новую запись, но чтобы обновились только определенные столбцы, а остальные подтянулись из предыдущего?
Использую ReplacingMergeTree
Как пример:
event_1(uuid, column_1, column_2, column_3, column_4, column_5)
event_2(uuid, column_4, column_5) -
BigDecimal в КХ ? Наверное просто decimal, умножайте Decimal
-
-
нет.
Можно через aggregatingMergeTree если табличка крохотная -
ну первичный ключ вообще не сжат, если вопрос про первичный ключ
-
да, то есть смысла нет ставить ему сжатие?
-
это сложный вопрос, если читать с медленного диска то ZSTD лучше потому что читать меньше, но LZ4 конечно несколько быстрее на декомпресии
-
а первичный ключ в принципе жмется или нет с помощью кодеков?
-
Не подскажите как можно решить, у меня только два варианта
- Перед добавлением получать все нужные данные(select …) и потом батчами вставлять
- Разносить на разные таблицы -
первичный ключ всегда ничем не сжат, вне зависимости
-
все, понял
спасибо -
я НЕ знаю, я храню последний стетй в кластере кассандры, который в 5 раз больше кластера КХ
-
Да, decimal. Да, похоже на правду. Спасибо!
-
Первое конечно полная жесть. Вы результаты-то запросов смотрели? Они вообще что-то отдаленное похожее на правду возвращают? Я бы даунгрейдился в моментально.
По второму, какое реальное потребление? Что top/htop показывают? -
Спасибо, буду пробовать
-
Всем добрый день, а такой вопрос, можно ли как-то отдельное определить Enum и потом его использовать в разных колонках?
-
Или нужно каждый раз Enum описывать в каждой колонке?
-
-
parseDateTimeBestEffort('20'||'210403')
-
если вы не планируете работать с датами прошлого или следующего века, будет ок
-
а от чего зависит? ;)
-
Подскажите плиз это баг или новый тип map работает только с константными ключами?
with map(1,3,2,4) as mapper
select mapper[number] from numbers(2);
Code: 44, e.displayText() = DB::Exception: Illegal column Const(Map(UInt8, UInt8)) of first argument of function arrayElement: while executing 'FUNCTION arrayElement(mapper :: 1, number :: 0) -> arrayElement(mapper, number) UInt8 : 2' (version 21.3.3.14 (official build)) -
можно, если использовать AggregatingMergeTree и колонки SimpleAggregateFunction(anyLast, Nullable(String))
если использовать не Nullable(String), а просто String, то тогда будет перезатираться пустой строкой, так что для тех колонок, которые могут отсутствовать Nullable обязателен.
но согласно документации "Почти всегда использование Nullable снижает производительность, учитывайте это при проектировании своих баз."
https://clickhouse.tech/docs/ru/sql-reference/data-types/nullable/
более того если вставляется 1 колонка из 200, то нагрузка на диске как буд-то вы вставляете все 200.
возможно отдельная табличка: event_custom_properties(uuid, column_name, column_value) engine= ReplacingMergeTree будет оптимальнее.
есть желание воспользоваться Nested(column_name, column_value) вместо отдельной таблички, но пока хз как сделать, чтобы мёржились значения по соответствующим ключам. -
map это не массив это {k:v}
-
но доставать по ключу в нем же можно:
> Чтобы получить значение из колонки a Map('key', 'value'), используйте синтаксис a['key']. В настоящее время такая подстановка работает по алгоритму с линейной сложностью.
with map(1,3,2,4) as mapper
select mapper[1];
я думал это с большего удобные вариант компоновки двух массивов keys, value...
причет так работает норм:
with map(1,3,2,4) as mapper
select mapValues(mapper)[indexOf(mapKeys(mapper), number)] from numbers(3); -
Спасибо огромное, буду пробовать разные варианты, Nullable как то совсем не хочется делать
-
не понял , у вас map
┌─mapper────┐
│ {1:3,2:4} │
└───────────┘ ? -
ну да чисто для теста показать
-
всё ровно вроде бы, всё перепроверил, даже удалял дата файлы, и по новой всё поднимал, не помогло. Может ли быть дело в даунгрейде?
-
select * from system.replication_queue
ноды используют hostname -f -
скорее всего просто не реализовано, потому что usecase непонятен
-
-
там опечатка allow_experimental_window_functions=1; с 21.3
-
вот тут опечатка?
https://clickhouse.tech/docs/en/whats-new/changelog/#experimental-feature
Introduce experimental support for window functions, enabled with allow_experimental_functions = 1. -
replica_name и source_replica используют имя хоста
-
да
-
берете hostname -f на сервере 1, идете на сервер 2 и пингуете то что выдало на сервере 1
-
fix incorrect settitng name allow_experimental_window_functions by den-crane · Pull Request #22665 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Documentation (changelog entry is not required)
-
я понял, спасибо!
-
Window Functions | ClickHouse Documentation
[experimental] Window Functions ClickHouse supports the standard grammar for defining windows and window functions. The
-
всё резолвится) копировал прям с таблицы и пинганул
-
что в select * from system.replication_queue
-
Про первый пункт, я понимаю что это вещи абсолютно не связные. Но тем не менее результат запроса очень похож на правду. Очень печально, что пришлось отключить optimize_skip_unused_shards, так как распределение по нодам было не rand(), а даже осмысленное и нагрузку здорово могло снизить. Тем более, что постоянных однотипных запросов хватает.
Про второй пункт, очень тяжело отловить ошибку, так как даже одновременное открытие 12 htop'ов не даёт 100% гарантии визуально поймать момент. Да память жрёт) В основном clickhouse_server. Тогда переформулирую вопрос, если в момент запроса, под клик максимально может быть выделено не 35.41 GB, то как раз таки и будут появляться такие ошибки
would use 35.41 GiB (attempt to allocate chunk of 1073741824 bytes)
Allocator: Cannot mmap 2.00 GiB., errno: 12, strerror: Cannot allocate memory: while executing 'ARRAY JOIN .....
Поэтому банальное снижение до 34GB как и было ранее, может решить проблему? -
всем привет, делаю инсерт в КХ прямо из ПГ,
в ПГ колонка типа array, например '{}'
при вставке в КХ орет
DB::Exception: Array does not start with '[' character: while converting source column properties_key to destination column `properties.key`: while executing 'FUNCTION CAST(properties_key :: 64, Array(String) :: 127) -> CAST(properties_key, Array(String)) Array(String) : 126'.
почему так? -
а сколько ОЗУ? Т.е. КХ неправильно меряет или правильно?
-
? что вы делаете?
что такое инсерт в КХ прямо из ПГ ? -
А неизвестные опции в конфиге КХ игнорирует или считает ошибкой?
-
ошибка, просто не рендерится финальный конфиг, в логе сообщение про ошибку, при рестарте не стартует
-
ок, но между прочим с опцией allow_experimental_functions стартует без ошибки
-
как оказалась, всё дело в банальной ошибке. Порт 9009 был закрыт, хотя был уверен, что открыт :)
-
так всегда дело в банальной ошибке
-
-
покажи матвью
-
-
-
а сам SELECT какой?
-
-
-
-
-
-
insert into table from postgresql(***)
-
а 89 год есть в таблице вообще?
-
нет
-
А какой тип у dt здесь?
-
dt Date default toDate(time),
-
-
-
это из-за time?
-
вряд ли. Особенно, если event_microsec - целое
-
Я вот не помню, упорядочивает ли кликхаус колонки при insert, есть подозрение, что конкретно здесь в дату попадает user_id (7094?)
-
блин это из-за порядка колонок в секции селект?
-
я подозреваю что при INSERT...SELECT, да
-
в определении MV вроде всё равно... но это не точно
-
Всем привет, по какой причине может перестать работать вставка в дистрибьютед тейбл через insert into?
Странная ситуация, в репликейтед таблицу вставит могу, через clichouse_driver всё тоже работает, а когда в БД делаю Insert inti TB select * ... то пусто, хот без ошибок выполняется, я прям чет даже не знаю... -
insert_deduplicate = 0 попробуйте
-
в общем, да, порядок колонок
-
не помогло
-
Не поможете советом куда копнуть?
по какой причине может перестать работать вставка в дистрибьютед тейбл через insert into?
Странная ситуация, в репликейтед таблицу вставит могу, через clichouse_driver всё тоже работает, а когда в БД делаю Insert inti TB select * ... то пусто, хот без ошибок выполняется, я прям чет даже не знаю... -
ничего не понял.
Insert inti TB select * вставка в distributed из другой distributed ? -
Сорри, щас поясню. Вставка через Insert into дистрибьютед тейбл из таблицы с движком Log
-
insert into DISTRIBUTED TABLE
select * from LogRable -
вот такое не рабтает, теость оно отрабаыает но ничег оне вставляет, не понимаю куда просто копнуть
-
и еще не работает вот такое insert into DISTRIBUTED TABLE values (6,289,'2021-02-11 09:14:00',6.78);
-
хотя через clickhouse_driver вставляю в DISTRIBUTED TABLE и всё ок
-
DISTRIBUTED пишет себе в каталог в .bin файлы.
затем проталкивает в шарды из bin файлов в настоящие таблицы.
если положить какую-нибудь фигню в DISTRIBUTED, все может встать.
в логе будут сообщения об ошибках -
спасибо! 🙈 жутко затупила(
-
простого нет. Есть 4 сложных
-
Ну видимо выбора нет, можно подробнее))
-
Всё оказалось сильно проще, в репликейтед тейбл была dattime64, в дистрибьютед тейбл dattime
-
-
Подскажите пожалуйста. У нас связи с ростом сотрудников и количества запросов в кликхаус выросла загрузка CPU.
Связи с чем мы планируем поставить другой сервер с конфигом:
AMD EPYC 7502P
512 ram
20 TB NVMe
Текущий конфиг:
AMD Ryzen 9 3900
384 ram
20 TB NVMe
Стоит ли смотреть в сторону серверов на intel? -
не стоит. Посмотрите https://youtu.be/HPJOgzQkRls?t=2936
Лучше посмотреть в оптимизацию запросов. -
к сожалению у нас большая часть нагрузки происходит от продуктовых аналитов и зачастую они не очень хорошо идут в оптимизацию.
Также глупый вопрос. Правильно я понимаю, что для корректной работы кластера - стоит брать одинаковые сервера? -
Всем привет!
После обновления до 21.3.4.25 (не факт, что связано) при некоторых select'ах стала возникать ошибка:
DB::Exception: Expected ColumnLowCardinality, gotUInt8: While executing MergingSortedTransform
С чем это может быть связано, как лечить? Поиск ничего не даёт. -
стоит брать одинаковые сервера, так проще
-
проверьте что структура полей у дистрбьютид таблиц и mergetree таблиц совпдает.
лучше в гитхаб, с трассировкой из лога -
Структура полей совпадает.
Добавлю:
- ошибка пропадает, если установить optimize_read_in_order=0
- ошибка пропадает, если читать не из distributed таблицы, а из отдельной mergetree
Issue сейчас заведу. -
добрый вечер а не подсажите будет ли поддержка в словарях Uint8 или Uint64 без вариантов. так групировка быстрей если точно знаешь что словарь не разрастется больше чем на 256 значений
-
И мож чет предложите по оптимизации
-
А что понимается под трассировкой из лога?
-
стектрейс , там на любую ошибку длинная портянка в лог пишется
-
в каких словарях ? ext.dictionary ? используйте flat
-
да использую flat
-
но единственный идентификатор это uint64
-
так без разницы, toUInt64 почти ничего не стоит
-
Делаю перелив данных из одной таблицы в другую: insert into new ... select ... from old. Есть способ как-то замедлить процесс, чтобы сильно не напрягать базу, лить себе неспешно?
- 06 April 2021 (136 messages)
-
Начните с max_threads и max_insert_threads в SETTINGS части запроса
https://clickhouse.tech/docs/en/operations/settings/settings/#settings-max_threadsSettings | ClickHouse DocumentationSettings distributed_product_mode Changes the behaviour of distributed subqueries. ClickHouse applies this setting when
-
Что значит параметр materialize_ttl_after_modify? После добавления TTL существующие на данный момент данные никогда не будут удалены (кроме как вручную) или речь только о том, что удаление не начнётся сразу после выполнения запроса?
-
TTL прорастёт не только на новые парты, но и на уже существующие
-
То есть если выставлено materialize_ttl_after_modify=0 то старые парты удалятся, только если каким-то образом будут мержится (то есть возможно - никогда)?
-
Никогда не удалятся, даже если будут мержится
-
А. Даже так. Ясно, спасибо.
-
-
-
да! засыпал тоже об этом подумал)) Спасибо сработало
-
-
-
-
-
Tutorial | ClickHouse Documentation
ClickHouse Tutorial What to Expect from This Tutorial? By going through this tutorial, you’ll learn how to set up a simp
-
-
-
-
OPTMIZE в кх удаляет дубликаты только в пределах партиции
-
Понял, спасибо.
-
Добрый день, выполняю простейший запрос вида:
SELECT event_name FROM table
WHERE (client_time >= '2021-04-01 00:00:00') AND (event_name = 'tapCardField')
ORDER BY client_time DESC
Выдает такое:
DB::Exception: Expected ColumnLowCardinality, gotUInt8: While executing MergingSortedTransform
event_name - LowCardinality(String)
Не очень понимаю, что я делаю не так? -
-
поддерживает, там лишь проблема в Atomic движках баз данных, но их можно не использовать
-
Спасибо!
-
Понял. Спасибо!
Помню когда-то слышал про встроенный механизм бекапов кликхауса в будущем. Про него нет никаких новостей? -
Add new commands BACKUP and RESTORE (part 1) by vitlibar · Pull Request #21945 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category: New Feature Changelog entry: Added new commands BACKUP and RESTORE. EARLY STAGE (NOT...
-
🍻
-
Всем привет!
Может кто подсказать какой-то best practice если вдруг случился split-brain между нодами кластера ? -
Это как? КХ мультимастер же
-
У меня есть 2 ДЦ по сколько-то нод. Между ДЦ развалился канал. Хочется понять что дальше будет происходить с кластером ? Как будет работать кворум у зукипера ?
-
Сломается запись в том ДЦ где меньше зукиперов
-
Вопрос осложняется тем , что нет третьей стороны для zookeeper. И по факту мы имеем равное количество хостов в каждом из ДЦ. Я видел в доках что все перейдет в формат RO. Не будет ли в этом случае zookeeper давить на CPU ?
-
Ну значит в обоих ДЦ будет меньшинство и запись в кх сломается везде
-
Всем привет! Необходимо сгенерировать столбец с последовательными датами, как это можно сделать?
-
INSERT INTO .. SELECT toDate('2021-01-01') + toIntervalDays(number) FROM system.numbers LIMIT 25
-
спасибо
-
@nyoroon Большое спасибо за помощь!
-
вообще лучше все zookeeper которые учувствуют в кворуме пихнуть в 1 дц, а в втором поставить просто обсерверов
-
Здравствуйте! Подскажите пожалуйста что не так с моим таблицей:
CREATE TABLE default.access_logs
(
`request_id` String,
`timestamp` DateTime,
`remote_user` String,
`remote_addr` String,
`scheme` String,
`host` String,
`server_addr` String,
`request_method` String,
`request_uri` String,
`request_length` UInt32,
`request_time` Float64,
`status` UInt16,
`body_bytes_sent` UInt32,
`upstream_addr` String,
`upstream_status` String,
`upstream_response_time` Float64
)
ENGINE = MergeTree
PARTITION BY toDate(timestamp)
ORDER BY (timestamp, host)
TTL timestamp + toIntervalWeek(1)
SETTINGS index_granularity = 8192;
Получаю такую ошибку при попытке создание:
Code: 62. DB::Exception: Syntax error: failed at position 557 (')') (line 22, col 1): )
ENGINE = MergeTree
PARTITION BY toDate(timestamp)
ORDER BY (timestamp, host)
TTL timestamp + toIntervalWeek(1)
SETTINGS index_granularity = 8192;
-- Create K. Expected one of: PRIMARY KEY, CONSTRAINT, identifier, column declaration, INDEX, table property (column, index, constraint) declaration -
в мерж три нужно MergreTree()
-
ORDER BY (timestamp, host)
Сомнительно, ORDER BY (host, timestamp)
Выглядит лучше
> в мерж три нужно MergreTree()
В новых версия не нужно -
У меня нормально создалось, вы через что создаете
CREATE TABLE default.access_logs
(
`request_id` String,
`timestamp` DateTime,
`remote_user` String,
`remote_addr` String,
`scheme` String,
`host` String,
`server_addr` String,
`request_method` String,
`request_uri` String,
`request_length` UInt32,
`request_time` Float64,
`status` UInt16,
`body_bytes_sent` UInt32,
`upstream_addr` String,
`upstream_status` String,
`upstream_response_time` Float64
)
ENGINE = MergeTree
PARTITION BY toDate(timestamp)
ORDER BY (host, timestamp)
TTL timestamp + toIntervalWeek(1)
SETTINGS index_granularity = 8192 -
Докер
-
хотя да, вы правы. у меня кстаи создалось
-
какой клиент?
-
Это мой докер контейнер
clickhouse:
container_name: clickhouse
image: yandex/clickhouse-server
ports:
- "8123:8123"
- "9000:9000"
volumes:
- ./clickhouse:/var/lib/clickhouse:rw
- ./clickhouse/scheme/init_schema.sql:/docker-entrypoint-initdb.d/init_schema.sql -
-
А вот это файл init_schema.sql:
CREATE TABLE IF NOT EXISTS default.access_logs
(
`request_id` String,
`timestamp` DateTime,
`remote_user` String,
`remote_addr` String,
`scheme` String,
`host` String,
`server_addr` String,
`request_method` String,
`request_uri` String,
`request_length` UInt32,
`request_time` Float64,
`status` UInt16,
`body_bytes_sent` UInt32,
`upstream_addr` String,
`upstream_status` String,
`upstream_response_time` Float64
)
ENGINE = MergeTree
PARTITION BY toDate(timestamp)
ORDER BY (timestamp, host)
TTL timestamp + toIntervalWeek(1)
SETTINGS index_granularity = 8192;
-- Create Kafka engine table
DROP TABLE IF EXISTS default.`.access_logs_kafka`;
CREATE TABLE IF NOT EXISTS default.`.access_logs_kafka`
(
`request_id` String,
`timestamp` DateTime,
`service_pipe_addr` String,
`server_addr` String,
`upstream_addr` String,
`client_addr` String,
`scheme` String,
`host` String,
`request_method` String,
`status` UInt16,
`upstream_status` String,
`upstream_response_time` String,
`request_time` Float64,
`request_length` UInt32,
`body_bytes_sent` UInt32,
`request_uri` String,
`user_agent` String
)
ENGINE = Kafka
SETTINGS kafka_broker_list = 'kafka:9092', kafka_topic_list = 'access-logs', kafka_group_name = 'access-logs-consumer', kafka_format = 'JSONEachRow', kafka_row_delimiter = '\n', kafka_schema = '', kafka_num_consumers = 1, kafka_skip_broken_messages = 1;
-- Create materialized view
DROP TABLE IF EXISTS `.mv_access_logs`;
CREATE MATERIALIZED VIEW `.mv_access_logs` TO default.access_logs
(
`request_id` String,
`timestamp` DateTime,
`service_pipe_addr` String,
`server_addr` String,
`upstream_addr` String,
`client_addr` String,
`scheme` String,
`host` String,
`request_method` String,
`status` UInt16,
`upstream_status` String,
`upstream_response_time` String,
`request_time` Float64,
`request_length` UInt32,
`body_bytes_sent` UInt32,
`request_uri` String,
`user_agent` String
) AS
SELECT
request_id,
timestamp,
service_pipe_addr,
server_addr,
upstream_addr,
splitByChar(',', client_addr)[1] AS client_addr,
if(scheme = '', 'UNKNOWN', scheme) AS scheme,
host,
if(request_method = '', 'UNKNOWN', request_method) AS request_method,
status,
upstream_status,
toFloat64OrZero(upstream_response_time) AS upstream_response_time,
request_time,
request_length,
body_bytes_sent,
request_uri,
user_agent
FROM default.`.access_logs_kafka`; -
По умолчанию рекомендуют партиционирование по месяцам. По моим наблюдениям если запросы собирают данные больше чем за один день, то партиционирование по дням эти запросы замедляет.
-
спасибо
-
Подскажите, имеется таблица Replacing merge tree. В нее каждый день дописываются данные за сегодня и за вчера.
Сегодня обнаружили что данные за 2021-03-30 до сих пор не схлопнулись. Возможна ли эта проблема из-за не выставленных конфигураций сервера? -
Сделайте OPTIMIZE FINAL для таблицы (или только проблемного партишна той таблицы), - если OPTIMIZE успешно отработает и ваши записи схлопнутся - значит кликхаус просто до тех записей ещё не добрался (Replacing гарантий по времени схлопывания не даёт) . (Или же, вместо OPTIMIZE FINAL, можно в тот же SELECT, которым вы проверяли дубли, добавить после имени таблицы FINAL - останутся ли тогда дубли?). Это одна ситуация, когда на самом деле всё как положено работает.
И если вы знаете, что из систем-источников данные "за несколько дней назад" уже больше поступать не должны, а дубли в старых данных не устраивают - как вариант каким-нибудь ночным OPTIMIZE FINAL схлопывание поторопить.
А вот если останутся не схлопнутыми - с этим стоит разобраться. Может быть какая-то ошибка схемы. Например, не будут схлопываться между собой записи, находящиеся в разных партициях. -
-
В доке (https://clickhouse.tech/docs/ru/sql-reference/statements/alter/partition/#alter_attach-partition-from) не хвататет пункта, что политики хранения должны быть одинаковыми.PARTITION | Документация ClickHouse
Манипуляции с партициями и кусками Для работы с партициями доступны следующие операции: DETACH PARTITION — перенести пар
-
-
подскажите, где можно посмотреть выставленный параметр для merge_tree_max_rows_to_use_cache?
-
select * from system.settings
where name='merge_tree_max_rows_to_use_cache'; -
Лучше сделать на каждой реплике - так и читать быстрее будет (актуально если поток большой) и отказоустойчивость повышается на случай падения реплики-читателя.
-
как можно навесить права на пользователя? Что гугл предлагает пробовал, не помогло
-
Есть запрос:
SELECT '"foo" foo', 'bar'
Формирую URl http://localhost:8123/?query=SELECT%20%27%22foo%22%20foo%27%2C%20%27bar%27&default_format=TabSeparated и получаю
"foo" foo bar
с помощью какого параметра или настройки я могу обернуть строки в двойные кавычки, чтобы получить:
""foo" foo" "bar"
в идеале бы добавлять кавычки, только в строках с кавычками
""foo" foo" bar -
А с чего вдруг сервер должен оборачивать результат в кавычки? Вы что запросили, то и получили.
Хотите доп. логику, напишите запрос соответствующий или на клиенте обрабатывайте -
Странно, что заголовки столбцов он при этом экранирует в двойные кавычки, а значения нет, вот и подумал, что дело в настройках
-
точнее с параметром TabSeparatedWithNamesAndTypes
выдает
\'"foo" foo\' \'bar\'
String String
"foo" foo bar
подумал, что и значения можно оборачивать -
format CSV ?
-
TabSeparatedWithNamesAndTypes, для CSV нет WithNamesAndTypes
-
-
detach partition / mv в bash / attach partition
-
а вот за 32е число уже не выдает
-
ну CSVWithNames есть
-
марта?
SELECT toDate('2021-02-30')
┌─toDate('2021-02-30')─┐
│ 2021-03-02 │
└──────────────────────┘
так работает обработка неправильных дат -
сори, марта
Спасибо. Посмотрел уже что toDate() так работает. Интересно в связи с чем так?) -
Так быстрее парсить
-
-
-
благодарю)
-
Здравствуйте!
Прошу помощи, не могу понять почему возникает ошибка при вставке данных
Есть колонка DateTime64( 9 ) при вставке в нее данных 1617692259365297735 возникает ошибка:
(version 21.2.2.8 (official build))
Code: 407, e.displayText() = DB::Exception: Decimal math overflow, Stack trace (when copying this message, always include the lines below): -
Здравствуйте! Подскажите пожалуйста есть тут кто нибудь использующий Clickhouse вместе с Grafana?
Возможно ли каким то образом сделать таблицу с пагинацией в Grafana в версии выше 7? -
похоже нашли, на сервере с версией 21.3.2.5 загрузилось
-
Добрый день! У меня странный вопрос: допустим, в таблице есть столбцы time DateTime, и date Date ALIAS toDate(time). При выполнении запроса select ... where date >= today() - 2 производится ли оптимизация, такая что today() - 2 приводится к типу DateTime и при выполнении запроса столбец time сравнивается с приведённой константой, или каждое значения в столбце time сначала приводится к Date, а потом сравнивается с today() - 2?
-
каждая строка приводится к Date
-
Печально, спасибо. А планируется такая оптимизация в будущем?
-
эээ? Нет вроде. Вы где такое вообще видели?
типа вы хотите чтобы КХ переписал запрос с where = 2020-01-01 в where >= 2020-01-01 00:00:00 and < 2020-01-02 00:00:00 ?
с оптимизацией для полей alias вообще все плохо, очень плохо. -
ясно, спасибо, значит буду думать в сторону MATERIALIZED и DEFAULT
-
-
сконкатенируй значения в строку и возьми хеш
-
В массиве лежать числа, мне хэш от них в строковом представлении не подходит.
Да и как их собрать в одну строку я что то тоже не нашёл (( -
SELECT murmurHash3_64(arrayStringConcat(arrayMap(x -> toString(x), [123, 456, 789]))
-
в файле лежат строки или байтики. байтики могут по-разному лежать
-
Ну порядок байт в КХ и на компе у меня одинаковый, так что должно работать корректно, но перегонять числа в строки совсем не хочется
-
SELECT
[123, 456, 789] arr,
arrayStringConcat(arrayMap(x -> toString(x), arr),'-') str,
murmurHash3_64(str) hash -
приукрасил
-
-
Добрый день. Выстрелил себе в колено с optimize final. Теперь гора мерджей текущих. Есть ли безболезненное лечение ? Остановить все мерджи на таблице - SYSTEM STOP MERGES table_name и потом запустить снова ?
Upd: https://github.com/ClickHouse/ClickHouse/issues/12694how to kill optimize FINAL in backgroud · Issue #12694 · ClickHouse/ClickHousei optimize a big table (replicedReplacingMergeTree) , it makes io 100% ,so i want to kill this optimize FINAL how can i do ? default.users (ReplicatedMergeTreeQueue): Not executing log entry MERGE_...
-
если репликейтид, то надо удалять в зукипере задание
-
и в чем проблема ? SELECT murmurHash3_64([1, 2, 3])
-
Пробовал отдавать на вход прямо массив из селекта - выдаёт ошибку. Завтра попробую ещё раз.
С конкатенацией массива в строку всё работает -
старый КХ?
SELECT murmurHash3_64([1, 2, 3])
┌─murmurHash3_64([1, 2, 3])─┐
│ 13667601236002041579 │
└───────────────────────────┘ -
-
-
select mumurHash3_64(groupArray(arr1)) from t1 where id = 1000
-
Завтра проверю, спасибо
-
еще одни скобки нужны
select murmurHash3_64 ( (select range(50)) );
--
7267519782819810907 -
select murmurHash3_64 ( (select [1,2,3]) );
--
13667601236002041579 -
-
-
-
-
Доброго времени. А вот так вот можно делать ?
CREATE TABLE default.a_1_merge_summ_minuts (
days toUInt64( toStartOfMinute ( toDateTime( DateTime ) ) ),
...........
) ENGINE = SummingMergeTree()
ORDER BY
(days, sid, tid) TTL days + toIntervalDay(9) SETTINGS index_granularity = 8192
Чтобы простой инсерт сюда который был в таблицу MergeeTree стал агрегироваться по days ? -
Есть табличка:
CREATE TABLE users
(
user_id UInt64,
property1 String,
custom_properties Nested(k String, v String)
) Engine=MergeTree ORDER BY (user_id);
Достать кастомные поля я могу таким способом:
SELECT
user_id,
property1,
custom_properties.v[indexOf(custom_properties.k, 'color')],
custom_properties.v[indexOf(custom_properties.k, 'size')],
FROM test.nested
Выносим кастомные поля в отдельную табличку, чтобы легко можно было их обновлять:
CREATE TABLE user_properties (
user_id UInt64,
k String,
v String
) Engine=ReplacingMergeTree ORDER BY (user_id, k);
Написал такой запрос:
SELECT user_id, property1, vals[indexOf(keys, 'color')], vals[indexOf(keys, 'size')]
FROM users
JOIN (
SELECT user_id, groupArray(k) as keys, groupArray(v) as vals
FROM user_properties
GROUP BY user_id
) using (user_id)
всё вроде ок, одна проблема, что в документации написано:
"groupArray добавляет значения в любом (недетерминированном) порядке"
Есть какие-то детерминированные варианты? -
Скрипт процессит огромный файл и генерирует записи которые нужно вставить в клик.
Всегда делал вот так
/opt/script --in=big.file | clickhouse-client -h 127.0.0.1 --query="INSERT INTO xxxx FORMAT JSONEachRow"
А сейчас скрипт работает, никаких ошибок в терминале, но и в базе клика по нулям
если сделать
/opt/script --in=big.file > file.out
clickhouse-client -h 127.0.0.1 --query="INSERT INTO xxx FORMAT JSONEachRow" < file.out
то данные начинают появляться
Как повысить уровень отладки в клике чтобы посмотреть что происходит? Клик вставляет батчами по 1М вроде, а как это понизить? может быть каждом батче есть проблемное поле и весь батч молча валится? -
да, можно
partition by тоже неплохо бы иметь, иначе все будет в одной партиции -
А как ? Я там явно каку скопипастил )
-
-
а TTL
ну тогда да.
а запросы будут за все 9 дней данные кверять ? -
-
можно партиционировать по дню и дропать TTL-м партиции
-
В некоторых случаях, вы всё же можете рассчитывать на порядок выполнения запроса. Это — случаи, когда SELECT идёт из подзапроса, в котором используется ORDER BY.
-
SELECT user_id, property1, vals[indexOf(keys, 'color')], vals[indexOf(keys, 'size')]
FROM users
JOIN (
SELECT user_id, groupArray(k) as keys, groupArray(v) as vals
FROM (SELECT user_id, k, v FROM user_properties order by user_id, k)
GROUP BY user_id
) using (user_id) -
или
SELECT user_id, property1, keys_vals.1[indexOf(keys, 'color')], keys_vals.2[indexOf(keys, 'size')]
FROM users
JOIN (
SELECT user_id, arraySort(groupArray(k,v)) as keys_vals FROM user_properties
GROUP BY user_id
) using (user_id) -
--send_logs_level=debug --max_insert_block_size=1000
-
А если импорт идет через импорт json и нет явного VALUE что то типа:
101798 US impression Desktop
А нужно чтобы в SummingMergeTree() .. залетело в любом случае +1 даже по пустому VALUE
Ловятся регуесты в данном случае просто и нужна их сумма по полям
days toUInt64( toStartOfMinute ( toDateTime( DateTime ) ) ),
sid UInt32 DEFAULT CAST(0, 'UInt32'),
tid UInt32 DEFAULT CAST(0, 'UInt32'),
desktop_req UInt32 DEFAULT CAST(0, 'UInt32'),
mobile_req UInt32 DEFAULT CAST(0, 'UInt32'),
в схему костыль какой то засуваем ? )
И можно ли тут выловить значение ... c параметра чтобы присвоить ему например desktop_req + 1 -
tnx, запустил скрипт, чуть позже отпишусь о результатах
-
либо input function либо вставка в таблицу Engine=null + MV c select sum(1)
-
спасибо. то что нужно
-
) поставил --max_insert_block_size=1000 , пока скрипт работает в базе по нулям. Если прерываю скрипт по Ctrl+C - то записи появляются.
Если ставлю --max_insert_block_size=10000 и прерываю, то записей в базе нету (видно не успело накопиться до тех пор пока прервал)
Если при батче размеров 100000 понятно почему так происходит, то почему при батче в 1000 не появляются записи (когда они появляются их там около 20к штук) не понятно. Транзакций ведь в клике нету, что за чудеса блин
UPD: оказалось, что нужно использовать опцию min_insert_block_size_rows, именно она отвечает за размер батча и мистерия с "транзакциями" ушла -
Спасибо.. А табличку MATERIALIZED VIEW с SELECT которая берет ..
Можно на горячую дропнуть и поменять схему создав новую с этим же именем?
Не возможен тут какой креш ? )) -
только там нужно groupArray((k, v)) вместо groupArray(k, v), чтобы два параметра в тупл собрались, и вроде можно без arraySort.
и ещё скобки добавил (keys_vals.1)[indexOf(keys, 'color')] вместо keys_vals.1[indexOf(keys, 'color')], а то на синтаксис ругалось, походу пыталось обратиться к цифре 1 как к массиву.
но мысль понятна. ещё раз спасибо -
транзакций нету, но парты атомарны, либо парт создан целиком либо нет. Инсерт не атомарен, а кусок инсерта атомарен.
непонятно все равно что происходит, у вас приложение в конце возращает ненулевой код возврата видимо -
смотря какое MATERIALIZED VIEW, если обычное, то все данные удалятся
-
пересоздавать MATERIALIZED VIEW можно на ходу, креша не будет
-
естественно MATERIALIZED VIEW пропустит все инсерты, в момент после дропа
-
дописал в исходное, но видно вы уже отвечали.
UPD: оказалось, что нужно использовать опцию min_insert_block_size_rows=1000, именно она отвечает за размер батча и мистерия с "транзакциями" ушла
Теперь вставки идут блоками по 1000, Пока гипотеза, что клик ждал блока в 1М, но где-то происходил фейл. Скрипт долго будет работать, завтра днем отпишусь что дал дебаг -
я видел это, просто все несколько не так, но это надо полчаса печатать, нетелефонный разговор.
-
ок, все равно спасибо, дальше сам в документации и в приложении пороюсь, может что и найду
-
-
!report
-
Всем привет! Сделал дашборд в Grafana с метриками из встроенного экспортера. Может кому пригодится https://github.com/weastur/grafana-dashboards/tree/main/dashboards/clickhousegrafana-dashboards/dashboards/clickhouse at main · weastur/grafana-dashboards
Set of useful grafana dashboards. Contribute to weastur/grafana-dashboards development by creating an account on GitHub.
- 07 April 2021 (225 messages)
-
спасибо
еще вот такой дашборд для встроенного endpoint есть
https://grafana.com/grafana/dashboards/13500Clickhouse internal exporter dashboard for Grafana | Grafana LabsClickhouse metrics for internal (embedded, <prometheus>) exporter
-
Всем привет, кто-нибудь сталкивался с проблемой работы COLUMNS при джоине нескольких таблиц? когда COLUMNS нужно получить одноименные столбцы из таблиц
-
select
columns('test')
-- , a.test, b.test, c.test
from
(select 1 as id, 'a' as test) a
left join (select 1 as id, 'b' as test) b on b.id = a.id
left join (select 1 as id, 'c' as test) c on c.id = a.id; -
пример запроса
-
проблема то в чем?
EXPLAIN SYNTAX SELECT ...
сделайте посмотрите как запрос переписывается? -
раскоментируйте строку и сравните результат, в частности что возвращает columns('test')
-
да, похоже на баг при переписывании запроса
EXPLAIN SYNTAX SELECT ...
разные результаты показывает вообще
Заводите ISSUE на github -
Всем привет, подскажите существует ли способ добавить несколько дисков но при этом при создании таблицы не упоминать setting storage_policy.
-
Существует, надо в конфигурации назвать ее default
-
Привет! Как-то можно ускорить insert into replicated_table select * from hdfs_engine_table_gzipped_data? Например, как-то увеличить размер батча или отсоотировать исходные данные по primary key, или не сжимать данные в hdfs?
-
Спасибо 🙏, сейчас попробую
-
всем доброе утро. подскажите, а есть бест практис по конфигам? не документация, а более вдумчивый текст?
у меня на таблице с ReplacingMergeTree ужасно растет LA -
тут бы понять во что упирается
попробуйте CPU profiling всключить и system.trace_log для заданной query посмотреть
https://github.com/Slach/clickhouse-flamegraph/
ну и погираться в настройках HDFS('hdfs://host:port/storage?param=value')
https://clickhouse.tech/docs/en/engines/table-engines/integrations/hdfs/#supported-by-libhdfs3
из кандидатов на увеличение
input_localread_default_buffersize
dfs_prefetchsize
output_default_chunksize
dfs_client_read_shortcircuit_streams_cache_size
но не факт что это поможетGitHub - 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
-
Всем привет!
Такой вопрос: пытаюсь натравить ClickHouse на топик кафки (1 partition).
Сообщения в топике лежат в следующем виде (для примера)
{"code": 1, "name": "test-name"}
{"code": 2, "name": "test-name"}
скрипты создания таблиц и materialized view:
create table KafkaConsumer
(
code Int8,
name String
) ENGINE Kafka()
SETTINGS
kafka_broker_list = 'devhdp1:6667,devhdp2:6667,devhdp3:6667',
kafka_topic_list = 'dds.logging',
kafka_group_name = 'click-group1',
kafka_format = 'JSONEachRow',
kafka_num_consumers = 1,
kafka_row_delimiter = '\n';
create table LogsTable
(
code Int8,
name String
) ENGINE MergeTree() order by (code);
CREATE MATERIALIZED VIEW kafka_view to LogsTable as
select code, name from KafkaConsumer;
после выполнения скриптов, запрос
select code, name
from LogsTable;
ничего не возвращает.
сетевой доступ с ноды клика до ноды, где крутится кафка, есть.
подскажите, плиз, в какую сторону копать. буду рад любой помощи. -
а в логах что пишется ?
-
абсолютно ничего
-
а кафка точно на 6667 порту ? дефолтный 9093(или чето такое)
-
да, точно. глянул - другие сервисы туда же подключаются
-
ну вообще странно. А вы какой лог смотрите ?
-
/var/log/clickhouse-server/clickhouse-server.log
-
а errror лог тоже пустой ?
-
а данные в топике то точно есть?
-
да, точно. прям руками накидал.
-
вообще да
grep -i kafka /var/log/clickhouse-server/clickhouse-server.log
не может НИЧЕГО не показывать =)
у вас в clickhouse вообще логирование включено? -
прошу прощения, не могу найти где error log лежит
-
/var/log/clickhouse-server/clickhouse-server.err.log
-
посмотрите с какой скоростью обычные hdfs клиенты читать будут
типа этого
https://github.com/barakmich/go-hdfsGitHub - barakmich/go-hdfs: Fast HDFS CLIFast HDFS CLI . Contribute to barakmich/go-hdfs development by creating an account on GitHub.
-
спасибо. сейчас глянем.
-
вообще, да
-
в error log'е тоже пусто
-
ну странно, что в логе прям ВООБЩЕ ничего
-
вы точно на той тачке лог смотрите ?))) (всякое бывает)
-
-
да, точно. на всяк случай еще раз проверил)
-
-
gz-файл c protobuf внутри, размером 15gb, hdfs dfs -get копировал за несколько минут, вставка в таблицу же отрабатывала 40 минут, это таблица на одном из шардов кластера, без реплик
-
спасибо, попробую построить flamegraph
-
-
Все по 0 кроме query_log но там тоже если посмотреть на время выполнения уж ни как нет утечки на 5gb
-
скок оперативки вообще?
-
-
250гб?
Какая версия?
Какой аптайм -
При запуске жрет мало но потом начинает расти без конца пока блин сервак не положит
-
Какая версия кх
-
protobuf на TSV можно заменить? или уже никак?
-
Да 250gb
Остальное узнаю ща -
Теоретически можно, но там сложная схема около 200 столбцов , много nested-полей
-
ну в общем надо смотреть flamegraph
-
version 20.11.3.3
-
Ну мб в вашей версии есть мем лик
-
Здравствуйте!
Нужно используя clickhouse-cpp сделать вставку в таблицу.
В таблице есть поле с дефолтным значением:
key String,
data String DEFAULT 'default'
Нужно вставить данные в таблицу, причем в столбце 'data' часть данных заполнена, а часть должна заполниться значением по умолчанию.
Вставку нужно сделать за одну операцию.
Используя clickhouse-cpp, создаю два столбца ColumnString, но им обоим нужно вызвать column->Append(...). Только для некоторых строк во втором столбце данных нет.
При использовании типа Nullable(String) все понятно, а как это сделать без Nullable? -
-
через system.databases можно посмотреть data_path, metadata_path
-
спасибо
-
ClickHouse/ClickHouse tagged: v21.3.5.42-lts
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.3.5.42-lts
Release notes:
ClickHouse lts release v21.3.5.42-ltsRelease v21.3.5.42-lts · ClickHouse/ClickHouseClickHouse lts release v21.3.5.42-lts
-
Добрый день, коллеги. Вопрос: после alter table delete .... и после того, как оно закончилось, данные могут потом внезапно вылезти в SELECT ? в SELECT FINAL?
-
А что значит «закончилось»? Мутация прошла?
-
Да
-
Добрый день, подскажите пож-та, есть ли утилиты для миграций кх? Было бы интересно еще послушать как вы делаете доставку новых фитч в кх?
-
если миграция == backup, то clickhouse-backup; если из кластера в кластер, то clickhouse-copier
-
-
Всем привет, такой вопрос, создали таблицу ReplicatedReplacingMergeTree, сделали order by по 3 колонкам, вставили туда 2 раза одни и те же данные, сделали селект и получили 2 раза эти же данные
-
версия КХ 19.15.3
-
CREATE TABLE default.user_uuid_local (`sky_uuid` String, `device_fingerprint` String, `device_pro_fingerprint` String, `version` DateTime, `created_at` DateTime) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/user_uuid_local', '{replica}', version) PARTITION BY toYYYYMM(created_at) ORDER BY (sky_uuid, device_fingerprint, device_pro_fingerprint) SETTINGS index_granularity = 8192
-
Из документации:
ReplacingMergeTree is suitable for clearing out duplicate data in the background in order to save space, but it doesn’t guarantee the absence of duplicates. -
данные вставляем через distributed таблицу
-
и ещё оттуда же:
Data deduplication occurs only during a merge. Merging occurs in the background at an unknown time, so you can’t plan for it. Some of the data may remain unprocessed. Although you can run an unscheduled merge using the OPTIMIZE query, don’t count on using it, because the OPTIMIZE query will read and write a large amount of data. -
читал, но чтоб прямо вот так, и на единственных данных
-
ну если запустите optimize и подождёте, то дубликаты удалятся
-
делали optimize
-
не помогает
-
возможно данных довольно много и он ещё просто не завершился
-
данных не много, я же говорю, вставили 2 строки для теста
-
optimize table user_uuid_local on cluster sky final
-
они в одной партиции?
-
тогда к DDL-ке ещё бы и строку, которую вставляли
-
👍🏻
-
кто его знает, у нас 3 шарда х 2 реплики каждый
-
ну у вас PARTITION BY toYYYYMM(created_at), а данные вставляли в разные месяца?
пришлите 2 строки -
-
исходя из описания, из этих двух строк, должна была отстаться только та, которая имеет более высокий version
-
тру
-
а текстом можно?
-
insert into user_uuid (sky_uuid, device_fingerprint, device_pro_fingerprint) values ('1','2','3');
-
created_at и version = DEFAULT now()
-
хм, на 21.3 работает, но сомневаюсь, что дело в версии, не настолько она старая 🤔
-
вы на кластере пробуете или на сингл инстансе?
-
дедупликация происходит в рамках шарда, не?
-
в кластере, но на сингл инстансе) проблема только если таблица на кластере?
-
судя по всему - да
-
мне необходимо добиться уникальности данных в рамках всего кластера
-
на сколько я сейчас понял, то уникальность данных сохраняется на уровне шарда...
-
ClickHouse: Usage of hash and internal_replication in Distributed & Replicated tables
I have read this in the Distributed Engine documentation about internal_replication setting. If this parameter is set to ‘true’, the write operation selects the first healthy replica and writes da...
-
You stabilized order and if insert is repeated the same rows goes to the same shard because a shard number for a row is calculated using pageviewId not rand().
-
у меня вставка данных, как раз идет по rand()
-
Добрый день. Подскажите пожалуйста есть ли способ агрегировать в materialized view данные, которые берутся из базовой таблицы, но брать последнее значение в каждом дне?
Смотрю в сторону ReplacingMergeTree с version в виде timestamp. Но пока не особо получатся. Заранее благодарю. -
используйте limit by
-
выглядит как в этом и есть проблема
получается надо менять шардинг ки, или лить напрямую, а не в дистрибутед таблицу -
или argMax
-
я поменял ключ шардирования
-
все заработало
-
👍🏻
-
Есть N шардов, хочу как то поставить на поток миграции.
Например нужно добавить новое поле в кх Кафка энджин, приходится лезть в каждый шард и руками делать. -
ALTER TABLE ... ADD COLUMN IF NOT EXISTS .. ON CLUSTER ? не?
-
-
toYYYYMM()?
-
В том же кластере лежит дистриб таблица, ваше решение может задеть её
-
ага
-
так она же наверняка в другой базе или с каким-то суффиксом, не?
-
Как, если ткм написано If not exists, или вы колонки по разному зовете?
-
Думаю clickhouse-copier попробую по совету @critskiy. Всем спасибо за ответы
-
Верно, но все же не хочется запускать такой sql на на уровне кластера.
-
получается вы сами себе противоречите, нужно добавить новое поле в кх Кафка энджин, приходится лезть в каждый шард и руками делать это и есть изменение на уровне кластера, решение придумано добавлением on cluster 🤔
-
Я не говорю, что on cluster работать не будет, я просто сказал, что не хочу так делать.
-
я понял) просто пока не понял почему есть опасения
-
Добрый день, решил попробовать подключить mongodb
CREATE TABLE test.mongo_table
(
userId UInt64,
type UInt16,
registered DateTime,
lastLogin DateTime
) ENGINE = MongoDB('server:27017', 'database', 'collection', '', '');
Тестовая база без пароля,
При попытке выполнить
select type from test.mongo_table where userId = 1
Получаю ошибку
Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Invalid argument: empty username (version 21.3.4.25 (official build)) -
Нет возможности запускать на части шардов, с clickhouse-copier кажется можно такое сделать
-
возможно вместо пустых строк лучше вообще ничего не указывать
-
ALTER TABLE имя_таблицы
причем тут Distributed вообще?
она же с другим именем
для ReplicatedMergeTree
ALTER TABLE через ZK будет выполняться
для остальных таблиц тупо на лету обход шардов кластера и выполнение запроса -
-
там похоже ситуация в том, что надо только на части кластера выполнять миграции
-
> причем тут Distributed вообще? она же с другим именем
Пример.
n шардов c таблицей users
n нод с дистриб таблицей users (на этих нодах только дистриб таблицы и называются они так же, как в шардах простые таблицы)
Это все в одном кластере -
вопрос зачем так назвали
-
Вопрос почему нет?
-
не парились сейчас бы с колонками, ИМХО, но не мое дело, я простой человек
-
Ну я говорю, что on cluster решает задачу, но не совсем подходит мне, потому что я все таки хотел бы иметь возможность внести правки на часть шардов, чтоб убедится, что нечего не задели
-
А то что так назвали, это до этого не мешало примерно некогда
-
-
а для дистрибутед таблиц, кстати, не надо будет всё равно добавлять эти колонки?
-
для этого как бе песочница должна быть, или хотя б схема выделена для исследования гипотез на инстансе :)
-
Надо, но опять же, хотелось бы это делать не сразу, а выкатывать на части нод
-
Всем привет!
Подскажите, пожалуйста, как в clickhouse получить самую последнюю таблицу из папки?
Допустим, на скрине представлены таблицы, находящиеся в папке и мне нужно получить таблицу
2021-04-07Т13:00:00 -
ясно) ну можно как решение просто поменять database в которой дистрибудет таблицы, тогда можно и on cluster юзать
-
она сама возьмётся, если в where есть ограничение по колонке указанной в ключе партиционирования
-
Ну вот у вас идет например 1 к инсертов/с (1 к тут лишь для примера), вот вы сделали песочницу и начали писать туда, нечего не сломалось, как вы перенесете данные из песочницы в основную таблицу?
-
Тогда при попытке создания таблицы будет ошибка
Code: 42, e.displayText() = DB::Exception: Storage MongoDB requires 5 parameters: MongoDB('host:port', database, collection, 'user', 'password'). (version 21.3.4.25 (official build)) -
ну я бы тогда просто методом тыка что-то пробовал) ну или как верняковый враиант задал бы просто для этой тестовой монги таки юзер/пароль test|test
-
distributed + MV, или создам перед операциями вставок replicated таблицу
-
Вот тут:
https://github.com/ClickHouse/ClickHouse/tree/master/docs/toolsClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Ну идеи на подумать я получил, спасибо
-
=) хм... ну.
сделайте в
еще один кластер только с теми нодами в которых MergeTree таблица
<remote_servers>
<merge_tree_tables>
<shard>
....
<
и запускайте ALTER TABLE ... ON CLUSTER 'merge_tree_tables' -
Это тоже рабочий вариант, спасибо
-
ну или как вариант, я б в конфиге вначале б повозилси
-
+++
-
А тут можно подробнее?
-
а @BloodJazMan уже описал)
-
Я понял вас, спасибо за ответы
-
Пытаюсь импортировать из Метрики данные используя https://github.com/yndx-metrika/logs_api_integrationGitHub - yndx-metrika/logs_api_integration: Script for integration with Logs API
Script for integration with Logs API. Contribute to yndx-metrika/logs_api_integration development by creating an account on GitHub.
-
Получаю ошибку Column 72, name: ProductsName, type: Array(String), parsed text: <EMPTY>ERROR
Code: 130, e.displayText() = DB::Exception: Array does not start with '[' character (version 21.3.4.25 (official build)) -
спасибо!
-
-
Kill mutation емнип попробуйте:
https://clickhouse.tech/docs/ru/sql-reference/statements/kill/KILL | Документация ClickHouseKILL Существует два вида операторов KILL: KILL QUERY и KILL MUTATION KILL QUERY KILL QUERY [ON CLUSTER cluster] WHERE <w
-
Подскажите, можно как-то в столбце подзапроса, который uniqExactState часть значений заменить на что-то типа null, чтобы потом при uniqExactMerge они не учлись?
-
А подскажите, какой порядок аттачей при старте/рестарте?
Как я понял - дикты, потом таблицы в дефолте, и потом дикты и таблицы во всех остальных базах? -
спасибо, это как раз и смотрел
-
вопрос еще актуален)
-
попробуйте
https://bitbucket.org/clickhouse_pro/metrika2clickhouse/src/master/
Питоновский проект яндекс забросил и не саппортит
ссылка выше тоже не сильно живая
но там хотя бы docker образ есть -
есть у яндекс браузера нормальный чат, где можно задавать вопросы и получать ответы?
-
удалось найти только их канал
-
-
потому что в какой то функции у вас первым аргументом должен быть массив, а приходит что то другое
ссылка на внутренний корпоративный инструмент яндекса тут у большинства не откроется, так что не знаем как вам помочь -
Ок, поняла, а что в Clickhouse функцией считается, потому что у меня только SELECT и JOIN в запросах и явным образом функций нет
-
без самого запроса это гадание на кофейной гуще 🙂
-
https://clickhouse.tech/docs/en/
SQL Reference -> FunctionsOverview | ClickHouse DocumentationWhat Is ClickHouse? ClickHouse® is a column-oriented database management system (DBMS) for online analytical processing
-
вот функции которые бывают
-
например
select has(columnArray, 5) from table
вот тут has функция -
Ок, сообразила, спасибо
-
Вот пример запроса, что вместо null можно подставить?
select uniqExactMerge(v_st)
from (
select k, if(k = 1, ->null<-, v_st)
from (
select k, uniqExactState(v) as v_st
from (
select 1 as k, 56 as v
union all
select 1 as k, 26 as v
union all
select 2 as k, 56 as v
)
group by k
)
) -
можно просто uniqExacStateIf
-
а почему в uniqExactState(v) as v_st не подставите if? типо uniqExactState(if(k = 1, null, v)) as v_st
-
ещё в вашем случае можно можно просто where k!=1...
-
о, а это мне может помочь... попробую.
-
красивая
-
!report
-
/report
-
-
with не хранит ничего в кэше, поэтому каждый раз будет выполнен.
-
-
вы уверены ?
я не знаю насчет кх, но например в пг он вычисляется только 1 раз.
подозреваю, что в кх тоже -
-
-
Подскажите пожалуйста, какая версия считается наиболее стабильной на данный момент для обновления?
-
Indentical subqueries (or CTE) execute only once. (condition pushdown) · Issue #21992 · ClickHouse/ClickHouse
After #2301 fix, clickhouse execute sub queries from single level of query only once. But it doesn't work in case we are using that sub query in WHERE condition and that conditions is being...
-
короче какая-то каша с cte, по доке вообще непонятно)
-
что нужно делать, если в ЗК отсутствует определённая реплика в /path/replicas таблицы, и соответственно реплика не может подняться, и выходит ошибка:
{} <Error> Application: Coordination::Exception: No node, path:
Cannot attach table from metadatafile -
-
-
SELECT count(), c_value FROM table ARRAY JOIN column AS c_value GROUP BY c_value
-
-
Добрый вечер, как можно в КХ повторить что то типа этого SELECT
customerID
FROM
table (values (1),(2),(3)) as a (customerID)
except
select
customerID
from
customers; -
-
что это делает вообще ?
что вы хотите сделать ? -
Есть список и из него необходимо вернуть значения, которые не записаны в КХ
-
WHERE customerID NOT IN (...) ?
-
where customerid not in () ?
-
в скобках могут быть значения через запятую или подзапрос
-
Это вроде вернёт значения из КХ, которых нет в списке, а мне надо что бы вернул значения из списка(не записанного в КХ), которых нет в КХ
-
ну наоборот сделайте
-
Один список записан в КХ, другой нет, и мне надо получить те значения, которые не записаны в КХ
-
SELECT arrayJoin([1, 2, 3]) AS a
WHERE a NOT IN (2, 3)
┌─a─┐
│ 1 │
└───┘
=> select arrayJoin([values]) as alias where aliais not in (select custmerid from table) -
может этот способ не самый производительный и можно как-то через джоин провернуть
-
Спасибо
-
Ну уже хотя бы буду знать что дальше можно делать, может найду как оптимизирвоать
-
select id from qwe right anti join (select toInt32(arrayJoin([1,2,3,4])) as id) as values using (id)
┌─id─┐
│ 4 │
└────┘
ну вот еще пример небольшой (там троху костылей из-за примера пришлось накинуть)
select * from qwe
SELECT *
FROM qwe
┌─id─┐
│ 1 │
└────┘
┌─id─┐
│ 3 │
└────┘
┌─id─┐
│ 2 │
└────┘ -
Спасибо
-
1. убрал с /.../metadata/databasename/*.sql все файлы
2. запустил инстанс
3. прогнал скрипт создания таблиц
4. где то скрипт выполнился успешно, где то нет. (где выполнился скрипт, создался path в ЗК, и в replicas заводится ваша реплика)
5. там где вышла ошибка при созданнии, что в ZK уже есть path с метаданными определённых таблиц, я просто переместил файлы(*.sql) в metatadata/databasename/ и выполнил ATTACH TABLE dbname.tablename -
Всем привет, у кого нить есть пример запроса с применением sequenceCount?
-
-
-
clickhouse :) CREATE TABLE outcomes_hourly_dist AS outcomes_hourly_local ENGINE = Distributed('clickhouse', default, outcomes_hourly_local, rand())
CREATE TABLE outcomes_hourly_dist AS outcomes_hourly_local
ENGINE = Distributed('clickhouse', default, outcomes_hourly_local, rand())
Query id: 94087ebb-4e72-47dd-ad25-4bccd54aeb14
0 rows in set. Elapsed: 0.002 sec.
Received exception from server (version 21.2.7):
Code: 60. DB::Exception: Received from clickhouse-0.clickhouse-headless:9000. DB::Exception: Table default.outcomes_hourly_local doesn't exist. -
-
Доброй ночи, коллеги @milovidov_an @proller, очень прошу о помощи по clickhouse-cpp, не знаем к кому еще идти 😉
-
SHOW CREATE TABLE outcomes_hourly_local;
-
clickhouse :) SHOW CREATE TABLE outcomes_hourly_local;
SHOW CREATE TABLE outcomes_hourly_local
Query id: 075c8e2c-f936-441b-b284-b585121654b0
0 rows in set. Elapsed: 0.002 sec.
Received exception from server (version 21.2.7):
Code: 390. DB::Exception: Received from clickhouse-0.clickhouse-headless:9000. DB::Exception: Table `outcomes_hourly_local` doesn't exist. -
Ну кх говорит, что outcomes_hourly_local не существует
-
Так я и хочу её создать)
-
Нет,
Вы создаете другую таблицу на основании outcomes_hourly_local, которой не существует
CREATE TABLE outcomes_hourly_dist -
Такс, тогда секундочку. Еще покурю немного
-
У меня есть вот такой скрипт:
for tbl in discover errors groupassignee groupedmessage outcomes_hourly migrations outcomes_mv_hourly outcomes_raw sentry sessions_hourly sessions_hourly_mv sessions_raw transactions; do
for ((i=0;i<3;i++)); do
clickhouse-client --database=default --host=clickhouse-$i.clickhouse-headless --port=9000 --query="CREATE TABLE ${tbl}_dist AS ${tbl}_local ENGINE = Distributed('clickhouse', default, ${tbl}_local, rand())";
done
done -
-
Хорошо, он создает Distributed таблицы на основе локальных.
У вас проблема в том, что локальных таблиц нет -
Ааа, это навевает на мысли. Спасибо. Пойду разбираться.
-
Еще раз спасибо, действительно нашёл где создаются таблицы _local.
-
Подскажите как посмотреть логи почему кликхаус упал?
-
Буквально час назад работал в обычном режиме и теперь после каждого запроса уходит в рестарт
- 08 April 2021 (122 messages)
-
кажется нашел крит ошибку.
Подскажите как можно исправить?
https://gist.github.com/Spar9a/8ddd8391f3505ce50f52e32ae32f243egist:8ddd8391f3505ce50f52e32ae32f243eGitHub Gist: instantly share code, notes, and snippets.
-
e1771656-de62-4430-88e4-3d80bafe9e63 найдите этот запрос в логе и пишите ошибку на гитхаб
-
подскажите, сделал для query_log и query_thread_log вместо <partition_by> свой <engine>ENGINE = MergeTree PARTITION BY (event_date)
ORDER BY (event_time)
TTL event_date + 14 day DELETE
SETTINGS ttl_only_drop_parts=1</engine>
дропнул обе таблицы, рестертнул КХ, query_thread_log пересоздался, а qury_log нет, пропал
как его теперь вернуть?)) -
Добрый день! Подскажите пожалуйста как сделать правильный запрос LIKE с двумя символами -
У меня есть такой запись:
xn--ms-3ye.example.ru
Не могу сделать выборку с этой командой:
SELECT host FROM default.access_logs WHERE host LIKE '--'
Как это сделать правильно? -
Твой запрос эквивалентен host = '--'. Ты хочешь LIKE '%--%'
-
решение : нужно было слово INTERVAL перед количеством дней
-
Можно попробовать через табличную функцию input (INSERT ... SELECT ... FROM input(...)) В самом clickhouse-cpp особых средств нет, насколько я знаю.
-
На всякий случай создал фич реквест на кое что похожее: https://github.com/ClickHouse/ClickHouse/issues/22832Add a setting `insert_select_null_as_default` · Issue #22832 · ClickHouse/ClickHouse
Use case CREATE TABLE default_test (s String DEFAULT 'Hello') ENGINE = Memory; -- works, see the `input_format_null_as_default` setting. INSERT INTO default_test VALUES ('Wo...
-
\0/ Контекст: в String поле сохраняю маленький архив (долгая история)
Скачивается архив простой командой:
clickhouse-client -q "SELECT model FROM artifacts WHERE date='2021-12-01'" --format RawBLOB > model.tar
Воркс файн
Проблема: старые версии CH клиента не умеют RawBLOB - DB::Exception: Unknown format RawBLOB
Перебрал несколько других форматов, нашёл рабочий костыль - использовать TSVRaw и убирать \n который он добавляет
clickhouse-client -q "SELECT model FROM artifacts WHERE date='2021-12-01'" --format TSVRaw > model.tar | truncate -s -1 model.tar
Может есть более простой вариант и вообще я всё делаю не так?) -
-
Всем привет! Есть api c авторизацией из которой хочется получать данные. Ответ она выдает вот такой:
{"data":[{"id":1,"name":"one"},{"id":2,"name":"two"}]}
Получать хочется в виде таблицы:
id|name|
1|one |
2|two |
Поскольку api с авторизацией, то доступен только справочник как я понимаю. И тут две проблемы которые не получается решить:
1. нет могу найти подходящую структуру DDL чтобы описать такую таблицу с format JSON. Может у кого-то есть пример?
2. было бы норм если бы справочник отдавал просто весь json и дальше с помощью функций его распарсить, но справочнику нужен ключ, можно ли как-то задать фейковый ключ, а весь json поместить в значение? -
Привет!
У нас в какой-то момент стала падать запись в базу в yandex cloud, причем в том числе падает то что раньше записывалось. В логах
Code: 241, e.displayText() = DB::Exception: Memory limit (total) exceeded: would use 3.00 GiB (attempt to allocate chunk of 13833584 bytes), maximum: 3.00 GiB (version 21.3.4.25 (official build)) (from [2a02:6b8:c11:3522:0:4457:ecc7:6002]:50050) (in query: INSERT INTO dialogs FORMAT TabSeparated ), Stack trace (when copying this message, always include the lines below):\n\n0. DB::Exception::Exception<char const*, char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, long&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*&&, char const*&&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&, long&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&) @ 0x86261a5 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n1. MemoryTracker::alloc(long) @ 0x8625afd in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n2. MemoryTracker::alloc(long) @ 0x8625864 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n3. MemoryTracker::alloc(long) @ 0x8625864 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n4. MemoryTracker::alloc(long) @ 0x8625864 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n5. Allocator<false, false>::realloc(void*, unsigned long, unsigned long, unsigned long) @ 0x865e426 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n6. void DB::PODArrayBase<8ul, 4096ul, Allocator<false, false>, 15ul, 16ul>::resize<>(unsigned long) @ 0x8a75913 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n7. DB::ColumnString::insertRangeFrom(DB::IColumn const&, unsigned long, unsigned long) @ 0xf205063 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n8. DB::ColumnArray::insertRangeFrom(DB::IColumn const&, unsigned long, unsigned long) @ 0xf17898b in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n9. void DB::SquashingTransform::append<DB::Block const&>(DB::Block const&) @ 0xe8d5625 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n10. DB::Block DB::SquashingTransform::addImpl<DB::Block const&>(DB::Block const&) @ 0xe8d4eb1 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n11. DB::SquashingBlockOutputStream::write(DB::Block const&) @ 0xec65359 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n12. DB::CountingBlockOutputStream::write(DB::Block const&) @ 0xeb80dce in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n13. DB::copyData(DB::IBlockInputStream&, DB::IBlockOutputStream&, std::__1::atomic<bool>*) @ 0xe8d57ca in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n14. DB::executeQuery(DB::ReadBuffer&, DB::WriteBuffer&, bool, DB::Context&, std::__1::function<void (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::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&)>) @ 0xf13698e in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n15. DB::HTTPHandler::processQuery(DB::Context&, DB::HTTPServerRequest&, DB::HTMLForm&, DB::HTTPServerResponse&, DB::HTTPHandler::Output&, std::__1::optional<DB::CurrentThread::QueryScope>&) @ 0xf84da4a in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n16. -
DB::HTTPHandler::handleRequest(DB::HTTPServerRequest&, DB::HTTPServerResponse&) @ 0xf851bde in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n17. DB::HTTPServerConnection::run() @ 0xf8daa0f in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n18. Poco::Net::TCPServerConnection::start() @ 0x11f84caf in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n19. Poco::Net::TCPServerDispatcher::run() @ 0x11f866c1 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n20. Poco::PooledThread::run() @ 0x120bcde9 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n21. Poco::ThreadImpl::runnableEntry(void*) @ 0x120b8c4a in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n22. start_thread @ 0x76db in /lib/x86_64-linux-gnu/libpthread-2.27.so\n23. __clone @ 0x121a3f in /lib/x86_64-linux-gnu/libc-2.27.so\n
получается записывать только очень небольшие порции данных и даже они, кажется рандомно падают
Когда я это обнаружил, попробовал обновить кликхаус на более свежую версию 21.3 LTS. Запись тоже падает, но ещё в логах появились ошибки вида:
Code: 252, e.displayText() = DB::Exception: Too many parts (300). Parts cleaning are processing significantly slower than inserts, Stack trace (when copying this message, always include the lines below):\n\n0. DB::Exception::Exception<unsigned long&>(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long&) @ 0x865dbde in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n1. DB::MergeTreeData::delayInsertOrThrowIfNeeded(Poco::Event*) const @ 0xf5f2e33 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n2. DB::PushingToViewsBlockOutputStream::writePrefix() @ 0xec5c60b in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n3. DB::SystemLog<DB::MetricLogElement>::flushImpl(std::__1::vector<DB::MetricLogElement, std::__1::allocator<DB::MetricLogElement> > const&, unsigned long) @ 0xf0880ef in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n4. DB::SystemLog<DB::MetricLogElement>::savingThreadFunction() @ 0xf086490 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n5. ThreadFromGlobalPool::ThreadFromGlobalPool<DB::SystemLog<DB::MetricLogElement>::startup()::'lambda'()>(DB::MetricLogElement&&, DB::SystemLog<DB::MetricLogElement>::startup()::'lambda'()&&...)::'lambda'()::operator()() @ 0xf086336 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n6. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x865165f in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n7. void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void ThreadPoolImpl<std::__1::thread>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()> >(void*) @ 0x86550f3 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug\n8. start_thread @ 0x76db in /lib/x86_64-linux-gnu/libpthread-2.27.so\n9. __clone @ 0x121a3f in /lib/x86_64-linux-gnu/libc-2.27.so\n (version 21.3.4.25 (official build))
Нашел тут рекомендацию для первой проблемы уменьшить Background pool size, не помогло.
Подозреваю,что проблемы начались после какой-то операции с кластером 18 марта, но не уверен, так как в этот период запись падала из-за проблем на нашей стороне и мы починили их только недавно. У той операции не указан пользователь, она видимо сервисная? Как узнать, что это было? -
Всем привет! Есть таблица T, в ней данные за много лет , партицировано по дате. Когда нужно “задним” числом заменить данные, мы готовим блоки данных в таблице T_ (такой же точно структуры, что и T), а потом просто делаем REPLACE PARTITION за нужные даты. НО кажется это не будет работать в случае REPLICATED и DISRTRIBUTED таблиц, а на продакшене нас именно это ждёт. Как быть?
-
1) первое падение
у вас какое кол-во колонок при вставке?
сколько паралельных вставок?
2) too many parts
вы слишком часто вставлете, увеличивайте размер батча, база у вас не успевает мержить
https://docs.google.com/document/d/1WaGMCPh6areffDjvWDUnzhQ4G7NiVDMlikylcNR2t90/edit?usp=sharingToo many partsClickHouse. “Too many parts” One of the first problems the people usually meet when starting to use ClickHouse is “Too many parts” exception - usually, they just try to insert into MergeTree one row at a time. Later the problem can return when you start scaling the system up and go from dev to ...
-
Distributed в себе данные не хранит, поэтому ее это никак не заафектит. Replace partition тоже должен работать если движок у T_ тоже replicated
-
почему не будет?
REPLACE PARTITION должна реплицировать новые system.parts на другие реплики через ZK
а Distributed таблицам вообще пофиг
как только данные отреплицируются
оно будет показывать актуальные результаты вне зависимости от реплики
и до этого момента будет показывать разные результаты , в зависимости от того с какой реплики для шарда данные прочитало -
1) точно не скажу но до 30. В первых запусках было 4 процесса, но я пробовал снижать до 1, падает также
2) появляется, когда я не делаю внешних вставок. Там отложенный эффеккт? нужно дропнуть очередь? Как это сделать? -
1) ну это не много
попробуйте помониторить что у вас отожрало память
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-who-ate-my-memory
2) не очень понял, too many parts это ошибка именно при вставках
но судя по тому что в stacktrace есть
ThreadFromGlobalPool::ThreadFromGlobalPool<DB::SystemLog<DB::MetricLogElement>::startup()::'lambda'()>(DB::MetricLogElement&&, DB::SystemLog<DB::MetricLogElement>::startup()::'lambda'()&&...)::'lambda'()::operator()()
может быть вам надо запустить TRUNCATE TABLE system.metric_log -
Вот я как раз сейчас буду пробовать это, только test bed подготовлю
-
Но вопрос на самом деле больше про distributed
-
Если T_ просто создана на одном из узлов и не является distributed, то начинаются вопросы. А если она distributed, то надо на каждом узле отдельно подавать REPLACE PARTITION, что не есть хорошо
-
-
она не может быть Distributed
она должна быть ReplicatedMergeTree
чтобы вы подготовили данные и среплицировали их
а потом среплицировали через ZK сам запрос на REPLACE PARTITION -
Ок, всё верно. Но Целевая таблица именно Distributed, и мне нужно корректно в ней заменить один part, на одну дату.
-
Добрый день! Может кто сталкивался, появилась проблема на программном рейде где КХ, почему то сам рейдовый диск в 100% утилизации, а диски 20-30% максимум? вроде бы производительность не упала, очень странно.
-
Partition и Distribution ключи разные
-
вы в distribued запускаете ALTER TABLE .. REPLACE PARTITION ? ;)
и оно у вас не ругается ни на что? -
у вас RAID5?
шифврование включено какое то? -
Не запускаю, потому что оно конечно же ругается и это ожидаемо
-
Пока вижу вариант на половине узлов кластера подавать repl partition на исходных replicatedMergeTree таблицах. Вот если бы можно было дописать on cluster !
-
У нас 2 шарда и 2 реплики, всего 4 узла
-
нет raid10 работал год, сейчас появились такие проблемы
-
HDD ? SSD?
-
ssd
-
-
cat /proc/mdstat говорит что-то необычное?
-
неа
-
мб с ядро что то не давно были обновления
-
подскажите плиз
я создал sql юзера c таким же именем, какое есть в xml (так говорит ошибка)
мне надо удалить xml пользователя. но в /etc/clickhouse-server/users.xml я его не нашел
где он может быть?
e.displayText() = DB::Exception: Found User `dwh` in 2 storages: users.xml, memory -
в обшем проблема в ядре Linux 3.10.0-1160.15.2.el7.x86_64
-
1) показывает только саму загрузку. Если пускать в один поток порциями по 50000 строк, то успевает записать десяток кусков, затем падает с переполнением памяти. Запрос показывает только сами инсерты (не знаю, откроется ли у тебя) https://yql.yandex-team.ru/Operations/YG7zmSyLNTG-GCnSV-vIt1VGH2AEJRTgP6DFd-eyQoI=
Я перепутал про размер таблицы, там на самом деле 56 колонок, но кажется это не должно сильно менять результат.
Проблема с too many parts кажется ушла. Я не уверен, что повлияло, truncate или то что я облако предложило обновить кластер и я это сделал -
привет
создал матвьюшку на таблице MergeTree, стрельнула ошибка "Too many partitions for single INSERT block "
версия клика 19.8.3.8
почему вдруг так? -
т.е. стреляет сам запрос создания матвьюшки
-
какой partition by в MergeTree таблице?
-
-
с POPULATE
партиционирование делаем по дням -
делайте партиции по месяцам
не рекомендуется иметь больше 100 партиций на таблицу -
-
спасибо
-
-
Помогите пожалуйста
после обновления КХ начал ругаться на протобуф
Multiple columns (device_xipAddress_i, device_xipAddress_ip) cannot be serialized to a single protobuf field
раньше все работало без проблем
обновлялись с 20.6.4.44 to 21.3.4.25 -
хотя такое поле одно device_xipAddress_ip
-
из заметного, если посмотреть на запрос в system.processes, то в нем очень много thread_ids — больше сотни
-
Точно не скажу, но на одном из митапов услышал ответ, что запрос можно убить только в некоторых моментах его выполнения, то есть может настать момент выборки, при котором его уже не убить
-
есть это так, то это боль (
-
Коллеги, здравствуйте! Немного отстал от релизов, не могу найти в чем суть перехода на формат .inner_id.<...> вместо .inner.<mv_name> при создании MV без целевой таблицы. Плюс возникает вопрос как с этим быть, если стоит задача переноса данных со старой схемы на новую (с 20.5.2 на 21.3.4)?
-
atomic базы, чтобы была возможность переименовать MV
https://kb.altinity.com/engines/altinity-kb-atomic-database-engine
https://github.com/adevyatova/ClickHouse/blob/b41f1abf981bd0bb936238872f996d8607092a6e/docs/ru/engines/database-engines/atomic.md -
а вообще просто не надо использоваться MV без синтаксиса TO.
теряете перфоманс и обретаете гемор -
обычный баг
-
т е проблема в версии?
-
Согласен. Получается просто так не обновиться без редактирования схемы?
-
? c чего вы взяли
-
просто отмените Atomic
# cat /etc/clickhouse-server/users.d/disable_atomic_database.xml
<?xml version="1.0"?>
<yandex>
<profiles>
<default>
<default_database_engine>Ordinary</default_database_engine>
</default>
</profiles>
</yandex> -
Я имел в виду, если все-таки переходить с Ordinary на Atomic
-
ну ОК перешли вы на Атомик. Чем вам мешает .inner_id.<...> ?
-
Если есть цепочки MV, которые обращались к inner.<>
-
а ну считайте что unexpected behaivor. Заведите issue напишите, что вот такая фигня теперь.
-
привет
у нас после обновления с 19.4 до 21.3 появились странные warning'и
на реплике:
2021.04.08 17:00:18.627885 [ 724 ] {} <Warning> ol_olap_2.main_at (ReplicatedMergeTreePartCheckThread): Checking if anyone has a part 20110601_20110630_0_5197_1115 or covering part.
2021.04.08 17:00:18.649137 [ 724 ] {} <Warning> ol_olap_2.main_at (ReplicatedMergeTreePartCheckThread): Found parts with the same min block and with the same max block as the missing part 20110601_20110630_0_5197_1115. Hoping that it will eventually appear as a result of a merge.
мы вставляем только на одну из реплик, там вот так:
2021.04.08 17:00:18.583382 [ 3039 ] {} <Trace> ol_olap_2.main_at: Created log entry /twolink/clickhouse/replicationolap/002/ol_olap_2/main_at_8619/log/log-0002736742 for merge 20110601_20110630_0_5197_1115
2021.04.08 17:00:18.595542 [ 3167 ] {} <Trace> ol_olap_2.main_at: Executing log entry to merge parts 20110601_20110630_0_5192_1114, 20110610_20110614_5193_5193_0, 20110602_20110602_5194_5194_0, 20110611_20110611_5195_5195_0, 20110617_20110617_5196_5196_0, 20110619_20110619_5197_5197_0 to 20110601_20110630_0_5197_1115
2021.04.08 17:00:18.625778 [ 3167 ] {} <Trace> ol_olap_2.main_at: Renaming temporary part tmp_merge_20110601_20110630_0_5197_1115 to 20110601_20110630_0_5197_1115.
2021.04.08 17:00:18.653386 [ 7083 ] {} <Trace> InterserverIOHTTPHandler: Request URI: /?endpoint=DataPartsExchange%3A%2Ftwolink%2Fclickhouse%2Freplicationolap%2F002%2Fol_olap_2%2Fmain_at_8619%2Freplicas%2F2link.cluster001.shard002.replica001&part=20110601_20110630_0_5197_1115&client_protocol_version=5&compress=false
2021.04.08 17:00:18.653399 [ 7083 ] {} <Trace> ol_olap_2.main_at (Replicated PartsService): Sending part 20110601_20110630_0_5197_1115
2021.04.08 17:00:18.654327 [ 6866 ] {} <Trace> InterserverIOHTTPHandler: Request URI: /?endpoint=DataPartsExchange%3A%2Ftwolink%2Fclickhouse%2Freplicationolap%2F002%2Fol_olap_2%2Fmain_at_8619%2Freplicas%2F2link.cluster001.shard002.replica001&part=20110601_20110630_0_5197_1115&client_protocol_version=5&compress=false
2021.04.08 17:00:18.654343 [ 6866 ] {} <Trace> ol_olap_2.main_at (Replicated PartsService): Sending part 20110601_20110630_0_5197_1115 -
-
-
Всем еще раз привет. Собственно вчера был запрос про WITH.
Есть ли какая-то опция(эксперементальная). Хотим зафильтровать вложенные запросы через in как результат другого запроса.
Вложенных запросов штук 5-7, так что тупо поместить подзапрос во все in такое себе удовольствие.
Можно ли результат подзапроса сохранить в рамках запроса? Запрос выполняется на сервере быстрее чем получить в приложении результат первого запроса, и передать его во второй запрос с подзапросами -
Товарищи, а что это такое может быть?
2021-04-08T16:10:37+0300 tn173 run[1212]: 2021.04.08 16:10:37.596829 [ 21174 ] {} <Error> ServerErrorHandler: Poco::Exception. Code: 1000, e.code() = 104, e.displayText() = Connection reset by peer, Stack trace (when copying this message, always include the lines below):
2021-04-08T16:10:37+0300 tn173 run[1212]: 0. Poco::IOException::IOException(int) @ 0x18ba8abf in /usr/bin/clickhouse
... -
Так смотря чем пишете в КХ...
Если github.com/mailru/go-clickhouse - то надо обновить, это поправлено с мес назадGitHub - mailru/go-clickhouse: Golang SQL database driver for Yandex ClickHouseGolang SQL database driver for Yandex ClickHouse. Contribute to mailru/go-clickhouse development by creating an account on GitHub.
-
Подскажите, пожалуста, как задать привилегии пользователя из конфига?
-
всем привет. можно как-то сгенерировать массив состоящий из дат (2020-01-01,2020-01-02,..2020-01-09), на основании первой и последней даты?
например, у меня есть день начальной и день последней активности пользователя. -
Функции range() + dateDiff())
-
Если это невозможно, подскажите, как задать привилегии пользователям после рестарта clickhouse
-
спасибо, то что доктор прописал 👍
-
timeSlotes
-
например какие? В профиле пользователя
<yandex>
<profiles>
<ro>
<readonly>2</readonly>
</ro>
<users>
<user1>
<password_sha256_hex>xxx</password_sha256_hex>
<profile>ro</profile>
<quota>default</quota>
<networks><ip>10.0.0.0/8</ip></networks>
</user1> -
К примеру, аналог
GRANT SELECT ON db.* TO user; -
спасибо 👍
-
ну а я это и написал readonly>2 позволяет читать все и менять настройки через settings
но в XML очень ограниченные возможности, либо RO на все, либо RW на все -
Добрый вечер, подскажите, есть запрос:
SELECT uniq(DeviceID)
from events
where EventDateTime between '2020-12-28 00:00:00' and '2020-12-28 23:59:59';
необходимо в одном запросе получить данные со сдвигом в час за сутки, т.е. between '2020-12-28 00:00:00' - INTERVAL 1 hour and '2020-12-28 23:59:59' - INTERVAL 1 hour; и т.д. за 24 часа - это возможно реализовать? -
Да, наверно можно через if аналог case?
-
буду признателен за более развернутый ответ)
-
Да, но мне важно дать RO не ко всем базам. Можно ли каким-либо ещё способом задать подобные привилегии автоматизированно?
-
правильно я понял, что хотите сделать подсчет uniq(DeviceID) в каждом диапазоне времени?
будет проще, если покажите пример -
все верно, эту задачу можно решить простым запросом просто сдвигая на час временные рамки - но это 24 запроса, по одному на каждый час.
-
Ну там можно перечислить базы к которым давать
-
Это возможно. В Гугл группс я делал пример через массивы. Стейты можно складывать +
-
-
select toStartOfHour(t) as h, uniq(DeviceID)
from events
group by h -
увы, но в этом случае мы получим количество уникальных id за час, тогда как нужно за сутки, но с шагом в час - все немного сложнее)
-
тогда нужно через ARRAY JOIN range(24) as day
ща постараюсь запрос написать -
как-то так:
select h, uniq(device_id)
from events
ARRAY JOIN timeSlots(toDateTime('2020-12-28 00:00:00'), toUInt32(3600*24), 3600) as h
WHERE events.t between h and date_add(DAY, 24, h)
group by h -
спасибо! все работает с небольшой поправкой - hour вместо day
-
доброе время суток... Подскажите пожалуйста, как бороться настройками клика с ZK too many parts, помимо переработки кода?
-
> too many parts
Означает банальную вещь, что вы создаете слишком много партов -
Либо у вас очень странная схема, либо нужно править код
-
В крайнем случае можно использовать Buffer таблицы либо clickhouse-bulk
-
это понятно, но можно как-то увеличить этот лимит?
-
Ну это борьба с симптомами а не проблемой
-
и это понятно
-
хотелось бы СЕЙЧАС решить проблему симптоматично
-
настройку можно поднять, даже для конкретной таблицы
-
а какую?)
-
parts_to_throw_insert
-
не работает в 21.3.4.25 на уровне профиля
-
Это табличная настройка
-
ALTER TABLE MODIFY SETTTING parts_to_throw_insert=500
-
понял, простите. Спасибо
-
на соседнем кластере ETL работает, но версия "архивная" :)
-
Это достаточно древняя настройка, емнип
-
проблему создает именно один сценарий с разными ошибками
-
точнее, на одном стенде ошибок нет, а на обновленном есть
-
что такое ZK too many parts ?
при чем тут ZK ? -
согласен, это настроенные ограничения чувствительности клика
-
подскажите, как их увеличить плз
-
Настройки MergeTree таблиц | Документация ClickHouse
Настройки MergeTree таблиц Значения настроек всех MergeTree таблиц собраны в таблице system.merge_tree_settings. Их можн
-
Добрый вечер. Из-за того, что при вставке в дистрибутивную таблицу выдавалась ошибка на одной из нод о max_parts_per_insert_block. В папка /data/distrub_table_name/shard скопилось около 50000 тысяч бинарников. Общий размер ~ 200гб В конфиге ноды , куда вставляется, увеличили количество кусков - ошибка пропала. Количество файлов уменьшается достаточно медленно. Можно ли как-то оптимизировать отправку ? Потому что ни ЦП/диски/память на сервере не утилизированы полностью. Или все зависит от конечного сервера, куда все это должно полететь.
Менял distributed_directory_monitor_sleep_time_ms - уменьшал, distributed_directory_monitor_max_sleep_time_ms - уменьшал, distributed_directory_monitor_batch_inserts - было включено, background_distributed_schedule_pool_size - поставил количество ядер. - 09 April 2021 (155 messages)
-
Коллеги, нужна ваша экспертиза, выручайте. Мне нужно по http протоколу из/в clickhouse выгружать/загружать данные в/из python, при этом еще и ssl сертификат подкрутить. Либа clickhouse-driver хорошо работает с нативным протоколом, но вот со всем остальным проблема какая-то. Подскажите как лучше поступить
-
Не понял проблемы. Проблема в том, что нужно обязательно использовать HTTP вместо нативного TCP?
clickhouse-driver работает только с нативным протоколом по TCP/SSL
а если нужен HTTP, то в питоне вроде бы полно довольно развитых средств для работы с HTTP(s), и clickhouse-driver тут не при чем -
-
Подскажите, можно ли объединить следующие запросы средствами кликхауса или необходимо писать внешний скрипт?
Первый запрос получает время и айдишники:
SELECT img as imgId, min(time) as imgTime from hide.klo WHERE status=0 and userId=123 GROUP BY imgId
А в последующих запросах нужно для каждой связки время+картинка
посчитать кол-во уникальных юзеров котрые смотрели картинку (imgId) после момента (imgTime):
SELECT img, uniq(userId) WHERE time>imgTime and img=imgId and status=0 GROUP BY img -
ну там весь стектрейс нужен
соединение у вас где то рвется, непонятно где -
Спасибо, отключал сервисы-клиенты по одному и, кажется, Нашел виновника
-
RBAC через XML Не работает
https://clickhouse.tech/docs/en/operations/access-rights/
только через SQL
если разрешить
access_management =1
в настройках профиляAccess Control and Account Management | ClickHouse DocumentationAccess Control and Account Management ClickHouse supports access control management based on RBAC approach. ClickHouse a
-
ну чтобы понять где именно рвется, всегда приводите полный stacktrace ошибки
оно кстати должно быть еще в system.stacktraces -
https://github.com/maximdanilchenko/aiochclient я этим пользуюсь, когда нужно по http ходить к кликхауз, а через сессию в aiohttp можно наверное настроить всё что нужно с сертификатомGitHub - maximdanilchenko/aiochclient: Lightweight async http(s) ClickHouse client for python 3.6+ with types converting
Lightweight async http(s) ClickHouse client for python 3.6+ with types converting - GitHub - maximdanilchenko/aiochclient: Lightweight async http(s) ClickHouse client for python 3.6+ with types con...
-
ЗДравствуйте, начал знакомится с clickhouse. Разбираюсь с вопросом сжатия базы и у меня возникло несколько вопросов.
1. в мануале написано
"
min_part_size - Минимальный размер части таблицы.
min_part_size_ratio - Отношение размера минимальной части таблицы к полному размеру таблицы.
method - Метод сжатия. Возможные значения: lz4, zstd.
"
min_part_size за что отвечает, с какого размера таблица будет сжиматься? сколько строк в таблице сжиматься не будет? непонятно.
2. непонятно, если в конфиг я внес эти параметры, то сжиматься будет только новая информация, или вся база потихоньку сожмется? -
-
First try to understand what a part represents https://clickhouse.tech/docs/en/development/architecture/#merge-tree
1. By default ClickHouse always compressed with LZ4. This setting allows you to add additional settings for when compression algorithm can change to zstd. Usually you write A LOT of small parts which are merged in background to bigger and bigger parts. At some point you might prefer switching to zstd to save on space but spend some more CPU cycles as it is a bit more CPU heavy.
2. All new parts that are created. This means: all newly inserted data and parts that are merged in background if there are parts that can be merged (ie they haven't hit the max part size limit yet and there are more than 1 part in partition)Architecture Overview | ClickHouse DocumentationOverview of ClickHouse Architecture ClickHouse is a true column-oriented DBMS. Data is stored by columns, and during the
-
There is no UPSERT support, but you can use a special engine that can de-duplicate data in background https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/replacingmergetree/
You'll also need to make sure you deduplicate data when you read. Either manually with a group by order by or by using FINAL modifier on queries https://clickhouse.tech/docs/en/sql-reference/statements/select/from/#select-from-finalReplacingMergeTree | ClickHouse DocumentationReplacingMergeTree The engine differs from MergeTree in that it removes duplicate entries with the same sorting key valu
-
Добрый день
для того чтобы поставить clickhouse-client на ubuntu:
FROM webdevops/php-nginx:ubuntu-18.04
RUN apt-get update -yq
RUN apt-get install -yq --no-install-recommends apt-utils
# Needed for apt-key command
RUN apt-get install gnupg -yq
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv E0C56BD4
RUN echo "deb http://repo.yandex.ru/clickhouse/deb/stable/ main/" | tee /etc/apt/sources.list.d/clickhouse.list
RUN apt-get update -yq
RUN apt-get install -y clickhouse-client
есть ли пример установки на alpine (webdevops/php-nginx:7.4-alpine)
спасибо -
Спасибо огромное за оперативный ответ! Можно я чуть поясню про мой кейс? Не очень пока поняла, подходит ли он мне.
У меня есть довольно тяжелая таблица (Таблица 1) юзер, дата активности, в ней есть колонка с датой блокировки пользователя(Таблица 2). Дата блокировки есть в отдельной таблице. Мне нужно с какой-то периодичностью джойнить эти две таблицы(причем таблицу 1 тоже надо брать всю так как заблокировать могут и старых юзеров) и при этом обновлять колонку с датой блокировки если вдруг что-то поменялось.
Вариант "в лоб" это каждый день дропать и перезаписывать таблицу результатом джойна, но таблица довольно тяжелая и кажется эито не эффективно.
В таком кейсе можно использовать вашу рекомендацию? -
Maybe running a query like this periodically? INSERT (user_id, username, ..., table_2.banned_on) SELECT * FROM table1 INNER JOIN table2 USING (user_id) WHERE table_2.banned_on > LAST_QUERY_RUN_DATE. This way you will insert duplicates only for newly banned users which after some time will rewrite older rows.
-
Добрый день!
В кликхауз есть замечательные функции для работы с адресами IPv6 https://clickhouse.tech/docs/ru/sql-reference/functions/ip-address-functions/#ipv6numtostringx
Но данные при этом должны хранится в формате FixedString16 в бинарном виде, в связи с этим возникает вопрос а как например через текстовый файл такой тип можно вставить в базу?Функции для работы с IP-адресами | Документация ClickHouseФункции для работы с IP-адресами IPv4NumToString(num) Принимает число типа UInt32. Интерпретирует его, как IPv4-адрес в
-
-
input | ClickHouse Documentation
input input(structure) - table function that allows effectively convert and insert data sent to the server with given st
-
смотря, что вам надо.
Если вы только по uuid и делаете фильтрацию в ваших запросах, то сойдет.
Проблема UUID в ORDER BY в том, что ключи после него не получится использовать для фильтрации обычно. -
Спасибо буду изучать вопрос дальше
-
В плане того, что если я хочу получать определенные просмотры например по id пользователей, которые сейчас uuid, и пользователи регистрируются в разное время чтобы природа uuid была схожая. Например все пользователи в рамках организации. Работает оно достаточно быстро пока. Я так понимаю в таком поиске может быть задействовано гораздо больше кусков данных если мы говорим о uuidV4
-
-
-
Всем привет.
Есть кластер из трёх шардов, в каждом по две реплики. Distributed движки для вставки не используются, балансировка по шардам и репликам осуществляется на стороне приложения, данные пишутся сразу в реплики, в день по 75-85к insert-ов. КХ 20.8.3.18.
Пару дней назад на одном (самом большом) шарде стали вылетать большие insert-запросы в реплицируемые таблицы с ошибкой ZooKeeper session was expired. Полез смотреть query_log - ошибки, оказывается, идут давно, просто раньше их было 200-300 в сутки, а пару дней назад резко стало под 2000 в сутки. Новых таблиц/insert-ов не добавлялось, остальные шарды работают как и прежде.
Подскажите, пожалуйста, куда копать?
Прочитал, что ошибка может быть связана с выбором лидера ЗК, поймал ошибку на большом запросе, полез смотреть
select * from system.zookeeper zk where zk.path = '/clickhouse/tables/.../leader_election'
Там есть запись о выборе нового лидера, сделанная через 14 секунд после падения моего запроса с ошибкой ZooKeeper session was expired.
Это оно? -
Всем привет. Обновляли КХ (пока стейдж с 20.5 на 20.8) после обновы выпадает: default expression and column type are incompatible.: Cannot attach table stage.name from metadata file /var/lib/clickhouse/metadata/stage/name.sql
Больше всего грешу на
LowCardinality(String) MATERIALIZE dictGet(...)
Словарь в дефолте типа
table_local -> table (distributed) -> dict(source(clickhouse(table 'table')
Раньше была бага с MATERIALIZED dictGet, но судя по Гиту -в 20.8 есть черипик. Что это может быть и куда стоит копать?
Есть предположения , что это из-за
column_name UInt8 ALIAS if(...)
либо в некоторых местах есть
dictGetOrDefault(...) -
Падает подключения к зукиперу. Посмотрите логи если есть дополнительные ошибки. Посмотрите и логи ЗК. Не падает ли он? Или лидер меняется часто?
-
-
К логам ЗК у меня, к сожалению, доступа нет, попрошу коллег посмотреть.
Утром, когда смотрел system.zookeeper, лидер менялся раз в 7-15 минут. Сейчас последняя смена была 2 часа назад. -
Я про лидер зукипера а не КХ. Лидер КХ меняется только соединения прерывается или лаг по репликации большой.
-
-
Можно но есть некоторые но. Щас скину ссылку.
-
Нужна помощь знатоков:
sql
Syntax error: failed at position 67 ('zzz') (line 1, col 67):
CREATE SETTINGS PROFILE `zz-zzzz-profile` TO `zz-zzzz` ON CLUSTER zzz SETTINGS
max_memory_usage = 48000000000 MAX = 48000000000,
max_execution_time = 30 MAX = 30;
Expected one of: end of query, identifier
что я делаю не так? В документации ON CLUSTER описан, CREATE ROLE, CREATE USER , GRANT в режиме ON CLUSTER работают. Версия сервера 21.2. -
буду благодарен
-
https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup47/materialized_views.pdf page 33clickhouse-presentations/materialized_views.pdf at master · ClickHouse/clickhouse-presentations
Presentations, meetups and talks about ClickHouse. Contribute to ClickHouse/clickhouse-presentations development by creating an account on GitHub.
-
Тут ещё тесты можно смотреть и надо менять вещи в определённом порядке чтоб не сломать https://github.com/ClickHouse/ClickHouse/pull/8988Modify Materialized View query by nvartolomei · Pull Request #8988 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Non-significant (changelog entry is not required) Changelog entry (a user...
-
-
да, понимаю, если в таблице столбцов не будет новых из селекта, то не заработает. Еще раз спасибо
-
Приветствую. Возникла проблема после обновления кластера КХ, на одну из реплик шарда не идет нагрузка, а на другую реплику идет вся нагрузка, при этом на другом шарде нагрузка разделяется поровну. Подскажите пожалуйста как это можно исправить?
Версия КХ - 21.3.5.42
Всего в кластере 4 ноды, 2 шарда по 2 реплики.
ОС: дебиан 9 -
Посмотрите есть ли сервер в system.clusters, проверьте значение колонки ...errors...
-
Есть, колонка еррор 0
-
На сервере который не принимает нагрузку проверьте значение колонки absolute_delay в таблице system.replicas
-
И ещё может select * from system.replication_queue where last_exception != ''
-
select * from system.replication_queue where last_exception != ''
пусто -
0
-
но вот заметил странную особенность у этого шарда
-
под рутом если заходить в клиент и делать запросы отвечает очень долго, у другого шарда такого нету
-
временами такое вот видел:
2021.04.09 13:06:35.602895 [ 9178 ] {} <Error> db.table_sharded (ReplicatedMergeTreeRestartingThread): Couldn't start replication: Replica /clickhouse/tables/1/table_sharded/replicas/192.168.100.6 appears to be already active (host: ch2.db.name, port: 9009, tcp_port: 9000, database: db, table: table_sharded, scheme: http, ). If you're sure it's not, try again in a minute or remove znode /clickhouse/tables/1/table_sharded/replicas/192.168.100.6/is_active manually. Code: 224, e.displayText() = DB::Exception: Replica /clickhouse/tables/1/table_sharded/replicas/192.168.100.6 appears to be already active (host: ch2.db.name, port: 9009, tcp_port: 9000, database: db, table: table_sharded, scheme: http, ). If you're sure it's not, try again in a minute or remove znode /clickhouse/tables/1/table_sharded/replicas/192.168.100.6/is_active manually, Stack trace (when copying this message, always include the lines below) -
Если в первых минутах после рестарта то ничего страшного в этом нет
-
Ясно, буду пробовать полный бутстрап шарда, возможно это поможет
-
как в INSERT INTO уточнить кластер?
-
INSERT INTO ON CLUSTER %cluster_name% SELECT .....
-
Expected one of: FORMAT, VALUES, SELECT, WITH, token, OpeningRoundBrack
-
А полный запрос?
-
INSERT INTO db.table ON CLUSTER cluster1 VALUES (1,1,1,1,1,1,1,1,1)
-
разве можно так делать ?
-
-
-
разобрался, правильно писать так
CREATE SETTINGS PROFILE `zz-zzzz-profile` ON CLUSTER `zzz` SETTINGS
max_memory_usage = 48000000000 MAX = 48000000000,
max_execution_time = 30 MAX = 30
TO `zz-zzzz`; -
distributed engine
-
Интересно а insert into cluster('zzz', table) работает? 🙈
-
cluster | ClickHouse Documentation
cluster, clusterAllReplicas Allows to access all shards in an existing cluster which configured in remote_servers sectio
-
Привет!
А как можно сделать такую вещь
есть таблица:
field1: [1,2,3]
field2: [a,b,c]
field3: [q,w,e]
Мне нужно написать что-то типа select field1, field3 where field2 = a
// в ответе я ожидаю 1, q => то есть значения из field2 матчатся по индексу массива для field1 и field3 -
Hi. Pretty much: select field1[indexOf(field2, 'a')]
-
Я через array join стал городить, но indexOf может и лучше, смотря какой конкретный кейс
with
[1, 2, 3] as a,
['q', 'w', 'e'] as b,
['a', 'b', 'c'] as c
SELECT arrayJoin(arrayZip(a,b,c)) as row
WHERE row.1 == 2 -
Спасибо) а indexof будет каждый раз вычисляться если я несколько раз так напишу ?
-
Вот я тоже думал как-то через джоин
Спасибо! -
А partial functions и APPLY?) SELECT COLUMNS('field1', 'field3') APPLY (ix -> indexOf(field2, ix)) * ... вроде нету поддержки пока что
-
А, типа через лямбду как-то ?
-
SELECT Query
SELECT Query SELECT queries perform data retrieval. By default, the requested data is returned to the client, while in c
-
Привет всем! Недавно стал пользоваться кликом, возник вопрос. Использую neighbor, он очень плохо ходит по строкам, вставляя значение по умолчанию каждые 3 строчки. Я как понял, он выходит за блоки данных внутри запроса. Меня интересует как можно настроить, что бы он весь селект в котором идёт neighbor считал как один блок данных. Сори если нубский вопрос.
-
Other | ClickHouse Documentation
Other Functions hostName() Returns a string with the name of the host that this function was performed on. For distribut
-
-
почитаю, спасибо большое
-
Ну вот у меня точно так же как в последнем примере с neighbor, только дата 1970 выводится ещё 4 раза посредт результата запроса
-
Всем привет! А как правильно "готовить" индексы в clickhouse. у меня есть база где есть массив из людей, массив из мест и ссылка на документ. В базе примерно 100кк записей, запрос типа
SELECT
count()
FROM
table
WHERE arrayExists(x->x like '%Person%', persons)
очень сильно тормозит
Куда смотреть?) -
-
-
-
а как кто ищет тогда? Индексы созданы.
-
потому что всю таблицу сканирует да еще потом и на CPU фильтрацию массива делате
у вас же массивы в primary key не входят
если добавите AND date_field BETWEEN ...
то будет сильно быстрее (зависит от того как много партов в BETWEEN попадет) -
Ну те здесь особо ничего не придумать? Только юзать что-то дополнительное?
-
Что-то вроде elasticsearch и тд?
-
Просто у меня же индексы повешены для этого.
-
Добрый вечер.
Не уверен что по адресу. Ни у кого нет работающего рецепта, как собрать tabix из исходников? По документации собирается с ошибкой, предполагаю что в свежем gulp проблема. -
какие именно индексы?
data skip index на массив?
какого типа? -
думаю легче в github tabix issue завести с шагами воспроизведения
-
мертвый 3года уже проект
-
INDEX idx_table_persons persons TYPE minmax GRANULARITY 3,
-
или лучше set использовать?
-
Друзья, нужна помощь.
Я тут полтора года назад подхватил проект, для которого выбрали CH, но у меня ощущение, что выбор неправильный, кажется, нужна другая БД.
Собственно, используется следующим образом:
-Есть некий бэк, который из json структуры формиует sql, который прилетает на расчет в клик, самые большие sql бывают прям сложные, несколько джойнов, 20 гигов оперативы правая таблица.
-Поток довольно большой, бывает и 500, и 1000 в секунду.
-Сейчас сделано следующим образом, данные все копируются через мастер-мастер на все реплики (8штук), бек рандомно выбирает ноду и шлет запросы.
Вообще работает, даже быстро. Но ощущение, что клик не про это -
По табличке like работает.
-
поэтому и не собирается. Думал, может ктото собрал себе, есть готовый рецепт
-
-
-
можно попробовать массив развернуть через array join И делать select count(distinct xx) where person like '%Person%'
насколько я знаю проверка массива однопоточна, при очень длинных массивах можно словить тормоза -
Массивы у меня строк на 20-50 максимум.
-
У меня в целом весит не count, a where
-
нам помогало подобное, попробуйте...
-
секунду
-
а что значит развернуть массив?
-
вроде нашел в документации, спасибо!
-
вот тут интересный момент
я не уверен что data skip index будет работать с arrayFilter
запустите clickhouse-client
SET send_logs_level = 'trace';
SELECT ...
смотрите по словам skip granulas
можно попробовать сделать отдельную таблицу со всеми уникальными значениями persons
и потом выбирать через sub query
CREATE TABLE uniq_persons (..) ENGINE MergeTree() ORDER BY person AS SELECT DISTINCT arrayJoin(arrayUniqoe(persons)) AS person FROM table;
SELECT count() FROM table
WHERE hasAny((SELECT person FROM uniq_persons WHERE person LIKE '%тест%'), persons);
или что нибудь типа такого
SELECT count() FROM table ARRAY JOIN persons AS person WHERE person LIKE '%тест%'; -
Гляну трейс, в целом persons больше чем основная таблица)
-
надо кешировать результаты если часто однообразное прилетает по 500-1000 в секунду
-
SQL большие, это не страшно
страшно если вы не понимаете что они делают и зачем...
что такое "копируются через мастер мастер"?
в clickhouse нет такого понятия как master
в нем все реплики равноправные -
-
-
Не однообразное
-
-
ну попробуйте взять самый большое =(частота * тяжесть) запрос и соптимизировать его... обычно помогает, если нет то надо предрасчитывать (т.е. у вас проблема не с QPS к КХ) а с тяжестью запросов как я понял, и они по прежнему аналитические...
если у вас запросы вида select * from xx where user=555
то имеет смысл базу сменить -
ну так это...
200 qps на шард
1600 qps на кластер
если данные влазят в одну реклпику для рассчета почему нет то? -
я так понял "сегодня 1600 завтра 16000..."
-
ну так надо уметь capacity рассчитывать
-
-
Гайз, а можно ли делать два WITH в одном запросе?
типа
with 1 as a
with 2 as b
select a, b -
With 1 as a, 2 as b SELECT a, b
-
понял, спасибо)
-
Все правильно говорите. Только бизнес не знает ничего как всегда, аналитики по предположительной нагрузки нет, прилетает волнами. Исходя из этих волн собрали кластер на 8 нод. Сейчас справляемся, все работает хорошо, быстро. Но есть ощущение, что можно попробовать какое-то еще решение, пока не выстрелило в ногу.
А запросы реально select xxx where + join что-нибудь и деление в верхнеуровневом селекте, к примеру -
-
ну единственное что тут страшно может быть это JOIN
но все зависит от того что в правой таблице...
ASOF JOIN кстати? или обычный LEFT \ INNER \ RIGHT ? -
-
ну норм вполне, INNER это HASH JOIN
все в CPU и память будет упираться если диски норм... -
-
вводите квоты
вводите платные запросы к API
тогда масштабироваться легче будет =) -
Привет. А случайно ни у кого нет сниппетов аля показать top 10 самых тяжелых селектов в кластере за последний день?
-
А есть какие-либо ограничения на размер (длину) самого запроса мутации? нужно выполнить запрос 30000+ символов 1000+ строк над относительно небольшой таблицей. Сам запрос принимается корректно, но мутация не выполняется с latest_fail_reason "Code: 393, e.displayText() = DB::Exception: There is no query (version 21.3.3.14 (official build))"
-
Вот для 1 машины вроде было, время под себя сделайте:
SELECT
initial_query_id,
formatReadableSize(memory_usage),
query
FROM system.query_log
WHERE (event_date >= today()) AND (event_time >= (now() - 7200))
ORDER BY memory_usage DESC
LIMIT 10 -
Спасибо! Я уже сгенерил кучу distributed view поверх system.* таблиц, чтобы на каждую ноду не ходить
-
если не жалко делитесь)
-
вместо distributed можно использовать функцию clusterAllReplicas('cluster_name', databse, table)
-
тип IPv6 можно вставлять как текст
-
решили вставлять как FixedString32 Просто не совсем понятно если в СН он как в FixedString16 может храниться, то как его в таком формате в базу лить?
-
да давно, очень давно, сделан специальный тип IPv6, можете забыть про fixedString, проблему решаете которой нет уже два года
-
в документации не нашел
-
если это так то здорово! Спасибо!
-
проверим
-
а стоп
-
тип колонки нужно IPv6 сделать, так?
-
и передавать значения как хексстринг?
-
нашел и документацию, спасибо!
-
да нет, как обычный стринг, само конвертирует в 16 байт
create table testi(I IPv6) Engine=Memory;
insert into testi values('2001:db8:ffff:ffff:ffff:ffff:ffff:ffff');
select * from testi;
┌─I──────────────────────────────────────┐
│ 2001:db8:ffff:ffff:ffff:ffff:ffff:ffff │
└────────────────────────────────────────┘ -
не , у нас на входе должен быть hex string именно
-
a020bf000000000000000000000000a
-
если у вас сложные аналитические запросы, то клик про это, если ключ-значение, графы, документно-ориентированные, то лучше смотреть в сторону других бд
-
генерируйте последовательный айди на стороне приложения и будет вам счастье
-
в общем хранить 32байта вместо 16 рассточитительно
-
вот и вопрос как hex string подсунуть
-
ну проще всего на клиенте сделать 16 байт, либо нормальную форму IPv6 (добавив : )
либо input funtion либо mat.view -
можно, если использовать AggregatingMergeTree и колонки SimpleAggregateFunction(anyLast, DateTime)
тогда при инсерте в эту таблицу, будет перезатираться это поле у нужной строки -
ок, попробуем : вставлять. Спасибо, за поддержку!
-
В КХ теперь все реплики лидеры (с 20.5)
-
Ну это я так понял не 20.5)
-
Это 20.8.3.18
-
Подскажите, с чем связаны такие варнинги(2 машины между ними ЗК, пишу много только в одну машину, варнинги только на реплике):
2021.04.09 21:44:15.493364 [ 27213 ] {} <Warning> db.table (ReplicatedMergeTreePartCheckThread): Checking part all_0_853968_168516
2021.04.09 21:44:15.493592 [ 27213 ] {} <Warning> db.table (ReplicatedMergeTreePartCheckThread): Checking if anyone has a part all_0_853968_168516 or covering part.
2021.04.09 21:44:15.494275 [ 27213 ] {} <Warning> db.table (ReplicatedMergeTreePartCheckThread): Found parts with the same min block and with the same max block as the missing part all_0_853968_168516. Hoping that it will eventually appear as a result of
a merge.
Нюанс в том, что гружу большой архив и уже пару дней, может быть из-за нагрузки и медленного ЗК/мерджа/репликации? - 10 April 2021 (77 messages)
-
У меня в базе множество хэшей разного вида - храню как Fixed string, вставляю как bytes из питона через родной драйве КХ
-
-
У нас через csv и clickhausclient организовано
-
-
Всем привет, кто нибудь пробовал обновлять версию КХ на рабочем кластере. Как правильно это делать:
Апргейд пакетов -> перезагрузка инстансов кластера по одной реплике в каждой шарде
или
Апргейд пакетов -> перезагрузка всех нод разом -
А это не то же самое, что «кластер кх - мультимастер»?
-
По одной, как в доках советуют
-
По одной но долго не держите разные версии
И сначала на стенде сделайте -
Кластер кх-мультимастер про то, что можно писать и читать с любой реплики.
Реплика лидер - та реплика, которая отвечает за трансфер нового парта. Она не выделена и может меняться от парта к парту. Сейчас этот механизм изменился. -
Кх всегда был мультимастер.
У репликейтид таблицы одна из реплик была лидером. Она назначала мержи. Теперь мержи назначают все реплки если им не запрещено. -
Лидер назначал мержи. Он решал когда и какие парты мержить
-
Подскажите пожалуйста, если у меня в кликхаус таблица с engine = mongodb данные переносятся в кликхаус или все время дергается много?
-
Это, по сути, внешний источник данных:
MongoDB engine is read-only table engine which allows to read data (SELECT queries) from remote MongoDB collection.
Если нужно перенести данные в КХ, можно сделать materialized view. -
монго
-
Не могут работать мат.вью над внешними источниками. Мв это триггер на инсерт.
-
Салют! А есть какой-то простой способ автоматом менять доступную память в users.xml в зависимости от доступной памяти на инстансе aws? Иногда надо что-то тяжелое считать и для этого надо переключить тип инстанса, зайти в конфиг и поменять там память и потом все вернуть обратно
-
Всем привет. Такой вопрос про prewhere. По доке клик автоматом перемещает where до prewhere автоматом, но например при использовании на одном из запросов при добавлении prewhere получили увеличение перфоманса, а на другом нет. Есть ли какие-то особенности работы с prewhere? Например работает он только по ключу сортировки и прочее. Имею ввиду при каких кейсах prewhere точно даст перфоманса
-
Не совсем, prewhere как раз нужен для колонок которые не входят в ключ, или находятся на такой позиции что индексный поиск по ним не эффективен,
Prewhere это фильтр куда кликхаус пытается переместить компактные(те обычно инты и их производные) высокоселективные условия -
-
Добрый вечер. Очень требуются помощь по возникшей проблеме или отсылки к подробному пошаговому руководству (чтоб прям для альтернативно одарённых вроде меня было разжёвано) на тему переноса данных из standalone сервера Clickhouse в пустой кластер с шардами и репликами.
Что реализовано: кластер из 3-х узлов Zookeeper, 3 шарда по 2 реплики Clickhouse
Были попытки вставить данные в один из шардов посредством «INSERT INTO … SELECT FROM …» и с этого момента что-то пошло не так, а именно:
Записи переносятся не в полном объёме. Т.е. я делаю запрос COUNT() на доноре и COUNT() на рецепиенте до переноса и после и вывожу эти данные, чтобы увидеть, есть ли разница. И эта разница в количестве записей всегда есть. Причём, не удалось обнаружить никакой зависимости в различиях данных от количества. Например, могут в полном объёме быть перенесены все данные из таблицы с 3-4 миллионами записей, и не в полном — на пару сотен тысяч и наоборот: при разных запусках переносов эти данные отличаются.
Собственно, вся процедура переноса реализована в bash-скрипте, который берёт данные о структуре таблиц в standalone-сервере (доноре), на основе этой структуры создаёт в рецепиенте необходимые Replicated* таблицы, на основе которых делает Distributed-таблицы, в которые, затем, пытается описанным выше способом залить данные. Но что-то в какой-то момент идёт не так. Полагаю, выбранный мною способ переноса данных является не самым оптимальным, но что-то другие мне постичь не удалось: попытка переноса через detached-директорию окончилась сообщением о том, что «Table engine Distributed doesn't support partitioning» 🤷 Видимо, я что-то делаю неправильно, и мне очень хочется научитьься делать это правильно.
Благодарю за внимание 🙂 -
Как я понимаю - есть на каждой ноде локальная таблица и поверх них дистрибьютед? Инсерт фром селект должен сам вставить в дистрибьютед таблицу и поделить ~33 процента на каждый из шардов.
-
Именно так
-
В логах что-то есть? Если replicated collapsing MT, то мб какие-то одинаковые записи схлопываются, но если отличается кол-во при каждом из запусков - странно
-
В логах никаких ошибок не обнаружил 🤷♂️
-
Какая версия? У нас была 20.5/20.8 всё ок работало (около 1ккк записей между кластерами приходилось ганять, инсерт фром селект работал норм.
-
ClickHouse server version 20.12.5.14 (official build).
А в вашем случае вы так же создавали структуру данных для кластера? Т.е. выбранная мной послдеовательность действий корректна? -
Скиньте метадату в конце sql, там где реплика / шард и как дистрибьютед создаётся
-
Спасибо, буду знать
-
а MATERIALIZED столбец может ссылаться на другой MATERIALIZED столбец? в каком порядке тогда идет вычисление?
-
ENGINE = ReplicatedCollapsingMergeTree('/clickhouse/tables/{shard}/cluster_name/db_name/table_name', '{replica}', sign)
У нас как-то так -
Если collapsing то вероятно что все переносится нормально. Отличная в том что данные на destination схлопывается больше/меньше.
-
Чтоб правильно сравнивать вам надо проверить select count() from table final (вроде). Либо сделать селект который схлопывает так же как таблица должна. Посмотрите документацию движка.
-
CollapsingMergeTree | ClickHouse Documentation
https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/collapsingmergetree/CollapsingMergeTree | ClickHouse DocumentationCollapsingMergeTree The engine inherits from MergeTree and adds the logic of rows collapsing to data parts merge algorit
-
Обратите внимание на секцию "What do we see and where is collapsing?"
-
Это не нам, а человеку выше) у нас всё хорошо работает👌
-
Попробую с final, благодарю
-
У меня вот так:
ENGINE = ReplicatedCollapsingMergeTree('/clickhouse/tables/{shard}/{database}/$tableNameShard', '{replica}', sign)
где $tableNameShard — это имя таблицы с добавлением _shard после имени, a значения {shard} и {replica} указаны в макросах в конфиге -
Увы, добавление FINAL в запросы с COUNT() проблему не решило 🙁
Пример отчёта о переносе данных:
Inserting data from the remote table to data_co2
Entries before transfer: 0
Entries to transfer: 326163
Entries after transfer: 217409
Куда-то делись ≈100К записей при переносе. Во всех трёх запросах используется FINAL
Ещё пример:
Inserting data from the remote table to network_log
Entries before transfer: 0
Entries to transfer: 926808
Entries after transfer: 815250
Снова чуть больше 100К 🤷
Все отчёты не привожу, но ситуация сейчас схожа на всех таблицах.
Может быть такое, что данные перенеслись корректно, но я как-то некорректно считаю COUNT() на кластере, где записи должны были по нескольким шардам размазаться, и какой-то из шардов не возвращает данные для подсчёта? Есть способ это проверить? -
На каждом шарде запустите запрос и проверьте
-
Хотя это какой то странный кейс, если шард например вне кластера, то и писать туда не выйдет, вы же вроде через дистриб таблицы пишите ?
-
SimpleAggregateFunction sum
-
Простите, а можно поподробнее?
-
Именно, пишу в Distributed 🤷♂️
-
Каждый шард возвращает вот такое количество, которое меньше донора
-
Так на 1 шарде и должно быть меньше, вам нужно сумму count ов проверить
-
Нет, я говорю о выборке из Distributed-таблицы, а не о конечных шардах, на основе которых они построены
-
Я все же думаю, что вся проблема в order by, у вас данные схлопываются
-
У меня все таблицы на движке Collapsing, но в данный момент в них ничего не пишется для чистоты теста, на всех таблицах выполнен OPTIMIZE, при подсчёте теперь указывается FINAL 🤷♂️ Как они могут схлопываться? :(
-
А вы final вызвали на источнике?
-
Да, везде, где используется count() я добавил в запрос FINAL
-
Тут в чате полно примеров
-
Единственное, что ещё могу посоветовать, попробовать optimize final
-
Наверное, уже завтра, с утра. Уже в глазах рябит от этих цифр, а толку никакого 🤦♂️
-
@vetinary а у вас optimize_throw_if_noop включён?
-
Про это не могу ответить ни утвердительно, ни отрицательно, поскольку не знаю, что это 🤷♂️ Это в конфиге?
-
Настройки | Документация ClickHouse
Настройки distributed_product_mode Изменяет поведение распределенных подзапросов. ClickHouse применяет настройку в тех с
-
Тут найдёте
-
Я перефразирую вопрос: возможно ли добиться значения одного из counter полей, имеющих тип UInt32 значения 0 для определённого ключа, если в настоящий момент этот counter уже не 0? Речь не об изменении структуры таблицы, если да такого дойдёт то проще уж удалить нужные строчки целиком и вставить скорректированные.
-
Поскольку в конфиге этого нет, а значение по умолчанию — 0, то выключен
-
Ну может у вас беда с optimize, а когда этот параметр выключен, вы исключение не увидите
-
Попробуйте включить и запустить optimize повторно
-
Вставить с минусом?
-
Unsigned?
-
Такой был план с самого начала, но кх не захотел мержить строки
-
Не захотел? Это как?
-
-
-
-
-
Alter update ?
-
Да, видимо последнее средство, потому и решил спросить, можно ли сделать лучше (
-
Попробовал — не помогло ни на единицу. Речь идёт о таблицах донора, я ведь правильно понял? Сделал COUNT() … FINAL, затем set optimize_throw_if_noop = 1; OPTIMIZE … FINAL и после него снова подсчёт количества — значения идентичные 🤷
-
Там баг был. Надо апгрейдить на последнюю 20.12
Или
https://t.me/clickhouse_ru/211219T in ClickHouse не тормозитя раннее указывал в этой клиент сессии set read_backoff_min_latency_ms=0, это может хоть как-то повлиять? Мб с этой опцией mergetree попробовать залить
-
Баг связанный с тем, что я описал? 😳
-
Селект выбирал не все строки
-
-
Или set read_backoff_min_latency_ms=0
- 11 April 2021 (166 messages)
-
А в дистрибутед таблицу случаем не асинхронно пишется? Может там все записалось в дистрибутед и надо подождать пока последние данные отправится куда надо? https://clickhouse.tech/docs/en/operations/settings/settings/amp/#insert_distributed_sync
-
Что делать?
ALTER TABLE hide.klo DROP COLUMN uid
в ответ выдал: Timeout exceeded while receiving data from server. Waited for 300 seconds, timeout is 300 seconds
И сообщение Cancelling query висит в процессе уже 6 часов...
Кластер не используется. Т.е. сервер один. Елинственное что свободного места ~7% осталось. -
Если у вас collapsing, и случайный ключ шардирования то count не совпадут.
-
Надо шардировать так что все что должно схлапываться приземлялось в тот же шард
-
Добрый день!
поймал такую ошибку
https://github.com/ClickHouse/ClickHouse/issues/20259
не подскажете что сделать?21.2 DB::Exception: Incomplete granules are not allowed while blocks are granules size · Issue #20259 · ClickHouse/ClickHouseI ran an optimize on 21.2, and the merge kept failing. 2021.02.09 14:38:06.519295 [ 14569 ] {} <Trace> db.table: Executing log entry to merge parts all_0_91343_4396, all_91344_91581_5...
-
Если я правильно читаю комментарий то надо обновится как минимум до 21.2.3.15 / 21.2.4.1
-
А лучше до последней 21.2.9.1 (вроде последний релиз для 21.2 ветки на сегодняшний день)
-
у нас 21.2.6.1
-
Привет.
А насколько плохая идея использовать materialize view в качестве триггеров на INSERT ?
Есть условная табличка:
user_id = A, value=100
user_id = A, value=200
user_id = A, value=300
И иногда в нее вставляются специальные строки вида (очень редко, 1 раз в месяц)
user_id = A, value=0, correction=-1000
Можно было бы так и оставить, но совсем идеально было бы эти условные -1000 нарастающим итогом открутить от value.
То есть вместо оригинальной строки заинсертить в SummingMergeTree JOIN по user_id текущих строк в которых value уже скорректирован, а оригинальную строку с correction хранить только в оригинальной таблице (не mv) -
Грубо говоря в mv написать выражение вида WHERE correction != 0 -> делай подзапрос с JOIN
-
MV это и есть триггеры на инсерт. JOIN в MV делать не стоит, это очень дорого
-
Да, я понимаю, но подчеркиваю - коррекция случается от 0 до 1 раза в месяц.
Конечно я мог бы сделать обычный VIEW в котором учесть уже поле correction.
Но вставляется такая строка почти никогда, а вот VIEW открывают часто и там окном ходить и откручивать на каждый F5 в браузере дороже -
А как этого добиться?
-
Обновил до последней (21.3.5) на доноре и реципиенте — ситуация, увы, не изменилась 🙁
-
попробуйте для теста с mergetree таблицами (без collapsing)
-
Это уже следующим шагом… Сейчас будет попытка с установкой read_backoff_min_latency_ms=0 перед вставкой данных…
Кстати, я вчера забыл указать (уже мозги в кучу были), возможно, что это существенно: у меня INSERT INTO … SELECT FROM remote() 🤔 — может это влиять? -
@vetinary
-
А в дистрибутед таблицу случаем не асинхронно пишется? Может там все записалось в дистрибутед и надо подождать пока последний данные отправится куда надо? https://clickhouse.tech/docs/en/operations/settings/settings/amp/#insert_distributed_sync
-
Ну, я изначально тоже так думал (что нужно просто подождать), но даже по прошествии суток и более ситуация с разницей в количестве записей не меняется, что наводит на невесёлые мысли 🤷
-
@vetinary Попробуйте на одном шарде сделать две таблицы, идентичных исходным, но без шардирования по кластеру. В одну вставить из первого вашего источника (со всего кластера), во вторую из той таблицы, куда до этого копипастили (тоже с кластера). Потом с final посмотреть count() в обеих этих новых таблицах. И я бы сравнивал не count(), а всякие uniqExact() и uniqExact() с group by. Если будет одинаково, то всё норм, просто в исходную таблицу на первом кластере при вставке распределяете неправильно по шардам.
-
Я попробовал из CollapsingMergeTree перелить в ReplicatedMergeTree (без collapsing) — бестолку
Не понимаю, что я упускаю 🙁 -
У вас 6 кх нод? Попробуйте сравнить что в реплках одинаковое кол-во. Что сумма с шардов = count из distributed
-
Привет подскажите. Репликация 2 ноды, 1й сервак ребутнулся, демон стартовал, но за несколько часов так и не вышел в рабочий режим. Я перезапустил службу на второй ноде. Теперь на обоих узлах в логаг connection refused. 9000 порт не занят. Получается демон запущен, а порты не прослушиваются.
-
все ответы в логе КХ
-
можно начать с tail -50 /var/log/clickhouse-server/clickhouse-server.err.log
-
-
-
-
А зачем ? Вроде как сама по себе должна подняться
-
ну я тоже не пойму, может там база перелопачивается
-
В логе только эта ошибка ?
-
я запустил в консольном режиме, вижу помимо ошибок еще такие вещи:
2021.04.11 16:50:20.419355 [ 11307 ] {} <Trace> data.participants_log_view.DirectoryMonitor/Bg: Execution took 88204 ms.
2021.04.11 16:50:22.463046 [ 11315 ] {} <Trace> data.webinars_stat_online_view.DirectoryMonitor/Bg: Execution took 63116 ms. -
-
нет конечно, ноды КХ независимы и друг про друга не знают
-
это хорошо
-
><Error> default.hits_view.DirectoryMonitor: Code: 210, e.displayText() = DB::NetException: Connection refused (house01
это Distributed таблица пыталась делать инсерт во вторую ноду, эта ошибка не препятсвует старту -
так в логах house2 пишет не могу подключиться к house1 и наоборот, значит знают друг про друга
-
это Distributed таблица пыталась делать инсерт во вторую ноду, эта ошибка не препятсвует старту
-
спасибо
-
-
последние 3 строки хотя бы покажите из err лога
-
2021.04.11 16:56:14.807445 [ 11281 ] {} <Trace> Connection (house02:9000): Connecting. Database: (not specified). User: default
2021.04.11 16:56:14.810626 [ 11281 ] {} <Error> default.hits_view.DirectoryMonitor: Code: 210, e.displayText() = DB::NetException: Connection refused (house02:9000), Stack trace (when copying this message, always include the lines below):
0. Poco::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x1271b990 in /usr/bin/clickhouse
1. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0xa3f32bd in /usr/bin/clickhouse
2. ? @ 0xfdffe6f in /usr/bin/clickhouse
3. DB::Connection::forceConnected(DB::ConnectionTimeouts const&) @ 0xfdf96ab in /usr/bin/clickhouse
4. DB::ConnectionPool::get(DB::ConnectionTimeouts const&, DB::Settings const*, bool) @ 0xa52f012 in /usr/bin/clickhouse
5. DB::StorageDistributedDirectoryMonitor::processFile(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, CurrentMetrics::Increment&) @ 0xfb69621 in /usr/bin/clickhouse
6. DB::StorageDistributedDirectoryMonitor::run() @ 0xfb6caa5 in /usr/bin/clickhouse
7. DB::BackgroundSchedulePoolTaskInfo::execute() @ 0xf2bbd39 in /usr/bin/clickhouse
8. DB::BackgroundSchedulePool::threadFunction() @ 0xf2bc1c2 in /usr/bin/clickhouse
9. ? @ 0xf2bc2f2 in /usr/bin/clickhouse
10. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0xa420a67 in /usr/bin/clickhouse
11. ? @ 0xa41f0a3 in /usr/bin/clickhouse
12. start_thread @ 0x76ba in /lib/x86_64-linux-gnu/libpthread-2.23.so
13. clone @ 0x1074dd in /lib/x86_64-linux-gnu/libc-2.23.so
(version 20.7.2.30 (official build)) -
похоже КХ живой, просто еще не стартовал
ps -ef|grep click
есть процесс?
что в конце /var/log/clickhouse-server/clickhouse-server.log ? -
лог всё время обновляется, там примерно всё одно и тоже про connection refused
-
-
-
tail -1000 /var/log/clickhouse-server/clickhouse-server.log |grep Database|grep Information
-
2021.04.11 16:23:35.187681 [ 19290 ] {} <Information> DatabaseOrdinary (system): Total 3 tables and 0 dictionaries.
2021.04.11 16:23:35.200515 [ 19290 ] {} <Information> DatabaseOrdinary (system): Starting up tables.
2021.04.11 16:23:35.202086 [ 19290 ] {} <Information> DatabaseOrdinary (default): Total 3 tables and 0 dictionaries.
2021.04.11 16:23:35.669601 [ 19290 ] {} <Information> DatabaseOrdinary (default): Starting up tables.
2021.04.11 16:23:36.010296 [ 19290 ] {} <Information> DatabaseOrdinary (data): Total 9 tables and 0 dictionaries.
2021.04.11 16:23:36.856094 [ 19290 ] {} <Information> DatabaseOrdinary (data): Starting up tables.
2021.04.11 16:23:51.892640 [ 19323 ] {} <Information> DatabaseOrdinary (data): 77.77777777777777% -
видимо в базе data есть таблица с огромным кол-во партов
-
-
при чем тут большая. Размер не имеет значения. Только кол-во партов
-
А можно ли как-то детачнуть таблицу - стартануть кх ?
-
зачем? там уже 77%
-
сейчас не скажу даже сколько их там
-
можно стартануть без таблицы, а потом снова ждать attach ?
-
Я в целом спрашиваю )
-
cd /var/lib/clickhouse/data/data/...таблица
ls -l |wc -l -
Например что бы все работало, а потом эта таблица сама через атач подтянулась когда-то
-
просто убрать .sql файл в сторону из /var/lib/clickhouse/metadata/база/таблица.sql
просле старта положить назад и сказать attach table -
Кх при старте просто листает файлы в каталоге metadata и делает attach по каждому файлу
-
Спасиб, возьму ну заметку )
-
4465410
-
Чета как-то слишком много партов
-
Да, что-то явно неправильно. Либо partition by либо неактивные партов слишком много.
-
таблица _view
-
-
Так вью этож триггер обычный и вью данные не хранит
-
-
Так посмотрите куда эта вью инсертит данные и посмотрите эту таблицу
-
так там 107 всего частей
-
-
Там не должно быть файлов. Вы в дистрибьютид таблицу не смотрите. Она не имеет значения
-
-
-
какой движок у таблицы где много файлов и как файлы называются?
-
-
-
-
-
-
-
какой движок у таблицы где много файлов и как файлы называются?
-
ReplicatedMergeTree
ReplicatedReplacingMergeTree
файлы 1.bin и так далее -
а я понял. Это WAL видимо
-
-
хотя нет, wal файлы кажется префикс wal имеют
-
чушь какая-то, не может быть у ReplicatedMergeTree файлов в каталоге которые называются 1.bin
-
ATTACH TABLE webinars_stat_online_view
(
...
)
ENGINE = Distributed(cluster, name, webinars_stat_online, rand()) -
-
ATTACH TABLE webinars_stat_online
(
...
)
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{shard}/webinars_stat_online_10', '{replica}')
PARTITION BY toYYYYMM(EventDate)
ORDER BY (WebinarHash, EventDate, ParticipantHash, EventTime)
SETTINGS index_granularity = 8192 -
остановите КХ.
сделайте mv /var/lib/clickhouse/metadata/data/webinars_stat_online_view.sql /tmp
запустите КХ
когда клиент сможет приконектится mv /tmp/webinars_stat_online_view.sql /var/lib/clickhouse/metadata/data/
потом из клиента attach table data.webinars_stat_online_view -
Собственно, начал это делать и обнаружил вот такое: при запросе из Distributed получаю разное количество записей (независимо от того, используется в запросе FINAL или нет)
Вот пример выполнения одного и того же запроса с разницей в доли секунды:
SELECT COUNT() FROM data_values
Query id: 04577cdd-cb48-41fd-a184-b88a9c02df1a
┌─count()─┐
│ 2160875 │
└─────────┘
1 rows in set. Elapsed: 0.016 sec.
—————————————————————
SELECT COUNT() FROM data_values
Query id: 86df0a82-0689-4ab3-8297-5b4f3f06dc80
┌─count()─┐
│ 3875787 │
└─────────┘
1 rows in set. Elapsed: 0.017 sec. -
SELECT FQDN() h, COUNT() FROM data_values group by h
два-три раза чтобы было видно разные реплики -
-
получилоь, теперь думает на процессе attach
-
-
хм, остановите, переложите 1.bin файлы временно куда-нибудь, запустите, верните bin файлы
-
cluster-node-01-01 🙂 SELECT FQDN() h, COUNT() FROM data_values group by h
SELECT
FQDN() AS h,
COUNT()
FROM data_values
GROUP BY h
Query id: c977e33f-1444-4d2b-a537-8c111e94dcf8
┌─h──────────────────┬─count()─┐
│ cluster-node-01-01 │ 447878 │
│ cluster-node-02-02 │ 1712997 │
└────────────────────┴─────────┘
2 rows in set. Elapsed: 0.050 sec. Processed 2.16 million rows, 2.16 MB (42.98 million rows/s., 42.98 MB/s.)
cluster-node-01-01 🙂 SELECT FQDN() h, COUNT() FROM data_values group by h
SELECT
FQDN() AS h,
COUNT()
FROM data_values
GROUP BY h
Query id: 64074fcf-9a05-48cf-8c97-695a6015fecf
┌─h──────────────────┬─count()─┐
│ cluster-node-01-01 │ 447878 │
│ cluster-node-03-02 │ 1714912 │
│ cluster-node-02-02 │ 1712997 │
└────────────────────┴─────────┘
3 rows in set. Elapsed: 0.051 sec. Processed 3.88 million rows, 3.88 MB (75.27 million rows/s., 75.27 MB/s.)
cluster-node-01-01 🙂 SELECT FQDN() h, COUNT() FROM data_values group by h
SELECT
FQDN() AS h,
COUNT()
FROM data_values
GROUP BY h
Query id: b472dcf6-15d1-4f54-824a-e6b542f31889
┌─h──────────────────┬─count()─┐
│ cluster-node-02-01 │ 1712997 │
│ cluster-node-01-01 │ 447878 │
└────────────────────┴─────────┘
2 rows in set. Elapsed: 0.056 sec. Processed 2.16 million rows, 2.16 MB (38.85 million rows/s., 38.85 MB/s.)
cluster-node-01-01 🙂 SELECT FQDN() h, COUNT() FROM data_values group by h
SELECT
FQDN() AS h,
COUNT()
FROM data_values
GROUP BY h
Query id: f9885bee-1c48-4b6d-816d-7062ee5636bd
┌─h──────────────────┬─count()─┐
│ cluster-node-01-01 │ 447878 │
│ cluster-node-03-02 │ 1714912 │
│ cluster-node-02-02 │ 1712997 │
└────────────────────┴─────────┘
3 rows in set. Elapsed: 0.057 sec. Processed 3.88 million rows, 3.88 MB (67.84 million rows/s., 67.84 MB/s.) -
select * from system.clusters where cluster = 'ваш_кластер'
-
наверное уже не буду, вижу что идет merge в логах, таблица создалась
-
select * from system.clusters where cluster = 'cluster'
SELECT *
FROM system.clusters
WHERE cluster = 'cluster'
Query id: 63f4fa77-ef7a-49ed-b408-0f71669cf1f3
┌─cluster─┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name──────────┬─host_address──┬─port─┬─is_local─┬─user─┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ cluster │ 1 │ 1 │ 1 │ cluster-node-01-01 │ 10.42.155.230 │ 9000 │ 1 │ user │ │ 0 │ 0 │
│ cluster │ 1 │ 1 │ 2 │ cluster-node-01-02 │ 10.42.255.219 │ 9000 │ 0 │ user │ │ 0 │ 0 │
│ cluster │ 2 │ 1 │ 1 │ cluster-node-02-01 │ 10.42.11.20 │ 9000 │ 0 │ user │ │ 0 │ 0 │
│ cluster │ 2 │ 1 │ 2 │ cluster-node-02-02 │ 10.42.243.161 │ 9000 │ 0 │ user │ │ 0 │ 0 │
│ cluster │ 3 │ 1 │ 1 │ cluster-node-03-01 │ 10.42.2.87 │ 9000 │ 0 │ user │ │ 0 │ 0 │
│ cluster │ 3 │ 1 │ 2 │ cluster-node-03-02 │ 10.42.177.127 │ 9000 │ 0 │ user │ │ 0 │ 0 │
└─────────┴───────────┴──────────────┴─────────────┴────────────────────┴───────────────┴──────┴──────────┴──────┴──────────────────┴──────────────┴─────────────────────────┘
6 rows in set. Elapsed: 0.005 sec. -
select * from system.settings where changed
-
select * from system.settings where changed
SELECT *
FROM system.settings
WHERE changed
Query id: 94ef6dd6-d859-4144-83f7-b274e9dc840a
┌─name────────────────────────────┬─value───────┬─changed─┬─description───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─min──┬─max──┬─readonly─┬─type──────────┐
│ use_uncompressed_cache │ 0 │ 1 │ Whether to use the cache of uncompressed blocks. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ load_balancing │ random │ 1 │ Which replicas (among healthy replicas) to preferably send a query to (on the first attempt) for distributed processing. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ LoadBalancing │
│ max_memory_usage │ 10000000000 │ 1 │ Maximum memory usage for processing of single query. Zero means unlimited. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ UInt64 │
│ max_partitions_per_insert_block │ 1000 │ 1 │ Limit maximum number of partitions in single INSERTed block. Zero means unlimited. Throw exception if the block contains too many partitions. This setting is a safety threshold, because using large number of partitions is a common misconception. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ UInt64 │
└─────────────────────────────────┴─────────────┴─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────┴──────┴──────────┴───────────────┘
4 rows in set. Elapsed: 0.005 sec. -
спасибо Вам, всегда выручаете!
-
select FQDN() h, count() from clusterAllReplicas('cluster', data_values_shard) group by shard
-
надо разбираться почему там миллионы. Это незаконченные инсерты, distributed таблица почему-то их накопила, там должно быть мало файлов, 10, может 50 иногда.
-
в логах были раньше отшивы по юзеру default. Все мои мучения были напрасны, я убирал sha256 пароль, или обычный.
-
то есть таблица не могла достучаться по логам до второго сервера, тот отклонял запросы, но всё работало
-
DB::Exception: Table function 'clusterAllReplicas' requires from 2 to 4 parameters: <addresses pattern or cluster name>, <name of remote database>, <name of remote table> [, sharding_key].
Полагаю, надо ещё имя базы данных добавить в качестве параметра, так? -
distibuted таблица использует того пользоватея и тот пароль который написан в remote_users. В remote_users нельзя использовать sha256, потому что в этом случае Distriubted таблица использует его как клиент чтобы подключится к другому КХ
-
select FQDN() h, count() from clusterAllReplicas('cluster', БАЗА, data_values_shard) group by shard
-
я юзера default ковырял, видимо не тот default не в разделе remote_users
-
Missing columns: 'shard' while processing query: 'SELECT FQDN() AS h, count() FROM clusterAllReplicas('cluster', 'database', 'data_values_shard') GROUP BY shard', required columns: 'shard'.
Но если убрать группировку, то вот результат:
select FQDN() h, count() from clusterAllReplicas('cluster', 'database', 'data_values_shard')
SELECT
FQDN() AS h,
count()
FROM clusterAllReplicas('cluster', 'database', 'data_values_shard')
Query id: 0e7b5966-7f1f-4274-970e-eb21677d3219
┌─h──────────────────┬─count()─┐
│ cluster-node-01-01 │ 6853287 │
└────────────────────┴─────────┘
1 rows in set. Elapsed: 0.020 sec. -
у пользователя default можно задать пароль, проблема в том что по умолчанию Distributed таблице тоже нужен этот пароль, это описывается в remote_severs как <user> <password>
-
какая-то непонятная фигня кругом.
а что если select count() from data_values_shard
делать прямо на этих 6 серверах?
у реплик совпадают числа? -
ночью сделаю нормально пользователя. Незавершенные вставки автоматически обработаются, когда коннект наладится?
-
Ну вот я и начинал делать это, пока случайно не обнаружил, что обычный COUNT() из Distributed-таблицы возвращает время от времени разные результаты — это сильно смутило. Могу посчитать, конечно, по каждой отдельной таблице типа Replicated*, что там лежит. Но разве разный результат COUNT() — это норма?
-
на самом деле репликация вообще никак не связана с distributed.
проверьте на всех 6ти серверах что в system.macros правильные шард/реплика.
у вас какие-то странные числа и количество не 1/3 и как будто реплики неодинаковое кол-во имеют -
В общем, я выполнил COUNT() на каждой из 6 нод, и там прям какой-то цирк с конями получается 🤔🤦😳
Собственно, в списке представлена нода и количество записей на ней
SELECT COUNT() FROM data_values_shard
cluster-node-01-01 - 447878
cluster-node-01-02 - 1264503
cluster-node-02-01 - 1712997
cluster-node-02-02 - 1712997
cluster-node-03-01 - 0
cluster-node-03-02 - 1714912 -
select * from system.replication_queue
на cluster-node-03-01 -
cluster-node-03-01 🙂 select * from system.replication_queue
SELECT *
FROM system.replication_queue
Query id: dc7e7794-28fa-4c5e-bd50-cc2eb2c8adc9
Ok.
0 rows in set. Elapsed: 0.010 sec. -
select * from system.macros на cluster-node-03-01
-
SELECT *
FROM system.macros
Query id: f006cb80-891f-4ca6-9885-caba73599206
┌─macro───┬─substitution─┐
│ replica │ 01 │
│ shard │ 03 │
└─────────┴──────────────┘
2 rows in set. Elapsed: 0.006 sec. -
а у cluster-node-03-02 ?
-
SELECT *
FROM system.macros
Query id: 04bd5917-7db8-4134-b35b-543286302ab1
┌─macro───┬─substitution─┐
│ replica │ 02 │
│ shard │ 03 │
└─────────┴──────────────┘
2 rows in set. Elapsed: 0.006 sec. -
ОК, а show create table ... кусок который про Engine=.....
-
Про _shard, так?
-
Engine=Replcated....( )
-
ENGINE = ReplicatedCollapsingMergeTree('/clickhouse/tables/{shard}/database/data_values_shard', '{replica}', sign)
-
ОК. Становится все интереснее.
echo stat|nc zk_ip 2181 для всех 3 (zk_ip) зукиперов -
т.е. очень похоже на то что это 3 standalone зукипера, а не ансамбль
-
Я пытаюсь выполнить, но получаю ошибку, что команда не в «белом списке», хотя в конфиге указано * для 4wl
-
а что в конфиге вообще в конфиге у зу?
cat /etc/zookeeper/conf/zoo.cfg|grep -v '#' -
А вот сейчас выяснилось, кажется, что я кретин…
Сейчас разберусь и чуть позже отпишусь, что и как -
Привет.
Дозрел до AggregatingMergeTree и хочу сделать таблицу, в которой один столбец будет суммироваться при слиянии, а второй, если там не NULL - заменяться на последнюю версию (версия - время в ещё одном столбце). С первым столбцом понятно. А как описать второй, не могу придумать... -
можно просто затирать время 0 if(first_name<>'', modification_timestamp_mcs, toDateTime64(0,3)))
https://gist.github.com/den-crane/d03524eadbbce0bafa528101afa8f794
AggregateFunction(argMax, String, DateTime64(3)) -
Если String=NULL то ставим DateTime64 = 0
argMax таким образом найдет String c максимальным временем, а Null не попадут потому что там время 0 -
Добрый вечер.
Извините за глупый вопрос, но самостоятельно разобраться не получилось.
Если коротко - не понимаю, зачем рекомендуют использовать мат вью + AggregatingMergeTree, в чем роль последнего, когда мат вью с обычным MergeTree и так решает поставленную задачу. -
Длинее:
Есть таблица с time series (graphite). Возникла потребность в получении налету усредненных данных за 4, 15, 60 секунд. Нашел в документации, что задача решается при помощи мат вью и дополнительных таблиц. Проэкспериментировал, Мат вью + MergeTree решают задачу, в графане графики одинаковые при выборке данных из оригинальной таблицы с аггрегацией налету и при выборе данных из аггрегированной таблицы
Вью выглядит так:
CREATE MATERIALIZED VIEW graphite_mv_avg15 TO graphite_avg15 AS
SELECT
Path,
avg(Value) AS Value,
Date,
Time,
toStartOfInterval(toDateTime(Timestamp), toIntervalSecond(15)) AS Timestamp
FROM carbon_metrics.graphite
GROUP BY (Path, Date, Time, Timestamp)
Таблица с аггрегированным представлением:
CREATE TABLE graphite_avg15
(
Path LowCardinality(String) CODEC(ZSTD),
Value Float64 CODEC(ZSTD),
Time UInt32 CODEC(Delta, LZ4),
Date Date CODEC(ZSTD),
Timestamp UInt32 CODEC(Delta, LZ4)
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(Date)
ORDER BY (Path, Time)
SETTINGS index_granularity = '8192'
Вопрос актуален в том плане, что если AggregatingMergeTree не нужен, то аггрегированные таблицы можно будет сделать на базе ReplicatedMergeTree.
Что я упускаю? -
наверное я поспешил с доростанием и на самом деле не дорос. 😊
-
Summing и Aggregating домерживают схлапывают в бекграцнде.
Мат. Вью это не делает потому что это триггер на инсерт и не читает исходную таблицу -
К сожалению, не совсем понимаю, что из этого следует: аггрегации во вью без использования AggregatingMergeTree/SummingMergeTree будут работать на очень коротком интервале последних данных, которые прилетели одним батчем на инсерт?
-
А все, что было это батча, под аггрегацию и схлопывание не попадет, так?
-
Да
-
Да
-
https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf
https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7597 -
Спасибо большое за ответ. Следовательно, если предварительно батчить записываемые данные на период аггрегации, то можно обойтись и MergeTree
-
Можно.
Ещё можно использовать graphiteMt или TTL gropby -
Ну и не проблема использовать summing он простой как палка
-
Да, смотрел тоже в сторону TTL groupby, но, насколько я понял, он будет работать как то же самыей retention и уменьшать данные в исходной таблице. А есть потребность держать несколько разных аггрегированных представлений рядом.
-
Спасибо, посмотрю поближе Summing/Aggregation engines
-
Grapthie-Mt - это вот это? https://github.com/raintank/graphite-mtGitHub - raintank/graphite-mt: Graphite-web tailored for running with a metrictank backend
Graphite-web tailored for running with a metrictank backend - GitHub - raintank/graphite-mt: Graphite-web tailored for running with a metrictank backend
-
Именно так всё и было 😳🤦🤦 Хотя я был в полной увернности, что ноды ZK работают в команде, а не каждый сам по себе…
Спасибо огромное… У меня в лексиконе остались лишь радостные междометия, даже не знаю, как вас благодарить!!! 🔥🥳🎉 -
-
А, мы его и используем, да.
-
Изначальная идея была как раз записывать данные в несколько таблиц в graphitemergetree и в бэкграунде делать разные периоды аггрегаций - но это, что закономерно, убило все дисковое ио. Поэтому стали смотреть в сторону мат вью. Но, возможно, по итогу аггрегации вынесем наружу и будем записывать в кликхауз уже аггрегированные данные
-
можно копить батчи по 30 сек, insert-ить в Engine=Null таблицу, и делать агрегацию в MV которое на нее смотрит, и писать в Summing, следующее MV смотрит на таблицу которая Summing и пишет в свою Summing. Делать больше трех MV смысла наверное нет, типа пять минут, день, месяц.
-
-
я считаю это баг
-
Интересно где это так интересным образом поправили
-
ODBC кстати для PG больше не нужен.
-
-
oracle :)
-
если это новый словарь, то возможно просто сообщение кривое об ошибке, там чудеса с сообщениями
-
Старый, создается норм, т.е. после апгрейда не сразу видно еще
-
- 12 April 2021 (158 messages)
-
если в users.xml задавать опции, кх сразу примет их? без перезагрузки?
-
Да.
-
Добрый день
Вопрос нубский конечно.
Как оптимально хранить xml документы в КХ?
Надо несколько атрибутов для фильтрации и собственно документ как есть.
В т.ч. могут быть (и точно будут) невалидные XMLки.
Около 30К в сутки, размерами 30-100Кб.
Сориентируйте пожалуйста -
MergeTree? Или чтото другое?
-
Приветствую. Помогите разобраться с долгим выполнением запроса к таблице кликхауса... Какими инстуметами понять где может быть затык... Исходные данные: таблица с 1 миллиардом строк агрегируется 15+ секунд... Order by по шести полям.
-
движок MergeTree
-
Можно через log trace, есть еще execution plan:
https://clickhouse.tech/docs/en/operations/optimizing-performance/sampling-query-profiler/Query Profiling | ClickHouse DocumentationSampling Query Profiler ClickHouse runs sampling profiler that allows analyzing query execution. Using profiler you can
-
не особо понятно, что вам надо, т.е. вам надо и xml as string в таблице хранить? Если xml как источник данных, то движок File или external dictionary.
-
-
-
Ребят помогите с запросом
-
Как сделать результат селекта одним блоком, что бы нейбор не выдавал Конец блока в середине результата
-
Как это должно быть правильно сделано? Может сама таблица дефаульт эвент неправильно настроена
-
Привет, подскажите по поводу термина Table functions в контексте ошибки DB::Exception: Table functions are forbidden in readonly mode (version 19.13.2.19 (official build)) "?
Просто в доке table functions это https://clickhouse.tech/docs/en/sql-reference/table-functions/
А по факту кажется что дело в отдельных функциях в запросе, т.к другие запросы к этой же таблице нормально отрабатывают.
Запрос, который падает с этой ошибкой:
select
d,
c
from (
select
toStartOfDay(timestamp) as d,
count() as c
from
$log_type
where
timestamp > now() - INTERVAL 7 day and
timestamp < now()
group by d
) RIGHT JOIN (
select toStartOfDay(now() - INTERVAL number day) as d, 0 as c FROM numbers(7)
) USING d
ORDER BY d DESC
дело в том что для readonly не разрешен джоин? -
т.к. документы могут быть совершенно невалидными - то надо и как строку хранить. Или File в этом случае тоже подойдет?
-
FROM numbers(7)
numbers это table function -
а, проглядел, спасибо
-
в File engine нет обработок совершенно невалидных документов (емнип)
если только не попробуетее яерез clickhouse-local ignore errors:
https://clickhouse.tech/docs/en/operations/utilities/clickhouse-local/clickhouse-local | ClickHouse Documentationclickhouse-local The clickhouse-local program enables you to perform fast processing on local files, without having to d
-
спасибо, почитаю
-
Вместо numbers() можно использовать system.numbers
-
спасибо, попробую
-
https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#max_server_memory_usage_to_ram_ratio
+
динамически в users.d/
для профиля менять
max_memory_usage
в каком нибудь systemd сделать сервис который стартует "до кликхауса"
ну или задавать max_memory_usage прямо через SET или в параметрах HTTP запросаServer Settings | ClickHouse DocumentationServer Settings builtin_dictionaries_reload_interval The interval in seconds before reloading built-in dictionaries. Cli
-
-
-
-
-
-
-
-
Должен быть почти бесплатным
-
десятки гигов чего? RAM или disk space ?
-
-
RAM при создании вьюхи.
-
Поддерживаю вопрос, можно ли функцией neighbor пройти как будто-то всё один блок
-
В теории да, можно увеличить max_block_size но это негативным образом влияет на перфоманс, используйте лучше массивы или window functions
https://kb.altinity.com/altinity-kb-queries-and-syntax/lag-lead -
【D】【J】 in ClickHouse не тормозит
Девид Блейн, сработало ) ┌────count() ─┬─min(rn) ─┬─max(rn) ─┐ │ 5000000000 │ 0 │ 999999 │ └────────────┴─────────┴─────────┘ я в нем увидел миллион, и подумал, ну хватит, а там ж байты... спасибо большое )
-
спс, попробую
-
У нас в настройках стоит Макс блок сайз 65000, если я в запросе выведу blockSize(), то там будут 6, 5, 1 и т.д
-
Если через сеттингс в запросе указать Макс блок сайз, ниче не меняется
-
Спасибо, Евгений 👍
-
а в чем кастомность проявляется?
процесс clickhouse-server запущен из под пользователя clickhouse обычно
соответсвенно до /etc/clickhouse-server должен быть доступ на чтение
а до /var/lib/clickhouse и /var/log/clickhouse/ доступ на запись
как у вас clickhouse запускается? systemd \ docker \ k8s? -
это все понятно. и все работает как надо. но чтоб ходить по каталогам и смотреть какие там файлы приходится все время использовать sudo. притензий к файлу с доступом 0600 нет, но иногда надо просто посмотреть файлы на дисках без просмотра содержимого. да тот же sudo <cat|ls|…> c табуляцией не будет работать
-
chmod go+rx /etc/clickhouse-server ?
-
при запуске сервера он же обратно вернет нужные права. нет?
-
ClickHouse/ClickHouse tagged: v21.3.6.55-lts
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.3.6.55-lts
Release notes:
ClickHouse lts release v21.3.6.55-lts -
такое есть только если в docker запускать, на папку /var/lib/clickhouse
лечится через установку переменной DO_NOT_CHOWN
при запуске проcто идет проверка есть ли доступ на чтение \ запись и правильный ли owner -
/etc/clickhouse-server/config.xml
<!-- You can specify umask here (see "man umask"). Server will apply it on startup.
Number is always parsed as octal. Default umask is 027 (other users cannot read logs, data files, etc; group can only read).
-->
<!-- <umask>022</umask> -->
или тупо добавить группу clickhouse нужному юзеру -
-
Добрый день.
Хотим перенести растущую таблицу на новый сторадж. Создали новый том с дисками и политику. Также для переноса данных добавили дефолтный том в эту же политику. Сменили политику для таблицы и пытаемся выполнить move. На тестовой машине всё прекрасно работает. В проде выдает ошибки вида
Received exception from server (version 21.3.6):
Code: 232. DB::Exception: Received from localhost:9000. DB::Exception: Nothing to move. -
-
Файл с описанием стораджа вот - https://pastebin.com/HMXNeXpt
-
довольно большой начинается с 2TB 🙂
-
-
-
КХ пишет стектрейс на все подряд. Покажите все сообщения из лога у которых uuid такой же как у запроса alter move
или наверное из клиента можно
set send_logs_level='trace' ;
alter table move ... -
clickhouse-server.err.log - https://pastebin.com/AUdTW0fY
clickhouse-server.log - https://pastebin.com/nhx7WkCg -
>partition '2020831'
хм, а как таблица создана?
что будет если убрать кавычки?
partition 2020831 -
Вот если включить в клиенте
https://pastebin.com/yZYHzpyPflows :) alter table cgnat move partition '2020831' to volume 'hdd';ALTER TA - Pastebin.comPastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
-
Вот так - https://pastebin.com/9ukLyXZc
-
С кавычками или без результат одинаковый.
-
-
-
да судя по коду там просто проверка стреляет, таких партов нет
-
-
-
Наверное улучшить сообщение об ошибке , даже NO_SUCH_DATA_PART и то понятнее
-
не могу понять, почему по ссылке написано DateTime64(3), хотя третий по счёту столбец имеет формат не даты, а строки
-
Приглашаем на онлайн-митап! ⭐
🕖15 апреля в 19:00 встречаемся, чтобы обсудить применение DevOps-практик в DWH:
— Михаил Кожевников из Райффайзенбанка расскажет про хранилище, созданное в стеке технологий ODI, Java и flyway, и поделится своим опытом декомпозитизации процессов, которая помогла прийти к модели TBD и сделать ее независимой.
— Альберт Айткулов из Тинькофф расскажет, как выглядел процесс применения изменений инфраструктуры у нашей команды раньше и как этот процесс стал выглядеть после переезда IaaC Clickhouse в Gitlab CI.
Регистрация по ссылке - https://meetup.tinkoff.ru/event/devops-v-dwh/ -
там 2 столбца.
Типа поля AggregateFunction( func , arg1, arg2)
а присваивается оно func ( arg1, arg2 ) -
-
точность, 3 знака
-
милисекунды
-
DateTime64(6) - микросекунды
-
-
это просто пример, вы можете использовать не время, а что угодно, например число -- типа Version
-
-
но конечно это пример как делать не надо, КХ будет тормозить.
select uid, argMaxMerge(final_first_name) first_name, argMaxMerge(final_last_name) last_name from final_states_by_month group by uid
не может и никогда не будет работать быстро -
-
таблицы никогда ничего не мержат при селектах сами
-
-
в гисте последний запрос
-
finalizeAggregation нужно делать, тогда не будет мержить
-
будет трансформация из State в Value
-
-
а зачем нужна эта трансформация?
-
там в бинарном виде лежит State, он не читаемый
SELECT argMaxState(1, 1)
┌─argMaxState(1, 1)─┐
│ │
└───────────────────┘
SELECT finalizeAggregation(argMaxState(1, 1))
┌─finalizeAggregation(argMaxState(1, 1))─┐
│ 1 │
└────────────────────────────────────────┘ -
-
-
вместо JOIN
если есть возможно можно dict использовать? та часть которую джойните в память влезает?
WHERE field >= dictGet(...) AND field <= dictGet(...)
или вам надо LEFT \ RIGHT JOIN ? -
-
Здравствуйте! Планирую перейти на ClickHouse в самописной системе аналитики. Но есть вопрос: существует таблица для трека прогресса просмотра видео, в которой сохраняются интервалы. Например, (1, 5) - значит, что пользователь посмотрел видео с 1 по 5 секунду. Каждая строка - отдельный интервал. Аналитикам требуется получить информацию о том, сколько видео было просмотрено. Проблема в том, что интервалы могут пересекаться, иметь окна, дублироваться. Например: (1, 5), (4, 10), (6, 8), (20, 25) должно вернуть 15. Интервалов может быть ~100-200. Вместо массива могут быть 2 поля: “start” и “end” - если надо. Каким образом можно это решить в ClickHouse? Нашел такой вариант https://stackoverflow.com/questions/57347444/collapsing-overlapping-time-intervals-using-clickhouse - подскажите насколько он работоспособен? Заранее спасибо!Collapsing overlapping time intervals using ClickHouse
I read similar questions and it's possible to make it work by using window functions, however, since ClickHouse does not seem to support them I'm seeking for an alternative solution. Given the time
-
в некоторых случаях подходит словарь range_hashed
в некоторых можно в where отсечь (после full) -
-
зависит от объемов, если миллиарды ивентов в день, то надо делать до КХ,
если миллионы то можно вычислять таким запросом, гемор конечно дичайший поддерживать такие запросы, в 100 раз проще сделать это в приложении.
ну и можно вводить дискретность по 5 -30 сек. и просто писать какой кусочек просмотрен -
в текущей версии (mongodb) так и делаем, но clickhouse append-only база данных - поэтому текущий подход здесь не подойдет
-
-
Добрый день! подскажите, а в ReplacingMergeTree ключ партицирования входит в уникальный индекс по которому удаляются дубли? то есть если PARTITION by date order by ID. останутся записи уникальные по id date или только по id?
-
По (id, date).
-
спасибо
-
-
SEMI JOIN по факту заменяет WHERE EXISTS ( )
То есть в случае
SELECT actor_id
FROM actors
LEFT SEMI JOIN film_actor USING (actor_id)
ты получишь список уникальных актеров из таблицы actors, которые снялись хотя бы в одном фильме
А запрос
SELECT actor_id
FROM actors
LEFT JOIN film_actor USING (actor_id)
размножит тебе этих актров на кол-во фильмов, в которых каждый из них снялся -
-
-
Всем привет. Такая задача: есть топик Kafka, из которого кластер 4 шарда х 2 реплики не напрягаясь читает несколько млрд записей в сутки. Но в этом потоке есть доля "мусора" - невостребованных записей, лишь создающих в последствии паразитную нагрузку на ресурсы кластера. Отделить их от "полезных" можно на основании содержимого реплицируемой на все шарды таблицы (не-шардированной). И захотелось фильтрацию делать прямо в процессе загрузки из Kafka. Соответственно, варианты: а) добавить в MV предложение WHERE id in (select id from filter_table); б) создать таблицу Engine=SET as select id from filter_table, в) создать Dict. Вариант "а" смущает надёжностью, год назад, если память не подводит, такой подход ненадёжно работал. С вариантом "б" непонятно, как периодически обновлять таблицу, не нарушая работу MV. С вариантом "в" есть сомнение, подходит ли Dict для набора из более чем 20 млн идентификаторов. Зато, если правильно понимаю, Dict сам умеет периодически обновляться.
-
Что-то там как-то страшно это выглядит, хотя может быстрее работает. Можно так (если просмотры длительные, то памяти жрать будет много):
SELECT
arrayUniq(
groupArrayArray(
arrayMap(
x -> x + arr.1,
range(toUInt16(arr.2 - arr.1 + 1))
))) as time
from (
SELECT arrayJoin([(1, 5), (4, 10), (6, 8), (20, 25)]) as arr
);интервалы 1..10 и 20..25 - это или 16 секунд, или 14, но вряд ли 15, если я правильно понял задачу. -
Установил odbc driver, windows 10. При создании user dsn в odbc data source administrator - выбираю Clickhouse odbc driver (unicode), далее ввожу host, port, database, нажимаю ok и ничего не происходит, ни созданного dsn ни ошибок. Коннект к бд через datagrip с теми же параметрами проходит, правда там используется jdbc.
Может кто подскажет почему не создается dsn? Может нужно как то сам clickhouse настраивать? И где можно искать ошибку создания, логи и тп? -
Добрый вечер! CH поддерживает рекуррентные подзапросы типа FROM table t where t.id in (select id from table where date < t.date)?
-
Добрый вечер. Подскажите пожалуйста, есть ли к КХ возможность работы с датой и временем с учётом таймзон? (не конвертация каждого значения, а как в MySql или вертике по таймзоне коннекта)
-
Всем привет!
Есть кейс когда нужно хранить данные о сотрудниках + историю изменения данных - далее на основе истории изменений делать отчеты. На текущий момент все реализовано на Postgres, но для отчетов нужно крутить много данных на лету - собственно вопрос - как лучше всего сделать - перенести все ведение данных в кликхаус - или же все-таки сохранять данные истории только в кликхаусе, а основную таблицу в постгре? -
Тут важно понять что кх не конвертирует время. У него нету таймзон во времени. Там всегда timestamp UTC. Кх использует таймзоны при рендеринге и парсинге строк
-
то есть сменив ТЗ коннекта (сессии) на выводе будут изменённые значения? (визуально)
-
Сколько миллиардов ивентов в день?
-
Визуально это делает например jdbc драйвер.
-
0
-
Берите постгре
-
Кх не нужен вам
-
Вы подтвердили мои ожидания, что для такого кейса КХ избыточен. Спасибо!
-
слишком мощный инструмент для такого кейса
-
спасибо большое....сейчас попробую в коде
-
Кореллированные подзапросы не поддерживаются
-
да, вот только нашел, что «зависимые» подзапросы не поддерживаются 🙁 Думал с with обойти, но тоже не пробрасывается в подзапрос)
-
Делать до кх. Используя редис
-
как бы еще выбрать то, что есть в месяце м, но отсутсвует в предыдущем…
-
и так для каждого
-
кроме первого
-
-
может через гоупбай having можно переписать
-
да, как вариант. Спасибо!
-
Спасибо! Попробую тоже этот вариант
-
или (d-toIntervalMonth(1),id) NOT IN
-
Changes in master broke WITH TIMEOUT clause in LIVE VIEW tables. · Issue #14827 · ClickHouse/ClickHouse
Describe the bug Changes to LIVE VIEW storage broke WITH TIMEOUT clause (70b0fe8). How to reproduce user-host :) CREATE LIVE VIEW lv WITH TIMEOUT 5 AS SELECT 1 CREATE LIVE VIEW lv WITH TIMEOUT 5 AS...
-
Это видел, но кейс там уже работает валидно.
-
Заведи тогда issue и я посмотрю в чём проблема.
-
Live views aren't removed after disconnection (HTTP) · Issue #22996 · ClickHouse/ClickHouse
Description If the WATCH statement is used via HTTP interface for live views with a timeout, the live view isn't removed after disconnection. Steps to reproduce the bug Create a live view: ...
-
-
Просто в ch обычно кладут raw данные, уже по которым дополнительно накручиваются разные агрегации
-
Всем привет периодически на нодах получаю ошибку
TCPHandler: Code: 210, e.displayText() = DB::Exception: Connection reset by peer, while writing to socket (айпи ноды)
хотя выставлял
<connect_timeout_with_failover_ms>1000</connect_timeout_with_failover_ms> -
Случайно. Но вообще вставлять напрямую в aggMt не сахар
Проще через MV и null таблицу -
Это не из-за этого параметра.
Что за ошибка была на второй ноде?
Если запрос очень долгий то через keep-alive параметр можно решить -
[ 2322807 ] {3eaeb875-1b63-44ac-95ef-da9263678f69} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
-
Live views aren't removed after disconnection (HTTP) · Issue #22996 · ClickHouse/ClickHouse
Description If the WATCH statement is used via HTTP interface for live views with a timeout, the live view isn't removed after disconnection. Steps to reproduce the bug Create a live view: ...
-
Ssl используется? Secure?
-
нет, ну разве что авторизация по tcp
-
а что за сеть? локальная ? докеры?
похоже на баг в КХ -
сеть локальная, физика, не докер. Я вот только недавно весь кластер обновил с 20.11 по 21.3.5. Не пофиксило.
-
ошибка на похожем запросе все время? или все время разные?
-
логи с одной ноды
2021.04.12 20:31:00.408198 [ 2319566 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.408259 [ 2319290 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.408295 [ 2319452 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.408318 [ 2319659 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.408368 [ 2319717 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.408391 [ 2319460 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.408402 [ 2319330 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.414811 [ 2319290 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.414826 [ 2319659 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.414841 [ 2319566 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.415005 [ 2319566 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 21:43:43.318794 [ 2332741 ] {} <Error> ServerErrorHandler: Code: 210, e.displayText() = DB::NetException: Connection reset by peer, while reading from socket (айпи:52630), Stack trace (when copying this message, always include the lines below):
0. DB::ReadBufferFromPocoSocket::nextImpl() @ 0xeb4fd73 in /usr/bin/clickhouse
1. DB::TCPHandler::runImpl() @ 0xf8b9264 in /usr/bin/clickhouse
2. DB::TCPHandler::run() @ 0xf8cbec9 in /usr/bin/clickhouse
3. Poco::Net::TCPServerConnection::start() @ 0x11f801af in /usr/bin/clickhouse
4. Poco::Net::TCPServerDispatcher::run() @ 0x11f81bc1 in /usr/bin/clickhouse
5. Poco::PooledThread::run() @ 0x120b82e9 in /usr/bin/clickhouse
6. Poco::ThreadImpl::runnableEntry(void*) @ 0x120b414a in /usr/bin/clickhouse
7. start_thread @ 0x82de in /usr/lib64/libpthread-2.28.so
8. clone @ 0xfbe83 in /usr/lib64/libc-2.28.so
(version 21.3.5.42 (official build)) -
keep_alive_timeout может помочь? запросы есть реально долгие, когда за большой период идёт селект
-
нет не может. Тут ошибка КМК сразу, моментально.
сделайте grep c47f075a-a3b3-42ab-870f-7c38c88210bb /var/log/clickhouse-server/clickhouse-server.log
Фаервол есть? Может он кол-во коннектов режет? -
cat /home/clickhouse/log/clickhouse-server.log | grep c47f075a-a3b3-42ab-870f-7c38c88210bb
2021.04.12 20:31:00.408198 [ 2319566 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.408259 [ 2319290 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.408295 [ 2319452 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.408318 [ 2319659 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.408368 [ 2319717 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.408391 [ 2319460 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.408402 [ 2319330 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.414811 [ 2319290 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.414826 [ 2319659 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.414841 [ 2319566 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.12 20:31:00.415005 [ 2319566 ] {c47f075a-a3b3-42ab-870f-7c38c88210bb} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
тоже самое, просто указывал уровень логирования "notice", мб из-за этого мало инфы -
да, нужен уровень trace.
-
без рестарта есть возможность сменить лог лвл?)
-
нет
-
trace подключил на одной ноде, буду мониторить его err.log. Эти ошибки не сыпятся, выходят где-то раз в 3-4 часа пачкой
-
та же хрень, уже который раз сталкиваюсь. при создании вьюхи пишет:
>Query error: Code: 241, e.displayText() = DB::Exception: Memory limit (for query) exceeded: would use 9.32 GiB (attempt to allocate chunk of 4325376 bytes), maximum: 9.31 GiB: While executing AggregatingTransform (version 21.3.3.14 (official build))
при этом вьюха создаётся. походу надо тикет заводить на гитхабе. у меня версия 21.3.3.14 -
Привет, я разбираюсь с dictionary в КХ.
У меня есть словарь такого вида:
CREATE DICTIONARY IF NOT EXISTS dict_test (
A String,
B String,
C String
)
PRIMARY KEY A, B
SOURCE(CLICKHOUSE(table 'some_view'))
LAYOUT(COMPLEX_KEY_HASHED())
LIFETIME(1);
Что происходит когда я делаю селект вроде такого?
SELECT * FROM dict_test WHERE A = 'SOME_VALUE_A' AND B = 'SOME_VALUE_B';
Запрос будет идти в память словаря как tuple('SOME_VALUE_A', 'SOME_VALUE_B') по ключу?
А так фуллскан?
SELECT * FROM dict_test WHERE A = 'SOME_VALUE';
Или чтение будет из some_view? -
селекты из словаря работают медленно, они больше для дебага. лучше ограничиться dictGet*
-
Ок, спасибо
- 13 April 2021 (154 messages)
-
Replacing происходит между партами внутри одной партиции
-
lifetime очень маленький
каждую секуду будет SELECT A,B,C FROM some_view происходить
в отдельную область памяти, а потом атомарный replace
SELECT * FROM dict_test это кажется всегда фуллскан по представлению dict_test памяти
есть отдельно dictGet для словарей, там никакого fullscan конечно нет...
проверять надо через
SET send_logs_level='trace';
SELECT * FROM dict_test WHERE A = 'SOME_VALUE_A' AND B = 'SOME_VALUE_B' -
на сколько опасно перезагружать ноду, где выполняется большой мердж?
-
Всем привет. Только начинаю изучать кликхаус. Скажите, пожалуйста, по «хорошим практикам» в облаке нужно ли перед инстансами кликхауса ставить балансировщик нагрузки?
-
Добрый день. Поймал эту ошибку: https://github.com/ClickHouse/ClickHouse/pull/21976
в очереди репликации висит один парт с ошибкой, что можно с ним сделать?
И в какой версии старше 21.2.6.1 это исправлено?CollapsingSortedAlgorithm should not return more than index_granularity rows by KochetovNicolai · Pull Request #21976 · ClickHouse/ClickHouseChangelog category (leave one): Bug Fix Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): In rare case, merge for CollapsingMergeTree may create granul...
-
Да я понимаю. Я хотел результат аггрегации + несклько джоинов складывать в такой как бы кэш и использовать его при выборках. Спасибо, посмотрю что в трейсах происходит
-
@Malcolm061990 Nginx, который будет распределять по нодам , будет достаточно.
-
just fyi
на запросы вида SELECT * FROM dict_test WHERE A = 'SOME_VALUE_A' AND B = 'SOME_VALUE_B'
идет фуллскан. -
2021.04.13 14:08:08.006115 [ 3791333 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Debug> db3.table (cc4a0c15-9dfd-4fcd-8ce3-369c8b8103e3) (SelectExecutor): Key condition: unknown, unknown, (column 0 in [1607928480, +inf)), (column 0 in (-inf, 1607932200]), and, and, and, unknown, and
2021.04.13 14:08:08.006133 [ 3791333 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Debug> db3.table (cc4a0c15-9dfd-4fcd-8ce3-369c8b8103e3) (SelectExecutor): MinMax index condition: unknown, unknown, (column 0 in [1607928480, +inf)), (column 0 in (-inf, 1607932200]), and, and, and, unknown, and
2021.04.13 14:08:08.006140 [ 3791333 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Debug> db3.table (cc4a0c15-9dfd-4fcd-8ce3-369c8b8103e3) (SelectExecutor): Selected 0/0 parts by partition key, 0 parts by primary key, 0/0 marks by primary key, 0 marks to read from 0 ranges
2021.04.13 14:08:08.006254 [ 3791333 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Trace> InterpreterSelectQuery: FetchColumns -> WithMergeableState
2021.04.13 14:08:08.006548 [ 3791333 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Trace> InterpreterSelectQuery: WithMergeableState -> Complete
2021.04.13 14:08:08.006608 [ 3791333 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Trace> InterpreterSelectQuery: FetchColumns -> Complete
2021.04.13 14:08:08.008430 [ 3778334 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Trace> Connection (hostname-137.end:9001): Connecting. Database: (not specified). User: default
2021.04.13 14:08:08.008545 [ 3778355 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Trace> Connection (hostname-140.end:9000): Connecting. Database: (not specified). User: default
2021.04.13 14:08:08.008613 [ 3778230 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Warning> ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.13 14:08:08.009003 [ 3778355 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Trace> Connection (hostname-140.end:9000): Connected to ClickHouse server version 21.3.5.
2021.04.13 14:08:08.009016 [ 3778334 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Trace> Connection (hostname-137.end:9001): Connected to ClickHouse server version 21.3.5.
2021.04.13 14:08:08.016359 [ 3791333 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Debug> DynamicQueryHandler: Done processing query
2021.04.13 14:08:08.016391 [ 3791333 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Debug> MemoryTracker: Peak memory usage (for query): 0.00 B.
Выловил ошибку с trace. Вижу что нода, пытается подключится к двум другим нодам.
2021.04.13 14:08:08.008430 [ 3778334 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Trace> Connection (hostname-137.end:9001): Connecting. Database: (not specified). User: default
2021.04.13 14:08:08.008545 [ 3778355 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Trace> Connection (hostname-140.end:9000): Connecting. Database: (not specified). User: default
Затем выходит ошибка, и всё же соединение успешно. странно
ConnectionPoolWithFailover: Connection failed at try №1, reason: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 21.3.5.42 (official build))
2021.04.13 14:08:08.009003 [ 3778355 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Trace> Connection (hostname-140.end:9000): Connected to ClickHouse server version 21.3.5.
2021.04.13 14:08:08.009016 [ 3778334 ] {d246c86d-7cd8-49b4-94bb-a644d346f967} <Trace> Connection (hostname-137.end:9001): Connected to ClickHouse server version 21.3.5. -
Спасибо. Но вопрос в том, это именно хорошая практика от разработчиков или ваша рекомендация?
-
Так заведено на моем проекте и это моя рекомендация ;) это универсальный , гибкий и простой в настройке хороший подход . Если конечно у вас нет 100 докерезированных контейнеров, под управлением kubernetes, крутящихся в GCE или AWS :) в этом случае следует использовать встроенные там load balancer
https://cloud.google.com/load-balancing
ВCloud Load Balancing | Google CloudHigh performance, scalable global load balancing on Google’s worldwide network, with support for HTTP(S), TCP/SSL, UDP, and autoscaling.
-
в доке сказано В отличие от стандарта SQL, все остальные ключевые слова, включая названия функций зависят от регистра. https://clickhouse.tech/docs/ru/sql-reference/syntax/#syntax-keywords
В чем смысл, если работает как SELECT MIN(number) FROM tutorial.test_table;, так и SELECT min(number) FROM tutorial.test_table; ?Синтаксис | Документация ClickHouseСинтаксис В системе есть два вида парсеров: полноценный парсер SQL (recursive descent parser) и парсер форматов данных (
-
В вашем случае где именно крутится nginx?)
-
Добрый день, вопрос по kafka_thread_per_consumer.
В доке написано.
При включенном режиме каждый потребитель сбрасывает данные независимо и параллельно, при отключённом — строки с данными от нескольких потребителей собираются в один блок.
> строки с данными от нескольких потребителей собираются в один блок
Тут не ясно, в одном блоке могут быть сообщения от нескольких топиков? Или в один блок пишут исключительно косьюмеры из одного кафка энджин ? -
в один блок пишут исключительно косьюмеры из одного кафка энджин
-
Понял, спасибо
-
-
два списка: ключи и значения
values[indexOf(keys, 'value')] -
А это будет не дольше/грязнее, чем json хранить и парсить?
-
-
tcpdump например
-
Здравствуйте! Пользуюсь табиксом для подключения к КХ. Начиная с версии КХ 21.4.3.21 он перестал подключаться. Что делать? Табикс - всё?
-
UP
такой экспепшн для истории
Code: 49, e.displayText() = DB::Exception: Incomplete granules are not allowed while blocks are granules size. -
Спасибо, а как можно перехватить текст сообщения по определённому айпишнику? Тоже tcpdump?
-
ну через tcpdump если конечно сообщение отправляется незашифрованным (без https к примеру)
-
tcpdump как и другие сниферы "видят" все содержимое пакета на всех уровнях TCP/IP стека
-
ну или модели OSI если хотите
-
и если на данные не шифруются, то их можно "увидеть" так как они просто plain text
-
-
Угу, разобрался, полезно
-
ClickHouse/ClickHouse tagged: v21.1.9.41-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.1.9.41-stable
Release notes:
v21.1.9.41-stableRelease v21.1.9.41-stable · ClickHouse/ClickHouseClickHouse stable release v21.1.9.41-stable
-
Всем привет!
Пытаюсь применить опцию input_format_defaults_for_omitted_fields при загрузке данных таблицы из CSV.
КХ: version 21.3.5.42 (official build)
Если пишу как SETTINGS в запрос (INSERT INTO default.test_table_name format CSV SETTINGS input_format_defaults_for_omitted_fields=1), то получаю Code: 115. DB::Exception: Unknown setting input_format_defaults_for_omitted_fields.
Если пишу как параметр запроса clickhouse-client (... clickhouse-client --input_format_defaults_for_omitted_fields=1 -q "INSERT INTO default.test_table_name format CSV"), то получаю
Bad arguments: unrecognised option '--input_format_defaults_for_omitted_fields=1'
Попытаться ещё задать в конфиг users.xml для моего пользователя?
Или я в целом как-то неправильно понимаю концепцию настроек (и этой настройки в частности)?
Способы задания опции брала со страницы Документации.
Может кто-то сталкивался с таким и может подсказать?
P.S. знаю, что опция по умолчанию уже единица.Settings | ClickHouse DocumentationSettings distributed_product_mode Changes the behaviour of distributed subqueries. ClickHouse applies this setting when
-
ну как бы тут такой момент что это фуллскан по памяти, так что оно достаточно быстро должно быть
-
да это понятно, но почему-то ожидал немного другого поведения. Пока сойдет, но позже буду думать как такие кэши сделать, что бы за единицу ходить.
-
можно попробовать через clickhouse-client -m -q "SET input_format_defaults_for_omitted_fields=1; INSERT ... "
или cat your.csv | curl --data-binary @- "http://127.0.0.1:8123/?input_format_defaults_for_omitted_fields=1&query=INSERT ..." -
На первую ругается, т.к. не поддерживает несколько запросов в одной query.
Второе попробую сейчас.) -
ну погодите, у вас есть по факту хешмап в памяти
чтобы отфильтровать его надо как минимум пройтись по всем ключам
получить атрибуты и сравнить их
PRIMARY KEY для словаря, это выражение, которое используется как ключ хешпапа...
PRIMARY KEYи т.п. для MergrTree это все остается внутри SOURCE() и словарь про это ничего не знает -
опция -m как раз для того чтобы поддерживал несколько запросов...
если вы в datagrip делаете, то там да, там HTTP интерфейс под капотом
там надо через параметры JDBC драйвера это выставлять -
Почему возникает ошибка: DB::Exception: Memory limit (total) exceeded: would use 28.30 GiB (attempt to allocate chunk of 8592536654 bytes), maximum: 26.50 GiB ?
Запускаю команду из консоли с параметрами --max_bytes_before_external_group_by=70000000 --max_bytes_before_external_group_by=5000000000 --max_memory_usage=0 --log_queries=0 --aggregation_memory_efficient_merge_threads=1
Свободного места на диске 300гиг+
Команда типа INSERT INTO tmp.last SELECT DISTINCT time, murmurHash2_32(acc_key) , article... FROM db.db ORDER BY time LIMIT 100 BY article -
Ага, но даже с этим ключом всё равно получаю ошибку "Code: 62. DB::Exception: Syntax error (Multi-statements are not allowed): failed at position 47 (end of query): ; ..."
-
Ребят привет, подскажите пожалуйста - нам нужен опытный консультант по Clickhouse. Нужно помочь с 3-мя вопросами: 1) кластер и его настройка, 2) оптимизация view с огромным объемом неоднородных данных (Тб) и 3) ревью пайплайна данных и оптимизация запросов. Если кто-то готов посотрудничать или помочь с контактами - пишите в приват. Буду благодарен.
-
ребят, привет, подскажите, если ли для таблицы с engine = ReplacingMergeTree виртуальная колонка по которой можно понять, какая строка последняя? если явно колонку version не указывал?
-
«Последнюю в выборке, если ver не задан. Под выборкой здесь понимается набор строк в наборе партов, участвующих в слиянии. Последний по времени создания парт (последний инсерт) будет последним в выборке. Таким образом, после дедупликации для каждого значения ключа сортировки останется самая последняя строка из самого последнего инсерта.»
-
спасибо, как оно работает понимаю, мне бы для случаев когда дедупликация ещё не произошла применить к колонкам вне ключа сортировки argMax по колонке ver, которая не была указана присоздании таблицы, есть ли такой враиант? или надо пересоздавать таблицу с явно указанной колонкой ver, которую потом смогу использовать как второй агрумент в argMax?
-
таблица большая, к которой обращаетесь?
-
нет, сотни тысяч, может будут миллионы
-
колонка с датой есть?
-
-
в целом — есть, но могут быть и абсолютно идентичные строки
-
ну тогда если не сможете подобрать подобный запрос с сортировкой и лимитом (select ... Order by pk, time desc limit 1 by pk)
Можно попробовать select from final
Ну либо пересоздать с ver полем
Может буду варианты лучше... -
да, получается не тполя ни для argMax, ни для использования в order by с limit by, думал, может есть какая-то виртуальная колонка заменяющая указанную явно ver, спасибо за время!
-
полистайте историю, мб найдете решение ещё
-
ок)
-
очень странно, какая версия CH ?
clickhouse-client -mn
а с этой парой? -
Подскажите несколько основных системных метрик clickhouse для мониторинга его работы?
что-бы можно было глянуть и сказать чет дела не совсем гуд :) а то было пару затыков -
-
-
Performance comparison of database management systems
ClickHouse is a fast open-source column-oriented database management system that allows generating analytical data reports in real-time using SQL queries
-
плохо искали )
-
-
плохо прочитал :) на вставку не имеет смысла сравнивать. там отличия на порядки в пользу кликхауса
-
-
кликхаус - это аналитическая бд, основная задача которого - чтение.
-
Это очень медленный фулскан, потому что там каждая колонка в своей хеш-таблице, и эти хеш-таблицы не предназначены для прохода последовательно,
у меня есть тест где в 300 раз запрос медленее к словарю чем к мержтри таблице -
наверное можно использовать виртуальное поле _part
-
уважаемые коллеги, подскажите как подправить запрос, чтобы все колонки были в процентах относительно первой колонки (там где 0). график строится в метабезейзе и нет возможности перевести в проценты на уровне приложения. если вообще никак, то придётся писать прокси на nodejs и высчитывать всё там, а этого пока не очень хочется :)
-
@den_crane не подскажете, чем можно вылечить?
-
спасибо, а лучше использовать его, или _part_index?
-
вопрос попроще: как можно сделать, чтобы во всех строчках значения были в процентах относительно нулевой строчки?
-
только если подзапросом первую строчку достать
-
там у вас такая ошибка, у вас все впорядке со storage policy?
Volume must contain at least one disk -
ну или allow_experimental_window_functions = 1 и заюзать max(<col_with_cnt>) over(...)
-
можно увидеть что вы видите в очереди репликации?
-
в какой версии КХ ? Можно через массивы можно через window functions
-
я не знаю что такое _part_index, если вам подходит то используйте
-
как uuid
-
уже проверил, просто какой-то порядковый номер парта, подходит, спасибо
-
Прямо сейчас на нашем официальном канале на YouTube идет трансляция, на котором мы обсуждаем методы и инструменты скоринга входных данных, их агрегацию и создание единой системы в офлайн- и онлайн-ритейле, банкинге и облачных сервисах. На примерах покажем, как с помощью данных оптимизируются устоявшиеся бизнес-процессы в компаниях.
В данный момент начинается доклад нашего архитектора. Он расскажет о данных в S3, поддержке S3 storage в ClickHouse, а также расскажет, как выполнить select-запрос к файлу, не имея никакой СУБД.
Своими кейсами также поделятся представители Леруа Мерлен, Райффайзенбанк и Авито
Подключайтесь →Единый источник данных в data-driven компанияхМитап о методах и инструментах скоринга входных данных, их агрегации и создании единой системы в офлайн- и онлайн-ритейле, банкинге и облачных сервисах. 00:00:00 - intro от модератора 00:02:21 - Создание Data Platform в Леруа Мерлен - Дмитрий Ибрагимов, Леруа Мерлен 00:24:50 - Данные в S3: поддержка S3 storage в ClickHouse, а также как выполнить select-запрос к файлу, не имея никакой СУБД - Всеволод Грабельников, Yandex.Cloud 00:42:00 - Витрины данных в Авито и их применение в бизнес-задачах - Илья Салманов, Авито 01:01:47 - От анализа данных до внедрения в прод: как инфраструктура помогает обучать и внедрять ML-модели - Михаил Сеткин, Райффайзенбанк 01:18:45 - Cветофор 2.0: страх и ненависть на пути от экселя к градиентному бустингу - Ксения Блажевич и Дмитрий Фокеев, Леруа Мерлен
-
21.3.3.14
пытаюсь сейчас через массивы, пока не очень получается -
Добрый вечер. Подскажите, пожалуйста, про правильную организацию кластера CH (или укажите, где почитать)?
В настоящий момент у меня есть 3 шарда по 2 реплики:
Шард 1 Шард 2 Шард 3
Реплика 1-1 Реплика 2-1 Реплика 3-1
Реплика 1-2 Реплика 2-2 Реплика 3-2
Каждый шард лежит на отдельном сервере, каждая реплика обслуживается отдельным докер-контейнером.
И что-то одолевают меня сомнения в правильности такого подхода: получается ведь, что если связь с Сервером 1, содержащим Шард 1 будет нарушена, или сервер «упадёт» — треть данных потеряется, потому что обе реплики находятся там 🤷🤔
Может, правильнее делать как-то так: например, одна копия Шарда 1 лежит на Сервере 1, вторая — на сервере 2… Ну и так далее. Просто как-то их смешивать. Чтобы при выходе из строя одного сервера, из двух других можно было бы собрать полную версию данных.
Или я не с той стороны подхожу к задаче? -
SELECT
(arrayJoin(arrayMap(i -> (i, (i / (g[1])) * 100), groupArray(x) AS g)) AS t).1 AS n,
t.2 AS per
FROM
(
SELECT number AS x
FROM numbers(10)
ORDER BY x DESC
)
┌─n─┬───────────────per─┐
│ 9 │ 100 │
│ 8 │ 88.88888888888889 │
│ 7 │ 77.77777777777779 │
│ 6 │ 66.66666666666666 │
│ 5 │ 55.55555555555556 │
│ 4 │ 44.44444444444444 │
│ 3 │ 33.33333333333333 │
│ 2 │ 22.22222222222222 │
│ 1 │ 11.11111111111111 │
│ 0 │ 0 │
└───┴───────────────────┘ -
всё правилньо, по-дефолту нужно делать так, чтоб реплики были на разных серваках
-
КХ рекомндует 6 серверов. Если нет такой возможности, то да вам надо сдвинуть по кругу, чтобы реплика была на другой железяке
-
то есть для быстрой обработки данных — каждый шард на своей машине, но внутри каждого шарда реплики тоже на отдельных машинах
-
👍🏻
-
да, чтобы все диски и все cpu были доступны основной реплике, и вторая чужая реплика не жрала диски
-
есть вопрос как переносить данные с одного кликхауса на другой если есть GraphiteMergeTree
-
движок не поддерживает fetch из файла
-
спасибо, работает в 2 раза быстрее чем мой вариант:
SELECT arrayJoin(active_days) - toDate(first_activity) as day, 100*uniq(device_id)/max_users as k
FROM raw_users FINAL
ARRAY JOIN [(SELECT uniq(device_id) as k FROM raw_users FINAL WHERE has(active_days, toDate(first_activity)))] as max_users
GROUP BY day,max_users
ORDER BY day ASC
который я так понимаю рассчитывает значение максимума не один раз, а на каждую строку, аналогично:
SELECT arrayJoin(active_days) - toDate(first_activity) as day, 100*uniq(device_id)/(SELECT uniq(device_id) as k FROM raw_users FINAL WHERE has(active_days, toDate(first_activity))) as k
FROM raw_users FINAL
GROUP BY day
ORDER BY day ASC -
всем привет,
вопрос про воронку и режим работы в случае strict и strict_order
по тестам получается, что если встречается повторно промежуточный шаг, то подсчет воронки останавливается
Например ищем воронку Start->Anketa->Finish
Есть следующая последовательность
Start->Anketa->Product->Start->Anketa->Finish вернет 2 (хотя воронка сформировалась в конце, и должно быть 3)
при этом
Start->Anketa->Product->Start->Finish вернет 3 ( убрал Anketa второй раз)
Не понятна логика, почему и зачем такое поведение?
gist:
https://gist.github.com/cadet354/0566bfb8c0d16c68747dff7c147b794awindowFunnel mode='strict'windowFunnel mode='strict'. GitHub Gist: instantly share code, notes, and snippets.
-
разве? каким образом? Это обычный MergeTree
-
Выдает ошибку
-
Для импорта из файла
-
секретную?
-
Завтра скину уже
-
вы в курсе что вопрос должен содержать половину ответа?
вы буквально спрашиваете про подземный стук. -
Я просто не у компа🙈
-
очередь с такими ошибками
last_exception:
Code: 49, e.displayText() = DB::Exception: Incomplete granules are not allowed while blocks are granules size. Mark number 3 (rows 8192), rows written in last mark 0, rows to write in last mark from block 1 (from row 8192), total marks currently 4 (version 21.2.6.1 (official build))
postpone_reason:
Not executing log entry queue-0000071148 of type MERGE_PARTS for part 632801e1b685803d8904b35e30441476_1143_1525_261 because source parts size (4.29 MiB) is greater than the current maximum (1.00 MiB). -
движок у таблицы?
-
collapsingMT
-
так апгейдится в 21.2.9.41 ?
-
ок, будем поднимать
а можно как-то временно это подлечить? -
alter table detach part ?
-
я так понимаю если выключить КХ, поднять версию, запустить, я парт не потеряю?
-
я не знаю , там два бага.
-
21.2 DB::Exception: Incomplete granules are not allowed while blocks are granules size · Issue #20259 · ClickHouse/ClickHouse
I ran an optimize on 21.2, and the merge kept failing. 2021.02.09 14:38:06.519295 [ 14569 ] {} <Trace> db.table: Executing log entry to merge parts all_0_91343_4396, all_91344_91581_5...
-
ну вот этот у меня и есть
даже если сделать detach, поднять версию, потом attach не факт что парт сохранится? -
Подскажите, а авторизация на сервере через Active directory возможна?
-
Можно через LDAP
-
LDAP | ClickHouse Documentation
LDAP LDAP server can be used to authenticate ClickHouse users. There are two different approaches for doing this: Use LD
-
Спасибо!
-
Добрый день!
подскажите плз. Я понимаю, что у КХ нет возможности update,и для этого придуманы коллапсирующие движки типа VersionedCollapsingMergeTree
А как быть, если надо предыдущую версию записи сохранить для аудита (в другой таблице). Update бывают редко, для отчетов всегда нужна последяя версия, но предыдущие версии нужны просто для посмотреть в UI. В идеале в другую таблицу их сохранять.
Данные - показания счетчиков электроэнергии. они идут плотным потоком, не всегда в строгой последовательности по времени.
Кто как выкручивается? -
Две таблицы, одна для последнего состояния, вторая для истории с обычным движком mergeTree соединены через Materialized VIEW
-
Вечер добрый. А как сделать, чтобы кликхаус возвращал строку так же как ее отображает?
-
-
Чтобы он не подставлял вместо одного слеша еще один и тд
-
При записи там был один слеш
-
Спасибо. Перевариваю. А первая получается типа VersionedCollapsingMergeTree? и вставляем сразу в две таблицы? Что то пока не могу ухватить идею.
-
А каким образом вы получаете данные то из кх?
В некоторых форматах приходится эскейпить данные вот и появляется второй слеш -
Питоновским clickhouse_driver
-
CollapsingMergeTree нужен в 90% случаев для задачи подсчета sum и count агрегатов, только для этого есть толк в строках и антистроках.
Для остальных видов запросов есть ReplacingMergeTree -
Покажите всю строку из белого скриншота
-
>вставляем сразу в две таблицы
для этого есть MATERALIZED VIEW, они работают аналогично insert trigger в других базах -
-
это осознал. Спасибо. Там действительно нет задачи подсчета агрегатов, надо просто перезаписать значение.
-
Правильно ли я понимаю, что можно сдвинуть по такой схеме, и этого будет достаточно?
Шард 1 Шард 2 Шард 3
Реплика 1-1 Реплика 2-1 Реплика 3-1
Реплика 2-2 Реплика 3-2 Реплика 1-2
При условии, что первое число в идентификаторе реплики — номер шарда на отдельном сервере… -
Да
-
GDB online Debugger | Code, Compile, Run, Debug online C, C++
Online GDB is online ide with compiler and debugger for C/C++. Code, Compiler, Run, Debug Share code nippets.
-
-
ага, я по Oracle знаю, что такое MView, думаю в КХ аналогично.
Но если я использую ReplaceMergeTree то как я узнаю, что уже такой ключ там есть?
или делаем так
1. делаем insert очередной пачки записей в таблицу "A" (MergeTree)
2. из таблицы с конечными значеними "B" (ReplaceMergeTree) переписываем в таблицу "V" записи которые есть в таблице "A". то есть что то типа insert into V select from A if exists in B
3. переношу все записи из A в B (и все что нужно зареплейсится). -
Не совсем, в кх MV работают как insert trigger, те нет возможности пересчитывать их по расписанию и тд.
> Но если я использую ReplacingMergeTree то как я узнаю, что уже такой ключ там есть?
Никак, просто пихаете все записи в ReplacingMergeTree, таким образом что бы при схлопывании всех записей по ORDER BY у вас оставалась только одна нужная.
Потом пишете запросы к ReplacingMergeTree определенным образом(схлопывая все записи в последнее состояние) -
-
Спасибо. А это точно питон добавляет escape символы, а не в базе оно хранится с ними?
-
-
С '\' ничего не находит, хотя там полно таких строк
-
-
покурить это надо. Не ухватываю мысль. Попробую вот так:
была запись X версии1 в ReplacingMergeTree
Я вставляю X версии2 в ReplacingMergeTree.
Хочу, что бы в таблице осталась X версии2 но Xверсии1 а) не пропала без следа б) не мешалась. -
Были и достаточно
https://docs.altinity.com/altinitystablerelease/releasenotes/releases/21.1/211/ClickHouse Altinity Stable Release™ 21.1Details of the Altinity Stable Release 21.1
-
-
-
Нужно две таблицы,
MergeTree которая будет хранить всю историю
ReplacingMergeTree которая будет схлопывать дубликаты во время мержей.
Но это же означает, что в произвольный момент времени дубликаты будут находится в таблице и вам нужно будет писать запросы специальным образом, что бы они вам не мешали -
Строго говоря питон тоже ничего не добавляет, это print так печатает массивы
-
Редактор ругается что \ в строке не экранирован
-
Либо clickhouse_driver добавил при заливке
-
-
-
-
Это применяется для эскейпинга %(x)s параметров. Вы скорее всего составляли через INSERT INTO ... VALUES без inline данных в самом теле запроса, а через второй параметр в execute? В этом случае никакого эскейпинга нет.
-
Да
conn = Client(**clickhouse_params)
q = f'INSERT INTO {db}.{table} ({cols}) VALUES'
conn.execute(q, dataframe.to_dict('records'))
conn.disconnect() -
Я уже, кажись, понял в чём дело - оно только питоном отображается с эскейпингом, а в базе оно без эскейпинга лежит
-
да
-
возьмется из одной строки , если нет Null. Или используйте any( tuple(col1, col2) )
-
Добрый вечер. Имеется словарь, ключами которого является network (iptrie,если не ошибаюсь). Имеется таблица в которой order by ip в uint32. Запросом нужно выбрать те строки, где значения словаря не Null. Каким образом сделать это оптимально? На данный момент, в предикате явно поместил: dictgetstring(name, value, tuple(ip)) != '' . Будет ли выполнятся быстрее запрос, если обращение будет не к словарю, а ip in (список_значений_ключей-словаря)?
-
in чаще всего быстрее. Хотя если из таблцы надо выбрать почти все строки, потому что они все непустые, то может быть без разницы.
- 14 April 2021 (134 messages)
-
Благодарю.
-
там недавно strict_increase подвезли
https://github.com/ClickHouse/ClickHouse/commit/38a6dba3e3f83ebbea83903791dfc553a73923d4
может это поможет?
можно авторов поспрашивать на github
создаем issue и через @nick_name тегаем всех кто тут отмечен
https://github.com/ClickHouse/ClickHouse/blame/9f5cd35a6963cc556a51218b46b0754dcac7306a/tests/queries/0_stateless/00632_aggregation_window_funnel.sqlAdd option strict_increase to windowFunnel · ClickHouse/ClickHouse@38a6dbaClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Доброго времени суток. Подскажите пожалуйста есть ли какой-то способ сделать так чтобы по максимуму
вычислений происходило распределенно? Поясню на примере. Считаем среднее вот таким вот запросом:
SELECT
cityHash(sessionId) % 2 as isUnderSplit,
avg(metric)
FROM (
SELECT
sessionId,
sum(value) as metric
FROM events
GROUP BY sessionId
) GROUP BY isUnderSplit
Таблица events распределенная (по `sessionId`). Судя по времени выполнения запроса и по системным метрикам (конкретно `sar -n DEV 1`)
я полагаю что внутренний SELECT выполняется распределенно и результаты его выполнения
(все еще достаточно объемные, – сессий много) отправляются на сервер иницрующий запрос. И только там уже
выполняется финальная группировка по isUnderSplit. Существует ли способ как-то сделать так чтобы предварительная
группировка по isUnderSplit выполнялась на шардах? -
Всех приветствую. Может кто то встречался с такой проблемой:
2021.04.13 19:25:35.413292 [ 73460 ] {c6ce589c-7bc1-4615-a32f-dbf32f938534} <Debug> executeQuery: (from 127.0.0.1:54414) CREATE TABLE default.test1 ON CLUSTER cluster (`load_id` UUID, `msisdn` UInt64) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test1', '{replica}') PARTITION BY load_id ORDER BY msisdn
2021.04.13 19:25:35.413332 [ 73460 ] {c6ce589c-7bc1-4615-a32f-dbf32f938534} <Trace> ContextAccess (default): Access granted: CREATE TABLE ON default.test1
2021.04.13 19:25:35.414906 [ 73329 ] {182b8688-40de-4717-be30-a6c59305011b} <Debug> DDLWorker: Processing tasks
2021.04.13 19:25:35.414911 [ 73364 ] {} <Debug> DDLWorker: Cleaning queue
2021.04.13 19:25:35.415706 [ 73460 ] {c6ce589c-7bc1-4615-a32f-dbf32f938534} <Debug> executeQuery: Query pipeline:
DDLQueryStatusInputStream
2021.04.13 19:25:35.416160 [ 73329 ] {182b8688-40de-4717-be30-a6c59305011b} <Debug> DDLWorker: Processing task query-0000266153 (CREATE TABLE default.test1 ON CLUSTER cluster (`load_id` UUID, `msisdn` UInt64) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test1', '{replica}') PARTITION BY load_id ORDER BY msisdn)
2021.04.13 19:25:35.416631 [ 73329 ] {182b8688-40de-4717-be30-a6c59305011b} <Debug> DDLWorker: Executing query: CREATE TABLE default.test1 (`load_id` UUID, `msisdn` UInt64) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test1', '{replica}') PARTITION BY load_id ORDER BY msisdn
2021.04.13 19:25:35.416755 [ 73329 ] {d9ddb05c-676f-41cd-b1ed-36d061da33de} <Debug> executeQuery: (from 0.0.0.0:0, user: ) /* ddl_entry=query-0000266153 */ CREATE TABLE default.test1 (`load_id` UUID, `msisdn` UInt64) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test1', '{replica}') PARTITION BY load_id ORDER BY msisdn
2021.04.13 19:25:35.417175 [ 73329 ] {d9ddb05c-676f-41cd-b1ed-36d061da33de} <Debug> default.test1: Loading data parts
2021.04.13 19:25:35.417243 [ 73329 ] {d9ddb05c-676f-41cd-b1ed-36d061da33de} <Debug> default.test1: Loaded data parts (0 items)
2021.04.13 19:25:35.418345 [ 73329 ] {d9ddb05c-676f-41cd-b1ed-36d061da33de} <Debug> default.test1: Creating table /clickhouse/tables/1/test1
2021.04.13 19:25:35.419942 [ 73329 ] {d9ddb05c-676f-41cd-b1ed-36d061da33de} <Warning> default.test1: It looks like the table /clickhouse/tables/1/test1 was created by another server at the same moment, will retry
2021.04.13 19:25:35.420242 [ 73329 ] {d9ddb05c-676f-41cd-b1ed-36d061da33de} <Debug> default.test1: This table /clickhouse/tables/1/test1 is already created, will add new replica
2021.04.13 19:25:35.420815 [ 73329 ] {d9ddb05c-676f-41cd-b1ed-36d061da33de} <Debug> default.test1: Creating replica /clickhouse/tables/1/test1/replicas/3
2021.04.13 19:25:35.425111 [ 73283 ] {} <Debug> default.test1 (ReplicatedMergeTreeRestartingThread): Activating replica.
2021.04.13 19:25:35.427295 [ 73283 ] {} <Information> default.test1: Not cloning {}, it's lost
2021.04.13 19:25:35.427305 [ 73283 ] {} <Information> default.test1: Replica 5 has log pointer '0', approximate 1 queue lag and 0 queue size
2021.04.13 19:25:35.427309 [ 73283 ] {} <Information> default.test1: Will mimic 5
2021.04.13 19:25:35.428380 [ 73283 ] {} <Debug> default.test1: Queued 0 parts to be fetched
2021.04.13 19:25:35.428387 [ 73283 ] {} <Debug> default.test1: Copied 0 queue entries
2021.04.13 19:25:35.428664 [ 73283 ] {} <Debug> default.test1 (ReplicatedMergeTreeQueue): Loading queue from /clickhouse/tables/1/test1/replicas/3/queue
2021.04.13 19:25:35.428894 [ 73283 ] {} <Debug> default.test1 (ReplicatedMergeTreeQueue): Having 0 queue entries to load, 0 entries already loaded.
2021.04.13 19:25:35.429005 [ 73283 ] {} <Trace> default.test1 (ReplicatedMergeTreeQueue): Loaded queue
2021.04.13 19:25:35.430175 [ 73280 ] {} <Information> default.test1: Became leader -
2021.04.13 19:25:35.430558 [ 73329 ] {d9ddb05c-676f-41cd-b1ed-36d061da33de} <Debug> DDLWorker: Executed query: CREATE TABLE default.test1 (`load_id` UUID, `msisdn` UInt64) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test1', '{replica}') PARTITION BY load_id ORDER BY msisdn
2021.04.13 19:25:35.430914 [ 73329 ] {d9ddb05c-676f-41cd-b1ed-36d061da33de} <Debug> DDLWorker: Waiting a watch
2021.04.13 19:25:35.431093 [ 73288 ] {} <Trace> StorageKafka (hosts_queue): Stalled
2021.04.13 19:25:35.516890 [ 73460 ] {c6ce589c-7bc1-4615-a32f-dbf32f938534} <Information> executeQuery: Read 3 rows, 165.00 B in 0.103576356 sec., 28 rows/sec., 1.56 KiB/sec.
2021.04.13 19:25:35.516954 [ 73460 ] {c6ce589c-7bc1-4615-a32f-dbf32f938534} <Information> DynamicQueryHandler: Done processing query
Кластер состоит из 3 нод (реплика 3,4,5), новый и практически пустой. Не считая нескольких таблиц, что мы перезалили из старого кластера с 2 нодами, соединив\разъединив кластер ZK и КХ. В зукипер улетели некоторые метаданные из старого кластера, но были почищены в /clickhouse/tables/{shard}/ -
да, спасибо, так и сделаю. Я думал я что-то не понимаю и это желаемое поведение (по мне похоже на баг)
-
-
Я создал кластер по такой схеме, но теперь у меня рассинхрон в количестве данных при заливке их из старой базы в новую 🤷🤦
-
Можно по очереди рестартовать если ничего криминального в чейнжлоге нет
-
-
Много это сколько и насколько маленькие?
-
у нас 21.2.6.1(есть критичный для нас баг), хотим 21.2.9.41
тут понимаю без особых проблем. он же подсосет данные? -
Минорные апдейты обычно безопасные
-
-
От 1 до 1000 строк в инсерте, до 100000 строк в минуту примерно
-
Попробуй для начала compact парты и in-memory парты
-
-
Спасибо, понял.
-
ALTER TABLE graphite.data FETCH PARTITION 202101 FROM '/home/nshumshurova/data/'
ALTER TABLE graphite.data
FETCH PARTITION 202101 FROM '/home/nshumshurova/data/'
Received exception from server (version 20.1.2):
Code: 48. DB::Exception: Received from 127.0.0.1:9000. DB::Exception: Partition operations are not supported by storage GraphiteMergeTree. -
https://clickhouse.tech/docs/ru/sql-reference/statements/alter/partition/ отсюда взят синтаксисPARTITION | Документация ClickHouse
Манипуляции с партициями и кусками Для работы с партициями доступны следующие операции: DETACH PARTITION — перенести пар
-
ALTER TABLE users FETCH PARTITION 201902 FROM '/clickhouse/tables/01-01/visits';
-
поисковик по ошибке вообще молчит
-
мне тут сказали что движок должен быть ReplicatedGraphiteMergeTree.
-
чтобы это работало
-
сменить движок не дропая данные возможно?
-
@den_crane вы мне недавно очень помогли с нахождением причины разного количества записей в таблицах при переносе данных в КХ-кластер из отдельного сервера КХ. Тогда проблема оказалась в том, что некорректно был настроен ЗК (каждая нода работала независимо, а не как часть ансамбля).
После перенастройки ЗК, всё стало работать корректно, но вчера я поменял расположение реплик в кластере, сдвинув, по вашему совету, вторую реплику в кластере, чтобы выход из строя одного сервера не приводил к полной потере данных. Теперь же при вставке данных в Distributed таблицы я снова получаю разное количество записей (в каких-то случаях больше, в каких-то меньше), чем в исходных таблицах. И не представляю, как это исправить, и почему так происходит -
Привет, подскажите пожалуйста в sequenceMatch можно как-то указать что события быть не должно?
Например ('(?1)(? NOT 2)(?3)') -
Всем привет, подскажите. Раз в три дня размер detached становится неприлично большим
79G .../my_db_2/table_2_sharded/detached - тут 14 сломанных партов
6.9G .../my_db_1/table_1_sharded/detached
88G .../my_db_2/table_2_sharded/detached
2.0G .../my_db_1/table_1_sharded/detached
67G .../my_db_2/table_2_sharded/detached - тут 15 сломанных партов
980M .../my_db_1/table_1_sharded/detached
Обычно это broken_* парты. Если какая нибудь опция, чтобы detached директория очищалась автоматически ?
Наверное самый главный вопрос - какая причина всего этого хозяйства?
З.Ы. Поможет ли переезд на новую версию КХ 20.10? Сейчас 19.17 стоит
З.Ы.Ы. Стоит ли добавлять опцию монтирования nodiratime, а то в документации говорится только про noatime? -
я бы предпочёл второй вариант, потому что:
1. вставка в NullTable сразу тригерит MV, который складывает кучу мелких кусков в буфер, которые неагрегированные записываются на диск, а потом уже мёржатся в фоне (и потом наблюдаем "пилы" на графиках дисковой подсистемы). (вроде есть отдельная настройка, чтобы также мёржилось при запись в AggregatingMergeTree)
2. в буфере накапливается куча негрегированных данных, а потом всё агрегируется с помощью MV и записывается на диск уже смёрженное -
у меня конечные таблицы будут MergeTree и ReplacingMergeTree.
И ещё первый вариант удобнее т.к. параллельно идут селекты в которых нужна максимально актуальная информация - я их буду делать из буферов
Просто интересует насколько правильно так делать по идеологии КХ -
Данные распределены после вставки как-то неравномерно
SELECT
FQDN() AS h,
COUNT()
FROM data_values
GROUP BY h
Query id: fb54d262-2c8e-49f2-b7a3-f24d7f896f8d
┌─h──────────────────┬─count()─┐
│ cluster-node-01-02 │ 350602 │
│ cluster-node-03-02 │ 1098298 │
│ cluster-node-02-02 │ 725096 │
└────────────────────┴─────────┘
SELECT
FQDN() AS h,
COUNT()
FROM data_values
GROUP BY h
Query id: 8822369e-c91e-4eb5-b148-39dacd75df30
┌─h──────────────────┬─count()─┐
│ cluster-node-02-01 │ 725096 │
│ cluster-node-01-02 │ 350602 │
│ cluster-node-02-02 │ 725096 │
└────────────────────┴─────────┘
Структура кластера выглядит вот так. После сдвига реплик получается, что реплика с номером 02 кладётся на другой физический сервер
SELECT *
FROM system.clusters
Query id: 7641fa3a-c24a-4f54-8909-ee4c0248b4b2
┌─cluster─┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name──────────┬─host_address─┬─port─┬─is_local─┬─user─┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ cluster │ 1 │ 1 │ 1 │ cluster-node-01-01 │ 10.42.8.54 │ 9000 │ 0 │ user │ │ 0 │ 0 │
│ cluster │ 1 │ 1 │ 2 │ cluster-node-02-02 │ 10.42.76.59 │ 9000 │ 0 │ user │ │ 0 │ 0 │
│ cluster │ 2 │ 1 │ 1 │ cluster-node-02-01 │ 10.42.159.71 │ 9000 │ 0 │ user │ │ 0 │ 0 │
│ cluster │ 2 │ 1 │ 2 │ cluster-node-03-02 │ 10.42.26.86 │ 9000 │ 0 │ user │ │ 0 │ 0 │
│ cluster │ 3 │ 1 │ 1 │ cluster-node-03-01 │ 10.42.242.57 │ 9000 │ 0 │ user │ │ 0 │ 0 │
│ cluster │ 3 │ 1 │ 2 │ cluster-node-01-02 │ 10.42.211.44 │ 9000 │ 1 │ user │ │ 0 │ 0 │
└─────────┴───────────┴──────────────┴─────────────┴────────────────────┴──────────────┴──────┴──────────┴──────┴──────────────────┴──────────────┴─────────────────────────┘
6 rows in set. Elapsed: 0.004 sec.
В конфиге это всё описано вот так:
<remote_servers>
<cluster>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>cluster-node-01-01</host>
<port>9000</port>
</replica>
<replica>
<host>cluster-node-02-02</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>cluster-node-02-01</host>
<port>9000</port>
</replica>
<replica>
<host>cluster-node-03-02</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>cluster-node-03-01</host>
<port>9000</port>
</replica>
<replica>
<host>cluster-node-01-02</host>
<port>9000</port>
</replica>
</shard>
</cluster>
</remote_servers>
Собственно, если не делать сдвиг вторых реплик, всё работает правильно. После сдвига данные как-то неправильно складывааются. Подскажите, пожалуйста, в чём моя ошибка -
-
Fast and Reliable Schema-Agnostic Log Analytics Platform
At Uber, we provide a centralized, reliable, and interactive logging platform that empowers engineers to work quickly and confidently at scale. The logs are tag
-
Звучит логично. Только обратите внимание, что если используете ReplacingMergeTree для того чтобы была последняя актуальная строка, то обратите внимание, что когда у буферной таблицы num_layers больше 1, то порядок вставки может отличаться.
-
cluster │ 1 │ 1 │ 2 │ cluster-node-02-02
Выглядит как ошибка -
добавьте колонку с датой. если хотите хранить системные логи линукса, то обратите внимание также на продукт loki от графаны
-
Но ведь так прописано в конфиге… Или я в конфиге напутал?
-
вам не нужно сдвигать реплики в remote_servers, там должно все быть как было и раньше
-
вам нужно было только переместить cluster-node-02-02 на другую железную ноду
-
А сейчас вышло, что вы переместили cluster-node-02-02 на первую ноду а потом ее определили еще как реплику первого шарда, те вернули все как было
-
Нашел в логе такое
Checksum doesn't match: corrupted data. Reference: a2c5f01ac982b8682519ab5188222a60. Actual: 8ebbe07e0d88721de4501b38e0a6b417. Size of compressed block: 290931: Cannot read mark 780 at row 6389760 in file /mnt/data/ch-c01-s03-r02/clickhouse/data/my_db_2/table_2_sharded/20210403_115730_128505_61/hwid.mrk2
Почему корраптится, чето с дисками не то? -
Хм… Что-то у меня путаница какая-то в голове получается… Я ведь, по идее, просто в remote_servers указал, куда класть реплики. Что измениятся от того, если я верну вместо 02-02 в конфиге 01-02, просто этот 01-02 помещу на другой сервер? Сейчас ведь просто 02-02 лежит на другом сервере
-
Окей, 02-02 находится на каком железном сервер, на том же что и 01-01?
-
Нет… Первый индекс отвечает за сервер/шард… Соответственно 01-01 — первый сервер, 02-02 — второй
-
Те вы только изменили в remote_servers определение кластера?
-
Да
-
SELECT
FQDN() AS h,
COUNT()
FROM clusterAllReplicas('cluster',db,data_values_local_table)
GROUP BY h -
data_values_local_table замените на название mergeTree таблицы
-
SELECT
FQDN() AS h,
COUNT()
FROM clusterAllReplicas('cluster', database, data_values_shard)
GROUP BY h
Query id: a3c1658f-ac86-4ede-9404-7669cc74d253
┌─h──────────────────┬─count()─┐
│ cluster-node-02-01 │ 928359 │
│ cluster-node-01-02 │ 1909998 │
│ cluster-node-03-01 │ 2304041 │
│ cluster-node-01-01 │ 1909998 │
│ cluster-node-03-02 │ 2304041 │
│ cluster-node-02-02 │ 928359 │
└────────────────────┴─────────┘ -
Окей. в чем дело вы переместили в remote_servers, но не изменили в описании таблицы кому и чему она принадлежит
│ cluster-node-02-01 │ 928359 │
│ cluster-node-02-02 │ 928359 │ -
У вас так и осталось все
-
либо изменяйте макросы и пересоздавайте таблицы, либо переместите cluster-node-02-02 на первую железку и не трогайте макросы и remote_servers
-
второй вариант мне нравится больше тк, он более логичный с точки зрения названия названия нод
-
remote_servers влияет только на Distributed таблицу и запросы к ней, репликация не смотрит туда
-
Ок, попробую сейчас, благо, индексы описываются переменными при создании докер-контенеров, так что много времени не должно занять 😅
-
Ок, понял, спасибо… Сейчас переконфигурирую и сообщу о результатах
-
Понял, спасибо. Порядок вставки не важен, главное актуальность и консистентность базы
-
Логи разные, с датами и без.
Пока в качестве идентификатора планирую хэш от набора ключей использовать -
Спасибо, буду изучать
-
/stat@combot
-
ENGINE = ReplicatedGraphiteMergeTree('/clickhouse/tables/{shard}/graphite.data_lr', '{replica}', 'graphite_rollup')
PARTITION BY toMonday(date)
ORDER BY (metric, timestamp)
SETTINGS index_granularity = 8192; откуда берется путь? -
fetch качает парт с другого КХ, этот путь '/clickhouse/tables/01-01/visits' это не путь на диске, это имя КЛЮЧА в зукипере (зукипер это база ключ-значение)
-
ок
-
т.е. зачем вам нужен FETCH PARTITION ?
что вы пытаетесь сделать?
загрузить данные в КХ таким образом нельзя. -
а как можно загрузить данные?
-
Данные ваши в каком формате? TSV / CSV / JSON ?
-
в формате кликхауса
-
соседнего
-
можете перефразировать? я не понимаю вас, я джуниор
-
есть кликхаус системы мониторинга там есть данные за год, однако нужно перевести систему мониторинга на новые сервера, для этого надо перелить данные в том числе чтобы была статистика по серверам
-
Так а не проще просто сказать что новые сервера реплики старых и КХ сам реплицирует все данные?
-
опасно сильно
-
старые данные надо перевести на другой движок, потом создать кластер
-
старые двнные критичны
-
другой совсем другой? какой исходный, какой другой?
-
graphiteMergeTree без репликации
-
точнее они пока все без репликации
-
>старые данные надо перевести на другой движок
какой движок у старых данных, какой будет у новых? -
ок переформулирую движки у старых и новых данных пока одинаковые, новые сервера хочу перевести на ReplicatedGraphiteMergeTree
-
хотя может есть метод импорта данных без посмтроения репликации вообще?
-
Поменял размещение нод, вернул remote_servers в первоначальный вид, всё стало как нужно:
SELECT
FQDN() AS h,
COUNT()
FROM clusterAllReplicas('cluster', database, data_values_shard)
GROUP BY h
Query id: 966927e6-f563-45f2-aa57-1007fb40c04f
┌─h──────────────────┬─count()─┐
│ cluster-node-02-01 │ 1715076 │
│ cluster-node-01-02 │ 1712703 │
│ cluster-node-03-01 │ 1714619 │
│ cluster-node-01-01 │ 1712703 │
│ cluster-node-03-02 │ 1714619 │
│ cluster-node-02-02 │ 1715076 │
└────────────────────┴─────────┘
Спасибо огромное за помощь -
/stat@combot
-
-
Привет, знаете почему clickhouse не находит нового user-а? Я сделал новый файл root.xml в users.d и потом питаюсь запустить clickhouse-client --user root и потом есть ерор Unknown user
-
Добрый день! Есть ли какой-то способ принудительно пересчитать все данные в материализованном представлении? У меня данные в таблицу попадают через переключение секций, так что этот "триггер" не срабатывает.
-
У меня версия - 19.17.4.11
-
DROP PARTITION & INSERT SELECT
-
-
ну сделайте insert into your_new_table from remote()
-
-
Привет
Подскажите как лучше сделать
У меня в бд кликхаус поступает большое количество данных
Заказчик в определенный момент может посмотреть график когда пришли определенные данные
Скажите пожалуйста как это лучше организовать:
На сервере циклом перебирать каждый месяц и отправлять счётчик на клиент?
У меня сначала была идея при помощи планировщика автоматически в какой то период считать эти данные и сувать количество в отдельную таблицу , чтобы потом лишний раз не грузить бд, но я не уверен стоит ли это того?
Спасибо -
вопрос может не много не по теме чата, но задам :)
яндекс предоставляет managed service for ClickHouse в своем облаке, кто-нибудь это пробовал, как впечатления, какие есть подводные камни? -
я не настоящий сварщик но там был SummingMergeTree для автоматической агрегации
-
Нечего суммировать
У меня счётчик только -
а что ты тогда "перебираешь каждый месяц"
-
Какие то данные
И сколько этих данных в определенный месяц -
Перебирать это я уже сервер собрался
-
ну критерий отбора всегда постоянный или кажды йраз разный ?
-
а то там есть ещо и materialized views
-
ну у меня таблица
допустим, в ней 3 поля: дата, место, действие
по определенному месту нужно составить график, например, по месяцам,т.е. сколько было любых действий в определенном месте в течение года: январь, февраль ... и т.д. -
ну вот, делаешь view с group by по месяцам/месту/действю и count/min/max. есть предположение что в view будет записей на порядки меньше
-
хотя всё зависит от данных и их количества, может и не имеет смысла
-
и возможно я опять мыслю категориями традиционных реляционных СУБД
-
Пока кажется, что то что нужно, спасибо!
-
-
-
Тут вы вольны делать как вам удобнее. При наличии нескольких кластеров кх удобно шаблонизировать conig/users.
-
Народ как словари перегрузить? не найду никак команду
-
внешние
-
Reload dictionary?
-
да
-
это что команда?
-
-
SYSTEM | Документация ClickHouse
https://clickhouse.tech/docs/ru/sql-reference/statements/system/SYSTEM | Документация ClickHouseЗапросы SYSTEM RELOAD EMBEDDED DICTIONARIES RELOAD DICTIONARIES RELOAD DICTIONARY RELOAD MODELS RELOAD MODEL DROP DNS CA
-
Братцы, есть 2 хауса, один на убунте, новый на центосе. Новый 21.4.3.21 - свежий. Пихаются данные по http зипованные. пара минут принимает потом
Error in clickhouse db: clickhouse: std::exception. Code: 1001, type: std::length_error, e.what() = basic_string -
и стоп приема
-
ничего там в новой версиин не вышло эдакого?
-
"старый" на убунте - 21.1.2.15
-
простая мержтри табл
-
в логе ошибка в (in query: INSERT INTO...
-
? @ 0x88bd259 in /usr/bin/clickhouse
1. ? @ 0x88bd220 in /usr/bin/clickhouse
2. ? @ 0x1426931b in ?
3. DB::throwAtAssertionFailed(char const*, DB::ReadBuffer&) @ 0x890c2a3 in /usr/bin/clickhouse
4. DB::ValuesBlockInputFormat::readRow(std::__1::vector<COW<DB::IColumn>::mutable_ptr<DB::IColumn>, std::__1::allocator<COW<DB::IColumn>::mutable_ptr<DB::IColumn> > >&, unsigned long) @ 0x10202512 in /usr/bin/clickhouse
5. DB::ValuesBlockInputFormat::generate() @ 0x1020178c in /usr/bin/clickhouse
6. DB::ISource::tryGenerate() @ 0x100ad7d5 in /usr/bin/clickhouse -
так понятно, gzip походу поменялся - теперь несовместим с моей библ...
-
еперный театр... а это что еще:
ERROR 403: Code: 516, e.displayText() = DB::Exception: Invalid authentication:
it is not allowed to use Authorization HTTP header and authentication via param
eters simultaneously (version 21.4.3.21 (official build)) -
скижите пожалуйста что изменилось в 21.4.3.21 ?
перестали рабоать инсерты через https://github.com/nikepan/clickhouse-bulk
кидает 400 статусGitHub - nikepan/clickhouse-bulk: Collects many small inserts to ClickHouse and send in big insertsCollects many small inserts to ClickHouse and send in big inserts - GitHub - nikepan/clickhouse-bulk: Collects many small inserts to ClickHouse and send in big inserts
-
"Unexpected end of stream" with text formats without new line at the end · Issue #20244 · ClickHouse/ClickHouse
Update by @alexey-milovidov: to fix the issue, set input_format_null_as_default to 0 as it was in older versions. Clickhouse reports this when external dictionary not ends with "\n&quo...
-
А вообще смотрите что за ошибка на стороне кх
-
в логи ничего не падает в табличке с запросами тоже пусто
-
а что стало с аутентификацией-то?
-
блин... а можно откатить апдейт?
-
до куда
-
до этой например 21.1.2.15
-
или может подскажете что стало с нттп аутент?
ERROR 403: Code: 516, e.displayText() = DB::Exception: Invalid authentication:
it is not allowed to use Authorization HTTP header and authentication via param
eters simultaneously (version 21.4.3.21 (official build)) -
мож галочку в конфиге теперь надо включить?
-
охтыж... нашел... надо из хедеров унести в параметры...
- 15 April 2021 (158 messages)
-
СПАМ!!!! @milovidov_an
-
Всем привет. После обновления до 21.3.4.25 стали регулярно ловить исключения при вставке
Code: 307, e.displayText() = DB::Exception: Chunk size is too large (version 21.3.4.25 (official build))
стек:
0. DB::HTTPChunkedReadBuffer::readChunkHeader() @ 0xf8dd26b in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug
1. DB::HTTPChunkedReadBuffer::nextImpl() @ 0xf8dd57b in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug
2. DB::wrapReadBufferReference(DB::ReadBuffer&)::ReadBufferWrapper::nextImpl() @ 0xe71befc in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug
3. DB::ConcatReadBuffer::nextImpl() @ 0xe96a8f8 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug
4. DB::ConcatReadBuffer::nextImpl() @ 0xe96a8f8 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug
5. DB::loadAtPosition(DB::ReadBuffer&, DB::Memory<Allocator<false, false> >&, char*&) @ 0x866e848 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug
6. DB::fileSegmentationEngineTabSeparatedImpl(DB::ReadBuffer&, DB::Memory<Allocator<false, false> >&, unsigned long) @ 0xfa44ebe in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug
7. DB::ParallelParsingInputFormat::segmentatorThreadFunction(std::__1::shared_ptr<DB::ThreadGroupStatus>) @ 0xf9c64dc in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug
8. ThreadFromGlobalPool::ThreadFromGlobalPool<void (DB::ParallelParsingInputFormat::*)(std::__1::shared_ptr<DB::ThreadGroupStatus>), DB::ParallelParsingInputFormat*, std::__1::shared_ptr<DB::ThreadGroupStatus> >(void (DB::ParallelParsingInputFormat::*&&)(std::__1::shared_ptr<DB::ThreadGroupStatus>), DB::ParallelParsingInputFormat*&&, std::__1::shared_ptr<DB::ThreadGroupStatus>&&)::'lambda'()::operator()() @ 0xf8eef78 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug
9. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x865165f in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug
10. void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void ThreadPoolImpl<std::__1::thread>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()> >(void*) @ 0x86550f3 in /usr/lib/debug/.build-id/23/ea76bdd7b9132c8fb55ec397db8bafbeb73c2b.debug
11. start_thread @ 0x76db in /lib/x86_64-linux-gnu/libpthread-2.27.so
12. __clone @ 0x121a3f in /lib/x86_64-linux-gnu/libc-2.27.so
Знакомо кому-нибудь? Как будто что-то сломалось... -
Добрый день!
Пользователь при выполнении запроса получает "timeout for user default exceeded 12m0s".
Кажется, посмотрели уже все параметра таймаутов на клиенте и в config.xml, но нигде не можем найти, откуда взялись 12 мин, с каким параметром они связаны.
Сталкивался кто-нибудь с подобным? -
Всем доброго времени суток! Подскажите пожалуйста о чем говорят следующие логи?
<Information> MergeTreePartsMover: Failed to swap 202104_902_902_0. Active part doesn't exist. Possible it was merged or mutated. Will remove copy on path '/opt/clickhouse_cold/data/logs/detached/202104_902_902_0/'.
2021.04.15 11:10:59.984514 [ 29766 ] {} <Information> MergeTreePartsMover: Failed to swap 202104_95_855_732. Active part doesn't exist. Possible it was merged or mutated. Will remove copy on path '/opt/clickhouse_cold/data/logs/detached/202104_95_855_732/'.
2021.04.15 11:11:05.306568 [ 29772 ] {} <Information> MergeTreePartsMover: Failed to swap 202104_898_898_0. Active part doesn't exist. Possible it was merged or mutated. Will remove copy on path '/opt/clickhouse_cold/data/logs/detached/202104_898_898_0/'. -
-
Всем привет! Подскажите, пожалуйста. Я при вставке файла в КХ получаю такую ошибку DB::Exception: Invalid IPv6 value. (version 19.11.4.24 (official build))
Обычно, при возникновении ошибки всегда указывалась строчка, но не здесь. Есть способы как-то узнать, в какой строке ошибка? -
добрый день
подскажите пожалуйсту в какую сторону копать
Делаю MV вида:
CREATE MATERIALIZED VIEW umportal.event_client_agg_mv ENGINE = AggregatingMergeTree()
PARTITION BY toStartOfWeek(ep_dt, 1) ORDER BY (ep_uuid) POPULATE
AS
SELECT
er.ep_uuid AS ep_uuid,
ep_er.created_at AS ep_dt,
...
...
FROM
db.event_raw er
LEFT ANY JOIN db.event_raw ep_er ON er.ep_uuid = ep_er.uuid
WHERE
er.event IN ('hit', 'rm')
GROUP BY
er.ep_uuid, ep_dt;
Для первоначальных данных все проходит как задуманно, но при последующих инсертах все поля из «приджойненой» таблицы заполняются в MV пустыми данными
Ощущение что запись которая должна была получена в джойне уже помеченна как агрегированная и не находится, при этом если делать этот селект отдельно, то все работает корректно
Подскажите пожалуйста, можно ли обойти как-то это поведение?
(version 21.4.3.21 (official build)) -
-
добрый день всем, есть вопрос насчет AggregatingMergeTree
данные из таблицы того типа можно получить путем грппировки и доаггргирования через функции с Merge суффиксом
но есть еще finalizeAggregation, которая не требует агргегации группировкой
в чем разница? -
Привет!
Делаю простейший join - у меня не выполняется запрос - вылетает с ошибкой по тайм-ауту :(
https://prnt.sc/11ftq74
Подскажите, что я делаю не так?ScreenshotCaptured with Lightshot
-
Запрос с IN (аналогичный join на скриншоте выше) срабатывает моментально
https://prnt.sc/11fuths
Подскажите, что не так в join? Как мне его оптимизировать, чтобы он исполнялся?
Нужен именно joinScreenshotCaptured with Lightshot
-
Что EXPLAIN говорит про запрос с join?
-
Для этого надо добавить EXPLAIN перед Select, верно?
DataGrip не позволяет запустить эту команду :(
Что посоветуете из IDE для реализации данной команды? -
clickhouse-client
-
Консольный клиент clickhouse-client ну или табикс
-
Хотя наверное только clickhouse-client. Табикс результат скорее всего не вернет
-
Какой размер таблицы visits_all? engine = MergeTree ? Какой таймаут и может стоит попробовать увеличить его
-
Коллеги, приветствую. Кто-то работал с clickhouse-copier?
-
Указываю конфиг с таргет и дестинашион
-
Он ругается на zookeeper
-
virtual int DB::ClusterCopierApp::main(const std::vector<std::__cxx11::basic_string<char> >&): Code: 999, e.displayText() = Coordination::Exception: No addresses passed to ZooKeeper constructor. (Bad arguments), Stack trace:
-
а сам файл сделал xml как тут https://clickhouse.tech/docs/ru/operations/utilities/clickhouse-copier/, конфигурация на копированиеclickhouse-copier | Документация ClickHouse
clickhouse-copier Копирует данные из таблиц одного кластера в таблицы другого (или этого же) кластера. Можно запустить н
-
всем привет, какой тип указывать для индекса для Int8?
-
а все, смог создать
ALTER TABLE table ADD INDEX IDX_TABLE__FIELD (field) TYPE bloom_filter() granularity 4 -
Итак, следующий вопрос про переезд с одного сервера КХ на кластер.
В standalone таблицах используется движок CollapsingMergeTree, который необходим для периодического очищения таблиц от специфического мусора. И всё работало отлично в плане схлопывания, но сейчас перевели данные на ReplicatedCollapsingMergeTree, в которые, соответственно, происходит запись через Distributed. И выясняется, что часть данных «схлопнулась», а часть — осталась. И непонятно, «схлопнутся» ли оставшиеся, и если да, то когда, а если нет, то почему…
Раньше был способ — выполнить OPTIMIZE при необходимости и радоваться жизни, но с Distributed это не работает 🤷
И как теперь быть? -
Подскажите, пожалуйста. Есть вот такая часть запроса для golang, которая принимает на вход параметры и подставляет в 1, 2, 3 и 4 соответственные from, until, step, function
arrayFilter(x->isNotNull(x), %[4]sOrNullResample(%[1]d, %[2]d, %[3]d)(Value, Time))
то есть, всё работает для простых аггрегирующих функций, таких как avg, max и так далее. Получается avgOrNullResample(%[1]d, %[2]d, %[3]d)
Вопрос в том, каким образом можно скрестить сложные функции, например, quantile(95) + -OrNullResample(%[1]d, %[2]d, %[3]d)?
upd: мне нужен только конечный вид функции, как его собрать я разберусь -
всем привет, нет решения для такой ошибки?
при выборке SELECT FROM MaterializedMySql - если в WHERE есть AND, то возвращает ошибку DB::Exception: Not found column equals(target_job, 2) in block -
возможно дело в том, как описаны типы колонок в AggregatingMergeTree
-
Я отказался от materializedMysql и mysql в целом, в пользу replicatedReplacedMergeTree
-
materialized view норм работает на кластере?
-
недавно был похожий вопрос, что данные не схлопываются, оказалось, что проблема была в том, что ключ шардирования был указан random, следовательно одинаковые строки попадали на разные шарды, в связи с чем они друг друга не видели чтоб доагреироваться
-
Тут вроде 2 проблемы. Первая это что оптимайз теперь надо запускать на replicated таблицу (если прям очень сильно надо). Вторая проблема это если ключ order by не соответствует ключу шардирования и эту проблему только что объяснили выше)
-
А не подскажете, как тогда указать правильный ключ?
-
А вы собираетесь в будущем добавлять новые сервера/шарды?
-
ну правильный будет тот, который строки, которые в теории должны схлопнуться будет отправлять на один и тот же шард)
-
https://clickhouse.tech/docs/en/engines/table-engines/special/distributed/
Тут есть про sharding_key.Distributed | ClickHouse DocumentationDistributed Table Engine Tables with Distributed engine do not store any data by their own, but allow distributed query
-
Ну, это как пойдёт. В ближайшие пару лет, наверное, нет
-
разница в том, что Merge возьмёт состояния из разных строк и доугрегирует их до корректного ответа, а finalizeAggregation просто выполнит до конца функцию в каждой отдельной строке
например есть данные:
id val
1 10
1 10
1 10
2 20
2 20
то делая:
select avgMerge(val_avg_state)
from (select id, avgState(val) as val_avg_state from <table> group by id)
мы получим ондо число — 14, а делая так:
select id, finalizeAggregation(val_avg_state)
from (select id, avgState(val) as val_avg_state from <table> group by id)
мы просто получим ответ на вопрос "что же там оно посчитало бы, укажи мы во внутреннем запросе не avgState, а просто avg -
мне бы хотелось все таки данные из мускла подтягивать)
-
проблему решил….не знаю - баг это или фича - в общем если подчиненные данные вынести в отдельную таблицу (структура 1 в 1) то джойн проходит нормально и данные подставляются, а вот если в запросе джойн сам на себя - подчиненная таблица не находит данные….подозреваю что они помеченны как уже агрегированные….
-
-
Добрый день, имею такую команду JSONExtractArrayRaw(dictGet('survey.departments', 'tree_ids', toUInt64(hId))) получаю ошибку Nested type Array(String) cannot be inside Nullable type (version 20.5.2.7 (official build)), как json вида [8981, 9830, 9831, 9873, 0, 0, 0, 0, 0] преобразовать в массив?
-
Создаете таблицу replicated, и пишете в нее через MV. Делайте через create mv to table as select …
-
Друзья, а как решить следующую задачу в CH.
Имеется:
несколько интервалов
-таймстемп начала события
-таймстем конца события
-суммарная длительность
Данные интервалы могут пересекаться, но нам нужно получить только уникальное время
Пример
с 1 по 10, длительность 9
с 2 по 12, длительность 10
суммарно с 1 по 12, длительность 11, а не 19
Думал про lag(), но его нет, пытаюсь с помощью neighbor(), но интервалом может быть больше двух -
если версия КХ не старая, то можно allow_experimental_window_functions = 1 и lag получится симитировать с помощью any и rows between 1 preceding and 1 preceding
-
но я не уверен, что это поможет в решении задачи 😬
-
-
не уверен, но, вроде, только в 21 добавили, я бы просто проверил)
-
21.3, и в 21.4 lead lag добавили
-
👍🏻
-
по идее как решение вырисовывается что-то вроде:
все данные в нужном разрезе сгруппировать в список тюплов, отсортировать, сдвинуть на 1, отметить те случаи, когда начало интервала больше конца предыдущего, потом arrayCumSum и зааннестить получившееся, получится что-то вроде доп колонки с указанием к какой группе какой интервал относится, останется только найти минимальное начало, максимальный конец и просуммировать длительности -
Всем привет, подскажите пожалуйста существует ли возможность смены двжика таблицы? Сейчас используется SummingMergeTree, но ввиду архитектурных изменений требуется перехать таблицей на CollapsingMergeTree. Ищу самый безболезненный вариант, поверхностное гугление и issues не помогли
-
SELECT
min(start) AS min,
max(end) AS max,
groupArray((start, end)) AS ar,
arraySum(x -> arrayExists(s -> ((x >= (s.1)) AND (x <= (s.2))), ar), range(min, max)) AS r
FROM
(
SELECT
1 AS start,
10 AS end
UNION ALL
SELECT
2 AS start,
12 AS end
) -
Наверное можно сделать лучше
-
красиво)
-
-
А мы скоро начнем!
Встречаемся в 19.00 по ссылке https://youtu.be/zstWImYenRcDevOps в DWH — трансляция митапаМитап о применении DevOps практик в DWH. В этой трансляции: Михаил Кожевников из Райффайзенбанка рассказал про хранилище, созданное в стеке технологий ODI, Java и Flyway, и поделится своим опытом декомпозитизации процессов, которая помогла прийти к модели TBD и сделать ее независимой. Альберт Айткулов из Тинькофф рассказал, как выглядел процесс применения изменений инфраструктуры у нашей команды раньше и как этот процесс стал выглядеть после переезда IaaC Clickhouse в Gitlab CI. Чат митапа со спикерами: https://t.me/joinchat/DBMdexGM1QhjMTli Дайджесты, статьи и анонсы митапов: https://t.me/itstinkoff Блог на Хабре: https://l.tinkoff.ru/habr-tinkoff Наши вакансии: https://l.tinkoff.ru/its-career Подписаться на канал IT's Tinkoff: https://www.youtube.com/c/ITsTinkoff 00:00 — Начало трансляции 02:57 — Приветствие 04:32 — Михаил Кожевников «Как мы дошли до TBD в хранилище» 40:49 — Альберт Айткулов «GitLab CI + Clickhouse = DevOps или сказ о том как мы в Gitlab переезжали» #DWH #devops #TBD #Clickhouse…
-
Подскажите, пожалуйста, в чём может быть проблема?
При попытке от юзера default выполнить:
GRANT ALL ON *.* TO admin WITH GRANT OPTION
Получаю:
Code: 495. DB::Exception: Received from localhost:9000. DB::Exception: Cannot update user admin in users.xml because this storage is readonly: Couldn't update user admin. Successfully updated: none.
В роли юзера admin readonly не установлен -
как же всё таки склеить quantile(95) + -Resample(start, stop, step)?
upd: https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/combinators/#agg-functions-combinator-resample
я буду смотреть, не обновилась ли документация
я буду смотреть, не обновилась ли документация
я буду смотреть, не обновилась ли документацияCombinators | ClickHouse DocumentationAggregate Function Combinators The name of an aggregate function can have a suffix appended to it. This changes the way
-
spam ?
-
Новая таблица и insert from select
-
Спасибо большое
-
Вроде это уже обсуждали. MV видит только вставку из самой левой таблицы, даже если в дальнейшим она джоинится справа данные будут только из вставки.
-
-
спасибо...теперь поведение логично
-
ещё один вариант "на подумать"
select
id,
data.1 as array_group,
min(data.2) as start,
max(data.3) as end,
end - start as diff
from
( select
id,
groupArray((start, end)) as arr,
arraySort(
y -> y.1,
arrayFilter(
x ->
not(arrayExists(
a ->
a.1 <= x.1
and a.2 > x.2
or a.1 < x.1
and a.2 >= x.2,
arr)),
arr)) as arr_clear,
arrayMap(
x, y -> (x, y),
arr_clear,
arrayPushFront(
arrayPopBack(arr_clear),
arr_clear[1])) as arr_w_prev,
arrayMap(
x, y -> (y, x.1, x.2),
arr_clear,
arrayCumSum(
x -> x.1.1 > x.2.2,
arr_w_prev)) as arr_groups
from
values (
'id String, start UInt8, end UInt8',
('a', 1, 10),
('a', 2, 8),
('a', 7, 15),
('a', 20, 25),
('b', 116, 130),
('b', 111, 114),
('b', 107, 109),
('b', 103, 105),
('b', 100, 120),
('c', 50, 60),
('c', 50, 70)
)
group by
id) as t
array join arr_groups as data
group by
id,
array_group
order by
id,
array_group; -
выше задавали такой же вопрос, там и ответы были. можете спросить у автора нашёл ли он оптимальный способ.
https://t.me/clickhouse_ru/213586Stanislav Lapshin in ClickHouse не тормозитЗдравствуйте! Планирую перейти на ClickHouse в самописной системе аналитики. Но есть вопрос: существует таблица для трека прогресса просмотра видео, в которой сохраняются интервалы. Например, (1, 5) - значит, что пользователь посмотрел видео с 1 по 5 секунду. Каждая строка - отдельный интервал. Аналитикам требуется получить информацию о том, сколько видео было просмотрено. Проблема в том, что интервалы могут пересекаться, иметь окна, дублироваться. Например: (1, 5), (4, 10), (6, 8), (20, 25) должно вернуть 15. Интервалов может быть ~100-200. Вместо массива могут быть 2 поля: “start” и “end” - если надо. Каким образом можно это решить в ClickHouse? Нашел такой вариант https://stackoverflow.com/questions/57347444/collapsing-overlapping-time-intervals-using-clickhouse - подскажите насколько он работоспособен? Заранее спасибо!
-
Коллеги, кто-нибудь сталкивался с ошибками приведения типов в CH?
There is no supertype for types UInt8, UUID because some of them are numbers and some of them are not
Вот такая ошибка возникает при приведении UUID к String: ```CAST(if(uid IS NULL, 0, uid) AS String)```, coalesce тоже не срабатывает -
Обратное приведение String к UUID вызывает ошибку There is no supertype for types String, UInt8 because some of them are String/FixedString and some of them are not
-
-
При Coalesce получаем Cannot convert NULL value to non-Nullable type
-
Так он ошибку выводит, поэтому и пытаемся убрать NULL’ы при помощи if и COALESCE
-
у вас видимо uid - не UInt8
-
uid, как и написано выше, это тип UUID
-
ваш иф пытается вернуть значение одного типа if(uid IS NULL, 0, uid) а у вас там два типа
-
вместо нуля поставьте нулевой uuid
-
-
Всё, теперь понятно, попробуем, благодарю!
-
кул, покурю ещё ответы по ссылке, может как-то улучшить код получится, но пока что работает вроде как правильно (с условием, что периоды начинающиеся в смежные значения считать как разные, например (5, 10) это новый период после (1, 4), а не его продолжение)
-
Всем привет! Делаю mv. И через populate она падает по памяти. Вопрос - можно без populate, а историю набросить insert'ом? Или как правильно?
-
Повторяю ещё раз: такая прямая конвертация к String вызывает ошибку Cannot convert NULL value to non-Nullable type
-
в таком случае они могут и coalesce заюзать:
coalesce(toString(uid), '0') -
Приводит к Cannot convert NULL value to non-Nullable type
-
а cast(uid as Nullable(String))?
-
Пробую
-
Cannot convert NULL value to non-Nullable type
-
Осознал.
В доке ещё такая штука есть
accurateCastOrNull -
if(uid IS NULL, '0', toString(uid)) тоже вызывает ошибку?
-
Спасибо
-
Какой корректный синтаксис в этом случае? CAST(‘0000-00…’ AS UUID)?
-
Увы
-
Благодарю, но в сборке не оказалось данной функции
-
Вновь Cannot convert NULL value to non-Nullable type
Возможно, IS NULL проверку поле некорректно проходит при типе данных UUID -
Там есть функция isNull() попробуйте ее
-
а такой пример нормально отрабатывает?
select *, coalesce(toString(uid), '0') from values('id UInt8', 1, 2, 3) as t1 left join values('id UInt8, uid UUID', (1, '00000000-0000-0000-0000-000000000000'), (2, '61f0c404-5cb3-11e7-907b-a6006ad3dba0')) as t2 on t1.id = t2.id settings join_use_nulls = 1; -
а просто assumeNotNull(uid)?
-
😎💪🏻
-
toUUID('00000000-0000-0000-0000-000000000000')
-
-
там вообще 100 вариантов конвертации и у меня ни один не вызывал ошибку :) у вас просто талант :)
-
у меня нормально отработало
-
у меня coalesce(toString(uid), '0') нормально отработало.
возможно проблемы были на старых версиях. у меня 21.2.4.6 -
подскажите, а в клике можно как-то расширить с 16 на больше коннекторов для кафки?
-
тоже тестил на новой и самое короткое, конечно, https://t.me/clickhouse_ru/214106Sergey Churin in ClickHouse не тормозит
а просто assumeNotNull(uid)?
-
да, assumeNotNull - вообще огонь
-
Всё именно так и оказалось, спасибо за наводку… murmurHash3_64(column_name) решил проблему корректного ключа шардирования
-
👍🏻🎉
-
Подскажите оптимальное решение: есть таблица событий типа event=старт/стоп связанные между собой одним common_id, нужно выбрать только те строки в которых между стопом и стартом с одним common_id прошло менее суток по полю event_time.
-
банальный способ в лоб это GROUP BY common_id HAVING anyIf(ts, event='stop')-avyIf(ts,event='start') > 3600*24
-
что такое коннекторы ? консьюмеры ?
-
Да
-
с чгео вы взяли что их 16 ?
-
а вообще kafka_num_consumers (хотя дефолт 1)
ну количество партиций смотрите тоже -
Отрабатывает
-
Ни один из вариантов не отрабатывает - ни простые, ни сложные. Значит, в данных что-то не так.
-
Возможно, версия CH отличается, какой номер версии? Не 20.9.2.20 ?
-
Радость была преждевременной, оказывается: на одном наборе данных (небольшой набор, чуть более 5кк записей) всё отработало как надо, на чуть более большем (130кк) уже пару часов данные не «схлопываются». Причём с разными знаками они лежат на одном шарде (проверил, на других шардах их нет), ключ совпадает, но не схлопываются. Что это может быть и что делать?
-
ошибка типа выдается раньше, чем обрабатываются данные. Подозреваю, что приведенная строка - это вообще не то место, где возникает ошибка. Вы, возможно, с чем-то джойните, и там тип другой.
-
При создании ругается что больше 16 нельзя. Завтра покажу скрин
-
Ребята, подскажите плизз с чем может быть свяазана ошибка.
Я пытаюсь добавить несколько дополнительных нод к текущему кластеру, и начинает отлитать такая ошибка и как ее можно поправит ?
2021.04.15 23:41:04.540811 [ 30757 ] {8b7ce458-0788-4689-908b-50d48b52a97e} <Error> executeQuery: Poco::Exception. Code: 1000, e.code() = 36, e.displayText() = Bad path syntax: /clickhouse/data/store/95c/95cf80f4-d662-4b54-a304-c9b5a29709f4/default:longstrongpassword@replica%2Dprod%2Dclickhouse%2D2b:9000,default:longstrongpassword@replica%2Dprod%2Dclickhouse%2D2c:9000,default:longstrongpassword@replica%2Dv2%2Dprod%2Dclickhouse%2D2c:9000,default:longstrongpassword@replica%2Dv2%2Dprod%2Dclickhouse%2D2b:9000 (version 20.10.3.30 (official build)) (from 120.1.109.188:33766) (in query: INSERT INTO some_table (time, nano_time, cache, header, header_user_agent, hostname, partner_id, client_ipv4, client_ipv6, cdn_id, cdn_response_time_ms, dns_lookup_time_ms, tcp_time_ms, ssl_time_ms, cdn_up_down, req_status, online) VALUES), Stack trace (when copying this message, always include the lines below):
0. Poco::FileImpl::handleLastErrorImpl(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x10e1c1b0 in /usr/bin/clickhouse
1. Poco::FileImpl::createDirectoryImpl() @ 0x10e1d58c in /usr/bin/clickhouse
2. DB::DistributedBlockOutputStream::writeToShard(DB::Block const&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&) @ 0xe28e17e in /usr/bin/clickhouse
3. DB::DistributedBlockOutputStream::writeAsyncImpl(DB::Block const&, unsigned long) @ 0xe28b796 in /usr/bin/clickhouse
4. DB::DistributedBlockOutputStream::writeSplitAsync(DB::Block const&) @ 0xe28b3d2 in /usr/bin/clickhouse
5. DB::DistributedBlockOutputStream::write(DB::Block const&) @ 0xe28a530 in /usr/bin/clickhouse
6. DB::PushingToViewsBlockOutputStream::write(DB::Block const&) @ 0xdb79cc4 in /usr/bin/clickhouse
7. DB::AddingDefaultBlockOutputStream::write(DB::Block const&) @ 0xdbbab83 in /usr/bin/clickhouse
8. DB::SquashingBlockOutputStream::finalize() @ 0xdbb990c in /usr/bin/clickhouse
9. DB::SquashingBlockOutputStream::writeSuffix() @ 0xdbb9989 in /usr/bin/clickhouse
10. DB::StorageBuffer::writeBlockToDestination(DB::Block const&, std::__1::shared_ptr<DB::IStorage>) @ 0xe2015c7 in /usr/bin/clickhouse
11. DB::StorageBuffer::flushBuffer(DB::StorageBuffer::Buffer&, bool, bool, bool) @ 0xe1ff1f3 in /usr/bin/clickhouse
12. DB::BufferBlockOutputStream::insertIntoBuffer(DB::Block const&, DB::StorageBuffer::Buffer&) @ 0xe206693 in /usr/bin/clickhouse
13. DB::BufferBlockOutputStream::write(DB::Block const&) @ 0xe205d9f in /usr/bin/clickhouse
14. DB::PushingToViewsBlockOutputStream::write(DB::Block const&) @ 0xdb79cc4 in /usr/bin/clickhouse
15. DB::AddingDefaultBlockOutputStream::write(DB::Block const&) @ 0xdbbab83 in /usr/bin/clickhouse
16. DB::SquashingBlockOutputStream::finalize() @ 0xdbb990c in /usr/bin/clickhouse
17. DB::SquashingBlockOutputStream::writeSuffix() @ 0xdbb9989 in /usr/bin/clickhouse
18. DB::copyData(DB::IBlockInputStream&, DB::IBlockOutputStream&, std::__1::atomic<bool>*) @ 0xd73909d in /usr/bin/clickhouse
19. DB::executeQuery(DB::ReadBuffer&, DB::WriteBuffer&, bool, DB::Context&, std::__1::function<void (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::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&)>) @ 0xdecbd5d in /usr/bin/clickhouse
20. DB::HTTPHandler::processQuery(DB::Context&, Poco::Net::HTTPServerRequest&, HTMLForm&, Poco::Net::HTTPServerResponse&, DB::HTTPHandler::Output&) @ 0xe51341f in /usr/bin/clickhouse -
21. DB::HTTPHandler::handleRequest(Poco::Net::HTTPServerRequest&, Poco::Net::HTTPServerResponse&) @ 0xe51660c in /usr/bin/clickhouse
22. Poco::Net::HTTPServerConnection::run() @ 0x10d16595 in /usr/bin/clickhouse
23. Poco::Net::TCPServerConnection::start() @ 0x10d4dd6f in /usr/bin/clickhouse
24. Poco::Net::TCPServerDispatcher::run() @ 0x10d4f77e in /usr/bin/clickhouse
25. Poco::PooledThread::run() @ 0x10e80a39 in /usr/bin/clickhouse
26. Poco::ThreadImpl::runnableEntry(void*) @ 0x10e7c96a in /usr/bin/clickhouse
27. start_thread @ 0x76db in /lib/x86_64-linux-gnu/libpthread-2.27.so
28. clone @ 0x121a3f in /lib/x86_64-linux-gnu/libc-2.27.so -
select * from system.clusters
-
точно ли ноды появились в кластере и добавились корректно
-
да, все там видны..
-
а нету ли ошибок в голонке errors?
-
никаких 🙁
-
в errors_count 0 в таблице system.clusters.
Да и ошибка странная почему он ругается на синтаксически не валидное название пути построенное для ZK 🙁 -
а вы как переносили таблицы на новый шард?
-
и для начала новые ноды вы добавляли как доп шард или доп реплики?
-
конфиги когда переносили точно меняли значение в макросах если их используете?
-
Создал с нуля 2 новые ноды как 2 шарда, и создал там БД и таблицы.
Подключил как реплики для каждого шарда. У меня до этого в кластере было 4 ноды 2 реплики по 2 шарда -
можете все же показать вывод select * from system.clusters
-
select table, zookeeper_path from system.replicas;
на всех серверах сделайте и проверьте что бы оно оно совпадало там где shard и отличалось там где путь -
например
/clickhouse/tables/{shard}/tablename_replicated -
-
а по тому что выше скинул?
-
плюс был баг на вскидку
https://github.com/ClickHouse/ClickHouse/issues/11133use_compact_format_in_distributed_parts_names problems · Issue #11133 · ClickHouse/ClickHouseHello, i added two new replicas in my cluster and got this error: [ 23165 ] {5a41e916-458e-4372-9f94-e327b725daa1} <Error> executeQuery: Poco::Exception. Code: 1000, e.code() = 36, e....
-
/clickhouse/tables/{uuid}/{layer}-{shard}
у меня вот такой шаблон для построения пути.
Все выглядит как то так: ….
/clickhouse/tables/6b9d1913-dd38-4bb6-9c29-c8017d259d28/01-01/table_name -
6b9d1913-dd38-4bb6-9c29-c8017d259d28 - 4 раза такое, так ведь?
-
нет везде разное на каждой реплике
-
стоп
-
вы точно читали документацию?
-
Я понял где я ошибся, я создал структуру в новой реплике, а лишь потом соединил ее с основвным кластером.
-
смотрите, если вам нужно 2 шарда по 4 реплики (а судя по всему вам это нужно) то
{uuid} - уникальных должно быть 2 -
по сути
/clickhouse/tables/shard_1/{layer}-{shard}
/clickhouse/tables/shard_1/{layer}-{shard}
/clickhouse/tables/shard_1/{layer}-{shard}
/clickhouse/tables/shard_1/{layer}-{shard}
/clickhouse/tables/shard_2/{layer}-{shard}
/clickhouse/tables/shard_2/{layer}-{shard}
/clickhouse/tables/shard_2/{layer}-{shard}
/clickhouse/tables/shard_2/{layer}-{shard} -
и вообще
{layer}-{shard}
это многоуровневое шардирование -
и нужно ли оно вам я не уверен
-
да я это понимаю уже обнаружил
-
Репликация данных | Документация ClickHouse
Репликация данных Репликация поддерживается только для таблиц семейства MergeTree: ReplicatedMergeTree ReplicatedSumming
-
/clickhouse/tables/{layer}-{shard}/table_name
и вы перепутали 🙂 -
Доагрегировать в самих запросах. По крайней мере так в документации написано. схлопывание работает в фоне и не стоит на него полагаться.
-
Понятно, что в фоне, вопрос лишь, в какие сроки это событие всё ж таки наступает
-
В документации написано, что некоторые может никогда не схлопнуть
-
Тут вот еще какая проблема.
у меня в построении пути используется в текущем кластере {uuid}:
/clickhouse/tables/{uuid}/{layer}-{shard}/имя_таблицы
И получается что две реплики которые уже в кластере давно работают имеют одинаковый uuid для одной и тойже таблицы и шарда.
А вот когда я пытаюсь новую реплику добавить и создают реплицируемую таблицу она получает новы uuid, и не реплицируется… -
Доброй ночи! Скажите пожалуйста, нужно выполнить последовательно несколько скриптов. Кто чем пользуется? Cron,airflow? Thanks
-
Перечитал документацию, не нашёл такого. В случае, если разные количества и непонятный порядок состояний — да, может быть всякое. Но в случае, что все условия для свёртывания строк выполнены корректно — в документации не говорится про «никогда» 🤔
-
>CollapsingMergeTree выполняет это при слиянии кусков данных.
>алгоритм слияния не гарантирует, что все строки с одинаковым ключом сортировки будут находиться в одном результирующем куске данных
>Если необходимо получить полностью свёрнутые данные из таблицы CollapsingMergeTree, то необходимо агрегирование.
>Если вставить данные одним запросом, ClickHouse создаёт один кусок данных и никогда не будет выполнять слияние.
Документация:
https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/collapsingmergetree/amp/ -
Некоторые фразы вы вырвали из контекста и придали им смысл, которого авторы документации в них, как мне кажется, не вкладывали 🤷♂️
Никогда — это именно никогда. Но в документации говорится иное: «ClickHouse объединяет куски данных в неизвестный момент времени, который мы не можем предсказать.» - 16 April 2021 (138 messages)
-
попробуйте optimize table ... final, оно доагрегирует даже если данные в одном парте
-
Да, это сработало применительно к отдельной ReplicatedCollapsingMergeTree, но это не очень корректно, на мой взляд, бегать по нодам и искать, где лежат данные.
На 5кк данных автоматическое свёртывание строк произошло через 2-3 минуты после вставки строк с отменой состояний. А вот на 130кк это не произошло и через несколько часов, хотя судя по логам КХ что-то там с этой таблицей делал, переименовывая и объединяя партиции 🤷♂️🤔 Ошибок в логах нет -
ну я бы на самом деле действительно не рассчитывал на схлопывание в какой-то конкретный промежуток времени, просто доагрегировал бы сам в запросе
-
Запросов прям уйму переписывать тогда придётся 🤦♂️ Целый проект. Хочется как-то малой кровью обойтись.
-
сделать вью или промежуточную таблицу и пусть запросы ссылаются на неё?
-
Как компромиссное решение — очень даже неплохая идея 👍 Спасибо 🙏
-
рад помочь 👍🏻
-
И, к слову, на какой-то конкретный момент и не рассчитывали. Но интересовал предел ожидания. Например, автоматическое свёртывание строк в течение часа вполне устроило бы. А несколько часов — это прям перебор.
-
ну я для себя сделал вывод из написанного в доке, что всё-таки не стоит рассчитывать хоть на какой-то промежуток времени, лучше сразу предусмотреть механизм доагрегировать/схлопывать самому
-
у вьюх там прямо магия какая-то под капотом происходит в отношении прокидывания параметров
-
не совсем понял 🤔 зачем туда какие-то параметры прокидывать? я имел в виду, что можно написать код для обычной вьюхи на ту таблицу, что используется для "уймы запросов", тогда просто в них нужно будет подменить таблицу на вьюху 🤷♂️
-
ну или сделать таблицу, которая каждый раз будет пересчитываться досхлопывая строки и тогда подменить во всех запросах обращение к изначальной таблице на эту промежуточную
-
В последней моей цитате как раз было "никогда". Но вы видимо иначе прочитали документацию и для вас это означает "в течение часа или около того". Ну ок. Вам виднее. У меня встречались несхлопнуье строки, которые никогда не схлопывались, я прочитал документацию. Всё сошлось. При чём это поведение логично и встречается в других аггрегирующих движках. Сворачивание происходит только при слиянии кусков. Если слияния кусков не происходит, то сворачивания нет. Куски не сливаются в бесконечном цикле в один мега кусок.
-
Я про то что если вью это просто view as select.. from с аггрегацией, то запросы вида select.. from view where... будут хорошо оптимизированы.
Если вью это view as select ... from (select...from)
То запросы вида select.. from where будут работать возможно не так как ожидалось) а если там где то внутри ещё и джоин не дай бог.. -
понял) в целом — согласен, но проверять подход это "уже совсем другая история", конечно нужно смотреть что за запросы, пробовать варианты, сверять скорость и т.д. и т.п.)
-
-
-
Я вам в одном из своих ответов писал дословно следующее: «в случае, что все условия для свёртывания строк выполнены корректно — в документации не говорится про «никогда» 🤷♂️ Понимаете разницу? Странная дискуссия. Я говорю о том, что есть таблица с данными, куда залили строки с отменой состояний, но свёртывание не сработало, как заявлено в документации, в ответ на что вы говорите о других сценариях
-
Народ, поможем хорошей тулзе стать более удобной для ClickHouse
полайкайте пожалуйста
https://youtrack.jetbrains.com/issue/DBE-12992
и
https://youtrack.jetbrains.com/issue/DBE-12997Fix dictionary and dictionary field references resolving for ClickHouse dialect : DBE-12992References in select query in the following code snippet are unresolved. Expected result: fields are resolved, navigable and it is possible to perform refactorings on them (e.g. rename). create dictionary if not exists dict(id UInt8, val UInt8) primary key id source(file(path '/var/lib/clickhouse/user_files/some.tsv' format 'TabSeparated')) lifetime(300) layout(flat()); select id, val from dict;…
-
а как получить число скипнутых строк при использовании
input_format_allow_errors_num
?
https://clickhouse.tech/docs/ru/operations/settings/settings/#input-format-allow-errors-num
@den_crane 🙏Настройки | Документация ClickHouseНастройки distributed_product_mode Изменяет поведение распределенных подзапросов. ClickHouse применяет настройку в тех с
-
Здравствуйте! Возможно ли атомарно заменить одну таблицу другой без INSERT SELECT? Например, есть REPLACE TABLE, но эта операция создаёт новую таблицу и вставляет в неё данные. А что делать, если таблица с данными уже есть?
-
Atomic | Документация ClickHouse
Atomic Поддерживает неблокирующие запросы DROP TABLE и RENAME TABLE и атомарные запросы EXCHANGE TABLES. Движок Atomic и
-
судя по этому фрагменту кода
https://github.com/ClickHouse/ClickHouse/blob/9f5cd35a6963cc556a51218b46b0754dcac7306a/src/Processors/Formats/IRowInputFormat.cpp#L114-L124
получить можно через
system.stacktrace только если пойдет превышение
отдельной какой то метрики я не вижуClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
еще сейчас проверяю send_progress_in_http_headers
-
Ох, спасибо. Это то, что надо! 👍
-
>ClickHouse объединяет куски данных в неизвестный момент времени, который мы не можем предсказать.
Ваша же цитата. Я читаю её как "слияние может быть моментальным или вообще никогда". Если вы читаете её как "час-день", то ок, нужно просто уточнить у разработчиков.
Но проблема я так понимаю всё таки есть и решать её надо. Самый простой способ - это добавить в запрос FULL, чтобы не переписывать все запросы на аггрегацию. Или если данных всего несколько лямов, то переименовать таблицу и создать вьюху с аггрегацией со старым именем. -
-
Всем доброго времени суток! Кто нибудь может подсказать куда копать? Заранее благодарю за ответ.
-
Всем привет. Возник вопрос касательно использования внешних словарей. Есть справочник в MySQL. В кликхаусе создал справочник командой :
CREATE DICTIONARY r_name_dict_test
(
id Int32,
mrgn_id Int64,
name String
)
PRIMARY KEY id
SOURCE(MYSQL(
port 3306
user 'sys'
password 'qwerty'
replica(host 'db' priority 1)
db 'test'
table 'm_region'
))
LAYOUT(FLAT())
LIFETIME(120);
120 Время жизни. Возник вопрос, что произойдет, если источник MySQL отвалится (сеть пропадет, база упадет, etc)? Сделал данное поведение, выключил MySQL, однако на CH запрос к справочнику выполняется без проблем, хотя я ожидал, что после 120 сек он полезет их обновлять и свалится по ошибке. Так и задумано или я что-то недопонял? -
Добрый день. Вопрос по ReplicatedCollapsingMergeTree. Регулярно вижу, что не схлопываются некоторые записи. То есть осталась одна парта в партиции, вызываю для партиции optimize final, вижу в логах, что отрабатывает, но в таблице по-прежнему есть записи у которых все значения, кроме sign идентичны.
Я же правильно понимаю, что такого быть не должно? Что может быть причиной и как можно поисследовать? Версия 20.4.x -
Если при обновлении возникнет ошибка, то ошибка пишется в лог сервера, а запросы продолжат использовать старую версию словарей.
П.С.: из доки КХ -
Блин(( Как всегда, не увидел в доке😂 Спасибо!
-
Коллеги, приветствую. Кто-то работал с clickhouse-copier?
-
Указываю конфиг с таргет и дестинашион
-
Он ругается на zookeeper
-
virtual int DB::ClusterCopierApp::main(const std::vector<std::__cxx11::basic_string<char> >&): Code: 999, e.displayText() = Coordination::Exception: No addresses passed to ZooKeeper constructor. (Bad arguments), Stack trace:
-
а сам файл сделал xml как тут https://clickhouse.tech/docs/ru/operations/utilities/clickhouse-copier/, конфигурация на копированиеclickhouse-copier | Документация ClickHouse
clickhouse-copier Копирует данные из таблиц одного кластера в таблицы другого (или этого же) кластера. Можно запустить н
-
Может кто-то в курсе?
-
@nikitamikhaylov может подскажет
-
Помогите плизз если кто сталкивался. Эта проблема как выяснилось происходить только с таблицей типа BUFFER, почему-то именно на ней ругается BAD PATH syntax 🙁 Уже пробовал пересоздвать ее на всех репликах. Все остальные таблицы реплицируются отлично, а BUFFER хорошо реплицировался до тех пор пока работал в одном кластере из 4ех нод 2 реплики и 2 шарда, а когда я подключил еще 4 ноды 2 реплики и 2 шарда начала вылазить эта ошибка..
-
только что разобрался с копиром, покажи плиз подробнее
- конфиг zookeeper.xml
- xml-спеку таски копирования
- команду копира с параметрами
вообще из доки непонятно примерно ничего, но есть толковые примеры у Altinity https://altinity.com/blog/2018/8/22/clickhouse-copier-in-practiceClickhouse-copier in practiceClickhouse-copier is a tool designed to copy data from one ClickHouse environment to another. The tool is a part of standard ClickHouse server distribution. It can work in a fully parallel mode and distribute the data in the most efficient way. In this article, we review a few typical examples when clickhouse-copier can be used.
-
пока можете попробовать указать max_bytes_before_external_group_by
-
А как проще всего сконвертировать Array(Nullable(Float64)) arrayFilter(x -> isNotNull(x), avgOrNullResample(1, 1000, 5)(Value, Time)) в Array(Float64)?
Или, может быть, есть способ проще убрать из выражения пропуски?
поясню: для всех Time внутри 5 секунд, берётся avg(Value), и выдаётся Null если ничего нету. Потом все Null удаляются, но это добавляет 1байт для каждого значения, когда используется RowBinary. -
подобные вопросы уже были заданы в этом чатике не раз. поищете по ключевым словам: CollapsingMergeTree, сворачивание и т.д.
>вызываю для партиции optimize final, вижу в логах, что отрабатывает, но в таблице по-прежнему есть записи у которых все значения, кроме sign идентичны.
если две записи в рамках одной партиции, то они должны схлопнуться при optimize final. то что вы пишите, происходить не должно :) -
а вот и ответ от саппорта яндекса. https://t.me/clickhouse_ru/87554Denny Crane [Junior support specialist at Altinity (NB,Canada)] in ClickHouse не тормозит
а есть что мержить? а если сделать optimize final колапсится? мержи начинаются когда-нибудь, нет никаких гарантий что оно вообще помержится.
-
а это всё на одной машине? может строки с разными sign лежат на разных шардах?
-
Всем привет.
Ищу команду/человека, которая бы смогла забрать на себя задачи по обслуживание clickhouse-кластера. -
вот такое уже пробовали в реальной жизни ? (hdfs+clickhouse)
https://clickhouse.tech/docs/ru/engines/table-engines/integrations/hdfs/
CH не падает если файлы появляются - исчезают ?HDFS | Документация ClickHouseHDFS Управляет данными в HDFS. Данный движок похож на движки File и URL. Использование движка ENGINE = HDFS(URI, format)
-
и делает ли CH "Partition prunning" , т.е. он может понять что в подкаталоге лежит порция данных, которая привязана к имени каталога ?
-
-
у вас реплицируемые таблицы?
данные как вставляете в Distributed или напрямую?
всякие там OPTIMIZE ... и т.п. употребляете?
все реплики живые?
мутациями пользуетесь? -
Support | ClickHouse Documentation
ClickHouse Commercial Support Service Providers Info If you have launched a ClickHouse commercial support service, feel
-
-
вставка куда идет в Distributed таблицу? или напрямую в MergeTree с выбором шарда?
в Distributed таблице данные разбиваются на куски (.bin файлы) на ноде в который прилетел INSERT и кладутся /var/lib/clickhouse/data/<database>/<distributed_table_name>/tmp/<shard_host_name>/*.bin
и потом пушатся на удаленные хосты (и часть на localhost если данные на текущий щард попали) в MergeTree таблицы
почитайте по доке про SYSTEM STOP DISTIRUBTED SENDS
если удаленный хост выключить, то данные по прежнему будут доступны для SELECT ..
но будут копиться на нодах куда INSERT прилетает... -
или только самому переписывать её в массивы?
-
Обнаружил у себя такую проблему, когда у меня подключены 4 реплики, КХ пытается создать папку по пути
/clickhouse/data/store/fff/fffc0e5b-f15a-4bbb-a60d-2fa7d620ff45/[хостнеймы + пароль + пользователь для каждого шарда]
а у меня длинный пароль + длинное имя хоста, в итоге получается Linux не дает создать такую длинную директорию с именем типа:
default%3Averylongpasswordhereihave%40sevenle-prod-clickhouse-2b%3A9000%2Cdefault%3Averylongpasswordhereihave%40sevenle-prod-clickhouse-2c%3A9000%2Cdefault%3Averylongpasswordhereihave%40sevenle-v2-prod-clickhouse-2b%3A9000%2Cdefault%3Averylongpasswordhereihave%40sevenle-v2-prod-clickhouse-2c%3A9000
и я так понимаю что КХ не может ее создать потому что падает по лимиту названия директории для FS.
Кто то сталкивался с таким ? Как то обходили ? Или нужно убрать просто информацию типа порт, пользователь, пароль ? -
это я смотрел
-
Это все на одном шарде
-
увы, без доп. исследований и чтения документации пока больше ничего не приходит в голову
-
Спасибо. Нашел параметр insert_distributed_sync. Кажется, это оно, т.е. как добиться синхронности при вставке через distributed понятно.
-
Добрый день,
у нас есть такая таблица test, ищем 10 последних записей с определённым id1, всего их ~ 55 млн.
судя по всему происходит фулскан всех записей с этим id1, и присутствие в ключе сортировки после id1 поля timestamp не влияет.
подскажите, пожалуйста, дело в неправильной структуре таблицы или в запросе, и можно ли избежать фулскана? (необходимо выбирать куски данных с определённым id1, отсортированных по timestamp)
CREATE TABLE clickhouse.test
(
`id1` String,
`timestamp` DateTime,
`id2` UInt32,
)
ENGINE = ReplacingMergeTree
PARTITION BY toYYYYMM(timestamp)
ORDER BY (id1, timestamp, id2)
SETTINGS index_granularity = 8192
SELECT * FROM test
WHERE id1 = 'a27d30b4121232323b4c659f2488d'
ORDER BY timestamp DESC
LIMIT 10
10 rows in set. Elapsed: 11.991 sec. Processed 55.75 million rows
EXPLAIN
SELECT *
FROM test
WHERE id1 = 'a27d30b4121232323b4c659f2488d'
ORDER BY timestamp DESC
LIMIT 10
┌─explain───────────────────────────────────────────────────────────────────────────────┐
│ Expression (Projection) │
│ Limit (preliminary LIMIT) │
│ MergingSorted (Merge sorted streams for ORDER BY) │
│ MergeSorting (Merge sorted blocks for ORDER BY) │
│ PartialSorting (Sort each block for ORDER BY) │
│ Expression (Before ORDER BY) │
│ Filter (WHERE) │
│ SettingQuotaAndLimits (Set limits and quota after reading from storage) │
│ ReadFromStorage (MergeTree) │
└───────────────────────────────────────────────────────────────────────────────────────┘ -
по идее, чтобы ваш запрос отрабатывал быстрее нужно поменять порядок сортировки: ORDER BY (timestamp, id1, id2)
┌─explain─────────────────────────────────────────────────────────────────────────┐
│ Expression (Projection) │
│ Limit (preliminary LIMIT) │
│ FinishSorting │
│ Expression (Before ORDER BY) │
│ SettingQuotaAndLimits (Set limits and quota after reading from storage) │
│ ReadFromPreparedSource (Read from NullSource) │
└─────────────────────────────────────────────────────────────────────────────────┘
и для order by были рекомендации для нескольких полей - сначала менее уникальные параметры, а потом более уникальные. -
1 шард, две реплики, дистрибьютед таблиц нет, optimize и мутации не употребляем
-
правда в макросах указан один и тот же номер шарда ( 01 ), но почему то вывод select * from system.clusters показывает два шарда:
─cluster──┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name───────
ads_repl │ 1 │ 1 │ 1 │ ch03-adv
ads_repl │ 2 │ 1 │ 1 │ ch04-adv
но так было всегда и проблем раньше небыло -
в путях для ReplicatedMergeTree номер шарда через макрос прописывается {shard}
<remote_servers>
скорее всего скопировали
и macros.xml неправильный
поправьте
судя по всему у вас данные теперь не в репликах, а разбиты на две части ...
куда вставляли там и остались... -
через {shard} в путях и прописываем макросы, данные на двух серверах бьются по кол-ву (инсерты идут только на 1 сервер)
-
Подскажите а не было проблем с заливкой данных в поле LowCardinality(Nullable(String))? нашел https://github.com/ClickHouse/ClickHouse/issues/8406 но у меня вроде версия посвежее чем правка, правда вставляю я через TSV? а не через Parquetcan't insert NULL data into LowCardinality(Nullable(String)) · Issue #8406 · ClickHouse/ClickHouse
(you don't have to strictly follow this form) Describe the bug or unexpected behaviour A clear and concise description of what works not as it is supposed to. How to reproduce Which ClickHo...
-
только на 1 сервере постоянно идут сообщения вида <Information> MergeTreePartsMover: Failed to swap 202104_89357_95544_5359. Active part doesn't exist. Possible it was merged or mutated. Will remove copy on path '/opt/clickhouse_cold/data/medtizer/logs/detached/202104_89357_95544_5359/ и с каждым таким сообщением файлов в detached каталоге становится больше
-
если у вас на обоих серверах system.macros одинаковый {shard} это норм
и должен еще быть {replica} разные и они должны быть прописаны тоже в пути -
а в чем ошибка то у вас заключается? какое сообщение об ошибке пишет?
-
реплика указаны разные ( через {replica}), шард одинаковый
-
тогда выглядит так, что что-то успевает смержить парт, до того как он отреплицируется....
попробуйте по именам партов из сообщений об ошибках в system.part_log поискать -
у вас никаких storage policy не используется?
SELECT * FROM system.disks
одну запись показывает? -
подскажите как выбрать данные из таблицы вида
Tasks (id UInt32, sub_id UInt16, t_name STring, t_type String, t_state Uint8, t_message String, ts DateTime)
нужен результат в уникальных строк по всем полям с заданным 'id' по максимальному значение 'ts'
Т.е. из данных вида:
1000, 10, 'xxx', 'type1', 0, 'xxx', 2020-01-01 12:00:00
1000, 10, 'xxx', 'type1', 0, 'xxx', 2020-01-01 12:30:00
1000, 20, 'xxx', 'type1', 0, 'xxx', 2020-01-01 12:00:00
1000, 20, 'xxx', 'type1', 0, 'xxx', 2020-01-01 12:30:00
1000, 30, 'xxx', 'type1', 0, 'xxx', 2020-01-01 12:00:00
2000, 10, 'xxx', 'type1', 0, 'xxx', 2020-01-01 12:00:00
2000, 10, 'xxx', 'type1', 0, 'xxx', 2020-01-01 12:30:00
Нужно получить только 3 строки для id=1000:
1000, 10, 'xxx', 'type1', 0, 'xxx', 2020-01-01 12:30:00
1000, 20, 'xxx', 'type1', 0, 'xxx', 2020-01-01 12:30:00
1000, 30, 'xxx', 'type1', 0, 'xxx', 2020-01-01 12:00:00 -
argmax
-
пробовал, возвращает одну запись с максимальным ts + нужно в качестве аргумента ему давать полный список полей. * он не принимает
-
select argmax(tuple(values), ts) group by id
-
-
так работает, но приходится перечислять все поля в argMax а их гораздо больше чем в примере
но видимо другого способа особо и нет -
ну вон вам там скинули еще несколько вариков.
-
так там то же самое написано
-
ну как минимум еще order by limit
и подзапрос -
используется:
┌─name───────────┬─path──────────────────┬───free_space─┬───total_space─┬─keep_free_space─┐
│ cold_data_disk │ /opt/clickhouse_cold/ │ 27217444864 │ 593055903744 │ 40000000000 │
│ default │ /var/lib/clickhouse/ │ 126492344320 │ 1331831013376 │ 0 │
└────────────────┴───────────────────────┴──────────────┴───────────────┴─────────────────┘ -
argMax(tuple(*), t) ?
-
Не возможно вставить Null собственно как и в проблеме на которую я ссылку дал
-
Да, так сработало
Спасибо -
ну, есть сильное подозрение что у вас данные свежие достаточно которые еще не успели отреплицироваться переезжают в cold_data_disk
надо storage policy чинить IMHO -
даже если и так то они же не должны отдетачиваться...
-
part_log отсутствует... а вот инфа из system.parts по одной из таких партов
partition: 202104
name: 202104_2572687_2572687_0
part_type: Wide
active: 0
marks: 2
rows: 20
bytes_on_disk: 4053
data_compressed_bytes: 2373
data_uncompressed_bytes: 4847
marks_bytes: 1632
modification_time: 2021-04-16 15:54:39
remove_time: 2021-04-16 15:54:42
refcount: 1
min_date: 0000-00-00
max_date: 0000-00-00
min_time: 2021-04-16 15:54:38
max_time: 2021-04-16 15:54:39
partition_id: 202104
min_block_number: 2572687
max_block_number: 2572687
level: 0
data_version: 2572687
primary_key_bytes_in_memory: 34
primary_key_bytes_in_memory_allocated: 192
is_frozen: 0
database: db1
table: logs_views
engine: ReplicatedMergeTree
disk_name: default
path: /var/lib/clickhouse/data/db1/logs_views/202104_2572687_2572687_0/
hash_of_all_files: 7bd3295d45dcfabd4abb3dca72cd9924
hash_of_uncompressed_files: 4b72eb153ffe6d0675c3fea537569600
uncompressed_hash_of_compressed_files: fdaa595acb90bf0023d961ae900406b1
она находится на системной диске который использует политику default, вторая (кастомная политика) используется для монтирования в /opt, непонятно почему туда этот парт перемещается, да еще и в detached. На системном диске свободно порядка 160Гб -
https://clickhouse.tech/docs/en/operations/settings/settings/#output_format_tsv_null_representation
\N
используете для обозначнеия Null ?Settings | ClickHouse DocumentationSettings distributed_product_mode Changes the behaviour of distributed subqueries. ClickHouse applies this setting when
-
да
-
-
Народ, всем привет! Апгрейднули (с 20.5.2 до последней) версию КХ, никак не можем понять с чем баг — один относительно сложный запрос проходит через консоль, но через HTTP-клиент стало выкидывать DB::Exception: Syntax error: failed at position 1111 ('(') (line 21, col 13, в какую сторону можно копать?
-
-
-
спасибо за ответ, попробовали порядок сортировки ORDER BY (timestamp, id1, id2)
в данном случае сканируется вобще вся таблица, что логично
уточню по поводу данных, всего в таблице порядка 3 млрд записей, кол-во записей с уникальными id1 варьируется от 3 штук до десятков миллионов
CREATE TABLE clickhouse.test2
(
`timestamp` DateTime,
`id1` String,
`id2` UInt32
)
ENGINE = ReplacingMergeTree
PARTITION BY toYYYYMM(timestamp)
ORDER BY (timestamp, id1, id2)
SETTINGS index_granularity = 8192
SELECT *
FROM test2
WHERE id1 = 'a27d30b4121232323b4c659f2488d'
ORDER BY timestamp DESC
LIMIT 10
10 rows in set. Elapsed: 566.396 sec. Processed 3.00 billion rows
EXPLAIN
SELECT *
FROM test2
WHERE id1 = 'a27d30b4121232323b4c659f2488d'
ORDER BY timestamp DESC
LIMIT 10
┌─explain─────────────────────────────────────────────────────────────────────────┐
│ Expression (Projection) │
│ Limit (preliminary LIMIT) │
│ FinishSorting │
│ Expression (Before ORDER BY) │
│ SettingQuotaAndLimits (Set limits and quota after reading from storage) │
│ Expression (Remove unused columns after reading from storage) │
│ Union │
│ MergingSorted (Merge sorting mark ranges) │
│ Expression (Calculate sorting key prefix) │
│ ReverseRows │
│ ReadFromStorage (MergeTree with order) │
│ MergingSorted (Merge sorting mark ranges) │
│ Expression (Calculate sorting key prefix) │
│ ReverseRows │
│ ReadFromStorage (MergeTree with order) │
│ MergingSorted (Merge sorting mark ranges) │
│ Expression (Calculate sorting key prefix) │
│ ReverseRows │
│ ReadFromStorage (MergeTree with order) │
│ MergingSorted (Merge sorting mark ranges) │
│ Expression (Calculate sorting key prefix) │
│ ReverseRows │
│ ReadFromStorage (MergeTree with order) │
│ MergingSorted (Merge sorting mark ranges) │
│ Expression (Calculate sorting key prefix) │
│ ReverseRows │
│ ReadFromStorage (MergeTree with order) │
│ MergingSorted (Merge sorting mark ranges) │
│ Expression (Calculate sorting key prefix) │
│ ReverseRows │
│ ReadFromStorage (MergeTree with order) │
└─────────────────────────────────────────────────────────────────────────────────┘ -
спасибо за уточнение. изначально я прочитал что в таблице 55 лямов, а не id1 имеет 55 лямов разных значений. поэтому и показалось, что 10 секунд для таблицы в 55 лямов - многовато, но для 3 млрд уже норм. возможно индексы пропуска помогут вам ускорить ваш запрос... но вряд ли
https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/mergetree/#table_engine-mergetree-data_skipping-indexesMergeTree | Документация ClickHouseMergeTree Движок MergeTree, а также другие движки этого семейства (*MergeTree) — это наиболее функциональные движки табл
-
Добрый вечер.
Из двухнодового кластера(distributed+replicatedmt) вывели из эксплуатации одну релпику, хост также был удален из dns
* удалили ее из директивы <remote_servers> конфига config.xml
* перезагрузили сервер (на этом этапе она пропала из system.cluster)
* выполнили SYSTEM DROP REPLICA 'clickhouse-kd2'
Тем не менее, в журналах при старте кликхауза ошибка
"carbon_metrics.graphite_tree.DirectoryMonitor: Code: 210, e.displayText() = DB::NetException: Host not found: clickhouse-kd2 (clickhouse-kd2:9000), Stack trace (when copying this message, always include the lines below)"
Что-то пропустили, нужно еще почистить какие-нибудь очереди? -
Но это ведь совершенно классический запрос - выбрать данные по клиенту за период времени. 3 лярда это совершенно немного, для какой-либо статистики, к примеру. В обычном постгресе такой запрос мгновенен по индексу (если не уходить далеко в пагинацию, конечно - там начнутся проблемы, но первые десятки тысяч отдаются быстро).
Кликхаус ведь для этого и предназначен, разве нет? -
постгрес - это вообще черепаха, так быстро работать как вы пишите он будет только на очень хорошем железе. на таком же железе кликхаус будет не просто быстро работать, а отправлять результаты в прошлое.
посмотрите сравнение кликхауса с mysql на сотнях миллионов (к сожалению сравнения на миллиардах и с потгресом нету по причине отсутствия смысла в таком сравнении)
https://clickhouse.tech/benchmark/dbms/#[%22100000000%22,[%22ClickHouse%22,%22MySQL%22],[%221%22,%222%22]]Performance comparison of database management systemsClickHouse is a fast open-source column-oriented database management system that allows generating analytical data reports in real-time using SQL queries
-
похоже Poco глючит на парсинге запроса
есть повод сделать ISSUE на github -
у меня кстати подобная структура как у вас:
create table sync_log
(
t DateTime64(6) DEFAULT now64(6),
entity String,
profile_id UInt64,
uuid String
) Engine = ReplacingMergeTree
PARTITION BY (entity)
ORDER BY (entity, profile_id, uuid);
правда данных поменьше - около 500 миллионов, но и запрос отрабатывает всего за 0.013 sec:
SELECT * FROM sync_log where profile_id=2 ORDER BY t desc LIMIT 10
"моё хобби - экстраполировать": запрос на 55 лямов должен отработать за полторы секунды
и да, всё вертится на виртуалке за 20 баксов
только у меня версия 20.4.5.36 и EXPLAIN к сожалению не работает.
PS: только сейчас заметил, что вместо PARTITION BY (entity) нужно было указать PARTITION BY (entity, toYYYYMM(t)) -
вот полторы секунды было бы как раз и приемлемо 🙂
диск sata пока в тестах -
ORDER BY (id1. timestamp, id2) ?
-
у них такая сортировка была изначально, запрос отрабатывает около 10 секунд. ребята хотят его ускорить
-
prewhere попробовать
-
либо так
select * from test2 where (timestamp, id1) IN
(
SELECT timestamp, id1
FROM test2
WHERE id1 = 'a27d30b4121232323b4c659f2488d'
ORDER BY timestamp DESC
LIMIT 10
) -
как вариант, раз топикстартер жаловался на фуллскан, то возможно оптимизатору нужно указать более оптимальный путь запроса
-
https://t.me/clickhouse_ru/214290
это точно должно сработать
у ТСа немного сложность что фильтр сначала а только потом ордер... т.е. основной индекс по любому не поможет
если кардинальность ИД низкая можно order by ts + skip index id1【D】【J】 in ClickHouse не тормозитлибо так select * from test2 where (timestamp, id1) IN ( SELECT timestamp, id1 FROM test2 WHERE id1 = 'a27d30b4121232323b4c659f2488d' ORDER BY timestamp DESC LIMIT 10 )
-
prewhere в плане не увидел, поэтому написал, но там тоже после фильтра по ИД индекс не поможет и все колонки будут сканироваться попусту, если ИД много будет медленно
-
если бы оптимизатор использовал индекс по дате, то после выборки первых строк по лимиту он бы остановился и запрос стал быстрым. а он файлсортит все записи, хотя это не нужно.
-
по идее order by ts + skip index id1 это тоже самое что "order by ts, id1" (особенно если тип индекса minmax), а это ТС уже пробовал и стало медленнее
-
дополнительный индекс minmax на дату пока ещё не пробовали
-
это я на основе документации решил, что без разницы:
>minmax — Хранит минимум и максимум выражения, используя их для пропуска блоков аналогично первичному ключу. -
Добрался до таблиц с движком Join. Эффект приятно порадовал, хочу масштабировать.
Как я понял, данные хранятся в памяти целиком. Но в какой момент времени они туда загружаются? В момент создания или только на время запроса?
Если в момент запроса, то не съем ли я всю память, насоздавав пачку таких таблиц? И как тогда правильно с ними работать?
А если в момент запроса, то в чём отличие с джойном обычной таблицы, там ведь тоже правая таблица в память грузится и в хэш-таблицу превращается, несколько помню? -
там правая таблица каждый раз в память подгружается, а в случае с джойном только один раз (осталось понять в момент создания или в момент первого к ней обращения)
-
хотя в доке написано:
>Данные таблиц Join всегда находятся в RAM.
так что видимо с момента создания -
Уже послал Алексею. Вот пример запроса, который не работает в новой версии, но работал в старой: https://controlc.com/a6e7f39f (если сокращать длину, то всё работает)curl -i 'http://localhost:8123/?' -X POST --data-binary "/*zzzzzzzzzzzzzzzzzzzzzzzzzz - a6e7f39f
curl -i 'http://localhost:8123/?' -X POST --data-binary "/*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz - a6e7f39f
-
ну да, skip index = тормоза почти всегда за исключением очень высокоуникальных значений который сконцентрированы в малом количестве гранул..
-
все правильно там, where работает до order by, поэтому КХ по одному будет перебирать, до тех пор пока не наберется нужное количество ID1 попадающих в лимит.
тут два варианта:
1) эвристика: - знать сколько в среднем в интервале прилетает (куда нибудь класть таймстемп "10 events ago" для каждого ИД) и отсекать по дате заранее
2) фулсканить 2 колонки, найти 10 строк, и прочесть уже все колонки используя индекс лукпа по ключу https://t.me/clickhouse_ru/214292 -
Судя по всему, да. Т.е. создавать много таких таблиц - вредно для памяти.
-
-
Всем привет) а кто в каком типе данных хранит цены (с копейками) товаров?) В документации не рекомендуют Float. На тестах я не заметил разницы в скорости на sum, avg между int и float.
А в чем же тогда хранить?
Decimal - из документации видно, что есть нюансы с приведением к другим типам при сравнении и т.п.
Хранить в int в копейках? Боюсь ошибок в использовании. Постоянно на 100 делить при выводе и т.п.
Хранить в 2х полях и копейки отдельно? Кажется, не удобно.
Ничего лучше float не приходит в голову.
Какой тип вы используете?) -
Decimal, но у меня копейки 8 знаков после запятой.