- 16 July 2021 (144 messages)
-
спасибо за ссылку)
-
-
Пытаюсь установить кликхаус на Мак на м1
через докер
выдает ошибку:
docker run -d --name some-clickhouse-server -p 8123:8123 --ulimit nofile=262144:262144 yandex/clickhouse-server
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
35cb9f051855178ef8ff1e9a3860874802e6a932f28b962209c9d38e011454c9
кто-нибудь сталкивался? как решить? -
Всем привет, не подскажете, когда я смотрю на колонку query_duration_ms из system.query_log, она включает время на вьюхи?
-
Привет!
Подскажите, пожалуйста, можно ли вставлять в БД, чтобы значение data при вставке выполнялось с функцией base64Decode(data)
zcat data.json.gz | clickhouse-client --query="INSERT INTO data.table FORMAT JSONEachRow" --input_format_skip_unknown_fields=1
{data: 'Base64Encoded string', id:1, source:'website'},
{data: 'Base64Encoded string', id:2, source:'website'},
{data: 'Base64Encoded string', id:3, source:'website'},
{data: 'Base64Encoded string', id:4, source:'website'} -
input | ClickHouse Documentation
input input(structure) - table function that allows effectively convert and insert data sent to the server with given st
-
спасибо!
-
insert и materialized view? да
-
-
да, именно, пытаюсь понять не тормозит ли mv при вставках, там subquery внутри
-
Коллеги, добрый день. Какое сжатие используется при экспорте данных в parquet подобным образом?
clickhouse-client --query="SELECT * FROM {some_table} FORMAT Parquet" > {some_file.pq}
Можно ли задавать способ сжатия? -
1. SNAPPY
2. нет -
Спасибо!👍
-
Подскажите как из Tuple взять первое значение?
-
tpl.1
-
спасибо
-
-
CH использовать стоит если вам надо писать пару млрд. в день и кластер из 10ти elastic не справляется на запись, и искать вы собираетесь редко.
У CH нет полнотекстового поиска (индексов) поэтому практически КХ будет делать фулскан, его успешно используют вместо elastic если у вас например 5 тыс. серверов и надо писать их логи и очень редко искать, причем искать зная период поиска, а в эластик просто невозможно засунуть такой поток. -
А тебе нужен полнотекстовый поиск или поиск по подстроке?
-
Добрый вечер. Использую последний стабильный релиз от алтинити в докере. Проблема "Note for Docker users: outbound SSL connections did not work in ClickHouse docker image due to missing certificates. The issue has been fixed in 19.16.19.85, 20.1.12, 20.3.9 and any later releases" решена? В логах кафки выдает Failed authentication with /172.25.0.1 (SSL handshake failed) (org.apache.kafka.common.network.Selector). В тоже время использую python-confluent-kafka ( где под капотом та же librdkafka, соответственно настройки теже) подключение успешно.
В логах кликхауса : [rdk:ERROR] [thrd:192.168.0.104:29092/bootstrap]: 1/1 brokers are down
UPD:
Не было прав на сертификаты -
Общий размер в 100TB исходных данных? Боюсь, тут решения из коробки уже не очень подойдут, нужно смотреть на специфику задач, может на CH свой индекс строить (про это был доклад, насколько помню).
-
нет, их не так много на самом деле. Там просто исходный код страниц.
-
полнотекстовый желательно
-
мне надо один раз записать и потом постоянно читать)
-
Тогда лучше не CH, там ни стемминга, ни флексий, ни прочих фишек полнотекста нет. Так что elastic или сфинкс
-
-
Э, коэффициенты? Никаких, ручками самому провести эксперимент по своим данным, но с @dphil соглашусь насчет полнотекста, CH не в вашем кейсе.
-
какой индекс?
-
##
Не рабоатает условие host_regexp по фильтрации по хосту источника.
##
Подключился, ни одного PTR запроса не наблюдаю, только A -
смею предположить, что никто не понял, чего вы хотите. any(value), max(timestamp) даст значения, вполне вероятно из разных строк. И с этой парой одновременно может не оказаться ни одной строки. Возможно, вам нужно argMax((value, timestamp), timestamp). Или в каких-то версиях КХ работает просто argMax((value, timestamp)). Но я не уверен, что вы хотите именно это получить
-
Спасибо, справился через argMax(value, timestamp) с надеждой что CH не будет сильно тормозить если много полей будут использовать эту функцию
-
Какие могут быть причины?
- В логах про dns (loglevel=trace) ничего нет
- PTR запросов нет
- Ззапись host_regexp имеется в конфигах.... -
что значит много полей?
если нужно вытаскивать не только value, но и value_1, ..., то делайте argMax((value, value_1, ...), timestamp) as _array -
-
Use case: агрегация по логам системы, хотим вытаскивать поля последних метрик конкретных сервисов. Спасибо за предложение, обязательно попробую
-
Спасибо, возьму на вооружение!
- 17 July 2021 (63 messages)
-
внутри clickhouse pod
grep -r host_regexp /etc/clickhouse-server/config.d/
что показывает? -
Здравствуйте!
Есть ли какие-то ограничения на join по materialized column? Или это баг?
Ошибка:
Code: 47, e.displayText() = DB::Exception: Missing columns: 'mat_id' while processing query: 'SELECT `--a1.id` AS `a1.id`, count() FROM (SELECT a1.id AS `--a1.id`, b1.id AS `--b1.id` FROM a AS a1 LEFT JOIN b AS b1 ON `--a1.id` = `--b1.id`) AS `--.s` ALL LEFT JOIN c AS c1 ON `--a1.id` = mat_id GROUP BY `--a1.id`, `--b1.id`, id', required columns: '--a1.id' 'mat_id' '--b1.id' 'id', source columns: '--b1.id' '--a1.id', joined columns: 'id' 'update_time' (version 20.12.4.5 (official build))
Env:
create table a(id Int64, update_time DateTime) engine ReplacingMergeTree(update_time) order by id;
create table b(id Int64, update_time DateTime) engine ReplacingMergeTree(update_time) order by id;
create table c(id Int64, update_time DateTime) engine ReplacingMergeTree(update_time) order by id;
alter table c add column mat_id Int64 materialized id;
select a1.id, count()
from a a1
left join b as b1 on a1.id = b1.id
left join c as c1 on a1.id = c1.mat_id
group by a1.id, b1.id, c1.id; -
ничего, пусто
-
а если более глобально, то вот
grep -r host_regexp /etc/clickhouse-server/
chop-generated-users.xml: <host_regexp>noname</host_regexp>
chop-generated-users.xml: <host_regexp></host_regexp> -
Вчера запустил OPTIMIZE TABLE
Консоль повисла. Рестартанул сервис и теперь при локальном подключении консоль висит.
Если с внешнего хоста ходить, то запросы выполняются.
Почему консоль может висеть? В логах ошибок пусто. -
Интересно можно ли в такой ситуации подключиться к процессу дебагером и посмотреть стэк
Или просто в логи посмотреть -
А как выглядит вывод консоли при входе с внешнего хоста?
-
Разные версии clickhouse client?
-
я из Datagrip дёргаю. Но если делать так то тоже работает. Почему-то навернулась интерактивность.
ClickHouse server version 21.6.6.51 (official build).
ClickHouse client version 21.6.6.51 (official build). -
а datagrip ходит по native протоколу :9000 или через ODBC :8123 :8443?
-
а вот и проблемка. В /root/.clickhouse-client-history 25228238 строк
-
-
лол, то есть клиенту при запуске нужно было какое-то время чтобы считать этот файл? 😄
-
-
класс, люблю такое)
-
-
-
а может удаления лока было достаточно?
-
-
вот здесь
-
-
я подумал что может там какие-то огромные запросы
-
where some_id in (1,2,3,4,5,.... 9999999)
-
-
https://youtu.be/6IwLWEx_mg4?t=1677
Вот тут господин докладчик утверждает, что ReplacingMergeTree не работает 😱
Может кто-то прокоментировать? -
Послушал первые две минуты. Докладчик жалуется на дубликаты при выборке по "первичному ключу". Это всё вообще-то в документации прямым текстом описано:
Merging occurs in the background at an unknown time, so you can’t plan for it. Some of the data may remain unprocessed.
Нужно или FINAL, или агрегацию использовать при выборке. -
А теперь понял. Я не распарсил что означало "по первичному ключу". Теперь стало ясно что другими словами это означает без агрегации.
-
Можно ли в свою очередь пожаловаться, что люди разучились понимать документацию?
-
Во все времена и поколения кажется было так 😄
-
Я чего-то даже не подумал про юзкейс, когда из CH можно читать без агрегации.
-
Ну например, когда тебе достаточно проверить тот факт, что строка с таким id заехала в таблицу
-
Добрый день, появилась потребность хранить в ch относительно большие строки (10-20 слов) они могут быть достаточно уникальны.
Вопрос к выборке, если мне надо достать данные по 1 такой строке среди множества строк. Есть ли смысл рядом хранить колонку с хешом строки и в запросе делать where hash and string?
То есть, например в таблицу хранится несколько записей вида
Строка | количество чего-то
А | 3
Б | 7
А | 4
В | 10
Я хочу получить на выходе:
А | 7
Тогда по простому мой запрос:
Select name, sum(count)
From table
Where name = 'A'
Group by name
Так вот, есть ли смысл добавлять колонку хеша, отбирать (where hash & name) и группировать сначала по ней, потом по самой строке. Ускорит ли это обработку?
Мысль такая пришла по аналогии с хешмапами/хеш таблицами -
Идея здравая, но в лоб сработает если ищешь по полному совпадению
-
Ну да поиск нужен по полному совпадению
-
Можно в ORDER BY запихать хеш а ещё использовать PREWHERE
-
Другой вопрос, что возможно есть более подходящие другие бд для такого
-
Не, там еще будет кучка условий типа даты и id владельца, обычно все сортирую по датам
-
Не, тут набор данных как раз под ch, т.е. сейчас по пол ляма в день, дальше больше)
-
Размер данных это ещё не значит что кх
-
Допустим Кассандра или сцилла key value
-
Не, я для примера сильно урезал запрос, чтобы лишним внимание не отвлекать, кх нас полностью устраивает, а это для новой фичи, интерес был именно к использованию хеша рядом с полной строкой, выиграю ли что-то от такого или не тратить время
-
типа что лучше строки сравнивать или инты (хеши)?
-
видимо не только сравнение where, но и сортировка order by и группировка group by
-
Не, отработает ли хеш, раньше полного сравнения со строки.
Т.е. в хешмапе сначала ищется по хешу, потом среди коллизий полное сравнение.
Сделает ли так же кликхаус или забьет и пойдет сравнивать строки полностью а потом хеш.
Второе бесполезно, т.к. хеш будет верный если строка совпала -
Т.е. в голове план такой, есть таблица в ней дата события, текст события и хеш текста, ну и ещё куча атрибутов, которые не сильно важны сейчас.
Хочу чтобы кх сначала отобрал по датам, потом по хешу и потом только сравнивал строки, чтобы убрать коллизии хеша, дальше ещё кучка условий.
Сделает ли он так или может пойти своим путём и сравнить даты, потом строки и потом хеш? -
Просто тот же оракл может менять план запроса, например из-за индексов и не всегда в лучшую сторону
-
Может, используйте PREWHERE
-
Получается дата и хеш в prewhere остальное в where?
-
Да
-
Огонь, спасибо)
-
Я нуб в КХ. Хочу разобраться как работает репликация и шардинг.
Думаю атаковать с трех векторов: официальная документация, ютуб видео / статьи, руками поднять кластер. Норм подход? -
Нормально, можно ещё видео посмотреть на нашем канале altinity YouTube
-
как раз смотрю https://www.youtube.com/watch?v=4DlQ6sVKQaA (Introduction to the Mysteries of ClickHouse Replication)
-
Оно
-
Найти документацию нету проблем. Ютуб видео и статьи тоже гуглядтся на раз.
Можете подсказать как практическую часть упростить?
Может быть есть dockercompose какие-то чтобы локально поднять, поменять что-то, посмотреть что будет
Или что-то что поможет на AWS раскатать тестовое окружение -
падними руками кластер 👍🏻
-
Можно посмотреть
docs.altinity.com
kb.altinity.com
Либо тесты в основной репе кликхауса, там есть docker compose скрмпты -
Спасибо! О, altinity доки я еще не штудировал
-
А где-нибудь есть инфа по тому как обычно КХ падает и как это чинить? 😄
-
Есть ещё идеи, что можно проверить для того ,чтобы включить работу regexp_host ?
-
В kb.altinity.com стараемся написать самые типичные случаи
-
❤️❤️❤️
-
Можно посмотреть preprocessed конфиг файлы, что там кликхаус сделал.
/var/lib/clickhouse
Можно сделать через кликхаус клиент :
Set send_logs_level='trace'
SYSTEM RELOAD CONFIG
И смотреть на ошибки при реалоаде - 18 July 2021 (21 messages)
-
Попробуйте ещё skip-index с блум фильтром. У вас сравнение на равенство, вроде как раз подходящий сценарий. И не надо будет предварительно хэш считать и хранить. Он в блум фильтре рассчитывается.
-
кстати, а как правильно выбрать параметры этого фильтра? там вроде гранулярность была и еще что-то
-
Судя по статье https://kb.altinity.com/altinity-kb-queries-and-syntax/skip-indexes/skip-index-bloom_filter-for-array-column
Гранулярность особо не влияетSkip index bloom_filter ExampleExample: skip index bloom_filter & array column
-
Спасибо, а кх тоже пишет в explain plan порядок выборки?
-
> Есть ещё идеи, что можно проверить для того ,чтобы включить работу regexp_host ?
Ошибок не вижу
SYSTEM RELOAD CONFIG
[chi-clickhouse-default-0-0-0] 2021.07.18 18:30:37.566914 [ 90 ] {4fe3e276-2fdc-4bba-8d68-edbb47cb4ec9} <Debug> executeQuery: (from 127.0.0.1:56190) SYSTEM RELOAD CONFIG
[chi-clickhouse-default-0-0-0] 2021.07.18 18:30:37.567256 [ 90 ] {4fe3e276-2fdc-4bba-8d68-edbb47cb4ec9} <Trace> ContextAccess (default): Access granted: SYSTEM RELOAD CONFIG ON *.*
[chi-clickhouse-default-0-0-0] 2021.07.18 18:30:37.571728 [ 90 ] {4fe3e276-2fdc-4bba-8d68-edbb47cb4ec9} <Debug> ConfigReloader: Loading config '/etc/clickhouse-server/config.xml'
[chi-clickhouse-default-0-0-0] 2021.07.18 18:30:37.580815 [ 90 ] {4fe3e276-2fdc-4bba-8d68-edbb47cb4ec9} <Debug> ConfigReloader: Loading config '/etc/clickhouse-server/users.xml'
[chi-clickhouse-default-0-0-0] 2021.07.18 18:30:37.583646 [ 90 ] {4fe3e276-2fdc-4bba-8d68-edbb47cb4ec9} <Debug> MemoryTracker: Peak memory usage (for query): 7.08 MiB.
Ok.
0 rows in set. Elapsed: 0.019 sec. -
Скорее в set send_logs_level='trace'
-
Спасибо, буду пробовать
-
А пример конфига юзерп можно
-
<yandex>
<users>
<adclick>
<networks>
<host_regexp>noname</host_regexp>
<ip>127.0.0.1</ip>
<ip>0.0.0.0/0</ip>
</networks>
<password_sha256_hex>ebf22d8bfa40cc5ae972270a06934fe1056ea7227859ad7d39c6fe9c497db70f</password_sha256_hex>
<profile>default</profile>
<quota>default</quota>
</adclick>
<default>
<networks>
<host_regexp></host_regexp>
<ip>127.0.0.1</ip>
<ip>0.0.0.0/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
</default>
</users>
</yandex> -
Хм, а что будет если убрать 0.0.0.0/0
-
https://t.me/clickhouse_ru/226926
ПО истории ответов можно посмотреть, что уже проделано. для дебага ...Kirill Kazakov in ClickHouse не тормозит## Не рабоатает условие host_regexp по фильтрации по хосту источника. ## Подключился, ни одного PTR запроса не наблюдаю, только A
-
ограничение по ip работатает...
Что именно нужно проверить, когда я уберу 0.0.0.0/0 ? -
Смутное подозрение что оно Пермисивно открывает все айпи
-
А тебе нужно только определеннве которые удовлетворяют маске
-
т.е. убрать вообще настройку с ограничениями по ip ?
-
Да
-
Сейчас попробую
-
Вы были правы !!!
Всю прошлую неделю мучался с этим вопросом !
Эти моменты описаны в доке ? -
Не знаю, надо смотреть
-
-
- 19 July 2021 (184 messages)
-
это не так работает
если на пальцах
в REDIS вы делаете счетчики и делаете INCR
в ключ зашиваете ДАТА, статья и еще куча параметров
а потом когда нужен отчет делаете SCAN чтобы через KEYS всю производительность не убить
сгружаете в SQL
а в clickhouse вы тупо пишете в CSV файл
время, браузер, страна, и туева куча параметров вашего просмотра статьи
одной строкой
накопили 100 000 строк,
слили в clickhouse
а потом в clickhouse делаете SELECT event_date, uniq(user_id) FROM table GROUP BY country
например
плюсы \ минусы - REDIS быстрее делает INCR , и медленнее SCAN и сложнее добавлять столбцы с измерениями и мерами
clickhouse
надо буферизировать и обогащать данные перед вставкой отдельно (clickhouse-bulk вам в помощь)
но хранятся сырые данные на диске с максимальной точностью
и потом легче через ALTER TABLE добавить например новое поле (город) -
это мое IMHO, но думаю что это не сильно далеко от правды
основной кейс ClickHouse для чего он создавался изначально
это Yandex Metrika \ App Metrika
то есть, все сырые данные по всем вашим страницам , как отдельное событие
ну и там еще sessionization отдельно прикручена чтобы визиты считать
и дальше репорты в web интерфейсе для тысяч веб мастеров одновременно по counterId + GROUP BY считаются
все остальное чем clickhouse оброс за это время, это в основном задачи на интеграции, оптимизации и новые возможности в SQL диалекте типа window functions и join
если вам надо просто для конкретной статьи отдельно счетчик просмотров хранить
то естественно вам REDIS самое оно
просто эти данные потом анализировать нельзя
то есть как пример вы не сможете динамику отдельной статьи посмотреть просмотров по часам среднее, сравнить выходные и будни и т.п. задачи =) -
берите кликхаус, count считайте запросом. тогда обойдетесь без "ну мы и планировали кудато, как буфер пихать, потом забирать и сливать в sql по нужным колонкам."
-
Если клики нужны уники, то одним счётчиком в редисе уже не отделаться. А если ещё захочется отдельно глянуть клики по странам, ос и т.д., то придётся ещё и кучу други счётчиков добавлять. В этом случае проще в кликхаус сохранять. Можете json писать в редис в list, а потом раз в минуту доставать пачками по тысяче и вставлять в кликхаус.
Я использую комбинированный способ. Счётчики в редисе и в фоне в бд их потом обновляю. А также хоаню сырые клики в кликхаусе. -
Господа, всем доброго понедельника.
Продолжу свою цепочку вопросов :)
Use case: писать поток событий и сразу кверить результат, чтобы посчитать аггрегат и разослать его в качестве уведомления (пишем кусками раз в четверть секунды)
Структура: Buffer -> MT, MV прикручивали поверх Buffer.
Сейчас у нас запрос с подзапросом (last point problem), встряли с тем что при добавлении MV страдает скорость вставки/чтения (запросы напрямую >100ms до 5М записей, запросы через MV начинают линейно замедляться с ростом количества записей).
Вопрос: правильно ли в нашем случае использовать MV или всё-таки лучше остановиться на подзапросе? -
-
что такое "подзапрос"? в каком месте он возникает?
что такое "напрямую"? SELECT FROM buffer_table ?
и что значит "last point problem" ?
куда вставляет MV? в AggregatingMergeTree? отдельная таблица или Inner? -
Подзапрос - FROM (SELECT)
Используем его в запросе которым считаем аггрегат по последним состояниям сущностей
"Напрямую" - делаем запрос к таблице, при условии отсутствия MV.
"last point problem" - нам надо сначала выдрать последние состояния сущностей (сливаем всю цепочку состояний в CH) - потом посчитать результат.
MV основан на AggregatingMT (планировали переехать на CollapsingMT), inner таблица -
так, а "состояние" сущности это что?
ну то есть у вас там хочется иметь UPDATE ... SET x = x + delta и UPDATE ... SET x = x - delta - и CollapsingMergeTree ?
или у вас там SET x=new_value и ReplacingMergeTree + FINAL напрашивается? -
Состояние сущности - условно "предмет положили в корзину"/"предмет достали из корзины" и т.д.
CollapsingMT - сессия может включать несколько таких "корзин", по которым хотели бы получать последние состояния (в будущем, сейчас пока фокус на одной "корзине")
ReplacingMT - пробовали, но воткнулись в такую же проблему со вставками + необходимость дёргать FINAL (он, конечно, распараллелен, но всё-таки замедляет выборку) -
ну смотрите а у вас окно какое для подсчета аггрегата?
почему вам важно постоянно аггрегаты считать и куда то отсылать? почему нельзя тупо на redis это сделать?
clickhouse это система с near-realtime, а не realtime -
Cardinality сущности не позволяет с Redis поработать
-
-
Всем привет!
кто-нибудь сталкивался с подобным?
Transaction end error: code: 50, message: Unknown data type family: 2r -
что-то непонятно что имеется ввиду под cardinality
ну десятки миллионов ключей в redis хранить не проблема так то...
главное памяти чтобы хватило...
key lookup там довольно быстрый -
контекста не хватает, что именно делаете
какой запрос... -
Уже разобрался, тупой косяк)
-
Речь про достаточно большую сущность саму по себе + аналитика + ключи + мы жёстко ограничены по памяти в Redis в районе около 1-4 Gb максимум
-
ну так и в clickhouse то вы тоже с таким ограничением можете легко не пролезть...
если честно, ничего не понимаю из того что вы говорите ;)
то сначала кардинальность (кол-во уникальных значений / на кол-во записей)
то потом сразу про размер ;) -
Под кардинальностью я понимаю количество колонок, не уникальных значений / кол-во записей.
-
ну так для redis то вообще можете в protobuf, mskpack, json по ID сущности бинарно хранить... и не париться
в общем пока непонятно, collapsing merge tree + SELECT final раз в 10-15 минут
вполне должен справляться
но realtime в clickhouse Не бывает -
-
Всем привет, подскажите, пожалуйста, насколько долгими могут мутации?
Был выполнен запрос (мутация):
alter table variants delete where sample_id = 1505;
Из таблицы с мутациями вижу, что она крутится уже 24 минуты.
select * from system.mutations;
Хостим кх в облаке яндекса.
Это нормально? Оно может и час и день выполняться? -
В зависимости от объема данных, может и целый день работать
Вы следите за тем, что бы system.mutation parts_to_do уменьшалось -
Понял, спасибо
-
Всем привет. Вроде был PR, где хотели встроить в MergeTree механизм батчинга insert-ов. Чтобы можно было вставлять не батчами
-
Asynchronous inserts mode support by abyss7 · Pull Request #20557 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): New Feature Changelog entry (a user-readable short description of the cha...
-
Здравтсвуйте!
Подскажите как лучше сделать
У меня есть поле возраст - инт
Мне нужно найти колчиество пользователей по возрастным группам - 20-30, 30-40, etc
Можно ли как-тот красиво это сделать кроме полотна ифов ?
Спасиб -
Group by age/10?
-
А в селекте наоборот умножить
-
нужно чуть более гибкое решение. в дейстивтельности там выборки рода 18-23, 24-31, etc
-
multiIf
чуть менее большое полотно if -
ну и нужно вывести в селекте аля ’18-23’ as grоup_age
-
ну ладно)
-
короче бакеты такие сделать
-
Всем привет.
Возможно кто то сталкивался: Создал пользователя, дал права на select для всего и полные права на одну базу. Тут все работает.
Но если сделать запрос на вьюху которая использует jdbc то получаю ошибку
Not enough privileges. To execute this query it's necessary to have the grant jdbc() ON *.*
И не могу понять какие права надо раздать пользователю
GRANT jdbc() ON *.* TO user;
GRANT jdbc ON *.* TO user;
GRANT SOURCES ON *.* TO user;
возвращает ошибку, мол неправильный синтаксис.
КХ 20.3
Заранее спасибо. -
roundAge function
Or
countResample(0,5,1)(age, roundDown(age,[18,23,35,50])) -
чето не могу поняь что делает countResample и три магических числа
-
Добрый день) Нужен совет. Сейчас такой стэк. Laravel + mysql. Хотим mysql заменить на ClickHouse. Пишем маркетплейс. Mysql слишком медленный для нас. Так как много продуктов, от разных поставщиком, с разными характеристиками. Здравое ли решение использовать ClickHouse для маркет плейса?
-
Очень много продуктов, очень много разной сортировки, по весу размеру и т.п.
-
MySQL слишком медленный для вас для чего?
полностью MySQL заменить не получится
можно данные какие то пригодные для аналитики типа загрузки \ продажи
сливать в clickhouse чтобы показывать
отчеты какие то
MySQL слишком медленный в каком месте?
может вы на Lavarel писать не умете и у вас 100 запросов к MySQL Там где можно обойтись одним? -
очень много это сколько?
что именно у вас тормозит?
отрисовка списка продуктов? -
start,end,increment
countResample бьет по бакетам вашу агрегацию
Тк вам нужно бить только по специальным границам приходится извращатся с roundDown
SELECT countResample(0, 6, 1)(age, indexOf([0, 18, 23, 35, 50], roundDown(age, [0, 18, 23, 35, 50]))) AS x
FROM
(
SELECT number AS age
FROM numbers(100)
)
Query id: 507294bc-b76e-4e44-ad01-8aaa88eb763f
┌─x─────────────────┐
│ [0,18,5,12,15,50] │
└───────────────────┘ -
Вот правильный пример
-
Пример. Есть таблица категорий. У каждой категории есть свой список продуктов. Я например одним запросом выдергиваю из определенной категории все продукты, у которых размер > n, цена в диапазоне min < price < max, и еще какое нибудь условие. Такой запрос будет обрабатываться пару секунд.
-
а вы искали в чем причина медленного запроса в mysql?
-
-
CH не acid, поэтому хранить транзакционные данные у вас не получится. стоит сначала попробовать решить проблемы мускула, а потом пробовать альтернативы. такое координальное прыганье на разные технологии не есть хорошо
-
вы знаете что такое EXPLAIN и b-tree индексы в MySQL?
у вас две таблицы тут должны быть
одна категории
вторая продукты
во второй должен быть индекс по category_id
если у вас отношение 1:N
если N:M отношение тогда третья таблица в коорой
category_id, produc_id
и JOIN с этой таблицей и индекс на size в таблице продуктов -
у меня подобный запрос выполняется 0.1 секунду на двух миллионах товаров
что я делаю не так? -
Ребят привет, а как показать все схемы в базе данных? чет как-то не тривиально оказалось учитывая результаты гугления
-
вместо JOIN можно на два запроса разбить один product_id выбирает
второй выбирает WHERE product_id IN () AND условия выборки -
в кликхаусе нет понятие схем в базе данных
-
Да я это прекрасно понимаю) Я понимаю, что с помощью индексов, анализа я смогу очень сильно оптимизировать запросы. Я пока не стал этим заниматься. Просто я почитал про кликхоус, и мне стало интересно.
-
КХ не для той цели, которую вы описали в вопросе
-
Просто проект только на начальном этапе, и хочется заложить правильную архитектуру. Использовать современные решение. Чем потом переписывать.
-
Я по этому и пришел сюда за советом)
-
спасибо! 🤝
-
Стоит, не стоит, для чего вообще.
-
А что вас побудило взять MySQL?
-
-
Ильшат, ок. давайте так, ВАМ РАНО в clickhouse
давайте разберитесь с MySQL сначала
научитесь с ним работать
выжмите все из него
а потом уже к нам =)
clickhouse это не серебрянная пуля
от применения которой у вас все сразу заработает.. -
select * from pg_catalog.pg_tables
-
это же вопрос про clickhouse был? или нет?
-
SELECT * FROM system.databases;
SELECT * FROM system.tables;
в clickhouse СХЕМ как в Postgres нет -
Я пришел в проект, так было до меня)
-
Спасибо за ответ)
-
По этому мы сейчас изучаем и другие варианты)
-
крч соглашусь с @BloodJazMan , вам в КХ еще оч рано, разберитесь в причинах медленного запроса :)
-
А для чего тогда используют clickhouse? в каких проектах?)
-
Хотел бы изучить, почитать)
-
Обзор | Документация ClickHouse
Что такое ClickHouse ClickHouse - столбцовая система управления базами данных (СУБД) для онлайн обработки аналитических
-
вам лучше идти в доки
-
Понял, спасибо большое)
-
Безмерно благодарен)
-
Черт))) думал кто то из наших спрашивает😂😂😂 в часах запутался, уже не глядя отвечаю🤦♂
-
ClickHouse/ClickHouse tagged: v21.7.4.18-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.7.4.18-stable
Release notes:
v21.7.4.18-stableRelease v21.7.4.18-stable · ClickHouse/ClickHouseClickHouse stable release v21.7.4.18-stable
-
👋 в таблице system.events увидал строчку SlowRead, которая якобы говорит мне о том, что 55 запросов считывались из файла медленно. В связи с чем встал интерес о том, как бы профилировать запросы в query_log и понять какие были медленными, а какие нет? Ну кроме банальных elapsed_ms и memory_usage колонок на глазок. Что сам кх считает медленными?
-
-
-
-
!= а такое есть?
У вас Distributed таблица? -
-
да, нашел
-
В какой части запроса используется?
-
в query_log есть колонка с эвентами можно там посмотреть
Либо в логах сделать grep по Slow read
И найти id запроса -
SELECT
if(empty(s0.referrer_source), 'Direct / None', s0.referrer_source) AS name,
any(s0.referrer),
toUInt64(round(uniq(s0.user_id) * any(_sample_factor)))
FROM sessions AS s0
SAMPLE 10000000
WHERE (s0.domain = 'foo.com') AND ((s0.timestamp >= '2021-07-18T21:00:00') AND (s0.start < '2021-07-19T21:00:00')) AND (s0.referrer_source != '')
GROUP BY s0.referrer_source
ORDER BY
toUInt64(round(uniq(s0.user_id) * any(_sample_factor))) DESC,
min(start) ASC
LIMIT 0, 9
FORMAT JSONCompact -
-
видимо речь про колонку ProfileEvents.Names массив. Пасиб, пойду раскуривать эту тему
-
версия кх?
если руками через клиент выполнить этот запрос что будет?
SELECT
if(empty(s0.referrer_source), 'Direct / None', s0.referrer_source) AS name,
any(s0.referrer),
toUInt64(round(uniq(s0.user_id) * any(_sample_factor)))
FROM sessions AS s0
SAMPLE 10000000
WHERE (s0.domain = 'foo.com') AND ((s0.timestamp >= '2021-07-18T21:00:00') AND (s0.start < '2021-07-19T21:00:00')) AND (s0.referrer_source != '')
GROUP BY s0.referrer_source
ORDER BY
toUInt64(round(uniq(s0.user_id) * any(_sample_factor))) DESC,
min(start) ASC
LIMIT 0, 9
FORMAT JSONCompact -
версия вот
-
то же и будет
-
-
-
-
-
-
SHOW CREATE TABLE sessions;
на старом какая версия была? -
20.10.2.20
-
Странная фигня, похоже на багу где то
-
CREATE TABLE sessions
(
`session_id` UInt64,
`sign` Int8,
`domain` String,
`user_id` UInt64,
`hostname` String,
`is_bounce` UInt8,
`entry_page` String,
`exit_page` String,
`pageviews` Int32,
`events` Int32,
`duration` UInt32,
`referrer` String,
`referrer_source` String,
`country_code` LowCardinality(FixedString(2)),
`screen_size` LowCardinality(String),
`operating_system` LowCardinality(String),
`browser` LowCardinality(String),
`start` DateTime,
`timestamp` DateTime,
`utm_medium` String,
`utm_source` String,
`utm_campaign` String,
`browser_version` LowCardinality(String),
`operating_system_version` LowCardinality(String)
)
ENGINE = CollapsingMergeTree(sign)
PARTITION BY toYYYYMM(start)
ORDER BY (domain, user_id, session_id, start)
SAMPLE BY user_id
SETTINGS index_granularity = 8192 -
да, я про то же
-
-
Попробуйте даунгрейднутся до 21.3
-
-
Нет, не должно
-
-
Ага, ее можно
-
-
Ну пишите баг репорт с примером на 21.7 что то там сломалось видимо
-
Подскажите, пожалуйста, а есть варианты решения ошибки: Memory limit (total) exceeded: would use 14.08 GiB (attempt to allocate chunk of 338518331 bytes), maximum: 14.08 GiB - кроме увеличения оперативной памяти, выделенной инстансу?
-
Можно выполнять операции с использованием внешней памяти. Посмотрите настройки max_bytes_before_external_group_by и distributed_aggregation_memory_efficient (вроде)
-
это тюнинг запросов,а если например выполняется ALTER TABLE удаления\апдейта
-
Это total лимит, у вас там еще жирные запросы могут быть
-
нагрузки не было еще, но, кажется, я вас понял)
-
Всем привет, можете подсказать, что делаю не так? Хочу предоставить пользователям (LDAP) возможность создавать временные таблицы, для этого завел группу, и на нее навешиваю разрешения:
GRANT CREATE TEMPORARY TABLE ON *.* TO sg_clickhouse;
GRANT sg_clickhouse TO `user_name`
┌─GRANTS FOR rtb_clickhouse────────────────────────────┐
│ GRANT CREATE TEMPORARY TABLE ON *.* TO sg_clickhouse │
└──────────────────────────────────────────────────────┘
┌─GRANTS FOR `user_name`─────────────┐
│ GRANT sg_clickhouse TO `user_name` │
└────────────────────────────────────┘
Но в итоге все равно получаю ошибку:
DB::Exception: user_name: Not enough privileges. To execute this query it's necessary to have grant CREATE TEMPORARY TABLE ON *.* (version 21.6.3.14 (official build))
Может что-то упустил? -
-
Всем привет, такой вопрос, а вьюхи по отношению к выполнению инсерта клиентом, синхронные? Он дожидается пока они отработают?
-
попробуйте рестартонуть кликхаус
-
-
комрады, подскажите пожалуйста, я всего навсего хочу две роли, rw и ro, но чет даже команду написать не получается, а офф. дока бомжатская какая-то =)
пишу так:
create role rw settings writable
чего не хватает ? -
Я кстати тоже даю гранты исключительно на группы и до клиентов (tableau, python) изменения идут долго (около 2 часов)
-
Nullable | ClickHouse Documentation
Functions for Working with Nullable Values isNull Checks whether the argument is NULL. isNull(x) Alias: ISNULL. Argument
-
Добрый день, я первый раз пользуюсь clickhouse и у меня уже возникли проблемы с установкой клиента на мак. Сделал все как написано на странице установки, но после скачивания файла команды clickhouse не работают.
-
treemorse@MacBook-Air-Daniel ~ % ./clickhouse
Use one of the following commands:
clickhouse local [args]
clickhouse client [args]
clickhouse benchmark [args]
clickhouse server [args]
clickhouse extract-from-config [args]
clickhouse compressor [args]
clickhouse format [args]
clickhouse copier [args]
clickhouse obfuscator [args]
clickhouse git-import [args]
clickhouse keeper [args]
clickhouse keeper-converter [args]
clickhouse install [args]
clickhouse start [args]
clickhouse stop [args]
clickhouse status [args]
clickhouse restart [args]
clickhouse hash-binary [args]
treemorse@MacBook-Air-Daniel ~ % clickhouse local
zsh: command not found: clickhouse
treemorse@MacBook-Air-Daniel ~ % -
Не работает для целых. Похоже только для строк)
-
ребяты!! как read-write роль создаааать?)))
-
Может ли кто-то помочь с моей проблемой? Хотелось бы уже приступить к работе а через докер это делать не очень удобно
-
./clickhouse local
-
-
Я бы с радостью) Но времени совсем нет. В любом случае спасибо
-
./clickhouse client
А в чем проблема то?
Вы не пишете -
ну вам показывают какие есть команды для бинарника clickhouse
если нужен клиент
то делаете symlink clickhouse-client на clickhouse бираник и все заработает
ну или clickhouse client
запускаем -
Как подметил Константин, моя проблема заключалась в неумении пользоваться терминалом
-
Всем привет.
ни кто не встречал ошибку вида:
2021.07.19 16:29:14.947937 [ 18432 ] {} <Error> default.cnt: Considering to remove broken part /data/clickhouse/store/000/00000000-0000-0000-0000-000000000000/202107_358113_422227_2903 because it covers at least 2 other parts
2021.07.19 16:29:14.948140 [ 18550 ] {} <Error> auto DB::MergeTreeData::loadDataParts(bool)::(anonymous class)::operator()() const: Code: 33, e.displayText() = DB::Exception: Cannot read all data. Bytes read: 0. Bytes expected: 4., Stack trace (when copying this message, always include the lines below):
0. DB::ReadBuffer::readStrict(char*, unsigned long) @ 0x7d20ca5 in /usr/bin/clickhouse
1. DB::DataTypeNumberBase<unsigned int>::deserializeBinary(DB::IColumn&, DB::ReadBuffer&) const @ 0xd7e60ca in /usr/bin/clickhouse
2. DB::IMergeTreeDataPart::loadIndex() @ 0xe31d6ef in /usr/bin/clickhouse
3. ? @ 0xe38a9bb in /usr/bin/clickhouse
4. ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::__1::__list_iterator<ThreadFromGlobalPool, void*>) @ 0x7d285ed in /usr/bin/clickhouse
5. ThreadFromGlobalPool::ThreadFromGlobalPool<void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'l
ambda1'()>(void&&, void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()&&...)::'lambda'()
::operator()() @ 0x7d2ab4f in /usr/bin/clickhouse
6. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x7d25aad in /usr/bin/clickhouse
7. ? @ 0x7d295d3 in /usr/bin/clickhouse
8. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
9. __clone @ 0xfe9fd in /usr/lib64/libc-2.17.so
(version 20.12.4.5 (official build))
2021.07.19 16:29:14.948175 [ 18550 ] {} <Error> default.cnt: Part /data/clickhouse/store/000/00000000-0000-0000-0000-000000000000/202107_422228_423290_793 is broken. Looking fo
r parts to replace it.
2021.07.19 16:29:14.948200 [ 18550 ] {} <Error> default.cnt: Detaching broken part /data/clickhouse/store/000/00000000-0000-0000-0000-000000000000/202107_422228_423290_793 because it covers less than 2 parts. You need to resolve this manually
Сейчас пытаюсь восстановить одну из нод кластера и заметил в логе данную ошибку . На что она влияет и что с ней делать хз.
Версия 20.12.4.5-2. -
-
-
-
спасибо, помогло, странное поведение конечно 🙂
-
похоже на какие-то внутренние кеши
-
Что-то путаете.
https://pastebin.com/W0UirHRfilejn-latitude-7490 :) create table nt (a Nullable(Int), b Nullable(Int)) Engine - Pastebin.comPastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
-
у него целые наверно просто не nullable :)
-
Привет, а правильно ли я понял, что после создания таблицы поменять комментарий к ней через sql не получится?
Версия 21.3.13.9 -
ну можно /var/lib/clickhouse/metadata/db/table.sql поменять
и рестартануть сервер -
Да. Этот способ не работает
-
Если "да" означает "не nullable" - сделайте nullable.
Если что-то другое - сделайте минимально воспроизводимый пример, покажите запрос и таблицу. -
наверное человеку охота, чтобы работало и без nullable :)
-
Мы немного отошли от вопроса, изначально искал возможности делать запрос без работы над типами, например аналог nvl из oracle. Но ваш совет сделать nullable(int) подойдёт, спасибо!
-
можно и без изменения типа. но тогда для отсутсвующих значений писать -1 или то значение, которое у вас не используется
-
-
У меня id пользователя от 0, поэтому как вариант, попробую, спасибо!
-
Ок. Понял
-
21.7+ Cannot find column in source stream in a query with sampling · Issue #26522 · ClickHouse/ClickHouse
21.7.3 throws an exception if _sample_factor is used in a query: CREATE TABLE sessions ( `user_id` UInt64 ) ENGINE = MergeTree ORDER BY user_id SAMPLE BY user_id; insert into sessions values(1); SE...
-
от нуля или больше нуля? если больше нуля, то можно вместо coalesce использовать if(userId !=0, userId, userId2)
-
Больше 0. Попробую. Спасибо
-
а как у вас семплинг вообще работает?
у вас user_id это уже хеш? от 0 до maxUInt64 ? -
влияет конечно, я написал это как пример как тестить, на тех синтетических данных да не повлияло, потому что они чистая синтетика
-
Ага, окей, тогда буду тестить на примерно своих данных)
-
Коллеги, подскажите пожалуйста а что такое вертикальный мерж?
-
горизонтальный мерж идет по первичным ключам слияемых партов и читает и слияет все колонки одновременно.
если колонок больше 10, то включается ВЕРТИКАЛЬНЫЙ, каждая колонка слияется в своем проходе, таким образом ВЕРТИКАЛЬНЫЙ немного медленее, но расходует на порядки меньше памяти, при этом могут быть странные сайдэффекты, типа если в 100 колонках поле надо вычисить из другой колонки, например с json, то тот json прочитается 100 раз. -
спасибо!
-
тут скорее всего в одном месте имеется в горизонтальный, а в другом - вертикальный
upd увидел, спасибо -
да, спс. уже пять человек написали 😺
-
-
есть issue в гитхабе там все с картинками и описанием
-
попробую поднять вопрос еще раз
технический интерес -
мерж старых маленьких партов или например TTL вырезал строки и парты стали маленькими
-
какие вьюхи? View, Materialized View, Live View ?
Materialzed view получают данные от инсерта, они таблицу не читают, поэтому да синхронные. -
хм, действительно
была таблица replacementMT, нужно было почистить по pk (по ошибке залили с кривым pk), а в таблицу усиленно пишут "дубликаты"
спасибо! -
Materialized views, да, благодарю, а есть возможность профайлить их время выполнения?
-
про MV https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7597
https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf
>а есть возможность профайлить их время выполнения
пока нет. только вручную. -
И что будет если ошибка будет в mv? Инсерт пройдет, а клиент свалиться с ошибкой? Транзакций я так понимаю нет
-
Так а вручную как? В system.query_log их не вижу
-
смотрите кино
-
Или в смысле засекать на клиенте
-
Понял, гляну, спасибо
-
вот кстати про логгинг https://github.com/ClickHouse/ClickHouse/pull/25714
-
в смысле создавть тестовую таблицу без вью, инсертить 1млн. записей, добавлять вью, инсертить снова 1млн., добавлять еще одно вью, ....
потом включить --parallel_view_processing arg Enables pushing to attached views concurrently instead of sequentially. и снова инсерть 1млн -
@den_crane понял, спасибо большое
-
С этой опцией мерять параллельное выполнение просто?
-
да, в том кино я руками водил и показывал как оно
-
👌👌
-
в clickhouse-server.log все написано
-
спасибо, гляну)
- 20 July 2021 (164 messages)
-
Всем доброе утро.
Подскажите пожалуйста, каким образом в кликхаузе можно увидеть сколько потребляет памяти выполнение запроса? -
Это для выполняющихся
SELECT
initial_query_id,
formatReadableSize(memory_usage),
formatReadableSize(peak_memory_usage),
query
FROM system.processes
Для тех, которые выполнились в query_log -
Большое спасибо
-
Привет всем. Подскажите что не так, запускаю такой запрос:
INSERT INTO table (*)
SELECT *
FROM remote('188.*.*.*', table)
WHERE created_ts >= '2020-12-23 00:00:00'
AND created_ts < '2020-12-24 00:00:00';
такой запрос происходит без ошибок, но иногда вставляет не все, появляются дыры. в данных, как такое может быть? -
-
а данные то есть в исходной таблице к моменту исполнения запроса?
SELECT count() FROM remote(..) WHERE ... делали перед INSERT ? -
Да, есть
-
ну а ошибки как проверяете? как запрос запускаете? какой язык программирования?
-
-
-
-
-
dictGetOrDefault?
-
Спасибо
-
Всем привет! Использую кликхаус для построения запроса. Есть таблица А и таблица Б, делаю их join по id, затем хочу выделить из полученных данных два сплита, их сравнить еще одним джойном
Запрос падает по таймауту, в нем 9 select и три left join. Научите, пожалуйста, писать подобные запросы так, чтобы и код был короче, и таблица быстро считалась
Насколько я понял, в синтаксисе Clickhouse нет ни функций, ни ссылок, поэтому уже рассчитанные данные сохранить (мемоизировать) нельзя. Кроме этого, кода уже на 120 строк, а по-русски сформулировал в 120 символов 🤷 -
Можно через ARRAY JOIN + GROUP BY
WITH [Date, Date + INTERVAL 1 MONTH] as arr SELECT Client, StoreNo, Brand, sumIf(value, date2=Date) - sumIf(value, date2=Date + INTERVAL 1 MONTH) as diff ARRAY JOIN arr as date2 GROUP BY Client, StoreNo, Brand, date2 -
-
Привет, не подскажете, как заставить клиент не обрезать длинное значение колонки? нигде не могу найти опций про это
-
Всем привет, а как CH работает с диском? Я так понимаю там своё решение. Есть где почиатть про это?
-
-
-
жаль я не сишник :(
-
жаль, тада буду верить что всё делается идеально
-
ты хотел провалидировать?))
-
сделай Format JSON например)
-
Документация ClickHouse | Документация ClickHouse
ClickHouse is a fast open-source column-oriented database management system that allows generating analytical data reports in real-time using SQL queries
-
Понял, сенкс)
-
PrettyCompact¶
Отличается от Pretty тем, что не рисуется сетка между строками - результат более компактный.
Этот формат используется по умолчанию в клиенте командной строки в интерактивном режиме. -
ну код достаточно хорошо написан, хорошо читается даже без полноценного знания плюсов
-
с Pretty то же самое
-
Vertical работает более мне как надо
-
там show create table и колонок много
-
А можешь, пожалуйста, расширить пример?
Не очень понимаю этот код -
-
Можно, просто у вас версия старая, GLOBAL WITH был добавлен ~ 20.10
-
-
-
SELECT version();
-
-
Ну стоит посмотреть в сторону апгрейда, тк через месяц даже 20.8 уйдет в EOL
-
Давайте так.
Покажите запрос, что есть у вас сейчас, можете выкинуть ненужные части если есть такие. -
лол :) нет конечно
-
Ну как и в любом ПО бывают разные неприятные проблемы
https://github.com/ClickHouse/ClickHouse/issues/18844CRITICAL: DATA CORRUPTION on merges using linux AIO · Issue #18844 · ClickHouse/ClickHouseDescribe the bug After upgrading to clickhouse 20.12.4.5 we started seeing some merge errors, that lead to data loss. The main error message is : 2021.01.04 20:05:15.716664 [ 149272 ] {} <Er...
-
та блин) я без наездов
-
я хотел просто узнат ьчё как на диске
-
Да я тоже, просто шучу.
-
│ output_format_pretty_max_value_width │ 10000 │ 0 │ Maximum width of value to display in Pretty formats. If greater - it will be cut. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ UInt64 │
-
о да, то что надо, спасибо
-
всем привет) в ближайшее время ни у кого не было проблем с multiif?
-
-
Всем привет, кто может рассказать коротко о MaterializedPostgreSQL и почему у меня либо DB::Exception: Database engine MaterializedPostgreSQL cannot have arguments (version 21.7.4.18 (official build)), в случае с CREATE database mpsdb ENGINE = MaterializedPostgreSQL('servaddr:5432', '**DB***', 'user', 'pass')
SETTINGS materialized_postgresql_max_block_size = 65536,
materialized_postgresql_tables_list = 'schema.table' -
-
Привет всем! Есть вопрос по поводу read consciency. Я понимаю, что ClickHouse не транзакционален. Но тем не менее интересно знать, какие существуют гарантии доступности данных. После вставки большого количества данных в MergeTree таблицу (на одной ноде), есть ли гарантия, что та же сессия увидит все данные из всех столбцов? А другая сессия? Интересуюсь потому, что имплементирую ETL процесс из нескольких этапов, и следующий этап может читать данные из MergeTree таблицы, заполненной на предыдущем.
-
-
JSONExtract
-
Спасибо, я нашел эту функцию
-
Но при ее использовании мне возвращается пустая строка, не могли бы вы привести пример правильного использования? (Я смотрел документацию)
-
SELECT CAST('[[1, 2, 3], [3, 5]]', 'Array(Array(UInt32))')
-
Это сработало, спасибо, упустил момент с тем, что нужно два Array. Спасибо всем кто пытался помочь
-
Чудо!
Специально зашёл спросить про судьбу O_DIRECT в кликхаусах 2021 года. И прямо почти только что в группе об этом вспоминают.
(В своё время в ходе эксплуатации кластера пришлось больно столкнуться с порчей данных, вызванной https://github.com/ClickHouse/ClickHouse/issues/18844 . Пришлось выключать min_merge_bytes_to_use_direct_io .
А где-то зимой для нескольких версий типа 20.8-21.1 прошло изменение "Disable write with AIO during merges because it can lead to extremely rare data corruption of primary key columns during merge. #18481 (alesapin).", которое direct_io отключало. )CRITICAL: DATA CORRUPTION on merges using linux AIO · Issue #18844 · ClickHouse/ClickHouseDescribe the bug After upgrading to clickhouse 20.12.4.5 we started seeing some merge errors, that lead to data loss. The main error message is : 2021.01.04 20:05:15.716664 [ 149272 ] {} <Er...
-
Чем это всё закончилось то в итоге?
Хотелось бы для мерджей direct_io использовать, чтобы вставка данных не вымывала кэш операционной системы... -
Да, там недавно io_uring вообще убрали из мержей на более простой механизм.
-
Remove AIO for sequential reads by alexey-milovidov · Pull Request #26003 · ClickHouse/ClickHouse
Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Remove complicated usage of Linux AIO with one block read...
-
То есть, если хочется с вымыванием кэша бороться (чтобы по возможности в горячих данных было то, к чему запросы в БД на чтение приходят, а не сиюминутные вставляемые данные), то:
1) Теперь в оба глаза следить за changelog,
2) Когда в новых версиях данное изменение появится, ставить в ТЕСТ такую версию, возвращать обратно min_merge_bytes_to_use_direct_io
3) и проверять под нагрузкой
? -
-
Не только,
к мержам он тоже относится. -
Да, всегда лучше проверять на своем железе, вдруг что.
Появится это изменение должно в 21.9, к сожалению чуть опоздало, что бы попасть в следующий LTS -
Конечно, обязательно проверять.
"Disable write with AIO during merges because it can lead to extremely rare data corruption of primary key columns during merge." ( https://github.com/ClickHouse/ClickHouse/pull/18481)
На нагрузке в 600-700 KEpS это самое "extremely rare data corruption" приводило к отнюдь не столь rare поломкам между репликами ("Code 40: ... Checksums of parts don't match: hash of uncompressed files doesn't match, uncompressed hash of compressed files doesn't match") раз в сколько-то дней:)Disable write with AIO even for big merges by alesapin · Pull Request #18481 · ClickHouse/ClickHouseI 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...
-
Ага,
Яндекс недавно в своей статье про баги в ядре линукса такое описал
Представьте редкий баг, который стреляет раз в два года. Что с ним делать, совершенно непонятно. Непонятно даже, нужно ли на него реагировать. Такой произошел у нас буквально недавно. На наших масштабах это означает 150 падений в день — огромные масштабы, совершенно неприемлемо. То есть очень редкие баги нас очень сильно бьют по голове. -
Добрый день! Подскажите пожалуйста! получаю ошибку вида:
HttpCode:400 ; ;Code: 27, e.displayText() = DB::ParsingException: Cannot parse input: expected 'eof' before: '.5' (version 21.7.3.14 (official build))
На запрос:
INSERT INTO `active_record_log` (`model`,`type`,`pk`,`attributes`,`user_id`,`company_id`,`create_date`,`create_at`) VALUES ('test',1,'test','test',83,1,'2021-07-20','2021-07-20 17:27:49')
При этом если делаю запрос через шторм - все отлично, через приложение - эксепшен... в какую сторону копать? -
> Cannot parse input: expected 'eof' before: '.5'
Какая то черепашка врет.
Я вот не вижу .5 в запросе.
Что за приложение? -
Да сайт обычный, эксепшен с него распечатываю
-
прям из эксепшена и беру подготовленный запрос
-
А как передаете values и сам запрос? в боди?
-
вот через этот вендор делаю:
smi2/phpclickhouse -
при этом сейчас фактически просто поменял сервер, развернул новый КХ и перенаправил на него
-
в предыдущий сервер пишет отлично )))
-
А предыдущий сервер на какой версии?
-
ClickHouse server version 20.3.7.46 (official build).
-
Попробуйте новый откатить до 21.3
-
попробую, спасибо
-
Спасибо, интересно.
Буду ждать 21.9 -
Не удалется crd из k8s
Снова поймал этот баг operator 0.15
Name: clickhouseinstallations.clickhouse.altinity.com
Namespace:
Labels: <none>
Annotations: <none>
API Version: apiextensions.k8s.io/v1
Kind: CustomResourceDefinition
Metadata:
Creation Timestamp: 2021-07-20T17:21:29Z Deletion Grace Period Seconds: 0 Deletion Timestamp: 2021-07-20T17:29:30Z Finalizers: customresourcecleanup.apiextensions.k8s.io
Custom resources with finalizers can "deadlock" customresourcecleanup.apiextensions.k8s.io finalizerKirill Kazakov in ClickHouse не тормозитНе удалется crd из k8s удалить. k8s 1.18 chi-operator: 0.14 При переустановке пишет, что предыдущий crd не удален. Error: rpc error: code = Unknown desc = release clickhouse-operator failed: object is being deleted: customresourcedefinitions.apiextensions.k8s.io "clickhouseinstallations.clickhouse.altinity.com" already exists Получается удалить только таким патчем: kubectl patch crd/clickhouseinstallations.clickhouse.altinity.com -p '{"metadata":{"finalizers":[]}}' --type=merge Есть ли способ пофиксить это поведение, чтобы удаление было корректно ?
-
Добрый вечер, нужна подсказка или что почитать по сжатию данных кликхауса
интересен конфиг <compression> и какие параметры как влияют, может кто разбирал
Есть большое желание как-то снизить размер данных на диске, а заодно понять как этот блок можно использовать и к чему это приводит.
Наверно первый вопрос, можно ли на рабочей БД поменять тип сжатия на zstd и потом вернуть дефолт (Вопрос в том, насколько безопасно менять тип сжатия, не повредятся ли данные)? -
Не надо трогать его, лучше крутите сжатие отдельных колонок профитп будет больше
-
Ок, но вопрос тот же менять кодек колонки можно в любом порядке.
Например потестить с lv4 потом альтером поменять на zstd, потом уровни поменять, данные в таком случае не сломаются? -
-
Нет, но колонки будут в старом кодеке пока мерж не случится
-
-
А мердж руками можно запустить?
-
-
Там есть под статья где показано как тестироаат кодеки
-
Там как раз есть OPTIMIZE TABLE, я так понимаю эта команда как раз и сжимает данные после alter?
-
Т.е. последовательность действий такая:
Скопировать какой-нибудь партии для тестов.
Попробовать разные кодеки:
Alter table с кодеком на колнку, потом OPTIMIZE TABLE.
И смотреть что изменилось.
Примерно так? -
Точнее не в этой а в следующей статье про тест кодеков
-
Ничего страшного не случится, если данные пожаты разными методами.
Все прочитается успешно. -
Немного не в этом вопрос, если одну и туже колонку поочередно сжимать разными вариантами (в режиме теста), чтобы понять как она ведёт себя, кликхаус корректно переводит из любого кодека в любой другой?
-
-
О шикарно, спасибо)
А может уже есть какое-то исследование какой колонке лучше подходит конкретная комбинация кодека. Например строка с небольшим количеством вариантов (10 на 1кк) и для строки с большим разнообразием вариантов (100к на 1кк)?
Как в статье https://altinity.com/blog/2019/7/new-encodings-to-improve-clickhouse с числамиNew Encodings to Improve ClickHouse EfficiencyJuly 10, 2019Modern analytical databases would not exist without efficient data compression. Storage gets cheaper and more performant, but data sizes typically grow even faster. Moore’s Law for big data outperforms its analogy in hardware. In our blog we already wrote about ClickHouse compression (https://altinity.com/blog/2017/11/21/compression-in-clickhouse) and Low Cardinality data type wrapper (https://altinity.com/blog/2019/3/27/low-cardinality). In this article we will describe and test the most advanced ClickHouse encodings, which especially shine for time series data. We are proud that some of those encodings have been contributed to ClickHouse by Altinity.This article presents an early preview of new encoding functionality for ClickHouse release 19.11. As of the time of writing, release 19.11 is not yet available. In order to test new encodings ClickHouse can be built from source, or a testing build can be installed. We expect that ClickHouse release 19.11 should be available in public releases in a…
-
только если вы на одной и той же таблице будете кодеки менять, будет очень трудно их между собой сравнивать
-
все от данных зависит
order by тоже сильно влияет -
Ну я больше как стартовый вариант от которого отталкиваться ищу, дальше методом тыка и подбором)
-
План был в том, чтобы взять самые жирные колонки, которые по дефолту меньше всех сжаты, и поочереди на каждой колонке пробовать разные комбинации кодеков и потом собрать статистику. По сути сделать тоже что в статье с числами
-
скопируйте лучше данные в несколько таблиц с разными кодеками
-
Да спасибо, буду пробовать)
-
Насколько распоространено использрвание zetcd вместо zookeeper?
-
Ещё вопрос в контексте текущего.
Тут видел советы поставить по дефолту zstd в конфиг. У нас сейчас блок компрессии закоментирован, можно ли его использовать, например просто раскоментировав, для тех же целей экономии места -
Скорее всего тут тоже все от самой схемы бд зависит. У нас примерно так:
Основная таблица в которую идет запись и на ней висит несколько материализационных вьюх, с агрегацией. Выборка идет только из вьюх.
В основную таблицу только запись, сейчас объем небольшой около 4-5к в секунду -
ну тут вопрос - готовы ли вы разменять возможную прибавку места на потребление CPU?
-
-
-
Ну в данный момент времени наверно да, я кстати не смотрел что с cpu но по мониторингу всплесков не видел.
У нас сейчас ситуация такая: пилот проекта и очень ограничены ресурсы. Железка такая: 4 ядра 4 гига и 17 ГБ HDD в запасе можно докинуть ещё около 30 ГБ
На пилот был план на небольших клиентов и поначалу так и было, они генерили 50к событий в день и тратили несколько мегабайт. Сейчас подключили 1 жирного лкиента и он половиной пользователей поднял планку до 800к событий в день и 200 мб и оказывается есть планы на еще клиентов.
Вариант увеличения железа прорабатывается, но т.к. пилот - все сложно )
Поэтому кажется что cpu у нас в достатке -
--output_format_pretty_max_column_pad_width arg Maximum width to pad all values in a column in Pretty formats.
--output_format_pretty_max_value_width arg Maximum width of value to display in Pretty formats. If greater - it will be cut. -
там война и мир отдыхает по размеру. Там чего-то только нет и direct_io и mmap и async_io в зависимости от ситуации.
-
были
-
Ещё один вариант, спасибо)
-
distributed таблица умеет читать из актуальных реплик
--max_replica_delay_for_distributed_queries arg If set, distributed queries of Replicated tables will choose servers with replication delay in seconds less than the specified value (not inclusive). Zero means do not take delay into account. -
direct_io отключать? у вас какая фс? Я не помню бага про direct_io
-
там вроде все понятно из описания? Проблем поменять туда сюда нет, но менять надо на обеих репликах как можно более одновременно
-
есть TTL re-compress, можно старые данные пережимать более сильным компрессором
-
да не работает он.
сейчас внедряется собственный clickhouse-keeper , замена зукипера -
я все жму zstd не вижу разницы в перфомансе, упирается в диск
-
Спасибо!
чем clickhouse-keeper будет лучше zookeeper? -
ну а чем вам зукипер не угодил?
-
я пока не знаю 😄
-
пытаюсь построить какую-то картину мира в голове
-
когда в прод собираетесь?
-
Еще тестовый стенд не подняли 😉
-
ClickHouse/clickhouse-keeper.md at master · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
ClickHouse Keeper | ClickHouse Documentation
[pre-production] clickhouse-keeper ClickHouse server use ZooKeeper coordination system for data replication and distribu
-
У нас особо старых нету, все прямо сейчас резко полетело, за неделю с 200мб до гига доросли)
Репликации нет, один сервак, поэтому менять проще) -
<compression>
<!-- Set of variants. Checked in order. Last matching case wins. If nothing matches, lz4 will be used. -->
<case>
<!-- Conditions. All must be satisfied. Some conditions may be omitted. -->
<!-- Min part size in bytes. -->
<min_part_size>100000000</min_part_size>
<!-- What compression method to use. -->
<method>zstd</method>
<level>1</level>
</case>
</compression>
вот: если размер парта меньше 100000000 байт то LZ4, если больше то ZSTD
нужет рестарт -
Возможно мне просто сложно понять) Хм, но кажется раза с 10 понял, но не до конца.
"Минимальный размер части таблицы" Что за часть и как она определяется, первая мысль была про партицию.
Сейчас появилось другое понимание:
Например 2 case:
У одного минимальный размер части 10.000
У второго 40.000
Если в таблице 100.000 строк, он для 80.000 использует второй кейс а для оставшихся первый?
Если в таблицу прилетит ещё 20.000 записей он возьмет те 20.000 из первого кейса, сложит с новыми и сожмет по второму(40к) кейс? -
каждый инсерт создает парт уровня _0.
после n insert-в образуется n партов _0.
шедулер мержей анализирует постоянно, и в какой-то момент принимает решение, m первых партов пора cмержить в единый парт, получается парт уровня _1
парты разных уровней постоянно мержатся из мелких в крупные
все это в рамках ОДНОЙ партиции
и так все продолжается пока размер партов не достигнет макс. размера 150ГБ.
И например мерж решает помержить 6 каких-от партов, считает общий размер этих партов, если размер больше 100000000, то жмем ZSTD, меньше LZ4 , таким образом все парты со временем становятся пожатыми ZSTD, пока они маленькие и постоянно ре-мержатся в более крупные, они пожаты LZ4.
для _0 используется размер несжатого парта -
Интересно, а есть select чтобы посмотреть какие парты сейчас есть и их размер?
-
select name,partition, formatReadableSize(bytes) size,rows, database,table
from system.parts
where active = 1 and table like 'таблица' -
-
на таких объёмах можно сжатие не оптимизировать, время разработчика дороже.
просто возьмите дешёвый нормальный хостинг, например hetzner. возьмите там самый дешёвый сервер (40 евро, 2tb sata или 512 пи ssd) и вам его с головой хватит. либо у них же самую дорогую виртуалку за 50 евро (360gb ssd). -
да, trade-off, но уже ZSTD(2 или 3) начинают тормозить CPU так что невозможно инсертить
-
у нас вроде пока не сильно много данных, по скорости почти все запросы отрабатывают меньше 50-300мс(большинство до 70-100), штук 5 за месяц отработали за 500-600мс, даже если в 2 раза отклик увеличится, но это даст свободное место, то пойдет )
-
у меня и инсерты маленькие, по 2-3к строк в секунду
-
я в хецнере перехожу на sx134
128 GB DDR4 ECC
10 x 16 TB
224.91 € -
160TB места на серваке, есть где развернуться
-
посмотрел, самый большой парт с именем 202107_21608_37058_24_29583, получается он пережил 29583 мерждой?
-
вот на самом деле с таким объяснением и запросом с получением этих партов сильно понятнее стало )
-
охренть, что-то я даже на неё не обращал внимания, думал делловский взять и самому дисков накидать, а тут по сути готовая сборка для схемы хот/колд стораджа.
-
202107 -- партиция
_21608 -- начальный блок (автоинкремент)
_37058 -- конечный блок
_24 уровень мержа
_29583 -- версия мутации -
_29583 -- мутации / alter table update / delete -- это путь в никуда.
-
скорее всего это после тестов осталось, до пилота сервак был тестовым. alter table делаем только в накатах, раз в месяц при отключенной нагрузке
-
а если в конфиге указан zstd то какой уровень используется? из тега level?
-
да
-
здорово, спасибо большое, буду пробовать )
-
кстати в описании тега уровня нету
-
не спросил не знал бы )
-
да, все знания по КХ в этом чате, отмотайте на 2016 год, там все написано 🙂
-
Хах, я долго сегодня мотал поиском по zstd остановился на начале 19 года)
-
Да, возможность присутствует, и уже довольно давно.
Использовать так: просто прописать в элементе level рядом с method:
<!-- Which compression method to choose. -->
<method>zstd</method>
<level>2</level> -
Хорошо. Там есть ещё возможность увеличить уровень сжатия. По-умолчанию это 1. Я рекомендую пробовать постепенно. Всё-таки будет использоваться существенно больше CPU. Кстати, изменения влияют только на данные, которые были записаны и помержены после изменений.
-
дописал кстати https://github.com/ClickHouse/ClickHouse/pull/26616/filesDoc. Documentation for compression level by den-crane · Pull Request #26616 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Documentation (changelog entry is not required)
-
А уровень же только для zstd используется?
-
нет
-
Lv4 то же по уровням 1-22?
-
А блин где-то же видел, там вроде 1-9
-
а точно надо в доку тоже добавить lzhc
- 21 July 2021 (217 messages)
-
ну, странно, должен по идее в 1.10 быть пофикшен у вас 1.18 же
попробую сегодня с главным разработчиком поговорить...
kubectl get chi --all-namespaces есть какие то в системе?
CRD он же cluster level -
Всем привет!
При обновлении ClickHouse до версии 21.7.4.18 у нас изменилась выдача наименований полей с использованием функции untuple()
SELECT untuple((a, b))
FROM
(
SELECT
1 AS a,
2 AS b
)
┌─tupleElement(tuple(a, b), 1)─┬─tupleElement(tuple(a, b), 2)─┐
│ 1 │ 2 │
└──────────────────────────────┴──────────────────────────────┘
Раньше, как и написано в документации, должны и были наименования полей a и b -
Добрый день, мне нужно обновить CH с 19.1.14 до какой-то актуальной стабильной, например 21.1.3.32-stable. Я понимаю, что это нужно делать постепенно и тестировать свои запросы на каждом шаге. Т.е. обновил до 19.3.9,1, проверил. Обновил до 19.4.4.33, проверил, и т.д. Тут я предположил, что я могу переходить каждый раз на новую минорную версию, с максимальной версией патча. Есть ли возможность минимизировать количество итераций “обновил-проверил”? Или все очень индивидуально и зависит от фич которые мы используем?
-
Емнип можно сразу на нужную версию если устраивают все breaking changes по пути. Ну и 21.1 уже не поддерживается, лучше хотя бы 21.3
-
-
Основная проблема в обновлении это откат назад по версии.
Те в идеале вам нужно сделать копию данных и обновляться и гонять тесты на этой копии -
-
-
Есть таблица
CREATE TABLE src (
itemName String,
lastSeen DateTime,
col1 ....,
col2 ....,
colN ....,
)
ENGINE ReplacingMergeTree(lastSeen)
PRIMARY itemName
ORDER BY itemName
Как получить 100 itemName, у которых последняя добавленная запись для каждого (если если не смерджились записи) имеет наименьший lastSeen?
Вот сколько не думаю над стртукрой таблицы или вьюхами, все равно вижу только вариант, когда клику нужно полностью таблицу читать.
Если делать PRIMARY как itemName, то нужно прочитать всю таблицу чтобы найти наименьшее значение.
Если делать PRIMARY как lastSeen,itemName ., то будут дубликаты, первый из которых имеет потенциально может иметь запись 1990-01-01, а второй 2021-01-01 и между которыми миллионы записей. и чтобы убрать дубликаты (group by), опять нужно читать всю таблицу.
Тупик какой-то или есть варианты?
или может как-то построить таблицу, чтобы как-то через PREWHERE отсекать часть данных, операция идет раз в сутки, по сути и полная вычитка таблицы более мнее норм, но хочется опмизировать процесс. -
Привет! А как можно строку
{
\"a\" = \"b\";
\"c\" = \"d\";
}
простым способом превратить в map({"a": "b", "c": "d"})? Или можно только сплитить по знаку равно, превращать в массив? -
Это YSON, в кликхаусе нет функций для работы с ним
-
спасибо!
-
всем привет.
подскажи, а можно как-то увидеть, что зукипер реплицирует между репликами в текущий момент?
и как поднять приоритет конкретной таблицы для синхронизации -
Файловая система - ext4, кластер версии 20.10.
При тестировании обнаружилось, что в тестовом стенде, если его оставить под нагрузкой (кластер 4 ноды, где-то 600-700 KEpS) на недельку-другую, время от времени повреждаются парты большого размера (сколько-то десятков гигабайт), что иногда приводило к потере данных . Судя по логу - exception возникал при проверке результата слияния нескольких крупных кусков.
В телеграммной группе и среди Issues самое близкое по совокупности симптомов к той проблеме удалось найти в "CRITICAL: DATA CORRUPTION on merges using linux AIO" https://github.com/ClickHouse/ClickHouse/issues/18844 . Симптомы очень близкие, хотя и не идентичные.
Текст первоначального эксепшна, включая упоминания DB::WriteBufferAIO, DB::MergeTreeDataPartWriterOnDisk у нас был ровно тот же, что и в 18844:
<Error> virtual DB::WriteBufferAIO::~WriteBufferAIO(): Code: 49, e.displayText() = DB::Exception: An overflow occurred during file operation, Stack trace...:
Использовалась минорная версия ветки 20.10 ранее, чем произошло исправление Issue 18844 в https://github.com/ClickHouse/ClickHouse/pull/18481 , а обновляться по организационным причинам тогда было слишком тяжело . В итоге проблему обошёл, совсем отключив direct_io через min_merge_bytes_to_use_direct_io.CRITICAL: DATA CORRUPTION on merges using linux AIO · Issue #18844 · ClickHouse/ClickHouseDescribe the bug After upgrading to clickhouse 20.12.4.5 we started seeing some merge errors, that lead to data loss. The main error message is : 2021.01.04 20:05:15.716664 [ 149272 ] {} <Er...
-
-
-
мерси
-
Ничего не было , уже убил этот crd ....
-
argmax же
-
мне бы в аргумент несколько значений
-
tuple(*)
-
ну * не работает, но перечислить в кортеже можно, а потом вытащить
-
мысль понял, спасибо!
-
работает
-
ну тада ваще супер пупер, может в моеё версии кх не работало...
-
я давно не проверял, но 3 года назад работало
-
Добрый день. Не могу в запросе КХ обратиться к данным базы MS SQL через табличную функцию odbc. Не подскажете, в чем может быть проблема ?
-
-
таблица по названию похожа на 1С
LIMIT внутрь odbc не передается -
Да, это база MS SQL от 1С. LIMIT убрал (в таблице 31 запись), не помогло. То же сообщение об ошибке
-
Code: 86, e.displayText() = DB::Exception: Received error from remote server /columns_info?connection_string=DSN%3Dsql06%3BUID%3Dsa%3BPWD%3D159963&schema=rw_dest&table=_Document191&external_table_functions_use_nulls=true. HTTP status code: 500 Internal Server Error, body: Error getting columns from ODBC 'std::exception. Code: 1001, type: nanodbc::database_error, e.what() = ../contrib/nanodbc/nanodbc/nanodbc.cpp:4918: 2400: [FreeTDS][SQL Server]Invalid cursor state (version 21.6.4.26 (official build))'
-
возможно в 1C есть поля каких то типов которые не могут сконвертироваться
-
попробуйте одно какое то поле выбрать
-
-
а можете попробовать clickhouse 21.3 LTS вместо 21.6 ?
-
Соединение с базой проходит (если изменить логин или пароль или имя базы, получаю ошибку подключения)
-
да, это тестовый сервер. в рабочем данные из SQL утилитой bcp.exe выгружаются. хотел напрямую, пока не получилось. попробую, но чуть дольше будет
-
https://github.com/FreeTDS/freetds/issues/179
воможно проблема в самом FreeTDS и том как clickhouse его используетSQLGetData returns "Invalid Cursor State" · Issue #179 · FreeTDS/freetdsWe are trying to read variable length Spatial data from Microsoft SQL Server Spatial 2012 on Linux using FreeTDS driver. The size of the data is not known in advance and is read using Long Data alg...
-
Спасибо. Похоже, что проблема в FreeTDS. А существует другой способ в запросе КХ обратиться к данным базы MS SQL ?
-
всем привет!
подскажите, плиз, а есть ли какой-то бест практис как подменить партицию в шардированной таблице атомарно?
схема данных такая:
3 шарда в каждом по 2 реплике
на каждом по ReplicatedMergeTree таблице
ENGINE = ReplicatedMergeTree PARTITION BY metric_src
и на них "смотрит" Distributed таблица.
Пока есть такой вариант: создать еще временные ReplicatedMergeTree таблицы на каждом шарде и временную Distributed, в нее записать данные и потом сделать REPLACE PARTITION, но в таком случае появляется проблема с тем, что при выполнении подмены партиции на каждом шарде может произойти сбой на одном из машин и в основной Distributed таблице будут неконсистентные данные.
Возможно, есть какие-то другие схемы как это сделать, например, через другие движки? -
увы нет, только odbc
и его особо сильно не тестировали именно в связке с MSSQL
вот тут есть примеры конфигов с которыми это все должно работать
https://clickhouse.tech/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources/#example-of-connecting-ms-sql-server
какая у вас версия freetds ? и какая OS?
может имеет смысл обновить?Sources of External Dictionaries | ClickHouse DocumentationSources of External Dictionaries An external dictionary can be connected from many different sources. If dictionary is c
-
-
https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#server_configuration_parameters-listen_host
смотрим настройки в /etc/clickhouse-server/Server Settings | ClickHouse DocumentationServer Settings builtin_dictionaries_reload_interval The interval in seconds before reloading built-in dictionaries. Cli
-
Ubuntu Server 20.04 LTS, версия freetds: 7.3
-
ну, с учетом того что Distributed таблица Данные не хранит при SELECT ...
То надо просто убедиться что REPLACE PARTITION прошел нормально... -
по этой документации и настраивал /etc/freetds/freetds.conf
/etc/odbcinst.ini /etc/odbc.ini -
а какая версия MSSQL?
-
MS SQL версия 13.0.4259.0
-
мне надо указать:
<listen_host>::</listen_host>
<listen_host>0.0.0.0</listen_host>
?? -
freetds.conf
можно попробовать
tds version = 7.4
поставить
глядя на табличку
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-tds/135d0ebe-5c4c-4a94-99bf-1811eccb9f4a[MS-TDS]: Appendix A: Product BehaviorThe information in this specification is applicable to the following Microsoft products or supplemental software. References to product versions
-
да, но REPLACE PARTITION нужно делать на разных шардах и может получиться такое, что на одном шарде подмена пройдет раньше чем на другом и в этот момент будет запрос на SELECT в Distributed и мы получим неконсистентные данные
-
можно только второе
-
у clickhouse, eventually consistency во многих вещах
и многие вещи выполняются "асинхронно"
зато без блокировок -
-
Не помогает. CH нужно как-то перезагружать по особому? я сделал stop и start. В итоге написано, что он всё равно слушает 127.0.0.1 и не коннектит.
И ::1 где-то берёт -
используйте ON X=Y
вполне себе рабочее решение...
за исключением того что если вы используете JOIN в clickhouse то возможно вы это делаетене от хорошей жизни...
что-то делаете не так... -
точно, по табличке только FreeTDS 7.4 нужен. Спасибо, попробую
-
на скриншоте reload
сделайте
systemctl clickhouse-server restart -
grep listen -r /etc/clickhouse-server/
что говорит? -
restart Сделал, не помогает.
-
ну тут джойн сам на себя. Using выводится только один столбец а ON они задваиваются(
-
ок. смотрите
grep -r listen /var/lib/clickhouse/preprocessed_configs/config.xml
что там? -
-
truncate -s 0 /var/log/clickhouse-server/clickhouse-server.log
truncate -s 0 /var/log/clickhouse-server/clickhouse-server.err.log
systemctl restart clickhouse-server
и дальше смотрите логи
/var/log/clickhouse-server/clickhouse-server.log -
получается нет никаких механизмов/хаков как можно было бы атомарно подменять данные на нескольких шардах?
-
Пока нет
Но делают -
А есть другие айпишники или клик запускается в докере и таи кроме 127.0.0.1 ничего и нет?
-
-
а это уже есть в роуд мапе? если ссылка где-то под рукой был бы очень признателен
-
Ну значит не в ту секцию в xml файле настройки добавляете
-
Part movement between shards by nvartolomei · Pull Request #17871 · ClickHouse/ClickHouse
This is ready for feedback. Implements part uuid "pinning" and movement between shards. Part of #13574 Outstanding tasks for next PR ALTER TABLE t MOVE PART x CANCEL or similar. ...
-
в логах нашёл только эту строчку из интересного. И дальше он пишет, что слушает 127.0.0.1 и [::1]
-
Спасибо!
-
-
ну или даже не тот конфиг правите. проверьте используется ли вообще этот конфиг или нет, а также используется ли вообще эта секция или нет
-
путь соответствует тому, что в логах
-
-
-
посмотреть таблицу .inner.mv_name
-
ну у всех то работает. так что вы что-то делаете не так. что-то где то упустили. в таком случае нужно скрины, которые бы показали, что процесс использует именно этот конфиг, что именно в этом конфиге внесены изменения, что рестартует без ошибок.
-
атомарность возможна в рамках одного сервера REPLACE PARITION именно это и делает
но о какой атомарности идет речь, если репликация асинхронная?
если в шарде несколько реплик. то подмена парта в реплике по идее стартует процесс помещения этого нового парта в ZK
и дальнейший его fetching средствами другой реплики clickhouse
distributed вообще ни о какой атомарности не знает и не знает даже что там за таблица будет на принимающем сервере под капотом
при вставке в нее там просто временные файлы создаются которые потом через distributed sends в шарды пропихиваются
а при select просто идет обычный SQL подзапрос в котором вместо аггрегатных функций делается aggfunctionState
который потом домерживается уже на ноде инициаторе -
так все эти скрины были выше
-
смотрим SHOW TABLES
находим .inner таблицу
дальше в system.tables смотрим total_bytes для этой таблицы -
"атомарность" разве там есть ?
-
вы сделали как вам сказали вот тут
https://t.me/clickhouse_ru/227494 ?
что в логах показывается?Slach [altinity] in ClickHouse не тормозитtruncate -s 0 /var/log/clickhouse-server/clickhouse-server.log truncate -s 0 /var/log/clickhouse-server/clickhouse-server.err.log systemctl restart clickhouse-server и дальше смотрите логи /var/log/clickhouse-server/clickhouse-server.log
-
Для переездов партов между шардами?
Да, конечно. -
Спасибо, вижу несколько .inner таблиц с uuid в названии, а как сопоставить с конкретным MV?
-
не хватает systemctl status clickhouse-server
-
рахобрался, спасибо за ответы
-
SHOW CREATE MATERIALIZED VIEW db.ваш_mv SETTINGS show_table_uuid_in_table_create_query_if_not_nil=1
-
ip addr
netstat -tulpn | grep clickhouse -
-
-
-
так и думал. вы сами-то конфиг смотрели?
-
-
-
откройте его и посмотрите ещё раз, даже самый невыспавшийся человек сможет заметить, там даже цветом отличается :)
-
для тех кто ещё спит: эта настройка закомментирована :)
-
спасибо) Я с xml особо никогда не работал
-
ну, теперь вы знаете, почему там другим цветом :) кстати на будущее: также комментируется и в html, потому что это подмножество xml
-
Всё заработало, спасибо вам большое, буду знать)
-
-
Я _думаю_ что нужно во втором дц делать materialized view, который будет вставлять в таблицу в первом дц через remote.
-
его ещё даже в доке нету, да и в стейбл ветках тоже не видно
-
https://clickhouse.tech/docs/en/engines/database-engines/materialized-postgresql/ - тут про это написано, но чего то у меня не взлетело.MaterializedPostgreSQL | ClickHouse Documentation
[experimental] MaterializedPostgreSQL Creates ClickHouse database with an initial data dump of PostgreSQL database table
-
а, я на русском искал. в общем в вашей версии клика его наверно ещё нет
-
-
html родился до xml , как он может быть подмножеством?
там нет строгих требований про закрытые теги и т.д. -
Добрый день
хотим расширить КХ на 2 шарда с одного, все таблицы на ReplicatedReplacingMergeTree
какие могут быть подводные камни ? .... возможно что-то надо подготовить к данному процессу ? -
я имел ввиду современный html, а точнее HTML 5, он же XHTML, но ему мало кто соответствует
-
надо выбрать ключ шардирования, если хочется чтобы Replacing работал, надо чтобы записи с одинаковым ключом попадали преимущественно на один шард
-
зачем все это? В КХ вообще нет атомарности и durability даже в рамках одного сервера. Все кто говорят обратное просто не понимают тонкостей.
-
а он не по primary key шардирует ?
-
нет. MergeTree таблицы не в курсе про кластер и про шардирование. На самом деле 2 ReplicatedMergeTree таблицы в разных шардах это ДВЕ/N РАЗНЫЕ таблицы. У них просто одинаковое имя -- это необязательно. Эти ДВЕ ТАБЛИЦЫ не связаны вообще.
-
ок ... спасибо
-
Каждый шард это отдельная сущность, она вообще не подозревает что шардов много.
Запросы on_cluster это просто хелпер, который выполняет запросы на каждой ноде, я не пользуюсь on_cluster -
ну т.е. я так понял что автоматического распределения данных при добавлении шарда здесь нет ?
-
и каждый раз при добавлении шарда нужно по сути перезаливать все данные
-
решардинга? нет, и еще долго не будет, появится наверное лет через 10.
-
да
-
ок 🙂 спасибо
-
а для приложения есть какие-то изменения ? приложению самому нужно определять в какой шард обращаться или оно само ? 🙂
-
Добрый вечер! Хотим сэкономить память на хранении словарей в столбце и хранить не чисто стринговыми значениями, а при помощи, например hash-словарей. Это возможно вообще?
-
Добрый день! Подскажите плиз: я подключаю движок ПГ
https://clickhouse.tech/docs/ru/engines/database-engines/postgresql/
и когда пытаюсь посмотреть таблицы кх ругается:
SQL Error [60]: ClickHouse exception, code: 60, host: 192.168.235.72, port: 8123; Code: 60, e.displayText() = DB::Exception: PostgreSQL table etl."telegram_chats" does not exist: While executing Tables (version 21.4.6.55 (official build))
я так понимаю и-за того что не указана схема, можно ли это как-то обойти?)PostgreSQL | Документация ClickHousePostgreSQL Позволяет подключаться к БД на удаленном сервере PostgreSQL. Поддерживает операции чтения и записи (запросы S
-
Distributed таблица умеет шардить
-
эээ LowCardinality ?
-
это норм, когда в столбце для каждой строки меняются ключи?
-
в смысле все String разные всегда и не повторяются?
-
ключи могут исчезать и появляться новые
-
-
давайте конкрентые примеры, вот например есть http user agent. Он длинный, вы не хотите хранить его в таблице, вы хотите хранить хеш, но user agent-в много и они очень редко повторяются, речь про это?
-
не совсем
есть словарик, где пар ключ-значение может быть от 50 до 250 за одну строчку
и для каждой строчки какие-то ключи могут исчезать и повляться -
там как бы null просто этого не видно
set aggregate_functions_null_for_empty=1
┌─argMaxOrNull(str, dt)─┐
│ ᴺᵁᴸᴸ │
└───────────────────────┘
тоже самое
select max(str) from (select 10 as id, 'val' as str, today() as dt) where id != 10;
┌─maxOrNull(str)─┐
│ ᴺᵁᴸᴸ │
└────────────────┘
select id, max(str) from (select 10 as id, 'val' as str, today() as dt) where id != 10 group by id;
0 rows in set
в стандартном SQL , в mysql / pg/ sqlite тоже самое -
ниче не понял
-
-
ну ОК, добавим в таблицу две колонки массива key Array(String), value Array(String). Тоже самое Nested , тоже самое новый Map
причем тут хеши? key повторяются? value повторяются? -
тогда ведь слишком много строк станет
повторяются key и повторяются values -
в смысле у каждого ключа всегда известен/жестко задан value ?
-
он меняется, в том и дело
меняется в зависимости от значений двух других столбцов -
и вы не хотите хранить value в таблице?
-
хочу как-то сэкономить память для такого типа данных
когда храню как стринг, то очень много жрет -
ну есть external dictionary , туда можно сделать dictGet(..... tuple(key, два других столбца))
-
но это ведь можно делать только на основании уже существующих данных в базе? т.е. постоянно его обновлять нужно при добавлении новых строк?
-
ну да, в ETL это надо
-
спасибо
-
всем привет, отвалилась табличка в ридонли, в логах такое: There is a problem with deleting parts from ZooKeeper: Code: 999, e.displayText() = Coordination::Exception: Session expired (Session expired), Stack trace (when copying this message,
always include the lines below):
Как такое чинить? Зукипер с виду ок -
Пути в зк есть
-
и он доступен
-
а где есть? Поставил 21.9.1 на мак, но там похоже тоже нет:
MaterializedPostgreSQL is an experimental database engine. Enable allow_experimental_database_postgresql_replica to use it.. (UNKNOWN_DATABASE_ENGINE)
этот allow давал в create database и в серверном конфиге. -
это свойства профиля
-
зукипер не рестартовали случайно?
SYSTEM RESTART REPLICAS
помогает? -
Зукипер не рестартовал, есть ощущение что отвалился от нагрузки, рестарт помог да
-
посмотрите на гитхабе, вбиваете в поиске MaterializedPostgreSQL, находите коммит, в котором эта фича была добавлена, смотрите ветки у этого комита
-
под словом нагрузка имеется ввиду много одновременных INSERT в ReplicatedMergeTree?
-
Не, там активно писали в табличку, после чего отвалился зукипер с такой ошибкой и она ушла в ридонли
-
там во всем репозитории этот allow_experimental_database_postgresql_replica встречается только 1 раз в эксепшене, а в сеттингах другое имя - allow_experimental_database_materialized_postgresql
-
логи zookeeper смотрели?
там одна нода или несколько? -
Несколько, зукипер смотрел
-
так я вам про allow_experimental_database_postgresql_replica ничего и не говорил, я писал вам про MaterializedPostgreSQL
-
вот пуллрекветст MaterializedPostgreSQL https://github.com/ClickHouse/ClickHouse/pull/20470
вот все его комиты https://github.com/ClickHouse/ClickHouse/pull/20470/commits
нажимаете на первый попавшийся комит и вуаля, только тестинг и престейбл.
о чём я уже выше и писал:
>его ещё даже в доке нету, да и в стейбл ветках тоже не видно
у вас тестовый или престейбл кх установлен?MaterializePostgreSQL table engine and database engine by kssenii · Pull Request #20470 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): New Feature Changelog entry (a user-readable short description of the cha...
-
слово expire там в логах есть?
-
вот не помню, у нас почему то только лог вывода стдаут зуки, а он перезатерся так как я в попытках починить рестартанул его
-
Привет, ребят. Команда вида:
zcat out-s0.csv.gz | head -1000 | clickhouse-client --query="INSERT INTO test.table FORMAT CSV"
Дает ошибку
Code: 441. DB::Exception: Invalid IPv4 value.: data for INSERT was parsed from stdin
Таблица table содержит колонку типа IPv4. Можно ли как-то переформатировать тип колонки при вставке из stdin? -
можно input function. Но вообще строка с ip должна залезать в IPv4 автоматически, там пустые строки может есть? это наверное решаемо параметрами
-
zcat out-s0.csv.gz | head -1 | clickhouse-client --query="INSERT INTO test.table FROM input('ip IPv4, time_local DateTime, request String, status UInt8, body_bytes_sent UInt16, http_referer String, http_user_agent String') FORMAT CSV"
Code: 62. DB::Exception: Syntax error: failed at position 35 ('FROM'): FROM input('ip IPv4, time_local DateTime, request String, status UInt8, body_bytes_sent UInt16, http_referer String, http_user_agent String') FORMAT CSV. Expected one of: WATCH, OpeningRoundBracket, SELECT, VALUES, FORMAT, WITH, token
😕
Не понимает функцию input. Пробую пока одну строку хотя-бы всунуть. Так выглядит
xx.xxx.xxx.xxx 2021-07-20 00:03:32 POST /some-url HTTP/1.1 200 333 https://some-url Mozilla/5.0 -
неправильно написано, select нету, и логично тогда объявить ip String, а в select конвертировать, в этом и есть смысл input function, секция select позволяет сделать extract transform
-
ну и xx.xxx.xxx.xxx 2021-07-20 00:03:32 POST /some-url HTTP/1.1 200 333 https://some-url Mozilla/5.0 -- вообще не CSV ни разу
-
CSV -- comma!!!! separated values
-
почитать этот чатик, складывается впечатление, что кликхаус настолько у всех на устах, что его пытаются юзать даже люди не знающие csv,xml,json,sql и т.д. и при этом каким-то чудом у них это даже кое-как это получается :)
-
думаю зумерам это не нужно, у них так все хорошо
-
Что доказывает что кх- классный)
-
-
идея следующая: раз в сутки приходит кусок данных для одной партиции и нужно его обновить и не хотелось бы, чтобы на момент обновления пользователь прочитал через Distributed таблицу с одного шарда старые данные, а с другого новые
-
добрый вечер, подскажите когда нужно задумываться об изменении размера гранулы ?
у меня таблица в которой первичный ключ почти всегда разный и там много записей, соответственно выбрать от туда ряд определенных записей очень сложно, каким образом можно ускориться ? на ум приходит уменьшение размера гранулы .... -
Коллеги, подскажите, пожалуйста: есть nullable колонка в CH и внешний словарь из MySQL где так же есть nullable значения – при попытке сделать запрос where chNullableColumn = mysqlNullableColumn записи содержащие NULL выбрасываются. Это как-то фиксится? )
-
Null != Null же
-
вы в курсе что размер гранулы по умолчанию адаптивный? Вам рано задумываться
-
ни чего про это в доке не нашел ... по умолчанию index_granularity=8192
-
я проэкспериментировал на куске данных в 25 млн .... при грануле в 8192 поиск составил 4.5 секунды а при 4096 = 4.1 секунды .... разница мне кажется в порядке погрешности
-
Адаптивная гранулярность индекса в MergeTree таблицах
Александр Сапин, Яндекс Слайды: https://github.com/clickhouse/clickhouse-presentations/raw/master/meetup27/adaptive_index_granularity.pdf
-
-
вам это не нужно пока, вы потом поймете
-
🙈спасибо!
-
1 алгоритм только, при большиз данных memory error
-
речь про то что две таблицы по 100млрд строк тяжело в КХ сджойнить.
-
просто 4.5 секунды это много и жрет много памяти ... сижу думаю че с этим можно еще сделать
-
Джоины нормально работают, если нужно и достаточно брутфорсом.
А если какие нибудь хитрые условия и нужны оптимизации, то тут уже проблема. -
покажите таблицу ddl и запрос
-
-
попробуйте при джойне указать условие больше-меньше :)
-
Полагаю , будет плохо
-
select count() from fact_event;
┌───────count()─┐
│ 1561682172485 │
└───────────────┘
это маленькая, тут полно людей с трилионами -
ага, ошибка :)
-
-
да обычный кликстрим, скролы мышкой вот это все, откуда в банке столько ивентов.
-
скорее неправильная архитектура :)
триллионы записей - это ок, но если в джойне и слева и справа такие таблицы на регулярной основе, то что-то пошло не так -
CREATE TABLE xxx ON CLUSTER c9q930o5i86rsdloqlc9
(
date DateTime,
ssid String,
sourceId UInt64,
ssidHash UInt64 DEFAULT sipHash64(ssid)
)
ENGINE = ReplicatedMergeTree()
PRIMARY KEY (date)
CREATE TABLE yyy ON CLUSTER c9q930o5i86rsdloqlc9
(
date DateTime,
ssid String,
type String,
ssidHash UInt64 DEFAULT sipHash64(ssid)
)
ENGINE = ReplicatedMergeTree()
PRIMARY KEY (ssidHash)
select count(distinct b.ssid) from xxx a left join yyy b ON (b.ssidHash = a.ssidHash) where a.date > now() - interval 14 day -
эээ при чем тут гранулярити. КХ не использует индексы для джойнов, вы без джона запрос покажите
-
вам скорее надо про словари почитать
-
т.е. он для джоина всегда применяет фул скан ?
-
конешно
-
ну т.е. я данной ситуации запрос с джоином вообще ни как не ускорить ?
-
ничего быстрее фулскан + hashJoin пока не придумали. Индексы слишком медленны и однопоточны
-
словари. Джойн тут не нужен, нужен dictGet
-
270 млрд строк не сунуть в память (
-
в обеих таблицах? И как джойн работает? Память арендует в подпространстве?
-
правая таблица целиком помещается в память в хештаблицу, и получается словарь примерно на 99%
-
оригинальные таблицы имеют партицирование в итоге примерно получается по 15-30 млн строк
-
работает .... но очень медленно в итоге
-
а если это пихать в память то все 270 млрд пойдет в память
-
словари умеют не все пихать.
я не вижу здесь условия на правую таблицу? a left join yyy b ON (b.ssidHash = a.ssidHash) where a.date > now() - interval 14 day -
да все верно .... левая таблица содержит больше или равное количество значений чем правая и необходимо считать количество в левой и количествов правой для вычисления расхождений
-
Clickhouse fast not exists
Clickhouse fast not exists . GitHub Gist: instantly share code, notes, and snippets.
-
ооОО это прям круто ..... но по всей видимости DataLens так не умеет при построении графиков (
-
А можно пример?
Как сджойнить таблицы по словарю? -
ну dictGet это взять из словаря значение по ключу, это типа left join
но вообще КХ переписывает join c таблицей словаря в dictGet-ы сам - 22 July 2021 (137 messages)
-
День добрый, а может кто подскажет, делаю запрос на destibuted таблицу с 4 шарадами, и в какой то момент времени по логам вижу, что все остановилось секунд на 10. Запрос на дестрибьйютед таблице отрабатывает за 30с, хотя если делать запрос на каждом шарде то он выполняется за 3с.
https://gist.github.com/ezotrank/6e77f8330e9910fa1a3ad0af4548306fgist:6e77f8330e9910fa1a3ad0af4548306fGitHub Gist: instantly share code, notes, and snippets.
-
-
-
а я правильно понимаю, что получается там надо все атрибуты из таблицы вытащить,чтобы иметь к ним доступ и это не просто своеобразный индекс?
-
Ого, какой канал замечательный! Всем привет
-
Есть вопрос по clickhouse-cpp. Вроде бы библиотека теперь форкнута самим Clickhouse и как бы поддерживается, но если посмотреть на issues - они по большей части без ответов. Это настораживает. Пользоваться можно?
-
Альтернатив-то особо нет. Не odbc же брать, в самом деле.
-
Приложение (cron-скрипт) иногда падает с ошибкой:
Error: Estimated query execution time (21.004247142402 seconds) is too long. Maximum: 20. Estimated rows to process: 755829243: While executing MergeTreeThread
При этом, если скопировать запрос в консоль и выполнить вручную, он выполняется за ~2 секунды. Где искать проблему? -
Добрый день. После обновления clickhouse c версии 20.1 до 21.7, в http интерфейсе указывается старая версия, в консольном интерфейсе - новая. Не подскажете как обновить http версию?
#clickhouse-client -m
ClickHouse client version 21.7.4.18 (official build).
#curl 'http://localhost:8123/?query=SELECT 1'
Code: 62, e.displayText() = DB::Exception: .... (version 20.1.6.30 (official build))
#ps aux | grep -i clickhouse
clickho+ 1101 2.3 4.0 9753884 241312 ? Ssl Jun30 ...
root 14330 0.0 0.0 112716 988 pts/0 S+ 08:18 ... -
посмотрите побольше про dictionary.
Как правило, словарь это поднятые в память данные. Словарь можно сделать из файла, над таблицей КХ, над вью, или вообще из другой БД. -
ClickHouse client version 21.7.4.18 (official build).
It's client версия, вы рестартнули кликхаус сервер? -
Попытался
#service clickhouse-server restart
Init script is already running -
вот у меня как бы тоже было такое представление
просто я читал, что типо словарь может помочь джойнить две большие таблицы, чтобы пропустить этап с хешированием правой таблицы -
Эт продакшен?
-
-
-
А, ок
ну попробуйте SYSTEM SHUTDOWN; в кликхаус клиенте -
так вы хотите сджойнить две большие таблицы?
-
Оо, спасибо!
-
да. Причём желательно без ограничений по столбцам, которые в словарь лягут.
Пока просто пытаюсь понять насколько сильно нужно переделывать существующую структуру, чтобы пользоваться ей в кликхаусе, потому что поглядываю на неё и понимаю, что всё крайне печально -
-
есть cache словари
ну и если вам джойнить 2 большие таблицы, то вы что-то делаете не так для КХ. -
хмм, спасибо
тогда буду думать над тем как это попытаться разложить в одну табличку
спасибо -
Словарь помогает пропустить этап поднятия правой таблицы в хеш.
Что ускоряет запросы, если у вас много коротких запросов, которые используют сравнительно большую таблицу справа. -
так - тогда непонятно
при этом есть ограничения на то какие столбцы будут браться из правой или левой таблицы? -
просто я смотрю синтаксис создания словаря и там тип выбираются ключевые поля и атрибуты т.е. как я понимаю ключевые значения и что по ним достаётся, а как сделать вот это самое пропускание хэширования я не совсем понял.
Если не сложно можно на примере двух табличек - заранее спасибо -
> пропускание хэширования
Что я имею в виду под пропустить хеширование таблицы:
В случае JOIN об таблицу при каждом новом запросе нужно поднимать правую в память и строить хешмапу.
В случае JOIN об словарь (или об JOIN таблицу) эта правая хеш-таблица делается только один раз, и потом переиспользуется -
вот и вся разница
-
Ок, это отлично. Только непонятно, а что нужно написать в создании словаря. Добавить только ключевые поля, по которым идёт соединение?
-
> Добавить только ключевые поля, по которым идёт соединение?
Угу
Имеет смысл посмотреть в сторону sparse_hashed если у вас UInt64, жрет в 3 раза меньше памяти чем обычное хеширование но и в 3 раза медленнее работает.
https://clickhouse.tech/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout/#dicts-external_dicts_dict_layout-sparse_hashedStoring Dictionaries in Memory | ClickHouse DocumentationStoring Dictionaries in Memory There are a variety of ways to store dictionaries in memory. We recommend flat, hashed an
-
Ребят, привет!
У вас нет интересных задачек по sql на CH диалекте? -
тогда непонятно - пытаюсь создать словарь, но требуются атрибуты (ошибка)
CREATE DICTIONARY wags_dict(
irn UInt32
,nsost UInt8
)
PRIMARY KEY irn, nsost
SOURCE (CLICKHOUSE(HOST '127.0.0.1' PORT 9000 USER 'default' TABLE 'wags_n' PASSWORD '' DB 'default'))
LAYOUT ( COMPLEX_KEY_HASHED() )
LIFETIME ( 3600 ) -
М, я неправильно вас понял.
> Добавить только ключевые поля, по которым идёт соединение?
Нужно добавить ключевые поля и атрибуты. ведь мы из словаря извлекаем нужные нам данные. (которые уже лежат по разным ячейкам хештаблицы) -
а вот тогда и получается проблема - будет ли какое-то преимущество, если я тупо в словарь в атрибуты запишу все столбцы таблицы? т.е. это же по факту дважды хранить одну и ту же большую табличку в разных структурах?
-
Ну это уже вам самим находить баланс между использованием памяти и скоростью выполнения запросов.
-
-
Привет!
У меня есть бакет на S3, в который льются логи в виде JSON в gzip, я хочу эти логи перелить в CH. Для стриминга логов использую vector.dev, всё работает, но есть несколько вопросов:
1. Как лучше сделать бэкфилл в CH? Думаю сейчас взять s3 table function и из неё делать INSERT в основную таблицу, но проблема в том, что логи нужно немного парсить, получится 2 конфигурации парсинга, для CH и для Vector. Можно ли как-то этого избежать? Например при вставке в определённую таблицу парсить строчку с JSON при помощи CH, а потом удалять строчку из таблицы?
2. Как сейчас делают миграцию схемы таблицы? goose/clickhouse-sqlalchemy/clickhouse-migrator, кто чем пользуется? -
1. JSONExtract ? зачем удалять, просто рядом оставьте распаршенное
2. тут любой тул который умеете для миграций, но есть всякие особенности в кластерном clickhouse https://t.me/clickhouse_ru/226366Slach [altinity] in ClickHouse не тормозитдва варианта 1) не использовать ON CLUSTER в SQL... и для реплицируемых таблиц писать ALTER TABLE ... ADD COLUMN IF NOT EXISTS и т.п. 2) либо использовать ON CLUSTER всегда и запускать миграции ТОЛЬКО на одной ноде (любой) а default.migration_schema создавать самому с Engine=ReplicatedMergeTree
-
Рядом можно оставить, но строчки будут много места занимать + одинаковых значений в такой колонке не будет, то есть сжатие тоже не сделать
-
Ну сжатие работает вне зависимости от того "одинаковые" у вас значения или нет...
оно блочное внутри колонки -
вам исходные JSON то при этом нужны?
может проще трансформировать как набудь на строне vector.dev ? и в clickhouse отдавать уже готовое? -
Оу, я наивно думал, что используется RLE
-
Я так и делаю сейчас, vector парсит Json и отдаёт нужные колонки. Но я не могу с его помощью сделать backfill
-
Исходные JSON мне не нужны после обработки
-
Просто в идеале хотелось бы делать все манипуляции с данными в одном месте (с помощью функций CH например) и для backfill, и для стриминга
-
Не понимаю вашу проблему если честно, но можно парсить с помощью Null table engine + Materialized View
-
-
О, это похоже на то, что мне нужно, спасибо
-
Добрый день, помогите, пожалуйста, разобраться с ошибкой. Есть таблица с большим объёмом данных, в неё постоянно льются данные. При выполнении select * from t where m like %xxx% limit 100 получаем ошибку clickhouse_driver.errors.ServerException: Code: 241. DB::Exception: Memory limit (for query) exceeded. Про параметры max_memory_usage и max_block_size знаем, но объём оперативной памяти ограничен
-
Версия кх?
-
21.5.5.12
-
Disable min_bytes_to_use_mmap_io by default by azat · Pull Request #23322 · ClickHouse/ClickHouse
Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Disable min_bytes_to_use_mmap_io by default Detailed desc...
-
Пробуйте
-
Добрый день! Думаю может быть полезно, проблема бела не в версии, а в формировании передачи запроса в астер
?extremes=0&readonly=0&max_execution_time=1.5&enable_http_compression=1&database
max_execution_time - принимает int (в более старых версиях почему-то проходил float), на это и ругался ".5" -
А, забавно.
-
Yandex перенес некоторые клиентские библиотеки в свою репу и они назначают мейнтенеров из комьюнити, но сами они не занимаются разработкой и не планируют.
-
ODBC как раз поддерживается активно в Альтинити, у нас фул-тайм девелопер им занимается.
-
timeout_before_checking_execution_speed=0
--timeout_before_checking_execution_speed arg Check that the speed is not too low after the specified time has elapsed.
у пользователей в консоли и не в консоли разные настройки max_execution_time -
ss -nltp
смотрите какие pid какие порты на listen слушают? -
c рестартом при апгрейде проблема.
новый КХ с некоторой версии не умеет останавливать старый, потому что механизм поменялся. -
127.0.0.1:8123
127.0.0.1:9000
127.0.0.1:9004
127.0.0.1:9005 -
https://github.com/ClickHouse/ClickHouse/issues/26702
завел issue, может есть какой-то work around не меняя схемы?Clickhouse-copier removing materialized column, but column is PARTITION key · Issue #26702 · ClickHouse/ClickHouseclickhouse-copier 21.7.4 clickhouse server 21.7.4 Table schema CREATE TABLE name ( `timestamp` DateTime, `queue` String DEFAULT 'general', `totalUnknown` Int64, `unknown1h` Int64, `...
-
Буду иметь в виду, спасибо!
-
Спасибо. ODBC же нативно row-based. Допустим, мне нужно кусок таблички качнуть в C++ код, и поколоночное представление, которое в clickhouse-cpp, отлично подходит. Или я что-то пропустил, и odbc умеет в поколоночное хранение, чтобы поверх этого векторизацию повесить?
-
Понятно, что при паттерне select count(*) from t where.. - нормально odbc подойдет
-
нет, ODBC не умеет и не будет уметь, это же против ODBC API, там только строки
-
Ну вот и я об этом
-
так а я что говорил обратное? Я просто объясняю что с cpp либой
Yandex перенес некоторые клиентские библиотеки в свою репу и они назначают мейнтенеров из комьюнити, но сами они не занимаются разработкой и не планируют.
ODBC как раз поддерживается активно в Альтинити, у нас фул-тайм девелопер им занимается. -
Ответ понятен, спасибо
-
там вообще как бы pid должен показываться он один и тот же?
-
Да, но это скорее всего из-за того, что я воспользовался советом и сделал SYSTEM SHOTDOWN, а потом снова запустил clickhouse-server
-
после SYSTEM SHUTDOWN у вас не должно было быть запущеных clickhouse процессов
вы после этого делали проверку?
ps axuf | grep clickhouse -
systemctl stop clickhouse-server
ps auxf | grep clickhouse
если пусто
тогда
systemctl start clickhouse-server -
-
сервис показывает что именно думает bash скрипт service о статусе сервиса
ps auxf| grep clickhouse
показывает реальную картину -
https://t.me/clickhouse_ru/227738
вот конкретный рецептSlach [altinity] in ClickHouse не тормозитsystemctl stop clickhouse-server ps auxf | grep clickhouse если пусто тогда systemctl start clickhouse-server
-
О, я об это не знал. Спасибо!
-
Можно теоретически через http вытянуть в каком-нибудь колоночном формате типа ArrowStream. И там ещё, вроде как, gRPC в последних версиях появился.
-
Добрый день!
Подскажите пожалуйста, встречал ли кто-то такое поведение? Начали дублироваться данные, которые пишутся через матвью, которая смотрит на реплицированную таблицу. Матвью есть на обоих репликах. Раньше такого не было.
На скрирншоте видно что такое поведение уже 3й день -
-
-
-
какой движок у реплицируемых таблиц?
MV в какой движок пишет под капотом? тоже реплицируемый?
может кафка сбоит и повторно данные отсылает? -
-
>может кафка сбоит и повторно данные отсылает?
в первой таблице, в которую идет запись из кафки нет дублей -
MV в какую таблицу пишет? тоже в ReplicatedMergeTree?
-
да
-
-
-
-
такое чувство, что insert_deduplicate / deduplicate_blocks_in_dependent_materialized_views сломался
хотя я их не трогал -
-
clickhouse-copier
-
Всем привет. Есть такая проблема. Когда делаю запрос
select arrayMap(x ->
[toString(x[11]), toString(dictGetString('cl', 'fn', tuple(x[11])))],
any(si)) from tbl where vi = 'a798992f-102c-4145-b8a7-eba33b67b8b7'
Все отрабатывает нормально
Но стоит перенести ту же функцию с таким же условием
То получаю ошибку
Code: 53, e.displayText() = DB::Exception: Key type at position 0 does not match, expected String, found Nullable(String) (version 20.9.2.20 (official build)
Уже принудительно приводил к string, ничего не помогает -
-
Здравствуйте! Подскажите по компрессии, Можно ли попробовать zstd только на 1 колонке/таблице/реплике? Что случится, если 1 реплика будет под zstd а остальные под lz4?
-
на 1 колонке/таблице точно можно
-
ALTER TABLE codec_example MODIFY COLUMN float_value CODEC(ZSTD);
-
а перекомпресиваться оно будет при мержах?
-
<compression incl="clickhouse_compression">
<case>
<min_part_size>10000000000</min_part_size>
<min_part_size_ratio>0.01</min_part_size_ratio>
<method>zstd</method>
</case>
</compression> -
Идея попробовать вот так, посмотреть на размеры таблиц и на CPU и откатить в случае чего
-
доступен только http интерфейс
бинари не заюзать -
Вот только не уверен, поймет ли КХ что надо zstd обратно в LZ4 и непонятно когда он будет мержить старые парты если будет
-
Можно сделать копию колонки, добавить к ней кодек, сменить алгоритм компрессии, перемерджить одну партиции, на ней замерить скорость чтения из обоих колонок и дропнуть ненужную
-
ну если вы их не трогали то materialized view по умолчанию выключен
может быть был по умолчанию включен
надо искать https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aissue+deduplicate_blocks_in_dependent_materialized_viewsIssues · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Хороший план, спасибо
-
Добрый вечер, возникает ошибка Code: 998, e.displayText() = DB::Exception: Unable to connect to any of the replicas (version 21.7.2.7 (official build)). Последнее, что делал с кластером - добавил в users.xml двум юзерам несколько схем, ориентировочно после этого и начали ошибки сыпаться. Причём закономерности не нашёл, какие-то запросы работают, какие-то - нет, причём на любом юзере, не только на изменённых. Видел здесь человека с похожей проблемой, но как он её решил, я не нашёл. Кто сталкивался, подскажите?
Картинка - весь стектрейс, но сам я в нём ничего толкового не увидел. -
ну у вас ошибка коннекта к PostgreSQL словарю
судя по стек трейсу, под репликами в данном случае подразумевается адреса postgresql серверов которых в словаре может быть несколько -
DB:DIctionary, DB:ExternalLoader - это периодическая попытка перегрузить словарь
SELECT * FROM system.dictioanries FORMAT Vertical
вам поможет понять какой словарь перестал работать -
-
ну странно, ошибка сама по себе не будет появляться
system.dictioanries не может быть пустой
SYSTEM RELOAD DICTIONARIES;
попробуйте сделать и потом
SELECT * FROM system.dictioanries FORMAT Vertical ; -
Так вот как будто вообще потерялись. На system reload dictionaries выдаёт ту же ошибку, а селект пустой. Мистика
-
Попробуйте просто select * from system.dictionaries
-
-
ок. пробуйте через
SELECT * FROM system.tables WHERE engine ILIKE '%dict%' FORMAT Vertical;
есть какие то словари? -
-
-
internal_relplication = true or false ?
-
нельзя сделать на одной реплике. Контрольные суммы партов должны совпадать, файлы идентичны на репликах
-
а если не получиться синхронно
-
там же рестарт нужен?
-
рестарт нужен
-
будет качать мержить 3 раза и качать с первой реплики смерженное
-
в jdbc нельзя задать format.
-
спасибо
-
Всем привет. А как преобразовать NULL в ' ' в кликхаусе. Пока только нашел assumeNotNull, но она NULL представляет как 0 ?
-
ifnull
-
Пытаюсь вот такой запрос сделать
ifNull((CASE WHEN priority > 20 THEN priority END), ' ') AS Приоритет 3
но он мне возвращает что
There is no supertype for types Int64, String because some of them are String/FixedString and some of them are not (version 20.3.8.53 (official build)) (386) -
А зачем вам вообще case тогда?
if(priority > 20, toString(priority), ' ') -
Спасибо
-
true
-
я однажды видел дубликаты из-за того что люди по ошибке создали 2 mat view и вставляли все 2 раза
-
-
тоже думал об этом
-
-
завтра еще проверю одну гипотезу
2 дня назад в кафка табличку, из которой я беру данные, добвил еще один топик и матвью на него. Возможно это как-то повлияло косвенно -
>3й день…
что-то совпадает))) - 23 July 2021 (87 messages)
-
Ребят всем привет. Может кто сталкивался с таким, наблюдаю в system.query_log по несколько записей удаления записей из таблиц. Все это начало происходить после вынужденного перезапуска кластера. Данные в КХ пишутся отдельным парсером, затем каким-то магическим образом что-то их удаляет, не могу разобраться, может кто сталкивался с подобным? Может в КХ есть какие скрытые удаления. У обоих таблиц TTL date + toIntervalDay(15)
-
-
DDL в комментариях означает что кто-то у вас запускает ALTER TABLE ... ON CLUSTER
смотрите SELECT * FROM system.mutations WHERE is_done=0 FORMAT Vertical -
В нашем кластере нет такой таблицы, может это от версии кх зависит, у нас 20.10.3
-
наверно имелось ввиду system.mutations
-
Спасибо, да, такая существует, но подходящих под where условие записей нет. Это значит что в фоне ничего не висит?
-
да именно в фоне сейчас ничего нет
но периодически видимо какой то CRON скрипт у вас данные "подчищает" -
привет!
есть у меня таблица на несколько десятков миллионов с колонками старта и конца периода, размножая каждую строку на все даты периода получаю миллиарды строк, потом это всё инсерчу в таблицу с партиционированием по полученной колонке с датой, насколько нормальный показатель, что инсерт длится больше часа? -
Всем привет!
Подскажите, пожалуйста.
Мы сейчас делаем переход на Distributed витрину.
Поняли что SELECT FROM distributed_table WHERE key IN (SELECT key FROM temp_table) параллелит запросы в каждую шарду, и падает, так как temp_table (TinyLog) есть только на шарде, к которой коннекшен (почти все действия делаем на ней), на второй - её нет.
Как проще и правильнее решить эту проблему?
temp_table - Replicated? Тогда как точно дождаться репликации?
Или вручную дублировать temp_table на каждую шарду?
Таблица промежуточная, и хочется уложиться в небольшое количество действий. -
-
Да, remote()
-
-
Так и думал, спасибо))
-
-
Подскажите, пожалуйста: errors_count в таблице system.clusters — по какому слову грепать в err.log чтобы найти эти ошибки?
-
ну "миллиарды строк"
если даже у вас миллион строк в секунду получается, то это как минимум 1000 секунд
а если всего 100к строк в секунду, то 10 000 секунд, что около 2.75 часа... -
IMHO просто clickhouse просто перестает использовать MMAP при работе с файлами данных
вроде как использовать этот режим планируется для ускорения, чтобы эффективнее наполнялся файловый page cache средствами ядра -
-
посмотреть в сторону uniqHLL
-
что-то я не понял тогда
uniqCombined -- The default value for HLL_precision is 17
создаю таблицу
uniqState(u) as us,
uniqHLL12State(u) uh,
uniqCombinedState(20,u) uc
на диске
2.2M uh.bin -- uniqHLL12State
58M uc.bin -- uniqCombinedState(20)
140M us.bin -- uniqState
почему uniqState в 3 раза больше чем uniqCombinedState(20)
т.е. uniqCombined быстрее, точнее и еще и меньше занимает на диске? -
Меньше передавать по сети, может быть потенциально быстрее
-
-
-
Там несколько алгоритмов на самом деле
-
У combined?
Ага -
-
-
пропишите его в default профиль
-
Спасибо!
-
есть кластер с двумя реплицированными узлами: node1 и node2.
На ноде1 остановил clickhouse
сделал
sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data
Запустил кликхаус. Ожидаю что он начнет реплецироваться с нодой2 но этого не происходит.
В логах следующее для каждой таблицы
Skipping the limits on severity of changes to data parts and columns (flag force_restore_data).
Что делать? -
а что вас привело к том, что вы сделали sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data?
-
Добрый день! Подскажите плиз: я подключаю движок ПГ
https://clickhouse.tech/docs/ru/engines/database-engines/postgresql/
и когда пытаюсь посмотреть таблицы кх ругается:
SQL Error [60]: ClickHouse exception, code: 60, host: 192.168.235.72, port: 8123; Code: 60, e.displayText() = DB::Exception: PostgreSQL table etl."telegram_chats" does not exist: While executing Tables (version 21.4.6.55 (official build))
я так понимаю и-за того что не указана схема, можно ли это как-то обойти?)PostgreSQL | Документация ClickHousePostgreSQL Позволяет подключаться к БД на удаленном сервере PostgreSQL. Поддерживает операции чтения и записи (запросы S
-
Со старого кластера перенес данные на новый на ноду2 через clickhouse-backup
и теперь хочу среплецировать данные -
у вас таблицы реплицированные?
-
ENGINE = ReplicatedReplacingMergeTree
-
ну вам не нужно было делать sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data
это для другого случая
если вы правильно восстановили данные на одну из нод, то зукипер сам должен был их среплицировать на вторую ноду.
добавьте конкретики, как восстанавливали, появились ли данные на одной из нод, создана ли таблица на второй ноде(куда хотите среплицировать) -
Ну вот почемуто этого не происходит.
-
то есть данные на одном сервере есть, а на втором нет?
-
Да. На втором пустые таблицы
-
таблица на втором replicated?
-
Точно такиеже как и на сервере с данными
-
SYSTEM RESTART REPLICA db.table
-
Коллеги, всем привет, не поможете с советом, как ускорить выполнение первого запроса (поля с key - ключи сортировки, если это важно, в аналогичных запросах могут быть поля отличные от ключей сортировки) select count() from data where keyDate >= '2021-06-05' and keyDate <= '2021-06-25' AND (keytime >= 1622918404) AND (keytime <= 1624653604) AND (msg like '%a%' or msg like '%q%')
┌────count()─┐
│ 1289678421 │
└────────────┘
Progress: 4.41 billion rows, 705.71 GB (16.18 million rows/s., 2.59 GB/s.) 98↗️ Progress: 4.41 billion rows, 705.85 GB (16.18 million rows/s., 2.59 GB/s.) 99
1 rows in set. Elapsed: 272.462 sec. Processed 4.41 billion rows, 705.85 GB (16.18 million rows/s., 2.59 GB/s.)
select count() from data where keyDate >= '2021-06-05' and keyDate <= '2021-06-25' AND (keytime >= 1622918404) AND (keytime <= 1624653604) AND keyseverity='High' AND (msg like '%a%' or msg like '%q%')
Progress: 2.87 million rows, 264.25 MB (17.79 million rows/s., 1.64 GB/s.) 35
Progress: 7.57 million rows, 656.64 MB (28.74 million rows/s., 2.49 GB/s.) 94
┌─count()─┐
│ 18676 │
└─────────┘
Progress: 7.57 million rows, 656.64 MB (26.83 million rows/s., 2.33 GB/s.) 94↙️ Progress: 7.96 million rows, 701.37 MB (28.22 million rows/s., 2.49 GB/s.) 99
1 rows in set. Elapsed: 0.283 sec. Processed 7.96 million rows, 701.37 MB (28.13 million rows/s., 2.48 GB/s.) -
Ничего не происходит.
(ReplicatedMergeTreeQueue): Having 0 queue entries to load, 0 entries already loaded. -
видимо, все что было в зукипере - потеряно
-
select * from system.zookeeper where path=zk path to table
-
Что-то я наверное с названиями нод напутал
┌─name───┐
│ node12 │
│ node1 │
└────────┘
В максах у мен прописаны ноды
node11 и node12
А тут почему то node1 -
Привет. Кому-нибудь удавалось настроить доступ к S3 через IAM? Использую use_environment_credentials вот так, но что-то не работает:
<yandex>
<s3>
<my-endpoint>
<endpoint>%my_endpoint%.s3.%my_region%.amazonaws.com</endpoint>
<region>%my_region%</region>
<use_environment_credentials>true</use_environment_credentials>
</my-endpoint>
</s3>
</yandex> -
Деплою через Cloudformation, выдал такие права
- s3:ListBucket
- s3:GetObject -
Кликхаус на селект отвечает
Code: 499, e.displayText() = DB::Exception: Could not list objects in bucket '%my_endpoint%' with prefix '%some_prefix%', S3 exception: `AccessDenied`, message: 'Access Denied' (version 21.6.3.14 (official build)) -
Коллеги, привет! Поделитесь опытом, какую, в основном, топологию используете, сколько нод под шардирование и репликацию?
-
От двух до трех реплик, кол во шардов зависит от требований по времени выполнения запросов
-
-
-
WHERE key GLOBAL IN (SELECT key FROM temp_table)
-
Привет! У нас есть задача выгружать данные из ch в файл, мы экспериментируем с форматами. Сейчас попробовали выгрузку с форматом native. Результат нас устраивает. Но есть вопрос - меняется ли реализация от версии к версии. Сможем ли мы сформированный файл с данными в одной версии прочитать в более новой, например.
-
была идея что для некоторых операций с большими файлами mmap_io импрувит немного перфоманс, это оказалось неправдой и принесло новые проблемы.
т.е. КХ умеет включать mmap_io и direct_io для некоторых операций, в зависимости от настроек. Можно повыключать, станет только лучше. -
не меняется,
в этом формате работают драйвера go, python , .... -
так а инстансу прицеплен iam ?
-
Всем привет!
Есть:
- AggregationMergeTree в ней есть поле c типом Datetime для каждой сгруппированной записи
- записей много (за месяц порядка 30-40 миллионов)
- сделали партиционирование по дням toYYYYMMDD()
- order by по DateTime полю (и еще другим полям, но это наверно не важно, главное по дате есть)
- хотим делать выборки обычно за день, за несколько дней, за месяц
В результате:
- если выбираем за несколько дней без Order By в Select запросе, то данные получаем отсортированные внутри дня, но сами дни рандомно получаем
- если добавляем Order By в запрос логично, что запрос ест кучу памяти, что не устраивает, но данные хронологически отсортированы между днями
Вопрос:
- рандомно дни в ответах получаем, из-за того что так партиции подгружаются?
- как то их порядок можно задать? -
если ORDER BY в запросе select отсутвует, то в результате рандомный порядок. Вам только кажется что там есть порядок, на самом деле множество потоков читают отсортированные куски и выплевыают результат кто первый
про кучу памяти, это зависит от версии КХ и прямоты ваших рук. Ну и как вы кверяете AggregationMergeTree без groupby это отдельная загадка -
finalizeAggregation используем вместо State на select по AggregationMergeTree
-
Разобрался, проблема была в неправильной настройке IAM
-
finalizeAggregation ну а как вы домерживаете? или вы заранее знаете что домерживать не надо? Стейты же теряются из-за finalizeAggregation, как клиент потом мержит?
-
select version()
-
20.8.19.4
-
вроде понимаю о чем вы, но нам не обязательно домерживать
задача такая. пишется лог событий.
событие = <id> + <дата начала обработки запроса, на которое генерятся события> + <событие> + meta
задача собрать аггрегат = схлопнуть все событияпо <id>
используем в оснвоновном groupArray или any для аггрегации. так как каждое событие несет свою какую то meta в формате KV, достаточно просто все собрать, а состояния в array собрать -
ну "запрос ест кучу памяти" сколько? Сотни гигабайт? Десятки?
В общем если все как вы описали то запрос может использовать индекс и ему особо не нужна память, только мержить данные между партициями, странно что у вас к памяти вопросы есть. -
ну про “кучу” образно )
запрос без ORDER BY 50Мб потребляет, с OrderBy 30Гб ) -
а если один день выбирать?
-
покажите запрос как выглядит. Может у вас order by запроса и таблицы все же не совпадает
-
0.5Гб, но тут из одной партиции получается все выбирается
-
да ок, лишнее только уберу, чтобы проще было
-
а если для теста set max_threads=1
-
По идее если у запроса подходит order by под order by таблицы, то включается optimize_read_in_order и потоки читают все парты одновременно и мержат результаты не сортируя, и память не должна расходоваться
-
Всем привет! Такой вопрос.
Есть КХ с двумя репликами. Каждая реплика на своём сервере. Вставляем данные на первый сервер в буферную таблицу, которая потом перекидывает данные в ReplicatedReplacingMergeTree таблицу. Я правильно понимаю, что буферная таблица должна быть только на одном сервере (в который вставляются данные). Или же нужно на каждом сервере с репликой создавать буферную таблицу? -
```
-- Аггрегат
create table events_aggregated
(
accepted_at DateTime64(3),
event_type LowCardinality(String),
channel LowCardinality(String),
tx_id UUID,
statuses AggregateFunction(groupArray, Tuple(String, DateTime64(3))),
final_state AggregateFunction(argMax, Tuple(String, DateTime64(3)), UInt8),
final_state_value AggregateFunction(argMax, String, UInt8)
)
engine = AggregatingMergeTree()
PARTITION BY toYYYYMMDD(accepted_at)
ORDER BY (accepted_at, event_type, channel, tx_id);
```
```
— вью под отчет
CREATE VIEW v_report
(
`accepted_at` DateTime64(3),
`event_type` LowCardinality(String),
`channel` LowCardinality(String),
`tx_id` UUID,
`final_state_value` String)
AS
SELECT accepted_at AS accepted_at,
event_type AS event_type,
channel AS channel,
tx_id,
finalizeAggregation(events_aggregated.final_state_value) AS final_state_value_internal,
multiIf(final_state_value_internal IN ('EXPIRED', 'FAILED', 'REJECTED', 'UNKNOWN'), 'NOT_DELIVERED',
final_state_value_internal IN ('ACCEPTED', 'PENDING', 'SCHEDULED'), 'PENDING',
final_state_value_internal) AS final_state_value
FROM events_aggregated;
```
```
— выборка отчета
select * from v_report
where
toYYYYMM(accepted_at) = 202107
and final_state_value IN ('DELIVERED', 'NOT_DELIVERED')
order by accepted_at;
``` -
только сервере где вставляете. Обычно для простоты делают все одинаковым и вставляют тоже во все реплики, это уменьшает даунтайм
-
родной, про view базара не было.
order by не проталкивается через view
пишите запросы без view -
🙂
-
да как минимум тут prewhere хочется сделать еще
-
или можно попробовать order by перенетси во вью
-
ок, попробую
-
можно
-
данные сортируются и по расходу памяти 1Гб впримерно
-
если set max_threads=1 или 4
-
внутри view или в запросье к view?
- 24 July 2021 (31 messages)
-
День добрый, а может кто подскажет. Есть четыре сервера, и хочется чтобы все четыре участвовали в каждом запросе, чтобы запрос быстро обрабатывался, для этого я делаю 4 шарда. Но тут получается проблема, если один из серверов выйдет, то часть данных потеряется.
Можно ли создать 4 шарда, и у каждого шарда сделать по 2 реплики, так, чтобы при запросах только одна реплика трогалась? Хочется и скорость и отказоусточивость сразу получить ) -
4 шарда по 2 реплики на 4 серверах? Тогда при выходе 1 из строя у вас будет не 1 реплика лежать, а минимум 2.
2 шарда по 2 реплики сделайте. -
Можно сделать циркулярную репликацию, но с ней геморно расширять кластер и производительность может проседать, лучше обычную
-
А почему ORDER BY по первичному ключу так роняет производительность?
есть таблица
CREATE MATERIALIZED VIEW item_status_mv
(
`item` String,
.....
.....
)
ENGINE = AggregatingMergeTree
PRIMARY KEY item
ORDER BY item
Запрос
SELECT
ds.item
FROM item_status_mv AS ds
FINAL
WHERE
ds.item > ''
ORDER BY item
LIMIT 1000;
Выполняется за большое время, "1000 rows in set. Elapsed: 11.728 sec. Processed 401.69 million rows"
если убрать FINAL или ORDER BY то все летает.
Почему клик не хочет использовать индекс? Ведь по логике все просто и легко идем по индексу , считали все записи для первого item , сделали финальную аггрегацию и отдали, повторили для второго item. Но клик зачем-то считывает всю базу -
По идее, можно клик заставить работать как хочется путем запроса
SELECT
ds.item
FROM item_status_mv AS ds
FINAL
WHERE
ds.item > ''
GROUP BY item
LIMIT 1000
SETTINGS optimize_aggregation_in_order = 1
Те заменить ORDER BY на GROUP BY + optimize_aggregation_in_order , но часть запросов отрабатывает нормально, а часть запросов валится с ошибкой
Progress: 26.42 million rows, 1.30 GB (6.24 million rows/s., 306.06 MB/s.) ███▍ 6%
Received exception from server (version 21.1.10):
Code: 49. DB::Exception: Received from 127.0.0.1:9000. DB::Exception: Pipeline stuck. Current state:
digraph
{
rankdir="LR";
{ node [shape = box]
n140638677604384[label="MergeTree(1565 jobs) (PortFull)"];
n140638673862688[label="MergeTree(5 jobs) (PortFull)"]; -
а optimize_read_in_order пробовали?
-
SELECT
ds.item
FROM item_status_mv AS ds
FINAL
WHERE
ds.item > ''
GROUP BY item
LIMIT 1000
SETTINGS optimize_aggregation_in_order = 1, optimize_read_in_order= 1, max_threads = 2
тоже валится, но причиной оказлся max_threads = 2 , я его не указал в исходном сообщении
Поэтому теперь уже два вопроса :)
1) Почему ORDER BY не использует индекс
2) max_threads=2 и падение с ошибкой - это нормально или бага? -
я имел в виду без group by, а с order by попробовать указать optimize_read_in_order= 1
-
тоже самое
SELECT ds.item
FROM item_status_mv AS ds
FINAL
WHERE ds.item > ''
ORDER BY item ASC
LIMIT 1000
SETTINGS optimize_read_in_order = 1
Query id: 09648fb2-3ab8-4db9-9fe3-c35aa1b00ed9
↗️ Progress: 101.67 million rows, 2.52 GB (34.76 million rows/s., 860.87 MB/s.)
Cancelling query. -
-
select
id,
number_12,
last_modified,
lagInFrame(number_12) over (partition by id order by last_modified) as prev_number,
leadInFrame(number_12) over (partition by id order by last_modified) as next_number
from
(select 001 as id, 01 as number_12, '2021-01-01 00:00:00' last_modified
union all
select 001 as id, 02 as number_12, '2021-02-02 00:00:00' last_modified
union all
select 001 as id, 03 as number_12, '2021-03-03 00:00:00' last_modified
union all
select 001 as id, 04 as number_12, '2021-04-04 00:00:00' last_modified
union all
select 001 as id, 05 as number_12, '2021-05-05 00:00:00' last_modified
union all
select 001 as id, 06 as number_12, '2021-06-06 00:00:00' last_modified
union all
select 001 as id, 07 as number_12, '2021-07-07 00:00:00' last_modified
union all
select 001 as id, 08 as number_12, '2021-08-08 00:00:00' last_modified) -
-
-
Укажите фрейм
-
а как его посмотреть?
-
-
В system.query_log
-
В документации посмотрите для оконных функий
-
Извините, я все равно не понял как посмотреть определенный фрейм
-
-
-
Спасибо! В документации об этом непонятно написано
-
-
Да много. Весь алтинити Клауд там на нем. Сторадж gp2 gp3
-
Интересно может есть какие-то данные по перформансу gp3 (max IOPS) vs SSD?
-
Ebay тоже
-
Тоже gp3?
-
Для гп3 нужно докупать throughput до лимита машины и iops тысяч до 7-8 тогда будет на уровне или быстрее чем gp2 разбитый на n дисков (имеет смысл это делать от нескольких Тб )
-
Тоже оператор
-
Полезно, спасибо
-
- 25 July 2021 (150 messages)
-
у меня тоже джойнится 2 таблице в кх быстрей чем в oracle
-
какие диски? какие таблицы? в конце концов оптимизатор оракловский решил двойным циклом пробежаться без индексов
-
oracle боевой на aix максимально оптимизированный запрос ssd. КХ на первой попавшейся виртуалке на hdd.
-
-
и кстати разница какая?
-
как я уже писал КХ умеет только в hash join, это +- все отличия
-
-
а ответ смотрели какой алгоиитм оракл юзает?
-
-
-
Всем привет! Подскажите, пожалуйста, аналог explain analyze для КХ.
В доке видел explain, но не разобрался, как посмотреть - происходит ли full scan таблицы или нет -
мне интересна, спасиба)
-
ну план выполнения всмысле
-
понял
-
Для репликации таблиц между нодами КХ.
-
то есть зукипер данные синхронизирует. типа как rsync ?
-
В общем смысле - да
-
-
-
Не работал плотно с rsync.Но подозреваю, что при его использовании, могут быть траблы при одновременном залитии данных в реплицированную таблицу на различных нодах.
-
rsync точно не для бд в онлайне. это я для примера
-
Зависит ещё от объёма оперативки и размера таблиц. КХ правую таблицу при джойне загоняет целиком в оперативку и делает хэшмапу, если не влазит или превышает лимит, то ошибка.
-
Всем привет еще раз) Такой вопрос:
Есть скрипт, который в цикле вытаскивает данные из одной таблицы (пачками по 8к строк) и вставляет в другую.
Через +- 400 итераций вылетает с:
DB::Exception: Memory limit (total) exceeded: would use 1.00 GiB (attempt to allocate chunk of 4321459 bytes), maximum: 1.00 GiB: (while reading column gnomad_e_max): (while reading from part /var/lib/clickhouse/store/3bf/3bfe62f2-59f3-4cdb-aa33-864fda985036/all_4_397_8_8648/ from mark 32 with max_rows_to_read = 8192): While executing MergeTree. Stack trace:
Хостим в яндекс облаке, увеличить кол-во оперативной памяти не очень хочется, пока не поймем в чем проблема. Зачем ему гигабайт? -
тогда с чем вы сравниваете зукер? преимущество перед чем хотите услышать?
-
я хотел понять для чего нужен зукипер
-
Координация мержей, дискавери партов, глобальные DDL/мутации
-
Сам зукипер ничего не синхронизирует, это хранилка стейта и штука для координации
-
а кто синхронизирует ?
-
Инстансы кликхауса ходят в зукипер, смотрят чего у них не хватает и подтягивают с других инстансов
-
Зукипер транзакционная in-memory db (k/v). Там хранится список всех партов, список партов на каждой ноде, очереди репликации, мержей, ...
Т.е. например когда вы дропаете парт нода на которую прилетел drop вычисляет range блоков из партов которые надо дропнуть и записывает в зк, в очередь команду, все остальные реплики это видят и выполняют, и так для каждой операции. -
-
-
Новые данные по идее будет лить включая новый шард. А если старые надо перераспределить то да, ручками.
-
Про новые данные да, понятно. Распределено просто будет не равномерно в таком случае... clickhouse сам не может рулить количеством данных? Чтобы писал в новую, пока количество данных примерно не станет равно. За это отвечает кажется параметр "вес". Но как это работает вместе с ключом распределения, что-то не понятно.
-
Скорее всего придется ручками, вес будет влиять только на новые данные.. И без простоя этого не сделать? Остановки etl (записи) похоже недостаточно, тк обычный rename тут не прокатит? Или можно на основную витрину сделать alter со сменой таблиц, на которые она смотрит?
-
А,
- остановка etl
- создать таблицы на шардах с другим именем
- создать новую distributed с другим именем
- перелить в нее данные из витрины
- таблицы на шардах переименовать
- основная distributed витрина не трогается
- надо иметь достаточно места на диске
Сам ответил на свой вопрос) -
-
А почему просто нельзя поставить большой вес на новых репликах шарда, пусть в него больше всего льется или важно само распределение данных
-
-
-
-
-
-
-
-
-
Для нас главная причина, почему решили перейти на distributed - это тупняки, которые начинаются при большом количестве параллельных запросов.
И распределять хотим по проекту клиента. Видимо надо чтобы каждый проект был на своей шарде, иначе толку не будет..
И придется ручками -
-
-
У нас также проблема с CPU. Но мы всегда использовали только дистр таблицы.
-
-
-
Кликхаус для запросов использует все ресурсы, что сможет.
В 100% CPU нет ничего плохого -
-
Это да, главно, чтобы память не сжиралась на 100, а то придет OOM )
-
-
Как используется?
-
-
В нашем случае это плоховато. Юзаем replication таблицы, у нас часто alter на добавление полей и при 100% CPU падаем по timeout в zk
-
-
WHERE dictGet(dict,'xxx',column_name) = 'some_value'
Дорого, будет читать всю таблицу и делать запрос в словарь
WHERE column_name = dictGet(dict,'xxx','some_value' )
Дешево, всего один запрос в словарь. -
Как часто альтер?, зачем вам нужно так часто поля добавлять?
-
json постоянно меняет, в нашем случае растет
-
пару раз в неделю.
-
https://kb.altinity.com/altinity-kb-schema-design/best-schema-for-storing-many-metrics-registered-from-the-single-source#2f-combined-approach
2e, 2f
И у вас прямо все колонки участвуют в запросах? -
Этого не знал, посмотрю как у нас.
-
Да нет конечно. Просто пользователи любят поля без индексов
-
Кстати, по поводу добавления новых нод в кластер и вставку через distributed таблицу. Я правильно понимаю, что если локально там какой-нибудь CollapsingMergeTree, то добавление новой ноды всё ломает, потому как распределение данных между шардами меняется?
-
Да, тогда будет не оч хорошо
-
Но если добавить с началом новой партиции, то ничего страшного не будет
-
У нас видимо именно "дорогой" вариант, и вся таблица читается, для каждой строки идут запросы в словари?
Ваш вариант не подходит, надо выбрать только те строки, у которых по id из таблицы, в словаре is_active=1 -
Сколько у вас уникальных строк-id то?
Как часто обновляются активные? -
О, об этом не подумал. Спасибо!
-
Надо подсчитать, очень много, причем id tuple (project_id, content_id). Обновления надо доставлять быстро, происходят не очень часто.
Единственное что приходит на ум, сделать единый словарь для всего контента, сейчас под разный контент/его источник, разные словари. -
https://kb.altinity.com/altinity-kb-queries-and-syntax/delete-via-tombstone-column
Сколько словари в памяти занимают?
Сколько строк читается с диска при обычных запросах? -
-
Статистику не нужно удалять, ее нужно хранить всегда, так как клиент может снова выбрать контент
-
-
-
Выходит наш вариант точно даёт тупняки сейчас?
-
Речь не идет про удаление же.
Речь про мутации на один столбец.
tuple (project_id, content_id) -
Ну выполните запрос с и без dictGet фильтра
-
-
-
вы неправильно понимаете зачем нужен шардинг. И шардинг работает по тенанту работает конечно, но решает скорее проблему изоляции, чтобы разделить ресурсы и один клиент не влиял на других.
-
ZK должен быть на отдельных машинах, иначе ему не достается cpu и диска, проблему cpu можно решить, понизив nice у КХ
-
Я в КХ новичок, в отличии от моих коллег. С вами учусь быстрее)
-
-
Они на отдельных на машинах с кучей памяти.
-
+++
-
проблема в том что запросы жирного клиента выполняются одиной отдельной машиной, и если всего машин пять, то например запросы могли бы выполняться в 5 раз быстрее. А тут 1 работает, 4 стоят
-
Вопрос как сделать чтобы пять выполнялись) просто я как понимаю при использование alter on cluster к нас в zk улетает запрос и он выполняется на каждой своей машине, даже если клиент повис по можно увидеть это запрос в zk и его статус
-
вы сейчас два вопроса задали? или один?
-
-
Два. Просто иду на улице и писать не удобно.
-
Про oncluster. On cluster это хелпер, который тупо позволяет вы полнить алтер на всех серверах. Не понимаю что за проблемы с oncluster. Его не существовало например 3 года назад, и я например до сих пор используют скрипты написанные тогда, и не использую on cluster.
-
Зукипер должен быть на отдельных серверах
-
Кластер zk на отдельных серверах
-
>Проблемые реплики(где была проблема c zk)
что это ? о чем это? -
С этим проблем нет. Можем спокойно раскатывать своими скриптами, on cluster не принципиально
-
У нас очень часто кластер кх утилизирован по цпу на 100. Во время выполнения команд на alter table add field on cluster, мы ловим на репликах различные ошибки связанные с zk.
-
-
-
я хочу увидеть копипейст ошибок, вы не понимаете что такое timeout, их шесть разных
-
-
-
это какая-то херня. Не должно быть такого.
попробуйте
cat os_thread_priority.xml
<?xml version="1.0"?>
<yandex>
<profiles>
<default>
<os_thread_priority>10</os_thread_priority>
</default>
</profiles>
</yandex> -
Будет как с отпуска выйду. Шесть разных хм, а можно парочку как примеры
-
timeout клиента, recieve timeout
timeout операции с ЗК
timeout выполнения операции на реплике
timeout выполнения DDDL запроса
timeout senddata -
Замечательный человек под ником Slach уже порекомендовал поиграться с параметрами max_threads и os_thread_priority.
-
-
-
О чем говорит эта ошибка я знаю )
-
это ожидаемое/запрограммированное поведение. Нельзя несколько alter посылать одновременно на несколько реплик
нужно дожидать завершения мутаций / мутаций вызванных альтером, и потом запускать следующий альтер -
Раньше проблем не было с ней. Шард то состоит из двух реплик и при уменьшение в ddl запросов alter с 50 до 10 позволило все прогнать
-
раньше альтеры работали через другой механизм.
-
50 альтеров? Вы о чем вообще? Зачем нужно 50?
-
Мы версии не меняли кх. А можно тут поподробней
-
50 новых столбцов )
-
ну так и добавляйте их одним альтером
alter table .... add column if not exists, add column if not exists,add column if not exists,add column if not exists,add column if not exists,add column if not exists,add column if not exists,add column if not exists,add column if not exists,add column if not exists,add column if not exists,add column if not exists; -
Дык, так можно было :))) Вернусь с этим к разрабам
-
если послать
alter table .... add column if not exists;
alter table .... add column if not exists;
alter table .... add column if not exists;
alter table .... add column if not exists;
alter table .... add column if not exists;
alter table .... add column if not exists;
то будет 517 Metadata on replica is not up to date with common metadata in ZK. -- это ожидаемое поведение -
-
-
А вот за это отдельное спасибо
-
надо смотреть что в логах ЗК в этот момент. Я видел такое из-за кривых сетевых драйверов в qemu/kvm, при 100% CPU сеть начинала тормозить и сетевые операции отваливались с таймаут.
-
Куда можно покапать ? На самих zk cpu и память в норме, то есть еще есть куда расти. Да javaheap подрастает, но не критично. Запросы конечно копятся в очереди на репликах, но опять не критично
-
Сеть смотреть на zk и кх ?
-
ну можно просто пинговать ip зукипера, с сервера КХ в момент 100% утилизации cpu на сервере КХ,
и надо смотреть логи ЗК и КХ при этой ошибке -
Denny, я проведу тесты, логи посмотрю, ты не против будешь, если я с этим к тебе еще вернусь ?
-
да, НО я отвечаю и смотрю только публичные телеграм чаты/github/google groups/stackoverflow/slack. В личке сразу бан.
-
Добрый день! Быть может появились официальные (или не официальные, но толковые) арм билды кликхауса?
-
Ок, с эти проблем нет ) И наверно еще один вопрос. Который всплыл на днях. Реплики клика начали долго стартовать и в логе видно HTTPSessiodnPool: No free connections in pool. Waiting
-
-
-
какая версия КХ? Мне нужно посмотреть лог.
-
-
-
-
-
-
Да к вам. А может не тактично у людей спрашивать сколько они льют в клик данных)
-
Мы льем в цикле в 1 таблицу в 1 поток, через pipe, в день два больших вброса, не считая мелких.
Данные уже плоские, update не делаем, alter крайне редкие, изменяемые атрибуты через словари, вот) -
-
-
Зависит от ширины строк. Некоторые тут миллионы в сек в каждую ноду льют. В среднем пользователи непрерывно вставляют 10-50 тыс. в сек.
-
Нормально так миллионы в каждую ноду
-
Коллеги, всем привет, не поможете с советом, как ускорить выполнение первого запроса (поля с key - ключи сортировки, если это важно, в аналогичных запросах могут быть поля отличные от ключей сортировки) select count() from data where keyDate >= '2021-06-05' and keyDate <= '2021-06-25' AND (keytime >= 1622918404) AND (keytime <= 1624653604) AND (msg like '%a%' or msg like '%q%')
┌────count()─┐
│ 1289678421 │
└────────────┘
Progress: 4.41 billion rows, 705.71 GB (16.18 million rows/s., 2.59 GB/s.) 98↗️ Progress: 4.41 billion rows, 705.85 GB (16.18 million rows/s., 2.59 GB/s.) 99
1 rows in set. Elapsed: 272.462 sec. Processed 4.41 billion rows, 705.85 GB (16.18 million rows/s., 2.59 GB/s.)
select count() from data where keyDate >= '2021-06-05' and keyDate <= '2021-06-25' AND (keytime >= 1622918404) AND (keytime <= 1624653604) AND keyseverity='High' AND (msg like '%a%' or msg like '%q%')
Progress: 2.87 million rows, 264.25 MB (17.79 million rows/s., 1.64 GB/s.) 35
Progress: 7.57 million rows, 656.64 MB (28.74 million rows/s., 2.49 GB/s.) 94
┌─count()─┐
│ 18676 │
└─────────┘
Progress: 7.57 million rows, 656.64 MB (26.83 million rows/s., 2.33 GB/s.) 94↙️ Progress: 7.96 million rows, 701.37 MB (28.22 million rows/s., 2.49 GB/s.) 99
1 rows in set. Elapsed: 0.283 sec. Processed 7.96 million rows, 701.37 MB (28.13 million rows/s., 2.48 GB/s.) - сорри, что дублирую вопрос, кто-нибудь знает решение или это нормальное функционирование count? -
Все зависит от ширины строки и железа. Кто то вставляет в таблицу из трех полей int32+int32+float64, кто-то в таблицу 600 полей и 2 кб суммарно строка, у некоторых железо 1TB озу и раид из nvme, у других раид из 2 hdd
-
это нормально функционирование.
В первом запросе Processed 4.41 billion rows , msg очень тяжелая колонка очевидно, и ее тупо надо читать с диска для 4 млрд. строк, распаковано в 705.85 GB.
Во втором запросе Processed 7.96 million row, распаковано в 701.37 MB - 26 July 2021 (141 messages)
-
HASH join. 2 таблицы 340 gb и 152 mb.
-
Добрый день!
Только недавно начал знакомиться с CH, и столкнулся на текущий момент с вот таким запросом:
Есть таблица в которой лежат URL, мне необходимо вытащить значение параметров строки запроса, при этом нужны не все параметры, а только из определенного списка параметров.
Составил вот такой запрос с использованием array join
select param, extractURLParameter(decodeURLComponent(uri), param) as value from http array join ['email', 'customerEmail'] as param where timestamp >= '2021-07-01 00:00:00' and notEmpty(value) = 1;
но CH ругается, на то что параметр в extractURLParameter должен быть статичным. Можно ли как-то по другому данный запрос составить? -
Вам надо получить 2 явных параметра, почему бы просто не написать функцию дважды?
-
список на самом деле динамический, то есть там разной длины массив может быть, поэтому хотелось бы все одним запросом разрулить
-
Добрый день. Как в КХ можно преобразовать части даты в значение ДатаВремя ?
Т.е. что-то типа: toDT(Год, Месяц, День, Час, Минута, Секунда) -
Привет, подскажите куда копать, КХ 21.3.6.55, проблема с odbc
select * from odbc('DSN=MSSQL_DSN;UID=user;PWD=pass', 'database_name', 'table_name')
Выдает ошибку:
Code: 86. DB::Exception: Received from localhost:9000. DB::Exception: Received error from remote server /columns_info?connection_string=....... HTTP status code: 501 Not Implemented, body: .
Словарь с этим сурсом выдает:
SQL Error [344]: ClickHouse exception, code: 344, host: localhost, port: 8123; Code: 344, e.displayText() = DB::Exception: Dictionary source of type odbc is disabled because poco library was built without ODBC support. (version 21.3.6.55) -
Есть список дат '2021-05', '2021-06', '2021-07'. Как проведить существует ли хоть одна из этих дат в поле date с типом Date
-
Немного непонятно, возможно formatDateTime поможет?
-
аналогично, можно попробовать .. where formatDatetime(date, '%Y-%m') in ('2021-05', '2021-06', '2021-07)?
-
Нет, нужно из чисел. formatDateTime дату в строку преобразовывает.
А нужно toDT(2021,7,26,9,35,21) преобразовать в дату '2021-07-26 09:35:21') -
Эт надо КХ из сырцов пересобрать? Или в какую сторону надо копать?
-
Спасибо за ответ, но условия одинаковые, кроме одной опции в where, и если делать предварительный запрос с distint по ключам партиционирования, чтобы сократить выборку с первого запроса до второго (например, select distinct(keyseverity) from... и увидеть, что из них можно оставить только 'High' - этот вспомогательный запрос тоже будет не легким...) суммарное время выполнения останется прежним большим
-
замнутый круг получается, чтобы сократить select * from... limit..., можно попробовать сократить по нужному count () или понять по каким полям/условиям можно сократить выборку... а расчет count и/или поиск усекающих условий по тяжести в сумме дают такое же время, как select * from... limit ...
-
Привет, подскажите есть ли что-то к кликхаусе типа if, но немного другой логикой:
Например для if вычисляется сложное знаение, потом сравнивается условие и если оно выполнено, взять вычиленное значение, если не выполнено взять дефолт
Проблема простого if в двойном вычислении.
Например if (number > 17, 10, number)
Вот если nubmer это что-то сложно вычисляемое, можно ли вычислить его 1 раз, прихранить, потом проверить if и потом не считать второй раз в else? -
условно псевдокодом хочу получить такое
var number = сложное вычисление
if (number > 10) {
number = 10
} -
кстати мне тоже интересно будет ли number дважды вычисляться
-
вообще если number выражение даст константу то with можно юзать
-
не, там это значение считается для нескольких строк
вообще обходным путем можно вычислить number в колонку а следующей колокной сделать if и обернуть это все в еще один select но вдруг есть путь проще ) -
with не хранит, при каждом обращении к with будет высчитываться
-
Привет! А можно запросом узнать, чем скомпрешшен парт? ZSTD/LZ4 ? Стоит по отсечке в 10Гб использовать ZSTD пытаюсь понять хоть 1 скомпрессилась ли в zstd
-
-
Всем привет!
Посдкажите, плиз. Есть табличка с столбцом
`date_time` DateTime64(3)
И
ENGINE = ReplacingMergeTree
PARTITION BY toDate(date_time)
ORDER BY (date_time)
Почему с фильтром toDateTime всё окей
SELECT count()
FROM grameen_http_cdr
WHERE toDateTime(date_time) >= toDateTime(1627279320)
Query id: 7a719fea-dcd6-458d-a011-0a1aa01c3829
┌──count()─┐
│ 14176652 │
└──────────┘
1 rows in set. Elapsed: 0.070 sec. Processed 14.18 million rows, 113.42 MB (203.76 million rows/s., 1.63 GB/s.)
А вот при выборке с toDateTime64 идёт выборка по всей схеме, без учёта партиций
SELECT count()
FROM grameen_http_cdr
WHERE toDateTime64(date_time, 3) >= toDateTime64(1627279320, 3)
Query id: 46d047f5-ecd1-4b3a-8a6f-5e8ef5de9597
┌──count()─┐
│ 14167902 │
└──────────┘
1 rows in set. Elapsed: 4.934 sec. Processed 1.81 billion rows, 14.48 GB (366.89 million rows/s., 2.94 GB/s.) -
если нужно, то каким лучше алгоритмом это делать?
-
выше мне советовали skip-index с блум фильтром если идетс сравнение по строке на полное совпадание
-
спасибо, нашел переписку
-
так если колонка в первичном ключе, смысла же нет вешать индекс
-
Здравствуйте.
Подскажите, пожалуйста, в какую сторону копать:
Делаем несколько инсертов в таблицу (движок MergeTree).
Часть записей появляется сразу, а другие только через некоторое время (может быть 5 мин, 20 мин, бывало даже больше часа задержки).
Инсерты не большие (1-2 рекорда), нагрузки нет (тестовая БД)
После каждого инсерта количество записей в system.parts для данной таблицы увеличивается -
Грусна
-
А это везде так или только у кликхауса?
-
точно не везде. Postgres по моему матерелизует with
Oracle с хинтом тоже -
Внезапненько
-
Кто нибудь имел опыт построения словаря в кассандре? почему-то когда создаю словарь в кх, выдаёт Type mismatch for column "column": expected Cassandra type bigint, в то время как первая колонка String при создании
-
интересна даже, это вопрос оптимизации кода или железа
-
не понял вопроса
-
это риторический вопрос, но интересно что оракл который пилится уже десятки лет можно так легко нагнуть силами пары разработчиков из яндекса за пару лет, может там упирается в IO?
-
Подскажите, пожалуйста: errors_count в таблице system.clusters — по какому слову грепать в err.log чтобы найти эти ошибки?
-
там таблицы со множеством полей . как бы oracle не оптимизировался от транзакционная бд. а мой запрос с join аналитический. в нем максимум 5 полей затрагивается
-
-
вы уверены что у вас параллелизм одинаковый. и что вы сравниваете время именно джоинов?
-
да уверен
-
-
и как вы сравниваете время именно джоинов?
-
кликхаус один жирный бинарник... clickhouse-?? это алиасы к нему.
если вам не нужен сервер, поставьте "clickhouse-client", format будет работать -
Спасибо!
-
Всем доброго! Есть 5 таблиц на MSSQL, связаны между собой один ко многим. Необходимо сделать синхронизацию с ClickHouse. Для того, чтобы не гонять терабайты информации каждая таблица синхронизируются с ClickHouse отдельно. Но при попытке сделать запрос с join по всем таблицам выпадает ошибка о недостатке памяти, та же самая проблема при создании материализованного представления. Кстати, даже по 2 таблицам материализованное представление не даёт нормально синхронизироваться, происходит тайм-аут при записи в таблицу первого уровня. Синхронизация производится внешним приложением по точно.
Подскажите пожалуйста варианты решения задачи. -
Даже 64Гб оперативной памяти мало в этом случае.(
-
надо Joinить от самой большой слева к маленьким справа.
если у вас несколько факт таблиц, то может придется попотеть.
MV на джоин вешать плохая затея, МВ это триггер на вставку, он вам не поможет -
Можно попробовать использовать transform, вместо if. Был опыт его успешного применения под аналогичную задачу
-
я сравниваю время аыполнения конкретного SQL запроса
-
Может считать не в кликхаузе, а в монге или гринплам?
-
Можно еще побить один большой запрос на несколько маленьких используя cityHash от ключей для слияния
-
Так и делаю. Насчёт MV спасибо!
-
Спасибо, посмотрю.
-
Хотя, пожалуй, под Вашу задачу не выйдет. Но если если все сводится к
var number = сложное вычисление
if (number > 10) {
number = 10
}
то кажется, можно обойтись просто least(number, 10)? -
ок, оракл читает строки из строчной таблицы (т.е. все колонки), КХ читает колонки... джоин вообще не причем. сравнение вообще непонятно
-
да хоть в sqlite, вопрос был не мой =)
-
Идеально подходит, спасибо)
-
если у вас вычисление простое типа примера, то делайте двойное вычисление, оно быстрее.
костыли имеют смысл если у вас супер multiIf на 500 условий, или вложенные If на 5-10 уровней со сложной математикой/лямбдами -
Там вычисление времени между датами, и если оно превышает 30 минут то взять 30 минут, если меньше то взять существующее. Вот выше подсказали least, выглядит лучшим решением)
-
все правильно вам подсказали
-
пересобрал ch и poco из сырцов, ничего не поменялось, дернуть данные по odbc не получается, взываю к коллективному разуму!
-
Так там в документации вроде все хорошо описано. Может нужно ODBC в Linux прописать правильно. Там интересная особенность, что нужно и системный DSN правильно прописать, а потом и в самом КХ. Иначе не работает.
-
Скрипт из питона - работает с этим DSN, isql - тоже
-
Если вдруг, кому-то интересно, то вот такой запрос решает мою проблему
select param, decodeURLComponent(replaceRegexpOne(arrayElement(arr, 1), '("[^"]+"|\\w+)=("[^"]+"|\\w+)', '\\2'))
from (
select param,
arrayFilter(x -> startsWith(x, concat(param, '=')), parameters) as arr
from (select param, extractURLParameters(uri) as parameters
from http
array join ['email', 'customerEmail'] as param
where position(queryString(uri), param) <> 0
and timestamp >= '2021-07-01 00:00:00'
limit 1000) as t
where notEmpty(arr)
group by param, arr); -
В трейсе freetds - пусто, бридж даже не приходит
-
Вы системный DSN прописали? В конфигурации КХ тоже? Один раз угробил неделю на бодания, и только после этого у меня заработало в КХ, посредством запросов.
-
Пойду еще раз все перепроверю %)
-
Потому что КХ не знает куда ему идти.)
-
-
-
Подсказываю вариант. Уменьшить количество таблиц в ClickHouse. В идеале до одной.
Это колоночная база, не нужно в ней воспроизводить структуру хранения и подходы, характерные для обычных реляционных баз. -
Фото в статье описывает очень хорошо процесс администрирования КХ.
-
а с чего бы это оно вычисляется два раза? Вы проверяли? Вроде как должно быть 1 раз. Особенно если это явно попросить - if(number > 17, 10, (a+b/c) as number) Можно сделать 1000 раз with/without AS и сравнить.
-
Смотрим в этом направлении. Спасибо.)
Придётся добавлять метаинформацию для последующего инкрементного обновления, потому что первое будет около суток длится. -
не проверял, не придемал как проверить, отсюда и вопрос был, но ответ нашелся проще, мне нужно было просто меньшее число и подошла функция least
-
Ежи пассатижи! Ну не работает оно у меня! %)
freetds.conf odbc.ini odbcinst.ini - все прописано и перепроверено, м.б. я не там в документации кх ищу? -
Можно ссылку на страницу с докой? Что именно надо прописать в конфиге КХ?
-
Добрый день, подскажите в конфиге параметр max_[table/partition]_size_to_drop подхватывается "на лету" или нужно рестартить?
-
удаляю данные транкейтом
-
config.xml рестартить надо, users.xml на лету.
-
спасибо
-
PostgreSQL начиная с версий 12.х материализует WITH только при явном добавлении указания MATERIALIZED. Поведение по умолчанию же — сворачивание WITH в родительский запрос ("инлайнится", грубо говоря). Однако, это стандартное поведение не выполняется в ряде случаев, информация об этом будет доступна в EXPLAIN. Также возможно и принудительное сворачивание через NOT MATERIALIZED.
// Это, конечно же, приведено для информации и никак не противоречит вашему утверждению о том, что "точно не везде" ;) -
Сделал следующее
Если таблицу все же необходимо удалить, не перезапуская при этом сервер ClickHouse, то необходимо создать файл <clickhouse-path>/flags/force_drop_table и выполнить запрос DROP.
помогло -
В некоторых ситуациях словари (которые dictionary) оказываются предпочтительнее JOINов в смысле производительности. Про расход памяти не знаю, но вполне возможно тоже.
Источником данных для словаря м.б. таблица самого ClickHouse. Кажется. -
я думаю в 90-95% на практике словари лучше чем join
-
Подскажите можно ли реализовать в КХ таблицу, аналогичную обычной вьюшке, но хранящуюся на диске или в памяти?
Сейчас есть вьюшка (около 2 млн записей), которая джойнит данные из нескольких других вьюшек и таблиц - выборка занимает порядка 0.5-2 секунды.
Нужно существенно ускорить запросы в эту вьюшку - пытаюсь изобрести как это сделать.
Может кто подскажет куда копать? -
Join | Документация ClickHouse
Join Подготовленная структура данных для использования в операциях JOIN. Создание таблицы CREATE TABLE [IF NOT EXISTS] [
-
спасибо, сейчас почитаю
может это оно
как то я пропустил это в документации -
будьте аккуратнее, а то вам насоветуют)
а у вас будет сервер падать OOM. -
-
движок джойн хранит в памяти данные готовые для джойна. Из таблиц нельзя выбрать данные с помощью запроса SELECT.
У вас возможно внутри джойны можно изменить на словари -
-
выборка или джойн?
-
ускорить нужно выборку из вьюшки, а тормозная она потому что джойнится внутри с большой таблицей
-
Здравствуйте, сравниваю данные Метрики и данные logs api, наткнулся на несоответствия данных:
1. SELECT count(DISTINCT ClientID) выдаёт цифру на 15-20% меньше, чем "Посетители" в Метрике.
Я неправильно пытаюсь посчитать уников?
2. Нет поля ym:s:isRobot, а у нас некоторые запросы на него завязаны.
Может его переименовали, а я не заметил? -
может архитектуру переделать? чтобы избавиться от джойнов, 2млн записей это ничто по факту
-
а зачем так сделано? вам тут только переделать вьюху
-
2 миллиона это уже во вьюшке, в исходной таблице гораздо больше
логика вьюшки следующая:
слева формируется таблица вида (имя, дата, id) - те самые 2 млн строк из собранные нескольких таблиц через промежуточные вьюшки (они используются сами по себе в других местах)
справа джойнятся по id данные из большой таблицы - там куча столбцов
из вьюшки делаются селекты с разным набором условий и столбцов
левая часть формируется за менее чем 50 мс
как это оптимизировать архитектурно я пока не придумал -
<compression>
<!-- Set of variants. Checked in order. Last matching case wins. If nothing matches, lz4 will be used. -->
<case>
<!-- Conditions. All must be satisfied. Some conditions may be omitted. -->
<min_part_size>50000000000</min_part_size> <!-- Min part size in bytes. -->
<min_part_size_ratio>0.0005</min_part_size_ratio> <!-- Min size of part relative to whole table size. -->
<!-- What compression method to use. -->
<method>zstd</method>
</case>
</compression> -
Привет! А как работает конфиг компресии, если таблица очень большая, min_part_size больше чем указано а min_part_size_ratio - меньше, будет LZ4 ?
-
надо чтобы оба условия выполнились или хотя бы 1?
-
<!-- Conditions. All must be satisfied simultaneously. Some conditions may not be specified. -->
-
Всем привет!
ClickHouse server version 21.7.4.18 (official build).
No alias for subquery or table function in JOIN (set joined_subquery_requires_alias=0 to disable restriction)
не могу найти в документации как выставить в 0 этот парамтр -
Привет!
Подскажите, пожалуйста shard_weight можно поставить в 0, чтобы данные не писались на шард? -
Можно, там есть свои особенности, что в старых версиях отправлялись block данных в 0 строк, но это работает
-
Спасибо
-
спасибо! Вот это проглядел
-
Нашел настройку в system.settings
ALTER TABLE system.settings UPDATE value = 0 WHERE name='joined_subquery_requires_alias'
Но есть проблема
Code: 48, e.displayText() = DB::Exception: Table engine SystemSettings doesn't support mutations (version 21.7.4.18 (official build)) -
wow wow палехче ) так нельзя...
можно в запросе писать в конце
SETTINGS joined_subquery_requires_alias=0
либо в конфиге -
=))) Эту настройку в конфиге к юзеру ?
-
надо пихнуть ? =)
-
Ага, спасибо! Уже пихнул заработало
-
в профиле юзеров можно.
например для дефолтного кидаете файлик в "user.d/"
<yandex>
<profiles>
<default>
<allow_experimental_geo_types>1</allow_experimental_geo_types>
</default>
</profiles>
</yandex>
~ -
HELP. Есть несколько таблиц подчиненных друг другу, если сджойнить их в представление, как правильно посчитать например сумму по полю верхней таблицы, чтобы не было задвоения, затроения и т.д?
-
а зачем джоинить если считать только по одной "верхней" таблице?
-
можно делить на count.
sum(field1)/count(distinct <uniquefieldfromChildTable>) -
Добрый вечер. Подскажите пожалуйста есть ли какой-то инструмент для создания бэкапов и разворачивания данных с бэкапов
-
отборы нужны с другой таблицы
-
GitHub - AlexAkulov/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages support
Tool for easy ClickHouse backup and restore with cloud storages support - GitHub - AlexAkulov/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages support
-
спасибо)
-
можно попробовать так:
select sum(f1)
from table1
where f2 in (
select f2
from table2
where …
) -
Подскажите пожалуйста по разреженному индексу.
По идее меньший размер должен приводить к меньшему кол-ву чтения ценой роста потребления памяти ?
Есть таблица GraphiteMergeTree с index_granularity = 32768, с которой хочется снизить объемы чтения. Создал копию с index_granularity = 8192.
На том же наборе данных и при том же запросе read_rows и memory_usage ниже, но выше время выполнения запроса.
Возвращяемый набор идентичен.
Index_granularity = 32768 Query id: 984fa285-7fec-4aa6-8b73-e045358b11af1 rows in set. Elapsed: 0.319 sec. Processed 4.36 million rows, 678.57 MB
Index_granularity = 8192 Query id: 38c93604-26c3-4a09-8780-216ee3505ada1 rows in set. Elapsed: 1.226 sec. Processed 761.86 thousand rows, 111.31 MB
По статистике с query_log видно, что сжатых блоков читается меньше. Также меньше выбранных партов. Размеры партов сходные. Но ощутимо выше ReadBufferFromFileDescriptorReadBytes.
По идее должны же читать меньше или я что то не понял в работе MergeTree и разреженного индекса ? -
-
Нет, не будет
Лучше продублировать часть условия в WHERE -
Там прикол в том, что мне нужно что-то вроде left outer join. Т.е. чтобы группы были за все время, а значения только за заданное.
-
Если вам строку надо читать, неясен вопрос про индекс.. суть индекса в том чтоб "не читать" что то. Сам по себе индекс разреженный и для подсчетов значений в кх не может использоваться
-
Там где про внешние словари
-
Это все обсосано вдоль и поперёк. Похоже проблема в сборке под мою систему. Видимо poco идущий в комплекте всетаки без поддержки odbc
-
Попробую развернуть под дебиан, проверю
-
>sudo apt-get install -y unixodbc odbcinst odbc-postgresql
>Настройка /etc/odbc.ini (или ~/.odbc.ini)...
https://clickhouse.tech/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources/#primer-podkliucheniia-postgresqlИсточники внешних словарей | Документация ClickHouseИсточники внешних словарей Внешний словарь можно подключить из множества источников. Общий вид XML-конфигурации: <yandex
-
С odbc - у меня все в порядке. Isql и скрипты на питоне отлично видят БД по DSN. Бридж принимает запрос от клиента и молча возвращает 501 ошибку. В том числе и при запросах напрямую, через curl. В логах бриджа - никаких ошибок.
-
-
В логах кликхаус-сервер - есть ошибки, 501 not implemented
-
Да
-
При попытке получить данные из созданного словаря - вышеописанная ошибка, про то что poco собран без odbc
-
Я тут тестировал с вью, задача наполнять что-то типа свечей (аккумулировать прайсы в д/н/м/год), исторические данные наполнились по INSERT правильно, а дальше по триггеру пишутся частично.
-
-
какой тип движка таблицы используете?
-
AggregatingMergeTree
-
тогда странно почему исторические данные, норм, а после - частично. что-то нестандартное используете? джойны и т.д.?
скиньте ддл таблицы, там наверно сразу будет видно проблему -
- 27 July 2021 (119 messages)
-
-
select
id, num,
lagInFrame(test_dt) over (partition by id order by test_dt ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as eff_dt,
test_dt as exp_dt from test.test
343123 1234567 1970-01-01 06:00:00 2020-02-24 17:08:59
343123 7654321 1973-05-04 22:26:32 2020-02-24 17:20:12 -
-
select
id, num,
lagInFrame(test_dt) over (partition by id order by test_dt ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as eff_dt,
test_dt as exp_dt from
( select 343123 as id, 1234567 as num, '2020-02-24 17:08:59' as test_dt
union all
select 343123 as id, 7654321 as num, '2020-02-24 17:20:12' as test_dt)
343123 1234567 2020-02-24 17:08:59
343123 7654321 2020-02-24 17:08:59 2020-02-24 17:20:12 -
-
-
KILL MUTATION WHERE 1
KILL MUTATION WHERE mutation_id = 'xxx' -
MODIFY COLUMN RequestTime String │ 2020-12-07 19:42:07
MODIFY COLUMN UpstreamResponseTime String │ 2020-12-07 19:42:48
если помимо делитов зацепил старые такие, ничего страшного? я не очень понимаю один момент, они там пожизненно висят? -
-
-
> если помимо делитов зацепил старые такие, ничего страшного? я не очень понимаю один момент, они там пожизненно висят?
Да, ну подчищаются старые если больше 100 штук накопилось
А так весят всегда. Если мутации закончились, то ничего страшного -
Всем привет.
Коллеги, подскажите где можно найти доку по работе с внешними словарями типа executable. Интересует, как происходит запуск скрипта, как обрабатывается lifetime, как отслеживается процесс(если отслеживается) и как происходит его перезапуск.
Или проще самому протестить это? в официальной доке не нашел никаких подробностей. -
Добрый день, подскажите плз, а как скопировать структуру таблицы ? ну в смысле создать таблицу на основании другой таблицы без данных ?
-
CREATE new_table AS other_table
-
big snks
-
кмк мало людей используют такие словари из executables, лучше сами протестите...
-
Добрый день. А как кликхаус выбирает, какой блок переместить на следующий диск в гетерогенной конфигурации стораджа при достижении move_factor? Что если на холодный диск уедут маленькие блоки?
И как move_factor взаимодействует с max_data_part_size? Что будет в приоритете? -
>А как кликхаус выбирает, какой блок переместить на следующий диск в гетерогенной конфигурации стораджа при достижении move_factor? Что если на холодный диск уедут маленькие блоки?
не думаю что на эту логику следует рассчитывать, она может и поменяться. Если надо чтобы не уезжали маленькие блоки, то лучше использовать ТТЛ based логику, а если диски одинаковые какая разница...
>И как move_factor взаимодействует с max_data_part_size? Что будет в приоритете?
если парт больше чем max_data_part_size, он просто в этот волюм не вставится, и пойдет в другой волюм. КХ заранее примерно рассчитывает будущий размер.
move_factor влияет на background перемещения.
короче, они не взаимодействуют.
подробнее https://altinity.com/blog/2019/11/29/amplifying-clickhouse-capacity-with-multi-volume-storage-part-2 -
ZSTD (первый парт) и LZ4 (остальные) честные x2 сжатие, рекомендую
-
> короче, они не взаимодействуют.
так если блок смёржился и стал больше чем max_data_part_size_bytes, но до move_factor ещё далеко, получается блок не отъедет? -
-
Отъедет, это ж новый парт.
Мердж это удаление старых партов и запись новых. -
так выходит эти две опции всё же взаимодействуют и max_data_part_size_bytes в приоритете?
-
Если макс сайз превышен он сразу запишется в другой волюм. Если он не превышен но мувфактор превышен, он или другой парт перенесется потом на новый волюм.
-
Всем привет. Может кто подсказать к кому обратится за консультацией ($). Сейчас используем Qlik Sense, данные подливаем из MSSQL, поставлена задача перейти на ClickHouse. Данных в целом немного (3 таблиц до 1 млн и пару по 10 млн). С CH вообще не работали(( интересует общая консультация есть ли смысл, какую модель юзать, какого железа должно хватить и т.д, спасибо за понимание!
-
-
смотрите словари, процессы, мерджи
-
select formatReadableSize(sum(bytes_allocated)) from system.dictionaries;
select formatReadableSize(sum(memory_usage)) from system.merges;
select formatReadableSize(sum(memory_usage)) from system.processes; -
Добрый день, кто сталкивался с проблемой. Для таблицы с engine = Kafka зависли материализованные представления, пример на картинке. Если отключаю материализованное представление, то из списка пропадает только одно, а два других всегда остаются, как решить проблему? Это поле system.tables.dependencies_tables
-
-
Спасибо!
-
Вы скорее всего чатом ошиблись
-
КХ держит словари, индексы, марк кеш в памяти (его можно сбрасывать). Ещё при крупных вставках тоже жрет память теперь (флаг optimize_on_insert).
индексы в памяти через system.tables.
мерджи памяти потребляют мало. запросы - это уже зависит от запросов. КХ не сразу освобождает память после запросов.
так что основные константные потребители - это словари, индексы и марк-кеш -
Как подсчитать размер строки, размер таблицы, размер БД на диске?
-
Clickhouse: как узнать размеры таблиц? - Highload.today
Запрос на Clickhouse для вывода всех таблиц и их размеров
-
-
Всем привет! Что может вызывать ошибку DB::ParsingException: Cannot read all array values: read just 1846312 of 3705006? Возникает нерегулярно, TTL для таблички не установлен вовсе. Запросы, которые этой ошибкой завершаются - инсерты, все долгие (более 2 минут), версия кх 21.3.5.42
-
У вас там большие массивы в инсертах?
-
Больше 10к записей, но меньше 100к
-
Ну и обновитесь до последней 21.3 версии
-
А это точно поможет?)
-
Ну 21.3.5 довольно сыровата
Мы вот рекомендуем как минимум 21.3.13 -
По поводу вашей проблемы, нужен воспроизводимый пример, но 10к-100к записей в каждом массиве это довольно большие массивы.
-
-
-
Добрый день. Подскажите плз, конектил ли ктото онлайновый(не дестктопный) Tableu к ClickHouse ?
Почитал сообщения в группе, есть только про десктоп и сервер варианты(если я правильно понял).
Заранее спасибо :) -
-
Нет, ну либо использовать complex_key словари
-
https://help.tableau.com/current/online/en-us/to_connect_live_sql.htm#connectors
Облачная табло не поддерживает.
Возможно когда наш коннектор засертифицирует табло, будет возможно.Tableau Online: Allow Direct Connections to SQL-based Data in the CloudIf you maintain SQL-based data on a cloud platform, you can use direct connections to that data when you publish workbooks and data sources to Tableau Online
-
Можно загружать csv и импортировать в tableau
-
Самый проверенный способ для CH+Tableau
-
-
-
-
нет, он может быть хоть в наносекундах
-
-
он в секундах)
-
-
-
Спасибо, а сколько вы кладте +\- времени на сертефикацию?
-
-
-
Анфортунатели, обьёмы данных не про Цсв ((
-
по проблеме есть что сказать?
-
для не csv-объёмов связка tableau+ch не работает
-
используйте другой BI
-
проблема в том, что юникс тайм это количество секунд, а вы вместо него передаете миллисекунды
-
Tableu не вывезет ?
-
драйвер не вывезет
-
который odbc
-
что сокет дал - то и имею, не я их создаю же, непонятно?
-
https://clickhouse.tech/docs/en/sql-reference/functions/type-conversion-functions/#fromunixtimestamp64nano
fromUnixTimestamp64MilliType Conversion | ClickHouse DocumentationType Conversion Functions Common Issues of Numeric Conversions When you convert a value from one to another data type, y
-
Ясен понятен, спс :)
-
о, спасибо, годно
-
Вам действительно нужно в табло вытаскивать миллиарды строк?
-
нет. десятков тысяч хвтит
-
Но даже на них ODBC не справляется
-
даже на тысяче задержки в 10 секунд
-
обьём +\- 10 - 50 млн
-
имеется в виду кол-во строк в результате. То есть уже в аггрегациях
-
Почему у меня костыльный odbc драйвер в power bi возвращает 1000 строк за секунды?
-
Видимо потому что там драйвер норм
-
Нет, такой же odbc
-
и? Драйвер все равно не тот же самый
-
Я вот про этот драйвер говорю
https://github.com/ClickHouse/clickhouse-odbc
В нем есть тормоза при работе с tableau. -
Ровно такой же odbc драйвер, просто обертка другая.
Про odbc драйвер можно много плохого сказать, но 1000 строк он не 10 секунд будет возвращать если есть нормальная сеть. -
вы попробуйте просто
-
Основная идея моего кривенького, это атомарка которая собирается в разные агрегации.
Для аналитики подругому сложно, нужно часто спускаться до низжего уровня -
Tableau генрирует к odbc специфичные запросы, и большие лаги происходят не в CH и не в Tableau, а именно в драйвере
-
powerBi может генрировать другие запросы в драйвер, не работал с powerBI, не видел его запросы
-
с маленьким размером батча не может быть связано?
что-нибудь типа CAP_ODBC_FETCH_BUFFERS_SIZE_MASSIVE ? -
К сожалению уже не знаю. Два года назад я перебирал все настройки драйвера, с тех пор может новые появились, которые могут настроить tableau хорошо, по умолчанию до сих пор тормоза
-
У меня на руках нет табло, но наши клиенты пользовались tableau и с обычным odbc драйвером, и пробуют сейчас с нашим коннектором.
1000 строк (если там не какой то сложный запрос который и без этой мишуры долго выполняется) за 10 секунд это что то не так -
А, ну два года назад.
С этого нужно было начинать -
Если найдете настройки , которые позволяют уменьшить тормоза - было бы классно
-
нашёл список настроей, которые я тюнил, этого там нет.
-
да, набор опций зависит от версии,
но в любом случае, стоит выснить размер батча, как мне кажется
тут пишут:
>Row/Resultset Buffers - Prefer larger buffer sizes to improve the performance of fetching numerous rows, which can greatly improve the speed of creating extracts. This is sometimes called the cache size or response size.
https://help.tableau.com/current/pro/desktop/en-us/odbc_customize.htmExample: Customize an ODBC ConnectionWhen you use a connector for a database that supports SQL, Tableau generates SQL statements that are tuned for that database
-
Не могу скопировать данные из PG, выходит ошибка
Code: 998, e.displayText() = DB::Exception: Unable to connect to any of the replicas (version 21.6.5.37 (official build))
CREATE TABLE local_db.status
(
`id` UInt64
)
engine = PostgreSQL('localhost:5432', 'db-test', 'public.status', 'user', 'password')
pg table
create table if not exists status
(
id bigserial not null
primary key
}
В какую строну копать, подскажите пожалуйста?) -
предположение в стиле "пальцем в небо":
может localhost заменить на реальный адрес интерфейса? -
ну типа PG не прослушивает lo и не принимает на нем соединения...
-
PG локально стоит и слушает этот адрес. Через pgAdmin все подключается
-
Всем привет!
Есть 2 инстанса КХ
Есть табличка ReplicatedMergeTree
Через HAProxy пишет сервис в табилцу с балансировкой раундробин
На нодах получается разное кол-во записей
Если делаю транкейт на ноде где больше записей, в ноде где было меньше записей таблица очищается, а на которой больше остается сколько было до транкейка минус то что было на реплике
Почему так происходит подскажите и как это починить -
Отбой ребят, дело было не в бабине ....
-
zookeeper настроен?
SELECT * FROM system.zookeeper WHERE path='/'
system.macros
разный replica для обоих хостов?
релпикация асинхронная, после того как вы записали в таблицу на ноде
создается part в system.parts и item в ZK очереди на репликацию
после этого clickhouse сам идет и качает с другой ноды физические файлы с данными
ноды между собой могут нормально конектиться чтобы парты таскать? -
=) ну расскажите уж =) в чем дело было?
-
в разных бд есть таблицы с одинаковыми именами и запрос
SELECT
table,
formatReadableSize(sum(bytes)) AS size,
min(min_date) AS min_date,
max(max_date) AS max_date
FROM system.parts
GROUP BY table
Возвращал неверное значение -
=) а
-
Поменял на ip, вроде бы подключается к pg. Теперь другая ошибка java.net.ConnectException: Connection refused: connect
В pg_hba.conf, все открыто -
toQuarter возвращает номера кварталов
Можно сделать чтобы она возвращала год-месяц начала кварталов? -
toStartOfQuarter ?
-
Спасибо, то что нужно
-
Подскажите как в groupArray записать в детерминирован порядке? Если поля id_order,name, date, делаю groupArray(name) order by id_order, и в groupArray надо отсортировать по полю date
-
Сортировка по нужному полю в подзапросе
-
Но я не группирую по нему, как сортировать тогда?
-
> в подзапросе
SELECT groupArray(x) FROM (SELECT * .... ORDER BY y) -
Спасибо
-
Наткнулся тут на https://clickhouse.tech/docs/ru/sql-reference/statements/select/all/ а есть ли практическое применение этого?ALL | Документация ClickHouse
Секция ALL Если в таблице несколько совпадающих строк, то ALL возвращает все из них. Поведение запроса SELECT ALL точно
-
Донастраивать pg_hba. Сверяться с настройками пгадмина.
-
Скорее всего добавлено больше для соответствия ansi sql
- 28 July 2021 (46 messages)
-
Скорее всего select arraySort(groupArray(x)) from table будет эффективнее по памяти (по крайней мере когда есть группировка)
-
в наших тестах это ещё зависело от размера массивов, если они сильно разные (где то 10, где то 10 тыс) у нас было так себе по скорости... глубоко никто не копал правда.
-
Это не помогло, все равно есть местами события не по порядку
-
Всем дратути, хочу заюзать новый экспериментальный engine replicated. Пока вроде все работает, но вопрос про веса шардов - есть ли какая-то возможность их поменять для той или иной ноды?
Так как шарды теперь прописываются не в конфиге, а создаются динамически - как быть с весами?
Спасибо -
Веса нужно теоретически будет поменять, если будем добавлять еще шардов, и нужно будет сбалансировать данные - писать больше в новые шарды какое-то время
-
-
with работает без проблем. Только обнаружилось что MV to table as select должен формировать правильные имена колонок. Иначе заполняет дефолтными значениями.
-
Мне выдаёт ошибку что в базе нет таблиц с именами из WITH
-
у вас одна база или несколько? не могло случиться какой-то "запутанности"? Ну и версию наверное надо посвежее, там что-то улучшали с CTE.
-
Когда делаю в целевую таблицу insert into target_table select * from (%select with%)
То всё ок
А когда пытаюсь сделать МВ на базе этого запроса, то выдаёт ошибки что таблиц с именем из секции WITH нет в базе.
База одна -
-
-
Добрый день всем! Похоже тикет https://github.com/ClickHouse/ClickHouse/pull/16252 не совсем исправил проблему с SNI.
Я пытаюсь загрузить данные с внешнего TSV, получаю SSL Exception: error:10000410:SSL routines:OPENSSL_internal:SSLV3_ALERT_HANDSHAKE_FAILURE (version 21.7.4.18 (official build))
Вот запрос:
SELECT
*
FROM url('https://www.erikbolstad.no/postnummer-koordinatar/txt/postnummer.csv', TabSeparatedWithNames, '`POSTNR` String DEFAULT '''',
`POSTSTAD` String DEFAULT '''',
`POSTNR- OG STAD` String DEFAULT '''',
`BRUKSOMRÅDE` String DEFAULT '''',
`FOLKETAL` UInt16 DEFAULT 0,
`BYDEL` String DEFAULT '''',
`KOMMNR` UInt16 DEFAULT 0,
`KOMMUNE` String DEFAULT '''',
`FYLKE` String DEFAULT '''',
`LAT` Float32,
`LON` Float32,
`DATAKVALITET` String DEFAULT '''',
`DATAKVALITETSFORKLARING` String DEFAULT '''',
`SIST OPPDATERT` String DEFAULT ''''')
LIMIT 20;Support SNI in https connections to remote resources by alexey-milovidov · Pull Request #16252 · ClickHouse/ClickHouseChangelog category (leave one): Improvement Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Support SNI in https connections to remote resources. Thi...
-
Добрый день, подскажите пожалуйста, какого типа в Kafka Engine c Avro создать поле для поля из Avro с типом
{
"type": "bytes",
"logicalType": "decimal", "precision": 9, "scale": 2
} -
С типом Decimal(9,2) ошибка:
SQL Error [44]: ClickHouse exception, code: 44, host: 10.241.186.56, port: 8123; Code: 44, e.displayText() = DB::Exception: Type Decimal(9, 2) is not compatible with Avro bytes:
{
"type": "bytes",
"logicalType": "decimal", "precision": 9, "scale": 2
}: column kolvo: While executing SourceFromInputStream (version 20.9.2.20 (official build)) -
Input and Output Formats | ClickHouse Documentation
Formats for Input and Output Data ClickHouse can accept and return data in various formats. A format supported for input
-
думаю вам лучше issue отдельный завести со ссылкой на pull request с деталями
-
А как дальше байты преобразовывать в Decimal?
-
Можно попробовать через reinterpret('xxx', 'Decimal64(2)'), но мб и не сработает
-
никто не подскажет почему в 20.8 все алиасы (clickhouse-client, clickhouse-*) использовали relative path ( ./clickhouse)
а начиная с версии 21.3 оно использует абсолютный путь /usr/bin/clickhouse
это сломало все наши инсталляции в chrootах ((( -
думаю лучше issue завести
-
@unamedrus подскажите, пожалуйста, про clickhouse connector. Сейчас настроено соединение через ODBC драйвер (инструкция с вашего сайта). Но переодически получаю такие сообщения от аналитиков.
"""у меня табло при взаимодействии с кликхаусом странно себя ведет, когда пытаюсь открыть воркбук, ввожу коннекшены и вылетает из табло тут же, потом при открытии возникает сообщение отправить сообщение об ошибке или нет и все, никаких норм ошибок нет"""
Или же постоянно спонтанные падения extract'ов на сервере.
Хочу попробовать заиспользовать коннектор (может с ним лучше будет). Нашел статью https://docs.altinity.com/integrations/clickhouse-and-tableau/tableau-desktop-with-clickhouse/
Но вопрос. Даже, если я его подключу к tableau-desktop вручную, то workbook же потом не получается выгрузить на сервер? Может у вас есть гайд или же совет как нужно работать в этой связке. Может есть полезный опыт как сейчас взаимодействуют Ваши клиенты?Connect Tableau Desktop to ClickHouseConnect your Tableau Desktop application to ClickHouse
-
Хм,
https://github.com/Altinity/clickhouse-tableau-connector-odbc/issues/2#issuecomment-873861785
Вообще судя по всему, подключить к табло серверу этот коннектор у людей получилось.
По поводу внезапных ошибок сложно что то сказать не имея информации на руках.Support for Tableau Linux Server · Issue #2 · Altinity/clickhouse-tableau-connector-odbcGreetings, First and foremost I want to thank you for this awesome project, it works flawlessly for Tableau Desktop. What I'm trying to do however is to install the connector on Tableau Lin...
-
-
да
-
-
-
DROP TABLE ... SYNC
-
-
Всем привет.
А кто то юзает clickhouse-operator от Altinity?
Пытаюсь поднять кликхаус с Circular Replication по схеме как указано в статье
https://altinity.com/blog/2018/5/10/circular-replication-cluster-topology-in-clickhouse
Дано: 3 ноды кубера, 3 шарда, каждый шард с 2 репликами
В yaml:
...
layout:
shardsCount: 3
replicasCount: 2
...
podDistribution:
- type: ShardAntiAffinity
- type: ReplicaAntiAffinity
- type: MaxNumberPerNode
number: 2
В результате не поднимается последний под (для shard3-replica1). Висит в Pending и говорит
3 node(s) didn't match pod affinity/anti-affinity rules, 3 node(s) didn't match pod anti-affinity rules
Есть старый issue с такой же проблемой
https://github.com/Altinity/clickhouse-operator/issues/589
Но использую те же параметры как в нем описано и проблема не уходит.
При этом если поднять ему 4 ноду кубера то все поды поднимаются без проблем. Хотя вроде как должен работать на 3 нодах как по мне.
Я создал уже issue но думаю может я где то туплю. -
Не вижу к этому документации
-
сделайте pull request на github для документации это не сложно, документацию сообщество делает
в release notes есть
https://clickhouse.tech/docs/en/whats-new/changelog/2020/#improvement_2
Support for database_atomic_wait_for_drop_and_detach_synchronously/NO DELAY/SYNC for DROP DATABASE. https://github.com/ClickHouse/ClickHouse/pull/16127 (Azat Khuzhin).2020 | ClickHouse DocumentationClickHouse release 20.12 ClickHouse release v20.12.5.14-stable, 2020-12-28 Bug Fix Disable write with AIO during merges
-
Мы вообще не рекомендуем использовать circular replication
-
Я понимаю что идеальный вариант одна нода - один шард/реплика, но все же непонятное поведение оператора. Вроде как по документации такая схема должна работать, но он почему то не берет "свободную" ноду (на которой нет реплики моего 3 шарда) и не разворачивает под на ней.
-
Ох...
-
И для понимания, а чем плоха такая схема как указана в статье? Если кликхаус не сильно нагружен 90% времени, есть свободное место и т.д то по такой схеме получаем экономию по серверам но в то же время и резервирование данных.
-
Гораздо сложнее ее менеджить
-
-
-
Спасибо 🙏
-
подхватывается, начиная с 20.3
-
Списибо, проблему решил
-
а это первое выполнение запроса? а второе тоже дольше?
с 8192 надо читать больше марков.
32768 -- возможно это не спроста и кто-то уменьшал размер первичного индекса который не влезал в ОЗУ при 8192, тут в чатике есть люди у которых первичный индекс кушает десятки гигабайт ОЗУ при триллионах строк. -
полностью переписан odbc драйвер уже
-
engine replicated никак не связан с Distributed. Веса и описание кластера пишутся в remote_servers
-
добавлять одним alter. В alter можно перечислять команды. alter table ... add column a, add column b, drop column d, modify column k, freeze
- 29 July 2021 (201 messages)
-
оно синхронное
можно сделать
ALTER TABLE ... ON CLUSTER 'cluster-name' ... ;
если надо чтобы на всех нодах сделалось
Таблица которую модифицируете у нее какой Engine? -
Приветствую. При попытке создать таблицу в базе staging CREATE TABLE IF NOT EXISTS staging.user_props …. получаю ошибку:
‘’’ServerError: Table columns structure in ZooKeeper is different from local table structure (version 20.8.18.32 (official build)) (122)’’’
При этом в default базе уже есть таблица с таким же названием, но вряд ли это как то влияет
Можете подсказать как это победить? -
SELECT engine FROM system.databases WHERE name='staging'?
Atomic?
если да, то надо было таблицу удалять как DROP TABLE staging.user_props ON CLUSTER 'xxx' NO DELAY; -
попробуйте сначала
DROP TABLE IF EXISTS staging.user_props ON CLUSTER 'xxx' NO DELAY; -
SELECT engine
FROM system.databases
WHERE name = 'staging'
┌─engine───┐
│ Ordinary │
└──────────┘ -
походите по zookeeper
Там есть ключи
и можно понять какие реплики для таблицы зарегистрированы и какая структура таблицы актуальная
SELECT * FROM system.zookeeper WHERE path='/' FORMAT Vertical; -
возможно на другой реплике в том же кластере создана таблица с другой структурой
-
Прошелся по репликам, там нет такой же таблицы, точнее там даже базы staging нет, только в одной реплике создалась
-
SELECT *
FROM system.zookeeper
WHERE path = '/'
FORMAT Vertical
Row 1:
──────
name: zookeeper
value:
czxid: 0
mzxid: 0
ctime: 1970-01-01 00:00:00
mtime: 1970-01-01 00:00:00
version: 0
cversion: -2
aversion: 0
ephemeralOwner: 0
dataLength: 0
numChildren: 2
pzxid: 0
path: /
Row 2:
──────
name: clickhouse
value:
czxid: 4294967298
mzxid: 4294967298
ctime: 2020-09-10 20:52:42
mtime: 2020-09-10 20:52:42
version: 0
cversion: 1
aversion: 0
ephemeralOwner: 0
dataLength: 0
numChildren: 1
pzxid: 4294967299
path: /
Вот что получил -
ну странно очень
а откуда тогда у вас в ZK оказалась другая версия схемы таблицы?
пройдитесь по путям в ZK -
ну, теперь дальше идем WHERE path='/clickhouse';
и пока не разберетесь что там у вас в ZK -
А может он сравнивать с таблицей из другой базы, у меня две базы, и названия таблиц будут совпадать
-
Хорошо, попробую, спасибо
-
да. если у вас совпадают пути в этих таблицах для ReplicatedMergeTree(тут_путь_указывается)
-
путь должен быть уникальным
-
Движок MergeTree. Только у нас одна нода. С одной тоже такой вариант сработает?
-
на одной ноде, у вас ALTER TABLE точно синхронный
что именно у вас в следующей query не работает?
покажите SQL код миграции и исходный SHOW CREATE TABLE таблицы? -
Привет. Есть вопрос. У меня есть данные по ивентам сессии пользователя(время, сессия, навзание ивента), мне требуется чтобы между ивентами не было определенного ивента. Например мне нужно посчитать сколько пользователей сделали event1 вместе с event2, между ивентами должны быть другие ивенты, но не должен быть event3. С помощью массива, реализация не возможна, т.к. не хватает оперативки. Пробывал через seuenceMath('(?1)(?3)(?2)') EventName = event1, EventName = event2, EventName != event3, но результат не верный.
-
--Таблица, в которую добавляется новый столбец
CREATE TABLE order_events (
event_id UUID,
...
occurred_at DateTime64(6)
)
ENGINE = MergeTree
PARTITION BY toYYYYMMDD(occurred_at)
ORDER BY occurred_at;
--Вот тут как будто мгновенно отрабатывает
--И следующие statement'ы начинают выполняться
--Ещё до того, как столбец полностью добавится
ALTER TABLE order_events ADD COLUMN is_original UInt8 DEFAULT 1;
CREATE TABLE orders_storage (
order_id UUID,
...
is_original AggregateFunction(argMax, UInt8, DateTime64(6))
)
ENGINE AggregatingMergeTree()
ORDER BY (created_at, order_id)
PARTITION BY (toYYYYMM(created_at));
--Вот тут валится
--Error: "Missing columns: 'is_original' while processing query:
--SELECT order_id, ..., argMaxState(is_original, occurred_at) AS is_original FROM order_events GROUP BY order_id
CREATE MATERIALIZED VIEW orders_input_materialized TO orders_storage AS (
SELECT
order_id,
...
argMaxState(is_original, occurred_at) AS is_original
FROM order_events
GROUP BY order_id
);
CREATE VIEW orders AS (
SELECT
order_id,
...
argMaxMerge(is_original) AS is_original
FROM orders_storage
GROUP BY order_id
); -
И действительно так, в ReplicatedMergeTree пути совпадают
ENGINE = ReplicatedMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/default/‘events, '{replica}')
Если сделать
ENGINE = ReplicatedMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/staging/‘events, '{replica}')
то должно сработать? -
В ZK как раз только один путь, который ведет в таблицы default базы
-
Всем привет! Почему пишет, что данного движка нет? Версия CH - 21.7.3
DB::Exception: Received from localhost:9000. DB::Exception: Unknown table engine MaterializedPostgreSQL -
allow_experimental_database_materialized_postgresql
Включили настройку в дефолтном профайле? -
В каком файле находится?
-
users.xml
-
Не вижу в данном файле данной строки, её нужно добавить самостоятельно?
-
Да
-
А есть какая-нибудь статья? Какое значение указывать внутри тега?
-
1
-
https://clickhouse.tech/docs/en/engines/database-engines/materialized-postgresql/
Хм помимо этого наверное нетMaterializedPostgreSQL | ClickHouse Documentation[experimental] MaterializedPostgreSQL Creates ClickHouse database with an initial data dump of PostgreSQL database table
-
Данная у меня открыта)
По конфигам есть информация, а то нигде не видел нормальной) -
Скорее всего нету
-
Ну точнее почти все возможные настройки можно посмотреть так:
SELECT * FROM system.settings -
Спасибо
-
Ввел данный параметр в профайл, ошибка такая же
-
Unknown table engine MaterializedPostgreSQL
-
у вас clickhouse в kubernetes?
по умолчанию cluster и installation макросов на сервере нет
ну если пути будут разные то сработает -
Да, в кубере
-
А косяк,
Его только в 21.8 замержили, а у вас 21.7
https://github.com/ClickHouse/ClickHouse/commit/8351f1db9923100e411c380a8ba3fa52b5dff4d3Merge pull request #20470 from kssenii/pg-ch-replica · ClickHouse/ClickHouse@8351f1dMaterializePostgreSQL table engine and database engine
-
Как я понимаю, данный движок копирует структуру таблицы из postgresql?
-
реплицирует изменение в данных из постгри в кликхаус
-
То есть он копирует данные в кликхаус?
А PostgreSQL просто позволяет удаленно брать данные без репликации? -
Да
-
То есть структуру таблицы в любом случае нужно указывать самостоятельно?
-
Ага,
Ну либо смотреть в сторону движка базы данных (materialized)postgresql -
Я как раз хочу его использовать MaterializedPostgreSQL
-
А, именно базы данных, а не таблицы?
-
Ага, тогда он сам подтянет определения для таблиц
-
Только проблема в том, что нужно взять таблицы из определенной схемы postgresql
-
Всех приветствую. Подскажите пожалуйста, есть ли возможность поменять дефолтный тип сжатия для партиции не трогая глобальные настройки compression?
-
TTL RECOMPRESS
https://kb.altinity.com/altinity-kb-queries-and-syntax/ttl/ttl-recompress-example -
Ну надо смотреть, наверное там можно схему как то послать
-
Уже неплохо, мою задачу закрывает. Спасибо!
-
что то у вас фигня в materialized view
FROM order_events
делаете
а выбираете order_id
а в нем только event_id по вашим словам есть -
Там куча столбцов. Я их опустил, о чём свидетельствует "..."
-
А как обновить до не стабильной версии?
-
Кликхаус
-
ALTER TABLE синхронный
вот так
https://pastebin.com/sgkqkxUq
все отработало без проблем
у вас явно проблемы с SELECT запросом в MATERIALIZED VIEWCREATE TABLE order_events ( event_id UUID, order_id UUID, occurred_at D - Pastebin.comPastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
-
господа, вопрос такой
задача в том, что в таблицу tableTrees грузится дерево из записей вида
(uuid UUID, root_uuid UUID, depth UInt8, content String )
сначала вставляются ветки, последним корень c depth = 0 и в MV нужно сджойнить данные из всего дерева по root_uuid и с другой таблицей по content
проблема в том, что отлавливая вставку корня дерева в MV выборка из tableTrees ограничена только данными которые есть в инсерте
Как заставить читать данные из всей таблицы для джойна? -
никак
MV работает только с данными вставляемого блока... -
подскажите что можно сделать
решили поменять тип данных на столбце но получили
Exception happened during execution of mutation '0000000001' with part '201502_27_27_0' reason: 'Code: 32, e.displayText() = DB::Exception: Attempt to read after eof: Cannot parse UInt64 from String, because value is too short: while executing 'FUNCTION CAST(typeID :: 26, 'UInt64' :: 46) -> CAST(typeID, 'UInt64') UInt64 : 45': (while reading from part /var/lib/clickhouse/store/d87/d872541f-0c43-41fa-9872-541f0c4381fa/201502_27_27_0/): While executing MergeTree (version 21.6.8.62 (official build))'. This error maybe retryable or not. In case of unretryable error, mutation can be killed with KILL MUTATION query.
мы пользуемся облаком яндекса, и в итоге прав на KILL MUTATION on cluster у нас почему-то нету .... выяснять почему это видима очень на долго ... что еще можно сделать в данной ситуации ?
запросить в таблице что либо на текущий момент нельзя -
т.е. мы по сути даже создать новую таблицу и перелить даныне не можем ..... селекты не выполняются
-
Ясно.
А можно ли на МВ повесить ещё одну МВ каскадом?
И ещё, когда тригеррится МВ данные уже записаны в таблицу или могут быть гонки? -
Как я могу обновить clickhouse до нужной мне prestable версии?
-
Можно, вроде может завалится (записаться в 2 а в третью нет скажем)
смотрим видео и все запоминаем https://www.youtube.com/watch?t=7596&v=1LVJ_WcLgF8 -
Спасибо, сейчас посмотрим
-
можно, но данные туда попадут только в рамках одного блока который формируется при вставке в MV
-
спасибо большое за ссылку, попробую настроить. Проблема заключается в том, что tableau и odbc (clickhouse) в данный момент при тестировании соединения пишет "все ок". Но по факту затирает пароль. Или же, например, при публикации отчета с десктопа на сервер - возможно только при типе выставленном типе соединения live и только после этого его можно переключить на extract. Вообщем странные танцы с бубнами и не понятно где и в какие логи смотреть) Вот хочу попробовать пересадить аналитиков на ваш плагин.
-
в видео указано что у МВ без таблиц назначения имя должно быть '.inner.MVname'
у меня на версии 21.3.14 селекты к МВ идут по обычному имени
и каскадирование что то не срабатывает ((
сейчас попробую с отдельными таблицами каскадирование -
Добрый день, нужна помощь с бекапом, пробую локально на 2х докер образах по инструкции
https://altinity.com/blog/introduction-to-clickhouse-backups-and-clickhouse-backup
выполнил freeze скопировал shadow на второй образ по пути data/schema/table/detached но при выполнении alter table events attach partition в логах пишет, что партиция не найдена и бекап не восстанавливается, куда можно посмотреть?Introduction to ClickHouse Backups and clickhouse-backupThis article will explore the plumbing involved in backing up ClickHouse and introduce the clickhouse-backup tool for automating the process.
-
это от синтаксиса создания. используйте синтаксис с TO с явным указанием таргет таблиц, иннер это всегда боль
-
А таблицы создали перед восстановлением?
-
да, таблица есть, там одна
-
так у меня вообще нет имён с '.inner' и при обращении с таким именем таблицы в базе нет - может это поменялось или в настройках что то
-
сделайте select * from system.detached_parts;
-
есть запись о моем бекапе
-
с явным указанием промежуточной таблицы каскадирование вроде заработало
тестируем дальше -
какая точно ошибка? как выполняете команду attach?
-
Выполняю у оригинально БД запрос
select * from system.parts where active = 1 and table like 'sat_analytic_events' - получаю имена партиций
на бекап БД
alter table sat_analytic_events attach partition '202107';
202107 - заменяю на имена партиций из system.parts колонка partition -
используйте кнопку ответить
так какая ошибка? вы уверены, что там есть эта партиция? -
проблема как раз в том, что ошибки нет, в логах сообщение что партиция не найдена.
"вы уверены, что там есть эта партиция?"
ну я сделал freeze на всю таблицу, дока говорит, что будут сохранены все партиции
можно как-то узнать какие партиции есть в конкретном бекапе? -
сделайте аттач по партишн_ид
-
ну или по нейм парта
вот нашел пример генерации запроса для всех партов
только если их много, то долго будет выполняться(
select distinct 'ALTER TABLE '||database||'.'||table||' ATTACH PART '||'\''||name||'\';' from system.detached_parts
where database='db_name'; -
ClickHouse/ClickHouse tagged: v21.7.5.29-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.7.5.29-stable
Release notes:
v21.7.5.29-stableRelease v21.7.5.29-stable · ClickHouse/ClickHouseClickHouse stable release v21.7.5.29-stable
-
может быть инструкция под версию не подходит?
Партиции у меня такие 202105, 202106, 202107
при этом в shadow создается каталог 1 и increment.txt. Они же в detached_parts выводятся, но кажется там должны быть именно партиции а не инкремент бекапа -
конечно, там должны лежать куски
-
хм ща попробую одну идею
-
о получилось, но получается статья устарела и при бекапе всей таблицы надо переносить не весь shadow а только парты вытащив их?
-
И наврено более общий вопрос.
Получается пока есть жесткие ссылки кликхаус не будет мерджить партицию?
Поэтому их надо удалять после переноса и это же гарантия, что до удаления файлы будут существовать? -
> Получается пока есть жесткие ссылки кликхаус не будет мерджить партицию?
Кх будет мержить, удалять и тд парт
Просто ваш бекап начнет использовать реальное место на жестком диске -
О это хорошо) не в плане хранить его, а в плане, что во время копирования бекапа ничего страшного не должно произойти)
-
В кх нельзя при dictGet как-то наиборот исхитриться и взять значение id по какой-то колонке name допустим?
-
Хочу взять не value по key, а key по value ;D
-
Создать обратный словарь
-
Ну вот перед этим и спрашиваю ;D
-
Вдруг есть что-то чтобы не создавать обратный слоаврь)
-
Hash таблицы так не работают )
-
-
можно создать таблицу ENGINE = Dictionary и по ней искать)
-
-
-
D alter table update column можно сделать селект?
-
ALTER TABLE table_1 UPDATE new_language = (SELECT id FROM table_dict WHERE name = language LIMIT 1) WHERE new_language = 0
Типа такого? -
не уверен что это будет эффективно, так как каждый раз (на каждую строку table_1) он будет бегать и искать строку во всем словаре...
лучше сделать обратны словарь чтобы получить константное время лукапа и спокойно пользовать dictGet, тем более что его сделать элементарно. -
Да я понял уже что без обратного дикта не обойтись, просто стало инетересно про select в update запросе.... Ибо не вышло)
-
Подскажите, при создании базы PostgreSQL
CREATE DATABASE pg ENGINE = PostgreSQL
при подкючении к clickhouse-client падает ошибка что не может найти таблицу layer в нашей основной базе, такой таблицы у нас нет ни в КХ ни в PG, куда копать? из-за этого например DataGrip не может схему загрузить, если удалить базу PG, всё становится ок
Cannot load data for command line suggestions: Code: 60, e.displayText() = DB::Exception: Received from 0.0.0.0:9000. DB::Exception: PostgreSQL table main.layer does not exist. (version 21.3.15.4 (official build)) -
Это стандартный вывод
-
в 21.3 default database engine Atomic
для там MV другой name convention .inner.{uuid} -
сервер какой версии? тоже 18.16 ?
если что, то это настолько древняя версия =) что страшно =)
по древности как MySQL4 ;) -
В общем сделал с отдельными целевыми таблицами в 2 стэйджа
сейчас тестирую с реальными данными -
добрый день, Завели тут https://github.com/ClickHouse/ClickHouse/issues/26949 и получили ответ что это не баг. Можно ли придумать тут какой-то Workaround?toString fails to handle nullable Enum · Issue #26949 · ClickHouse/ClickHouse
Describe the bug toString fails to handle NULL value in an Enum column. Does it reproduce on recent release? Yes, reproduces on ClickHouse 21.7.4.18 with revision 54452 (latest docker image). The l...
-
-
Кто-нибудь пользовался выражением
ALTER TABLE some_table ADD COLUMN new_column UInt32 DEFAULT multiIf(some_exist_field, куча вариантов)
Ещё желательно materialized колонку при это создать и сразу её заполнять значениями основываясь на значениях из другой (some_exist_field) колонки -
Добрый вечер. Я так понимаю кликхаус сейчас перезапрашивает все данные для словаря если сработал триггер обновления.
А не рассматривается в каких-то версиях возможность "ревизионного обновления"
Имею ввиду перезапрашивать для словаря только явно изменившиеся данные -
Есть это тоже. Update field ,или типа этого в доке посмотрите
-
Спасибо большущее!
-
https://clickhouse.tech/docs/en/getting-started/install/
советую почитать документацию
есть отдельный репозиторийInstallation | ClickHouse DocumentationInstallation System Requirements ClickHouse can run on any Linux, FreeBSD, or Mac OS X with x86_64, AArch64, or PowerPC6
-
я пользовался, в чем у вас проблема?
-
Долго отрабатывал запрос?
-
Подскажите, как посмотреть engine настройки у базы? Скорее всего engine Replicated, но надо увидеть пути ZK, название шарда и реплики
-
должно быть мгновенно
ALTER TABLE .. ADD COLUMN
только метаданные меняет
все остальное начинает работать при background merge
ну в multiIf все варианты вычисляются. так что оно должно CPU жрать в зависимости от сложности выражений при вставке
и при SELECT для незаполненных партиций... -
Блэ может чё-то не так делаю, руки кривые
-
Даже на 11к записей по таймауту в 120сек отваливается
-
ну сделайте
SET send_logs_level='trace';
и потом ваш
ALTER TABLE
посмотрите что в клиент в логах прилетит... -
SELECT * FROM system.merges
SELECT * FROM system.mutations WHERE is_done=0
может CPU кто-то сожрал
ну и если вы вставляете данные. вдруг оно по каким то неведомым причинам в Ordinary блокируется (хотя не должно) -
Да всё локально , одна табличка, всякие инсёрты селекты не происходят
-
Получаю данную ошибку
DB::Exception: MaterializedPostgreSQL is an experimental database engine. Enable allow_experimental_database_postgresql_replica to use it. (UNKNOWN_DATABASE_ENGINE) (version 21.9.1.7603 (official build))
в конфиге указал параметр данным образом. В чем проблема? -
Ну там 185 значений в мультиифе
-
его надо в user profile указывать
а не в config.xml -
users.xml, всё верно?
-
SET send_logs_level='trace';
ALTER TABLE ...
что показывает? -
или users.d/alllow_materialized_postgresql.xml
<yandex><profiles><default> ... </default></profiles></yandex> -
Данным образом вообще сервак не робит
-
Я щас ебусь с тем что запрос который работал буквально час назад, какого-то ХУЯ сейчас падает с ошибкой
-
ALTER TABLE some_table ADD COLUMN new_mat_language UInt32 DEFAULT multiIf(language, 'aa', 1, 'ab', 2, 'af', 3, 0)
Invalid number of arguments for function multiIf: default expression and column type are incompatible -
Какого хера дефолтное значение как 0 ему не нравится я не ебу уже
-
час назад этот запрос работал без синтаксических ошибок, просто по таймауту отваливался
-
Почему используете multiIf вместо transform?
-
Или даже Enum
-
Потому что показали его 🤷♂️
-
transform(language, ['aa', 'ab'], [1,2], 0)
-
Да я понял)
-
мата поменьше toTypeName(multiIf(language, 'aa', 1, 'ab', 2, 'af', 3, 0))
и сразу все встанет на свои места -
так. ой. а вы когда в config.xml засовывали, сервер рестартовали?
-
Дублирую)
-
Cорян просто уже слегка на нервах от того как всё не привычно в клике ;D
-
CREATE VIEW with postgres table function results in connections growth without limit in 21.6, but not in 21.4 · Issue #26088 · ClickHouse/ClickHouse
Describe the issue After an update from CH 21.4.6.55 to CH 21.6.5.37 I noticed an endless growth of idle connections on PosgtreSQL side (which is configured as a sync replica, without expiration of...
-
Increasing postgres connections · Issue #23897 · ClickHouse/ClickHouse
Since the latest update 21.4.1 Clickhouse keeps creating new Postgres connections. There is only a single dictionary with postgres as data source On 11:40 I upgraded CH to 21.4.1 from 21.3.9. I hav...
-
ну.... добро пожаловать в клуб. это пройдет =)
потом снова накатит... -
-
Спасибо
-
какой формат сообщения?
покажите параметры создания Kafka таблицы? -
ENGINE = Kafka
SETTINGS kafka_broker_list = 'hadoop_brohers', kafka_topic_list = 'topic_name', kafka_format = 'JSONEachRow', kafka_group_name = 'name' -
хм. а нет каких нибудь типов данных типа Decimal ?
вообще было бы не плохо весь стектрейс ошибки увидеть -
exception_code: 32
exception: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 20.8.13.15 (official build))
stack_trace: 0. Poco::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x18cd37c0 in /usr/bin/clickhouse
1. DB::throwReadAfterEOF() @ 0xe6397d1 in /usr/bin/clickhouse
2. DB::readVarUInt(unsigned long&, DB::ReadBuffer&) @ 0xe834ab4 in /usr/bin/clickhouse
3. DB::TCPHandler::isQueryCancelled() @ 0x1639c46a in /usr/bin/clickhouse
4. DB::TCPHandler::processOrdinaryQueryWithProcessors() @ 0x1639e3d2 in /usr/bin/clickhouse
5. DB::TCPHandler::runImpl() @ 0x163a277d in /usr/bin/clickhouse
6. DB::TCPHandler::run() @ 0x163a3420 in /usr/bin/clickhouse
7. Poco::Net::TCPServerConnection::start() @ 0x18bf177b in /usr/bin/clickhouse
8. Poco::Net::TCPServerDispatcher::run() @ 0x18bf1e98 in /usr/bin/clickhouse
9. Poco::PooledThread::run() @ 0x18d705a6 in /usr/bin/clickhouse
10. Poco::ThreadImpl::runnableEntry(void*) @ 0x18d6b9a0 in /usr/bin/clickhouse
11. start_thread @ 0x7fa3 in /usr/lib/x86_64-linux-gnu/libpthread-2.28.so
12. clone @ 0xf94cf in /usr/lib/x86_64-linux-gnu/libc-2.28.so -
есть lowcardinality, словарь
-
а со стороны kafka никаких ошибок нет? (я правда не знаю где смотреть)
isQueryCancelled
просто так не возникает... -
ну ее кильнули
-
-
-
-
-
ну эээ.... то есть вы хотите вставить в кафку которой нет? ;)
или что именно кильнули? работающий INSERT запрос? -
почему это нет? кафка таблица есть
-
да quantilesState только лучше используете
-
-
ну наличие engine=Kafka таблицы не говорит о том что kafka работает
это просто способ запустить некоторый фоновый thread который будет разгребать топик при чтении
и записывать в топик при старте -
а зачем кильнули рабочий INSERT?
он подвисал?
а топик то есть в kafka в том окружении в котором "не работает"? -
ну долго работал да
-
топик есть да
-
-
Хорошо, спасибо! Смутил просто этот issue https://github.com/ClickHouse/ClickHouse/issues/19300problem with quantile · Issue #19300 · ClickHouse/ClickHouse
I found quantile does not work well in AggregatingMergeTree engine. the value querying from mergeTreeTable is 5-10 times bigger than the value querying from aggregatingTable. Then, I found even tho...
-
А что удивляет тогда? Убили инсерт, конекшн закрылся, а КХ хотел оттуда данные какие-то считать
-
-
Code: 210, e.displayText() = DB::Exception: Unable to connect to HDFS: InvalidParameter: Cannot parse URI: hdfs://prdhdp, missing port or invalid HA configuration Caused by: HdfsConfigNotFound: Config key: dfs.ha.namenodes.prdhdp not found (version 21.7.5.29 (official build))
такая ошибка появилась -
-
-
ответ то kafka видимо пытался прочитать
-
вообще странно что работало
https://clickhouse.tech/docs/en/engines/table-engines/integrations/hdfs/#list-of-possible-configuration-options-with-default-values
во всех примерах порт явно заданHDFS | ClickHouse DocumentationHDFS This engine provides integration with Apache Hadoop ecosystem by allowing to manage data on HDFS via ClickHouse. Th
-
Оказывается с портом тоже не работает
-
-
ошибка таже самая? или другая?
-
Добрый день, подскажите пожалуйста есть ли возможность как то упростить запрос на картинке слева-сверху.
У меня есть таблица в которой несколько колонок-массивов.
Запрос должен вычислять avg по нескольким колонкам (дай мне avg за n минут по temp, fan и тпд).
Я накидал решение для одной колонки, но не знаю как лучше написать запрос для нескольких колонок. -
нет
-
-
Received exception from server (version 21.7.5):
Code: 210. DB::Exception: Received from localhost:9000. DB::Exception: Unable to connect to HDFS: Hdfs::HdfsRpcException: HdfsFailoverException: Failed to invoke RPC call "getFsStats" on server "prdhdp:9000" Caused by: HdfsNetworkConnectException: Connect to "prdhdp:9000" failed: (errno: 111) Connection refused. -
-
ну, у вас хост на 9000 порту тупо не отвечает
-
вроде помог запуск в другом виде, ссейчас у админов уточню и отпишу что ссработало
-
так можно же добавить нужные колонки в ваш запрос
select … avg(temp_val), avg(fan_val) from (
select worker_id, datetime, temp, fan
…
array join temp as temp_val, fan as fan_val
)
или я что-то не так понял? -
Это в users.xml
-
Да, рестарт делал
-
В запросе я сначала разбираю один массив на строки при помощи ARRAY JOIN (на temp_value и temp_index), суммирую с групировкой.
Если я так сделаю, то с групировкой проблем не будет? Порядок элементов имеет значение.
select
worker_id,
round(avg(temp_value), 1) as temp_avg, temp_index,
round(avg(pwr_value), 1) as pwr_avg, pwr_index
from (
select datetime, worker_id, temp, power from stats
WHERE `worker_id` = 3081
and `datetime` between
toDateTime('2021-07-26 19:40:00', 'Europe/Kiev') AND
toDateTime('2021-07-26 19:45:00', 'Europe/Kiev')
order by `datetime` ASC
) array join
temp as temp_value,
power as pwr_value,
arrayEnumerate(temp) as temp_index,
arrayEnumerate(power) as pwr_index
group by (worker_id, temp_index, pwr_index)
order by temp_index ASC; -
Привет
Подскажите, плиз, по архитектурному решению. У нас есть кластер из 8 нод, данные пишутся в одну ноду и позже реплицируются в остальные (почему так хз, но пока это и неважно). Одна из нод клика для нас является источником но вычитываем данные в итоге с лагом, причём лаг этот не предсказуем (от 1 мин до 10 пока ноды не синхронизируются). Этот лаг критичен и хотелось бы как-то его избежать
Можно ли организовать следующее?
1) сделать кластер из трёх нод и писать в них с указания кворума 3, например
2) остальные ноды синхронизируются с 1)
Тогда бы всем для кого отставание критично могли бы ходить в кластер 1), для остальных есть так называемые реплики. -
проблем с порядком не должно быть, и возможно вам достаточно одного “индекса”, если массивы всегда одинаковой длины
-
длинна может быть разная
есть ли возможность потом сгрупировать такой результат назад в одну строку с массивами-колонками? -
select worker_id, groupArray(temp_avg) from (…) group by worker_id
-
тогда параметр будет проигнорирован
в users.xml лежат профили и настройки для пользователей
в config.xml - настройки server level
положите в conf.d
тогда замержится куда надо -
-
-
Привет! А никто не сталкивался что при запуске Clickhouse в контейнере появляется ошибка invalid cross device link? Она появляется только если директория где лежат data файлы находится внутри контейнера. Если пробрасывать наружу или использовать data контейнер, то все хорошо.
- 30 July 2021 (91 messages)
-
Нашел ответ с чуть более элегантным решением с помощью *ForEach (avgForEach)
Может кому то еще пригодится:
select
arrayMap(x -> floor(x,1), avgForEach(temp)) as temp,
arrayMap(x -> floor(x,1), avgForEach(power)) as power
from stats
WHERE `worker_id` = 3081
and `datetime` between
toDateTime('2021-07-26 19:40:00', 'Europe/Kiev') AND
toDateTime('2021-07-26 19:45:00', 'Europe/Kiev'); -
тобишь они в стандартной папке контейнера - /var/lib/clickhouse ?
-
Добрый день. Выполняю запрос из доки (https://clickhouse.tech/docs/ru/sql-reference/statements/create/table/#comment-table) CREATE TABLE t1 (x String) ENGINE = Memory COMMENT 'The temporary table';
SELECT name, comment FROM system.tables WHERE name = 't1'; получаю ошибку Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 44 ('COMMENT') (line 1, col 44): COMMENT 'The temporary table';
SELECT name, comment FROM system.tables WHERE name = 't1';. Expected one of: PRIMARY KEY, end of query, AS, INTO OUTFILE, TTL, ORDER BY, SETTINGS, PARTITION BY, SAMPLE BY, FORMAT (version 21.3.15.4 (official build)) В чем может быть проблема?Таблица | Документация ClickHouseCREATE TABLE Запрос CREATE TABLE может иметь несколько форм, которые используются в зависимости от контекста и решаемых
-
table comment доступен с версии 21.6
https://github.com/ClickHouse/ClickHouse/commit/4ffe199d3947bd12d8a193aca42086f939596cb7Implement table comments · ClickHouse/ClickHouse@4ffe199ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
-
Привет. Есть вопрос. У меня есть данные по ивентам сессии пользователя(время, сессия, навзание ивента), мне требуется чтобы между ивентами не было определенного ивента. Например мне нужно посчитать сколько пользователей сделали event1 вместе с event2, между ивентами должны быть другие ивенты, но не должен быть event3. С помощью массива, реализация не возможна, т.к. не хватает оперативки. Пробывал через seuenceMath('(?1)(?3)(?2)') EventName = event1, EventName = event2, EventName != event3, но результат не верный.
-
https://clickhouse.tech/docs/ru/single/#windowfunnel не подходит?Документация ClickHouse | Документация ClickHouse
ClickHouse is a fast open-source column-oriented database management system that allows generating analytical data reports in real-time using SQL queries
-
Привет всем, подскажите как убить запрос
KILL QUERY WHERE query_id =''
висит в статусе waiting -
если словарь сделан через DDL
тогда сделайте
mv /var/lib/clickhouse/metadata/your_db_name/your_dictionary_name.sql /tmp/
и стартуйте сервер
потом можете попробовать обратно словарь приаттачить
если сделан через XML
тогда посмотрите откуда у вас XML файл со словарем в /etc/clickhouse-server/ лежит и тоже в /tmp положите
а вы уверены что у вас именно словарь виноват?
а не таблица которая на него ссылается?
покажите полное сообщение об ошибке и stacktrace? -
к сожалению, clickhouse by design не убивает запросы немедленно
вместо этого выставляется флаг который периодически тред выолняющий запрос может прочитать (а может и нет) и выйти
так что ждите
для интеракивного стопа я использую
KILL QUERY ... SYNC -
ок, спасибо
-
У нас не стандартный контейнер. Мы используем наш контейнер, где ставим кликхаус из пакета. Тут ещё такой момент, что раньше такой ошибки не было, она появилась с LTS 21.3
-
вопрос как можно отключить падение. нашел dictionaries_lazy_load с какой версии он появился и если его включить при отсутствии таблицы словаря в mysql например сервер КХ не упадет? Сейчас если не так структура таблиц то сервер падает
-
объясните в чем падение заключается?
вы имеете ввиду сервер падает во время загрузки сервера или во время data reload в dictionary?
покажите ошибку и stacktrace?
поменяйте определиние словаря, так и загрузитесь... или просто словарь уберите временно чтобы сервер стартовать, как именно я вот тут показал
https://t.me/clickhouse_ru/228673
dictionalries_lazy_load такой настройки больше нет, она в 19.x былаSlach [altinity] in ClickHouse не тормозитесли словарь сделан через DDL тогда сделайте mv /var/lib/clickhouse/metadata/your_db_name/your_dictionary_name.sql /tmp/ и стартуйте сервер потом можете попробовать обратно словарь приаттачить если сделан через XML тогда посмотрите откуда у вас XML файл со словарем в /etc/clickhouse-server/ лежит и тоже в /tmp положите а вы уверены что у вас именно словарь виноват? а не таблица которая на него ссылается? покажите полное сообщение об ошибке и stacktrace?
-
сервер падает при старте если нет во внеш бд таблиц для подключения словарей.
62204d-a4c7-4164-9b56-1256e53a9826} <Error> ExternalDictionaries: Cannot create external dictionary 'test_camp' from config path /etc/clickhouse-server/test_mysql_dictionary.xml: Poco::Exception. Code: 1000, e.code() = 1146, e.displayText() = mysqlxx::BadQuery: Table 'test_l.campaign_source' doesn't exist (172.44.0.12:3306) (version 19.5.4.22 (official build)) -
-
Привет всем. Подскажите: есть таблица с engine=kafka settings kafka_flush_interval_ms = 7500 и целевая таблица с колонкой ts DateTime64 materialized now64(). Проблема в том, что ts (now64()) вычисляется один раз в начале формирования блока вставки в целевую таблицу из-за чего первая и последняя строка в блоке (как и все в блоке) имеют одинаковый ts, хотя могли быть вычитаны кликхаусом из кафки с разницей до 7.5 секунд. Как это можно побороть?
-
в новых версиях (после 21.5 где то, точно не скажу) было улучшение по поводу нестартования изза словарей, но не уверен что ваш случай покрыт. проверьте
-
-
mv -v /etc/clickhouse-server/test_mysql_dictionary.xml /tmp/
systemctl clickhouse-server start
инициализация словаря нужна для того чтобы типы данных для полей вывести
lazy_dictionary_load для 19.x у вас может сработать, но не факт -
говорю же, были фиксы, у нас были подобные проблемы когда non-backward compatible syntax поменяли
например
https://t.me/clickhouse_ru/196169
тут например чинили старт когда дефолт поля таблиц используют dictGet на незагруженных словарях
https://github.com/ClickHouse/ClickHouse/pull/19805
тут тоже можно почитать
https://github.com/ClickHouse/ClickHouse/issues/21101 -
mv не поможет если через тот же docker-compose.... Поэтому и спрашиваю есть ли ПАРАМЕТР.
-
вычисление now64 константное выражение, и никак не связано с engine kafka
это никак не побороть... -
-
Добрый день. Зависает мутация, поле latest_fail_reason пустое.
Как можно "побороть" ? -
Т.е. удаление из таблицы по 63 ключам (каждому соответствует ~1000 строк) зависает. Размер таблицы ~7.5 миллиардов строк / 190 Гб
-
других незавершенных мутаций к базе нет...
-
-
насколько я помню альтер метаданных сейчас не блокирует ничего
-
Если вдруг кто столкнётся с такой же ошибкой. Clickhouse пытается произвести удаление файлов:
write(2, "2021.07.30 10:58:52.317171 [ \33[3"..., 2142021.07.30 10:58:52.317171 [ 2937 ] {} <Debug> system.trace_log (5f1f70a0-0f80-46b5-91ea-59900b67a4f8): Removing part from filesystem 202107_1_1_0) = 214
Для этого делает tmp файлы:
rename("/srv/clickhouse/store/5f1/5f1f70a0-0f80-46b5-91ea-59900b67a4f8/202107_1_1_0", "/srv/clickhouse/store/5f1/5f1f70a0-0f80-46b5-91ea-59900b67a4f8/delete_tmp_202107_1_1_0") = -1 EXDEV (Invalid cross-device link)
Но использует при этом функцию rename. А она не работает на overlayfs2, т.к там происходит переименование сквозь слои.
А Clickhouse не должен учитывать этот момент? -
-
подскажите куда копать, сегодня отвалились on cluster запросы, как будто не может до ЗК достучаться. Просто зависает на DDLQueryStatusInputStream. При этом в system.zookeeper ходит без проблем
```
SET send_logs_level='trace';
ALTER TABLE dau_shard ON CLUSTER ch_shards DROP PARTITION 20210729
Query id: fdbfd41f-c8f7-412a-a045-cb041d7e6486
<Debug> executeQuery: (from 127.0.0.1:42300, using production parser) ALTER TABLE dau_shard ON CLUSTER ch_shards DROP PARTITION 20210729
<Trace> ContextAccess (appodeal): Access granted: ALTER DELETE ON dau_shard
<Debug> executeQuery: Query pipeline:
DDLQueryStatusInputStream
<Error> executeQuery: Code: 159, e.displayText() = DB::Exception: Watching task /clickhouse/task_queue/ddl/query-0000602234 is executing longer than distributed_ddl_task_timeout (=180) seconds. There are 12 unfinished hosts (0 of them are currently active), they are going to execute the query in background (version 21.3.13.9 (official build)) (from 127.0.0.1:42300) (in query: ALTER TABLE dau_shard ON CLUSTER ch_shards DROP PARTITION 20210729)
```
```
SELECT
name,
value,
numChildren
FROM system.zookeeper
WHERE path = '/clickhouse/task_queue/ddl/query-0000602234'
Query id: bbce3696-0eac-47f2-aa3d-cc1a5d4eb376
┌─name─────┬─value─┬─numChildren─┐
│ active │ │ 0 │
│ finished │ │ 0 │
└──────────┴───────┴─────────────┘
``` -
А вот еще вопрос, далее из этой таблицы читает матвьюшка у нее тоже UInt8 придется паралельно менять в .inner табличках тип?
-
там 145 партов надо просканировать...
parts_to_do
до них еще добраться надо
сколько у вас вообще мутаций с is_done=0 ?
смотрите SELECT * FROM system.merges FORMAT Vertical
чтобы понять начались мутации или нет -
одна мутация с is_done=0
-
он не до zookeeper не может достучаться
у вас там видимо какая то мертвая реплика есть
которая 180 секунд distributed_ddl не вычитывала
SELECT
name,
value,
numChildren
FROM system.zookeeper
WHERE path = '/clickhouse/task_queue/ddl/query-0000602234/active'
и
SELECT
name,
value,
numChildren
FROM system.zookeeper
WHERE path = '/clickhouse/task_queue/ddl/query-0000602234/finished'
посмотрите -
ага, нужно менять и там
-
https://clickhouse.tech/docs/en/operations/settings/settings/#background_pool_size
какие еще есть background задачи?Settings | ClickHouse DocumentationSettings distributed_product_mode Changes the behaviour of distributed subqueries. ClickHouse applies this setting when
-
в active/finished пусто, numChildren 0 в них. Запрос получается с шарда не отправился никуда
-
-
в system.mutations есть незавершенная мутация, а system.merges пустая
-
небольшая загрузка (на сервере 256 Гб памяти)
-
-
-
ну тут дело не в памяти. а в том есть свободные треды или нет для того чтобы muations merge выполнять
-
https://clickhouse.tech/docs/en/operations/settings/settings/#background_pool_size
background_pool_size установлено в значение 16Settings | ClickHouse DocumentationSettings distributed_product_mode Changes the behaviour of distributed subqueries. ClickHouse applies this setting when
-
Т.е. при такой ситуации (с зависающими мутациями) лучше увеличить значение background_pool_size ? В два раза примерно ?
-
В атомик базах uuid используется. Там рандомное имя.
-
а в какой ветке конфигурации устанавливается значение background_pool_size ?
в merge_tree ? -
не в profile/default
-
Настройка есть до сих пор. Как она работает написано в доке.
-
ну сначала понять есть там свободные слоты или нет
-
создали рядом тестовый кластер, там всё нормально работает
-
-
Спасибо, все прошло в лучшем виде.
-
настройки посмотрите
что нибудь типа этого
empty_result_for_aggregation_by_empty_set
или этого
aggregate_functions_null_for_empty -
да, спасибо. странно что sumIfOrNull все равно возвращает 0 в 20.8
-
-
-
Прежде чем увеличивать размер пула, надо заглянуть в system.replication_queue.
Вы же говорите, system.merges пустая, не в пуле тут дело -
Кластер из одного сервера, нет репликаций и шардов
-
Тогда в логи загляните
-
Там пол КХ на этом построено. Непонятно как это можно исправить даже в теории.
-
ух ты, это что, 1С на мониторинге кликхауза?
-
без Atomic баз проблема тоже?
-
Да, только наборот - мониторинг кликхауза из 1С 😁
-
теперь я видел всё
-
... и такое представление еще из system.query_log
-
чтобы "чемпионов отлавливать )
-
"Распахнуть"
-
офигеть. "Автообновление"
-
Спасибо за такую информацию)
-
смерть графане
-
Где такое можно посмотреть или построить?
-
Работает в К&Б, ежедневно синхронизируется с большой базой. Отчеты 1С можно по данным КХ формировать. Можно в PowerBI через ODBC или в Tabix
-
Именно про запросы и потребляемые ресурсы
-
Да тут всё просто. Запросы к таблицам КХ system.processes и system.query_log
-
Спасибо
-
-
сделать из дисков JBOD
-
Как бы вы понимаете что jbod сделанный в кх в пять раз хуже чем mdraid. По любому параметру
-
-
можно raid0 вместо jbod
-
-
-
-
Это хобби, и если не считать начальной загрузки, инкремент раз в месяц, со вставкой проблем не будет, например по времени шахматной партии можно поделить, один месяц на первый диск, второй на второй и так далее. Чем меня пугает на низком уровне, что нужно заранее решить сколько места выделить и отвести его целиком под нужды кх
-
Там половина оптимизаций селектов отломается и джойны иногда работать не будут.
-
mdraid raid5
-
Нету и планов нет на это. Весь мир движется в обратном направлении - S3 / hdfs
-
- 31 July 2021 (57 messages)
-
У меня есть папочка config.d там пусто, какой файл нужно создать? Возможно глупые вопросы задаю, но не понимаю 😐
-
Там можете создавать файлы конфига клторые перезапишут дефолтный config.xml. только то что переопределяете
-
А можете подсказать, исходя из чего назвать новый файл xml, и что в нем должно быть по минимуму?
-
-
-
Мне нужно куда-то запихать вот это
<allow_experimental_database_postgresql_replica>1</allow_experimental_database_postgresql_replica>
Но я хз куда это деть) -
-
-
-
Родительские теги это какие?)
-
-
Сделал так, но все равно ошибка DB::Exception: MaterializedPostgreSQL is an experimental database engine. Enable allow_experimental_database_postgresql_replica to use it. (UNKNOWN_DATABASE_ENGINE) (version 21.9.1.7603
-
А кто-нибудь знает сервис типа
https://airbyte.io/
Но только с возможностью репликации напрямую в clickhouse -
https://airbyte.io/ если кратко
Этот сервис предоставляет возможность репликации данных примерно из 50 разных источников
Но пункт назначения clickhouse назначить нельзя -
Можно в кафку, а кх умеет читать кафку.
-
Ну вот я сейчас пишу в postgresql, и пытаюсь потом в clickhouse забирать данные
-
рестартовали?
-
Да
-
потому что ошибка есть, а в коде он использует другое имя параметра (заведите баг плз).
-
конфиг судя по всему пишется в дефолт профиль, т.е. в папку user.d кидаете XML
вот пример
https://github.com/ClickHouse/ClickHouse/blob/8351f1db9923100e411c380a8ba3fa52b5dff4d3/tests/integration/test_postgresql_replica_database_engine/configs/users.xmlClickHouse/users.xml at 8351f1db9923100e411c380a8ba3fa52b5dff4d3 · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Спасибо огромное! Напрямую пробовал в users.xml писать, но сервер не стартовал, а в отдельном файле сработало!
-
напрямую тож работает, скорее всего синтаксис. заведите тикет чтоб ошибку исправили, а то такая подстава с ошибкой...
-
-
-
-
18 версия?
Да очень много чего, нужно сверять патч ноуты
https://docs.altinity.com/altinitystablerelease/releasenotes/Release NotesRelease Notes for Altinity Stable Releases
-
Пытаюсь разобраться почему marks_bytes много места занимает и возник вопрос - в marks хранится весь row (>100 колонок) или только primary keys (пара колонок)? У меня получается что на 4gb (sum(bytes) from parts) данных пишется 1gb marks (sum(mark_bytes) from parts). Это много или нормальная ситуация?
-
В марках хранятся засечки для всех колонок через каждые (index_granularity bytes)
-
получается если много пустых колонок которые хорошо сжимаются, то засечки будут достаточно много занимать...
-
....по сравнению с основными данными
получается единственный вариант - уменьшить кол-во колонок? -
Ну, у вас какая index_granularity?
-
8192 - не менял, сорри
-
т.е. дефолтная
-
И насколько хорошо у вас данные сжимаются?
-
точно не знаю, но засечек 1гб на 4гб данных
-
это в одной таблице с большим кол-вом колонок
в других все лучше -
2021.07.31 10:14:56.221242 [ 152 ] <Error> zretail_data_marts.sales_terminal (StorageReplicatedMergeTree, PartCheckThread): No replica has part covering 20190101_20190131_2555_2555_0 and a merge is impossible: we didn't find smaller parts with either the same min block or the same max block.
и такое постоянно, на дисках ошибок нет, зукипер у хадупа и кафки данные не теряет а у кх теряет - отчего такое может быть? -
Сколько колонок?
-
у меня просто много совсем пустых колонок на будущее - они по идее очень хорошо сжимаются
не знал что это так на mark_bytes влияет
примерно сотня колонок -
я не жалуюсь - просто пытаюсь узнать если еще варианты
-
удалить лишние колонки не такая большая проблема
-
Ждать sparse колонки
https://github.com/ClickHouse/ClickHouse/pull/22535Sparse serialization and ColumnSparse by CurtizJ · Pull Request #22535 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): New Feature Changelog entry (a user-readable short description of the cha...
-
спасибо
-
причём я такие ошибки ток для репликасет нахожу в инете
-
-
-
А строк сколько?
-
если вы про rows, то 150 милионов rows в одном парте
если про строковый колонки то примерно 60 штук LC(String), 20 Strring, еще где-то 20 Enum/Int -
в массив их запихайте и всего делов
-
так наверное с частью и поступлю
компрессия будет похуже, но что делать -
ответ - супер, двух зайцев сразу
словари LC тоже входят в размер марков, посмотрите по колонкам в system.parts_columns -
посмотрю, спасибо!
-
может и в system.columns есть, не помню
-
-
Добрый вечер, после обновления до 21.7.4.18 запрос выше вылетает по
DB::Exception: Memory limit (for query) exceeded: would use 20.57 GiB (attempt to allocate chunk of 4346967 bytes), maximum: 20.56 GiB: While executing MergeTreeThread
использовал все известные мне варианты
set join_algorithm='partial_merge';
set max_bytes_in_join=1000000;
и тп, никак не могу добиться выполнения, жрет максимальное количество памяти на сервере (в таком случае While менятеся) либо указанное в max_memory_usage, помогает только уменьшение количества полей в select.
Подскажите пожалуйста куда смотреть, заранее спасибо -
-
Можете попробовать уменьшить количество тредов. Будет меньше памяти использоваться, то дольше. set max_threads = 1.
Вообще, конечно, надо сам запрос оптимизировать.
Бросается в глаза лишнее поле:
max(sitetype_id) AS sitetype_id
+ первую таблицу я бы в виде подзапроса сделал и там where.