- 01 October 2021 (78 messages)
-
снепшот занимает 0 байт
это ХАРДЛИНКИ -
ну тогда клево, спасибо
-
А можете объяснить в чём прикол? Как хардлинки спасают/помогают? Данные ведь закоруптятся и там и там, или это только на дроп рассчитано?
-
Добрый день, скажите, пожалуйста, если у вас данные идут через spark streaming, то дальше как лучше их заливать в clickhouse? Я знаю, что нужно пачками большими заливать, а у меня по 1-1000 строк может получится, после spark норм будет, если я буду в buffer таблицу складывать, а после в основную либо есть другие решения по объединению строк в большие пачки?
-
1 Парты (файлы) иммьютабл, КХ никогда не изменяет файлы.
2 clickhouse-backup задуман чтобы заливать бекап куда-то, например в s3 / ftp .... -
Вставить 1 строку не проблема. Проблема вставить миллион раз по одной строке. Если у вас спарк делает пачки раз в секунду или раз в минуту, то всавляйте хоть по одной строке.
-
Так говорят, что не рекомендуется вставлять по 1 строке. Или это лишь на скорость записи влияет? Деградации при выборке из данной таблицы не будет? И да, в моем случае, заливка,примерно, по 1 строке в секунду будет.
-
Всавлять по многу более эффективно. Тратится меньше ресурсов. На скорость запросов кол-во инсертов не влияет напрямую. Потому что в фоне идут мержи. И кол-во партов в партиции в среднем меньше 30. Не важно сколько инсертов пока идет 6й инсерт кх смержит предыдущие 5.
Если совсем никак не собрать более крупные батчи то можно использовать и engine buffer или кафку. -
Понял, скорее тогда да, будем использовать buffer по началу, как самый простой вариант. Благодарю за ответы
-
Коллеги, Рассшифровал в текст доклад "Учим Kibana работать с Clickhouse". Если кто хочет прочитать/посмотреть глазами ошибки, напишите мне пожалуйста.
-
есть ли какая-то тема с зарезервированным именем load_date?
Создаю вьюху как
select
Date(date_extracted) as load_date,
Date(date_extracted) as load_date1
В результате имеем одну колонку с DateTime, другую с Date -
кстати, про вставку помногу. А почему питоновский пакет clickhouse-driver говорит, что, наоборот, не надо вставлять сразу много строк? это ж противоречит основной доке
-
по моему он как. раз и. говорит. вставлять по многу ии не чаще раза в сек. А пример. кода - что надо массив писать а не. одиночные
-
в доке же про другое написано: не формируйте запрос в виде строки, а используйте массив параметров
-
аа, если так прочитать - понятно, спасибо
-
Здравствуйте.
Нужно организовать инкрементальное обновление словаря. Упёрся в одну проблему, прошу помочь.
Есть относительно большая для словаря (около 1 млн записей, 100 полей) таблица в ORACLE, которая обновляется к примеру 6 000 раз в сутки. Эта таблица должна в идеале быть одним словарём или источником для нескольких словарей. Сделано так, что все обновления заносятся в таблицу КХ. Таблица в источнике не позволяет получить изменения записей, т.е там нет поля для update_field.
Провел ряд экспериментов, включая различные схемы затягивания данных в словарь, используя синтаксис invalidate_query, update_field, которые отрабатывают корректно. Но в одной схеме затягивания данных столкнулся с ограничением, которое пока не понял как обойти.
Хотел сделать в КХ, без средств ETL так, чтобы данные, поступающие в stage таблицу в итоге попали в таблицу (назовём ее source_for_dict) с движком VersionedCollapsingMergeTree, т.е. реализовать подход, указанный в доке.
Думал создать MV, которое получает ID записей из stage таблицы, по ним ищет данные в source_for_dict и дублирует старые данных с Sign -1, а новые данные поступают с Sign = 1. Хотел сделать это в одном MV с использованием UNION, но MV запрещает его использование. Далее хотел сделать два MV, первое вставляет старые данные с Sign = -1, новые данные с Sign = 1. Но это не получилось, т.к. моё MV цепляется в итоге к source_for_dict, а нужно к stage таблице (была надежда, что увидев первый from MV подцепится к нему).
Всякие join’ы не рассматриваю, конечно.
Вот схематичный запрос в MV который не туда цепляется и должен вставлять старые данные со знаком -1.
——————
WITH IDs AS (select distinct ID from TESTRAZ.stage_table)
SELECT ID, Name, last_update,NREC, -1 as Sign
FROM TESTRAZ.source_for_dict
GROUP BY ID, Name, last_update,NREC
HAVING sum(Sign) > 0 and ID in
(select distinct ID from IDs)
—————
Подумал, было бы не плохо иметь хинт, подсказывающий, какую таблицу отслеживать в MV.
Есть ли известный способ обновлять таблицу с движком VersionedCollapsingMergeTree без ETL? -
когда нужно использовать внешние словари, а когда движки? (в случае выбора одного против другого)
Например, PostgresqlEngine(https://clickhouse.com/docs/en/engines/database-engines/postgresql/) vs Postgresql в external dictionary (https://clickhouse.com/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources/#dicts-external_dicts_dict_sources-postgresql)PostgreSQL | ClickHouse DocumentationPostgreSQL Allows to connect to databases on a remote PostgreSQL server. Supports read and write operations (SELECT and
-
обычно вся эта оптимизация делается для джойнов. Надо соединить много источников данных в отдном отчете. Ответ зависит от того насколько велики данные и сколько вы готовы ждать. Если запросы раз в день и ожидание в несколько минут-часов вас устраивает, то можно джойнить напрямую с таблицами в постгресе. Но если запросы идут огромным потоком, и отвечать надо быстро, то лучше сделать словарь, который живет в памяти сервера. Но памяти тогда нужно достаточное количество.
-
Но там же написано. PostgresqlEngine по сути postgres_fdw, то есть представление, не хранит данные, выполняется на лету. Postgresql в external dictionary - хранение данных в памяти или на диске (если конечно не указано direct)
-
в чем тогда разница между MaterializedPostgreSQL и Postgresql в external dictionary ?
-
ребята подскажите кто работает на mac с m1 процом, есть какие-то способы в докере или нативно завести clickhouse? не нашел готового образа на dockerhub
-
Почитайте доку. В целом то что это абсолютно разные способы получения данных из PostgreSQL.
-
CollapsingMergeTree подходит когда вы храните старую строку данных где-то ещё. Добывать её из той-же таблицы - это как тянуть себя за волосы из болота.
Если у вас всего 1 сервер для этой задачи (не кластер), то можно попробовать embeddedRockDB - там есть нормальные апдейты, и вот поверх нее уже можно сделать словари с обновлением по колонке. -
в первом случае вы читаете локальную таблицу (КХ как узел PG кластера), во втором идет обращение по сети к удаленному PG.
Но вы там поосторожнее с источниками словарей - не все способы хранения поддерживают все источники. Вот к примеру для cached - Supported sources: MySQL, ClickHouse, executable, HTTP. -
Это лучше на практике проверить, могли просто забыть добавить
-
Добрый день! Подскажите пожалуйста, можно ли как-то просто поменять engine (c ReplicatedMergeTree на ReplicatedReplacingMergeTree)? Или прийдется заниматься перекладыванием данных из старой табл в новую?
-
Спасибо за ответы
-
Понял, спасибо. Попробую с embeddedRockDB.
-
Всем привет! Как я могу сгенерировать поле id и пронумеровать записи от одного до конца в clickhouse?
-
автоинкремент?
-
-
В запросе единоразово
-
window functions?
-
select rowNumberInAllBlocks() from numbers(3);
-
👍
-
select rowNumberInAllBlocks(),
stringField0 as `case`,
stringField1 as `event`,
timeField0 as `time`
from kostya.pool_90_main
Вот так выходит -
groupArray() + arrayEnumerate
-
groupArray агрегирующая функция, как мне вставить её без подзапроса?
-
тогда не знаю. Сейчас кто-то из алтинити придет и все объяснит.
У меня работает правильно, но проверял на 1-м сервере :
select rowNumberInAllBlocks() as a,groupArray(uid) as u from table group by a having length(u) > 1; - не дает ничего.
Может быть для Distributed как-то хитрее получается и это надо учитывать. какой-нибудь hostName() -
скорее всего никак
вот пример нашел:
select g, x, n from (select g, groupArray(x) gx from ( select number%3 g, number x from numbers(10) ) group by g) array Join gx as x, arrayEnumerate(gx) as n -
А у вас таблица с каким движком? Попробуйте запрос обернуть в подзапрос и к нему применить функцию, примерно так - select rowNumberInAllBlocks(), *
from (select stringField0 as case,
stringField1 as event,
timeField0 as time
from kostya.pool_90_main) as tmp -
всем привет
нужно проверить, подходит ли какой-то элемент массива под условие like '%param%'?
Как это можно сделать,без разворачивания массива? -
SELECT arrayFilter(x -> x LIKE '%World%', ['Hello', 'abc World']) AS res;
-
-
спасибо
-
без array join,выше уже подсказали,спасибо
-
Всем привет!
В документации сказано что тип Map из Avro не поддерживается.
А может кто знает есть ли планы чтобы он поддерживался?
И кто как выходит из этой ситуации?
Использую Kafka engine чтобы переложить данные в КХ, и мне нужна та часть, что в Map лежит. -
Бывает кейс, когда после альтера таблицы не во все партиции добавляется колонка.
То-есть появляется одна - две партиции, где ругается
Missing columns: 'column' while processing query: ...
while reading from part /database/clickhouse/data/db/table/202006_12745222_14108479_43_35722274/
Кто-то сталкивался?
Как это правильно чинить? -
-
Всем привет!
Делаю вставку из селекта ремоут таблицы:
в селекте присуствуют подобные выражения:
countStateIf(event = ‘impression’) AS impressions
в таблице вставки это поле имеет тип:
impressions AggregateFunction(count, UInt64),
в итоге при вставке ошибка:
DB::Exception: Conversion from AggregateFunction(count) to AggregateFunction(count, UInt64) is not supported: while converting source column impressions to destination column clicks. (CANNOT_CONVERT_TYPE)
При этом в некоторых других забранных колонках из ремоута значится тип (count, UInt32)
С чем связано подобное поведение и возможно ли это как-то избежать? -
Ребят, столкнулся с проблемой, возможно очень тривиальная, но опыта с кликхаусом нет
Есть две идентичные таблицы со статистикой полученной из двух разных ресурсов, пытаюсь написать запрос, который получит сумму из двух таблиц, пример -
SELECT sum(impressions)
FROM google_campaign_report
JOIN amazon_campaign_report ON google_campaign_report.campaign_local_id = amazon_campaign_report.campaign_local_id
Но в итоге получаю результат только из первой таблицы, которая указана в FROM
Что делаю не так? -
предполагаю проблему с разностью типов поля campaign_local_id в таблицах
-
у тебя получается что ты суммируешь impressions только из левой таблицы
-
-
union
-
-
-
да, верная теория, спасибо большое!
-
-
-
Важно все и важен баланс, если не упираетесь в диски, то упретесь в проц. Проверяйте на своих задачах, самый верный совет.
-
Приветствую!
Не стартует служба clickhouse-server
кидает ошибку:
Application: DB::Exception: Suspiciously many (11) broken parts to remove.: Cannot attach table...
можно как то это исправить или что то сделать? -
я так понимаю данные тестовые. удалить таблицу. переделать partition by
-
приветы! ищу, как можно в CH сделать из длинной таблицы широкую, как на рисунке. подскажите, пж
-
-
👋
-
Господа, подскажите а хранить строки в КХ это нормально? или лучше переводить в числовой идентификатор? Например чтобы записать язык пользователя, использовать строки ru, en или их числовые эквиваленты ?
-
Это рабочая таблица. Было выключено питание и сервер упал, после этого КХ не стартует
-
Скиньте ддл таблицы. Интересно почему так много побилось партов.
-
Практически нет разницы, но удобнее для использования в этом случае кажется строки
-
А может кто-нибудь дать ссыль на норм материал по кликхаус как новичку? А то документация ужасна просто, правила оформления запроса не написаны
-
Если вам нужны именно запросы, то в CH практически стандартный sql, инфа из любого туториала по sql актуальна
-
Да вот, например, в кх я не могу прям в SELECT написать подзапрос
-
В пг такое могу
-
Мне бы узнать эти особенности
-
Эм, ну вообще можно
-
Да никаких нет сложностей
SELECT name, days FROM months WHERE days = (SELECT MAX(days) FROM months); -
А в какие дни? Спланировал бы поездку с Санкт-Петербурга
- 02 October 2021 (42 messages)
-
Пока ещё неизвестно, планируем конец октября, как минимум за две недели будет ясно.
-
числовые идентификаторы в разы быстрее на реальных бигдата
и никакие LowCardinality не помогут в реальной bigdata, чисто из-за перекладывания в памяти объема байт -
Привет
Подскажите, пожалуйста, как происходит применение фильтра для пользователя? Я правильно понимаю, что в фильтре просто указывается выражение, которое будет подставлено в WHERE?
Как можно посмотреть "полный" запрос который формируется CH после применения фильтра?
И в чём разница/преимущества использования Row Policies перед фильтрами?
Спасибо -
Возплльзуйтесь табличной функцией merge(), примерно так select * from merge(default,‘campaign_report')
-
так Enum же. Человеку en/ru надо хранить, а не список брендов. Enum - это как раз числа, которые вы пишите как строки. Но при добавлении новых вариантов придется сделать alter
-
-
-
Да не, я тебе не про сложность, а про особенность. Где их все найти?
-
Таблица очень широкая, 282 столбца, может из-за этого? Хотя есть таблица на 701 столбец, с ней всё хорошо.
А есть какие либо команды на проверку таблицы/партов/столбцов, что бы найти конкретный участок ? -
Для Array(LowCardinality(String)), или Map(LowCardinality(String), String), словарь будет один на парт, или один на “запись” (не в курсе, как хранятся сложные структуры в КХ)?
-
Не два. String в КХ это что-то типа blob и хранится соответсвенно с доп информацией.
Два байта это FixedString(2)
Однако Enum8 - это всего 1 байт, и столбец из миллиарда значений сожмется довольно прилично. Нет смысла этим не воспользоваться. Внутри SQL enum выглядит 'как обычная строка' -
Вообще словарей несколько на парт (если уник значений больше 8192)
> или один на “запись” (не в курсе, как хранятся сложные структуры в КХ)?
Нет, словарь общий -
Спасибо, то что нужно
-
В кх исторически можно было создавать пользователей через xml. В прошлом году добавился еще способ, через SQL. Эти способы не связаны и пользователи созданные разными способами тоже. И фильтры и роуполиси это одно и тоже но применяются они для разных типов пользователей.
К сожалению это не тоже самое что подстановка в where. Для более надежной работы проверка делается на другом уровне поэтому например индексы не используются и те же самые условия заданные в where в sql запросах могут ускорять запросы в разы.. -
Коллеги, подскажите, пожалуйста, про normalizeQuery https://clickhouse.com/docs/en/sql-reference/functions/string-functions/#normalized-query
Это набор регулярок реализованных внутри КХ или это какая-то библиотека, которую можно использовать отдельно от КХ?Strings | ClickHouse DocumentationFunctions for Working with Strings Note Functions for searching and replacing in strings are described separately. empty
-
ClickHouse/queryNormalization.h at master · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
понял, спасибо
-
Спасибо большое!)
-
тогда хотя бы partition by посмотреть бы.
бекапы/репликаци были?
можно попробовать выполнить:
>sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data
но за результат не отвечаю, лучше забекапиться перед выполнением -
ENGINE = MergeTree(EventDate,
(TVID,
TypeDataID,
dtMeasure),
8192)
TVID - String
TypeDataID - String
dtMeasure - DateTime
---
бекапы/репликаци были?
нет, не делали -
блин, это старый синтаксис. я в нём не секу. фишка в том, что нужно подбирать partition by и order by таким образом, чтобы затрагивалось как можно меньше партов, а также вставлять пачками, а не по штучно. тогда даже при внезапном отключении сервера не будет затронуто куча партов.
сейчас пожалуй остаётся только один вариант - force_restore_data. у вас много данных в этой таблице? -
Вначале строки лежит ее длина в формате leb128, т.е. для коротких строк +1 байт
-
Это нормальное поведение. Кх не синкает кеш поэтому последние инсерты при отключении питания бьются.
Есть параметр сколько сломанных партов допустимо, это тупо защита от неверных настроек. Я ставлю 150 что ли партов suspicious -
Привет) Подскажите, есть таблица около 80 млрд строк (22 колонки), хочу перелить все данные (два месяца) в новую таблицу, т.к нужно поменять партишн ключ с месяца на день.
Подойдет ли просто
insert into tableB
select * from tableA
?
Движок ReplicatedReplacingMergeTree
Версия клика: 21.9.2.17 -
У меня не получилось такое и на 100 млн строк. Партов много и инсерт валица
-
Пишут что clickhouse-copier надо, но я решил проще - перелил за 10 порций по 10 млн записей
-
а как на порции поделили?
-
По месяцам :)
-
У меня тут за 10 месяцев данные более менее равномерно
-
Примерно по 10млн в каждом
-
Insert ... Select from where startofmonth(DT)=...
-
И так 10 раз
-
С копимом сражались месяц наверное, потом плюнули и по секундам просто заинсертили
-
понял) у меня просто в месяце около 40 млрд записей. И партишн ки задан - месяц))
-
Ну сделай батничек и порции по суткам
-
Или ещё мельче :)
-
а пример можно если не сложно?
-
Сложно потому что я с планшета
-
Всем салют!
Такая дилема, учусь на 4 курсе комплексной безопасности. Все предыдущие три года работал в сфере рекламы и только сейчас понял что не хочу дальше связывать жизнь с этим, остаётся программирование.
Сам вопрос собственно в том что мне до конца этого года нужно иметь базу знаний достаточных для стажёра, подскажите пожалуйста к какой специальности стоит присмотреться? Я сижу читаю но ничего не могу выбрать, так как вообще не интересовался этим все это время обучения. Их навыков, совсем немного знаю питон. -
А почему такой ник странный, хочется забанить
-
Рабочий аккаунт
Все норм) -
@it_chats тут можешь поискать профильные чаты
- 03 October 2021 (25 messages)
-
Подскажите куда копать? На вид что-то рекурсивное.
Есть таблица с ключами таски, временем таски, и связными ключами-тасками:
key time linked
ISD-1 1 [IMD-1;IMD-3]
IMD-1 1 [IMD-2]
IMD-2 1
IMD-3 1
я хочу получить суммарное время потраченное на каждую таску. Для этого мне нужно просуммировать time самой таски и добавить сумму времени для всех вложенных. Должно получиться так:
key time
ISD-1 4
IMD-1 2
IMD-2 1
IMD-3 1
Хотелось бы, чтобы ограничений по вложенности не было, но если никак, то можно ограничить. -
Хотел обойтись простым ArrayJoin разворотом, с последующей групировкой и джойном. Но в таком случае получается только 1 уровень вложенности.
А тут мы видим кейс, где IMD-1 для ключа ISD-1, имеет вложенность 2 -
-
я бы попробовал сделать из этой таблицы иерархический словарь, и воспользоваться функцией dictGetDescendant
-
Звучит как хорошее решение, спасибо
-
Ни кто не обратил внимание, что новая версия dataGrip перестала создавать скрипт создания materializedview? Раньше создавала, но с ошибками синтаксиса, а сейчас вообще перестала. Только первую строку выводит. В связи с чем вопрос, как сгенерить скрипт для создания matview, в какой системной таблице хранятся служебные данные об этом?
-
SHOW CREATE mv_name
-
Спасибо ) Но вопрос с Datagrip открыт, может кто знает как настроить чтобы он сам скрипты генерил корректно
-
Коллеги, подскажите пожалуйста:
имеется две таблицы mergetree, без указанной партиции (пробовал с / без), через curl записываю потоком данные в каждую, но по какой-то причине часть данных не записывает в КХ без информирования об какой-либо ошибки -
Пишу курлами из под node приложения, где перед пушем вывожу все, что пушу, дабы сверить что приложение корректно строит инсерты
-
Куда копать?
-
Привет всем. Подскажите как в функцию extractAllGroupsVertical добавить флаги, например IgnoreCase. Вот пример из документации SELECT extractAllGroupsVertical('abc=111, def=222, ghi=333', '("[^"]+"|\\w+)=("[^"]+"|\\w+)') —- подсовываю i перед последней кавычкой — результат становится пустой.
-
там же где и при работе с любым другим софтом - логи ошибок, например /var/log/clickhouse-server/clickhouse-server.err.log
-
Посмотрите на ключ сортировки и настройку слияние во время инсерта, не помню название что-то наподобие optimize_on_insert. Есть подозрение что у вас несколько записей попадают под один ключ сортировки и движок производит слияние
-
У меня там дата используется, соответственно для многих записей она одинаковая
-
А чем грозит отключение оптимизации при инсерте?
-
У вас академический интерес или проблему решить хотите? Если проблему то рекомендую сменить ключ сортировки, а если интерес то просто слияния не будет движок делать пытаться при инсерте, но сделает их позже в фоне или при отправке Команды optimize table …
-
Спасибо
-
-
SOURCE (CLICKHOUSE(PORT 9000 USER 'default' PASSWORD 'root' DB 'europa' TABLE 'items_new')) LIFETIME (MIN 300 MAX 360) LAYOUT (COMPLEX_KEY_HASHED())
-
спасибо! но мне походу надо знать user и password в любом случае?(
-
Естественно)
-
-
ага понял, значит не судьба самому, придется коллег просить) спасибо еще раз!
-
Как в Clickhouse получить совпадение по URL, в целом не сложно. А что, если есть набор regexp'ов, по которым хочется получать количество попаданий?
Например, URL вида /api/user/1234/profile попадёт под regexp /api/user/\d+/profile. Но я хочу count() и потом GROUP BY по таким regexp'ам. - 04 October 2021 (119 messages)
-
А в чем проблема сделать extract(url,regexp), count()?
-
Всем привет!
В документации сказано что тип Map из Avro не поддерживается.
А может кто знает есть ли планы чтобы он поддерживался?
И кто как выходит из этой ситуации?
Использую Kafka engine чтобы переложить данные в КХ, и мне нужна та часть, что в Map лежит. -
Всем привет.
Подскажите, как по-русски называется compaction sstable-ов в clickhouse?
Где-то слышал, что если compaction вырастает до 100, то clickhouse замедляется, а если до 200, то перестаёт обслуживать. Не могу найти, где услышал такое. Хочется понять, на сколько авторитетные эти заявления и можно ли им верить. -
ну вообще это называется
как таковых sstable из LSM в clickhouse нет
но да, внутреняя структура это разреженный индекс
по русски это будет bacground merge или фоновое слияние
там прямо реально сортировка слиянием идет в этот момент
clickhouse замедляется когда data parts много на один partition, это да
это возникает от кривых паттернов вставки (мелкие батчи) -
https://github.com/ClickHouse/ClickHouse/issues/18925
https://github.com/ClickHouse/ClickHouse/pull/10502Add support of complex structures to Avro/AvroConfluent formats · Issue #18925 · ClickHouse/ClickHouseUse case There is currently no way to access the array of records in Avro. For example data: {"a": 1, "b": [{"c": 100, "d": &...
-
А в документации про это где-то есть? Или может видео, где это рассказывается?
-
ClickHouse: как устроен MergeTree
Моя команда использует ClickHouse как хранилище для 100 млрд записей с трафиком по 300 млн в сутки и поиском по таблице. Я расскажу об устройстве движка таблиц M...
-
ClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altin…
Presented at ClickHouse October Meetup Oct 9, 2019
-
> Дело в том, что ClickHouse сортирует вставляемые строки в оперативке с использованием красно-чёрного дерева, и время от времени сбрасывает его на диск в виде immutable дата-парта.
Эмм... там memstore есть? вроде бы небыло же) -
при вставке данные сортируются имеется ввиду
-
Окей. Спасибо. Извините, что мучаю вопросами)
Непонятно, зачем для сортировки именно rbtree использовать, когда можно просто посортировать и сложить на диск. Я бы rbtree использовал как раз для memstore) -
Добрый день)
подскажите, что за причина такой ошибки (смотрю в system.errors):
Cannot open file /var/lib/clickhouse/store/c0a/<uuid>/zeros_mt.sql, errno: 2, strerror: No such file or directory
за неделю накопилось 1к -
-
TTL?
-
-
да
-
https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/mergetree/#mergetree-table-ttlMergeTree | Документация ClickHouse
MergeTree Движок MergeTree, а также другие движки этого семейства (*MergeTree) — это наиболее функциональные движки табл
-
Спасибо большое . не заметил этого в доке
-
"просто отсортировать" это как? ;)
quicksort ? ;) -
К примеру)
Вы хотите сказать, что невыйдет?) -
=) нет, просто хочу сказать что алгоритмы сортировки разные и некоторые лучше подходят для вставки
не уверен что в статье на хабре замечание про красно-черные деревья актуальное
я сам не знаю что именно там ;)
бегло пробежал по исходникам, по названиям классов не видно -
всем привет, а не подскажите, как эффективные реализовать запрос
есть таблица в которой есть показы рекламы и платежы.
Нужно найти какой был показ перед платежом
+-------------------+----------+--------------------------------+-----+----+
|date |promo_type|uid |shows|deps|
+-------------------+----------+--------------------------------+-----+----+
|2021-10-01 19:12:08|bn |ab327f93d15cd2e7fb6cbd3c4902d188|0 |1 |
|2021-09-30 17:00:00|branding |ab327f93d15cd2e7fb6cbd3c4902d188|1 |0 |
|2021-09-30 17:00:00|ma |ab327f93d15cd2e7fb6cbd3c4902d188|1 |0 |
|2021-09-30 17:00:00|bn |ab327f93d15cd2e7fb6cbd3c4902d188|1 |0 |
|2021-09-30 17:00:00|ma |ab327f93d15cd2e7fb6cbd3c4902d188|1 |0 |
|2021-09-30 17:00:00|va |ab327f93d15cd2e7fb6cbd3c4902d188|1 |0 |
|2021-09-30 17:10:00|bn |ab327f93d15cd2e7fb6cbd3c4902d188|0 |0 |
|2021-09-30 17:10:00|ma |ab327f93d15cd2e7fb6cbd3c4902d188|1 |0 |
|2021-09-30 17:10:00|branding |ab327f93d15cd2e7fb6cbd3c4902d188|1 |0 |
|2021-09-30 17:20:00|branding |ab327f93d15cd2e7fb6cbd3c4902d188|2 |0 |
|2021-10-02 11:20:00|ma |ab327f93d15cd2e7fb6cbd3c4902d188|1 |0 |
|2021-09-30 19:00:00|branding |ab327f93d15cd2e7fb6cbd3c4902d188|1 |0 |
|2021-10-02 16:20:00|ma |ab327f93d15cd2e7fb6cbd3c4902d188|1 |0 |
|2021-09-30 13:28:14|bn |ab327f93d15cd2e7fb6cbd3c4902d188|0 |1 |
+-------------------+----------+--------------------------------+-----+----+ -
Привет всем. Кто-нибудь сталкивался с такой ошибой? Гугл ничего не показывает. "Cannot enqueue query on this replica, because it has replication lag of 15 queries" CREATE TABLE db.table
(
col1 DateTime,
col2 UUID,
col3 UUID,
col4 UUID,
col5 UInt32,
col6 UInt32
) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/table_name', '{replica}')
PARTITION BY toYYYYMMDD(col1)
ORDER BY (col1, col2, application_id)
Движок БД Replicated
Изначально я выполнил данных запрос, но не на тех бд, далее я удалил эти таблицы, хочу создать в новой бд, но получаю ошибку -
вы когда удаляли DROP TABLE ... SYNC использовали?
движок БД какой ? Atomic или Ordinary? -
-
-
путь который указываете в ReplicatedReplatingMergeTree - это путь в ZK
ошибка означает что вам там на эту реплику для заданного пути ZK валятся возможно distributed DDL запросы -
Ordinary это движок БД
Replicated* это движок ТАБЛИЦЫ
SELECT * FROM system.databases FORMAT Vertical посмотрите вашу БД в которой удаляли что там стоит? -
На которой удалял изначально Ordinary, на нужной Replicated
-
Replicated | Документация ClickHouse
[экспериментальный] Replicated Движок основан на движке Atomic. Он поддерживает репликацию метаданных через журнал DDL,
-
Новые видео про ClickHouse:
https://www.youtube.com/watch?v=_4HdQqR4kZQ
https://www.youtube.com/watch?v=qcKwkmzwM_E
https://www.youtube.com/watch?v=GW07RZVpH4M
https://www.youtube.com/watch?v=VrTsxMcX4ZA
https://www.youtube.com/watch?v=MyMl3NN13HQ
https://www.youtube.com/watch?v=td541Uo1EKQ
https://www.youtube.com/watch?v=iOXyKRmUxb8Сегодня я помержил в ClickHouse 30 пул-реквестов, а он всё ещё не тормозит / Александр КузьменковПриглашаем на Saint HighLoad ++ 2021 20 и 21 сентября 2021, Санкт-Петербург, DESIGN DISTRICT DAA in SPB Программа, билеты и подробности - https://clck.ru/VmKaW -------- HighLoad++ Весна 2021 Крупнейшая профессиональная конференция для разработчиков высоконагруженных систем 17 и 18 мая 2021. Москва, Крокус-Экспо Тезисы и презентация: https://www.highload.ru/spring/2021/abstracts/7229 Не тормозить — основное продуктовое качество ClickHouse, которое возникает как результат целостной работы по многим направлениям: подходящих архитектурных решений, алгоритмической оптимизации, и небольшого количества связующей магии. За последний месяц в основную ветку ClickHouse добавилось 650 самостоятельных изменений — всевозможные улучшения, новая функциональность, исправления багов. Как при такой скорости разработки не потерять достигнутого? Ответ известен: автоматические тесты. Любое важное продуктовое качество необходимо тестировать, чтобы не потерять его в постоянном потоке изменений. ... -------- Нашли ошибку в видео?…
-
Существуют Replicated базы данных.
-
простите да запамятовал
ну смотрите, Replicated это Atomic у которого все DDL - это replicated_ddl
на Ordinary должно нормально чистить ZK -
Всем привет! Я удалил кликхаус, но базы данных по прежнему остались, как их можно удалить не через кликхаус?
-
вы имеете ввиду данные остались в /var/lib/clickhouse?
ну удалите просто rm -rf /var/lib/clickhouse -
Да, спасибо!
-
Спасибо !
-
-
Ребят как можно посмотреть подхватывается ли партицирование при фильтрации по некоторому полю? есть ли что-то наподобие explain в клике?
-
Есть прям EXPLAIN 🙂
-
Привет тут выше был уже вопрос.
clickhouse-client куда-то в сторону aws выдаёт
Code: 210. DB::NetException: SSL Exception: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED (host:post). (NETWORK_ERROR)
openssl s_client -connect host:port туда же вроде всё ок показывает
Куда копать? -
EXPLAIN | ClickHouse Documentation
EXPLAIN Statement Shows the execution plan of a statement. Syntax: EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting = v
-
#вакансия #архитектор #presale #удаленно
Вакансия: Технический Pre-sale консультант/ Архитектор
Город: Москва (м.Алексеевская) или удаленно
Компания: Arenadata https://www.youtube.com/watch?v=RKZ7Chty98Y&t=38s
Заработная плата: от 300 тыс. руб. на руки и выше
Arenadata – российский разработчик платформы управления данными. Мы являемся одним из крупнейших коммитеров и вносим вклад в развитие таких проектов как: Greenplum, Clickhouse, Kafka, Hadoop, Big Top.
Что нужно делать:
✔️ в части заказчиков: выполнять демонстрации продуктов, собирать потребности, консультировать. На этом этапе помогут сейлы.
✔️ в части архитектурных решений: разрабатывать, рассчитывать программные и аппаратные конфигурации. На этом этапе помогут инженеры.
Мы ждем, что вы:
✔️ имеете опыт развертывания и решения задач DWH;
✔️ имеете опыт проектирования или использования промышленных решений на Greenplum, ClickHouse, Hadoop, или Teradata, Netezza, Vertica, Exasol, Snowflake, Hive, Impala;
✔️умеете общаться с людьми (начиная от инженеров, заканчивая руководителями компаний).
Условия:
- официальное трудоустройство по ТК РФ с 100% белой зарплатой;
- возможность работать удаленно или в офисе (на выбор), гибкий график;
- возможность развивать свои компетенции и экспертизу, компания оплачивает: книги, курсы, тренинги, сертификацию, конференции;
- заботимся о вашем здоровье: расширенный ДМС со стоматологией, полная оплата больничного до уровня месячного дохода (независимо от стажа и срока работы в компании);
- обеспечиваем техникой, необходимой для продуктивной и комфортной работы;
- корпоративная скидка на изучение английского.
✉️ Писать можно в телеграм @pankina_hr или на почту poe@arenadata.ioКорпоративная платформа данных Arenadata Enterprise Data Platform (EDP)Данные трансформируют мир и лежат в основе AI-экономики. Arenadata Enterprise Data Platform, разработанная на основе передовых Open Source технологий, обеспечит быстрое, масштабируемое и отказоустойчивое управление данными для цифровой трансформации любого бизнеса или государственной организации. Платформа предусматривает полный цикл управления данными - от хранения до предикативной аналитики. Подробнее в нашем видео.
-
У меня Syntax error
-
Версия КХ ?
-
version 20.1.16.120
-
-
Это прям в КХ в запросе прописать?
-
-
Я в dbeaver
-
да прям в запроск
-
-
Че то не работает
-
Как-то можно исправить?
-
-
-
-
-
Привет.
Ребята которые занимаются k8s оператором для ClickHouse.
Будет ли в будущем возможность вместо ZooKeeper использовать ClickHouse Keeper? -
Есть столбец с LowCardinality(String). Почему select count(distinct value) from <table> все равно ведет к достаточно длительному сканированию, разве недостаточно прочитать словари из партов и посчитать значения там?
-
Или эта оптимизация просто не реализована?
-
Скорее всего не сделано
-
Значимых не должно
-
Да, мы собираемся.
Впрочем я думаю даже сейчас можно уже попробовать так запускать -
ch keeper был сделан как drop in замену zookeeper, так что пока не будет переписан ch keeper на новый протокол, все должно работать
-
да в принципе ничео сложного и сейчас нет
надо только понять как clickhouse keeper запускать в режиме statefullset
и как его мониторить -
А как через оператор подкинуть ему keeper_server опции?
-
Ну тут вопрос к размеру кластера.
clickhouse-keeper имеет смысл крутить в 3 ноды.
Те если у вас кластер из 10 нод, то на каждом поде запускать кипер смысла нет. -
Ну у меня кластер 2 на 2 (2 шарда по 2 реплики)
-
Мб можно просто запустить дополнительный кластер ch, который будет действовать как ансамбль zookeeper
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-zookeeper/clickhouse-keeper/ -
Пока выглядит как велосипед 🙂
Лучше конечно дождаться релиза этого в операторе с описание и примером.
Я думал может есть какой-то roadmap по оператору -
Добрый вечер!
Может кто сталкивался с подобным и может объяснить почему происходит такая разница в результатах запросов с и без FINAL:
---------------------------------------------------------------------------------------------------------------------
>> select column 0 from FinalExperiment where id < 3
SELECT column 0
FROM FinalExperiment
WHERE id < 3
Query id: 20c39483-6420-446b-a19a-6a76501e609e
┌─column 0─┐
│ E36KM │
│ 5MzxQDl │
└──────────┘
>> select column 0 from FinalExperiment FINAL where id < 3
SELECT column 0
FROM FinalExperiment
FINAL
WHERE id < 3
Query id: 555ee824-08f3-4847-9228-a6e8cfe392cd
0 rows in set. Elapsed: 0.006 sec.
---------------------------------------------------------------------------------------------------------------------
**во время тестирования никакой вставки не происходит, таблица не меняется
То же самое происходит если запрашивать count(*) -
-
нет, все уникально сейчас, я специально это проверяла
--------------------------------------------------------------------------------
SELECT count(*)
FROM FinalExperiment
┌─count()─┐
│ 100000 │
└─────────┘
-----------------------------------------------------------------------------------
SELECT countDistinct(id)
FROM FinalExperiment
┌─uniqExact(id)─┐
│ 100000 │
└───────────────┘ -
см.kubectl explain chi.spec.configuration.files
-
нет, я бы лучше отдельно clickhouse-keeper через StatfulSet запустил
по аналогии с текущим ZK
хотя конечно тут смотря какой паттерн поведения
будет ли clickhouse keeper отжирать ресурсы у clickhouse на диск -
Это я уже увидел, но остаются вопросы.
Как clickhouse keeper запускать в режиме statefullset и как его мониторить
То собственно о чём Вы и писали -
ну присылайте DDL таблицы
-
Это не вызывает вопросов.
Вопросы вызывает, будет ли поддержка zookeeper в течение длительного периода времени. Скажем, в течение жизненного цикла проектируемых сейчас продуктов.
К примеру, уже сейчас м.б. понимание, что каких-то возможностей ZK не хватает, и в прогнозируемом будущем произойдет отказ от него. -
а покажите как создана таблица? Если у вас collapsing то запись могла не схлопнуться и countDistinct вам выдаёт больше чем есть на самом деле
-
-
чем вставляете?
и в каком формате? -
из CVS в таблицу где поле String
-
а какой язык программирования? или clickhouse-client напрямую?
-
Напрямую через input
-
какая версия clickhouse?
-
-
скорее всего бага в datagrip
попробуйте вставить через clickhouse-client напрямую -
clickhouse-client -mn --echo -q "DROP TABLE IF EXISTS default.t1; CREATE TABLE default.t1(s String) ENGINE=MergeTree() ORDER BY s;"
echo '79272518314' | clickhouse-client -mn --echo -q "INSERT INTO default.t1 FORMAT CSV"
clickhouse-client -mn --echo -q "SELECT * FROM default.t1"
никаких преобразований нет -
Есть ли в КХ функция, которая удаляет элементы MAP по ключу. Т.е. принимает набор ключей и возвращает MAP без них, если они есть.
-
попробовала через клиент, все равно воспроизвелось
-
Set send_logs_level='debug'
-
Попробую завтра, спасибо
-
через lambda фукнции наверное можно провернуть
покажите команду как вставляли?
с данными -
что-то хотел сказать "используйте lambda"
но попробовал сам и что-то приуныл =( -
Версия кх?
-
В бивере никак. Только клиент
-
В далеком будущем исчезнет. Через годы
-
Ок, спасибо.
-
Что такое клиент?
-
21.7.7.47
-
cli тулза. clickhouse-client
-
Ещё один баг видимо.
-
они разве продавались? Скоро митап, там видимо
-
недостаточно. Чтобы проверить условия и row policy надо прочитать не только словарь
Т.е. разговаривали о том чтобы сделать типа функцию чтобы читать из значения из словарей, но там опять заморочки с правами. -
Что такое Row policy?
-
т.е. если выбирать не column 0 то результат другой ?
-
ROW POLICY | ClickHouse Documentation
CREATE ROW POLICY Creates a row policy, i.e. a filter used to determine which rows a user can read from a table. Warning
-
Что такое row policy? (я узнаю, и стану немного умнее)
-
ну я не буду документацию пересказывать
-
Я думал, это что-то внутреннее, часть движка. Погуглил, посмотрел, спасибо.
-
Более практический вопрос. На сервере очень много оперативки (300+ГБ), есть таблица в районе 200ГБ с кодеками, 5ТБ без. Исполняется достаточно много запросов, и по ключу выборки, и на полное сканирование, но почему-то UncompressedCacheSize в районе пары гигабайт.
-
Стоит use_uncompressed_cache = 1. Я собираюсь играться с merge_tree_max_[bytes|rows]_to_use_cache, но может надо куда-то еще смотреть?
-
Стоит
<uncompressed_cache_size>38654705664</uncompressed_cache_size>
<mark_cache_size>38654705664</mark_cache_size>
+
<max_memory_usage>77309411328</max_memory_usage> // Это наверное можно грохнуть, судя по коду
<max_memory_usage_for_all_queries>231928233984</max_memory_usage_for_all_queries>
Версия 21.3.13 -
SELECT
metric,
formatReadableSize(value)
FROM asynchronous_metrics
WHERE metric LIKE 'UncompressedCacheBytes'
ORDER BY value DESC
┌─metric─────────────────┬─formatReadableSize(value)─┐
│ UncompressedCacheBytes │ 1.24 GiB │
└────────────────────────┴───────────────────────────┘ -
Добрый день. В логах клика записи отображаются в нехронологическом порядке. Есть некоторые записи на несколько секунд раньше или позже (см. скрин). Заметил случайно сегодня, когда изучал причину замедления запросов в конкретный момент времени. Кто-нибудь сталкивался с таким? Что бы это значило?
Причем, до определенного момента хронология четкая, и после тоже стало все норм... -
Попробуйте detach/attach этих партиций.
-
фигней вы занимаетесь. Надо разбираться почему тормозит потом улучшать, а не крутить ручки которые делают все только хуже.
-
кто-то вызывает show create table system.zeros_mt
ищите в логе КХ кто это делает
ааа, я нашел, это usability issue
это select * from system.tables;
просто zeros_mt самая последняя по алфавиту
https://github.com/ClickHouse/ClickHouse/issues/29754system.errors FILE_DOESNT_EXIST initated by system.tables.create_table_query · Issue #29754 · ClickHouse/ClickHouseselect name, value, last_error_message from system.errors where name = 'FILE_DOESNT_EXIST'; 0 rows in set. Elapsed: 0.001 sec. select * from system.tables format Null; select * from...
- 05 October 2021 (237 messages)
-
Clickhous подойдет для хранения пар: метка времени(datatime) - значение(float)?
-
Каждые 5 секунд необходимо сохранять около 5 тыс таких пар
-
Так это же time series. Попробуйте использовать time series бд.
-
cat ok_phones_2.csv | clickhouse-client -h ch12345 --query "INSERT INTO temp.ok_phones SELECT * from input('ok_phone String') FORMAT CSV"
-
Например?
-
Я не нашел бесплатную работающую под windows
-
-
Открыт код VictoriaMetrics, СУБД для временных рядов, совместимой с Prometheus
https://www.opennet.ru/opennews/art.shtml?num=50745Открыт код VictoriaMetrics, СУБД для временных рядов, совместимой с PrometheusОткрыты исходные тексты VictoriaMetrics - быстрой и масштабируемой СУБД для хранения и обработки данных в форме временного ряда (запись образует время и набор соответствующих этому времени значений, например, полученных через периодический опрос состояния датчиков или сбор метрик). Проект конкурирует с такими решениями, как InfluxDB, TimescaleDB, Thanos, Cortex и Uber M3. Код написан на языке Go и распространяется под лицензией Apache 2.0.
-
Чат по ней https://t.me/VictoriaMetrics_ru1VictoriaMetrics_ru
Обсуждаем VictoriaMetrics https://victoriametrics.com https://kutt.it/GithubVM https://kutt.it/VM-CHANGELOG https://kutt.it/VM-alerts https://kutt.it/VM-cluster-alerts https://kutt.it/k8s-guides
-
Из винды же получится запустить базы которые работают на linux?
-
Подскажите как создать внешний словарь с сорсом в виде таблицы(CH) в этой же базе без прописывания юзера и пароля?
А то ведь получается в DDL всё видно будет. И пароль и юзера, или я что-то путаю? -
Или параллельный вопрос. Можно ли делать трансформацию внутри объявления словаря при
ENGINE = URL
Например такое:
CREATE TABLE internal_analytics.name
(
`id` Nullable(String),
ArrayJoin(`id_2`) Nullable(String)
)
ENGINE = URL('https://...', 'CSVWithNames')
———
что-то мне подсказывает, что нет -
Либо через xml, либо не давать пользователям права на show / create dictionary
-
А трансформации?
-
expression
-
там одна колонка что-ли в CSV ?
-
ага...
-
там id-родительский и массив дочерних. Нужно arrayJoin-ом развернуть это и сделать иерархический словарь
-
чта?
-
=D
-
id_key lincked_issue
ISD-1 [IMD-1;IMD-2]
ISD-2 [IS-3] -
вы не туда отвечаете, два треда запутали, внимательнее надо
-
это до КХ надо сделать, если источник URL('https://
у вас где данные лежат? Почему вы и про КХ как источник и про URL? -
а версия КХ какая?
-
пытаюсь понять какой путь лучше выбрать. Но я вас понял: либо в источнике трансформировать, либо в кх и как-то закрывать креды в SOURCE
Спасибо -
ну и можно сделать пользователя без пароля и разрешить ему ходить только c localhost
-
ClickHouse 21.7.5.29
-
а зачем input function ? если просто insert format CSV то тоже проблема?
-
Приветствую, как можно вставить данные из PG в CH (Таблица большая)
-
PostgreSQL | ClickHouse Documentation
PostgreSQL The PostgreSQL engine allows to perform SELECT and INSERT queries on data that is stored on a remote PostgreS
-
попробовала, такая же ситуация
-
а в CSV много строк?
-
~10M
-
а что показывает команда file ok_phones_2.csv
-
-
а SQL
desc temp.ok_phones -
DESCRIBE TABLE temp.ok_phones
Query id: 9cfe703f-9d89-4dc5-ac1e-d886deffc804
┌─name─────┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ ok_phone │ String │ │ │ │ │ │
└──────────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
1 rows in set. Elapsed: 0.044 sec. -
а вот эта
cat ok_phones_2.csv|grep 79272518314|hexdump -C -
-
а format TSV тоже самое?
-
в смысле поменять расширение?
-
нет
cat ok_phones_2.csv| clickhouse-client -h ch12345 --query "INSERT INTO temp.ok_phones FORMAT TSV" -
для одной колонки не важно TSV или CSV, файл одинаковый
-
-
а точно в файле нету 12012010166 ?
cat ok_phones_2.csv|grep 12012010166 -
блин, есть
-
-
-
-
в таблице будет не такой порядок строк как в файле.
и это правильно. -
-
а ну вот опередили вопрос
-
select без orderby выдает строки в рандомном порядке
-
вы можете отсортировать файл
cat ok_phones_2.csv|sort > ok_phones_2_sorted.csv
тогда порядок в файле ok_phones_2_sorted.csv будет совпадать с select * from .table. order by phone -
сейчас попробую
-
-
Wsl не пробовали?
-
Уже пробую )
-
У меня создалось, и работает. SOURCE (CLICKHOUSE(
DB 'test'
TABLE 'test_table'))
LIFETIME (MIN 10 MAX 20)
LAYOUT (HASHED) -
Не получиться. я делаю представление (обычное view), в нем логика запроса например, и всякие преобразования - а к нему делаю словарь.
-
спасибо, за информацию. Я ещё не успел поэкспериментировать.
-
а зачем тут SELECT *?
можно просто FORMAT CSV
SHOW CREATE TABLE temp.ok_phones;
покажите?
но все равно не воспроизводится
echo '79272518314' > ok_phones_2.csv
clickhouse-client -mn -q "CREATE DATABASE temp; CREATE TABLE ok_phones(ok_phone String) ENGINE=MergeTree() ORDER BY ok_phone;"
cat ok_phones_2.csv | clickhouse-client --query "INSERT INTO temp.ok_phones SELECT * from input('ok_phone String') FORMAT CSV"
смотрите в свои данные -
-
Спасибо!
-
Всем привет. А не подскажете какие подводные камни есть при использовании движка kafka в реплицированной базе и вообще можно ли так делать?
-
Там булыжник огромный))) лучше не делать
-
Всем привет! Кто-нибудь использовал движок MaterializedPostgreSQL?
Настроил репликацию в postgres
wal_level = 1
max_replication_slots = 10
replica identity = full
Создал юзера с правами на чтение
Но почему-то при создании коннекта не реплицирует
CREATE DATABASE IF NOT EXISTS test_postgres
ENGINE = MaterializedPostgreSQL('host:5432', 'postgres', 'replica_user', 'pass')
SETTINGS materialized_postgresql_tables_list = 'my_table'; -
А чуть больше информации можно?) Мы попробовали и кажется уронили кластер этим движком. Упал на алокации памяти. Вот интересно куда копать. Но я так понимаю копать не стоит и просто руками переливать из кафки в кх?
-
Именно. Лучше взять управление на себя.
-
Понял, спасибо
-
У нас работает. 21.3, что я делаю не так?
-
Мы используем. Вполне успешно.
Есть проблемы с дублированием записей, которые решаются правильными запросами с дистинктами. -
Сначала у всех работает, особенно в простых сценариях. Но я никого ни от чего не отговариваю, я к тому, что нужен хороший опыт и понимание этих двух технологий для безпыльной эксплуатации.
-
При использовании движка
ENGINE = PostgreSQL
Я создаю таблицу, которая общается и подтягивает данные из postgres
Если без репликации я буду проводить агрегацию, на чем это может сказаться? -
Поделитесь вашим отрицательным опытом, не будет лишним.
-
Ок, у нас там некритичное. Раньше был 19.15, после обновления стало лучше (очереди меньше), главное интервал флаша 100мс не ставить, база инсерты режектит по кол-ву партов
-
Мы не стали развивать у себя эту функциональность, сразу пошли по более управляемому пути: написали несложное приложение консюмер, нужно быстрее - добавляем N инстансов, нужно стопнуть чтение - убиваем апликуху, почти полная прозрачность и управляемость пррцессом.
-
Количество сообщений/топиков/объём данных?
-
5k rps/10/~2тб в кх
-
Привет, пытаюсь юзать табличную функцию для доступа к мсскл базе odbc('DSN=...;UID=...;PWD=...;Database=...', '...', '...');)
конфиг odbc.ini заполнен
на любой запрос пишет что
[FreeTDS][SQL Server]Database '...' does not exist. Make sure that the name is entered correctly
Если вбить неверный пасс, то пишет ошибку о неверном пароле, тоесть до базы доходит -
попробуйте официальные драйвера ODBC от Microsoft вместо FreeDTS
вот тут
https://gist.github.com/Slach/9f9449a722091a13a9069b79f8dc7da7
я сделал стенд для всех крупных БД
проблемы были только для Oracle
с табличной функцией...clickhouse with odbc, for docker-compose and kubernetesclickhouse with odbc, for docker-compose and kubernetes - Dockerfile
-
Коллеги, возможно вам будет интересно
https://habr.com/ru/post/581586/Учим Kibana работать с Clickhouse (Ярослав Саган, Николай Нестеренко)Сотрудники ECOMMPAY IT Ярослав Саган и Николай Нестеренко на конференции HighLoad++2019 рассказали об архитектурном решении для компактного хранения логов в ClickHouse. На основе их доклада я...
-
интересно да. только в проект год никто не коммитил =\
-
просто никто про проект не знал.. наверное
-
потмоу что все работает 😎
-
комитят там где все плохо
-
Эксперимент с фуллтекст поиском на Clickhouse был признан неуспешным и в прод не пошёл
-
Добрый день. Попробовал в новой версии (21.9.4.35) пользовательские функции, не работают. Пример из документации возвращает ошибку. Может какие-то настройки нужно включить ?
-
Это доступно с 21.10, насколько я вижу: https://clickhouse.com/docs/ru/whats-new/changelog/2021 | ClickHouse Documentation
ClickHouse release v21.10, 2021-10-16 Backward Incompatible Change Now the following MergeTree table-level settings: rep
-
Про 21.10 здесь нет ни слова: https://clickhouse.com/docs/ru/whats-new/changelog/
И дистрибутива еще нет здесь: https://repo.clickhouse.tech/deb/stable/main/
И в других ветках (testing, prestable) тоже не нашел2021 | ClickHouse DocumentationClickHouse release v21.10, 2021-10-16 Backward Incompatible Change Now the following MergeTree table-level settings: rep
-
-
Странно, у меня по той же ссылке в документации другая страница:
-
У меня по-русски без 21.10, а по-английски с ней
-
У меня только по японски 21.10 😁
-
-
на сайте вижу 21.10 , но действительно еще нету deb пакетов )
-
Спасибо! действительно данные такие, извините за беспокойство
-
дак а в чем проблема то была?
=) откуда вы взяли что у вас преобразование строки случилось? -
да меня смутил коллега, начал бить тревогу
-
-
Не знаю как вы ищете, я нашел пакеты deb 21.10, поставил локально, все ок, даже пользовательские функции есть. Как и документация уже кстати. Правда функции не совсем те что ожидалось - можно использовать выражения, операторы и другие функции. Можно правда грязно хакать - например используя функции словарей или merge, подставляю регулярку точно указывающую на конкретную таблицу ;)
-
ну так вы сделайте gist.github.com с грязными хаками =) это ж круто когда есть возможности о которых другие не знают
-
деб пакеты есть в testing репозитории для 21.10
в докере только stable deb представлены
https://clickhouse.com/docs/en/getting-started/install/ -
Коллеги, если импортировать данные из json, то весь json будет как строка в 1 колонке или разобьется по колонкам?
-
Смотря как импортировать
-
Среди них есть множество вариаций JSON, но чаще всего для импорта данных используют JSONEachRow: один JSON-объект в строке, каждый объект с новой строки.
-
Вот это читали? Там и про вставку есть https://clickhouse.com/docs/en/interfaces/formats/#jsoneachrowInput and Output Formats | ClickHouse Documentation
Formats for Input and Output Data ClickHouse can accept and return data in various formats. A format supported for input
-
Читал. Но так как я с CH не работал. гуглил в других местах, например https://dba.stackexchange.com/questions/268997/clickhouse-create-database-structure-for-json-dataClickhouse create database structure for json data
New to clickhouse and stuck on the database creation structure for importing json data which is nested Take for example the json data that looks like the following when there is data populated "
-
Вот пакеты - https://github.com/ClickHouse/ClickHouse/releases/tag/v21.10.1.8009-testing
Вот Дока - https://clickhouse.com/docs/ru/sql-reference/statements/create/function/Release v21.10.1.8009-testing · ClickHouse/ClickHouseClickHouse testing release v21.10.1.8009-testing
-
Как хотите, так и будет
https://kb.altinity.com/altinity-kb-schema-design/altinity-kb-jsonasstring-and-mat.-view-as-json-parser/ -
Не знал что так можно =), спасибо - сделаю.
-
Коллеги! Подготовил данные и загрузил их в таблицу из файла! Залетело не просто быстро, а очень быстро! Пишу чисто похвастаться 😀😀😀
-
Привет всем
Есть storage policy на 2 диска
Нужно поменять один из дисков, где почитать как перенести данные на другой диск или забекапить их как-то? -
-
спасибо, ознакомлюсь
-
Есть партиционированная таблица (`PARTITION BY toYYYYMM(date)`). Поверх этой таблицы построено множество MV, которые по сути просто агрегируют данные, которые вставляются в эту таблицу. Нужно поменять ключ партиционирования у этой таблицы. Данные в самой таблице ценности не имеют (я могу сделать `ALTER TABLE … DROP PARTITION`), но вот MV, которые были построены поверх этой таблицы нужны. Можно ли поменять схему партиционирования таблицы не пересоздавая ее ?
-
-
вопрос, вроде есть документация по регуляркам, но не поддерживается [A-Z] и \u как в регулярку добавить upper case?
-
-
Это стандартная засада КХ, надо делать МВ тоже реплицируемым.
-
-
-
16 страница и дальше
-
-
таблица никак не связана с другими таблицами. Можете хоть удалить её, можете создать с Engine=Null. MV - это insert trigger.
-
-
Вопрос по доступам
У меня есть роль с набором доступов
Эта роль присвоена ~30 пользователям
Даю ей новый доступ на чтение
GRANT SELECT ON appsflyer.* TO analyst;
Но доступ появляется не сразу, а через неопеределенный промежуток времени больше 20 минут
Помогите, пожалуйста
Почему он может не сразу появляться? Есть ли какая-нибудь команда, чтобы ускорить этот процесс? -
а без MV, на обычной таблице можно поменять ключ партицирования с alter или только пересоздавать?
-
подскажите пожалуйста, с чем может быть связана ошибка
auto DB::IBackgroundJobExecutor::jobExecutingTask()::(anonymous class)::operator()() const: Code: 432, e.displayText() = DB::Exception: Unknown codec family code: 0
полный лог: https://pastebin.com/Gcic437i2021.10.05 12:41:40.539332 [ 3994 ] {} <Debug> system.part_log (ba194f57-a3fb-43 - 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.
-
Unknown codec family code: 0: (while reading column query_id)
файл query_id.bin состоит из ноликов в 202110_680294_680299_1, потому что побился при внезапном рестарте -
чудно. Пруфы есть? Distributed запросы?
-
вроде только пересоздать
-
попробовал, через словарь все работает, через табличную odbc() не хочет
-
она еще не релизилась, просто notes опубликованы раньше времени, потому что документация перегенерится кроном
-
вроде всё ок.
>SELECT match('abcd', '[A-Z]+'), match('Abcd', '[A-Z]+')
0,1 -
а что говорит? и какая версия clickhouse?
-
спасибо
-
данная ошибка проявляется на одной из реплик, действительно после рестатра, как правильно поступить в данной ситуации?
-
21.8.5.7
если пишу odbc('строка подключения', 'схема', 'таблица') то
HTTP status code: 500 Internal Server Error, body: Error getting columns from ODBC 'std::exception. Code: 1001, type: nanodbc::database_error, e.what() = ../contrib/nanodbc/nanodbc/nanodbc.cpp:4806: 0800: [FreeTDS][SQL Server]Database 'схема' does not exist. Make sure that the name is entered correctly.
если odbc('строка подключения', 'схема.таблица') то
500 Internal Server Error, body: Error getting columns from ODBC 'Code: 36, e.displayText() = DB::Exception: Table 'схема.таблица' not found -
это ваша таблица? или системная? query_id намекает что это system.query_log или типа того
-
регистр буков в 'схема.таблица' какой?
-
системная, у нас нет таких колонок
-
нижний, и словарь и табличная odbc, все в плане регистра одинаково
-
дропните этот парт system stop merges system.query_log alter table system.query_log drop part '.....бубу'
-
ну пробуйте верхний,
а при чем тут " и словарь и табличная odbc" ? -
если создаю словарь SOURCE ( ODBC(...)) то работает, если табличная odbc() то нет
-
а как в словаре написано?
-
спасибо
-
SOURCE ( ODBC( connection_string 'DSN=mssql;UID=test;PWD=test2021PASSWORD;Database=test' table 'schema.test') )
src:
https://gist.github.com/Slach/9f9449a722091a13a9069b79f8dc7da7 -
да, я забыл что там только словари тестил
-
понятно, скорее всего odbc таблица оборачивает в " и получается фигня, в словарях это чинили. Поставьте пользователю схему как дефолтную в mssql и не пишите схему в КХ
-
Привет. При попытке сделать insert into table select * from remote получаю следующую ошибку:
1 error occurred: * code: 519, message: All attempts to get table structure failed. Log:
Code: 102, e.displayText() = DB::NetException: Unexpected packet from server server:9440 (expected Hello or Exception, got Unknown packet) (version 20.12.7.3)
Видел, что в https://github.com/ClickHouse/ClickHouse/issues/15596 помогло увеличение connect_timeout_with_failover_ms. Тоже попробовал - не помогло.
Что может ещё вызывать такую ошибку?Strange connection behavior between replicas of different regions. · Issue #15596 · ClickHouse/ClickHouseWe are facing unexpected behavior in ClickHouse. We have a ClickHouse cluster of 30 nodes (10 shards, 3 replicas each). The nodes are deployed in two different regions (20 replicas in region 1 and ...
-
-
Понятное дело, читаю все Backward Incompatible Changes и исправлю если что-то из этого использую
-
Это очень сложный вопрос, зависит насколько большой у вас кластер и насколько сложное приложение. И на сколько критичен КХ для вас.
Т.е. например если у вас 2000 Replicated таблиц, то вам придется занятся дополнительным тюнингом, если вы пользовались LowCardinality(Nullable(String)) то, и этот список бесконечный. -
Кластер из двух шардов по две реплики, маленький, и настройки мы практически не тюнили
-
-
а что говорит curl если пытаться сделать запрос на этот порт ?
-
-
в целом разобрался, подскажите пожалуйста что такое committed state у партов? те на диске есть несколько "битых" партов (внутри их директории нет части файлов колонок), какие-то удаляются (через drop part), у других же запрос alter table ... drop part завершается ошибкой 'No part 202110_681320_681320_0 in committed state'
-
это значит в ЗК нету информации про них. Можно просто удалить на диске (переложить например временно в detached)
-
-
Добрый вечер, у меня есть база на atomic (3 шарда, 1 реплика), которую я хочу перенести на другую машину. Clickhouse-backup создаёт бекап содержащий metadata.json и директорию metadata, без чего либо похожего на shadow (как в случае с переносом обычной базы), в связи с чем я не могу просто перекинуть rsync-ом файлы и сделать restore на новом сервере . Вопрос, как мне правильно мигрировать эту базу?
P.S. В Elasticsearch например можно добавить новую ноду в кластер, и после релокации шардов вывести из кластера старую ноду, после того как все реплики переедут. Может быть и в CH есть какой-то похожий путь? -
Разобрались. Глупая ошибка была, порт 9440 использовался вместо 9000.
-
Clickhouse-backup последние версии поддерживают atomic
-
>P.S. В Elasticsearch например можно добавить новую ноду в кластер, и после релокации шардов вывести из кластера старую ноду, после ?>того как все реплики переедут. Может быть и в CH есть какой-то похожий путь?
в КХ добавляете реплику, ждете завершения репликации, дропаете старую реплику -
-
Date
-
SELECT toDate(18905)
┌─toDate(18905)─┐
│ 2021-10-05 │
└───────────────┘
Date в КХ это число дней с 1 января 1970 года -
о, премного благодарен! а если у меня льется в кх из двух источников, все одинаковое, а только это поле - из первого источника:
18905
из второго:
2021-10-05
будет работать так? -
я вообще ничего не понял
-
в кликхаус планируется наливать данные из кафки и из mysql.
в mysql payment_period хранится так:
"payment_period":2021-10-05
в кафке так:
"payment_period":18905
все это нужно слить в одну таблицу кликхауса. будет ли это работать, если создать таблицу (в КХ) со значением payment_period:
payment_period Date DEFAULT now()
может ли Date хранить и число дней с 1 января 1970, и YYYY-MM-DD? -
-
КХ понимает оба формата при заливке 2021-10-05 = текст , 18905 = число, для типа Date.
Под капотом хранится 18905, но это не важно -
спасибо
-
-
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-system-tables-eat-my-disk/
Note 2: Log tables with numeric postfixes (_1 / 2 / 3 …) query_log_1 query_thread_log_3 are results of Clickhouse upgrades. When a new version of Clickhouse starts and discovers that a system log table’s schema is incompatible with a new schema, then Clickhouse renames the old query_log table to the name with the prefix and creates a table with the new schema. You can drop such tables if you don’t need such historic data. -
-
Он создаёт бекап, в котором сожержатся только метаданные. Мне нужно сами партиции переносить отдельно чтобы эти метаданные на что-то могли ссылаться при ресторе бекапа?
-
нет он создает бекап с данными. Проблема в том что вы используете древний clickhouse-backup
-
Добрый вечер, подскажите, почему при запуске вью с параметром, отвечает, что параметр не найден, хотя он есть.
https://kb.altinity.com/altinity-kb-queries-and-syntax/altinity-kb-parameterized-views/
тут в последнем примере сказано, что вью надо создать с перечисленными полями, у меня так и сделано.
версия 21.7.2 -
это баг в 21.7.2 , это починено в 21.7
-
спасибо, понял
-
v.1.0.0 указана как latest
-
Видимо у меня что-то не так
-
не знаю, попробуйте наш форк https://github.com/Altinity/clickhouse-backup/GitHub - Altinity/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages support
Tool for easy ClickHouse backup and restore with cloud storages support - GitHub - Altinity/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages support
-
Благодарю, сейчас попробую
-
-
https://clickhouse.com/docs/en/sql-reference/statements/alter/update/
только прочитайте сначала вот это
https://clickhouse.com/docs/en/sql-reference/statements/alter/#synchronicity-of-alter-queriesUPDATE | ClickHouse DocumentationALTER TABLE … UPDATE Statements ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE filter_expr Manipulates data
-
Alter table <table> update <column> = <new_val> where 1
-
Заведите себе несколько стендов, тест, разработка, продакшн… и тогда обновлять и ловить камни будет намного безболезненней
-
Да так в принципе и есть, решил спросить, вдруг что-то совсем очевидное есть из проблем
-
ловил аналогичную ошибку. Мне кажется что можно дополнить вашу статью. Дело в том что переменная которую вы используете в представлении не инициализирована до того момента как вы её указываете в запросе. То есть порядок использования таких настроек: 1. Объявляете в глобальном конфиге префикс своих переменных. 2. Объявляете в пользовательском конфиге дефолт для конкретной переменной. 3. Перезапуск сервера 4. Используете.
-
я говорил про вот эту проблему https://github.com/ClickHouse/ClickHouse/issues/2753921.7 Parameterized views do not work anymore · Issue #27539 · ClickHouse/ClickHouse
I suppose it was broken in #24095. Will it be fixed by #27227 ? CREATE VIEW custom ( `name` String ) AS SELECT name FROM system.tables WHERE database = getSetting('custom_db') Ok. -...
-
Вопрос вдогонку.
У нас есть хранилище сырых финансовых данных, откуда бизнес периодически просит вытащить всякие интересные показатели для аналитики. Мы хотим эти показатели хранить в clickhouse. Если для реализации новой идеи я добавляю колонку, то есть какая-то возможность эффективно записать исторические данные только в неё? -
нет такой возможности
лучший совет
возьмите и загрузите сырые данные как есть, в тот же clickhouse
а потом через какой нибудь dbt
научитесь извлекать витрины данных такие которые вам нужно -
Нам на создание копии сырых данных в clickhouse никто ресурсы, увы, не выделит. Их очень много 😔 Какие альтернативы тогда есть? Медленно в фоне лить старые данные заново в какой-нибудь replacing/collapsing merge tree, следя за тем, чтобы эта операция как можно меньше партиций за раз затрагивала?
-
так вы не сырые копируйте, а аггрегированные. Их уже сильно меньше, и джойны/словари могут заработать и помочь соединить одно с другим. Вы зря отказываетесь от витрин и прочих звезд аля кимбал. Что-то подобное надо делать для аналитики, хоть с кликхаусом, хоть без него.
-
как вы себе это представляете? очень тяжело понять что вы хотите.
Типа у вас в КХ есть таблица с 30 полями и в ней 400млрд строк, и есть данные во внешней системе которые позволят обогатить эти строки и добавить еще 10 полей и надо обновить строки по ключу? -
Да, что-то вроде этого.
-
Мы и так уже стараемся вытащить из этого хранилища как можно больше информации заранее, чтобы положить это в кликхауз в агрегированном виде. Но я не могу гарантировать, что никогда не возникнет необходимость долить туда что-то ещё.
-
ну заново залить тогда
-
а где эти данные лежат? Я вот не могу найти хранилища дешевле чем КХ. В КХ наиболее компактное хранение если хранить тупо json в таблице из 2 полей и при этом еще кверять можно. Диски + Сервера + КХ, дешевле чем S3.
-
зачем туда-же? Это же другие факты, скорее всего с иной гранулярностью. То что вы хотите сделать - это джойн двух разных таблиц фактов. Не надо так делать - ничего хорошего не получится, даже если база осилит. Делайте аггрегации по совместимым "измерениям" и вот их уже можно попробовать поджойнить друг с другом. По крайней мере в этом действе можно поймать смысл. В отличии от джойна разных слабо связанных фактов.
-
Я в Bloomberg работаю, у нас для хранения tick-by-tick информации с бирж своя собственная "база данных" есть. Для того, чтобы просто вытаскивать оттуда данные, она работает достаточно прилично, но вот аналитику по ней гонять в принципе невозможно.
-
а ну так у вас и так все хорошо, с полной перезаливкой
-
Спасибо! Перелить да, не проблема, просто хотелось знать, есть ли более эффективный подход.
Вообще цель текущего проекта, для которого мы смотрим clickhouse — хранение предагрегированных (посекундная точность) финансовых индикаторов, которые позволят гораздо быстрее считать всякие volume weighted average price и прочие штуки для исторических данных. -
Если это абсолютно независимые факты, то я согласен, что они должны лежать отдельно, с этим проблем нет. Мне интересны были рекомендации на случай, когда что-то упустили, и зависимость таки есть 😂 У нас даже с предагрегацией будут десятки миллиардов событий в день. Джоинить такое, насколько я понял, можно и не пытаться.
-
Есть уже какой-то позитивный опыт использования кластера нод КХ с какой-нибудь большой shared хранилкой NAS на пару петабайт?
Видится
потенциально узкое место в шине хранилки на фул-скан запросах, но может это не так уж и критично. Какие подводные камни? -
Вы не дождетесь выполнения запросов в таком случае.
Для нескольких петабайт вам нужны несколько десятков шардов кх.
А в случае десятков шардов, то та один шард там получается разумное кол-во ТБ данных (сотни)
https://github.com/ClickHouse/ClickHouse/issues/26748
https://github.com/ClickHouse/ClickHouse/issues/28961Parallel processing on replicas, reworked. · Issue #26748 · ClickHouse/ClickHouseWe want to parallelize data processing using multiple replicas of single shard. Every replica should process some split of data. There are the following considerations that makes the task non-trivi...
-
Да, предполагается, что шардов будет много, предположим, 100.
-
Ну тогда зачем вам некий единый нас.
Берите s3/hdfs диск -
вам понадобится нереально дорогая железка, от ляма баксов (не шучу)
-
и 100 серверов со своими дисками будут в 10 раз дешевле и порвут ее в тряпки
-
Цены мы знаем :(
-
Предположим, у заказчика есть уже хранилка и он не хочет покупать диски
-
Как правильно рассчитывать производительность в таком случае? Сравнивать bandwidth хранилки и суммарную скорость чтения с дисков на шардах?
-
Посчитайте на сколько серверов вам хватит сети в хранилке
-
Спс, будем прикидывать.
-
Вопрос, что делать с репликацией.
Ибо хранилка в себе уже реплицирует, и хранить те же данные два раза будет странно. -
-
Так и есть, это отдельный вопрос, вторую хранилку заводить вроде как нет смысла, так что просто одна реплика
-
Ну тогда, что делать если сервер кх сам по себе поплохел, от этого же тоже нужно защищаться.
-
брать другой из стэндбая и перемонтировать к нему данные больного сервера
-
Ну это не очень быстро же.
Плюс реплики помогают с параллельностью. -
пока только на сэмплированных запросах, а у нас сэмплы не катят
-
Параллельные запросы могут прилетать на разные реплики
-
Нет, почему
Два запроса параллельно идут.
Один на первой реплики, а второй на другой -
резонно, можно разные кластеры на разные реплики повесить
-
Кстати, интересно, s3 используется реально с КХ кем-то на нормальных инсталляциях? Или это только для поиграться в облаке?
-
Некоторые наши клиенты пользуются.
Но там не такие крупные инсталляции конечно.
Основные проблемы:
Кх утилизирует пока не весь throughput сети.
Нет кеширования для данных. (есть для марок и ключа)
Ну и сегодня вот креш вылез.
https://github.com/ClickHouse/ClickHouse/issues/29788Startup crash: STSResourceClient Address: NULL pointer. Access: read. Address not mapped to object. · Issue #29788 · ClickHouse/ClickHouseDescribe what's wrong Clickhouse server crashes with a traceback on startup in my deployment when I add an S3 storage policy to the /etc/clickhouse-server/config.d folder. Does it reproduce...
-
каждый сервер с дисками может читать 1 GB/s (8 Gbit) со своих дисков (raid 10 HDD), ваша хранилка должна выдавать 800 Gbit/s.
-
спасибо, эпично звучит
-
Сколько данных в 2021 на топовых процах на ноду можно накидвать?
Например, у нас есть инсталляция с 20-поточными Xeon Gold 5115@2.40GHz c 126GB RAM по 15ТБ полезного хранения на сервере - и есть ощущение, что можно было и побольше дисков насовать туда. Но это от профиля запросов сильно зависит, наверное. -
10 - 20 дисков
-
У нас есть клиенты которые используют Lustre и сервера используют хранилкой Lustre, но там не используется шардирование, все КХ сигл-инстанс, и сеть у них 40gbit в каждом серваке , чтобы нормально работало.
-
интересный кейс, спасибо
- 06 October 2021 (147 messages)
-
Коллеги, просветите плиз. Пытаюсь разобраться с индексами. Вроде как индекса отдельного нет, это входит в движок таблицы. Нашел пример, где указано, как это делать: engine = mergetree(список столбцов). А в документации пишут, что параметров у mergetree нет. К
-
Кому верить и как создать индекс?
-
индексов нет, есть сортировка данных на диске по указанным вами полям, которая помогает читать меньше. писать надо так engine= MergeThree order by (список, столбцов).
Имеет смысл внимательно от начала до конца прочитать статью в документации - https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/MergeTree | ClickHouse DocumentationMergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
Вообще индексы тоже есть. https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/#table_engine-mergetree-data_skipping-indexesMergeTree | ClickHouse Documentation
MergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
они конечно есть, и об этом сказано в документе, который обязательно надо прочитать прежде чем что-то проектировать на КХ. Но это не те индексы, которые представляют себе люди, пришедшие с другиъ субд. И там не сказано, что эти скип индексы хоть как-то полезны, если у вас примерно миллиард записей, и встречаются довольно длинные куски относительно однородных по какому-то полю данных. Если нет, то эти "индексы" не помогут никак.
-
Да, это правда.
-
Коллеги добрый день. Есть кластер кликхауса в кубере версия 21.3.15. Возникают алерты вида ClickHouseReplicatedPartChecksFailed. В логах вижу ошибки вида Found parts with the same min block and with the same max block as the missing part. Попробовал https://github.com/ClickHouse/ClickHouse/issues/10368#issuecomment-616310015 но ничего не выдается. Есть советы по траблешутингу такого?Some merges may stuck · Issue #10368 · ClickHouse/ClickHouse
This bug is discovered on Yandex.Metrica servers. If there is assigned merge but some parts in between of the range of parts to merge get lost on all replicas, the merge cannot proceed and the foll...
-
-
Чат, есть идеи как элегантнее всего покрыть следующий кейс?
Есть таблица с колонками A, B, C и движком ReplacingMergeTree.
Нужно чтобы дедупликация работала только по колонкам (A, B) но order by C тоже должен летать (лимит офсет чтобы не хворали). -
Всем добрый день! У меня есть таблица с данными, в которых столбцы закодированы. И есть справочник к нему. Подскажите как кодовые значения заменить на названия из справочника. Таблицы выглядят так:
-
-
dictGet()
-
Всем привет. Немного запустался в параметре injective в словарях. Во первых не очень понятно проставляется он к ключу или аттрибуту. В доке по CREATE DICTIONARY этот параметр указан у ключей
https://clickhouse.com/docs/ru/sql-reference/statements/create/dictionary/
...
key2 type2 [DEFAULT|EXPRESSION expr2] [HIERARCHICAL|INJECTIVE|IS_OBJECT_ID],
attr1 type2 [DEFAULT|EXPRESSION expr3],
...
При этом в доке по ключам и аттрибутам словарям он указан для аттрибутов
https://clickhouse.com/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure/
<structure>
...
<attribute>
...
<injective>true</injective>
...
</attribute>
</structure>
По доке нашёл лишь такое описание этого параметра
https://clickhouse.com/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout/
Помечать извлекаемые атрибуты как инъективные. Атрибут называется инъективным, если разным ключам соответствуют разные значения атрибута. Тогда при использовании в GROUP BY функции, достающей значение атрибута по ключу, эта функция автоматически выносится из GROUP BY.
Кто-нибудь может переформулировать для особо одарённых ?Словарь | Документация ClickHouseCREATE DICTIONARY CREATE DICTIONARY [IF NOT EXISTS] [db.]dictionary_name [ON CLUSTER cluster] ( key1 type1 [DEFAULT|EXPR
-
есть словарь с однозначным маппингом id->name, и хочется оптимизировать запрос вида:
select sum(x) c, dictGet('users_dict','name',id) as name from table group by name
допустим этот запрос из 1М делает 100 записей. Что быстрее сделать 1М обращений к словарю до group by или 100 после? Может ли оптимизатор самостоятельно принять решение о замене и сделать group by по id? -
Спасибо 🙏
-
Привет, подскажите пожалуйста, как предпочтительнее удалить большую часть (600гб из 700гб) данных из таблицы ReplicatedMergeTree,
воспользоваться ttl на таблицу с настройкой ttl_only_drop_parts, или же можно просто сделать через ALTER TABLE?
не хочется, чтобы встала запись в эту таблицу -
господа, подскажите где неправ. Есть таблица:
CREATE TABLE default.tmp3_transaction_ids_of_null_bonus_expired_at
(
transaction_id UInt64,
account_expired_at DateTime
)
ENGINE = Join(ANY,
LEFT,
transaction_id)
делаю запрос в котором
FROM transactions t
LEFT JOIN tmp3_transaction_ids_of_null_bonus_expired_at as b using (t.transaction_id)
получаю ошибку: DB::Exception: Table default.tmp3_transaction_ids_of_null_bonus_expired_at has incompatible type of JOIN -
Делайте LEFT ANY JOIN
-
SQL Error [1002]: ClickHouse exception, code: 1002, host: localhost, port: 8123; null
-
попробуйте вместо using (t.transaction_id) сделать on b.transaction_id = t.transaction_id или using (transaction_id)
-
попробовал 4 варианта с (2 с ANY\outer и 2 с ON\using) либо NULL kb,j has incompatible type of JOIN. (version 21.8.8.29 (official build))
-
читаю документашку и пока вижу фигу
-
А можете запрос с left any join прислать? Я просто буквально час назад рефакторил вьюхи и натыкался на эту ошибку: был запрос select * from t1 left join t2 on t1.key = t2.key с обычной таблицей t2, стал запрос `select * from t1 left ANY join t2 on t1.key = t2.key` с таблицей t2 вида create table t2(key Int32, val String) engine = Join(ANY, LEFT, key).
-
-
Подскажите есть ли возможность хоть как то кроме иерархических словарей использовать рекурсию в ClickHouse? В доке не нашел.
-
select
t.transaction_id,
t.account_created_at,
t.account_type,
t.account_amount,
t.account_reason,
CASE WHEN t.account_expired_at IS NULL and b.account_expired_at = '1970-01-01 00:00:00' THEN NULL WHEN b.account_expired_at IS NOT NULL THEN b.account_expired_at ELSE t.account_expired_at END as account_expired_at ,
t.account_max_win_rate
FROM transactions t
LEFT JOIN tmp3_transaction_ids_of_null_bonus_expired_at as b using (t.transaction_id)
WHERE transaction_created_at >='2016-01-01' AND transaction_created_at <'2017-01-01'
Укоротил количество столбцов в селекте (там их порядка 100 еще) -
у меня относительно разовая задача, пытаюсь за счет JOIN движка ускорить работу (обычный классический join очень долго выполняется)
-
По моему наоборот словарь удобнее чем join Engine, единственные преимущества видятся в том что можно задать тип соединения в join, в то время как словарь это по сути inner join только может быть или left join если вынести словарь в предложение select и потом выбрать всё
-
это понятно. непонятно почему вас понесло в join движок. Он очень похож на какую-то КХ легаси. Словари явно у него выигрывают и решают те-же самые задачи.
-
В блоке using(t.transaction_id) уберите t. - там должно быть только название столбца без алиаса таблицы.
-
это тоже пробовал =(
-
Добрый день коллеги!
Сегодня только начал работать с clickhouse и возник вопрос: обязательно ли покупать виртуальную машину Яндекс облако или можно без него обойтись и спокойно пользоваться локальной системой? -
Необязательно
-
-
Спасибо за ответ) А вы не знаете можно ли подключить базы данных clickhouse к Analysis server для создание Olap кубов?
-
У меня не получилось postgre соединить к visual studio даже с odbc драйверами и теперь боюсь, что также будет и с clickhouse.
-
А это не часть MSSQL? оно вообще куда-то еще умеет?
-
Analysis server от Microsoft.
-
Очень странно.
А если убрать left join вообще и в блоке CASE заменить b.account_expired_at на joinGet(tmp3_transaction_ids_of_null_bonus_expired_at, 'transaction_created_at', t.transaction_id) as account_expired_at2, например? -
кое-что выдал, сейчас посмотрю далее. Отпишусь
-
connect by & recursive CTE не завезли пока. Голосуйте тут - https://github.com/ClickHouse/ClickHouse/issues/16907 Если словари вам не угодили, то попробуйте сделать на вложенных подзапросах с фиксированным количеством уровней рекурсии (например 5).Reusing expression in a subquery (CTE) · Issue #16907 · ClickHouse/ClickHouse
ClickHouse server version 20.9.3 revision 54439. Describe the issue Example in docs: https://clickhouse.tech/docs/en/sql-reference/statements/select/with/ Example 4: Reusing expression in a subquer...
-
вообщем, joinget работает без CASE. если использовать такую структуру:
select
t.transaction_id,
t.account_created_at,
t.account_type,
t.account_amount,
t.account_reason,
CASE WHEN t.account_expired_at IS NULL and joinGet(tmp3_transaction_ids_of_null_bonus_expired_at, 'account_expired_at', t.transaction_id)='1970-01-01 00:00:00' THEN NULL
WHEN joinGet(tmp3_transaction_ids_of_null_bonus_expired_at, 'account_expired_at', t.transaction_id) IS NOT NULL THEN joinGet(tmp3_transaction_ids_of_null_bonus_expired_at, 'account_expired_at', t.transaction_id)
ELSE t.account_expired_at END as account_expired_at ,
t.account_max_win_rate
FROM transactions t
WHERE transaction_created_at >='2016-01-01' AND transaction_created_at <'2017-01-01' -
то нет
-
Как ругается?
-
SQL Error [1002]: ClickHouse exception, code: 1002, host: localhost, port: 8123; null
-
думаю можно CASE убрать флагом join_use_nulls=1
-
есть joinGetOrNull для такого
-
Лучи добра вам и Алексею!
-
какую stable/lts версию КХ из последних сейчас не боязно брать в прод?
-
Возьмите версию от Алтинити
-
21.3 последняя которую мы апрувнули.
Вот на днях должны апрувнуть 21.8 как altinity stable -
Кто-нибудь пользуется dbt в clickhouse ?
-
а у вас какой примерно разрыв по времени\версиям обычно между аппрувом stable от Яндекса и, собственно, вами?
-
есть в MergeTree таблицах главный индекс, он совпадает с сортировкой таблицы.
раньше до декабря 2017 года использовался синтаксис MergeTree(partititonkey, orderkey, samplekey, granularity)
после декабря 2017 MergeTree partition by (partititonkey) order by (orderkey) sample by (samplekey) settings (granularity)
новый синтаксис имеет больше фич, нужно использовать только его.
главный индекс -- разреженный, индексированы не все записи, а только 1 запись на гранулу(первая), размер гранул задается granularity (но все несколько сложнее и если гранула больше 10мб, то может быть меньше записей чем 8192 (адаптивная гранулярность))
главный индекс -- может быть префиксом сортировки, можно задать PRIMARY KEY( a, b) ORDER BY (a,b,c,d) -- PRIMARY KEY==главный(первичный) индекс.
Все это описано в доке если читать. -
это значит что с сетью какая-то херня и КХ скачивает парты не с первого раза. Поды рестартуют?
-
в тот момент нет.
-
это небольшая проблема, скачанный парт оказался битым, перекачает еще раз
-
тоесть изменить алерты и успокоиться?
-
разбираться с сетью
как вариант выкинуть кубернетис, там сеть одна большая проблема -
не не вариант ок буду попробую в сторону сети ковырять
-
-
раньше в любой непонятной ситуации я крошил батон на SELinux, теперь на кубернетис. Если что-то необяснимо глючит -> виноват кубернетис.
-
не будет вам счастья. Это невозможно реализовать потому что мержи (Replacing) используют сортировку таблицы, а у вас надо отсортировать вообще по другому.
-
Перелил все в replacing только по (a, b) и переписал селект вынеся сортировку по C в подзапрос, вроде стало летать. Но да, элегантного варианта кажется действительно нет.
-
в доке ошибка, это про атрибуты
-
Здравствуйте, такая проблема
Есть ReplacingMergeTree
На основе ее создается final MergeTree (CREATE TABLE ..... AS SELECT * FROM .... FINAL)
Перед созданием если такая таблица уже существует, то она удаляется
В какой-то момент(непонятно в какой), запросы DROP(а так же и KILL QUERY этого запроса) просто намертво зависают (для этой final таблицы), помогает только рестарт кликхауса
Версия 21.4.3.21
Есть идеи? Спасибо -
alter table drop partition ?
-
это не настоящая ошибка. Это ошибка в jdbc драйвере.
-
партицирование по дням, а нужно удалить по другому полю
-
Добрый день.
Подскажите best practices по отказоустойчивой схеме работы в KX, при условии, что поставщик данных для КХ один - Kafka. Есть таблицы с движком Kafka, есть таблицы MergeTree, eсть матвью "from kafka to mergeTree". Хочется иметь, как минимум, защиту от потери данных.
Вижу варианты:
1. Однонаправленная репликация (аля standby). Все финальные таблицы делаем Replicated, на копии БД имеем только финальные таблицы.
2. Двунаправленная репликация. Полная копия всех объектов БД на обеих репликах, финальные таблицы - Replicated. Таблицы Kafka работают в рамках одной consumer-group. Т.е. одна реплика обрабатывает половину данных из топика, реплики обмениваются данными в финальных таблицах
3. Независимый дубль без репликации. Таблицы Kafka работают в рамках разных consumer-group (каждая копия получает полный набор данных и обрабатывает его)
Подскажите, как лучше? Может, есть еще варианты? -
да никак. Иерархия это рандомное чтение (если это не специально организованное left-right Readonly дерево)
рандомное чтение не совместимо с OLAP -
alter table delete
-
Спасибо
-
запросы от MV пока не логируются в query_log. Только в логах да. В part_log еще что-то видно
-
Спасибо
-
ну мерж идет на этой таблице и блокирует drop table.
>Версия 21.4.3.21
проверьте в свежих версиях КХ, кажется мерж должен отменяться если сделан drop -
спасибо
-
или 2 или 3.
у 3 проблема что данные будут немного разные всегда, но есть достоинтсво, можно сделать в разных гео-регионах, если осилите гео-регионы в кафка. -
Коллеги, подскажите, как сделать так, чтоб подзапрос вычислялся на хосте запроса, а не улетал по кластеру через Distributed?
-
сделать скобки (select ) вокруг запроса
-
Так и попробоал, всё равно улетает
-
приблизительно запрос покажите
-
select field1 from disributed_table where field2 in (select field1 from local_table where field2 = 'const')
-
Спасибо за ответ. Буду пробовать. Как я понимаю, на варианте 3 в случае потери одной копии для восстановления на новом месте достаточно остановить вставку и на холодную скопировать данные средствами файловой системы?
-
посчитать (select field1 from local_table where field2 = 'const') на инициаторе и разослать на шарды
select field1 from disributed_table where field2 global in (select field1 from local_table where field2 = 'const')
стянуть на инициатор (select field1, field2 from disributed_table) и фильтровать where in на инициаторе
select field1 (select field1 from disributed_table where field2) where field2 in (select field1 from local_table where field2 = 'const') -
Большое спасибо, сработало!
-
да, типа того
-
Добрый день. В документации есть пример подключения постгри как источника словаря.
<source>
<postgresql>
<port>5432</port>
<user>clickhouse</user>
<password>qwerty</password>
<db>db_name</db>
<table>table_name</table>
<where>id=10</where>
<invalidate_query>SQL_QUERY</invalidate_query>
</postgresql>
</source>
а можно как-то параметры
<port>5432</port>
<user>clickhouse</user>
<password>qwerty</password>
<db>db_name</db>
Вынести в подключаемый файл\переменные среды или еще как-то чтобы
а) не хранить в плейн тексте креденшиалсы
б) не дублировать настройки подключения в каждом файле словарей -
-
да можно
https://gist.github.com/filimonov/cbafa8ca85268693b7bf28c14473ab34
https://gist.github.com/den-crane/d6e0f1c7849a0bc44c27eab2de51c911ClickHouse dictionaries with connection credentials substituted from another fileClickHouse dictionaries with connection credentials substituted from another file - _etc_clickhouse-server_dict_sources.xml
-
всем привет. напомните, можно ли в настройках юзера ограничить число параллельных запросов?
есть квоты, но это не совсем то.
мне нужно запретить юзеру создавать больше 2 паралельных селектов скажем -
Огромное спасибо!
-
max_concurrent_queries_for_user
create user foo2 identified by '123' ;
CREATE SETTINGS PROFILE OR replace max_concurrent_queries_for_user2
SETTINGS max_concurrent_queries_for_user = 1 READONLY,
max_threads = 3 READONLY,
max_memory_usage_for_user = '8G' READONLY,
max_memory_usage = '8G' READONLY,
max_execution_time = 200 READONLY,
max_rows_to_read = 1000000000 READONLY,
max_bytes_to_read = '500G' READONLY
TO foo2; -
понял, спасибо. пропустил его
-
кликхаус автоматически подгружает xml из etc, которые начинаются с тега yandex?
-
нет, это очень старый гист.
вам надо осознать что есть специальный файл /etc/metrica.xml
и он специально описывался в дефолтном конфиге с помощью <include_from>
читайте доку -
-
похоже что /etc/metrica.xml это спец файл в яндексе в метрике, который есть везде и всегда и там какие-то конфиги которые используются не только КХ, а всеми прикладухами
-
Кстати, обновился сегодгя с древней версии на latest и у меня перестало работать слияние /etc/clickhouse-server/config.xml и /etc/clickhouse-server/config.d
В preprocessed_configs/config.xml получилось две секции remote_servers, кликхаус видит только кластеры из первой секции. Помогло добавить replace="replace" в моём случае.
Это с какой-то версии поменялось поведение или баг? -
а для SQL словарей можно так сделать?
-
в смылсе про /etc/metrica.xml ? да известная хрень, я писал на гитхабе в чем проблема, но не хотят чинить
-
пока нет
-
Да, именно. Понятно, спасибо =)
-
вообще не надо пользоваться include для remote_servers
include нужен если вы собираетесь заюзать секцию многократно например пароль для mysql для словаря.
если вам нужен просто remote_servers то все это не нужно
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-server-config-files/Server config filesHow to manage server config files in Clickhouse
-
Всем привет!
Продолжаю свою эпопею с TTL.
Есть шард из двух реплик.
На одной реплике делаю
set materialize_ttl_after_modify=0;
ALTER TABLE table modify TTL ttl_date
Те же действия пытаюсь сделать на второй реплике и на команде alter table modify у меня появляется ошибка про то что метаданные в zk не соответсвуют. Делаю рестарт реплики и все выполняется.
Почему может ругаться на метаданные в zk? И как правильно на двух репликах сделать alter table, чтобы не получить ошибку с zk?
Запустил на реплике выполнение alter table mater TTL partition. На двух репликах шарда запустились мутации и мерджи. Прошел день, все мерджи выполнились данные почистились на двух репликах. Но на одной реплике все завершилось, а на другой висит мутация и процесс. -
сгенерил для теста join таблицу и словарь с составными ключами
1) джойн занял в памяти 64Gb, словарь - 82Gb
2) в джойн таблицу можно на лету без блокировки дописывать, словарь такого размера обновляется пару минут
3) в джойн таблице можно хранить хэшированный составной ключ, тогда память становится 48Gb и скорость почти в 2 раза лучше становится -
-
Товарищи, подскажите, что пошло не так?
Code: 76, e.displayText() = DB::ErrnoException: Cannot open file /opt/clickhouse-server/clickhouse/data/tempdb/objects_v9/202012_1_25_2_86/uuid.null.bin, errno: 5, strerror: Input/output error: While executing MergeTree (version 21.8.4.51 (official build)) -
при этом отвалилось будто бы само, без внешних вмешательств
-
да, TTL кривой напроч, там 100500 проблем. В какой версии вы это делаете?
-
Подскажите, почему select parseDateTimeBestEffort(null) выполняется без ошибки, а select parseDateTimeBestEffort(nullIf('', '')) с ошибкой: Code: 41, e.displayText() = DB::ParsingException: Cannot read DateTime: neither Date nor Time was parsed successfully: While processing parseDateTimeBestEffort(nullIf('', '')) (version 21.8.8.29 (official build))
-
джойн хранит все атрибуты в одной хештаблице, т.е. жрет меньше памяти, и быстрее рабоатает если надо извлекать несколько атрибутов.
словарь хранит каждый атрибут в своей хештаблице поэтому жрет больше памяти и быстрее работает если надо извлечь один атрибут.
у словарей есть layout SPARSE_HASHED https://kb.altinity.com/altinity-kb-dictionaries/altinity-kb-sparse_hashed-vs-hashed/ -
https://t.me/clickhouse_ru/69319 это просто ложная память
в 2021 году LVM не нужен.
LVM замедляет рандом i/o операции на несколько процентов, потому что там есть пересчет логических адресов в "физические" (lmv -> pvm)Alexey Milovidov in ClickHouse не тормозитУже давно используем на серверах mdadm без LVM. Один раз были подозрения на старом сервере, что mdadm поверх LVM разделов может приводить к деградации производительности. Но мы это не подтвердили и не опровергнули. То есть получается, что совет не серьёзный (на уровне народной приметы).
-
добрый день! есть ли какая-либо возможность использовать dictGetChildren для словарей, у которых ключ - не число (строка или тапл, например)?
-
потому что ветления вычисляют и then и else , до версии 21.9 но это не точно.
ваша проблема в том что вам не нужен if вообще.
parseDateTimeBestEffortOrNull
parseDateTimeBestEffortOrZero -
О! отлично! спасибо!
-
Версия 20.9
-
я тут перечитал ваше сообщение.
ВСЕ alter команды реплицируются , никогда не делайте alter на обеих(всех) репликах, вы удваиваете команду, это приводит к ошибке про версию таблицы
лучше все alter всегда выполнять на одной и той же реплике, особенно если они выполняются подряд -
То есть если я даже добавляю столбы в одну таблицу на одной реплике, то на второй реплике автоматом добавятся столбцы ?
-
да конечно,
вы реплики и шарды не путаете? -
Нет. Шард состоит из реплик.
-
ВСЕ alter команды реплицируются самой Replicated.... таблицей , optimize тоже
-
Понял.
-
-
Просто остальные я знал, я думал когда меняем ddl таблицы надо делать на каждой реплике отдельно
-
нет
-
Что можно с ними сделать?
-
спрашивайте про конкретные ситуации. Вы не знаете что такое мутация и что такое процесс, поэтому ваш вопрос не имеет смысла, это все равно что спросить, а можно пить? пить что ? когда? кому?
-
-
-
покажите что в system.mutations для нее
-
-
create_time parts_to_do latest_failed_part latest_fail_time latest_fail_reason
-
и что в system.merges про нее?
-
Create time 2021-10-05 12:05
Parts to do 23
Latest failed part пусто
Latest fail time 1970-01-01
Latest fail reason пусто -
Нет записей
-
ну тогда kill mutation
процесс не надо убивать, сам отвалится, он ничего не делает -
Спасибо. Сейчас пойду делать
-
приветы!
а как грохнуть ключ семплирования в существующей таблице? -
мы тут обновились, КХ перестал соглашаться на строковый столбец в ключе семплирования, хотим убрать ключ семплирования
-
Могу посоветовать перелить таблицу в новую без этого ключа.
-
таблица replicated ?
-
However, in fresh versions you can set compatibility setting check_sample_column_is_correct = false in MergeTree settings
https://github.com/ClickHouse/ClickHouse/issues/29005UUID as a sampling key don't work anymore since 21.9 · Issue #29005 · ClickHouse/ClickHouse2021.09.13 06:59:35.799363 [ 11 ] {} <Error> Application: DB::Exception: Invalid sampling column type in storage parameters: UUID. Must be one unsigned integer type: Cannot attach tab...
-
да, replicated
спасибо -
❤️
-
Типичные грабли аналитики на примере данных из Git:
https://www.youtube.com/watch?v=y8HsXqQEyfEАлексей Миловидов, ClickHouse - Типичные грабли аналитики на примере данных из GitАлексей демонстрирует примеры решения аналитической задачи: изучение и упрощение модели данных; выбор структуры хранения; подготовка, обогащение и загрузка данных; как быстро изучить данные и избежать неправильных выводов; применимость данных для конкретных задач. Пример exploratory data analysis - изучение данных в поисках инсайтов без изначально поставленной задачи.
-
None
- 07 October 2021 (197 messages)
-
работает ли у кого-то apache superset с кликхаусом? Интересует какие версии суперсета и clickhouse-sqlalchemy
-
Возможно ли такое исправить?
Macro 'uuid' and empty arguments of ReplicatedMergeTree are supported only for ON CLUSTER queries with Atomic database engine. -
что тут исправлять? кривой SQL. такой create table можно делать только в atomic базах
-
База создана давно, может быть, что она не Atomic?
-
Ранее не было репликации вовсе.
-
На тестовых средах все создавалось без проблем.
-
может. Дело в том что у Engine = ReplicatedMergeTree(надо задавать параметры) в Atomic базах они могут быть заданы автоматом.
вам сложно написать ReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}') ? -
Попробую. Конвертация базы в Аtomic бывает?
-
Плюс применяю макрос uuid. Будет ли он работать?
-
бывает
-
вот так CREATE TABLE db.tablename UUID '3bd68e3c-2693-4352-ad66-a66eba9e345e' on cluster
-
Макрос uuid не поддерживается, как и было сказано.
-
По конвертации в Atomic, это опасно, как сделать?
-
Тут предполагается сгенерировать вручную и подставить UUID? В пути ZK тогда тоже подставить тот же UUID? У меня вот такой путь: {zk_path_prefix}/tables/{uuid}/{shard}. Тут zk_path_prefix некий префикс.
-
ну подставьте вручную любой uuid вместо {uuid}, а что вам имя таблицы например не нравится?
-
{zk_path_prefix}/tables/{table}/{shard}
-
По имени были проблемы скорее при тестировании. После удаления таблицы не создается опять с тем же именем.
-
Плюс унификация, я уже "наплодил" таблиц именно так :)
-
Скажите мне, пожалуйста, по конвертации базы в Atomic. Не смог ничего найти по этому.
-
Drop table ... sync;
-
Переименованием таблиц
-
Доброе утро
Можете подсказать пожалуйста, как организовать синхронизацию (в одну сторону) с mssql на clickhouse одной таблицы
Чтобы при записи/изменении/удалении записи в mssql данные грабились в clickhouse
Спасибо -
Как лучше всего и правильнее*
-
-
Можно сделать вот так: переименовать базу данных, создать новую базу данных, переместить данные? По переносу детали мне не ясны.
-
Спасибо за помощь, пока отложу настройку репликации, буду изучать матчасть и экспериментировать.
-
диски проверьте и память
-
работает
superset 1.x (проверял на 1.0, 1.1 и 1.3)
https://gist.github.com/ad926dfa30ceb4fe1d168c00c3da98e0
clickhouse-sqlalchemy тупо из master с git ставил
смотрите bootstrap.shsuperset 1.x + clickhouse docker-compose bootstrapsuperset 1.x + clickhouse docker-compose bootstrap - Dockerfile
-
Приветствую, как можно посмотреть сколько весит один столбец в таблице ?
-
SELECT field FROM table
-
из какой таблицы выбираете?
Distributed? -
Если нет элегантных способов, то будем делать синхронизатор
Просто вроде что-то видел про engine или что-то в этом духе, где можно прокинуть источник -
в смысле у вас там каскад MV какой то??
SELECT FROM обычный VIEW WHERE .. -> который уже выбирачет через SELECT FROM materialized view UNION SELECT another materialized view ?
сервер один? -
ну вообще вы попробуйте сравнить
EXPLAIN SYNTAX SELECT ... FROM view WHERE ...
и
EXPLAIN SYNTAX SELECT ... FROM view
есть подозрение что дело не в группировке. а в том что WHERE условия прокидываются внутрь SELECT которыми view ограничен ...
и GROUP BY на выходе порождает другое кол-во строк... -
А как то подругому можно ? А то таблица около 200 гигов уже весит. Именно в сжатом формате
-
Попробуйте вот так
SELECT formatReadableSize(data_compressed_bytes), formatReadableSize(data_uncompressed_bytes) FROM system.columns WHERE database = 'my_db' AND `table` = 'my_table' and name = 'my_col' -
ой извините, ерунду написал, прочитал "как посмотреть один столбец в таблице"
-
Спасибо, это помогло
-
Бывает, но интересно, что показатели в select column from table не совпадают с данными в system.columns.data_uncompressed_bytes.
-
Приветствую, подскажите пожалуйста, столкнулся с такой проблемой, есть таблица в ней есть партиции с типом поля Enum8 , бьыли откреплены не сколько партиций , сейчас при попытке вернуть они не возвращаются с ошибкой:
DB::Exception: Type mismatch for column xxxxxxx. Column has type Enum8 got type Enum8
нашел баг на эту тему:
https://github.com/ClickHouse/ClickHouse/issues/26672
и некий pull request
https://github.com/ClickHouse/ClickHouse/pull/28028
но не могу понять как использовать то что было в пулл реквестеattaching parts with 'compatible' enum types · Issue #26672 · ClickHouse/ClickHouseGot something like that in practice with backup recovery - IRL most probably the sequence of events leading to that discrepancy was different (not clear yet). drop table enum_alter_issue; create ta...
-
Может кто то подсказать можно ли обойти это и подцепить партиции назад?
-
Ни у кого идей нету?
-
#вакансия ищем DBA Clickhouse, OZON удаленка
-
Всем привет!
Создаю подключение к кафке таким образом, но не вижу данных
Что я делаю не так, нужно настраивать в конфиге?
CREATE TABLE queue (
`stringfield1` String
) ENGINE = Kafka('host:9092', 'testTool', 'test', 'JSONEachRow'); -
привет, чат!
скажите, а кх можно же использовать с etcd?
сложно ли мигрировать с зукипера на ходу?
главное - станет ли лучше? мы тут обнаружили, что зукипер на удивление сильно грузит диски, так что другой софт, работающий с диском, с его серверов лучше просто уносить -
Нет, нельзя
ClickHouse завязан не некоторые ZooKeeper концепты.
Вынесите ZooKeeper на отдельные ноды-диски -
Всем привет!
Прошу помочь советом, как лучше организовать несколько отдельных кластеров clickhouse:
- настроить их на работу с одним кластером zookeeper
- делать под каждый кластер клика отдельный кластер zookeeper
Может быть есть какие то общепринятые нормы и решения? В доке и гугле не нашел на эту тему особо информации -
штош, спасибо
-
-
-
-
-
добрый день!
сделал запрос ALTER TABLE tblname DELETE WHERE createdAt < '2021-07-01'
мутация успешно завершилась, удалил огромную пачку данных, но местао на диске увеличилось совсем на немного, оно будет увеличиваться со временем или же диск забит какими то другими данными (логами типа)? -
-
Мне из кафки приходят данные в таком формате
{"some_int":42,"some_str":"hello"}
Какой формат мне указать, чтобы преобразовать их в строку и записать в таблицу в 2 столбца? -
Если сообщения из кафка не могут записаться по какой-то причине, где можно посмотреть это в clickhouse?
-
логи КХ или проверьте system.errors
-
SELECT column FROM table
это просто вывод содержимого колонки
я не понял как вы его с размером сравниваете -
Спасибо!
-
Есть же в кликхаус клиенте счётчики сколько использовано данных
-
может быть добавите описание, откуда пинг делаете, откуда подключение существует?
-
решилось уже, спс
-
это вообще сколько было "прочитано в течении запроса", ну тупо счетчик байтов
это не размер данных на диске...
на диске еще например есть system.parts у которых active=0 -
Вы прицепите столбец к временной таблице с enum как парте. Сделайте alter. Потом opyimize final. Потом перецпите attach from
-
Как я могу преобразовать значения внутри data в строки и записать их в таблицу?
{"data":{"Organisation name":"Rochdale Borough Council","Purchase Order Number":"ph100669","Order date":"30/12/2014","Total_Value":"£227,150.00","Supplier_Name":"PENNINE CARE NHS","Account_Name":"PH PENNINE CARE CONTRACT","Service":"PUBLIC HEALTH"}}
Беру данные из кафка, нужно распарсить данные внутри data -
собственно я сделал приблизительно так же, просто create table temporarytbl mergetree с старым enum8, дальше alter table modify columnt enum8(с новыми данными) и на последок alter table tnl attach partition from temporarytbl
-
заняло правда чуть больше времени чем хотелось бы, но уже как есть (
-
Спасибо. Он-то работает действительно. Но не работает оказывается если встречается в базе Enum с пустой строкой как скажем тут https://clickhouse.com/docs/en/getting-started/example-datasets/cell-towers/ radio Enum8('' = 0, 'CDMA' = 1, 'GSM' = 2, 'LTE' = 3, 'NR' = 4, 'UMTS' = 5)Cell Towers | ClickHouse Documentation
Cell Towers This dataset is from OpenCellid - The world's largest Open Database of Cell Towers. As of 2021, it contains
-
https://github.com/ClickHouse/ClickHouse/issues/27578
Есть setting optimize который выключает это. Переберите все сеттингиIncorrect count optimization with UNION DISTINCT · Issue #27578 · ClickHouse/ClickHouseClickHouse chooses a column to calculate count, and then UNION DISTINCT collapses the result set. SELECT * FROM system.databases UNION DISTINCT SELECT * FROM system.databases ┌─name ───┬─engine ─────...
-
так zk грузит диски потому что делает синк каждой транзакции. любая бд так будет грузить диск. Отключите в зк синк и он перестанет грузить диск. Пока сервер не сребутится все будет ок
-
Один клстер zk. Один кластер zk способен обслуживать пару сотен нод кх.
-
интересный кейс, а можете issue на github создать и меня @Slach там упомянуть?
-
Через 8 минут удаляются старые парты
-
кей я завел да #147
-
спасибо, однако места особо не освободилось, видимо мусор вне таблицы где-то лежит, буду копать
-
В mat.view можно в select написать что угодно. Jsonextract и дальше ....
-
-
-
А как взять из поля data json, если структура такая ?
{"id": "005bc2df-5723-48f7-9b53-a94f4bc0d7d7", "data":{"name":"Vasya"}}
CREATE TABLE readings_queue (
`id` String,
`data` String
)
ENGINE = Kafka
SETTINGS kafka_broker_list = kafka:9092',
kafka_topic_list = 'testTool',
kafka_group_name = 'readings_consumer_group1',
kafka_format = 'JSONEachRow',
kafka_max_block_size = 1048576; -
Tuple(name Tuple
-
Спасибо большое!!
-
Спасибо за совет
-
SELECT
'{"id": "005bc2df-5723-48f7-9b53-a94f4bc0d7d7", "data":{"name":"Vasya"}}' AS j,
JSONExtract(j, 'Tuple(id String, data Tuple(name String))') -
SELECT
'{"id": "005bc2df-5723-48f7-9b53-a94f4bc0d7d7", "data":{"name":"Vasya"}}' AS j,
JSONExtract(j, 'Tuple(id String, data Tuple(name String))') AS x,
toUUIDOrZero(tupleElement(x, 'id')) AS id,
tupleElement(tupleElement(x, 'data'), 'name') AS name
FORMAT Vertical
Row 1:
──────
j: {"id": "005bc2df-5723-48f7-9b53-a94f4bc0d7d7", "data":{"name":"Vasya"}}
x: ('005bc2df-5723-48f7-9b53-a94f4bc0d7d7',('Vasya'))
id: 005bc2df-5723-48f7-9b53-a94f4bc0d7d7
name: Vasya -
То есть когда я создаю материализованное представление, я делаю его так?
CREATE MATERIALIZED VIEW readings_queue_mv TO readings AS
SELECT `id`,
tupleElement(`data`, `name`) ,
FROM readings_queue; -
Если data
`data` Tuple(`name` String) -
нет. JSONEachRow вам не подходит
В кафка engine таблице у вас будет одно поле j String
format данных В кафка engine JSONAsString
В mat view вы напишете извлечение из строки (из j)
JSONExtract(j, 'Tuple(id String, data Tuple(name String))') AS x,
toUUIDOrZero(tupleElement(x, 'id')) AS id,
tupleElement(tupleElement(x, 'data'), 'name') AS name -
Спасибо большое?
А почему вы помогаете нам всем?) -
Делай добро и бросай его в воду… )
-
-
Повышаю ЧСВ.
-
В принципе а Альтинити это часть работы писать в паблик чатиках, но конечно лучше не в русскоязычных.
-
И создание открытой kb.altinity.com/ я продвигал как часть маркетинга
-
Статьи у вас хорошие в Альтинити
-
Даже отличные)
-
Статьи я не пишу, хотя за них платят кучу денег дополнительно к зарплате, но лень писать
-
Я разобрался со всем этим
теперь стоит вопрос.
У меня создаётся таблица очереди, куда идут сообщения из кафки, таблица куда я транслирую представление, само представление.
Не избыточно ли это все? -
Давай за вас буду писать :D
-
За это отдельное спасибо, Денис.
-
почему за меня?, пишите статьи для блога и получайте бабло, это вообще не проблема.
-
ммм, а что можно по другому как-то?
-
хотите написать приложение которое будет читать из кафки, делать трансформацию и писать в таблицу?
-
это типа проще?
-
Просто поинтересовался. Ещё вопросик.
Я собираюсь переливать через кафку в кликхаус данные пользователей,
Для каждого создавать такую структуру? -
Данные всегда разные
-
ну а как еще? Какое решение вы видите? Можете просто хранить как JSON как строки в КХ таблице.
-
Господа есть вот такой docker-compose чтобы поднять 2 шарды + 2 реплики
version: "3"
services:
zookeeper:
container_name: clickhouse-zookeeper
hostname: clickhouse-zookeeper
image: zookeeper:3.6.2
ports:
- 2181:2181
- 2182:2182
- 8088:8080
networks:
clickhouse-network:
ipv4_address: 172.23.0.10
clickhouse1:
hostname: clickhouse-main-shard01
container_name: clickhouse-main-shard01
image: yandex/clickhouse-server:21.8.8
volumes:
- ./data/clickhouse1:/var/lib/clickhouse # persist data outside of container
- ./log/clickhouse1:/var/log/clickhouse-server # log
- ./config/config.xml:/etc/clickhouse-server/config.xml # config
- ./config/metrika.xml:/etc/clickhouse-server/metrika.xml # config replacements
- ./config/users.xml:/etc/clickhouse-server/users.xml # users
- ./config/macros/clickhouse1-macros.xml:/etc/clickhouse-server/config.d/macros.xml # macros
ports:
- 9000:9000 # native tcp/ip
- 8123:8123 # http
cap_add:
- IPC_LOCK
- NET_ADMIN
networks:
clickhouse-network:
ipv4_address: 172.23.0.11
depends_on:
- zookeeper
clickhouse2:
hostname: clickhouse-main-replica01
container_name: clickhouse-main-replica01
image: yandex/clickhouse-server:21.8.8
volumes:
- ./data/clickhouse2:/var/lib/clickhouse
- ./log/clickhouse2:/var/log/clickhouse-server # log
- ./config/config.xml:/etc/clickhouse-server/config.xml
- ./config/metrika.xml:/etc/clickhouse-server/metrika.xml
- ./config/users.xml:/etc/clickhouse-server/users.xml # users
- ./config/macros/clickhouse2-macros.xml:/etc/clickhouse-server/config.d/macros.xml
ports:
- 9001:9000 # native tcp/ip
- 8124:8123 # http
cap_add:
- IPC_LOCK
- NET_ADMIN
networks:
clickhouse-network:
ipv4_address: 172.23.0.12
depends_on:
- zookeeper
clickhouse3:
hostname: clickhouse-main-shard02
container_name: clickhouse-main-shard02
image: yandex/clickhouse-server:21.8.8
volumes:
- ./data/clickhouse3:/var/lib/clickhouse
- ./log/clickhouse3:/var/log/clickhouse-server # log
- ./config/config.xml:/etc/clickhouse-server/config.xml
- ./config/metrika.xml:/etc/clickhouse-server/metrika.xml
- ./config/users.xml:/etc/clickhouse-server/users.xml # users
- ./config/macros/clickhouse3-macros.xml:/etc/clickhouse-server/config.d/macros.xml
ports:
- 9002:9000 # native tcp/ip
- 8125:8123 # http
cap_add:
- IPC_LOCK
- NET_ADMIN
networks:
clickhouse-network:
ipv4_address: 172.23.0.13
depends_on:
- zookeeper
clickhouse4:
hostname: clickhouse-main-replica02
container_name: clickhouse-main-replica02
image: yandex/clickhouse-server:21.8.8
volumes:
- ./data/clickhouse4:/var/lib/clickhouse
- ./log/clickhouse4:/var/log/clickhouse-server # log
- ./config/config.xml:/etc/clickhouse-server/config.xml
- ./config/metrika.xml:/etc/clickhouse-server/metrika.xml
- ./config/users.xml:/etc/clickhouse-server/users.xml # users
- ./config/macros/clickhouse4-macros.xml:/etc/clickhouse-server/config.d/macros.xml
ports:
- 9003:9000 # native tcp/ip
- 8126:8123 # http
cap_add:
- IPC_LOCK
- NET_ADMIN
networks:
clickhouse-network:
ipv4_address: 172.23.0.14
depends_on:
- zookeeper
networks:
clickhouse-network:
ipam:
config: -
- subnet: 172.23.0.0/24
Запускаешь “кластер” первый раз - все работает. Делаешь docker-compose stop. Потом запускаешь заново - получаю ошибку:
ClickHouse.Client.ClickHouseServerException (0x000000F2): Code: 242, e.displayText() = DB::Exception: Table is in readonly mode (zookeeper path: /clickhouse/tables/01/search_request_local) (version 21.8.8.29 (official build))
Еще вот такая ошибка есть zookeeper_exception: Code: 999, e.displayText() = Coordination::Exception: No node, path: /clickhouse/tables/01/search_result_gds_local/log (version 21.8.8.29 (official build))
Подскажите куда копать???
Воспроизводится стабильно. Все удаляешь, поднимаешь заново - все работает. Один стоп и все - кластер мертв -
Я ничего не имею против этого решения, просто хочу прояснить, правильно ли я мыслю)
-
Мне нужно лить террабайты данных из более 50 источников, и вот думаю, правильный ли способ я выбрал для этого.
Источник -> kafka -> clickhouse -
50 и mergeTree таблиц лучше не делать, надо как-то унифицировать
-
а где зукипер свои данные хранит?
-
Данные в едином формате, id, data{...}
в data могут быть любые ключи и значения -
Намек понял =) Спасибо
-
монга? elastic ?
-
Данные в data это кейсы и события (логи бизнес процессов), столбцов немного, строк очень, связей между таблицами нет
-
По этим столбцам в таблицах, которые могут быть размером в миллиарды записей, нужно проводить агрегацию
-
Для агрегации же кликхаус идеально подходит?
-
Подкажите, пожалуйста, как из кх забирать данные из vertica?
-
Добрый день, подскажите, пожалуйста, как правильнее выбрать ключ сортировки и primary key для таблицы с движком CollapsingMergeTree, - для более эффективного хранения и поиска? есть много столбцов, ключевыми являются (env, agent, client, id) - расположены от более общих к более распределенным данным. Надо ли делать различные ключи сортировки и primary, или достаточно будет только order by (env, agent, client, id)?
-
При таком раскладе
CREATE MATERIALIZED VIEW readings_queue_mv TO readings AS
SELECT
JSONExtract(j, 'Tuple(id String)') AS id
FROM readings_queue;
SELECT * FROM readings;
CREATE TABLE readings
(
`id` String
) ENGINE = MergeTree PRIMARY KEY `id` SETTINGS index_granularity = 8192;
Как это работает, данные из MV не сохраняются в таблицу? -
Как тогда раскидать данные из очереди по разным нодам в кластере?
-
Добрый день! Есть таблица с бухг проводками, поля debitAccount, creditAccount, Amount. Подскажите, пожалуйста, можно как-то средствами clickhouse посчитать балансы, не используя join? В обычном sql я понимаю как это сделать, но вдруг у clickhouse есть какая-то крутая штука для этого? Спасибо!
-
тогда возможно можно все унифицировать и запихать в массивы или map
-
Чтобы структура у всех таблиц была одинаковая?
-
-
Вы имеете ввиду прям вот так?
id и данные в дата с разными значениями и ключами?
id | data
005bc2df-5723-48f7-9b53-a94f4bc0d7d7 | [] -
Спасибо! Про нетранзакционную бд это даа, но я храню для истории и статистики, так сказать)))
По поводу sql, да, спасибо, так я могу) Но задача посчитать сразу для всех счетов, не передавая их в качестве параметра. Что-то вроде сделал group by по кредиту, потом по дебету, а потом все сложил/вычел через джоин. Но вот хотелось бы без джоина.. -
помогите с clickhouse-copier, при переливе теряет части партиций или целиком, всегда по разному (запускается в контейнерах в количестве 32 штук) со следующей конфигурацией
<yandex>
<!-- Configuration of clusters as in an ordinary server config -->
<remote_servers>
<!--
source cluster & destination clusters accept exactly the same
parameters as parameters for the usual Distributed table
see https://clickhouse.com/docs/ru/engines/table-engines/special/distributed/
-->
<source_cluster>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>source-clickhouse-DC1-1</host>
<port>9000</port>
<user>clickhouse_copier</user>
<password>***</password>
</replica>
<replica>
<host>source-clickhouse-DC2-1</host>
<port>9000</port>
<user>clickhouse_copier</user>
<password>***</password>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>source-clickhouse-DC1-2</host>
<port>9000</port>
<user>clickhouse_copier</user>
<password>***</password>
</replica>
<replica>
<host>source-clickhouse-DC2-2</host>
<port>9000</port>
<user>clickhouse_copier</user>
<password>***</password>
</replica>
</shard>
</source_cluster>
<destination_cluster>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>dest-clickhouse-DC1-1</host>
<port>9000</port>
<user>clickhouse_copier</user>
<password>***</password>
</replica>
<replica>
<host>dest-clickhouse-DC2-1</host>
<port>9000</port>
<user>clickhouse_copier</user>
<password>***</password>
</replica>
</shard>
</destination_cluster>
</remote_servers>
<!-- How many simultaneously active workers are possible. If you run more workers superfluous workers will sleep. -->
<max_workers>32</max_workers>
<!-- Setting used to fetch (pull) data from source cluster tables -->
<settings_pull>
<readonly>1</readonly>
</settings_pull>
<!-- Setting used to insert (push) data to destination cluster tables -->
<settings_push>
<readonly>0</readonly>
</settings_push>
<!-- Common setting for fetch (pull) and insert (push) operations. Also, copier process context uses it.
They are overlaid by <settings_pull/> and <settings_push/> respectively. -->
<settings>
<connect_timeout>3</connect_timeout>
<insert_distributed_sync>1</insert_distributed_sync>
<replication_alter_partitions_sync>1</replication_alter_partitions_sync>
</settings> -
<tables>
<my_table_local>
<cluster_pull>source_cluster</cluster_pull>
<database_pull>my_database</database_pull>
<table_pull>my_table_local</table_pull>
<cluster_push>destination_cluster</cluster_push>
<database_push>my_database</database_push>
<table_push>my_table_local</table_push>
<number_of_splits>16</number_of_splits>
<engine>ENGINE = ReplicatedReplacingMergeTree('/clickhouse/{shard}/my_database/tables/my_table_local_3', '{replica}') PARTITION BY date ORDER BY (user_id, date) SETTINGS index_granularity = 8192, enable_mixed_granularity_parts = 1</engine>
<sharding_key>sipHash64(user_id)</sharding_key>
<enabled_partitions>
<partition>'2021-09-12'</partition>
<partition>'2021-09-14'</partition>
<partition>'2021-09-16'</partition>
<partition>'2021-09-17'</partition>
<partition>'2021-09-18'</partition>
<partition>'2021-09-19'</partition>
<partition>'2021-09-20'</partition>
<partition>'2021-09-21'</partition>
<partition>'2021-09-22'</partition>
<partition>'2021-09-23'</partition>
</enabled_partitions>
</my_table_local>
</tables>
</yandex> -
при этом очень низкая скорость передаич данных около 150 мегабайт/с
-
Здравствуйте! Существует ли функция в CH по переводу Uint64 в IPv6? Найти такую функцию в документации к СH не удалось, нашел только функция по переводу Uint32 в IPv6
-
прошу прощения, не в IPv6, а в string
-
ipv6 в формате UInt64 в string
-
ipv6 в формате UInt64? ipv6 это 128 бит же
-
-
-
А вы теперь правда в альтинити? К слову раньше вы тоже помогали))
-
jdbc | ClickHouse Documentation
jdbc jdbc(datasource, schema, table) - returns table that is connected via JDBC driver. This table function requires sep
-
Где можно почитать, какие типы дат поддерживает кликхаус, как конвертировать свой тип даты в нужный?
Встретил вот такой формат 11/12/2014 -
parseDateTimeBestEffort
-
Спасибо большое!
-
да он вроде уже как сто лет в алтинити :)
-
что-то типа такого:
SELECT d, sumIf(c, d=b)-sumIf(c, d=a)
FROM
(SELECT 'x' as a, 'y' as b, 1 as c
UNION ALL
SELECT 'y' as a, 'x' as b, 2 as c) t
ARRAY JOIN [a,b] as d
GROUP BY d; -
возьмите dockerize и ждите пока zk будет доступен по 2181 порту
https://github.com/jwilder/dockerizeGitHub - jwilder/dockerize: Utility to simplify running applications in docker containersUtility to simplify running applications in docker containers - GitHub - jwilder/dockerize: Utility to simplify running applications in docker containers
-
Товарищи!
Есть такая ситуация, лью через кафку в кликхаус 50 гигов, как узнать, что все данные перелились из моего приложения, есть ли в кликхаусе какое-то оповещение или кафке? -
++
-
-
можно, но не нужно )
-
-
-
-
кавычка какая-нить ненастоящая затесалась?
-
-
я бы даже сказал что все
-
-
красиво, но для кх не подойдет)
-
аа понял
-
� вот эта штука явно намекает что у тебя что-то юникодное где-то затесалось, где его не ждали
-
-
Очень круто, спасибо большое!!!
-
-
Словарь постгрес доступен с 21.3
-
спасибо
-
Странный вопрос. А CH никогда никем не используется в режиме "куча простых селектов в секунду (1-2K RPS)" (т.е. как высоконагруженная на чтение хранилка)?
-
эээээээ, ну простите, такое количество данных КХ нормальных сжует, емнип
-
-
Вопрос не про количество данных, а про количество отдельных запросов.
-
-
Ничего не полагаю, поэтому спрашиваю.
-
-
-
-
Очееь простые запросы которые читают мало данных может быть посмотрмтк наши статьи clickhouse in the storm
-
Привет, подскажите есть ли возможность быстро искать текст в clickhouse? Строки до 10 т символов, подойдёт ли накатывание индекса ngrambuf_1? Если да, то как лучше сконфигурировать индекс
-
Во-первых, индекс, о котором вы упоминаете, это не тот индекс в понимании SQL, а data skipping indexes, это написано у них и в документации, и в блоге альтинити.
Во-вторых, если вы планируете полнотекстовый поиск, то вам необходимо понимать, что вам нужно именно: полнотекстовый движок или все-таки база. Если, например, вам надо хранить логи, а поиск будет не столь частый как предполагает, то полнотекстовый движок вам может и не понадобиться -
MergeTree | ClickHouse Documentation
MergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
А Кассандра не?
Используется кх и так тоже, просто нод надо больше, от 10ти -
Ну здесь сам вопрос по себе странный, без примера запросов, которые должны удовлетворять требованию... ХЗ
-
Нужно хранить логи и быстро искать текст, в clickhouse это можно сделать?
-
В кх есть ишью по full-text search, но на мой взгляд, это не к КХ на данный момент:
https://github.com/ClickHouse/ClickHouse/issues/19970full-text search support · Issue #19970 · ClickHouse/ClickHouseDo we have plan to add support for full-text search by integrating lucene, sphinx,or some similar stuffs?
-
-
Вы, конечно, можете почитать и это:
https://altinity.com/faqs/clickhouse-and-elasticsearch-faqsClickHouse and Elasticsearch FAQsIs ClickHouse a good alternative to Elasticsearch? Read our FAQ to see how ClickHouse compares against Elasticsearch in benefits, use cases, query performance, database security, and more.
-
-
-
если надо найти текст в логах за период в три часа, то КХ фулсканом это сделает быстро, возможно быстрее эластика,
если надо найти текст в логах за период год, то КХ будет искать 4 часа. -
отправляйте логи сразу и в эластик и в кх, в эластике просто можно хранить чуть-чуть, даже пару часов, за это время можно заалертить например по логам найдя там нужное полнотекстом
-
То есть для полнотекстового поиска можно использовать elasticsearch и хранить в нем текст, либо попробовать настроить ngrambuf на колонку?
-
@sergeif выше сказал
-
-
Условие простое, быстрый поиск по подстроке в тексте
-
For Searching in Strings | ClickHouse Documentation
Functions for Searching in Strings The search is case-sensitive by default in all these functions. There are separate va
-
-
угнали телегу?
-
Пошла жара. Раскоксовка и трейдинг
-
Забиваем телескопом гвозди или нестандартные способы использования ClickHouse. Александр Зайцев (2018г)
ClickHouse — open-source DBMS от Яндекса — традиционно используется для аналитики различного рода логов или потоков событий от онлайн-систем. Однако, гибкость ClickHouse позволяет применять его для...
-
кто ни будь сталкивался с ошибкой в работе clickhouse-copier "Cannot assign ALTER PARTITION, because another ALTER PARTITION query was concurrently executed"? Происходит на этапе когда копир собирает данные из временных таблиц в основную, в результате часть данных теряется
- 08 October 2021 (89 messages)
-
Что можно с этим сделать при работе clickhouse-copier ? DB::Exception: Cannot assign ALTER PARTITION, because another ALTER PARTITION query was concurrently executed. (version 21.3.13.9 (official build))
-
Кто-то сталкивался с ошибкой?
2021.10.08 11:33:04.133938 [ 3478 ] {} <Error> noc.cpu.DirectoryMonitor: Code: 210, e.displayText() = DB::NetException: Connection refused (nocch02:9001), 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) @ 0x126cccbc in /usr/bin/clickhouse
1. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x8eb1999 in /usr/bin/clickhouse
2. ? @ 0x8afa503 in /usr/bin/clickhouse
3. DB::Connection::forceConnected(DB::ConnectionTimeouts const&) @ 0xfbf49cb in /usr/bin/clickhouse
4. DB::ConnectionPool::get(DB::ConnectionTimeouts const&, DB::Settings const*, bool) @ 0x8f77702 in /usr/bin/clickhouse
5. DB::StorageDistributedDirectoryMonitor::processFile(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0xfa3108f in /usr/bin/clickhouse
6. DB::StorageDistributedDirectoryMonitor::run() @ 0xfa34060 in /usr/bin/clickhouse
7. DB::BackgroundSchedulePoolTaskInfo::execute() @ 0xfe92bd2 in /usr/bin/clickhouse
8. DB::BackgroundSchedulePool::threadFunction() @ 0xfe92ffa in /usr/bin/clickhouse
9. ? @ 0xfe930ff in /usr/bin/clickhouse
10. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x8eb9fcd in /usr/bin/clickhouse
11. ? @ 0x8eb867f in /usr/bin/clickhouse
12. start_thread @ 0x7e25 in /usr/lib64/libpthread-2.17.so
13. __clone @ 0xfebad in /usr/lib64/libc-2.17.so
(version 20.8.12.2) ?
Не могу найти похожих запросов в истории чата. -
-
Connection refused (nocch02:9001)
-
Ага, только это во время старта CH
-
-
DirectoryMonitor это компонент Distributed таблицы который проталкивает инсерты в нижележащую таблицу. Т.е. когда вы делаете инстерт в Distributed таблицу, асинхронные инсерты сохраняются в ее каталоге в виде .bin файлов, DirectoryMonitor постоянно сканирует директории и пытается сделать инсерт в настоящую таблицу, тут он просто попытался подключиться к nocch02:9001 и его отбили, потому что порт 9001 (почему кстати 9001 ? по умолчанию 9000) никто не слушает. Это минорная проблема, DirectoryMonitor просто повторит попытку, до успеха. Если это ошибочный инсерт и его не должно быть можно просто удалить .bin файл из под-каталога noc.cpu / nocch02:9001 /
-
Спасибо
Если удалить bin файлы, то инсерты потеряются? -
да, если они нужны и лежат в неправильной подпапке их можно переложить, или можно сделать insert select используя Distributed format
select * from file('/var/lib/clickhouse/data/default/distr_1/default@not_existing:9000/1.bin', 'Distributed' -
Отлично
Спасибо!! -
Есть где то на английском/русском примеры использования bitmap функций ? А то только на китайском находил
-
Доброго времени суток. Подскажите пожалуйста, движок CollapsingMergeTree если в нем есть записть с sign -1 без пары, при мердже она будет удалена или оставлена?
-
Она останется
-
Спасибо
-
Здравствуйте.
Помогите разобраться с TTL:
У меня есть таблица с дефолтной политикой хранения и один диск / волум
В таблице уже есть данные
Теперь я хочу сделать так чтобы данные за последний месяц у меня хранились в горячем хранилище, остальные данные были в холодном
Я добавил в конфиге новую политику хранения с двумя новыми дисками, то есть теперь у меня есть
storage_policy: default
volume: default
storage_policy: hot_and_cold
volume: hot_volume, cold_volume
Можно ли изменить существующую таблицу так, чтобы она использовала новую политику хранения и при этом оставить данные?
И еще вопрос, можно ли использовать диск с дефолтной политики хранения как холодное хранилище (то есть один и тот же диск будут использовать обе политики хранения)? -
https://clickhouse.com/docs/en/sql-reference/statements/alter/setting/
ALTER TABLE db.table MODIFY SETTINGS storage_policy='hot_and_cold';SETTING | ClickHouse DocumentationTable Settings Manipulations There is a set of queries to change table settings. You can modify settings or reset them t
-
Добрый день! Возможно ли в CH реализовать сортировку выдачи с учетом группировки? Т.е. использую group by with rollup, получаю итоги по коллекции измерений, хочу отсортировать результат по суммируемому полю, но хочу, чтобы результат сортировался с учетом уже сгруппированных значений.
-
Добрый день!
Простой вопрос у меня...
Если использовать тип String вместо Uuid - будет ли просадка в производительности во время запросов? -
Подскажите плз, есть ли возможность CTE рассчитать один раз, а и использовать несколько раз в рамках одного запроса?
Сейчас у нас есть такой примерно запрос:
with some_ids as (select blah blah)
select something where something in some_ids
union all
select something else where something in some_ids
...
union all
select something else where something in some_ids
и видим, что some_ids выполняется как подзапрос много раз, а хотелось бы чтобы только однократно
Вариант, котороый вижу — использовать вместо CTE временную таблицу. Оно работает, но может быть можно проще/чище решить ту же задачу? -
вроде CTE в CH в настоящее время не матереализуется. То есть будет считаться каждый раз заново. Лучше создать временную таблицу.
-
Добрый день, можно ли как-то в лайв режиме посмотреть пишутся ли какие-то данные в CH? Хочу понять есть ли какие-то ещё источники данных, кроме известных мне, которые я приостановил
-
select * from system.processes;
-
Привет всем, а как можно запустить инст клика, если после рестарта сыпыт кучу ошибок
Empty part 20190713_0_0_0_1 is not created instead of lost part because there are no parts in partition 20190713 (it's empty), resolve this manually using DROP PARTITION.
И в конце прилетает
Application: DB::Exception: Suspiciously many (312) broken parts to remove.
Есть ли save mode? -
спасибо за ответ, возможно подскажете в чем дело:
если я указываю SETTING storage_policy='hot_and_cold' при создании таблицы, то все ок
но когда пытаюсь изменить для существующей:
ALTER TABLE test_db.test_tb MODIFY SETTING storage_policy='hot_and_cold';
получаю следующее:
DB::Exception: New storage policy default shall contain volumes of old one (version 21.6.3.14 (official build))
почему ругает default если я пытаюсь поменять на 'hot_and_cold'? -
в продолжении вопроса, как удалить сбойные партиции без клика 😕? не могу найти где они хранятся
-
https://github.com/ClickHouse/ClickHouse/blob/525999145e794c053669e2ed25730d768a7b159c/src/Disks/StoragePolicy.cpp#L273-L282
вот тут логика ошибки
вы слишком аггрессивно переименованиями volume занялись
там либо диска нет либо volumeClickHouse/StoragePolicy.cpp at 525999145e794c053669e2ed25730d768a7b159c · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
/var/lib/clickhouse/data/db/table
-
Всем привет. Подскажите плз как задать фильтр выбирающий даты между началом месяца и текущим днем?
Прописываю FTDAt >= toStartOfMonth and FTDAt <= toDate(now())
Запрос не проходит -
toStartOfMonth(now())
-
там их как раз и не было ) на то и ругался, нашел как завести через flags
-
-
Спасибо
-
Привет
А что означает сообщение от CH, когда я хочу выполнить INSERT в реплицируемую таблицу:
ode: 242. DB::Exception: Table is in readonly mode (zookeeper path: /clickhouse/tables/01/default/test_03). (TABLE_IS_READ_ONLY) (version 21.9.4.35 (official build))
Read only это по отношению к таблице или к zookeeper?
Вижу в zookeeper что директория появилась, после создания самой таблицы
ls /clickhouse/tables/01/default/test_03
[alter_partition_version, block_numbers, blocks, columns, leader_election, log, metadata, mutations, nonincrement_block_numbers, part_moves_shard, pinned_part_uuids, quorum, replicas, temp, zero_copy_hdfs, zero_copy_s3] -
это значит что репликация не работает, и не может подключиться к zookeeper либо таблица повреждена
-
-
Метаданных в ЗК может не быть
-
-
-
Понял, спасибо!
-
-
Хм, понял, не туда смотрел, логи из коробки есть. Спасибо.
-
метрика есть называется ReadOnlyReplica
-
см. system.metrics
и встроенный prometheus enpoint -
-
-
-
SQL Error [43]: ClickHouse exception, code: 43, host: 127.0.0.1, port: 36011; Code: 43, e.displayText() = DB::Exception: First argument for function arrayStringConcat must be array of strings.: While processing arrayStringConcat(arrOfShit, ';') AS y (version 21.8.4.51 (official build))
-
-
А не nullable(string)?
-
-
Я не знаю, я гадаю судя по ошибке.
Фильтр убирает, но тип может и не менять -
-
SELECT toTypeName(arrayFilter(x->x is not null, ['a', 'b', null]))
Array(Nullable(String)) -
Вы хотите, что бы arrayFilter особым образом обрабатывал условие is not null.
По мне, вот это странно.
И то, что в зависимости от условия она возвращает разные типы -
-
привет!
кто-нибудь знает, почему деление на 0 не преобразуется в Infinity? -
а какого типа у вас f?
-
хз что там показывает dbeaver и почему, но выше вам уже написали, что запрос:
SELECT toTypeName(arrayFilter(x->x is not null, ['a', 'b', null]))
возвращает Array(Nullable(String)).
по крайней мере на версии 21.3 -
float64
-
А в array(string) переделать возможно как-то?
-
-
конечно, например, с помощью CAST
SELECT toTypeName(CAST(arrayFilter(x->x is not null, ['a', 'b', null]), 'Array(String)')); -
можно поиском по чату, такие вопросы уже были
-
Всем привет!
Возможно, нубский вопрос, но что я сделал не таки почему движок БД не завёлся?
CREATE DATABASE psql_files2
ENGINE = PostgreSQL('10.54.197.137:5433', 'postgres', 'test', 'test', public)
Received exception from server (version 18.16.1):
Code: 336. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Unknown database engine:
ENGINE = PostgreSQL('10.54.197.137:5433', 'postgres', 'test', 'test', public). -
старая версия кликхауса?
-
Есть информация, с какой версии ClickHouse поддерживается движок PostgreSQL?
-
нету. обновите кликхаус )
-
а ответа на них не было
-
Можете подсказать по https://clickhouse.com/docs/en/interfaces/http/#response-buffering ?
Что это за ошибки такие, которые пишутся в конец ответа?HTTP Interface | ClickHouse DocumentationHTTP Interface The HTTP interface lets you use ClickHouse on any platform from any programming language. We use it for w
-
были ответы. вы что-нибудь из них пробовали?
-
-
а это например? https://t.me/clickhouse_ru/196509?thread=196507Denny Crane [Starship Captain at Altinity (NB,Canada)] in ClickHouse не тормозит
а рестарт КХ был? Кажется для <yandex><kafka> нужен рестарт
-
-
-
можно чуть подробнее?
-
По ссылке написано, что некоторые ошибки в кликхаусе определяются уже после того, как были посланы HTTP заголовки
-
Коллеги, привет!
Подскажите, пожалуйста, какой правильный конфиг для кафки при авторизации SCRAM-SHA-512?
При таком конфиге :
…
<kafka_topic_name>
<sasl_mechanism>SCRAM-SHA-512</sasl_mechanism>
<security_protocol>SASL_PLAINTEXT</security_protocol>
<sasl_username>user</sasl_username>
<sasl_password>password</sasl_password>
</kafka_topic_name>
…
Получаю такую ошибку:
2021.10.06 17:45:14.047832 [ 19355 ] {} <Error> StorageKafka (topic_name): [rdk:FAIL] [thrd:sasl_plaintext://host.ru:9093/bootstrap]: sasl_plaintext://host.ru:9093/bootstrap: SASL PLAIN mechanism handshake failed: Broker: Unsupported SASL mechanism: broker's supported mechanisms: SCRAM-SHA-512 (after 301ms in state AUTH_HANDSHAKE, 4 identical error(s) suppressed)
2021.10.06 17:45:14.047910 [ 19355 ] {} <Error> StorageKafka (topic_name): [rdk:ERROR] [thrd:sasl_plaintext://host.ru:9093/bootstrap]: 3/3 brokers are down -
например если выставленный таймаут на запрос сработает
-
Не уверен, что это можно полечить частичной буферизацией ответа
-
решил проблему установив offsets.topic.replication.factor=1 в kafka
-
всем добра!
system.query_log возвращает несколько метрик, к которым нигде нет описаний. может, кто-нибудь с чем-то из этого знаком? расскажите в двух словах 🤔
IOBufferAllocs
IOBufferAllocBytes
FunctionExecute
RWLockAcquiredReadLocks
SoftPageFaults
HardPageFaults -
Ещё такой вопрос: пытаюсь выбрать из здоровенной PostgreSQL-таблички 10 первых строчек. Почему выполнение зависает?
select hash from psql_files2.files limit 10;
SELECT hash
FROM psql_files2.files
LIMIT 10
Query id: 139bbed9-ff80-4fbe-82c5-36fe7227267a
→ Progress: 10.00 rows, 490.00 B (0.63 rows/s., 30.70 B/s.)
И всё. -
Добрый день, кто-нибудь сталкивался с проблемой, что при insert с русскими буквами, он выдает ошибку Cannot parse expression of type String here: 'tвest' , а если послать только английские буквы, все работает нормально?
-
>Все операции объединения, аггрегации, сортировки, условия IN [ array ] и ограничения LIMIT выполняются на стороне ClickHouse только после того, как запрос к PostgreSQL закончился.
https://clickhouse.com/docs/ru/engines/table-engines/integrations/postgresql/PostgreSQL | Документация ClickHousePostgreSQL Движок PostgreSQL позволяет выполнять запросы SELECT и INSERT для таблиц на удаленном сервере PostgreSQL. Соз
-
Ох, не увидел. Спасибо.
-
Какими конфигурационными параметрами надо приправить блюдо из clickhouse и liquidbase, чтобы при запекании в кластере из одного шарда и двух реплик стабильно получать актуальную структуру БД?
Перебрал уже кучу параметров которые кажутся похожими на то что нужно:
mutations_sync = 2, replication_alter_partitions_sync=2, distributed_ddl_task_timeout= -1, database_atomic_wait_for_drop_and_detach_synchronously = 1, load_balancing=in_order
Но всеравно через раз накат падает на каком нибудь ddl -
Подскажите плиз, можно ли с помощью clickhouse-copier перекинуть данные в кластер, где таблицы немного отличаются (убрал nullable).
Так же какую-то обработку данных провернуть (типо toUpper) перед вставкой в место назначения.
Перерыл инет, не нашел.
Как это еще можно провернуть, не написав свой "clickhouse-copier" ?
Либо таки привести старую таблицу в соответствие с новой (около 100гб данных)? -
Потому что в самом постгресе обрабатываются только простые операторы типа =,>,< а все остальное на стороне КХ в том числе и лимиты
-
Всем привет, подскажите пожалуйста, как можно отключить OPTIMIZE DEDUPLICATE во время выполнения переноса clickhouse-copier'ом ?
Версия сервера: 20.6.10.2
На самой свежей есть: optimize_on_insert = 0 и если сделать select count() from db.table то данные совпадают. - 09 October 2021 (27 messages)
-
-
Те что есть в основном пересказ документации
-
Понятно, спасибо.
-
Добрый день, получилось разрешить? аналогичная проблема только с другим форматом
-
Попробуйте новый клиент, возможно в вашей версии не было протобафа
-
Аналогично
-
Попробуйте выполнить просто select без создания матвьюхи. Он наверно ничего не вернёт потому что там where кривой или в источнике нет данных.
-
Select? И много там строк?
-
Тогда запрос на создание матвьюхи покажите.
-
Select бы тоже не помешал
-
Т.е. where вообще нету?
-
Можно Для теста попробовать поменять SummingMergeTree на MergeTree.
-
у меня такой запрос не отрабатывает, из доков: SELECT SearchPhrase, count() AS c FROM test.hits GROUP BY SearchPhrase ORDER BY c DESC LIMIT 5 FORMAT Template SETTINGS format_template_resultset = '/some/path/resultset.format', format_template_row = '/some/path/row.format', format_template_rows_between_delimiter = '\n '
-
Есть у кого нибудь пример работающего запроса с ... FORMAT Template SETTINGS ... ?
-
да вы правы, поставил новый клиент проблема исчезла, но появилась другая ошибка) будем курить дальше
-
Значит фиксите параметры SummingMergeTree. Если есть не числовые параметры, отсутствующие в order by / primary key, то могут быть проблемы.
-
-
можно, смотрите настройки
SELECT * FROM system.merge_tree_settings WHERE name LIKE '%wide%'; -
На лету смогу переключить?
-
ALTER TABLE xxx ON CLUSTER 'xxx' MODIFY SETTING
-
да
-
-
Продолжайте дебажить.
-
Привет, нужна помощь
Есть сотня поставщиков данных, которые передают в среднем по 2 млн идентификаторов (int64).
Есть задачи:
- хранить последний переданный набор
- по запросу получать массивы непересекающихся id от двух заданных поставщиков
С clickhouse знаком поверхностно, нужна помощь в формировании
- схемы базы данных
- запросов
Само-собой не беслпатно 🙂
Напишите, в лс, плз -
-
-
Всем привет! После обновления корневых сертификатов и рестарта всего кластера из кликхаусов, один из них стал набирать место. Таблица перестала чиститься по ттл. Кто нибудь сталкивался с такой особенностью? Врятли только обновление серта на это повлияло... Версия 21.6.6.51
- 10 October 2021 (22 messages)
-
Summingmgt не хранит строки с 0 в метриках. Курите доку
-
Скорее всего мерж идет. В новых версиях мерж отменяется при truncate
-
А начиная с какой версии?
-
Привет всем, а clickhouse-copier может копировать не из кластера?
И нет ли более подробной о нем инфы, помимо документации? -
v21.8
Cancel already running merges in partition on DROP PARTITION and TRUNCATE for ReplicatedMergeTree. Resolves #17151. #25684 (tavplubix -
Там используется зукипер, нужен самому копиру. Зачем вам копир? можно без него insert select from remote
-
Данных 170+ гб, в одной из таблиц 9 лярдов записей.
-
Или для такого решения плевый обьем данных?) Я бы ещё плюс ко всему хотел немного подправить данные перед вставкой. Получается только это вариант есть? Спасибо
-
Копир тоже insert select делает. Вот в select и исправите
-
Спасибо 👍 понял, буду делить запросы на пачки тогда.
-
Спасибо!
-
А вы матвью на таблицу делаете?
-
Каскадно матвью не работает. Точно не знаю почему, но логика подсказывает что в матвью приходят строки из той таблицы в которую строки вставляют. Таким образом в первую матвью данные попадают в результате инсерта, но при этом во вторую не попадают ведь в первую матвью прямого инсерта не происходит
-
Попробуйте сделать инсерт в первую матвью
-
https://github.com/ClickHouse/ClickHouse/issues/7195 возможно дело в этомData not insert to MATERIALIZED created from another MATERIALIZED VIEW · Issue #7195 · ClickHouse/ClickHouse
Describe the bug or unexpected behaviour When I create MATERIALIZED view from another MATERIALIZED view, data not auto insert from the first view to the second view. How to reproduce Create table a...
-
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/summingmergetree/
Common Rules for Summation
...
If the values were 0 in all of the columns for summation, the row is deleted. -
create table S(key Int64, amount Int64) Engine=SummingMergeTree order by key;
insert into S values(1, 0);
select * from S;
0 rows in set. Elapsed: 0.001 sec.
create table A(key Int64, amount SimpleAggregateFunction(sum, Int64)) Engine=AggregatingMergeTree order by key;
insert into A values(1, 0);
select * from A;
┌─key─┬─amount─┐
│ 1 │ 0 │
└─────┴────────┘ -
-
вы издеваетесь?
-
Есть парт 1 и парт 2 в партиции 202109.
Идет мерж который из них уже 3 часа создает парт 3, и будет идти еще час.
Запускаем alter table drop partition 202109.
Ваши предложения как сделать drop partition без его блокировки? -
или вот пример база Ordinary
create table dt(a Int64) Engine=MergeTree order by a;
insert into a.dt select number from numbers(100000000);
select a, sleepEachRow(3) from dt format Null;
запускаем селект
select a, sleepEachRow(3) from dt format Null;
в другом окне
drop table dt; -- зависает на блокировке на 120с
в третьем окне
select * from system.tables; -- зависает на блокировке на 120с -
я же написал -- отменяет мерж.
- 11 October 2021 (118 messages)
-
Товарищи, подскажите пожалуйста!
Установил ClickHouse на дохлую виртуалку в облаке за 5$ с 1Гб памяти для разработки, отладки
рядом крутится еще много чего, но все нормально себя чувствует..
Ничего с ним не делал, из коробки запущен + пара тестовых строк в одну таблицу.. периодически он что-то начинал делать, вешал систему на некоторое время так что подвисала вообще вся сетевая подсистема, даже подключение по ssh отваливалось и клиенты от моего backend приложения (срабаотывали таймауты в аж 10 секунд)
Удалил его т.к. эта проблема мешала работе других сервисов, но хотелось бы понять что он делал и можно ли как-то настроить чтобы и на дохлой машине можно было с ним жить -
для эксперимента установил снова по инструкции отсюда https://clickhouse.com/docs/ru/getting-started/install/
запустил, сразу же полезла нагрузка..
месяцами там крутится postgresql, redis, tarantool и еще всякого по мелочи, но весь зоопарк ресурсов без дела не потребляет -
2021.10.11 05:34:51.499304 [ 22 ] {} <Error> TABLE_NAME DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 27, e.displayText() = DB::Exception: Cannot parse input: expected columns format version: 1\n at end of stream., Stack trace:
0. /usr/bin/clickhouse-server(StackTrace::StackTrace()+0x16) [0x78d5e46]
1. /usr/bin/clickhouse-server(DB::Exception::Exception(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)+0x22) [0x37ef832]
2. /usr/bin/clickhouse-server(DB::throwAtAssertionFailed(char const*, DB::ReadBuffer&)+0x17f) [0x7901baf]
3. /usr/bin/clickhouse-server() [0x7901ca6]
4. /usr/bin/clickhouse-server(DB::NamesAndTypesList::readText(DB::ReadBuffer&)+0x44) [0x6ac4234]
5. /usr/bin/clickhouse-server(DB::MergeTreeDataPart::loadColumns(bool)+0x3e1) [0x6f57771]
6. /usr/bin/clickhouse-server(DB::MergeTreeDataPart::loadColumnsChecksumsIndexes(bool, bool)+0x3d) [0x6f58fdd]
привет, закончилось место и что-то осталось криво записаное на диске, как найти то что лосмалось и зачинить? -
1 Gb
и при этом у тебя там фоновые процессы идут какие нибудь наверняка
в том числе связанные с clickhouse
background_pool_size = 1 поставь
и
max_threads= 1
будет поменьше памяти жрать и в свап не сваливаться
но тебе скорее всего clickhouse не нужен -
какая версия clickhouse?
в новых версиях вроде довольно подробно показывается где все случилось... -
19.8.5 🙁
-
подскажите плиз, апгрейд через pkg-manager install прокатит? кроме конфигов обычно надо что-то дополнительно присядать ?
-
А ещё логи посмотри, КХ любит их забивать. По умолчанию настроено логирование на события begin_query & end_query. У меня таким образом место в 0 съело как то. Таблица 1 гб и логи 70гб)
-
ну прокатить то прокатит, но все равно надо проверять
слишком старая версия
я вам последовательно сначала до 20.3 сначала обновиться советую, потом до 21.3 потом 21.8 -
ну он вроде как в логи и смотрит...
но да, надо парой строк выше посмотреть, может там есть конркетная таблица... -
Collect common system metrics (in system.asynchronous_metrics and system.asynchronous_metric_log) on CPU usage, disk usage, memory usage, IO, network, files, load average, CPU frequencies, thermal sensors, EDAC counters, system uptime; also added metrics about the scheduling jitter and the time spent collecting the metrics. It works similar to atop in ClickHouse and allows access to monitoring data even if you have no additional tools installed.
Можно выключить в конфиге. -
подскажите, пожалуйста, как то можно оптимизировать MV с агрегатными состояниями?
Хочется получить таблицу вида:
CREATE MATERIALIZED VIEW test_mv
(`id` String, `created_dttm` AggregateFunction(min, DateTime),
`event` AggregateFunction(argMin, String, DateTime) )
но при этом с использованием в PARTITION KEY & ORDER KEY created_dttm? это вообще достижимо или я хочу странного?) -
чего вы хотите добиться делая order by AggregateFunction? Как это должно работать?
для min лучше применять simpleaggregatefunction. -
в голове это выглядит так, что я хочу иметь какую то конструкцию из которой можно максимально быстро доставать записи для которых minMerge(created_dttm) соответствовал today()
а чем simpleaggregatefunction будет лучше? -
-
https://clickhouse.com/docs/en/interfaces/formats/#csv скорее всего. Там также описана настройка, которая позволяет разделитель задать.Input and Output Formats | ClickHouse Documentation
Formats for Input and Output Data ClickHouse can accept and return data in various formats. A format supported for input
-
Уже попробовал
Выдает такую ошибку: -
-
Только странно
В данных на самом деле там нет точки -
вы CSVWithNames используете?
-
-
-
-
хранит просто число, не нужно использовать комбинаторы State Merge
https://kb.altinity.com/altinity-kb-queries-and-syntax/simplestateif-or-ifstate-for-simple-aggregate-functions/ -
А если включить input_format_allow_errors_num=1,input_format_allow_errors_ratio=0.1
-
Всем привет, вопрос про direct внешний словарь https://clickhouse.com/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout/#direct
Что делает кликхауз при запросе данных из такого словаря с условиями либо когда словарь джойнят с таблицей из кликхауса? Он же не выкачивает все данные из внешней базы (например, postgress) для того чтобы потом самостоятельно фильтровать или джойнить?Хранение словарей в памяти | Документация ClickHouseХранение словарей в памяти Словари можно размещать в памяти множеством способов. Рекомендуем flat, hashed и complex_key_
-
возникла какая-то похожая ошибка
-
-
Этой точки нет во второй строке?
-
Да, ее тоже нет. Более того, можно заметить, что сейчас программа подняла ошибку раньше по строке, чем в ошибке на первом скрине. Также видно, что и в том, и в этом случае программа застопорилась перед сочетанием символов "NUM" (в первый раз на названии колонки SHIFTNUM, а сейчас на CHECKNUM).
-
А в таблице кол-во колонок совпадает?
echo "a;b;c.\n1;2;3" | clickhouse-local --input-format CSVWithNames -S "a UInt32, b UInt32, c UInt32" --query "SELECT * FROM table" --format_csv_delimiter=";" --input_format_with_names_use_header 0 -
-
-
-
input_format_with_names_use_header 0 попробуйте эту настройку
-
-
Да, можно
-
стоит ли в миграции добавлять материализацию индекса? или лучше один раз применить через консоль
-
Ошибка
Я заметил еще одну закономерность
Чем длиннее строка с запросом, тем короче строка с столбцами. При том точка возникновения ошибки, согласно отладочному сообщению, все три раза была на позиции 91, что навевает некие подозрения -
--data-binary а если такое использовать?
-
-
Сделал так
Та же ошибка
И мне пришло в голову - скорее всего, запятые, как и пробелы, в url-кодировке выглядят иначе
И правда -
Нет
Ничего не изменилось
Обработчик ClickHouse в сообщении ошибки указывает, что на позиции 91 он падает
В ClickHouse-диалекте SQL случайно не надо экранировать точки с запятой внутри строк? -
-
добрый день!
подскажите, как можно перевести в lowerCase стринги в двумерном массиве?
пример массива
['[gmail.com, 6]','[denwer.ru, 7]'] -
Пока ALTER TABLE ... FREEEZE ... работает, в таблицу можно писать или нет? В доках написано что The entire backup process is performed without stopping the server., но непонятно что имеется ввиду под stop. Без остановки процесса? Без каких-либо ограничений на чтение/запись?
-
SELECT ['[gmail.com, 6]','[denwer.ru, 7]'] as arr
, arrayMap(x -> lower(tuple(x).1), arr) as result
; -
спасибо!
-
чуть проще тоже работает
select arrayMap(x->lower(x),['[GMAIL.com, 6]','[DENWER.ru, 7]']), ['[GMAIL.com, 6]','[DENWER.ru, 7]']; -
Конечно можно писать и читать
-
Спасибо 👍
-
👍🏼
-
Слушайте, а правильно ли я понимаю, что DateTime лучше всего создавать с tz все-таки в большинстве случаев? Просто сталкиваюсь сейчас с проблемой, что написано в ответе по данному issues относительно времени:
https://github.com/ClickHouse/ClickHouse/issues/24070
и прихожу к выводу, что timestamp (судя как и по документации), логически хранить с timezone, правильно? или нет?)various time values from now() · Issue #24070 · ClickHouse/ClickHouseThis query returns various values of time (screenshot attached) {code:sql} select now(), toStartOfHour(now()), toHour(now()), toString(now()), toDateTime(now()) {code} Why is the difference between...
-
нет.
Надо просто понять что TZ это просто метаданные колонки (и даже не колонки в таблице) , а колонки select-а и insert-а
JDBC драйвер 100500 раз переделали уже, в будущем JDBC драйвер будет показывать время в TZ колонки селекта а не в TZ jvm.
но JDBC драйвер на самом деле ничего не показывает, он передает в java в TZ, а java при рендеринге в строку, конвертирует в TZ jvm -
даааа, понятна, окей, спасибо, надо подумать
-
в КХ все значения DateTime лежат в UTC (число секунд от 1970), TZ это просто намек как парсить и рендерить строки.
дефолтная TZ задается 3 способами, в конфиге, через env переменную TZ, через таймзону сервера (линукс) -
-
-
в смысле добавления новой реплики?
-
-
устанавливаете КХ, копируете etc/cli... конфиги
запускаете КХ, берете с существующей реплики create table .... , можно взять в system.tables там есть поле,
прогоняете все create database, create table -
-
вы используете Replicated таблицы? Зукипер используется?
-
-
отреплицируются в фоне
-
-
Всем привет!
Вопрос по занимаемому месту в памяти словарями
Есть словарь со структурой:
CREATE DICTIONARY dict (
`id` UInt64,
`from` DATE,
`to` DATE,
`count` UInt32
) PRIMARY KEY ws_id SOURCE(CLICKHOUSE())
LIFETIME(0)
LAYOUT(RANGE_HASHED())
RANGE(MIN from MAX to)
Фактически, в словаре 3 423 993 записей и он занимает 536871056 байт, а это 512 МБ памяти.
На мой взгляд, должно быть в 10 раз меньше тк каждая строчка это Uint64 + date + date + uint32 = 8 + 2 + 2 + 4 = 16 байт на 1 строчку.
3423993 (строчек) * 16 (размер строчки) = 54783888 байт = 52,25 МБ
Вопрос в том, почему он сожрал 512МБ, что почти в 10 раз больше расчетного? -
10 times mem overhead on complex_key_hashed dictionary ( 227 MiB table eats 2.50 GiB) · Issue #2738 · ClickHouse/ClickHouse
create table test(a Int64, b Int64, s String) Engine=MergeTree partition by tuple() order by b; insert into test select rand64(), number, toString(number) from numbers(10000000); optimize table tes...
-
вторая метрика совпадает с system.merges
у вас есть мутации, но они не выполняются, возможно там например синтаксическая ошибка -
Спасибо!
-
в словаре каждый атрибут в своей хештаблице и сами хештаблицы имеют суровый оверхед.
есть SPARSE_HASHED https://kb.altinity.com/altinity-kb-dictionaries/altinity-kb-sparse_hashed-vs-hashed/ -
если к запросу с мутациями добавить
AND latest_fail_reason = ''
то результат такой же. То есть мутации не падают. Почему тогда они не выполняются? -
может в пуле нет свободных тредов, может еще одна из 49 причин.
надо смотреть system.merges / mutations / replication_queue / текстовые логи
а может качается парт с реплики который должен быть мутирован, и не может скачаться
а может есть парт в ZK , а на диске его нет, он давно потерялся, и мутации его ждут -
Спасибо, пойду изучать! )
-
Я смотрел, на некоторых мутациях количество parts_to_do уменьшается , то есть что-то происходит
-
-
Кажется, нужен КХ 21.6+ (в версии могу ошибиться, поправьте),
и включить экспериментальную фичу окон:
<allow_experimental_window_functions>1</allow_experimental_window_functions> -
Всем привет! Столкнулся с проблемой хранения Array(UInt64) в качестве аттрибута словаря. Словарь переходит в статус LOADED, но при запросе к нему нода уходит в рестарт. В логах при этом такое:
Cannot open file /var/lib/clickhouse/store/da9/da9e0f5d-ab6c-48e8-b768-33a16bbb9fea/dictionaries.sql, errno: 2, strerror: No such file or directory,
Максимальный размер массива который пытаюсь загрузить 166.5к айтемов, средний 3.5к. Пробовал с Flat и Hashed - результат один и тот же. Версия клика - 21.3.13. Как костыль пока приходится писать вместо массива строку с делимитером, так работает. Никто с таким не сталкивался? -
обновитесь до 21.8
https://github.com/ClickHouse/ClickHouse/pull/25119Dictionaries support array type by kitaisreal · Pull Request #25119 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Closes #2135. Closes #1640. Closes #25085. Changelog category (leave one): New Feature Changelog entry (a...
-
А, вот оно что. Спасибо!
-
Ура, следующий ClickHouse Meetup совсем скоро!
19 октября команда разработки аналитической СУБД ClickHouse вновь проведёт онлайн-встречу с сообществом.
У нас много новостей :)
Расскажем о больших организационных изменениях в ClickHouse, об UDF in ClickHouse о шифровании хранимых данных в ClickHouse.
Вы можете заранее прислать вопросы через форму регистрации или задать их в чате во время трансляции. Ссылку на прямой эфир мы отправим вам на почту в день встречи.
Узнать программу выступлений и зарегистрироваться можно по ссылке: https://events.yandex.ru/events/click-house-19/10/2021?from=tg.
Участие бесплатное.🙂Link19 октября команда разработки аналитической СУБД ClickHouse вновь проведёт онлайн-встречу с сообществом. У нас много новостей) Расскажем о больших организационных изменениях в ClickHouse, об UDF in ClickHouse о шифровании хранимых данных в ClickHouse. Вы можете заранее прислать вопросы через форму регистрации или задать их в чате во время трансляции. Ссылку на прямой эфир мы отправим вам на почту в день встречи.
-
None
-
Онлайн, но как полноценная конференция - запись из студии и т. п.
-
Прям на мой др)
-
Форма не найдена
Возможно, вы получили неверную ссылку или форма была удалена. -
Минуту, сейчас поправим.
-
-
-
-
-
Не действительна форма для регистрации
-
Благодарю
-
Пофиксили!
можно регаться! -
Всем привет! Подскажите, пж, как запустить скрипт с этим куском, выдает ошибку, не понимаю из за чего, скрипт отдельно запускается
-
-
С флагами -m -n попробуйте запустить
-
Передавайте привет разработчику виджета ввода даты рождения
-
а можно подробнее пожалуйста?)
-
Откуда запросы идут?
-
с базы кх через dbeaver
-
Эта задача есть в беклоге)
Подниму её приоритет -
Про dbeaver не подскажу. Если запросы идут в одной сессии, попробуйте все команды по одной выполнить
-
по 1 вместе со скриптом тоже на запускает
-
/stat@combot
-
-
/stop
-
Валится на первом же запросе?
-
ага
-
-
ага
-
Не может быть. Один же запрос посылается. Попробуй убрать точку с запятой что ли)
-
убирала
-
dbeaver использует HTTP протокол для работы
там параметры задаются не через SET а через query stirng
найдите настройки подключения -> расширенные
и попробуйте задать там...
или используйте clickhouse-client для запуска запросов -
Можно попробовать параметры в SETTINGS перенести: https://clickhouse.com/docs/en/sql-reference/statements/select/#settings-in-selectSELECT Query
SELECT Query SELECT queries perform data retrieval. By default, the requested data is returned to the client, while in c
-
set можно писать в одну команду (через запятую) set a=5,b=5,c=6;
через dbeaver конечно можно сделать set но нужен session_id
и receive_timeout смысла ставить нет (хотя может фиг знает, но в общем он повлияет на distributed запросы, но не на клиента) -
два вопроса:
1) как проапдейтить одно поле в колонке с json.
2) как проапдейтить одно поле в колонке с массивом. -
ну никак
https://stackoverflow.com/questions/63287790/set-array-value-at-specific-index-in-clickhouseSet array value at specific index in ClickHouseIs it possible to update an array at specific index in existing row in ClickHouse db? Something like alter table mytable set arr[3]=8
-
чёт сложно
- 12 October 2021 (113 messages)
-
Здравствуйте. Время МСК?
-
Да.
-
-
В конфиге пользователя или в отдельном конфиге в папке config.d
-
В профиле default почему-то не сработало. Сервер не запускается
-
Добрый день.
Можете подсказать возможную причину зависания
команды DROP TABLE ?
Незавершенных мутаций и слияний нет, полные права. После рестарта сервера CH команда выполняется успешно.
Версия сервера: 21.6.4.26 -
Зависание случается редко, но причина непонятна
-
SELECT * FROM system.databases WHERE name='your_db' FORMAT Vertical
если Ordinal, тогда это попытка взятия экслюзивной блокировки, если вставка идет например или чтение...
если Atomic
тогда используйте DROP TABLE ... SYNC -
Спасибо за ответ. База Atomic. Попробую ...SYNC
-
Всё, разобрался. В документации значение 1/0, а реально в конфиге работает True/False
-
странно, у меня сработало через 1
-
Тоже сработало. Пробел был.
-
-
Да, забыл написать. Сервер КХ один, без реплик и шардов
-
добрый день, коллеги! сразу прошу тапками не кидаться, с КХ работаю впервые. суть такова: планируется использоваться КХ как хранилище метрик графит-мониторинга, в целом всё развернуто и работает, единственный момент, с которым я очевидно накосячил - репликация и шардирование. кластер КХ на данный момент состоит всего из 2 нод с репликацией через зукипер. Задача в том, чтобы при отвале по каким-либо причинам одной из нод вторая обладала полным набором данных. я своими кривыми руками сделал две шарды, в каждой из которых описал в качестве реплик обе ноды кластера (зачем - сам не знаю). и, насколько я понимаю, правильнее было бы использовать один шард с двумя репликами для данной задачи. вопрос в следующем: как не потерять исторические данные и не оставить дублей при переходе на один шард с двумя репликами? заранее спасибо
-
А вы какие таблицы сделали? Пишите через дистрибьютед?
-
пишу через обычные, а читаю через дистрибьютед
-
-
Через обычные это какие?
можете прислать DDL -
CREATE TABLE graphite.graphite_index ON CLUSTER test_cluster_two_shards (`Date` Date, `Level` UInt32, `Path` String, `Version` UInt32) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/{database}/{table}', '{replica}', Version) PARTITION BY toYYYYMM(Date) ORDER BY (Level, Path, Date) SETTINGS index_granularity = 8192;
CREATE TABLE graphite.graphite_reverse ON CLUSTER test_cluster_two_shards (`Path` String, `Value` Float64, `Time` UInt32, `Date` Date, `Timestamp` UInt32) ENGINE = ReplicatedGraphiteMergeTree('/clickhouse/tables/{shard}/{database}/{table}', '{replica}', Date, (Path, Time), 8192, 'graphite_rollup');
CREATE TABLE graphite.graphite_tagged ON CLUSTER test_cluster_two_shards (`Date` Date, `Tag1` String, `Path` String, `Tags` Array(String), `Version` UInt32, `Deleted` UInt8) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/{database}/{table}', '{replica}', Date, (Tag1, Path, Date), 1024, Version); -
я, видимо не понимаю, у вас таблицы Replicated
если таблицы созданы на двух серверах, то данные будут на двух серверах. -
ну, мне и нужно, чтобы они были на двух серверах. каждый должен иметь полный набор данных на случай выхода из строя одного из узлов кластера, но мне видится, что я все равно что-то сделал неправильно
-
-
CREATE TABLE graphite.graphite_index_distributed ON CLUSTER test_cluster_two_shards AS graphite.graphite_index ENGINE = Distributed('test_cluster_two_shards', 'graphite', 'graphite_index');
CREATE TABLE graphite.graphite_reverse_distributed ON CLUSTER test_cluster_two_shards AS graphite.graphite_reverse ENGINE = Distributed('test_cluster_two_shards', 'graphite', 'graphite_reverse');
CREATE TABLE graphite.graphite_tagged_distributed ON CLUSTER test_cluster_two_shards AS graphite.graphite_tagged ENGINE = Distributed('test_cluster_two_shards', 'graphite', 'graphite_tagged'); -
так вы прислали 3 разные таблицы, если они есть на обоих серверах, то данные будут идентичны на двух.
Зачем читать через Distributed если данные одинаковы на двух серверах?
вам достаточно читать из одной таблицы одного сервера -
а движок БД то какой? Atomic или Ordinary ?
-
насколько я понял, запрос в distributed таблицы при определенных условиях позволяет распределять выполнение на узлах, обладающих запрашиваемыми данными, что позволяет ускорять выполнение. запросы отправляет Grafana, данных может быть запрошено достаточно много, поэтому если это действительно ускоряет выполнение запросов, я бы хотел это использовать
-
если вы хотите и репликацию и шардирование, то, вероятно вам мало машин, нужно 2х2 сделать минимум
-
то есть если я правильно понимаю, с моим текущим количеством серверов, мне не нужно использовать шардирование и дистрибьютед таблицы, а просто использовать репликацию, а читать данные из любого узла кластера, да?
-
в зависимости что вам нужнее, если нужна надежность в хранении, то оставляйте репликацию, если есть прирост в скорости выполнения и вам это важно, то используйте шард
я до сих пор не понял вашу конфигурацию)
у вас 3 репликейтед таблиц-это означает что вы сделали реплицированные таблицы. у вас 2 машины. Если вы создали обе таблицы на двух машинах - у вас данные должны быть одинаковыми на обоих. И поверх этих двух таблиц у вас дистрибьютед таблица. То есть она читает данные с двух одинаковых таблиц, итого получается, что вы просто читатете 2 раза одни и те же данные, получаете дубликаты. -
да, так и есть, я очевидно ошибся в конфигурации. сейчас передо мной стоит дилемма как исправить конфигурацию не потеряв данных. допустим на данный момент я готов отказаться от распределенных запросов и хочу сделать, чтобы у меня был один шард с 2 репликами 3 таблиц, чтобы я мог читать из любого узла кластера. не получится же просто изменить конфигурацию сервера с
<test_cluster_two_shards>
<shard>
<replica>
<host>server1</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>server2</host>
<port>9000</port>
</replica>
</shard>
</test_cluster_two_shards>
на
<test_cluster_two_shards>
<shard>
<replica>
<host>server1</host>
<port>9000</port>
</replica>
<replica>
<host>server2</host>
<port>9000</port>
</replica>
</shard>
</test_cluster_two_shards> -
так вам и не нужно вообще использовать remote_servers для двух реплик
он ходит по interserver_http_port+interserver_http_host+zookeeper
насколько я помню это достаточно для репликации -
спасибо, сейчас полистаю документацию!
-
Всем привет, есть вот такой драйвер github.com/mailru/go-clickhouse для golang, мы пытаемся использовать дополнительный батчер github.com/nikepan/clickhouse-bulk перед сервером кликхауса. Все инсерты попадают в батчер, но в кликхауз не уходят, при этом батчер не пишит ошибок и доп логов для того чтобы можно было бы понять в чем проблема.
Конфиг батчера
# enable debug logging
CLICKHOUSE_BULK_DEBUG=true
# count of rows for insert.
CLICKHOUSE_FLUSH_COUNT=100
# insert interval. milliseconds
CLICKHOUSE_FLUSH_INTERVAL=100
# how often cleanup internal tables - e.g. inserts to different temporary tables, or as workaround for query_id etc. milliseconds
CLICKHOUSE_CLEAN_INTERVAL=0
CLICKHOUSE_REMOVE_QUERY_ID=true
# interval for try to send dumps (seconds); -1 to disable
DUMP_CHECK_INTERVAL=5
# wait if server in down (seconds)
CLICKHOUSE_DOWN_TIMEOUT=60
# wait for server connect (seconds)
CLICKHOUSE_CONNECT_TIMEOUT=10
# override TLS serverName for certificate verification (e.g. in cases you share same "cluster" certificate across multiple nodes)
# CLICKHOUSE_TLS_SERVER_NAME=
# INSECURE - skip certificate verification at all
CLICKHOUSE_INSECURE_TLS_SKIP_VERIFY=true
# comma separated list of servers
CLICKHOUSE_SERVERS=http://user:password@clickhouse:8123/db
Пытались менять интервалы и использовать remove query id, но ничего не происходит.
В сервисе перед батчером сейчас дополнительно копится мелкий батч (старое решение) и потом через tx и prepare отправляется дальше.
В чем может быть проблема не попадания инсертов в кликхауз даже не знаю, может быть кто то сталкивался с этой проблемой? -
Разобрался, вот тут mailru авторы драйвера говорят что совместим с https://github.com/nikepan/clickhouse-bulk, но в реальности их пример https://github.com/mailru/go-clickhouse/tree/v1.7.0#example не работает вместе с clickhouse-bulk.
РЕШЕНИЕ не использовать Tx и Stmt все инсерты выполнять по одному а не батчем. -
ну поскольку там HTTP транспорт, можно пытаться смотреть как оно там по HTTP прилетает и в чем разница на уровне HTTP
-
Добрый день!
мы в команде проводим performance тестирование Clickhouse, чтобы определиться со схемой и дизайном работы приложения с бд. И недавно получили неожиданные для меня результаты сравнения дедупликационных функций - final, limit by, subquery, argMax.
Для одной широкой таблицы ReplacingMergeTree с 10 миллионами строк, у которой регулярно делается update (insert with duplicated primary key + merge), Final оказался стабильнее и шустрее.
это расходится с выводами TinyBird вот в этой статье https://guides.tinybird.co/guide/deduplication-strategies
Может у кого-нибудь будут идеи с чем это могло бы быть связано?Deduplication Strategies in ClickHouse · Tinybird GuideDeduplicating data on query time, doing upserts on ClickHouse and using Materialized views to do last-point analytics.
-
-
>у которой регулярно делается update
насколько регулярно? сколько раз в минуту? -
можно выбрать нужные партиции из system.parts, и дропнуть их
-
не могу сказать сколько в минуту, так как мы создаем thread pool из 10 потоков и создаем длинный список runnable jobs , которые и делают insert/deduplicated read. Каждый поток по мере выполнения работы берет следующую
Мы пытались сделать тест как можно более натуральным -
Всем привет. Может кто сталкивался с такой проблемой.
Есть foreign table на постгре, которая завязана на таблицу на кликхаусе.
При попытке селекта из этой таблицы на постгре выбрасывает clickhouse_fdw: unsupported type
Причем ругается на колонки которые на кх имеют тип decimal(20,5) а на постгре numeric( хотя уже все перепробовал)
Как такую проблему устранить? -
вы же пачками вставляете? хоть приблизительно как часто? можно хоть чутка инфы плиз?
много вопросов - мало ответов. и у вас и в статье, на которую вы дали ссылку нет никаких цифр. здесь в чатике выше выкладывали такое сравнение. final был медленнее как и в статье, но не сильно. на разных данных и настройках цифры могут поменяться и в обратную сторону.
мне проще FINAL юзать.
>Final оказался стабильнее и шустрее.
а чем argMax оказался менее стабильным? падают запросы? -
конкретно этот сценарий мы специально сделали как единичные вставки, так как в реальном приложении относительно редко (в среднем раз в пару минут), но юзера редактируют отдельные строки и хотят видеть актуальный результат действий.
по цифрам если говорить - single table ReplacingMergeTree c 10 миллионами строк и 3 колонки (id, timestamp, custom column).
Мы создаем 100 батчей с 100_000 строк для фоновой вставки (симулировать живую активную платформу) и еще 100 пар insert/deduplicated read queries и все это стримим в виде runnable jobs (~ 200 in total) для 10 потоков.
Читаем мы 50_000 строк за раз (с where & primary index), используя Final или другие способы.
Если так правильно делать расчеты, то по формуле (read batch size)/time : final дает 200-230 rows per sec производительность
> argMax не падал, скорее ее производительность оказалась более чувствительной к изменениям read batch size или самой таблицы вцелом. -
-
товарищи, у меня наивный вопрос по архитектуре - я правильно понимаю, что CH хорошо в целом подходит для систем потипу event-sourcing, но только когда у нас не так много типов эвентов и мы можем все лить потоком в одну табличку?
-
грубо говоря, есть с десяток видов эвентов, мы берем всегда по диапазону таймстемпов и внутри фильтруем конкретные типы и прочие штуки
-
я верно рассуждаю?
-
нет, сейчас почитаю, спасибо!
-
В целом да
-
максимально избегаем джойнов, пишем все в широкую таблицу
-
а чем лучше заливать поток данных? я слышал, что чтение из кафки нативное у CH работает не очень
-
-
В целом допиливается и вполне ок (многие наши клиенты используют Kafka engine)
Гарантии -> at least once
Сейчас делают транзакции для кх, тогда и будут атомарные вставки. -
А где то можно подробнее про транзакции узнать, что там готовится?
-
https://github.com/ClickHouse/ClickHouse/issues/22086
https://github.com/ClickHouse/ClickHouse/pull/24258[RFC] Limited support for transactions in MergeTree tables · Issue #22086 · ClickHouse/ClickHouseUse case Main use cases: Ability to execute multiple INSERTs (maybe into multiple MergeTree tables, including materialized views, #11909) in a single "transaction". All INSERT que...
-
подскажите пожалуйста нет ли какого-то решения для интеграции Greenplum и ClickHouse вроде решения от Arenadata https://docs.arenadata.io/adb/adbClickhouse/Configuration.html
-
не припоминаю, в КХ вроде интеграций нет. Разве что самим придумать как мигрировать данные.
-
можете через ODBC попробовать подключиться
-
из CH можно можно подключиться к GP через https://clickhouse.com/docs/en/sql-reference/table-functions/postgresql/ но тут вопрос в том что подключение в GP будет идти через мастер (а не напрямую на сегменты) поэтому будет довольно медленно. Думал может кто решал подобную задачу и есть какой-то более быстрый подход :) (судя по всему Arenadata часто решала такие проблемы и запилила свой коннектор, но он часть EE версии)postgresql | ClickHouse Documentation
postgresql Allows SELECT and INSERT queries to be performed on data that is stored on a remote PostgreSQL server. Syntax
-
-
Привет! На свежих версиях работает нормально.
По меньшей мере со сценарием Kafka > mv > таблица одним полем message и тех поля > mv > основная таблица справляется без нареканий -
о, какие люди :) привет
-
спасибо, попробую
-
-
привет, поделитесь опытом, нужна идея для решения
нужно в несколько запросов выбрать данные из таблицы, но сохранить порядок первого запроса
объясню, нужно получить 1000 записей, батчами по 100 штук, во время выборки могут появится новые данные что приведет к потере или дублированию при использовании limit/offset
возможно ли как-то при повторном запросе начать выгрузку опираясь на последнюю запись предыдущей выборки?
уникальный идентификатор не хочется использовать для сортировки при создании таблицы, так как он сломает сортировку по остальным полям -
в users.d. config.d для серверных настроек
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-server-config-files/Server config filesHow to manage server config files in Clickhouse
-
Спасибо. То что надо.
-
drop table в базе atomic должен работать моментально, это какой-то баг, у вас КХ который уже end of support. Проверяйте на 21.8 , если воспроизводится то в github
про sync это чушь собачья -
а что со значением макроса shard на обоих серверах?
-
на одном сервере кластера <shard>01</shard>, на втором <shard>02</shard>
-
понятно, в общем создаете на сервере с shard 01 временные таблицы без макроса shard
CREATE TABLE graphite.graphite_index_temp (`Date` Date, `Level` UInt32, `Path` String, `Version` UInt32) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/02/{database}/{table}', '{replica}', Version) PARTITION BY toYYYYMM(Date) ORDER BY (Level, Path, Date) SETTINGS index_granularity = 8192;
данные с 02 реплицируются на 01 в graphite.graphite_index_temp проверяйте system.replication_queue и тупо select count()
затем остнавливаете заливку,
на 01 выполняет alter table graphite.graphite_index_temp freeze
в /shadow у вас появляются забекапленные парты, перекладывете их в подпапку detached у graphite.graphite_index
идете в detached выполняете
let i=1;for f in `ls -1` ; do echo $i $f;((i++)); echo "alter table graphite.graphite_index attach part '$f';"|clickhouse-client ; done
(тоже самое можно достичь без freeze и перекладывания, сделал alter table attach partition from ....)
теперь у вас на сервере 01 все данные
дропаете все таблицы на 02.
меняете макрос на 02 на 01
создаете таблицы, дожидаете репликации всех данных
меняете remote_servers на обоих серверах
проверяете что все хорошо,
запускаете заливку
удаляете временные таблицы (drop table) -
спасибо вам большущее
-
-
на всякий случай сделайте alter table .... freeze на обоих серверах до начала всего, это бекап который не занимает места почти
-
and not in (...)
-
м?
-
перекладываете первым запросом 1000 записей во временную таблицу engine=Log, достаете оттуда limit offset
-
-
-
я думаю даже 100млн прокатит.
-
10млн. с пагинацей, часто ? у вас там гугл?
-
-
грубо говоря вы хотите имплементировать то что нахер не нужно пользователям
-
-
-
-
Привет, подскажите, пожалуйста, как запрос лучше составить. У меня есть группировка по двум колонкам и подсчёт среднего в третьей. Однако есть четвёртая колонка (которое я сейчас сделал через функцию groupArray), но по ней нужно оставить запись с минимальными значением. Как оставить запись с минимальный значением из массива в этом запросе?
-
если это точно 100% нужно, то у вас только один путь:
Всегда фетчить все записи из запроса на сервер приложений, там складывать в CSV файл и делать пагинацию по этому CSV.
трастми -
-
на самом деле не нужен groupArray и массив. Вы ищите функцию argMin
-
Да! Похоже на то, спасибо)
-
final улучшили с тех пор
-
я попробовал, там ведь возвращает только одно (первое попавщееся) из значений, соответствующее минимальному, а мне нужны все значения с минимальными (одинаковыми и минимальными) val.
Больше похожих функций не вижу или плохо смотрю? -
ну тогда возращайте groupArray.
groupArray( (value), колонкасострокой) ) x , находите arrayReduce min минимальное значение x.1 , дальше arrayFilter
если сделаете create table / insert 3 строк с примерами , я могу написать select -
Еще можно через оконку, мб будет быстрее чем reduce + filter
-
я вот так сделал, насколько адекватное решение ? или не очень понятно по коду?
-
Всем привет!
Кто-то сталкивался с подобными ошибками в MaterializedMySQL? Как их побороть?
Code: 10. DB::Exception: Received from my_clickhouse_cluster.com:9000. DB::Exception: Not found column project_id in block: while executing 'INPUT : 4 -> project_id Nullable(Int8) : 4'. -
upd.
нашел решение
в 21.5 это исправили
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...
-
на первый взгляд что-то странное написано select min(x) group by x == select x group by x
avg от avg вообще считать нельзя. -
Multiple CROSS/COMMA JOIN do not support USING
вроде тут решили https://github.com/ClickHouse/ClickHouse/issues/873
или это не тоже самое?Why ClickHouse didn't allow more than one JOIN in query? · Issue #873 · ClickHouse/ClickHouseDear All, I'm just moving MySQL to ClickHouse. However, when I wrote my query with more than one JOIN. ClickHouse is unable to execute. The following is my query. select hours.hour, IFNULL(...
-
вместо USING напишите ON
-
Спасибо! Так меньше магии, конечно, пришлось прописать что к чему стыкуется.
-
Всем привет! Если кто сможет помочь-буду несказанно благодарна. Суть проблемы-есть ВМ тачка с CH, 64 GB RAM, 20 TB SSD, 10 дисков по 2 ТВ. Очень хочется сделать full outer join таблички в 15 лярдов записей саму на себя (не спрашивайте зачем, очень нада 😅 ). Таблица MergeTree order by (col1, col2), размазана по всем 10 дискам, по этим полям col1, col2 и идёт селф джойн. Запрос падает на memory limit exceeded 56 GB. Собственно, не слишком ли много я хочу от CH с такими исходными данными и такими хотелками?) Заранее спасибо за ответ!
-
Хотите много, лучше пробуйте сделать через GROUP BY
-
> Таблица MergeTree order by (col1, col2), размазана по всем 10 дискам, по этим полям col1, col2 и идёт селф джойн.
https://clickhouse.com/docs/ru/sql-reference/statements/select/group-by/#aggregation-in-orderGROUP BY | Документация ClickHouseСекция GROUP BY Секция GROUP BY переключает SELECT запрос в режим агрегации, который работает следующим образом: Секция
-
Спасибо за ответ! А касательно самой структуры таблицы-может лучше сделать order by col1, а отдельный индекс навесить на col2 (или наоборот)? Как наилучшим образом организовать саму структуру таблицы? То что размазали её по всем 10 дискам-это ок?
-
> order by col1, а отдельный индекс навесить на col2 (или наоборот)?
skip index это не обычный индекс, они нужны для специфичных целей.
https://kb.altinity.com/altinity-kb-queries-and-syntax/skip-indexes/
>Как наилучшим образом организовать саму структуру таблицы?
Зависит от того, что вам нужно
> о что размазали её по всем 10 дискам-это ок?
Нормально (но raid был бы побыстрее) -
если не хватает памяти, то наверно лучше использовать merge join
https://clickhouse.com/docs/ru/sql-reference/statements/select/join/#memory-limitationsJOIN | Документация ClickHouseСекция JOIN JOIN создаёт новую таблицу путем объединения столбцов из одной или нескольких таблиц с использованием общих
-
@unamedrus @morozovsk Большое спасибо за советы! Поэкспериментирую
-
CH не использует индексы и сортированность таблиц для join.
merge join не закончится никогда, ну либо года 3 займет.
Дмитрий предлагал преобразовать join -> ( select union all select ) group by , тут тоже может места на диске не хватить, зависит от размера таблички -
self join же, даже union ненужен
-
а ну да, может быть
- 13 October 2021 (201 messages)
-
Спасибо, а вот это возможно тогда грустные новости. Может мы в принципе ошиблись с выбором СН для наших задач и нам нужно нечто иное.. Ибо мы как раз и надеялись использовать индексы и физику хранения таблиц для своих потребностей. Сейчас опишу, что мы хотим, и возможно Вы вообще скажете, что СН это в принципе не вывезет. У нас планируется хранить порядка 20 ТВ данных истории + ежедневно подливать разумного размера инкремент. Также нужно уметь реализовывать кастомные поисковые запросы к этим данным, которые будет формулировать Бизнес. Например, Бизнес говорит "хочу в разумное время получать результат поискового запроса "col25 like '%text%' and col_dt between <dt1> and <dt2>". Мы пробовали : 1) оракл-не вывозит из-за обьемов; 2) постгрес-ещё хуже чем оракл; 3) эластик-по поиску шикарно, есть проблемы с дозаливкой и особенно переливкой. Плюс тут мы получается используем по сути эластик как хранилище данных, а он концептуально для этого не предназначен. 4) HBase-наоборот по хранению и дозаливке шикарно, но доступ только по ключу, не смогли реализовать кастомные поисковые запросы Бизнеса 5) КликХаус-на стадии исследования 6) есть возможность попробовать Cassandra/Apache Ignite, но после ознакомления с документацией показалось, что данные системы не для наших потребностей.
-
@den_crane Были мысли для поиска использовать или вьюшки, или делать отдельным процессом предрасчет данных и складывать их отдельно, учитывая в физике и индексах особенности поисковых запросов к ним
-
Oracle для like '%text%' всегда будет делать полное сканирование таблицы. 20TB если их правильно организовать - разбить на партиции создать нужные индексы - все будет работать нормально я думаю.
Вопрос только в цене.
Хотя я сам тут к CH активно присматриваюсь, аналитику он считает намного шустрее Oracle. -
Спасибо! Осталось лишь понять, как правильно организовать структуру данных и сколько это будет стоить) Да, в оракле и постгри получаем фулл скан, а в CH как раз для этих like-запросов есть спец ngram-индексы, их тоже хотим протестировать
-
Если Like ограничить с одной стороны 'text%' индексы будут использоваться.
-
Еще у Oracle есть технология http://oraclestart.blogspot.com/2013/08/oracle-text.html
больше про другие БД писать в этом чате не будуПолнотекстовый поиск при помощи Oracle TextOracle Text - это бесплатная компонента, входящая в состав Oracle Database, предназначенная для создания приложений с использованием полноте...
-
Спасибо! С Oracle есть ещё проблемка, что Компания в перспективе хочет вообще максимально возможно слезть с его иглы. И плюс запрос like- это лишь верхушка айсберга, как пример, какие поисковые запросы в будущем захочет Бизнес-крайне сложно предугадать. Поэтому и исследуем ClickHouse)
-
Тогда наверное комбинация Postgresql и CH
у Postgresql тоже есть полнотекстовый поиск
https://eax.me/postgresql-full-text-search/Основы полнотекстового поиска в PostgreSQL | Записки программистаПолнотекстовый поиск (Full-Text Search, FTS) это когда вы ищите какие-то документы, скажем, товары в интернет-магазине или статьи в блоге, по текстовому запросу
-
Полнотекстовый поиск - отдельная задача, если она основная, то с точки зрения времени ответа лучше использовать движок для поиска - elasticsearch, sphinx (?). Может оказаться, что надо строить несколько конвееров/бд под более узкие задачи.
Ps: можно реализовать обратные индексы (руками), но для неселективных запросов оно будет получать огромные списки документов, например для 'like %a% and like %e%'
+
https://altinity.com/faqs/clickhouse-and-elasticsearch-faqsClickHouse and Elasticsearch FAQsIs ClickHouse a good alternative to Elasticsearch? Read our FAQ to see how ClickHouse compares against Elasticsearch in benefits, use cases, query performance, database security, and more.
-
А если всё-таки полнотекстовый поиск не основная задача, а как дополнение/комбинация к другим типам поисковых запросов-то тогда всё-таки есть смысл остановиться на ClickHouse?
-
Если у вас всегда есть ограничивающее условие сканирования (по дате например) так, что время сканирования вас устраивает - почему нет
-
конечно есть смысл. Но вы протестируйте.
И имейте ввиду пока транзакций в CH нет. -
На эти грабли уже наступили:)
-
Вот поэтому может вам 2 БД postgresql и CH держать рядом
-
> 20 ТВ данных ..... запроса "col25 like '%text%' and col_dt between <dt1> and <dt2>"
если разбить это на 40 партиций по датам то один запрос будет обращаться к 0.5-1Tb данным. Первичный индекс по дате ещё немного ограничит объем, но это все равно очень много для полного перебора через like. skip индексы помогают для специфических данных, где есть большие куски однородных данных, которые можно пропускать, в общем случае - не помогут.
То что вы делаете, больше всего похоже на full text search, которого тут пока нет. Если это задача про логи, то лучше структурировать свои данные - преобразовать строки в какие-то значимые для вашей задачи типы/структуры. С этим уже можно что-то придумать.
Для полного FTS можно попробовать сделать обратный индекс (для каждого столбца отдельно) - превратить все слова в хешики и сделать дополнительную табличку с указанием на id строки в огромной табличке. Но тут есть проблема - если результирующих строк на одно слово будет много, то эти списки id будут огромные, и вычитывание их с диска займет много времени. Так что в обратный индекс придется добавить дату, и иметь эти списки за дату. Выбираем id'шники с фильтром по дате, мерджим вместе, идем за строками, но списки все равно могут быть огромными..... Итд - попытка сделать FTS практически с нуля на элементарных примитивах. Можно наверное, но потребует усилий. -
Огромное спасибо за такой детальный ответ! А разве ngram индексы в CH как раз не для полнотекстового поиска используются? Пока их не щупала, только документацию видела, но на первый взгляд показалось, что что-то похожее на like запросы.
-
> Stores a Bloom filter that contains all ngrams from a block of data.
в КХ мы имеем не обычные индексы, которые как бы должны сразу приводить нас к нужной записи, а skip index, который пропускает данные. Т.е. в вашей задаче все равно будет полный перебор блоков внутри диапазона дат, но для каждого блока можно будет не проверять каждую отдельную строку, а разом проверить несколько строк блока, и побежать дальше. Конечно лучше так, чем просматривать все подряд, но эффект появляется на больших объемах однородных данных, когда в одном блоке ничего не находится. Попробуйте - может у вас как раз такие данные и вы сможете подобрать правильный размер блока (придется разобраться как работает блум фильтр). -
Посоветовалась с коллегами, всё-таки у нас полнотекстовый поиск будет всего лишь по 2-3 полям, то есть очень маленькая часть от общей постановки задачи. Данные очень хорошо бьются по датам, но это не анализ логов. То есть 40 партиций по дате далеко не предел для наших 20 ТВ данных
-
Насколько часто будет осуществляться полнотекст поиск по 2 полям? Если это 80% запросов бизнеса - это не в КХ
-
-
если всего по 2-3 полям и хорошо разбивается по датам, то это не 20Tb данных.
- посмотрите сколько занимают нужные колонки:
select formatReadableSize(data_compressed_bytes) from system.columns
where table='table' and name in ['column'] ;
- если один запрос ищет по одной колонке, то это 1 колонка - не надо суммировать.
- определитесь сколько дней/недель/месяцев вы будете запрашивать за 1 раз.
Может быть все не так страшно, и обычный like даст удовлетворительный результат, без лишних сложностей. -
> То есть 40 партиций по дате далеко не предел для наших 20 ТВ данных
40 партиций - это хороший ориентир. Партиция в месяц, два-три года хранения, несколько партов на партицию - вот вы уже на сотнях партов. А больше и не надо - будет тормозить. -
Сложно сказать, какие запросы и в каком соотношении Бизнес будет использовать. Всё-таки скорее всего меньше 80%, но опять же поведение пользователей тяжело поддаётся предсказанию. И в крайнем случае, мы сможем именно для таких запросов эти поля вынести в эластик
-
Попробуем, спасибо Вам огромное за советы!
-
-
LIMIT N BY column_name
-
Это не то . Ситуация: есть таблица request_logs . внутри есть столбец - domain ( домены дублируются ) . мне нужен напр. 100 строк из этой таблицы с GROUP BY domains . А это выдаёт только 1 домен. Мне нужен максимум 3 домена.
-
Доброе утро. Поднял zookeeper из 3 нод. Если удалить таблицу и попытаться создать падает ошибка:
Code: 253, e.displayText() = DB::Exception: There was an error on [clickhouse-main-replica01.prod.g2s:9000]: Code: 253, e.displayText() = DB::Exception: Replica /clickhouse/tables/01/passenger_segment_local/replicas/clickhouse-main-replica01.prod.g2s already exists (version 21.8.8.29 (official build)) (version 21.8.8.29 (official build))
На всех 3 нодах зукипера лежит данная таблица. В самом кластере (2 shard + 2 replica) таблица удаляется. Подскажите куда копать. В логах зукипера никакх аномалий не вижу. Не понятно почему не удаляется из зукипера -
Движок базы данных Atomic ?
-
Привет! Подскажите, как называется настройка, которая включает использование распараллеливания запроса черещ семплирование на репликах? Или так по умолчанию работает?
-
Кажется понял. Спасибо. Надо иногда читать оф доки =) https://clickhouse.com/docs/ru/engines/database-engines/atomic/#drop-detach-tableAtomic | Документация ClickHouse
Atomic Поддерживает неблокирующие запросы DROP TABLE и RENAME TABLE и атомарные запросы EXCHANGE TABLES. Движок Atomic и
-
.
-
max_parallel_replicas
-
Спасибо!
-
пока не понятно что на выходе, приведите пожалуйста пример исходных данных и как это должно выглядеть в результате
-
Точно такой же вопрос но только для КХ
https://dba.stackexchange.com/questions/84157/how-to-select-top-10-records-from-each-categoryHow to select top 10 records from each categoryI have a table with fields Hour, PathId, Duration, Event, CellId, Channel I have 50+ CellId. Each CellId has four PathId (i.e. 0, 1, 2, 3). Each PathId has many Events and Durations. Now I want to
-
SELECT CellId, PathId, sum(Duration)
FROM (
(SELECT
CellId, PathId, Duration
FROM table)
)
GROUP BY CellId, PathId
ORDER BY CellId, sum(Duration) DESC
LIMIT 10 BY CellId -
А зачем ты так делаешь? Что мешает сразу сгруппировать
-
ничего, просто для наглядности)
-
ну лучше сразу группировать, а то подзапрос дофига памяти отожрет
-
-
а вот тут поподробнее. с чего бы он отожрет? там разве не конвеер запросов строится?
-
да, там нет ORDER BY и GROUP BY в подзапросе, так что он будет просто стриминговый, вы правы
-
ребят, привет, как-то можно из 3 столбцов: даты, часа, минуты один столбец с временем?
-
соединяете как строки, а затем toDateTime()
-
toDateTime(concat(toString(date),' ',hour,':',minute,':00')
-
Спасибо, сейчас чекну)
-
вам только для вывода или где это это в WHERE будет участвовать?
-
только для вывода
-
-
Объясните мне пожалуйста эту настройку
optimize_skip_unused_shards
Включает или отключает пропуск неиспользуемых шардов для запросов SELECT , в которых условие ключа шардирования задано в секции WHERE/PREWHERE. Предполагается, что данные распределены с помощью ключа шардирования, в противном случае настройка ничего не делает.
Я все не могу понять, как она работает, Кликхаус же ничего не знает о шардировании -
почему не знает, вы же задаёте его в Distributed таблице, если запрос выполняете через неё, то можно скипнуть
-
почему это не знает
знает
когда вы делаете SELECT ... FROM distributed_table
WHERE field = XXX
если WHERE содержит условие которое позволяет не инициировать на части шардов подзапрос
не происходит иницализации подзапроса
вот и все -
Я думал, эта настройка работает только на запись
Более того, я же могу в шарды напихать все, что угодно через локальные таблицы в обход Distributed -
все правильно , поэтому и написано что "предполагается что данные вы вставляли по ключу шардирования"
а как именно вы их вставляли, Engine=Distributed не знает -
-
да
-
-
-
А есть документация по которой это можно понять?)
-
что именно понять?
что ORDER BY будет сортировать в памяти и сбрасывать промежуточные результаты диск если данных много?
и что GROUP BY тоже будет группировать в памяти и если много данных то сбрасывать промежуточные результаты на диск? -
Понять, что в таком случае подзапрос не будет ухудшать производительность
-
Блин, он только распарсить однозначные числа не может, только двухзначные
-
Что подзапрос «стриминговый», и что это за тип подзапросов такой)
-
Strings | ClickHouse Documentation
Functions for Working with Strings Note Functions for searching and replacing in strings are described separately. empty
-
использовать функцию leftPad
-
Понял, спасибо)
-
👍
-
аа... ну это скорее общее определение, "стриминговый" значит что можно не выделять память под весь результат, а читать по блочно и отправлять на выход в ковейере
про это есть немного вот тут
https://clickhouse.com/docs/en/development/architecture/#block-streamsArchitecture Overview | ClickHouse DocumentationOverview of ClickHouse Architecture ClickHouse is a true column-oriented DBMS. Data is stored by columns, and during the
-
Только возможно проблемы будут с двухзначными часами, минутами
-
не будут, но leftPad может быть недоступен в старых версиях clickhouse
попробуйте
SELECT leftPad(toString(33), 2, '0') -
Дополняет текущую строку слева пробелами или указанной строкой (несколько раз, если необходимо), пока результирующая строка не достигнет заданной длины. Соответствует MySQL функции LPAD.
-
Да, на моей версии, она отсутсвует(
-
Спасибо!
-
ну тогда вместо toDateTime
попробуйте
parseDateTimeBestEffort
чтобы оно попробовало преобразовать как положено
ну или
еще проще
SELECT date + INTERVAL hour_field HOUR + INTERVAL minute_field MINUTE -
вы хотите чтобы в union было и null и date?
-
Нет, мне надо заменить нуловое значение, полученное из запроса этого.
-
так а что не работает?
SELECT coalesce(toDateOrNull(''), now()) as date_time
union all
select toDate('2021-10-13') as date_time -
какая ошибка?
-
да типы у него кривые, зачем опять в подзапрос то тащить???
-
Здорово! Сработало!)
-
прост у меня версия 21+ и все ок)
-
Unknown function todate
toDate??? -
можете использовать deepl.com чтобы понять что написано?
-
-
есть rowNumberInAllBlocks
-
-
Завезли, точно есть в 21.8 оконки и row_number
-
Привет. Подскажите, пожалуйста,
CREATE USER IDENTIFIED WITH ldap SERVER server_name
работает?
Code: 62. DB::Exception: Received from DB::Exception: Syntax error: failed at position 48 ('LDAP_SERVER'): LDAP_SERVER BY 'ldap_server';. Expected one of: NO_PASSWORD, PLAINTEXT_PASSWORD, end of query, LDAP, SHA256_
PASSWORD, DOUBLE_SHA1_PASSWORD, KERBEROS, DOUBLE_SHA1_HASH, SHA256_HASH. -
в принципе работает. но какие-то страные грабли там были. у меня сейчас так:
create user user1 identified with ldap server 'openid' host any default role analyst;
версия 21.7.4 -
А версия кх какая?
21.7.5.29 всё равно жалуется.
Да даже на последней lts жалуется. -
Добрый день.
CREATE TABLE test (
id UInt64,
subject_id UInt64
) ENGINE = MergeTree()
ORDER BY (id, subject_id)
PRIMARY KEY (id)
select * from test order by id
select * from test order by id, subject_id
при сортировке индекс будет использоваться? -
должен использоваться если включена настройка optimize_read_in_order
-
Под другой учёткой удалось создать. Вообще неочевидно.
-
ок попробую. а то я вижу key_condition = unknown
-
Скажите пожалуйста, операции alter delete становятся в очередь?
Такой кейс: Есть большая таблица, туда идут вставки постоянно
пришел запрос ALTER DELETE, он ушел в фон
через 5 минут пришел еще один ALTER DELETE (первый еще не завершился)
Они встанут в очередь? Если нет, то как будут "делить" пересекающиеся парты? -
там не очередь там пул background threads, ну в общем да, очередь с несколькими исполнителями
почитайте документацию вот тут
https://clickhouse.com/docs/en/sql-reference/statements/alter/#mutationsALTER | ClickHouse DocumentationALTER Most ALTER TABLE queries modify table settings or data: COLUMN PARTITION DELETE UPDATE ORDER BY INDEX CONSTRAINT T
-
а как ее установить? в консоле SET optimize_read_in_order = 1 не дает желаемого эффекта.
-
мутации происходят при слиянии партов
если несколько мутаций для одного парта, то первой выполняется та, которая первой стартанула... -
-
Немного не понял документацию
"For replicated tables, the query just adds instructions for the appropriate actions to ZooKeeper, and the actions themselves are performed as soon as possible. However, the query can wait for these actions to be completed on all the replicas."
запросы становятся в зукипер и исполняются, как только смогут. Не понимаю тут про параллелизм) -
Mutations are totally ordered by their creation order and are applied to each part in that order.
да, в рамках одного парта типа очередь -
когда вы запускаете ALTER TABLE ... DELETE для таблицы которая ReplicatedMergeTreee
вы ее на одной из реплик запускаете
и запрос через Zookeeper реплицируется на другие реплики и там отдельно выполняется -
-
попробовал в users.xml <optimize_read_in_order>1</optimize_read_in_order>
тоже не работает -
node1 :) select name, value from system.settings where name = 'optimize_read_in_order';
┌─name───────────────────┬─value─┐
│ optimize_read_in_order │ 1 │
└────────────────────────┴───────┘
но все равно key_condition = unknown на простом примере
почему для
select * from test order by id
не используется индекс? -
почему вы думаете что он не используется?
если вы про то что медленно работает select * , а полей 300 штук, то проблема не в индексе -
намекаете что надо много записей для создания индекса?
просто хотел убедится что он используется на нескольких записях. но увидел в логе - key_condition = unknown -
нет. Я не про это вообще.
добавьте limit 1 и покажите строку со статистикой -
-
CREATE TABLE test (
id UInt64,
subject_id UInt64
) ENGINE = MergeTree()
ORDER BY (id, subject_id)
PRIMARY KEY (id);
insert into test select number, number%101 from numbers(1000000000);
select * from test order by id limit 1;
0.025 sec. Processed 1.61 million rows
select * from test order by id, subject_id limit 1;
Elapsed: 0.029 sec. Processed 1.61 million rows
set optimize_read_in_order=0;
select * from test order by id limit 1;
Elapsed: 2.788 sec. Processed 1.00 billion rows -
это про филтрацию, про where , у вас нету секции where поэтому unknown
-
ok. тогда буду использовать настройку и сверять до и после.
спасибо -
в реальности, так лучше не делать ORDER BY (id, subject_id) PRIMARY KEY (id)
не надо в OLAP сортировать по id как первому полю. Это убивает перформанс и увеличивает размер таблицы на диске (это не про КХ, это вообще про OLAP) -
Добрый день!
Может кто подскажет
У меня не хочет работать http интерфейс. при обращению по порту 8123 говорит "ОК", а при использовании /play выдает вот это: -
можно ли как-то сделать так что бы при использовании ReplicatedVersionedCollapsingMergeTree
первичный ключ ID использовался для схлопывания записей
а для сортировки использовался другой индекс (который не начинается c primary key ID) -
нет. Записи коллапсятся за счет того что мерж идет по сортированным записям.
Collapsing это побочный продукт мержа. Мержи не сортируют записи, они слияют. -
max_parallel_replicas не работает ни у кого, оно не может работать если реплик меньше 10.
потому что это была кривая идея изначально.
sampling 0.5 не дает ускорения в 99.999% случаев.
Максимальный sampling который имеет хоть какой-то смысл это 0.1
"потому что это была кривая идея изначально."
никто не пользуется max_parallel_replicas, ее Алексей порывался выпилить раза 3 уже -
т.е добиться желаемого возможности нет?
primary key - ID
order by (set of other fields)
это бы улучшило те отчеты которые использую сотировку -
Ничего себе, а почему кривая идея? Почему нельзя по аналогии с шардированием делать?
-
краткий ответ -- потому что.
-
нет возможности
-
эх. жаль
-
поправьте, если путаю
но можно order by (s1,s2, ..., id) primary key (s1, s2, ...)
НО ТОЛЬКО если для одного id набор (s1, s2, ...) уникален -
в данном случае ключ схлопывания не тот что нужно
-
вот так будет работать https://github.com/ClickHouse/ClickHouse/issues/26748Parallel processing on replicas, reworked. · Issue #26748 · ClickHouse/ClickHouse
We want to parallelize data processing using multiple replicas of single shard. Every replica should process some split of data. There are the following considerations that makes the task non-trivi...
-
Спасибо большое!
-
ок, просто хотел обратить внимание
-
либо КХ очень старый, либо http хендлер переопределен
-
На terraform провайдер никто не натыкался для кликхауса? По типу такого https://github.com/cyrilgdn/terraform-provider-postgresqlGitHub - cyrilgdn/terraform-provider-postgresql: Terraform PostgreSQL provider
Terraform PostgreSQL provider. Contribute to cyrilgdn/terraform-provider-postgresql development by creating an account on GitHub.
-
я переделал
Предполагается, что данные распределены с помощью ключа шардирования, в противном случае запрос выдаст неверный результат. -
всем привет! здесь можно задавать вопросы по настройке clickhouse в контейнере? или есть какое-то более подходящее место?
-
Это лучшее место, где можно задать вопрос о clickhouse)
-
ну КХ создан совсем не для вашей задачи. Я бы мучал эластик дальше. Мне кажется с ним больше шансов.
-
ситуация:
1. есть настроенный рабочий контейнер с kafka. Сообщения в него пишутся, из него всё читается. с ним работают kafka-manager, zookeeper из скоих контейнеров и десятки программ из локального окружения (windows). Т.е. рабочий вариант
2. разворачиваю контейнер clickhouse:
docker run -d --name md-clickhouse -p 8123:8123 --ulimit nofile=262144:262144 -v=e:/.docker-mount/storage/clickhouse:/var/lib/clickhouse -v=e:/dev/_clickhouse/initdb.d:/docker-entrypoint-initdb.d -v=e:/dev/_clickhouse/logs:/var/log/clickhouse-server yandex/clickhouse-server
в результате на старте контейнера из папки docker-entrypoint-initdb.d исполняется 0001_init.sql.
Исполняется без ошибок. Clickhouse стартует, всё, что должно создаться, создаётся
В числе прочего в этом файле создаётся таблица с движком Kafka, типа такой (опущены некоторые столбцы):
create table auditTrail.SpanBuffer
(
async_trace_id UUID,
type UInt8
)
ENGINE = Kafka
SETTINGS kafka_broker_list = 'host.docker.internal:9092',
kafka_topic_list = 'Topic.Name',
kafka_group_name = 'Group.Clickhouse.Kafka.Engine',
kafka_format = 'JSONEachRow',
kafka_max_block_size = 1048576;
Но в логах clickhouse видно, что соединиться он пытается по 127.0.0.1:9092:
2021.10.13 12:59:14.091724 [ 57 ] {} <Warning> Context: Effective user of the process (clickhouse) does not match the owner of the data (root).
2021.10.13 12:59:17.967427 [ 228 ] {} <Error> StorageKafka (SpanBuffer): [rdk:FAIL] [thrd:GroupCoordinator]: GroupCoordinator: 127.0.0.1:9092: Connect to ipv4#127.0.0.1:9092 failed: Connection refused (after 0ms in state CONNECT)
2021.10.13 12:59:17.968299 [ 212 ] {} <Error> StorageKafka (SpanBuffer): [rdk:ERROR] [thrd:app]: ClickHouse-2ca3cfcc592b-auditTrail-SpanBuffer#consumer-1: GroupCoordinator: 127.0.0.1:9092: Connect to ipv4#127.0.0.1:9092 failed: Connection refused (after 0ms in state CONNECT)
что я делаю не так, как заставить clickhouse подключаться через host.docker.internal:9092? -
-
Спасибо
-
вам сеть надо общую создать и запускать контейнеры указав эту сеть https://runnable.com/docker/basic-docker-networkingBasic Networking with Docker
The fundamentals of container networking with Docker.
-
в смысле почему? так задумано? это называется CTAS , create table as select ?
-
пардон, вопрос касался одинаковых названий столбцов внутри, по логике эта кверя не должна работать. Обнаружил такое поведение случайно, и просто интересно с чем связано
-
разве host.docker.internal не решает эту проблему за меня (хотя для целей локальной разработки, не берём сейчас продакшн)?
почему clickhouse судя по логам и не пытается использовать host.docker.internal, а обращается к 127.0.0.1? -
потому что у вас фактически написано select 1 x, x
в КХ выражения редьюсятся. т.е. select x+1 as y, x+1 --> select x+1 as y, y -
спасибо
-
я хз про host.docker.internal, все это зависит от оси, в линуксе может и будет работать
-
это не имеет отношения к КХ, если вы подключитесь в контейнер кх, то можете там проверить курлом например ping host.docker.internal , curl host.docker.internal:9092
-
20ТБ - это в какой базе? практика показывает, что данные из эластика перенесённые в кликхаус занимают раз в 10 меньше места, а памяти ещё меньше.
Полнотекстовый поиск и "col25 like '%text%' не совсем одно и тоже. вы в одном месте пишите про полнотекст, а в другом про лайк. не совсем понятно что конкретно вам нужно.
если у вас полнотекст, то ещё можно рассматривать альтернативы. если лайк, то можно даже не тратить время, а сразу брать кликхаус.
в принципе даже без индексов кликхаус лайком перелопатит одну колонку фуллсканом за вменяемое время и гораздо быстрее других бд.
у эластика есть интерфейс кибана, полнотекстовый поиск из коробки и гибкая структура. на этом его плюсы закончились, всё остальное - сплошные минусы. -
Да, Вы правы, на самом деле именно полнотекстовый поиск нам не нужен, вполне хватит like на трех полях. 20 ТВ данных занимают в HBase
-
root@ffacb257f26f:/# curl 127.0.0.1:9092
curl: (7) Failed to connect to 127.0.0.1 port 9092: Connection refused
root@ffacb257f26f:/# curl host.docker.internal:9092
curl: (52) Empty reply from server
root@ffacb257f26f:/# ping host.docker.internal
PING host.docker.internal (192.168.65.2) 56(84) bytes of data.
64 bytes from 192.168.65.2 (192.168.65.2): icmp_seq=1 ttl=37 time=0.460 ms
есть ощушение, что если бы clickhouse обращался по host.docker.internal, а не по 127.0.0.1, то всё бы заработало -
Ещё маленький вопрос - ClickHouse позволяет создавать параметризованные вьюшки?
-
не припоминаю, вроде в старых версиях нет
-
-
Можно использовать пользовательские переменные, которые передаются во вьюху через добавление settings prefix_userparam = <uservalue> к запросу ко вьюхе.
-
@morozovsk @brbrbr Супер, спасибо!
-
"всё что вы хотели узнать уже есть в kb" :)
помню здесь ссылку кидали, поэтому просто вбил в гугле "kb parameterized view" и сразу всё нашлось -
ок, просто если это натянуть на тот use-case, что хочет топик-стартер, то вряд ли поможет
-
какой у неё юзкейс ещё не известно, но лучше что-то чем ничего
-
с кафкой есть такая проблема, что это адрес host.docker.internal:9092 service discovery.
Дальше брокер говорит откуда забирать партиции этого топика, там в кафке настраивается какой хостнейм отдавать.
Т.е. брокеров много, и куда ходить за партициями топика знают только сами брокеры, клиенту кафки надо знать только одну точку входа, дальше ему рассказывают где вещи лежат.
возможно в вашем случае кафка говорит ходить в локалхост -
внимательно проверьте в своей версии КХ, settings были сломаны через месяц после того как я написал https://kb.altinity.com/altinity-kb-queries-and-syntax/altinity-kb-parameterized-views/
-
всем привет. немного глупый вопрос.
а где можно взять утилиту clickhouse-format, описанную здесь https://clickhouse.com/docs/en/operations/utilities/clickhouse-format/ ?clickhouse-format | ClickHouse Documentationclickhouse-format Allows formatting input queries. Keys: --help or-h — Produce help message. --hilite — Add syntax highl
-
все утилиты КХ - это один бинарник, и симлинки
можно просто через пробел аргументом clickhouse format
$ clickhouse client -
гуд, понял.
благодарю. -
я сейчас пересобрал контейнер, указав вместо host.docker.internal:9092 вообще заведомо некорректное значение:
engine = Kafka SETTINGS kafka_broker_list = 'some.invalid.address:9999'
в логах ничего не поменялось:
2021.10.13 14:25:55.984670 [ 220 ] {} <Error> StorageKafka (SpanBuffer): [rdk:FAIL] [thrd:GroupCoordinator]: GroupCoordinator: 127.0.0.1:9092: Connect to ipv4#127.0.0.1:9092 failed: Connection refused (after 0ms in state CONNECT)
т.е. до использования указанного адреса дело даже не доходит, а clickhouse что-то пытается найти локально на порту 9092
p.s. проверил DDL таблицы - там именно то, что я указал при создании контейнера. Т.е. в kafka_broker_list значение одно, а в логах другое.
непонятное что-то -
сколько памяти у сервера?
-
баг в КХ, создавайте https://github.com/ClickHouse/ClickHouse/issues/new?assignees=&labels=potential+bug&template=85_bug-report.md&title=
и приложите create table для view и для таблиц которые во вью -
Всем доброго дня! При попытке сделать запрос с with ругается.
-
WITH test1 AS (SELECT 1)
SELECT * FROM test1; -
Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 15 ('(') (line 1, col 15): (SELECT 1)
SELECT * FROM test1
FORMAT TabSeparatedWithNamesAndTypes;. Expected identifier (version 20.8.3.18) -
Что я делаю не так?
-
Всем привет, подскажите пожалуйста, хочу реализовать конструкцию типа:
SELECT if(SELECT count(*) from analytics.test where id = 5, plus(2, 2), plus(2, 6));
Но БД ругается:
Syntax error: failed at position 18 ('count') (line 1, col 18): count(*) from analytics.test where id = 5, plus(2, 2), plus(2, 6))
FORMAT TabSeparatedWithNamesAndTypes;. Expected one of: DoubleColon, LIKE, GLOBAL NOT IN, end of query, AS, DIV, IS, UUID, OR, QuestionMark, BETWEEN, NOT LIKE, MOD, AND, Comma, alias, IN, ILIKE, Dot, NOT ILIKE, NOT, Arrow, token, NOT IN, GLOBAL IN. (SYNTAX_ERROR) (version 21.9.4.35 (official build))
Подскажите пожалуйста, как такое можно реализовать?
По запрос, как в примере:
SELECT if(1, plus(2, 2), plus(2, 6));
Только у меня cond (проверяемое условие. Может быть UInt8 или NULL.) это результат запроса. -
#вакансия #Clickhouse #dba #удалёнка
Вакансия: Web Analyst/Веб-аналитик
Формат работы: проектная работа, гибкий график
Зарплатная вилка: с успешным кандидатом готовы обсуждать индивидуальные условия.
Задачи
1. Аудит Яндекс Метрики и Google Analytics (оптимизация, если требуется)
2. Настройка Google analytics 4
3. Внедрение сквозной аналитики, динамического коллтреккинга, учет оффлайн конверсий и возвратов, конверсий со сторонних площадок (тематика - авто), настройка атрибуции.
4. Юнит экономика - Разобраться что нужно доработать, чтобы считать юнит экономику. Разработать отчет по юнит экономике
5. Разработать дашборд по основным показателям -
20.8 такого не умел, 20.8 уже out of support
-
🙏
-
попробуйте добавить скобочки вокруг подзапроса. даже я не сразу понял, почему у вас вместо and используется запятая, а парсеру ещё сложнее
-
5 лямов в таблице или во вьюхе? а сколько выдаёт select count() from view_v ?
-
+ кх не умеет коррелированные подзапросы, у вас SELECT count(*) from analytics.test where id = 5 константа? одинаковая для всех строк?
-
ну и само собой первым аргументом функции If у вас должно быть условие, а не количество:
(SELECT count(*) from analytics.test where id = 5) > 0 -
это было оно! Неверное значение advertised.listeners в настройках кафки. Спасибо за наводку!
-
спасибо большое, помогло!
Он ругался еще на тип данных, count() Uint64 возвращает, я добавил сравнение и все заработало)
SELECT if((SELECT count(*) from analytics.test where id = 5) = 0, plus(2, 2), plus(2, 6)); -
-
haproxy/nginx
KittenHouse, ClickHouse-Bulk одиночные инсерты клеят в пачки -
Ну то есть прок от них если только само приложение не умеет пачками отправлять?
-
ну да
в новых КХ это будет встроенным механизмом -
Спасибо, значит haproxy наше все, как я и предполагал.
-
chproxy глючит кажется под нагрузкой, если в него 100rps послать или больше, не помню, но в общем тесты показали что без него лучше чем с ним если надо много rps
-
Мы его использовали для раскидывания запросов по 10 ножам равномерного. Вроде более 200rps нормально держал
-
возможно он глючит только если включена компрессия
кидает error while read compressed stream Magic is not correct: 69
причем не сразу, какое-то время работает ОК, а через минуту начинается проблема. -
Мы его использовали чтобы ограничивать максимальное количество запросов в работе, потому что иначе сам ch брал запросы и сильная была деградация по производительности. Но это пару лет назад было. Стоял chproxy - следил за количеством запросов и раскидывал по годам онные
-
подскажите, можно как-то сделать чтобы with fill учитывал другие колонки в order by
select x, y from (select number x, number * 2 y from numbers(1, 2)) order by x, y with fill from 1 to 6
возвращает
┌─x─┬─y─┐
│ 0 │ 1 │
│ 1 │ 2 │
│ 0 │ 3 │
│ 2 │ 4 │
│ 0 │ 5 │
└───┴───┘
а хотелось бы
┌─x─┬─y─┐
│ 1 │ 1 │
│ 1 │ 2 │
│ 1 │ 3 │
│ 1 │ 4 │
│ 1 │ 5 │
│ 2 │ 1 │
│ 2 │ 2 │
│ 2 │ 3 │
│ 2 │ 4 │
│ 2 │ 5 │
└───┴───┘ -
select x, y from (select number x, number * 2 y from numbers(1, 2)) order by x with fill, y with fill from 1 to 6 ;
┌─x─┬─y─┐
│ 1 │ 1 │
│ 1 │ 2 │
│ 1 │ 3 │
│ 1 │ 4 │
│ 1 │ 5 │
│ 2 │ 1 │
│ 2 │ 2 │
│ 2 │ 3 │
│ 2 │ 4 │
└───┴───┘
┌─x─┬─y─┐
│ 2 │ 5 │
└───┴───┘ -
а если x не идёт подряд?
select x, y from (select number * 2 + 1 x, number * 2 y from numbers(1, 2)) order by x with fill, y with fill from 1 to 6
надо чтобы вернуло
┌─x─┬─y─┐
│ 3 │ 1 │
│ 3 │ 2 │
│ 3 │ 3 │
│ 3 │ 4 │
│ 3 │ 5 │
│ 5 │ 1 │
│ 5 │ 2 │
│ 5 │ 3 │
│ 5 │ 4 │
│ 5 │ 5 │
└───┴───┘ -
order by x with fill step 2 ?
-
это просто пример, это айдишники юзеров и могут быть рандомными)
-
я не понимаю какую проблему решаем, в реальной жизни в 99% случаев with fill неприменим, потому что умеет только числа
-
если это join с календарем, то делается это по другому
-
по сути да, сгенерить структуру со всеми датами
-
-
спасибо
-
Подскажите пожалуйста, как можно в кликхаусе сгруппировать строки между которыми меньше N минут? Без оконных функций
То есть, если между событиями прошло мало времени, то будет одно событие с агрегатами значений из столбцов -
Не совсем то, но посмотрите на функции toStartOf*. Схлопнет по периодам.
-
Спасибо, попробую
Хотел сначала через массивы, но arrayMap тяжелый достаточно -
Это тяжёлая задача для olap. Нельзя распаралелить.
- 14 October 2021 (100 messages)
-
кажется, имеется типовая задача
вводная: есть много событий от некоторых источников.
свойства источников:
1. список источников открыт (т.е. в процессе сбора данных иногда могут появляться новые источники), но не будет бурного роста их числа. Скажем, количество источников - единицы десятков тысяч. Количество событий: миллионы, сотни миллионов.
2. источник в событии идентифицируется строкой (обычно это 50...300 символов)
запросы к системе будут:
1. Как по общему набору событий (какие-то агрегации)
2. Так и выборки по конкретным источникам
вопросы:
1. По привычке хочется пронумеровать источники и нормализовать схему. Надо ли это делать в clickhouse?
2. Если нормализовать надо (выгодно), то как это сделать на лету?
что-то такое сходу набросал (https://www.db-fiddle.com/f/f6k6T5rJnN3yt3php9QrN6/0):
-- сюда будут писаться миллионы (миллиарды?) записей
create table myDb.event_buffer
(
event_prop1 String,
-- ...
event_propN String,
event_source String -- строка обычно на 50...300 символов
) engine = Kafka -- например, читаем из kafka
;
create table myDb.event
(
event_source_id UInt64
event_prop1 String,
-- ...
event_propN String,
) engine MergeTree();
-- уникальных значений name ожидатся в районе нескольких десятков тысяч
create table myDb.event_source
(
id UInt64,
name String
) engine -- КАКОЙ ВЫБРАТЬ?
create materialized view myDb.event_extractor to myDb.event as
select
sipHash64(event_source) as event_source_id,
event_prop1, /* ... */, event_propN
from myDb.event_buffer;
create materialized view myDb.event_souce_extractor to myDb.event_source as
select
sipHash64(event_source) as id,
event_source as name
from myDb.event_buffer;
это похоже на рабочую схему? В ней для myDb.event_source какой движок выбрать, чтобы обеспечить уникальность строк таблицы?DB Fiddle - SQL Database PlaygroundAn online SQL database playground for testing, debugging and sharing SQL snippets.
-
> myDb.event_source ... engine -- КАКОЙ ВЫБРАТЬ?
если кластер, то вариантов немного - ReplicatedReplacingMT. Если singleserver, то я бы попробовал Join(Any,Left,id) settings join_any_take_last_row=1
Но даже если и кластер, то при наличии кафки можно паралельно несколько таких таблиц поддерживать на нодах -
Ребят, поделитесь опытом. Планирую использовать Clickhouse для интеграционной подсистемы на основе паттерна EAV https://dimonsmart.wordpress.com/2017/12/04/eav-entity-attribute-value/, логику трансформации данных планирую разместить в API. Есть противопоказания? Было бы здорово, если @milovidov_an как-то прокомментировалEAV (Entity attribute value)
Введение Одним из желаний разработчиков баз данных всегда было отсутствие внезапных изменений структуры базы. И, увы, оно несбыточно! Совсем без этих изменений не получается. То у клиента в клиентс…
-
какой смысл такое делать в колоночной базе данных? Вы же теряете все её преимущества. Вместо чтения отдельных колонок приходится лопатить все данные подряд. И компрессия по разнородным данным плохо сработает.
-
вот я чот тоже не понял :)
-
EAV на реляционных ложица неплохо, когда ты раскладываешь AV по таблицам по типам данных
-
а в колоночных я даже хз. Надо будет вагон джойнов делать опять же при выборке
-
объект любой сущности можно разместить в табличной структуре примерно такого вида
-
dictionaryCode String COMMENT 'Код справочника',
dictionaryName String COMMENT 'Название справочника, по-русски',
elementId String COMMENT 'Идентификатор записи справочника',
attributeCode String COMMENT 'Код атрибута, название столбца',
attributeName String COMMENT 'Название атрибута, по-русски',
attributeType String COMMENT 'Тип атрибута',
attributeValues array(String) COMMENT 'Значение (идентификаторов)', -
да я в курсе что такое EAV
-
но я всё таки склоняюсь к мысли что это не лучший вариант модели БД для CH
-
-
В случае, если справочник ссылается на другой справочник, то в типе необходимо указать в формате: attributeType='Entity($dictionaryCode)', а attributeValues=[$elementId..]
-
а целостность как собираешься контролировать? В реляционных можно обмазать триггерами и констрейнтами
-
ETL процедурой, которая будет заполнять интеграционную таблицу Clickhouse
-
вы ответьте прежде всего на вопрос про производительность (и компрессию). Зачем вобще вам тут КХ? Сколько миллиардов строк (обычных, без EAV) у вас будет?
-
вообще тут теряется смысл колоночной СУБД, в которой данные храняца по полям, а не по записям. В EAV тебе практически всегда для работы понадобица вся запись в AV, что вобщеемто идеально ложица на реляционную СУБД, но несёт допрасходы на колоночную которой нужно будет не одну колонку читать а все.
-
заполнять ОТКУДА
-
из основной учетной системы
-
а там реляционная СУБД ?
-
да
-
тогда я не понимаю зачем CH вообще здесь
-
если вам нужен видеть данные в формате EAV -может быть проще сделать view в той системе или процедурки чтобы они отдавали данные в этом формате
-
таким образом у вас не будет избыточности данных и лишнего сервиса
-
Специально делать EAV имеет мало смысла, разве что если данные изначально представлены в таком виде или если только небольшая часть данных требует такого представления.
Если сделать EAV таблицу, то ClickHouse будет стараться, будет сканировать данные так быстро, как может... но всё-таки будет косо посматривать на ваши данные. -
-
-
Можно, если вакансии про ClickHouse, например, требуется знание ClickHouse, или вы указываете, что в компании уже используется ClickHouse.
-
Мотивация:
1.Сделать "гальваническую развязку" для учетной системы, чтобы не нагружать учетную СУБД в процессе рабочего дня
2.Обеспечение историчности инфообмена(до 3-5 лет) при взаимодействии с другими системами не подконтрольными нам(компактность хранения данных с Clickhouse), т.к. в учетной системе только последнее состояние сущности. Полезно в расследовании инцидентов и в случае подключения нового участника инфообмена, которому могут потребоваться исторические данные.
3.Работу над изменениями контрактов сущностей сфокусировать только в АПИ, выгрузка и структура хранения будут практически неизменны, за счет: EAV и универсальной хранимой процедуры для выгрузки объектов любой учетной сущности, потребует использования только конфига со списков выгружаемых таблиц.
4.Сделали конвеер обработки запросов API, связанных с Clickhouse, который позволяет обрабатывать до 900 запросов к апи в секунду. Что обеспечит выгрузку загрузку необходимых интеграционых сведений
5.Привлекают другие возможности Clickhouse по интеграции -
Тогда делайте прототип и проверяйте, как будет работать. Может быть всё будет хорошо.
-
отдельные элементы уже используем, немного беспокоюсь т.к. не все коллеги разделяют идею, поэтому решил обратиться к сообществу....спасибо за критику)))
-
В экспериментальных оконных функциях есть
-
«И кстати есть rowNumberInAllBlocks» - да, можно же блок задать через limit by
-
Будет здорово, если кто-то поделится способами транспонирования.
-
kb.altinity.com search pivot
-
-
Мы планировали использовать следующий способ
create table tbl (entityId UInt32, field String, value Float32) Engine=Memory;
insert into tbl values
(1,'width', 1.0),
(1,'height',2.0),
(1,'length',0.5),
(2,'width', 10.0),
(2,'height',24.0),
(3,'length',33.5)
SELECT entityId,
max(case when field = 'width' then value else 0.0 end) width,
max(case when field = 'height' then value else 0.0 end) height,
max(case when field = 'length' then value else 0.0 end) length
FROM tbl
GROUP BY entityId -
☺️ спасибо
-
pivot-table - Pivot или эквивалент в clickhouse - Question-It.com
Я новичок в Clickhouse или в этом отношении в любом столбце БД. Мне нужно повернуть таблицу, как мы делаем в sql-server, postgres или любой другой базе данных на основе строк. Я ищу общее решение, однако решение для примера здесь будет хорошо. Таблица: Магазин Tag Slot Reading --- ---- --------....
-
Добрый день!
Вакансия от компании X5 Retail Group
Позиция: Старший администратор СУБД ClickHouse
Задачи:
-Администрирование СУБД ClickHouse (single instance, Cluster);
-Автоматизация задач по сопровождение СУБД по средствам Ansible;
-Развитие мониторинга СУБД на базе Zabbix;
-Решение инцидентов, запросов пользователей в части БД как 3 линия поддержки;
Что нужно уметь:
Знание СУБД ClickHouse в части DBA;
Beckup/recovery/DRP для СУБД ClickHouse;
Уверенные знания SQL;
Условия:
-Официальное оформление с белой ЗП, премии по результатам работы;
-Удобный офис с бесплатной парковкой на м. «Волгоградский проспект» / МЦД «Калитники»
-График работы: 5/2, с 9:00 до 18:15 (в пятницу — до 17:00);
-Возможность работать удалённо (X5 Home Office) /или в гибридном формате
-Широкий пакет ДМС (включая выезд за рубеж и стоматологию), страхование жизни и здоровья;
Отвечу на Ваши вопросы в любое время ✌️, пишите: @TonyGeecko -
Join(Any,Left,id) settings join_any_take_last_row=1
а мощность event_source не будет равна мощности таблицы в этом случае? типа в event 100М и в event_source получим 100М -
тут же Any. Там хеш таблица. Одна строка для одного id. По умолчанию - первая, с указанным сеттингом - последняя. Вы же говорили что источников десятки тысяч - это нормально. Вот так проверить сколько займет RAM:
SELECT name, formatReadableSize(total_bytes) FROM system.tables WHERE engine = 'Join'; -
о, спасибо!
-
Спасибо!
-
Понял, а какими тогда способами можно попробовать адекватно это сделать?
-
rows_before_limit_at_least - не менее скольких строчек получилось бы, если бы не было LIMIT-а. Выводится только если запрос содержит LIMIT.
В случае, если запрос содержит GROUP BY, rows_before_limit_at_least - точное число строк, которое получилось бы, если бы не было LIMIT-а.
при запросе select * from test_stat limit 1 FORMAT JSON
rows_before_limit_at_least равен 1 хотя в таблице 44 записи.
раньше это работало замечательно.
может этот параметр зависит от типа колонок? которые я использую в таблице MergeTree?
версия сервера 20.4.2.9 -
Привет всем, подскажите те, кто использует clickhouse-driver для записи, раз в секунду или менее я пишу по 1 строке в 800 колонок, в рандомное время появляется запись ниже. Если взять тот же список строк и повторно записать, то может записаться, а может снова выпасть в ошибку. Никто не сталкивался?
File "clickhouse_driver\varint.pyx", line 62, in clickhouse_driver.varint.read_varint
File "clickhouse_driver\bufferedreader.pyx", line 55, in clickhouse_driver.bufferedreader.BufferedReader.read_one
File "clickhouse_driver\bufferedreader.pyx", line 240, in clickhouse_driver.bufferedreader.BufferedSocketReader.read_into_buffer
EOFError: Unexpected EOF while reading bytes -
Скажите, как-то можно переместить данные полностью из одной таблицы в другую (таблицы полностью идентичны) одним запросом?
Не хочется выбирать все партиции из system.parts и таскать их по одной. Хочется типа
ALTER TABLE table 1 MOVE PARTITION * TO TABLE table2 -
господа, ге нашел по чату, что будет при удалении partition 'tuple()'в MergeTree таблице, которая не партицирована?
-
я делаю это питоном в цикле по партициям
-
Наверно, снесутся все данные?
-
я это и хочу) просто кто точно пробовал
-
Да, я так тоже делаю, только башом. Хотелось в один запрос.
Возможно так нельзя делать, потому что мув партиции - атомарная операция. А мув всех данных = мув всех партиций - уже не атомарная.. -
truncate table не подходит?)
-
только что попробовал - снесло все, что было. Правда было всего две записи
-
ограничение не снято на 50 Гб на размер таблы
-
рестарт не хочется делать
-
drop partition тогда не поможет
-
-
ммм, дропается, еще как, проверено на проде
-
толкьо на партицированной
-
значит max_partition_size_to_drop правили
-
Есть КХ 21.3.13, как посмотреть какие индексы используются для запроса? Есть order by и bloom filter на колонку. EXPLAIN indexes = 1 еще не работает в этой версии.
-
Добрый день!
У кого-то был опыт переезда зукипера развёрнутого через k8s в разные ДЦ? -
Подскажите, как в КХ можно обновить значение определённого ключа в JSONе? В мускуле, например, есть функция JSON_SET. Есть ли что-то подобное в КХ?
-
никак. надо прочитать всю строчку, вычислить новое значение и записать новую. а со старой как-то побороться, чтобы не мешалась. Как конкретно зависит от table Engine.
-
Я так понимаю, вычисление нового значения проводится не в самом КХ, а в ЯПе? Движок ReplacingMergeTree.
-
если чуть-чуть поправить, то можно и в КХ через regexp. главное точно прицелится.
-
Понял, благодарю
-
-
Привет, в доке по кликхаусу есть туториал, делаю все по нему, но тестирую в докере на разных версиях и получаю разный результат при раскатке базы, почему?
на версии: 21.9.2
select count() from tutorial.visits_v1 — 1679791
на версии: 20.6.10
select count() from tutorial.visits_v1 — 1681077
движки БД на обоих Ordinary -
CollapsingMergeTree в доке почитайте
-
спасибо
-
Тут обычно говорят: не знаешь как партициорировать - партициорируйте по месяцам
-
Для этого нужно посмотреть на таблицу и будущие селекты, если не знаешь селекты то делай по месяцам
-
Добрый день, а кто-нибудь сможет подсказать такой вопрос - вот если удалил данные из таблицы через alter table delete, данные пропали из папки data но остались в папке stat, это потому что бэкапы есть или вообще какая может быть причина?
-
Добрый день, как правильно оценивать ОЗУ, нужное для вставки данных в таблицу одним INSERTом?
В идеале хочется
- получить f(ОЗУ, природа_данных) = количество_строк_в_батче
- немного управлять расходуемой памятью
Сделал игрушечный пример, на котором наблюдаю примерно следующее:
если количество полей 10, а строк 2*10^7, нужно 850М
если количество полей 1000, а строк 2*10^5, нужно примерно 4Г
данных что-то типа 500М, т.е. при большом количестве колонок требуется в 8 раз больше памяти.
max_threads не влияет.
версия 21.3
Скрипт вставляющий данные https://pastebin.com/hJaFyxKN , скрипт создающий таблицу https://pastebin.com/2W7XS0qwimport timeNUM_FIELDS = 1000NUM_ROWS = 20000COEFF = 300print("set max_me - 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.
-
-
EXCHANGE TABLES точно не подойдёт?
https://clickhouse.com/docs/ru/sql-reference/statements/exchange/EXCHANGE | Документация ClickHouseEXCHANGE Атомарно обменивает имена двух таблиц или словарей. Это действие также можно выполнить с помощью запроса RENAME
-
Не-а. Хочу дописать данные из одной в другую
-
смотрите выше по чату. там Денни пару дней назад показывал мастерство как отцепить парт и прицепить его к другой таблице.
-
Эт я и сам могу
-
-
INSERT INTO SELECT не пойдет? За нужные даты
-
Не удалит ничего в старой таблице
+
Долго и тяжело) -
Добрый вечер. Подскажите, правильно ли я понимаю, что отличие формата JSONEachRow от JSONStringsEachRow в том, что при вставке любые записи будут восприниматься как строковые ?
https://clickhouse.com/docs/en/interfaces/formats/#jsonstringseachrowInput and Output Formats | ClickHouse DocumentationFormats for Input and Output Data ClickHouse can accept and return data in various formats. A format supported for input
-
Подскажите где подсмотреть даты поддержки версий кликхауса?
-
Что-то не гуглится
-
Altinity Stable Builds
ClickHouse tested and verified for production.
-
Спасибо, получается 20 версия уже все?
-
Добрый вечер. Обновил один сервер с 21.8 до 21.9.4.35
второй не успел обновить - на обоих в реплику завели таблицу - CH ругается в логах при попытке репликации
2021.10.14 22:29:22.270136 [ 7655 ] {} <Error> prism.web_vitals: auto DB::StorageReplicatedMergeTree::processQueueEntry(ReplicatedMergeTreeQueue::SelectedEntryPtr)::(anonymous class)::operator()(DB::StorageReplicatedMergeTree::LogEntryPtr &) const: Code: 40. DB::Exception: Part 20210124_20210124_9_9_0 from 192.168.0.19 has different columns hash. (CHECKSUM_DOESNT_MATCH), Stack trace (when copying this message, always include the lines below):
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0x936a17a in /usr/bin/clickhouse
1. DB::Exception::Exception<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> > const&>(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x105e339e in /usr/bin/clickhouse -
обновил второй сервер - не помогло
-
пересоздавал таблицу - тоже
-
структура таблицы:
CREATE TABLE prism.web_vitals
(
date Date DEFAULT toDate(now()),
geo_id UInt32,
prism_site_id UInt32,
prism_site_template_id UInt32,
ext_site_id UInt32,
prism UInt8,
mobile UInt8,
layout_id UInt32,
policy UInt8,
experiment String,
client_os String,
client_os_version String,
client_browser String,
client_browser_version String,
url_path String,
custom_dimensions Map(String, String),
request_count UInt64,
zero_cls_count UInt32,
cls_green Float32,
fid_green Float32,
fcp_green Float32,
lcp_green Float32,
ttfb_green Float32,
cls_green_count Int32,
fid_green_count UInt32,
fcp_green_count UInt32,
lcp_green_count Int32,
ttfb_green_count UInt32,
cls_yellow Float32,
fid_yellow Float32,
fcp_yellow Float32,
lcp_yellow Float32,
ttfb_yellow Float32,
cls_yellow_count Int32,
fid_yellow_count UInt32,
fcp_yellow_count UInt32,
lcp_yellow_count Int32,
ttfb_yellow_count UInt32,
cls_red Float32,
fid_red Float32,
fcp_red Float32,
lcp_red Float32,
ttfb_red Float32,
cls_red_count Int32,
fid_red_count UInt32,
fcp_red_count UInt32,
lcp_red_count Int32,
ttfb_red_count UInt32,
is360 UInt8,
resolution String DEFAULT ''
)
ENGINE = ReplicatedSummingMergeTree('/clickhouse/tables/{shard}/prism_web_vitals', '{replica}', date, (date, geo_id, prism_site_id, prism_site_template_id, ext_site_id, prism, mobile, layout_id, policy, experiment, client_os, client_os_version, client_browser, client_browser_version, url_path, custom_dimensions, is360, resolution), 8192) -
пересоздал таблицы после обновления версии и перезалил данные - заработала репликация :(
-
подскажите, в статье https://altinity.com/blog/tips-for-high-performance-clickhouse-clusters-with-s3-object-storage
говорится что для s3Cluster можно использовать кастомный конфиг файл чтобы прокинуть правильные настройки по потокам на шарды. Но не совсем понятно как именно он применяется? почему он не приментися ко всем запросам, а только для s3?
users.d/defaults_for_s3.xml:
<yandex>
<profiles>
<default>
<max_threads>8</max_threads>
<max_insert_threads>8</max_insert_threads> <input_format_parallel_parsing>0</input_format_parallel_parsing>
</default>
</profiles>
</yandex> -
Ко всем будет применяться
-
хм, тогда это не очень вариант, я не хочу менять max_insert_threads для всех запросов)
-
Вы часто делаете insert select?
-
наверное в районе пары тысяч в день, но там скорее вопрос в том что они отжирают объём памяти близкий к максимуму, а увеличение max_insert_threads может ещё больше поднять потребление памяти
- 15 October 2021 (112 messages)
-
каждая колонка создает 2 буфера по 1МБ для инсерта, не важно сколько строк вставляется, параллельные инсерты из-за parallel parsing вроде увеличивают
-
поддерживаются последние 3 stable и два LTS (LTS поддерживаются год)
последний stable 21.9, т.е. stable = 21.9, 21.8, 21.7
LTS 21.8, 21.3, т.е. 21.3 будет поддерживаться до 2022.3, 21.8 до 2022.8
скоро выйдет 21.10, значит 21.7 перестанет поддерживаться -
вы создаете таблицы в формате который устарел в декабре 2017 года. Этот формат не поддерживает новые фичи.
-
stat? или store ?
-
Давно можно без рестарта этот параметр поменять
-
set send_logs_level='debug'
Explain не показывает этого. -
извиняюсь, конечно же store папка, в общем delete данных не удаляет партицию как я понимаю
-
Здравствуйте, подскажите, это нормальное поведение функции trim?
SELECT trim(BOTH ' ,' FROM '5935,5998,6014, ') as t
———
Результат:
'5935,5998,6014, '
v=21.7.5.29 -
Какое вы ожидаете поведение ?
-
'5935,5998,6014'
-
попробуй вот так
SELECT trim(BOTH '\, ' FROM ' 5935,5998,6014, ') as t -
не помогает
-
TRAILING и будет как вы ожидаете работать
SELECT trim(TRAILING ' ,' FROM '5935,5998,6014, ') as t -
ну если бы мне нужен был TRAILING я бы его использовал
-
тут вопрос к работе функции, а не к тому как сделать чтобы работало
-
-
Доброе утро! Обновились с 21.5 до 21.9. В продакшене начались проблемы по причине отсутствия arrayFold (её убрали в 21.6). Какие варианты у нас есть по ее замене и по какой причине ее убрали? Спасибо.
-
Очевидной замены не видим в текущее время.
-
Функция случайно попала в релиз 21.5, и сразу же была убрана. Требуется ускорение на несколько порядков, чтобы можно было ей реально пользоваться. Но штука очень нужная и полезная, поэтому у нас (Altinity) стоит в планах ее сделать до конца года. Но, может, кто поможет и раньше.
-
Ребят, кто знает как в версии 20.1 изменить имя столбца?
-
добрый день!
может кто-то подсказать экпортер кастомных метрик (по select'ам) в прометеус? -
Материализую индекс, вижу мутацию на фоне. Можно ли как-то ее “подстегнуть”? Мне некритична блокировка КХ.
-
Таблица создана несколько лет назад. И она не одна. Мне их все пересоздавать и перезаливать ?
-
20.3 и 20.8 мы еще в Альтинити поддерживаем. Надо бы добавить в список
-
Спасибо. Есть ли какие то предложения по тому как аггрегировать строки в виде product? Чтобы 1,2,3 аггрерировать в 1*2*3=6?
-
select arrayProduct([1,2,3]);
-
ALTER TABLE RENAME column не подходит?
https://clickhouse.com/docs/en/sql-reference/statements/alter/column/#alter_rename-columnCOLUMN | ClickHouse DocumentationColumn Manipulations A set of queries that allow changing the table structure. Syntax: ALTER TABLE [db].name [ON CLUSTER
-
Ну и старый классический способ, который можно на строках использовать — сумма логирифмов и потом экспонента.
-
-
Спасибо!
-
Всем привет! Можно ли как-то средствами clickhouse вернуть экранированные символы в обычные, или это нужно уже в другой среде делать (например python)?
Пробовала с помощью Cast перевести в формат TabSeparatedRaw, но выдал ошибку, что не знает такой тип. -
Мне кажется, что сдесь какой-то жук зарылся
SELECT replaceRegexpAll('5935,5998,6014, ', '^[ ,]*|[ ,]*$', '') AS t
┌─t────────────────┐
│ 5935,5998,6014, │
└──────────────────┘
1 rows in set. Elapsed: 0.002 sec. -
мне тоже так показалось)
-
что-то похожее было уже
https://github.com/ClickHouse/ClickHouse/issues/214replaceAll + FixedStrings: unexpected behaviour · Issue #214 · ClickHouse/ClickHouseSeems that calling replaceAll for a FixedString makes it lose the last character regardless of the replacements. This is reproducible in tables (i've tried Memory, TinyLog and MergeTree per...
-
Для data-skipping indexes, что означает параметр GRANULARITY? Чего конкретно гранулярность?
-
сколько гранул данных будет в 1 грануле индекса, как-то так)
-
В смысле, гранул = значений?
-
Допустим у меня есть мердж-три с гранулярностью 256 (так надо), я создаю дополнительный блюм фильтр с гранулярностью 1. Что будет в грануле индекса?
-
1 гранула мержтри, 256 строк
-
Спасибо.
-
есть вопрос, кликхаус не имея текущих операций после запуска одной из программ не освобождает добровольно память, при том что запросы в текущий момент не выполняются
-
sudo pmap -d 23828
23828: /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml --pid-file=/run/clickhouse-server/clickhouse-server.pid
Address Kbytes Mode Offset Device Mapping
0000000000200000 136828 r---- 0000000000000000 0fd:00001 clickhouse
000000000879f000 188920 r-x-- 000000000859e000 0fd:00001 clickhouse
000000001401e000 20 r---- 0000000013e1c000 0fd:00001 clickhouse
0000000014023000 72 rw--- 0000000013e20000 0fd:00001 clickhouse
0000000014035000 4108 rw--- 0000000000000000 000:00000 [ anon ]
00007f31bc400000 1658880 rw--- 0000000000000000 000:00000 [ anon ]
00007f32219ff000 720896 rw--- 0000000000000000 000:00000 [ anon ]
00007f324e200000 36864 rw--- 0000000000000000 000:00000 [ anon ]
00007f32507fb000 3817472 rw--- 0000000000000000 000:00000 [ anon ]
00007f333c000000 135168 rw--- 0000000000000000 000:00000 [ anon ]
00007f33445f8000 1933312 rw--- 0000000000000000 000:00000 [ anon ]
00007f33be600000 1951744 rw--- 0000000000000000 000:00000 [ anon ]
00007f3435800000 589824 rw--- 0000000000000000 000:00000 [ anon ]
00007f3459800000 417792 rw--- 0000000000000000 000:00000 [ anon ]
00007f3473000000 262144 rw--- 0000000000000000 000:00000 [ anon ]
00007f3483000000 262144 rw--- 0000000000000000 000:00000 [ anon ]
00007f3493000000 131072 rw--- 0000000000000000 000:00000 [ anon ]
00007f349b000000 57344 rw--- 0000000000000000 000:00000 [ anon ]
00007f349e800000 196608 rw--- 0000000000000000 000:00000 [ anon ]
00007f34bb000000 8192 rw--- 0000000000000000 000:00000 [ anon ]
00007f34bb800000 98304 rw--- 0000000000000000 000:00000 [ anon ]
00007f34c1800000 65536 rw--- 0000000000000000 000:00000 [ anon ]
00007f34c5800000 221184 rw--- 0000000000000000 000:00000 [ anon ]
00007f34d3000000 131072 rw--- 0000000000000000 000:00000 [ anon ]
00007f34db000000 49152 rw--- 0000000000000000 000:00000 [ anon ]
00007f34de000000 65536 rw--- 0000000000000000 000:00000 [ anon ]
00007f34e2000000 253952 rw--- 0000000000000000 000:00000 [ anon ]
00007f34f1800000 65536 rw--- 0000000000000000 000:00000 [ anon ]
00007f34f5800000 81920 rw--- 0000000000000000 000:00000 [ anon ]
00007f34fa95f000 28672 rw--- 0000000000000000 000:00000 [ anon ]
00007f34fc55f000 131072 rw--- 0000000000000000 000:00000 [ anon ]
00007f350455f000 323584 rw--- 0000000000000000 000:00000 [ anon ]
00007f351815f000 4 ----- 0000000000000000 000:00000 [ anon ] -
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-who-ate-my-memory/
посмотрите, мб поможет -
WHERE engine IN ('Memory','Set','Join') а если нет таких движков? у меня GraphiteMergeTree
-
значит они не занимают памяти. Это двжки, которые хранят данные в оперативной памяти.
-
-
чего-то жирно там маппингов осталось... предположу, что это просто кеш ondisk-данных типа LRU, какие есть буквально в любой СУБД. если рестартануть процесс, то этих маппингов нет до первого запроса к базе?
-
да
-
их чем-то можно убирать? для очистки?
-
-
не факт, что это committed-страницы, под которые реально существуют маппинги из виртуального адресного пространства в физическое. то есть они могут быть в таблице выделенной памяти, но физическую не занимать в тот или иной момент времени, если у ядра включено overcommit_memory
-
-
Всем привет. Возможно самый тупой вопрос дня - но тем не менее... Есть табличка в кликхаусе, в ней дубликаты. табличка дополняется, и она просто MergeTree. Я хочу сделать такую же табличку с ReplacingMergeTree, чтобы она загрузажала в себя дельты из первой таблички и когда-нибудь удаляла дубликаты. order by у них разный. Я понимаю как это сделать из ETL тулзов типа airflow но не понимаю как это правильно сделать средствами кликхаус
-
можно с помощью materialized view дублировать вставку во вторую таблицу
-
Да, один вариант - Materialized View
Второй вариант - это относительно новая фича projections. -
-
-
date партиции по месяца
(date, source_name) - primary key -
-
всем привет
наткнулся на то, что новая реплика не может создать себе схему, CREATE TABLE для одной таблички ругается на “Table columns structure in ZooKeeper is different from local table structure”. Путем пристального взгляда обнаружил, что порядок колонок в SHOW CREATE TABLE для этой таблички в существующих репликах действительно отличается от того, что пытается создать новая реплика, и оригинальный CREATE TABLE подходит
Вопрос: это поведение менялось где-то между 20.12 и 21.3.17, или раньше порядок колонок не особо учитывался? У меня есть подозрение, что баг, из-за которого у меня колонки в схеме менялись местами, был всегда, но не вызывал проблем, когда кластер был на 20.12 -
Подскажите, пожалуйста, а как перетащить жирную таблицу из postgresql в clickhouse, у меня ругается, что выделенных 16 Гб не хватает:
w-gpu-03 :) insert into default.files(hash, file) select hash, file from files_wgpu02.files;
INSERT INTO default.files (hash, file) SELECT
hash,
file
FROM files_wgpu02.files
Query id: 8fb906c1-b1fb-4390-b13b-56a26082be61
→ Progress: 1.05 million rows, 7.11 GB (1.52 thousand rows/s., 10.34 MB/s.)
0 rows in set. Elapsed: 691.305 sec. Processed 1.05 million rows, 7.11 GB (1.52 thousand rows/s., 10.29 MB/s.)
Received exception from server (version 21.9.4):
Code: 241. DB::Exception: Received from localhost:9000. DB::Exception: Memory limit (for query) exceeded: would use 16.17 GiB (attempt to allocate chunk of 268435456 bytes), maximum: 16.00 GiB: While executing SinkToOutputStream. (MEMORY_LIMIT_EXCEEDED) -
Спасибо
-
-
ребята, такой вопрос:
тестируем 21.9.4
есть storage_policies (ssd и hdd)
и все бы ничего, но в /var/lib/clickhouse/data/{database_name}/ я вижу линки на /var/lib/clickhouse/store/{abc}/{uuid}
но по пути линка нету объекта, он находится в
{/path_from_system.disks/}store/{abc}/{uuid}
это нормально, или хрень какая-то с конфигами/путями?
*таблицы квэряются без проблем, exchange table1 and table2 тоже без проблем -
Возможно "бага"
Кх не использует /var/lib/clickhouse/data/ линки для себя, это чисто для людей, что бы понятно было. -
есть рабочий способ - на стороне pg сделать несколько view на куски таблицы и лить из них
upd: работает если в таблицу не льются данные и можно выбрать непересекающиеся куски
(hash, file) как бы намекают, что это сделать не тривиально -
Господа, подскажите, пожалуйста, в чём может быть затык, что юзера не пускает по паролю с записью pass_sha256_hex в users.xml?
Например, если указать авторизацию через лдап и ввести тот же самый пароль, то получается успешно, а если захешировать его — фиг. -
Печально. Если бы КХ то, что из постгри, дампил в какой-нибудь temp-file перед обработкой, думаю, было бы вообще супер. Но, похоже, он только при обработке своих запросов такое умеет.
-
-
Я скажу больше. Мне недавно надо было перетащить данные из одного кликхауса в другой (переезд с площадки на площадку). Ну, думаю, дай запущу два клиента через unix pipe: один вычитывает из "старого" кликхауса, передает другому клиенту, второй пишет в "новый" кликхаус. Ага, щаз, разбежался. То же самое: не хватило памяти. Пришлось писать bash-скрипт, который разбивал таблицу на куски и SELECT-ом оттуда маленькими порциями.
-
-
-
Есть ли какой-то быстрый способ для миграции MergeTree таблицы на новый синтаксис кроме “insert into new select from old” ?
-
официально нет. Если вам очень надо и вы готовы потратить много сил (человеков) и денег, то есть.
В исходниках КХ есть утилита которая конвертирует каталоги и файлы. -
вы наверное об этом https://github.com/ClickHouse/ClickHouse/issues/14576#issuecomment-689134560? а почему еще и много денег?Migrating data from old Merge Tree Syntax · Issue #14576 · ClickHouse/ClickHouse
Hello 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...
-
я опечатался "или денег" , в смысле кто-то другой сделает, наверное мы в Альтинити бы сделали для клиента если ему сильно надо.
-
это будет довольно сложный процесс, потому что надо понимать как это сделать не переналивая данные на реплики и не запоров все.
-
Что-то математика не сходиться, зачем ch тащить такую таблицу? Выходит, что средний (hash, file) 7kb
-
я не особо понимаю версия КХ у вас какая. В последних версиях уже появился движок postgresql, по крайней мере, можно придумать насчет buffer таблицы или посмотреть инструменты для такого
-
-
да баг конечно, там регулярка неправильная, трим сделан регэксом
-
что если
set max_threads=1, max_block_size=10000;
insert ....
16 GB конечно мало, КХ из коробки не готов к такому (проблема не в том что 16 мало, а в том что КХ писали под машины у которых 64+) -
Так кх радает по памяти. Там 150 млн записей по 8к в среднем.
-
Да. Там хеш и бинарные данные (сам файл).
-
как говорил тогда @den_crane, но будет оч долгооо
-
-
-
-
там проверка не делается при attach. Я видел пример как такого добиться, но давно, Николай Варталомей кажется показывал, но это нелегко.
-
такого - это какого? То есть обычно порядок колонок не учитывается, лишь бы все остальное совпадало?
-
такого что бы порядок был разный.
У вас разный порядок в ZK в ветке таблицы и на диске в .sql у одной реплики?
Или вас разный порядок в .sql файлах у двух реплик?
Порядок колонок в метаданных влияет на порядок полей в инсертах и select-ах -
date, (date, source_name), 8192)
partition by toYYYYMM(date) order by (date, source_name) settings index_granularity = 8192 -
-
jemalloc -- это библиотека для управления памятью которой пользуется КХ, не освобождает память моментально, чтобы не тратить время на аллокацию
плюс в КХ есть кеш марков который раздувается до 5ГБ. mark_cache_size -
Частями, только учитывайте что с табличной функцией postgresql на стороне удаленного сервера работают только простые условия типа =><, подробней в доке. А всякие лимиты и почее навешиваются уже после полной выборки что также вызовет нехватку памяти
-
-
Спасибо за совет, но я уже разобрался: пишем клиента на Java, в котором выбираем всю таблицу из postgresql одним запросом, а в КХ вставляем порциями по 100000 записей.
-
Ребят куда копать если OPTIMIZE не происходит в фоне
-
Руками выполняется, все норм
-
-
Печально
-
Проверил в текущей партиции не мержаться
-
вроде просто не дает еще до начала, не помню такого бага
-
-
-
интересно, ну в гитхаб
-
-
Привет, можете подсказать, почему у меня обычный запрос с двумя джойнами и группировкой грузится целую минуту? (использую tabix.io)
-
Может спилится на диск, может сваливаться в "merge" join, много еще чего. Включите трейс лог, без него не разберетесь
-
Точно не merge.
Спасибо, попробую трейс. -
150GB не привышает
-
Вот атк воспроизводится
DROP TABLE IF EXISTS test_log ON CLUSTER 'my_cluster';
CREATE TABLE test_log ON CLUSTER 'my_cluster'
(
messageId String,
timeQueued DateTime,
step AggregateFunction(max, UInt8)
)
engine = ReplicatedAggregatingMergeTree('/clickhouse/tables/test_log', '{replica}')
PARTITION BY toYYYYMM(timeQueued)
ORDER BY messageId
SETTINGS index_granularity = 8192;
INSERT INTO test_log (messageId, timeQueued, step)
VALUES
('mid1', '2021-05-03 17:11:00', initializeAggregation('maxState', 0)),
('mid2', '2021-05-03 17:11:00', initializeAggregation('maxState', 0)),
('mid1', '2021-05-03 17:11:00', initializeAggregation('maxState', 1)),
('mid2', '2021-05-03 17:11:00', initializeAggregation('maxState', 1));
SELECT messageId,
timeQueued,
finalizeAggregation(step)
FROM test_log - 16 October 2021 (55 messages)
-
все запросы к движкам AggregatingMergeTree / SummingMergeTree надо домерживать-groupby.
схлопывание строк это всего лишь побочный продукт мержей. Мержи нужны не для того чтобы схлопнуть записи и сделать вам удобно, а совсем для другого.
SELECT messageId,
timeQueued,
maxMerge(step)
FROM test_log
group by messageId, timeQueued
здесь проще использовать SimpleAggregateFunction(max,) -
По поводу группировки нет проблем она есть, но у меня нет понимания будут ли они смержены в принципе, меня волнует количество данных и нигде ли я не затупил)
-
За SimpleAggregate отдельное спасибо
-
Шедулер мержей назначает мержи исходя из скорости добавленя данных и количества и размеров партов. Как только вы сделаете 5-6 однострочных инсертов они будут смержены. В среднем в партииции куда индет вставка будет 22-40 партов, в неактивной партиции 4-5. У кх нет цели смержить все в один парт, это не имеет смысла, на мержи больших партов уходит огромное кол-во ресурсов и не приносит никакой пользы, если тысячу мелких партов смержить в 3 то скорость селектов вырастет в 10 раз, если 3 огромных парта смержить в один, скрость селектов вообще не изменится, при этом для такого мержа придется перелопатить сотни гигабайт.
-
С виду, генерируемая регулярка рабочая
-
Добрый день, товарищи. Столкнулся с необходимостью расширить в таблицах некоторые столбцы c типом Uint8 до Uint16. И тут случилось мое малое кол-во знаний. На Вас уповая, прошу наставить на путь истиный.
Вводные:
1. Версия клика - version 19.16.7.24. Переход на последнюю не за горами, сейчас на тестовом сервере гоняем ее.
2. 1 шард, 2 реплики.
3. Таблицы с движком ReplicatedMergeTree и ReplicatedSummingMergeTree
4. Столбцы, которые хочу изменить - они в секции ORDER BY, т.е. ключи.
Решил пойти путем создания аналогичных таблиц с другим именем, но измененным типом столбцов. Далее по пунктам:
1. Create table tab_a_new;
2. Detach table tab_a on cluster my_cluster;
3. Перенос данных из каталога /data/default/tab_a/detached в каталог /data/default/tab_a_new/detached
4. Attach table tab_a_new on cluster my_cluster
5. Drop/delete table tab_a и всю data.
6. Rename table tab_a_new to tab_a on cluster my_cluster
Вопросы:
1. Нужно ли после пункта 1 и перед пунктом 3 сделать Detach table tab_a_new?
2. После пункта 2 в каталоге /data/default/tab_a/detached данных не появилось. Detach не перенесет данные в этот каталог?
Или мне надо из каталога /data/default/tab_a данные перекинуть в /data/default/tab_a_new/detached
3. Перенос данных надо на каждой реплике делать, или лучше на одной, и потом после пункта 4 выполнить system restart replica tab_a_new?
4. Правильный ли путь выбран или есть более корректные варианты? -
Help, pls.
-
а как именно генерили пароль?
уверены что именно sha256 хеш сделали? -
самое безопасное, но требует x2 места
CREATE TABLE .. ON CLUSTER
INSERT INTO new_table SELECT * FROM old_table
DROP TABLE old_table
на одной ноде
перенос данных с изменением типа. не сработает IMHO, но попробуйте
4й пункт не надо ATTACH ON CLUSTER... по идее если ATTACH сработает, то
6й пункт если есть нагрузка на old_table, может быть блокировка, потому что 19.16 - там все Ordinary и блокировки -
диковатый вопрос, а если CH поселить в докере а его БД хранить снаружи через volume ?
-
Некоторые так делают, некоторым нравится
Но кх не всегда соблюдает лимиты cgroupa -
Как в доке было:
echo $pass | sha256sum -
я спрашиваю в плане для тестов разворачивать инсталляцию
-
там в доке еще tr -d "-"
-
Ну это же просто удаляет дефис в конце строки.
-
ну дык а где ее хранить то кроме как в volume, иначе же после рестарта контейнера никакой БД у вас не будет
-
grep -i sha256 -r /var/lib/clickhouse/preprocessed_configs/
что показывает? -
Спасибо!
-
Грепается тот хеш, который указал в users.xml
-
Пардон, кажется я разобрался. Видимо где-то перенос строки в конце пароля попал в хеш.
-
Подскажите плз, проекции - это уже достаточно надежный механизм, можно использовать в бою?
-
Есть некоторые баги, но в целом достаточно надежный
-
Плюс их всегда достаточно просто выключить настройкой
-
понял спасибо
-
ну как бы да, но матвьюшки от выключения настройки не появятся. Я в режиме "пора ли отказаться от матвью в пользу проекций, если матвью были нужны только для смены сортировки"
-
А большая таблица?
-
3млрд строк, 15гигов байтов если верить system.tables
-
ну и она не одна такая
-
Там была проблемка с анализом и выбором подходящей проекции (для не агрегирующих как раз), мб уже пофиксили.
Но я бы рекомендовал все равно попробовать хотя бы с точки зрения того, что если люди не будут пробовать, пользоваться и находить баги, то они не выйдут из экспериментального статуса никогда. Их создатель товарищ отзывчивый и баги править быстро.
> 3млрд строк, 15гигов байтов если верить system.tables
Ну это немного, перелить будет не долго. -
echo -n
не просто так в документации стоит =) -
Видимо между глаз попало, да. Спасибо!
-
спасибо
-
это невозможный путь. Не будет таблица работать если ей подсунуть файлы с данными другого типа.
Только insert select -
да, действительно -- рабочая, я думал там скобки нужны (.. ) | (.. )
но нет -
trim incorrect result in case of BOTH · Issue #30245 · ClickHouse/ClickHouse
SELECT trim(BOTH ', ' FROM '5935,5998,6014, ')||'|' x SELECT concat(replaceRegexpAll('5935,5998,6014, ', concat('^[',...
-
Всем привет!
Пытаюсь создать колонку с типом SimpleAggregateFunction(argMax, UInt8, DateTime)
В документации указано, что SimpleAggregateFunction поддерживает argMax, но я получаю ошибку Unsupported aggregate function argMax.
В документации не обнаружил с какой версией появилась поддержка этой функции.
Не подскажите, с какой версией клика данная функция поддерживается и поддерживается ли вообще? У меня версия клика 21.8.8.29 -
Ее добавили а потом убрали
-
Спасибо! А не знаете, планируют ли ее добавить?
-
Думаю нет
-
Спасибо
-
а как она вобще могла быть SImple? Там же в стейте два числа - максимум и при каком значении аргумента он был достигнут.
-
Там сделали хак, что она принимала тапл из двух значений, но появился креш и это выпилили
-
вообще, так ругается, что не поддерживается SimpleAggregateFunction(argMax, UInt8, DateTime), а вот так, SimpleAggregateFunction(argMax, UInt8) что не хватает агрумента )
-
ой как страшно :) и много ещё там таких стремных мест?
-
Теперь нету
-
Понял, спасибо
-
-
-
образ?
https://clickhouse.com/docs/en/getting-started/install/#from-single-binary
Linux AArch64 — curl -O 'https://builds.clickhouse.com/master/aarch64/clickhouse' && chmod a+x ./clickhouse -
Ну думал docker образ но бинарь тоже отличный вариант
-
-
так и надо писать докер образ
на dockerhub есть и для M1 и для AArch64 -
👍
-
в смысле поиском там можно найти
-
Привет. Подскажите, в https://clickhouse.com/docs/en/operations/system-tables/quotas/ описано как передавать quota_key по http интерфейсу и clickhouse-client, но возможно ли его передавать настройкой в самом sql запросе? (использую драйвер https://github.com/ClickHouse/clickhouse-go)
- 17 October 2021 (112 messages)
-
к сожалению нет
https://github.com/ClickHouse/clickhouse-go/search?q=quota
там пустой захардкожен
может сделаете PR? Кирил вроде быстро их рассматриваетSearch · quota · ClickHouse/clickhouse-goGolang driver for ClickHouse. Contribute to ClickHouse/clickhouse-go development by creating an account on GitHub.
-
Добрый день
Перешел с 21.6 на 21.8.8.29 и появились проблемы.
Раньше движок File() нормально работал с симлинками в папке user_files на другой каталог (диск)
Это функционал использовался для создания бэкапов таблиц.
Теперь выдаётся ошибка:
Code: 291, e.displayText() = DB::Exception: File is not inside /var/lib/clickhouse/user_files (version 21.8.8.29 (official build))
Можно ли вернуть прежнее поведение какой-либо настройкой ? -
В "Backward Incompatible Change" для версий 21.7 и 21.8 нет информации об изменении поведения движка File()
-
Пишите на гитхаб
-
-
select c_id CID,
(select c_name from category where c_id=CID) as CNAME
from category_to_product c2p
where p_id=73041
нужно получить название категорий CID товара p_id
Error: Missing columns: 'CID' while processing query: 'SELECT c_name FROM category WHERE c_id = CID'
коллеги подскажите КАК ПЕРЕДАТЬ ПАРАМЕТР CID В ПОДЗАПРОС (..) as CNAME ?
КРОМЕ решений через JOIN -
Для справочников (товары, категории товаров, клиенты и др.) эффективнее словари использовать
-
через подзапрос нельзя сделать в КХ, для такого существуют словари https://clickhouse.com/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts/#dicts-external-dictsВнешние словари | Документация ClickHouse
Внешние словари Существует возможность подключать собственные словари из различных источников данных. Источником данных
-
Можно настройкой опеределить где user_files лежит
И не делать симлинки -
спс за ответ - такое решение прямо сюда хорошо ложится
но меня интересует не пример а в целом
КАК ПЕРЕДАТЬ ПАРАМЕТР PAR В ПОД-ЗАПРОС (SELECT .. where c=PAR) as CNAME ? -
т.е. я правильно понял что
в ПОДЗАПРОС нельзя передать параметр из запроса ? -
да, нельзя
-
спс
-
а через лямбда функцию можно под-запрос сделать ?
-
кажется нет, вы пытаетесь найти самый неэффективный способ выполнить запрос?
-
нет :)
просто через JOIN нужно будет взять ВСЕ категории-to-товары и ВСЕ категории и ПОТОМ объединить их по c_id
это тоже не очень эффективно -
зависит сколько у вас категорий, если их не очень много, join будет эффективнее чем подзапрос на каждый продакт. Но вообще это задача под словарь и думать о другом даже не стоит
-
Всех, с новым годом!
Есть таблица с TTL-переносом данных на другой том.
На этом томе, в папке таблицы, лежит непустая папка moving, в ней много кусков данных.
Похоже, что при переносе данных, упёрлись в keep_free_space_bytes.
Как поступать в такой ситуации?
Ни optimize, ни start moves никакого результата не дали ( -
спс - буду пробовать
-
есть issue https://github.com/ClickHouse/ClickHouse/issues именно там надо добавлять такие сообщения.
PR это если вы присылаете изменение в код или документацию.
в след.раз используйте https://github.com/ClickHouse/ClickHouse/issues/new/choose -
нет, КХ не начинает move если не хватает места, надо искать лог, дело в чем-то другом. Насколько старая папка moving , пытались понять где этот парт?
-
Папка свежая, сегодня в час ночи пошёл мув.
Что странно, что есть нормально перенесенные куски с таймштампами на час позже.
Например на волуме есть нормально перенесённый кусок одного и того же партишина и кусок хххх_0_5хх_.... в папке мувинг. -
можно делать join с запросом и ограничить категории.
Проблема с кореллированными подзапросами в OLAP и в КХ особенно, в том что надо подзапрос выполнить для каждой строки основной выборки, это супермедленно, особенно в случае КХ, в КХ индекс разреженный и очень дорого доставать одну строку по ключу. Если сделать словарь layout=direct получится ровно это (можете проверить). Есть план научится автоматически переписывать такие запросы как ваш в обычный join. Поэтому можете сразу переписать в join. -
в логе ищите сообщения про этот парт. Проверьте в system.merges может этот мув еще идет
-
-
-
в смысле alter delete ?
alter delete сначала создает парт без удаленных записей, а потом удаляет исходный парт. Мутации и мержи требуют свободного места 2*размер исходных партов -
да, то есть мне просто удалять всю базу данных?
-
кто съел место-то? system таблицы?
-
таблица из которой удаляю
-
-
-
дроп партиций не требует места, если вам например надо удалить старые данные, то это дебилизм использовать alter delete.
-
-
я действительно использую clickhouse как дебил, отсюда и все проблемы)
-
почему одна таблица ? где куча system таблиц?
-
-
-
-
-
вы каким пользователем делаете запрос к system.parts ?
можно просто на диске cd /var/lib/clickhouse/; du -sh * -
-
-
cd store/ ; du -sh *|grep G
-
-
cd 62e;du -sh *
-
-
cd 62e70969-e4c1-4401-bcff-c10765879ed2; ls -la |head -20
-
total 964
drwxr-x--- 128 clickhouse clickhouse 12288 окт 17 17:56 .
drwxr-x--- 3 clickhouse clickhouse 4096 апр 22 12:14 ..
drwxr-x--- 2 clickhouse clickhouse 12288 мая 9 17:02 202104_1_24162_112
drwxr-x--- 2 clickhouse clickhouse 12288 апр 30 23:59 202104_24163_24341_38
drwxr-x--- 2 clickhouse clickhouse 4096 мая 1 00:00 202104_24342_24346_1
drwxr-x--- 2 clickhouse clickhouse 12288 июн 26 17:00 202105_24347_379442_160
drwxr-x--- 2 clickhouse clickhouse 12288 мая 31 23:42 202105_379443_379718_14
drwxr-x--- 2 clickhouse clickhouse 12288 июн 5 12:09 202105_379719_379859_12
drwxr-x--- 2 clickhouse clickhouse 12288 июн 10 16:45 202106_379860_489357_23
drwxr-x--- 2 clickhouse clickhouse 12288 июл 21 12:53 202106_489358_720343_25
drwxr-x--- 2 clickhouse clickhouse 12288 июл 11 01:52 202106_720344_722944_14
drwxr-x--- 2 clickhouse clickhouse 12288 июл 6 09:36 202106_722945_723193_11
drwxr-x--- 2 clickhouse clickhouse 4096 июл 1 00:00 202106_723194_723194_0
drwxr-x--- 2 clickhouse clickhouse 12288 авг 4 07:29 202107_1029971_1032021_11
drwxr-x--- 2 clickhouse clickhouse 4096 авг 1 00:31 202107_1032022_1032024_1
drwxr-x--- 2 clickhouse clickhouse 12288 июл 26 22:13 202107_723195_829028_17
drwxr-x--- 2 clickhouse clickhouse 12288 авг 17 18:03 202107_829029_1029970_21
drwxr-x--- 2 clickhouse clickhouse 12288 авг 28 09:03 202108_1032025_1164887_18
drwxr-x--- 2 clickhouse clickhouse 12288 авг 19 00:27 202108_1164888_1234943_17 -
select name , datanase from system.tables where uuid='62e70969-e4c1-4401-bcff-c10765879ed2'
-
-
-
-
-
drop table system.query_log
-
-
SQL Error [359]: ClickHouse exception, code: 359, host: 127.0.0.1, port: 16692; Code: 359, e.displayText() = DB::Exception: Table or Partition in system.query_log was not dropped.
Reason:
1. Size (126.67 GB) is greater than max_[table/partition]_size_to_drop (50.00 GB)
2. File '/var/lib/clickhouse/flags/force_drop_table' intended to force DROP doesn't exist
How to fix this:
1. Either increase (or set to zero) max_[table/partition]_size_to_drop in server config
2. Either create forcing file /var/lib/clickhouse/flags/force_drop_table and make sure that ClickHouse has write permission for it.
Example:
sudo touch '/var/lib/clickhouse/flags/force_drop_table' && sudo chmod 666 '/var/lib/clickhouse/flags/force_drop_table' (version 21.3.5.42 (official build))
видимо действую по инструкции фикса -
мля, читайте что вам пишут в ошибках
sudo touch '/var/lib/clickhouse/flags/force_drop_table' && sudo chmod 666 '/var/lib/clickhouse/flags/
drop table system.query_log -
-
-
Всем привет! А подскажите как увидеть все партиции по определенной таблице? Вот такой запрос не работает...
select * from system.parts WHERE table = "logs" FORMAT Vertical -
'logs'
-
спасибо!!)
-
двойные кавычки для объектов базы данных -- имен объектов
-
одинарные для строк
-
select * from system."parts" WHERE "table" = 'logs' FORMAT Vertical
-
спасибо, буду знать
-
да, спасибо, исполнилось, освобождения места ждать?
-
ааа, через 8 минут.
в атомик базах данных, есть корзина, в ней лежит 8 минут после дропа.
можно делать drop table .... sync -
-
-
-
Привет! Появилась идея для фичи(строка подключения), поревьюйте ишью, пожалуйста.
https://github.com/ClickHouse/ClickHouse/issues/29880ClickHouse connection strings · Issue #29880 · ClickHouse/ClickHouseUse case Now you can connect to ClickHouse by specifiying separately host, port, username, password and other parameters. clickhouse-client --host=... --port=... --user=... --password=... It is alr...
-
И вот такой вопрос. Есть задача хранить логи 90 дней. Каким запросом можно удалять все партиции старше 90 дней?
ALTER TABLE logs DROP PARTITION WHERE "modification_time" <= '2021-10-17' -
ALTER TABLE logs MODIFY SETTING ttl_only_drop_parts = 1;
ALTER TABLE logs MODIFY TTL modification_time + INTERVAL 90 DAY; -
Спасибо. А есть ли еще у кликхауса еще возможность удалять партиции по мере заполнения места на диске?
-
нет
-
в принципе заскриптовать это полчаса и в крон
-
-
чота туплю и не могу придумать как разбить 2020.1.29.287 на 2020, 1, 29, 287 и отформатить как 2020.01.29.0287
-
splitByChar + lpad, либо regexReplace
-
а. я смотрел arrayMap
-
SELECT
'2020.1.29.287' AS i,
splitByChar('.', i) AS x,
concat(x[1], '.', leftPad(x[2], 2, '0')) AS r
Query id: 566cb301-50ae-4daf-b132-f2f13082fbbb
┌─i─────────────┬─x───────────────────────┬─r───────┐
│ 2020.1.29.287 │ ['2020','1','29','287'] │ 2020.01 │
└───────────────┴─────────────────────────┴─────────┘ -
о круто! спасибо :)
-
тактак. Кажеца у нас нету функции leftPad :)
-
Похожую задачу решал, нужно было из представлений документов дату "выудить":
-
хмхм, порпбую, спасибо
-
WITH
parseDateTimeBestEffort(replaceRegexpAll(substringUTF8(DataPresentation,lengthUTF8(DataPresentation) - 19),'[от]','')) AS dat
SELECT
dat,
DataPresentation
FROM
EventLog1C.RowsData
WHERE
startsWith(Metadata,'Документ.') -
я вообще и начал сначала искать как регулярку применить, но потом быстро переключился на способ попроще для сервера (как мне показалось) со split/map/concat
-
Новый тип словарей HASHED_ARRAY COMPLEX_KEY_HASHED_ARRAY
Кушает памяти меньше чем обычные (примерно в два раза больше чем непожатые данные в mergeTree) и быстрее чем sparse_hashed
https://github.com/ClickHouse/ClickHouse/pull/30242
https://github.com/ClickHouse/ClickHouse/issues/30236Added HashedArray dictionary by kitaisreal · Pull Request #30242 · ClickHouse/ClickHouseChangelog category (leave one): New Feature Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Added HashedArray dictionary type.
-
Под обычными имеется ввиду HASHED() и COMPLEX_KEY_HASHED() ?
Есть какие-либо минусы, ограничения у новых типов ? -
есть тонкость, это для словарей с большим количеством атрибутов (>1).
да, про HASHED() COMPLEX_KEY_HASHED, они потребляют в разы больше памяти.
внутри все атрибуты лежат просто во flat словаре, а индекс flat находится с помощью HASHED/COMPLEX_KEY_HASHED, т.е. под капотом делается как бы два dictget
т.е. если у словаря 500 атрибутов, то HASHED/SPARSE_HASHED будут даже грузится бесконечное кол-во времени потому что надо построить 500 хеш-таблиц
для HASHED_ARRAY, только 1 хештаблицу и 500 массивов -
Спасибо за информацию. Потестим на своих данных
-
это будет в 21.11
-
Только на 21.8.8.29 (LTS) "переехали", ждём следующую LTS.
Вопрос: кроме более длительной поддержки версия LTS от
других stable-версий отличается по количеству ошибок
(практический опыт) ? -
нет, не отличается.
В смысле если подождать пол-года после выхода LTS, то в ней почти не будет ошибок.
Сейчас конечно еще рано переходить на 21.8, я в марте планирую. -
Понятно, любая stable, как и LTS, имеет исправления в новых релизах. Просто период исправлений больше у LTS
-
Всем привет!
Подскажите пожалуйста изучаю кликхаус хочу использовать как базу для хранения аналитики по времени. Есть ли на данный момент относительно простые способы реализовать вставку по одному элементу (сотню в секунду). Я вижу что в кликхаус поддерживается буфферизация и есть in-memory таблицы. Что из этого можно было бы использовать чтобы не городить сложной прослойки между базой и приложением? -
если по одной строке вставлять, то либо Engine=buffer
либо https://github.com/nikepan/clickhouse-bulk / https://github.com/VKCOM/kittenhouse -
-
в 21.10 (релиз на этой неделе) будет еще один менханизм https://github.com/ClickHouse/ClickHouse/pull/27537Merging #20557 (Asynchronous inserts) by CurtizJ · Pull Request #27537 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Not for changelog (changelog entry is not required) Merging #20557. TODO:...
-
M(Bool, async_insert_mode, false, "Insert query is processed almost instantly, but an actual data queued for later asynchronous insertion", 0)
-
А с какой версии переехали?
-
а как вы из своих данных (буферизованных) будете запрашивать?
Engine=buffer позволяет кверять -
записывать в базу сразу перед чтением
-
-
-
А гарантии у этого механизма какие будут в случае смерти сервера? Потеря данных, как и у buffer?
-
Да, никакого Wal лога нет
-
Понятно, спасибо!
-
ClickHouse/ClickHouse description changed: v21.10.2.15-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.10.2.15-stable
Release notes:
ClickHouse stable release v21.10.2.15-stableRelease v21.10.2.15-stable · ClickHouse/ClickHouseClickHouse stable release v21.10.2.15-stable
-
Добрый вечер! Подскажите пожалуйста как сократить количество active parts? Изменение параметров гранулярности не помогло Таблица CREATE TABLE default.mytable
(
`date` Date,
`datetime` DateTime,
`sid` String, ...) ENGINE = MergeTree
PARTITION BY date
ORDER BY (sid, date)
SETTINGS index_granularity = 16384, index_granularity_bytes = 1073741824 │ где sid - это число в диапазоне от 0 до 20000, но в базе хранится в виде строки. Спасибо! - 18 October 2021 (152 messages)
-
Эээ, вы чего-то странное говорите про гранулярность, она вообще тут ни при чем, и sid - тоже
>как сократить количество active parts
эээ, зачем? Сколько у вас? Какую проблему решаем?
Кол-во active parts зависит от PARTITION BY date, максимального размера парта (настройка), и активности инсертов. Если парты достигли макс. размера то они мержится не будут. Если инсерты слишком частые и слишком мелкие то мержить будет не успевать. Если вы храните данные за 10 лет, то при PARTITION BY date, у вас будет 10*365 active партов, и даже скорее 10*365*3 партов -
Нужно хранить данные минимум за месяц, Каждый день получается по 20-24 parts, даже 2 недели я упираюсь в too many parts при конфигк в 300. Проблема в том как сделать 10 parts за день из 20-22. В документации я видела только min_part_size и min_part_size_ration, и что по умолчанию размер любой таблицы максимум 150 Gb, Можно управлять максимальным размером part? Как узнать что если PARTITION BY DATE то должно получаться 10 part-ов за день? INSERT максимум 16 в минуту блоками по 10k - 100K записей CSV файл, это собирается в таблице BUFFER у которой макс размер и тайм-ауты подобраны так чтобы данные копились 10-15 мин
-
Добрый день, подскажите с какой версии значения для select стали менее строги
Например раньше, если колонка числовая то и значение должно быть числовым.
Сейчас можно отправить такой запрос и он успешно отрабатывает (при наличии таблицы)
SELECT * FROM test_stat WHERE (user_id=5) AND (time='1634537870')
AND (test_uuid='8a09b0fa-1868-41f3-854e-49370efbba55')
AND (test_int64='9223372036854775807') -
я правильно понял, что по Вашему мнению :
со словарем - не очень хорошее решение,
лучшее - join c возможными ограничениями внутри (SELECT * from category )
? -
-
Доброго времени! Перешерстил документацию, но так и не смог найти однозначный ответ - каким образом осуществляется штатное обновление кластера из двух КХ при условии использовании кластера зукиперов. На текущий момент используется КХ 20.3.7.46. Требуется обновить до версии 21.9.4.35. Коллеги, не подскажите алгоритм действий? Останавливаем один инстанс КХ - обновляем-запускаем-проверяем логи? Потом переходим ко второй? Не будет ли проблем, если в кластере некоторое время будут КХ разных версий?
-
Чем интересно?
попробуйте max_execution_time или receive_timeout поднять -
поведение вполне себе ожидаемое...
попробуйте представить себе какие процессы идут во время OPTIMIZE ... FINAL ...
фактически много раз перечитывается и перезаписывается вся таблица ...
сколько она у вас на диске весит? -
Порядка 700 гигов.
-
обновляете одну ноду...
быстро проверяете что запустился сервер все и данные на месте...
потом вторую...
ну еще перед обновлением лучше почитать релизы про несовместимость (слово incompatible)
почитать
https://clickhouse.com/docs/en/whats-new/changelog/
и тут
https://clickhouse.com/docs/en/whats-new/changelog/2020/
и тут
https://altinity.com/blog/tag/releases/2021 | ClickHouse DocumentationClickHouse release v21.10, 2021-10-16 Backward Incompatible Change Now the following MergeTree table-level settings: rep
-
Благодарю за помощь. Касательно "быстрой проверке пустился ли сервер и на месте ли данные". Это сделать из приложения? Т.е мы позволяем некоторое время использовать в кластере ноды разных версий?
-
да, это можно делать
формат метаданных в zookeeper не менялся особо...
но долго держать разные версии не рекомендуется...
чтобы сильно не распозлось -
Понял. Огромное спасибо за помощь
-
ваша ошибка тут - "PARTITION BY date" а должно быть "PARTITION BY toYYYYMM(date)". Почему так - вам Денни достаточно подробно рассказал.
-
Спасибо!
-
А у вас ошибка какая? Если “Too many parts (300). Merges are processing significantly slower than inserts” то возможно вы просто слишком часто вставляете мелкими пачками. PARTITION BY date тут не причём
-
почему не причем
если partition by date
а вставка за неделю
то на одну вставку 7 активных партов создается... -
Использую таблицу ENGINE = Buffer('default', 'pre_buffer', 16, 300, 1500, 50000, 500000, 150000000, 200000000). С такими параметрами данные собираются в течение 10-15 минут в ней. В буфер - 32 операции INSERT в минуту для больших CSV файлов. Для нас если иногда потеряются данные - ничего страшного
-
Привет!
Вижу в логах вот такое, несколько раз в секунду. А есть ли шанс понять, откуда эта ошибка? Хотя бы к какому типу хоста, в каком процессе он не может приконнектиться?
2021.10.18 12:03:51.202288 [ 16074 ] {} <Error> ServerErrorHandler: Poco::Exception. Code: 1000, e.code() = 107, Net Exception: Socket is not connected, Stack trace (when copying this message, always include the lines below):
0. Poco::Net::SocketImpl::error(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x1437086e in /usr/bin/clickhouse
1. Poco::Net::SocketImpl::peerAddress() @ 0x14372816 in /usr/bin/clickhouse
2. DB::HTTPServerRequest::HTTPServerRequest(std::__1::shared_ptr<DB::Context const>, DB::HTTPServerResponse&, Poco::Net::HTTPServerSession&) @ 0x117c252b in /usr/bin/clickhouse
3. DB::HTTPServerConnection::run() @ 0x117c138e in /usr/bin/clickhouse
4. Poco::Net::TCPServerConnection::start() @ 0x1437788f in /usr/bin/clickhouse
5. Poco::Net::TCPServerDispatcher::run() @ 0x1437931a in /usr/bin/clickhouse
6. Poco::PooledThread::run() @ 0x144ac199 in /usr/bin/clickhouse
7. Poco::ThreadImpl::runnableEntry(void*) @ 0x144a842a in /usr/bin/clickhouse
8. start_thread @ 0x76db in /lib/x86_64-linux-gnu/libpthread-2.27.so
9. __clone @ 0x12188f in /lib/x86_64-linux-gnu/libc-2.27.so -
ну если сразу одним инсертом за месяц вставлять то да(
-
tcpdump -w http.cap -c 10000 port 8123
сделайте и посмотрите какие IP закрывают соединения... -
Я не очень понял контекста, это обычные селекты на обычном кликхаусе?
-
ну если 7 инсертов каждый отдельная дата одновременно тоже будет 7 партов
10 запросов в секунду и уже 70 активных партов... -
Если бы. По 20+ active parts за предыдущие дни и по 10..70 active parts за сегодня. И iowait под 50% в рабочие часы. Медленные диски, возможности сменить дисковую полку нет. Пишутся логи в риал тайме от кучи машин, 32 пишущих модуля
-
Да.
-
так ошибка же падает если число партов в 1 партиции больше parts_to_throw_insert насколько я понимаю, тоесть если мы делаем 7 инсертов за разные даты, то они могут создавать по 100 партов каждый и всё будет ок. это не так?
-
а это закрытие именно входящего соединения к CH, не исходящего от него?
-
Всем привет! Предлагаю на рассмотрение вакансию в Cбере (департамент SberData) #вакансия #москва #офис #fulltime # ClickHouse #полнаязанятость #разработчик # #сбербанк
Вакансия: Системный разработчик ClickHouse
Город: Москва (м.Тульская)
Компания: Sber
Заработная плата: от 200 тыс. руб. на руки и выше
Мы создаем команду для разработки продукта построенного на базе OpenSource ClickHouse. Перед командой стоят амбициозные цели построить уникальную инфраструктуру по хранению и обработки данных на базе решений ClickHouse. Команда решает задачи интеграции ClickHouse с сервисами Корпоративной Аналитической Платформы, построения инфраструктуры обработки данных с использованием технологии ClickHouse. Оказывает архитектурную поддержку командам разработки и совместно с ними ищет наилучшие и самые производительные решения прикладных задач, доработки ClickHouse под уникальные задачи Сбера.
Обязанности:
• Разработка ядра ClickHouse
• Консалтинг по вопросам производительности СУБД
• Построение архитектуры межсистемного взаимодействия
• Разработка собственной сборки на базе Open Source решений ClickHouse
• Интеграция с ClickHouse c ядровыми сервисами КАП
Требования:
• Опыт работы с linux-системами
• Опыт работы с С++
• Хорошие знания ClickHouse
• Желание и возможность разбираться в сложных проблемах
• Умение работать в стрессовых ситуациях
• Английский язык на уровне свободного чтения технической документации
Условия:
• Гибкий график для оптимального баланса работы и личной жизни.
• Бесплатный фитнес-зал в БЦ.
• Профессиональное обучение, семинары, тренинги, конференции, корпоративная библиотека.
• ДМС, страхование жизни.
• Самые инновационные, амбициозные проекты и задачи.
• Свободный дресс-код.
• Льготные кредиты и корпоративные скидки.
• Конкурентная компенсация (оклад и премии по результатам деятельности).
По всем вопросам, прошу писать в @liplip23 -
Вот вы разрешили тут вакансиями спамить, щас набегут к вам. Ваше дело конечно, но я бы отдельный канал под такое завел
-
DB::HTTPServerRequest::HTTPServerRequest
Poco::Net::TCPServerConnection::start
вроде да -
Хорошо бы было как-нибудь забодать эту ошибку, хотя бы для /health эндпоинта. Иначе если “проверялка” не закрывает соединение правильно (указывая в хттп Connection: close), то КХ начинает плеваться в логи и забивает полезную информацию.
-
health endpoint что это?
есть же /ping
делайте нормальную HTTP проверялку...
у вас что вообще? docker -compose или k8s ? -
Доброго времени! Коллеги подскажите играет ли роль разброс по времени на серверах кластера КХ? На тех серверах что вижу разница достигает 5 мин (контур закрытый, инета нет, нтп-сервера не сделали). Большинство кластеров весьма негативно относятся к разнице и в 10 сек, а тут минуты. С другой стороны - кластер воркает.
-
Допускаю, что могут быть проблемы с репликацией.
Или высокие absolute_delay для таблиы -
можно посмотреть в system.replicas таблице
-
absolute_delay по нулям для всех таблиц
-
Ну тогда ок, но если будут проблемы с репликацией то стоит посмотреть сразу в эту сторону
-
Да, я про пинг. У нас внешняя проверялка, может работать с хттп или тцп. Для хттп оно закрывает соединение после получения ответа, но не указывает это в хэдере. Поменять это нельзя, не в моей "собственности".
-
Идеально, КХ не должен ругаться в лог если соединение рвется, но не посередине запроса. C MySQL такой проблемы нет, там мы использует проверку по tcp.
-
Я смотрел на код и видел, что просто используется поко, который по умолчанию кидает вроде исключение.
-
ну, долбите тех кто делает кривые проверки
не вычитывая ответ до конца -
можете прислать PR в ClickHouse
-
Да, я хочу, но пока руки не доходят.
-
Т.е. опрокинулся отправитель, на простом запросе, для которого загрузка всех данных в память не требуется?
-
-
Тогда понятно. Наверное, объем данных и партиционирование настроены таким образом, что распакованный чанк не помещается в память
-
Ну то есть вот так не получилось:
clickhouse-client -h 1.2.3.4 --user=default --database=bigbrother -q "SELECT * FROM log FORMAT CSV" | clickhouse-client -d smallbrother -u vasya --password=superpassword -q "INSERT INTO log FORMAT CSV"
Пришлось делать вот так:
clickhouse-client -h 1.2.3.4 --user=default --database=bigbrother -q "SELECT * FROM log WHERE date BETWEEN '"2020-10-$from"' and '"2020-10-$to"' FORMAT CSV" | clickhouse-client -d smallbrother -u vasya --password=superpassword -q "INSERT INTO log FORMAT CSV"
Где гонять в цикле переменные $from и $to, чтобы переливать порциями по одному дню. -
Не могу полностью осознать, что такое колоночная база. Можете рассказать или дать ссылку на хорошее объяснение?
-
Данные хранятся колонками)
-
Не обращайте внимания. Это нормальное поведение. Ничего там не отменяется. Таймаут можно увеличить до 7200, чтобы было меньше дурацких сообщений.
-
https://clickhouse.com/docs/ru/engines/table-engines/
Можно вдумчиво прочитать этот раздел, с упором на организацию данных на диске и алгоритмическую сложность операций над нимиВведение | Документация ClickHouseДвижки таблиц Движок таблицы (тип таблицы) определяет: Как и где хранятся данные, куда их писать и откуда читать. Какие
-
Спасибо
-
Что нужно знать об архитектуре ClickHouse / Алексей Зателепин (Яндекс)
Приглашаем на Saint HighLoad ++ 2021 20 и 21 сентября 2021, Санкт-Петербург, DESIGN DISTRICT DAA in SPB Программа, билеты и подробности - https://clck.ru/VmKaW -------- РИТ++ 2017, Backend Conf Тезисы: http://backendconf.ru/2017/abstracts/2803.html ClickHouse - высокопроизводительная аналитическая база данных с открытыми исходниками, разработанная в Яндексе. Изначально ClickHouse создавался для задач Яндекс.Метрики, но постепенно нашёл множество применений как внутри Яндекса, так и в других компаниях. Я расскажу, как ClickHouse устроен внутри с акцентом на то, какие у выбранной архитектуры следствия с точки зрения прикладного разработчика. Будут затронуты следующие темы: - Как ClickHouse хранит данные на диске и выполняет запрос, почему такой способ хранения позволяет на несколько порядков ускорить аналитические запросы, но плохо подходит для OLTP и key-value нагрузки. - Как устроена репликация и шардирование, как добиться линейного масштабирования и что делать с eventual consistency. - Как диагностировать…
-
привет, у кого был опыт подключения кафки?
создал таблицы
CREATE TABLE tracking_log_kafka_raw
(
jsonString String
) ENGINE = Kafka
SETTINGS
kafka_broker_list = 'kafka:9092',
kafka_topic_list = 'tracking_log_new',
kafka_group_name = 'clickhouse_group_raw',
kafka_format = 'JSONAsString’
create table tracking_log_replica_new
(
timestamp DateTime,
guid String,
…..
)
engine = MergeTree()
PARTITION BY toYYYYMMDD(timestamp)
ORDER BY (…)
SETTINGS index_granularity = 8192;
и матвью поверх
CREATE MATERIALIZED VIEW default.consumer_raw TO default.tracking_log_replica_new
AS
SELECT FROM_UNIXTIME(JSONExtractInt(JSONExtractRaw(jsonString, 'timestamp'), 'seconds')) as timestamp,
JSONExtractString(jsonString, 'hwid') as guid
….
FROM default.tracking_log_kafka_raw;
Данные читаются из кафки, но не тригерят вьюху
Проверял парсинг входного json`a через insert - всё ок
Что может быть не так с матвью? -
Приветствую, почему следующий запрос не возвращает 1?
SELECT toDecimal128(1, 24) / toDecimal128(1, 24)
┌─divide(toDecimal128(1, 24), toDecimal128(1, 24))─┐
│ 0.000000000018960114910927 │
└─────────────────────────┘ -
Всем привет!
💚Вакансия: Marketing Analyst B2B
Компания: Сбермаркет
Расположение: г.Москва, м.Новокузнецкая
Формат: офис/ удаленно/ офис+удаленно
Кто мы?
💚Sbermarket.ru (ex-Instamart) – стартап по доставке продуктов из супермаркетов. Мы помогаем людям освободить время под что-то более важное, чем очереди в магазинах. За последние 2 года мы выросли в 70 раз и стали одним из крупнейших игроков на рынке e-grocery.
💚У нас сильная команда, собранная из Яндекс, Avito, Ozon, Mail.ru, SkyEng, Gett, McKinsey, GoldmanSachs и тд. Эти люди будут прокачивать тебя и, надеемся, ты нас тоже научишь многому.
💚Что нужно делать:
-Стать ключевым партнером B2B, отвечающим за эффективное привлечение и удержание клиентов
-Оценивать эффективность проектов (в том числе – при помощи А/Б тестов) и делать бизнес-выводы вместе с командой маркетинга
-Строить понятные и полезные дашборды, участвовать в настройке сквозной аналитики
💚Наш стек: Python, Clickhouse, Presto, Tableau, Metabase, Gitlab
💚Почему у нас круто?
-Быстро принимаем решения и их тестируем. Без бюрократии и мучительных согласований.
-Развиваемся сами и развиваем команду. Ходим на курсы, тренинги — их оплачивает компания. Если нужно, проводим внутренние митапы.
-Опираемся на исследования и метрики, аккуратно следим за консистентностью и пикселями.
-Делаем полезный продукт, который бережёт время для важного. Им пользуются миллионы людей (мы и сами им пользуемся).
-Уважаем время и силы других. Не проводим созвоны, если не нужны. Готовимся перед выступлением, чтобы сообщать только важное.
Где можно ознакомиться с вакансией?
💚С вакансией можно ознакомиться здесь: https://www.notion.so/Marketing-Analyst-B2B-4f2a8c7c4d6e47e0ba8730a7af8f1758
💚Что дальше?
Отклики можно оставлять на alena.krasnonosova@sbermarket.ru или мне в тг @bububup
Мы активно растем, поэтому у нас есть и другие вакансии, которые могут быть интересны;)Marketing Analyst B2BО нас
-
-
просто селект из кафки таблицы что показывает?
-
ну баг
-
Показывает строку с json'ом, как и предполагалось
-
странно, но тогда пустые строки все равно должны записываться в таблицу
-
что пошло не так?
значит MV не удалилось вообще -
По идее после вычитки строки должны удаляться, а они остаются в таблтце с кафкой
-
в логе КХ тогда будут ошибки про парсинг.
для теста сделайте MV которое просто пишет в таблицу строку, без изменений, а потом попробуйте из этой таблицы распарсить селектом -
-
WAL это для in memory партов,
(и эту фичу не оч развивают сейчас)
С бекапами не связано. -
-
Ну кх же хранит все в партах, которые иммутабельны.
Так что WAL ему для бекапов совсем не нужен, кмк.
Возможно WAL нужен будет для транзакций, но мб там вообще свой WAL будет. -
-
Сами парты не изменяются, при мерже новые создаются
-
-
-
-
-
-
-
-
-
-
-
-
Похоже, вы правы. Посмотрю внимательнее. Спасибо.
-
инкрементальные бекапы это банально забекапить новые парты, которых не было в пред. бекапе и удалить те которых уже нет
clickhouse-beckup это умеет, но он сравнивает локально
он пока не умеет сравнивать локальный бекап с remote -
WAL тут не поможет, это бессмысленно пытаться писать все данные в WAL, это убъет весь перфоманс, да и займет такой WAL кучу диска
-
-
-
они обычно гораздо меньше данных обрабатывают
-
-
OLAP ?
хотя надо в гринплам посмотреть, может действительно так -
OLTP базам wal нужен для aciD
-
не знаю
-
300 партов это ограничение на партицию
-
со словарем это хорошее решение, но только если layout не direct. Я предлагал проверить какой будет перформанс если эмулировать коррелированные подзапросы через direct словарь
-
надо искать что делал [ 16074 ] до этого
-
Смотрите, какой интересный эффект. Я сменила PARTITION BY date => PARTITION BY toYYYYMMDD(date) В результате у меня количество parts увеличилось в несколько раз, а операции merge стали очень тяжелыми - по 400-600 секунд каждая, хотя раньше было полно легких. Если я переделаю PARTITION BY date => PARTITION BY toYYYYMMDD(date) => PARTITION BY date => PARTITION BY toYYMMDD(date) то parts станет меньше или нет? И можно понять как работают мержи (не алгоритмы склейки, а как влияет размер ключа на количество parts, как часто выполняются операции merge etc) - где-либо кроме исходников и документации тут? https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/mergetree/#mergetree-data-storageMergeTree | Документация ClickHouse
MergeTree Движок MergeTree, а также другие движки этого семейства (*MergeTree) — это наиболее функциональные движки табл
-
сначала ищем проблему, потом решение
PARTITION BY date => PARTITION BY toYYYYMMDD(date) -- это одно и тоже, вы себе в ногу стреляете -
>Если я переделаю PARTITION BY date => PARTITION BY toYYYYMMDD(date) => PARTITION BY date => PARTITION BY toYYMMDD(date)
не надо ничего переделывать сломя голову -
>И можно понять как работают мержи (не алгоритмы склейки, а как влияет размер ключа на количество parts, как часто выполняются операции merge
не надо. Я например не понимаю, и мне это не мешает -
Вижу, что это была обработка входящего инсерта по http интерфейсу:
2021.10.18 20:57:11.812534 [ 3804 ] {} <Trace> HTTPHandler-factory: HTTP Request for HTTPHandler-factory. Method: POST, Address: 10.247.135.20:35226, User-Agent: AdServer, Length: 20, Content Type: text/plain; charset=UTF-8, Transfer Encoding: identity, X-Forwarded-For: (none)
2021.10.18 20:57:11.812677 [ 3804 ] {} <Trace> DynamicQueryHandler: Request URI: /?query=INSERT+INTO+Distributed.CLog+%28ts%2Curl_id%2Crequest_uri%2Credirect_url%2Cis_complete_redirect%2Ccountry%2Ccountry_region%2Cip%2Cuseragent%2Chttp_referer%29+FORMAT+TabSeparated
2021.10.18 20:57:11.813042 [ 3804 ] {b432649c-0feb-4d24-9e26-9fce7c78096b} <Debug> executeQuery: (from 10.247.135.20:35226) INSERT INTO Distributed.CLog (ts,url_id,request_uri,redirect_url,is_complete_redirect,country,country_region,ip,useragent,http_referer) FORMAT TabSeparated
2021.10.18 20:57:11.813245 [ 3804 ] {b432649c-0feb-4d24-9e26-9fce7c78096b} <Trace> ContextAccess (default): Access granted: INSERT(ts, url_id, request_uri, redirect_url, is_complete_redirect, country, country_region, ip, useragent, http_referer) ON Distributed.CLog
2021.10.18 20:57:11.814101 [ 3804 ] {b432649c-0feb-4d24-9e26-9fce7c78096b} <Trace> ParallelParsingInputFormat: Parallel parsing is used
2021.10.18 20:57:11.814825 [ 3804 ] {b432649c-0feb-4d24-9e26-9fce7c78096b} <Debug> DynamicQueryHandler: Done processing query
2021.10.18 20:57:11.814861 [ 3804 ] {b432649c-0feb-4d24-9e26-9fce7c78096b} <Debug> MemoryTracker: Peak memory usage (for query): 0.00 B.
2021.10.18 20:57:11.816040 [ 3804 ] {} <Error> ServerErrorHandler: Poco::Exception. Code: 1000, e.code() = 107, Net Exception: Socket is not connected, Stack trace (when copying this message, always include the lines below): -
насколько я понял читая все ваши сообщения, а толком вы вообще ничего не сказали, у вас проблема в том что у вас мириады мелких инсертов и очень медленный диск.
1 Сколько инсертов вы делаете в секунду?
2 Сколько в среднем грубо округлив вставляет один инсерт?
3 Что такое медленный диск ?
4 Сколько полей в таблице примерно в десятках, сотнях? -
я думаю инсерт просто отвалился, потому что клиент упал или сеть
-
доброго вечера!
Спасибо вам за фикс с ТЗ, но у нас что-то после обновления все вообще стало не так работать с таймзонами =)
будем очень признательны если сможете посмотреть:
https://github.com/DarkWanderer/ClickHouse.Client/pull/92
Спасибо! -
У нас 2 таблицы: 1) 32 записи в минуту. Используем буфер. Размер и таймаут буфера подобраны таким образом чтобы собирать записи за 10-15 минут и только потом сбрасывать их на диск, памяти достаточно 2) запись. 32 пишущих источника, раз в минуту каждый из них передают CSV файл - не мелкие единичные инсерты, а вставки по 1k-5k записей за каждую операцию. Каждая запись в пределах 6k 4) в таблице 25-27 полей, размер каждой записи по всем полям в сумме не больше 6Kb 5) дисковая полка - raid10, на HGST HUS726040AL. Все работало, но захотели улучшить. Вроде бы не меняли ничего кроме ORDER BY. В один момент получили iowait 30-40% вместо 3-4% и кучу файлов в parts. Варианта таблиц до переделки у меня не сохранилось (nginx mirror + еще один CH для тестов появился слишком поздно). Вот я уже 2 недели пытаюсь вернуть все в состояние как было до переделок (максимум 7-8 файлов в день для таблицы за вчера/ позавчера, и не больше 20 за сегодня в которые пишется, небольшой iowait), и не получается
-
единственное странное, что я нашел - memory used - 0
-
partition by точно не меняли? колонка date - тип Date или DateTime?
скорее всего вы увеличили или уменьшили гранулярность партиций...
был случай когда неудачный order by все портил в плане компрессии и ничего не сжималось, но это надо "постараться" -
│ CREATE TABLE default.test_table
(
`date` Date,
`datetime` DateTime, -
PARTITION BY Date
-
пробовали 8192 и 16384 - не помогло
-
Я не это имел ввиду под гранулярностью (имел ввиду месяц, лень, час). Эта вообще не влияет...
-
ORDER BY (date, текстовое_поле со значениями '1' ... '20000'),. унаследованная часть системы )
-
Сбор метрик включен в прометеус? Там можно было бы проще поискать
-
нет. Какие метрики стоит глянуть? Сделаю через заббикс
-
Добрый вечер. Может кто-нибудь просветить меня в таком вопросе. Как обстоят дела в clickhouse с запросами для поиска последней записи или последних 5 записей. Прочел статью (https://altinity.com/blog/clickhouse-for-time-series). Она старая, может в clickhouse за это время что-то поменялось? Можно подкинуть статью, где почитать, заранее спасибо.ClickHouse Crushing Time Series
Nov 15, 2018Once upon a time we spotted TSBS (https://github.com/timescale/tsbs) -- Time Series Benchmark Suite, started by InfluxDB engineers and polished to perfection by TimescaleDB team. The suite allows to compare apples-to-apples when testing different databases: it is a framework to generate test data, load it to different databases, run test queries, and collect statistics to analyse. We could not resist adding ClickHouse to the list of supported databases. It turned out that ClickHouse --- being a general purpose analytical DBMS -- stands very well against proven time series databases. Those benchmarks highlighted strengths and weaknesses of different technologies. Interested? Let’s dig into details.
-
проверьте raid
покажите sad -d 1 100 -
>дисковая полка - raid10, на HGST HUS726040AL
сколько дисков ? -
о боже, не надо это трогать. Это вообще из другой сказки.
-
пока очень похоже на деградацию рейда
-
BackgroundPoolTask
Merge
DiskSpaceReservedForMerge
PartsPreCommitted
PartsCommitted
PartsOutdated
PartsDeleting
ну и сеттинги посмотрить.
select * from system.metrics where metric like '%Back%';
вообще да, раз почти ничего не меняли - проблема в железе/ОС/ещё где -
Подскажите плз, сильно ли дороже жить на облаках, какие бы порекомендовали рассмотреть? Сейчас 10 железных серверов с отличными нвме и 32 ядрами, утилизация высокая
-
любое облако (именно облако) к цене чистого железа в среднем 9 месяцев на break-even.
Другое дело что другие расходы на персонал у всех могут быть разные. Если держать людей только ради этих 10 серверов -облако выгоднее. Если 10 это 10 из *** тогда дороже.
Ну и плюс облако "резиновое". -
в 10 раз дороже чем аренда такого сервера в хецнере.
-
Всем привет!
Столкнулся с такой ошибкой:
При попытке выполнить простой запрос
'''select *
from system.mutations
where is_done = 0'''
Этот запрос откушивает гору памяти и вешается навечно. Не сталкивались с таким поведением? -
Блин, я отказывался в это верить, казалось, что не учитываю что то важное и там какие то особенные vcpu и особенные гигабайты... Суровая разница в цене конечно
-
спс - буду пробовать
-
DJ, Denny, спасибо
-
сталкивались. Перезагрузка КХ, ручное удаление мутаций. Таблицы replicated?
-
Да, таблицы replicated, перезагрузка помогает. В чём кроется секрет такого поведения?
-
что показывает select count() from system.replication_queue ?
-
0,
-
а какая версия КХ ?
-
Тупанул, ночь....replacingMergeTree, таблицы не replicated
-
21.5.9.4
-
поставьте 21.8.8.29 (но тестировать надо на стейдже)
-
Был bugfix по этому поводу?
-
да много всего было.
вы сколько мутаций в день запускаете? -
судя по query_log от 200 до 400 запросов, попадающих под мутации,навскидку
-
Добрый вечер!
Создаю две таблички ReplicatedReplacingMergeTree с одинаковой структурой, но одну из них с опцией index_granularity=512
Делаю одинаковые запросы с группировкой по полям из ключа сортировки.
В результате имею следующую производительность.
1. Табличка с index_granularity по умолчанию
Elapsed: 0.303 sec. Processed 33.22 million rows, 1.56 GB (109.68 million rows/s., 5.16 GB/s.)
2. Табличка с index_granularity=512
Elapsed: 0.449 sec. Processed 15.93 million rows, 674.70 MB (35.50 million rows/s., 1.50 GB/s.)
Как можно заметить, в первом случае с диска прочитано почти в 2 раза больше строк данных, но запрос отработал быстрее чем во втором случае.
Соответсвенно вопрос.
Почему так? Ведь по логике, при уменьшении гранулярности увеличивается размер индекса в памяти и клику нужно меньше данных считывать с диска для обработки запроса. По факту, хоть и меньше данных считали, но сам запрос работает дольше. -
например надо больше раз читать, вы читаете в ~2 раза меньше строк, но делаете это в 8192 / 512 = 16 раз менее эффективно. Имеет смысл ставить маленькую гранулярность только если вам надо вычитавыть единичные строки.
-
Спасибо! Какие опции клика можно еще глянуть, для ускорения выборки? Сейчас в обоих вариантах пиковый расход памяти около 1GB, можно ли выделить больше памяти для ускорения запроса?
-
неплохо было бы показать как создана таблица и что за запрос, возможно вам поможет optimize_aggregation_in_order = 1 если ещё не включен
-
Спасибо! optimize_aggregation_in_order = 1 не дает эффекта (
-
-
в слепую (ни запроса, ни трейсов) очень сложно...
max_bytes_before_external_group_by=0,group_by_two_level_threshold=0,group_by_two_level_threshold_bytes=0,optimize_move_to_prewhere=0 -
Спасибо! Пойду изучать!
-
optimize final делался? возможно тупо партов было больше случайно.
возможно меньше было потоков, хотя на миллионах строк гранул бы должно хватить.
потоки делят работу с помощью гранул
SET send_logs_level = 'trace';
дальше запрос и получаете трассу -
с простой mat.view без jsonextract тоже так?
-
optimize final делался. Спасибо, буду трейс изучать
-
-
tostartofinterval
-
Оно, благодарю.
-
Но я бы дважды подумал, надо ли вам оно
-
ClickHouse/ClickHouse tagged: v21.8.9.13-lts
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.8.9.13-lts
Release notes:
v21.8.9.13-lts - 19 October 2021 (244 messages)
-
Всем здравствуйте, у меня база заполнена на 100% (3ТB). Таблица партиционируется по YYYYMMDD. И мы решили поставить TTL на год, чтобы избавится от устаревших данных. Но база совсем не реагирует. Уже день как прошел. В чем может быть проблема? Спасибо
-
Доброе утро! Ссылка на митап не пришла, это у всех так ?
-
Доброе утро, мне тоже не пришла до сих пор.
-
С JSONEachRow адекватно работает
-
Насколько я помню там места нужно x2 от большого парта.
-
Всем привет!
Простите за глупый вопрос: как проверить наличие значения в списке (List) в clickhouse?
Пробовал ListHasItems(ListFilter(kv_values, '%1634576689094/d7f5b3d2bbd68df49060e98aa3ce0500/10/9/3/1%'))
получаю ругань -
Привет. Пробую вызвать пример со страницы https://clickhouse.com/docs/en/sql-reference/table-functions/s3/
INSERT INTO TABLE FUNCTION s3('http://bucket.amazonaws.com/my_bucket/file_{_partition_id}.csv', 'CSV', 'a String, b UInt32, c UInt32')
PARTITION BY a VALUES ('x', 2, 3), ('x', 4, 5), ('y', 11, 12), ('y', 13, 14), ('z', 21, 22), ('z', 23, 24);
Заменил только path и добавил access_key, secret_key. Получаю
Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 260 ('PARTITION') (line 6, col 5): PARTITION BY a VALUES ('x', 2, 3), ('x', 4, 5), ('y', 11, 12), ('y', 13, 14), ('z', 21, 22), ('z', 23, 24). Expected one of: WATCH, OpeningRoundBracket, SELECT, VALUES, FORMAT, WITH, token (version 20.12.7.3)
Значит ли это, что на этой версии partitioned write не поддерживается? Обычные записи в s3 из select проходят нормально.s3 | ClickHouse Documentations3 Table Function Provides table-like interface to select/insert files in Amazon S3. This table function is similar to h
-
Добрый день. Сервер КХ "жестко" выключился из-за электропитания. После включения сервис clickhouse-server запускается, но клиентским соединениям отказывает. Как можно решить проблему ?
-
Что такое List? В КХ не такого понятия. Есть Array, есть Map. Если вам нужен поиск подстрок в массивах, то можно пробежаться по массиву функцией arayFilter или же развернуть массив в колонку через arrayJoin .
-
Arrays | ClickHouse Documentation
Array Functions empty Checks whether the input array is empty. Syntax empty([x]) An array is considered empty if it does
-
has/hasAll/hasAny - хорошие функции, но к сожалению проверяют целиком, без поиска подстрок, чего явно хочет топик стартер
-
Значит Array
-
спасибо
-
А порт 9000 слушается? netstat -tnlp | grep 9000
-
Как вы выяснили что он у вас запускается? В логах тихо?
-
/etc/clickhouse-server# netstat -tnlp | grep 9000
пустая строка в ответе -
Тогда сервер не стартовал
-
В каком каталоге логи ?
-
нашел логи
-
-
похоже, что диск ssd1 "отвалился" от КХ. Хотя в Ubuntu он виден
-
Скрины - это ужасно, есть же pastebin.com
-
pastebin - это ужасно, есть же форматирование телеги
-
)
-
до 10 строк согласен, но портянки логов кидать в чат ты, наверное, пошутил
-
портянки куда угодно кидать моветон)
-
Разобрался, одна таблица слетела, в которую была активная запись. Сервер работает
-
Хорошо
-
У вас старая версия КХ, partition by добавили недавно, 21.10 вроде. Просто без partition вызывайте
-
всем
-
ClickHouse Meetup уже сегодня!
19 октября в 19:00 пройдёт онлайн-встреча с сообществом ClickHouse.
Мы расскажем о больших организационных изменениях в ClickHouse, об UDF in ClickHouse и о шифровании хранимых данных в ClickHouse.
Ссылку на прямой эфир мы отправим вам на почту в день встречи.
Встреча записывается. Ссылка на запись так же будет отправлена всем зарегистрировавшимся.
Присоединяйтесь! 🙂Link19 октября команда разработки аналитической СУБД ClickHouse вновь проведёт онлайн-встречу с сообществом. У нас много новостей) Расскажем о больших организационных изменениях в ClickHouse, об UDF in ClickHouse о шифровании хранимых данных в ClickHouse. Вы можете заранее прислать вопросы через форму регистрации или задать их в чате во время трансляции. Ссылку на прямой эфир мы отправим вам на почту в день встречи.
-
None
-
-
Добрый день. Очень часто стали выпадать ошибки чтения из битых секций. Где можно оперативно получить информации о них, а не только из текстовых логов в файлах. Для этого лучше следить за query_log?
-
Активируйте part log
-
он активирован, спасибо буду смотреть там.
-
но, я как понимаю, там не будет информации о битых данных, которые были обнаружены в процессе селекта, а только о фоновых операциях мерджа/ инсерта данных.
-
Там все операции над партами
-
ClickHouse uses the sorting key as a primary key if the primary key is not defined obviously by the PRIMARY KEY clause. https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/#mergetreeMergeTree | ClickHouse Documentation
MergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
Вроде была команда для проверки партов всех
-
CHECK | ClickHouse Documentation
CHECK TABLE Statement Checks if the data in the table is corrupted. CHECK TABLE [db.]name The CHECK TABLE query compares
-
благодарю. а насколько тяжелая эта операция? можно в крон повесить и забыть ?)
-
Лучше найти закономерность как портиться. Т.е. проверить и смотреть в партлог
-
Простите за глупый вопрос, возможно ли в CH реализовать авторизацию пользователя по ключу? На подобии ssh ключа. В идеале авторизацию по устройству хранящему такой ключ? Или только доступен пароль?
Вот тут что то не нашел такого варианта:
https://clickhouse.com/docs/ru/sql-reference/statements/create/user/#identifikatsiiaПользователь | Документация ClickHouseCREATE USER Создает аккаунты пользователей. Синтаксис: CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [ON CLUSTER cluste
-
Здраствуйте, такая вот задача, пока не могу понять как ее решить.
Есть таблица {Datetime, userid, eventid }. количество разных событий eventid порядка 1000,
надо найти самые популярные цепочки событий заданой длинны в каком то временном окне.
кроме тупого перебора всех вариантов цепочек событий в windowFunnel пока ничего не придумал. -
-
-
ошибка Code: 210. [SSL: CERTIFICATE_VERIFY_FAILED] на процессоре М1, где стоит mini-forge(другие процессором не поддерживаются). clickhouse-driver скачан, загуглила ошибку, просит clickhouse-server, но его на mini-forge нет, что делать?
-
select count() c, events from (select groupArray(event) events from (select * from table order by ts) group by user having length(events) = 10) group by events order by c desc
-
да, есть пинг в клиенте,
пинговать каждые 30 мин?
Была такая мысль -
-
Да, без partition работает. Спасибо.
-
попробую, спасибо
-
Добрый день. Не придумал красивое решение для такой задачи: Посчитать количество по ключам.
CREATE TABLE default.test_tab11
( id_se UInt64,
id_s UInt64,
lang UInt8,
vid UInt8,
dt DateTime
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(dt)
ORDER BY id_se
SETTINGS index_granularity = 8192;
insert into default.test_tab11
values(1,1,1,1, now());
insert into default.test_tab11
values(2,1,1,2, now());
insert into default.test_tab11
values(3,1,1,2, now());
insert into default.test_tab11
values(1,2,1,1, now());
--результат который я хочу получить
--но в таблице default.test_tab11 будет 1млрд строк и 25 столбцов
select uniq(t1.id_se), t.id_s from (select id_s from default.test_tab11
where vid=2) as t
join default.test_tab11 as t1
on t.id_s=t1.id_s
group by t.id_s;
Хотелось бы увидеть примеры решения моей задачи.
То есть у меня есть уникальный ключ id_se, и есть неуникальный id_s
Хочу получить количество уникальных id_se для каждого id_s после фильтров на остальные поля.