- 23 March 2021 (171 messages)
-
Речь идет про выборку, а не про оптимизацию таблицы. Как я себе это представляю: это нужно сделать в виде матвью, и разгребать "на лету". Потому что данных — миллиарды строк (рыночные данные), а после такой обработки должны остаться десятки-сотни тысяч.
Пример (для простоты время тут в виде целых чисел):
t v
1 1
2 1
3 1
4 2
5 2
6 3
7 1
8 1
9 5
В выборке хочу получить
t v
1 1
4 2
6 3
7 1
9 5
Лежат изначальные данные в MergeTree-таблице. Версия 21.3 в облаке Яндекса. -
Joined.
-
так просто replacingMT order by (t,v)
-
Так задача состоит в том, что бы писать в таблицу только когда произошло изменение, а эта задача красивым образом в кх уже не решает.
Как я понял вопрос -
-
А некрасивым? Потому как, если использовать "сырые" данные на стороне клиента (ну т.е. просто SELECT по исходной таблице), то происходит пересылка огромного количества данных и, кажется, тут уже не до красоты :)
-
Как и как часто вы вставляете в таблицу?
-
ясно, я ничего вообще не понял. Перечитал еще раз и понял еще меньше.
-
Ну и да,
Это разные задачи:
1) уменьшить основную таблицу в размерах
2) не пересылать все подряд клиенту -
Это рыночные биржевые данные — тысячи / десятки тысяч записей в секунду. Как — не понял вопроса. INSERT-ом :) Использую clickhouse_driver в питоне.
-
Размер батча частота вставок в эту таблицу
-
Я не хотел оптимизировать таблицу. Извиняюсь, если невнятно описал проблему изначально. Мне нужно оптимизировать именно выдачу клиенту(ам).
-
Окей, тогда MV тут не причем.
А покажите ваш обычный запрос сейчас? -
-
Выборку
-
-
-
И это одна timeseries серия?
Можно посмотреть на вариант через neighbor
SELECT t, v FROM (SELECT t, 0.5 * (b[1] + a[1]) AS \"v\" FROM ob WHERE t BETWEEN '2021-03-23' AND '2021-03-24' ORDER BY t) WHERE neighbor(v,-1) !=v -
Он сбрасывает состояние каждый блок, но в вашем случае это не важно
-
Вопроса не понял. Сейчас попробую, спасибо!
-
Joined.
-
Работает) Только значение в последней строке дублируется
- 24 March 2021 (187 messages)
-
-
доброе утро!
Как добавить такой progress bar в jupyter-notebook? -
блин, ссылка утекла что ли )
-
Прогресс выполнения запроса можно отслеживать с помощью заголовков ответа X-ClickHouse-Progress. Для этого включите send_progress_in_http_headers. Пример последовательности заголовков:
X-ClickHouse-Progress: {"read_rows":"2752512","read_bytes":"240570816","total_rows_to_read":"8880128"} X-ClickHouse-Progress: {"read_rows":"5439488","read_bytes":"482285394","total_rows_to_read":"8880128"} X-ClickHouse-Progress: {"read_rows":"8783786","read_bytes":"819092887","total_rows_to_read":"8880128"}
Возможные поля заголовка:
read_rows — количество прочитанных строк.
read_bytes — объём прочитанных данных в байтах.
total_rows_to_read — общее количество строк для чтения.
written_rows — количество записанных строк.
written_bytes — объём записанных данных в байтах.
А дальше tqdm или свою принтер делайте. -
Скажите, пожалуйста, а есть ли какие-нибудь ограничения на максимальное количество кафка-консьюмеров к разным топикам кафки для одного сервера КХ?
У меня есть около 100 топиков кафки (суммарно под 100.000 rps), которые нужно затягивать в КХ. Попробовал и на жирных (4 консьюмера на один топик) и на нескольких сразу (4 параллельных топика по 1 консьюмеру) - проблем нет. Но будет ли всё так же гладко, если включить сразу 100? Какие есть подводные камни?
Думаю настроить реплики и тянуть данные с двух серверов параллельно. -
-
-
-
Навскидку несколько особенностей, которые приходят в голову.
* Частота вставок.
Если отдельный консюмер 10 раз в секунду что-то отправляет в кликхаус, то 100 консюмеров будут 1000 раз в секунду отправлять.
Соответственно может вырасти потребность в уменьшении частоты инсертов. Либо средствами стороннего буфера, если вы его используете, либо что-то типа Buffer в самом кликхаусе, либо в кафко-параметрах консюмера увеличивать размер забираемых пачек данных ( fetch.min.bytes , fetch.max.bytes, max.partition.fetch.bytes, fetch.max.wait.ms и т.п.)
* Для высоконагруженных топиков количество кафковских partitions на которые разбит топик может стать узким местом, ограничивающим масштабирование числа консюмеров. Поскольку из каждого partition кафкатопика не более чем один consumer из consumer group может читать, то число эффективно работающих консюмеров ограничено числом партишнов, все следующие консюмеры будут сидеть в засаде, ожидая что после перебалансировки им тоже что-нибудь перепадёт. -
Ещё:
* (Вроде бы).
Если консюмеры не приложения, которые ETL проделывают вне ClickHouse, а ENGINE = KAFKA, то вроде бы количество таких консюмеров надо учитывать и корректировать количество threads в параметрах ClickHouse: SELECT * FROM system.settings WHERE name LIKE '%pool%';
Тут я не разбираюсь. Можно в поиске группы по словам
типа background_pool_size kafka
или background_schedule_pool_size кафка
посмотреть.
Там были аналогичные вопросы:
https://t.me/clickhouse_ru/190460Denny Crane [Junior support specialist at Altinity (NB,Canada)] in ClickHouse не тормозитдля kafka_num_consumers = 16, надо еще увеличивать background_schedule_pool_size, иначе будет не хватать background_ тредов чтобы все консумеры работали одновременно
-
На большом массиве данных считал хэш-суммы и обнаружил,
что порядок данных во внешнем запросе КХ полностью определяется
порядком вложенного в запросе типа:
SELECT
x
FROM
(
SELECT
x
FROM
y
ORDER BY x
)
Это текущее поведение. Может ли оно измениться в дальнейшем ? -
(вопрос связан с оптимизацией, дополнительное упорядочивание во внешнем запросе занимает существенное время)
-
Да, я именно про engine=kafka. Спасибо за комментарии и наводку.
-
так работает скл. Сначала что бы отдать выборку наверх, нужно сначала отсортировать субквери.
-
> Это текущее поведение. Может ли оно измениться в дальнейшем ?
На него достаточно надежно завязыватся, оно используется в том числе для собирания отсортированных значений в массив. -
Ну да, так и отсортировал.
-
Спасибо Дмитрий, именно это и хотел выяснить
-
потому что если не указывать сортировку, то в верхнюю выборку можно отдавать данные по мере их вычисления(типа стрима)
-
Значит можно во внешнем не сортировать, буду использовать
-
-
WITH (number, number + 10) AS t
SELECT t
FROM system.numbers
WHERE t IN (1, 11)
LIMIT 1
Query id: 99b01085-ea2b-4b26-b605-ebd415f54694
┌─t──────┐
│ (1,11) │
└────────┘ -
не понял описанной идеи
-
я написал запрос, который работает :)
-
свои колонки подставляешь - всё работает
-
твой исходный запрос тоже должен работать
-
select * from system.numbers WHERE tuple(number, number + 10) IN (1, 11) limit 1
SELECT *
FROM system.numbers
WHERE (number, number + 10) IN (1, 11)
LIMIT 1
┌─number─┐
│ 1 │
└────────┘ -
либо через select tuple(col1, col2) as my_col from table where my_col in ((v1, v2), (v3, v4))
-
-
Search · remote_url_allow_hosts · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Спасибо :)
-
-
отказоустойчивость не требуется?
уберите из конфига клихкауса лишние зукиперы, дайте рестарт
уберите из конфига зукипера список серверов и дайте рестарт, он запустится как standalone (https://zookeeper.apache.org/doc/r3.3.3/zookeeperStarted.html, см. "Standalone Operation") -
-
меняем на новые машины КХ, поэтому пока не нужны.
данные и очереди на репликацию при этом не потеряются? -
-
-
ок, понял, сначала кх меняю+рестарт кх, затем удаляю в зк+рестарт зк
-
-
-
-
всё так
-
благодарю
а чтобы почистить за собой зк, просто удалить путь /clickhouse в зк? -
в моей еще нужен рестарт
-
на тачках которые останавливаете?
можно просто rm -rf /var/lib/zookeeper, после удаления пакета ну или где там у вас датадира
ну или да, можно просто удалить путь /clickhouse если вы хотите запустить потом назад и у вас что то есть кроме кх в том зукипере -
сам зк надо оставить, он пойдет на другую железку для репликации, просто пути почищу тогда в зк
Благодарю Вас -
коллеги, очень прощу помощи.
линукс, 8 ядер, 16 оперативы, +- свежая версия кх.
начал расти LA, нагрузка только инсерт, селектов нет.
кол-во инсертов за последние 3-5 дней не менялось. LA начал расти последние два часа.
первая табоица
engine = MergeTree() PARTITION BY toYYYYMM(created_at) ORDER BY tuple() SETTINGS storage_policy = 'single', index_granularity = 8192;
вторая таблица такая же
третья таблица
engine = ReplacingMergeTree() PARTITION BY toYYYYMM(event_dt) ORDER BY (event_dt) SETTINGS storage_policy = 'single', index_granularity = 8192;
подскажите куда смотреть что читать? -
select * from system.merges
-
добрый
а подскажите
появилась ошибка rate limit for user “user” is exceeded request_per_minute limit 100
какой секцией в users.xml этот лимит регулируется или какой настройкой ?
сейчас в users.xml quotas - queires - 0 (unlim)
statbox не заполнял -
у меня там одна таблица. кратко прочитал мануал по system.merges, обратил внимание на elapsed
спасибо, она работаем медленнее желаемого -
так а что там у вас? Я желаю чтобы оно всегда работало за 0 микросекунд?
в принципе все можно настроить, но надо знать зачем, куда стреляем? -
до 5 секунд иногда доходит третья, две первые в одну десятую укладываются точно
-
эм что? мержи у меня по 4 часа например бывают и по 12. Тут как бы ничего удивительного нет.
-
5 секунд на 2к записей? я конечно совсем новичок в кх, но это немного странно
-
а юзер создан через xml или sql?
-
xml
-
зависит от ширины записей и того какой диск, покажите select * from system.merges, там видно сколько байт
-
sql
-
ну так причем тут users.xml ?
show quota ... -
-
interval=[2021-03-24 13:00:00 .. 2021-03-24 14:00:00] queries=0 errors=0 result_rows=0 result_bytes=0 read_rows=0 read_bytes=0 execution_time=0
-
у меня только 1 юзер )
-
диск ssd в digitalocean
-
согласен, так не должно быть. Что-то неправильно.
-
но я теперь знаю где, а значит примерно понятно что надо лечить
-
а сколько полей в locations ? '
это она ORDER BY tuple() ? -
8 полей, 7 из них это float, еще одно datetime
-
она ORDER BY (event_dt)
-
кстати
ReplacingMergeTree() PARTITION BY toYYYYMM(event_dt) ORDER BY (event_dt)
выглядит подозрительно, ORDER BY (event_dt) -- схлопнет по ключу event_dt, т.е. останется только одна запись для каждой event_dt -
опечатка, ORDER BY (account_id, event_dt)
-
я бы смотрел в sar -d 1 100 в колонки await и svctm
-
спасибо, сейчас попробую
-
Не подскажете, как побороть ошибку ? Из интерфейса КХ создал таблицы, удалить не могу. Возникает время-от времени на одном из серверов. TRUNCATE таблиц выполняется успешно. Если вручную удалить файлы /.store/...sql, исчезает из базы. Но в чем причина "Invalid cross-device link" ?
-
-
-
system stop merges table
-
docker ?
-
хотел сделать оптимайз 1 партиции - запустил на всю таблицу, ничего криминального не будет?
-
таблица replicated ? инсерты идут?
-
да репликейтед, идут
-
Нет, не docker. Ubuntu Server 20.04 на десктопе i9-10900 система на SSD, база на HDD
-
тогда ждите теперь когда закончится optimize
-
system stop merges table -- остановит мержи, и инсерты сломаются с too many parts
-
понял, спасибо
-
в любом случае после system stop merges table надо вручную удалить задание из зк (для replicated таблицы)
-
покажите вывод mount
-
а не подскажите как могло бы такое произойти:
удалили данные за два дня из КХ, далее залили новые на эти дни. Делаем выборку с учетом этих дней ограничение по датам - данные получаем все, делаем выборку на день больше, выборка пустая.
То есть нет в выборке данных старше этого дня, хотя по факту они там есть. -
мерж нельзя убить, он не связан с сессией и запросом optimize. Optimize лишь инициирует мерж.
-
что значит удалили?
версия кх ? -
alter table delete
20.1.3.7 -
Может быть ошибка "Invalid cross-device link" из-за того, что после установки КХ
остановил сервер, перенес папки /data /store /user_files на HDD, создал для них
Symlink-и на прежних местах в папке КХ и запустил сервер. Сервер работает,
но такие вот непонятные вещи... -
20.1.3.7 + delete скораптил первичный ключ
обновлятся надо было год назад, когда это исправили -
конечно это из-за переноса.
ch не может хардлинки теперь создавать
надо было делать все не так -
-
обновляться и переливать insert select в новую таблицу
-
А как правильно перенести КХ на HDD ?
-
вариантов куча
* замаунтить hdd в /var/lib/clickhouse
* использовать data_path ( поправить все сетинги с /var/lib в config.xml на каталог hdd )
* использовать volums policy. -
Спасибо за список правильных вариантов переноса. Свой теперь исключу из практики )
-
Broken indicies and inconsistent queries results · Issue #9019 · ClickHouse/ClickHouse
Hi! After updating Clickhouse from 19.13.1.11 version to 20.1.3.7 and when we run queries like this: select courseId, uniqExact(learnerId) from entities_attempts_distributed group by courseId order...
-
Fix primary.idx corruption after delete mutation by alesapin · Pull Request #9048 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Bug Fix Changelog entry (a user-readable short description of the changes...
-
20.1.16.120 обновляться сюда с 20.1.3.7
-
спасибо
-
да мы скоро переедем на v21.2.6.1-stable
-
100% попадание!!
Большое спасибо, именно в этом и было дело!
Вчера я на стенде в схеме поле ReplicatedMergeTree таблицы, в которой при слияниях партов время от времени происходили ошибки "Checksums of parts", изменил выражение для DEFAULT.
Вместо
DateTime DEFAULT now() TTL toDate(end_datetime) + toIntervalDay(1)
на
DateTime DEFAULT 0 TTL toDate(end_datetime) + toIntervalDay(1)
(наличие TTL на столбце было у меня было необходимым условием появления ошибки Checksums).
Всё остальное то же самое.
Результат: 35B+ записей перемололо, но ни на одной из нод с момента коррекции DEFAULT выражения ошибка "Code 40: Checksum of parts doesn't match" больше не произошла.
Issue я обновлю. -
Joined.
-
ч
-
всем привет.
а кто-нибудь укладывал в клик данные из кафка+авро, где одно из полей было бы массивом записей? что имею в виду:
есть схема авро, в которой одно из полей выглядит так
{
"name": "some_objects",
"type": {
"type": "array",
"items": {
"type": "record",
"name": "SomeRecord",
"fields": [
{
"name": "field1",
"type": "long",
"default": 0
},
{
"name": "field2",
"type": "boolean",
"default": false
}
]
}
},
"default": []
},
и есть запрос для создания таблицы, где поле описано как
some_objects Nested
(field1 Int64,
field2 String),
таблица успешно создается, но при чтении вылетает Field some_objects.field1 not found in Avro schema.
с одной стороны это логично, потому что там лежит внутри не record, а массив record. но с другой стороны - я не могу в клике создать Array(Nested). какой тогда должен быть тип?
(нашел похожий кейс - https://github.com/ClickHouse/ClickHouse/issues/9707, но тут нет массива, просто вложенная запись)Avro nested · Issue #9707 · ClickHouse/ClickHouseAvro and AvroConfluent formats (20.3.2.1) are a really nice feature (thanks!!). Current implementation (AFAIK) doesn't allow reading nested structures. Most Avro messages in real use-cases ...
-
Array(Tuple(Int64, String))
но все это херня и работать не будет, и авро сделан на отвали и все равно все сломается, если не сегодня, то через неделю
знаю что для того чтобы массивы более менее работали, люди пишут в avro массивы как строки, с числами через запятую, потом парсят, непонятно правда зачем им авро и нафига такие мучения -
Привет
Подскажите, пожалуйста, как пользоваться внешними словарями подгруженными из xml.
Могу сделать
SELECT dictGet('dict1', 'user_id', toUInt64(1));
Но применение той же функции внутри сложного селекта из таблицы дает ошибку
DB::Exception: external dictionary 'dict1' not found
Натыкался, что нужно указывать базу, типа default.dict1, но перепробовав все варианты успеха не достигнул.
Вот информация из system.dictionaries, база там пустая:
Row 1:
──────
database:
name: dict1
uuid: 00000000-0000-0000-0000-000000000000
status: LOADED
origin: /etc/clickhouse-server/external_mysql_dictionary.xml
type: Flat
key: UInt64
attribute.names: ['id','user_id']
attribute.types: ['UInt64','UInt64']
bytes_allocated: 37360
query_count: 1
hit_rate: 1
element_count: 106
load_factor: 0.103515625
source: MySQL: xxx.xxx
lifetime_min: 540
lifetime_max: 600
loading_start_time: 2021-03-24 18:03:00
last_successful_update_time: 2021-03-24 18:03:00
loading_duration: 0.016
last_exception: -
нет, про базу это для НЕ-xml словарей.
а у вас Distributed запрос, и на шарде куда прилетает запрос нету словаря. Это можно решить 2 спрособами, создать словари на всех нодах, или обернуть () и делать обращение к словарю на инициаторе -
Преклоняюсь перед вашими экстрасенсорными навыками. Да, действительно, запрос - Distributed и да, на каких-то шардах словаря не было
Огромное спасибо. -
В Альтинити только членов Psi Corps берут
-
-
Спасибо большое)
-
-
-
-
-
-
в логе КХ надо смотреть трассу инсерта
-
у меня безопасная безопасность
-
в общем-то без разницы. ORC пользоваться невозможно для заливки, там все недоделано.
-
а чем лучше всего пользоваться?
-
TSV
-
parquet если готовите данные (в большом объеме) из приложения
-
а с паркетам работа лучше чем с орками?
-
просто у нас из паркета вроде как есть проблемы с эрреями
-
ОРКи не пробовали, в паркете были проблемы с некоторыми типами, тикеты на гитхабе есть
-
если есть массивы - то ТСВ
-
-
Да вроде фиксили, мб даже в протобафе?
-
окей, есть еще небольшой вопрос, если я использую движок с3/хдфс, там тоже нужно все к тсв гонять, или уже можно будет использовать орки/паркеты ?
-
массивы в orc / паркет в доработке сейчас
-
Parquet support List datatype · Issue #21080 · ClickHouse/ClickHouse
Use case Support reading from parquet list datatype to ClickHouse Array and vice versa. Describe the solution you'd like since ClickHouse use arrow to transfer data between ClickHouse and P...
-
без разницы, КХ просто читает поток байт с ORC, откуда он читает не имеет значения, везде все кривое, жрет память и не поддерживает половину типов данных
-
-
-
pipe it
-
как можно сделать чтобы при вставке в таблицу все данные с нее стирались? мб движок какой?
-
https://t.me/clickhouse_ru/191672
замените первую часть на bzcatRoman 👀xam👀 Che in ClickHouse не тормозитcat file.csv | clickhouse-client --database={$database} --file=- --query="INSERT INTO products SELECT FROM _data FORMAT CSVWithNames""
-
готового нет. надо именно транкейт на вставке? лучше на приложении, либо использовать рандомизированные названия таблиц...
-
-
-
Зачем?
-
Это таблица с движком кафка энджин читает из кафки, а не на оборот
-
Привет!
Подскажите, пожалуйста, как можно прочитать данные из Join-engine таблицы с композитным ключом? Сам джойн выдает гордую пустоту, пытаюсь поисследовать, но прямые селекты в такую таблицу КХ делать не дает, а как в joinGet передать композитный ключ - не могу найти, в доке ровно один пример и он с простым ключом. Мои попытки делать наощупь только разные ругательства от КХ генерят. -
В эту таблицу можно писать самому и Кафка вычитает эти сообщения
-
joinGet(join_storage_table_name, value_column, (key_1,key_2))
-
Попробуйте tuple()
-
Добрый вечер. Подскажите, как-то можно джойнить регистронезависимо?
-
Спасибо!
Результат, правда, неутешительный, зато однозначный
DB::Exception: joinGet only supports StorageJoin containing exactly one key
Никаких обходных путей, случаем, нет?) -
lower(key_a) = lower(key_b)
-
Спасибо
-
Всем привет. Хотел бы задать такой вопрос: кто-нибудь использовал ClickHouse в финансовой сфере, а именно для хранения транзакций? Не нужно, писать, что есть другие БД для этого, я в курсе :) Ну тут, необычно немного, так как кол-во транзакций и чтение этих транзакций много. Тут хотелось бы получить выгоду по хранению, а именно что бы меньше место занимало, ну и скорость чтения. Данные вообще не меняются, только накапливаются.
-
Грубо говоря, только для хранение и чтении истории транзакций.
-
вполне обычная задача для КХ, но хотите ли вы часто обновлять/удалять данные
-
нет) удалять точно, а обновлять, практический нет!
-
скорее всего вообще нет
-
храните и выбирайте данные, сколько вам нужно
-
спасибо)
-
там композитный ключ задается через то место
create table jtest(
key Tuple(String, String),
value Float64
) engine=Join(any, left, key);
insert into jtest values(('a', 'b'), 15)
select joinGet(jtest, 'value', ('a', 'b')) -
При create проблем не было, да)
А вот joinGet такой дает ошибку
DB::Exception: joinGet only supports StorageJoin containing exactly one key -
-
-
select * from (select 'a' a,'b' b) t any left join jtest on jtest.key = (t.a, t.b);
┌─a─┬─b─┬─key───────┬─value─┐
│ a │ b │ ('a','b') │ 15 │
└───┴───┴───────────┴───────┘ -
Спасибо!
Боюсь, правда, tableau такое генерить откажется, но попробую -
Смотря как вы их будете читать. Если посчитать, например, обороты за месяц, то будет ок.
Мы как-то пробовали хранить данные, но столкнулись с тем, что запрос вида select top ... from ... order by ... приводил к сканированию таблицы и все становилось печально. -
Спасибо за ответ!
-
тут все зависит от вашего понимания, можно сделать чтобы не сканировал
-
SELECT count() FROM S
┌───count()─┐
│ 100000000 │
└───────────┘
select top 10 * from S order by B,A;
┌───A─┬─B─┬─C───┬──────────D─┐
│ 0 │ 0 │ xxx │ 2021-03-24 │
│ 103 │ 0 │ xxx │ 2021-03-24 │
│ 206 │ 0 │ xxx │ 2021-03-24 │
....
Processed 5.12 thousand rows -
Возможно. В общем мы пытались использовать КХ для целей, для которых он не заточен, производительность таких запросов нас не устроила и мы отказались от этого решения.
-
это правильно, обычные OLTP конечно делают это лучше
-
DB::Exception: Table system.query_log doesn't exist..
restart сделал -
через 7 сек. после запроса появится таблица
-
увы
https://github.com/ClickHouse/ClickHouse/issues/11194 -
-
может админы отключили создание этой таблицы, чтобы диск не засираляс
-
типа
<?xml version="1.0"?>
<yandex>
<asynchronous_metric_log remove="1"/>
<metric_log remove="1"/>
<query_log remove="1"/>
<query_thread_log remove="1"/>
<trace_log remove="1"/>
</yandex> -
вы что хотели сказать-то картинкой?
это ничего не доказывает, во первых это не тот конфиг. -
спасибо )
-
Подскажите, как в clickhouse можно распарсить string следующего формата:
[
{
"action_type": "type_1"
},
{
"action_type": "type_2"
}
] -
JsonExtract посмотрите в эту сторону
-
это две строки или одна?
-
Это одна строка в которой много объектов с разной структурой
-
а тогда лучше монгодб, тут КХ не подойдет
-
спасибо, видимо стоит воспользоваться питоном для парсинга, не сильно хочется ставить монго ради одного источника данных
-
-
- 25 March 2021 (151 messages)
-
-
Конкретно одного запроса, на практике - Нет.
Но если у вас много запросов в секунду, никто не запрещает кидать их на разные реплики и масштабироваться. -
decimal есть вполне себе живой
-
две реплики с одинаковыми данными могут прососать больше distributed запросов чем одна
-
Joined.
-
-
-
нод то может быть и больше. но диски и CPU на этих нодах не резиновые и осуждается такая схема потому что ее расширять нереально... сразу гарантии ради которых она создавалась теряются...
то есть допустим было 3 железки, 9 нод clickhouse, разбиты как circular
все круто, кластер спокойно переживает падение 2 из 3 серверов,
теперь вопрос, как сюда добавить 4й сервер? ;) -
Добрый день, как правильно выбрать ORDER BY, если
количество user_id - сотни тысяч
количество domain для каждого user_id - до 100
Сейчас так:
ORDER BY (user_id, report_date, domain)
Будет ли быстрее поиск, если сделать так:
ORDER BY (user_id, domain, report_date)
В where всегда есть эти три поля. -
-
@milovidov_an привет, я тут из-за твоего доклада про сборку clickhouse, есть пару вопросов. Если вы вкорячили большую часть musl, почему было не всунуть её всю? Говорил, что fuzzing включаете на час, как это происходит? Отдельная джоба на ci, или сервис, как у гугла, куда закидываете бинарник и потом ждёте от него вестей (по почте?)?
-
report_date, domain, user_id
от менее кардинальных, до более кардинальных
report_date в начало и еще PARTITION BY toYYYYMM(report_date)
обычно чтобы быстрые range запросы по дате были (дата обычно в каждом запросе есть) -
кстати, вопрос
а в чем концептуальная разница между partition by toStartOfMonth(date) и toYYYYMMM(date) - только в хранимом типe данных ? -
Joined.
-
вроде где то было, что дату можно не класть в ордер, т.к. если она в партиции то уже проиндексирована
-
Но везде в примерах дата входит в ордер. Вот из документации
ENGINE MergeTree()
PARTITION BY toYYYYMM(EventDate)
ORDER BY (CounterID, EventDate) -
нет
если дата в партиции это просто значит что сначала будут выбрана партиция
но если нет в ORDER BY то внутри партиции будут просканированы все data parts (system.parts)
и это будет медленно, потому что дата будет отсуствовать в mrk файлах... соответсвенно последовательно будут открываться .bin файлы распаковываться и фильтроваться, это будет ДОЛГО -
да, toYYYYYMM это 32bit interger а toStartOfMonth это 64bit integer
mrk файлы будут жирнее -
По постановке вопроса - не совсем понял, почему 3 железки, но 9 нод кликхауса.
Вы подразумеваете тройную репликацию? Если так, то это очень суровое требование, которое, наверное, в значительном числе случаев избыточное.
Для 3 железных серверов под круговой репликацией я имел в виду схему:
s - shard, r - replica
[host1]: s1r1, s3r2
[host2]: s2r1, s1r2
[host3]: s3r1, s2r2
Она падения 2 из 3 не переживёт, но (в общем случае) при вылете нескольких НЕсмежных N из M должна остаться работоспособной.
Теперь появился host4, как расширяться?
По сравнению с исходным состоянием целевое состояние теперь:
...
[host4] s4r1, s3r2
[host1] s1r1, s4r2
Дальше если совсем прямолинейно пойти, сперва скопировав данные всех старые партиции (в которые данные уже не поступают) 2й реплики 3го шарда с host1 на host4,
затем выключить host1 (кластер работоспособен)
затем в зукипере 'host' в описании 2й реплики 3го шарда изменить с host1 на host4
добавить s41 на host4
удалить s3r2 с host1, включить host1
добавить s4r2 на host1
как-то так? -
На практике я это ещё не проверял, так что может описание добавления новой ноды где-то ошибочно. И да, тут уже кажется было несколько ограничений и граблей по дороге... В частности не поплохеет ли зукиперу от такой подмены, и сумеет ли он (продолжая получать новые данные от s3r1) нормально восстановить несколько отсутствующих партиций s3r2 на host4
-
Joined.
-
Joined.
-
-
я подразумеваю "circular replication"
она подразумевает что на одной железке крутятся реплики от разных шардов
один шард как минимум на 2х железках крутится
3 железки могут обслуживать 3 шарда кликхауса по 2 репилики в каждом итого 6 clickhouse-server
такая схема переживет отключение 1 сервера из 3
при добавлении вашей схемы надежность всей системы снижается
мы все еше переживаем потерю 1 сервера из 4
но вероятность того что мы переживем падение 2 серверов из 4 без потери данных, существенно меньше
извините, я математику забыл и не могу сказать насколько =(
соответсвенно надо либо делать коэффициент репликации 3 и 3 ноды ch уже в железку могут не влезть
либо добавлять большее кол-во серверов что в итоге приводит к схеме 1 железка = 1 clickhouse-server -
Ок, пусть тройная репликация.
Но концептуально примерно то же самое, что и с двойной, просто с бубном надо прыгать значительно более активно.
Было
host1: s1r1, s3r2, s2r3
host2: s2r1, s1r2, s3r3
host3: s3r1, s2r2, s1r3
+ host4
Надо:
host1: s1r1, s4r2, s3r3
host2: s2r1, s1r2, s4r3
host3: s3r1, s2r2, s1r3
host4: s4r1, s3r2, s2r3
Для этого должны переехать:
s4r2 и s3r3 с host1 на новый host4
s3r3 с host2 на host1 -
ну в общем, оно такое себе все равно выходит
надежность выше, но риски по перформансу и эксплуатации мне кажется выше
если что clickhouse-operator умеет в Circular Pod AntiAffinity
https://github.com/Altinity/clickhouse-operator/blob/master/docs/chi-examples/13-distribution-02-3x3-circular-replication.yamlclickhouse-operator/13-distribution-02-3x3-circular-replication.yaml at master · Altinity/clickhouse-operatorThe ClickHouse Operator creates, configures and manages ClickHouse clusters running on Kubernetes - clickhouse-operator/13-distribution-02-3x3-circular-replication.yaml at master · Altinity/clickho...
-
Из-за чего может быть, скажем так, лаг данных в КХ? Лагом я называю то, что данные в SELECT "отстают" от тех, которые вставляются сейчас. Причем в моем случае на несколько часов (хотя еще 12 часов назад этот лаг был 15 минут).
Что можно почитать на эту тему? Как форсировать этот лаг, если это возможно? -
Вы делаете (успешный) INSERT, но вставленные данные в SELECT становятся доступны с большой задержкой до нескольких часов?
Вставляете в DISTRIBUTED таблицу? -
Да, именно.
Нет, не DISTRIBUTED. -
Поверх таблицы, куда вставляются данные, есть несколько MV с AggregatingMergeTree (вычисляю HIGH, LOW, OPEN, CLOSE на нескольких таймфреймах). Данные поступают интенсивно, но в батчах от 1000 строк (биржевые данные).
-
А несколькочасовая задержка - она про появление вставленных данных в AggregatingMergeTree таблицах? В базовой (исходной) таблице данные сразу появляются?
-
И там, и там. В исходной таблице данные также "отстают" на SELECT-ах и на примерно такой же интервал времени.
-
Я вчера (видимо, зря) создавал MV с POPULATE (хотел попробовать). Не знаю, связано это было с этим или нет, но через 6-8 часов появились вот эти задержки. Тот вью я грохнул и создал без POPULATE.
-
В логах в целом нормальная ситуация? Спама ошибок нет?
-
Ошибок нет.
В каждую секунду много сообщений типа removing part from filesystem, резервирования на диске, мерж кусков. -
Добрый день. Например, в документации есть настройка MergeTree таблицы enable_mixed_granularity_parts, там не сказано ее дефолтное значение, поэтому я хочу посмотреть какое актуальное для нее значение у уже существующей таблицы. Есть ли какой то способ это сделать типа SHOW SETTINGS table?
-
SELECT * FROM system.merge_tree_settings WHERE name LIKE '%mixed_granularity%';
-
-
-
Либо system.replicated_merge_tree_settings для RMT таблиц
"Allow user to specify settings for ReplicatedMergeTree* storage in <replicated_merge_tree> section of config file. It works similarly to <merge_tree> section. For ReplicatedMergeTree* storages settings from <merge_tree> and <replicated_merge_tree> are applied together, but settings from <replicated_merge_tree> has higher priority. Added system.replicated_merge_tree_settings table. #13573 (Amos Bird)." -
Я пас:(
Почему в исходной таблице с такой большой задержкой успешно вставленные данные не доступны в запросах, только 1 возможность приходит в голову - перегруженная асинхронная вставка в distributed, когда он сильно не успевает шардировать по кластеру. Но это не ваш случай.
Если бы были бы проблемы с самой вставкой (типа слишком большого числа партов), то это проявилось бы в логе (да и INSERTы кажется ошибку выдают в таком случае). Но если в базовую таблицу вставились, мелкий part от вставки образовался - то в SELECTе должно быть видно. -
Ребят, какой best practice для перевода таблицы из одного типа партиции в другой?, допустим хочу одну таблицу перевести с помесячного партицирования на понедельную, нельзя это сделать налету? без пересоздания таблицы и перекидывания кучи данных
-
-
Здрасте, были у кого-то проблемы с tcpшным go драйвером и pingом?
А именно то, что для read-only пользователя эта операция недоступна? -
Хм, оно даже SELECT 1 не дает сделать из под ro-юзера, интересно, ЧЯДНТ🤨
-
парты с toyyyymm назваются короче. в зк места меньше занимают
-
Да нет конечно.
Партиционирование вообще не влияет на это.
В mrk хранятся 2 64 битных смещенения для каждой гранулы
В mrk2 2 64 + 64 бит размер гранулы -
Ошибка-то какая? Возможно он settings передает
-
ну само то значение тоже в mrk хранится. разве нет?
-
Authentication failed: password is incorrect or there is no user with such name
Пользователь такой точно есть, я им из клиента коннекчусь,
При этом rw-пользователем тем же кодом вполне себе ок коннектится. -
Для более похожих имен каталогов со старым форматом и более коротких имен партов в зк.
-
вообще нигде не хранится. Только имя каталога на диске
Партиционирование вообще никак не связано с индексами и idx mrk bin -
host / host_regexp в профиле может быть какой нибудь который коннектиться не позволяет?
-
/me пойдет убьется ап стенку
-
профиль максимально тупой:
<allow_databases>
<database>default</database>
</allow_databases>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>readonly</profile>
<quota>default</quota>
mailрушный http-драйвер с этим пользователем работает ок -
Ipv6 vs ipv4 ?
-
Это где-то конфигурится?
Сознательно ничего, кроме <ip>::/0</ip> не менялось и настройки одинаковы для ro и rw пользователей -
хм, а снимите tcpdump для вашего golang приложения?
и тоже самое с clickhouse-client?
вообще странно конечно...
интересно clickhouse-client передает или нет ping какой нибудь пока работает...?
или вообще без них реализван ... clickhouse-client —help | grep ping ничего такого не показывает
Судя по коду, там прямо на уровне протокола это должно работать
https://github.com/ClickHouse/clickhouse-go/tree/master/clickhouse_ping.go#L21ClickHouse/clickhouse-goGolang driver for ClickHouse. Contribute to ClickHouse/clickhouse-go development by creating an account on GitHub.
-
Да пофиг на ping, у меня SELECT 1 не работает)
-
<ip>0.0.0.0/0</ip>
если попробовать?
код на golang минимальный и конфиги для ro и rw юзера куда нибудь на gist.github.com выложить? -
попробовал, same, ну и было бы странно, если для rw работало, а для ro нет - rw отличается от ro только тем, что у него в профиле default-профиль испрользуется
-
clickhouse-client значит сейчас с ro юзером работает?
-
yeap, ровно теже креды, что в приложении - все ок
-
select 1 дает сделать
-
а пароль для ro юзера задан?
а если убрать пароль? -
задан
без пароля работает -
о! интересно
а он как задан?
plaintext или какой нибудь sha1 hash? -
sha1
-
а если plaintext в конфиге юзера пароль задать?
-
а если sha256 ?
вообще тут интересно, по идее пароль передается в открытом виде в протоколе по TCP
можете tcpdump снять чтобы сравнить что отсылает clickhouse-go и clickhouse-client? -
ща попробуем)
-
интересно, локально он с sha1 ок работает, но на проде нет
версия КХ и версия софта одна -
Всем привет, никто не сталкивался с таким, делаешь select count(*) получаешь определенное значение X, выполняю insert select, и получаешь каунт с итоговой таблицы X - 10%
-
Если втянуть весь Musl, то не получится открывать динамические библиотеки (для ODBC драйверов и для CatBoost). Скорее всего там есть способ, но придётся ещё сильно помучаться.
Ещё проблема в мелочах с разными несовместимостями при сборке 3rd-party библиотек (надо исправлять).
Фаззинг в течение часа делается в CI, отдельной задачей, в каждом pull request. -
Понял, спасибо
-
что если поставить set read_backoff_min_latency_ms=0
Какая версия КХ у вас? -
Joined.
-
до этого какая была не запомнил, думал дело в версии и поставил самую свежую 21.3.3.14-2. Но результат такой же
-
движок какой у таблицы в которую льете?
-
mergetree на которую лью тоже
-
кек, судя по дампу, goшный драйвер потерял символ + из пароля по дороге...
-
и сколько строк? что если у таблицы в которую инсерт, для теста сделать engine=Log ?
-
дак может прост мерж срабатывает ? особенно если делать count(*)
-
select count(*) from db.table1 where record_type = 6 // 358960865
insert into db.table2 select * from db.table1 where record_type = 6
select count(*) from db.table2; // 358681260 -
и что мерж меняет для движка mergetree ?
-
это с engine=Log ?
-
нет, как было с mergetree, сейчас вот создаю таблицу с такой же структурой но с движком Log
-
ну мб я путаю с суммингмерж три
есть две записи в таблице А
insert into B select * from A
в таблице B после мержа count(*) может вернуть 1, а не 2, тк те две записи смержились в одну -
Joined.
-
хм, интересненько, к сожалению сейчас go драйвером толком никто не занимается, если у вас получится сделать PR и сделать тест, то можно вмержить
-
yeap, постараюсь дойти до этого)
-
mailрушным httpшным не занимаются
tcpшным не занимаются
эдак по миру пойдем☹️ -
ну скажем так, мантейнеры обоих драйверов работают уже в других областях
и чтобы они вмержили их надо пинговать и чтобы PR был хороший с тестами -
да-да, однажды я уже протолкнул ПР Кириллу, попробуем повторить)
-
-
Joined.
-
Joined.
-
-
Залил в engine = Log, залилось столько сколько должно быть
-
чудеса. У таблицы MergeTree точно движок MergeTree а не ReplacingMT ?
-
ага, у таблицы такие хар-ки
ENGINE = MergeTree
PARTITION BY toYYYYMM(start_timestamp)
PRIMARY KEY start_timestamp
ORDER BY (start_timestamp, record_type)
TTL start_timestamp + toIntervalDay(731)
SETTINGS index_granularity = 8192 -
всё это дело происходит в рамках одного экземпляра
-
я раннее указывал в этой клиент сессии set read_backoff_min_latency_ms=0, это может хоть как-то повлиять? Мб с этой опцией mergetree попробовать залить
-
в порядке бреда - у вас при вставке не может быть так что TTL отрезает вот эти 10%?
-
┌─max(start_timestamp)─┬─min(start_timestamp)─┐
│ 2019-10-31 23:59:59 │ 2019-03-25 15:07:21 │
Прямо сегодня можно сказать, что часть записей усекается, дня 3-4 назад было также -
Попробую с расширенным ТТЛ залить также в mergetree
-
-
ок) его то всегда можно задать)
-
так на источнике select count() ... where start_timestamp < now() - toIntervalDay(731)
-
Joined.
-
есть записи, но кажется сейчас корректно тяжело вытащить, т.к. ТТЛ уже наступает на таймстемп
Я сейчас уже заливаю без ТТЛ в mergetree -
ТТЛ я убрал совсем, но всё равно есть разница, в исходной таблице 358 648 861, в конечной 358 960 865
-
-
теперь больше чем было?
-
-
было до этого:
в исходной 358 960 865
в конечно 358 681 260 -
-
-
Ребята извиняюсь, как оказалось всё дело было в исходной таблице, там стоял ТТЛ о котором я не знал. Приношу свои извинения! @den_crane :))
-
select 2020-01-01
--
2018
select toDateTime(2018)
--
1970-01-01 00:33:38 -
-
select timezone()
-
-
да,
но в общем-то КХ для неверных дат любую чепуху может получить, там парсер для скорости что угодно жует -
select toDate('neff-01-01') ;
--
1970-01-01 -
toDate('202a-01-92')
-
-
Кликхаус знает про NUMA? Учитывает ли он ее при распределении задач и выделении памяти?
-
не учитывает. КМК пока нет собственного буфер-кеша, тут ничего не сделать хорошего
-
откройте issue -- unexpected behaivour
может кто-нибудь посмотрит -
Ок, спасибо
-
-
-
мб не использовать final?
-
таблица ReplacingMergeTree, на клиенте записи схлопывать уже?
-
врядли это будет лучше, тут я не уверен.
Но при final данные мёржатся во время выполнения запроса. У вас там полноценный мердж вызывается( -
-
поясните пожалуйста , я думал что ReplacingMergeTree - это и есть удаление дубликатов в базе, поэтому и выбрали этот движок
-
Да, этот движок в фоне удаляет дубликаты записей c одинаковым ключом сортировки. Но слияние происходит в неизвестный момент времени, и вообще не дает гарантии их отсутствия.
Но когда вы выполняете запрос с final, вы вызываете мердж. И соответсвенно это займет какое-то время. Думаю, бОльшее, чем без него -
-
Понял, спасибо
-
Подскажите пожалуйста, как отключить эту проверку?
Estimated query execution time (698.2108063970212 seconds) is too long. Maximum: 500. Estimated rows to process: 34563546: While executing MergeTreeThread -
Joined.
-
вопрос с подвохом? в смысле ошибка возникает прямо при запуске запроса?
тогда timeout_before_checking_execution_speed=0 -
запрос отправляется, но через несколько минут падает
-
тогда видимо max_execution_time = 0
-
попробую, спасибо
-
Привет
Подскажите как настроить сериализатор в Джанго кликхаус
Подружить получилось, в консоль выводится содержимое
Но не очень понимаю как отправить сериализованные данные
Или может у кого то есть проект на гитхабе призучать?
Спасибо -
обычно ограничение установлено не просто так, как-то странно что вы спрашиваете это в чате.
т.е. вас админ ограничил, а вы пытаетесь это обойти -
-
Joined.
- 26 March 2021 (158 messages)
-
Joined.
-
Joined.
-
Добрый день!
Вижу на реплике много записей в логе вида:
<Information> HTTPSessionPool: No free connections in pool. Waiting.
не могу понять что именно происходит, какой пул переполнился и что с этим делать.
В документации ничего похожего не нашел.
Кто-нибудь сталкивался с подобным? -
Посмотрите поиском в истории канала (группы) по слову background_fetches_pool_size - возможно это как раз ваш случай
-
Спасибо большое!
-
Добрый день.
как посмотреть текущие реалтайм настройки сервера?
установить написано как SET setting=value
а как узнать ? -
select * from system.settings;
-
спасибо огромное.
тут сразу следующий вопрос. напоролся на ошибку
Code: 241. DB::Exception: Received from localhost:9000. DB::Exception: Memory limit (total) exceeded: would use 1.61 GiB (attempt to allocate chunk of 4456448
bytes), maximum: 1.61 GiB.
в пустую таблицу заливаю из файла данные
INSERT INTO t1 (u1) FORMAT CSV
раньше отрабатывало. данных сильно больше не стало. только CH обновлял. настройки сервера почти дефолтовые. -
сервер одиночный
-
пишут про distributed_aggregation_memory_efficient = 1. но он включен и вроде как для одиночных серверов и не актуально
-
и самое интересное что сам инсерт отработал целиком нормально.
это уже после того как он закончил - сервер высыпал ошибку -
Joined.
-
ну ошибку то наверное тогда на другое вывалило
смотрите логи /var/log/clickhouse-server/ там query-id есть в которой ошибка случилась -
нет. там между завершением инсерта и выдачей ошибки 0,003 секунды
и в это время к КХ точно никто не обращается
вот лог полнее -
2021.03.26 03:53:39.821266 [ 2282339 ] {} <Error> auto DB::IBackgroundJobExecutor::jobExecutingTask()::(anonymous class)::operator()() const: Code: 241, e.dis
playText() = DB::Exception: Memory limit (total) exceeded: would use 1.61 GiB (attempt to allocate chunk of 4205312 bytes), maximum: 1.61 GiB: (while reading
column ProfileEvent_PerfStalledCyclesBackend): (while reading from part /var/lib/clickhouse/store/4de/4de85eff-9550-4021-ac5b-11ead5ab8eb6/202103_174297_17684
7_510/ from mark 3 with max_rows_to_read = 4189): While executing MergeTreeSequentialSource, Stack trace (when copying this message, always include the lines
below): -
как файлы с БД перенести на другой SSD
-
Подскажите, есть ли известные приемы оптимизации запроса по подсчету числа "новых" пользователей на сайте за период времени? Сейчас мы за период времени берем число уникальных пользователей и left джоиним с уникальными пользователями с всю предыдущую историю (работает долго):
select countDistinct(neww.user_id)
from
(select distinct user_id
from clicks
where click_time between '2021-03-25' and '2021-03-26'
) neww
left join
(select distinct user_id
from clicks
where click_time < '2021-03-25'
) oldd
where empty(oldd.user_id) = 1 -
SELECT user_id FROM clicks GROUP BY user_id HAVING min(click_time)) between '2021-03-25' and '2021-03-26'
-
Костя, спасибо за идею!
-
-
-
Да, как раз уже идем в этом направлении
-
-
всем привет.
с питонячим clickhouse-driver кто-нибудь сталкивался с таким? может знаете как обходить?
click.execute(
'SELECT formatDateTime(now(), '%Y-%m') AS year_month, %(dc)s AS name',
{'dc': 'ED'},
)
.../clickhouse_driver/client.py", line 564, in substitute_params
return query % escaped
ValueError: unsupported format character 'Y' (0x59) at index 36 -
Так тут проблема в питоне, а не в драйвере
-
вот этот вот BackgroundJobExecutor это к запросу отношения не имеет
там ниже stacktrace покажите его -
с остановкой сервера или без остановки сервера?
-
Можно заменить ваш конкретный formatDateTime на toYYYYMM, только "-" потеряете
-
click.execute(
'''SELECT formatDateTime(now(), '%Y-%m') AS year_month, %(dc)s AS name''',
{'dc': 'ED'},
) -
я так и делаю сейчас )
-
вам тут ниже решение подсказали, попробуйте и если ОК. напишите это решение в issue на github который вы завели
-
нет ((
-
Что пишет?
-
-
Ммм, а можно %%Y-%%m?
-
Всем привет, есть таблица с колонкой spool_date DateTime('Asia/Kamchatka'), таймзона клиента/сервера - `Europe/Moscow, выполняю два запроса:
select vid, spool_date FROM messages_ou WHERE toDate(spool_date) = toDate('2021-03-24');
select vid, spool_date, toDate(spool_date) = toDate('2021-03-24') res FROM messages_ou WHERE res = 1
Которые возвращают разные результаты 😮 Похоже на то, что toDate() в блоке select учитывает таймзону колонки, а в блоке where - нет. Баг? -
спасибо❤
-
Добрый день! Есть две таблицы с своими id. Записи в одной с id 1234 соответствуют записям с id 2345 в другой. И таких пар 4 штуки. Кажется можно объединить их используя массив. Но не могу найти похожих примеров в документации.
-
Сравните toTypeName(toDate(spool_date)) и toTypeName(toDate('2021-03-24')) - таймзоны одинаковые?
-
пока не понятно что нужно сделать, JOIN по таким id?
-
-
Table1
Id name
1234 Name1
3456 Name2
Table2
Id SecondName
2345 sName1
4567 sName2
[1234,2345],[3456,4567]
Итог
1234 2345 Name1 sName1
3456 4567 Name2 sName2 -
вот это [1234,2345],[3456,4567] не хочется делать таблицей связей, хочется оставить в запросе
-
кажется что-то такое
-
SELECT test.*, c
FROM test
ARRAY JOIN array([1,1],[2,3]) as c
WHERE test.id = arrayElement(c,1) -
а id подчиняются именно такой логике?
-
нет, это я для удобства. На деле там совершенно разные значения
-
-
-
нет, справочники из разных систем но об одном и том же.
-
но про разные атрибуты этого одного
-
-
в том то и дело, никак 🙂 не я такой, жизнь такая
-
запрос заказчика, объедини нам это с этим. Поэтому и хочу чтобы эти пары остались в запросе
-
в общем как-то так
-
SELECT t1.*,c[1] c1 ,c[2] c2, t2.*
FROM test t1
ARRAY JOIN array([1,1],[2,3]) as c
JOIN test as t2 ON t2.id = toInt32(c[2])
WHERE t1.id = c[1] -
-
забавно что WHERE t1.id = c[1] - ОК а ON t2.id = c[2] не ок Type mismatch of columns to JOIN и ошибка на попытку FROM test t1, test t2 ARRAY JOIN
-
массив часть запроса, их там не будет только если кто-то отредактирует запрос
-
ну раз речь пошла о хардкоде то почему не записать маппинг прям в запрос?
-
-
серией условий?
-
потому что если уж делаешь ты хардкод, то вынеси константы в начало кода )))
-
что не такWITH [[1, 1], [2, 3]] AS c
SELECT
t1.*,
c[1] AS c1,
c[2] AS c2,
t2.*
FROM test AS t1
ARRAY JOIN c
INNER JOIN test AS t2 ON t2.id = toInt32(c[2])
WHERE t1.id = (c[1]) ошибка DB::Exception: No alias for non-trivial value in ARRAY JOIN -
да, добавить в первую таблицу - multiIf(Id=1234, 2345, Id=3456, 4567, null) as join_key и по нему делать джойн
-
можно и так, да
-
-
SELECT t1.*, t2.*, multiIf(t1.id = 1, 2, t1.id = 2, 3, null) as join_k
From test t1, test t2
WHERE join_k = t2.id менее наглядно, но вцелом ок -
Error executing query INSERT INTO db.some_tbl (date, user_id, event_uuid, message, type) FORMAT TabSeparated: Poco::Exception. Code: 1000, e.code() = 2, e.displayText() = File not found: /var/lib/clickhouse/data/db/some_tbl/tmp_sizes.json, e.what() = File not found
что еще tmp_sizes.json ? -
не с TinyLog связано?
-
ну судя по stacktrace у вас реально отвалился Background Merge потому что ему памяти не хватило
и это никак не относится к вашему INSERT запросу потому что {} вместо {query-uuid} в начале ошибки стоит
сколько памяти на сервере всего?
сколько стоит max_memory_usage \ max_memory_usage_ratio?
советую почитать
https://clickhouse.tech/docs/en/operations/settings/query-complexity/
и
посмотреть куда вообще уходит у вас память
select formatReadableSize(sum(bytes_allocated)) from system.dictionaries;
SELECT
database,
name,
formatReadableSize(total_bytes)
FROM system.tables
WHERE engine = 'Memory'
select formatReadableSize(sum(memory_usage)) from system.merges;
select formatReadableSize(sum(memory_usage)) from system.processes;
SELECT
initial_query_id,
formatReadableSize(memory_usage),
formatReadableSize(peak_memory_usage),
query
FROM system.processes
ORDER BY peak_memory_usage DESC
LIMIT 10
SELECT
initial_query_id,
formatReadableSize(memory_usage),
query
FROM system.query_log
WHERE (event_date >= today()) AND (event_time >= (now() - 7200))
ORDER BY memory_usage DESC
LIMIT 10Restrictions on Query Complexity | ClickHouse DocumentationRestrictions on Query Complexity Restrictions on query complexity are part of the settings. They are used to provide saf
-
SHOW CREATE TABLE db.some_tbl ?
папка /var/lib/clickhouse/data/db/some_tbl/ говорит о том что это именно данных каких то не хватает (clickhouse/data данные, clickhouse/metadata/ sql файлы с определением таблиц) -
ну то, что "File not found" - это нехватка файла - это понятно
-
в CREATE TABLE - это просто TinyLog
-
EXPLAIN SYNTAXT в начало добавьте и запустите
-
ну значит кто-то в вашем TinyLog поковырялся
-
тоже самое No alias for non-trivial value in ARRAY JOIN
-
ни у кого нет доступа к файловой системе, более того, эта чудо таблица создается на 5 минут
-
ARRAY JOIN c as arr ?
-
WITH [[1, 1], [2, 3]] AS c
SELECT
t1.*,
arr[1] AS c1,
arr[2] AS c2,
t2.*
FROM test AS t1
ARRAY JOIN c as arr
INNER JOIN test AS t2 ON t2.id = toInt32(arr[2])
WHERE t1.id = (arr[1]) не работает -
-
а вот так работает
-
SELECT
t1.*,
arr[1] AS c1,
arr[2] AS c2,
t2.*
FROM test AS t1
ARRAY JOIN [[1, 1], [2, 3]] as arr
INNER JOIN test AS t2 ON t2.id = toInt32(arr[2])
WHERE t1.id = (arr[1]) -
то есть не работает именно перенос массива в WITH
-
Пишите багу, какая версия?
-
21.4.1.6200
-
А тю
сделайте через transform -
??
-
а, понял, да, тоже ок
-
SELECT test.*, c
FROM test
INNER JOIN t2 ON (test.id = transform(t2.id,[],[]))
WHERE test.id = arrayElement(c,1) -
Либо этап transform лучше запихать в подзапрос и делать JOIN с подзапросом
-
Тогда хешмапа будет уже полностью готовая
-
да, в моем случае if удобнее, так как 3 значения эквивалентны 1
-
If(GroupCode IN ('02439', '02435', '02430'), 'Ч0011', null) join_key,
-
Ok, но если у вас несколько id будет, то transform может быть быстрее чем multiIf
-
учту! Спасибо!
-
https://github.com/ClickHouse/ClickHouse/issues/455
а какая у вас версия ClickHouse?Cannot open file tmp_sizes.json: No such file or directory, when renaming a table · Issue #455 · ClickHouse/ClickHouseHello Since ClickHouse does not have truncate, I thought I would just create a new table with create ... as and then rename it: create table test (s String) engine=TinyLog; create table test_new as...
-
21.3
-
max_memory_usage дефолтовое. консоль показывает max_memory_usage │ 10000000000
max_memory_usage_ratio не нашел
max_server_memory_usage 0
max_server_memory_usage_to_ram_ratio 0.9
на сервере было 2Г. сейчас увеличил до 8Г + 8Г свопа -
а движок базы какой ? Atomic?
какая последовательность с этой таблицей действий перед фейлищемся INSERT?
можете сделать grep some_tbl -r /var/log/clickhouse-server/ и расшарить результаты? -
уже все, некогда было ждать, похоже исправилось заменой движка временных табличек c TinyLog на Log
-
всем привет!
в ближайшее время, планируем обновление кх до версии
Altinity Stable Release 20.8.12.2
текущая
Altinity Stable Release 20.3.19.4
последнее время придерживаемся только релизов Altinity
подскажите пожалуйста, как наиболее правильно обновить кластер?
кластер состоит из трёх шардов с тремя репликами на шард
обновлялись всегда таким способом
условно реплики1 каждого шарда
потом реплики2 и реплики3 -
ну 2 гига это очень мало
таблица в 100 колонок на insert аллоцирует 2 гига под буфера
max_memory_usage │ 10000000000 - это 10G ...
для малых объемов RAM есть настройка
https://clickhouse.tech/docs/en/operations/settings/settings/#background_pool_size
поставьте ее = 2 для 2 гигов
почитайте что она значитSettings | ClickHouse DocumentationSettings distributed_product_mode Changes the behaviour of distributed subqueries. ClickHouse applies this setting when
-
так у меня и таблица не большая - 10М записей всего
и колонок под 20
ну и как бы работало же... -
ну в логи то можно глянуть все равно...
grep some_tbl -r /var/log/clickhouse-server/ | grep дата-когда-возникла-ошибка
может показать картинку вполне ясно
или у вас доступа на сервер нет?
тогда попробуйте поискать в system.text_log если у вас создается -
память это не только кол-во записей но и кол-во колонок, кол-во колонок и кол-во одновременных query + background процессы + словари существенно большую роль играют чем кол-во записей на память
записи поточно и буфферизировано читаются \ пишутся
соответсвенно под буфера нужна память
кол-во записей влияет на скорость запроса -
Добрый день! Подскажите, пожалуйста, в каком файле конфигурации отключать запись логов и метрик? Вроде бы куда-то нужно добавить вот эту секцию? <yandex>
<asynchronous_metric_log remove="1"/>
<metric_log remove="1"/>
<query_log remove="1"/>
<query_thread_log remove="1"/>
<trace_log remove="1"/>
</yandex> -
Привет
Знает кто-то как сериализовать данные в джанге от кликхауса
Возможно есть пример какой нибудь?
Спасибо -
/etc/clickhouse-server/config.d/remove_logs.xml
Но не советую так делать, оставьте хотя бы query_log. потом отлаживать замучаетесь -
имеется ввиду Django ORM + ClickHouse ?
https://github.com/carrotquest/django-clickhouseGitHub - carrotquest/django-clickhouse: django-clickhousedjango-clickhouse. Contribute to carrotquest/django-clickhouse development by creating an account on GitHub.
-
Его использую, да
И гайд читал этот
Но сериализовать не могу
В консоли все выводится но не в апи -
ну сделайте issue на github у carrotquest с примером кода и ожидаемым результатом, может скажут что умное
-
Спасибо!
-
Подскажите, как обозначить одинарную кавычку ', что-то совсем туплю... через '\'' не получается
-
Joined.
-
именно через \' оно внутри одинарных кавычек и задается
какой язык\клиент? -
Кавычки кавычками экранируются
-
DBeaver
-
Конкретно - trim(BOTH '\'' from x)
-
И ломается
-
от клиента разве зависит?
-
-
По мне - нет, так же как и от языка...
-
Я надеюсь для функций такого изврата не надо? )))
-
м?
-
trim(BOTH '\'' from x) как правильно написать?
-
либо так, либо trim(BOTH '''' from x)
-
-
точно, спасибо) смотрел на старую, не обрезанную версию и что-то совсем не догонял ))
-
в clickhouse-client нормально сработало
wget -qO- "http://127.0.0.1:8123/?query=SELECT trim(BOTH '\\'' FROM '\\'test\\'')"
тоже норм отработало
выглядит как бага в JDBC\DBeaver
1) попробуйте обновить DBeaver
2) если используете HTTP для коннекта, то посмотрите через tcpdump + wireshark в каком виде JDBC драйвер отсылает запрос. что нибудь может проясниться -
если trim(BOTH '\\'' from x), то Single quoted string is not closed: ''
-
Никто не ловил такое? Версия 21.3.2.5. Стало возникать после обновления.
Cause: java.lang.Throwable: Code: 1000, e.displayText() = DB::Exception: There was an error on [172.30.32.1:9000]: Poco::Exception. Code: 1000, e.code() = 13, e.displayText() = Access to file denied: /mount/rdisk2/metadata/tmp/test_count.sql (version 21.3.2.5 (official build)) (version 21.3.2.5 (official build)) -
а /mount/rdisk2 это какой интерфейс?
tmp это имя базы данных? -
не надо двойной слеш
это только для bash + wget -
я пока не знаю. это что-то служебное похоже.
-
ну и полный stacktrace ошибки покажите, он там в /var/log/clickhouse-server/ должен лежать
-
root@clickhouse02.dev:/home/nblagodarny# df | grep rdisk2
/dev/mapper/U1574860725I1-rdisk2 3844099096 2811006056 837753368 78% /mount/rdisk2 -
Привет всем, есть какой-то универсальный способ для поиска по тексту? Сейчас разбиваем строку на массив слов и потом hasAll(array, [‘hot, 'dog’]) по нужным словам
-
Есть. Elasticsearch, например.
-
снаружи проверяете, что в результирующем массиве нет 1, но кх под это не заточен
https://clickhouse.tech/docs/ru/sql-reference/functions/string-search-functions/#multisearchallpositionsФункции поиска в строках | Документация ClickHouseФункции поиска в строках Во всех функциях, поиск регистрозависимый по умолчанию. Существуют варианты функций для регистр
-
я имел ввиду это отдельный железный диск? или какой нибудь iscsi \ EBS ?
-
отдельный железный диск
-
https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/mergetree/#available-types-of-indices
ngram data skip index можно попробовать, но это не полнотекстовый поиск ни разуMergeTree | ClickHouse DocumentationMergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
а по второму вопросу? SHOW DATABASES показывает что нибудь с названием tmp ?
-
Да, это база такая.
-
test_count - это таблица в ней, как выяснилось
-
ls -la /mount/rdisk2/metadata/tmp/test_count.sql
какого owner показывает?
SHOW CREATE DATABASE tmp;
какой движок показывает?
Atomic или Ordinal?
ну и stacktrace нужен либо из логов возьмите /var/log/clickhouse-server
либо из system.stacktraces поищите -
-rw-r----- 1 clickhouse clickhouse
SHOW выдает ошибку
Code: 76, e.displayText() = DB::ErrnoException: Cannot open file /mount/rdisk2/metadata/tmp.sql, errno: 13, strerror: Permission denied (version 21.3.2.5 (official build))
лог ищу -
Joined.
-
Как раз полнотекстовый не нужен, попробую
-
Разрабатываем систему real-time fulltext-поиска по error-логам на основе ClickHouse от Яндекса
В этой статье я расскажу о том, как разработать систему для индексирования и полнотекстового поиска error-логов (или любых других логов) на основе СУБД от Яндекс...
-
Я кстати так и не смог найти настройки, с которыми бы ngram индекс бы действительно что-то существенно ускорял для фильтрации текста логов :(. Может у кого-то есть пример?
-
Собственно, кажется с Вами я это и обсуждал год назад :). https://m.habr.com/ru/post/512084/comments/#comment_21885266
-
Могу себе представить, что для поиска редко встречающихся значений он может подойти
-
Теоретически — безусловно. Меня лично больше интересуют конкретные настройки, которые подходят для логов :). По ссылке выше я описывал свои варианты, которые пробовал.
-
(Я и есть youROCK на хабре, если что :))
-
Подскажите, что именно я делаю не так.
У меня имеется большая таблица которая обновляется через python скрипт. после обновления данных запускается другой скрипт который считает витрину по этим данным, но я заметил что данные не сразу становятся доступными.
К примеру: мы посчитали что у пользователей из группы А в день Х -> 200 кликов по разным страницам, то лишь спустя N минут эти данные можно будет получить при запросах.
Движок таблицы с которой возникают проблемы - MergeTree
Данные вставляются в таблицу батчами по 50 000 строк в несколько потоков. Потоки бьются по разным источникам чтобы за раз не исчерпывать много оперативы и проще было перезапустить упавшую задачу
В данный момент в таблице более 100 миллионов строк.
Также подобная проблемы была впервые обнаружена пару месяцев назад на старой версии кликхауса. Получилось решать ее при помощи ожидания optimize table final после окончания вставки всех данных.
Скорее всего я делаю что-то не так. -
Для практики нужен датасет и ограниченных круг хотелок.
- 27 March 2021 (20 messages)
-
ну .. у вас же врое получалось что-то около 2х раз ускорить?
но в целом тут такое дело
что data skip index существенно будут ускорять только если вы ищете что-то редкое.
потому что оно проверяет не то что в данном парте искомый токен есть. а то что в данном парте искомого токена нет
а если токен высокочастотный и есть в 100% партов, то наверное оно даже и замедлится слегка -
что значит слово "обновляется"? вы только новые данные вставляете или у вас там какой нибудь ReplacingMergeTree?
у вас один сервер или несколько?
что такое "витрина"? это отдельная таблица? или что? -
-
-
Я ему уже подсказал, где собака зарыта) Там дело в кощунственном alter table delete оказалось перед вставкой. Забыли, что ch, это не постгрес 😒
-
можно посравнить хеши и кол-во строк и осторожно убрать дубликаты
-
с помощью DETACH PART?
-
Да
-
-
On all replicas
SYSTEM STOP FETCHES table;
SYSTEM STOP FETCHES table;
1 Save list of parts for ATTACH.
clickhouse-client --query="SELECT 'ALTER TABLE ' || database || '.' || table || ' ATTACH PART \'' || any(name) || '\';' FROM system.parts WHERE database = 'table' AND table = 'table' AND partition_id = '20201130' GROUP BY database, table, rows, bytes_on_disk, hash_of_all_files, hash_of_uncompressed_files, uncompressed_hash_of_compressed_files FORMAT TSVRaw" > file.sql
ALTER TABLE table DETACH PARTITION ID '20201130';
On all replicas
SYSTEM START FETCHES table;
SYSTEM START FETCHES table;
cat ./file.sql | clickhouse-client -mn; -
Я вообще таким пользовался, но в той версии просто нельзя было сделать ALTER DETACH PART
-
А какие рекомендации по избавлению от nullable? Если есть в таблице поля, у которых значения может не быть. Придумывать дефолтовое значение, заменяющее null? Или есть другие варианты?
-
Joined.
-
Если все очень сложно то использовать nullable.
А так да, например у меня есть поле -- температура float32, там лежит -7000. Клиент при отображении все что меньше -1000 показывает пустотой. -
-
-
Привет
Делаю clickhouse драйвер к одной из реализаций Scheme(Gerbil),
имею на входе запрос (insert/select/...), хочу получить информацию
о колонках из запроса.
Есть где-нибудь парсер используемого подмножества SQL?
Или может грамматика описана в одном из популярных форматов, позволяющих генерировать парсеры?
Смотрел на https://github.com/ClickHouse/clickhouse-jdbc/blob/094ed0b9d2dd8a18ae0c7b3f8f22c35e595822a6/clickhouse-jdbc/src/main/java/ru/yandex/clickhouse/PreparedStatementParser.java#L19-L21
Очень не хотелось бы делать это регулярками :)ClickHouse/clickhouse-jdbcJDBC driver for ClickHouse. Contribute to ClickHouse/clickhouse-jdbc development by creating an account on GitHub.
-
Есть зачаток ANTLR парсера
-
красота, нашел Parsers/New/ClickHouseParser.g4, то что надо - спасибо
-
Оу еее
Похоже что для решения моих задач этой декларации будет достаточно
Спасибо! - 28 March 2021 (31 messages)
-
ClickHouse/ClickHouse tagged: v21.3.4.25-lts
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.3.4.25-lts
Release notes:
ClickHouse lts release v21.3.4.25-ltsRelease v21.3.4.25-lts · ClickHouse/ClickHouseClickHouse lts release v21.3.4.25-lts
-
Подскажите, как можно получить userID у которых время между запросами больше Х, если в базе есть только время запроса timestamp?
-
Joined.
-
-
Добрый день.
А как найти на каком сообщении из всей очереди это происходит:
DB::ParsingException: Cannot parse input: expected '"' before: '4"}'{}: (while reading the value of key publish_date),
? -
как посмотреть для конкретной группы оффсет в топике и увидеть это сообщение?
-
в кафка движке есть виртуальные колонки типа _offset
-
SELECT user_id, arrayDifference(arraySort(groupArray(timestamp))) as res FROM table GROUP BY user_id HAVING arrayExists(x -> x > 100,res)
-
всем привет, а есть способ при выгрузке данных из КХ в TSV, в именах файлов использовать значении из колонки? То есть одним запросов разложить данные по нескольким файлам
-
спасибо 🙏
-
Как я понял идея использования такова: проальтерить таблицу, найти по last _offset id Сообщения, потом его выгрепывать из всего топика.
Спасибо за предложенное решение. -
Joined.
-
Joined.
-
-
-
SELECT extractAll('dkfdfjsd1234中文字符串', '.')
┌─extractAll('dkfdfjsd1234中文字符串', '.')──────────────────────────────────┐
│ ['d','k','f','d','f','j','s','d','1','2','3','4','中','文','字','符','串'] │
└────────────────────────────────────────────────────────────────────────────┘ -
-
Добрый вечер!
Подскажите, пожалуйста, почему первый запрос работает быстро, а второй долго?
field - ключевой столбец, данных много
Тип fields - String
Разве подзапрос не должен выполниться один раз и затем передаться внешнему запросу?
Версия: 21.3.3.14
1:
SELECT 1 FROM t WHERE field > 'value' LIMIT 1
2:
SELECT 1 FROM t WHERE field > (SELECT 'value') LIMIT 1
При установке force_primary_key = 1, получаем ошибку Primary key (field) is not used
Почему первичный ключ не используется и можно ли сделать так, чтобы он начал использоваться? -
Joined.
-
Joined.
-
Primary key and partition key are not used with a predicate as a constant subquery · Issue #21717 · ClickHouse/ClickHouse
create table t(a Int64, b Int64, p DateTime) Engine=MergeTree PARTITION BY toYYYYMM(p) order by p; create table t2(a Int64, b Int64, p DateTime) Engine=MergeTree order by a; insert into t(a, p) sel...
-
SELECT 1 FROM t WHERE field > toString(SELECT 'value') LIMIT 1
-
В этом случае такая ошибка: failed at position 169 (''value'')
-
Спасибо
-
а если еще пару скобок?
SELECT 1 FROM t WHERE field > toString((SELECT 'value')) LIMIT 1 -
Здорово, так заработало
-
Joined.
-
привет. хочу запустить clickhouse на macbook m1, прочитал, что надо билдить самому из сурсов. есть у кого-то docker образ уже готовый? Вообще реально ли это в данный момент завести?
-
Installation | ClickHouse Documentation
Installation System Requirements ClickHouse can run on any Linux, FreeBSD, or Mac OS X with x86_64, AArch64, or PowerPC6
-
Возможно проще внешнюю виртуалку поднять
-
Завел все, спасибо
- 29 March 2021 (163 messages)
-
перенесла вручную все файлы из ./var/lib/clickhouse на новый диск где уустановлен clickhouse. Но теперь при запуске клиента не видит моей БД
-
Откуда еще что скопировать?
-
сервер перестал запускаться
-
{} <Trace> BaseDaemon: Received signal -2
2021.03.29 13:06:48.195986 [ 65492 ] {} <Information> BaseDaemon: Stop SignalListener thread
2021.03.29 13:06:48.215198 [ 65490 ] {} <Information> Application: Child process exited normally with code 70.
2021.03.29 13:07:18.291870 [ 65573 ] {} <Information> Application: Will watch for the process with pid 65574
2021.03.29 13:07:18.291997 [ 65574 ] {} <Information> Application: Forked a child process to watch
2021.03.29 13:07:18.292276 [ 65574 ] {} <Information> SentryWriter: Sending crash reports is disabled
2021.03.29 13:07:18.292352 [ 65574 ] {} <Trace> Pipe: Pipe capacity is 1.00 MiB
2021.03.29 13:07:18.330896 [ 65574 ] {} <Information> : Starting ClickHouse 21.3.3.14 with revision 54448, build id: 7C39F44C9AD4D3BA36D74775616894F60A552276, PID 65574
2021.03.29 13:07:18.330981 [ 65574 ] {} <Information> Application: starting up
2021.03.29 13:07:18.430235 [ 65574 ] {} <Information> Application: Calculated checksum of the binary: 11A63B17AD9F07EA53F49019A0B82E36, integrity check passed.
2021.03.29 13:07:18.430358 [ 65574 ] {} <Trace> Application: Will do mlock to prevent executable memory from being paged out. It may take a few seconds.
2021.03.29 13:07:18.442090 [ 65574 ] {} <Trace> Application: The memory map of clickhouse executable has been mlock'ed, total 180.98 MiB
2021.03.29 13:07:18.442246 [ 65574 ] {} <Debug> Application: rlimit on number of file descriptors is 500000
2021.03.29 13:07:18.442255 [ 65574 ] {} <Debug> Application: Initializing DateLUT.
2021.03.29 13:07:18.442261 [ 65574 ] {} <Trace> Application: Initialized DateLUT with time zone 'Asia/Krasnoyarsk'.
2021.03.29 13:07:18.442276 [ 65574 ] {} <Debug> Application: Setting up /var/lib/clickhouse/tmp/ to store temporary data in it
2021.03.29 13:07:18.446063 [ 65574 ] {} <Error> Application: Access to file denied: /var/lib/clickhouse/tmp/
2021.03.29 13:07:18.446096 [ 65574 ] {} <Information> Application: shutting down
2021.03.29 13:07:18.446101 [ 65574 ] {} <Debug> Application: Uninitializing subsystem: Logging Subsystem
2021.03.29 13:07:18.446193 [ 65575 ] {} <Trace> BaseDaemon: Received signal -2
2021.03.29 13:07:18.446210 [ 65575 ] {} <Information> BaseDaemon: Stop SignalListener thread
2021.03.29 13:07:18.466061 [ 65573 ] {} <Information> Application: Child process exited normally with code 70. -
Всем пример. Есть вопрос - мы по ночам делаем optimize для каждой секции одной большой таблицы т.к. надо точно убрать дубли. операция небыстрая и судя по графикам сервер несильно загружен . Можно ли (есть смысл) optimize секции запускать в параллель или может есть способ как подсказать клику чтобы тот использовал больше ресурсов?
-
Я забыл указать Partition при создании таблицы(( Хотя есть подходящее поле со временем и мне б отлично подошел вариант PARTITION BY toYYYYMM(EventDate)
Где найти инфу как Clickhouse разбивает на партиции таблицу с движком MergeTree по-умолчанию? В доках уже прошерстил и не нашел. Он жеж все в одну партицию не валит?
Правильно понимаю, что для изменения разбивки на партиции мне проще создать новую таблицу и скопировать в неё данные со старой? Или все ж alter partition есть? -
Joined.
-
Дык посмотри в файловой системе - скорее всего одна партиция и будет. Поменять ключ партиционирования, насколько я помню, низзя, только пересоздать таблицу..
-
Привет всем! Чтобы добавить в обычное представление дополнительный столбец, надо пересоздавать его с replace или всё-таки есть какой-то простой способ добавить один столбец?
-
Всем привет. Подскажите пожалуйста, если заводить кластер - пару шардов, в которых пара реплик, какой баланстровщик является оптимальным для Кликхауса? Предполагается писать/читать через distributed таблицы. Можно ли использовать любой баланстровщик для несколько хостов для распределения нагрузки, кто что использует?
-
всем привет. подскажите плз, как в графане делать вывод нормальный из КХ?
у меня данные берутся не из tsdb, и попадают рандомно по событиям.
как сделать отсутстивие данных нулем? аналог встренного null_as_zero, ток он не работает,
Плагин версии 2.1.0 -
Писать через дистриб таблицы так себе идея, отказоустойчивость низкая выходит, потому что вход 1, упал дистриб кх, вы начнете терять данные, если запись синхронная.
-
Здравствуйте! Подскажите пож-та сделать в кх WHERE IN запрос?
Например у меня есть запрос такой где происходить выборка из БД по многому статусу используя WHERE IN в mysql:
SELECT * FROM table WHERE status IN (200, 404, 500)
Как такую сделать в кх? -
Эммм..так же?
-
Да
-
так же и написать.
-
Ааа) Понятно) Я просто по документацию не нашел или плохо искал)
-
балансировщик для чего вам нужен ? если просто проксировать запрос на какую-то тачку из кластера - любой. есть clickhouse-proxy
-
Всегда в таких ситуациях стоит сначала попробовать)
-
Спасибо всем!)
-
Всем привет! обновили кликхаус до 21.1.7.1. Обнаружили, что ранее работающий запрос аля SELECT t1.col1, t2.col1 FROM distributed_table1 as t1 JOIN distributed_table2 as t2 ON t1.col1 = t2.col1 WHERE t2.col1 > 0 валится с ошибкой «DB::Exception: Missing columns: t2.col1». При выборе фильтров по левой таблице все работает, при замене Distributed-таблиц на локальные также все работает. Подскажите, пожалуйста, может кто сталкивался с этим?
-
всем привет)
у нас сейчас несклько кликхаусов, на одном зукипер кластере.
подскажите плиз как правильно разделить зукипер на два кластера?
я уже переконфигурил кликхаусы чтоб они смотрели на разные инстансы, но как правильно разделить зукипер? -
-
> А потом переконфигурировать это в два кластере по 3 реплики.
вопрос как правильно вот это сделать? -
допустим, у вас есть такой конфиг на 3-х серверах для зукипера
server.1=host1
server.2=host2
server.3=host3
делаете такой конфиг на 6-серверах, рестартите зукиперы
server.1=host1
server.2=host2
server.3=host3
server.4=host4
server.5=host5
server.6=host6
убеждаетесь, что кх не потерял соединение с зукипером -
-
Да, просто на тачки проксировать. Я так понимаю можно в таком случае и nginx использовать просто. У clickhouse -proxy есть специфический крайне важный функционал? Спасибо за ответ!
-
ну почему-то тут часто про него пишут. мы подняли обычный нгинкс с дефолтным балансировщиком) он супер легкий и простой получается
-
спасибо, буду пробовать
-
> 2021.03.29 13:07:18.446063 [ 65574 ] {} <Error> Application: Access to file denied: /var/lib/clickhouse/tmp/
Проверяйте права папки кх -
Joined.
-
Если вы поддержали в конфигурации динамическую реконфигурацию и у вас версия позволяет такое, можно даже без лишних рестартов
https://zookeeper.apache.org/doc/r3.5.3-beta/zookeeperReconfig.html#sc_reconfig_file
в таком случае добавляйте по одной -
да в момент расширения зукипер кластера уже перешли на новую версию с этой штукой
-
Спасибо за информацию. Получается что данные можно потерять во время записи в таком случае. Мне кажется что есть в любом случае вероятность потерять данные, если нет механизма гарантии записи.
-
Верно, но тут вопрос в кейсах.
Все таки отказоустойчивость системы выше, когда вы пишите в шарды, ведь когда шард не доступен, можно писать в другой) -
Спасибо за информацию! Подумал о таком варианте изначально, для начала так мне подойдёт
-
Да, понял, спасибо. Кажется что балансировщиком можно и решить этот вопрос недоступности шардов.
-
create view default.test_view1 as select 1 as fir;
create or replace view default.test_view1 as select 1 as fir, 2 as tw;
select * from default.test_view1; -
Здравствуйте! Столкнулся тут со странной ошибкой. Воспроизвести можно так:
CREATE TABLE table_1 (
pu_id UInt64,
show_date DateTime,
pu_num String
) ENGINE = MergeTree(
) PARTITION BY toYYYYMM(show_date)
ORDER BY (show_date);
insert into table_1(show_date, pu_num, pu_id) values('2020-01-01 12:00:00', '1234454', 54234);
insert into table_1(show_date, pu_num, pu_id) values('2020-01-02 13:00:00', '1234454', 54234);
insert into table_1(show_date, pu_num, pu_id) values('2020-01-11 15:00:00', '123123', 32434);
CREATE TABLE table_2 (
pu_id UInt64,
pu_num String,
name_rus String)
ENGINE = Join(ANY, LEFT, pu_id) SETTINGS join_use_nulls = 1;
insert into table_2 values(32434, '123123', 'Имя_1');
insert into table_2 values(54234, '1234454', 'Имя_2');
select *
from (
select a.pu_id, a.pu_num, k.name_rus
from cub6.table_1 a
ANY LEFT JOIN cub6.table_2 k USING(pu_id) SETTINGS join_use_nulls = 1
)
where 1=1 -
Если убрать where 1=1 или убрать джоин, то ошибки нет
-
что за ошибка хоть ?
-
┌─pu_id─┬─pu_num─┬─name_rus─┐
│ 32434 │ 123123 │ Имя_1 │
└───────┴────────┴──────────┘
┌─pu_id─┬─pu_num──┬─name_rus─┐
│ 54234 │ 1234454 │ Имя_2 │
└───────┴─────────┴──────────┘
┌─pu_id─┬─pu_num──┬─name_rus─┐
│ 54234 │ 1234454 │ Имя_2 │
└───────┴─────────┴──────────┘
21.4 -
Какая версия?
-
Code: 10, e.displayText() = DB::Exception: Not found column k.pu_id in block. There are only columns: pu_id (version 21.3.3.14 (official build))
-
Это только в 21.4 исправлено?
-
21.3.3.14
-
Это только в 21.4 исправлено?
Не уверен, возможно и в 21.3
я бы попробовал обновится до последней 21.3 -
Ща попробую
-
Не-а.
Code: 10, e.displayText() = DB::Exception: Not found column k.pu_id in block. There are only columns: pu_id (version 21.3.4.25 (official build)) -
А 21.4 где взять попробовать?
-
Releases · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Release v21.4.1.6364-testing · ClickHouse/ClickHouse
ClickHouse testing release v21.4.1.6364-testing
-
-
@ajIeks @dj_mixer FYI: этот PR ( https://github.com/ClickHouse/ClickHouse/pull/22228 ) имплементирует все, что мы тогда обсуждали. Если хотите, можете поэкспериментировать с билдами которые в нем в CI строятся. Описание и пример типичного конфига в config.xml и доках LDAP там же.
-
Супер, спасибо )
-
Может settings попробовать перенести в конец запроса, а не писать его между join и where?
-
не помогает
-
здрасте, а есть функция с jsonом, чтобы на уровне запроса положить туда новый ключ-значение?
-
(когда хочется поиграться с костылями немного)
-
UPDATE в clickhouse нет
-
мне на уровне select'а надо
-
чтобы не просто мой json с диска достать, но присрать к нему по дороге еще одно поле
-
Добрый день, а есть какой-то более быстрый способ удаления таблицы (~500 гигабайт), drop (или truncate) table не выполняется, ошибка read timeout. Timeout установлен в 2 часа. Эта таблица использовалась как приемник данных из материализованного представления для чтения данных из Kafka? Материализованное представление нельзя удалить пока не удалится эта таблица. В этой таблицы не были спроектированы PARTITION, кроме одного.
-
можно разрезать json в нужном месте, а потом собрать через concat, но эт криво
-
а пример есть?)
-
Всем привет. А подскажите пожалуйста по поводу такой ситуации:
У меня есть CH кластер, 2шарда, по 3 узла в каждом. Предположим я подключаюсь к одному любому узлу, и делаю CREATE TABLE..ON CLUSTER, создаю поверх этой таблицы Distributed представление ON CLUSTER, и начинаю инсертить туда данные(прямо в Distributed таблицу). Что будет с данными, если инсертить я начну до того, как таблица, и distributed представление выполнятся на соседнем шарде? Потребуется ли мне, в таком случаи, как-то ребалансить данные? Я бы хотел понять, как будет действовать CH, в такой ситуации. -
-
-
datetime64(3)
-
спс
-
Подскажите
Имеется таблица clicks(id, clicked_date, clicked_at, geo_id, user_agent_id, language_id, value_1, value_2, value_3)
При первом клике прилетают данные без колонок value (123, ’2021-03-28’, ‘2021-03-28 12:56:39’, 1, 1, 1)
При повторном клике только id и данные по колонкам value
Можно ли вставить новые данные, но чтобы подтянулись старые и дополнились новыми, что-то типа (123, ’2021-03-28’, ‘2021-03-28 12:56:39’, 1, 1, 1, ‘value_one’, ‘value_two’, ‘value_three’)
Может кто тыкнет в документацию или скажет куда копать? -
если устроит в конец, можно регуляркой
SELECT
json,
replaceRegexpOne(json, '}$', ',"newkey":"newval"}') AS newjson
FROM
(
SELECT '{"s":"str","d":"2021-03-19"}' AS json
)
FORMAT Vertical
Row 1:
──────
json: {"s":"str","d":"2021-03-19"}
newjson: {"s":"str","d":"2021-03-19","newkey":"newval"} -
-
Если кого-то тоже волнует этот вопрос, нашел такое
https://github.com/ClickHouse/ClickHouse/issues/11887#issuecomment-648840215Clickhouse sharding rebalance records · Issue #11887 · ClickHouse/ClickHouseHello In my scenario for testing have a 2 shard hosts If a host-A in shards turn off And the query data are INSERT into host-b in shards What happens after host-A in shards if turned on? are recor...
-
Joined.
-
Коллеги, всем привет! можете подсказать, как можно из кликхауса подтягивать данные в гугл таблицы?
-
Joined.
-
вопрос из разряда пальцем в небо.
есть 3млн. сообщений в кафке, их нужно вычитать и положить в базу клика.
вопрос. хватит ли 8CPU/64RAM что бы 99% делать чтение из кафки и запись на hdd. и 1% строить отчеты с глубиной в 6-12 часов? -
3 миллиона для клика - ну это несерьёзно :) У нас три миллиарда записей уже в базе и ниче, шуршит себе. Так что такого конфига должно хватить...
Ну разве что hdd будет грустно, лучше, конечно, SSD под это юзать. -
3 миллиона сообщений в кафке за какой период времени?
-
в 1 секунду
-
Широкая таблица?
В среднем одна кафка таблица с 1 консьюмером читает ~300k-400 сообщений в секунду.
https://github.com/ClickHouse/ClickHouse/pull/11388#issuecomment-638893203Better settings for Kafka by filimonov · Pull Request #11388 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the cha...
-
20-30 столбиков
-
а в килобайтах?
-
у меня одна запись 520 байт, это 20 полей, которые парсятся и складываются в формате json в кафку.
-
скорее всего 8CPU не хватит для 520 байт * 3млн в сек.
это много, это 1.5ГБ в сек, ну и сеть 10 гбит -
А диск какой? Нужны ли raw записи, или вы хотите складывать сразу в агрегаты?
-
это raw записи, складываются в клик, по некоторым полям делаются отдельные view
-
диск пока под вопросом. я пытаюсь посчитать IO, не очень понимания как это сделать, при учете что пишутся блоками данные, а не пермманентно
-
пока можно принять диск супербыстрым.
-
скорее всего я бы начал тестить с 24 или 48 cpu
-
И наверное несколько серверов тогда уж, хм
-
Пока 3 клика планирую. Идеальный вариант что 3 ноды с одинаковыми данными.. более реальный сценарий - 3 ноды с ращными данными
-
Ну после того как кх собрал парт из данных кафки, обмен по протоколу репликации гораздо дешевле выйдет.
-
Господа, доброго времени суток!
Переехали на новую версию зукипера, перенесли данные, появились такие ошибки:
chi-clickhouse-db-org-sim-default-1-1-0:2021.03.29 14:22:48.188912 [ 1 ] {} <Error> Application: Caught exception while loading metadata: Code: 231, e.displayText() = DB::Exception: The local set of parts of table db.entity_agg_count │
│ doesn't look like the set of parts in ZooKeeper: 2.99 thousand rows of 2.99 thousand total rows in filesystem are suspicious. There are 12 unexpected parts with 2988 rows (11 of them is not just-written with 2988 rows), 0 missing part │
│ s (with 0 blocks).: Cannot attach table db.entity_agg_count from metadata file /var/lib/clickhouse/metadata/db/entity_agg_count.sql from query ATTACH TABLE entity_agg_count (`entity_id` UUID, loc_campus_id UUID, `loc_building_id │
│ UUID, `loc_ward_id UUID, loc_floor_id UUID, loc_room_id UUID, start_of_hour DateTime, deleted_at Nullable(DateTime), dirty AggregateFunction(argMax, UInt64, DateTime), clean AggregateFunction(argMax, UInt64, DateTime), │
│ occupied AggregateFunction(argMax, UInt64, DateTime), occupied_infected AggregateFunction(argMax, UInt64, DateTime), dirty_infected AggregateFunction(argMax, UInt64, DateTime), working AggregateFunction(argMax, UInt64, DateTim │
│ e), broken AggregateFunction(argMax, UInt64, DateTime)) ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/{shard}/db/entity_agg_count', '{replica}') PARTITION BY toYYYYMM(start_of_hour) PRIMARY KEY (loc_campus_id, start_of │
│ _hour, entity_id) ORDER BY (loc_campus_id, start_of_hour, entity_id, loc_ward_id, loc_building_id, loc_room_id, loc_floor_id) SETTINGS index_granularity = 8192, Stack trace (when copying this message, always include the lines below): │
│ chi-clickhouse-db-org-sim-default-1-1-0:0. Poco::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x10541260 in /usr/bin/clickhouse │
│ chi-clickhouse-db-org-sim-default-1-1-0:1. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x8f3f72d in /usr/bin/clickhouse │
│ chi-clickhouse-db-org-sim-default-1-1-0:2. DB::StorageReplicatedMergeTree::checkParts(bool) @ 0xd78d873 in /usr/bin/clickhouse │
│ chi-clickhouse-db-org-sim-default-1-1-0:3. DB::StorageReplicatedMergeTree::StorageReplicatedMergeTree(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1: │
│ :char_traits<char>, std::__1::allocator<char> > const&, bool, DB::StorageID const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, DB::StorageInMemoryMetadata const&, DB::Context&, std::_ │
│ _1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, DB::MergeTreeData::MergingParams const&, std::__1::unique_ptr<DB::MergeTreeSettings, std::__1::default_delete<DB::MergeTreeSettings> >, bool) @ 0x │
│ d79027c in /usr/bin/clickhouse │
│ chi-clickhouse-db-org-sim-default-1-1-0:4. ? @ 0xdb22c0a in /usr/bin/clickhouse │
│ chi-clickhouse-db-org-sim-default-1-1-0:5. std::__1::__function::__func<std::__1::shared_ptr<DB::IStorage> (*)(DB::StorageFactory::Arguments const&), std::__1::allocator<std::__1::shared_ptr<DB::IStorage> (*)(DB::StorageFactory::Argum │ -
│ ents const&)>, std::__1::shared_ptr<DB::IStorage> (DB::StorageFactory::Arguments const&)>::operator()(DB::StorageFactory::Arguments const&) @ 0xdb262e7 in /usr/bin/clickhouse │
│ chi-clickhouse-db-org-sim-default-1-1-0:6. DB::StorageFactory::get(DB::ASTCreateQuery const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, DB::Context&, DB::Context&, DB::ColumnsDescrip │
│ tion const&, DB::ConstraintsDescription const&, bool) const @ 0xd6aed30 in /usr/bin/clickhouse │
│ chi-clickhouse-db-org-sim-default-1-1-0:7. DB::createTableFromAST(DB::ASTCreateQuery, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<cha │
│ r>, std::__1::allocator<char> > const&, DB::Context&, bool) @ 0xd06cdce in /usr/bin/clickhouse │
│ chi-clickhouse-db-org-sim-default-1-1-0:8. ? @ 0xd06352f in /usr/bin/clickhouse │
│ chi-clickhouse-db-org-sim-default-1-1-0:9. ? @ 0xd063d15 in /usr/bin/clickhouse │
│ chi-clickhouse-db-org-sim-default-1-1-0:10. ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::__1::__list_iterator<ThreadFromGlobalPool, void*>) @ 0x8f6492b in /usr/bin/clickhouse │
│ chi-clickhouse-db-org-sim-default-1-1-0:11. ThreadFromGlobalPool::ThreadFromGlobalPool<void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()>(vo │
│ id&&, void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()&&...)::'lambda'()::operator()() const @ 0x8f65608 in /usr/bin/clickhouse │
│ chi-clickhouse-db-org-sim-default-1-1-0:12. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x8f637eb in /usr/bin/clickhouse │
│ chi-clickhouse-db-org-sim-default-1-1-0:13. ? @ 0x8f61c33 in /usr/bin/clickhouse │
│ chi-clickhouse-db-org-sim-default-1-1-0:14. start_thread @ 0x76db in /lib/x86_64-linux-gnu/libpthread-2.27.so │
│ chi-clickhouse-db-org-sim-default-1-1-0:15. __clone @ 0x12188f in /lib/x86_64-linux-gnu/libc-2.27.so │
│ chi-clickhouse-db-org-sim-default-1-1-0: (version 20.3.7.46 (official build)) │
│ chi-clickhouse-db-org-sim-default-1-1-0:2021.03.29 14:22:48.189081 [ 1 ] {} <Information> Application: Shutting down storages. │
│ chi-clickhouse-db-org-sim-default-1-1-0:2021.03.29 14:22:49.084815 [ 46 ] {} <Debug> SystemLog (system.metric_log): Will use existing table system.metric_log for MetricLog │ -
│ chi-clickhouse-db-org-sim-default-1-1-0:2021.03.29 14:22:49.089013 [ 46 ] {} <Debug> DiskLocal: Reserving 1.00 MiB on disk default, having unreserved 8.32 GiB. │
│ chi-clickhouse-db-org-sim-default-1-1-0:2021.03.29 14:22:49.168452 [ 1 ] {} <Debug> Application: Shut down storages. │
│ chi-clickhouse-db-org-sim-default-1-1-0:2021.03.29 14:22:49.169803 [ 1 ] {} <Debug> Application: Destroyed global context. │
│ chi-clickhouse-db-org-sim-default-1-1-0:2021.03.29 14:22:49.170099 [ 1 ] {} <Error> Application: DB::Exception: The local set of parts of table db.entity_agg_count doesn't look like the set of parts in ZooKeeper: 2.99 thousand rows of │
│ 2.99 thousand total rows in filesystem are suspicious. There are 12 unexpected parts with 2988 rows (11 of them is not just-written with 2988 rows), 0 missing parts (with 0 blocks).: Cannot attach table db.entity_agg_count from m │
│ etadata file /var/lib/clickhouse/metadata/db/entity_agg_count.sql from query ATTACH TABLE entity_agg_count (`entity_id` UUID, loc_campus_id UUID, loc_building_id UUID, loc_ward_id UUID, loc_floor_id UUID, loc_room_id UUID, ` │
│ start_of_hour` DateTime, deleted_at Nullable(DateTime), dirty AggregateFunction(argMax, UInt64, DateTime), clean AggregateFunction(argMax, UInt64, DateTime), occupied AggregateFunction(argMax, UInt64, DateTime), `occupied_infe │
│ cted` AggregateFunction(argMax, UInt64, DateTime), dirty_infected AggregateFunction(argMax, UInt64, DateTime), working AggregateFunction(argMax, UInt64, DateTime), broken AggregateFunction(argMax, UInt64, DateTime)) ENGINE = Rep │
│ licatedAggregatingMergeTree('/clickhouse/tables/{shard}/db/entity_agg_count', '{replica}') PARTITION BY toYYYYMM(start_of_hour) PRIMARY KEY (loc_campus_id, start_of_hour, entity_id) ORDER BY (loc_campus_id, start_of_hour, entity_id, l │
│ oc_ward_id, loc_building_id, loc_room_id, loc_floor_id) SETTINGS index_granularity = 8192 │
│ chi-clickhouse-db-org-sim-default-1-1-0:2021.03.29 14:22:49.170191 [ 1 ] {} <Information> Application: shutting down │
│ chi-clickhouse-db-org-sim-default-1-1-0:2021.03.29 14:22:49.170214 [ 1 ] {} <Debug> Application: Uninitializing subsystem: Logging Subsystem │
│ chi-clickhouse-db-org-sim-default-1-1-0:2021.03.29 14:22:49.170323 [ 44 ] {} <Information> BaseDaemon: Stop SignalListener thread │
│ chi-clickhouse-db-org-sim-default-1-1-0:stream closed -
1. вырубили старый и новый zoo и clickhouse на время опреации
2. подмаунтили диски от старого и нового во временный под
3. Копирнули из старых дисков в новый (все логи + все данные)
4. стартанули новый zoo, через zkCli.sh проверили, что новые данные появились
5. Включили clickhouse с новым адресом нового zoo -
>3. Копирнули из старых дисков в новый (все логи + все данные)
что? что такое данные? У ЗК данные в ОЗУ. -
Он при запуске откуда читает данные?
-
берет снепшот и накатывает журналы
-
Вот снепшоты и были, получается, перенесены
-
видимо вы взяли не все журналы или не с того зукипера который был последним
-
There are 12 unexpected parts with 2988 rows (11 of them is not just-written with 2988 rows), 0 missing parts (with 0 blocks).: Cannot attach table db.entity_agg_count
-
сколько записей в таблице всего?
-
обычно вроде 50% отсечка чтобы не стартовать
-
у вас 2988 это 50% ?
-
наверное это из-за кубернетиса, под терминейтнулся и просрал кеш ос в озу
-
Спасибо, покопаем в эту сторону. Есть вариант как- то gracefully завершить работу?
-
Или, например, вырубить clickhouse и экспорт журналов сделать
-
Привет. А насколько корректно делать выборку по значению из словаря?
dictGet() as testValue
from table
where testValue = 'test' -
Добрый день! Обновили кх с версии 20.10.6.27 до 21.2.2.5 и селекты стали медленнее в несколько раз:
20.10.6.27:
1 rows in set. Elapsed: 2.223 sec. Processed 1.42 billion rows, 22.69 GB (637.95 million rows/s., 10.21 GB/s.)
21.2.2.5:
1 rows in set. Elapsed: 16.375 sec. Processed 1.42 billion rows, 12.88 GB (86.59 million rows/s., 786.83 MB/s.)
Это по прогретым данным, запросы дёргали несколько раз.
Есть идеи что может так аффектить? Структуру таблицы и запрос могу скинуть. -
https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aissue+is%3Aopen+label%3Aperformance+label%3Av21.1-affected
https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aissue+is%3Aopen+label%3Aperformance+label%3Av21.2-affected -
корректно, но конечно это фулскан
-
Если надо фильтровать по словарю, то тогда join?
-
dictGet() as testValue
from table
where table.id in (select id from dictionary_table_reflection where val_col = 'test') -
Спасибо, а получится безопасно откатиться до 20.10?
-
да,
но вы разберитесь сначала в чем проблема, возможно есть простой workaround, иногда просто отключение какого-то optimize в settings -
Добрый вечер. Подскажите механику переноса данных между дисками в сторейдж полиси.
Сделал сторейдж полиси по примеру из доки (https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/mergetree/#table_engine-mergetree-multiple-volumes_configure) пункт с полиси moving_from_ssd_to_hdd.
Установил максимальный размер парта для переноса 300 байт. Создаю таблицу из 3 полей, записываю 1 строку.
system.parts пишет bytes_on_disk=212, disk_name=hdd_disk.
То есть, как я вижу, что данных меньше 300 байт, но данные уже на диске hdd.
Я неправильно смотрю размер парта? Или в чем может быть проблема?MergeTree | Документация ClickHouseMergeTree Движок MergeTree, а также другие движки этого семейства (*MergeTree) — это наиболее функциональные движки табл
-
Подскажите, пожалуйста, почему CH ругается на конфиг?
Junk after document element in '/etc/clickhouse-server/config.d/models_config.xml', line 2 column 0,
Содержимое файла models_config.xml
<catboost_dynamic_library_path>/path/to/my/libcatboostmodel.so</catboost_dynamic_library_path>
<models_config>/path/to/my/models/*_model.xml</models_config> -
максимальный размер парта? это о чем?
-
ээ 2 строки и все? без рутового элемента и заголовка?
-
Обернул в тег <yandex> - ругается "No element found in"
-
да, было всего 2 строки, как в мануале указано
-
<?xml version="1.0" ?>
<yandex>
<catboost_dynamic_library_path>/path/to/my/libcatboostmodel.so</catboost_dynamic_library_path>
<models_config>/path/to/my/models/*_model.xml</models_config>
</yandex> -
max_data_part_size_bytes
-
а кстати оно не факт что умеет * *_model.xml
-
указал без *, полный путь к файлу модели - все равно
No element found in '/etc/clickhouse-server/config.d/models_config.xml', line 1 column 0 -
и что в /path/to/my/models/*_model.xml
https://github.com/ClickHouse/ClickHouse/blob/090e558da4a93741dbe8de5415781fe1951d82c1/tests/integration/test_catboost_model_first_evaluate/model/model_config.xml ?
и права есть у пользователя КХ на чтение файла? -
увеличил до 1млн max_data_part_size_bytes
пишу строку insert into default.test_tab_ssd_to_hdd1(id, str) values(1, 'a');
все равно сразу на hdd уезжает -
да, на директории models права 755, на файл модели - 644
-
типа у вас так ?
<moving_from_ssd_to_hdd>
<volumes>
<hot>
<disk>fast_ssd</disk>
<max_data_part_size_bytes>1073741824</max_data_part_size_bytes>
</hot>
<cold>
<disk>disk1</disk>
</cold>
</volumes>
<move_factor>0.2</move_factor>
</moving_from_ssd_to_hdd>
и инсерты сразу идут на cold? -
да, сейчас скину свой конфиг
мб где-то слеп -
<storage_configuration>
<disks>
<disk_hdd>
<path>/opt/clickhouse-hdd/hdd/</path>
</disk_hdd>
<disk_ssd>
<path>/opt/clickhouse-ssd/</path>
</disk_ssd>
</disks>
<policies>
<hdd_policy>
<volumes>
<single>
<disk>disk_hdd</disk>
</single>
</volumes>
</hdd_policy>
<moving_from_ssd_to_hdd>
<volumes>
<hot>
<disk>disk_ssd</disk>
<max_data_part_size_bytes>1000000</max_data_part_size_bytes>
</hot>
<cold>
<disk>disk_hdd</disk>
</cold>
</volumes>
<move_factor>0.2</move_factor>
</moving_from_ssd_to_hdd>
</policies>
</storage_configuration>
<path>/opt/clickhouse-hdd/default/</path> -
таблица создается на 2х дисках, но данные сразу попадают на disk_hdd
-
и таблица создана settings storage_policy='moving_from_ssd_to_hdd' ?
сколько свободно на df -h /opt/clickhouse-ssd/ -
да, в system.tables storage_policy='moving_from_ssd_to_hdd'
df -h /opt/clickhouse-ssd/ - avail 1.1T -
должно работать, в логе КХ будут записи при инсертах DiskLocal: Reserving 1.00 MiB on disk disk_ssd, having unreserved 1.1T. посмотрите в лог
-
нет таких записей(
с disk_ssd есть записи только <Information> Context: Shutdown disk disk_ssd
перед выключением КХ -
таблицу создавал так
create table default.test_tab_ssd_to_hdd1
(id UInt8,
str String,
ver DateTime default now())
engine=ReplacingMergeTree(ver)
PARTITION BY toYYYYMM(ver)
ORDER BY id
SETTINGS index_granularity = 8192,
storage_policy = 'moving_from_ssd_to_hdd';
insert into default.test_tab_ssd_to_hdd1(id, str) values(1, 'a'); -
это видно только если уровень логирования trace
-
ну вот такие я вижу
<Debug> DiskLocal: Reserving 1.00 MiB on disk disk_hdd, having unreserved 2.91 TiB. -
ага, кажется получилось.
в конфиге указал вместо <max_data_part_size_bytes>1000000</max_data_part_size_bytes> - 100000000
теперь стал писать на ssd
Reserving 1.00 MiB это минимальный наверно размер который резервирует на диске, и нельзя ставить max_data_part_size_bytes меньше 1 мб? -
возможно, спрошу
-
это не критично для меня, просто хотел проверить как это работает
-
Joined.
-
-
Добрый вечер, подскажите
-
DB::Exception: Wrong number of fields in the partition expression: 1, must be: 0
-
что бы это значило - пытаюсь аттачнуть партицию
-
базы одинаковые (версия), таблицы одинаковые.
-
Joined.
-
команду и partition by от таблицы в студию
-
ALTER TABLE XXX ATTACH PARTITION 'all';
ENGINE = ReplicatedMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/xxx/xxx', '{replica}')
ORDER BY id
SETTINGS index_granularity = 8192 -
она маленькая )
-
А что за партиция all ?
-
drwxr-x--- 2 systemd-resolve systemd-journal 4096 Mar 18 15:09 all_0_30415_2174
drwxr-x--- 2 systemd-resolve systemd-journal 4096 Mar 14 10:11 all_30416_30499_15
drwxr-x--- 2 systemd-resolve systemd-journal 4096 Mar 14 08:13 detached
-rw-r----- 1 systemd-resolve systemd-journal 1 Mar 14 08:13 format_version.txt -
так называются
-
я незнаю почему так. видимо потомучто нет ключа
-
LTER TABLE XXX ATTACH PARTITION tuple();
-
это когда таблица из одной партиции
-
Спасибо
-
Ого, не знал, спасибо )
- 30 March 2021 (150 messages)
-
-
-
привет! подскажите за перевод времени, после перевода времени 28го марта вьюхи агрегирующие по toStartOfDay поломались
CREATE MATERIALIZED VIEW some_stuff_daily_mv
TO some_stuff_daily
AS SELECT
toStartOfDay(created_at) AS bucket,
SELECT bucket
FROM some_stuff_daily
ORDER BY bucket DESC
LIMIT 1
Query id: ff18c4ee-31cb-41b3-b60e-8b67470ed134
┌──────────────bucket─┐
│ 2021-03-30 01:00:00 │
└─────────────────────┘
думал единоразовый случай 29го, сегодня то же самое. Как сделать чтобы снова toStartOfDay во вьюхах (в селектах норм) приводил к 00:00:00? обязательно пересоздавать? -
Joined.
-
-
тык @BlackmorseMan
-
-
-
Всем привет! 👋
Кумекаем сейчас над SLI/SLO storage и думаем в чем хранить данные.
Как будто бы кажется, что ClickHouse прям отлично может подойти под задачу.
Делал ли кто уже подобное?
Текущий вопрос - как быть с обвязкой данных, чтобы потом селектить и фильтровать в дашбордах? -
-
Joined.
-
Мб graphite-clickhouse?
-
-
если умеете делать запросы и писать, - можно даж в графане делать дашни :)
-
Ну тогда своим софтом перекачивать разве что.
-
ну да, это была одна из первых мыслей 🙂
-
ну вам ж для бизнеса кроме как показывания статистик или что вам по задаче требуется, более не надобно. Если у вас уже имеется система наподобие графаны и вы знаете как строить там дашни чтобы показать бизнесу результаты, - постройте там
-
да, какой-то ETL надо бы изобрести
но сейчас пытаюсь понять, как бы организовать КХ, чтобы потом к нему обращаться той же Графаной -
-
у графаны есть datasource кликхаус
-
-
-
Из графаны либо sql запросы через датасорс, либо тот же graphite-clickhouse, тогда будет графитовский язык запросов. Решений с promql не видел
-
этот этап уже обговаривайте уже с бизнес представителями и уточняйте :)
-
-
Ну так от этих хотелок же и зависит какой будет OK, партиционирование и какие индексы.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
ИМХО (не убивайти, все-таки пока где-то я пробелю, где-то нет): часть данных через dictionary, и по functions работы со словарями мной была бы попытка исследовать и собрать.
Потом смотрите по перфам как отрабатывает запрос (по крайней мере, я так делаю), и удовлетворит ли вас время выполнения запроса. -
-
-
-
Вот тут (https://www.youtube.com/watch?v=5KQsNmRTQmg&ab_channel=HighLoadChannel) рассказывают +- про похожий кейс, когда они складывают все все данные каким-то образом и потом по ним строят че хочется бизнесу + какой-то мониторинг на этом крутят и даже что-то с аномалиями.
Может натолкнет на какие-то мыслиРазгоняем обработку событий до 1.6М/сек. Опыт Badoo / Александр Крашенинников (Badoo)Приглашаем на Saint HighLoad ++ 2021 20 и 21 сентября 2021, Санкт-Петербург, DESIGN DISTRICT DAA in SPB Программа, билеты и подробности - https://clck.ru/VmKaW -------- HighLoad++ Moscow 2018 Тезисы и презентация: http://www.highload.ru/moscow/2018/abstracts/4132 Три года назад на Highload++ я рассказывал, как мы построили масштабируемую систему near-realtime обработки событий. С тех пор она эволюционировала, в процессе росли объёмы, и нам приходилось решать задачи, сопутствующие любому проекту с нагрузкой — масштабирование, отказоустойчивость и прочие. В определённый момент мы достигли точки, когда потребовались радикальные меры, а именно — смена технологического стека. В докладе я расскажу, как мы заменили связку Spark + Hadoop на ClickHouse, в три раза сэкономили железо и увеличили нагрузку в пять раз (с 300 000 событий в секунду до 1 600 000 в пике). -------- Нашли ошибку в видео? Пишите нам на support@ontico.ru
-
-
Тут по ходу больше подойдёт victoria/loki, в них есть теги и в графане пользователь сам сможет ручками через раздел explore накидать запрос. В клике как эксперииентальная фича появился новый тип map, но с ним работает только пара функций. Можно попробовать использовать nested. Но чтобы пользователь мог сам ручками строить графики без sql по произвольным полям нужно брать metabase вместо графаны и раскладывать всё по отдельным колонкам.
-
привет
-
недавно обновили ClickHouse
не работают старые запросы -
select distinct "to"
from pcs_stats.send
any inner JOIN
(select event_uuid from pcs_stats.undelivered
where bounce_type = 'hard' and stream_type='email' and event_date>= '2019-05-01')
USING event_uuid
where event_date>= '2019-05-01' and event_date< '2019-08-01'
and stream_type='email' -
а версии КХ?
а что значит не работают? -
не активна кнопка
сейчас версия 20
была 1 -
всем привет, подскажите плз
Проблема:
- в компании используем КХ - у нас абсолютно все находится в одной таблице log.events, данных 10тб, 26к столбцов
- для того чтобы доставать данные порой приходится использовать множество джойнов и кликхаусу становится очень плохо
Для решения вопроса думаем:
1. либо использовать мат вьюхи для наиболее часто используемых ивентов или
2. чз airflow перекладывать данные в новые таблицы
Вопрос:
- Какие решения могут быть в данном случае еще и какие плюсы минусы и плюсы разных подходов
- Если выбирать из двух решений - мат вьхи или физически создавать чз эйрфло таблицы - какой лучше? С мат вьюхами не все гладко - новые данные пишутся с потерями -
"26к столбцов" - реально 26 тысяч столбцов в одной таблице??
-
+
-
вот я изначально топлю за ВМ, а менеджер хочет реляционку) думали найти компромисс в виде кх 🙂
-
26к столбцов😮😮😮
-
это наверно метрики целого мира
-
как оно вообще работает? как там инсерты и мержи поживают при таком раскладе?
-
один текст инсерта без данных несколько Мб занимать будет))
-
я б хотел посмотреть на эту таблицу
-
хотя возможно это что-то гугловский проект
-
-
Если у вас буквально все находится в одной таблице, то с чем вы тогда джойните ее?
-
Таблица одна и в ней лежат ивенты со срезами, джойню ивенты друг с другом.
Чтоб достать инфу об ивенте пишу select... from log.events where event = 'something'.
У всех ивентов общие два столбца event_date и event_time -
Привет. Есть таблица:
create table testdate
(
order_date DateTime64(6) DEFAULT '0000000000.000000'
)
engine = MergeTree
PARTITION BY toYYYYMM(order_date)
ORDER BY tuple()
SETTINGS index_granularity = 8192;
Пытаюсь вставить:
insert into testdate(order_date)
values ('2018-06-08T01:02:03.000Z');
Получаю ошибку:
DB::Exception: Cannot parse string '2018-06-08T01:02:03.000Z' as DateTime64(6): syntax error at position 23 (parsed just '2018-06-08T01:02:03.000')
Похоже что настройка https://clickhouse.tech/docs/ru/operations/settings/settings/#settings-date_time_input_format имеет значение basic, так как распознавание указанной при вставке даты возможно только при best_effort.
У меня таблица на движке MergeTree. Настройку date_time_input_format недозволено указать при создании таблицы. С связи с чем возник вопрос, где переопределить date_time_input_format, чтобы возможно было вставлять даты вида 2018-06-08T01:02:03.000Z?Настройки | Документация ClickHouseНастройки distributed_product_mode Изменяет поведение распределенных подзапросов. ClickHouse применяет настройку в тех с
-
Это пользовательская настройка. Можно в запросе, можно в сессии, можно в профиле пользователя установить
-
Добрый день! Может, кто сталкивался с подобной ситуацией или подскажет куда копать? Есть кластер из 10 нод, каждая нода имеет реплику. Запись событий происходит через одну ноду по схеме Buffer -> Distributed -> На какую-то из нод в соответствии с ключом шардирования. Стабильно раз в сутки (время обычно 24h + (1-4h)) клиенты отваливаются при попытке подключения к ноде, через которую идет запись событий. В метриках видно что количество TCP подключений при этом перестает расти. Рестарт клиентов никак не помогает восстановить подключение (очередь событий не рассасывается), помогает только рестарт ноды, к которой подключаются клиенты. На графике выглядит так
-
Версия CH - 20.4.4.18
-
Так может лучше будет делать GROUP BY ?
-
А в логе кх что?
-
в текстовых логах сервера ничего нет. Я про вот этот лог - clickhouse-server.log
-
Спасибо
-
ну попоробуйте 20.4.9.110
-
а это картинка что за приложение?
-
Спасибо. В лоб лучше не обновляться? В некоторых ревизиях смотрю есть обратнонесовместимые изменения. Лучше создать параллельно еще один кластер и перегнать данные? Или может есть опыт обновления с версии 20.4.4.18 до 20.4.9.110?
-
Если делается что-то простое (тупо метрики без всяких срезов и аггрегаций) и не требует доработок, то можно ВМ. Во всех остальных случаях - КХ. КХ гораздо гибче, но для просто метрик места на диске конечно будет занимать сильно больше чем ВМ.
-
как преобразовать 2021-03-17T08:37:06+03:00 (str) к 2021-03-17 11:37:06 (datetime) только средствами clickhouse?
-
Привет. Хочу перенести хост со сменой ip и hostname. В конфиге для хоста прописан макрос.
Нужно ли мне будет пересоздавать таблицы, или всё заведется из коробки? Смущают названия хостов в зукипере
SELECT name
FROM system.zookeeper
WHERE path = '/clickhouse/tables/0/table_name/replicas'
FORMAT TSV
hostname1
hostname2 -
Добрый день.
Не подскажете, как можно решить проблему:
- Из SQL через Samba выгружаю файлы CSV непосредственно в папки,
которые КХ создаёт для таблиц с движком File.
- Если в настройках конфигурации КХ заданы пути для папок не
по умолчанию (/var/lib/clickhouse), а к другому диску (HDD),
то КХ вместо "живых" папок создаёт symlink-и, к которым нет
доступа из Samba (вроде бы закрыли в связи с уязвимостью).
Есть ли какая-нибудь настройка КХ, чтобы на диске,
отличном от пути /var/lib/clickhouse создавались
живые папки для таблиц вместо symlynk-ов ? -
... объем выгружаемых данных большой, поэтому для
выгрузки из SQL используется утилита быстрой выгрузки
bcp.exe -
это багфиксы
-
Понял, спасибо!
-
SELECT parseDateTimeBestEffort('2021-03-17T08:37:06+03:00')
┌─parseDateTimeBestEffort('2021-03-17T08:37:06+03:00')─┐
│ 2021-03-17 05:37:06 │
└──────────────────────────────────────────────────────┘ -
UTC естественно
-
хост КХ сам записывает свой хостнейм в ЗК при старте, там обновится короче
-
-
в смысле в config.xml поправили уже ?
<!-- Directory with user provided files that are accessible by 'file' table function. -->
<user_files_path>/var/lib/clickhouse/user_files/</user_files_path> -
Да, поправил, но не для user_files:
-
Когда создаю таблицы подобным запросом, папки создаются как симлинки на папки ..\store\...
-
-
-
Это происходит из за того, что движок базы данных Atomic
-
В целом лучше использовать file table function а не file table engine.
-
INSERT INTO TABLE FUNCTION file(..)
-
Всем привет! А в кликхаусе есть ограничение на число создаваемых баз?
-
Уже пробовал. Проблем с симлинками там, действительно, нет.
Но приходится описывать кучу полей и типов в запросе,
чтобы из CSV загрузить. Если с движком File, то
при создании таблицы описывается один раз. -
Окей, в таком случае создайте новую базу данных с движком Ordinary и создавайте вашу таблицу там
CREATE DATABASE export ENGINE=Ordinary -
Про движок Ordinary только сейчас узнал, в документации не нашел
-
Есть ссылка на описание движка Ordinary ?
-
Самая лучшая документация это github
> Есть ссылка на описание движка Ordinary ?
Ordinary это тот движок что был раньше до Atomic -
Старый то есть
-
Здравствуйте! У меня есть БД с такой структурой:
Таблица для логов
CREATE TABLE access_logs
(
`request_id` String,
`timestamp` DateTime,
`user_agent` String,
`scheme` String,
`host` String
)
ENGINE = MergeTree
PARTITION BY toDate(timestamp)
ORDER BY (timestamp, host)
TTL timestamp + toIntervalWeek(1)
SETTINGS index_granularity = 8192;
Таблица для кафка
CREATE TABLE `access_logs_kafka`
(
`request_id` String,
`timestamp` DateTime,
`user_agent` String,
`scheme` String,
`host` String
)
ENGINE = Kafka
SETTINGS kafka_broker_list = 'kafka:9092', kafka_topic_list = 'access-logs', kafka_group_name = 'access-logs-consumer', kafka_format = 'JSONEachRow', kafka_row_delimiter = '\n', kafka_schema = '', kafka_num_consumers = 1, kafka_skip_broken_messages = 1;
MATERIALIZED VIEW таблица для логов
CREATE MATERIALIZED VIEW mv_access_logs TO default.access_logs
(
`request_id` String,
`timestamp` DateTime,
`user_agent` String,
`scheme` String,
`host` String
) AS
SELECT
request_id,
timestamp,
user_agent,
scheme,
host
FROM default.access_logs_kafka;
Хотел добавить новое поле в таблицу access_logs и при этом нужно было обновить таблицу mv_access_logs.
Все нужные поля в таблицу access_logs я добавил через запрос а таблицу access_logs_kafka создал заново.
Представление mv_access_logs отключил, чтобы перестать получать сообщения от Kafka.
Теперь не могу обновить представление добавляя новое поля и сделать обратно ATTACH.
Подскажите пожалуйста как быть в этом случае с представлением? -
Так представление данные не хранит, дропайте его и создайте заново
-
вы же правильным TO синтаксисом пользуетесь
-
Хотел сделать ATTACH но получил такую ошибку:
DB::Exception: Table 'default.mv_access_logs' already exists (detached) (version 21.1.2.15 (official build))
Как правильно включить обратно? -
Хм, зачем включать обратно?
-
Просто для практики
-
А как пишете ATTACH ?
ATTACH TABLE default.mv_access_logs; ? -
Спасибо ! С движком Ordinary всё работает.
-
Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 32 ('FORMAT'): FORMAT JSON. Expected one of: storage definition, ENGINE, AS, UUID, OpeningRoundBracket, ON, FROM, Dot, token (version 21.1.2.15 (official build))
-
У вас там что то дописывает FORMAT, вы через что запрос выполняете?
-
Grafana
-
попробуйте через clickhouse-client
-
Хорошо спасибо)
-
Ребята, привет. А подскажите самый простой способ перетащить таблицы в другую базу.
На ум приходит - создать в новой базе идентичную структуру,
Детачнуть партиции от старых таблиц,
Переместить их в detached каталог новой базы
Приаттачить.
Или есть какой-то более простой способ? -
Это в рамках одного сервера и инстанса clickhouse
-
перетащить?
RENAME TABLE -
🤦♂️ Большое спасибо :)
-
я сравнивал не по времени выполнения запроса Elapsed, а по количеству срок Processed
—
index_granularity=256. Elapsed: 0.527 sec. Processed 1.01 million rows, 58.99 MB (1.92 million rows/s., 111.95 MB/s.)
index_granularity=1024. Elapsed: 0.550 sec. Processed 1.77 million rows, 72.48 MB (3.22 million rows/s., 131.87 MB/s.)
index_granularity=4096. Elapsed: 0.637 sec. Processed 4.39 million rows, 116.25 MB (6.89 million rows/s., 182.42 MB/s.)
index_granularity=8192. Elapsed: 0.591 sec. Processed 6.42 million rows, 147.89 MB (10.85 million rows/s., 250.06 MB/s.)
получилось что у index_granularity=256 меньше всего Elapsed
я так понимаю, что запрос оптимальнее использует индекс при 256 -
метрики с пачкой метаданных, из которых потом будут высчитываться и публиковаться SLO
-
Посоветуйте пожалуйста, как решить такую проблему:
Есть distributed таблица на 3 шарда и несколько дней назад один из INSERT-ов в нее упал с ошибкой Too many partitions for single INSERT block
С тех пор этот INSERT перезапускается каждые 30 секунд и успешно падает с той же ошибкой (судя по `query_log`)
Что особенно неприятно, с момента возникновения проблемы, начало копиться количество DistributedFilesToInsert, то есть часть данных перестало распределяться по шардам
Как можно убить этот повторяющийся INSERT? -
вы уберите лимит max_partitions_per_insert_block
cat /etc/clickhouse-server/users.d/max_partitions_per_insert_block.xml
<?xml version="1.0"?>
<yandex>
<profiles>
<default>
<max_partitions_per_insert_block>0</max_partitions_per_insert_block>
</default>
</profiles>
</yandex> -
или удалите .bin файл который упоминается в сообщении
-
Да, убрали, но похоже этот запрос запомнил первичные параметры
['use_uncompressed_cache','load_balancing','max_memory_usage','max_partitions_per_insert_block','input_format_allow_errors_num','input_format_allow_errors_ratio']
['0','random','10000000000','100','1000000','1'] -
Возможно это связано с материализованными вьюхами, которые работают поверх шардов, как тут: https://github.com/ClickHouse/ClickHouse/issues/12530 (тоже записи в логах каждые 30 секунд)
Пробовали деаттачить несколько вьюх с большим количеством партиций - не помоглоMultiple sending data from a distributed table · Issue #12530 · ClickHouse/ClickHouseTwo shards without replication, version CH 20.4.5.36. Create local Main_Tab tables Create a Distributed table for Main_Tab tables - Distr_main_tab Create a MaterializedView - MV and Tab - target ta...
-
При использовании LowCardinality(String), как КХ хранит словарь? Он привязывает его к таблице, колонке, или использует глобальные словари?
-
хранится внутри парта
-
Т.е. отдельный словарь на парт, правильно?
-
Да, грубо говоря так
-
Спасибо, а не грубо говоря? Можно сложно, я пойму 🙂
-
Denny Crane [Junior support specialist at Altinity (NB,Canada)] in ClickHouse не тормозит
словарь локален в парте. в каждом парте есть свои файлики имяполя.dict... вроде для строк не должно быть никаких downside от LowCardinality я проверяю для каждой колонки, имеет смысл или нет, делаю копию таблицы с одним днем и конверчу в LowCardinality
-
Ясно, спасибо!
-
-
Всем привет. Кто-то внедрял движок RabbitMQ ?
https://clickhouse.tech/docs/ru/engines/table-engines/integrations/rabbitmq/
Как он работает? После создания таблицы в RabbitMQ появились соответствующие ему очереди. Но у них нет консумеров. В чем тогда смысл этого движка ? Если очередь не разбирается.RabbitMQ | Документация ClickHouseRabbitMQ Движок работает с RabbitMQ. RabbitMQ позволяет: Публиковать/подписываться на потоки данных. Обрабатывать потоки
-
Спасибо!
-
он работает точно так же как kafka движок
https://altinity.com/blog/2020/5/21/clickhouse-kafka-engine-tutorialClickHouse Kafka Engine TutorialOur colleague Mikhail Filimonov just published an excellent ClickHouse Kafka Engine FAQ. It provides users with answers to common questions about using stable versions, configuration parameters, standard SQL definitions, and many other topics. Even experienced users are likely to learn something new. But what if you are getting started and need help setting up Kafka and ClickHouse for the first time? Good news! This article is for you.
-
Вы не прочли про использование таких таблиц в тандеме с мат вьюхами
-
Прочел и создал вьюху. В ней ничего, после того как сообщения попало в очередь. Как я уже написал консумеров нету, так что кто кладет сообщения в кликхаус - непонятно.
-
rabbitmq движок постоянно читает из rabbit и используя мат.вью складывает в таблицу
-
что значит "консумеров нету"? Engine и есть консьюмер
-
Я в Рэббит захожу, он показывает, что консумеров нет. И из очереди ничего не читается.
-
Таблица же не может быть консьюмером. Консьюмер это некий процесс, слушающий очередь, который видимо должен быть поднять движком CH, но этого не происходит.
-
это engine=rabbitmq и есть, фактически это создает в джоб в пуле который ломится в раббит постоянно
-
Ну вот этого джоба нет. Он не поднят.
-
в лог кх смотрели?
-
@AlexanderRomanov46 попробуйте сделать селект таблицы с раббит движком
-
Это поможет понять, есть коннект к раббиту или нет
-
Выкатывал кто модуль в графану? что-то plugin not found при добавлении datasource в виде файла, при том что в плагинах оно стоит
-
type: clickhouse
(было ClickHouse как в вебе, но уже нашёл что нужно преобразовать к мелким буквам) - 31 March 2021 (158 messages)
-
Привет, есть таблица вида:
UsedId UInt64, ClassificationTime DateTime, Class Enum.
Которая ежедневно обновляется.
Требуется получить из нее RangeHashed словарь: класс пользователя от ClassificationTime до NextClassificationTime.
----
Моя предполагаемая архитектура выглядит следующим образом:
1. Через Airflow(в общем не важно через что) строится новая таблица UserID, StartDT, EndDT, Class.
2. Где для каждой новой записи UserID, StartDT = ClassificationTime, EndDT = Null.
3. А предыдущая запись этого пользователя изменяется EndDT = ClassificationTime.
----
Так вот, кажется что это далеко не самый простой и оптимальный способ достигнуть желаемого.
Как минимум хочется избавится от ALTER TABLE UPDATE.
Помогите советом:) -
не запускается сервер от пользователя clickhouse права есть на папку, в логе пишет, что нет прав\
-
из консоли точно пробовали запускать? лог на какую папку ругается?
-
часть папок была с правами на рута, решилось настройкой всех папок на clickhouse
-
Всем привет!
Подскажите, пожалуйста, есть ли способ в КХ делать маскирование данных на уровне постоянных правил на выборку из таблицы?
Управляемых, дабы можно было отменить
Плюс
Можно ли присваивать столбцам псевдонимы (алиасы)? -
Первый вопрос, вероятно, решается вьюхами;
Второй — https://clickhouse.tech/docs/ru/sql-reference/statements/create/table/#aliasТаблица | Документация ClickHouseCREATE TABLE Запрос CREATE TABLE может иметь несколько форм, которые используются в зависимости от контекста и решаемых
-
Благодарю)
-
Всем привет. Может кто подсказать можно ли читать данные через kafka engine из двух разных кластеров кафки. При этом консьюмер группы и топики одинаково называются. Просто в списках брокеров перечислены брокеры из двух кластеров. Не может ли возникнуть каких то проблем в таком случае?
-
Всем привет, скачал бинарник КХ для MacOS, запустил. работает шустрее чем в докере, но не запускается с флагом —daemon никаких ошибок не выдаёт, просто не работает. Приходится держать отдельное окно консоли.
Кто-нибудь сталкивался? -
Привет всем! Подскажите, можно ли через стандартный ado.net с помощью odbc подконнектиться к clickhouse?
-
вроде как оффсет хранится в косьюмер группе. тк группа одна а топика два - непонятно какой оффсет сейчас у топика. у одного может быть 1 а у друго 10к
вообще лучше сделать 2 разные таблицы для такого. -
А потом как то агрегировать данные из двух таблиц? Просто трафик делится между 2 кластерами, данные одинаковой структуры но содержимое разное. Я бы хотел читать данные из двух кластеров в одну таблицу. Вижу стали появляться в одном из CH (всего у меня их два в кластере, таблица реплецируемая), такие сообщения ошибок.
-
Ну так сделайте две таблицы с кафкой и повесьте 2 mv которые будут инсертить в вашу таблицу
-
-
да можно
но зачем ? если есть
куча библиотек для C# ?
https://clickhouse.tech/docs/en/interfaces/third-party/client-libraries/Client Libraries | ClickHouse DocumentationClient Libraries from Third-party Developers Disclaimer Yandex does not maintain the libraries listed below and hasn’t d
-
-
formatDateTime(time, '%Y%m%d%H')
-
спс, сделаю такой ключ партиционирования
-
главное за большой период не храните с таким ключом)
-
да, знаю, у нас там сутки +-
-
1. Посмотреть разные варианты коннекта
2. Я так понял odbc яндекс тестирует, а стороннее возможно с ошибками -
-
у нас такие бывают когда запрос выполняется дольше таймаута выставленного на самом клиенте
-
спасибо может быть. тк кастомный таймаут я не ставлю
-
Всем привет. Есть таблица с движком ReplicatedReplacingMergeTree. Заливаю туда данные с небольшим количеством дублей. Потом запускаю OPTIMIZE TABLE table_name FINAL. И временами запрос успешно заканчивает исполнение, но процесс оптимизации еще длится. И дубли остаются. Если запустить этот же запрос еще раз, обычно после его окончания дубли пропадают. Можно ли с этим что-то сделать? Есть ли способ отследить, что дедупликация еще идет, даже если запрос отработал?
-
-
-
запрос отрабатывает на реплики, потом еще в фоне смерженные парты реплицируются
вы потом читаете из таблицы напрямую? с той же реплики? или через лоадбалансер? -
С той же реплики
-
паралельно с OPTIMIZE FINAL идут INSERT ?
-
нет
-
-
Всем привет. Пусть у нас есть Replicated*MergeTree таблица и Distributed к ней. И мы хотим сделать колонку ALIAS, MATERIALIZED или прописать DEFAULT. Правильно я понимаю, что это всё нужно сделать только в Replicated таблице, а в Distributed указать только тип колонки?
upd. А нет, неправильно понимаю. Как минимум инсерт в Distributed не работает так. -
а чего спам-бота не удалили?
-
подскажите возможно ли здесь разместить вакансию?
-
Доброго времени суток! Прошу помощи: пытаюсь с помощью ansible создать таблицы в БД, но не получается, таск выглядит следующим образом:
- uri:
url: "http://{{ clickhouse_server }}/"
body: "{{ lookup('file', 'request.txt') }}"
Clickhouse, при выполнении возвращает 200, но таблицы не появляются. При этом через clickhouse-client таблица создаётся нормально. -
Смотрел доку https://clickhouse.tech/docs/ru/interfaces/http/, вроде делаю аналогично ей.HTTP-интерфейс | Документация ClickHouse
HTTP-интерфейс HTTP интерфейс позволяет использовать ClickHouse на любой платформе, из любого языка программирования. У
-
Alexey Milovidov in ClickHouse не тормозит
Привет. Можно, если вакансия связана с ClickHouse.
-
Работаю с КХ из питона через clickhouse-driver
В базе есть таблицы с колонками различных хэшей хранящихся как сырые байты в FixedString() и колонки с обычными строками в String().
Столкнулся с проблемой автоматической конвертации типа значений для строк в драйвере.
У драйвера есть поддержка опции 'strings as bytes', но при её передаче все типы строк возвращаются как байты.
Есть ли возможность указать какие именно колонки в запросе не декодировать и отдавать в сыром виде? -
Добрый день! напомните пожалуйста как КХ сказать, чтобы он использовал диск для группировок если памяти не хватает?
-
max_bytes_before_external_group_by
-
спасибо!
-
Здравствуйте! У меня к вам вопрос по поводу сохранение IP пользователя полученного с nginx в таблицу. Сейчас в таблицу попадает 2 IP в виде комбинированная строка с запятой такого вида с nginx-а через Kafka:
193.106.50.49, 185.66.84.182
Тут 1-й IP 193.106.50.49 мой реальный адрес а 2-й не нужный адрес. Как мне в таблице сохранить только реальный адрес пользователя избавляясь от не нужной?
Просто возможно ли это сделать в SELECT-е MATERIALIZED VIEW таблицы который слушает таблицу с ENGINE Kafka с встроенными функциями clickhouse-а?
Я с nginx отправляю IP пользователя таким образом:
"real_ip":"$proxy_add_x_forwarded_for"
$proxy_add_x_forwarded_for - поле заголовка запроса клиента “X-Forwarded-For” и добавленная к нему через запятую переменная $remote_addr. Если же поля “X-Forwarded-For” в заголовке запроса клиента нет, то переменная $proxy_add_x_forwarded_for равна переменной $remote_addr. -
до конца не понятно, но кажется вам нужно вот это:
splitByChar(',','193.106.50.49, 185.66.84.182')[1] -
Да примерно так. А что если значение равно только 193.106.50.49 и не существует в нём запятая? В этом случае этот функция вернет мне значение 193.106.50.49 ?
-
А почему вы боитесь сами попробовать?)
SELECT splitByChar(',', '193.106.50.49')[1]
Query id: c2247662-8ac6-4c93-ad14-388050d93107
┌─arrayElement(splitByChar(',', '193.106.50.49'), 1)─┐
│ 193.106.50.49 │
└────────────────────────────────────────────────────┘ -
Спасибо Константин) 😉👍
-
всем привет! clickhouse с понедельника начал пропускать строки для материализированной вьюхи, таблица для вьюхи ReplicatedMergeTree, пропускать начал когда один из серверов упал, после того как сервер подняли строки все еще пропускаются :(, с чего начать копать? версия 19.17.4.11
-
Зачем? Кажется это ни на что не повлияет
-
Может вы оптимайз запускаете когда инстерт еще не закончился? Например дистрибьютид таблица еще пишет
-
-
Всем привет!
Имеется таблица ReplicationMergeTree.
После записи данных в нее данные не сразу схлопываются по order byю
Правильно ли будет после окончания инсертов - делать optimize final на партиции в которые были вставлены данные? -
Добрый день! подскажите пожалуйста можно ли подключить clickhouse в качестве datasource к SAP BO и как это можно сделать?
-
select toDate(concat(toString(2021),'-',toString(3),'-01'))
-
Спасибо!!!!
-
-
В логи кх надо смотреть. Вью писала в дистрибьютид таблицу? Репликация есть?
-
глянул в part_log пока, на одном из серверов там бесконечная ошибка 389, репликация есть
-
Я как-то сразу через screen делал. Можно возвратиться к сессии чтобы потом.
-
-
Можно подробнее?
-
-
это для сервиса нужно, свои заморочки в очистке старых данных
-
Лучше конечно показать, поэтому смело: brew install screen (или какой другой у вас менеджер пакетов), а потом в Ютуб с запросом 'screen linux' я бы порекомендовал)) Есть видео минут там 8-10, небольшое совсем, на убунте все наглядно и понятно с хоткиями)
-
Я запускаю optimize, когда отрабатывает insert. Он может чтото еще вставлять после окончания запроса?
-
Подскажите, пожалуйста, могу ли как-то выполнить подобный запрос?) К ПРИМЕРУ, хочу посчитать количество запросов на всех хостах ?
как можно передать результат подзапроса в remote?
WITH
(
SELECT arrayStringConcat(groupArray(host_name), ',')
FROM system.clusters
WHERE cluster = 'xxx'
) AS hosts
SELECT count()
FROM remote(hosts, system, query_log) -
что такое 389 ? копи пейст можно увидеть?
-
инсерт через дистрибьютид асинхронный по умолчанию
-
через ODBC ?
ничего про sap не знаю, там была шутка, про то что сап выгоднее продавать чем КХ. -
это селект from system.part_log, там в колонке error - 389, в exception пусто
-
это не копи-пейст
-
А. понятно, А вы случайно не знаете, можно ли подключить кликхаус к sap bo?
-
-
зачем это надо?
есть clusterAllReplica он сразу ко всем хостам кластера делает запрос -
так нету delete. Alter table delete это специфическая операция которая перезаписывает всю таблицу и должна выполняться только вручную админом не чаще чем раз месяц
-
напряму не знаю, но sap можно подключить к Greenplum, к которому можно подключить таблик в CH через PXF как внешнюю
-
-
А, я неточно выразился, у нас не distributed, просто две реплики, в одну льем, во вторую улетает само. Все запросы - на одной и той же реплике
-
Привет! Кто то сделал парсер для user agent от nginx-a для добавление данные устройства в таблицу кликхаус?
Пример данных:
"Mozilla\/5.0 (iPhone; CPU iPhone OS 14_4_1 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/14.0.3 Mobile\/15E148 Safari\/604.1" -
Просто таблица довольно большая , не перегрузит ли CH и Greenplum сервак?
-
-
Хочу одним запросом вытащить количество из system.processes для каждого хоста на самом деле. clusterAllReplicas подходит!
-
Вангую, что во время запуска шли другие мерджи, тогда OPTIMIZE мерджит что осталось а не всё. Оптимайз нужно запускать, когда в партиции нет мерджей.
-
Добрый день. В нашей системе отображается несколько виджетов. Количество данных в этих виджетах примерно 20 млн записей. Причем есть виджеты типа "таблица" где показывается достаточно большой объем данных и нет индексов, поскольку каждый юзер может крутить и аггрегировать данные как ему вздумается. Одновременных юзеров примерно 5000. Какие есть способы для увеличения производительности кроме создания реплик?
-
Подскажете, как это проверить?
-
select table,floor(elapsed,2) as elapse,floor(progress,2) as prog,floor((elapsed/progress)*(1-progress),2) as estima,result_part_name, num_parts as n from system.merges order by estima asc;
-
Например, там некоторые колонки сокращены, что бы влазило в терминал
-
Например, там названия некоторых колонок сокращены, что бы влазило в терминал
-
Спасибо, попробую.
-
подскажите,если ли настройка позволяющая включить автоматический optimize после вставки данных?
нашел который производится перед вставкой, но интересует как раз таки оптимизация после добавления новых данных -
Не нАДО этого делать
если у вас нужен optimize после каждой вставки
у вас проблемы с ахтитектурой и не пониманием того как именно работает MergeTree и почему сортировка слиянием дорого... -
У нас имеются таблицы replacing merge tree и после всех вставок, дубликаты удаляются довольно долго.
хочется ускорить данный процесс -
варианты:
- не вставляйте дубликаты
- делайте SELECT distinct *
- делайте SELECT FROM table FINAL -
Добрый день! Кто-то сталкивался с такой проблемой: При подключении к кликхаусу через ODBC - в power query кол-во столбцов гораздо больше, нежели в представлениях (отчеты, данные и модель). Пользовался вот такой статейкой при подключении. https://medium.com/@annu.nmit/connecting-to-clickhouse-database-server-from-power-bi-864e950d83e2Connecting to ClickHouse database server from Power BI
I needed to build a dashboard in Power BI for a client whose data was stored in a ClickHouse database. ClickHouse is an open source…
-
спасибо большое!
-
в чем выражается "больше"? появляются несуществующие физически столбцы? в них нет данных? как выглядят?
-
Всем привет. Подскажите, CH будет писать на диск до тех пор пока не достигнит 100%, а потом перейдет в RO, или это случится до достижения 100%?
-
Лучше оставлять намного больше свободного места, потому что не просто уйдет в read-only, но и мержи перестанут проходить, так что может быть весьма нелегко потом вернуть всё как было.
-
в базе 228 столбцов, в power query тоже видны все, но в любом из представлений доступны только 31
-
предположим, я не переживаю о том, что часть данных я потеряю вовсе(из-за того что будут проблемы с мержами), я смогу нормально почистить место, если диск закончится?
-
Всем привет! В таблице есть UInt64 колонка и там лежит значение, например, 11604412194732607246. При селекте из нее через Clickhouse JDBC возвращется значение с последними 3-мя цифрами, замененными на нули: 11604412194732607000. Как быть?
-
Тоже интересно, как оптимизировать такие запросы
Кто с таким сталкивался?
Как решали? Или тут кликхаус не помощник? -
Там где фильтры с маленькой выборкой - использовать prewhere...
вообще когда используются select * - делайте prewhere -
ещё кешировать в лог таблицы... и при одинаковых запросах показывать результат из них...
вообще КХ не будет нормально работать на 5к одновременных юзеров если вы всегда читаете все колонки... их лучше читать из кешей либо из другого рода баз -
если toString() она правильно возвращается? dbeaver - jdbc
возвращает ок -
Какая версия драйвера у тебя?
-
0.3.0?
-
после какого то этапа перестанут выполнятся мерджи ввиду нехватки места
после того как количество партов достигнет 100 - инсерты замедлятся
после того как количество партов достигнет 300 - инсерты встанут -
-
принято, пробуем обновить. сейчас 0.1.29...
-
здравствуйте уважаемые эксперты можно ли подобное сделать в CH? на скрине PG) спасибо)
-
SELECT number
FROM numbers(10) AS a
ANTI LEFT JOIN numbers(5) AS b USING (number)
Query id: 297eae9a-b496-4ba1-9539-5eb1779e7532
┌─number─┐
│ 5 │
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└────────┘ -
благодарю - буду осознавать)
-
что-то не сработало(
-
Какая версия кх?
-
19.15.3.6
-
А, ну там такого нет еще.
-
спасибо еще раз)
-
Можно пытаться что то сообразить через LEFT джоин и потом просто отфильтровать все значения которые нашли себе пару.
А вообще проще через IN сделать кстати -
Можно так
-
SELECT * FROM table1 WHERE (a,b) NOT IN (SELECT a,b FROM table2)
-
в логах нет ошибок никаких даже warnings, только ошибки от запросов пользоваталей, я думаю обновить кликхаус с 19.17.4.11 до 21.1.7.1, потому что не нашел что за ошибка такая 389 в part_log
-
я просто не знаю как оно там с джойнами и большими данными выборки не взорвется ли, но попробую малыми кусками ...
-
Добрый день
Подскажите пожалуйста.
Имеется все содержимое папки /lib/clickhouse
В нем есть нужная бд, как её адекватно восстановить на сервере?
Я так понимаю просто что то скопировать в рабочую папку clickhouse не вариант, так как тогда перестаёт подключаться клиент -
Возможности указывать нет. Либо все строковые типы поступают в питон как байты, без обработки, либо декодируются с выбранной локалью (по умолчанию UTF-8).
-
По идее достаточно просто положить ее в /lib/clickhouse на новом сервере. Я так переносил, все окей было. Подключаться может не сразу, т.к. старт сервера clickhouse может быть не мгновенный. И да, переносить, конечно, только при выключенном сервере кликхауса
-
Спасибо, попробую ещё раз, может не достаточно ждал запуска сервера
-
Может быть еще данные побились в папке, это только логи сервера расскажут
-
Точно, про логи не сообразил сразу что-то
-
вы во что перекладываете UInt64 в java ? в JAVA нету unsigned
-
M(389, INSERT_WAS_DEDUPLICATED) \
-
Это поведение MV я так понимаю, но у меня все поля разные которые инсертятся в MV, или он хеш считает не от всех полей?
-
по умолчанию MV не проверяет дедупликацию, оно наследует от базовой таблицы, если та репликейтид
-
понял, спасибо)
-
Это прям печаль ((
-
Всем привет, может быть повторяюсь с темой, но все же прошу подсказать как правильнее задать параметры таблицы...
ORDER BY (Date, id, rtime, srtime)
PARTITION BY yyyymmdd(Date)
PRIMARY KEY пустой
кол-во записей за сутки ~ 1 млрд.
При этом уникальность id 100%, rt и str (95%)
В каждом select в БД есть в cекции where запрос по Date и rtime или Date и srtime + order по id
Вопросы:
1. Нужен ли id в ключе сортировки или достаточно будет ORDER BY (Date, rtime, srtime)
2. Имеет ли смысл в PRIMARY KEY прописать Date, убрав его из ORDER BY
3. Есть еще 5-6 полей с уникальностью ~50%, которые достаточно часто могут появляться в select-ах. Имеет смысл их добавлять в ORDER BY (Date, rtime, srtime, ....). Повысит ли это скорость select, сильно ли увеличит нагрузка на сервер.
4. Дневные партиции выбрали с целью удобства их удаления/бэкапа при переполненнии хранилища. Повысится ли скорость при переходе на недельные?
Буду признателен за совет. -
Как вы хотите, чтобы это работало? У вас есть запрос SELECT 'a', 'b'. Как сказать, чтобы a — вернулось в питон строкой, а b — байтами?
-
Хотелось бы раздельной настройки для String и FixedString
-
и кто какие толковые курсы по КХ посоветует, где можно было бы обсудить наболевшие вопросы?
-
Но это же не решит проблему. Кто-то в одной колонке будет хранить строки, которые надо декодировать по умолчанию, а другой, которые не надо. При этом у них будет один и тот же тип.
В таких случаях можно просто запрашивать байты, а в питоне уже декодировать что необходимо. -
сейчас так и приходится делать.
на гитхабе драйвера есть ветка как раз с поддержкой подобной фичи - но в мастер она не замерджена и не факт что такой метод будет стабильно работать -
По пунктам не отвечу, поэтому поделюсь соображениями общего характера.
Мне кажется, что ставить ID со 100% уникальностью в ключ сортировки вперёд менее уникальных rtime/strime - это плохая идея. Это делает бесполезным два последующих поля в ключе (т.к. внутри одного уникального ID всегда только один rtime и одного stime), а ресурсы при заполнении индекса и память под сам индекс они кушают.
Эффект от смены ключа партиционирования зависит ещё от того, за какой период выбираются данные. Если всегда за день, то +- так же будет, а если за бОльший период, то станет быстрее, ибо надо будет меньше файлов перебирать.
Отдельно предлагаю проверить меняется ли скорость запроса и число прочитанных строк, если добавить в запрос отбор вида
prewhere toYYYYMMDD(Date) = 20210331
У меня партишн прунинг на 20.8 не всегда работал если партиционирование по toYYYYMMDD(Date), а в условии отбора запроса просто Date. А вот если указать явным образом, то всегда работает. Это может сильно ускорить. -
спсб, будем анализировать
-
Всем привет!
Я тут пытаюсь использовать join-ы в materialized view. Тут статья есть хорошая: https://altinity.com/blog/2020-07-14-joins-in-clickhouse-materialized-views.
Суть в том, что когда в matview используется join (серия или дерево join-ов), то триггер вешается на самую первую (самую левую) таблицу в этой последовательности Join-ов, но не на другие. Ну и данные для этой первой таблицы используются только те, которые во вставляемой порции, а для остальных таблиц - все.
У меня проблема: я хочу сджонить порцию, вставляемую в таблицу T с самой же таблицей T, но со всей её историей, а не только той, что в текущей порции вставки. Как это сделать?
Я пытался дать таблице T алиас через обычную вьюшку и джоинил порцию с этой вьюшкой, но CH соптимизировал и для вьюшки использовал тоже порцию. Есть какие-то более прямые решения, кроме как иметь копию T в виде materialized view и джоинить порцию с копией?Using Joins in ClickHouse Materialized ViewsClickHouse materialized views provide a powerful way to restructure data in ClickHouse. We have discussed their capabilities many times in webinars, blog articles, and conference talks. One of the most common follow-on questions we receive is whether materialized views can support joins. The answer is emphatically yes.
-
Лучше никак не джойнить, особенно в MV.
CH помещает правую таблицу в память при джойне, поэтому память у вас кончится через полчаса таких инсертов -
Пусть таблица слева (для которой в MV порция) будет называться T1, а её полная копия (не порция) T2, ключевое поле id, тогда я так делаю join:
select ... from T1 as t1 join (select ... from T2 wher id in (select id from T1)) as t2 ON ... -
Т.е. я собираю id из порции (например это id пользователя), потом достаю только строки с этими id из полной таблицы (и ещё дополнительно полную таблицу обрезаю по времени типа datetime > now() - interval 6 hour).
Быстро должно работать (и работает, если тренироваться вместо порция на обрезках таблиц по 5 минут)
Но в matview не могу второй раз таблицу использовать как полную - в этом засада -
не заработает так, не получится с MV
-
Ну ок, спасибо! Думал, может уже есть общее решение. Технически не должно быть проблем - ведь другие таблицы можно целиком использовать в matview, просто CH не допилили чтобы одна таблица в обеих ролях выступала. Придётся делать всё-таки T2 как матвью, у меня там вроде можно отфильтровать строки-столбцы, не полную копию делать.
-
Коллеги,
-
есть такой еще кейс, как его подскажете побороть... Есть колонка скажем, с неправильным типом (String), ее бы переделать в UInt, как поступить... БД Тб 20 и длительным копированием заниматься совсем не удобно и возможно, рассматривали вариант плавного переноса в виде создания новой колонки и дублирования при инсерте значения с правильным типом, в последствии удаления старой колонки... Как правильно и лучше сделать... Колонок для такого преобразования, скажем с десяток...
-
Мы делали примерно так вроде. Пусть c1 - старая колонка, c2 - новая.
ALTER TABLE T ADD COLUMN c2 UInt64 DEFAULT toUInt64(c1); -- завершается мгновенно
OPTIMIZE TABLE T FINAL; -- прописывает DEFAULT в c2
-- вставлять начинаем в обе колонки
ALTER TABLE T MODIFY COLUMN c2 UInt64; -- убираем связь со старой колонкой
-- тут уже в старую перестаём вставлять, чтобы удалить
ALTER TABLE T DROP COLUMN c1;
Мутации тоже пробовали вроде, но они какие-то ненадёжные. -
Ну и делали много колонок сразу:
много alter add
один раз optimize final
много alter modify
много alter drop -
спсб, буду пробовать
-
а почему кончится? кх не выгружает обратно из памяти таблицу?
-
ну таблица растет, как только окажется в таблице 10-100 млн. записей и приджойнить ее справа не получится
-
понятно
-
на самом деле КХ при алтере типа колонки тоже сделает toUInt64(c1)
но будет проблемой если строка не конвертируется, с дефолтом лучше делать DEFAULT toUInt64OrZero(c1)