- 01 August 2020 (25 messages)
-
Спасибо! Разобрался
-
Joined.
-
-
всем привет. ЗК refused КХ, все это дело запускаю в контейнерах. С КХ контейнера ping на ЗК есть все ок. Куда можно капнуть
-
-
-
Добрый день коллеги! Подскажите может кто знает когда будет следующий после 20.3 релиз с длительной поддержкой LTS?
-
Long Term Support versions are introduced for big enterprise customers who don't like to update often. LTS version is released twice a year with limited support during one year. Limited support includes backports of bugfixes (only fixes that were easy to backport or that were required by customer).
-
На мой вопрос все рано нет ответа))
-
Скорее всего в середину осени думаю.
-
Это уже ближе к ответу, спасибо
-
Подскажите, если я храню данные за последние 60 дней, PARTITION BY toYYYYMM(date) для меня будет не очень оптимальным, я прав, ведь всего будет две партиции? Вопрос таков: можно ли сделать toDayOfYear(date)? Будет ли ClickHouse понимать нужные партиции при выборке ... WHERE date > '2020-07-15? И если такой ключ для партиционирования не очень оптимален, то какой лучше взять?
-
можно сделать просто PARTITION BY date
на самом деле там чуть хитрее и кликхаус хранит минимальные и максимальные значения столбца учавствующего в ключе партицирования, так что все будет ок -
Спасибо. У меня вообще несколько вопросов накопилось. Правильно ли я понимаю, что если ключ партиционирования по дате, то в ORDER BY первым значением эту дату тоже полезно положить, особенно если в выборках эта дата почти всегда фигурирует? Правильно ли я понимаю исходя из этой иллюстрации, что порядок внутри ORDER BY имеет значение, верно? Где можно почитать про правильный выбор полей, которые нужно ложить в ORDER BY?MergeTree | ClickHouse Documentation
MergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
Допустим запрос WHERE date > '2020-07-05' AND user_id = 100, при PARTITION BY date ORDER BY (date, user_id) будет выполнятся максимально эффективно. А что делать с таким запросом: WHERE date > '2020-07-05' AND event_id = 200?
-
> Правильно ли я понимаю, что если ключ партиционирования по дате, то в ORDER BY первым значением эту дату тоже полезно положить,
если у вас партиционирование по дате, класть ее в ORDER BY нет никакого смысла.
> порядок внутри ORDER BY имеет значение, верно?
Да.
> Где можно почитать про правильный выбор полей, которые нужно ложить в ORDER BY?
Основное правило в начало идут низко кардинальные поля, по которым часто идет фильтрация -
> если у вас партиционирование по дате, класть ее в ORDER BY нет никакого смысла.__
Подскажите, почему? Смотрю сейчас тестовые данные в туториале, там именно так и сделано -
Это две большие разницы:)
в примере идет партицирование по месяцам, а в ORDER BY идет уже сама дата -
-
Да. Но допустим если партиционирование по самой дате (а не по YYYYMM) разве внутри парта сортировка по дате не поможет отсекать большую часть данных при наличии в условии самой даты?
-
у тебя внутри парта будет только 1 дата, допустим '2020-08-10', вся колонка целиком одно и тоже значение, отсечь ничего не получится
-
А. Я понял вас) там тип Date, действительно
-
-
Всем привет! Cтолкнулся с ошибкой 400 Bad request при batch insert в jdbc driver. Запрос выглядит так:
http-outgoing-2 >> "POST /?query=INSERT+INTO+objects+ЗДЕСЬ МНОГО КОЛОНОК++FORMAT+TabSeparated&database=default&user=default&compress=1 HTTP/1.1
http-outgoing-2 >> "Transfer-Encoding: chunked[\r][\n]"
http-outgoing-2 >> "Host: localhost:33128[\r][\n]"
http-outgoing-2 >> "Connection: Keep-Alive[\r][\n]"
http-outgoing-2 >> "User-Agent: Apache-HttpClient/4.5.12 (Java/14)[\r][\n]"
http-outgoing-2 >> "[\r][\n]"
http-outgoing-2 >> "2f23[\r][\n]"
http-outgoing-2 >> “ЗДЕСЬ ДАННЫЕ”
То есть в случае batch запрос разбит на 2 части, 1 часть в query param, вторая в body. В документации нашел:
Send the request as a URL ‘query’ parameter, or as a POST. Or send the beginning of the query in the ‘query’ parameter, and the rest in the POST (we’ll explain later why this is necessary). The size of the URL is limited to 16 KB, so keep this in mind when sending large queries.
У меня как раз больше из-за большого числа колонок. А как быть то в этой ситуации? -
- 02 August 2020 (29 messages)
-
Код состояния ответа "HTTP 400 Bad Request" указывает, что сервер не смог понять запрос из-за недействительного синтаксиса. Клиент не должен повторять этот запрос без изменений.
-
Если jdbc, то пользуйте preparedstatement :)
-
-
Не оч понятна тогда связь с ошибкой http клиента
-
-
-
Ну а там ? ? используете?)
-
да, используем
-
Ну, херня какая-нибудь) может там какие-нибудь кавычки используете в запросе и т.п.
-
похоже на
Send the request as a URL ‘query’ parameter, or as a POST. Or send the beginning of the query in the ‘query’ parameter, and the rest in the POST (we’ll explain later why this is necessary). The size of the URL is limited to 16 KB, so keep this in mind when sending large queries.
то есть если колонок меньше, меньше размер URL -> батч работает -
это отсюда, если что https://clickhouse.tech/docs/en/interfaces/http/HTTP Interface | ClickHouse Documentation
HTTP Interface The HTTP interface lets you use ClickHouse on any platform from any programming language. We use it for w
-
-
select a, b, uniqExact(c)
group by a,b -
-
ну видимо допиливать jdbc драйвер
-
ну toString не нужен и даже вреден для перфоманса
-
Так не даёт поверху uuid применить
-
-
я имел в виду cityHash64(UUID)
-
Таки от uuid не работает. Мб просто сервер старый
-
Попробуйте сторонние разработки. На сайте есть ссылки, насколько помню, даже api совместимо на 100%, только имена пакетов сменить
-
))
-
Хм, попробу посмотреть, всем спасибо!
-
Joined.
-
стал полчать Code: 210. DB::NetException: Connection refused (127.0.0.1:9000)
-
в конфигах все открыто
-
починил
-
теперь
-
Received exception from server (version 20.5.4):
Code: 514. DB::Exception: Received from . DB::Exception: Not found a storage to insert user - 03 August 2020 (192 messages)
-
при попытке создать пользователя командой CREATE USER
-
ошибка
-
Code: 514. DB::Exception: Received from localhost:9000. DB::Exception: Not found a storage to insert user
-
После обновления 19.16.13.54 —> 20.5.3.2 стала падать команда
OPTIMIZE TABLE AAA.bbb FINAL DEDUPLICATE
ошибка
Code: 365, e.displayText() = DB::Exception: Output of TreeExecutor is not sorted (version 20.5.3.27 (official build))
С чем может быть связанно? По отдельности FINAL и DEDUPLICATE - работают, вместе - нет. Раньше работало. -
-
обычно это на стороне приложения делается
https://stackoverflow.com/questions/56074216/how-to-implement-pivot-in-clickhouse-just-like-in-dolphindbHow to implement `pivot` in clickhouse just like in dolphindbI want to do some pivot ops to some data. Just like following. >>> df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two', ... 'two'], ... ...
-
Не пойму, почему не включается настройка max_partitions_per_insert_block, встроенная непосредственно в запрос. Её что, надо в конфиг писать? По-другому её не включить?
INSERT INTO TABLE db.tb (...cols...)
SELECT (...cols...)
FROM ( /* сложно-вложенный запрос */ )
SETTINGS max_partitions_per_insert_block = 0 -
Попробуйте 0 заменить на 1
-
Партиций, да, много, но не настолько, чтобы случайно отпартиционировать по времени или ид пользователя. Не совсем чайник ;)
-
Не все параметры работают через settings
-
Один? Так ведь оно в 100 упирается, а ноль отключает
-
Можно без конфигп выставить в сессии клиента или http api
-
Так если упирается, как вам эта настройка поможет? Если упирается, значит вставляете такие данные, что порождают много партов. Что изменит настройка?
-
Когда один раз надо балком прогрузить, эту настройку надо обходить либо менять, все правильно
-
Я отлично понимаю, что партов много. Но это второй вопрос. И причина, почему их больше 100, не из-за ошибки
-
Привет всем. Как извлечь последние две цифры из числа?
-
Кастануть в строку и извлечь два символа с конца
-
Так сделайте на стороне приложения разбивку вставки так, чтобы в одной вставке были данные только одной партиции. Или выставляйте в таблицу с движком TinyLog
-
Или разделить на 100 и взять остаток от деления
-
целого числа?
-
да
-
-
Неее, у меня таблица-приёмник MergeTree, и от неё мне никуда не деться
-
спасибо
-
спасибо
-
Так а что мешает вставить в TinyLog, а потом по партициям вставить в приемник на MergeTree? Вы же понимаете что лимит max_partitions_per_insert_block = 100 нифига не просто так? Что найдя способ вставить в КХ за раз кучу партиций вы в итоге выстрелите себе в ногу? Например перезапустите КХ и он будет стартовать два часа
-
помогите починить проблему, пожалуйста. Установил с нуля, все работает.
-
стартовать 2 часа он не будет, но просто сработает другой триггер когда слишком много будет партов для мержа
то есть если у вас 100 партиций и у вас вставка 100 партов (кусков) по 1 в кажду партицию, то вы получаете засирание при мерже в бакграунде, на сортировке слиянием, потому что вам надо будет как минимум 200 партов прочитать чтобы смержить туда по 1 куску... в каждую из 100 партиций -
не создает пользователей
-
Вам один раз перегнать данные или постоянно по 100 партиция за раз вставлять? В зависимости ответа на этот вопрос весь этот холивар погасить можно....
-
Да, я отлично понимаю все эти последствия. Но таблица уже исторически сложилось, и мне лишь нужно закинуть в неё данные, чтобы коллеги могли начать с ней работать, а уж потом буду думать на тему, что как оптимизировать. Да, перезапуск занимает минуты, но меня это не беспокоит, т.к. на скорость основной работы это не влияет, а если и влияет, то этого пока не заметно - всё летает
Поэтому, собственно, и возник вопрос - то ли есть способ быстро обойти это ограничение, то ли нужно ещё делать обёртку на стороне, чтобы всё впихнуть по частям -
Да и перезапуск КХ, если и происходит, то с периодичностью от недель до месяцев
-
-
В документации по конфигурированию нескольких томов этот момент не ясен: https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/mergetree/#table_engine-mergetree-multiple-volumes_configureMergeTree | Документация ClickHouse
MergeTree Движок MergeTree, а также другие движки этого семейства (*MergeTree) — это наиболее функциональные движки табл
-
-
Joined.
-
Добрый день. Пытаюсь подружить кх и рэббит. При использовании rabbitmq_format = 'JSONAsString’, на выходе пустая строка, хотя с JSONEachRow все ок. У кого-нибудь был опыт похожий?
-
всем привет!
получаю вот такую ошибку 2020.08.03 10:48:17.604931 [ 1 ] {} <Warning> Application: Listen [::]:8123 failed: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = DNS error: EAI: Address family for hostname not supported (version 20.5.2.7 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2020.08.03 10:48:17.605250 [ 1 ] {} <Warning> Application: Listen [::]:9000 failed: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = DNS error: EAI: Address family for hostname not supported (version 20.5.2.7 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2020.08.03 10:48:17.605503 [ 1 ] {} <Warning> Application: Listen [::]:9010 failed: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = DNS error: EAI: Address family for hostname not supported (version 20.5.2.7 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2020.08.03 10:48:18.107166 [ 54 ] {} <Error> void DB::DDLWorker::runMainThread(): Code: 999, e.displayText() = Coordination::Exception: All connection tries failed while connecting to ZooKeeper. nodes: 192.168.96.2:2183, 192.168.96.4:2181, 192.168.96.3:2182
Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused (version 20.5.2.7 (official build)), 192.168.96.2:2183
Code: 33, e.displayText() = DB::Exception: Cannot read all data. Bytes read: 0. Bytes expected: 4.: while receiving handshake from ZooKeeper (version 20.5.2.7 (official build)), 192.168.96.4:2181
Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused (version 20.5.2.7 (official build)), 192.168.96.3:2182
Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused (version 20.5.2.7 (official build)), 192.168.96.2:2183
Code: 33, e.displayText() = DB::Exception: Cannot read all data. Bytes read: 0. Bytes expected: 4.: while receiving handshake from ZooKeeper (version 20.5.2.7 (official build)), 192.168.96.4:2181
Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused (version 20.5.2.7 (official build)), 192.168.96.3:2182
Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused (version 20.5.2.7 (official build)), 192.168.96.2:2183
Code: 33, e.displayText() = DB::Exception: Cannot read all data. Bytes read: 0. Bytes expected: 4.: while receiving handshake from ZooKeeper (version 20.5.2.7 (official build)), 192.168.96.4:2181
Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused (version 20.5.2.7 (official build)), 192.168.96.3:2182
в конфиге кх прописал:
<listen_host>::</listen_host>
<!--<listen_host>::</listen_host>-->
<listen_host>0.0.0.0</listen_host> -
-
【D】【J】 in ClickHouse не тормозит
Можно без конфигп выставить в сессии клиента или http api
-
в конфиг файле указал <listen_host>::</listen_host>
-
Какой движок у таблицы?
-
добрый день! изучаем вариант шардинга CH на несколько серверов (со старта – 5-10), пытаемся понять, в какую сторону смотреть правильнее. Основная задача - уметь постепенно растить кластер, добавляя новые сервера по мере заполнения старых. Правда ли, что в данном случае имеет смысл сразу делать "свою" схему шардирования и писать данные напрямую в шарды, а Distributed таблицы оставить только для запросов на чтение?
P.S. джоинов пока что нет и не предвидется, максимум - мелкие, редко изменяющиеся словари, которые не жалко раскопировать на все шарды. -
Вы config.xml на свой подменяете? Там в конфиге определен каталог где хранить xml-и с юзерами access path что-то.
-
groupArray
-
редактиру существующий
-
пути точно не менял, но, делал копию файла default-password.xml в users.d после чего сервер перестал пускать, шла мерджа. Файл грохнул, ошибка пропала и вновь стало можно подключиться, но после этого пропали все созданные пользователи кроме дефолтного и создать их заново не получается
-
ну видимо вы что-то сделали с путем к стораджу юзеров в config.xml
-
хм, сейчас перепроверю, но кажется он рядышком с конфигом лежит в виде ссылки
-
м-да... Вот только так и получилось
Странно, что оно не работало, какие бы я параметры не передавал в секции SETTINGS вместе с запросом
Может, в последнем релизе появился баг на эту тему?.. -
Joined.
-
нет, не все параметры работают через SETTINGS
-
Подскажите пожалуйста, делаю по ошибке вставке в clickhouse
https://gist.github.com/patsevanton/18dd67515593fd948dc22e1125fdee6c
Missing columns: 'HIT' while processing query: - такой колонки нет, да и он не вставляет в колонку HIT, а вставляет в колонку upstream_cache_status со значением HIT
делаю по этой инструкции - https://github.com/patsevanton/articles-to-habr/blob/master/Отправка-Nginx-логов-с-помощью-Vector-в-Clickhouse.md - там есть схема бдNginx Vector Clickhouse Missing columns: 'HIT' while processing queryGitHub Gist: instantly share code, notes, and snippets.
-
Просто мне удобно через Tabix работать, а там, как известно, сессии нет. Вот и не получается её задать
-
Так явно ведь кавычек нет upstream_cache_status = HIT
-
Apply all SETTINGS clauses as early as possible. by akuzm · Pull Request #11804 · ClickHouse/ClickHouse
Among other things, this fixes max_memory_usage in settings clause -- didn't work before, because the memory limit is set when the query is added to the process list, and the settings were ...
-
@den_crane не подскажешь куда копать, я на ВМ запускаю в докере 2 КХ и 3 ЗК
-
Зачем вы указываете два listen_host? Ipv6 покарывает ipv4
-
Подскажите плиз, в чём может быть проблема?
Есть 2 таблицы, между ними связь по id
Вторая таблица распартиционированна по этому id, пк - id. Данных в ней 700кк+. Селекты c where id in/= по этой таблице работают быстро.
Но когда делаю джойн на вторую таблицу, то такое чувство, что кх пытается её полностью сначала в память засунуть.
Запрос вида
select id, name from table_one any left join table_two on table_one.id = table_two.id;
Кх что ли на такой запрос не вешает никаких констрейнтов на правую таблицу для выборки данных для джойна? -
пробовал и с одним, ошибка аналагична , заметил что для докера есть файл docker_related_config.xml
-
Клик поднимает правую таблицу в память, и да там оптимизаций на джойны почти нет
-
Не используются индексы для джойнов. Специально. Потому что это olap. И да запихивает в память правую таблицу.
-
-
Но никто не мешает тебе вместо правой таблицы сделать подзапрос из правой с нужными фильтрами
-
можете сделать select from righttable where (id,id2) in (select id, id2 from lefttable)
обычно помогает, сначала выполнится подзапрос, отфильтрует правую, загонит в память, потом приджойнит -
-
пересоздал конфиг с нуля, заработало, на досуге найду где внутри рука дрогнула
-
Joined.
-
-
/etc/clickhouse-server/config.xml
-
Всем привет, никогда не сталкивались с такой ошибкой при селекте в odbc сорс?
ODBCHandler: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Not found: ODBC (version 19.17.6.36 -
трейс вызова с clickhouse-odbc-bridge
-
К сожалению нет ни файла ни дириктории
-
Оставь эти настройки только в файле для докера docker_related_config.xml и убери их из config.xml. Оставь только ipv4
-
вроде сделал, сейчас нет ошибок
-
Ок 👌
-
-
а как проверяли?
docker run --rm -it yandex/clickhouse-server:20.5 sh -c "ls -la /etc/clickhouse-server" -
руками)
спасибо команда помогла)) -
вы таблицу как создали? покажите
-
эта настрока в users.xml должна быть, в профиле пользователя, но скорее всего вам она не нужна
-
изначально запускал следующим скриптом
docker run -d -p 8123:8123 --name my-clickhouse-server --ulimit nofile=262144:262144 yandex/clickhouse-server -
"analytics.shop" должно быть "analytics"."shop"
-
Joined.
-
create table покажите
-
-
class HistoricalOHLC(Model):
exchange = StringField()
coin_pair = StringField()
open = Float32Field()
high = Float32Field()
low = Float32Field()
close = Float32Field()
timestamp_date = DateTimeField()
engine = MergeTree(partition_key=(F.toYYYYMMDD(timestamp_date), 'coin_pair'),
order_by=("exchange", "coin_pair", "timestamp_date"))
@classmethod
def table_name(cls):
return 'historical_ohlc’ -
дефолт
там таблицы скрипт создает и тип не указывает
кажется в этом случае дефолт это MergeTree
сервер в единичном экземпляре (не кластер), если это важно -
кто-нибудь?)
-
через isql работает?
-
ага
-
он и поля вытягивает с таблицы
-
@den_crane вероятно вот, в старом конфиге этого атрибута не было
-
<!-- Path to folder where users and roles created by SQL commands are stored. -->
<access_control_path>/var/lib/clickhouse/access/</access_control_path> -
кажется. Мне Кажется вы врете и там не MT и тогда deduplicate делает ничего.
https://github.com/ClickHouse/ClickHouse/issues/11572 -
ну я так и сказал сразу
-
👍
-
не подскажете еще какой самый простой и быстрый способ сохранять копию базы. Небольшая, на десяток гигов.
-
а если попробовать через системный DSN, прописать все в odbc.ini и в КХ отдавать только название dsn?
-
Всем привет!
4 реплики версии 19.16.13.54, таблица CollapsingMergeTree
1) Создаю таблицу
2) Пишу в таблицу одну партицию - есть записи
3) Мутацией удаляю эту партицию, дожидаюсь is_done = 1 на всех репликах
4) Снова пишу одну партицию - таблица пустая
Смотрел по query_log - инсерт партиции есть, логам он после мутации
Смотрел parts - последний парт создан мутацией и он пустой
Делал до записи SYSTEM SYNC REPLICA - не помогло
Куда копать и какие логи смотреть? -
с этого начинал, результат тот же (
-
а что не работает-то? У вас кавычки " не в том месте, что за база вообще? PG ?
-
Replicated insert deduplication
-
https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/replication/
Блоки данных дедуплицируются. При многократной записи одного и того же блока данных (блоков данных одинакового размера, содержащих одни и те же строчки в одном и том же порядке), блок будет записан только один раз. Это сделано для того, чтобы в случае сбоя в сети, когда клиентское приложение не может понять, были ли данные записаны в БД, можно было просто повторить запрос INSERT. При этом не имеет значения, на какую реплику будут отправлены INSERT-ы с одинаковыми данными. Запрос INSERT идемпотентный. Параметры дедуплицирования регулируются настройками сервера merge_tree -
да, база postgres, кавычки не я расставляю, мой селект из кли выглядит вот так:
SELECT * FROM odbc('DSN=postgres;USERNAME=ch_dict;PASSWORD=verystrongpass;PORT=5432;DATABASE=analytics','analytics.shop') -
перепроверил (show create table) - там MergeTree
эта таблица существует давно и до обновления кликхауса FINAL DEDUPLICATE работало без замечаний
что-то изменилось после обновления на последнюю версию -
Кликхаус никогда не запишет снова уже ранее записанный блок данных? Неважно сколько времени прошло?
А если мутацией стерт? Или схлопнулся? -
-
ну так должно быть просто shop
-
по документации schema_name.table_name, емнип
-
попробуйте 20.5.4.40
-
ссылку?
-
о, эту версию контейнером выложили пару дней назад
попробую, спасибо! -
Ваша правда, переделал: SELECT * FROM odbc('DSN=postgres','analytics','shop'). Итог тот же.
-
вы знаете, а ведь помогло!
обновился - запрос перестал падать на FINAL DEDUPLICATE
мое почтение! -
-
например что должно получится? массив?
-
нет, как понимаю строка
-
-
так а КХ тут при чем? Это приложение должно делать?
-
нет, хочу сделать это в КХ
-
-
нет, невозможно
-
ок, спасибо)
-
в смысле итог? не работает?
-
да, в конце та же ошибка
-
и что там опять кавычки как раньше? FROM "analytics.shop" ?
-
нет, кавычки "analytics"."shop", я приложил выше трейс. но после запроса опять
<Error> ODBCHandler: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Not found: ODBC (version 19.17.6.36 -
Спасибо за наводку, проблема решена!
Кому интересно - вот настройки дедупликации для MergeTree в MergeTreeSettings.h
replicated_deduplication_window, 100
"How many last blocks of hashes should be kept in ZooKeeper (old blocks will be deleted)."
replicated_deduplication_window_seconds, 7 * 24 * 60 * 60 /* one week */
"Similar to \"replicated_deduplication_window\", but determines old blocks by their lifetime. Hash of an inserted block will be deleted (and the block will not be deduplicated after) if it outside of one \"window\". You can set very big replicated_deduplication_window to avoid duplicating INSERTs during that period of time." -
а как у вас описан driver в odbc.ini ?
-
ойойой. Не трогайте это никогда.
Вам нужно либо добавить id инсерта в инсерт, либо просто выключить во время втсавки insert_deduplicate=0 -
нет, я точно трогать не буду
-
просто нашел где и сколько
-
да, добавлю колонку
-
odbcinst:
[PostgreSQL Unicode]
Description=PostgreSQL ODBC driver (Unicode version)
Driver=psqlodbcw.so
Setup=psqlodbcw.so
Debug=0
CommLog=1
UsageCount=1
odbc.ini:
[DEFAULT]
Driver = postgres
[postgres]
Description = PostgreSQL connection to postgresql
Driver = PostgreSQL Unicode
Protocol = 10
ReadOnly = No
RowVersioning = No
ShowSystemTables = No
Servername = foo.bar
Database = analytics
Port = 5432
USERNAME = ch_dict
PASSWORD = verystrongpass -
с абсолютным путем аналогично
-
>Driver = postgres
это неправльно, нужен полный путь в либе .so -
полный путь к driver /usr/lib..../
DRIVER = /usr/local/lib/libmyodbc5w.so
обязателен!
https://clickhouse.tech/docs/en/operations/table_engines/odbc/ODBC | ClickHouse DocumentationODBC Allows ClickHouse to connect to external databases via ODBC. To safely implement ODBC connections, ClickHouse uses
-
Joined.
-
вот тут полный путь нужен Driver = PostgreSQL Unicode
-
Joined.
-
да, я понял, уже делал, но поменял еще раз. Но не помогло
-
смущает то, что все работает через isql, + я вижу, что до постгреса долетают запросы для парсинга полей в таблице
-
isql работает в вашем окружении, odbcbridge форкается и не видит драйвера чаще всего (зависит от дистрибутива линукса)
-
@den_crane Добрый день!
При попытке даунгрейда 20.5->19.17.10
Clickhouse перестал стартовать, в логах записи:
...
DB::Exception: Cannot create object 'asynchronous_metric_log' from query ATTACH TABLE asynchronous_metric_log
...
Подскажите пожалуйста, как это можно поправить? -
>что до постгреса долетают запросы для парсинга полей в таблице
тогда надо смотреть ошибки в логе odbcbridge, поищу как логирование там включить -
удалите все таблицы из базы system / data и metadata
rm -rf /var/lib/clickhouse/metadata/system/*
rm -rf /var/lib/clickhouse/data/system/* -
я прибил демон и запустил bridge с уровнем логирования trace, собственно все что я постил ранее в аттаче - его аутпут
-
Спасибо, сейчас попробую
-
Если не ошибаюсь, он тогда пишет 'Data source name not found, and no default driver specified'
-
Спасибо, вы великолепны!
-
OK, а просто select 1 работает?
непонятно почему ошибка обрывается посередине -
Но теперь при попытке инсёртить в старые таблицы, сталкваюсь с таким:
<Error> executeQuery: Code: 53, e.displayText() = DB::Exception: Type mismatch in IN or VALUES section. Expected: UInt16. Got: String (version 19.17.10.1 (official build)) (from [::ffff:10.1.4.6]:39742) (in query: INSERT INTO nginx.webservers (logdate, logdatetime, hostname, syslogtag, message, clientip, ident, auth, verb, request, httpv, response, bytes, referrer, agent, blob ) values ), Stack trace: -
Почему-то конвертнуло его в SELECT "event_time" FROM "analytics"."shop"
-
ну странно, странная ошибка, а если трассировку в odbc драйвере включить, что там?
-
это не из-за даунгрейда. это какой-то кривой sql
-
Спасибо, проверю!
-
Тоже делал, спамится много всего, но как это читать - не знаю. Птичий язык
-
не похоже:
INSERT INTO nginx.webservers (logdate, logdatetime, hostname, syslogtag, message, clientip, ident, auth, verb, request, httpv, response, bytes, referrer, agent, blob ) values ('2020-08-03', '2020-08-03 15:19:09', 'pubweb1', 'nginx', 'XXX - - [03/Aug/2020:15:19:09 +0000] \"GET /packages/mainline/debian/dists/stretch/InRelease HTTP/1.1\" 200 2866 \"-\" \"Debian APT-HTTP/1.3 (1.4.10)\" \"-\"', 'XXX', '-', '-', 'GET', '/packages/mainline/debian/dists/stretch/InRelease', '1.1', '200', '2866', '-', 'Debian APT-HTTP/1.3 (1.4.10)', '');
logdate Date
logdatetime DateTime
hostname String
syslogtag String
message String
clientip String
ident String
auth String
verb String
request String
httpv String
response UInt16
bytes UInt64
referrer String
agent String
blob String -
response UInt16 --- '200'
-
должно быть 200
-
Ого, значит ошибка давно жила. Спасибо!
-
Type mismatch in IN or VALUES section. Expected: UInt16. Got: String
-
-
не знаю тогда, сделайте тикет, но 19.17 уже не саппортится
-
Спасибо за попытку :)
-
интересно , видимо КХ стал прощать несовпадение типов при инсертах
20.5.3
create table xxxxtest( A UInt16) Engine=Log;
insert into xxxxtest values('200')
Ok -
Кто-то делал КХ в докерах? мне необходимо для тестов развернуть одну шарду с двумя реплликами. Вроде все сделал, но при инсерте данные не попадают во вторую реплику. При этом если из контейнера сделать echo stat | nc zookeeper1 2181 то ЗК отдает нормальный отввет все ок, и проверял на обоих репликах
-
хех, ну это ж хорошо
* все типы должны быть приведены вручную, автокастинг это неправильно
* мы сделаем приведения типов внутри одной категории
* в SQL de-facto implicit casting это норма <— вы находитесь здесь -
реплики КХ не видят друг друга? select * from system.replication_queue на обоих
-
-
-
я кинул кубик, выпало 3,
3 -- это потому что в докере у вас КХ, и hostname -f у вас в докере localhost -
ох! вспомнил вы мне ранее говорили
-
-
-
select hostName();
-
interserver_http_host
-
да, это добавили для совместимости с другими субд, для WHERE должно тоже работать
select number FROM numbers(10) WHERE number='1' -
Но при репликации это не влияет как я понимаю или ошибаюсь?
-
Подскажите, из-за чего могут быть такие ошибки при компиляции odbc драйвера на MacOs
https://pastebin.com/NuNuz1Ziclickhouse-odbc-2/driver/attributes.h:123:28: error: no viable overloade - Pastebin.comPastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
-
ошибки возникают после 91% установки
-
это как раз для репликации
-
почему в КХ до сих пор не пофиксили ТТЛ?
-
TTL кстати вроде пофикшен
-
и кстати, там например некоторые "баги" совсем и не баги
https://github.com/ClickHouse/ClickHouse/pull/13252#issuecomment-667734024Remove empty parts after they were pruned by TTL by CurtizJ · Pull Request #13252 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the cha...
-
по полной перезаписи всех партов на materialize ttl надо будет проверить на последней, оно тут не упомянуто https://github.com/ClickHouse/ClickHouse/issues/10128Roadmap to improve TTL delete and TTL move functionality · Issue #10128 · ClickHouse/ClickHouse
Current implementation of TTL delete and TTL move is not very intuitive or user friendly. Usability OPTIMIZE FINAL should do everything and get table to the correct state in regards to TTL TTL oper...
-
там совсем пусто, приэтом ошибок в КХ нету
-
ну а таблица как создана? Engine ....
что в system.marcos ? -
-
CREATE TABLE test.blogger_likers ON CLUSTER dev ( created Date DEFAULT CAST(now(), 'Date'), post_id UInt64, blogger_id UInt64, liker_id UInt64, liker_username String ) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/test/blogger_likers', '{replica}') PARTITION BY toYYYYMM(created) ORDER BY (blogger_id, liker_id) SAMPLE BY liker_id SETTINGS index_granularity = 8192
-
Joined.
- 04 August 2020 (194 messages)
-
-
-
-
Joined.
-
Joined.
-
Коллеги, приветствую!
Подскажите, в чем может быть проблема?
Есть запрос, он возвращает 594 строки:
SELECT id
FROM shop_clients
WHERE (integer_2 != toInt32(1737)) AND (integer_2 != toInt32(1761)) AND (integer_2 != toInt32(1762)) AND (integer_2 != toInt32(1736)) AND (integer_2 != toInt32(1763)) AND (integer_2 != toInt32(1787)) AND (integer_2 != toInt32(1788)) AND (integer_30 = toInt32(1)) AND (integer_9 = toInt32(30)) AND (region_id IN (toInt32(1), toInt32(2), toInt32(3), toInt32(4), toInt32(5), toInt32(6), toInt32(7), toInt32(8), toInt32(9), toInt32(10), toInt32(11))) AND (shop_clients.is_deleted != 'Y')
594 rows in set. Elapsed: 0.040 sec. Processed 1.88 million rows, 37.63 MB (47.12 million rows/s., 942.76 MB/s.)
Если обавляем вывод еще одной колонки — количество результирующих строк сразу вырастает на три порядка:
SELECT id, phone
FROM shop_clients
WHERE (integer_2 != toInt32(1737)) AND (integer_2 != toInt32(1761)) AND (integer_2 != toInt32(1762)) AND (integer_2 != toInt32(1736)) AND (integer_2 != toInt32(1763)) AND (integer_2 != toInt32(1787)) AND (integer_2 != toInt32(1788)) AND (integer_30 = toInt32(1)) AND (integer_9 = toInt32(30)) AND (region_id IN (toInt32(1), toInt32(2), toInt32(3), toInt32(4), toInt32(5), toInt32(6), toInt32(7), toInt32(8), toInt32(9), toInt32(10), toInt32(11))) AND (shop_clients.is_deleted != 'Y')
840948 rows in set. Elapsed: 0.171 sec. Processed 1.88 million rows, 81.63 MB (10.98 million rows/s., 476.61 MB/s.)
ENGINE = MergeTree.
При этом если посчитать строки, то вместо 840948 опять будет будет 594:
SELECT count(1)
FROM
(
SELECT
id,
phone
FROM shop_clients
WHERE (integer_2 != toInt32(1737)) AND (integer_2 != toInt32(1761)) AND (integer_2 != toInt32(1762)) AND (integer_2 != toInt32(1736)) AND (integer_2 != toInt32(1763)) AND (integer_2 != toInt32(1787)) AND (integer_2 != toInt32(1788)) AND (integer_30 = toInt32(1)) AND (integer_9 = toInt32(30)) AND (region_id IN (toInt32(1), toInt32(2), toInt32(3), toInt32(4), toInt32(5), toInt32(6), toInt32(7), toInt32(8), toInt32(9), toInt32(10), toInt32(11))) AND (shop_clients.is_deleted != 'Y')
)
┌─count(1)─┐
│ 594 │
└──────────┘
Характер использования таблицы такой: она раз в период дропается, создается заново и в нее с нуля консольным клиентов импортируется tsv, содержащий дама mysql-ной таблицы.
Спасибо! -
какая версия кх?
-
Покажите show create table shop_clients
-
ClickHouse server version 19.16.3 revision 54427.
`
SHOW CREATE TABLE shop_clients
┌─statement──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ -
│ CREATE TABLE rfm_db_opinion.shop_clients (`id` Int64, date_add Nullable(DateTime), date_upd Nullable(DateTime), uid Nullable(String), site_user_id Int32, local_id Nullable(String), full_name Nullable(String), first_name Nullable(String), middle_name Nullable(String), last_name Nullable(String), email Nullable(String), email_orig Nullable(String), email_validation_code Int32, email_validation_date Nullable(DateTime), email_edited String, email_error_count Int32, phone Nullable(String), phone_orig Nullable(String), phone_type Nullable(Int32), phone_validation_code Int32, phone_validation_date Nullable(DateTime), phone_edited String, phone_error_count Int32, push_id Nullable(String), timezone Nullable(String), sex Nullable(String), birth_date Nullable(UInt64), country Nullable(String), city Nullable(String), zip Nullable(String), register_date Nullable(DateTime), first_order_date Nullable(DateTime), first_order_number Nullable(String), first_order_items_sum Float32, last_order_id Int64, last_order_date Nullable(DateTime), last_order_number Nullable(String), last_order_items_sum Float32, order_cnt Int32, order_average_check Float32, order_sum Float32, order_cnt_rfm Int32, order_average_check_rfm Float32, order_sum_rfm Float32, last_visit_date Nullable(DateTime), last_visit_days Int32, r_seg_now Int32, f_seg_now Int32, m_seg_now Int32, r_seg_prev Int32, f_seg_prev Int32, m_seg_prev Int32, rfm_date_upd Nullable(DateTime), bonus_active Float32, bonus_expect_activate Float32, bonus_expect_deactivate Float32, bonus_expect_deactivate_next_date Nullable(DateTime), bonus_expect_deactivate_next_value Float32, subscribe_email String, subscribe_sms String, subscribe_push String, active String, in_global_control_group String, integer_1 Nullable(Int32), integer_2 Nullable(Int32), integer_3 Nullable(Int32), integer_4 Nullable(Int32), integer_5 Nullable(Int32), integer_6 Nullable(Int32), integer_7 Nullable(Int32), integer_8 Nullable(Int32), integer_9 Nullable(Int32), integer_10 Nullable(Int32), integer_11 Nullable(Int32), integer_12 Nullable(Int32), integer_13 Nullable(Int32), integer_14 Nullable(Int32), integer_15 Nullable(Int32), integer_16 Nullable(Int32), integer_17 Nullable(Int32), integer_18 Nullable(Int32), integer_19 Nullable(Int32), integer_20 Nullable(Int32), integer_21 Nullable(Int32), integer_22 Nullable(Int32), integer_23 Nullable(Int32), integer_24 Nullable(Int32), integer_25 Nullable(Int32), integer_26 Nullable(Int32), integer_27 Nullable(Int32), integer_28 Nullable(Int32), integer_29 Nullable(Int32), integer_30 Nullable(Int32), integer_31 Nullable(Int32), integer_32 Nullable(Int32), integer_33 Nullable(Int32), integer_34 Nullable(Int32), integer_35 Nullable(Int32), double_1 Nullable(Float32), double_2 Nullable(Float32), double_3 Nullable(Float32), double_4 Nullable(Float32), double_5 Nullable(Float32), double_6 Nullable(Float32), double_7 Nullable(Float32), double_8 Nullable(Float32), double_9 Nullable(Float32), double_10 Nullable(Float32), double_11 Nullable(Float32), double_12 Nullable(Float32), double_13 Nullable(Float32), double_14 Nullable(Float32), double_15 Nullable(Float32), double_16 Nullable(Float32), double_17 Nullable(Float32), double_18 Nullable(Float32), double_19 Nullable(Float32), double_20 Nullable(Float32), date_1 Nullable(DateTime), date_2 Nullable(DateTime), date_3 Nullable(DateTime), date_4 Nullable(DateTime), date_5 Nullable(DateTime), date_6 Nullable(DateTime), date_7 Nullable(DateTime), date_8 Nullable(DateTime), date_9 Nullable(DateTime), date_10 Nullable(DateTime), date_11 Nullable(DateTime), date_12 Nullable(DateTime), date_13 Nullable(DateTime), date_14 Nullable(DateTime), date_15 Nullable(DateTime), date_16 Nullable(DateTime), date_17 Nullable(DateTime), date_18 Nullable(DateTime), date_19 Nullable(DateTime), date_20 Nullabl
-
e(DateTime), string_1 Nullable(String), string_2 Nullable(String), string_3 Nullable(String), string_4 Nullable(String), string_5 Nullable(String), string_6 Nullable(String), string_7 Nullable(String), string_8 Nullable(String), string_9 Nullable(String), string_10 Nullable(String), string_11 Nullable(String), string_12 Nullable(String), string_13 Nullable(String), string_14 Nullable(String), string_15 Nullable(String), string_16 Nullable(String), string_17 Nullable(String), string_18 Nullable(String), string_19 Nullable(String), string_20 Nullable(String), boolean_1 Nullable(String), boolean_2 Nullable(String), boolean_3 Nullable(String), boolean_4 Nullable(String), boolean_5 Nullable(String), boolean_6 Nullable(String), boolean_7 Nullable(String), boolean_8 Nullable(String), boolean_9 Nullable(String), boolean_10 Nullable(String), boolean_11 Nullable(String), boolean_12 Nullable(String), boolean_13 Nullable(String), boolean_14 Nullable(String), boolean_15 Nullable(String), boolean_16 Nullable(String), boolean_17 Nullable(String), boolean_18 Nullable(String), boolean_19 Nullable(String), boolean_20 Nullable(String), region_id Nullable(Int32), is_deleted String, ch_date Date) ENGINE = MergeTree(ch_date, site_user_id, 8192) │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
` -
Joined.
-
-
Ну если доступна табличка system.processes, там лежит
-
-
query_id какого запроса вам нужно? Если SELECT * FROM smth, то да, но мб там в query свои символы есть, точно не скажу
-
-
А такое поведение только при добавлении колонки phone или любой? Вообще структура таблицы очень странная, я бы integer_N и остальные такие же вынес в массивы. И у вас синтаксис таблицы устаревший, замените на актуальный с PARTITION и ORDER
-
-
Joined.
-
Joined.
-
-
Согласен — это legacy-кусок, который в следующем квартале будет переписываться и актуализироваться. Но пока надо как-то с этим дожить. Такое странное поведение только при добавлении поля phone. С любым другим — всё нормально. Более того, если сделать SELECT phone FROM shop_clients <…> — то тоже всё корректно отрабатывает -- возвращает 594 строки.
Еще из удивительного, если удалить одно из условий, то тоже нормально отрабатывает:
SELECT id, phone
FROM shop_clients
WHERE (integer_2 != toInt32(1737)) AND (integer_2 != toInt32(1761)) AND (integer_2 != toInt32(1762)) AND (integer_2 != toInt32(1736)) AND (integer_2 != toInt32(1763)) AND (integer_2 != toInt32(1787)) AND (integer_2 != toInt32(1788)) AND (integer_30 = toInt32(1)) AND (integer_9 = toInt32(30)) AND (region_id IN (toInt32(1), toInt32(2), toInt32(3), toInt32(4), toInt32(5), toInt32(6), toInt32(7), toInt32(8), toInt32(9), toInt32(10), toInt32(11)));
594 rows in set. Elapsed: 0.042 sec. Processed 1.88 million rows, 37.63 MB (44.87 million rows/s., 897.73 MB/s.)
SELECT id, phone
FROM shop_clients
WHERE (integer_2 != toInt32(1737)) AND (integer_2 != toInt32(1761)) AND (integer_2 != toInt32(1762)) AND (integer_2 != toInt32(1736)) AND (integer_2 != toInt32(1763)) AND (integer_2 != toInt32(1787)) AND (integer_2 != toInt32(1788)) AND (integer_30 = toInt32(1)) AND (integer_9 = toInt32(30)) AND (region_id IN (toInt32(1), toInt32(2), toInt32(3), toInt32(4), toInt32(5), toInt32(6), toInt32(7), toInt32(8), toInt32(9), toInt32(10), toInt32(11))) AND (shop_clients.is_deleted != ‘Y’);
840948 rows in set. Elapsed: 0.204 sec. Processed 1.88 million rows, 81.63 MB (9.21 million rows/s., 399.63 MB/s.) -
Советую попробовать переписать сейчас, ваш синтаксис устаревший, возможно с ним что-то ломает запрос
-
Попробуем
-
Подскажите пожалуйста. Есть кластер с ReplicatedMergeTree в нем есть полные дубликаты по всем столбцам. Есть ли вариант удалить дубликаты ? Укажите пожалуйста путь как можно решить данный вопрос.
-
https://clickhouse.tech/docs/en/sql-reference/statements/optimize/
OPTIMIZE DEDUPLICATEOPTIMIZE | ClickHouse DocumentationOPTIMIZE Statement This query tries to initialize an unscheduled merge of data parts for tables. Warning OPTIMIZE can’t
-
Joined.
-
Всем привет. Есть задача получить список названий полей таблицы. Делаю следующий запрос select t.name from (DESCRIBE table table_name) t и он падает с ошибкой Error running query: Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 206 (line 1, col 206): DESCRIBE table table_name) t FORMAT JSON. Expected one of: SELECT subquery, SELECT query, SELECT, list of elements, WITH, SELECT query, possibly with UNION, SELECT query, subquery, possibly with UNION (version 20.5.2.7 (official build)) Подскажите, плз что я делаю не так?
-
1.
show create tablename
2.
select * from system.columns where table='tablename' -
Спасибо, 2 способ - то что нужно.
-
Ага спс. Сразу не понял почему не работало. Оказалось, что надо final после прочтения документации внимательно стало понятней. Спс
-
Добрый день. Не получается запустить clickhouse-jdbc-bridge для postgresql не проходит тест который описан на в git. Так же припопытке select * from jdbc ('jdbc:postgresql://***.26.159.56:5432/?user=******&password=******','dwh', 'public.def_sp_labexa_bcp')
получаю ошибку
Received exception from server (version 20.5.4):
Code: 86. DB::Exception: Received from localhost:9000. DB::Exception: Received error from remote server /columns_info?connection_string=jdbc%3Apostgresql%3A%2F%2F***.26.159.56%3A5432%2F%3Fuser%3D******%26password%3D******&schema=dwh&table=public.def_sp_labexa_bcp&external_table_functions_use_nulls=true. HTTP status code: 500 Server Error, body: No suitable driver found for jdbc:postgresql://***.26.159.56:5432/?user=******&password=******.
Received exception from server (version 20.5.4):
что и где я делаю не то или не так? -
всем привет, подскажите, есть таблица
CREATE TABLE test_test.test
(
`uuid` UUID,
`status` Enum8('approved' = 1, 'in_progress' = 2, 'canceled' = 3),
`cost` UInt64,
`currency` Enum8('USD' = 1, 'RUB' = 2),
`EventDate` Date,
`EventDateTime` DateTime
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(EventDate)
ORDER BY (uuid, EventDate)
SETTINGS index_granularity = 8192
пробую добавить
ALTER TABLE test
MODIFY TTL EventDate + toIntervalMonth(6) TO DISK 'hdd'
SETTINGS storage_policy = 'ssd_only'
Exception on client:
Code: 115. DB::Exception: Unknown setting storage_policy: in attempt to set the value of setting 'storage_policy' to 'ssd_only'
если создаю новую таблицу, то все ок
CREATE TABLE test1
(
`uuid` UUID,
`status` Enum8('approved' = 1, 'in_progress' = 2, 'canceled' = 3),
`cost` UInt64,
`currency` Enum8('USD' = 1, 'RUB' = 2),
`EventDate` Date,
`EventDateTime` DateTime
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(EventDate)
ORDER BY (uuid, EventDate)
TTL EventDate + toIntervalWeek(2) TO DISK 'hdd'
SETTINGS storage_policy = 'ssd_only'
Ok.
0 rows in set. Elapsed: 0.002 sec.
как добавить в существуюущую таблицу TTL и storage_policy? -
а если сделать PREWHERE в 1м запросе, тоже ломается?
SELECT id
FROM shop_clients
PREWHERE -
все доброго времени суток. Подскажите, пожалуйста, какие есть best practies при загрузке данных в Clickhouse? Стоит ли пытаться загружать данные через python-драйвер clickhouse_driver, если объёмы данных для записи составляют десятки миллионов строк? Какие есть способы для fast insert в Clickhouse БД?
-
Добавил ttl на поле в таблице, как сделать, чтобы существующие данные уже попали под очистику по ттл или со временем это само произойдет?
-
Вроде бы TTL распространяется только на новые данные
-
-
здраствуйте, поскажите как почистить историю консольного клиента?
-
в system.query_log
можно поискать, если он у вас включен -
ага, понял. спасибо
-
=) ну питон сам по себе не очень быстрый язык
практика вставки в clickhouse
это вставка большими порциями (от 100 000 записей, можно миллионы)
это в документации есть
исходные данные у вас откуда?
какое то свое приложение события отсылает по HTTP/gRPC/protobuf в ваш коллектор?
MySQL\PostgreSQL как источник? -
источник MySQL, запросом я выбираю данные, и полученный датасет я должен загрузить в БД
-
и язык у вас при этом python ?
-
если много маленьких запросов и нет возможности из собрать на стороне приложения, то стоит использовать буферные таблицы
-
да
-
Joined.
-
IMHO самый быстрый способ
вызвать из python
mysql -B -s -e "SELECT * FROM db.table FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' | clickhouse-client -q "INSERT INTO db.table FORMAT TSV" -
а как записывать в Buffer?
-
обычный INSERT
можно даже через MySQL протокол подключиться...
но это если вам надо вставлять записи по одной
но особо высоких RPS и строк в секунду там не ждите -
Buffer | Документация ClickHouse
Buffer Буферизует записываемые данные в оперативке, периодически сбрасывая их в другую таблицу. При чтении, производится
-
я так понимаю, что схема следующая должна работать: чтение условно по 200-300 000 записей в MySQL и запись в буферную таблицу
-
всем привет
вопрос: есть матвью с кучей джоинов (по сути - воронка)
струткура такая
event1 left join (
event2 left join (
event3 ...
)
)
если на момент создания матвью события 3 не было, то когда оно придет, то перезапишется ли эта строчка в матвью? заранее спасибо -
а из буферной таблицы будет переноситься в постоянную на движке MergeTree
-
нет смысла писать в буфферную таблицу сразу 300 000 записей за один раз
вы не правильно поняли для чего она нужна -
а как?
-
https://t.me/clickhouse_ru/174794
я написал
вы сказали что данные у вас в MySQL уже лежат
если вам можно выкинуть MySQL и хочется данные писать по одной строке... тогда да, пробуйте Buffer таблицы
можно даже через MySQL protocol
https://clickhouse.tech/docs/en/interfaces/mysql/Slach in ClickHouse не тормозитIMHO самый быстрый способ вызвать из python mysql -B -s -e "SELECT * FROM db.table FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' | clickhouse-client -q "INSERT INTO db.table FORMAT TSV"
-
ок
-
MATVIEW это просто trigger на INSERT
в clickhouse Нет update -
-
большое спасибо)
-
а зачем вам строить воронки таким тяжелым способом?
через sequenceMatch не получается?
почему?
https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/parametric-functions/#function-sequencematchParametric | ClickHouse DocumentationParametric Aggregate Functions Some aggregate functions can accept not only argument columns (used for compression), but
-
sequenceCount почему-то не отловил много кейсов, которые я искал
поэтому хотел сделать быстрые костыли и доразобраться с этой функцией -
Каких например? Просто интересно.
-
может не совсем в тему вопрос
у metabse есть такая возможность или какие то аналогичные?
1. Задаем параметр, он привязан к пользователю метабейс.
Когда пользователь логинится то он видит инфу всегда с этим фильтром. Грубо говоря чтобы владелец сайта А из общего объема всегда видел данные только сайта А.
БД у нас click -
не знаю что такое metabase, а фильтры возможно надо вписывать сюда https://clickhouse.tech/docs/en/operations/settings/settings-users/#user-namedatabasesUser Settings | ClickHouse Documentation
User Settings The users section of the user.xml configuration file contains user settings. Information ClickHouse also s
-
спасибо, тоже полезно
-
Joined.
-
Коллеги, подскажите, могули я как-то ограничить память выделяемую на создание мат представления с директивой POPULATE?
-
-
всем привет, подскажите, есть таблица
CREATE TABLE test_test.test
(
`uuid` UUID,
`status` Enum8('approved' = 1, 'in_progress' = 2, 'canceled' = 3),
`cost` UInt64,
`currency` Enum8('USD' = 1, 'RUB' = 2),
`EventDate` Date,
`EventDateTime` DateTime
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(EventDate)
ORDER BY (uuid, EventDate)
SETTINGS index_granularity = 8192
пробую добавить
ALTER TABLE test
MODIFY TTL EventDate + toIntervalMonth(6) TO DISK 'hdd'
SETTINGS storage_policy = 'ssd_only'
Exception on client:
Code: 115. DB::Exception: Unknown setting storage_policy: in attempt to set the value of setting 'storage_policy' to 'ssd_only'
если создаю новую таблицу, то все ок
CREATE TABLE test1
(
`uuid` UUID,
`status` Enum8('approved' = 1, 'in_progress' = 2, 'canceled' = 3),
`cost` UInt64,
`currency` Enum8('USD' = 1, 'RUB' = 2),
`EventDate` Date,
`EventDateTime` DateTime
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(EventDate)
ORDER BY (uuid, EventDate)
TTL EventDate + toIntervalWeek(2) TO DISK 'hdd'
SETTINGS storage_policy = 'ssd_only'
Ok.
0 rows in set. Elapsed: 0.002 sec.
как добавить в существуюущую таблицу TTL и storage_policy? -
Даже если я storage_policy не указывал для таблицы?
-
я думал что нельзя указывать, если уже была добавлена storage_policy, тогда понятно
Спасибо -
Joined.
-
Всем привет. Хочу попробовать для себя CH, нашел интересную задачу, которую не вывозит PostgreSQL:
каждый день создаются и удаляются множество доменных имён в интернете (есть выгрузки некоторых доменных зон в сыром виде), хочу попробовать поделать какую-нибудь аналитику на основе этой BigData 🙂
Для начала думал что закину в PgSQL 150 млн доменов и всё будет окей, но упираюсь в производительность как вставки, так и апдейта данных (хотя уже накрутил и вставку через COPY и вынес проверяемые данные в Redis, что получить O(1)). Сейчас понимаю что нужно взять кликхаус и пробовать его, но опыта - совсем нету.
Дайте, пожалуйста, какие-нибудь советы совсем новичку, чтоб больно не спотыкаться? 🙂
Структура БД в PgSQL прикладываю ниже в скрине, коротко суть:
1. Табличка tld: в ней я храню доменную зону (ru, net, org и тд), чтобы в главной таблице domain поле было типа Integer.
2. Табличка nameserver: в ней хранятся все неймсервера для домена (минимум 2 и максимум что я встречал вроде бы 25).
3. Главная таблица domain:
- tld_id (integer) - связь с таблицей tld
- letter (varchar(1)) - первая буква домена для ключа партиционирования (чтобы при обновлении домена = удалении/смене ns серверов искать не по всей таблице целиком)
- name_servers (array[integer]) - массив id неймсерверов для текущего домена
- created_at (date) - дата, когда домен попал первый раз в базу (в выгрузке нет дат, поэтому берем дату когда парсили эту выгрузку)
- updated_at (date) - дата, когда было последнее обновление неймсерверов для домена
- deleted_at (data) - дата, когда домен пропал из выгрузки (не продлили, домен свободен к регистрации)
- domain (varchar) - соответственно сам домен без доменной зоны (example.com => example)
Как лучше подстроить текущую структуру под CH? Скорее всего нет смысла создавать столько таблиц, внутренняя магия столбцовой БД должна (?) переварить если я буду хранить tld текстом, а не id, а неймсервера тоже массивом строк?
В будущем как минимум хочется делать выборки в духе "Какие домены были удалены/обновлены вчера с доменной зоной = ru".
Ещё пару важных вещей, которые не понимаю:
1. Как мне быть с обновлением полей updated_at/deleted_at? Писать ещё одну строку в базу, где уже будут эти поля заполнены, но как тогда старое потом удалять, чтоб оно не захламляло?
2. При последующих парсингах выгрузок (когда первично база уже наполнена) - нужно проверять есть ли такой домен в базе, нормально ли для CH, если я буду делать запрос, где будет возвращаться 1 строка и это будет что-то в духе "select exists(id) from domain where domain_name = 'example.com'"? Просто вроде вся мощь CH (на сколько я понимаю) как раз в агрегации данных, а не запросам где нужно получить всего 1 строку? -
-
-
несколько таблиц если и надо, то других. тлд можно инлайнить в домены, низкокардинальные строки пожмутся нормально. запросы за одним ключом не будут масштабироваьтся, exists id делать не надо, раз таблица про домены, делайте ключом домен, сортируте по нему и всё. хранить логи изменений это нормально, с обновлением записей возможна разного вида печаль.
-
а как вот классически по-кликхаусовски делать обновления, чтоб это были не обновления в привычном понимании, а добавление новой строки или как-то вот так?
-
Replacing merge tree
-
в первый парсинг файла я загружу 150 млн доменов в базу (хочется чтоб загрузка проходила не более 12 часов), каждый день обновляется примерно 150 тысяч доменов - хочется тоже, чтоб это было не более 12 часов
сейчас pgsql не вывозит такое -
-
-
да, тестировал на hetzner cloud (VPS): 3 CPU, 4GB RAM, nvme
-
там вся боль сейчас в том, что вначале я партицию (по букву) выгружаю в redis, чтоб каждый запрос в pgsql не закидывать - и долго именно из pg перекладывается, т.к. я пачками выбираю (делаю where id > last_id limit 1000)
-
-
сырая выгрузка 20ГБ, в PgSQL папка с данными была что-то вроде 60ГБ
-
макисмальная длина домена вроде бы 50 символов была из того что я помню, но это не точно, там 255 стоит у меня в структуре таблицы почему-то
-
150mln ни о чем, пг норм
Вам кх не особо нужен.
Но можете в кх хранить весь лог без удалений обновлений строк тоже -
да уже хочется КХ потестить, раз с пг у меня не получается, а я уже устал финты пробовать разные ) тем более для себя, не страшно если ошибусь
-
-
в среднем 2-4 неймсервера
-
-
еще можно самому всегда агрегировать по domain исходные данные, но 150М ключей - это обычно проблемы с памятью, надо смотреть какая предполагается аналитика и какая исходная событийная модель. что такое домен пропал из регистрации итд. Какие домены были удалены/обновлены вчера с доменной зоной = ru можно и по оригинальным событиям вообще без всякого updated_at посчитать.
-
я думал вначале в память засунуть всё, но у меня нет таких серверов..))
-
а вот как у КХ с запросами, когда нужно получить 1 строку из всей таблицы по её ключу? на апдейтах у меня такая логика и подразумевается, что во время последующих парсингов я делаю на каждый домен запрос в базу и проверяю NSы в коде.
Не упрусь в то, что КХ будет вывозить условно 100 запросов в секунду всего таких? -
-
а как тогда быть? я не могу пачкой взять 100 доменов из базы и пачку в 100 доменов спарсить из файла, там если будут пропуски, то я замучаюсь понимать как это разрулить, особенно когда следующую пачку надо будет взять
-
выгружать примерно по 5 млн доменов в память (по первой букве) - не выйдет опять же из-за того что не влезут(
-
-
-
да, раз в день выгрузка всех существующих доменов (для доменной зоны)
каждый день соответственно нужно её парсить заново, обновляя то что изменилось -
-
и вы хотите этой выгрузке сделать full outer join на предыдущее состояние, чтобы нагенерить дифф, и потом с одной стороны иметь такие диффы, с другой стороны еще и состояние (актуальное?) всех доменов, и при этом чтобы размер базы не рос на 60Гб в день?
-
не столько даже диффы хранить хочется, сколько знать когда какой домен добавлен/удален/обновлен (его NS обновлены), но вообще получается - да, что-то вроде.
Нужно актуальное состояние на текущий день, чтоб я мог потом получить все измененные домены сегодня или все домены, которым поствлены какие-то NSы, или количество доменов, которые были удалены вчера (например).
И да, не хочется чтоб через месяц база превратилась 1.8ТБ ) -
может мой кейс неподходящий для CH, вы скажите если что )
-
тут вопрос не в кейсе, а как организовать нормально. можно заливать в базу каждый день полный дамп (сколько это занимает времени?), потом оставлять его как актуальное состояние, считать дифф с предыдущим днем, диффы откладывать в еще одну табличку с датой в ключе. возможно залить первый дамп в диффы в виде добавлений, чтобы он тоже был,
это уже будет содержать примерно все нужные данные, и расти только на дифф. full outer join для диффа возможно работать не будет, тогда надо будет что-то изобретать, например посемплировать по хешу. -
сколько это может занимать времени для КХ - я не представляю, в pgsql это сейчас льётся больше суток )))
а на третий день как быть, диффать предыдущим днем, а то что было до этого - дропать? Но тогда у меня будет разница только между вчерашним и сегодняшним днем, а хочется чтоб можно было потом получить все домены за дату Х, которая была в прошлом (например, какой-то регистратор понизил цену на регистрацию доменов в период с Z по Y, я потом хочу проанализировать на сколько в эти дни больше доменов было зарегистрировано чем в обычное время) -
-
то есть условно нужно что-то вроде: каждый день вливаем все данные в таблицу А, получаем как-то через КХ разницу с таблицей Б, сохраняем это в таблицу В; дропаем А, Б и переименовываем В в таблицу Б?
-
единственное что непонятно как разницу делать, там ведь в выгрузке дат нету, там только домен = [неймсервер1, ..., неймсерверN], а даты я сам генерировал получается (когда добавли домен проставлял = created_at, обновили - updated_at, удалили - deleted_at)
-
-
а как это всё организовать в терминологии кликхауса, чтоб я дальше пошёл раскуривать доку?
-
если, конечно, это нормальный кейс мы описали и не стоит пробовать как-то по-другому через указанный выше ReplacingMergeTree)
-
replacing не факт, что подойдет для удаления того что надо удалить, во-первых потому что я не уверен что там можно что-то удалить (ладно, для этого у нас есть deleted_at), во-вторых, как понимать что в базе есть что-то, чего уже нет в новом дампе и потому это надо удалить.
также наверное стоит подумать над вопросом как из удаленного стать обратно не удаленным, насколько я понимаю, это не конечное состояние. -
да, тоже верное замечание - такое тоже каждый день происходит - сейчас я сбрасываю deleted_at снова в null и ставлю created_at текущим днем
-
то есть саму строку я не удаляю никогда
-
к слову, уже много различных онлайн-сервисов решали похожую задачу ( например, https://domainlists.io/gtld-domains/ ), но я нигде не смог найти чтоб они рассказывали как это делается 🙁All active domain lists updated daily
Full lists of classic and country domains. Total 1565 zones updated daily.
-
> во-вторых, как понимать что в базе есть что-то, чего уже нет в новом дампе и потому это надо удалить.
да, к слову ещё стоит сказать, что сейчас "удаление" (простановка deleted_at) организована таким образом что перед обработкой последующей буквы домена - я беру все домены из её партиции и складываю в Redis, после того как текущая буква пропарсилась - в редисе остаются домены, это значит что они не были в текущем дампе, а значит они удалены из выгрузки -
-
сейчас, кстати, получение всех доменов из партиции и запись их в Redis выглядят вот так (ужаснитесь со мной тоже):
[domain_letter: a] Prefill domains (1411.4 sec) | Count: 9459731
[domain_letter: b] Prefill domains (1255.1 sec) | Count: 8424206
[domain_letter: c] Prefill domains (1580.8 sec) | Count: 10660824
час потратили только на то, чтоб получить данные 3х партиций из 36 🙂 И это там запросы уже оптимизированы (`select id, domain from domain_letter_[буква] where id > :last_id limit 5000`) -
можно подробнее? как тогда получить все домены, которые были изменены позавчера (сменён ns)? учитывая что сегодня они могли снова сменится - как схлопнуть это изменение?
-
Дайте пример данных
-
-
вот прямо живые данные в pg сейчас
-
только без учета того, что что-то поменяться могло - там только 1 раз парсинг целиком прошел у меня
-
zookeeper.sasl.client
Set the value to false to disable SASL authentication. Default is true.
https://zookeeper.apache.org/doc/r3.5.2-alpha/zookeeperProgrammers.html -
из того что хочется уже сейчас поанализировать и что я запихал в pg, это вот такой запрос:
SELECT domain FROM domain_letter_{}
WHERE tld_id = :tld_id AND ARRAY[:ns] <@ name_servers
AND (updated_at = :ddate OR created_at = :ddate)
LIMIT 100
который, к слову, выполняется примерно вечность -
получить первые 100 доменов из партиции по букве с указанной доменной зоной, указанными name servers, которые были обновлены или созданы за выбранную дату
-
Ок, как распарсю картинку так и кину запрос сразу )
-
да даже не сколько запрос нужен, расскажите как это вот всё организовать в КХ )
-
я не понимаю как мне складывать нужно это туда, чтоб можно было делать такие запросы как я показал выше
-
не обессудьте, но по сути в этом суть ))))
-
это не лучшая задача чтоб поиграться с КХ получается?
-
-
упростите ваш пример входных данных, и объясните что именно вы хотите на выходе с этого входа
например, что значит "обновлены"
>
получить первые 100 доменов из партиции по букве с указанной доменной зоной, указанными name servers, которые были обновлены или созданы за выбранную дату
> -
-
когда обновляются NS это значит, что там хотя бы один из них или заменяется другим или добавляются новые, порядок всегда строго отсортирован (в парсере сортировка)
по входным даным: каждый день есть выгрузка всех доменов по доменной зоне, которая состоит из списка
example.com = [ns1, ..., nsX]
если домена не было в базе в этот момент, то нужно добавить его с created_at = текущий день;
если в базе есть домен, в выгрузке не было - значит нужно поставить этому домену в базе в поле deleted_at = текущий день;
если изменились NS - значит нужно изменить их в базе и поставить updated_at = текущий день;
и если домен уже был удален когда-то (deleted_at не null), а он снова появился в выгрузке - нужно поставить deleted_at = null, created_at = текущий день, ну и скорее всего сменить NS -
логика такая, но как это всё организовать в КХ, чтобы не острелить себе все конечности - я не понимаю, но очень хочется разобраться и начать уже хоть где-то применять КХ, а то футболка от самого Алексея есть, ношу её, но похвастаться инстансом в проде (пускай и для хобби) - не могу
-
и все запросы будут с фильтрацией по дате и префиксу домена?
-
после загрузки данных - большинство да, вот тот пример запроса что я привел выше - это первое что мне хочется проанализировать (правда, LIMIT 100 там стоит просто потому что pg не вывозит, вообще мне все домены получать хочется)
-
-
мы ещё и однофамильцы если что))))
-
-
Кто-то может поделится статьёй, как прикрутить к кликхаус tls? Ничего годного не нашёл на просторах интернета (
-
в config.xml все написано
-
ну если лень делать умный парсер (который возьмет весь последний день в память и сделает дифф по нему), то можно так (грузите все записи тупо каждый день, ставите order by по полям по которым будет фильтрация):
select tgtdate, domainname, groupArray(ns),
if(count(ns)=sum(deleted), 1,0) as isdeleted,
if(count(ns)=sum(added), 1,0) as isadded,
if(count(ns)!=sum(notchanged) and not isadded and not isdeleted, 1,0) as ismodified
from
(
select all_dates[2] as tgtdate, domainname, ns,
--- use for troubleshooting
groupArrayInsertAt('none', 2)(ns, toUInt32(indexOf(all_dates, dt) - 1)) arrData,
If( (countIf(dt=toDate('2020-01-09')) as existsYesterday ) and not (countIf(dt=toDate('2020-01-10')) as existsToday),1,0 ) as deleted,
If( (not existsYesterday) and existsToday,1,0 ) as added,
If( existsYesterday and existsToday,1,0 ) as notchanged
--arrayElement(groupArrayInsertAt(Null, 2)(tuple(toNullable(ns)), toUInt32(indexOf(all_dates, toDate(datadatetime)) - 1)).1 as values, 1) as "daybefore",
from (
with [ toDate('2020-01-09'), toDate('2020-01-10') ] as all_dates
select dt, domainname, ns, all_dates
from
(
-- this is generated sample data
select dt, domainname, arraySort(x-> x, groupArray(NS)) sortedNSList from (
select toDate('2020-01-08') +cityHash64(number,3)%4 as dt, 'ns'|| toString(cityHash64(number,0)%5) as NS, toString(cityHash64(number%25,1)) domainname from numbers(100)
) group by dt, domainname order by dt
) array join sortedNSList as ns
where 1=1
-- and domainname='10497707425991577777'
and dt in (all_dates)
) group by tgtdate, domainname, ns
)
group by tgtdate, domainname; -
Один вопрос: а какой движок для чего там сделать? Я ж даже с этого не могу начать и понять что нужно
-
Спасибо за запрос, попробую разобраться
-
Joined.
-
merge tree, в таблицу лучше на каждый NS по строке прямо и грузите, partition by date, order by domainname or prefix_domainname
-
А если мы говорим о том, что оно все в памяти будет работать, то с моим текущим сервером на 4ГБ RAM оно заработает вообще в теории?
-
4GB RAM - КХ вообще вряд ли заработает... начинайте от 32
-
🤯 Оу
-
Спачибо
-
ну это ты загнул
-
вообще ваша проблема решается sqlite-ом, не говоря о ПГ, если делать парсером обновления состояния
-
делайте ваши ставки господа =)
-
-
если всегда фильтровать по домену, то в принципе можно
-
Sqlite? Можно подробнее как?
-
-
написанием кода =)
-
-
так а зачем мне тогда кликхаус, если будет 32-48ГБ памяти?
я просто все домены в ОЗУ сложу и буду обходить их там -
весь интерес как раз впихнуть невпихуемое 🙂
-
*шепотом* незачем
-
шутки шутками, но относительно моей задачи не так много решений в КХ выходит
-
мне кажется эта задача вообще не для колоночной бд. тебе сжатие нужно, а не кх)
-
брррр сказала лесопилочка
-
вашу задачу можно в КХ, и в чем угодно, но не нужно
-
вполне может быть
-
буду признателен если предложите какую-то другую БД, которая всерьез можно это пережевать
-
говорю же, любая, исходите из других ограничений... если 4ГБ рам. будете мучатся с КХ, тут/там подкручивать... возьмите sqlite, у вас все равно нет конкурентных процессов
-
-
вполне мб что и криво, но будет круто если скажите как сделать прямее )
-
зайдите в ПГ чат, и спросите
-
с sqlite всё равно не понимаю, там операция вставки медленнее чем в pgsql, это однозначно (если не :memory:, но тогда в RAM снова есть шанс не влезть)
-
> там операция вставки медленнее чем в pgsql, это однозначно
https://stackoverflow.com/questions/1711631/improve-insert-per-second-performance-of-sqliteImprove INSERT-per-second performance of SQLiteOptimizing SQLite is tricky. Bulk-insert performance of a C application can vary from 85 inserts per second to over 96,000 inserts per second! Background: We are using SQLite as part of a desktop
-
journal_mode = MEMORY
🙁 -
-
спасибо, попробую ради теста всё равно, безысходность же уже)
-
мне ещё подсказали, что у меня может быть проблема в том, что редис и пг в контейнерах, и общение по сети докера какое-то не очень под перформанс заточено (подключения по хостнейму=imagename)
-
сколько иовейт на запросе том длинном?)
-
как посмотреть? я только explain analyze умею)
-
top на машинке где запущен докер :)
-
боюсь что не смогу сейчас сказать, там с утра обновление грузится всё ещё..)
-
но вообще "Execution Time: 4225.737 ms", и это не самый худший вариант вышел
-
но в момент загрузки сейчас:
-
-
выглядит как будто дело не в диске)
-
угу, тоже уже есть мысль обмазать каждую операцию проверкой сколько времени она исполняется
-
вполне может быть там редис деградирует сильно, когда в него миллионы доменов на определенную букву засунули
- 05 August 2020 (218 messages)
-
Всем привет! Подскажите пожалуйста для чего и откуда появилась база _temporary_and_external_tables в последнем обновлении кх? Обновил кластер до 20.5.3.27
-
Хотя я ещё словари подключал, может поэтому появилось
-
Привет, подскажите, как работает max_execution_speed_bytes. Выставил для ETL юзера неадекватно низкое значение 6291456, но запросы продолжают летать на больших выборках
Elapsed: 64.841 sec. Processed 583.75 million rows, 9.23 GB (9.00 million rows/s., 142.38 MB/s.)
Наша цель, сделать так, чтобы ежедневные ночные агрегации проходили гладко. Сейчас замечаем, что в некоторые моменты диск стаёт в полку, система тупит, теряем сессию с зк и в итоге — завалившийся пайплайн.
Как бонус, хочется ограничить io для аналитиков и других пользователей витрин. -
Joined.
-
версия?
была такая проблема с distributed
https://github.com/ClickHouse/ClickHouse/issues/5732max_execution_speed doesn't seem to work as expected · Issue #5732 · ClickHouse/ClickHouse#4430 introduced two new settings: max_execution_speed max_execution_speed_bytes Both of which should be very useful in a multi tenant environment, especially as a poor's man non-conserving...
-
-
Точно не 20+, будем обновляться )
-
-
SELECT IPv4StringToNum('192.168.3.2') between IPv4CIDRToRange(toIPv4('192.168.5.2'), 16).1 and IPv4CIDRToRange(toIPv4('192.168.5.2'), 16).2;
-
Всем привет.
Как вы проводите миграции? По ответам вижу, что у всех что-то самописное, но может появилась уже версия flyway или liquibase с поддержкой КХ?
вижу пр https://github.com/flyway/flyway/pull/2640, но он не вмержен пока что.Yet another ClickHouse support by a-konyaev · Pull Request #2640 · flyway/flywayBased on #2166 and #1773 This one has some improvements in comparison to previous implementations: more accurate declaration of the schema table's columns (types and default values) &q...
-
да, пришел к такому же решению, спасибо
-
Привет!
Когда прилетают запросы к distributed таблице на прошерстить большие объёмы данных, проседает загрузка в кластер КХ. Какие-то общие рекомендации по разруливанию такой проблемы можете дать? -
Туда в flyway кто-то пытался добавить поддержку, но ее разработчики flyway не одобрили
-
Всем привет, обновили версию кх с 19.14 на 20.3, раньше делали запросы такого вида ALTER TABLE default.table2 REPLACE PARTITION FROM default.table1 и все работало, структура таблиц одинаковая, ключ партицирования toYYYYMMDD(dt), сейчас такой запрос отдает Syntax error: failed at position: FROM default.table1. Expected one of: AND, OR, token, NOT, BETWEEN, LIKE, IS, NOT LIKE, IN, NOT IN, GLOBAL IN, GLOBAL NOT IN, QuestionMark (version 20.3.12.112), если сделать запрос такого вида ALTER TABLE default.table2 REPLACE PARTITION 20200526 FROM default.table1 работает, также работает запрос SELECT toYYYYMMDD(toDate('2020.05.26')) в чем может быть проблема?
-
В общем централизованного способа проводить миграции пока нет и все используют что-то самописное?
-
Обратите внимание на количество потоков которое выделяется для выполнения запроса. Можно немного уменьшить, тогда запрос будет медленее, но менее деструктивен. Искать по слову threads
-
-
Спасибо
-
Всем привет
Сильно не пинайте, КХ пробую впервые.
Рассматриваю, как альтернативу для MSSQL с колоночным индексом на объёме 10+ ТБ для уже имеющегося хранилища.
Попробовал несколько простых запросов в песочнице play.clickhouse.tech
И на вот таком запросе, который ищет топ пользователей с наименьшей медианой между соседними хитами, песочница думает 1 минуту, после чего отдает ошибку.
SELECT o1.UserID, median(dateDiff('second', o1.EventTime, o2.EventTime, 'UTC')), count(1)
FROM hits_100m_obfuscated as o1
asof join hits_100m_obfuscated
as o2 on o1.UserID = o2.UserID and o1.WatchID < o2.WatchID
group by o1.UserID
ORDER BY median(dateDiff('second', o1.EventTime, o2.EventTime, 'UTC'))
limit 100
Скажите, какой бест практис решения подобных задач (для наших потребностей достаточно типовая). Как можно посчитать то же, но вложиться в минуту и 10ГБ памяти песочницы, и возможно ли? -
через GROUP BY и массивы
-
подскажите пожалуйста по zookeper для чего нужны в файле в jaas.conf логины пароли, если у меня почему то можно под любой комбинацией логин/пароль создать ноду и работать с ней.
можно ли вообще ограничить списком пользователей, кто может работать с zoo ? -
JOIN в clickhouse нужно избегать, особенно с большими таблицами, правая часть поднимается в память
-
Спасибо, то есть, надо делать промежуточный результат со строками вида
UserID, массив с нужными полями всех хитов юзера
И потом как-то уже на каждом отдельном массиве находить пары соседних хитов и считать медиану? -
да, можно через лямбды
-
делаешь два массива один нормальный, второй со сдвигом в единицу и считаешь что хочешь
-
Функции высшего порядка | Документация ClickHouse
Функции высшего порядка Оператор ->, функция lambda(params, expr) Позволяет описать лямбда-функцию для передачи в функци
-
А можно вообще через
https://clickhouse.tech/docs/ru/sql-reference/functions/array-functions/#arraydifferenceМассивы | Документация ClickHouseМассивы empty Проверяет, является ли входной массив пустым. Синтаксис empty([x]) Массив считается пустым, если он не сод
-
Интересно.
А как быть, когда надо таки использовать два датасета в запросе. Например, есть таблица с покупками и таблица с хитами. И надо для каждой покупки посчитать поведенческие метрики. Например, сколько страниц посетил перед покупкой, на какой дольше всего задержался, и так далее. Тоже имеет смысл думать, как без джойна обойтись? -
ну clickhouse-way это иметь одну таблицу: с покупками, хитам и тд
-
Хм
-
Почитав спеку на asof join посчитал, что вот он наш святой грааль объединения датасетов в 1. Но, как я понял, на него не стоит уповать?
-
-
Коллеги, я сделал
ALTER TABLE table MODIFY TTL dt + INTERVAL 100 DAY;
Но количество записей в таблице не изменилось, хотя точно известно, что там полно записей старее 100 дней. Никто не знает, почему так могло произойти и как проверить, что сейчас в таблице действительно прописались изменения (describe не показывает ничего про TTL) -
Может только для вставленных после добавления ттл применимо?
-
TTL работает только для таблиц, созданных с новым синтаксом (в противном случае вы наткнетесь на https://github.com/ClickHouse/ClickHouse/issues/10177)
Протухшие данные дропаются не сразу, а периодически (контролируется настройкой движка mergetree), при добавлении контролируется параметром materialize_ttl_after_modify
Удаление старых данных можно триггернуть командой alter table <table> materialize ttlDB::Exception: Existing table metadata in ZooKeeper differs in TTL · Issue #10177 · ClickHouse/ClickHouseDescribe the bug Performed the update from version 20.1.2.4 to 20.3.5.21, after restart clickhouse does not start. Tried to upgrade to 20.1.6.30 or 20.1.9.54 versions, clickhouse also does not star...
-
Прошу прощения, а что за новый синтаксис?
-
Документация 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
-
точнее даже так
https://clickhouse.tech/docs/ru/single/#table_engine-mergetree-creating-a-tableДокументация ClickHouse | Документация ClickHouseClickHouse is a fast open-source column-oriented database management system that allows generating analytical data reports in real-time using SQL queries
-
-
-
ТТЛ применяются на мерджах + новые парты.
можете сделать alter table t materialize ttl -
Добрый день!
Имею следующую проблему:
делаю запрос
select date from odbc('DSN=postgres_10_10', 'view_with_date')
в ответе получаю '0000-00-00'
если же в постгресе лежит дата в формате timestamp, то в ch она читается из odbc без проблем
версия pg: PostgreSQL 10.10
версия ch: 20.4.2.9 -
Сталкивался ли кто с таким? И как можно обойти?
нашел открытое issue: https://github.com/ClickHouse/ClickHouse/issues/3700 которому уже почти два года, но ответов так и нетПри использовании функции ODBC для Postgres в столбец типа Date приходит NULL · Issue #3700 · ClickHouse/ClickHouseПри попытке экспорта таблицы из Postgres с помощью функции ODBC в поле типа Date приходит либо NULL, либо 0000-00-00, либо 1970-01-01. Использую версию v1.0.0.20181017 Допустим, в Postgres есть таб...
-
Ну никак. Сделать вью в пг, во вью преобразовать в datetime
-
Добрый день. Версия 20.5.4.40
Может кто встречался?
При создании Kafka engine указываю в SETTINGS kafka_max_block_size = 250000, но эффекта нету:
в логих все равно
<Trace> StorageKafka (events_kafka): Polled batch of 65536 messages. Offset position: [ events[0:118227815] ]
ПС: в версии 20.4.4.18 параметр работал корректно. -
здраствуйте, подскажите а можно как то ограничить колличество строк в таблице с движком Memory
-
Нет
-
создайте баг
-
жаль, а там есть какието параметры у Memory, а то в документации об этом нечего не сказано(
-
Никаких параметров нет
-
спасибо, пойду страдать...
-
Возьмите engine log
Разницы вы не заметите -
он тоже в памяти хранится?
-
Нет. Но из-за дискового кеша разницы вы не заметите
-
Joined.
-
подскажите пожалуйста по zookeper для чего нужны в файле в jaas.conf логины пароли, если у меня почему то можно под любой комбинацией логин/пароль создать новую ноду и работать с ней.
можно ли вообще ограничить списком пользователей, кто может работать с zoo ?
добавление export SERVER_JVMFLAGS="-Djava.security.auth.login.config=/usr/local/zookeeper/conf/sasl.cfg $SERVER_JVMFLAGS" в zkEnv.sh никакого эффекта н , также как и
requireClientAuthScheme=sasl
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
в zoo.cfg -
Всех приветсвую!
Может кто-то сталкивался, с недавних пор, после включения новых узлов в кластер, стали появляеться ошибки.
Ошибки эти видны только в параметром send_logs_level >= debug.
И данные не приходят, как будто спотыкается на этом и затихает.
Приходит DB::Exception: Unknown packet from server (version 19.9.4.34 (official build))
Как видно из сообщения, используем версию 19.9.4.34, и такой же версии клиент.
При обычном запросе, когда не планируется дебажить, все окей, данные отдаются. -
-
-
Какие пароли в jaas.conf ?
-
Спасибо. Сделано https://github.com/ClickHouse/ClickHouse/issues/13385Kafka engine settings param kafka_max_block_size doesn't work in 20.5.4.40 · Issue #13385 · ClickHouse/ClickHouse
Since my update to 20.5.4.40 independs on kafka_max_block_size param in SETTINGS block of CREATE statement for Kafka engine I have the same <Trace> StorageKafka (events_kafka): Polled...
-
HjK in ClickHouse не тормозит
пару дней назад переезжал ничего критичного(конфигурация 2 сервера КХ и между ними 1 ЗК)Версия 20.1.3.7 Только внимательно с правами в зк 1) в клиенте ЗК addauth digest user:password setAcl /clickhouse auth:user:password:cdrwa 2) Стопнул КХ сервера, добавил информацию в конфиг хмл на обоих серверах 3) перезапустил ЗК сервер 4) запустил КХ сервера Но в зависимости от вашей поддержки и конфигурации может быть иначе у меня запустилось и все ок
-
-
-
вот тестовый пример
Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
user_click1="click1"
user_admin="admin1";
}; -
Ошибка какая? Как кпрописали?
-
-
-
Ошибка в логах
-
Application: Coordination::Exception: Not authenticated, path: /clickhouse/tables/01/ …
-
-
скорее всего нет прав
-
ну не доделано, если ошибка из-за подключения -- зк не доступен то работает
-
не понял
-
посмотри getAcl /clickhouse какие права на папку в зукипере
-
-
-
а до папки /clickhouse/tables/ ?
-
-
-
-
-
-
и меня это очень интересует
-
может стартовать
-
таблицы будут readonly
-
по поводу прав
-
-
может, если ЗК недоступен совсем, таблицы Replicated будут RO
-
надо тебе перевыдать права рекурсивно на всю глубину папок
-
ну вот, значит проблема не в ЗК
-
да там ошибка другая, zk auth
-
Can't start clickhouse --help · Issue #1981 · ClickHouse/ClickHouse
os: Ubuntu 16.04.3 LTS \n \l clickhouse version: 1.1.54342 I use " sudo service clickhouse-server start" . but not start. so I use "systemctl status clickhouse-server.ser...
-
-
-
-
а, похоже теперь есть kafka_poll_max_batch_size
https://github.com/ClickHouse/ClickHouse/pull/11388Better settings for Kafka by filimonov · Pull Request #11388 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the cha...
-
@den_crane если это поможет
-
у вас параметры видны у java процесса? ps -ef ?
-
.....-Djava.security.auth.login.config=/usr/local/zookeeper/conf/sasl.cfg -Dzookeeper.DigestAuthenticationProvider.superDigest=adm:c02b+IRQ/ZP9rhNNE47BOMy5W4I=..... вот это есть в параметрах
-
вы когда говорите jaas.conf вы имеете в виду sasl.cfg ?
java.security.auth.login.config=<path to zookeeper_jaas.conf> -
да. вот так назвал файл просто.
-
хз, зукипер с дебагом запускать и смотреть
-
хорошо. буду копать, меня интересует, что это возможно сделать, чтобы в зукипер можно было зайти только по пользователям которые в файле конфиге jaas.conf?
-
Подскажите, возможно ли в clickhouse при джойне таблиц в ON использовать if или multiif?
-
нет
точнее есть пачт hardening security что-то там -
нет, только =
в смысле можно написать выражение и по нему сравнивать -
тогда вернемся к началу разговора и первому моему вопроса. а тогда в чем смысл этого конфиг файла? )
-
чтобы выдать на ветки права только определенному пользователю
-
-
спасибо!
-
-
-
из-за таблицы engine=Dict ? версия КХ. ?
-
-
обновитесь до 20.5.3, там починено https://github.com/ClickHouse/ClickHouse/issues/10994
-
понял. файл этот нужен когда выдаются права наподобие
setAcl /bob sasl:bob:cdrwa,sasl:alica:cdrwa - тогда идет при подключении юзеров, проверка их паролей в файле saas.cfg.
а если
права установлены setAcl /bob digest:bob:X1SKGw3XQQSIPMZRf5lW7e07VPY=:cdrwa то файл не нужен.
мне кажется второй вариант предпочтительней. потому что пароль в хеш виде записан. а в файле saas.cfg он в PLAIN -
Joined.
-
есть таблица:
create table analytics_click.datast(
iddata UUID DEFAULT generateUUIDv4(),
idmpchd UInt64,
dsName String,
tsUTC DateTime,
val Nullable(Float64),
valSrc Nullable(Float64),
idstx UInt32,
status UInt32,
forsedUpdate UInt8,
tsAddedUTC DateTime64,
idbunch String,
INDEX u_data (idmpchd, tsUTC) TYPE SET(1000) GRANULARITY 8192,
INDEX id (iddata) TYPE SET(1) GRANULARITY 8192
) ENGINE = MergeTree()
PARTITION BY (toYear(tsUTC), toMonth(tsUTC))
ORDER BY (tsUTC, idmpchd);
в нее я буду писать все, но мне нужны уникальные записи, я создаю МВ:
create materialized view data
ENGINE = MergeTree()
PARTITION BY (toYear(tsUTC), toMonth(tsUTC))
ORDER BY (tsUTC, idmpchd)
AS(
select
*
from datast
where iddata in(
SELECT
argMin(iddata, status) as iddata
from datast
group by datast.idmpchd, datast.tsUTC
));
но во вьюху пишет все строки, которые вставляю, может кто направит на пусть истинный -
не решить такое с помощью materialized view
посмотрите на Engine=ReplacingMergeTree (но он не гарантирует остутствие дубликатов по ключу.
PARTITION BY (toYear(tsUTC), toMonth(tsUTC)) --- надо обязательно поменять на PARTITION BY toYYYMM(tsUTC) -
-
спасибо
-
а реплики это какой Engine? REPLICATED?
если прямо из шардов-таблиц выбирать, данные совпадают? -
-
-
Подскажите плез поведение словарей внешних. Есть словарь:
CREATE DICTIONARY test_dictionary(
id UInt64,
....
)
PRIMARY KEY id
SOURCE(MYSQL(
))
LAYOUT(HASHED())
LIFETIME(MIN 60 MAX 120);
Источник таблица на 20кк, значение атрибута не обновляется через LIFETIME MAX секунд, даже с учетом самого времени обновления. По сути словарь не обновляется вообще. Invalidate query нет, движок в мускуле Innodb
В чем может быть дело? -
-
нет. Но вроде и так несколько потоков, по мержу на партицию?
-
-
-
значит я путаю. видимо только отдельно на каждую партицую вручную
-
-
в system.dictionaries ошибки есть?
может и баг что вот это место сломано Для таблиц типа MyISAM, время модификации проверяется запросом SHOW TABLE STATUS. -
нет, статус в system.dictionaries LOADED, про Myisam я поэтому и указал что innodb движок в мускуле.
Словарь работает как положено, при первом запросе грузит в память, атрибуты отдаёт. Визуально всё в порядке. Но вот обновления не происходит. Принудительно обновить получается через SYSTEM RELOAD DICTIONARY и данные обновляются - значение аттрибута меняется.
В доке написано что invalidate query опционален, но возможно для каких то размеров внешних источников, или для каких то специфичных кейсов его всё таки необходимо указывать. -
тогда ненаю
-
-
да и проверяю clickhouse.err.log и там с течение времени никаких ошибок не появляется
-
эх, понял, спасибо
-
ну попробуйте макс в 4-5 минут выставить и "продолжайте наблюдение"
-
что тако аттрибут? о чем речь?
-
LIFETIME(300) ещё попробуйте так (без мин-макс)
-
LOADED не причем, смотрите в last_exception
-
last_exception пустой
last_successful_update_time: 2020-08-05 14:34:36 - то есть судя по всему обновление просто не тригерится
надо попробовать invalidate_query таки -
в логе кх погрепайте по имени словаря, это должно работать, тесты есть
-
значение колонки из внешней таблицы в мускуле, вроде в доке кх оперируют понятием "аттрибут"
-
я его просто смотрю через tail -f и никаких сообщений прост не падает, тестирую на локале пока
-
пфф, вот создал
mysql: create view test as select 1 as id, now() as t;
CREATE DICTIONARY test_dictionary(
id UInt64,
t DateTime
)
PRIMARY KEY id
SOURCE(MYSQL(
port 3306
user 'xxx'
password 'zzzz'
replica(host 'yyyy' priority 1)
db 'xxx'
table 'test'
))
LAYOUT(HASHED())
LIFETIME(MIN 1 MAX 5)
;
SELECT *
FROM test_dictionary
┌─id─┬───────────────────t─┐
│ 1 │ 2020-08-05 15:56:13 │
└────┴─────────────────────┘
SELECT *
FROM test_dictionary
┌─id─┬───────────────────t─┐
│ 1 │ 2020-08-05 15:58:08 │
└────┴─────────────────────┘
tail -f /var/log/clickhouse-server/clickhouse-server.log|grep test_dictionary
2020.08.05 15:58:28.769354 [ 15594 ] {} <Trace> ExternalDictionariesLoader: Start loading object 'dw.test_dictionary'
2020.08.05 15:58:28.774838 [ 15594 ] {} <Trace> ExternalDictionariesLoader: Supposed update time for 'dw.test_dictionary' is 2020-08-05 15:58:29 (loaded, lifetime [1, 5], no errors)
2020.08.05 15:58:28.774846 [ 15594 ] {} <Trace> ExternalDictionariesLoader: Next update time for 'dw.test_dictionary' was set to 2020-08-05 15:58:29
2020.08.05 15:58:33.770862 [ 15546 ] {} <Trace> ExternalDictionariesLoader: Will load the object 'dw.test_dictionary' in background, force = false, loading_id = 31
2020.08.05 15:58:33.770874 [ 15546 ] {} <Trace> ExternalDictionariesLoader: Object 'dw.test_dictionary' is neither loaded nor failed, so it will not be reloaded as outdated.
2020.08.05 15:58:33.770887 [ 15592 ] {} <Trace> ExternalDictionariesLoader: Start loading object 'dw.test_dictionary'
2020.08.05 15:58:33.776387 [ 15592 ] {} <Trace> ExternalDictionariesLoader: Supposed update time for 'dw.test_dictionary' is 2020-08-05 15:58:38 (loaded, lifetime [1, 5], no errors)
2020.08.05 15:58:33.776395 [ 15592 ] {} <Trace> ExternalDictionariesLoader: Next update time for 'dw.test_dictionary' was set to 2020-08-05 15:58:38
2020.08.05 15:58:43.772762 [ 15546 ] {} <Trace> ExternalDictionariesLoader: Will load the object 'dw.test_dictionary' in background, force = false, loading_id = 32
2020.08.05 15:58:43.772775 [ 15546 ] {} <Trace> ExternalDictionariesLoader: Object 'dw.test_dictionary' is neither loaded nor failed, so it wil -
вот что у меня после грепа:
2020.08.05 15:55:51.327218 [ 190 ] {9029d5c4-115d-4eef-844c-8c18d246b0e8} <Trace> AccessRightsContext (testdb): Access granted: dictGet() ON testdb.test_dictionary
2020.08.05 15:55:51.327239 [ 190 ] {9029d5c4-115d-4eef-844c-8c18d246b0e8} <Trace> AccessRightsContext (testdb): Access granted: dictGet() ON testdb.test_dictionary
2020.08.05 15:55:51.327255 [ 190 ] {9029d5c4-115d-4eef-844c-8c18d246b0e8} <Trace> AccessRightsContext (testdb): Access granted: dictGet() ON testdb.test_dictionary
2020.08.05 15:55:51.331400 [ 150 ] {9029d5c4-115d-4eef-844c-8c18d246b0e8} <Trace> AccessRightsContext (testdb): Access granted: dictGet() ON testdb.test_dictionary
2020.08.05 15:55:51.331429 [ 150 ] {9029d5c4-115d-4eef-844c-8c18d246b0e8} <Trace> AccessRightsContext (testdb): Access granted: dictGet() ON testdb.test_dictionary
2020.08.05 15:55:51.331442 [ 150 ] {9029d5c4-115d-4eef-844c-8c18d246b0e8} <Trace> AccessRightsContext (testdb): Access granted: dictGet() ON testdb.test_dictionary -
собственно все сообщения такие
-
это я писал про clickhouse-server.err.log, ожидал там увидеть ошибку
-
мой пример попробуйте
-
да, ваш пример работает, ~ раз в 5сек обновляет
-
а mysql какой у вас?
-
но странно что не вижу в логе похожих на ваши сообщения, только это:
2020.08.05 16:14:28.060467 [ 200 ] {7366b92e-829f-4287-a769-0be03a9877ad} <Debug> executeQuery: (from 127.0.0.1:55872, user: test) SELECT * FROM test.test_dictionary
2020.08.05 16:14:28.068312 [ 200 ] {7366b92e-829f-4287-a769-0be03a9877ad} <Trace> AccessRightsContext (test): Access granted: SELECT(id, t) ON test.test_dictionary
2020.08.05 16:14:33.335095 [ 200 ] {9c0c3245-58f8-49bf-aa1e-194eceaf0b95} <Debug> executeQuery: (from 127.0.0.1:55872, user: test) SELECT * FROM test.test_dictionary
2020.08.05 16:14:33.335555 [ 200 ] {9c0c3245-58f8-49bf-aa1e-194eceaf0b95} <Trace> AccessRightsContext (test): Access granted: SELECT(id, t) ON test.test_dictionary
2020.08.05 16:14:34.075098 [ 200 ] {20854307-f847-4c7f-b0c7-de9c43574c43} <Debug> executeQuery: (from 127.0.0.1:55872, user: test) SELECT * FROM test.test_dictionary
2020.08.05 16:14:34.075255 [ 200 ] {20854307-f847-4c7f-b0c7-de9c43574c43} <Trace> AccessRightsContext (test): Access granted: SELECT(id, t) ON test.test_dictionary
2020.08.05 16:14:34.775005 [ 200 ] {d6602cad-f7f6-4bc3-b87e-d8bf7878a10d} <Debug> executeQuery: (from 127.0.0.1:55872, user: test) SELECT * FROM test.test_dictionary
2020.08.05 16:14:34.775451 [ 200 ] {d6602cad-f7f6-4bc3-b87e-d8bf7878a10d} <Trace> AccessRightsContext (test): Access granted: SELECT(id, t) ON test.test_dictionary
2020.08.05 16:14:35.442858 [ 200 ] {92d86932-59fa-48d8-a4cc-7b0eaa5a7606} <Debug> executeQuery: (from 127.0.0.1:55872, user: test) SELECT * FROM test.test_dictionary
2020.08.05 16:14:35.442980 [ 200 ] {92d86932-59fa-48d8-a4cc-7b0eaa5a7606} <Trace> AccessRightsContext (test): Access granted: SELECT(id, t) ON test.test_dictionary
2020.08.05 16:14:36.119016 [ 200 ] {1c5167ec-afaa-4b63-8a5e-da93846c7881} <Debug> executeQuery: (from 127.0.0.1:55872, user: test) SELECT * FROM test.test_dictionary
2020.08.05 16:14:36.119442 [ 200 ] {1c5167ec-afaa-4b63-8a5e-da93846c7881} <Trace> AccessRightsContext (test): Access granted: SELECT(id, t) ON test.test_dictionary
2020.08.05 16:14:36.623015 [ 200 ] {0de29a00-5950-4e78-b4a1-7cd1f744bad2} <Debug> executeQuery: (from 127.0.0.1:55872, user: test) SELECT * FROM test.test_dictionary
2020.08.05 16:14:36.623472 [ 200 ] {0de29a00-5950-4e78-b4a1-7cd1f744bad2} <Trace> AccessRightsContext (test): Access granted: SELECT(id, t) ON test.test_dictionary -
8.0.20
clickhouse build 20.3.13.127 -
у меня мастер какой-то 20.7, сейчас попробую 20.3
https://github.com/ClickHouse/ClickHouse/issues/11475External dictionaries couldn't update from mysql 8 version · Issue #11475 · ClickHouse/ClickHouseIn our organization we upgrade mysql to 8 version from 5.7 After that all external dictionaries stopped to update. For example, for one of the dictionaries. SELECT name, last_successful_update_time...
-
брехня в доке КХ
-
Для таблиц типа MyISAM, время модификации проверяется запросом SHOW TABLE STATUS.
-
а в коде if (!update_time_value.isNull())
-
спасибо попробую конечно это решение, но думаю лучше заведу колонку updated_at в мускуле и укажу invalidate_query в словаре кх
-
у iinnodb SHOW TABLE STATUS LIKE тоже есть Update_time
-
никогда такого не было...
-
или может я брешу
-
const auto & update_time_value = row[UPDATE_TIME_IDX];
-
может только у myisam UPDATE_TIME_IDX
-
ааа , UPDATE_TIME_IDX= 12 это 12 колонка в SHOW TABLE STATUS
-
брехня в доке
-
короче 8й mysql и information_schema_stats_expiry виноваты
-
Подскажите , нужно кусок етл, для хранения промежуточных результатов запихнуть в бд. Т.е один воркер создаёт таблицу , пишет туда данных , другой их забирает и удаляет таблицу . Кликхаус для такого подойдёт ? Или из-за того, что транзакций нет это антипатерн ? Много маленьких таблиц до миллиона строк существуют в один момент времени в таком случае .
-
-
define "много"
-
100, к примеру.
-
-
нормально, если задержка на create не волнует, и если вставка одним махом будет
если ha не нужен можете stripelog engine взять -
-
Яндекс.Метрика и нестандартный ClickHouse / Александр Макаров (Яндекс)
Приглашаем на HighLoad ++ Весна 202117 и 18 мая 2021, Москва, Крокус-ЭкспоПрограмма, спикеры и билеты - https://bit.ly/3sZPj2Y--------HighLoad++ Moscow 2018Т...
-
коллеги, подскажите пожалуйста еще раз, при создании реплицированной таблицы
ReplicatedMergeTree('/clickhouse/tables/{shard}/hits', '{replica}',
если в кластере два шарда, в каждом шарде два сервера (реплика), макрос {shard} в конфиге скажем для 3го сервера, который относится ко 2у шарду должен быть 2 (по номеру шарда) или 3 (просто по номеру сервера) ? -
По номеру шарда
-
Привет! Делаю запрос с left join. В левой части делается limit 10. Колонки которые участвуют в USING находzтся в ORDER BY правой части. По логам вижу, что для правой части индекс не применяется. Может как-то кликхаус брать результаты левой части и фильтровать правую по индексу?
-
👍
-
да, поменяйте местами или используйте фильтрацию с IN для большой таблицы
-
А как поможет поменять местами? Сначала выполняется правая часть?
-
там уже столько версий и параметров, что я запутан... лучше в трейс смотреть
-
-
КХ не умеет индексы для джойна, пишите подзапрос для правой таблицы
-
IN такой же как левая часть? Если запрос тот же, то он 1 раз исполнится?
-
нет, и даже будет разный результат иметь. Поэтому левую limit 10 во временную таблицу отдельным запросом.
лучше конечно избегать джойнов, особенно таких -
Спасибо!
-
есть вопрос по кликхаус копиру:
есть кластер N шардов, данные которого надо перенести на новый кластер с M шардов
1) правильно ли я понимаю, что если я запущу один копиер на любом из кластеров, то он будет через одну точку тягать данные с N шардов на M шардов?
2) для лучшей параллельности процесса лучше ли будет запустить на каждой ноде шарда по копиеру и в source_cluster прописать 127.0.0.1 (тяни с меня, но не с соседней машины)?
3) если пункт 2 соблюдается, то улучшится ли параллельность процесса, если реплики тоже будут так данные передавать (или они законфликтуют по набору данных?)
4) --task-path надо для каждой ноды с копиером делать выделенный, или учитывая что сорс у меня 127.0.0.1 можно через один? не законфликтуют ли воркеры за task_active_workers ноду в зукипере? -
коллеги, еще один дилетантский вопрос, про репликацию, шарды и кафку
есть кластер
шард1
сервер1 (реплика)
сервер2 (реплика)
шард2
сервер3 (реплика)
сервер4 (реплика)
есть кафка, хочу из нее читать на каждом сервере, сделал следующее, но похоже это не правильно:
есть таблица kafka_replica с
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/bi/0/kafka_replica', '{replica}')
читаю стрим кафки kafka_stream в materizlied view и далее его отображаю в kafka_replica:
CREATE MATERIALIZED VIEW bi.kafka_materialized TO bi.kafka_replica AS
SELECT
...
FROM
(SELECT
...
FROM bi.kafka_stream)
далее, над bi.kafka_replica построена таблица kafka_all c
ENGINE = Distributed(bi_replicated, bi -
-
-
вам надо из N в M , читать надо через одну distributed писать в другую distributed -- через одну точку, иначе как? надо же решардить каждую строку.
но так как партиций много и если воркеров много, будут задействованы все ноды -
>писались в заданный шард
заданный как? шардирование по полю какому-то?
CREATE MATERIALIZED VIEW bi.kafka_materialized TO kafka_all AS
но вообще это все хреново -
-
и надо партиционировать в кафке партициями или топиками и читать например разные топики на шардах
-
-
эм, а почему так?
-
internal replication из другой оперы, оно должно быть true у вас
-
-
-
если есть ENGINE = Replicated internal_replication обязано быть true
(internal_replication=true означает что репликацию делает сама таблица потому что у нее Replicated engine) -
>писались в заданный шард
заданный как? шардирование по полю какому-то?
что вы вообще понимаете под фразой "писались в заданный шард" -
-
-
-
-
ааа, ясно, тогда все ОК у вас.
У вас просто рандомное шардирование, половина записей в одном шарде, половина в другом. -
-
Доброго времени всем, может, кто подскажет:
вставка значений в Decimal(9, 2) на КХ 20.4.4.18, при вставке значения 1.01 умудряется (крайне редко, но все же) фейлиться с
Code: 69, e.displayText() = DB::Exception: Too many digits (10 > 9) in decimal value: (at row 171)
Row 171:
<...>
Column 38, name: Amount, type: Decimal(9, 2), parsed text: "1.00999999"ERROR
как работает эта магия и куда колдовать? -
вот прямо 1.01?
-
да, именно так
-
логи параллельно со вставкой пишутся, так что точно именно это число улетало
-
а воспроизводится если
create table x(a Decimal(9,2)) Engine=Null;
echo 'insert into x values (1.01)'|clickhouse-benchmark --database default -
как проверю - отпишусь, спасибо за ответ в позднее время)
-
в каком формате вставка? TSV? values ? API?
-
CSV
-
туда летит как раз в виде ...,1.01,...
- 06 August 2020 (225 messages)
-
можно кавычки добавить для теста "1.01"
-
тоже опробую, спасибо)
-
Всем привет! Есть база БД с движком Dictionary. при попытке создать словарь через DDL с указанием этой БД получаю ошибку вида " DB::Exception: Dictionary engine doesn't support dictionaries". Без указания БД словарь создается в базе default. Подскажите, есть ли возможность с помощью DDL создать словарь, чтобы увидеть его в базе Dictionary?
-
у БД нет таких движков, движок таблицы? какой DDL запускаете?
-
-
почему нет, create database engine = Dictionary
-
DDL вида CREATE DICTIONARY test_dict
(
id UInt64
,record_number Int32 default 0
)
PRIMARY KEY id
SOURCE(CLICKHOUSE(
host 'localhost'
port 9000
user 'default'
password ''
db 'default'
table 'test_data'
))
LAYOUT(RANGE_HASHED())
RANGE(MIN date_from MAX date_to)
LIFETIME(MIN 300 MAX 360); -
Введение | Документация ClickHouse v20.3
Движки баз данных Движки баз данных обеспечивают работу с таблицами. По умолчанию ClickHouse использует собственный движ
-
в обычной КХ БД должно работать...
про движок БД dictionary - не слышал -
-
Оно и работает, но таблица создается по умолчанию в default. а если описать ее в конфиге, то автоматом подтягивается в dictionary базу.
-
Всем привет, подскажите можно ли сделать alter materialize view без целевой таблицы ( TO )? а то в доке только про них написано...
detach view и alter .inner.xxx таблицы сработает? -
я как раз хотел узнать, реально ли через ddl запихать словарь сразу в dictionary базу
-
-
но вообще вам так:
create database djdicttest Engine=Dictionary;
select * from djdicttest.`dbname.dictname`; -
ого, спасибо попробую👌
-
-
select * from system.tables;
и это сломалось ) -
надеюсь хоть база не продуктовая?(
-
конечно продуктовая. вот обновляю CV параллельно =)
-
ну тогда напоследок можно rm -r /var/lib/clickhouse )
-
-
-
Здравствуйте,
Запрос:
SELECT
year,
month,
day,
COUNT() * any(_sample_factor) AS data
FROM events
SAMPLE 10000
WHERE (event_time > 1594109197) AND (project_id = 171) AND (year IN (20)) AND (month IN (7, 8)) AND (event_name = 'view')
GROUP BY
year,
month,
day
Получаю ошибку:
Code: 49. DB::Exception: Received from localhost:9000. DB::Exception: RangeReader read 13084 rows, but 13198 expected.
В чем может быть ошибка?
ClickHouse server version 20.1.4.14 -
Вопрос про комбинаторы агрегатной функции -State, возможно есть функция или подход к решению? Необходимо найти пересечение (intersection) двух групп пользователей разных сайтов. В документации есть рабочий пример через использование IN, что типа SELECT uniq(UserID) FROM distributed_table WHERE CounterID = 101500 AND UserID IN (SELECT UserID FROM local_table WHERE CounterID = 34)
Допустим у меня уже есть “свертки” по уникам, по дням. Уники уже хранятся в виде результата выполнения комбинатора агрегатной функции uniqCombinedState. Можно ли как-то найти пересечение двух uniqCombinedState?IN Operators | ClickHouse DocumentationIN Operators The IN, NOT IN, GLOBAL IN, and GLOBAL NOT IN operators are covered separately, since their functionality is
-
-
2020.08.06 08:30:06.473605 [ 38362 ] {} <Error> virtual DB::WriteBufferFromHTTPServerResponse::~WriteBufferFromHTTPServerResponse(): Code: 24, e.displayText() = DB::Exception: Cannot write to ostream at offset 8, Stack trace (when copying this message, always include the lines below):
0. Poco::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x10ed0da0 in /usr/bin/clickhouse
1. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x95c923d in /usr/bin/clickhouse
2. ? @ 0xc0cb686 in /usr/bin/clickhouse
3. DB::WriteBufferFromHTTPServerResponse::nextImpl() @ 0xe63fbb2 in /usr/bin/clickhouse
4. DB::WriteBufferFromHTTPServerResponse::~WriteBufferFromHTTPServerResponse() @ 0xe640373 in /usr/bin/clickhouse
5. DB::StaticRequestHandler::handleRequest(Poco::Net::HTTPServerRequest&, Poco::Net::HTTPServerResponse&) @ 0xe68e48a in /usr/bin/clickhouse
6. Poco::Net::HTTPServerConnection::run() @ 0x10db5183 in /usr/bin/clickhouse
7. Poco::Net::TCPServerConnection::start() @ 0x10deebcb in /usr/bin/clickhouse
8. Poco::Net::TCPServerDispatcher::run() @ 0x10def05b in /usr/bin/clickhouse
9. Poco::PooledThread::run() @ 0x10f6db86 in /usr/bin/clickhouse
10. Poco::ThreadImpl::runnableEntry(void*) @ 0x10f68f80 in /usr/bin/clickhouse
11. start_thread @ 0x7fa3 in /usr/lib/x86_64-linux-gnu/libpthread-2.28.so
12. __clone @ 0xf94cf in /usr/lib/x86_64-linux-gnu/libc-2.28.so -
Привет! После рестарта кликхауса на /replicas_status был absolute delay в неделю почти. Почему неделя, а не пара минут максимум? Как это значение высчитывается?
-
Гуру, подскажите пожалуйста по проблеме,
есть кластер (v20.4.4, 2 шарда по 2 реплики), 3 ноды из 4х постоянно спамят ошибки по несколько раз в секунду:
<Error> executeQuery: Code: 252, e.displayText() = DB::Exception: Too many partitions for single INSERT block (more than 100).
одна из нод (реплика ноды с которой все ок) спамит дополнительно :
<Error> default.snapshot.DirectoryMonitor: Code: 252, e.displayText() = DB::Exception: Received from xxxx:9000. DB::Exception: Too many partitions for single INSERT block (more than 100)
Причем спамит и в такое время, в которое в КХ никто не пишет. Такое ощущение что репликация какая-то залипла.. но replication_queue пустая на всех нодах. Куда еще можно посмотреть? -
Репликация не через инсерты работает
-
-
Здравствйте! Вопрос такой - как соотносится, примерно, объем данных, который в клик пишем, и то, что там хранится в итоге на диске?
-
Зачем Вам сообщать Кафке о том что была запись?
-
чтобы быть уверенным, что я не потерял запись
-
Впервые о таком методе слышу, но с большой вероятностью никак Вы не сообщите Кафке, что запись была осуществлена
-
мне нужно вычитать это данное и записать в другой топик. У меня есть фоновые задачи и мне нужно быть уверенным, что данное записалось, прежде чем я запустил фоновую задачу.
-
-
Если Вы понимаете как работает Кафка, то наверное знаете, что есть некий период, который она хранит сообщения после прочтения. Этим можно воспользоваться в случае если данные не записались, то прочитать их ещё раз для этого Вам конечно же нужно знать смещение
-
спасибо
-
-
@den_crane, подскажи плиз. Получаю такую ошибку в логах КХ: ZooKeeper error: Code: 999, e.displayText() = Coordination::Exception: Transaction failed (No node): Op #0, path: /clickhouse/task_queue/ddl/query-0000000002/active/localhost:9000
Я правильно понимаю что это из-за того что не настроен interserver_http_host?ну или хостнейм смотреть надо. я пытаюсь создать бд с ON CLUSTER -
Сколько консюмеров у Вас в кликхаузе читает из таблицы и сколько партиций в самой кафке?
-
В кафке 3 партишена(сообщения есть во всех трёх), в кластере кликхауса 3 хоста
И варнинг такой валится на всех 3 хостах кликхауса -
И kafka_group_name на всех нодах кластера у таблицы одинаковая?
-
Да, по идее.
Я таблицу ON CLUSTER создавал
Сейчас придумаю, как достоверно проверить -
Какой у Вас кластер?
1 шард 3 реплики? -
да, один шард, три реплики
-
На каждой реплике, я так понимаю, у Вас есть MV, которые пишет в ReplicatedMergeTree таблицу на своей реплике?
-
Да, всё так
Ещё важное замечание - у меня есть такой же набор таблиц на managed clickhouse в Яндекс.Облако
Сейчас я перетаскиваю эту схему в другое облако
Настройки кафки в облаках также идентичны (за исключением того, что в ЯО три хоста кафки, а в другом облаке - два хоста. Но количество партишенов одинаковое) -
-
все привет!
после апдейта с версии 19.17.6.36 на версию 20.3.10.75 иногда (те иногда норм проходят, иногда падают) стали падать ошибки когда обращаюсь за данными через mysql(..), может кто-нибудь сталкивался, знает в чем причина?
c909828dc32e :) SELECT *
:-] FROM mysql(..') limit 10
SELECT *
FROM mysql('..', '..', '..', '..', '..')
LIMIT 10
Received exception from server (version 20.3.10):
Code: 1000. DB::Exception: Received from localhost:9000. DB::Exception: mysqlxx::ConnectionFailed: Unknown SSL error ((nullptr):3306).
0 rows in set. Elapsed: 0.893 sec. -
Не подскажите?
-
я взял файлик bbb.x и зажал архиватором 7zip , как соотносится, примерно, объем данных bbb.x и bbb.x.7zip ?
-
42x compression
-
Те один к одному * на k сжатия?
-
иногда в 100 раз сжимается, иногда в 2.
И можно разные компрессоры и кодеки использовать, lz4 zstd, delta, и т.д. -
там блоки сжатия по 65к строк (может менятся) поколоночно, ессно зависит от порядка, кодеков, компрессии. пока не проверите - не поймете
-
обновляться до 20.1.16.120
-
distrbuted таблица для инсертов используется? ну она пытается асинхронно вставить и не может
-
да, используется
-
>localhost:9000
да, из-за interserver_http_host -
при инсертах данные пишутся в distributed и лежат в .bin файлах на диске, дальше distributed вставляет в MergeTree и не может из-за ошибки, и повторяет до успеха
-
а как это можно пофиксить?
-
Ну вы понимаете что в ошибке написано? Как у вас таблица создана? Partition by что?
-
partition by дата и источник информации
-
мне не понятно другое, он получается на одной ноде смог записать, а на другую асинхронно не может?
-
как такое возможно, таблицы одинаковые
-
или оно вообще в принципе никогда не вставится, и никогда не пропадет если неправильный запрос создать в дистрибьютед таблицу?
-
если таблицы replicated то вставка делается только на одной. Параметр поставьте 0 в профиле пользвателя.
А как так получилось что вставилось 100 дней? Случайно? -
--max_partitions_per_insert_block arg Limit maximum number of partitions in single INSERTed block. Zero means unlimited. Throw exception if the block contains too many partitions. This setting is a safety threshold, because using large number of partitions is a common misconception.
-
Да, случайно, попытались батчем историю залить слишком большую
-
-
а этот запрос можно как-то убить?
или теперь только через max_partitions_per_insert_block = 0 -
Проще в профиль парметр добавить, он же применяется на лету. И да можно этот bin файл удалить
-
а как найти "правильный" .bin ?
вроде нашли query c которой все началось, но про расположение .bin там ничего нет.. -
Из лога по id запроса который падает ?
-
да, в query_log, через initual_query_id.
и время совпадает с началом ошибок -
Господа, доброго времени суток!
Подскажите, пожалуйста, в чем может быть проблема:
SELECT count(*)
FROM dis_locatable_entity_states
↓ Progress: 0.00 rows, 0.00 B (0.00 rows/s., 0.00 B/s.) Received exception from server (version 20.3.7):
Code: 999. DB::Exception: Received from localhost:9000. DB::Exception: Received from chi-clickhouse-db-org-sim-default-1-1:9000. DB::Exception: Session expired (Session expired). -
Кластер в кубере из 4 нод: 2 шарда, 2 реплики
-
SHOW CREATE TABLE dis_locatable_entity_states что говорит?
-
SHOW CREATE TABLE dis_locatable_entity_states
SHOW CREATE TABLE dis_locatable_entity_states
┌─statement──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ CREATE TABLE db.dis_locatable_entity_states (`timestamp` DateTime, `location_online_status` LowCardinality(String), `cur_patient_state` LowCardinality(String), `cur_patient_timestamp` DateTime, `prev_patient_state` LowCardinality(String), `prev_patient_timestamp` DateTime, `loc_room_id` UUID, `loc_ward_id` UUID, `loc_floor_id` UUID, `loc_building_id` UUID, `loc_campus_id` UUID, `loc_campus_org_code` LowCardinality(String), `loc_timestamp` DateTime, `site_id` UUID, `site_type` LowCardinality(String), `site_name` String, `entity_id` UUID, `entity_org_code` LowCardinality(String), `entity_type` LowCardinality(String), `entity_sub_type` LowCardinality(String), `entity_name` String, `cur_clean_state` LowCardinality(String), `cur_clean_timestamp` DateTime, `prev_clean_state` LowCardinality(String), `prev_clean_timestamp` DateTime, `cur_broken_state` LowCardinality(String), `cur_broken_timestamp` DateTime, `prev_broken_state` LowCardinality(String), `prev_broken_timestamp` DateTime, `cur_in_use_state` LowCardinality(String), `cur_in_use_timestamp` DateTime, `prev_in_use_state` LowCardinality(String), `prev_in_use_timestamp` DateTime, `user` String, `group` String, `prev_user` String, `prev_group` String, `event_type` LowCardinality(String), `deleted_at` Nullable(DateTime)) ENGINE = Distributed(default, db, locatable_entity_states, rand()) -
пишет ошибку при вставк:
0. Poco::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x10541260 in /usr/bin/clickhouse
1. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x8f3f72d in /usr/bin/clickhouse
2. ? @ 0xd7af148 in /usr/bin/clickhouse
3. DB::StorageReplicatedMergeTree::write(std::__1::shared_ptr<DB::IAST> const&, DB::Context const&) @ 0xd758bb9 in /usr/bin/clickhouse
4. DB::PushingToViewsBlockOutputStream::PushingToViewsBlockOutputStream(std::__1::shared_ptr<DB::IStorage> const&, DB::Context const&, std::__1::shared_ptr<DB::IAST> const&, bool) @ 0xd0d5fdb in /usr/bin/clickhouse
5. DB::InterpreterInsertQuery::execute() @ 0xd0cd651 in /usr/bin/clickhouse
6. DB::PushingToViewsBlockOutputStream::PushingToViewsBlockOutputStream(std::__1::shared_ptr<DB::IStorage> const&, DB::Context const&, std::__1::shared_ptr<DB::IAST> const&, bool) @ 0xd0d5ba9 in /usr/bin/clickhouse
7. DB::InterpreterInsertQuery::execute() @ 0xd0cd651 in /usr/bin/clickhouse
8. DB::DistributedBlockOutputStream::writeToLocal(DB::Block const&, unsigned long) @ 0xd8a64d1 in /usr/bin/clickhouse
9. DB::DistributedBlockOutputStream::writeAsyncImpl(DB::Block const&, unsigned long) @ 0xd8a80f6 in /usr/bin/clickhouse
10. DB::DistributedBlockOutputStream::writeSplitAsync(DB::Block const&) @ 0xd8a85a0 in /usr/bin/clickhouse
11. DB::DistributedBlockOutputStream::write(DB::Block const&) @ 0xd8a8b2d in /usr/bin/clickhouse
12. DB::PushingToViewsBlockOutputStream::write(DB::Block const&) @ 0xd0d4b1e in /usr/bin/clickhouse
13. DB::SquashingBlockOutputStream::writeSuffix() @ 0xd0e286a in /usr/bin/clickhouse
14. DB::TCPHandler::processInsertQuery(DB::Settings const&) @ 0x90217b2 in /usr/bin/clickhouse
15. DB::TCPHandler::runImpl() @ 0x9022ecf in /usr/bin/clickhouse
16. DB::TCPHandler::run() @ 0x90234c0 in /usr/bin/clickhouse
17. Poco::Net::TCPServerConnection::start() @ 0xe3b885b in /usr/bin/clickhouse
18. Poco::Net::TCPServerDispatcher::run() @ 0xe3b8cdd in /usr/bin/clickhouse
19. Poco::PooledThread::run() @ 0x105cf3c7 in /usr/bin/clickhouse
20. Poco::ThreadImpl::runnableEntry(void*) @ 0x105cb1cc in /usr/bin/clickhouse
21. ? @ 0x105ccb6d in /usr/bin/clickhouse
22. start_thread @ 0x76db in /lib/x86_64-linux-gnu/libpthread-2.27.so
23. __clone @ 0x12188f in /lib/x86_64-linux-gnu/libc-2.27.so -
-
-
-
не актуально, транспонировал
-
Что бы врубить ssl нужно сгенерить crt key pem и раскоментить 8443 порт? Или что-то ещё нужно? У меня не завелось, хотя порт раскоментил и все сгенерил
-
Спасибо! временное изменение параметра помогло
-
у вас коннекта нет между нодами
в приведенном stacktrace там выше сообщение об ошибке есть в логе выше -
спасибо! Как чинить?
-
сообщение об ошибке при insert посмотрите
ну и у вас zookeeper поднят в k8s?
под с зукипером живой? -
А в чем разница между матвьями которые POPULATED и которые TO db.table? Я понимаю что в одном случае создается кэш-таблица на диске, а в другом не создается. А еще какие-нибудь различия есть? Зачем вообще может понадобиться популейтед таблица в матвью? Это чтобы выгребать данные с нод кластера или есть смысл такое мутить даже если табличка "локальная"?
-
TO появилось сильно позже. Изначально его не было и просто создавалась таблица под mview со специальным именем.
-
посмотрю все, спасибо!
-
sessions expired это значит нет коннекта с Zookeeper
-
в логе КХ написано что неправильно, может права на key кривые
-
написано же все в доке?
без populate -- MV увидит данные только от новых инсертов
populate -- заполнить MV данными из основной таблицы
без TO -- MV создаст таблицу в которой будут хранится ее данные самостоятельно и назовет эту свою таблицу .inner.mvname
c TO -- мы сами создали таблицу в которой будут хранится данные MV
populate и TO несовместимы, это недоделка
в MV можно делать инсерты, и заполнять ее как угодно без использования populate
optimize_move_to_prewhere не работает если делать запросы к MV, поэтому MV без TO теряют смысл (или делать селекты к .inner.mvname вручную, что полный бред) -
и до кучи: MV это триггер на инсерт, оно не читает исходную таблицу (кроме шага populate)
-
Даже когда оно ТО?
-
исходная таблица -- это таблица которая написана в SELECT FROM исходная
-
конечно исходную MV вообще не читает в случае TO
-
Разница TO и без TO, только в том куда триггер делает инсерт, либо в готовую таблицу либо в самосозданную .inner.mvname
все это можно переделать из одного в другое, это просто обычные таблицы и sql файлы -
Ясно. Еще такой вопрос - если у меня реплекейтед таблица, и я матвью навешу, которое без ТО, оно будет хавать инсерты которые прилетят через зукипер? (допустим нода отвалилась, прошли инсерты, потом нода поднялась - очередь пустая, но есть новые парты)
-
populate -- делает крайне тупую вещь, insert into .inner.mvname select который в MV, тупость в том что памяти может не хватить
-
zookeeper хранит данные (имена, контр. суммы) о партах(файлах) которые надо скачать одной ноде с другой.
MV все равно какой Engine исходной таблицы, оно получает данные от инсертов, был инсерт на ноде A, MV на ноде A получит данные
Естественно надо просто делать Replicated engine у MV чтобы они тоже реплицировались если надо иметь MV на всех нодах, само MV тоже создавать на всех нодах (там инсерты) -
Да вот блин хотелось бы инсертить на одной ноде а данные в матвью собирать на другой
-
ну это возможно, просто в TO прописать таблицу с либо Engine Distributed либо remote
т.е. делаем insert into source на ноде A, там MV получает данные от инсерта, считает select и делает свой инсерт в таблицу на другой ноде -
-
хрень конечно полная и будет ломаться при разрыве связи
-
-
Доброго времени суток.
ClickHouse (ver. 20.4.5.36)
При рестарте КХ получаем креш и
{} <Error> Application: Coordination::Exception: No node, path: /clickhouse/tables/1/db.tbl/replicas/server-name/metadata: Cannot attach table `db`.`.inner.tbl` from metadata file /var/lib/clickhouse/metadata/db/%2Einner%tbl.sql from query ATTACH TABLE `.inner.tbl` (.........
Что может быть и что делать? Вроде ничего такого не делали на сервере -
-
-
надо:
1) проверить что в конфиге не потерялся ЗК
2) "select * from system.zookeeper where path 'путь';" убедиться что кх доходит в ЗК и поперебирать путя найти нужны
3) посмотреть в metadata/db/tbl.sql на файлухе что за макросы используются у вас и поправить в конфиге нужные макросы, чтоб путя стали правильные -
-
в КХ нет инверсных индексов
какой индекс? skip ? в доке описано
первичный индекс задается при создании таблицы -
Добрый день!
Подскажите в какой версии кликхауза доступен тип хранения словаря ssd_cache? -
-
Отвечу сам, начиная с версии 20.6, которая пока ещё не является стабильной
-
20.6 prestable, т.е. есть шансы что зарелизится на этой неделе, тестировать у себя уже можно / нужно
-
Ну и подождать выход следующих минорных версий с исправлением багов :)
-
никто ssd пользоваться не начнет еще полгода, поэтому баги найдете все равно вы, раньше найдете, раньше исправят.
-
Значит жду релиз и буду пробовать
-
Привет всем, запустил в базу кучу мелких альтер удалений, запустил оптимайз на таблицу, параллельно посматриваю is_done, но что-то как-то они не прибавляются, как мониторить процесс накатывания мутаций?
мониторю завершенность так: select is_done, count() from system.mutations where table='table_name’ group by is_done -
да и оптимайз выдает:
Timeout exceeded while receiving data from server. Waited for 300 seconds, timeout is 300 seconds.
Cancelling query.
подключение clickhouse-client —receive_timeout=86400 не помогает -
-
-
спасибо, попробую, как-то не ожидал что устрою базе ддос, по http ничего не принимает )
-
такого ключа нет
-
-
-
-
-
да, execution_time
-
-
спасибо
-
а прогресс както можно мониторить?
-
-
-
-
-
-
спасиб
-
-
-
Настроить репликацию?
-
Data Replication | ClickHouse Documentation
Data Replication Replication is only supported for tables in the MergeTree family: ReplicatedMergeTree ReplicatedSumming
-
(можно сконвертировать существующий MergeTree в ReplicatedMergeTree)
-
-
Можно остановить КХ и сделать rsync, но репликация позволяет сделать то же самое без длительного downtime
-
(репликация данных не затрет существующие записи в новом КХ)
-
а если попробовать через INSERT INTO... SELECT * from remote()...?
-
Зависит от того, сколько у Вас данных. Если их много (скажем, больше 10 Гб), я бы не советовал, ибо этот запрос будет неатомарным
-
(а ещё он будет намного медленней чем что репликация, что ручной rsync)
-
В общем, если хотите самое простое и надежное решение, то переделайте свои MergeTree в ReplicatedMergeTree и ClickHouse всё сам смержит, даже не заметите
-
Если хотите геморроя, то пожалуйста, делайте rsync, INSERT INTO SELECT FROM remote(), используйте clickhouse-copier, и прочее
-
Данных не должно быть много, только за 6-7 число надо будет до залить
-
Просто версии КХ разные и структура таблиц старая на старом КХ
-
Если структура таблиц отличается, то их всегда можно привести к одному знаменателю, добавив недостающие колонки
-
Если так, то INSERT INTO SELECT может сработать, но я бы вставлял небольшими пачками (по ~1 млн строк) на всякий случай, чтобы точно INSERT был атомарным и также чтобы потребление памяти было под контролем
-
optimize вообще не имеет отношения к мутациям, и только мешает, вы себе в колено стреляете.
-
а что посоветуете чтобы просанировать ситуацию с кучей мелких мутаций?
-
alter table freeze
копируете из shadow на новый сервер rsync-м , там attach -
не делать мутаций вообще, это админский инструмент, чтобы решать проблемы типа gdpr
не делать мелкие, делать крупные мутации
смотреть в system.mutation / system.merges для понимания текущего состояния
ускорить мутации нельзя, точнее можно сделать больше одновременных мутаций, настроив больше background pool-в -
а если всё таки необходимость есть, можно ли както нормализовать работу таблицы? желательно без создания новой таблицы )
-
я не понимаю в чем сейчас проблема
-
были залиты десяток тысяч ALTER DELETE и наблюдаю длительное время что is_done в мутациях не растёт, а пользование таблицей практически стало нереальным
-
kill mutation where not is_done
отменить всЕ и больше не запускать это -
а в чем проблема, движок не сможет проглотить?
-
мутации банально если упростить перезаписывают всю таблицу без удаленных / или c измененной строками
-
понял засаду - спасибо
-
киллер тоже подвис )
-
есть варианты как ускорить процесс? KILL MUTATION WHERE NOT is_done ASYNC - висит уже больше 20 минут
-
переоценил возможности движка
-
знаю что оно не для этого
-
надо смотреть что в лог КХ чтобы понять что происходит
-
обычная таблица ? не replicated ?
-
реплицированная
-
скорее всего мержи блокируют . что в
select table, elapsed, progress, memory_usage from system.merges
долго там еще? -
──────elapsed─┬─progress─┬─memory_usage─┐
504.828588304 │ 0 │ 510681232 │
503.550474278 │ 0 │ 502397328 │
3.334264938 │ 0 │ 515521152 │
3.301880644 │ 0 │ 297412272 │ -
строки постоянно меняются - чтото шуршит
-
2 мержа -- 500 сек. 0% ?
-
да
-
уже 600
-
там еще столбик is_mutation / num_parts
-
┌───────elapsed─┬─progress─┬─memory_usage─┬─is_mutation─┬─num_parts─┐
│ 787.565333036 │ 0 │ 505484192 │ 1 │ 1 │
│ 786.287218977 │ 0 │ 514012464 │ 1 │ 1 │
└───────────────┴──────────┴──────────────┴─────────────┴───────────┘ -
а kill mutation уже отвалился? или еще виден в system.processes?
-
висит, таймаут там большой разрешил
-
┌────────elapsed─┬─query───────────────────────────────────────┐
│ 2363.074829663 │ kill mutation where not is_done │ -
таймаут это про ожидание клиента, отменить kill нельзя, поэтому он будет выполнятся пока не выполнится
-
ну т.е. скорее всего все зависло и если мутации progress 0% и не меняется кол-во parts_todo, то перегужать КХ (kill-9) и снова отменять kill mutation, и если kill не получится, чистить вручную в zk
-
Всем привет! Подскажите плиз, чистил базу, а вот папка system на диске меньше не стала, как ее аккуратно почистить?
-
куча старых каких-то партиций, я полагаю, я могу их безболезненно удалить?
-
там таблицы типа *_log , их можно truncate
еще есть таблицы в цифровым суффиксом *_log_1 _2 их можно дропать, это старые таблицы , до апргейда -
в базе system?
-
почистил part_log и query_log, спасибо большое)
-
Провел небольшой research. Есть немного истории про создание агрегатной функции retention, ну и про groupUniqArray. Прихожу к выводу, что придется хранить UserID как массив, ну и AggregateFunction(groupUniqArray, UInt64) на него, а дальше вся мощь Clickhouse для работы с массивами.
Математически uniqCombined - это HyperLogLog, поддерживающий только add,merge,count. Поэтому - никак.Add AggregateFunctionRetention by sundy-li · Pull Request #2887 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en This implements an AggregateFunction retention, which could be used for user retention rate analysis.
-
может кто нибудь обьяснить поведения пустой установки кликхауса не могу понять откуда столько демонов и что вообще происходит и делает клик. установка на centos 7 на ubuntu было такое же поведение
-
-
Может имеет смысл отключить показ потоков? Процессов намного меньше
-
а что вообще за потоки в таком количестве на пустой установке клика и как их ограничить? подскажете?
-
а зачем вам diff ? stat-ы можно складывать , вот тут длинный тред про что-то похожее https://groups.google.com/forum/#!searchin/clickhouse/$20uniqMerge%7Csort:date/clickhouse/BqE49KuJpw8/C_g5F-rwAAAJ
наверное можно допилить чтобы разница была -
это треды, это один процесс,
видимо сам что-то логирует внутри про себя, мержит свои логи -
так устроено, потоки бесплатные, откройте в винде таск менеджер, там у любого процесса по 300 потоков, это нормально
у mysql тоже потоки на экран не помещаются -
-
понял спасибо а если еще подскажите как ограничеть потребление оперативной памяти у клика max_server_memory_usage как я понимаю оперирует байтами (описание в какой размерности указывать число нет)
-
в теории конечно можно посчитать три числа.
юники первого сайта, юники второго сайта, юники (первый сайт + второй) и из этого получить некое число.(Но судить насколько это число будет отражать реальность не могу)
Типа такого
finalizeAggregation(uniqCombineState(site_1)) + finalizeAggregation(uniqCombineState(site_2)) + finalizeAggregation(uniqCombineMerge(uniqCombineState(site_1)+uniqCombineState(site_2))) -
Спасибо, почитаю. diff нужен мне, чтобы найти количество пользователей, исполнивших событие A и B, уже имея результат только uniqCombineMerge по A и отдельно по B.
-
байтами
-
Спасибо
-
так просто сложите (+) uniqCombineMerge(uniqCombineState+uniqCombineState)
-
а хотя нет, это не то
-
Всем доброй ночи, я только знакомлюсь с кликхаус, вопрос полагаю для вас будет не сложным, но меня ставит в тупик и поисковик мне помочь в этом не может. Возможно кто то сможет тут подсказать. Запускаю из консоли вот этот код http://skrinshoter.ru/s/060820/F8tb9SPK?a , в ответ вот это `Traceback (most recent call last):
File "test.py", line 30, in <module>
print(request())
File "test.py", line 27, in request
res.raise_for_status()
File "/usr/lib/python3/dist-packages/requests/models.py", line 935, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 500 Server Error: Internal Server Error for url:` -
ну да, скорее хочется что-то типа uniqIntersectMerge(uniqCombineStateA,uniqCombineStateB)
-
обычный запрос на выборку проходит, запрос на изменение и создание нет(
-
Какой тип запроса отправляешь GET или POST?
-
get
-
-
а есть под рукой ссылка на документацию как раз по api clickhouse?
-
сделате feature request , может это возможно ( я не знаю )
-
У кликхауса нет апи так такового, просто отправляешь нужный тебе sql запрос на эндпоинт
Но дока хорошая
https://clickhouse.tech/docs/en/interfaces/http/HTTP Interface | ClickHouse DocumentationHTTP Interface The HTTP interface lets you use ClickHouse on any platform from any programming language. We use it for w
-
а есть пример кода на python?
-
-
спасибо, погуглю
-
Joined.
- 07 August 2020 (101 messages)
-
Доброе утро, не могли бы подсказать по движку кафка: есть 10 серверов и топик с 72 партициями, сообщений порядка 300к,
Сообственно в логах :
2020.08.07 09:24:12.066836 [ 148446 ] {} <Trace> StorageKafka (log_in_parsed): Nothing to commit.
2020.08.07 09:24:12.066961 [ 148446 ] {} <Trace> StorageKafka (log_in_parsed): Nothing to commit.
2020.08.07 09:24:12.067025 [ 148446 ] {} <Trace> StorageKafka (log_in_parsed): Nothing to commit.
2020.08.07 09:24:12.067102 [ 148446 ] {} <Trace> StorageKafka (log_in_parsed): Nothing to commit.
2020.08.07 09:24:05.443652 [ 151217 ] {} <Trace> StorageKafka (log_in_parsed): Polled batch of 65536 messages. Offset position: [ log_in_parsed[54:6362691], log_in_parsed[55:6442633], log_in_parsed[56:6391740], log_in_parsed[57:6246779], log_in_parsed[58:6056912], log_in_parsed[59:6402441], log_in_parsed[60:5991525], log_in_parsed[61:6380870], log_in_parsed[62:6057811], log_in_parsed[63:5986540], log_in_parsed[64:5190593], log_in_parsed[65:6785423], log_in_parsed[66:3841620], log_in_parsed[67:3045223], log_in_parsed[68:3158228], log_in_parsed[69:2314162], log_in_parsed[70:3103955], log_in_parsed[71:3131679] ]
2020.08.07 09:24:10.975487 [ 148350 ] {} <Trace> StorageKafka (log_in_parsed): Re-joining claimed consumer after failure
2020.08.07 09:24:10.975668 [ 148350 ] {} <Trace> StorageKafka (log_in_parsed): Re-joining claimed consumer after failure
2020.08.07 09:24:10.975763 [ 148350 ] {} <Trace> StorageKafka (log_in_parsed): Re-joining claimed consumer after failure
2020.08.07 09:24:10.975864 [ 148350 ] {} <Trace> StorageKafka (log_in_parsed): Re-joining claimed consumer after failure
2020.08.07 09:24:10.990119 [ 148350 ] {} <Trace> StorageKafka (log_in_parsed): Re-joining claimed consumer after failure
2020.08.07 09:24:10.990385 [ 148350 ] {} <Trace> StorageKafka (log_in_parsed): Re-joining claimed consumer after failure
2020.08.07 09:24:11.024021 [ 148350 ] {} <Trace> StorageKafka (log_in_parsed): Re-joining claimed consumer after failure
2020.08.07 09:24:11.034370 [ 148350 ] {} <Trace> StorageKafka (log_in_parsed): Execution took 10792 ms.
2020.08.07 09:24:11.534515 [ 148446 ] {} <Debug> StorageKafka (log_in_parsed): Started streaming to 14 attached views
2020.08.07 09:24:11.548569 [ 23816 ] {} <Trace> StorageKafka (log_in_parsed): Already subscribed to topics: [ ]
2020.08.07 09:24:11.548588 [ 151283 ] {} <Trace> StorageKafka (log_in_parsed): Already subscribed to topics: [ ]
2020.08.07 09:24:11.548599 [ 150452 ] {} <Trace> StorageKafka (log_in_parsed): Already subscribed to topics: [ ]
Еще постоянные reballance происходят
В табличке прописаны:
kafka_num_consumers = 7, kafka_max_block_size = 524288
Версия 20.3.8
14 вьюх
Подскажите куда копать? -
-
Всем привет. Кто может подсказать по словарю mongodb. В коллекции есть два поля _id и name. В _id хранится int (NumberInt). Соответственно в настройках словаря указано:
<structure>
<key>
<attribute>
<name>_id</name>
<type>Int32</type>
</attribute>
</key>
<attribute>
<name>name</name>
<type>String</type>
<null_value></null_value>
</attribute>
</structure>
Но при выполнении запроса:
SELECT dictGetString('my_dict', 'name', tuple(toInt32(1)))
Возвращается пустой рез-т, хотя по этому _Id есть данные.
В логах ошибок нет, как и в таблице dictionaries.
Версия КХ: 18.14.18 -
-
Вот все сообщения, но они некритичны вроде:
Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Not found: user_files_path (version 19.14.9.12 (official build)
Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Not found: format_schema_path (version 19.14.9.12 (official build)
Include not found: clickhouse_compression -
Возможно ли в кликхаусе проверить сколько запрос использовал оперативной памяти?
-
да, например как-нибудь так
select event_time, formatReadableSize(memory_usage) mem_use_h, query
from system.query_log
where query like '%some_id%'
and event_date = today() -
Коллеги, подскажите как добавить время к RBAC т.е. выдавать права доступа к записям на определенное время?
-
Привет! Подскажите, пожалуйста, кто знает. В таблице есть поле-массив с 2 полями, arr.A и arr.B например. Нужно из выборки, где много строк взять количество уникальных A с условием по B. Если бы условия не было, то подошло бы uniqArray(arr.A), а как добавить фильтр типа B = 'smth' не могу разобраться. Вроде есть возможно соединения комбинаторов, т.е. uniqArrayIf, но в нём как раз написано, что "аргумент cond не должен быть массивом". При этом примеры uniqArrayIf вообще найти не получается.
-
If можно любое условие, например has(B, 'smth') ( это кстати что B = 'smth' массив B содержит 'smth')
[1,2,3,3,3] [44,55]
select uniqArrayIf(A, has(B,44)) from (select [1,2,3,3,3] A ,[44,55] B )
--
3
select uniqArrayIf(A, has(B,44)) from (select [1,2,3,3,3] A ,[66,55] B )
--
0 -
там в паралелль много потоков пишут, ошибка выше
-
-
Так тут немного другое дело, A и B это не тупо разные массивы, это поля в одном массиве (возможно не правильно называю что-то). У них одинаковая длина и мы ставим условие на конкретный элемент, а не на весь массив
-
словарь (содержимое) можно увидеть как таблицу через engine Dict, проверьте там вообще эти id нормальные или покореженные
-
-
там пусто
-
-
Если поправить те ворнинги, то КХ не пишет вообще ничего даже в режиме дебаг, порты так же не открывает
-
фильтруем массивы, из arrayFilter вылезают A если B >20
select arrayFilter( (x,y)-> y>20 ,A,B ) from (select [1,2,3,3,3] A ,[66,55,-1,13,24] B )
[1,2,3]
select uniqArray(arrayFilter( (x,y)-> y>20 ,A,B )) from (select [1,2,3,3,3] A ,[66,55,-1,13,24] B )
--
3 -
а я не понял, КХ стартует или нет?
-
-
-
ps -ef|grep click
-
Всем привет! Есть ли в CH функция, которая по урлу и рефереру определяет источник траффика? ( как Metrika::GetTrafficSource в YQL)
-
# ps -ef | grep click
clickho+ 1 0 0 11:17 pts/0 00:00:00 /usr/bin/clickhouse-server --config-file=/etc/clickhouse-server/config.xml
root 2902 2896 0 11:46 pts/28 00:00:00 grep --color=auto click -
-
-
т.е. докер? порты смаплены? -p 8123:8123 -p 9000:9000 ?
-
-
curl http://ip:8123
-
-
-
ну не смаплены порты
-
-
я не заметил сообщение
-
запустите еще один КХ внутри контейнера как обычный процесс и смотрите на stdout
clickhouse-server --config-file=/etc/clickhouse-server/config.xml -
# CLICKHOUSE_DO_NOT_CHOWN=1 clickhouse-server --config-file=/etc/clickhouse-server/config.xml
Include not found: clickhouse_compression
И висит после этого -
ну т.е. вообще не работает словарь
-
strace clickhouse-server --config-file=/etc/clickhouse-server/config.xml
-
Ну наверное да
-
Но ошибок никаких нет
-
-
ну
ls -l /var/lib/clickhouse/preprocessed_configs -
-
-
тоже висит в смысле?
-
-
ну значит оно, т.е. дело не в КХ, разбирайтесь с мапингом дисков в кубах или где вы там запускаете
-
-
с учётом того, что строк много и ещё агрегация есть, у меня вот так получилось:
arrayUniq(arrayFilter((a, b) -> b = 'smth', arrayFlatten(groupArray(arr.A)), arrayFlatten(groupArray(arr.B))))
это нельзя как-то лаконичнее записать? -
-
все можно, просто рассказываете с конца, залезли в . и пытаетесь выбраться, а тупо не надо было залезать туда
-
ну если вы про то, как изначально данные лежат, то тут действительно мало что можно сделать) то, что я описал это в принципе приведённые исходные данные задачи. есть строки, в них два массива одинаковой длины. надо сделать то-то, то-то. куда тут можно было не залезть? :)
-
-
что делает array join понимаете?
select x, uniqExact(A)
from (select 1 x, [1,2,3,3,3] Arr ,[66,55,-1,13,24] Brr )
array join Arr as A, Brr as B
where B > 20
group by x
┌─x─┬─uniqExact(A)─┐
│ 1 │ 3 │
└───┴──────────────┘ -
-
arrayFlatten(groupArray === groupArrayArray
-
в смысле это быстрее работает чем ваш вариант, потому что нет массивов и groupArray
-
-
-
-
в логах err.log
можно в MV делать такие преобразования чтобы ошибок не было -
т.е. есть функции toUInt32OrZero и так и для всего
-
Я вот на такую статью наткнулся, но не знаю где искать.
В JSON, TSV и подобных текстовых форматах можно анализировать все поля как строки, преобразуя их к соответствующим типам на уровне материализованного представления. Это позволяет ClickHouse помещать искаженные сообщения в отдельный поток со специальными виртуальными столбцами, такими как _error или _raw_message. -
-
что искать? там просто предлагается самому в MV проверять if / else и писать в свои столбцы _error
-
понял, спасибо за быстрый ответ
-
а вообще человек ссылается (написав рекламную статью и похоже не видя КХ вообще) на https://altinity.com/blog/clickhouse-kafka-engine-faq
There is a lot of room for improvement here. In particular, ClickHouse could put malformed messages in a separate stream with special virtual columns, like _error, and maybe _raw_message. A user then could attach a materialized view to filter them out or store separately.
т.е. это типа а вот если бы -
да, я подумал, что такой механизм реализован в самом КХ и не надо ничего выдумывать. Сложности перевода :(
-
Привет. Подскажите, что можно оптимизировать в config.xml, кроме <max_server_memory_usage_to_ram_ratio>, чтобы ClickHouse потреблял минимум памяти? Скажем, 512 MB или меньше. Складирую в ClickHouse данные пачками по несколько тысяч штук раз в секунду.
-
Может есть какие-то твики, уменьшающие производительность, но потребляющие меньше памяти?
-
Или экспериментальные фичи какие-то, отключенные по умолчанию?
-
нету, т.е. можно конечно помучатся и в 2 ГБ влезть. Но я бы не стал. Я бы сразу взял sqlite
-
для 2 GB нужно как-то специально тюнить? Я меня на 2 гигах более-менее стабильно все работало.
-
конечно нужно. Например есть дефолтный параметр mark_cache который со временем раздувает кеш марков до 5ГБ, ну мержи могут и гб скушать. И зависит от кол-ва столбцов, на 400 стролбцах инсерт 1 строки скушает 1GB
-
-
Switch JOIN algo on the fly by 4ertus2 · Pull Request #9082 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): New Feature Changelog entry (a user-readable short description of the cha...
-
у меня 10 столбцов
-
умел, join_algorithm=partial_merge
-
а что для этого нужно было делать, что-то в конфиге править?
-
-
да где угодно, ну в профиле можно вписать join_algorithm>auto</join_algorithm
-
вы проверьте сначала, а то на диске join 4 часа вместо 4 сек может работать
-
-
-
-
В общем случае КХ 19. не умеет partial_merge
-
-
в смысле 19х версий очень много
-
-
Добрый день. Можно ли выполнять optimize table на одной партиции?
-
Документация ClickHouse
Прочие виды запросов ATTACH CHECK TABLE DESCRIBE TABLE DETACH DROP EXISTS KILL OPTIMIZE RENAME SET SET ROLE TRUNCATE USE
-
-
сделал тест. отправлял одни и теже логи в clickhouse и в elasticsearch.
Размер таблицы в clickhouse занимает 857.19 МБ.
Размер тех же данных в индексе в Elasticsearch занимае 4,5ГБ.
Если в vector в параметрах не указывать в Clickhouse данные занимает в 4500/857.19 = 5.24 раза меньше чем в Elasticsearch.
При создании таблицы указывал:
ENGINE = MergeTree() PARTITION BY toYYYYMMDD(timestamp)
ORDER BY timestamp TTL timestamp + toIntervalMonth(1)
SETTINGS index_granularity = 8192;
Clickhouse еще больше сжимать может?
Могу в личку или здесь предоставить статью как я делал. -
ORDER BY timestamp выглядит подозрительным, ты делал какую нибудь нормализацию логов? раскидывал ли их по колонкам?
Какие указал кодеки для столбцов? -
Нет. Ничего такого.
-
сильно зависит от данных, кодеков, компрессии.
по хорошему elastic тоже сжимает по умолчанию lz4 (ну можно настроить на deflate и сожмет ещё сильнее). -
а, не увидел, тогда это нормально, если это одна текстовая колонка... можно попробовать увеличить
min_compress_block_size 65536
max_compress_block_size 1048576
но в целом ожидать чудес не стоит -
Zstd включен?
-
-
- 08 August 2020 (32 messages)
-
В конфигах и при создании таблицы про zstd ничего не было
-
значит у вас по дефолту идет, а по дефолту lz4. сделайте таблицу с zstd компрессией
-
compression incl="clickhouse_compression"> <case> <min_part_size>1000</min_part_size> <min_part_size_ratio>0.01</min_part_size_ratio> <method>zstd</method> </case> </compression>. Так подойдёт для сжатия логов ?
-
-
-
-
Joined.
-
Joined.
-
-
Joined.
-
У нас (в Яндекс.Облаке) можно параметры юзерам прописывать
-
это здорово, но вы наш прямой конкурент
-
Здравствуйте! Есть столбец дата. Но, есть необходимость в запросе группировать по часам. Стоит ли отдельный столбец Час в таблицу добавить? Или хватит возможностей GROUP BY toHour()?
-
-
От даты
-
-
-
А сама функция - получения часа от даты, и группировка по ней, не сильно оптимизировано?
-
Может и не надо столбца с часами?
-
Я тут нуб, поэтому плиз, по простому ответьте
-
-
Те можно не заводить столбец с часами?
-
GROUP BY toHour будет отлично работать
-
Спасибо!
-
ClickHouse/ClickHouse tagged: v20.3.16.165-lts
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v20.3.16.165-lts
Release notes:
v20.3.16.165-lts -
-
Подскажите пожалуйста, эта ошибка про нехватку оперативной памяти или памяти на диске?
Memory limit (total) exceeded: would use 956.23 MiB (attempt to allocate chunk of 4502760 bytes), maximum: 953.67 MiB
IN:INSERT INTO ... -
Оперативной
-
Просто у меня проблема такая:
Вставляю данные (около 50МБ) - проходит. На каком-то запросе получаю ошибку про нехватку памяти. Увеличил ограничение - сколько-то запросов прошло, снова эта же ошибка.
Как будто после каждого запроса памяти больше занято -
И я не пойму, то ли данные на диск не складываются и хранятся в оперативке, то ли это про нехватку места на диске
-
Сами запросы больше не становятся
-
Seesawing in MemoryTracking metric causing >20.3 to fail some writes and reads, unable to identify cause. · Issue #12583 · ClickHouse/ClickHouse
Summary After upgrading a host that is just a collection Distributed tables to 20.4.X and 20.5.2.7, we observe the new MemoryTracking setting increasing substantially during writes, leading to indi...
- 09 August 2020 (27 messages)
-
-
Спасибо, посмотрю
-
Joined.
-
Если вдруг кому понадобится, сам разобрался. Если в монге используется user и password то этот пользователь должен быть заведен именно в той БД к который вы пытаетесь подключится. Т.е. если БД словаря "db1" а authenticationDatabase - "admin". То подключения не будет. И что самое интересное нигде об этом не будет ошибки, запрос просто будет пустой. Логи пустые.
Было бы неплохо, если бы эту тонкость отразили в документации или в настройки подключения словаря добавят БД аутентификации. -
Joined.
-
-
875 способов, в смысле всегда динамический набор параметров и ничего общего? Это не про КХ, будет тормозить.
Но можно например сделать key array(String), value array(String), можно прямо json валить в к колонку String и парсить в селектах -
Спасибо! Парсинг в селектах быстро отработает?
-
нет конечно, примерно до 1000 раз медленнее чем просто колонка с числом.
берите монгу -
У монго одна точка входа
-
нет конечно, и вообще выбирать стор с оглядкой на такаю фигню, это какая-то жесть в кубе
-
Это один из моментов, который нужно учесть... Из задания - есть 10М+ DAU, каждый по 300 событий в сутки генерит, нужно эти данные передавать в Tableue, можно с агрегацией, но не реже раза в 15 минут
-
в общем КХ создан с идеей что все данные разложены по колонкам в готовом виде. КХ Работает быстро потому что в функцию передается указатель на готовый список значений. И с точки зрения КХ единственный православный вариант решения вашей задачи это раскладывание в 400-800 колонок.
-
Просто читал про историю CH и у меня задача похожая - сервис аналитики для моб. приложений. В яндекс метрике же есть кастомные ивенты... Получается, нужно мапить типизированные колонки на определенный параметр события, я правильно понимаю?
-
схема бд яндекс метрики не секрет https://clickhouse.tech/docs/en/getting-started/example-datasets/metrica/
там все разложено по колонкам, микроскопическая часть кастомных атрибутов лежит ParsedParams
CREATE TABLE datasets.hits_v1
...
ParsedParams Nested(Key1 String,Key2 String,Key3 String,Key4 String,Key5 String,ValueDouble Float64),
... -
Спасибо большое! Вы мне очень помогли.
-
У нас как есть кейс с еав, но у нас в 80% обращению по ключу, плюс в день данных мало (~400млн), нет sub-second критичности времени запросов.
ну и КХ потому что в другом продукте использовали КХ (т.е объективно - причины другие).
но КХ - настоящий "микроскоп". забить им можно вполне много вещей -
А у меня агрегация по кастомным параметрам в основном
-
Лучше не надо
-
Так вот и ищу решение... КХ мне понравился по многим параметрам, думал его применить... но похоже, к этой задаче не получится
-
Excel AddIn : In2Sql
Download Excel AddIn : In2Sql for free. ODBC Cloud SQL Explorer. Connection Manager. Query Editor. https://sourceforge.net/projects/in2sql Video for best usage https://rb.gy/tvl8lk This Excel Addin helps SQL analytic create an Excel report based on ODBC relational data. *Creates table base on data from a relational database *Generate a pivot report using the same external connection (1) *Some ad-hoc tools are available - like "keep only" and "remove only" *you can use the row limit option for exploring the largest dataset *The ODBC connection manager is available *auto-build query tool can create SQL select statement by using different database tables with matching them by column name * creating connections for PowerQuery news and updates -- change list -- v05 beta export tables and SQL to CSV files treat CSV like relational tables -- add Cloud ClickHouse Source resolve the problem with an untrusted source changed Sql Editor fixed behavior for "update rows"
-
о ! круто =)
-
ODBC драйвер clickhouse обязателен?
-
для Cloud подключения - нет
-
;) ок, а почему такой странный способ распостранения? sourceforge лет 5 уже не встречал там живых проектов =) вроде все на github выкладывают
-
Плагин хороший!
-
на гитхабе только код - мне кажется что SF проще для рекламы
https://github.com/er77/in2sql - 10 August 2020 (138 messages)
-
Joined.
-
-
Используем https://github.com/amacneil/dbmate , дописали туда поддержку кликхауса, работает.GitHub - amacneil/dbmate: A lightweight, framework-agnostic database migration tool.
:rocket: A lightweight, framework-agnostic database migration tool. - GitHub - amacneil/dbmate: A lightweight, framework-agnostic database migration tool.
-
-
используйте dictGet и ключевое слово SELECT ... FROM ... FINAL
https://clickhouse.tech/docs/en/sql-reference/statements/select/from/#select-from-final
https://clickhouse.tech/docs/en/sql-reference/functions/ext-dict-functions/#dictget
MySQL табличку в CREATE DICTIONARY ... SOURCE(MYSQL()) загоните если конечно там не десятки миллионов записейFROM | ClickHouse DocumentationFROM Clause The FROM clause specifies the source to read data from: Table Subquery Table function JOIN and ARRAY JOIN cl
-
благодарю, буду копать))
-
Мы используем https://github.com/golang-migrate/migrateGitHub - golang-migrate/migrate: Database migrations. CLI and Golang library.
Database migrations. CLI and Golang library. Contribute to golang-migrate/migrate development by creating an account on GitHub.
-
Joined.
-
Всем привет. Подскажите, пожалуйста:
- есть возможность запустить фильтрацию до CROSS JOIN?
- или запустить CROSS JOIN на подзапросах? -
подзапросы с фильтрацией?
да, можно на sub-query, но без сортировки в подзапросах...
иначе если сортировка есть, то в память все читаться будет... вместо стриминга -
Видимо, нарушил синтаксис, который не указан в документации:
SELECT *
FROM
(
(SELECT * FROM srs_dev.RecBuilts)
CROSS JOIN
(SELECT * FROM srs_dev.RecEvents)
)
GROUP BY BuiltAtDate
ORDER BY BuiltAtDate
Подскажите, в чём ошибся? -
скобки лишние IMHO
SELECT тут не может быть * если у вас group by есть... аггрегирующую функцию добавляйте
FROM
(SELECT ..) AS t1
CROSS ALL JOIN
(SELECT ...) AS t2
GROUP BY
ORDER BY -
ну и внутри (SELECT ... WHERE) ставьте
елси надо фильтрацию ДО JOIN
но вообще посокльку CROSS JOIN
это все со всеми
памяти может не хватить... -
сколько у вас строк в t1 и t2?
декартово произведение на выходе получается -
-
В t1 около миллиона на дату выйдет, в t2 ну раза в три-четыре больше. В память должно влезать
Спасибо за помощь - запрос заработал -
10^6 *10^6 ?
=) резиновая у вас память
сколько полей в таблице?
даж не знаю как оно у вас там заработало =)
скорее всего частично на диск CROSS JOIN что-то будет сбрасывать -
Ну на месяц запрос уже не влезет, конечно)
Полей 40 в первой таблице и 20 во второй, все String или Nullable(String) -
итого триллион записей в каждой 60 строк по 50-100 байт каждая ? примерно 90 гигабайт за день на этот запрос уйдет
я бы все таки поостерегся такое запускать =) но с другой стороны, пробуйте конечно =) clickhouse Для того и сделали чтобы и в хвост и в гриву... ;) -
Я уже точно не помню, там больше половины значений в столбцах - NULL. Может поэтому выходит 10GB на две недели
-
-
Все доброго дня. Кто знает? Есть ли в конф файле возможность поднять лимиь max result rows выше 5 тысяч?
-
https://clickhouse.tech/docs/en/operations/settings/query-complexity/#setting-max_result_rows
тут ничего не сказано что нельзя поднять и что ограничение 5000
SELECT ... SETTINGS max_result_rows=0
сделайте посмотрите сработает ли
запрос через clickhouse-client пробовли сделать?Restrictions on Query Complexity | ClickHouse DocumentationRestrictions on Query Complexity Restrictions on query complexity are part of the settings. They are used to provide saf
-
Joined.
-
Joined.
-
Добрый день!
Господа, у меня такой вопрос:
у меня минута/рная инсталяция на сервере, с незначительным количеством иопсов внутри амазона. Иопсы заканчиваются, когда clickhouse “схлопывает” файлы для таблиц Merge Tree.
Есть ли какя-то возможность сделать так, чтобы этих файлов было меньше, или чтобы он их схлопывал реже? -
да, вставляйте БОЛЬШИМИ БЛОКАМИ по 100 000 записей минимум
выбирайте правильный
PARTITION BY
чтобы в вставляемом блоке не было больше 100 paritiion -
А это как-то можно со стороны clickhouse настроить?
-
вы хотите не правильного и не понимаете как и зачем clickhouse делает merge
хотите вставлять мелкими вставками используйте Buffer
https://clickhouse.tech/docs/en/engines/table-engines/special/buffer/Buffer | ClickHouse DocumentationBuffer Table Engine Buffers the data to write in RAM, periodically flushing it to another table. During the read operati
-
Спасибо, сейчас ознакомлюсь.
-
но повторюсь , лучше переписать приложение
ну или можно что нибудь типа вот такой утилиты использовать
https://github.com/nikepan/clickhouse-bulkGitHub - nikepan/clickhouse-bulk: Collects many small inserts to ClickHouse and send in big insertsCollects many small inserts to ClickHouse and send in big inserts - GitHub - nikepan/clickhouse-bulk: Collects many small inserts to ClickHouse and send in big inserts
-
Там rsyslog, я ему буффера выкрутил, но, похоже что предложенный вами вариант может помочь
-
Привет, я новичок, можно как-то связать MongoDB и Clickhouse, и чем? GrahpQL, Kafka??
-
что значит связать?
что хотите сделать?
вам монга зачем?
сколько документов в коллекции уже?
индексы вторичные есть?
aggregation framework пробоали? -
-
https://bitbucket.org/clickhouse_pro/ga2clickhouse
это стриминг через плагин в analytics.js
это не выгрузка из API -
спасибо, может сможете подсказать, а real-time там можно настроить?
-
я ссылку привел
это realtime и есть
весь measurement протокол будет стримиться если правильно JS настроите -
спасибо большое)
-
если что-то не заработает, пишите в чат
это старый софт
щас у гугла могло поломаться API с measurement protocol -
хорошо, спасибо)
-
-
Всем привет!
Я для миграций использую GO migrate.
и хочу подключить engine для кафки.
Одно из полей для создании таблицы с кафкой это путь до нее.
Но мне прям очень не хочется хардкодить в миграции путь до кафки, кто как решает подобную задачу? -
вечер добрый.
появился вопрос: у меня запрос есть “select from select” и если этот запрос выполнить несколько раз подряд, то он отдает разное количество строк.
понятно что я записи не добавляю уже, количество строк у меня либо 653, либо 650, и так вот эти две цифры чередуются.
это так и должно быть, или от чего зависит? -
Если проксей и семплинга/рандома нет, то баг наверно.
-
-
две реплики и они разошлись?
запрос неидемпотентный? -- в это сложно поверить, я понимаю, но это возможно, из-за многопоточности -
реплики две, да.
-
ну select count() from прямо в MergeTree таблицу на каждой реплике
-
Joined.
-
-
Шедулер мержей раз в 5(?) сек. и на каждый инсерт анализирует все парты и решает надо мержить или нет. Решение принимается в зависимости от кол-ва, размеров партов, и текущей загрузки мержами инстанса. Управлять можно в том смысле что можно увеличить кол-во одновременных мержей увеличив пул, но в конечном счете вы не получите полностью смерженные до 1го парта партиции, потому что это бессмысленная трата ресурсов, с точки зрения алгоритма шедулера.
-
Благодарю)
-
вы не должны этого хотеть. шедулер нормально написан
вставляйте боьлшими пачками в меньшее кол-во партиций и все будет хорошо -
Проблема не в этом, данных заходят хорошо, проблем нет
-
если бы не завезли движки Replacing и Collapsing никто бы этого и не хотел
-
а зачем тогда вам управлять мержем?
-
хотелось узнать почему merge может не выполняться,
@den_crane ответил -
Привет всем, не подскажете, как можно автоматически через jdbc создавать таблицы с nullable значениями и соответственно записывать данные, просто через dataFrame.write.jdbc не получается, выдается ошибка, что найден null-value
-
то есть он не определяет колонку как nullable
-
К.О.:
вообще nullable в КХ это проблема, потому что они занимают место и замедляют запросы, и лучше не иметь nullable вообще
если вам фиолетово на такой тонкий момент, то надо создавать поля как Col Nullable(String), Col1 Nullable(Int8) -
я понимаю, но как это делать автоматически через dataframe.write.jdbc, а не создавать вручную таблицы
-
бог миловал, я не знаю что такое dataframe.write.jdbc и работаю в компании где за создание таблиц автоматически, сразу отрубают все пальцы на всех руках и ногах.
-
я пишу эту строчку для загрузки данных в КХ dataFrame.write.jdbc(url=chUrl, table=chTableName, mode='append',
properties=json.loads(chConfig)) -
я просто хотел для себя попробовать, но я понял Вас, спасибо большое за ответ
-
Привет!
Можно ли в ClickHouse создать динамический запрос, который будет считать count за последние 7 дней у всех таблиц с определенной схемы?
Например:
1) схеме analytics есть 3 таблицы.
Мониторинг показывает count по каждой из этих таблиц за последние 7 дней.
2) В схеме analytics появилась четвертая таблица.
Мониторинг учитывает новую таблицу и считает count за последние 7 дней.
Есть мысли реализовать это через питон и system.tables, но пока интересует реализация именно через CH) -
нельзя
-
спасибо!
-
правда можно нагенерить SQL запрос используя system.tables , но как узнать по какой колонке брать 7 дней?
-
а кстати у таблиц одинаковая структура? и похожие имена ?
-
-
Структура да, все даты называются тоже одинаково.
А каким образом можно сгенерировать SQL запрос?
Я думал использовать: arrayMap + groupArray(table_name) + использовать arrayStringConcat + UNION
Только на выходе будет строка с текстом запроса, а не сам запрос. -
если одинаковая структура тогда engine=Merge накрывает их всех и дальше используя виртуальное поле _table группируем
-
Благодарю за помощь
-
-
никогда не станут. С чего бы вдруг.
-
в replacing схлопнутся же?
-
в replacing могут схлопнутся, могут нет, но вы про MergeTree спросили.
-
да,спасибо
-
Joined.
-
-
Joined.
-
-
Joined.
-
вообще на любой запрос?
-
нет
только на большие и толстые -
-
Если проблема в том, что запросы долгие, то копать в сторону увеличения Timeout в DSN: https://github.com/ClickHouse/clickhouse-odbc#configurationGitHub - ClickHouse/clickhouse-odbc: ODBC driver for ClickHouse
ODBC driver for ClickHouse. Contribute to ClickHouse/clickhouse-odbc development by creating an account on GitHub.
-
-
Можно попробовать https://cloud.yandex.ru/services/datalens ;)
-
пробовал через ODBC Manager поставть timeout — но при большом таймауте некоторые запросы, которые по идее должны были бы с ошибкой упасть — крутятся вечность и весь табло зависает
-
хм, и почему я детально не рассмотрел эту таблицу, перед тем как писать вопрос?)
спасибо ) -
в cli receive_timeout = 300
в odbc видимо Timeout 30 Connection timeout -
Всем привет! Уже второй раз кликхаус становится раком из-за простого alter modify ttl на реплицируемой таблице. Обновились с 20.1 до 20.5 и это всё началось. Сначала подумал что понял в чем проблема (materialize_ttl_after_modify), будто кх идёт чистить старые парты, но нет. Даже посли чистки он не возобновляет работу. Лечится только рестартом, а после, в зукипере происходят проблемы с рассинхроном мета данных. В конечном итоге на одной ноде один ttl, а на другой - другой. И при попытке сделать снова alter получаю отлуп DB::Exception: Metadata on replica is not up to date with common metadata in Zookeeper. Cannot alter.
Подскажите пожалуйста кто нибудь в чём дело и как теперь можно "безопасно" делать modify ttl? -
Попробую поиграться. Спасибо
-
раком? не заканчивается alter modify ttl и потом ломаются инсерты или что ?
-
Ага, alter не останавливается, вставка проходит раз через раз, селекты вообще не проходят
-
Я по моему нашел очень похожее issue на эту тему https://github.com/ClickHouse/ClickHouse/issues/10177DB::Exception: Existing table metadata in ZooKeeper differs in TTL · Issue #10177 · ClickHouse/ClickHouse
Describe the bug Performed the update from version 20.1.2.4 to 20.3.5.21, after restart clickhouse does not start. Tried to upgrade to 20.1.6.30 or 20.1.9.54 versions, clickhouse also does not star...
-
там про раком ни слова
-
а у меня чуть более чем полностью) Потом начинаются проблемы с репликацией на /replicas_status. Но со временем восстанавливается
-
не воспроизводится зависание, есть какая-то хитрость видимо
-
https://gist.github.com/den-crane/008b9be1ce88bd0e0912a9a7d2933f29
может в момент alter идет мерж и alter зависает на очень долго, ожидая мержа? -
Кто то в комментах отписал о том, что он обновился на новую версию и версии ttl отличаются от прежних и это возможно привело к проблеме
-
Какой мог быть "старый" (20.1) синтаксис alter ttl? И какой новый сейчас (20.5)? toIntervalDay() который у меня сейчас вроде был и есть без изменений
-
Joined.
-
Коллеги, приветствую! Пожалуйста, подскажите какие ресурсы для кликхауса нужны чтобы отправлять в него 2,5-3Тб логов в сутки?
-
А в какой форме то логи, денормализованы?
Сколько собираетесь хранить? -
Очень хороший вопрос. Пока только в голове)
Предполагается, что под каждый тип приложения будет отдельная таблица. Грубо, 20 типов приложений = 20 таблиц. Но это не точно. -
В зависимости от данных они могут сжиматься хоть в 10-20 раз а могут и гораздо хуже, лучший способ проверить это получить объем для одной партиции и посмотреть как они сожмутся.
-
Кстати ещё вопросец, что можно сделать при залипших репликациях? В логах очень много
Code: 86, e.displayText() = DB::Exception: Received error from remote server ?endpoint=DataPartsExchange%3A%2Fclickhouse%2Fcluster_1%2Ftables%2F0%2Ftcb%2Fuser_events_local%2Freplicas%2Fch2&part=20200721_749_749_0&client_protocol_version=2&compress=false. HTTP status code: 500 Internal Server Error, body: Code: 232, e.displayText() = DB::Exception: No part 20200721_749_749_0 in table, Stack trace (when copying this message, always include the lines below): -
это про старый синтаксис создания таблиц, устаревший 3 года назад. К ним вообще не применим TTL, но alter по ошибке срабатывал на них.
-
-
если селекты не делать, то что угодно, тупо записать 3 TB на диск в сутки не проблема.
-
удалять из зукипера
-
А что вы делаете с таким объемом логов потом? Как используете эти данные?
-
Ого. Если это единственный способ, то чтож... таков путь)
-
Спасибо, буду копать дальше. Или ломать) Как пойдёт
-
вы слишком размыто описываете проблему
https://github.com/ClickHouse/ClickHouse/issues/10368
можно detach partition / attach partition , но реплики перекачают полностью данныеSome merges may stuck · Issue #10368 · ClickHouse/ClickHouseThis bug is discovered on Yandex.Metrica servers. If there is assigned merge but some parts in between of the range of parts to merge get lost on all replicas, the merge cannot proceed and the foll...
-
просто писать 100Мб в секунду это не проблема, хоть в один сервер, если вы синкаете реплику например, то и быстрее можно.
-
Это в теории может помочь, попробую детач атач
-
это не в теории, это фактически пересоздание всей таблицы (партиции)
-
В основном планируется хранить, чтение очень редкое. То есть планируется использовать в качестве колд-хранилища логов, для хот - эластик.
-
Добрый вечер! Стоит выбор ОС для КХ. Дебиан или убунта. Есть ли причины выбрать что-то конкретное?
-
без разницы. У КХ один и тот же бинарник собранный статически.
Что вам удобнее админить -
разницы с точки зрения CH нет, это статический бинарник без зависимостей...
разница есть только если вы понимаете разницу между ядром убунты и ядром дебиан и умеете тюнить -
RHEL =)
-
Помогло, grazie!
-
у вас на репликах в папке detached куча партов теперь, их вам надо удалить
-
attach кусками обратно не поможет? И теперь понять бы это нормальные данные, или действительно мусор который можно безопасно удалить?
-
ох
у вас была таблица X и там были парты A1 B1 C1 на всех репликах
вы сделали детач, парты A1 B1 C1 попали в папку detached
на одной из реплик вы сделали attach парты присоединились и переименовались в A2 B2 C2
другие реплики скачали A2 B2 C2
у этих других реплик остались в папке detached A1 B1 C1
если вы сделаете attach для A1 B1 C1 , они присоединятся переименуются и все удвоится, утроится, учетверится
в папке detached куча партов теперь, их вам надо удалить -
Понял понял)
-
мы флайвей используем собранный года полтора назад из какого то пулл реквеста
-
О, мы тоже собираемся это сделать. Спасибо
-
можно собрать и опубликовать как артифакт в ваш личный нексус, например
-
Joined.
-
Ребят, подскажите легкий драйвер Кликхауза для Питона 2.7. Мне нужно добавить в существующий код с gevent лупом кусочек для отправки колонок в КХ, да так чтоб не блокировало основной тред вебворкера, либо делало это после отдачи ответа клиенту.
Какой протокол КХ для этого лучше подойдет - нативный или хттп? -
-
HTTP Interface | ClickHouse Documentation
HTTP Interface The HTTP interface lets you use ClickHouse on any platform from any programming language. We use it for w
- 11 August 2020 (97 messages)
-
Joined.
-
подскажите, пожалуйста, по полю elapsed из табилцы system.processes, оно вроде показывает секунды с начала обработки запросов, как и почему оно может превышать таймаут?
-
timeout на клиенте задается
на сервере есть вот такое
https://clickhouse.tech/docs/en/operations/settings/query-complexity/#max-execution-timeRestrictions on Query Complexity | ClickHouse DocumentationRestrictions on Query Complexity Restrictions on query complexity are part of the settings. They are used to provide saf
-
я правильно понял, что по умолчанию на сервере нет ограничений на время выполнения?
-
кто подключался к mongo через odbc ? подключение напрямую делается или надо поднять промежуточную службу MongoDB Connector for BI Components?
-
да все верно
когда отваливается клиент, это просто отваливается клиент
выполнение запроса на сервере продолжается
KILL QUERY ... SYNC вам в помощь, но оно тоже не делает на самом деле KILL. там просто флаг выставляется который в query thread весьма не часто проверяется после чего происходит остановка выполнения запроса
и даже для max_exectution_time есть исключение
At this time, it is not checked for one of the sorting stages, or when merging and finalizing aggregate functions. -
понял, спасибо
-
Привет, есть ли возможность из колонки типа datetime64(таймштамп с точностью до наносекунды) вернуть значение в наносекундах, что то вроде функции toUnixTimestamp()
-
-
умножить на 10^9 и округлить до целого не подойдёт?
-
-
Type Conversion | ClickHouse Documentation
Type Conversion Functions Common Issues of Numeric Conversions When you convert a value from one to another data type, y
-
toUnixTimestamp64Micro(datetim64)
toUnixTimestamp64Milli(datetim64) -
спасибо
-
пожалуйста
только насколько я помню, это работает на более новых версиях КХ -
Joined.
-
Всем привет. Поделитесь бестпрактисами по перевозу кх с бареметела в докер. Запилил образ с той же версией, планирую просто смонтировать /etc/clickhouse-server и /var/lib/clickhouse в контейнер. Стоит ждать каких-либо проблем?
-
Ещё раз добрый день. Исследовал проблему, и пришёл к выводу, что alter modify ttl ничего не сломает, если не менять колонку, над которой висит ttl.
То бишь ранее у нас было прописано в create table такое: TTL eventDateTime + toIntervalDay(25). Так вот, чтобы ничего не залипло и прошло хорошо, нужно было оставить eventDateTime колонку, а я поменял на TTL eventDate + toIntervalDay(23). Возможно дело совсем не в это, но на остальных восьми нодах всё прошло успешно, поэтому я и пришёл к такому выводу -
О, спасибо, надо обновить кх
-
всем привет. вопрос: есть несколько шардов, хочу создать распределенную таблицу на движке Distributed на основе таблицы, которая есть на каждом шарде. где нужно создать эту распределенную таблицу? достаточно на одном любом шарде (догадка), или нужно на каждом создавать?
-
Смотря где делаете селект. Если селект на одной ноде всегда, то достаточно только на ней. А если селекты на разных нодах делаются постоянно, то на всех
-
понятно, спасибо
-
блин... тогда странная проблема:
создание distributed-таблицы на каждом шарде падает с ошибкой выделения памяти.
Allocator: Cannot mmap 128.00 MiB., errno: 12, strerror: Cannot allocate memory.
при перезапуске скрипта все создается.
на следующем шарде снова ошибка, при перезапуске снова создается -
может, это связано с тем, что перед distributed-таблицей в скрипте создаются другие сущности, а при втором запуске уже не создаются, т.к. уже существуют (там IF NOT EXISTS)? может такое быть?
-
Добрый день, коллеги! Столкнулся с данной проблемой, когда обновил версию кликхауза. В последнем сообщении писали, что ошибка вызвана старым синтаксисом при создании таблицы и что нужно пересоздать таблицы заново с новым синтаксисом. Но я вот смотрю на код создания таблиц и не понимаю, где тут старый синтаксис. Может кто-нибудь понимает, что надо поменять? Ну или хотя бы доку, где написано что поменялось.
Таблица:
CREATE TABLE table.table (`dt` Date, ts DateTime, cpeid Nullable(String), hardwareversion Nullable(String), softwareversion Nullable(String), vendor Nullable(String), model Nullable(String), url Nullable(String), name Nullable(String), type Nullable(String), district Nullable(String), data Nullable(String), stat Nullable(String), house Nullable(String), corpus Nullable(String), cpu_info Nullable(String), abon_type Nullable(String), tar Nullable(String), speed Nullable(Float32)) ENGINE = ReplicatedMergeTree(\'/clickhouse/{shard}/tables/table\’, \'{replica}\') PARTITION BY dt ORDER BY ts SETTINGS index_granularity = 8192 -
в этом примере синтаксис уже новый, TTL должен работать (по идее)
-
-
-
-
ATTACH TABLE report_dl
(
dt Date,
ts DateTime,
cpeid Nullable(String),
hard Nullable(String),
soft Nullable(String),
vendor Nullable(String),
model Nullable(String),
mac Nullable(String),
login Nullable(String),
type Nullable(String),
name Nullable(String),
city Nullable(String),
street Nullable(String),
number Nullable(String),
corpus Nullable(String),
apart Nullable(String),
abon Nullable(String),
tar Nullable(String),
speed Nullable(Float32)
)
ENGINE = ReplicatedMergeTree('/clickhouse/{shard}/tables/table’, '{replica}')
PARTITION BY dt
ORDER BY ts
SETTINGS index_granularity = 8192 -
-
-
Первичный -- суффикс ключа сортировки, держится в памяти. Стоит ставить отличным от OK, если много памяти на первичный индекс уходит
-
Как посмотреть метаданные из ZK?
-
либо запросом в system.zookeeper с заданным path, либо любым клиентом для ZK (хотя бы тем же zkCli)
-
Сейчас посмотрю, спасибо
-
select * from system.zookeeper where path = '/clickhouse/0/tables/table/metadata';
Там пусто -
Если я дропну таблицы, то данные из зоокипера тоже удалятся? Есть смысл менять версию и пересоздать таблицы? Мне кажется, что если пересоздать, то все должно заработать.
-
уберите последний путь metadata, по идеи должно показать
-
в основном это сделано чтобы иметь возможность добавлять измерения в summingMT (но работает для всех движков) плюс возможность иметь короткий индекс при длинном списке измерений
-
Joined.
-
вам кажется.
Вы бы просто в sql файле дописали нужный TTL и все -
Все привет! Подскажите пожалуйста, получаю ошибку типа: Element of set in IN, VALUES or LIMIT is not a constant expression (result column not found): concat('XYZ', __subquery_XXXX_XXXX, 'ABC')" запрос типа селект в селекте с вычислением на лету значения
-
как обычно фиксят подобные баги? на стандартном MySQL уверен бы такой проблемы не появилось.
-
-
__subquery_XXXX_XXXX — это в моем запросе подстрока типа (select 'abc')
-
в КХ вроде нельзя создавать временные таблицы
-
очень специфично. Диск нужен для мержей и мутаций, если у вас макс. размер партов 100ГБ, то я думаю гигов 500 свободно надо иметь
-
-
то есть примерно Х5 от максимального размера партиции?
-
КХ создает временные (temporary) таблицы сам, например для global
__subquery_XXXX_XXXX -- это не temporary -
нет, КХ резервирует 2*размер слияемых, но вдруг у вас несколько мержей должно бежать, я ХЗ.
-
я заметил такую вещь, если у меня в запросе вместо (select '123') будет, например, version(), то всё ок, а если (select version()), то та ошибка
-
и вот мне обязательно нужно воткнуть этот select. собственно вопрос как забайпасить, чтобы иметь возможность вытянуть данные (:
-
select materialize(version())
в смысле это известный баг, что есть константы внутри инстанса ( типа version(), timezone() ), и это стреляет при Distributed, потому что константы становятся не константами внезапно. -
функция materialize создает колонку из констант (из чего угодно).
-
спасибо. сейчас попробовал так
select materialize(version())
- ошибка повторилась. Затем сделал так:
materialize(version())
- ошибка, потом сделал:
version() -
запрос прошел
-
ниче не понял
-
?
-
Existing table metadata in ZooKeeper differs in TTL.
Stored in ZooKeeper: dt + toIntervalDay(100), local: : Cannot attach table table.
table from metadata file /var/lib/clickhouse/metadata/table/table.sql
в ZK dt + toIntervalDay(100
в /var/lib/clickhouse/metadata/table/table.sql TTL нету
берете любимый текстовый редактор и дописываете в /var/lib/clickhouse/metadata/table/table.sql TTL dt + toIntervalDay(100) -
Joined.
-
всем привет!
вопрос как раз по TTL, объясните, плиз, как он работает?
берет данные, у которых подошло время, копирует их(то есть делает х2), делает апдейт и вставляет обратно?
или же это работает по-другому? -
делает специфический мерж. Мержит парт в новый парт но без протухших записей.
на самом деле TTL умеет и дропать партиции целиком, без мержа -
а в плане ресурсов чем отличается от обычного мерджа? проц, диск, оператива
-
ничем
-
спасибо!
еще небольшой вопрос, у нас кх 19.17.4.11, были ли какие-то критические исправления TTL за этот год? с ходу не нашел -
-
-
не поможет. optimize final последовательно перебирает / мержит партиции
-
Спасибо
-
Joined.
-
Привет!
Есть кластер с distributed таблицами. Когда у пользователя default пароль не выставлен всё хорошо работает. И вставка и выборка. Если выставить пароль для пользователя default. Перестаёт. code 256. Authentication failed. Такое ощущение что он пытается зайти на состояние ноды с пустым паролем. Как победить? -
я бы попробовал сначала дописать в .sql файл нужные настройки TTL, чтобы было так же, как и в ZK. Если не сработает - можно руками удалить из ZK нужную строку с TTL (что крайне не рекомендуется разработчиками, грязный хак и вообще. Но мне это помогло). Ну а если есть вариант безболезненно пересоздать таблицу - то лучше так и сделать
-
Я дописал в metadata и все заработало
-
-
-
тогда возможно баг при создании таблицы с TTL/добавление TTL к существующей
-
-
чуть менее грязный, чем руками лезть в зукипер
-
значит, в новой версии починили уже. В старых версиях с TTL было много багов. У меня 20.5, пока без проблем
-
Похоже на то
-
-
Подскажите пожалуйста как можно редактировать данные в зк? Через zkCli или как то иначе?
-
я использовал первое, что нашлось в гугле: https://github.com/zzhang5/zooinspectorGitHub - zzhang5/zooinspector: An improved zookeeper inspector
An improved zookeeper inspector. Contribute to zzhang5/zooinspector development by creating an account on GitHub.
-
коллега говорит, что несколько optimize partition final позволят достич бОльшей параллельности
-
👍
-
да, они параллельно работают. А optimize table xxx final , перебирает партиции и делает им partition final по очереди
-
надо бы feature request завести)
-
в remote_servet в описание кластера надо пароль добавлять, иначе инстансы КХ ломятся в другие инстансы с пустым паролем
-
-
кто пробовал из КХ подключиться к Mongo?
настроил ODBC . через iusql подключаюсь нормально. когда в КХ выполняю запрос:
SELECT * FROM odbc('DSN=Mongo','pg_test','counter')
ловлю ошибку
Code: 86, e.displayText() = DB::Exception: Received error from remote server /columns_info?connection_string=DSN%3DMongo&schema=pg_test&table=counter&external_table_functions_use_nulls=true. HTTP status code: 500 Internal Server Error, body: Error getting columns from ODBC 'Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Connection attempt failed: Connection:Not applicable
Server:Not applicable
===========================
ODBC Diagnostic record #1:
===========================
SQLSTATE = 08S01
Native Error Code = 2002
[MySQL][ODBC 1.4(w) Driver]Can't connect to local MySQL server through socket '/tmp/mysql.sock' (13)
(version 20.5.3.27 (official build))'
(version 20.5.3.27 (official build)) -
Успеют ли в этом году зарилизить оконные функции
-
я не видел пул реквестов, а что кто-то что-то делал?
-
@clickhouse_developers
-
Вроде обещали в ближайшее время
-
Юзай массивы
- 12 August 2020 (143 messages)
-
Кто-нибудь сталкивался с залипанием запросов? Некоторые запросы выполняются бесконечно (хотя в другой момент времени те же самые запросы проходят успешно), несмотря на то, что у пользователя установлен max_execution_time в 30 секунд, при этом KILL QUERY так же залипает
-
Joined.
-
Добрый день. Вопрос про обновления. Мои сервера сейчас на 19.16.13.54 я хочу обновится на самую новую версию КХ, в случае если что-то не устроит, смогу ли я откатиться назад? Смогу ли я это сделать безболезненно?
-
Привет. Можно ли как-то посмотреть размер конкретной колонки на диске?
-
Joined.
-
Ребята привет
подскажите есть ли какая-то документация к clickhouse obfuscator кроме статьи ?
https://habr.com/ru/company/yandex/blog/457354/
подскажите пожалуйста как его установить проще всего ? весь кликхаус из пакетов установить ?
какие форматы он поддерживает крмое TSV ?Обфускация данных для тестов производительностиПользователи ClickHouse знают, что его главное преимущество — высокая скорость обработки аналитических запросов. Но как мы можем выдвигать такие утверждения? Это должно подтверждаться тестами...
-
Привет всем! Подскажите пожалуйста, кто знает. Вопрос по типу DateTime при создании таблицы. в документации про это пишут так "Часовой пояс для столбца типа DateTime можно в явном виде установить при создании таблицы. Если часовой пояс не установлен, то ClickHouse использует значение параметра timezone, установленное в конфигурации сервера или в настройках операционной системы на момент запуска сервера." Вот только у меня почему то CH не использует ни значение timezone ни из конфигурации сервера и приходится задавать вручную. Кто нибудь сталкивался?
-
Что выводит
SELECT timezone()? -
Europe/Moscow
-
-
Если это не то что у Вас в конфиге, гляньте тут
https://github.com/ClickHouse/ClickHouse/issues/4658
Схожая с Вашей ситуацией историяDefault timezone regression · Issue #4658 · ClickHouse/ClickHouseAfter I upgraded to last master today (from an old version from sept 2018) I see at least on OSX that even if in config.xml I have <timezone>UTC</timezone> the server is...
-
т.е.у меня вот такая вещь выходит, запрос вида "
select
toString(create_date),
toString(create_date, 'Etc/GMT'),
toString(сreate_date, 'Europe/Moscow'),
create_date from some_table where id = 1234567;" возвращает: '2020-08-01 15:38:19, 2020-08-01 12:38:19, 2020-08-01 15:38:19, 2020-08-01 12:38:19
' -
Ну так у Вас таймзона по умолчанию Europe/Moscow, вот и получаете toString(create_date) = toString(сreate_date, 'Europe/Moscow')
-
Привет!
Правильно ли я понимаю, что bloom_filter будет ускорять
LIKE '%cat%'?
https://github.com/ClickHouse/ClickHouse/pull/4499Bloom filter indices by nikvas0 · Pull Request #4499 · ClickHouse/ClickHouseI 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): A new type of data skipping in...
-
Посмотри system.columns
-
Уже нашел, спасибо
-
Нужен совет. Есть справочники. Обновления поставляются в виде cvs.
Можно грохать и пересоздавать, но некрасиво как-то.
Нужен аналог update or insert.
Либо промежуточная таблица и insert as select с условием на несовпадения с тем что есть... -
Подскажите, не глупость ли: сделать маленькую табличку с размером партиции на два часа и две партиции максимум (потом дропать) для частых опросов, а из неё через MV в "большую" таблицу для аналитики и длинных выборок? Это будет работать?
-
Или, может, лучше наоборот? Вставку в большую с копированием через MV в маленькую и ротировать её?
-
спасибо, это понятно. неясно почему при SELECT timezone() Europe/Moscow, функция toString(dateTime) без указания таймзоны накидывает к значению +3 часа, а также функция toDate() если хочешь получить дату из даты_время тоже накидывает +3 часа. приходится делать так toDate(value, 'etc/GMT'). это баг или фича?)
-
да, bloom_filter работает с like
https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/mergetree/#functions-supportMergeTree | ClickHouse DocumentationMergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
-
Спасибо, я кажется разобрался уже)
-
У Вас стоит таймзона по умолчанию Europe/Moscow (+3 от UTC), всё время которое Вы используете в проекте Clickhouse приводит к этой таймзоне, если Вы не укажите таймзону непосредственно в функции.
Я пока не совсем понимаю, что у Вас не правильно работает и как должно быть. -
Если Вам надо без таймзоны, поставьте UTC и будет Вам радость
-
Спасибо!
-
Можно так. И без разницы кто кому mv.
Можно и в большой табличке сделать в индексе час toHour() тогда маленькая не нужна. -
Мы используем replacingMT + https://gist.github.com/den-crane/fb1108e4843250a71bac7528a79700c2Clickhouse fast not exists
Clickhouse fast not exists . GitHub Gist: instantly share code, notes, and snippets.
-
Сделать view в mssql в которм select from sp
-
Какая версия кх? И как Примерно выглядит запрос?
-
а если помимо новых записей есть записи которые изменились?
-
банально флаг удаленности стал true
-
Откатися сможете если не будете создавать новые таблицы и не будете alter старые
-
то есть есть новые записи мправочника и некоторые старые переведены в пассив
-
А если буду, уже не смогу?
-
всем добрый день. полный лог 300мб такой ошибки: https://pastebin.com/7eFmE4fd
потом КХ упал. Зукипер в порядке, насколько я вижу. что это может быть?2020.08.12 13:48:26.600289 [ 44 ] {} <Error> DDLWorker: ZooKeeper error: Code: 9 - Pastebin.comPastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
-
Версия 19.14, запрос:
SELECT 0 as id, toDateTime(ts, 'UTC') as ts, latitude, longitude, accuracy, source, course, altitude, speed, activityType
FROM history
WHERE dt >= :start AND dt <= :end AND ts > :timeStart AND ts < :timeEnd AND user = :user
ORDER BY ts ASC
FORMAT JSON
В тп яндекса ответили уже, что это дедлоки и решаются они обновлением кликхауса -
left join и проверять каждое поле
-
спасибо! А вариант делать новую полную таблицу рядом, а затем дроп и переименование?
-
Ну или просто всегда тупо вставлять все в replacingMT
-
Спасибо! Буду тестировать.
-
можно сначала переименовать одним запросом,ьпотом дроп
Rename a to b, b to a -
не совсем понял, есть описание такой конструкции?
-
пардон, понял! Сначала прочитал как дроп и ренейм вместе
-
тогда самый быстрый вариант, вероятно, будет insert в B, Rename B to A, A to B, и Alter Table B delete While 1. И далее крутить эту карусель в нужном периоде.
-
на бронепоезде? могу повторить: Откатится сможете если не будете создавать новые таблицы и не будете alter старые
ну таблцы с логами системными в system надо будет удалить при откате в любом случае -
в ЗК такой путь есть?
Coordination::Exception: No node, path: /clickhouse/task_queue/ddl -
угу,
[zk: localhost:2181(CONNECTED) 2] ls /clickhouse/task_queue
[ddl] -
CH точно в тот зукипер ходит?
в конфиге КХ в zookeepeer секции есть атрибут root ?
А что точно произошло, работал работал КХ, а потом начал писать такую ошибку? Или сразу не поднялся? -
Joined.
-
Товарищи, подскажите пожалуйста как построить запрос что бы он возвращал числа округленные до 2 знаков после запятой, и целые числа тоже, т.е. "1" выводил как "1.00"
-
-
ну никак, нету функций форматирования
жалкое подобие:
select toString(cast(1, 'Decimal128(2)'))
--
1.00 -
делали alter table, потом через какое-то время КХ упал
-
-
т.е. сейчас все работает
-
после рестарта да. обновил до кучи, там старьё было
-
-
>обновил до кучи
вот это стальные яйца, я смену версии КХ тестирую 6 месяцев, потом заявку апрув на апгрейд пишу, с описанием как тестрировали процедуру наката и отката. -
https://github.com/ClickHouse/ClickHouse/issues/9153
надо было этот баг обойтиOut of bound in ColumnVector error · Issue #9153 · ClickHouse/ClickHousequery : SELECT event_dt, mode, countDistinct(user_id) AS measure FROM events WHERE (events.event_dt = 20200216) AND (events.client_id = 1) AND (events.event_id = 4) AND ((toInt32OrNull(events.event...
-
-
одним не работает RENAME TABLE data TO datab, datab TO data
Received exception from server (version 20.5.4):
Code: 57. DB::Exception: Received from 89.208.209.197:9000. DB::Exception: Table default.datab already exists.. -
-
Коллеги, у кого-нибудь был опыт интегрирования кх с реббитом, запросы уходят в timeout при попытке создать RabbitMQ ENGINE с
rabbitmq_num_consumers большим чем 1 -
красота, сломали значит в 20х
-
в 20.6 работает
-
Ребят, че-т я так и не понял - задачу, вроде закрыли, а всё равно ничего не работает. Из гита никто не реагирует
Че-т не понимаю, что нужно сделать, чтобы получилось расширить Enum8 для партиционируемого поля...
Можете кто-нибудь прокомментировать?
https://github.com/ClickHouse/ClickHouse/issues/7513Changes of Enum in partition key don't work · Issue #7513 · ClickHouse/ClickHouseFrom #2667. thanks @develar CREATE TABLE report ( `product` Enum8('IU' = 1, 'WS' = 2), `machine` String, `branch` String, `build_c1` String, `build_c2` String, `buil...
-
в 20.7 нет
причем я недавно совсем тестировал -
А у тебя какая версия КХ то?
-
20.5.3.27
-
в 20.7 работает
-
правда? Вот прям мамой клянусь? )
-
https://github.com/ClickHouse/ClickHouse/commit/718262e7ce3b3979ef11e8a2cdc27125d0be6c75
Ну судя по коммиту, должно работать в твоей версииMerge pull request #11973 from ClickHouse/alter-enum-partition-key · ClickHouse/ClickHouse@718262eAllow to perform "metadata-only" ALTER of partition key.
-
-
Значит, надо обновляться...
-
😁
-
Баг завести?
-
да, я поискал и не нашел такого, странно. Может вообще убрали специально.
-
20.5.4 revision 54435
-
а вы как кстати проверяете? вот так работает ? rename table X to Y_old, Y to X, Y_old to Y;
-
вот так работает rename table data to data_old, datab to data;
-
ну и третье тоже пройдет
-
-
а ну так и должно быть, так и было, я перепутал значит.
-
👍
-
я тоже подумал что странно без промежуточной :)) но вдруг!
-
а я помню что в вертике взрыв мозга типа ALTER TABLE x, x_new, t RENAME TO t, x, x_old; а в КХ было попроще
-
Коллеги, подскажите, плз, как можно удалить первый элемент массива, равный определённому значению?
Пробовал arrayMap(i-> i<>X, arr), но это для удалениях всех вхождений -
пример покажите данных входного и выходного, arrayFilter
-
:))
-
файлы в distributed начали копится и вообще перестали посылатся в другие шарды.
в других частях изменений не было (версии кх, апп, кол-во вставок, все так же).
типа такого, но умерло от слова совсем.
https://t.me/clickhouse_ru/153907
пинок в виде START DISTRIBUTED SENDS оживил.
в 20.3 есть какие баги по этому поводу?Roman Tarasov in ClickHouse не тормозитприветствую всех! столкнулись с проблемой начали накапливаться бин файлы в дистриб табличках на данный момент 15к файликов накопилось вчера добавили опцию в дефолтный профиль distributed_directory_monitor_batch_inserts 1 помогает после рестарта кх не на долго, потом снова замирает
-
Спасибо, дружище, помог очень
-
Хотя странно - обновлялся, вроде... То ли не ту версию обновил, то ли фичу туда-сюда откатывали. В любом случае, теперь завелось
-
Приветствую. Правильно ли я понимаю что в этом запросе первым выполнится самый вложенный подзапрос, его результат отправляется на все ноды, так как данные из этого подзапроса нужны для выполнения подзапроса выше и так далее по цепочке?
-
правильно
-
отлично
-
-
-
-
-
-
-
-
это с терминалом обычно связано, если копировать многострочник из условного notepad++, все ок
host :) select --^J1 as one;
SELECT 1 AS one
┌─one─┐
│ 1 │
└─────┘ -
e9a8a4ddf8c0 :) select 1
:-] -- comment
:-] ,2 as two;
SELECT 1
┌─1─┐
│ 1 │
└───┘
Если ручками набирать то тоже фигня выходит -
это проблема шелла (баша например), не КХ... набирайте так и будет вам счастье
select — (ctrl+v)(ctrl+j) 1; -
-
cl -m
🙂 select 1
:-] --aaa
:-] , 2 b
:-] ;
SELECT 1
┌─1─┐
│ 1 │
└───┘ -
аа , и правда не работает
-
но это сломали в 20х
-
clickhouse-obfuscator —help
в мануале нет ничего -
не пашет
-
похоже на вот это
-
-
Значит у вас терминал навроченный. С голым путти xterm через ctrl v, ctrl j все ок. Но вообще да, надо ридлайн чинить
-
-
Joined.
-
И то и то. Т.е. есть воркараунд. Но работает с базовым терминалом
-
The Ctrl+V key combination invokes “verbatim insert.” This allows you to enter a representation of a key into what you're typing, instead of getting the effect of the key
-
-
-
Конечно работает, без самопального кода ридлайн это не починить, не никс-вей...
Если пастите в базовый терминал все работает тоже. -
-
-
-
-
насчёт путти не знаю, но сам по себе xterm не смог
-
Ну, там 100 настроек на это дело в каждом шелле. Заведите тикет, все равно боль
-
-
кмк проблемы у клиента начались как раз потому что readline заменили на replxx
-
Доброго всем.
Может кто-то подсказать на сколько безопасно можно обновить CH кластер с 18.6.0 до 20.6?
Пересмотрел все Backward Incompatible Change в changelog последовательно, но нет уверенности что можно обновить сразу на последнюю версию.
Не изменился ли формат данных в файлах? Используются только ReplicatedMergeTree, Distributed, MATERIALIZED VIEW (ReplicatedAggregatingMergeTree/ReplicatedSummingMergeTree)
Кластер из 4 шардов по 2 сервера каждый (8 серверов). -
-
очень много изменений в джойнах, т.е. может оказаться что запрос теперь делает совсем не то (из-за any), и возращает 2 колонки вместо 4
тестировать короче надо (Я тестирую минимум 6 месяцев на стейдже)
в нескольких местах может стать сильно медленее (некоторые откатываются из-за этого) -
>Не изменился ли формат данных в файлах?
нет. Появилась адаптивная гранулярность (mrk2 файлы), она будет на новых таблицах, и из-за нее вернутся будет нельзя (но можно выключить) , я выключаю -
все альтеры таблиц теперь через мутации -- поэтому возможно работать не будут совсем, если например в таблице тысячи партов
-
стейжинг может быть не кластером для такого тестирования или изменения в distributed существенные? *JOIN можно и подправить, главное данные не потерять и insert-ы не сломалась.
-
у меня стейджинг просто два шарда в двух контейнерах на одном сервере
-
Кстати, очень не хватает в документации как раз вот таких мажорных изменений от версии к версии или за весь год, например. Даже если перечитать все CHANGES - это мало что дает для понимания, что конкретно изменилось, какие появились новые фичи и подводные камни...
-
спасибо за информацию. два тестовых шарда с текущей схемой БД на последней версии работают, их проще держать на актуальной версии, а вот сразу прыгнуть на 2 года продакшеном...
-
да, возможно. Но Яндексу скорее всего это не нужно, они видимо живут на стейблах и постоянно апгрейдятся.
Альтинити что-то такое подобное ведет. -
т.е. у вас приложение работает со свежим КХ ? Тогда значит все ОК.
-
Можно хотя бы жирным текстом важные изменения отмечать в CHANGES
-
- 13 August 2020 (150 messages)
-
у меня работает
смотрели в README замечания по grafana 7.x ? -
что конкретно у вас отвалилось?
-
Joined.
-
повторю
смотрели в README замечания по grafana 7.x ? -
а блин точно ;( на странице в 2.0.2 в репозитории Grafana старый еще README ;(
https://github.com/Vertamedia/clickhouse-grafana#grafana-7x-setup-notes
so, for properly setup you need change configuration option
[plugins]
allow_loading_unsigned_plugins=vertamedia-clickhouse-datasource
or setup environment variable
GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=vertamedia-clickhouse-datasourceGitHub - Vertamedia/clickhouse-grafana: Clickhouse datasource for grafanaClickhouse datasource for grafana. Contribute to Vertamedia/clickhouse-grafana development by creating an account on GitHub.
-
Joined.
-
-
Шохарактерно, после того, как добавил поле и использовал его (инсертил новые строки с этим новым значением), не даёт использовать фильтр по этому полю, говорит
Key expression contains comparison between inconvertible types: Enum16('hz' = 0, 'ga' = 1, 'bq' = 2, 'ym' = 3, 'adriver' = 4, 'sizmek' = 5, 'weborama' = 6, 'crm' = 7) and String inside src = 'dcm' (version 20.6.3.28 (official build)) -
Т.е. Enum8 был расширен полем 'dcm'
В итоге WHERE по этому значению не работает напрямую
SELECT *
FROM db.tb
WHERE ProjectID==7
AND src=='dcm'
И нужно делать инвертированный фильтр
SELECT *
FROM db.tb
WHERE ProjectID==7
AND not (src=='hz' OR src=='ga' OR src=='bq' OR src=='ym' OR src=='adriver' OR src=='sizmek' OR src=='weborama' OR src=='crm')
Но ведь это же черезжопство...
Явно какая-то ошибка -
Joined.
-
Привет
есть вопрос не совсем по кликхаусу но смежный.
Я использую clickhouse как backend для graphite- clickhouse. В целом работает нормально но если в запросе используется summarize и по этому запросу достаточно много метрик то на выходе получается очень много маленьких query. Настолько много что даже за 5min может не успевает обработать.
Я понимаю что вопрос скорее к разработчикам graphite- clickhouse, но может кто сталкивался с подобным? -
Подскажите пожалуйста.
Пытаюсь сделать запрос insert into table select from mysql(...)
В мускуле порядка 40-50М Записей.
Получаю ошибку
Received exception from server (version 20.4.5):
Code: 306. DB::Exception: Received from XXX.XXX.XXX.XXX:9000. DB::Exception: Stack size too large. Stack address: 0x7f6c9ec18000, frame address: 0x7f6c9f0160d0, stack size: 4202288, maximum stack size: 8388608.
Query was cancelled.
С чем может быть связано? На другом сервере такой запрос выполнялся нормально (примерно за 200 сек) -
Привет всем, подскажите плз, есть кликхаус в который пишем через Кафку. Если в сообщении ошибка и кликхаус не может его распарсить, то вся очередь встает. Если сделать скип сообщений, то такие будут просто теряться. Как лучше обрабатывать такие случаи?
-
GitHub - housepower/clickhouse_sinker: Easily load data from kafka to ClickHouse
Easily load data from kafka to ClickHouse. Contribute to housepower/clickhouse_sinker development by creating an account on GitHub.
-
-
Добрый день! А кто-нибудь пытался сбилдить Кликхаус для AARCH64 на redhat? Я следовал этой инструкции https://clickhouse.tech/docs/en/development/build-cross-arm/ (с попправкой на redhat), но на CC=clang-8 CXX=clang++-8 cmake . -Bbuild-arm64 -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-aarch64.cmake падает :(
-
Joined.
-
При реплицированной таблице, MV из неё в другую реплицированную надо создавать на всех нодах? Если не на всех, то как оно будет работать при отключении той, на которой создавали?
-
-
Всем привет, а чисто случайно не у кого нет Access базы "Библиотека" ?)) Знакомая пытается закончить учебу )) если что по специальности не работает и работать не будет
-
Joined.
-
решардинга из коробки нет
добавление шарда это добавление "набора пустых реплик"
вставлять через distributed таблицу медленнее
поэтому просто выбираете сервера какие вам надо и на них вставляете напрямую
выборка через distributed будет грузить на чтение те сервера на которых больше данных -
вставлять напрямую, а читать через distributed ?
в этом случае ZooKeeper не нужен, если я не буду автоматом реплицировать? -
Всем привет. Столкнулся с оч непростой для меня задачей.
есть таблица, в которой имеем набор данных:
create table if not exists telemetry_common
(
src_id UInt16,
param String,
param_date DateTime('Europe/Moscow')
)
engine = MergeTree() PARTITION BY toYYYYMM(param_date) ORDER BY (param_date, src_id) SETTINGS index_granularity = 8192;
в колонке param лежит json с данными вида (ключ это название какого-то параметра, а в значениях лежат вложенные категории с самими значениями):
{
"a_zone_temperature": {
"100": 318.0,
"0": 270.0,
"1": 74.0,
"2": 462.0,
"3": 341.0,
"4": 490.0
},
"b_zone_temperature": {
"0": 270.0,
"1": 74.0,
"2": 462.0,
}
}
хочу выбрать данные за какой-то период по param_date с агрегацией: даунсемплить до часов и посчитать среднее значени по вложенным ключам.
это вообще возможно реализовать средствами клика?
голову сломал -
Ответ нашелся. Спасибо поиску по чату.
Проблема была в том, что существует материалка из целевой таблицы в эту же таблицу. -
"автоматом реплицировать" значит вставлять сразу паралельно в несколько серверов?
или имеется ввиду ReplicatedMergeTree?
второй вариант подразумевает что вставляете в один сервер
остальные докачивают вставленные данные обмениваясь названиями файлов с данными через Zookeeper -
да, имел ввиду ReplicatedMergeTree
понял... спасибо! -
По умолчанию кх стучится во все шарды, не важно какой шардинг ключ.
-
https://clickhouse.tech/docs/en/sql-reference/functions/json-functions/#jsonextractfloatjson-indices-or-keys
JSONExtractFloat пробовали? что не получается?JSON | ClickHouse DocumentationFunctions for Working with JSON In Yandex.Metrica, JSON is transmitted by users as session parameters. There are some sp
-
о! так норм... спасибо 🙂
-
имеется ввиду ПРИ ЧТЕНИИ из Distributed таблицы стучится во все шарды
при записи в Distributed
раскидывает по шардам в соответсвии с ключом шардирования -
а 🙂
ну тоже неплохо... осталось придумать алгоритм выбора шарда для записи -
имеется ввиду ПРИ ЧТЕНИИ из Distributed таблицы стучится во все шарды
при записи в Distributed
раскидывает по шардам в соответсвии с ключом шардирования -
А вам надо билдить самому? Кх ci собирает бинарники под arm
-
воот...так вот каким должен быть правильным ключ шардирования, если до этого писал только в один шард и он переполнился?
по дате, ID... ? -
да сказали же никаким
берите и пишите напрямую в те сервера которые "новые"
в конфиге их задавайте
и пишите туда пачкой
каждую новую пачку в новый сервер -
как-то каряво... должно ж быть коробочное решение... ситуация же вполне стандартная
-
коробочное решение это ключ шардинга тогда по дате
-
спасибо! пойду тестировать
-
дело вот в чём. мне нужен запрос вида:
select toStartOfHour(param_date) as hour,
any((JSONExtractKeysAndValues(param, 'a_zone_temperature', 'Float32'))) as a_zone_temperature
from telemetry_common
where param_date > today()
and src_id = 125
group by hour
order by hour desc;
но any заменить на avg
вот пример того, что возвращает запрос выше:
2020-08-13 14:00:00,"[('3',100),('4',103),('100',102),('0',98),('1',81),('2',95)]"
2020-08-13 13:00:00,"[('3',102),('4',80),('100',86),('0',109),('1',99),('2',101)]"
2020-08-13 12:00:00,"[('3',91),('4',83),('100',80),('0',101),('1',86),('2',83)]"
2020-08-13 11:00:00,"[('3',110),('4',98),('100',101),('0',110),('1',96),('2',84)]"
2020-08-13 10:00:00,"[('3',96),('4',80),('100',100),('0',110),('1',87),('2',107)]"
2020-08-13 09:00:00,"[('3',92),('4',105),('100',96),('0',83),('1',108),('2',93)]"
2020-08-13 08:00:00,"[('3',108),('4',95),('100',98),('0',93),('1',87),('2',82)]"
как для каждого тупла посчитать среднее? -
Добрый день, подскажите пожалуйста, как откорректировать синтаксис запроса
select * FROM table1
any left join table2 using (column1)
any left join table3 using (column2)
чтобы он не приводил к ошибке DB::Exception: Multiple CROSS/COMMA JOIN do not support USING (version 20.3.10.75)?
с самими таблицами все ок, по одной джойнятся без проблем ((( -
Нет решардинга из коробки.
-
нужен... думаю, поднял бы порог вхождения новых юзеров, хотя может оно и не надо
-
внутри каждой строки? arrayReduce('avg'
или для всех строк? -
спасибо кеп
-
SELECT
hour,
a_zone_temperature.1 AS category,
avg(a_zone_temperature.2) AS avg_temp
FROM (
select toStartOfHour(param_date) as hour,
any((JSONExtractKeysAndValues(param, 'a_zone_temperature', 'Float32'))) as a_zone_temperature
from telemetry_common
where param_date > today()
and src_id = 125
group by hour
order by hour desc
)
GROUP BY hour, category; -
any left join схлапывает левую и правую таблицы, вам правда нужен any? В 20х версиях кх его переделали и теперь надо писать semi чтобы получился результат как в 19м
-
в строках массив туплов:
[[('3',100),('4',103),('100',102),('0',98),('1',81),('2',95)],[('3',83),('4',94),('100',107),('0',96),('1',91),('2',83)],[('3',85),('4',97),('100',81),('0',88),('1',108),('2',103)],[('3',83),('4',82),('100',102),('0',96),('1',90),('2',105)],[('3',104),('4',89),('100',106),('0',102),('1',109),('2',93)],[('3',105),('4',101),('100',102),('0',101),('1',104),('2',94)],[('3',106),('4',95),('100',95),('0',84),('1',93),('2',109)],[('3',80),('4',88),('100',105),('0',104),('1',87),('2',95)],[('3',95),('4',95),('100',100),('0',107),('1',106),('2',80)],[('3',83),('4',80),('100',107),('0',109),('1',84),('2',110)],[('3',84),('4',97),('100',109),('0',108),('1',108),('2',99)],[('3',108),('4',99),('100',102),('0',101),('1',104),('2',109)],[('3',103),('4',96),('100',102),('0',109),('1',106),('2',101)],[('3',90),('4',109),('100',89),('0',93),('1',109),('2',102)],[('3',82),('4',105),('100',92),('0',84),('1',97),('2',96)],[('3',82),('4',105),('100',90),('0',97),('1',93),('2',87)],[('3',102),('4',90),('100',95),('0',105),('1',86),('2',83)],[('3',88),('4',92),('100',92),('0',110),('1',83),('2',80)],[('3',93),('4',91),('100',90),('0',106),('1',104),('2',107)],[('3',97),('4',80),('100',95),('0',98),('1',100),('2',108)],[('3',91),('4',82),('100',105),('0',84),('1',99),('2',96)],[('3',92),('4',81),('100',106),('0',110),('1',100),('2',96)],[('3',107),('4',100),('100',82),('0',110),('1',102),('2',92)],[('3',105),('4',108),('100',98),('0',103),('1',108),('2',108)],[('3',101),('4',84),('100',93),('0',107),('1',88),('2',84)],[('3',103),('4',83),('100',98),('0',102),('1',98),('2',89)],[('3',83),('4',103),('100',96),('0',108),('1',95),('2',95)],[('3',94),('4',103),('100',93),('0',89),('1',104),('2',94)],[('3',93),('4',91),('100',95),('0',101),('1',95),('2',109)],[('3',101),('4',109),('100',84),('0',105),('1',102),('2',109)]]
arrayReduce('avg', a_zone_temperature) не может примениться к туплам... -
select toStartOfHour(param_date) as hour,
groupArray((JSONExtractKeysAndValues(param, 'a_zone_temperature', 'Float32'))) as a_zone_temperature,
arrayReduce('avg', a_zone_temperature)
from telemetry_common
where param_date > today()
and src_id = 125
group by hour
order by hour desc; -
Спасибо, а где их найти можно?
-
мне в "наследство" достались готовые таблицы с ENGINE = Join(ANY, LEFT, field), которые вязались к основной посредством joinGet несколько десятков раз, изза чего, как я предполагаю, запрос падал по нехватке оперативки. Пытаюсь заменить много joinGet на несколько Join... как понимаю, мне нужен классический LEFT JOIN, но без any оно дает ошибку Table has incompatible type of JOIN...
-
перепрочел документацию, вроде бы все правильно, any выберет первую попавшуюся (в моем случае - единственную) запись из второстепенной таблицы... осталось только понять ответ на изначальный вопрос - как сделать в одном селекте несколько any left join (((
-
и сюда политика добралась..
-
При всём уважении, происходящее в Беларуси нельзя назвать нормой в принципе.
И это не политота, хотя согласен, в этом чате она смотрится как минимум странно. -
Чисто для справки, я сейчас в Минске
-
Аналогично, да. Ремоут, все дела.
Простите, больная тема. -
-
Добрый день подскажите как можно посчитать сумму столбца?
-
-
https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/reference/sum/
привет, документация ))) -
понял свою ошибку извиняюсь 🙂
-
select hour, a_zone_temperature.1 as k, avg(a_zone_temperature.2) as v
from (
select toStartOfHour(param_date) as hour,
arrayJoin((JSONExtractKeysAndValues(param, 'a_zone_temperature', 'Float32'))) as a_zone_temperature
from telemetry_common
where param_date > today()
and src_id = 125
group by hour, param
order by hour desc)
group by hour, k
order by hour, k;
нашёл решение, спасибо за мысль -
arrayReduce('avg', a_zone_temperature.1)
-
arrayReduce('avg', a_zone_temperature.2)
-
эво как ... чувствую я намудрил )))
-
[('3',100) -- что такое 3? что такое 100?
-
Привет. может уже было, но что-то не отыскал. Как убрать заданный при создании TTL у таблицы?
-
-
-
никак. Переделать например на 50 лет
-
https://t.me/clickhouse_ru/87607
например https://clickhouse-builds.s3.yandex.net/12470/dc51a8db4859a89c8a806a3050e49592f97a4e55/clickhouse_build_check/report.html
clang-10-aarch64 relwithdebuginfo none bundled unsplitted
https://clickhouse-builds.s3.yandex.net/12470/dc51a8db4859a89c8a806a3050e49592f97a4e55/clickhouse_build_check/clang-10-aarch64_relwithdebuginfo_none_bundled_unsplitted_disable_False_binary/clickhouseAlexey Milovidov in ClickHouse не тормозитМожно исправить проблему, не дожидаясь сборки следующего релиза, установив ClickHouse из master. У нас есть готовые сборки почти на каждый коммит. Воспользоваться ими можно так: 1. Заходим в список коммитов: https://github.com/yandex/ClickHouse/commits/master 2. Находим самый верхний коммит с зелёной галочкой. Зелёная галочка означает, что все тесты прошли. 3. Нажимаем на зелёную галочку и находим там "ClickHouse build check". Жмём на Details. https://clickhouse-builds.s3.yandex.net/0/e7541f03ddc22f8e399fc21a1a7edbb6294db454/report.html 4. Здесь находим строчку gcc-7, relwithdebuginfo, none, bundled. В данном примере, она верхняя. 5. Копируем ссылку на пакет clickhouse-common-static: https://clickhouse-builds.s3.yandex.net/0/e7541f03ddc22f8e399fc21a1a7edbb6294db454/375561582/clickhouse-common-static_19.1.42_amd64.deb 6. Скачиваем, устанавливаем.
-
кмк вы идете в обратном направлении, ENGINE = Join как раз нужен для того чтобы джойны работали быстрее и не падали по памяти, покажите запрос который был и какая ошибка была
-
в документации ложь
-
не было. select a from group by a работает быстрее чем select distinct a
-
обсуждали же на митапе такую функцию, и Николай Кочетов сказал что можно сделать.
я понял кстати почему ее нет изначально, я тормоз, я знаю. Ее можно использовать и выдрать из .dict файлов все значения словаря только в случае когда нет where. Если where есть, то надо кроме .dict файлов читать еще и bin -
аха, а в ГХ есть issue на такую оптимизацию
-
в 20.3 работает точно так же...
-
может оптимизация в процессорах появилась
-
а не, все верно, быстрее, я просто на нескольких колонках попробовал, логично что там ловить нечего
-
на нескольких колонках оптимизации lowcardinality не сделаны
-
всем добрый день ещё раз (особенно тем у кого функциональщина головного мозга =) )
есть таблица EAV в виде
datadatetime, pk1, textualpk1, textualpk2, keycolumn, valuecolumn
кардиналити на pk1 высокий, на key не очень.
в целях отчетности она пивот-иться в вид:
pk1, textualpk1, textualpk2, keycolumn, valuedate1, valuedate2, valuedate3
, пока запрос такой.
with [toDate('2020-04-06') , toDate('2020-04-07') , toDate('2020-04-08')] as "report_dates"
select pk1, keycolumn,
any("textualpk1") as "textualpk1" , -- very fat strings
any("textual2pk1") as "textual2pk1" , -- very fat strings
(groupArrayInsertAt(Null, 3)(tuple(toNullable("keycolumn")), toUInt32(indexOf("report_dates" , toDate("datadatetime")) -1)).1 as "valuecolumn")[1] as "2020-04-06" ,
"param_values"[2] as "2020-04-07" ,
"param_values"[3] as "2020-04-08"
from keyvalues
group by "pk1" , "keycolumn";
когда строк комбинаций pk1*key очень много жрет память 125 млн строк на 22 ГБ в виду очень Жирных текстовых колонок.
можно как нибудь умнее переписать?
PS. в память словарь с pk1, textualpk1 не влезает. в нашей версии ssd_cache ещё не подвезли. -
есть оптимизация -- group by использует индекс, может запрос вообще стримабл можно сделать?
-
#1 будет ли эта оптимизация работать при наличии where pk1 IN (xxx) — большой IN
#2 чтобы эта оптимизация работала надо докинуть keycolumn в конец индекса, и все? -
-
не знаю
-
Подскажите как можно поменять Uint64 в string в DataGrip выдает timeout а без этого не выдает данные 🙁 Или как можно их вернуть?
-
-
-
-
Это равносильно перезапуску КХ?
-
Прошу прошения, что снова встреваю (( подскажите пожалуйста по синтаксису вложенных запросов, как правильно переписать пример
SELECT
t1.field1,
(select t2.field2, t2.field3
from table2 t2 where t2.field = t1.field1
)
FROM table1 t1
чтобы он стал рабочим? ругается что не видит t1.field1 во вложенном запросе... -
да
-
для начала поджойнить t1 на t2
-
Отлично. Запланирую тогда на ночь перезапуск )
-
от джойнов я и пытаюсь уйти
-
дада в чатик писать нельзя. только читать
-
не поддерживает коррелированные подзапросы КХ. Внешние словари м.б. ?
-
а как быть? джойнить не вариант, там их 5 штук второстепенных таблиц... сейчас пробовали joinGet - падаем по нехватке оперативки
-
Внешние словари ?
-
а чем это лучше JoinGet, словари тоже загрузятся в оперативку и так же ее забьют... (по крайней мере в документации написано что очень похоже работает)
-
Технически, можно попробовать через union all и группировку, но затраты оперативки будут примерно одинаковые (наверное, точно не уверен)
-
а я не заметил про joinGet, я про коррелированный подздапрос отвечал.
словари можно кешировать (и не грузить в память целиком), но вообще непоятно что вы делаете и почему вам нужен такой запрос что у вас в table2 ?
это таблица фактов или словарь(размерность)? сколько там строк? -
и в основной таблице и во второстепенных - сотни миллионов строк. это попытка объединения нескольких "классических" таблиц в одну широкую
-
-
это антипаттерн для КХ, не заработает, валите все в одну таблицу еще до КХ, на стадии ETL
-
сам я это понимаю, коллеги против. Спасибо Вам, буду биться дальше...
-
так либо так либо никак, выбирать-то не из чего.
-
-
-
А потом большую таблицу саму с собой джойнить? Или как составлять отчёт, если в нем нужны данные из нескольких таблиц
-
Здравствуйте! Задача: Сырые события занимают много места. Решаю так - предагрегирую запросом и сливаю в другую таблицу. Запрос на чтение не сразу видит данные, булкинсертом вставленные. Что-то делаю не так? Как правильно?
-
И, забыл, из таблицы с сырыми данными делаю удаление событий, по которым была сделана агрегация
-
ммм, а зачем джойнить?
>, если в нем нужны данные из нескольких таблиц
валите все в одну таблицу (широкую ) еще до КХ, на стадии ETL
уже поджойненное как надо -
Ясно, пока непонятно как там в etl джойнить)
-
ну как как, как все джойнят.
У всех в этом чатике одна и таже проблема, как обогатить ивенты, если часть атрибутов приезжает позже. -
-
Если позже - то либо пересчитывать за предшествующий день/несколько дней, либо ждать, пока все таблицы заполнятся
-
-
Классно было бы это паттерн в какой-нибудь доке рассмотреть
-
я это, канадский дба, без фантазии. Мне такое абсолютно неинтересно. Вот раид разломать, потом собрать, это ко мне.
-
А мой вопрос? Или он совсем за плинтусом?
-
инсерт в таблицу с каким движком сырые данные заливает?
например есть Engine=Buffer который флашит данные в таблицу не сразу
вставка в Distributed асинхронная, есть флаг который это меняет и т.д. -
>И, забыл, из таблицы с сырыми данными делаю удаление событий, по которым была сделана агрегация
это все можно сделать с помощью Materialized View над таблицей с движком Engine=Null даже -
ENGINE = MergeTree
-
И автоматическое удаление, чтобы диск не засорялся тоже можно?
-
>Запрос на чтение не сразу видит данные, булкинсертом вставленные.
тогда такого быть не может. КХ возвращает управление инсерту когда все данные уже видны селектам -
-
-
-
-
как инсерт выглядит? Какой тип данных? Какой клиент используется?
-
-
интересно, это 100% баг
а версия КХ ?
попробуйте
clickhouse-client --input_format_parallel_parsing=0 -d db -q 'insert into db.table_log format TabSeparated' -
-
это неуловимый баг, который не удается воспроизвести потому что страдальцы не могут дать тестовый семпл с tsv
-
-
какие типы данных в таблице? DDL можете показать? А TSV большой? Строк в нем много? Они широкие?
-
У меня ошибка парсинга, файл битый — не могу сказать что точно отработало уже
session_start DateTime64(3, 'Etc/UTC'),
session_end DateTime64(3, 'Etc/UTC'),
filter_ip IPv4,
local_ipv4 Nullable(IPv4),
local_ipv6 Nullable(IPv6),
local_port UInt16,
remote_ipv4 Nullable(IPv4),
remote_ipv6 Nullable(IPv6),
remote_port UInt16,
dpi_protocol_code_list Array(UInt32)
) engine = ReplicatedMergeTree('/clickhouse/tables/{shard}/session_log.session_signature_log_local', '{replica}')
partition by toStartOfDay(session_start)
order by (session_start, filter_ip);
размер 2ТБ, вот как раз сломан файл там слишком длинная первая строка выяснил только что -
Joined.
-
если один к одному данные, можете через aggregatingMT джойнить. например maxState от колонок. И все прекрасно будет в одной таблице
-
-
наличие hash-а не решает проблему коллизий, разруливается на уровне реализации hash-таблицы (сам join отдельно хранить строку не будет достанет из hash-мапы):
std::unique_ptr<FixedHashMap<UInt8, Mapped>> key8;
std::unique_ptr<FixedHashMap<UInt16, Mapped>> key16;
std::unique_ptr<HashMap<UInt32, Mapped, HashCRC32<UInt32>>> key32;
std::unique_ptr<HashMap<UInt64, Mapped, HashCRC32<UInt64>>> key64;
std::unique_ptr<HashMapWithSavedHash<StringRef, Mapped>> key_string;
std::unique_ptr<HashMapWithSavedHash<StringRef, Mapped>> key_fixed_string;
std::unique_ptr<HashMap<UInt128, Mapped, UInt128HashCRC32>> keys128;
std::unique_ptr<HashMap<UInt256, Mapped, UInt256HashCRC32>> keys256;
std::unique_ptr<HashMap<UInt128, Mapped, UInt128TrivialHash>> hashed; -
я скорее не про коллизии, а про размер данных при объединении. Т.е. стоит ли мне join on xxHash64(mySuperString) сделать руками или CH сам умеет это?
-
^ специализации хэш таблиц в join-е для ключей разных размеров и типов
-
ну по хэшу руками вы получите join с коллизиями, которые как-то надо пофильтровать
-
логично. Спасибо
-
сделайте через send_logs_level='debug'
заодно проверите сколько он ест памяти в обоих вариантах... -
да, это обязательно попробую
-
-
- 14 August 2020 (155 messages)
-
Joined.
-
Приветствую. Столкнулся с проблемой невозможности использования глобального подзапроса в локальном. Есть ли какая-нибудь возможность для исполнения подобного сценария?
-
а какую ошибку показывает?
выглядит так что просто побоялись беспонечных циклических подзапросов из GLOBAL IN получить... -
DB::Exception: Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny'). You may rewrite query to use local tables in subqueries, or use GLOBAL keyword, or set distributed_product_mode to suitable value. (version 19.14.11.16 (official build))
-
если поменять на локальную, то всё ок. Но в реальном решении это не подходит, так как нужны данные из поля не по ключу шардирования.
-
Он же в ошибке пишет что нужно сделать, чтобы разрешить.
-
замените везде IN на GLOBAL IN
-
но производительность замедлится и нагрузка на CPU на ноде инициаторе запроса возрастет
-
да, этот вариант работает) Но хотелось бы как я описал
-
да да, замедлится
-
ну как вариант сделать Table3 - словарем
и вытащить через WHERE dictGet -
всем привет, проблема при переключении на новый КХ 20.5.4.40. Перенес данные со старой версии 19.3.5 в новый, пересоздал таблицы в новом формате, поменял c
ENGINE = MergeTree(EventDate, (View, Click, Get, EventDate), 8192)
на
ENGINE = MergeTree
PARTITION BY toYYYYMM(EventDate)
ORDER BY (View, Click, Get, EventDate)
но при переключении приложения на новый КХ почему-то в некоторых колонках значения получаются очень большие
это нормальные значения на старом КХ
┌──────────────g_date─┬─────profit─┐
│ 2020-08-14 01:25:00 │ 1.06384226 │
│ 2020-08-14 01:26:00 │ 1.14885028 │
│ 2020-08-14 01:27:00 │ 1.06182347 │
│ 2020-08-14 01:28:00 │ 0.03494053 │
│ 2020-08-14 01:29:00 │ 0.25599383 │
└─────────────────────┴────────────┘
а это на новом
┌──────────────g_date─┬───────profit─┐
│ 2020-08-14 01:27:00 │ 0.02914438 │
│ 2020-08-14 01:28:00 │ 215.75539282 │
│ 2020-08-14 01:29:00 │ 172.57422046 │
└─────────────────────┴──────────────┘
в чем может быть проблема с новым КХ? -
сначала сравните сырые данные между старым и новым (count). совпадают ли они?
-
при переносе данных count совпадал
-
-
Joined.
-
Joined.
-
-
Друзья, привет
Есть ли у кого-то опыт пролива flyway с помощью docker на Clickhouse?
Применение популярного тут ПР https://github.com/flyway/flyway/pull/2640Yet another ClickHouse support by a-konyaev · Pull Request #2640 · flyway/flywayBased on #2166 and #1773 This one has some improvements in comparison to previous implementations: more accurate declaration of the schema table's columns (types and default values) &q...
-
Реквест уже успел протухнуть. Они поменяли внутреннее api.
-
Понятно почему не работает)
Как-то прикрутить flyway возможно сейчас? -
Они там сломали слегка внутреннее api.
-
К базам где нет update оно сейчас не дружелюбно.
-
Добрый день! Подскажите пожалуйста, если я в одном select делаю два joinGet на одну и ту же таблицу - Клик ее загрузит в оперативку один или два (по числу joinGet) раза?
-
0 раз.
Engine=join хранится в озу целиком. В этом идея, не надо грузить. -
коллеги, привет!
как сделать так, чтобы при вставке данных с помощью clickhouse-client в формате CSV пустые значения трактовались как значения по умолчанию?
нашёл https://github.com/ClickHouse/ClickHouse/issues/5349, но у клиента настройки такой не вижу, и тип DateTime оно не вставляет.
Версия клиента 20.6.3.28 (official build).Setting `input_format_csv_empty_as_default` · Issue #5349 · ClickHouse/ClickHouseThe setting affects parsing data from CSV format. With current behaviour, if CSV has unquoted empty field, it is parsed as empty string (for String data type) or will lead to parse error (for other...
-
это про другое и там параметр сделали --input_format_defaults_for_omitted_fields
-
--input_format_defaults_for_omitted_fields arg For input data calculate default expressions for omitted fields (it works for JSONEachRow, CSV and TSV formats).
-
https://github.com/flyway/flyway/pull/2640 - вот этот пулл вы используете?Yet another ClickHouse support by a-konyaev · Pull Request #2640 · flyway/flyway
Based on #2166 and #1773 This one has some improvements in comparison to previous implementations: more accurate declaration of the schema table's columns (types and default values) &q...
-
-
-
коннект и сервера кликхауса до mysql есть?
SELECT ... FROM mysql()
табличную функцию проверьте с этими же реквизитами -
-
в логах grep -r dictionary.xml /var/log/clickouse/* посмотрите и окрестностях
-
-
разобрались?
-
-
ну и SYSTEM RELOAD DICTIONARY
-
-
версия mysql 8 ?
-
-
всем привет, а не подскажите, как можно вывести rowNumberInAllBlocks()
для группы?
Грубо говоря, есть таблица
id_user, tr_id, amount_tr
мне нужно вывести
id_user, number_of_transaction_for_user, amount_tr -
есть какие-то возможности у кх, что бы в окне сделать?
-
посмотрел на картинку, просто вы еще не обращались к словарю, они lazy load
-
-
сделайте либо select либо dictget
-
groupArray / arrayEnumerate
-
-
Всем привет! Подскажите плз: при тестировании возникла ошибка
Cannot reserve 1.00 MiB, not enough space
При том что места на разделе с КХ еще 1 TB.
Где может стоять какое то ограничение по потреблению?
Развернуто в единственном экземпляре, не кластер -
ошибку целиком можете показать?
На каком разделе диска не смог и на каком свободно? -
Что это за инструмент?
-
-
-
2020-08-14T15:39:58.524+0300 [error] com.lightbend.lagom.internal.broker.kafka.KafkaSubscriberActor [sourceThread=application-akka.actor.default-dispatcher-32, akkaTimestamp=12:39:58.523UTC, akkaSource=akka://application/user/KafkaBackoffConsumer1-injirMsg/KafkaConsumerActor1-injirMsg, sourceActorSystem=application] - Topic subscription interrupted due to failure: [ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 243, host: 10.78.222.229, port: 8123; Code: 243, e.displayText() = DB::Exception: Cannot reserve 1.00 MiB, not enough space (version 20.6.3.28 (official build))
]
2020-08-14T15:39:58.529+0300 [error] akka.actor.OneForOneStrategy [sourceThread=application-akka.actor.default-dispatcher-33, akkaTimestamp=12:39:58.524UTC, akkaSource=akka://application/user/KafkaBackoffConsumer1-injirMsg/KafkaConsumerActor1-injirMsg, sourceActorSystem=application] - ClickHouse exception, code: 243, host: 10.78.222.229, port: 8123; Code: 243, e.displayText() = DB::Exception: Cannot reserve 1.00 MiB, not enough space (version 20.6.3.28 (official build))
ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 243, host: 10.78.222.229, port: 8123; Code: 243, e.displayText() = DB::Exception: Cannot reserve 1.00 MiB, not enough space (version 20.6.3.28 (official build))
at ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier.specify(ClickHouseExceptionSpecifier.java:58)
at ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier.specify(ClickHouseExceptionSpecifier.java:28)
at ru.yandex.clickhouse.ClickHouseStatementImpl.checkForErrorAndThrow(ClickHouseStatementImpl.java:875)
at ru.yandex.clickhouse.ClickHouseStatementImpl.getInputStream(ClickHouseStatementImpl.java:616)
at ru.yandex.clickhouse.ClickHouseStatementImpl.executeUpdate(ClickHouseStatementImpl.java:215)
at ru.yandex.clickhouse.ClickHousePreparedStatementImpl.executeUpdate(ClickHousePreparedStatementImpl.java:130)
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
at akka.stream.alpakka.slick.javadsl.Slick$.$anonfun$toDBIO$3(Slick.scala:372)
at akka.stream.alpakka.slick.javadsl.Slick$.$anonfun$toDBIO$3$adapted(Slick.scala:371)
at slick.jdbc.SimpleJdbcAction.run(StreamingInvokerAction.scala:70)
at slick.jdbc.SimpleJdbcAction.run(StreamingInvokerAction.scala:69)
at slick.basic.BasicBackend$DatabaseDef$$anon$3.liftedTree1$1(BasicBackend.scala:275)
at slick.basic.BasicBackend$DatabaseDef$$anon$3.run(BasicBackend.scala:275)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.Throwable: Code: 243, e.displayText() = DB::Exception: Cannot reserve 1.00 MiB, not enough space (version 20.6.3.28 (official build))
at ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier.specify(ClickHouseExceptionSpecifier.java:53)
... 16 common frames omitted -
Joined.
-
-
не понятно ((
SELECT up.user_id,
rowNumberInAllBlocks()+1,
num,
up.*
FROM user_payments up ARRAY join arrayEnumerate(user_id) AS num
WHERE up.user_id = 2232807
and up.type ='payin'
and up.status ='done'
пишет, что должен быть array -
да джавный стек трейс очень помог, в логе кх более подробно
-
посмотрю там
-
3 группы
SELECT
number % 3 AS g,
number AS x
FROM numbers(10)
select g, x, i from (select g, groupArray(x) gx from (select number % 3 g , number x from numbers(10)) group by g) array join gx as x, arrayEnumerate(gx) as i -
аааааа, понял, спасибо!
-
Привет! Подскажите, есть ли настройка, чтобы обойти следующее ограничение? В доках не нашёл.
DB::Exception: Limit for rows to read exceeded, max bytes: 9.09 TiB, current bytes: 9.10 TiB -
по умолчанию ограничения нет.
--max_rows_to_read arg Limit on read rows from the most 'deep' sources. That is, only in the deepest subquery. When reading from a remote server, it is
set max_rows_to_read =300
select * from numbers(10000000) format Null
DB::Exception: Limit for rows or bytes to read exceeded, max rows: 300.00, current rows: 10.00 million -
А он платный? Сколько стоит? Смотрю, в загрузках 30-дневный триал. Что будет по их прошествии?
-
-
в лс
-
В моём случае байтики, а не строки, но и то другое прибито гвоздями: DB::Exception: Setting max_bytes_to_read should not be changed. В любом случае, спасибо!
-
денег захотят
-
добрый день, за последние пару дней в логах посыпались постоянные "Session expired" (wc-l по err-логу 36000 ) и таблицы уходят в readonly и возвращаются.
При этом ЗК живой вполне.
куда можно копать?
2020.08.11 08:36:22.669140 [ 8046 ] {} <Error> schema.tablename: void DB::StorageReplicatedMergeTree::mutationsUpdatingTask(): Code: 999, e.displayText() = Coordination::Exception: Session expired (Session expired), Stack trace (when copying this message, always include the lines below):
0. Poco::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x1051b3a0 in /usr/bin/clickhouse
1. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x8f5172d in /usr/bin/clickhouse
2. Coordination::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, int) @ 0xdeef818 in /usr/bin/clickhouse
3. Coordination::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0xdeefe42 in /usr/bin/clickhouse
4. ? @ 0xdf24221 in /usr/bin/clickhouse
5. Coordination::ZooKeeper::list(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void (Coordination::ListResponse const&)>, std::__1::function<void (Coordination::WatchResponse const&)>) @ 0xdf1f68d in /usr/bin/clickhouse
6. zkutil::ZooKeeper::getChildrenImpl(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&, Coordination::Stat*, std::__1::function<void (Coordination::WatchResponse const&)>) @ 0xdef7bd7 in /usr/bin/clickhouse
7. zkutil::ZooKeeper::getChildrenWatch(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, Coordination::Stat*, std::__1::function<void (Coordination::WatchResponse const&)>) @ 0xdefc01f in /usr/bin/clickhouse
8. DB::ReplicatedMergeTreeQueue::updateMutations(std::__1::shared_ptr<zkutil::ZooKeeper>, std::__1::function<void (Coordination::WatchResponse const&)>) @ 0xdac42d8 in /usr/bin/clickhouse
9. DB::StorageReplicatedMergeTree::mutationsUpdatingTask() @ 0xd7291e5 in /usr/bin/clickhouse
10. DB::BackgroundSchedulePoolTaskInfo::execute() @ 0xcfe9415 in /usr/bin/clickhouse
11. DB::BackgroundSchedulePool::threadFunction() @ 0xcfe9a32 in /usr/bin/clickhouse
12. ? @ 0xcfe9b70 in /usr/bin/clickhouse
13. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x8f757e7 in /usr/bin/clickhouse
14. ? @ 0x8f73c33 in /usr/bin/clickhouse
15. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
16. __clone @ 0xfe8cd in /usr/lib64/libc-2.17.so
(version 20.3.11.97 (official build)) -
мутации на этой таблице никто не запускает, но есть куча старых мутаций (изза materialize ttl в мае). есть ли смысл их "почистить"
-
Подскажите, как кверить удаленный ms sql сервер?
Поставили и запустили clickhouse-jdbc-bridge
пытаюсь выполнить
SELECT * FROM jdbc('jdbc:sqlserver://XXX.XXX.XXX:PPPP?...)
говорит
HTTP status code: 500 Server Error, body: No suitable driver found for jdbc:sqlserver://XXX.XXX.XXX:PPPP?...)
Где взять этот драйвер? или может я что не так делаю? -
проблема была в ЗК похоже из-за debug log, но это неточно
-
вопрос теперь такой
- вставка в distributed
- не проходит на одном из шардов по лимиту партишнов в одном инсерте (иногда апп криво работает допустим)
- distributed monitor пытается его вставить бесконечное количество раз и каждый раз файл явно переименовывается/пересоздается. как поймать плохой bin файл? -
да вроде нет, имя файла не меняется
https://github.com/ClickHouse/ClickHouse/issues/12530#issuecomment-658902526
Started processing /var/lib/clickhouse/data/default/test12345d/default@chdw1%2D2%2Esde894:9000/1.bin
Started processing /var/lib/clickhouse/data/default/test12345d/default@chdw1%2D2%2Esde894:9000/1.bin
Started processing /var/lib/clickhouse/data/default/test12345d/default@chdw1%2D2%2Esde894:9000/1.binMultiple sending data from a distributed table · Issue #12530 · ClickHouse/ClickHouseTwo shards without replication, version CH 20.4.5.36. Create local Main_Tab tables Create a Distributed table for Main_Tab tables - Distr_main_tab Create a MaterializedView - MV and Tab - target ta...
-
можно остановить обработку distributed типа как-то system distributed send stop
-
и взять из лога из ошибки имя файла
-
на сайте MS скачать jdbc драйвер?
https://github.com/ClickHouse/clickhouse-jdbc-bridge#overview -
не пишет в логе имя файла... ошибка происходит при вставке в один из шардов только
-
дистрибьютид таблица пишет ошибку, она шардит до отсылки
-
там точно есть некая перезапись, потому что все даты модификации свежие... а тот файл валится с июня
можно конечно убить вставки и дождаться пока останется только один, но эт долго и больно -
SYSTEM STOP DISTRIBUTED SENDS [db.]<distributed_table_name>
-
ищем в логе последнюю ошибку
-
-
Два дня бился с багом из-за которого пропадали метрики (стек bioyino, carbon-clickhouse, clickhouse`), и обнаружил что это КХ усреднял некоторые значения. Таблицы уже задефинированы с `graphite_rollup, и сервер отказывается запускаться когда я убираю эту секцию из конфига...
-
Всего пара таблиц, определены они вот так им образом:
CREATE TABLE IF NOT EXISTS graphite.data (
Path String,
Value Float64,
Time UInt32,
Date Date,
Timestamp UInt32
) ENGINE = GraphiteMergeTree(Date, (Path, Time), 8192, 'graphite_rollup');
Нужно как-то исправить или реинициализовать ENGINE без graphite_rollup. -
так пропишите другие правила в graphite_rollup
-
можно просто заменить GraphiteMergeTree на MergeTree
) ENGINE = GraphiteMergeTree(Date, (Path, Time), 8192, 'graphite_rollup');
) ENGINE = MergeTree(Date, (Path, Time), 8192);
в .sql файле
сами парты у всех движков одинаковые, движок влияет на мерж -
простите, я тупил. я думал что надо смотреть логи самого хоста, но прилетали они с distributed ( from IP) другого хоста, там всех нашли и удалили. файлы не перезаписываются.
теперь вопрос другого характера.
файлы в distributed накапливаются и он не успевает всем раскидывать.
поддержки в background_distributed_schedule_pool_size только с 20.3
distributed_directory_monitor_batch_inserts=1 уже выставлено.
что ещё можно предпринять безболезненно? -
включать синхронный инсерт?
--insert_distributed_sync arg If setting is enabled, insert query into distributed waits until data will be sent to all nodes in cluster.
и инсертить более крупно?
у вас во все ноды инсерт идет? distributed на всех не успевают? -
>и инсертить более крупно?
ну, это надо работать =)
>включать синхронный инсерт?
он более efficient? или затормозит апп примерно в похожем порядке?
если разные таблицы в distributed на разных хостах вставлять - поможет? (есть 3-4 крупных). будет у каждой таблицы по потоку? -
>>включать синхронный инсерт?
>он более efficient? или затормозит апп примерно в похожем порядке?
вроде выше параллелизм при insert_distributed_sync , я не уверен на 100% , я не пользуюсь вставкой в distributed
>будет у каждой таблицы по потоку?
да
можно вставлять во все хосты во все таблицы и тогда они все будут писать -
-
можно объявить пустые правила:
<graphite_rollup_null incl="rollup_scheme"></graphite_rollup_null>
</yandex>
...
ENGINE = ReplicatedGraphiteMergeTree('/clickhouse/tables/{shard}/graphite_reverse', '{replica}', 'graphite_rollup_null') -
Ох благодарю, вроде помогло и запустилось!
-
Благодарю за ответ! Проблема была в том что просто поменять движ я не смог, и дропать сущестующие таблицы тоже нельзя
-
Да, мы тоже натыкался на это, хотя 5тб данных уже несколько раз переписали за 2 года( смена партиционирования и грануляции)
-
-
-
ну либо хранить для каждого часового пояса отдельно сумму за день, либо хранить с группировкой до часа (естественно не поможет для таймзон со смещением на 30 минут)
-
-
Привет!
Допилил чуть PR, чтобы не было конфликтов с текущей веткой master.
Проверил у себя в проекте - работает)
Вообще мы уже довольно давно его используем - основные юзкейсы покрывает: migrate, info, repair, baseline. -
-
Всем привет.
Запускаю CH в докере, ловлю ошибку:
DB::Exception: Memory limit (total) exceeded: would use 1.87 GiB (attempt to allocate chunk of 135793963 bytes), maximum: 1.75 GiB: While executing AggregatingTransform (version 20.6.3.28 (official build))
Хотя прокидываю кастомный конфиг (и вижу что изменения применяются в /var/lib/postgresql/data/preprocessed_configs/config.xml ), но почему-то не могу никак сменить это ограничение.
Мой конфиг такой:
<yandex>
<users>
<default>
<max_server_memory_usage>4000000000</max_server_memory_usage>
</default>
</users>
<profiles>
<default>
<max_bytes_before_external_group_by>3000000000</max_bytes_before_external_group_by>
<max_memory_usage>4000000000</max_memory_usage>
</default>
</profiles>
</yandex> -
-
Сколько весит?
-
-
на диске 7ГБ вроде бы
-
Норм
-
-
select * from system.settings s where name like '%memory%';
тут все лимиты, проверьте своим пользователем -
-
-
-
профили пользователей в users.xml
max_server_memory_usage -- не пользовательский параметр -
-
-
-
хаха, лажа в доке как всегда
-
да все путаются, за пару лет разберетесь
-
-
-
-
это через табикс чтоли?
-
-
-
там наверху справа есть settings
-
поменяйте значение в поле max execution time на нужное вам
-
ну и внизу нажмите apply
-
-
нет)
-
просто этот таймаут это его ограничение)
-
-
Тут я уже не помогу) это серверная настройка
-
возможно поможет
https://github.com/ClickHouse/ClickHouse/issues/2799clickhouse-server memory settings not applied · Issue #2799 · ClickHouse/ClickHouseHello, We installed clickhouse-server on debian using the official source, and the version is latest(I guess) $ aptitude show clickhouse-server Package: clickhouse-server Version: 1.1.54390 New: ye...
-
Выделить 4-8 гб, так проще
-
какая версия КХ?
-
version 20.6.3.28 (official build)
-
-
-
т.е. в preprocessed_configs это значение появилось? /var/lib/postgresql/data/preprocessed_configs/config.xml
-
-
-
в логе пишется при старте вот так
<Information> Application: Setting max_server_memory_usage was set to 56.53 GiB (62.81 GiB available * 0.90 max_server_memory_usage_to_ram_ratio)
что у вас? -
-
-
в докере значит ограничение
-
-
-
-
-
как получить индекс в функции arrayFilter ?
-
SELECT arrayFilter((i, v) -> (v > 0), arrayEnumerate(arr), [3, 3, 3, -2] AS arr)
[1,2,3] -
спс
-
чаще всего индекс не нужен, и лучше выкрутится без него, потому что для лямбд создается копия массива
-
т.е. лучше не делать -> arr[ ... ]
- 15 August 2020 (45 messages)
-
group by в памяти хеш таблицу создает для каждой уникальной комбинации полей
насколько высоко кардинальные данные у вас там в GROUP BY ? -
Добрый день, подскажите пожалуйста, в каком релизе появится фикс дефекта https://github.com/ClickHouse/ClickHouse/pull/8911 ? Казалось бы проблема довольно серьезная - пароли от реплик в логах, рарзмеры названий директорий могут превышать 255 символов, что делает невозможным создание дата файлов на ext4, а баг почему то не считается приоритетным.Changed format for path in replicas by millb · Pull Request #8911 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the cha...
-
смотрите в pull request в merge commit
дальше в тэги
как только видите -stable или -lts значит это опубликованная версия и она есть на docker/репозиториях -
-
в 20.3 и выше уже есть
-
В докере версии 20.3.13.127 проблема воспроизводится. Названия директорий генерятся в старом формате.
-
Есть стенд где стоит сервер версии 20.5.4.40 там тоже самое- пароли в именах каталогов и их названия почти 250 символов
-
ну тогда стоит написать в тикете и @alexey-milovidov
в комментарии упомянуть на github
только сделайте docker-compose.yaml и gist.github.com с воспроизведением проблемы
чтобы точно можно было убедиться -
Здравствуйте! Поставил время 1 минуту. Но, данные из таблицы очищаются гораздо позже
-
и еще, когда удаляются данные, материализованная вьюха тоже сбрасывается
-
или я уже гоню...
-
Вообще не понимаю о чем вы. Пример покажите какие запросы выполняете.
-
под словом "удаляются данные" имеется ввиду DROP TABLE?
-
Add setting for a new format of distributed parts by alesapin · Pull Request #9653 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Bug Fix Changelog entry (a user-readable short description of the changes...
-
use_compact_format_in_distributed_parts_names
-
TTL для таблицы
-
Ttl раз в сутки удаляет. Это в доке описано
-
А выражение которое d + INTRVAL?
-
Выражение это раз в 24 часа проверяется
-
кстати вопрос такой, по ГХ не совсем понял, что это настройка на самом деле что дает? т.е. какая разница между 1 и 0?
-
Это настройка использовать или нет фичу
https://github.com/ClickHouse/ClickHouse/pull/8911Changed format for path in replicas by millb · Pull Request #8911 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the cha...
-
А в чем смысл тогда задать меньше сукток?
-
TTL парезаписывает весь парт целиком. Это очень тяжелая операция. Смысл ее делать чаще. Вот молотили диск 2 часа и можно снова начинать потому что опять записи устарели и снова мержить 2 часа.
Вы чего хотели-то? Все намного проще делается -
ну вопрос, а в чем сермяжная правда этой фичи? чтобы лечить это (https://github.com/ClickHouse/ClickHouse/issues/6402) или ещё где то помогает?
-
Чтобы убрать(скрыть) пароли из логов (имен файлов)
https://t.me/clickhouse_ru/176288 -
И была проблема со сменой паролей
-
Пароль меняется и файлы которые еще дослались застревают, потому что парль уже подходит
-
ок, а если включить её когда в distributed папке есть бины, они допосылаются после рестарта? или руками надо будет перекинуть?
-
Это не знаю
-
Хотел так: события падают в мерджетрее таблицу. Но она не помещается на диск. Поэтому ее предагрегировать, и складывать предагрегированную события в другую таблицу. А первую подчищать
-
Я вам намекал уже на engine=Null
-
Да, но я тупой. Можно, как-то поразвернутей намекнуть, плиз
-
Вам первая таблица вообще нужна? Селекты из нее делаются? Или только агрегированная нужна?
MV это триигер и он получает данные от команды insert поэтому у первой таблицы можно сделать engine=Null и все будет работать. -
Первая типа приемник, сама по себе не нужна
-
Ну вот замените ее движок просто на Null
-
Спасибо!
-
И можно использовать input function будет тоже самое только текст агрегации можно вписать в insert и не создавать mv
-
И тогда инсертить прямо в агрегированную таблицу
-
Всем привет.
Регулярно возникает проблема с переименованием таблиц.
Есть CH версии 20.5.4. Есть таблица MergeTree. В неё каждый час загружается текущее состояние данных из mysql - таблица выгружается полностью, так как по ней в мускуле идёт большое количество апдейтов.
Чтобы для пользователей кликхауса таблица не моргала, скрипт перегрузки данных делает вот так:
1) Данные из TSV грузит в {table}_new;
2) Как только данные влились, делает рокировку: RENAME TABLE {table} TO {table}_old, {table}_new TO {table};
3) DROP TABLE {table}_old;
Проблема в том, что по факту в 2/3 случаев получается очень плохо:
- целевая таблица мигает - исчезает на сотни секунд;
- иногда вообще валится ошибка WRITE locking attempt on "{table}_new" has timed out! (120000ms) Possible deadlock avoided. Client should retry. IN:RENAME TABLE {table} TO {table}_old, {table}_new TO {table}
Увеление lock_acquire_timeout ни к чему не привело - в большей части случаев RENAME всё равно не успевает выполниться, плюс целевая таблица оказывается невидна на время куполнения RENAME.
Судя по system.query_log у нас нет запросов, которые выполнялись бы более 30 секунд.
Сама по себе таблица, на которой происходит проблема - небольшая, буквально 20ГБ в Clickhouse.
Собственно вопросы:
1) Что можно еще попробовать, чтобы решить проблемы с а) видимостью таблицы во время RENAME б) больщим временем выполнения RENAME?
2) Возможно, схема с RENAME TABLE вообще не рабочая, и не надо пытаться сейчас реашать проблему из предыдущего пункта, а есть работающие устоявшиеся практики для полной перегрузки таблиц? -
-
Joined.
-
-
скажите пожалуйста, что значит
PARTITION BY tuple() -
-
спасибо!
- 16 August 2020 (32 messages)
-
Joined.
-
попробуйте alter table ... replace partition ... from ...
https://gist.github.com/den-crane/521975b5333c5dc7059bed4030f62f94
до 19.14 rename был атомарный (с global lock) и ваша схема работала, но иногда это приводило к дедлоку с зависанием КХ, сейчас пилится Engine=Atomic, но видимо еще не готов. -
Joined.
-
-
Joined.
-
Joined.
-
Joined.
-
Всем доброго дня, скажите а в чем циммес: при селектах UUID принимается нормально в where при инсертах, тоже, но вот при update надо toUUID это как ??? =)))
-
Joined.
-
-
скорее всего просто не доделано
-
Да, вероятно, ибо на гите есть об этом еще в 18году
-
Joined.
-
Joined.
-
-
из за чего такая большая нагрузка на диск? при том, что результат запроса содержит максимум 600 записей
-
какая версия КХ? результат запроса правильный? начиная с 20 ANY действует на левую и правую таблицы
-
результат запроса верный
-
и сколько записей в исходных таблицах?
-
А почему mv на таблицу где String заменены на int функцией toInt64orZero вечит почти в 2 раза больше? toInt64orZero использует NULL?
.inner.events_mv,47.21
events,28.59 -
в основной 600 при where, к нему добавленные 2 в общем кол-ве содержат 4.7KK, 1KK
-
т.е. надо как-то фильтровать ту в которой 4.7кк, КХ не использует индексы для джойна и грузит все правые таблицы целиком в память.
-
попробовал отфильтровать 2 таблицы при JOIN-е, повлияет ли это на скорость выборки?
-
-
create table L(A Int64) Engine=MergeTree order by A;
insert into L select number from numbers(3);
create table R(A Int64) Engine=MergeTree order by A;
insert into R select number from numbers(3000000);
select count() from L any left join R using A
--
3
Elapsed: 0.224 sec. Processed 3.00 million rows, 24.00 MB
select count() from L any left join (select * from R where A in (select A from L)) R1 using A;
--
3
Elapsed: 0.004 sec. Processed 8.20 thousand rows, 65.56 KB -
ок, понял, спасибо
-
скажите пожалуйста, вот этот вывод информации , после выполнения запроса:
Elapsed: 0.004 sec. Processed 8.20 thousand rows, 65.56 KB
можно ли включить его вывод в output на других клиентах? -
можно, в тех которые умеют.
Есть параметр send_progress_in_http_headers и в http хедерах прилетают значения
curl -vv 'http://localhost:8123/?send_progress_in_http_headers=1' --data-binary @testa3.sql
< X-ClickHouse-Progress: {"read_rows":"24 996 720","read_bytes":"204755840","total_rows":"38 308 864"} -
спасибо!
-
-
20.3-20.4
-
Joined.
- 17 August 2020 (337 messages)
-
Joined.
-
-
Привет всем! Хочу группировать даты по недельно. Как изменить день начала недели, например: неделя начинается со вторника, а не с понедельника ? toStartOfWeek
-
обернуть в addDays
-
AddDays(toStartOfWeek(date), 1)
-
Спасибо
-
Коллеги, привет! После обновления на version 20.6.3 с version 20.5.2.7 перестали работать внешние ODBC словари
2020.08.17 06:24:10.692951 [ 59293 ] {} <Error> ExternalDictionariesLoader: Could not load external dictionary 'default.dict_competitor_price', next update is scheduled at 2020-08-17 06:34:10: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = No message received, Stack trace (when copying this message, always include the lines below):
Кто-нибудь сталкивался? -
Joined.
-
-
как таковой уникальности нет в кх
-
если опишите какие преследуете цели, то возможно подскажут как лучше сделать
-
-
я создал таблицу и суть таблица такая, что я помечаю и сохраняю те файлы(имя, дата, uuid), которые уже были загружены в систему. Чере питон я каждый раз проверяю на всякий случай все файлы, чтобы не использовались старые данные
-
давайте я опишу, чтобы было понятней.
Есть файлы в хранилище, я от туда беру новые файлы, периодически отправляю запрос на проверку, все использованные помечаю в таблице. Вот, логика такая.
Мой скрипт проверят каждый помеченный файл по имени. Чтобы не было недоразумений.
Мне показалось не очень оптимальным чекать каждую строчку в таблице -
-
Joined.
-
-
Нет, на данный момент записываю только его имя и дату
-
-
-
при выборке всех имен из таблицы
-
-
-
есть там update =) только синтаксис странноватый, но есть
-
синтаксис приходит из логики как его использовать в КХ. Он не предназначен для частых update, скорее крайне редкая операция.
-
вполне неплохо отрабатывает и на больших таблицах, в целом порой update оч нужен чтобы не плодить зоопарк из быд, как у меня сейчас монга, касандра и кх на одном серваке... а так хочется чтобы все в кх было
-
Вроде нашел. Это через ALTER TABLE?
-
угу
-
Смотря что вы имеете ввиду под большими таблицами, по факту он перезаписывает полностью парты. Если у вас парт по сотням гигабайт, то часто их полностью переписывать странная идея
-
Зоопрак зоопарком, но различные инстррументы и БД используются в различных ситуациях
-
смотря как апдейтить и что, мне надо обновить одну строку к примеру или изменить uuid у записи одной из тысяч, в целом через alter update это работает, но я пока побаиваюсь сие использовать поэтому касандра еще живет у меня...
-
https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/replacingmergetree/
используйте этоReplacingMergeTree | Документация ClickHouseReplacingMergeTree Движок отличается от MergeTree тем, что выполняет удаление дублирующихся записей с одинаковым значени
-
и только мариадб можно гнуть как хочешь =) а при правильной настройке будет не хуже nosql =)
-
Не понял про смотря как апдейтить. Если вам в КХ нужно будет обновить одну строчку, то перезапишется весь парт при апдейте.
-
ну парты то можно разные делать, по дню, неделе, году, месяцу, развен ет?
-
Если там всё так иделаьно, зачем вам КХ?
-
если бы там было все идеально =)) никто не говорит об идеальности
-
Да, но слишком мелкие парты будут негативно сказываться. Тогда вы опять же забивать будете микроскопом
-
согласен, оэтому и не применяю там это, жду когда там все-же появится движок для таких данных, может однажды он будет =)
-
Проще использовать альтернативную логику в запросах или движки в стиле колапсинг или реплейсинг
-
Удаление и обновление данных в Clickhouse
Использование таблиц ReplacingMergeTree и CollapsingMergeTree для манипуляции данными в Clickhouse
-
О, раз заговорили про партиции. Кто-нибудь сталкивался с проблемой дублирования записи из разных парт-ов при выборке через FINAL?
Вводная. В КХ есть таблица на 100млн записей (10ГБ). Партицирование происходит по полю "дата создания".
Проблема. С недавнего времени у пользователей появилась возможность редактирования этого поля. Теперь при построении статистики одна и та же запись фигурирует в разных датах, потому что при селекте из FINAL данные мержатся внутри парт.
Если строить парты по другому полю, которое никогда не меняется, то выборка через FINAL происходит очень медленно когда этого поля нет в WHERE.
Я использую ReplaceMergeTree и читал про CollapseMergeTree, но не хотелось бы переходить на него - слишком много запросов пришлось бы переделывать. Может есть возможность решить это через подзапросы или каким-нибудь другим движком? -
когда у тебя есть таблица с пользователями или объектами где каждый день меняют, редактируют, удаляют альтернативные поля типа комментариев, телефона, мыла, адреса, это все равно не подойдет. а если удалять одну запись из парта, парт все равно может быть перечитан (хотя я не изучал этот вопрос при удалении)
-
Не понял вашу мысль про перечитан. А телефон мыло и адрес больше как словари возможно использовать.
-
о прикольно, это я еще не тестировал
-
ну что произойдет если в партиции на 100 - 200 тыщ записей сделать update одной?
-
создастся новый парт, куда запишутся данные без этой записи
-
даже если это будет справочник, удалять и вставлять новую запись, порой не всегда удобно, хотя я в паре мест применил этот подход, и мне в целом понравилось, объект в кеше все равно есть, можно и обновить через удаление
-
вот, а если сделать удаление одной из записей и вставку? в тот-же временной диапазон?
-
Вставка всегда рождает новый парт.
-
Спасибо, почитаю
-
ну вот, в целом я понимаю как надо правильно, но вот с Replacing я пока не игрался, спасибо за наводку
-
Joined.
-
Господа, помогите разобраться:
есть колонка в таблице timestamp DateTime
я делаю селект из таблицы:
SELECT
`timestamp`,
toDateTime(`timestamp`, 'UTC') AS `utc`,
toDateTime(`timestamp`, 'Asia/Hong_Kong') AS `china`,
toDateTime(`timestamp`, 'Europe/Moscow') AS `moscow`
...
и получаю 4 одинаковые даты/время...
разве оно не должно конвертиться в указанную time zone? -
возможно ваш клиент переводит принудительно в вашу TZ.
Попробуйте в clickhouse-client выполнить, или toString добавить -
сейчас попробую, спасибо.
Клиент IDE JetBrains, там выставлено FALSE в параметре use_client_time_zone, но попробую через консоль -
через clickhouse-client всё хорошо, как и должно быть. Видать IDE действительно переводит время
-
https://youtrack.jetbrains.com/issue/DBE-7770
Это старый баг датагрипа -
Joined.
-
спасибо за ссылку
-
-
А как частво вставляете в таблицу?
-
статья писалась когда еще не было alter delete
-
1 раз в минуту
-
Можно полный stacktrace и при какой операции получаете такую ошибку?
-
Code: 252, e.displayText() = DB::Exception: Too many parts (2611). Merges are processing significantly slower than inserts. (version 20.5.2.7 (official build))
-
не может
-
вставляйте кусками крупнее
-
или посмотрите сколько мерджей у вас там идет
-
на текущий момент 1000 в одну минуту
-
не чаще чем раз в секунду лучше,
либо увеличьте background pool size
или мерджи где то зависли из-за блокирующей мутации -
а Partition By Order By какой у вас?
-
как я понял 1 раз в минуту по 1000 строк
-
system.parts все скажет тогда
-
-
Привет всем! Есть ячейка с текстом , с эмозди и числами. Например: такое содержание ячейки {[эмозди] текст текст [эмозди] число}
Хочу извлечь только текст. Подскажите как это сделать. Строк очень много, в каждой ячейке эмозди уникальные. Или как заполнить первый параметр тут splitByChar( __ , ячейка)? В первый параметр нужно передать разделитель с типом стринг, а эмозди не засовывается -
если числа не нужны, alphaTokens
https://clickhouse.tech/docs/ru/sql-reference/functions/splitting-merging-functions/#alphatokenssФункции разбиения и слияния строк и массивов | Документация ClickHouseФункции разбиения и слияния строк и массивов splitByChar(separator, s) Разбивает строку на подстроки, используя в качест
-
SELECT alphaTokens('abc🙂😂a1abc');
-===
['abc','a','abc'] -
спасибо большое)
-
https://clickhouse.tech/docs/en/sql-reference/statements/alter/delete/
https://clickhouse.tech/docs/en/sql-reference/statements/alter/update/
вы вот это имеете ввиду или что то другое?
неужели после этого надобность в движках ReplacingMergeTree и CollapsingMergeTree отпала?
и что тяжелее для субд будет, проапдейтить через ALTER TABLE UPDATE
или использование этих движков?DELETE | ClickHouse DocumentationALTER TABLE … DELETE Statement ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE WHERE filter_expr Deletes data matchin
-
Ну как мы тут выше обсудили, проблема в том, что при update будет обновляться весь партишен и если он большой - это накладные расходы на иопсы и память, что скажется на скорости, более компетентные люди меня поправят - надеюсь =)
-
так вот я и хочу выяснить у компетентных людей, что лучше делать, если возникнет нужда обновлять данные.
использовать ALTER TABLE UPDATE\DELETE или движки ReplacingMergeTree , CollapsingMergeTree .
с КХ работать только только начинаю... -
движки же придумали неспроста
-
всем привет, приложение пишет в два КХ разных версий 20.5.4.40 и 19.3.5, настройки одинаковые, но в новой версии КХ system.query_log есть лог запросы, а в старой версии почему-то нет, хотя когда в старой версии подключаюсь клиентом, делаю запрос, ставлю set log_queries=1 проверяю еще раз запрос и в system.query_log вижу свой запрос, но почему-то от приложения в старом КХ нет ничего
-
если это один апдейт в год, то думаю можно и альтером, а если регулярно по тысяче в день, то лучше движки которые под это были придуманы
-
1 не обновлять или не использовать КХ
2 collapsing/replacing/aggregatingMT
3 insert-select в новую таблицу (так хоть старые данные будут целыми) или добавлять колонку.
4. отрицание
5. гнев
6. торг
7. депрессия
8. принятие
9. mutations (ALTER TABLE UPDATE/DELETE)
10. увольнение
короче если это будет частью автоматической логики - лучше не надо.
если это делается руками - можно
гарантий на мутации никаких.
при отмене получаете частично битые данные. -
все сильно зависит от кейсов применения
-
Операции ALTER UPDATE в КХ пока что нет. Если не ошибаюсь.
Если нужно что-то удалить/перезаписать в частных случаях и это не затруднительно делать руками — то merge tree хватит.
Если данные нужно систематически обновлять, то конечно нужно использовать движки. -
после 3 все пошло под откос
-
или 11. pull request на апдейты-делиты
-
оно с текущей архитектурой не вяжется. максимум можно там ввести гибридное партиционирование (например свежие данные в строках), как в Гринпламе
-
это не откос, это начало новой жизни
-
есть ALTER UPDATE, больше года как уже...
-
Я пока просто гипотетически рассматриваю и исследую возможности. )) уже уяснил, что лучше не надо. Но если вдруг бизнесу понадобится ... Придется вертеться. Вот и хочу быть готовым ко всяким сценариям. Спасибо за ответы. Понял что лучше использовать движки.
-
не отпала. ALTER TABLE UPDATE/DELETE сделаны для административной работы, типа раз в году вручную админ запускает, требования gdpr и тому подобное. Их нельзя использовать в ежедневных бизнеспроцессах.
-
Всем привет.
Подскажите, как бы проредить данные? Например есть таблица c дискретностью до 5 раз в секунду
ts (unix timestamp), value
1597081596.081 , 1
1597081596.192 , 0
1597081596.438 , 1
1597081596.678 , 0
1597081596.982 , 1
1597081597.082 , 1
1597081597.199 , 1
1597081597.371 , 0
1597081597.663 , 1
1597081597.958 , 1
Нужно оставить только по 3 значения в секунду. Желательно как-нибудь ровненько разделить по периоду. -
select intDiv(1597081596081, 333) * 333 ?
-
это все полный бред
-
вы про какой final ? select from final как раз не глядя на партиции работает
create table f (a Int64, d date, s String) engine=ReplacingMergeTree partition by d order by a
insert into f values(1, 11, '1')
insert into f values(1, 11, '2')
select * from f final;
┌─a─┬──────────d─┬─s─┐
│ 1 │ 1970-01-12 │ 2 │
└───┴────────────┴───┘ -
это не dbgrip, это jdbc
вам на самом деле нужен toString , toDateTime тут неверно использовать
SELECT
toDateTime('2000-01-01 00:00:00') timestamp,
toString(`timestamp`, 'UTC') AS `utc`,
toString(`timestamp`, 'Asia/Hong_Kong') AS `china`,
toString(`timestamp`, 'Europe/Moscow') AS `moscow -
да, с этим я разобрался... теперь пытаюсь понять почему на 2х серверах с одинаковыми конфигами SELECT timezone() возвращает разные результаты
-
может там выставлены разные зоны на самом серваке?
-
в линуксе date что возвращает?
-
-
а на втором?
-
-
-
-
ну чудес не бывавет же, а данные точно одинаковые?
-
-
а что select timezone() возвращает?
-
ClickHouse client version 19.13.2.19.
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 19.13.2 revision 54425.
vs70 :) select timezone();
SELECT timezone()
┌─timezone()────┐
│ Europe/Moscow │
└───────────────┘
1 rows in set. Elapsed: 0.002 sec.
ClickHouse client version 19.15.2.2.
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 19.15.2 revision 54426.
vs35 :) select timezone();
SELECT timezone()
┌─timezone()─┐
│ UTC │
└────────────┘
1 rows in set. Elapsed: 0.010 sec. -
cd /etc/clickhouse-server/; grep -R timezone *
-
а конфиги точно применились? может там не ребутали сервак после правок?
-
сложно сказать наверняка... админы говорят что точно конфиги применялись
-
есть варик для теста рестартануть?
-
/etc/clickhouse-server]$ grep -R timezone *
bck/config.xml: <!-- <timezone>Europe/Moscow</timezone> -->
config.xml: <timezone>UTC</timezone>
config.xml.bak: <!-- <timezone>Europe/Moscow</timezone> -->
config.xml.rpmnew: <!-- <timezone>Europe/Moscow</timezone> -->
config.xml.rpmsave: <!-- <timezone>Europe/Moscow</timezone> --> -
зачем столько бакапов конфига?
-
там где почему то Moscow
/etc/clickhouse-server]$ grep -R timezone *
config.xml: <timezone>UTC</timezone> -
я разработчик, сие мне не ведомо =)
-
тоесть обновление кх и установка из репы это не ваше? =) как интересно =)
-
ну вот да, есть специально обученные люди для этого, с соответствующей ответственностью и банкой вазелина
-
тогда зачем вы паритесь про дату? отдайте этот вопрос админам пусть решают, но я если честно не понимаю как так у вас получается, я тут один и кх и касандру и монгу и ребит и кластер держу и еще и софт пишу под систему =))
-
вы расскажите людям что не надо config.xml менять, свои ченжи можно делать в отдельных файлах
https://gist.github.com/den-crane/4d67e1d4cc49de66cd36d1d76a2b14a5gist:4d67e1d4cc49de66cd36d1d76a2b14a5GitHub Gist: instantly share code, notes, and snippets.
-
вы крутой. Я вот вообще только КХ админить еле успеваю и больше ничего не делаю
-
когда сам себе разраб и админ, кх админить и не надо, настроил и рабоатет главное не трогать =)) как икасандру с монгой, и ребит один раз натюнил, рабоатет - не падает, дальше уже софт пишу
-
я пока думаю что из-за разницы в версиях.
в issue нашел упоминания про TZ переменную окружения, её на серваках нет, но что бы попробовать перезапускать надо... пока хочется понять что не так, что бы 10 раз не рестартить.
Думаю локально версию 19.13.2 в вагранте поднять и посмотреть как оно... но что-то погряз в issue на гитхабе =) -
-
я проще сделал, чтобы не натыкаться на все подбные такие грабли, я в КХ держу лонг (UTC timestamp) а на клиенте выдаю в нужной ему зоне
-
TZ в 19.13 еще не использовалась
-
ну в "своих" таблицах я юзаю uint а не dateTime... только что-то не задумывался почему я так сделал... рефлекс наверное =)
-
ага, то есть в эту сторону можно не копать, спасибо
-
скорее всего кто-то поменял конфиг без рестарта.
-
DateTime это тот же UIn32 -- UnixTimestamp (в UTC)
-
ну это я спрашивал, так же как точно ли эти конфиги юзаются... говорят что да, всё с их стороны норм
-
поддерживаю
-
да, но не все разработчики осознают что туда можно вставить и без правки на нулевую зону, я везде где делаю вставку сначала свожу к нулевой зоне и только потом вставляю.
-
-
не, не все, тут на соседнем канале про ios холивар на два дня был, что это не информативно и плохо держать в бд лонги а не стринги с читабельной датой =))
-
Так если нужно делать toStartOfHour или год прибавить, все равно DateTime нужен
-
да да =) я еще на ios и андройд пишу, у меня несколько своих приложух в маркете =))
-
а разве в лонгах это не сделать?
-
ну это субъективно всё и дело привычки... я в одной компании работал, там был свой алгоритм генерации уникального ID, типа UUID но по своему и в него зашивалась метка времени, которую можно вытащить.
То есть в таблицах не было колонок типа created_dt — всё в ID зашито.
Хочешь знать дату - вытаскивай, вот функции написаны -
так кастить надо, касты могут замедлять и сильно
-
в первой версии uuid да и сейчас тоже, метка времени тоже имеется =)
-
ну тут да... если надо манипулировать то удобней наверняка.. у меня же метка создания, просто информация
-
а её вроде вытащить нельзя...?
-
возможно, но так какdatetime у нас в целом и так лонг, думаю не сильная проблема, но лучше прям в интах отнять год или час =)
-
такие велосипеды это не про бигдату. В нормальной системе даже UUID выкинут потому что тормозит
-
ну бигдата это вообще отдельная вселенная со своими законами
-
насколько я знаю можно
-
про високосную секунду и 30 ферваля вы явно не в курсе
-
любопытно... надо будет поискать/почитать
-
да в курсе конечно и уже есть свой костылик по этому =))
-
вот в яве к прмиеру и в плюсах у класса UUID есть timestamp
-
https://www.youtube.com/watch?v=-5wpm-gesOY
вас ждет этоThe Problem with Time & Timezones - ComputerphileA web app that works out how many seconds ago something happened. How hard can coding that be? Tom Scott explains how time twists and turns like a twisty-turny thing. It's not to be trifled with! A Universe of Triangles: http://www.youtube.com/watch?v=KdyvizaygyY LZ Compression in Text: http://www.youtube.com/watch?v=goOa3DGezUA Characters, Symbols and the Unicode Miracle: http://www.youtube.com/watch?v=MijmeoH9LT4 More from Tom Scott: http://www.youtube.com/user/enyay and https://twitter.com/tomscott http://www.facebook.com/computerphile https://twitter.com/computer_phile This video was filmed and edited by Sean Riley. Computerphile is a sister project to Brady Haran's Numberphile. See the full list of Brady's video projects at: http://bit.ly/bradychannels
-
ребят, столкнулся с такоой проблемой
есть база данных которая по движку MySQL конектится к mysql
оригинальный мускуль больше недоступен и я хочу удалить этот коннект из КХ
Но кх на это ругается с ошибкой.
Code: 1000. DB::Exception: Received from my_ch_node.com:9000. DB::Exception: There was an error on [my_ch_node.com:9000]: Poco::Exception. Code: 1000, e.code() = 2013, e.displayText() = mysqlxx::ConnectionFailed: Lost connection to MySQL server at 'handshake: reading inital communication packet', system error: 11 ((nullptr):0) (version 20.5.2.7 (official build))
Кто-то в курсе как я все же могу удалить этот конект?) -
спасибо, поковыряю плюсы на эту тему, оно привычней
-
-
detach / rm aaa.sql
-
при детаче та же ошибка
-
значит остановить КХ (возможно kill-9) и rm ....sql
-
посмеялся от души, да весь этот цирк я проходил еще в 2009м =))
-
а потом Россия решила не переходить на часовые пояса, а потом несколько поясов было убрано, да я понимаю истерику этого парня, это правда взрывает голову
-
так работает
спасибо ) -
Вот к примеру у касандры
-
ого! спасибо! это весьма интересно
-
-
-
да не за что, стучи, всегда рад.
-
Коллеги! А у меня вот есть простой materialized view, там групбаи всякие на основе 1 таблицы. И вот по прошествии времени в нем конечно строки добавляются, но все данные кроме колонки по которой groupby, получаются нули. Штоделоц!
-
я не применял такие, но у того-же постгре при group by все колоник которые туда не попадают нужнаются в исчислении, чтото типа max, min, sum etc
-
DDL писать
-
вот версия:
Connected to ClickHouse server version 20.3.7 revision 54433.
вот запрос:
CREATE MATERIALIZED VIEW klmn
(ts DateTime, dt Date, cntx Int32, sumx Float64) ENGINE = MergeTree() order by (ts) SETTINGS index_granularity = 8192
POPULATE
as
select a.ts, toDate(a.ts), count(), sum(a.size * a.cnt)
from pqrs a
group by a.ts; -
если я верно помню, то не покажется только одно значение toDate
-
Хотя я может и заблуждаюсь
-
а если просто сделать селект ? select a.ts, toDate(a.ts), count(), sum(a.size * a.cnt)
from pqrs a
group by a.ts; -
не, ну я конечно могу, но в pqrs там всё норм
-
и опять-таки, там приходит count() == 0,хотя ts такой есть, это ли не странно?
-
в матвью
-
(в селекте или не придет или придет > 0 )
-
я кажется что-то пропустил =) from pqrs a - говорит от том, что вы делаете выборку из таблицы pqrs и даете ей имя a =) разве нет? или я чет туплю под вечер уже
-
это же алиас
-
угу
-
не все норм, я не сразу прочел все что вы написали выше вот и тупанул
-
надо использовать aggregatingMT со -state колонками наверное, если постоянно данные довставляете...
-
вот, за этот намек спасибо, почитаю, видать как раз оно
-
по именам полей вставка идет,
dt <> toDate(a.ts)
cntx <> count()
и немного странный движок MergeTree для MV -
я не понял "по именам полей вставка идет" - то есть надо обязательно давать алиасы вычисленным значениям?
-
да конечно
-
но ведь вставилось в основное тело (populate)
-
+
-
toDate(a.ts) as dt
-
хаха, ну 1888й косяк, из-за отсуствия тестов на это
-
ясно, теперь кажется ситуация вообще ясна
-
и count() as cntx
-
да, спасиб