- 01 December 2019 (3 messages)
-
Joined.
-
-
Joined.
- 02 December 2019 (103 messages)
-
Joined.
-
-
-
добрый день. столкнулся с проблемой
(version 19.15.3.6 (official build)) (from thread 47) Received signal Segmentation fault (11).
2019.12.02 08:03:40.646387 [ 48 ] {} <Fatal> BaseDaemon: Address: NULL pointer. Access: read. Address not mapped to object.
2019.12.02 08:03:40.646512 [ 48 ] {} <Fatal> BaseDaemon: 3. 0x55575e9ae116 DB::Block::bytes() const /usr/bin/clickhouse
2019.12.02 08:03:40.646554 [ 48 ] {} <Fatal> BaseDaemon: 4. 0x55575ea13106 DB::BlockStreamProfileInfo::update(DB::Block&) /usr/bin/clickhouse
2019.12.02 08:03:40.646585 [ 48 ] {} <Fatal> BaseDaemon: 5. 0x55575ea19e83 DB::IBlockInputStream::read() /usr/bin/clickhouse
2019.12.02 08:03:40.646615 [ 48 ] {} <Fatal> BaseDaemon: 6. 0x55575b8e87ed DB::TCPHandler::receiveData() /usr/bin/clickhouse
2019.12.02 08:03:40.646642 [ 48 ] {} <Fatal> BaseDaemon: 7. 0x55575b8e92eb DB::TCPHandler::receivePacket() /usr/bin/clickhouse
2019.12.02 08:03:40.646674 [ 48 ] {} <Fatal> BaseDaemon: 8. 0x55575b8e942e DB::TCPHandler::readDataNext(unsigned long const&, int const&) /usr/bin/clickhouse
2019.12.02 08:03:40.646728 [ 48 ] {} <Fatal> BaseDaemon: 9. 0x55575b8e99be DB::TCPHandler::readData(DB::Settings const&) /usr/bin/clickhouse
2019.12.02 08:03:40.646754 [ 48 ] {} <Fatal> BaseDaemon: 10. 0x55575b8e9c31 DB::TCPHandler::processInsertQuery(DB::Settings const&) /usr/bin/clickhouse
2019.12.02 08:03:40.646780 [ 48 ] {} <Fatal> BaseDaemon: 11. 0x55575b8eb26d DB::TCPHandler::runImpl() /usr/bin/clickhouse
2019.12.02 08:03:40.646806 [ 48 ] {} <Fatal> BaseDaemon: 12. 0x55575b8eb4fb DB::TCPHandler::run() /usr/bin/clickhouse
2019.12.02 08:03:40.646834 [ 48 ] {} <Fatal> BaseDaemon: 13. 0x55575f71f3c0 Poco::Net::TCPServerConnection::start() /usr/bin/clickhouse
2019.12.02 08:03:40.646860 [ 48 ] {} <Fatal> BaseDaemon: 14. 0x55575f71fadd Poco::Net::TCPServerDispatcher::run() /usr/bin/clickhouse
2019.12.02 08:03:40.646889 [ 48 ] {} <Fatal> BaseDaemon: 15. 0x555760da9901 Poco::PooledThread::run() /usr/bin/clickhouse
2019.12.02 08:03:40.646916 [ 48 ] {} <Fatal> BaseDaemon: 16. 0x555760da76ac Poco::ThreadImpl::runnableEntry(void*) /usr/bin/clickhouse
2019.12.02 08:03:40.646942 [ 48 ] {} <Fatal> BaseDaemon: 17. 0x55576151ceb0 ? /usr/bin/clickhouse
2019.12.02 08:03:40.646980 [ 48 ] {} <Fatal> BaseDaemon: 18. 0x7f28ef0b06db start_thread /lib/x86_64-linux-gnu/libpthread-2.27.so
2019.12.02 08:03:40.647017 [ 48 ] {} <Fatal> BaseDaemon: 19. 0x7f28ee9cd88f clone /lib/x86_64-linux-gnu/libc-2.27.so
гугление не помогло - пишут дескать в моей версии этот баг уже устранён, ан нет, я с ним таки столкнулся. можете подсказать как мне решить мою проблему? -
-
-
-
Это баг и скорее всего уже пофикшен https://github.com/ClickHouse/ClickHouse/pull/7685Forbidden to use column name more than once in insert query. by alesapin · Pull Request #7685 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Bug Fix Changelog entry (up to few sentences, not needed for non-signific...
-
-
-
-
-
Joined.
-
-
-
может потому что 15730567168 больше 32 бит?
-
-
-
-
-
спасибо, помогло
-
Какоово положение дел по with (with <tablename> as (<subquery>) ...) в clickhouse? Мне казалось я где-то видел упоминание
-
а возможно ли как то сторить очередь кафки в сыром виде без построения агрегированных страниц ?
-
В версии 19.17.4.11 сломали условия на строковые поля или я что-то делаю не так?
Получаю ошибку: DB::Exception: Method createColumn() is not implemented for data type Set (version 19.17.4.11 (official build))
Ни строковые функции не прямое сравнение не отрабатывает в секции WHERE -
Так напишите MAT VIEW без выражений агрегации и сторите куда хотите
-
-
Скорее всего при загрузке словаря в КХ, вы не сможете по ключу получить два и более ответа. Т.е. в словаре дубли по ключу есть, а в КХ - не будет
-
Joined.
-
ку куб а можно ли как то транспонировать двойной массив или хотя бы взять и-тый елемент массива?
-
-
можете пример показать
-
Как-то так https://pastebin.com/gKfciiy1CREATE TABLE kafka ( data String,) ENGINE = Kafka;CREATE TABLE data_from_k - Pastebin.com
Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
-
всем привет
подскажите пожалуйста
с чем может быть связано такая ошибка?
Cannot enqueue replicated DDL query for a replicated shard
такое выдают реплки время от времени -
круто, спасибо большое
-
2019.11.29 02:29:13.567212 [ 173 ] {98e13427-775e-4622-a13b-a4c682f04974} <Error> executeQuery: Code: 48, e.displayText() = DB::Exception: There was an error on [clickhouse-node1:9000]: Cannot enqueue replicated DDL query for a replicated shard (version 19.6.2.11 (official build)) (from 192.197.12.1:49911) (in query: ALTER TABLE test.cpm_statistics_page_time_13 ON CLUSTER test DELETE WHERE (widget_goods, geo_group, device, page, day_type, time_id) IN (SELECT widget_goods, geo_group, device, page, day_type, time_id FROM test.cpm_statistics_page_time_13 GROUP BY widget_goods, geo_group, device, page, day_type, time_id HAVING maxMerge(updated_time) < (now() - (((3 * 24) * 60) * 60))) ), Stack trace:
-
вплоть до того что оом киллер потом просто прибивает кх на всех репликах)
-
Добрый день, проблема со словарями, при добавление внешнего словаря он не отобразился в system.dictionaries, при попытке его обновить ручками "system reload dictionary dict_name" запрос зависает, и кильнуть запрос не получается "kill query where query_id = '1234'", есть варианты починить это, не перезапуская кх?
-
Попадал на такую ситуацию, помогал только restart
-
Пытался оставить пустой тэг <dictionaries>, после удалил, но не помогло
-
Не очень понятно, почему проблема одного словаря, может сломать весь механизм
-
Предполагаю, что проблема возникла, после добавления неудачного словаря, который я починил, но после все сломалось
-
А какая версия КХ?
-
19.9.2.4
-
Select version()
-
-
Хочется, но это не просто и не быстро)
-
А проблему, хотелось решить сейчас
-
Попробую, воспроизвести такую ситуацию на локальной машине с новой версией, посмотрим, что получиться
-
-
SELECT 'all', 'all', 'all', count(1) FROM event_photo_upload LEFT JOIN event_delete_photo ON event_delete_photo.photoId=event_photo_upload.photoId WHERE placeId IN('bljtd77heqe9e0tuu68x') AND toString(event_delete_photo.photoId)==''
вот такой запрос вызывает реакцию DB::Exception: Method createColumn() is not implemented for data type Set. при чём тут Set и как переписать запрос, чтобы он работал? версия 19.17.4.11 -
У вас точно в запросе написан "=="? В КХ такого нет
-
Есть) Проблема похожа на https://github.com/ClickHouse/ClickHouse/issues/7799.19.17 Method createColumn() is not implemented for data type Set. · Issue #7799 · ClickHouse/ClickHouse
The test case: ClickHouse client version 19.17.2.4 (official build). Connecting to localhost:9000 as user default. Connected to ClickHouse server version 19.17.2 revision 54428. :) select count() F...
-
-
Сегодня потратил на это полдня, решил путем подзапроса с WHERE, а затем JOIN
-
Есть задача создать отказоустойчивый кластер с КХ и Зукипером. Есть у кого опыт, кластеризации между разными ДЦ и хостерами ?
-
зависит от нагрузки
1. ноды зукипера в одном дацентре. В крайнем случае в датацентрах с летенси <50мс С ОЧЕНЬ надежной сетью между.
2. писать в реплики КХ которые близко к Зукиперу (летенси <100мс), другим репликам запретить становится лидерами таблиц. -
а ноды зукипера разносить в разные хостеры ? летенси имеет значение ?
-
использует ли clickhouse партиции для оптимизации запросов?
-
-
см 1
-
да
-
да
-
partitioning is not intended to speed up SELECT queries (ORDER BY key is sufficient to make range queries fast). Partitions are intended for data manipulation (DROP PARTITION, etc).
-
>partitioning is not intended to speed up SELECT queries
тут имеется в виду что speed up самый минорый фактор для выбора стратегии партиционирования, и только для тех кто понимает как на самом деле работает insert -
-
-
Привет всем. Кто то сталкивался с тем что запрос с мат вью и аналогичный запрос из исходной таблицы возвращает отличающееся друг от друга цифры? Есть идея что это связано с каким то мержем. Мат вью был создан давно без POPULATE. Такой же вью созданный параллельно возвращает правильные данные
-
всавка в MV и таблицу неатомарны, нужно постоянно следить за ошибками инсертов и чинить руками
-
то есть может получится что вставка в таблицу прошла а MV нет. Так ?
-
да, у меня такая фигня бывает раз в неделю, отвал зукипера, отвал сети между КХ и заливалкой и т.д.. Я чиню MV вручную, довствляя кусок который не вставился в MV.
-
Что такое "вью созданный параллельно"?
-
-
да, приблизительно
-
а как вставить недостающую? также как в обычную таблицу?
-
да
-
-
И ретрай insert-а не помогает. При ретрае проверяется что блок в таблице уже есть и вставка пропускается и в таблицу и в MV.
-
Joined.
-
Ребят а что случилось с WHERE 1 = 1 ?
-
Почему перестало это работать?
-
А версия какая?
-
19.14.6.12
-
where 1 тоже не работает?
-
День добрый. Проблема с odbc. 19.15.3.6
select *
from odbc('DSN=host;UID=user-name;PWD=password;', 'public', 'table') AS t
выдаёт
FATAL: password authentication failed for user "{user-name}"
проверил на стороне postgres дейтсивтельно приходит
{user-name}
. Как можно заэкранировать -? -
может прокатит UID="user-name";
но проще сделать пользователя без -, и пароль без @ и $ -
DB::Exception: ODBC connection string parameter value is unescaped and contains illegal character
не помогло -
значит никак
-
всем привет!
обновили одну из реплик шарда
19.6.2.11 до 19.17.4.11 -
на реплике с версией 19.6.2.11
2019.12.02 08:53:01.890495 [ 15 ] {} <Error> stats.reach_meter_data_1558962677 (StorageReplicatedMergeTree): Code: 40, e.displayText() = DB::Exception: Checksums of parts don't match: hash of uncompressed files doesn't match (version 19.6.2.11 (official build)). Data after merge is not byte-identical to data on another replicas. There could be several reasons: 1. Using newer version of compression library after server update. 2. Using another compression method. 3. Non-deterministic compression algorithm (highly unlikely). 4. Non-deterministic merge algorithm due to logical error in code. 5. Data corruption in memory due to bug in code. 6. Data corruption in memory due to hardware issue. 7. Manual modification of source data after server startup. 8. Manual modification of checksums stored in ZooKeeper. We will download merged part from replica to force byte-identical result. -
в 19.7 поменялся lz4
-
надо на всех репликах сделать либо <19.7 либо >19.7
-
либо не использовать lz4
-
@den_crane спасибо !
-
откатил, реплика завелась и ошибки на других репликах прекратились
-
а есть orm для явы, поддерживающий clickhouse ?
-
слава богу, нету.
-
должно хватить базового encode URI. Например в javascript - encodeURIComponent(). Полученные логин/пароль после должны проходить валидацию
-
Joined.
-
-
Joined.
-
-
Joined.
-
- 03 December 2019 (163 messages)
-
-
Спамеров привалило///
-
Привет 🖖 Подойдёт ли КликХаус для хранения данных временных рядов ?
-
Да, подойдет
-
Joined.
-
день добрый подскажите как правильно настроить config файл кликзауса?
-
Стоит начать с документации, а если будет не понятно что-то конкретное, задать вопрос
-
-
отсюда?
-
-
Добрый день! Какой setting ограничивает объем выгрузки из таблицы CH в текстовый файл (CSV,JSON)?
-
?
-
Лучше все просмотреть
-
Что понадобится зависит от вашей задачи
-
Конфиг по умолчанию без измененией уже позволяет начать работать
-
-
что делать если селект вываливается с ошибкой, что не хватате памяти?
-
добавить память или лимитировать в конфиге
-
Памяти добавить или объем выборки уменьшить
-
да вот не могу понять где ее добавить?
-
Если запускать через клиент, то можно так clickhouse-client --max_memory_usage 50000000000 использовать
-
max_memory_usage находииться в cd /etc/clickhouse-server/config.xml
? -
в сервер
-
сюда?
max_memory_usage находииться в cd /etc/clickhouse-server/config.xml -
Добрый день. У меня есть такая проблема. Пул серверов шлет инсерты в КХ, примерно так:
клиент 1 - INSERT INTO table3 (c1, c2, c3) VALUES ('v1', 'v2', 'v3')
клиент 2 - INSERT INTO table3 (c1, c2, c3) VALUES ('v4', 'v5', 'v6')
..
Ему тяжеловато от этого. Я хочу их тупо запайплайнить, и слать пакет одним запросом, вот так:
прокси1 - INSERT INTO table3 (c1, c2, c3) VALUES ('v1', 'v2', 'v3')\r\nINSERT INTO table3 (c1, c2, c3) VALUES ('v4', 'v5', 'v6')
И отправлять одним запросом раз в секунду - накопленное количество.
- поддерживает ли парсер КХ вот такой вот, или какой то другой пайплайнинг?
- поможет ли это КХ зажить весело и счастливо, или мне надо всенепременно упарываться парсером, переформатировать и слать вот так: INSERT INTO table3 (c1, c2, c3) VALUES ('v1', 'v2', 'v3')('v4', 'v5', 'v6') ?
Заранее спасибо! -
где поправить этот параметр не могу понять max_memory_usage
-
в каком файле?
-
Memory buffer не поможет?
-
нет
-
-
Вообще поддерживает
-
max_memory_usage какое оптимальное значение для сервера 64 гб ОЗУ?
-
55 гигов хватит?
-
сейчас 37
-
повлияет ли это на что то?
-
попробуйте clickhouse-bulk
-
GitHub - nikepan/clickhouse-bulk: Collects many small inserts to ClickHouse and send in big inserts
Collects many small inserts to ClickHouse and send in big inserts - GitHub - nikepan/clickhouse-bulk: Collects many small inserts to ClickHouse and send in big inserts
-
а какая настройка отвечат за количество ядер что может юзать кликхаус?
-
Попробовал. 16.987g в свопе после вставки 100к, 18, после вставки следующих 100к.
-
why?
-
я предполагаю что вот этот запрос: INSERT INTO table3 (c1, c2, c3) VALUES ('v1', 'v2', 'v3')
Внутри - превращается вот в такой пул запросов:
с1 -> v1
с2 -> v2
Тк КХ - колоночная субд => нет никакого смысла приводить запросы к виду:
INSERT INTO table3 (c1, c2, c3) VALUES ('v1', 'v2', 'v3')('v4', 'v5', 'v6')
Так как все равно распарсится на примитивы. Но.
Всё зависит от реализации записи. Если они делают так:
file.write(с1, v1)
file.fsync()
То будет тормозить. А если делают fsync по таймеру, раз в секунду, например - то тормозить не будет. Обычно - красавчики делают fsync по таймеру - или отдают это ОС. Но если они не красавчики, то нужно запилить парсер и слать одним запросом( -
-
Добрый день. Столкнулся с проблемой при установке clickhouse-client на Mac OS. Утанавливаю как здесь написано: (https://github.com/arduanov/homebrew-clickhouse)
Во время установки выдает варнинг, но устанавливается. А при попытке запустить clickhouse-client падает ошибка. Кто-то сталкивался с подобным? -
Joined.
-
Moscow Data Meetups
ПОДРОБНЕЕ О СПИКЕРАХ И ДОКЛАДАХ: Павел Денисенко, главный архитектор данных X5 Retail Group, занимался проектированием логической архитектуры аналитических платформ, моделей и потоков данных. За его плечами проекты построения DWH в МегаФоне, М.Видео, Tinkoff, Икано Банке, X5 Retail Group. На нашем митапе Павел выступит с докладом «Адаптация методологии DataVault 2.0 для задачи построения Enterprise Data Warehouse в X5». Ключевые моменты: - как выглядит целевая логическая архитектура EDW; - какую роль в EDW играет #DataVault 2.0; - опыт применения DV2: вопросы/ решения, не описанные в книжках; - автоматизация разработки DV2; - открытые вопросы. ----------------- Сфера деятельности Алексея Рябова, архитектора DWH в Tinkoff, включает репликацию данных из операционных источников в несколько кластеров Greenplum, синхронизацию данных между несколькими кластерами Greenplum и другие инфраструктурные проекты DWH. Его доклад «Проект DUET: синхронизация данных между несколькими кластерами Greenpum. Опыт в Tinkoff»…
-
какой параметр в конфиг файле отвечаете за CPU?
-
сколько ядер юзать и дт
-
а что теперь есть вторичные индексы https://clickhouse.yandex/docs/ru/query_language/alter/#manipuliatsii-s-indeksami ?
-
да, с какой-то версии
https://clickhouse.yandex/docs/ru/operations/table_engines/mergetree/#table_engine-mergetree-data_skipping-indexes -
интересно, спасибо
-
-
-
-
ADD COLUMN [IF NOT EXISTS] name [type] [default_expr] [AFTER name_after]
Добавляет в таблицу новый столбец с именем name, типом type и выражением для умолчания default_expr (смотрите раздел Значения по умолчанию). -
Можно задать значение по умолчанию
-
-
Вроде бы нет
-
-
А можно задать значение по умолчанию в виде выражения сразу? Оно хранится как выражение или пересчитается физически?
-
Значение по умолчанию высчитается при SELECT-е
-
Класс, спасибо
-
всем привет!
а есть в кх настройка чтоб он сначала загрузил словари а потом уже таблицы при старте -
?
-
Joined.
-
Коллеги добрый день. Подскажите пожалуйста как такое возможно
-
-
таблица создана при помощи запроса
-
CREATE TABLE i_general_cancellation_date
(
id UUID,
general_cancellation_date Date
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(general_cancellation_date)
PRIMARY KEY id
ORDER BY (id); -
Баг в dataGrip
-
-
Понял. Спасибо. Да в доке вижу подпись о 0000-00-00
-
👍
-
Коллеги, доброго времени, подскажите пожалуйста, версия кх 1.1.54380 , можно ли как-то адекватно удалить из таблы записи с фильрацией по условию?
-
такой вопрос, есть таблица, в которой около 10 мил. записей, но часть этих записей - не валидны, (разные id при идентичных значениях) как можно перенести только валидные данные в другую таблицу, что бы потом ее уже использовать как основную, при условии, что все валидные id имеются?
-
Только перелить нужные данные в новую таблицу, а старую удалить
-
спасибо!
-
Переливаете нужные данные в новую таблицу, а старую таблицу удаляете. Затем работаете с новой таблицей
-
я изначально в вопросе указал, что "можно перенести только валидные данные в другую таблицу, что бы потом ее уже использовать как основную", осталось решить - как это сделать лучше, в этом и вопрос.
-
Insert From Select
-
-
Есть несколько вариантов, смотря чем определяется валидность данных:
OPTIMIZE DEDUPLICATE (есди PRIMARY KEY это id за исключением ключей партиции)
INSERT SELECT + GROUP BY id
INSERT SELECT + LIMIT 1 BY id
ALTER TABLE DELETE WHERE -
валидность тут скорее условная, дело в том, что данные в CH льются из postgresql, но оказалось, что часть данных на постгрес - была физически удалена, и те id что есть в постгрес - валидны, а то, что успело залиться в CH - становится не валидным из за дублирования данных под разными id
надеюсь понятно описал
что делаю сейчас - выгружаю csv с id из постгрес, подключаю файлик как внешние данные и буду заливать в новую таблицу данные по insert into new_table select * from old_table where id in (csv_file)
если есть способ лучше и быстрее - поделитесь -
всем привет!
а есть в кх настройка чтоб он сначала загрузил словари а потом уже таблицы при старте кх сервера?
к чему такой вопрос
у нас есть несколько таблиц поля которых заполняются из мускул словарей
до обновления с 19.6.2.11 до 19.17.4.11 всё было нормально, с таким не сталкивались
сейчас же при старте кх сервера получаю ошибку и в цикле кх перезапускается
error: DB::Exception: No such external dictionary 'g_blocks'., stack trace:
0. 0x559a8a58af60 StackTrace::StackTrace() /usr/bin/clickhouse
пример такого поля
widget_goods_parent UInt32 DEFAULT toUInt32(dictGetInt32OrDefault('tickers_composite_widgets', 'uid', toUInt64(dictGetUInt32OrDefault('tickers_composite_relations', 'parent_tickers_composite_id', toUInt64(dictGetUInt32OrDefault('g_blocks', 'tickers_composite_id', toUInt64(widget_goods), toUInt32(0))), toUInt32(0))), toInt32(0))),
2019.12.03 14:57:29.820554 [ 1 ] {} <Error> Application: DB::Exception: Cannot create object 'widget_clicks_goods' from query ATTACH TABLE widget_clicks_goods
вываливает всю структуру
error: DB::Exception: No such external dictionary 'g_blocks'., stack trace: -
Joined.
-
когда откатываю на 19.6.2.11 всё загружается
-
Есть параметр что-то там Dictionary lazy load ?
Вообще словарь должен загрузится как и раньше. Сделайте тикет с полным логом в виде файла, чтобы было видно три попытки загрухки словаря. -
Не совсем понял ситуацию, так как, если делать так id IN(), то туда могут попасть одинаковые id, если они есть в файле.
-
в файле будут уникальные id из PG ибо там это primary Key
-
-
Это понятно. Но если в PG есть id = 1
А в CH есть id = 1, который повторяется 2 раза
То строки с id = 1 так же повторно скопируются, если написать id IN(1)
Возможно я не так понял -
пробовал менять параметр lazy load
к сожелению не помогло
до загрузки словарей не успевает дойти -
Большинство настроек на лету применяется
-
Налету обновляется большинство натсроек, но не все
Сразу после измненеия проверьте значение настройки так
>SELECT * FROM system.settings WHERE name = 'имя настройки' -
понял, спасибо! речь о доступе с не только локалхоста
-
Надо рестартовать. В config.xml только словари и описание кластера без перезагрузки
-
благодарю
-
все верно, но это подходит под условия моей проблемы.
что бы понимать лучше опишу ситуацию чуть подробнее
у нас тут один... гм... не очень хороший человек, написал функционал, который для исправления одной ошибки, физически удаляет данные в PG и пересоздает запись, под новым ID (он уже знает что так делать не надо, и функционал, который он делал - исправлен, но вот данные остались и с ними нужно что-то делать)
в это время, на другом серваке, кафка, каждые 2 минуты, вытягивает данные из PG и поливает ими CH, как следствие в CH есть данные и по удаленным записям, и по пересозданным
в итоге каунт с одними и теми же условиями, выдает разницу в несколько сот тысяч записей, которые нужно как-то ликвидировать на CH -
Добрый день! Пожалуйста, подскажите с одним вопросом.
Есть запрос таково вида:
SELECT id, A.count
FROM table
WHERE id IN( SELECT 1 FROM A)
Таблица А - вычисляемая таблица, время вычиление неколько секунд (от 1 до 60).
id - первичный ключ, просто перенести A в JOIN, убрав WHERE не получится
Текущее решение:
SELECT id, A.count
FROM table
JOIN A
WHERE id IN( SELECT 1 FROM A)
Данное решение увеличивает время запроса в 2 раза. Хочется этого избежать. -
Для миллиона строк решение вполне вменяемое
-
select * from a any inner join table using(id), тогда правда у вас вся таблица будет в память вычитываться, если она очень большая то это решение не подойдет
-
хм, topK возвращает только 10 результатов
-
Joined.
-
А как посмотреть в кх очередь заданий ddl ?
-
А в кх не появилась возможность добавлять колонки в distibuted таблицу ? или чтобы она автоматом подхватывала если изменились колонки в таблице на которую она смотрит
-
ALTER возможен на distributed, а так проще же пересоздать?
-
-
-
Joined.
-
Всем привет, подскажите, кто-то смог решить эту задачу через runningAccumulate или надо использовать массивы + arrayCumSum?
-
Привет. Мы увеличили размер чанка, однако, это помогло лишь в уменьшении производительности. groupArray -> arrayCumSum
решило все проблемы. -
-
-
пересоздание подразумевает удаление таблицы то есть какой то простой а это не айс
-
-
всем привет, видел тут уже кто-то боролся с ошибкой
DB::Exception: Too many parts (316). Merges are processing significantly slower than inserts..
и у них был доступ к CH серверу, а у меня нет доступа, что можно сделать, без доступа к серверу? заливаю файлы так
cat $file | clickhouse-client --host $host --user $user --password=$password --query="INSERT INTO table.daily(\
EventDate,EventTime,Name,Node,Country,Url,Delay,Code,Error,Price,Cur,Img,ImgRich,Title,Winner,Domain\
) FORMAT TabSeparated"
в файлах примерно 50к-70к строк, новые файлы появляются каждую минуту -
что такое SELECT 1 FROM A
SELECT id, A.count
FROM table
JOIN A
WHERE id IN( SELECT 1 FROM A) -
Если нет возможности обеспечить период обслуживания, то да alter на distributed
-
Раньше альтера не было на дистрибьютед, завтра проверю
-
Не знаю насколько стара ваша версия, но с 18.14 есть
-
Как то можно в arraymap передать countif?
-
Спасибо, недавно обновился до последней
-
Важно в первую очередь как часто вы делаете инсерт, во сколько одновременно партиций.
На каждую партицию каждой вставки создается парт. У вас их много генерится и кх не успевает мерджить. -
всегда был alter на дистрибьютед, с самой первой версии
-
И можно было добавить колонку разве? У меня в памяти сидит мысль что я читал документацию и там было только пересоздание для дистрибьютед для добавления колонки
-
можно было
-
у countIf один аргумент
-
insert делается примерно раз в минуту на каждый файл с 70к строк
-
Ключ партиционирования в таблице какой? Может инсерт один на файл, но при этом там ключ партиционирования по странам и вставка порождает инсерт * число стран.
-
Ты путаешь.
-
-
-
таблица была создана так
CREATE TABLE table.daily ( EventDate Date, EventTime DateTime, Name String, Node String, Country String, Url String, Delay Int32, Code Int32, Error String, Price Float64, Cur String, Img String, ImgRich String, Title String, Winner Int8, Domain String) ENGINE = Distributed('cluster', buffer, daily, rand())
я глянул SELECT partition, name, table FROM system.parts WHERE active
┌─partition─┬─name────────────────────────┬─table────────────┐
| 20191203 │ 20191203_21864_21892_2 │ daily │
│ 20191203 │ 20191203_21893_21899_1 │ daily │
│ 20191203 │ 20191203_21900_21907_1 │ daily │ -
ясно, ну да фигню какую-то пытаетесь сделать
-
arraySum(i-> i > 10), или arrayFilter
-
А ну да точно
-
Спасибо
-
и да вы угадали в файлах используются страны, примерный формат файлов такой
2019-12-03 1575390441 adport USA 129969 204 noWinner 0 0 new-chart-5594c6898b-8dnk4
2019-12-03 1575390441 epom BGR 3413397 204 noWinner 0 0 new-chart-5594c6898b-8dnk4
2019-12-03 1575390441 porate LBN 13598922 204 noWinner 0 0 dnew-chart-5594c6898b-8dnk4 -
Привет! Во-первых, спасибо разработчикам ClickHouse, действительно клевая база данных. Есть несколько вопросов.
Дано:
* Одна нода - сервер на DO 16 CPU, 32 GB RAM, attached volume на 3 ТБ
* Таблица 5 млрд записей
CREATE TABLE impression.impression (
`date` Date,
`timestamp` DateTime,
`unique_id` UUID,
`client` String,
`campaign` String,
`publisher` String,
`application` String,
`click_id` String,
`os_name` String,
`os_version` String,
`pclick` String,
`idfa` String,
`gaid` String,
`ip_address` String,
`country_code` FixedString(2),
`city` String,
`isp` String,
`latitude` Float64,
`longitude` Float64,
`referrer` String,
`user_agent` String
) ENGINE = MergeTree(date, unique_id, 8192)
* Запись в таблицу производится с нескольких серверов батчами по 10к записей
1. Первоначально требовалось быстро искать по полю unique_id. Поэтому именно это поле я и выбрал как первичный ключ. Позже появилось требование искать еще по полю click_id. Пытался разметить таблицу следующим образом: ENGINE MergeTree() PARTITION BY date ORDER BY (date, unique_id, click_id) SETTINGS index_granularity=8192. Но это не помогло. Подскажите, какой первичный ключ (ключ сортировки) надо было выбрать? Или CH для этого класса задач не подходит? Вообще стоило ли добавлять date в начало ключа сортировки?
2. Второй класс задач - группировки (GROUP BY) по различным полям (дата, client, campaign, publisher, ...) с фильтрацией (WHERE по выбранным client, campaign, publisher) за определенный период времени. Что наилучшим образом повлияет на ускорение запросов? MatView, репликация, шардирование, иной Primary Key?
3. Планирую переход с одной ноды на кластер. Сейчас в таблицу записывается 200 млн/сутки, в перспективе будет 1 млрд/сутки. Порекомендуйте, пожалуйста, конфигурацию кластера и характеристики серверов. -
PARTITION BY date ORDER BY (date,
date в ORDER BY смысла не имеет, там всегда одно значение, из-за PARTITION BY date
1. Если действительно хочется быстро искать (это вообще неправильный вопрос для OLAP), делайте две таблицы одна ORDER BY unique_id вторая ORDER BY click_id и все храните два раза. Но проблема в вашем неправильном желании. Скоро появится zorder индекс который несколько облегчит.
2. фильтровать через таблицу отсортированную по creative_id, который вычисляется из client, campaign, publisher
3. 700 серверов, в каждом по 600ГБ озу -
сделайте POC из двух шардов, да померяйте, кто знает как у вас данные сожмутся и запросы может данные за 6 лет будут считать.
-
-
речь про запись добавленных алтером column default на диск?
-
-
-
а сразу нельзя было это сказать? дедушка партизан?
-
сорян )
-
Joined.
-
Joined.
-
-
Joined.
-
Спасибо за ответы! Вы могли бы детальнее раскрыть пункт 2?
-
client, campaign, publisher это ведь атрибуты баннера не правда ли?
-
Да
-
ну вот показали баннер желтые труселя, даже если он персонализирован, и там написано special for you Denny, все равно у этого баннера есть id, где он у вас в таблице?
-
не конкретный баннер, а сам криэтив
-
В таблице логгируются не показы баннеров, а клики по ним. ID клика - поле click_id. creative тоже есть, но колонка разряженная. Пример
click-house 🙂 select unique_id, creative from impression where date = today() limit 10
SELECT
unique_id,
creative
FROM impression
WHERE date = today()
LIMIT 10
┌────────────────────────────unique_id─┬─creative─────┐
│ 81f2e18c-2a9e-400a-8000-0081eea700b8 │ │
│ 8a517785-ce97-44a7-8000-00b993a65257 │ │
│ 31cf4466-0d5e-43dc-8000-00f6e8cc7371 │ │
│ fbc5ac3a-1416-42c9-8000-0127fd6b4dff │ │
│ 8a73b52d-542d-4462-8000-0235cd57a4ff │ │
│ bc890a0a-5714-4a26-8000-028069868516 │ │
│ a4a118e3-aec7-4ad8-8000-02b55370430d │ │
│ 9c3b902a-5c60-4889-8000-035738884b05 │ │
│ a25d62d3-c40c-4044-8000-03bd12a6862f │ │
│ aac63a8c-21b2-4b4b-8000-03be453a9538 │ listen - ios │
└──────────────────────────────────────┴──────────────┘
10 rows in set. Elapsed: 0.166 sec. Processed 90.11 thousand rows, 1.54 MB (543.72 thousand rows/s., 9.29 MB/s.) -
* поле unique_id
-
все это не то, видимо разговор слепого с глухим
-
Ну, ладно. Все равно спасибо!
-
Подскажите, delta encoding можно применить к полю timestamp? LowCardinality был бы эффективен для поля user_agent, как я понял из вебинара Secrets of ClickHouse Query Performance by Altinity Ltd...
-
тут пишут про бОльшее количество
-
-
>Подскажите, delta encoding можно применить к полю timestamp?
да, помогает, если отсортировано по timestamp
>LowCardinality был бы эффективен для поля user_agent,
да - 04 December 2019 (152 messages)
-
Joined.
-
Joined.
-
-
У меня есть таблица
user_id
order_id
price
status
dt - datetime
к ней наджойнина таблица с пользователями
users_table.reg_dt - дата регистрации пользователя
Я хочу получить для каждого пользователя арреи в котором будет сумма price для каждой его нумерованной недели с момента регистрации
Пока единсвенный рабочий вариант у меня это явно перечислить все недели:
WITH (SELECT groupArray(number) FROM numbers(1, 52)) as week_n
SELECT
users_table.user_id
, array(sumIf(table.price,
table.status = 1 AND
toRelativeWeekNum(table.dt) - toRelativeWeekNum(users_table.reg_dt) = 1),
sumIf(table.price,
table.status = 1 AND
toRelativeWeekNum(table.dt) - toRelativeWeekNum(users_table.reg_dt) = 2),
sumIf(table.price,
table.status = 1 AND
toRelativeWeekNum(table.dt) - toRelativeWeekNum(users_table.reg_dt) = 3),
~~~~~~~~~
sumIf(table.price,
table.status = 1 AND
toRelativeWeekNum(table.dt) - toRelativeWeekNum(users_table.reg_dt) = 52)
) AS array_prices
GROUP BY users_table.user_id
Пробовал:
1) запускаеться но дублирует значение первой недели на все
, arrayJoin(weeks) as week_n
, array(sumIf(table.price,
table.status = 1 AND
(toRelativeWeekNum(table.dt) - toRelativeWeekNum(users_table.reg_dt)) = week_n)) AS array_prices
2) не запускаеться
, arraySum(tupl -> (
tupleElement(tupl, 3)
)
, array(
tuple( groupArray(table.price)
, week_n
, groupArray(toRelativeWeekNum(table.dt) - toRelativeWeekNum(users_table.reg_dt))
, groupArray(table.status)
)
)
) as test
Вопрос:
Таких полей кроме price достаточно много и явно не правильно всех из перечилслять так, хочеться понять как можно считать это не хардкодя -
Joined.
-
-
Привет, как узнать что выполняет ClickHouse в данный момент?
Хочу отследить причину нагрузки -
-
-
Привет! А можно ли при запросе к КХ посмотреть сколько данных он вытянул с шардов на мержущую машину, чтобы чутка оптимизировать группировки если надо?
-
Можно добавить hostName() в ключ группировки и включить настройку distributed_group_by_no_merge
-
хм, спасибо, попробую
-
Это условный запрос, там столбцы с агрегацией
-
-
господа, приветствую
есть проблема с наливкой копии продакшн-базы из бэкапа
используется этот спосок https://clickhouse.yandex/docs/ru/operations/backup/#manipuliatsii-s-partitsiiami
проблема в том, что там отсутствуют таблицы с Engine=Log и их нет в бэкапе
подскажите, пожалуйста, можно ли, используя этот способ, получить бэкап и лог таблиц тоже? -
-
-
Вставлять в replacingmergetree
-
Мы сейчас занимаемся приоритезацией задач по дальнейшему улучшению документации ClickHouse и чтобы сделать это правильно, нам нужна обратная связь от вас. Если готовы помочь нам, заполните, пожалуйста, вот эту небольшую форму: https://forms.yandex.ru/surveys/10014882
Тем временем, следующий ClickHouse митап в Москве состоится уже через неделю, 11 декабря: https://yandex.ru/promo/clickhouse/moscow-december-2019
Количество мест ограничено, так что стоит поспешить записаться, но live трансляцию тоже собираемся делать. -
None
-
Подскажите, как узнать виртуальные столбцы таблицы? Есть ли у ReplacingMergeTree возможность получить версию?
-
почитал, сомнительный вариант
никто не знает, когда обновление произойдет
есть варианты прямо в INSERT условие вставить?
в гугле есть варианты, но поддерживаются ли они CH? -
select database,table,columns_version from system.replicas
под виртуальными, что имеется в виду? -
Например, в distributed есть _table, _part и еще несколько, вдруг в ReplacingMT есть что-то вроде _version
-
Я не понял, что такое columns_version, у меня там 0
-
Если вы изменяете набор колонок, то там должна измениться цифра. Если вы про это спрашивали.
-
Нет, речь про версию записи в ReplacingMT
-
Добрый День.
Подгружаю bash-ом данные на КХ:
"cat mytext | clickhouse-client --format_csv_delimiter="$" --format_csv_allow_double_quotes=0 --format_csv_allow_single_quotes=0 --query "insert into schema.my_table FORMAT CSV ";"
В файле редко попадаются битые строчки с лишним кол-вом столбцов. На этих битых строчек процесс загрузки падает.
Какая опцию прописать при загрузке, чтобы пропускать строчки, которые нельзя проинсертить? -
Версия, это изменения партов после мерджей?
-
А почему всего 140 символов?
-
Нет, это когда добавляешь две записи с одинаковым ключом, а он берет последнюю по его версии, она может быть указана явно (в виде реального столбца) или не указываться и КХ решает сам
-
input_format_skip_unknown_fields
input_format_allow_errors_num
input_format_allow_errors_ratio
Можно поиграться с этими параметрами -
Спасибо за помощь.
Есть ли возможность включить лог ошибок в внешний файл или табличку в КХ, если строчку не принимает?
Есть ли опция по регулированию размера батча при такой загрузке? -
видимо случайно, убрал
-
использование SELECT FINAL помогает, но тормозит запросы
есть ли варианты эффективнее?
или альтернатива только предварительная очистка данных? -
-
Насколько большие вставки у тебя и как много повторов?
-
Если идёт вставка в distributed таблицу, то так и будет
-
-
Вставка в не-distributed
-
по 100 000 вставки
во время разработки дубликаты по несколько раз в день
в продакшене раз в неделю, примерно -
-
Тогда вопрос, в том
Что такое поведение нужно получить, или как раз не нужно? -
-
Емнип, в таком случае вставка сразу обрабатывается и если пришло, 200 ok, то данные вставлены
-
А где-то можно уточнить это поведение, чтобы быть на 100% уверенным?
-
Гарантированного варианта, вставить только уникальные записи в clickhouse, что бы не было некого промежутка времени между вставкой и чисткой дубликатов нет, ну окромя select final и group by
-
Т.е., предварительная очистка. Это эффективнее, чем селекты тормозить.
-
Есть же несколько сценариев использования CH
Один из них акцентирован на максимально быстрой записи большого объема информации. Так получается сейчас. Грубо говоря, сидит разработчик и анализирует тонны логов. Логи постоянно и помногу пишутся, а разработчик один. Тогда за скорость выборки можно не так волноваться.
А другой - на максимально компактном хранении и быстром чтении для использования. Пользователей и информации много, а новая информация записывается, но не так чтобы уж очень много. Тогда надо не так критична скорость записи.
Не планируются варианты движков с такими оптимизациями? -
зачем быстро писать, если не критична скорость выборки? Можно не быстро писать)
-
данных много на входе?
-
Их можно оптимально приготовить - объединить в батчи, выбрать уникальные или только нужные же. Тут вопрос скорее где у вас больше ресурсов и что важнее.
-
так я и делаю
хотел узнать, можно ли это переложить на саму бд -
если я правильно понял, то должно быть как раз наоборот.
если читается редко то и записывать можно не сильно часто батчами
если читается часто и нужна актуальность, то пишется мелкими батчами но часто. -
Привет. А я не понял, это прямо для всех поддержка или для кого надо поддержка?
https://clickhouse.yandex/docs/ru/introduction/info/ -
Ну просто как-то очень уж фантастически звучит, что в три часа ночи по бесплатному телефону со мной кто-то поговорит про ClickHouse.
-
телефон доверия КХ
вы хотите поговорить об этом? ) -
Да да, примерно
-
Алиса
-
это чтобы вы не повесились )
-
тут скорее отзывы и предложения, не более, вряд ли вам помогут с запросами по телефону)
-
Да я просто узнать, не очень люблю вообще формат общения голосом по телефону 😊
-
Joined.
-
всем привет.
я использую графану, чтобы рисовать графики по данным из таблицы MATERIALIZED VIEW ENGINE = AggregatingMergeTree()
В столбце даты и времени в этой таблице могут быть пропуски.
соответсвенно, пропуски хотелось бы заполнять нулевыми значеними, чтобы отрисовывать графики корректно.
подскажите, как это можно сделать? -
-
это будет работать, когда есть временная метка, на сколько я понимаю, а метки нет, она пропущена в таблице вообще.
ну то есть у меня например получается такая ситуация сейчас:
DateTime |Count
2019-12-04 12:50:00|35
2019-12-04 13:05:00|50
А мне бы хотелось получить в результате запроса так:
DateTime |Count
2019-12-04 12:50:00|35
2019-12-04 12:55:00|0
2019-12-04 13:00:00|0
2019-12-04 13:05:00|50 -
-
null as zero будет рисовать 0 даже если не существует записи
-
Вообще в кх есть модификатор WITH FILL. Сам не пользовался, но это похоже на то, что вам нужно.
-
-
See max_parallel_replicas setting
-
Но для этого не нужна Distributed таблица.
-
Спасибо, посмотрим.
-
Все привет. Слежу за скоростью работы КХ, и самая проблемная часть, судя по логам, - Merging aggreagted data. Чем больше нагрузка (select-запросы) на КХ, тем больше времени начинает занимать этот этап. Что в это время происходит? При этом ресурсы сервера не использованы на 100%: есть запас по процессору и памяти. В iowait процессор не крутится. Не могу понять, куда копать.
-
Добрый день! А здесь есть разработчики CH? Хочу написать новую функцию, вижу, что другие наследуют IFunction, но в исходниках перед её объявлением стоит коммент «Previous function interface». Значит ли это, что для новых функций я должен использовать что-то другое?
https://github.com/ClickHouse/ClickHouse/blob/master/dbms/src/Functions/IFunction.h#L351 -
-
Спасибо!
-
-
-
Нет. Нет.
-
-
-
мне в другую сторону
-
а я понял. нельзя.
-
-
-
-
Joined.
-
на MergeTree есть настройка ttl_only_drop_parts вот ее надо включить, чтобы партиции только целиком убивались когда они полностью протухнут
-
o, спасибо, вот прямо именно этого очень и хотелось!
-
с 13:40 - 14:00 в таблице пропуски.
то есть он не проставил нули, хотя и стоит null as zero -
-
ну вот я буду признателен, если подскажете что еще нужно сделать, чтобы заработало как нужно)
-
-
Вопрос по конструированию троллейбусов из буханок хлеба:
Можно ли каким-то образом получить репликейтед таблицу на движке "Buffer" не прибегая к шаманству "селект-инсерт" в таблицу на репликейтедМержТри? -
-
-
повторю вопрос, с позволения
-
-
Да, есть ALTER TABLE ... MODIFY SETTING
-
нет. Таблицы с движками Log нельзя использовать для долговременного хранения. Они только для краткого хранения (секунды при заливке), ребут МОГУТ не пережить
-
Это очень долго. Я могу получить список старых партиций из system.parts и сразу грухнуть ALTER TABLE DROP PARTITION. Вопрос как это скреить в один запрос?
-
написать скрипт который тебе создаст нужное кол-во таких запросов и выполнит их? ты программист или чо?
-
Я или чо. По этому и спрашиваю
-
один clickhouse-client генерит скрипт дропа и подает на вход другому
cat drop.sql|clichouse-client -mn | clickhouse-client -mn -
Спасибо.
-
drop.sql например
select concat('alter table ',table, ' drop partition ',partition, ';')
from system.parts
where active = 1 and table = 'xxx' --and partition like '%201906%'
group by database,table,partition
order by database,table,partition
в system.parts есть поля min_time max_date -
-
-
-
И как?
-
-
-
У меня он на сертификат ругается
-
-
-
-
-
-
ах сорян, и правда не распарсил
-
-
-
Добрый день.
Подскажите, есть ли новости или планы по изменению движка регулярок? Мне нужны негативные регулярки, в re2 не поддерживаются. -
yandex/ClickHouse tagged: v19.11.14.1-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v19.11.14.1-stable
Release notes:
v19.11.14.1-stableClickHouse/ClickHouseClickHouse is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Всем привет. Подскажите, плиз, есть ли какие-то best practices по перегону данных из одной таблицы в другую в рамках одного инстанса? Есть одна табличка (~500m записей), нужно перегнать их в другую с немного изменённой структурой. INSERT SELECT подходит прекрасно за исключением одного момента. Есть несколько materialized views. Их тоже надо как-то перегнать и мне интересно, как лучше это сделать. Пробовал создать на новой таблице и после этого перегонять данные — падает с ошибкой о лимите памяти на запрос. Такая же история если просто делать INSERT INTO new_matview_name SELECT ... FROM old_matview_name. Пока что крутится в голове просто переливать данные постепенно, небольшими кусочками, но выглядит так, будто есть способ проще/эффективнее. Clickhouse-copier вряд ли подойдёт, т.к. всего 1 инстанс, зукипер не используем.
-
так а какая разница для clickhouse-copier один инстанс или нет
-
таблицы то разные
-
Господа, а есть какой-то аналог EXPLAIN ANALYZE?
-
Мы зукипер не заводили, а только ради этого его поднимать не хочется
-
1. сколько памяти у сервера?
2. что такое в MV что оно жрет память? Join ?
3. попробуйте set max_block_size=10000, max_insert_block_size=100000 перед insert в таблицу с MV. -
set send_logs_level = 'debug'
у КХ нет оптимизатора, там все прямое как палка -
1. 32GB, кажется
2. На первый взгляд ничего такого, просто табличка
3. Попробую, спасибо -
>32GB
set max_memory_usage=20000000000, max_bytes_before_external_sort=15000000000, max_bytes_before_external_group_by=15000000000
>2. На первый взгляд ничего такого, просто табличка
ну group by / order by там есть? -
Буду смотреть, спасибо!
-
Order by безусловно есть
-
-
гм, в select-e order by ? нафига? он там только память жрет и тормозит.
-
Спасибо
-
Надо подумать)
-
Сама таблица MergeTree(), matviews с другими движками (например, SummingMergeTree())
Order by, соответственно, в качестве первичного ключа -
я спрашивал про order by в select. При чем тут первичный ключ движка.
-
А, пардон, в таком случае нет
-
Селект просто втупую забирает данные из таблицы
-
-
Не добрался?))
-
-
Joined.
-
Подскажите! ситуация подталкивает к использованию таблиц merge, собственно и возник вопрос , хотя ответ , скорее всего будет - "нет" , но все же. Есть 2 таблицы - данные идентичны , различия только в order by. Обращение идёт к таблице merge , к примеру , по ключу сортировки из первой таблицы. Какой вернётся результат ? Двойной- поскольку данные идентичны , или же мердж подумает , что за предикат и будет искать только в той таблице , где это актуально?
-
-
двойной
-
имеется в виду что если индекс есть подходящий, он будет использован
-
Кстати с merge не работает optimize_move_to_prewhere (надо писать prewhere вручную)
- 05 December 2019 (183 messages)
-
Благодарю!
-
Добрый день! Подскажите, пожалуйста, можно ли как то решить проблему с ограничением для даты: Range of values in the Unix timestamp: [1970-01-01 00:00:00, 2105-12-31 23:59:59].? Есть даты (дата рождения и пр.), которые меньше 1970 года и при этом нужно сохранить тип дата, положить в string нам не подходит(
-
-
Всем привет, сталкивался кто-нибудь с таким поведение: есть две таблицы, обычный ReplicatedMergeTree и AggregatingReplicatedMergeTree, связаны через MV. Данные перетекают из первой во вторую, все ок. Но в некоторые моменты (похоже на мержи) данные за последний час (время до часа округляется) перепрыгивают в 00:00:00, в итоге первый час постепенно растет, а последующие как получится. Что-то не пойму куда копать. Версия 19.17.4.11
-
Время каждой новой записи >= предыдущей
┌──────────────────ts─┬─────X─┐
│ 2019-12-05 06:00:00 │ 42360 │
│ 2019-12-05 07:00:00 │ 4824 │
└─────────────────────┴───────┘
спустя некоторое время
┌──────────────────ts─┬─────X─┐
│ 2019-12-05 06:00:00 │ 43428 │
│ 2019-12-05 07:00:00 │ 5052 │
└─────────────────────┴───────┘
это уже в отдельной, свеже созданной таблице, т.е. воспроизводится. Смотрел данные, все корректно со значением времени. -
Если имелось ввиду перепрыгивают в 00:00, то проверьте часовой пояс серверов и clickhouse-server, если сервера разные
-
-
-
Либо я дурак, либо лыжи не едут https://gist.github.com/fuCtor/cd51dc0313d6652469c76b8fa6bda939response.txt
GitHub Gist: instantly share code, notes, and snippets.
-
-
-
-
Joined.
-
Всем привет! Пробую CollapsingMergeTree - у меня он совсем ничего не схлопывает. Есть исходная строка с id = 1 и sign = 1. Затем, добавляю сторно строку с id = 1 и sign = -1 и сразу же новую строку id = 1 и sign = 1. Но я еще не видел, чтобы исходная и сторнирующая строки схлопнулись (сами) за несколько дней. Естесственно, помогает select ... final и optimize ... final и group by id можно использовать. Но хотелось бы без final обойтись. Версия 19.13.1.11
-
HAVING SUM(flag) > 0
-
-
Joined.
-
я про то, что обещанное схлопывание не происходит
-
Всем привет!
Помогите разобраться пожалуйста, почему такой баг
https://github.com/ClickHouse/ClickHouse/issues/8030`Exception: Number of columns doesn't match` while inserting with UNION ALL into AggregatingMergeTree table · Issue #8030 · ClickHouse/ClickHouseI get an exception when trying to insert data into table. It looks like floating bug, or I just cannot understand why this is happening. Code: 20. DB::Exception: Received from host:port. DB::Except...
-
Всем привет! Ни кто случайно не пробовал коннектиться из qlik к базе КХ? Вроде как это можно сделать через ODBC, но пока не получается разобраться как именно ^_^
-
Наверное просто мало данных и кх решает, что вообще можно не мержить их пока.
Можете принудительно схлопнуть с optomize, ну или нагенерить больше данных. -
Так я специально делаю: сторнирую исходные данные за последний месяц и вставляю актуальные данные за месяц без проверки на реальные изменения, т.е. утраиваю их при каждом проходе
-
если только несколько десятков миллионов строк это мало и collapsing работает только от миллиардов строк.
-
Не, миллионов должно хватать)
Покажите создание таблицы. -
Joined.
-
CREATE TABLE
edw.fact_table
(
id Int32,
creation_datetime DateTime,
deposit_creation_date Nullable(Date),
amount Decimal(18,3),
sign Int8,
load_datetime DateTime('UTC')
)
ENGINE = CollapsingMergeTree(sign)
PARTITION BY toYYYYMM(creation_datetime)
ORDER BY (id);; -
А у вас данные за несколько месяцев? Схлопывание работает в пределах одной партиции, если у вас данные размазаны на несколько - будут дубликаты в select *.
-
Сделайте запрос с отсечением по creation_datetime и посмотрите на дубликаты там
-
(чтобы из одной партиции взялись)
-
сейчас только практически 1 партиция: ноябрь и начало декабря. Дубли есть естесственно и внутри партиции (ноябрь)
-
т.е., скажу больше - вообще ничего не схлопывалось еще, при том что дублей сильно больше чем актуальных данных
-
может это баг 19.13 версии?
-
Не уверен, есть ли проблема в том, что sign - не последнее поле в таблице у вас. Еще можно логи посмотреть на предмет того, что он по какой-то причине не может смержить. Куда-то он об этом пишет (в описании CollapsingMT видел что-то про это).
-
-
Всем привет. А подскажите, пожалуйста, про ArrayIf
В доке написано, что Комбинаторы -If и -Array можно сочетать. При этом, должен сначала идти Array, а потом If. Примеры: uniqArrayIf(arr, cond), quantilesTimingArrayIf(level1, level2)(arr, cond). Из-за такого порядка получается, что аргумент cond не должен быть массивом.
А как тогда указывать условие на элемент массива cond? -
Оно так и так не должено быть массивом. Это же фильтр для строк которые попадут или нет в итоге в функцию агрегации.
-
Соответственно это UInt8
-
Т.е. в данном случае это условие на массив целиком а не на его элементы.
-
например так
SELECT sumIfArray(v, c)
FROM
(
SELECT
[1, 2, 3] AS v,
[1, 0, 1] AS c
)
┌─sumIfArray(v, c)─┐
│ 4 │
└──────────────────┘ -
-
Если надо фильтровать массив, можно попробовать что-то типа arraySum: https://clickhouse.yandex/docs/ru/query_language/functions/higher_order_functions/#higher_order_functions-array-sum
-
вот фильтр на элементы массива
select arrayFilter(x -> x > 2, [1,2,3,4,5]) -
-
-
посмотрю, спасибо
-
CREATE DICTIONARY {dict_name} ( key UInt64, value UInt16 ) PRIMARY KEY key SOURCE(CLICKHOUSE(HOST '{client.host()}' PORT {client.port()} TABLE '{table}' DB '{db}' USER 'default')) LIFETIME(MIN 0 MAX 0) LAYOUT(HASHED());
-
ребят, хелп
есть
table1 (MergeTree)
- userId
- etc.
table2 (MergeTree)
- userId
- etc
пытаюсь джоинить:
SELECT tab1.*, tab2.* FROM "table1" tab1 JOIN "table2" tab2 ON tab1.userId = tab2.userId
на что получаю:
Memory limit (for query) exceeded: would use 9.32 GiB
в table1 примерно 40 тысяч строк
в table2 примерно 350 миллионов строк
вопросики:
1. так понимаю table2 кликхаус в память берет и поэтому Memory limit
2. как правильно сделать? может структура не верная? -
Ребят, может кто-то знает?
-
-
Значит без шансов. Спасибо)
-
Joined.
-
-
поменять местами таблицы?
-
фишка в том, что нужна инфа именно по userId из table1
в случае смены местами получим много ненужной инфы -
а что нужно? последнее значение etc?
-
надо примерно так
table1.userId table1.etc table2.data
по факту ищем все идшники из table1 и сопоставляем из таблицы table2
или иначе сказать:
ищем данные для идшек (table1) из данных table2 -
меняете местами, убираете лишнее
-
правая таблица должна умещаться в лимит
-
можно правую таблицу сгруппировать по user_id и groupArray(table2.data)
-
если поместится в память
-
попробую сейчас
но скорее всего не то будет -
можно добавить костыль в правую таблицу: Where user_id in (select user_id from table1 Where 1...)
-
я думаю что кодом буду работать
читаю из table1 и далее бегаю в table2 за данными -
иного варианта не вижу сейчас
-
есть ощущение, что можно переделать запрос
-
еще разок
table1:
- userId (UUID)
- campaign
table2:
- userId
- os
- code
и надо в такой форме данные получить:
userId : campaign : table2.os : table2.code -
user_id уникальны? если нет, группировка, фильтр и джойн
-
уникальность не гарантирует кликхаус
в table1 не повторяются (гарантия кодом)
в table2 на один userId может быть множество записей -
вам в table2 нужны все user_id?
-
если в правой таблице есть лишние user_id, фильтруем условием выше
-
в table2 нужны данные по всем userId из table1
-
есть, да
есть пример как сделать? или где прочитать? -
можно добавить костыль в правую таблицу: Where user_id in (select user_id from table1 Where 1...)
-
скопируйте сюда запрос, будет проще
-
Joined.
-
-
Всем привет, нужен совет, кто обновлял клихаус просто с краторным разрывом от текущей версии)) Есть база примерно 0.5T, кликхаус 1.1.54336. Обновляться сразу до последней, я боюсь. У меня есть вторая нода там сейчас 19.17.4.11, я перекинул данные просто копированиаем файлов на обновленную ноду, вроде все работает и проблем как таковых нет. Кто-то знает могут ли быть какието проблемы в дальнейшем и стоит ли так вообще перекидывать? Стопать продовскую ноду на долго не вариант
-
Joined.
-
Дмитрий предложил вам ограничить набор из table2 , чтобы он поместился в оперативную память. Это можно сделать множеством способов. Например первый способ : select * from table1 all inner join (select * from table2 where field1 in (select distinct field1 from table1)) as a1 on a1.field1 = table1.field1
-
И второй способ - на мой взгляд более правильный. Дело в том что скорее всего вы будете в конечном рекордсете данные группировать, или фильтровать (если конечно речь не идет про батч загрузку данных в другой источник). Поэтому лучше сделать эту обработку непосредственно в подзапросе. Пример 2 : select * from table1 all inner join (select field1, max(field2) as f2 from table2 where field1 in (select distinct field1 from table1) group by field1) as a1 on a1.field1 = table1.field1
-
-
пол терабайта с гигабитной сеткой скопируют через командную строку (сlickHouse-client) в течении часа - двух без остановки продовской ноды. Может быть просто перекинуть данные через конвейер ? Есть и более модные варианты - например clickhouse-copier (https://clickhouse.yandex/docs/ru/operations/utils/clickhouse-copier/)
-
Я тоже думаю что по времени это много не займет. Спасибо, сейчас пощупаю clickhouse-copier)
-
Например - есть 2 одинаковые таблицы на 2-х серверах srv1(version1) и srv2(version 19) create table tab (col1 int) Engine = MergeTree order by col1. В командной строке второго сервера : $clickHouse-client -h srv1 -q "select col1 from tab format TSV" | clickHouse-client -h srv2 -q "insert into tab(col1) format TSV"
-
подскажите пожалуйста, если я делаю INSERT INTO lcal_table SELECT * FROM remote(...) и выборка будет большая, оно же не будет сначала в память все грузить? Или нужно селект на пачки разбить?
-
-
Какой-то бред. Зачем насиловать все insert-ми, если можно просто скопировать файлы?
-
вы все сделали правильно.
Проблемы будут у приложения. Тестируйте приложение. -
как раз этим и занимаемся)
-
Кто-то сталкивался с таким?
Code: 20. DB::Exception: Received from host:port. DB::Exception: Number of columns doesn't match.
Какой-то плавающий баг, возникающий в рандомных местах 🤷♀️
Подробнее эту дичь описала здесь https://github.com/ClickHouse/ClickHouse/issues/8030`Exception: Number of columns doesn't match` while inserting with UNION ALL into AggregatingMergeTree table · Issue #8030 · ClickHouse/ClickHouseI get an exception when trying to insert data into table. It looks like floating bug, or I just cannot understand why this is happening. Code: 20. DB::Exception: Received from host:port. DB::Except...
-
было очень много изменений в sql. Например SELECT count(*) FROM table WHERE 0 выдает другой результат (empty_result_for_aggregation_by_empty_set) Читайте changelog Backward incompatible changes.
-
ну баг и что? Никто кроме вас так инсерты делать еще не догадался.
Это вообще какой странный подход. Непонятно зачем так делать инсерты.
По-моему вы шли в библиотеку, зашли в лес, потерялись, и спрашиваете где север. Я не знаю где север, знаю где библиотека. -
А как еще инсертить в столбцы AggregateFunction?
У вас есть другие предложения?
You can’t use a normal INSERT to insert a row in a table containing AggregateFunction columns, because you can’t explicitly define the AggregateFunction value. Instead, use INSERT SELECT with ‘-State’ aggregate functions for inserting data. (пруф https://clickhouse-docs.readthedocs.io/en/latest/table_engines/aggregatingmergetree.html) -
@den_crane Нет , не бред - при всем уважении к вам. Я предположил , что структура таблиц , может быть изменена на новом сервере. Ну как минимум - использован новый синтаксис в создании таблиц
-
>А как еще инсертить в столбцы AggregateFunction
конечно знаю 🙂 .
создаете null таблицу, навешиваете на нее MV и вставляете в null. Я только так и делаю.
https://gist.github.com/den-crane/f7382cd4f1f859ff6ac46afe7dc9925a -
Так и где ТС просил переделывать таблицу? Где ему в ответе написали что все можно переделать при этом?
а copier вообще требуют кучу мозговых усилий и зукипер. -
Но это же не значит , что мое предложение - бред ? ; )) это еще один из вариантов решения задачи. На самом деле я сам не раз переносил файлами - это конечно же быстрее
-
-
Интересный подход, но если честно выглядит как костыль
Хотелось бы инсертить напрямую -
вы инстертите медленным парсером (из-за select-в), что вообще не подходит для bigdata.
напрямую можно новой функцие input , которая позволяет в insert
INSERT INTO example SELECT id, ifNull(num, -1) FROM input('id UInt32, num Nullable(Int32)') format JSONEachRow {"id": 1, "num": null};
и еще вам можно использовать SimpleAggregateFunction
create table test_table
(
x Int64,
cnt UInt32,
min_ts SimpleAggregateFunction(min, UInt64) Codec(LZ4),
max_ts SimpleAggregateFunction(max, UInt64) Codec(LZ4)
)
engine = AggregatingMergeTree() order by x
insert into test_table values (1,1,1,1);
insert into test_table values (1,1,2,2);
optimize table test_table final
select * from test_table -
SimpleAggregateFunction для sum / min / max работает быстрее и занимает меньше места, чем функции со стейтами
-
👍
-
Коллеги, вопрос по зукиперу
-
Как его сетапить в смысле скейла? я тут пытаюсь играться с реплицируеми таблицами и у меня ЗК умирает каждые несколько дней, по непонятным причинам. Проц на 100% и сервер не отвечает
-
тестовые таблицы у меня по несколько сотен миллиардов строк, может бросить больше cpu power на все это?
-
а больше это сколько? есть какие нибудь guidelines как конфигурировать ЗК под КХ?
-
FixedString(50) -- лучше чем просто String только в случае если там действительно 50 символов, иначе надо использовать String
https://t.me/clickhouse_ru/87609Alexey Milovidov in ClickHouse не тормозитFixedString имеет смысл использовать только в тех случаях, когда строки действительно имеют фиксированную длину. В остальных случаях, преимущества по скорости не будет, или даже скорость работы будет хуже.
-
Там действительно fixed, +- несколько символов
-
ноды заняли всю память и jvm ушла в gc?
-
вроде нет, секунда, гляну
-
и у вас будут проблемы скорее всего и с памятью и со скоростью. Первичный ключ в озу,
у вас primary key (category, direction, field1, field2, field3, field4) , >200 байт.
Не знаю какой размер будет у таблицы (в строках), я бы переделал на хеши (8 байт вместо 50). -
нет, памяти было много свободной
проц на 100% -
сколько размер снепшота у зукипера? (у меня несколько таблиц по 400млрд, размер базы / снепшота 50МБ)
-
перезапуск не помогает, проц на нуле, но ноды не находят друг друга, не понятно почему
-
секунда, девопы их заресайзили сечас, думаю, даты там уже нет
-
проверяю
-
так, по памяти, 10% потребления
-
есть что то в этом, если мы стираем всю папку с датой то все работает несколько дней а потом опять сдыхает
-
эээ в каком смысле стираете?
-
rm -rf :)
-
это тестовый сетап, можно и стереть все
-
все ясно, это херня какая-то
-
таки мы потеряли всю дату при ресайзе кластера
-
>напрямую можно новой функцие input , которая позволяет в insert
INSERT INTO example SELECT id, ifNull(num, -1) FROM input('id UInt32, num Nullable(Int32)') format JSONEachRow {"id": 1, "num": null};
А если столбец типа AggregateFunction? -
Это невероятная херня, ни я (ну у меня опыт с ЗК нулевой) ни девопы не могут понять что ему не так, по логам ничего не понять
-
сеичас поставили более жирные инстансы, посмотрим что будет.
-
а что там со снепшотами? я предполагаю они довольно жирные будут
-
зукипер простой как палка, у меня аптайм у нод зукипера по 4 года, это самая надежная вещь на этой планете, после заббикса.
-
размер базы зукипера зависит от прямоты ваших рук. От размера базы КХ почти не зависит.
-
Протестую! У нас админы заббикс сами ломают, а вот зукипер не смогли ещё завалить хоть и пытались 😀
-
хм... а какая у тебя версия? древняя какая то, раз аптайм 4 года? может в этом и дело?
-
насчет прямоты рук, поподробнее плиз, мы то сами ничего с ним не делаем, там КХ что то пишет и пишет, мы тут причем?
-
create table mv_z_store(a date, max_b AggregateFunction(MAX,Int64)) ENGINE = AggregatingMergeTree Partition by toYYYYMM(a) order by a;
INSERT INTO mv_z_store SELECT a, maxState(b) FROM input('a Date, b Int64') group by a format CSV "2019-12-05",1
INSERT INTO mv_z_store SELECT a, maxState(b) FROM input('a Date, b Int64') group by a format Values ('2019-12-05',1); -
Всем привет! Кто-нибудь знает, можно ли в clickhouse сделать map для массива? нужно выбрать из массива элементы, которые удовлетворяют некоторым условиям
-
-
не в этом. Сколько памяти у сервера? Это выделенный сервер? ЗК и кликхауз нельзя ставить вместе
Ищите OOM в линуксе sudo dmesg | tail -
Скорее всего про бомбу замедленного действия - читали ? https://clickhouse.yandex/docs/ru/single/#zookeeperДокументация 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
-
Вы задаете партиционирование и регулируете правильность (по партициям) и частоту инсертов
-
ну место на диске кончится, при чем падения зукипера?
-
Вариант, попробую
Спасибо -
Да, спасибо!)
-
32Г, 16vCPU, выделенные машины, кластер из трех. сколько надо? если надо больше, поставим больше, не вопрос
-
Что-то я действительно сегодня - много предполагаю.
-
SELECT arrayStringConcat(arrayMap(i -> x[-i], arrayEnumerate(extractAll('Misha', '.') AS x)))
┌─z─────┐
│ ahsiM │
└───────┘ -
спасибо!))
-
видели, место было, 78% диска было свободно
-
32ГБ достаточно. Единственное что у меня настроено -Xms8g
Смотрите размер снепшота в момент заливки, может у вас вылетает за 32ГБ и надо тогда разбираться почему
еще echo mntr|nc localhost 2181 показывает размер базы в zk_approximate_data_size -
о... это уже что то... ок, через пару дней он загнется, буду смотреть что его убивает...
Xms емнип это начальный размер памяти у jvm? так? -
да, и еще этот парамерт задает цель гарбадж коллектору, к которой надо стремится.
-
Понятно. Будем проверять. спасибо за подсказки
-
еще момент. Если реплика КХ выключается, она перестает читать и чистить свою очередь репликации и база ЗК естественно начинает расти, раньше она росла до бесконечности, теперь вроде есть какой-то предохранитель.
-
И еще ЗК нужны SSD, иначе медленно работает, у жестких дисков только 200 seek/sec, <200 транзакций ЗК.
-
о.... это очень важный момент, потому что это то что у меня происходит... я поднимаю кластер КХ, делаю импорт на 400млрд строк, потом у меня это все наворачивается, я выкидываю кластер и поднимаю новый, навая база данных, новые таблицы. Т.е. количество даты у меня растет постоянно. Это с одной стороны, с другой стороны, ну сколько уже там той даты? не гигабайты. А какой предел у ЗК? там на самом деле стереть реплицируемую таблицу из ЗК берет больше часа, то еще мозгоклюйство...
-
насчет дисков, у меня EBS, SSDишный, но там IOPS не айс все равно, могу NVMe воткнуть, но он зараза эфемерный, не самая лучшая идея
-
у начальных EBS 3000iops -- тоже нормально.
>стереть реплицируемую таблицу из ЗК берет больше часа
что-то неправильно, слишком много партиций? -
можно конечно provisioned EBS взять, но он дорогой... к скольки IOPS мы должны стремиться? я хочу потестить его с fio
-
Море партиций, и тут мы выходим к следующему вопросу :)
Но сначала давай с ЗК закончим
3k IOPS по твоему достаточно? если так то хорошо, одной головной болью меньше -
Joined.
-
3k достаточно. В консоли у сервера(cloudwatch) видно сколько он жрет iops, проверьте есть там полочки из 3к или нет
и партиционирование важно, меняем PARTITION BY получаем разницу в 100 раз
You should not. When you insert every 5 minutes and your inserted rows cover 1 (sometimes 2) hour and the insert creates only one part.
I was talking about another case. Partition by (toStartOfHour(), other_column). If the batch (1 mil. rows) contains many (i.e. 10) different values of other_column (covers 10 partition) the batch (insert) will be separated to 10 parts. It has negative impact on performance.
For this case it should be 10 inserts (10 batches) with 1mil. rows each with only one other_column value.
CREATE TABLE bad
( k Int64, s String)
ENGINE = ReplicatedMergeTree ('/clickhouse/{cluster}/tables/bad','{replica}')
PARTITION BY k ORDER BY s;
insert into bad select number, 'x' from numbers(110);
0 rows in set. Elapsed: 3.829 sec.
insert into bad select number, 'x' from numbers(110);
0 rows in set. Elapsed: 1.347 sec.
insert into bad select number, 'x' from numbers(110);
0 rows in set. Elapsed: 0.874 sec.
CREATE TABLE good
( k Int64, s String)
ENGINE = ReplicatedMergeTree ('/clickhouse/{cluster}/tables/good','{replica}')
PARTITION BY tuple() ORDER BY s;
insert into good select number, 'x' from numbers(110);
0 rows in set. Elapsed: 0.032 sec.
insert into good select number, 'x' from numbers(110);
0 rows in set. Elapsed: 0.013 sec.
insert into good select number, 'x' from numbers(110);
0 rows in set. Elapsed: 0.008 sec. -
Чорт! Девопы то все посносили, уже ничего не могу проверить... Ладно, давай оставим это до тех времен пока оно снова не навернется, что бы было больше конкретики...
-
Joined.
-
Всем привет.
А может кто-нибудь подсказать, как понять, чем занята мутация? Запущена давно, счетчик партиций уменьшается понемногу, на нагрузка на сервер почти что никакущая. Чего он ждет, во что упирается? -
Есть ли какая-то, дефолтная агрегирующая функция у AggregatingMergeTree для Decimal колонок?
-
У меня партицирование по месяцам, проблема в том что есть параллельные вставления, они плодят парты, пока файлы мелкие получается много партов, и я вставляю через Buffer Engine что бы их было поменьше. В конце я имею не так уж много партов на месяц, штуки три, ну максимум пять. но это одна сторона медали, вторая сторона связана с моим вторым вопросом. И да, я не правильно итерпретировал твой вопрос, партиций не много, много партов.
-
У меня на lcal_table завязаны еще мат вьюшки, которые по объемам больше исходных таблиц. Не хочу их же через сеть тащить. Думал создать пустые MV и сделать инсерт из remote.
-
если функция не упомянута в AggregatingMergeTree и поле не в ключе, для любого типа данных AggregatingMergeTree берет any
т.е. при схлопывании строк по первичному ключу, будут вычислены state функции, для остальных столбцов подставится какое-то значение из любой строки. -
круто, спасибо
-
значит дело в чем-то другом. Парты это не проблема.
-
мне этого не понять.
Инсерт вам даст максимум пару миллионов строк в секунду, файлы с партами у меня копируются со скоростью примерно в 500раз выше. -
sar -d 1 100
-
Гляну. Но графана и нетдата ничего интересного не показывают.
-
Ну, там таже утилизация 20%, что и ожидалось. Бездельничает.
-
-
В общем, alter table T1 where (select from T2) очень плохо работает. А если заранее собрать ответ селекта, то alter table T1 where (1, 2,3,4 ...) работает отлично.
-
нет. У меня есть таблица А, загружаю в нее 100ГБ сырых, таблица получается 1ГБ, есть другая таблица B, заливаю в нее 100ГБ, получается 150ГБ
-
А вы что хотите подсчитать ?
-
Про калькулятор «железа» я, наверное, всё-таки не в ту степь увёл :) но, скажем, мы в принципе хотим понять подойдёт ли нам CH, если нам необходимо залить в таблицу 150млрд записей, сколько она будет весить в CH, какой будет коэффициент сжатия. И будет ли ворочаться аналитика типа sum() group by...
-
-
-
Да, никто неподскажет вам. Тут же всё исключительно от данных ваших зависит. Какая кардинальность в каждом из столбцов.
-
Выше приводили пример, что может ужаться из 100 ГБ в 1 ГБ, а может и 150 ГБ стать
-
Если вся таблица такая, то сожмётся очень хорошо. Тут много дублей.
-
берете 10млрд. и грузите в виртуалку в ноутбуке. Смотрите сколько получилось на диске, прогоняете group by.
- 06 December 2019 (207 messages)
-
подскажите, как написать запрос так, чтобы он вернул что-то, в случае если при выполнении where ничего не найдено или результат, если нашлось что-то?
-
Сделать лефт джойн (константу с запросом)
-
Доброе время суток, подскажите в какю сторону копать. Есть такая ошибка
2019.12.05 14:17:21.982194 [ 337212 ] {606c4c80-5008-4b22-9bb9-4faa1559c5f6} <Error> executeQuery: Code: 210, e.displayText() = DB::NetException: I/O error: Broken pipe, while writing to socket (ip:39432), e.what() = DB::NetException (from ip:39432) (in query: SELECT user_id, uid FROM my_table), Stack trace:
2019.12.05 14:17:21.982356 [ 337212 ] {606c4c80-5008-4b22-9bb9-4faa1559c5f6} <Warning> TCPHandler: Client has gone away.
На клиенте я получаю ошибку: bad connection -
на чем написан клиент?
какие firewall \ nat \ кубернетесы стоят между клиентом и сервером?
какие таймауты на клиенте для TCP выставлены? -
-
Клиент написан на Go и размещен в кубере, используется библиотека github.com/kshvakov/clickhouse.GitHub - ClickHouse/clickhouse-go: Golang driver for ClickHouse
Golang driver for ClickHouse. Contribute to ClickHouse/clickhouse-go development by creating an account on GitHub.
-
Joined.
-
Насчет таймаутов TCP посмотрю.
-
Добрый день!
Заранее извиняюсь, что задаю заезжанный вопрос, мало ли что-то имзенилось в новых версиях в JOIN
>SELECT id, name FROM ids
>JOIN (SELECT id, name FROM ids_names) USING id
-- ids - миллоин строк
-- ids_names - 100 строк
-- результат 100 строк, прочитано миллон строк (fullscan)
Как переписать запрос, чтобы не было fullscan без использования дополнительного подзапроса? -
Доброго дня! Подскажите пожалуйста есть ли какие то синтаксические особенности когда используешь nested поле внутри nested поля?
-
Как может быть такое , что Optimize DEDUPLICATE не удалил дубликаты из таблицы,а FINAL удалил ?
-
Для чего предназначена папка /var/lib/clickhouse/cores? У меня на тестовом сервере в этой папке штук 20 файлов с названиями вида core.nnnnn. Есть по 2гб, есть один 6гб
-
Попробуйте засунуть сабселект в IN, поместить id в ids в индекс.
-
Не совсем понятен вопрос. А как вы хотите без FS? Вы джойните 2 таблицы.
-
FS не должено быть в таких ситуациях. Сейчас реализуем через пдзапросы, временные таблицы или временные файлы.
Так же USING может испоьзоваться в оптимизаторе запросов. -
FS какой таблицы ? КХ ведь делает hashjoin. Какую из двух таблиц вы не будите читать полностью ?
-
В IN можно перенести. Но JOIN тоже нужуен. Дополинтельный подзапрос делать не хотим.
-
В in у вас не будет чего ? FS таблицы ids_names?
-
FS надо исключать везде где это возможно. Обе таблицы нельзя читать полностью, у них обоих есть индекс.
-
-
Они у вас в любом случае читаются полность. У вас join без фильтров .
-
Joined.
-
Как бы вы не делали. С In или с join.
-
В примере нет WHERE. Если добавить WHERE IN - не будет FS.
Артем Зуйков уже озвучил верный полход. Но он все еще имеет минусы, так как подзапросы могут отличаться и каждый подзапрос будет делать лишнюю выборку. Это почти всегда лучше чем FS, но я наделся, что внутри разрабатывают оптимизацию USING с прокидыванием USING dj вне в WHERE.
Либо что-то похожее. Инетерсно знать мылси разработчиков на этот счет. -
Два запроса будут на мелкую таблицу. Если не подходит - можно из мелкой таблицы сделать словарь и доставать из нее name по id. Вариация на тему лукап джойна. Тема сделать один подзапрос для in и join интересная, но это надо делать (в in подмножество колонок из join)
-
Не будет Fs, а что будет ? Как вы избежите полного чтения таблицы ids_names?
-
Да, я привел простой пример, на практике JOIN таблица может быть сложной и вычислемой.
-
-
Простите, речь только про большую таблицу. Как избежать FS при USING. То что внутри JOIN не инетресует в рамках этого вопроса.
-
Если аналогичной уже нет, то сфорулию, спасибо.
-
Объясните плиз. Вижу , что вы друг друга понимаете, а я не понимаю ).
-
Тут не понятно, какая будет лишняя выборка у подзапроса: лишнее будет чтение второй таблицы в in. Не у компа сейчас, давайте запрос с in + join напишем
-
КХ же делает Hj.вот он построил по таблице справа Мапу и сканирует большую таблицу
. Как избежать фулскан, если индекс разряжен ? -
Добавить в скан первой таблицы in (select id from ids_names)
-
-
-
Можно остановить мержи
-
Можно совсем остановить или для конкретной таблицы
-
-
https://clickhouse.yandex/docs/ru/query_language/system/
См. SYSTEM STOP MERGES -
Подскажите, как правильно сделать вставку в AggregationMergeTree с помощью JSONEachRow формата
Есть таблица
CREATE TABLE Table
(
id UInt64,
column AggregateFunction(max, UInt64)
)
ENGINE = AggregatingMergeTree()
ORDER BY (id)
в нее прекрасно проходит запрос следущего вида.
INSERT INTO Table (id, column) SELECT 1, maxState(toUInt64(15))
Как сконструировать такой-же только с помощью JSONEachRow
Если передавать просто значение, без агрегирующей функции получается ошибка., что ожидались qoutes.
Если пытаюсь вставить значение обернутое в агрегирующую функцию строкой, то в итоге он вставляет просто строку в этот столбец
т.е. вот такой запрос
INSERT INTO "Table" FORMAT JSONEachRow
{"id": 1, "column": "maxState(15)"}
вставляет в поле column буквально эту строку -
Joined.
-
-
-
Что я делаю не так?
-
Понял
-
-
show processlist
-
но лучше смотреть в логи
-
-
-
Всем привет! Ловлю такую вот ошибку:
DB::Exception: Missing columns: '--i.url_hash' while processing query
Есть идеи? -
-
-
Там группировка есть?
-
-
У меня бывает не находит колонку, когда неправильно группировку задаю
-
Или когда слишком много джоинов
-
Ух! INNER JOIN ON arrayJoin() сильно.
-
ну а как ещё Nested сджоинить)
-
-
-
-
в теории можно вытащить в самом запросе, а в ON секции использовать алиас
-
Подскажите, пожалуйста.
-
-
Спасибо. А эти файлы можно удалить? Это просто дампы?
-
-
-
Логи могут тоже грузить систему.
Если процессов запрос не показывает - значит их нет.
Можно выключить глобальные логи и продебажить конкретный запрос. -
Закончилось место для смонтированной директории. Там тестовый сервер. Спасибо за пояснение!
-
Такое может быть, если в партиции слишком много партов. Попробуйте сделать optimize или посмотрите сколько их.
-
а где это можно посмотреть? не подскажете?
-
на каждую вставку создается парт в партиции. По query_log можно попровать определить что происходит с запросов, куда он лазит.
по таблице system.parts можно найти все парты по таблице. -
select count() from(
SELECT * FROM system.parts); -
-
это по всем вашим таблицам. Хз сколько их. Для 6 таблиц много на вскидку
-
-
добавьте в условие where active, чтобы только активные парты. сгрупируйте по таблицам
-
-
-
под рукой такой есть запрос, тут есть лишняя инфа , но лень править
SELECT
database,
table,
count() AS count_parts,
sum(rows) AS s_rows,
sum(marks) AS s_marks,
formatReadableSize(sum(marks_bytes)) AS s_marks_bytes,
formatReadableSize(sum(primary_key_bytes_in_memory)) AS s_pri_key_in_mem,
formatReadableSize(sum(primary_key_bytes_in_memory_allocated)) AS s_pri_key_in_alloc,
formatReadableSize(sum(data_compressed_bytes)) AS s_compr_bytes,
formatReadableSize(sum(data_uncompressed_bytes)) AS s_uncompr_bytes
FROM system.parts
WHERE active
GROUP BY
database,
table
ORDER BY s_rows ASC -
-
-
Банально по top серваки не нагружены? Мы не видем вашу систему, а из показаний только что "стали запросы медленно'.
Информация о том что происходит есть в query_log и system.merges, ну и упомянутом show processlist; -
-
в любом случае - спасибо, направление получено
а по htop сервака... гм... там просадка невозможна практически, очень большой запас -
в продолжению к этой истории. попробовал убрать алиас i, т.к это основная таблица к которой джоинятся все остальные. В итоге получаю уже такую ошибку:
DB::Exception: Cannot refer column 'pictures.url_hash' to table.
при этом SELECT pictures.url_hash FROM item_distributed всё также прекрасно выполняется -
-
В запросе есть звёздочки?
Или есть ли таблица, используемая в двух join или where одновременно? -
-
Ещё стоит проверить что имя url hash используется один раз.
Замечены ошибки, если дублируются alias столбцов -
звездочек нет. таблицы джоянится по одному разу. но есть одна особенность что по сути за счет arrayJoin Nested массив сначала раскладывается и джоинится к другой таблице по хэшу, а потом результат этого джоина опять схлопывается до массива за счет groupArray(). эта схема работала на тестовых данных и даже на этих данных, но без distributed таблиц. но сейчас даёт сбой. хотим попробовать уйти от Nested в пользу обычных массивов и избавиться от таблицы которая требует groupArray(arrayJoin()) это должно помочь сто процентов, плюс нам все равно нужно избавляться от джоинов)
-
копайте в сторону того что кубер разрывает соединение, коннект к clickhouse из клиента через куберовский service идет? что в качестве CNI использутется.
-
Все в одну будет литься (с префиксом all_что-то там)
-
в запросе даже поля с одинаковым именем в разных подзапросах - под алиасами, потому что алиасы на таблицу в этом случае не спасали на одной из версий кх
-
спасибо
-
Коллеги, юобрый день! Подскажите, пожалуйста, реализована ли в библиотеке clickhouse-go поддержка флага any_join_distinct_right_table_keys=1. Если нет, то как пользоваться старыми джоинами?
-
-
@kshvakov
-
-
Если нет, но очень хочется, можно добавить самому) там есть файлик со всеми поддерживаемыми настройкамм, query_settings.go или вроде того (в драйвере).
-
просто нужно добавить одну строчку?
-
-
Скорее всего да, попробуйте и если не получится - то можно посмотреть детальнее, что не так.
-
Подскажите, пожалуйста. Хочу вынуть при помощи запроса SELECT arrayReduce('sum', arrayFilter(x -> (x > 0), arrayDifference(groupArray(toUInt64(Value * 100))))) / 100 as time FROM graphite.data WHERE Path = 'some.path' AND (toStartOfMonth(Date) = toStartOfMonth(subtractMonths(today(), 1))) вынуть некий монотонно возрастающий параметр (время cpu), вычесть из каждого последующего текущий, выкинуть нули и отрицательные значения и просуммировать. Но результат всякий раз разный, я подозреваю, что данные перед аггрегацией не выстраиваются
TL;DR
В groupArray, судя по всему, прилетают несортированные данные -
-
-
-
-
-
всем привет!
давно не общался с sql
а подскажите плиз, как в CH объявить переменную?
DECLARE @StartTime DATE - ругается на синтаксис -
ну у меня вопрос как раз с JSONEachRow.
как из консоли это сделать я знаю) -
Много потоков. Они читают разные куски. Кто успел первым получается в начале.
-
И как это сделать в консоли ?
Какой из 3 способов вы попробовали? -
Спасибо. Какой-то способ избежать этого, кроме max_threads=1 и подзапроса с order?
-
Order by необходим.
-
я делал с помощью
INSERT (column) SELECT maxMerge(15) -
если я просто добавляю order by Time (колонка со временем), то запрос ругается, что она не под группировкой
-
Вы понимаете -- это бред. Это не заливка потока. Так на проде вставлять не получится. Пробуйте способ 3 -- у вас все получится. В способе 2 написано что вам нажны simpleaggregstionfunction которые в 2 раза быстрее и занимают меньше места. Использовать надо способ 1.
-
окей, спасибо.
-
Вот сюда добавьте https://github.com/ClickHouse/clickhouse-go/blob/master/query_settings.go и PR сделайте ;)ClickHouse/clickhouse-go
Golang driver for ClickHouse. Contribute to ClickHouse/clickhouse-go development by creating an account on GitHub.
-
-
и это правильно, так и задумано.
- Если указать DEDUPLICATE, то произойдет схлопывание полностью одинаковых строк (сравниваются значения во всех колонках), имеет смысл только для движка MergeTree. -
-
У меня они не схлопнулись почему то. Вот я так и ожидал. Движек реплэйсингмерджтри
-
повторяю: и это правильно, так и задумано.
-
И вообще final это не аналог DEDUPLICATE
-
optimize table DEDUPLICATE
optimize table DEDUPLICATE FINAL
делают разное -
А что тогда значит deduplication в конструкции optimize?
-
Что делает dedup с данными в таблице ?
-
- Если указать DEDUPLICATE, то произойдет схлопывание полностью одинаковых строк (сравниваются значения во всех колонках), имеет смысл только для движка MergeTree.
optimize table DEDUPLICATE FINAL -- то произойдет схлопывание полностью одинаковых строк даже в партициях где один парт -
только для движка MergeTree
- Если указать DEDUPLICATE, то произойдет схлопывание полностью одинаковых строк (сравниваются значения во всех колонках), имеет смысл только для движка MergeTree. -
А точно по всем колонкам сравнивает а не по примари ключу ?
-
ver — столбец с версией, тип UInt*, Date или DateTime. Необязательный параметр.
При слиянии, из всех строк с одинаковым значением первичного ключа ReplacingMergeTree оставляет только одну:
Последнюю в выборке, если ver не задан.
С максимальной версией, если verзадан.
Это из доки по КХ -
create table D (A Int64, B Int64) Engine=MergeTree() order by tuple();
insert into D values(1,1), (1,1);
optimize table D deduplicate;
SELECT *
FROM D
┌─A─┬─B─┐
│ 1 │ 1 │
│ 1 │ 1 │
└───┴───┘
optimize table D final deduplicate;
SELECT *
FROM D
┌─A─┬─B─┐
│ 1 │ 1 │
└───┴───┘ -
create table D (A Int64, B Int64) Engine=MergeTree() order by tuple();
insert into D values(1,1);
insert into D values(1,1);
optimize table D deduplicate; <--------------
SELECT *
FROM D
┌─A─┬─B─┐
│ 1 │ 1 │
└───┴───┘ -
В первом случае дубли в одном парте. Парт один. optimize без final ничего не делает.
-
deduplicate -- имеет смысл только для MergeTree. У остальных движков схлапывание по первичному ключу.
-
1. Alter table Freeze
2. rsync shadow на другой / другие в папку detached
3. drop table
4. на других шардах в папке detached
let i=1;for f in `ls -1` ; do echo $i $f;((i++)); echo "alter table XXXX attach part '$f';"|clickhouse-client ; done -
yandex/ClickHouse tagged: v19.17.5.18-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v19.17.5.18-stable
Release notes:
v19.17.5.18-stable -
Подскажите, пожалуйста, является ли нормальной практикой реплейсить партиции из таблицы т2 в таблицу т1, во время выполнения долгих селектов из т1 по этим же партициям? Движок мержтри.
-
кто подскажет
-
2019.12.06 18:48:04.069324 [ 7 ] {} <Error> bool DB::{anonymous}::checkPermissionsImpl(): Code: 412, e.displayText() = DB::Exception: Can't receive Netlink response: error -2, Stack trace:
0. 0x55e8a3d58f60 StackTrace::StackTrace() /usr/bin/clickhouse
1. 0x55e8a3d58d35 DB::Exception::Exception(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) /usr/bin/clickhouse
2. 0x55e8a389fa6b ? /usr/bin/clickhouse
3. 0x55e8a3d70668 DB::TaskStatsInfoGetter::TaskStatsInfoGetter() /usr/bin/clickhouse
4. 0x55e8a3d707e9 DB::TaskStatsInfoGetter::checkPermissions() /usr/bin/clickhouse
5. 0x55e8a3d5febb DB::ThreadStatus::initPerformanceCounters() /usr/bin/clickhouse
6. 0x55e8a7227288 DB::ThreadStatus::initializeQuery() /usr/bin/clickhouse -
гугление ничего не дало
-
запускаю как демон штатно
-
привет, как решил ошибку свою с 412 кодом, помоги. плиз
-
контейнер? LXC ? docker ? WSL ?
-
просто север CentOS без докера — как сервис демона и все — один сервер, без класера — накатил свежак и еще не успел нормально поработать залил 10 строк в одну таблицу через ява код и все. И уиедел косяк это, но так то база работает но стал смотреть логи так как линк с посгрес базой не смог сделать через линкованную таблицу jdbc моста
-
-
в любой непонятной ситуации, возьмите полотенце, и отключите SELinux
-
ладно спасибо
-
я не шучу.
-
Я однажды два дня убил разбираясь что за бред происходит. Оказалось SELinux
-
ок
-
SELinux не дает сервисам делать нехорошее. Читать файлы которые они по его мнению не должны читать, ходить по сети и т.д.
-
выключен Selinux у меня —
[kakunin@DCtestClickHouse ~]$ sestatus
SELinux status: disabled
[kakunin@DCtestClickHouse ~]$ -
-
покажите вывод
# getcap /usr/bin/clickhouse -
[kakunin@DCtestClickHouse ~]$ getcap /usr/bin/clickhouse
/usr/bin/clickhouse = cap_net_admin,cap_ipc_lock,cap_sys_nice+ep
[kakunin@DCtestClickHouse ~]$ -
может дело в красных ошибках этих ?
-
setcap cap_net_admin=-ep /usr/bin/clickhouse
и перезапустить КХ -
ок завтра продолжим. с тяпницей
-
в документации написано что 128 гб памяти лучше 64, но стоит ли озадачиваться покупкой 192 или 384 гб памяти? даст ли такой же эффект или прирост производительности остановится на какой-то планке?
-
-
Так и не исправили вставку из MySQL таблиц. Открывать issue?
-
это зависит от прикладного ПО. отмониторь если часто уходишь в своп и прокачал кх по настройкам то может и нужно оперативы но нужно наблюдать. нет общих рецептов. если про модели то corsair и crusial самая совместимая память. если у тебя сервер то нужно подбирать регистровую память я думаю
-
да понятно что если отмониторить то станет понятно, поэтому и спрашиваю может у кого-нить был опыт
-
и как с процессором обстоят дела? например стоит ли брать второй проц с 12 ядрами или сильного прироста не даст?
-
не всегда ведь (вернее почти никогда) происходит линейное масштабирование производительности
-
Ну кликхаус очень активно все параллелит
-
Для него больше ядер лучше, чем более высокая частота.
Другое дело,что вам возможно это уже и не нужно -
Как прокачать кх по начтройкам
-
-
а что там за проблемы?
-
я делал из postresql нормально и думаю из явы делать то без разныцы муsql или еще что
-
я новичек но там все просто открываешь конфиги и делаешь сжатие и кеши и т.п
-
Добра.
SELECT countIf(ee = 'start' ) AS views , countIf(ee = 'click' ) AS click ,
multiIf(ee = 'start' , SUM(prc) as money )
FROM default.log where cid = 1234
multiIf(ee = 'start' , SUM(prc) as money ) - вот это не работает ..
Как то можно тут получить сумму если ee = 'start' ? -
-
тут нужно сбалансировать по хардам и памяти . это можно нагуглить как мониторить системы но с этого нужно начать. так как узкое место может просто другое к примеру локалка на 100 мегабит. нужно гонять сжатные данные или наоборот это мониторирование скажет
-
384 Гига не в сервер это хорошо. Какой год у вас?
>регистровую
это называется ECC, коррекция ошибок. Понятие регистровая -- умерло 15 лет назад
>corsair и crusial самая совместимая памят
дада, в сервер. Там хиниксы и кингстоны, и еще например в hp нужны hp-compatible иначе будет плакать и откызваться работать по нормальному. -
я про сами ручки, которые можно покрутить, мб переписать запросы. Но прежде чем переписывать нужно разобраться глубже, и порой не понятно. Поэтому и спрашивал про мануал
-
сделал issue. Не работает вставка из таблиц MySQL. При этом селект, указанный для insert отрабатывает корректно
-
>multiIf(ee = 'start' , SUM(prc) as money )
sumIf(ee = 'start') -
-
объем озу нужно не по максиму а с умом и может у него персоналочка на 128 г рамы раз так спрашивает. а hp это барахло вроде как не вижу в них ничего хорошего. как раз вышла новость что нр облажался с ссд серверными. так что это не люди которые с головой дружат
-
-
-
подними монитор ресурсов . это прояснит узкие места. как все равно нужно это делать так как это частное ПО. свои особенности
-
Joined.
-
-
Пишут что они менее производительные, чем обычные. Надо тестить на ваших данных.
-
привет, подскажие плз, если упирается в max_memory_usage_for_all_queries, могут идти такие ошибки?
oException: Allocator: Cannot mmap 1.00 GiB., errno: 12, strerror: Cannot allocate memory, Stack trace:
или джойнам все равно на этот лимит и mmap сфейлился, потому что памяти нет и скоро ждать оома? -
какая версия КХ ? Ошибка повторяется если запрос снова выполнить?
-
19.7.3.9, ошибок было много(на тачке почти кончилась память)
-
-
нет джойнам не все равно, будет другая ошибка , про лимит. Ошибки Cannot mmap 1.00 GiB быть не должно если все правильно работает.
-
значит надо уменьшить max_memory_usage_for_all_queries / max_memory_usage, чтобы не ронять КХ, чтобы запросы упирались в лимит.
-
-
32 это мало, докиньте свопа 32, если SSD
или max_memory_usage_for_all_queries = 20 -
GB или GiB?
-
GB
-
-
-
нету, 5GB marks_cache, 8GB uncompressed -- но он выключен по умолчанию
-
так это лимиты на запрос. Причем тут аллокация вообще. Запрос закончился, память отдал.
-
- 07 December 2019 (71 messages)
-
Joined.
-
Всем привет, подскажите в какую сторону смотреть - абстрактно: одновременно выполняю 10 запросов, 7 довольно легких, 3 тяжелых; ответы на 7 легких запросов прилетают нормально, а на 3 тяжелых с 80% вероятностью получаю connection refused; оперативка выжирается по максимуму еще на "легких" запросах, в логах смущает 2019.12.07 12:40:31.306470 [ 1 ] {} <Information> : Starting ClickHouse 19.14.3.3 with revision 54425
2019.12.07 12:40:31.309148 [ 1 ] {} <Information> Application: starting up
2019.12.07 12:40:31.339104 [ 1 ] {} <Trace> Application: Will mlockall to prevent executable memory from being paged out. It may take a few seconds.
2019.12.07 12:40:31.378121 [ 1 ] {} <Trace> Application: The memory map of clickhouse executable has been mlock'ed -
-
Я к тому что происходит рестарт
-
-
подейстовало, ошибки изчезли, спасибо
-
я хочу прилинковать базу на посгресс и у меня проблемы — тип number не понимает яндекс, что нужно написать?
select * from jdbc('jdbc:postgresql://мой_ip:5432/моя_срока_подключения', 'MY_SCHEMA', 'MY_TABLE') as k;
Code: 86, e.displayText() = DB::Exception: Received error from remote server /columns_info?connection_string HTTP status code: 500 Can not map SQL type 2 (NUMERIC) to ClickHouse, body: Can not map SQL type 2 (NUMERIC) to ClickHouse (version 19.17.4.11 (official build)) -
вот как у меня в PostgreSQL
CREATE TABLE MY_SCHEMA.MY_TABLE
(
id numeric NOT NULL,
event_type numeric NOT NULL, ....
вот по методике яндекса https://clickhouse.yandex/docs/ru/query_language/table_functions/jdbc/ -
Факу FAQ у вас нет и умной вики с описанием кодов ошибок и похоже что бы понять ваш код нужно лесть в сорцы, но я не знаю С++ и нужно платить кто юзает ваш код (последнее шутка)
-
Joined.
-
@den_crane можешь помочь гугу? скажи путь куда рыть плиз
-
нет. Мне это не интересно. Зачем кстати jdbc мост. Я бы использовал стандартный -- odbc.
Кстати jdbc мост разработка не яндекса а баду. -
я джавист, мне проще все на яве моей, не нужно зависеть от ядра и нативности
-
? Odbc мост часть кх, какое ядро, какая нативность
-
ок расмотрю но это путь в ад, так как odbc это хрень майрософта, а от него мне нужно бежать
-
вот оффициальный яндекс разве обман ? https://github.com/ClickHouse/clickhouse-jdbcGitHub - ClickHouse/clickhouse-jdbc: JDBC driver for ClickHouse
JDBC driver for ClickHouse. Contribute to ClickHouse/clickhouse-jdbc development by creating an account on GitHub.
-
он общается с кликхаусом по http для начала
-
ну ок, я же не против модульности, чем это плохо? это же как модель у микросервисов — модно и гуд — как я понимаю это просто 2 языка - С++ и ява и поэтому так спарили их
-
и это яндексовское https://github.com/ClickHouse/clickhouse-jdbc-bridge —- я это и юзаюGitHub - ClickHouse/clickhouse-jdbc-bridge: A JDBC proxy from ClickHouse to external databases
A JDBC proxy from ClickHouse to external databases - GitHub - ClickHouse/clickhouse-jdbc-bridge: A JDBC proxy from ClickHouse to external databases
-
Гайз, а кто-то помнит функцию для временных рядов которая добавляет нули в дыры?
Условно, у меня есть метрика во времени с равным шагом, хочу возвращать нули там где не было данных. -
ладно — погружись в ход, может патчик сделаю
-
если че это jdbc драйвер к КХ.
по вашему вопросу про jdbc-bridge спросите Krashuevina , он автор тут в чате -
with fill
-
точно, спасибо!
-
я таких не нашел — ок покурю коды его — если что напишу его в гит-хаб — пофиксил для себя
-
-
😍 а почему в доку не добавили?
-
ну а вы почему не добавили? Почему я должен был?
-
я не про вас конкретно же
-
просто странно что нет в доке
-
путина спросите, я тут вообще при чем?
-
возможно, потому что у вас подпись админ в официальном чате кликхауса, люди могут интересоваться у вас по поводу аспектов внутренней разработки кликхауса
-
вы или шашечку снимите
-
или ответьте что не знаете
-
Не пишите чушь, пожалуйста
-
я живу канаде, поэтому имею возможность удалять спам и ссылки на вирусы в моей таймзоне, поэтому я админ в чате.
-
Мне кажется все таки основная причина в ваших ответах))))
-
так ботов заведите и спамить будет меньше и голосования на спаммеров а раз ты ближе к США скажи нашему дурову что бы из коробки избавил нас админов чатов от спама, раз есть новые релизы и яндексу не помешает отвечать официально а не от один ты за всех
-
Не позволяет корпоративная политика
-
т.е. я опять виноват.
Я считаю что писать доку к опенсорсу - бесплатному продукту -- это наша обязанность. Я пишу. Вы видимо нет, поэтому идите в жопу. -
Люди может просто не знают как доку к КХ писать . Есть ли дока , как писать доку ?)
-
Я один раз по моему что то написал но там был просто какой то косяк в документации который меня смущал, преклоняюсь перед вашей самоотверженностью
-
Который смущал мою работу
-
нужен аккаунт на гитхабе.
в доке карандаш (справа вверху) нажимаете , (получаете fork КХ в свое репо), редактируете маркдаун, комитите, потом делаете пул-реквест. -
не виноват, просто я тоже не знал а я ругаю яндекс что сложное ПО и минимум поддержки и помощи от них , а тебе респект — ты реально мне помог - уважуха
-
во первых множество, подчеркиваю МНОЖЕСТВО функционала добавлено разными внешними разработчиками, некоторые из них вообще говорят только на китайском, и пишут коменты в коде с помощью гугл-транслейт.
во вторых если вы не курсе, КХ бесплатный, мы за него деньги не платим, поэтому ожидать какой-то поддержки от Яндекс странно, также странно ожидать что Альтинити будет вам оказывать поддержку бесплатно, я кстати тоже не помогаю бесплатно (никому не помогаю в личке). -
Альтинити кстати неплохие ребята если нужен платный сарпорт
-
-
Да это хорошая идея я давно ещё предлагал
-
FAQ я думаю станет просто слишком большим, нет никаких frequently вопросов. КМК надо просто к каждому разделу в доке добавить раздел "in depth", где подробно с примерами все разжевывать. (Т.е. дока должна оставаться краткой, иначе она будет как дока к ораклу, стопка книжек -- 70см толщиной (у меня была))
-
-
Тогда бы стоило бы иметь список каких то best practise.
все же общие принципы организации таблиц подходящие для многих существуют -
так можно гуглить по кодам ошибок к примеру — гугл под копотом имеет много книг но все знания можно нагуглить, на кой черт яндексу алиса если не облегает жизнь кодерам?
-
так телеграммка гуглитца в гугле в веб режиме если нет блокировок сайт на зоне РФ (телеграмка запрешена в раше)
-
идея хорошая, я помогу.
когда начинал с кх, сделал свой маленький faq, но он совсем нубский.
щас знаю побольше. и есть кого спросить (сс @madm1ke например)
пингуй, когда начнешь делать! -
может бот запилите для преложения вопроса и его решения
-
ну надо в любом случае базу факапов и факов сначала набрать
и альтинити пнуть кек -
ок
-
что такое альтинити. просвятите плиз. гугл не подсказал. как понимаю это модуль кликхауса так?
-
-
спасибо добрый человек
-
в блоге много интересного
-
ок гляну сп
-
жаль что на анл языке. не идеально его понимаю. я про их блог в альтинити
-
Неделю с ними экспериментирую. Пока результаты отрицательные. Требуется находить запись по ID (один типа UUID, второй String`). Знаю, что это неправильное использование OLAP базы данных. Пробовал индексы `set(0) и bloom_filter(0) GRANULARITY 1. Мне правда не очень понятно, за что отвечает granularity.
┌─version()──┐
│ 19.17.4.11 │
└────────────┘
Edited, гребанное форматирование строк в телеге -
Как я понимаю - granularity указывает через сколько значений order by делать засечку, по которой потом будут искать.
-
И для кейса, когда надо искать запись по ID какое значение является рекомендуемым?
-
дальше имхо, не верьете, пожалуйста
set(0) -- это все значения -- это бесмысленный конструкт, который не рекомендуется, потому что индекс будет размером как столбец, поэтому по столбцу искать дешевле, и тупо индекс умножает размер занимаемый столбцом.
GRANULARITY 1 -- из скольких гранул основного индекса, создавать гранулу индекса.
>когда надо искать запись по ID какое значение является рекомендуемым
да никакое, skip индексы в этом случае практически не помогают никогда. Помогает сделать еще одну таблицу (MV) отсортированную по ID. -
Спасибо, попробую еще c MV.
-
-
Помимо поиска по ID таблица используется для аналитических запросов. Попробовал redis для хранения соответствий id->date, чтобы потом в CH добавить дополнительное условие по date. Но такое решение не понравилось: Redis потребляет слишком RAM; еще одна точка отказа, усложнение на уровне приложения.
- 08 December 2019 (6 messages)
-
-
точно не помню, но зашел сейчас посмотреть, я выставил fs.file-max = 500000 в sysctl и
root hard nofile 500000
root soft nofile 500000
в limits
а в настройках контейнера добавил lxc.prlimit.nofile: 300000 -
ок но я не спец но лучше кратно степени 2 типа не 1000 а 1024 и т.п. так как память сегментируется ос кратно 1-4к байту
-
-
-
- 09 December 2019 (149 messages)
-
Доброе утро всем. а кто нибудь знает что именно означает GRANULARITY ? как для Primary key, так и для skip indexes?
чем GRANULARITY 3 от GRANULARITY 4 отличается вот в этом примере?
https://clickhouse.yandex/docs/en/operations/table_engines/mergetree/#table_engine-mergetree-data_skipping-indexes -
primary key хранит значения ключевых полей каждой n-й строки. Т.е. если index_granularity 8192 а в таблице 16384 строк, то в индексе будет значения только для 2 строй -- 1й и 8193й.
minmax GRANULARITY 3 -- означает что в skip индексе будет сохранено minmax значение для сразу 3х гранул первичного индекса (3*index_granularity строк).
set(1000) GRANULARITY 4 -- означает что в skip индексе будут сохранены 1000 значений 4х гранул первичного индекса (4*index_granularity строк), если уникальных значений больше 1000, то сохранено будет ничего. -
спасибо большое
-
а как работает KILL QUERY SYNC ?
в смысле понятно что оно пытается лочить что-то или как то сигнал в running threads передать, вопрос что блокируется, когда проверяется? -
Заметил, что при DROP большой таблицы CH похоже становится заблокированым - приложения не могут писать в другие таблицы. При этом CPU load и Disk I/O на нуле. В логах вижу такое:
level=error msg="commit error: driver: bad connection
Используемая go библиотека:
digest = "1:499e5c968a671233b5107680bc12a775d10a00662199100eb96dd02e0446fdb8"
name = "github.com/kshvakov/clickhouse"
┌─version()──┐
│ 19.17.4.11 │
└────────────┘
Есть ли способ этого избежать? -
только если к этой таблице в других коннектах идет обращение и блокирует тот кто раньше успел, остальные коннекты ждут
bad connection у вас возникает судя по всему, потому что в go драйвере таймауты выставлены и он не получает ответ
смотрите в нативном клиенте что происходит
SELECT query, query_id, elapsed, rows FROM system.processes WHERE query LIKE '%your_big_table%'; -
сам clickhouse во время дропа нормально доступен
-
Joined.
-
Спасибо! Проверю в следующий раз.
-
Подскажите, плз, верно ли я понимаю, что для таблиц класса ReplacingMergeTree если явно не указывать поле version, то при схлапывании берется любая первая попавшаяся запись. При этом никаких служебных колонок нет, по которым можно найти ту запись, что была добавлена последней.
-
Joined.
-
-
-
последняя запись надо полагать в последнем вставленном парте, а последний парт находится по времени вставки
-
Они же мержатся в конечном итоге. Записи будут в одном парте одинаковые
-
У меня такое же понимание. Пытался найти, как определить из списка записей - какая последняя, не смог. Для себя решил, что прозрачности может только ver добавить, но не уверен. Может кто-то сталкивался.
-
Можно попробовать посмотреть в исходниках. Например зайти со стороны инструкции optimize.
-
Привет!
Никто не сталкивался с такой проблемой - обновились с 19.11 до 19.16 и на репликах начали биться куски таблиц и начались попытки их перевыкачать с других реплик, ошибки типа
Code: 226, e.displayText() = DB::Exception: Marks file '/var/data/clickhouse/data/default/rawlog_shard/tmp_fetch_20191202_222396_222396_0/id.mrk' doesn't exist (version 19.16.2.2 (official build))
Причем если глянуть в system.replication_queue, то в колонке num_tries для некоторых таких попыток число много больше единицы.
Ну и в очереди system.replication_queue оказались десятки тысяч заданий и подобная процедура уже идет третьи сутки. -
есть ли смысл вообще до 19.17 обновляться? Или ролбечится? Или может просто дропать всю реплику и фетчить всё заново?
-
Всем прривет.
А почему селекты могут блокировать новые insert?
Последнее время часто случается, что из-за 1 сложного селекта начинает копиться 30-50 инсертов.
После убийства селекта, инсерты еще потупят минут 5 и проходят. Причем судя по written bytes\memory usage - лочится прям перед записью на диск в одном месте -
-
Там правее в вашем запросе есть ProfileEvents. Среди них есть RWLock. Помониторьте. Может они его ждут.
-
А какой у вас дживек таблицы ?
-
Добрый день. С чем может быть связана ошибка Code: 442, e.displayText() = DB::Exception: There was an error on [<host>:9000]: Code: 442, e.displayText() = DB::Exception: Temporary tables cannot be inside a database. You should not specify a database for a temporary table. (version 19.13.7.57 (official build)) (version 19.13.7.57 (official build))
при запросе
curl --silent 'http://<host>:8123/?session_id=123&user=<user_name>&session_timeout=3600&password=<password>' --data 'CREATE TEMPORARY TABLE p_47_626_1537126630 ON CLUSTER <cluster_name> (rdid String)' ? -
как я понимаю нет временных таблиц можно memory заюзать - см доку https://clickhouse.yandex/docs/ru/operations/table_engines/
-
Distributed за ней ReplicatedMergeTree и есть еще 3 десятка MV которые в summing
-
в след раз как случится посмотрю, спасибо.
А если есть что это значит? -
-
-
INSERT INTO [db.]table [(c1, c2, c3)] FORMAT CSV "tmp/foo.csv"
правельно я понимаю -
если базу перегнать то на яве это заюзал и допилил под себя https://github.com/llofberg/db-copyGitHub - llofberg/db-copy: A simple ETL tool to copy data between JDBC databases etc.
A simple ETL tool to copy data between JDBC databases etc. - GitHub - llofberg/db-copy: A simple ETL tool to copy data between JDBC databases etc.
-
спасибо но нужны только запросы без стронеего по а то я бы кананул на го его
-
Чем не устроил стандартный INSERT ... FORMAT CSV?
-
я не смог найти в документации как в целом эта процедура делаеться
нужно ли сздавать бд а потом вставлять и т.д. -
мне нужен был перегон из postgresql в clickhouse и много данных - но я да так почти и делал простно на движке
-
-
порциями фигачить или через мост jdbc-bridge https://github.com/ClickHouse/clickhouse-jdbc-bridge я просто джавист а вы можете на GOGitHub - ClickHouse/clickhouse-jdbc-bridge: A JDBC proxy from ClickHouse to external databases
A JDBC proxy from ClickHouse to external databases - GitHub - ClickHouse/clickhouse-jdbc-bridge: A JDBC proxy from ClickHouse to external databases
-
https://clickhouse.yandex/docs/en/interfaces/formats/#csv
Но не уверен, что это подойдёт для терабайтного файла. -
да я читал эту статью не могу связать пока все воедино
-
задача состаит в том чтоб все в начале выгрузить в файл а потом из файла залить в новые таблицы
без написания сервиса -
-
тут описан велосипед то что вам нужно но у меня проблемы с интом — https://www.altinity.com/ — там NY taxi и вот "велик" https://clickhouse.yandex/docs/en/getting_started/example_datasets/nyc_taxi/ClickHouse Software And Services — Altinity
Deploy and operate ClickHouse, a lightning fast, open source SQL data warehouse for real-time analytics, time series, and log analysis.
-
спасибо большое
-
вот так пробовали? что не сработало?
pgsql -c "COPY TO STDOUT" | clickhouse-client —progress "INSERT INTO ... FORMAT CSV"
клиент кликхауса сам по идее побъет на блоки записей и все вставит -
Народ, а кто в курсе как именно работает LEFT JOIN в clickhouse?
-
строит hash-map по правой таблице, сканит левую, дописывает строки в результат. если в правой было несколько таких ключе, то для каждого левого вхождения формирует n строк результатов, если вхождений не было - дописывает дефолтами (если join_use_nulls - дефолт NULL, иначе 0/пустая строка/начало юникстайм)
-
join_use_nulls в рантайме можно менять?
вроде SET не ругнулся, но такое ощущение что не воспроизвелось -
См. system.settings после SET join_use_nulls
-
блин я тупой, походу datagrip же через jdbc работает а тот работает поверх HTTP и там join_use_nulls не срабатывает, потому что это "другой коннект"
хотя это же server level а не connection level будет? -
SET в http не работает, если нет именованной сессии
Тут надо использовать SETTINGS join_use_nulls -
спасибо
-
Добрый вечер, коллеги. Генерирую тестовые данные и мне регулярно прилетает на больших обьемах данных ошибка: Cannot parse input: expected ) before: 7587),
Ну там в конце постоянно цифра разная. В чем может быть причина кто-то в курсе? -
версия? values / CSV , текст insert-а?
-
скобки есть в генерируемых данных?
-
временные таблицы не для этого. Они должны создаваться только на инициаторе, потому что они автоматически передаются инициатором на другие ноды.
-
19.13
Cannot parse input: expected ) before: 7587), (\'refcode\',4,1,17587), (\'refcode\',1,1,17587), (\'refcode\',1,0,17587), (\'refcode: (at row 21348)
Вот фул -
4я колонка это Date
-
Дни
-
Всегда на нее ругается
-
Пишу в php используюя либу smi2/phpclickhouse
-
вот рабочее решение для того чтоб перелить данные из postgres в clickhouse
// получение данных из pcs->mailing в формате csv
psql -U postgres -d db -h host.ru -p 5432 -c "COPY (SELECT id, num FROM user) TO STDOUT With CSV DELIMITER ',';" > us.csv
// создаем таблицу
clickhouse-client -h host.ru --query="CREATE TABLE IF NOT EXISTS test.user (id int, num int) ENGINE = MergeTree() ORDER BY (id)"
// записываем данные в таблицу
clickhouse-client -h host.ru --format_csv_delimiter="," --query="INSERT INTO test.user FORMAT CSV" < us.csv -
нет если даты будут то будет не сварение желудка
-
на простых данных да прокатит
-
лучше добавлять кавычки " иначе могут быть проблемы, КХ пытается угадать какие кавычки используются ' или " и будет падение при первой же одинарной кавычке вначале текстового поля.
COPY (select * from crash_test) TO PROGRAM 'clickhouse-client --query="INSERT INTO crash_test FORMAT CSV"' with csv force quote *;
или выключать одинарные кавычки в CH --format_csv_allow_single_quotes 0 -
-
не подскажете, пжт, как указать разделитель при сохранении в CSV? Вместо запятой, чтобы был другой символ?
INTO OUTFILE '/tmp/gg.txt' FORMAT CSV .....? -
clickhouse-client --format_csv_delimiter '|'
select 1,1 into outfile '/tmp/gg.txt' format CSV
cat /tmp/gg.txt
1|1 -
-
-
если на чистом sql то в режиме сессии "SET format_csv_delimiter = ','"
-
хороший вопрос в том смысле что КХ это такая штука которая делает агрегацию лучше всех.
У ва данные за два дня поместятся в ОЗУ ? -
спасибо я учту
-
-
-
видимо вы что-то другое понимаете под словом аггрегация
-
-
Всем привет! С чем может быть связана такая ошибка:
inflate failed: buffer error
IN:INSERT INTO gmc_item_distributed ( gmc_id,item_id,country_code,label_code,updated_at,flag ) FORMAT TabSeparated
Возникает при попытке загрузить файлик ~10мб 300к строк. в другие таблицы всё грузится нормально -
посмотрите на движки SummingMT / AggregatingMT и materialized view. КХ уделает всех в разы.
-
Подскажите пожалуйста, в чем причична такой ошики и как исправить:
Code: 24, e.displayText() = DB::Exception: Cannot write to ostream at offset 2097322 -
то есть, вместо отдельных запросов создавать view с нужными свойствами?
-
Возможно, что клиент закрыл соединение до того как сервер успел ответить.
-
-
предагрегировать данные, чтобы вместо нескольких миллиардов сырых данных, в MV было в разы меньше и они лежали в нужном порядке для запросов.
-
ок, спасибо
-
ну по разному можно сделать, можно сделать что агрегаты будут задублированы на все ноды (я так делаю).
можно сделать шардинг так что не нужна будет финальная агрегация и т.п. -
-
ещё добавлю, что строки при этом все попадают в таблицу. кто сталкивался?
-
есть еще такой вариант, сделать выделенную машину с кучей памяти и nvme и положить на нее только таблицы - агрегаты (репликацией) и ходить туда с риал-тайм запросами
-
что в .err логе КХ ?
-
Можно по хайпить и на optane?
-
если бы у меня до него был доступ)
-
ну так попросите посмотреть тех у кого есть доступ.
-
похоже в коде КХ нету такого <inflate failed: buffer error>
это где-то у вас в приложении / api -
https://github.com/ClickHouse/ClickHouse/issues/412
но в отличии от этого случая проблема встречается на файлах любого размера.DB::Exception: inflate failed: buffer error · Issue #412 · ClickHouse/ClickHouseHi, when inserting to Clickhouse with HTTP transport and gzip (compression level 1), I see a lot of stack traces like the following. They don't happen regularly (sometimes the pipeline keep...
-
-
😬😬😬 таким образом нужно наоборот увеличивать granularity дополнительного индекса , чтобы ускорить поиск ? Как-то в голове не укладывается .
-
-
конечно нет.
-
вам просто не подходят skip индексы, они не для вашей задачи
-
Joined.
-
У меня была идея сделать каскад репласинг мердж три таблиц с партиционированием по дню, месяцу и году соответсвенно
. Сворачиваться будет по одним полям , а людям нужно искать по другим 🙄. Они соедены мердж таблицами , пользователь обращается через них. Соответственно проходит день , данные улетают в месяц и та секция дропается и т.д И это принципиально , чтобы в конце - концов при запросе через какой-то веб им пришло минимальное количество строк , причем последних по дате , и не пришлось бы прикручивать дистинкт, груп бай и тд. Если уж и это не подходит , тогда наверно и кликхаус не подходит 😁 -
товарищи, я пытаюсь воспроизвести бенчмарк вот этого чувака https://tech.marksblogg.com/billion-nyc-taxi-rides-clickhouse-cluster.html . Создаю Distributed таблицу:
CREATE TABLE trips_mergetree_x3
AS trips_mergetree_third
ENGINE = Distributed(perftest_3shards,
default,
trips_mergetree_third,
rand());
И заливаю в нее данные:
INSERT INTO trips_mergetree_x3
SELECT * FROM trips_mergetree;
Дальше у него написано, что кликхаус через некоторое время сам распихает данные по шардам, но у меня все данные остаются на той ноде, на которой я эту таблицу создал. ЧЯДНТ?1.1 Billion Taxi Rides: 108-core ClickHouse ClusterBenchmarks & Tips for Big Data, Hadoop, AWS, Google Cloud, PostgreSQL, Spark, Python & More...
-
при этом, как и в его примере,
SELECT *
FROM system.clusters
WHERE cluster = 'perftest_3shards'
FORMAT Vertical;
возвращает все три сервера -
-
так а что этот селект выдает? Колонки shard_num replica_num?
>у меня все данные остаются на той ноде
в смысле select count() показывает нужно кол-во на ноде-инициаторе? А на остальных нодах 0 строк? -
distributed-таблица вообще показывается только на той же ноде, на которой я ее создал. И дата-каталоги на двух других нодах пустые.
-
на вопросы можете ответить?
-
Row 1:
──────
cluster: perftest_3shards
shard_num: 1
shard_weight: 1
replica_num: 1
host_name: 35.158.138.58
host_address: 35.158.138.58
port: 9000
is_local: 0
user: default
default_database:
errors_count: 0
estimated_recovery_time: 0
Row 2:
──────
cluster: perftest_3shards
shard_num: 2
shard_weight: 1
replica_num: 1
host_name: 18.196.146.211
host_address: 18.196.146.211
port: 9000
is_local: 0
user: default
default_database:
errors_count: 0
estimated_recovery_time: 0
Row 3:
──────
cluster: perftest_3shards
shard_num: 3
shard_weight: 1
replica_num: 1
host_name: 18.184.241.98
host_address: 18.184.241.98
port: 9000
is_local: 0
user: default
default_database:
errors_count: 0
estimated_recovery_time: 0
3 rows in set. Elapsed: 0.002 sec. -
^
-
select count() from trips_mergetree_third c каждой ноды
-
ээээ
-
вообще везде нули
-
т.е. distributed не может запихать данные в таблицы, весь лог КХ должен быть завален ошибками
-
спасибо, судя по всему, почему-то не видит другие ноды
-
сейчас поковыряю
-
в итоге если отключить http-compression, то запрос выполняется валидно
-
go / jdbc ?
-
GitHub - smi2/phpClickHouse: php ClickHouse wrapper
php ClickHouse wrapper. Contribute to smi2/phpClickHouse development by creating an account on GitHub.
-
curl-м попробуйте
-
т.е ограничить курл по времени?
-
нет. я спрашиваю curl-м проблема воспроизводится?
-
-
-
Joined.
-
Спасибо. А примеры такого есть? Таблица, насколько я могу судить, и создается на одной ноде. Ответ об ошибке приходит от другой ноды (если не ошибаюсь от реплики)
-
-
-
вам в гитхабе уже ответили. Вы делаете что-то бессмысленное. Создавайте таблицы например Engine=Memory. Temporary - это тоже Engine=Memory но они для другого.
-
Добрый вечер. Скажите, если в mergetree order by tuple, т е нет индексов и все селекты делаю по партиции целиком, то параметр granularity не имеет значения? На скорость запросов это не повлияет? Просто у меня очень пухлые записи с большими массивами....
-
имеет для многопоточности, если будет одна очень большая гранула, то только один поток будет выполнять запрос. И вроде памяти будет больше жрать для больших гранул.
-
Спасибо!
-
Поиграюсь
-
но вообще mergetree order by tuple это странно. Явно misusage для КХ.
-
У меня просто все выборки по дневным партициям. Это минимальный квант данных получается. Можно добавить индекс внутри дня, но ведь он не будет использоваться, и будет жрать память и скорость на вставке?
-
и сколько строк в одном дне?
-
37 млн, одна строка из массива на несколько килобайт - мегабайт в перспективе
-
Дни регулярно перезаливаются через реплейс партишин
-
Поэтому нарезка по дням
-
ну ОК. я бы оставил как есть -- по-умолчанию, на таких размерах без разницы
-
Спасибо
-
['Query','InsertQuery','FileOpen','WriteBufferFromFileDescriptorWrite','WriteBufferFromFileDescriptorWriteBytes','IOBufferAllocs','IOBufferAllocBytes','ArenaAllocChunks','ArenaAllocBytes','FunctionExecute','CreatedWriteBufferOrdinary','DiskWriteElapsedMicroseconds','InsertedRows','InsertedBytes','ZooKeeperTransactions','ZooKeeperCreate','ZooKeeperMulti','MergeTreeDataWriterRows','MergeTreeDataWriterUncompressedBytes','MergeTreeDataWriterCompressedBytes','MergeTreeDataWriterBlocks','ContextLock','RWLockAcquiredReadLocks']
Все insert стабильно с RWLockAcquiredReadLocks в конце списка
Что это значит? -
Это название. Там рядом колонка со значениями.
-
а что эти значния значат? ms?
-
Там для каждого евента своя шкала
-
сейчас есть один зависший. Ни одно значение в profileEvents не меняется
-
Да, не видно . А perf есть возможность запустить ? Это бы позволило узнать место в коде, на котором вист сейчас.
-
а не ляжет все?
-
У нас когда было на прод. Я снимал - было норм. Все висело на локах, и поэтому по цпу не легло
-
Joined.
- 10 December 2019 (129 messages)
-
Joined.
-
в Materialized Views и Live Views смотрели?
-
-
ClickHouse митап в Москве состоится завтра вечером! 11 декабря в 18:30: https://yandex.ru/promo/clickhouse/moscow-december-2019
Также мы сейчас занимаемся приоритезацией задач по дальнейшему улучшению документации ClickHouse и чтобы сделать это правильно, нам нужна обратная связь от вас. Если готовы помочь нам, заполните, пожалуйста, вот эту небольшую форму: https://forms.yandex.ru/surveys/10014882LinkПриглашаем технических специалистов на митап по ClickHouse. Разработчики системы расскажут о новых функциях и планах, а пользователи — о собственном опыте.
-
None
-
кто поможет — я сделал jdbc мост к посгрезу и хочу установить таблицу в кх как буду-то родную но она на postgreSQL
-
https://clickhouse.yandex/docs/en/operations/table_engines/jdbc/
у вас похоже схема dbms_uri неправильная -
нет, вы будете смеятся но у меня 6гиг озу на кх — думаю в этом проблема как тут описано https://github.com/ClickHouse/ClickHouse/issues/5784 —- так как если глянуть сек С++ но он неможеть выделить блок памяти но я не силен в с++Allocator: Cannot mmap 128.00 MiB · Issue #5784 · ClickHouse/ClickHouse
Hello, i'm getting the error on linux host with 4Gb of RAM and 3.5Gb of data: 2019.06.27 18:02:11.314895 [ 51 ] {b06c9d4e-c769-4162-899f-7843b897b743} executeQuery: Code: 173, e.displayText...
-
причем тут память вы приаттачили ошибку syntax error
-
просто кх тупил и тупо написан код по диагностике — я же правильно все сделал
-
ну, красавчег тогда что все правильно сделал ;)
-
да ты прав но писали кх далеко не боги
-
Коллеги, есть вопрос по расчету нагрузки на сеть при запросах с большим временем отклика между сервером и хостом с которого выполняются запросы (50мс). Порекомендуйте пожалуйста, документ или методику, на что необхожимо обратить внимание, как учитывать компрессию, если для запросов использовать HTTP интерфейс или JDBC? Возможно ли обеспечить многопоточность передачи данных для ответа?
-
Здравствуйте нашел как сделать экспорт данных в native формат но при импорте возникает ошибка
https://groups.google.com/forum/#!topic/clickhouse/Dx0CsFGbk7c
сама ошибка Code: 62. DB::Exception: Syntax error (data type): failed at position 8 (line 1, col 8): -c303-470c-9640-1c1ac80940d9 2388 111
send 1. Expected one of: identifier with optional parameters, function, identifier, nested table, identifier with parameters, end of query -
-
-
Партицирование - разделение таблицы на партиции - некие логические кусочки. Обычно делят по дате лога, например по месяцам или дням. Обычно так делаеют, поскольку в запросе есть фильтр по дате, который позволяет не читать всю таблицу, а начать сразу с нужной партиции
-
-
Он никому ничего не должен😄 Вы указываете в таблице как партиционировать данные, а потом в запросе - как искать. И КХ может увидеть связь - ага, тут такие партиции, а в запросе - указано так. Значит можно не читать всё, а только вот это. Магии нет
-
-
-
спасибо большое попробую
-
-
вопрос, есть же вот эти красные кружочки на приложениях с цифрами Badge вроде.
-
можно для них Clickhouse использовать?
-
хотя нет наверное, там же Update надо будет делать, если прочитал сообщение. :(
-
почему, каунтер может быть результатом сумм ±1
-
Joined.
-
это же все равно UPDATE, а тут с этим не очень вроде :( INSERT и SELECT только.
-
Нет, только инсёрты, а значение - как Select sum(...)
-
надо писать, какое сообщение, какой пользователь посмотрел.
-
я прост боюсь что MySQL не вытянет, ClickHouse по скорости очень хорош конечно, попробую посмотреть в сторону ElasticSearch.
-
Ну, это тоже инсерт - событие "пользователь А посмотрел сообщение Б"
-
вообще то да кстати :)
-
вот не зря все таки обратился :) Спасибо!!!!!
-
-
Можно ли по словарю как-понять , что в таблице есть дубликаты ?
-
Можно. Создаёте бд с типом dictionary. В ней будет таблица с именем словаря. Create database mydict Engine=Dictionary
-
кстати сегодня пробовал
echo "SELECT 1" | gzip -c | curl -sS --data-binary @- -H "Content-Encoding: gzip" - работает
echo "SELECT 1" | curl -sS --compressed --data-binary @- -H "Content-Encoding: gzip" - не работает
в итоге решили без компрессии работать -
Всех приветствую товарищи! кто-нибудь пытался сдернуть данные по jdbc из oracle? падает вот такая ошибка HTTP status code: 500 Invalid or unsupported name for clientInfo., body: Invalid or unsupported name for clientInfo. (version 19.14.6.12)
HTTP status code: 500 Invalid or unsupported name for clientInfo., body: Invalid or unsupported name for clientInfo. (version 19.14.6.12) -
вопрос собственно такой: в какую сторону копать? jdbc, oracle, CH ?
-
мост я допливал на посгреса — у них все на java сыро https://github.com/ClickHouse/clickhouse-jdbc-bridgeGitHub - ClickHouse/clickhouse-jdbc-bridge: A JDBC proxy from ClickHouse to external databases
A JDBC proxy from ClickHouse to external databases - GitHub - ClickHouse/clickhouse-jdbc-bridge: A JDBC proxy from ClickHouse to external databases
-
Проблема в том, что со стороны Java все драйверы по-разному предоставляют информацию о том, как замаппить нативный тип в типы ClickHouse. Видимо, придётся реализовывать "диалекты" (a-ka хардкод для каждого драйвера в отдельности)
-
просто пропатчить, у них нет поддержки диалекта как такого
-
могу выслать мои патчи, попросто там. в личку стучись — пока не буду заливать в их гид так сделал не фуншуй
-
Сделайте PR, смержим
-
ОК
-
Joined.
-
Пожалуйста, подскажите как быстро удаляются временные таблицы?
-
всем спасибо
-
https://github.com/ClickHouse/clickhouse-jdbc-bridge/issues/2 - тут описаны похожие симптомыAdd support for Oracle JDBC · Issue #2 · ClickHouse/clickhouse-jdbc-bridge
Currently without any code modification it is hard to work with Oracle database. Following problems are encountered: Can't pass login and password information to connection. Oracle JDBC req...
-
Temporary? По концу сессии. Есть параметр session_timeout=60, т.е. если сессия неактивна 60 сек. то конец.
-
Привет
а как проще всего отреплицировать новую машинку с нуля? -
Спасибо!
-
В словаре дубликаты? Там не может быть дубликатов, перезатирается по ключу.
-
вроде нашел доку
-
-
Коллеги, добрый день! Подскажите, пожалуйста, можно ли в CH сделать запрос, который вернет набор дат в определенном формате, чтобы с ними можно было сделтаь join?
-
кстати если вдруг кто-то следит за этой эпопеей или в будущем столкнулся с такой же проблемой и нашёл это в поиске , то отказ от сессий решает вопрос с нерабочей компрессией (и кстати со скоростью выполнения инсертов)
протэгаю текстом ошибки:
inflate failed: buffer error -
Joined.
-
-
но возможно тебе подойдут и более простые функции
-
мне в первую очередь нужна функция, которая сможет сгенерировать N строк, например, я хочу получить все часы в сутках от 00:00 до 23:00
-
-
спасибо, посмотрю
-
Всем, добрый день! Подскажите, как в click House сделать ранжировку по показателю в группе?
-
select .. from ... order by group и при создании таблицы указать тот же order by
-
select toDateTime('2019-01-01 12:00:00') + interval number hour from numbers(100);
SELECT arrayMap(x -> addHours(toDateTime('2019-01-01 12:00:00'), x), range(100))
select arrayJoin(arrayMap(x -> addHours(toDateTime('2019-01-01 12:00:00') , x ), range(100))); -
Example of emulation of rank function with arrayEnumerateUniq.
Example of emulation of rank function with arrayEnumerateUniq. - rank.txt
-
Спасибо!
-
файл в native нечитаемый, у вас на картинке похоже на TSV
$ clickhouse-client -q "select * from XS format Native" > xx
$ cat xx
AInt64AInt64AInt64AInt64AInt64AInt64AInt64
clickhouse-client -q "select * from XS format Native" | clickhouse-client -q "insert into XS format Native" -
в итоге пришел в такому результату
clickhouse-client --query="SELECT id,m.ids AS uid,time FROM a LEFT JOIN mg AS m USING (id) SETTINGS join_use_nulls = 1 FORMAT Native" > a.native
clickhouse-client --query="INSERT INTO test (id,uid,time) FORMAT Native" < a.native
но как я понимаю можно сделать передачу через | ?
тогда сразу вопрос а получиться ли так передать 500 гб данных если оперативы 32 гб? -
>но как я понимаю можно сделать передачу через | ?
да
>тогда сразу вопрос а получиться ли так передать 500 гб данных если оперативы 32 гб?
да
а через remote() не проще ? -
select * from remote(.....)
insert into function remote(host, db, table) select .... from local -
-
спасибо огромное за помощь !!!!!!!!!!!
-
не прокатит вроде как так человеку нужно скрестить разные субд а под это нужно мострячить мост
-
вы слезайте уже с тяжелых наркотиков.
-
кто поможет? хочу форматирование ошибок а то не читальная помойка текста
-
о боги! это можно дергать insert into function remote? какие подводные камни при этом есть? Гуглить пробовал, не получалось найти и намека на такой функционал
-
это в принципе даже документировано, просто очень неявно и без примеров. Подводных камней нет. Есть в тестах (в смысле тестируется автотестами).
-
спасибо, как же здорово, что месяц вашей тишины завершен
-
Joined.
-
Joined.
-
Сделай для начала 1 рабочий запрос select * from jdbc(first_table)
-
Потом на него наворачивай кусками
-
есть уже то, я через мост jdbc — 2 дня пилил его
-
так то знаю
-
хотел сразу "лепота"
-
-
Подскажите плз. Есть tableA и tableB, tableB является упрощенной версией tableA, туда просится Matview, но пока я живу в режиме ручной вставки в эту таблицу. Все таблицы реплицированы. Если я сейчас включу matview на вставку из tableA в tableB, не возникнет ли каких то неожиданностей с репликацией? Т.е. нормально ли себя ведет реплицированная таблица, в которую пишет matview?
-
>Т.е. нормально ли себя ведет реплицированная таблица, в которую пишет matview?
нормально. -
@Krashuevina вы хоть не пишите с ошибками в доке - у вас JDBC (....) не работает, а верно в нижнем регистре jdbc(...) — я все как в доке делал и дров наломал, 1 день рабочий убил
-
Я буду благодарен если вы укажете, где ошибка, чтобы мы могли сэкономить время остальным пользователям.
-
вот в допиленном jdbc мосту (у меня посгрес не получался с ip в url — но это другая тема)
пока так все нужно в нижем регистре
это работает (после моего патча моста)
select * from jdbc('remote_pg_data_center', 'kakunin_dc_data_tmp', 'monitor_exec') as monitor_exec;
а это матерится
select * from JDBC('remote_pg_data_center', 'kakunin_dc_data_tmp', 'monitor_exec') as monitor_exec;
код ошибке
Code: 46, e.displayText() = DB::Exception: Unknown table function JDBC. Maybe you meant: ['jdbc','odbc'] (version 19.17.4.11 (official build))
стек ошибки — если нужно скину позже -
Код ошибки 46 прилетает от сервера ClickHouse. В этот момент вызова к постгресу через мост даже не происходит. CH не находит у себя функцию с именем "JDBC", и сообщает об этом.
Если вы видели где-то в документации запросы с JDBC (UPPERCASE), то это относилось к движку таблиц. https://clickhouse.yandex/docs/ru/operations/table_engines/jdbc/ -
это у меня вообще не смогло выполниться — придирается что нужно приписать AS или Primary key и т.п
CREATE TABLE jdbc_table ENGINE JDBC('jdbc:mysql://localhost:3306/?user=root&password=root', 'test', 'test') —— это вообше не сработало у меня на посгресе -
да, тут вижу косяк, пропущено "=" между ENGINE и JDBC.
-
вообще усвительнось к регисту мне не понять — всем базам пофигу на регистрам - нужно не делать чусвительность
-
да косяк но и с = и без —- не катит у вас jdbc вагон проблем и тесты заваливаются в ошибки
-
это у вас от незнания. Все базы чувствительны к регистру, просто они приводят SQL литералы либо в нижний регист либо в верхний.
Алексею нравится camelCase поэтому в КХ так сделать не получится. -
привет, при попытке соединения с кликхаусом, поднятым в докере из yandex/clickhouse-server получаю
requests.exceptions.SSLError: HTTPSConnectionPool(host='localhost', port=8123): Max retries exceeded with url: /?database=luna_test&max_threads=3 (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'ssl3_get_record', 'wrong version number')],)",),))
подозреваю, что проблема в разных версиях ssl, подскажите как проверить это и исправить, спасибо -
проверь свои ключи ssl ты наверно не скорировал хранилище ключей для докеров. но я не профи. лог смотри там больше ошибок должно быть
-
а че за хранилище, есть где почитать от этом?
-
я джавист у меня все по другому . там своя песочница но должна быть место защищеное только под рутом зависит от реализации но или в /opt или /var. я не профи в докерах
-
ладно забей я подожду ответа от поддержки завтра)
-
https выключен по умолчанию.
Порт там 8443 !
Естественно нужны сертификаты и ключи /etc/clickhouse-server/server.crt /etc/clickhouse-server/server.key /etc/clickhouse-server/dhparam.pem -
Joined.
-
Спасибо, а где про это подробнее почитать? Ни в докер-хабе, ни в документации ничего про это не нашёл
-
даже не знаю, когда мне понадобилось все было очевидно прямо из /etc/clickhouse-server/config.xml
-
Это внутри контейнера?
-
вам вообще зачем https и зачем контейнер?
Ваши вопросы вообще не имеют отношения к КХ.
Сертификат надо либо сгенерить самоподписанный, либо купить. Конфиг кх лучше монтировать с хоста, либо директорию с сертификатами смонтировать с хоста и изменить пути в конфиге. -
Чтоб гонять тесты; https чтоб не переписывать конфигурацию специально под тесты (хотя может проще уж переписать)
-
могу дать в личку чат докеров спецов и девопсеров . а вообще не советую кх в докер. в докеры хорошо все ПО без состояния типа тупые микросервисы к бд. а бд жирные и прожоливые и в докерах будет одни минусы
-
смысла нет, все равно придется отключить полную проверку, чтобы работало с самоподписанным сертификатом
-
если тестить не по детски то нужно зоводит кластер из зукипера и гонять терабайты по сетке
-
-
Date as a number in INSERT VALUES may fail or slow down · Issue #8129 · ClickHouse/ClickHouse
Seems some php libs inserts Date as a number in Values. create table vtest(A String, B Int64, C Int64, D Date) Engine=Memory; 19.15.5.18 -- fails if number of values is high clickhouse-client -q &a...
-
🙏
-
Я разбил сохранение на пачки по 1000 и проходит безукаризненно
-
т.е. проблема в нестандартном 17587 вместо '2018-02-25'
в TSV например 17587 вообще не прокатывает -
Ну у меня постоянно на разных цифрах выпадает. Именно при записи в колонку Date, а я туда пишу количество дней, как в доке указанно
-
ммм, это где указано что надо писать Date в днях?
-
>Ну у меня постоянно на разных цифрах выпадает
что значит на цифрах???
КХ ожидает '2018-02-25' -
Ну я в доке увидел
> A date. Stored in two bytes as the number of days since 1970-01-01 (unsigned).
И начал. В итоге то оно верно сохраняет дату -
Но иногда выпадает на большом количестве данных
-
эээ. Это раскрыта внутренняя кухня. Но это неправильно. КХ завтра может начать совсем по другому хранить
-
Вас понял, значит мой косяк. Переделаю завтра на строки
-
- 11 December 2019 (243 messages)
-
-
Joined.
-
Приветствую, а можно в кликхаусе сделать dry run для запроса? Чтобы он не выполнялся?
-
И что бы что?
-
Чтобы он просто не выполнился но в логе был
-
Просто я помню что вроде использовал это когда смотрел альтеры на удаление когда оно появилось
-
просто сделай условие типа select ... where 1=0
-
По моему была опция, но видимо меня мозг обманывает
-
Всем привет!
Вопрос к знатокам по JSONEachRow формату.
Минимальный пример:
CREATE TABLE test
(
`id` Int64,
`price` Decimal32(6)
)
ENGINE = MergeTree()
ORDER BY id
Ok.
2a4d210308fc :) insert into test values(1, '0.123');
INSERT INTO test VALUES
Ok.
2a4d210308fc :) insert into test format JSONEachRow {"id": 1, "price": "0.123"};
INSERT INTO test FORMAT JSONEachRow
Exception on client:
Code: 27. DB::Exception: Cannot parse input: expected , before: "0.123"};: (at row 1)
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 19.17.2 revision 54428.
Почему CH не может распарсить decimal из строки, если используется JSONEachRow-формат, но при обычном inserte может? -
респект выражаю яндексу — так навернуть простой select — это круто, можно целую книгу написать о кх селекте — я про это https://clickhouse.yandex/docs/ru/query_language/select/
-
Joined.
-
В вашем любимом постгресе select такой же простой: https://www.postgresql.org/docs/current/sql-select.html
-
о, ну полистайте на досуге, прежде чем набрасывать
https://dev.mysql.com/doc/refman/8.0/en/select.html -
хуже, мне понравился "бантик" ANY JOIN — яндекс не просто тень гугла...
-
-
Довольно стабильно. В любом случае всегда можно перекинуть ноду из докера в "голое железо".
-
-
Гоняли на разных нагрузках, проблем замечено не было. Главное, чтобы ты понимал и умел в докер, тогда проблемы не будет :)
-
Доброго дня. Подскажите пожалуйста по паре моментов. Начал изучать тему time series с того, что послушал доклад про timescaledb. Потом и про clickhouse узнал. Для timescaledb есть штука под названием streamdb. Идея в том, чтобы иметь запросы которые "довычисляются" на вставляемых данных. Это очень заинтересовало. 1.Хотелось бы узнать есть ли такая же возможность в Clickhouse (чтобы дообрабатывать только по новым данным а не пробегать всё каждый раз сначала)? 2.И более общий вопрос по аналитике timeseries. Задача в том, чтобы сделать что-то в духе alerting'a и все эти аналитические запросы это круто и быстро, но текущая задача моя это отслеживать по определённым фильтрам появление ситуаций по которым нужно делать alert + продолжать alerting с обновляющейся картиной того как всё плохо. Есть ли какой-то инструментарий в аналитических БД, который как раз после загрузки нового чанка данных, позволяет понять, что грубо говоря появились новые алерты или они обновились? Или в любом случае это ручками нудно будет делать этот diff (выгружать стейт до загрузки обновлений, потом запрашивать после и сравнивать)
-
1. Materialized View. Select в запросе как раз использует вставляемые данные.
2. Live View возможно подойдёт https://www.altinity.com/blog/tag/Live+Views -
Спасибо огромное.
-
ну если вы бы еще немного времени убили, Вы бы поняли, что JDBC(...) и jdbc(...) несколько разные вещи. как пример запрос:
create table jdbc.category engine = JDBC('datasource://postgresql', 'public', 'category')
as
select * from jdbc('datasource://postgresql', 'public', 'category');
JDBC - указывается в качестве энжина для таблицы, а jdbc - как указатель на то, что from берется не из CH а обращается к коннектору, ну т.е. это табличная функция -
Спасибо вам за отзыв
-
спасибо за просвящение
-
И ещё нубовский вопрос: самый лучший ликбез для входа в clickhouse? Это доки или навскидку есть какая-то статья самая хорошая? Если же такого явно нет, то извиняюсь: сам буду искать.
-
вот это почитай https://www.altinity.com/ClickHouse Software And Services — Altinity
Deploy and operate ClickHouse, a lightning fast, open source SQL data warehouse for real-time analytics, time series, and log analysis.
-
Доки и блог Altinity, пожалуй
-
мы сами на этом убили достаточно много времени, пока не зашли в гит репозиторий коннектора, где все более-менее ясно описано
https://github.com/ClickHouse/clickhouse-jdbc-bridgeGitHub - ClickHouse/clickhouse-jdbc-bridge: A JDBC proxy from ClickHouse to external databasesA JDBC proxy from ClickHouse to external databases - GitHub - ClickHouse/clickhouse-jdbc-bridge: A JDBC proxy from ClickHouse to external databases
-
Спасибо
-
Joined.
-
-
-
Только явно в DDL указать для каждого столбца CODEC(None)
-
или желаемый кодек
-
ребят, подскажите, может кто знает:
есть такой замечательный продукт от JetBrains как DataGrip (впрочем любая их ide)
там есть поддержка CH из коробки, и по дефолту скачивается драйвер 0.1.50 вроде как последний. все хорошо, запросы выполняются, но есть ряд ограничений при написании запросов, и мне хотелось бы понять - проблема в драйвере, или в самой IDE? -
Интересно а видео с сегодняшнего митапа будут доступны?
-
каких именно ограничений?
-
-
-
-
да вроде все ок с диалектами, иначе тот же toStartOfMonth(invoice_creation_date_time), который до джойна - не понимал бы
-
-
может я не совсем понимаю, но куда уж явнее?
-
-
-
-
-
datagrip требует указания all/any
-
-
-
-
-
Раньше они точно были обязательными. ANY вернет только одну (первую попавшуюся) связанную строчку, а ALL все
-
Join (SQL)
A join clause in SQL – corresponding to a join operation in relational algebra – combines columns from one or more tables into a new table. ANSI-standard SQL specifies five types of JOIN: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER and CROSS.
-
спасибо большое, что бы я без этого сообщения делал...
только вопрос несколько в другом, не находите?
1) CH - не реляционная БД, хоть синтаксис и схож
2) в статье ни слова про all/any join
3) если бы я не знал, что такое джойны, я бы не спрашивал про отличительные особенности -
в доке описано, и результаты запроса будут значительно отличаться
-
-
Цитирую:
"Соединяет данные в привычном для SQL JOIN смысле." -
спасибо
-
Доки, конечно, не всегда успевают, но данное место там очень давно есть.
-
фишка в том, что в доке описано, что просто join тоже должен работать, а в IDE - подсвечивает синтаксис, при этом, сам запрос выполняется
-
незачто, Станислав ссылку прислал выше, именно там это все
-
-
разработчики датагрипа к разработчикам кликхауса не имеют никакого отношения :)
Раньше в кликхаусе ANY|ALL были обязательными, видать в датагрипе не успели подправить синтаксис еще -
ну так по доке просто join - это inner join, а не left join
-
Или я не понял, на что ругается?
-
ну к этому выводу я тоже пришел, осталось понять, описание синтаксиса, хранится в драйвере, или это полностью в руках JB?
-
Да, не вижу...
-
и у меня в запросе не просто join а left join а ругается на отсутствие any/all
-
Ясно, таки не увидел.
-
Если я правильно понял доку, по-умолчанию - ALL
-
-
гайз, есть вопросик небольшой вопросик
у меня есть большая таблица(10ккк), мне нужно перелить эти данные в аггрегирующую
если я сделаю insert - select, будут ли проблемы с памятью или что-то похожее ? Спасибо -
-
-
Привет всем. Подскажите, плиз, как достать из массива максимальный элемент?
-
max(arrayJoin(arr)) подойдет?
-
arrayReverseSort(arr)[1]
-
интересно что быдет быстрее )
-
n log(n) же
-
Странные задачи не всегда имеют оптимальное решение :)
-
-
-
там есть ограничение на размер массива, так что небольшие скорее всего
-
так а за какое время максимальный эллемент в не отсортированном списке можно найти еще?
-
-
-
За O(N) ?
-
-
-
Просмотрев все элементы подряд?
-
Идёшь в цикле и сравниваешь с текущим максимумом
-
-
-
Joined.
-
Ребята, всем привет!
Вчера возник вопрос, хочется понять истину: имеем в таблице поле, означающее тип события. Типов ограниченное число, но постоянно появляются новые. Стоит вопрос - в каком виде хранить в CH. Вариантов 3: int'ом, string'ом, enum'ом.
Enum отбрасываем, т.к. альтеры делать вовремя не имеем возможности. String у int'а выигрывает удобством дальнейших запросов к статистике (про механизм словарей знаем, но кажется, что они тут некоторым оверхедом являются)
Вопросов 2:
1. при дефолтных настройках, будет ли у string'a сильный проигрыш по объему на диске? Схлопываются ли в рамках партиций одинаковые значения в колонках?
2. планируется много запросов, где данное поле будет фигурировать в where. Есть ли выигрыш по скорости у int'a при фильтрации?
Заранее спасибо за ответы -
LowCardinality(String)?
-
Это да, просто интересно, как это работает без LowCardinality (надо ли переделывать и переписывать старые таблицы)
-
это покрывает все ваши кейсы. Если интересует именно стоит ли переходить со старого варианта, то думаю да, но проще взять данные за какой-то период да проверить.
-
https://github.com/ClickHouse/ClickHouse/issues/936
а эту ишуёвину зарешали?
хочу добавлять столбец в табличку, реплицируемую двумя способами (через репликатед мерж три и дистрибутед таблички поверх)
предлагается добавить в мерж три столбец, а дистрибутед пересоздатьalter table via distributed table is not working · Issue #936 · ClickHouse/ClickHouseHello, I'm not sure if this a bug or not but based on documentation: "INSERT and ALTER are replicated" Having this in mind I'm expecting the following scenario is ...
-
лениво вчитываться, но уже давно используем ALTER на distributed. Добавляете в исходнуую таблицу, потом в distributed
-
Отлично, но он на меня кодом Латвии ругается
ServerException: Code: 371.
DB::Exception: There was an error on [<hostip>:9000]: An error occured before execution: Code: 371, e.displayText() = DB::Exception: Table 'my-tablename' is replicated, but shard #1 isn't replicated according to its cluster definition. Possibly <internal_replication>true</internal_replication> is forgotten in the cluster config.
А в документации так "<internal_replication>true</internal_replication><!-- Не обязательно. Записывать ли данные только на одну, любую из реплик. По умолчанию, false - записывать данные на все реплики. -->"
я во все реплики хочу данные писать -
Вы делаете ALTER на distributed таблице с опцией ON CLuster? Если без ON CLuster работает?
-
ага, on cluster, только у меня спотычина еще на базовой таблице происходит. Может, if not exists убрать
-
а шард 1 сколько реплик?
-
Таблица - значения телеметрий от устройств. Есть столбец с названием метрики. Сценарий такой же, как у вас - могут появляться новые метрики, но общее количество достаточно небольшое (сейчас 22). В тестовой таблице 400млн строк, распределение метрик неравномерное, есть метрики с 200млн записей, есть с 1млн.
1. Тип метрики String, столбец в сжатом виде - 17Мб, в распакованном - 3,8гб.
Если тип LowCardinality(String) - в сжатом виде 1.7Мб, в распакованном - 377мб.
2. SELECT COUNT() с фильтром по метрике:
String: Elapsed: 4.983 sec. Processed 394.41 million rows, 7.29 GB (79.15 million rows/s., 1.46 GB/s.)
LowCardinality: Elapsed: 1.609 sec. Processed 394.41 million rows, 395.26 MB (245.07 million rows/s., 245.60 MB/s.) -
3 реплики, шард единственный
-
select * from system.clusters? Если много, то нужен лишь тот где задействована таблица
-
C int'ами сравнения нет, LowCardinality полностью устроил, жертвовать удобством и руками работать со словарями не захотелось.
-
[
('clustername', 1, 1, 1, 'x.x.x.65', 'x.x.x.65', 9000, 0, 'default', '', 0, 0),
('clustername', 1, 1, 2, 'x.x.x.66', 'x.x.x.66', 9000, 0, 'default', '', 0, 0),
('clustername', 1, 1, 3, 'x.x.x.67', 'x.x.x.67', 9000, 1, 'default', '', 0, 0)
] -
Без ON CLuster работает? так как если у вас у вас один шард, Запрос ALTER должен отреплицироваться внутри шарда.
-
Ничоси! Сработало
-
Прямой эфир митапа будет?
-
-
спасибо
-
спасибо
-
Спасибо огромное! То что надо.
-
Может ли новый clickhouse-copier не работать со старыми версиями кх?
Пользуюсь первый раз, ловлю ошибку. clickhouse-copier v 19.17.5.18
2019.12.11 15:25:19.670784 [ 1 ] {} <Trace> Connection (X.X.X.X:9000): Connected to ClickHouse server version 19.15.2.
2019.12.11 15:25:19.724865 [ 1 ] {} <Error> ClusterCopier: Will retry: Code: 393, e.displayText() = DB::Exception: There is no query, Stack trace:
0. 0x562835c6d690 StackTrace::StackTrace() /usr/bin/clickhouse
1. 0x562835c6d465 DB::Exception::Exception(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) /usr/bin/clickhouse
2. 0x562835989a17 ? /usr/bin/clickhouse
3. 0x562838fbd0f9 DB::Context::getSampleBlockCache[abi:cxx11]() const /usr/bin/clickhouse
4. 0x5628390579ec DB::InterpreterSelectWithUnionQuery::getSampleBlock(std::shared_ptr<DB::IAST> const&, DB::Context const&) /usr/bin/clickhouse
5. 0x562839002685 DB::InterpreterCreateQuery::createTable(DB::ASTCreateQuery&) /usr/bin/clickhouse
6. 0x562839004975 DB::InterpreterCreateQuery::execute() /usr/bin/clickhouse
7. 0x562835db72b4 DB::ClusterCopier::dropAndCreateLocalTable(std::shared_ptr<DB::IAST> const&) /usr/bin/clickhouse
8. 0x562835dc5962 ? /usr/bin/clickhouse
9. 0x562835dc8a98 ? /usr/bin/clickhouse
10. 0x562835dc9bec ? /usr/bin/clickhouse
11. 0x562835dd0f58 DB::ClusterCopier::process(DB::ConnectionTimeouts const&) /usr/bin/clickhouse
12. 0x562835daa734 DB::ClusterCopierApp::mainImpl() /usr/bin/clickhouse
13. 0x562835bb4df2 DB::ClusterCopierApp::main(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) /usr/bin/clickhouse
14. 0x562839d34e98 Poco::Util::Application::run() /usr/bin/clickhouse
15. 0x562839d4b5de Poco::Util::ServerApplication::run(int, char**) /usr/bin/clickhouse
16. 0x562835da7760 mainEntryClickHouseClusterCopier(int, char**) /usr/bin/clickhouse
17. 0x562835ba9a7d main /usr/bin/clickhouse
18. 0x7f0804880b97 __libc_start_main /lib/x86_64-linux-gnu/libc-2.27.so
19. 0x562835c131ca _start /usr/bin/clickhouse -
Может подскажете : А если вдруг захочется сделать LiveView над MaterializwdView то будут ли проблемы?
-
Я пока не пробовал Live View, но предполагаю, что они работают аналогично MV. А каскадные MV относительно недавно наконец-то реализовали. Так что должно нормально работать, но надо потестить.
-
Спасибо
-
arrayReduce('max', arr)
-
-
перегружать
-
спс
-
Я только по Live View не понял одно: Он будет хранить все версии или последнюю/ние?
-
Только последнюю.
-
подскажите, что-то дополнительное необходимо конфигурировать для настройки автоудаления партиций?
сконфигурировал так, но автоудаление не работает:
`month` Date DEFAULT toDate(date)
TTL month + toIntervalDay(25)
ClickHouse server version 19.16.3 revision 54427 -
-
нужно именно автоудаление партиций? или удаление записей старше 25 дней? TTL умеет и то и это. Удаляется раз в сутки.
-
Проблема решилась. В конфиге с задачей к копиру ссылался на MV. Нужно указывать именно имя таблицы, например '.inner.mv'.
Вообще, если mv создан нормально, то такой проблемы не встретите) -
не принципиально
-
вот это да (удивление)
-
мне нужно, чтобы это работало :)
-
почему это удивительно, в чём разница механизмов?
-
дроп партиции стоит 0, удаление записей стоит очень дорого.
Дроп партиции сносит партицию целиком, т.е. ждет пока все записи в партиции достигнут over TTL, удаление записей точечно мержем удаляет некорые записи из партиции. -
тогда удаление партиции нужно
-
MergeTree now has an additional option ttl_only_drop_parts
-
для aggregatingmergetree тоже отработает добавление параметра?
-
для все движков семейства
-
если я правильно понял - параметр влияет только на способ удаления устаревших данных?
-
да
-
как быть с тем, что у меня не работает это автоудаление в принципе?
-
или я чего-то не понял?
-
ClickHouse/ClickHouse
ClickHouse is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Тогда не понимаю чем это отличается от Materialized view, только тем что оно лишь в памяти хранится?
-
Добрый День. К сожалению поздно узнал про данную встерчу.
Материалы с митапа выкладываться будут?
Можно будет как-нибудь их получить, если ты не сотрудник яндекса? -
А есть трансляция?
-
Детально про Live View можете прочитать здесь https://www.altinity.com/blog/tag/Live+Views.
Одно из основных отличий это поддержка новых WATCH запросов. -
Я записался но будильник не сработал ((((
-
А можно пойти на встречу за тебя, представившись Сергеем Степановым? ))))
-
Хрен! Я опоздаю ))) Но буду позже )
-
Да, видео на YouTube, слайды на GitHub
-
ОКей. Спс. Буду ждать ссылки
-
А так вообще можно? Использовать обычные аггрегации в движке AggregatingMergeTree? 🤔
min(created_date) AS min_created_date, -
Joined.
-
Joined.
-
https://www.youtube.com/watch?v=mUawpkaObJA
гоу на Московский Митап =) в прямой эфирClickHouse митап МоскваПродолжение: https://www.youtube.com/watch?v=16ukmxo0HOI
-
первая тема походу будет вообще огонь про прогнозирование временных рядов
-
записывался на него даже :( но времени совсем нет сходить, а тема точно 🔥
-
Joined.
-
у меня чот не работает (((((((
-
-
Прямая трансляция ClickHouse митапа в Москве: https://www.youtube.com/watch?v=5cAf6s2Q4iE
-
None
-
не работает
-
извините что не в тему, как выключить уведомления при смене темы на канале ?
-
-
-
А запись будет?
-
-
а что одинаковые ссылки ? ))))))
-
надо в Канал зайти и там другая ссылка будет
-
Кажется еще и тем что у него нет проблем блочного хранения как у MV. Мержится все независимо от блоков и тп.
-
Вопросы из чата можно задавать?
-
лучше в youtube
-
-
-
create table test_table
( x Int64,
cnt UInt32,
min_ts SimpleAggregateFunction(min, UInt64) ,
max_ts SimpleAggregateFunction(max, UInt64)
engine = AggregatingMergeTree() order by x;
insert into test_table values (1,1,1,1);
insert into test_table values (1,1,2,2);
optimize table test_table final;
select * from test_table; -
хуже) чат отключен, да и сама трансляция уже тоже)
-
всё что связано с яндексом, всегда с особенностями, вот например если не сказать, что нужно это закрепнуть вместо неработающей ссылки
-
то оно и не закрепнется)))
-
кто не ошибается, тот ничего не делает. А Яндекс делает очень много.
-
-
-
@blinkovivan трансляция подвисла.
-
Новая ссылка: https://www.youtube.com/watch?v=5cAf6s2Q4iE
-
я сглазил, простите :(
-
сглазун
-
еще ссылочки с примерами программ тестовых и скриптов ждемс на гитхабе
-
каких именно скриптов/программ?
-
демострашек ваших. вы же писали проги на конференцию. вот их. или хотя бы ваши слайды
-
конец или еще будут доклады?
-
смотря сколько заплатишь. шутка
-
-
А какую файловую систему лучше всего выбрать для CH?
-
ext4 в доке на первой странице написано.
-
трансляция лаганула на вопросе про кубернетис, почему очень легко потерять данные в кубернетис?
-
-
слайды все тут живут: https://github.com/ClickHouse/ClickHouse-presentationsClickHouse/clickhouse-presentations
Presentations, meetups and talks about ClickHouse. Contribute to ClickHouse/clickhouse-presentations development by creating an account on GitHub.
-
Лёшин — последний
-
@alexanderzaitsev
-
спасибо
-
Потому что он изначально под stateless заточен был
И даже сейчас volumes и volume claim надо уметь пользоваться
А resize volume все еще не поддерживается вроде бы -
поддерживается, начиная с определенной версии, но есть нюансы
-
:-) как и в любой фиче кубов
-
Joined.
-
А подскажите пожалуйста - где можно взять docker image со свежей версией ибо как я понял на dockerhub версия 19.1.13 (или только билдить из сорсов?), которая не особо свежая. И вообще по жизни какую лучше сейчас юзать версию, чтобы она была не особо сырой но и не совсем старой.
-
кх в докере тормозит сильно :(
-
-
-
ничего не тормозит, с чего бы вдруг. Просто надо волумы с хоста монтировать.
-
Спасибо, извиняюсь, не туда смотрел выходит.
-
вот тут да, к своему стыду я не помню как я делал, через волумы или нет ((((((((
-
а сколько примерно падение производительности если все правильно настроить в докере через волумы использовать в докере и напрямую на хосте?
-
Имеется ввиду с хоста а не по сети? Или имеется ввиду с хоста а не из фс контейнера?
-
кх миллион файлов может за минуту сгенерить и удалить. Конечно на виртуальных фс докера тормозит.
-
почти нисколько. это практически равноценно запуску на хосте
-
2е
-
Нет ну так то да, конечно будет тормозит. Спасибо за ответ.
-
mysql через volume ставил, конкретно так тормозил в докере.
-
clickhouse ставил, около миллиона записей, и там count() считался несколько секунд. но да, не помню как подключал (((
-
перепроверю, отпишусь. спасибо большое!!! это радует, что падения производительности не будет.
-
Мож там настройки были дефолтные какие-то были или памяти мало выделено?
-
может, еще потестирую обязательно.
-
Не на маке случайно? 🙂
-
не зная конфигурацию сервера, дисков, параметров настроек хоста и докера сложно сказать что может быть причиной
-
нет VDS
-
т.е. вы запускали докер внутри VDS и сравнивали работу как в самом VDS, так и из докера?
-
Вообще конечно интересная тема. Потому что слышал и про постгрес в докере мол тормозит и что нужно там macvlanы всякие использовать, но и они не идеальны. Но тут наверное нужно конкретно экспериментировать и понимать что и где как сконфижено, либо может есть доклад какой с этим сравнением
-
да, есть два VDS, один помощьнее, там процев побольше, памяти побольше, SSD. запускал в докере, все сильно тормозило и сейчас выделили отдельный VDS, миинимум характеристики 1проц. 1гиг. SSD на нем установлен Clickhouse в Ubuntu все летает )
-
а вот в том, который первый - пробовали запустить в самом VDS без использования докера?
-
нет, там куча всего, не стал ставить, но он мощный по сравнению с этим вторым. к нему претензий нет вообще.
-
к конфигурации и работе.
-
но там я не хотел лишние программы ставить и все такое.
-
поэтому в докер завернул
-
а тут под это дело специально выделили там программа забирает данные в mysql, из нее в Clickhouse переливает.
-
так у вас может не докер тормозил, а сам VDS. Может и на самом VDS у вас всё тормозило бы
-
с Clickhouse метрику смотрим, все ооооочень быстро ) по сравнению с Mysql это просто космос )
-
может быть, поэтому выделю VDS и на нем потестирую на хосте и в докере.
-
для чистоты эксперимента.
-
Вкратце, потому что кубер надо уметь готовить. У нас несколько клиентов с кликхаусом в кубере умудрились потерять данные, но никто не терял данные вне кубера. Это не проблема кликхауса, это отсутствие понимания и опыта, как работать с stateless в кубере. Если он у вас есть, то вы справитесь и с кликхаусом. Оператор делает все проще и помогает избегать многих ошибок, но он не может научить. Тут либо надо шишек понабивать, либо кубер постепенно дойдет. Работа в этом направлении ведется и не малая
-
Artemeey
"Можно ли сделать attach партиции с одинаковой структурой, но другим кодеком сжатия?"
Да, можно. Для таблицы не важно, с каким кодеком данные уже были записаны. Кодек, который прописан в таблице, определяет, как записывать новые данные. А при чтении поддерживаются любые кодеки, с которыми данные фактически записаны. - 12 December 2019 (219 messages)
-
Кто-то спрашивал, поддерживает ли формат Template пропуск строк после ошибки парсинга (настройки input_format_allow_errors_...). Да, поддерживает.
-
Спасибо!
-
Joined.
-
-
-
Попробуй - расскажешь
-
Смотрю на тарифы яндекс облака (под кликхаус). Как ни кручу параметры, это решение оказывается дороже в разы, чем сервера в аренду. intel broadwell 16vcpu 64gb и 1тб сетевого ссд = 570 евро, в онлайне можно взять значительно более мощное железо в аренду (тот же проц, но 2 физических (40vcpu), 256ram и 3*500ssd) почти в два раза дешевле или 8 серверов на е3 с теми же 64gb и с 3*500ssd. Я что то упускаю из виду? Что то не правильно считаю? Каков кейс использования этого облака?
-
как и в любом клауде. Сервис всегда дороже. Но тебе не надо руками делать кучу всякого тулинга, чтобы гарантировать себе спокойную работу
-
Это всегда будет дороже, чем взять просто виртуалку. Не забывай, что ещё нужно 3 зукипера
-
Дык ничего удивительного - облака и по сей день чудовищно дорогие выходят. Это плата за суппорт и отсуствие наличия своего железа :)
Мы в свое время с ажура свинтили, ибо ценник там оказался чуть ли не в два раза выше, чем на своем железе. -
я тоже не очень понимаю почему облачные решения должны быть дешевле железных
-
Для стартапа облака дешевше как ни крути. А вот как только начинается большая нагрузка, то из облака надо бежать на свое железо. Ну или быть компанией уровня Газпрома, где бабло не считают :)
-
-
ага, понял, спасибо, значит смотрел правильно, просто продукт специфичный сильно
-
Чей-то специфичный? Бесплатный, однако!
-
я про облако яндекса
-
А, ну это да. Ну тут уже чисто российская специфика с чисто российской жадностью :)
-
Как говорится, сделайте альтернативный сервис более дешевле и все переедут к вам:)
-
-
Не очень правильный рассчет. Сколько денег вы потеряете, когда будете обслуживать этот сервер? Сколько будет в принципе стоить поддержка сервера? Замена вышедших из строя дисков и памяти?
-
-
-
если говорим про вариант с 6 машинками, то оверкост на уровне стоимости двух часов работы сисадмина в месяц, в случае проблем с железом - письмо хостеру и ожидание его замены. инхаус - это конечно вариант для совсем отчаяных
-
С арендой бареметал все упирается в наличие толковых админов. Если есть и вы в них уверены - конечно дешевле. Если надо искать и неизвестно сколько они запросят - проще купить SAAS
-
Админ на два часа в любое время суток и с опытом кликхауса ?
-
Это же не mysql
-
Всем привет) вопрос к людям которые понимают специфику работы кликхауса, потому что я ее не до конца еще понял) наша команда решила использовать ReplacingMergeTree для того что бы избежать дубликатов. В доке указано что схлопывание записей происходит в какой то момент времени, но в когда это произойдет никто не знает. мы решили потестить эту фичу и создали таблицу с 4млн записей половина из которых это дубликаты. мы подождали день и в таблице осталось 4млн записей, то есть дубликаты не схлопнулись. Сейчас помогает только вызов OPTIMIZE TABLE table_name FINAL, при вызове этой команды дубликаты таки удаляются. Следовательно у меня вопрос, есть ли какие то четкие промежутки времени через которые кликхаус самостоятельно начинает схлопывать данные? возможно это как то можно сконфигуририровать?
-
дык вот именно, что не mysql, за год полета вопросов вообще как то не возникало... вот прям очень хочется саас, чтоб не думать ни о чем, но как начну примеряться, получается, что это прям в разы дороже и остаюсь жить в каменном веке с арендованным железом
-
четких промежутков нет, есть даже кейсы, когда схлапывание не произойдет в принципе (данные в разных партициях), мы используем щедро присыпав агрегациями типа argMax
-
окей, то есть рабочий вариант это использовать таблицу с дубликатами, и доставать из нее данные в агрегированном виде?
-
Joined.
-
у нас используется так, да. т.е. таблица типа test (a UInt32, b UInt32, ver DateTime DEFAULT now()) ENGINE = ReplacingMergeTree(ver) ....
пишем в нее insert into test (1,2) дополняем insert into test (1,12)
выбираем типа select argMax(b,ver) from test where a=1 -
понял, спасибо за совет)
-
-
-
-
-
у нас типа такого
-
-
таблица типа data (rid UInt32, kid UInt32, deleted UInt8, dataa, datab,datac, еще 20 параметров, ver DateTime DEFAULT now())
это данные для некой сущности с определенным rid
когда надо получить что то про эти данные, выбираем
select kid, argMax(dataa, ver), argMax(datab, ver)
from data
where rid=XXX
group by kid
having argMax(deleted,ver)=0 -
соответственно в вашем случае я бы задал еще какую то сортировку и шагал limit 20, 500
-
но у нас в таких таблицах лежит не супер много данных, прямо сейчас - 2 066 507 206 записей неравномерно разложенные по 2 711rid
-
-
-
Народ, подскажите нубу, начинающему познавать clickhouse.
Делаю поиск по координатам (geospatial)
Структура таблицы:
CREATE TABLE log (
uuid UUID,
timestamp DateTime,
longitude Float64,
latitude Float64
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(timestamp)
ORDER BY (longitude, latitude)
Запрос:
SELECT *
FROM log
WHERE (longitude >= $minLon) AND (longitude <= $maxLon) AND (latitude >= $minLat) AND (latitude <= $maxLat)
AND (greatCircleDistance(longitude, latitude, 35.18694, 47.7442) <= $radius)
ORDER BY timestamp ASC
LIMIT 10
Сначала тормозило если использовать в WHERE только greatCircleDistance, потом догадался, что нужно сделать индекс на longitude, latitude и в WHERE допольнительно по этим полям фильтровать.
Вопросы:
1) Возможно есть какой то более родной способ оптимизировать скорость greatCircleDistance, так что бы не фильтровать по полям longitude, latitude, или и так норм?
2) Мне так же иногда нужно делать выборки по uuid и там получется полный скан и тормозит.
SELECT COUNT(*) FROM log WHERE uuid='4c7210c1-45fa-4eac-aef5-7bf1c180bd07'
Направьте пожалуйста, как такое можно оптимизировать?
Возможно для этого как то подойдут "Индексы пропуска данных"?
В документации как то не подробно описано, пока не разобрался толком в них. -
Всем привет!
Столкнулись со следующей ошибкой после обновления на 19.17.4.11:
Code: 171, e.displayText() = DB::Exception: Cannot convert column log_type because it is non constant in source stream but must be constant in result (version 19.17.4.11 (official build))
SELECT делаем в VIEW, в которой log_type - это поле (задано как 'somestr' AS log_type). В SELECT тоже просто как одно из полей указываем -
Joined.
-
Коллеги, привет. Хотелось бы избежать join при запросе. Пока проблемы нет. Еще Проектируем структуру.
Есть большой лог с инфой об активности пользователей, часть данных будет заноситься сразу в clickhouse, а другая часть (там длительная обработка до суток) должна потом дополнить тот же лог. Пока в голове две отдельные таблицы с оперативной и неоперативной инфой, а затем join при select, но хотелось бы этого избежать. -
-
может скажу глупость, но можете попробовать создать одну таблицу в которую будете записывать записи а потом обновлять (дополнять) их когда остальная часть информации будет приходить. тогда можно будет избежать джоина
-
Не много
-
ну или да, как вариант - одна таблица для уже готовых строк (к которым приехали все данные), вторая - временный буфер на период ожидания, туда пишем не полные данные и дропаем партиции по мере подвоза досчитанной статистики и переноса данных в постоянное хранилище
-
-
при записи добавить еще поле geohash, и по нему делать фильтрацию предварительную :)
-
redis вроде похожий подход использует
-
ну это наверно получится шило на мыло 🙂
-
Читать нужно сразу все, там где пока нет данных - не страшно
-
-
чтобы читать все - наверно можно сделать union all или таблицу с движком мердж https://clickhouse.yandex/docs/ru/operations/table_engines/merge/
-
а какие у вас объемы, и что для вас «тормозит»?
-
сейчас 1 миллиард тестовых данных, отрабатывает примерно за 10 сек.
Планируются данных около триллиона -
-
-
у вас заметно лучше
-
-
с условиями по координатам у меня тоже быстро, тут проблем нет.
Тормозит такое, так как полный фуллскан:
SELECT COUNT(*) FROM log WHERE uuid='4c7210c1-45fa-4eac-aef5-7bf1c180bd07' -
count() по пользователю - 1сек
-
-
-
-
h3 может помочь
-
Так и получится, если поле учавствет в сортировке
-
у меня данные шардируются по пользователю, так как шарда 3шт, то видимо самый пессимистичный сценарий - это 333 секунды)
а запросы к базе по id пользователя будут стандартные? если да, то может имеет смысл посмотреть в сторону MatView? -
-
Немного сузил проблему по Cannot convert column log_type because it is non constant in source stream but must be constant in result.
Не получается сделать SELECT-ы с указанием констант только для движка Merge.
SELECT
time_local,
response_code,
'a' AS log_type
FROM test_merge
LIMIT 1
Received exception from server (version 19.17.4):
Code: 171. DB::Exception: Received from DB::Exception: Cannot convert column log_type because it is non constant in source stream but must be constant in result.
SELECT
time_local,
response_code,
'a' AS log_type
FROM test_distributed_v1
LIMIT 1
┌──────────time_local─┬─response_code─┬─log_type─┐
│ 2019-10-31 07:00:05 │ 200 │ a │
└─────────────────────┴───────────────┴──────────┘
Merge таблица создана как:
CREATE TABLE default.test_merge ON CLUSTER logs AS default.test_distributed_v1
ENGINE = Merge(default, '^test_distributed_v');
Похоже на баг? Или я что-то не так делаю..... -
> а запросы к базе по id пользователя будут стандартные? если да, то может имеет смысл посмотреть в сторону MatView?
да, периодически нужно делать такие запросы.
А MaterializedView решает эту проблему?
Я думал это что то типа сохраненного запроса, как в mysql view -
MatView материализует данные при инсертах, это обычный view просто сохраняет запрос, а матвью физических их запишет в таблицу в нужном вам виде
-
-
Спасибо
-
-
Доброго утра. Я наткнулся на проблему, что date_time_input_format = 'best_effort' почему-то не помогает распарсить валидный iso8601 2019-12-12T10:32:32+01:00. Кто-то решал подобную проблему?
SELECT toDateTime('2019-12-12T10:32:32+01:00')
Code: 6. DB::Exception: Received from localhost:9000. DB::Exception: Cannot parse string '2019-12-12T10:32:32+01:00' as DateTime: syntax error at position 19 (parsed just '2019-12-12T10:32:32').
если убрать +01:00, то работает -
Скажите а ZooKeeper в ClickHouse используется исключительно для репликации данных?
Сегодня во время того как отвалился ZooKeeper пытались выполнить:
DROP TABLE IF EXISTS tmp.table ON CLUSTER cluster_name
На что получали ошибку:
Coordination::Exception. Coordination::Exception: All connection tries failed while connecting to ZooKeeper. Addresses: 127.127.127.127:2181, 127.127.127.127:2181
Версия Clickhouse: 19.15.3.6 -
Если таблица реплицируемая, то для операций с нею нужны ЗК
-
-
Попробовал и он не ругнулся) попробовал по ошибке. Теперь интересно, что же там произошло и к чему привело
-
ты делаешь on cluster а это редестрибьютед запрос
-
-
-
ок, нашёл ответ. toDateTime использует не тот же самый парсер, что и при вставке. Если сделать, как в тестах, то работает
CREATE TEMPORARY TABLE test (d DateTime) ENGINE = Memory;
SET date_time_input_format = 'best_effort';
INSERT INTO test VALUES ('2018-06-08T01:02:03+01:00');
SELECT toTimeZone(d, 'UTC') FROM test; -
они не должны быть дешевле, они должны не быть ДОРОЖЕ в РАЗЫ, как сейчас
-
ON CLUSTER - значит сам запрос будет положен в ZK и при репликации запустится на репликах
-
Joined.
-
Добрый день! Есть ли в clickhouse возможность написания пользовательских функций либо процедур? Если да, то буду благодарен за ссылки на примеры написания их
-
UDF нет
но такого кол-ва функций и модификаторов какое есть в CH я не видел ни в одной другой БД
можно слать Pull Requests на "свои функции" если C++ знаете -
Спасибо Вам за ответ. К сожалению, С++ не владею.
-
тогда советую читать доку
https://clickhouse.yandex/docs/en/query_language/functions/
https://clickhouse.yandex/docs/en/query_language/agg_functions/
https://clickhouse.yandex/docs/en/query_language/agg_functions/combinators/
тут очень много вкусного -
Ок. Спасибо
-
select parseDateTimeBestEffortOrZero('2014-09-21T09:44:28+0400')
2014-09-21 05:44:28 -
Так теряется инфа о таймзоне
-
то есть, toDateTime намеренно не использует эту опцию. Спасибо за пояснение
-
У меня всё так же ReplicatedMergeTree
Ругается так
DB::Exception: Too many parts (300). Merges are processing significantly slower than inserts.
Сейчас вообще ничего не пишется в базу, но она всё равно ругается. -
большая нагрузка на CPU
-
-
А что в таблице system.merges?
-
на одной из машин много записей, на других не
-
internal_replication в true поставить может быть?
-
Можете поискать поиском по чату свою ошибку.
Почти наверняка вы сделали кучу частых вставок, у вас куча партов, которые не успевают мержится. Поэтому too many parts и CPU нагруженный. -
Joined.
-
подскажите плиз clickhouse-copier я запускаю вот такой строкой
clickhouse-copier --config-file=zookeeper.xml --task-path=/copier/task1
внутри файла конфига копира я указал 10 воркеров, это означает я пять раз должен вызвать яндекс копир ? или он сам поспаунет внутри себя 10 воркеров ....
работает очень медленно гдето 1 гигабайт в 10 минут, это нормально ? -
а если мне надо перелить 20ТБ ?
-
+ дополнительно
кто как бэкапит кликхаус ? -
Добрый день! Подскажите пожалуйста, есть задача вывести в таблицу дни которые попадают в диапазон дат из исходной таблицы, при этом должны удовлетворять условиям диапазонов из фильтра
-
Мое решение выглядит не очень, может есть более компактные
-
DROP TABLE IF EXISTS TestTable;
CREATE TABLE TestTable
(
dtStart DateTime,
dtEnd DateTime
) ENGINE Memory();
INSERT INTO
TestTable
VALUES
('2019-11-01 07:40:48', '2019-11-12 08:40:48');
SELECT *
FROM
TestTable;
SELECT
dtStart,
dtEnd,
arrayJoin(
arrayFilter(
x -> x BETWEEN dtStart AND dtEnd,
arrayConcat(
arrayMap(
x -> toDate('2019-11-01') + x,
range(toUInt32(toDate('2019-11-05') - toDate('2019-11-01')))
),
arrayMap(
x -> toDate('2019-11-10') + x,
range(toUInt32(toDate('2019-11-15') - toDate('2019-11-10')))
)
)
)
)
FROM
TestTable; -
для чего это? есть ощущение что это легко решается ext.dictionary
-
freeze rsnapshot
-
Нужно посчитать пересечения интервала в строке таблицы и в фильтре отчёта в разрезе дней. А как это решается с ext.dictionary, можно пример или ссылку на доку?
-
Joined.
-
internal_replication -- зависит от способа репликации.
Если у вас replicated таблицы (репликация через зукипер), internal_replication обязательно должен быть = true.
Если у вас "дешевая" репликаця, и репликацию делает distributed таблица то internal_replication обязательно должен быть = false
При internal_replication = false , при записи в distributed таблицу, distributed таблица вставляет во все реплики, таким образом достигается подобие репликации, без гарантий целостности.
При internal_replication = true , при записи в distributed таблицу, distributed таблица вставляет в одну из реплик, реплика так как у нее движок репликейтид, реплицирует уже сама (internal_replication). -
Ок, я думал я и синхронную репликацию вкручу и фоновую и будет вообще отлично. Сейчас поменяли на true.
-
TestTable для чего? там для лежат какие-то признаки для диапазонов?
-
что? Вы прочитали что я написал?
Зукипер есть? как вставляете ? в дистрибьютид? -
Подскажите, пожалуйста, может быть кто-нибудь сталкивался с проблемой записи при использовании связки питон + clickhouse_driver. При чтении данных проблем нет. При попытке записи даже одной строки выдает ошибку
File "clickhouse_driver/bufferedreader.pyx", line 193, in clickhouse_driver.bufferedreader.BufferedSocketReader.read_into_buffer
socket.timeout: timed out -
Всё есть, все норм. Вставляю в дистрибуетд, фолз поменяли на тру.
-
Теоритически можно написать UDF даже на баше и сделать ее executable словарем
-
Пример из жизни. Есть таблица заказов у которой есть колонка даты начала доставки и дата окончания доставки ( интервал ожидания доставки ) есть менеджер который хочет видеть сколько за каждый день есть ожидающих заказов, при этом имеет возможность выбрать несколько не пересекающихся интервалов типа текущий месяц и 2 месяца назад. Запрос формирует таблицу в которой в каждой строке есть идентификатор заказа и день если он был в интервале ожидания
-
Интересно
-
я понял, нужны типа дни, ясно. Это проще на клиенте нагенерить. у range есть ограничение на 100млн в блоке, я наступал
-
в него не упираемся интервал в 100М дней выбрать не получится
-
сделать вторую таблицу отсортированную по uuid (да положить все данные еще раз) (можно с помощью MV)
посмотрите на geoToH3 , уберовские шестиугольники h3 (для первой части) -
можно джойн (наверное asof джойн хорошо подходит), можно групбай, что делать если значений таких много?
-
Всм строчек или то, что что я обозвал c?
-
если строк которые на 30мин меньше больше чем одна?
-
-
я понял, тут в любом случае декартово произведение получается, не решить эту задачу в КХ, не хватит памяти
-
а что, сильно тормозит? сколько данных
может MergeTree вместо Log?
можете также попробовать что-то типа колонок с UTM зонами или Slippy Maps (tiles) сделать и по ним дополнительно фильтровать
greatCircleDistance кстати недавно в 3 раза ускорили, правда вроде бы еще не в релизе (в changeloge нет) но в мастере https://github.com/ClickHouse/ClickHouse/pull/7307Speed up greatCircleDistance function with test by stavrolia · Pull Request #7307 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en For changelog. Remove if this is non-significant change. Speedup greatCircleDistance function with the code...
-
select * from Table
where EventTime > Now() - 1 hour
как сравнить ? -
Так вроде MergeTree и используется.
На самом деле первый вопрос не тормозит, я решил индексами это.
Тут скорее интересно какие best practice, если нужны к этим же данным запросы по другим полям оптимизировать, например вот поиск по uuid.
Вот предложили делать вторую такую же таблицу с другими индексами. Но это же получиться данные в 2 раза увеличатся, не очень вариант, если данных сотни терабайт. -
now() - interval 1 hour
-
Вторая таблица это вариант, но у меня сейчас 200 терабайт данных и че то как то не охота из них делать 400 терабайт :)
-
у вас 200ТБ из трех полей? Вам вторую таблицу можно сделать узкую, просто uuid и поля указатели на первичный ключ первой
ну и конечно КХ это не про точечный поиск по uuid. -
А у вас там вроде нет условия на партиции или есть ?
-
-
Там полей штук 30.
Gzip архив данных весит примерно 200T.
Я надеюсь что в кликхаусе будет весить меньше :)
Пока пристреливаюсь, думаю на чем пилить это все. -
КХ быстро делает group by. Если аналитических запросов не будет, тогда КХ тут вообще не к месту, и тогда кассандра.
-
Joined.
-
Немного оффтопа, в чате читаю про десятки субд, но ни разу не написал никто про sql server. Его не используют потому что дорого или есть другие объективные причины?
-
Какой именно sql сервер? А то mysql - тоже sql server так-то.
-
про db2 и informix тоже никто не пишет 🙁
-
и adabas, тоже !!!
-
оно же ms -- на линукс не станет а винда это уже тень линукса
-
-
это для галочки сделано и дата 11/04/2019
-
Или даже так https://hub.docker.com/_/microsoft-mssql-serverMicrosoft SQL Server by Microsoft | Docker Hub
Official images for Microsoft SQL Server on Linux for Docker Engine.
-
кто не знает 11/04/2019 - это ноябрь а не апрель 2019
-
не от большого ума в докеры крутить
-
И раз в квартал CU для прикрытия ага
-
Чё-то я настолько туп видимо, что меня аж устраивает.
-
Есть mssql на linux. И в докере тоже есть. С мостом разобрались ?
-
да с мостом разобрались но мой мост вроде как ронят мой посгрес -- но не потверждено
-
если знаешь все подводные камни -- то респект а не профи в докерах делать не чего. особенно субд на докерах
-
успокойтесь уже, освойте докер, даже у УМПУТУНА монга в докере на проде.
-
-
кто он такой. я работал в топ1 банке одном -- знаю как там -- там даже faq написали админы OpenShift что базу держать отдельно от докеров
-
-
IT-шник не знает Умпутуна? Может и бобука не знаешь? и доброго Лешу?
-
-
не знаю но гугл сказал что блоха - http://lurkmore.to/%D0%A3%D0%BC%D0%BF%D1%83%D1%82%D1%83%D0%BDУмпутун
Умпутун (евр. קהעקמקט, он же Umputun и Евгений Самуилович Борт, он же Человек и микрофон, как сам признался в «Радио-Т № 137») — второй отец российского подкастинга, жыдопоцкастер, колбасный эмигрант, уезжант из России в Израиль, уезжант из Израиля в Пиндостан, пишущий невыдуманные рассказы из своей жизни, различные рассуждения и наблюдения, немного компьютерных разговоров, которые, впрочем, зачастую сводятся к дифирамбам эпплу и гуглу, совсем чуть-чуть политики и порой немного юмора. Живёт в Напервиле, пригороде Чикаго. Является ЕРЖ и не стесняется этого. Родился 16 ноября 1969 года, женат, есть сын и дочь.
-
Короче, я лет 7 слушаю https://radio-t.com/
не представляю что кто-то может не знать Умпутуна. Моя бабушка знает что у Умпутуна монга. -
спасибо что просвятил но в россии это никто он - даже вики о нем не знает
-
Кто все эти люди?)
-
Вы мне лучше скажите, ни у кого не было после недавних апгрейдов частых падений по памяти?
-
На запросах без сэмплинга
-
Субкультуры субкультуры а я маленький такой.
Скоро будут думать, что инет путин придумал -
логи хоть покажи ошибки - а то без предметно
-
Падение
По нехватке
Памяти
Я не спрашивал, люди помогите падает хз что, я спросил, ругается ли у кого-нибудь на память -
ответ - нет но если сомнение - нужно иметь 2 стенда со старым ПО и новым
-
или уметь откатываться
-
сегодня видел такое сообщение https://github.com/ClickHouse/ClickHouse/issues/8039
но вообще никаких известных leak сейчас нету -
Вот есть подозрение, что не leak, а, скорее деградация. После апдейта тяжёлые запросы без сэмплинга валятся просто влёт. Будем разбираться
-
Microsoft
-
-
нужно настраивать конфиги -- у меня кх на 6 гиг озу летает
-
У меня почему-то счётчик MemoryTrackingInBackgroundSchedulePool уже третью неделю ползёт вверх.
-
Ого. А серверов сколько?
-
*
-
виртуалка слабая одна -- там 100к записей в таблицах -- суть не в этом нужно настраивать и я настроил
-
Версия то какая?
-
Рад за тебя, если подскажешь, что делать когда distributed валится на горке серваков с типа 64gb (условно) с меня пиво
-
Кстати если верить надписи Total amount of memory (bytes) allocated in background schedule pool (that is dedicated for bookkeeping tasks of Replicated tables). это вообще начинает смахивать на помешательство ибо на этом сервере реплицируемых таблиц не замечено.
-
я рецепт дал -- config.xml и user.xml правь - сделай сжатые ResultSet и с memory уреж -- под 48гиг буфер и вуа ля
-
Это не про наш случай
-
валится с OOM?
валится инициатор или шарды тоже?
что в запросе? group by ? JOIN ? order by ? Low Cardinality ? -
Не оом
Group by есть
Order by нет
Подозревали джойны, подзапросы
Исключили подзапросы и джойны.
Завтра дам больше данных -
Но падения начались сразу после апгрейда
-
1) стейдж есть 2) веская причина была 3) наверное надо держать стейдж со всеми возможными edge case, спасибо за интересное мнение
-
19.5.2
-
Оу. Это с какой вы обновились.
-
наврал. прошу прощения, 19.17.4
-
тебе там нигде не жмет? я пришел спросить есть ли у кого что-нибудь про падения кх после недавних апдейтов, ты рассказал всю философию своего стартапа, может не надо больше так делать?
-
Joined.
-
можем в другом чате встретиться, я с радостью выслушаю твои советы
-
но не здесь
-
Вы просто не в курсе, не пишите за всех
-
-
(если что, еще раз, случайно наврал, не на тот сервер посмотрел, не 19.5, а 19.17.4)
-
++
-
Я понял, ага. У меня 19.15. А запросы валятся по памяти это как? Стали потреблять больше памяти чем до обновления и теперь не пролезают в лимит?
-
вот кажется да. в духе "хотел взять 4 гига, но запросил 4.5) - я с телефона поэтому точных сообщений об ошибках не могу дать
-
(я с телефона потомучто кх отобрал сервера, потом домашний комп, потом ноут, потом планшет, скоро придется писать с холодильника)
-
"запросы, которые спокойно пролетали, теперь валятся по памяти."
-
Скорее всего, запросы не стали потреблять больше памяти, но для некоторых запросов подсчёт потребления памяти стал более точным, тогда как раньше учитывал не всё.
-
-
-
Лимита нет, после ~10 000 ReplicatedMergeTree или ~100 000 обычных MergeTree или после ~1 000 000 Log/TinyLog/StripeLog будут проблемы.
Пара тысяч таблиц в день - не проблема.
Зачастую наличие большого количества маленьких таблиц необосновано и лучше мало больших. -
-
Что-то типа этого? https://github.com/ClickHouse/ClickHouse/pull/7552[RFC] Do not account memory for Buffer engine in max_memory_usage limit by azat · Pull Request #7552 · ClickHouse/ClickHouse
Thoughts? Category (leave one): Bug Fix Short description (up to few sentences): Do not account memory for Buffer engine in max_memory_usage limit Detailed description (optional): Since backgroun...
-
Нет, я имел ввиду это: https://github.com/ClickHouse/ClickHouse/pull/5981Count new/delete memory in MemoryTracker by 4ertus2 · Pull Request #5981 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Category (leave one): New Feature Short description (up to few sentences): Count memory allocated in new/...
-
Я
- 13 December 2019 (327 messages)
-
Кто нибудь грузил данные из гугл аналитикс в кликхаус Без использования сторонних сервисов типа owox ?
-
Есть таблица, которая содержит столбцы: date, phone
Как сделать запрос, который покажет count(), где phone в таблице встречается лишь один раз? -
Eugene Zakharchenko, [13.12.19 08:48]
select count(*) from (select phone, count(*) from table group by phone having count(*) = 1) -
Подскажите, пожалуйста, как всё-таки выбирать последнюю стабильную версию КХ в докере (для обновления старой). Не пойму - если зайти на докерхаб то последняя это же 19.17.5.18? Или жмакаем в latest, смотрим что там написано 19.17.2.* и берём в итоге 19.17.2.4 из последних апдейтов? ) Прямо вот новье не нужно - нужно чтобы десяток тачек не раскорячило)
-
-
Доброе утро. Эта статья будет полезна всем, кто использует ClickHouse как хранилище для метрик графита
https://habr.com/ru/post/479564/ClickHouse + Graphite: как значительно уменьшить потребляемое место на дискахПриветствую, habr. Если кто-то эксплуатирует систему graphite-web и столкнулся с проблемой производительности хранилища whisper (IO, потребляемое дисковое прост...
-
😃👍
-
Open source — наше всё. Заявление директора по распространению технологий Яндекса Григория Бакунова, которое отражает позицию всей компании – https://yandex.ru/blog/company/open-source-nashe-vse
События последних дней заставляют нас заявить свою позицию по новостям вокруг проекта Nginx. Мы в Яндексе считаем, что современный интернет невозможен без культуры open source и людей, которые инвестируют своё время в разработку программ с открытым кодом. -
ну если YDB выложат в OpenSource то я поверю что позиция обоснована, все исходники не надо, но вот wal-e, odyssey, tank, allure
яндекс много чего выкладывает -
-
-
+1 и гугл тоже не все
-
-
всем доброго дня!
коллеги, взываю к вашему опыту, какая архитектура кластера CH подошла бы под такое:
есть несколько гео-зон, сильно разнесенных географически, оттуда собираются данные, и логично сборщики держать к источникам поближе, ну а дальше получается и ноды CH (или отдельные базы) тоже держать поближе
есть ли смысл делать шарды по геозонам, насколько понимаю - писаться будет быстро, а вот чтение - уже нет, как можно поступить? делать MV на ближнюю к себе ноду? так будет жить, если каналы такие "длинные"
вопрос в чем получается: или база одна и это шарды по геозонам
или баз куча - а дальше если надо ETL и иже с ним,
или кластер и все такое с репликами и прочими штуками -
-
Пардон, но Вы путаете яишницу и кое что иное. CH был создан в рамках Метрики.
-
в рамках шарда один сервер ближе к пользователю, другой во второй геозоне
писать в тот, который ближе
читать с того, который ближе -
и что же я путаю?
-
то есть шард один и тот же, но - две реплики, одна ближе к сборщику, а вторая - к потребителю, так?
-
да, я бы сделал так
-
а оно так через интернеты нормально будет реплицироваться?
-
трафик сжимается при реплицировании?
-
То, что "была дискуссия, открывать ли исключительно внутренний проект, созданный в процессе исполнения рабочих обязанностей, в opensourсe или нет" против "в рабочее время начал собственный проект", как минимум
-
И это как раз касается "работает, пока..."
-
передаются куски партиций, то есть, минимально возможный трафик
-
и что в этом принципиально другого?
-
спасибо, я удаляюсь из этой дискуссии
-
-
-
спасибо большое )
-
большое спасибо )
-
коллеги, а вот получаются реплики разнесенные, нужно 3 зукипера минимум, и их надо в один ДЦ помещать, верно?
-
нет, лучше в 3 независимых. ZK - точка отказа
-
zookeeper же довольно чувствителен к пингу
-
а как по опыту, какие машинки лучше использовать под ZK? достаточно ли впски с одним ядром и 4 гигами памяти или надо что то посерьезнее, если предположить, что вставок не так много, в основном все же чтение
-
и всё же, является точкой отказа всего кластера
-
а как же требование - 10G между нодами ZK?
-
сомневаюсь, такой throughput ни к чему. А вот латенси - да, он должен быть, по возможности, снижен.
Но Вы должны понять компромис. Либо кластер имеет бОльшую отказоустойчивость за счёт разнесённости, либо при уходе одной из геолокаций Вы согласны терять возможность записи глобально на всём кластере -
исчерпывающе, спасибо!
-
А где написанно , что нужно 10g?
-
а тут было, где то среди последних 1.5к записей )) сейчас поищу
-
Вот тут пишут
https://clickhouse.yandex/docs/ru/operations/tips/#set -
что-то не нашел, приснилось что ли... 🤔
-
да, спасибо,
Предпочитайте как минимум 10 Гбит сеть. 1 Гбит также будет работать, но намного хуже для починки реплик с десятками терабайт данных или для обработки распределенных запросов с большим объемом промежуточных данных. -
но как бы при сильно удаленных репликах, 10G, это, ээээ... не знаю как это будет )
-
-
ну между континетами это будет космос по бабкам, наверное
-
having же выполняется после группировки. можно как -нибудь сделать что-то вроде группировки по дням, но для полей ,которые в таблице единичны? пытаюсь провернуть с toStartOfDay()
-
а, ну так то да, дороговато
-
пардон, это же не про ZK. это про межнодные сети
-
аааа, ну это другое дело )
-
10g это скорее между репликами такая сеть должна быть , а для ЗК такой не надо
-
В ЗК данных столько много не закачивается . Там самый большой объем - это информация о партах
-
-
-
Там дампы, которые при падении делает . Поищите в чатике.обсуждали пару дней назад
-
спасибо!
-
-
добрый день. есть мердж таблица, работала, работала, сейчас начала выдавать ошибку
Code: 81. DB::Exception: Received from localhost:9000. DB::Exception: Default database is not selected.
скорей всего
ENGINE = Merge(currentDatabase(),
как лечить? -
SELECT currentDatabase()
┌─currentDatabase()─┐
│ default │
└───────────────────┘ -
спасибо
-
Пытаюсь получить количество, разделенное по дням, где phone встречался в таблице более 50 раз. Норм запрос?
-
Code: 241, e.displayText() = DB::Exception: Memory limit (for query) exceeded: would use 46.57 GiB (attempt to allocate chunk of 4879537 bytes), maximum: 46.57 GiB (version 19.16.2.2 (official build))
-
Как обойти это ограничение?
-
union можно использовать, если поделить таблицу на пару частей
-
По другому не вариант?
-
хз...это то как я решил похожую проблему, ну типа увеличить ОП можно, переписать запрос еще чтоб не тащил туда этого монстра
-
а че ты делаешь там? это из за join проблема?
-
Да
-
Таблицы большие
-
А данные нужны
-
Хз как быть
-
а с какйо стороны большая таблица? тама хэш дойн еси че
-
Вроде. Права
-
Что это значит
-
насоклько я опнимаю алгоритм джойна котоырй в кх тащит то что справа в опертаивную память, формирует хэш таблицу и потом уже джойнит с другой таблицей, попробуй поменять местами, ну и посмотри скольк оменьшая весит, еще я тут подумал что можно поделить по колонкам, типа сделать нескольк джойнов если скорость в данном случае не важна, а она не важно вроде как
-
типа оставить ключи а остальное разделить, тогда последователньо объединишь данные, но хз будет ли работать
-
@visken
-
Спс
-
-
DB::Exception: There is no supertype for types String, LowCardinality(Nullable(String)) because some of them are String/FixedString and some of them are not (version 19.17.4.11)
а почему это нет супертипа??? разве LowCardinality(Nullable(String)) не является супертипом над String? -
всем хай
-
обьясните пожалуйста
<internal_replication>true</internal_replication> -
я никак не пойму что это значит
-
да
-
все вроде врубился
-
-
я правильно понимаю, что лучше использовать true и писать рандомно в любую реплику через nginx например, чем в distributed с false
-
или тогда балансировка не будет работать на write
-
и на select
-
Нет не правильно. Есть два способа репликации. Один без replicated таблиц второй с replicated. Сначала нужно определиться какой вам подходит. После этого все очевидно. Если выбрали 1 -- false , 2 -- true.
-
мне нужна и репликация и балансинг
-
🤦♂
-
Есть 2 способа репликации
-
в данный момент я сделал
3 сервака с реплицируемой таблицей,
поверх сделал distrubuted
и пишу и селекчу из дистрибьютед -
это неправильно ?
-
интернал репликэйшн false соответственно
-
Если движек replicatedmergetree то true
иначе пиздец котенку
Извиняюсь за мат -- но я устал. -
-
так а distributed поверх нужна ?
-
для селектов
-
я вас понимаю извините, но у яндекса с документацией совсем труба ... нихера непонятно
-
да
-
то есть в моем случае мне стоит еще просто включить внутреннюю репликацию
-
и запись и селект через дистрибутед
-
но в доке написано, что при internal_replication true оно будет писать только в одну реплику
-
а я хочу достигнуть баланса селектов и врайтов
-
и реплицироваться уже средствами внутренней репликации движка
-
если например я не буду писать в реплицируемую таблицу вообще, а только в дистрьютед, false ?
-
и он будет распараллеливать запросы
-
и данные будут консистентны
-
?
-
труба у нас. У яндекса все хорошо.
Давайте начнем с простого. Как это работает.
Вы пишете в distributed, она смотрит на параметр internal_replication -- он true -- ага решает distributed, надо писать в любую реплику, дальше сами внутри replicated таблицы все сделают. Ура win.
Вы пишете в distributed, она смотрит на параметр internal_replication -- он false -- ага решает distributed надо писать во все реплики (там внутри не умеют реплицировать). Пишет в три реплики и все умножается на 3 в случае если там была replicated. -
Вроде кликхаус никогда не обеспечит строгой консистентности. Он ее будет постоянно восстанавливать, но блокировать до полного восстановления консистентности они никогда ничего не будет. Это буква А в САР-теореме.
-
какой тогда смысл в false я не понимаю, если мы не достигаем балансировки с помощью дистрьютед
-
аа
-
я догнал, сори ))
-
кто вообще говорил про чтение, мы еще дошли туда. internal_replication это про запись через distributed
-
последнее ваше изменение меня привело в чувства))
-
😊
-
получается в случае репликации всегда пишем в одну реплику, без вариантов
-
если нужно просто во все реплики писать без реплицируемых таблиц тогда false
-
у вас 1 шард. Вам можно не использовать distributed вообще. Балансировать ngnix и писать и читать из любой реплики.
-
да я к этому и вел
-
благодарю вас))!
-
наверно дистрибьютед таблица может помочь в случае серьезных селектов
-
из дистрибутед читать лучше, хз почему. Он как-то сгребает со всех реплик записи
-
👆🏻
-
есть один вариант использования когда distributed нужна для одного шарда.
это распараллеливание select между репликами (max_parallel_replica >1).
НО нужен sampling у таблицы, и max_parallel_replica работает очень редко. Это нужно специально это все проектировать. И точить запросы под max_parallel_replica. -
ага понятно
-
Joined.
-
нет. По дефолту нет. У вас точно нет.
-
параметри load_balancing задает правило как выбирать реплику при select. Но это больше про другие шарды. Из-за параметра prefer_localhost_replica = true, в своем шарде distributed будет всегда читать локально на своей ноде.
-
А можно ли разделить инстансы, так чтобы было 3 шарда, по 2 реплики на каждый, а запись и чтение шли всегда на определённые 3 пока они не упадут?
-
да я как раз убрал его
-
и max_parallel_replica 3 сделал по кол-ву серверов
-
либо на все либо на одну реплику я так понял
-
я вот одного только не догоню, я сделал репликейтед таблицы, поверх сделал дистрибьютед, при этом интернал репликейшн фолс у меня стоял, я заинсертил данные в дистрибьютед таблицу на 60 гиг ... и они все засинкались нормально никаких конфликтов не было
-
-
все у вас будет, как я понимаю
-
-
-
по умолчанию вроде prefer_local_replica
-
что то такое
-
-
-
Joined.
-
Вопрос по разрешению запросов, в документации сказанно:
Доступ к БД не связан с настройкой readonly. Невозможно дать полный доступ к одной БД и readonly к другой.
Можно ли как то это обойти? Планируется ли расширить функционал раздела <allow_databases>?
Версия ClickHouse: 19.15.3.6 -
распаллеливание работает только на таблицах с sample by
-
да, конечно, настроить load_balancing = In order и прописать реплики в нужном порядке в описании кластера.
у меня два географически разнесенных dc. Я называю линукс хосты таким образом, чтобы ходить в реплики в своем dc при load_balancing= Nearest hostname -
да. Нету. Из-за дедупликации последних 100 блоков.
distributed посылает в реплику1, реплику2 и реплику3 одно и тоже
реплика1 вставляет и пишет в зукипер контрольную сумму блока.
реплика2 проверяет что блок уже есть в зукипере (в ста последних) и не вставляет и скачивает новый парт с реплика1
реплику3 проверяет что блок уже есть в зукипере (в ста последних) и не вставляет и скачивает новый парт с реплика1
т.о. мы получили оверхед по сети и цпу.
Раз в полгода приходят люди и жалуются на дубликаты из-за этого. Почему?
реплика2 выключена или потеряла сеть.
distributed посылает в реплику1, реплику2 и реплику3 одно и тоже
реплика1 вставляет и пишет в зукипер контрольную сумму блока.
реплика3 проверяет что блок уже есть в зукипере (в ста последних) и не вставляет и скачивает новый парт с реплика1
через минуту сеть восстановилась
реплика2 проверяет что блока нет в зукипере (в ста последних) вставляет и скачивает новый парт с реплика1
рассылает вставленное на реплику1 и реплику3 через репликацию -- insert умножился на два -
insert quorum
-
сложить плюсом
state1+state2 -
пока нет.
полноценные гранты почти готовы, я так понимаю на 99% -
Это уже синхронная репликация получится
-
Здравствуйте коллеги, кто использует кх кластеры в нескольких дц?
если есть два рабочих кластера , если я хочу добавить новый, то с какого из текущих он будет стягивать данные для ReplicatedMergeTree таблиц ?
и можно ли в таком случае указать конкретно с кого именно синхронизировать данные? -
eventual consitency -- что вы хотите?
доезжает за 1сек в среднем. Какая разница, ну сделаете вы два селекта с одной реплики и тоже получите разный результат. -
и да internal_replication влияет на DDDL (on cluster). Приходится делать еще один кластер который используется чтобы делать alter для distributed, -- это баг, у меня есть тикет -- его исправят.
-
можете поподробнее, я кажется в что то такое щас уперся
-
┌─host──────────────┬─port─┬─status─┬─error─────────────────────────────────────────┬─num_hosts_remaining─┬─num_hosts_active─┐
│ click2.admline.ru │ 9000 │ 48 │ Cannot execute replicated DDL query on leader │ 2 │ 1 │
│ click3.admline.ru │ 9000 │ 48 │ Cannot execute replicated DDL query on leader │ 1 │ 1 │
└───────────────────┴──────┴────────┴───────────────────────────────────────────────┴─────────────────────┴──────────────────┘
┌─host──────────────┬─port─┬─status─┬─error─────────────────────────────────────────┬─num_hosts_remaining─┬─num_hosts_active─┐
│ click1.admline.ru │ 9000 │ 48 │ Cannot execute replicated DDL query on leader │ 0 │ 0 │ -
оно ?
-
fyi
-
на каком запросе
-
alter table ontime_local on cluster magic add column test2 String;
-
ontime_local -- дистрибьютид?
-
нет
-
а на дистрибьютед такая фигня
-
┌─host──────────────┬─port─┬─status─┬─error───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─num_hosts_remaining─┬─num_hosts_active─┐
│ click2.admline.ru │ 9000 │ 371 │ An error occured before execution: Code: 371, e.displayText() = DB::Exception: Table 'ontime' isn't replicated, but shard #1 is replicated according to its cluster definition (version 19.17.2.4 (official build)) │ 2 │ 0 │
│ click1.admline.ru │ 9000 │ 371 │ An error occured before execution: Code: 371, e.displayText() = DB::Exception: Table 'ontime' isn't replicated, but shard #1 is replicated according to its cluster definition (version 19.17.2.4 (official build)) │ 1 │ 0 │
│ click3.admline.ru │ 9000 │ 371 │ An error occured before execution: Code: 371, e.displayText() = DB::Exception: Table 'ontime' isn't replicated, but shard #1 is replicated according to its cluster definition (version 19.17.2.4 (official build)) │ 0 │ 0 │
└───────────────────┴──────┴────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────────┴──────────────────┘ -
alter table ontime on cluster magic add column test2 String;
-
А КАКАЯ? какой движек?
-
репл
-
репмерджтри
-
ну значит какая-то другая ошибка, смотрите логи сервера
-
>DB::Exception: Table 'ontime' isn't replicated, but shard #1 is replicated according to its cluster definition
просто опишите еще один кластер XXX где все ноды это шарды и internal_replication = false и исользуйте XXX только для alter-в дистрибьютид таблиц. -
я использую.
>то с какого из текущих он будет стягивать данные для ReplicatedMergeTree
из обоих
>и можно ли в таком случае указать конкретно с кого именно синхронизировать данные?
нет -
хм у меня альтер и на репл табл не работает
-
Cannot execute replicated DDL query on leader
-
ddl
-
-
Failed to execute ALTER TABLE ADD INDEX ON CLUSTER · Issue #6704 · ClickHouse/ClickHouse
CREATE TABLE test ON CLUSTER default ( timestamp DateTime, field UUID ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/db/test', '{replica}') PARTITION BY ...
-
короче с DDL беда
-
ну значит какая-то другая ошибка, смотрите логи сервера.
может поле уже есть или еще что -
багу скинул
-
выше
-
Cannot execute replicated DDL query on leader
это значит что не смог, почему не смог написано дальше и в логах -
в логах только вот про лидер строчка и все
-
хм ) да вы правы
-
-
-
directory for table already containing data parts - probably it was unclean DROP table or manual intervention
вы правы -
я не пойму а что дают распределенные запросы в случае когда internal_replication true ?
-
если шард один
-
никакой прибыли
-
ничего
-
угу)
-
спасибо за помощь
-
вы сильно помогли
-
Товарищи, уже спрашивал, но вдруго кто ответит
Если я шарду поставлю weight=0, правильно ли я понимаю, что это будет read-only шарда? -
on cluster -- это такое хелпер, его сделали совсем недавно (по моим меркам), у меня даже исользуются версия в одном из проектов, которая его не умеет), он несовершенен пока.
-
👌🏿
-
weight=0 -- в этот шард не будет записи от distributed, он будет пустой, совсем 0 записей.
-
Мне нужно для задачи "остановить запись в эту шарду".
-
ну тогда да, подойдет.
-
Спасибо!
-
Спасибо!
-
я не понял вопроса?
просто указать таг -- он совпадает с версией -- yandex/clickhouse-server:19.13.6.51
docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 yandex/clickhouse-server:19.13.6.51 -
-
Я имел ввиду по какому принципу выбирать версию на которую можно смело обновиться)
-
Если возникло такое желание, то схема партиционирования явно не подходит
-
нет. Можно нагенерить
select concat('optimize table `',table, '`partition ',partition, ';')
from system.parts
where active = 1 and table like '....' and partition like '%201906%'
group by database,table,partition
order by database,table,partition -
ну я беру ту которую тестировал 6 месяцев в стейдже и нашел проблем, сейчас 18.14.18 у меня ОК -- стейбл. 19.13.6.51 -- тестирую
-
Ок, спасибо
-
Почему? я ток порядок навожу, что наделали программисты
-
спасибо
-
-
Сорян. Моя читать не умеет. Думал возникло неприодолимое желание оптимизировать часть партиции.
-
-
Joined.
-
-
https://www.shodan.io/search?query=%22for+clickhouse-client+program%22
гм, 1254 ноды смотрят голым 9000 в интернет, т.е. скорее всего как минимум в 100 раз больше нод в мире. Неожиданно. -
analyticsaqp
-
И похоже Hetzner пока что самый дешёвый способ светануть порт 9000 наружу.
-
я использую множесто дедиков по всей планете под КХ и постоянно ищу где дешевле. Так вот хецнер это самый дешевый способ собрать сервак с кучей объемных дисков, я думаю причина в этом.
там 256 GB DDR4 ECC + 15x 10 TB SATA = 259.00€.
в сев. америке за такой конфиг могут и $2k просить -
По мне так у них в принципе ценник гуманный.
-
Только трафик сильно уж лимитированный (
-
А что мешает закрыть его от ненужных адресов?)
-
Вообще если заморочиться со сжатием, то стоимость дисков уже не так важна становится. Мы тут взялись за это дело и получили сжатие x16. невменяемый объём данных который на флешке унести можно.
-
как? что? я только 1G использую
-
-
-
Посмотрите на WorldStream
-
-
-
-
Я столько не тратил ещё за месяц.
-
Спасибо. Очень своевременно
-
????? https://www.hetzner.com/news/traffic-limit/
какой у вас год? -
-
-
-
-
Позавчера буквально смотрел, натыкался. Сейчас поищу
-
Всем привет! Разбираемся с Clickhouse, находим следующее - ClickHouse merges data part in an unknown moment of time which we can not predict (речь об CollapsingMergeTree). Можно как то это контролировать, вызывать тогда и только тогда, когда нам это нужно, без этого not predict? Спасибо!
-
-
У меня такое приходится делать из-за того что меняется прошлое и сжатие.
-
В одном куске сжатие x16, а без оптимизации сильно меньше.
-
Поэтому OPTIMIZE TABLE изменчивое.прошлое PARTITION toYYYYMM(today() - toIntervalMonth(1)) воимя сжатия
-
Спасибо! Можем мы вообще не так понимаем как нашу задачу решить на Клике (так как первый раз его используем). Так что будем рады совету!
Расклад такой - у нас есть данные о продажах. В день к нам приходят миллионы записей, мы по ним потом считаем статистику всякую. Проблема в том, что к нам периодически приходят корректировки по этим записям, по которым мы должны либо удалить часть записей либо поменять атрибуты. Причем эти корректировки приходят много позже оригинальных записей. Раз в сутки мы хотим иметь возможность снять снепшот таблицы с последними версиями всех записей. Подходит ли нам Клик? И если да, то как лучше сделать механизм обновления данных?
Еще раз спасибо! (Не удаляйте, нам больше некуда идти). -
миллионы в день это немного, тупо перезаливайте всю таблицу целиком.
-
У вас 3 варианта:
1. Перезалив части информации с кратковременным отсутствием части данных в таблице
2. Использование соответствующего табличного движка с поддержкой версионирования
3. ALTER TABLE <name> REPLACE PARTITION ... -
Минусы:
1. минус онлайн отчётность
2. плюс накладные расходы на версии
3. минус MV -
-
Плюсы:
1. тупо проще в реализации
2. MV, правда с минусами из опять же п. 2
3. Быстро и просто - можно перезаливать таблицу по партициям -
Спасибо! У нас данные приходят инкрементально через кафку, кликхаус - единственное хранилище, а суммарное количетсво данных миллиарды, так что перезалив всей таблицы нам не пойдет.
Движки таблиц смотрели, но тут интересен вопрос как долго будет проходить optimize final на миллиардах, учитвая что корректировки приходят к старым данным. -
Кафка не гарантирует отсутствия дублей если что.
-
Проверено вот этими руками 🤲
-
В случае сбоев возможны повторы повторы
-
А под "инкрементально" подразумевается двойная запись или повтор транзакции которая изменилась?
-
Не очень понял. Мы продьюсим данные в кафку небольшими порциями записей, которые потом какой то консьюмер должен записать в Клик.
-
По какому принципу вы выбираете данные для доставки в шину?
-
Это всегда новые транзакции или это новые + изменившиеся с прошлого раза?
-
Новые + изменившиеся с прошлого раза
-
Т.е. условно у каждой записи на стороне CH есть "версия" и попахивает п.2
-
если реализовать exaclty once delivery на консьюмере и продьюсере то дубликатов не будет, транзакции гарантируют это. Просто надо понять что такое exaclty once delivery оно не тривиально в реализации.
-
Мы такой подход используем и даже с кафкой. Не ваш объём транзакций конечно, но лям+ в сутки проходит в сторону CH.
-
Если грамотно положить брокеры на бок, то они таки смогут. Именно это я и проверял.
-
можно потерять данные, но нельзя задублировать
-
Но тут надо ошибиться со степенью отказоустойчивости и админами
-
Правильно написанный продюсер какраз таки этого не допустит
-
+ настройки топика
-
потерять в смысле -- угробить брокеры / топики - до того как консьюмер прочитал
-
Я рассматривал все варианты до наступления события "не смогли доставить в шину новую инфу". Подразумевалось что кластер будет утерян не полностью и через какое-то время будет поднята уцелевшая часть.
-
Тестировал всякие штуки вплоть до выдёргивания питания и сети.
-
Пока 4 года - полёт нормальный.
-
Пережили вторжение админов на 3х нодах с простоем 20 сек.
-
Один узел в итоге потеряли
-
На 5 узлах думаю не заметили бы даже админов.
-
Версионирование не очень и плохо, если ключ версионирования более или менее вменяемый.
-
-
Еще раз спасибо! А есть где глянуть на перформанс optimize final, хотелось бы уметь оценивать время, которое будет затрачено на вот это вот все?
Причем мы хотим к началу нового дня получать уже все оптимизированное.
Из того что я понял, нам стоит действовать так:
1. Используем движок с версией для таблицы
2. Ночью вызываем OPTIMIZE FINAl
3. Делаем снепшот как SELECT FROM
4. BI работает со снепшотом, новые данные идут записываются в первоночальную таблицу с новыми версиями
5 ...
6. PROFIT ! -
Joined.
-
Я по части данных пришёл к тому что проще партицию целиком без всяких шин перезалить в соседнюю таблицу и сделать https://clickhouse.yandex/docs/ru/query_language/alter/#alter_replace-partition
-
Можно делать SELECT FROM из исходной таблицы, просто в зависмости от схемы партиционирования,частоты принудительных OPTIMIZE'ов и любви к изменениям прошлого этот запрос будет в разной степени не оптимальным
-
Почти всегда можно найти баланс
-
Но у меня иезуитские требования "хотим менять сильно прошлое и видеть данные с актуальностью в час". При никаком источнике информации, который ляжет если за него взяться обеими руками.
-
Нашел. Внизу. Сослепу не заметил, что это для 10 Гбит интерфейсов
https://www.hetzner.com/dedicated-rootserver/px62 -
я сразу написал, что использую только 1G
-
-
Как то так получилось
-
Закупоньки... Странный PK(Primary key?): "A B" и "B B" слились в экстазе?
-
Или... PK1 это не название, а значение...
-
Тогда с OPTIMIZE, или помимо него, запрос будет SELECT PK, argMax(B, V) as B_actual FROM ... GROUP BY PK
-
-
Партиции же, не?
-
Если они указаны конечно
-
Ну он как то мерджит таблицы по странному. Я следил за местом на диске, пока он не отожрал столько же диска сколько весит и сама таблица, размер не уменьшился
-
-
если партиций мало то да. Все парты партиции записываются в новый парт, в какой-то момент существуют и новый парт и старые.
Все файлы / парты -- имьютабл, не изменяются. -
нет, нельзя удалить из replacingMergeTree, т.е. обычно поле типа deleted добавляют, и пишут версию с deleted=1
-
помогите с distributed таблицами плиз
есть 2 шарда по которым пополам поделены даннные
есть distributed таблица на них
и на одном из шардов другая таблица, с полным набором данных
я ожидаю что distributed таблица должна работать быстрее чем таблица с полными данными, но по факту даже немного медленнее
запросы к табличкам с половинными данными работают ожидаемо ~ 2 раза быстрее
запросы тестовые вида:
select FHospital, count(), count(distinct FPatKey)
from default.PHARMACY_ConsumptionReports_test2
group by FHospital;
select FHospital, count(),count(distinct FPatKey)
from default.Distr
group by FHospital
FHospital здесь - используется в ключе шардинга, но есть подозрение что кх не понимает что можно на каждом шарде посчитать и тянет к инициатору всё
на реальныхсложных запросах тоже +- одно время или до 15% деградации на distributed таблице.
План distributed:
Expression
Expression
MergingAggregated
Union
ParallelAggregating
Expression × 6
MergeTreeThread
Remote
план обычный:
Expression
Expression
ParallelAggregating
Expression × 6
MergeTreeThread -
>я ожидаю что distributed таблица должна работать быстрее чем таблица
>с полными данными, но по факту даже немного медленнее
>запросы к табличкам с половинными данными работают ожидаемо ~ 2 раза быстрее
это ожидаемо для некоторых запросов. Финальная агрегация+передача по сети могут занимать больше времени -- чем агрегация на локальной таблице. -
шардинг помогает когда надо много читать с диска, т.е. ускоряется диск
-
финальную агрегацию можно выключить -- если данные шардированы как группируются
-
>подозрение что кх не понимает что можно на каждом шарде посчитать
кх не знает как шардированы данные, поэтому есть финальная агрегация -- иногда лишняя. -
старался сделать максимально подходящий запрос, в результате по 20 записей на шард получается, сеть локальная <1мс
-
спасибо
настройка есть для этого? -
>count(distinct FPatKey)
передаются естественно все distinct FPatKey -- как иначе? -
т.е. каждый шард составляет свой длинный(distinct FPatKey)
инициатор снова делает (distinct FPatKey) из двух списков с шардов
потом считает count -
--distributed_group_by_no_merge
-
КХ не смотрит при селектах на ключ шардирования, потому что ему нельзя верить. Во первых его можно менять в любое время, во вторых можно писать локально -- мимо дистрибьютид таблицы.
-
да, я понимаю, думал ключ шардирования можно задействовать как то и запросы соответственно переписать. спасибо за ответы
distributed_group_by_no_merge
жаль не помогло -
>жаль не помогло
есть разница в статистике между
select FHospital, count(),count(distinct FPatKey)
from default.Distr
group by FHospital
select FHospital, count(),count(distinct FPatKey)
from default.Distr
group by FHospital settings distributed_group_by_no_merge=1 -
хм, похоже я рукожоп или в dbeaver тупил
в вашем варианте всё как нужно(прирост в 2 раза, результаты правильные), буду ковырять дальше, еще раз спасибо! -
чтобы в dbeaver работало set distributed_group_by_no_merge = 1 надо настроить session_id
-
session_id стоит
-
Тот самый случай когда самому интересно стало. Я так и не смог в бобра
-
Оно тупое
-
а может и не работает это в dbeaver, я sqlworkbench/j использую
-
Завели issue:
https://github.com/ClickHouse/ClickHouse/issues/8212Wrong supertype for String and LowCardinality(Nullable(String)) · Issue #8212 · ClickHouse/ClickHouseDB::Exception: There is no supertype for types String, LowCardinality(Nullable(String)) because some of them are String/FixedString and some of them are not (version 19.17.4.11)
-
Пока выложена только моя презентация:
https://clickhouse.github.io/clickhouse-presentations/meetup38/new_features/#
Остальные презентации будут через несколько дней. @blinkovivan -
ClickHouse/clickhouse-presentations
Presentations, meetups and talks about ClickHouse. Contribute to ClickHouse/clickhouse-presentations development by creating an account on GitHub.
-
выложил
-
Спасибо!
-
-
Извините, плохая шутка
-
Там 1gb памяти, проверял как без свопа работает
-
Joined.
- 14 December 2019 (40 messages)
-
Всем привет!
Хотел уточнить, при исполнении SELECT с FORMAT JSONCompact есть ли гарантии, в каком порядке будут столбцы (то есть в каком порядке они будут перечислены в meta и в каком порядке они будут, соответственно, в data)?
Использую MergeTree, если что.
До сих пор было всё ок - возвращались столбцы всегда в том же порядке, в котором они были указаны в самом запросе после SELECT, просто хочется понимать, можно ли быть уверенным, что всегда так будет. В документации и в этом чате ничего по этому поводу не нашёл -
Да, порядок такой как в запросе и так всегда будет.
-
-
Хороший тест на обработку ошибок нехватки памяти.
-
А где можно побольше узнать про bloom индекс на массивы?
-
Joined.
-
-
Смотри в олологи клика. Он там пишет, применил ли настройку в онлайне или нет
-
Подскажите плз. Есть порядка 70млн сущностей, для них надо построить сводную статистику по таблице в 10млрд строк.
Мне нужны несколько полей, типа idсущности, число записей по одному критерию, по другому и тд. И одно поле - с большой порятнкой sum(multiif(...))
1. выполняю insert into tmptable select ..., получаю результат, где для некоторых строк (видимо, особо больших) в калькулируемом поле значение = 0, все остальные данные в порядке.
Странно.
2. Выполняю select * from (select ... where id=проблемная сущность) - все ок, в калькулируемом поле значение, похожее на правду
3. Выполняю insert into tmptable select ... where id=проблемная сущность - все ок, в калькулируемом поле значение, похожее на правду
Повторяю полную ставку (1) - опять ноль в проблемном поле.
В какую сторону копать? Ошибок ни в консоли, ни в логах не видно. -
разобрался, поменял тип с uint32 до uint64 и вроде бы все стало нормально.
-
-
!report
-
@blinkovivan реклама! забань плиз
-
Done
-
-
Добрый день! Работаю на системе с 1 ГБ памяти, возникают существенные проблемы с памятью при заливе данных в таблицу, как в шеле через
| clickhouse-client --query "INSERT INTO ... FORMAT CSV"
так и при копировании/создании таблицы в клиенте через
CREATE TABLE ... AS SELECT ...
Либо память просто кончается и падает исключение, либо упираюсь в любой (доступный в рамках RAM) лимит на пользовательский запрос и падает исключение, либо приходится делать здоровый swap и все тормозит.
Это проблема имеет решение? Поменять какую-то настройку, класть данные кусками? Почему вообще при поточном не рекурсивном заливе так происходит? -
Кеш марков по умолчанию 5гб
-
-
Но 1гб это нереально мало. Можно уменьшать max/min_compression_block_size, max_insert_block_size.
-
-
-
-
сам и отвечу, относительный путь для настроек FORMAT TEMPLATE (format_template_*)считается от format_schema_path
и если там пусто, то прилетает этот seg fault
https://github.com/ClickHouse/ClickHouse/issues/8172ClickHouse process crashes because of seg fault in case of invalid query from JDBC driver · Issue #8172 · ClickHouse/ClickHouseClickHouse Server: 19.17.5.18 rev. 54428 JDBC Driver: 0.2.2 Query: exists some.some Executing the query above using JDBC driver causes ClickHouse to crash. Stack: 2019.12.12 05:22:38.970810 [ 50 ] ...
-
Joined.
-
Ребята
Плачу сумму денег тому, кто поможет составить запрос:
user_id date action_type_id
1 14-12-2019 00:00:01 1
1 14-12-2019 00:01:02 0
2 14-12-2019 00:05:00 1
2 14-12-2019 00:015:00 0
3 14-12-2019 00:05:00 0
4 14-12-2019 00:05:01 1
Result:
subscribers: 3 (1,2,4) где action_type == 1
unsubscribers: 3 (1,2,3) где action_type == 0
spammers: 1 (1) где diff(date) > 60сек
unsub_fr_sub: 2 (1,2) где есть action_type 1 и 0
Особенно интересуют spammers и unsubscr_from_subscr -
-
что такое diff(date) > 60сек ?
-
-
-
-
create table Z Engine=Memory as
select 1 user_id, toDateTime('2019-12-14 00:00:01') date, 1 action_type_id union all
select 1, toDateTime('2019-12-14 00:01:02'), 0 union all
select 2, toDateTime('2019-12-14 00:05:00'), 1 union all
select 2, toDateTime('2019-12-14 00:15:00'), 0 union all
select 3, toDateTime('2019-12-14 00:05:00'), 0 union all
select 4, toDateTime('2019-12-14 00:05:01'), 1 ;
SELECT
sum(subscriber) AS subscribers,
sum(unsubscriber) AS unsubscribers,
sum(spammer) AS spammers,
sum(unsub_fr_sub) AS unsub_fr_subs
FROM
(
SELECT
user_id,
max(action_type_id = 1) AS subscriber,
max(action_type_id = 0) AS unsubscriber,
length(arrayFilter((i, j) -> (abs(i - j) > 60), arrayPopBack(arraySort(groupArray(date)) AS d), arrayPopFront(d))) >= 1 AS spammer,
subscriber AND unsubscriber AS unsub_fr_sub
FROM Z
GROUP BY user_id
)
┌─subscribers─┬─unsubscribers─┬─spammers─┬─unsub_fr_subs─┐
│ 3 │ 3 │ 2 │ 2 │
└─────────────┴───────────────┴──────────┴───────────────┘ -
может просто чутка не рассчитали)
-
где есть action_type 1 и action_type 0 и разница между ними не больше 60 сек, там ошибка, сори
-
ну там легко исправить это в моем варианте, хаха. И теста для этого кейса нету.
-
select sum(subscriber) subscribers, sum(unsubscriber) unsubscribers, sum(spammer) spammers, sum(unsub_fr_sub) unsub_fr_subs
from (
select user_id,
max(action_type_id=1) subscriber,
max(action_type_id=0) unsubscriber,
length(arrayFilter(i,j -> abs(i.1-j.1)<60 and i.2<>j.2, arrayPopBack(arraySort(groupArray((date,action_type_id))) as d) ,arrayPopFront(d)))>=1 spammer,
(subscriber and unsubscriber) unsub_fr_sub
from Z group by user_id
) -
SELECT
sum(spammer) AS spam_cnt,
sum(unsub_from_sub) AS unsub_from_sub_cnt,
sum(sub) AS sub_cnt,
sum(unsub) AS unsub_cnt
FROM
(
SELECT
user_id,
sequenceMatch('(?1)(?t<60)(?2)')(ts, action_type = 1, action_type = 0) AS spammer,
sequenceMatch('(?1)(?2)')(ts, action_type = 1, action_type = 0) AS unsub_from_sub,
max(action_type) AS sub,
1 - min(action_type) AS unsub
FROM test.test
GROUP BY user_id
) -
через массивы будет быстрее?
-
нет, и скорее всего по памяти sequencematch лучше
-
-
ну это легко учесть если надо, можно все сделать через массивы
- 15 December 2019 (24 messages)
-
-
Joined.
-
Можно ли делать alter materialised view для aggregation merge tree?
И можно ли делать ее backup? -
-
можно, смысла мало. Вы в курсе что MV это триггер на инсерт? И исходные таблицы вообще не используются, а инсерт просто пушит в MV то что вставили.
Происходит инсерт в таблицу A, на ней MV1 которое делает типа group by day и пишет в aggregating. Если сделать MV2 select from MV1 оно будет видеть результат того group by day и можно сделать group by week например.
>И можно ли делать ее backup?
можно, какая разница, format native умеет стейты, freeze-у вообще все равно, это просто файлы.