- 01 July 2018 (13 messages)
-
Вроде бы insert атомарен до 1 000 000 строк
-
Впрочем, это относится к движкам *MergeTree
-
Может кто видит почему ругаеться КХ
-
ENGINE = ReplicatedMergeTree('/clickhouse/tables/metrics/{shard}/Metrics', '{replica}')
PARTITION BY (floor(timestamp/86400)) ORDER BY (appId, metricId, timestamp)
SAMPLE BY (appId, metricId, timestamp); -
Sampling expression must be present in the primary key
-
Согласно этому https://github.com/yandex/ClickHouse/blob/master/dbms/src/Storages/MergeTree/MergeTreeData.cpp#L125yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data. Contribute to yandex/ClickHouse development by creating an account on GitHub.
-
Должно работать вроде
-
Выражение сэмплирования - одно, не кортеж.
-
ага
спсб -
-
metricId в моем случае получается
-
спсб за презентацию
-
- 02 July 2018 (211 messages)
-
/stat@combot
-
Подскажите по clickhouse, хочу использовать его как time series database. У меня собираются счетчики по 250 000 портам 4 раза в час. Это уже 24 миллиона записей в месяц. За год это будет 720 000 000 записей. Я думаю нам места таким образом не хватит. Раньше мы использовали RRD для этих целей, он столько места не занимал и была возможность посмотреть графики за год-два, сейчас просто RRD не справляется. Можете что-нибудь посоветовать по данной проблеме?
-
-
-
Можно ссылку, пожалуйста, или расшифровку?
-
-
noc / noc
GitLab Enterprise Edition
-
SELECT * FROM system.settings WHERE changed = 1 ?
-
-
а в чем проблема селектом только новый день скажем забирать ?
-
-
-
А почему селектом, а не FREEZE PARTITION?
-
-
-
на highload.ru была статья по бекапам, емнип
-
А там было про бекапы зукипера вместе с кх?
-
Просто сейчас лично у меня есть проблемы с пониманием, как восстанавливать весь кластер из бекапа...
-
ну каждый день бекапите предыдущй в итоге у вас есть все дни
-
какое тут остальное ?
-
Если у вас есть информация о партиции(партициях) в зукипере и хотя бы одна живая реплика - все остальные утащат данные с неё.
-
Я хочу защититься от случая падения зукипера
-
Вместе с датацентром :-)
-
Просто у меня уже был случай съезжания крыши у зукипера и не хотелось бы повторять.
-
ну тут надо распределенный зукипер просто
-
Возможны проблемы со связностью в сильно распределённом зукипере...
-
ну вы не сильно распределяйте по чуть чуть
-
-
-
Собственно сам вопрос следующий — пользуюсь версией 1.1.54385. Проставил пользователю <profile> и захожу им сначала через native интерфейс (clickhouse-client использую) — вижу настройки профиля, захожу через http интерфейс (использую clickhouse-cli от hatarist) — вижу дефолтные настройки... Такое ощущение, что <profile> при обращении через http не применяется и <readonly> пользователь становится не readonly
-
Пофикшено в 1.1.54388, см. changelog:
>Настройки профиля пользователя не применялись при использовании сессий в HTTP-интерфейсе. -
Привет!
Используется кворумная запись, для чтения стоит по дефолту select_sequential_consistency=1. После перехода на следующий месяц (партиционирование таблицы по месяцам), предыдущий перестал попадать в результаты селекта (но никаких ошибок не кидает). Ставим select_sequential_consistency=0 - данные видны. Запись идет нормально. Это баг или мы что-то неверно настроили? -
Круто, спасибо :) Ещё бы tag добавили в hub.docker.com, а то там только в latest и 1.1 залили новую stable
-
Кто-то может подскажет best practice алгоритм по расширению кластера (добавление нового шарда)?
Текущий кластер:
<main_cluster>
<shard>
<weight>1</weight>
<internal_replication>false</internal_replication>
<replica>
<host>ch-1-1</host>
<port>9000</port>
</replica>
<replica>
<host>ch-1-2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<weight>1</weight>
<internal_replication>false</internal_replication>
<replica>
<host>ch-2-1</host>
<port>9000</port>
</replica>
<replica>
<host>ch-2-2</host>
<port>9000</port>
</replica>
</shard>
</main_cluster>
такой алгоритм "сломает" кластер?
- создать все таблицы на новом шарде
- добавить на все сервера (начиная с серверов нового шарда)
<shard>
<weight>1</weight>
<internal_replication>false</internal_replication>
<replica>
<host>ch-3-1</host>
<port>9000</port>
</replica>
<replica>
<host>ch-3-2</host>
<port>9000</port>
</replica>
</shard>
Нужно ли пересоздавать Distributed таблицы на "старых" шардах? -
не нужно
-
т.е. воссоздать схему на новых и добавить их в конфигурацию кластера достаточно безопасное действие? версия КХ 1.1.54385 сама подхватит новый шард или требуется перезапуск?
-
безопасно
-
насколько помню само подхватывает конфиг кластера
-
-
Добрый день! подскажите пожалуйста, есть ли готовые инструменты для создания схемы таблицы на основе protobuf описания и драйвер, который может лить данные из протобуфа?
-
Насколько мне известно готовых инструментов нет. Нативная поддержка protobuf и Parquet есть в Roadmap на Q3 2018.
-
ммм, а вот например запихнуть туда пачку ip и получить соответствие ip<->подсеть? это можно как-то сделать через, условно говоря, where IP IN (ip_trie_clause)
-
т.е. без цикла по запихиваю одного айпи пачками (извините если вопрос совсем страшный)
-
Извините что туплю
-
Может кто видит почему семплинг не помогает по скорости?
-
SELECT sum(value)
FROM Metrics
SAMPLE 1 / 10
┌───────────sum(value)─┐
│ 17577274172239137000 │
└──────────────────────┘
1 rows in set. Elapsed: 9.238 sec. Processed 3.69 billion rows, 44.23 GB (398.96 million rows/s., 4.79 GB/s.)
tsf-data11.us.sematext.com :) select sum(value) from Metrics;
SELECT sum(value)
FROM Metrics
┌───────────sum(value)─┐
│ 17577889402538699000 │
└──────────────────────┘
1 rows in set. Elapsed: 7.030 sec. Processed 3.69 billion rows, 29.48 GB (524.30 million rows/s., 4.19 GB/s.)
tsf-data11.us.sematext.com :) select sum(value) from Metrics SAMPLE 1/100;
SELECT sum(value)
FROM Metrics
SAMPLE 1 / 100
┌───────────sum(value)─┐
│ 17578875733901701000 │
└──────────────────────┘
1 rows in set. Elapsed: 9.241 sec. Processed 3.69 billion rows, 44.23 GB (398.87 million rows/s., 4.79 GB/s.)
tsf-data11.us.sematext.com :) show create Metrics
SHOW CREATE TABLE Metrics
┌─statement───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ CREATE ... ORDER BY (appId, metricId, timestamp) SAMPLE BY metricId SETTINGS index_granularity = 8192
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
1 rows in set. Elapsed: 0.001 sec. -
Судя по сумме семплирования не происходит
-
-
Не понимаю вопрос. ip_trie ищет подсеть с самым длинным подходящим префиком.
-
Joined.
-
Т.е. в ip_trie может быть несколько подходящих под условие подсетей. Типа 10.0.0.0/8 и одновременно 10.1.2.0/23 . И если спросите про адрес 10.1.2.3 то выберет вторую подсеть, как более "специфичную" хотя первая тоже подходит.
-
https://github.com/yandex/ClickHouse/issues/2576#issuecomment-401773171 И спасибо, @ztlpn :)No Docker Hub tag created for v1.1.54388 #2576
It looks like the new images were pushed to latest, 1 and 1.1, but there wasn't a new 1.1.54388 tag created. https://hub.docker.com/r/yandex/clickhouse-server/tags/
-
Спасибо) может быть попозже еще спрошу если протуплю
-
День добрый! Можно ли для клика использовать zookeeper с kerberos? Если да, то где прочитать о настройке?
-
-
господа, а как truncate table сделать?
-
truncate по партишенам
-
сорян ...drop partition
-
мне целиком табличку почистить
-
Если туда не пишется ничего - подропать все партишны и всё
-
не совсем понял вопроса
это поле имеет значение от 1 до 10000 и распределение не совсем равномерное
Ну тоесть значении 2 может быть миллион а 2002 может быть 20 миллионов -
-
теперь понял
-
в таком случае все равно должно работать, может немного криво из-за неравномерного распределения
-
Это баг.
-
судя по запросам семплинг вообще не работет
-
-
упс
-
это все поменяло
-
-
и как быть если надо аггрегировать по метрикИд но значении может быть так много что нужно только по 10% например
-
-
так и есть
-
это как?
-
-
как эту част переписать?
-
ORDER BY (appId, metricId, timestamp)
SAMPLE BY (metricId); -
я понимаю что при создании я имею в виду что как семплтинг ключ написать
-
вместо metricId
-
inthash32(metricId) ?
-
-
-
и это же выражение в первичном ключе?
-
-
а условие metricId=xxx будет при таком ключе по ключу отрабатывать?
ORDER BY (appId, inthash32(metricId), timestamp)
SAMPLE BY (inthash32(metricId)); -
Скорее inthash32(metricId)=inthash32(xxx)
-
или в запросе надо будет писать inthash32(metricId)=xxx ?
-
уфф, красота будет
-
-
понял
спсб -
спсб большое
-
уфф только что понял что мне это не подходит
У меня в запросе есть условие *metricId=2* например и мне надо чтобы сумма была построена не по всем точкам а только по 10% например
Получается мне семплирование по таймстемпу надо но это вроде бы не есть гуд -
-
Всем привет!
А где почитать про ORDER BY и как его лучше указывать?
Вот допустим у нас есть Immutable Event Log по userId с eventType и eventId, а так же timestamp (DateTime).
Мы используем ReplacingMergeTree (на случай если два раза одно и тоже событие запишется в ClickHouse), на данный момент вот так:
ENGINE = ReplacingMergeTree PARTITION BY toYYYYMM(timestamp) ORDER BY (userId, eventType, eventId)
на сколько это правильно \ нет? ORDER BY очень сбивает с толку названием, я так понимаю он тут больше как кассандровский PRIMARY KEY, не? -
зависит от того как вы потом будете все это читать.
-
Планируем отдать на Business Analytics
-
-
-
-
-
-
-
-
-
А вынесение event_id в PKEY не сожрёт всю память?
-
не совсем тогда ясно как обеспечить replacing поведение
-
-
-
ORDER BY - колонки или список колонок, по которым в MergeTree (первичный ключ):
- данные всей таблицы упорядочены
- создан разреженый индекс
- в "слопывающихся" движках данные слопываются по этому ключу -
Сформулирую полный вопрос с вашего позволения.
Есть
CREATE TABLE XXX
...
ORDER BY (appId, metricId, timestamp)
SAMPLE BY (metricId);
Есть запросы вида
SELECT SUM(v) FROM XXX where appId=1 and metricId=1 and timestamp>YYY and timestamp<ZZZ;
Для некого metricId данных может быть очень много и запрос выполняется долго. Думали прикрутить семплинг для этого
SELECT SUM(v) FROM XXX SAMPLE 1/10 where appId=1 and metricId=1 and timestamp>YYY and timestamp<ZZZ
Но похоже все работет не так как думалось
Нужно заводить искусственную переменную sampleId значения которой равномерно будут распределены от 0 до 9
И делать так
CREATE TABLE XXX
...
ORDER BY (appId, metricId, sampleId, timestamp)
SAMPLE BY (sampleId);
Но тогда запросы без семплирования будут работать медленнее ТК мы "запохабили" немного первичный ключ, верно?
Есть какой-то способ ровнее? -
-
Учитывая что у нас партицирование по дням то не должно быть быстрее как я понимаю
-
на уровне партиции отрежется лишнее и в ключ добавлять день не надо
-
Вот с семплингом засада как-то после чтения документации по другому думалось оно работает, а сейччас вроде как пришло понимание а что делать непонятно
-
Кто то нибудь в курсе появились ли вложенные структуры, т.е вложенность более одного уровня ? Вроде обещали эту функциональность завести в первом квартале 2018 года
-
Кликхаус в курсе :) Лучше такие вещи у него спрашивать: CREATE TABLE xxx_nestes
(
a UInt32,
b Array(Array(Tuple(String, String)))
)
ENGINE = Log
Ok.
0 rows in set. Elapsed: 0.006 sec.
:) insert into xxx_nestes values (1, [[('hello','world'),('foo','bar')],[('','')]] );
INSERT INTO xxx_nestes VALUES
Ok. -
Я имел ввиду структуру Nested
-
Я у КХ уже спрашивал) не работало) но из роуд мапа это фича исчезла
-
а чем массивы массивов не подходят?
-
А вы посмотрите на это с другой стороны: вот у вас есть черезчур много данных. На каком основании вы предпочли бы отбросить бОльшую их часть, так чтобы их качество не ухудшилось? На основании metricID явно бессмысленно, если вы хотите для конкретной метрики данные выбирать. Т.е. берем все записи для данного metricID и обрасываем из них такую часть для которой?..
-
Многомерные массивы не придерживаются для таблиц типа mergetree
-
Nested - это только syntax sugar для нескольких параллельных таблиц.
-
Извините, но кликхаус с вами не согласен :) :
:) create table xxx_nestes2 ( a UInt32, b Array(Array(Tuple(String,String))) ) Engine = MergeTree ORDER BY a;
CREATE TABLE xxx_nestes2
(
a UInt32,
b Array(Array(Tuple(String, String)))
)
ENGINE = MergeTree
ORDER BY a
Ok.
0 rows in set. Elapsed: 0.007 sec.
:) insert into xxx_nestes2 values (1, [[('hello','world'),('foo','bar')],[('','')]] );
INSERT INTO xxx_nestes2 VALUES
Ok.
1 rows in set. Elapsed: 0.002 sec. -
А что будет работать эффективнее, 2 таблицы с джоином или таблица с nested структурой)
-
Это не мои слова, так в доке написано, видимо уже устарело)
-
Ну да, получется или rand()/10=0 использовать или sampleId добавлять
Верно? -
Если данные всегда предполагается использовать совместно (т.е. те данные которые в нормальной форме были бы в правой таблице - сами по себе не используются, а только в сочетании с левой таблицей) - то по моим наблюдениям Nested / Array всегда быстрее.
-
Такая ситуация и складывается
-
А как можно осуществлять эффективный поиск по многомерным массивам ?
-
Допустим у меня есть древовидная структура, сессия -> хиты -> товары
-
В одной сессия несколько хитов, в одном хите несколько товаров
-
Ну рандом всегда остается как запасной вариант, для него в принципе и SAMPLE BY не нужен (правда результаты будут недетерминированные если этот rand не хранить физически). Но часто например можно отсеять по какому-то иному признаку, например id пользователя.
-
timestamp%10=0 детерминированно будет, но что-то меня смущает
скорости не даст, читать все равно все -
Т.е. если пользователей много (или так МНОГО), то даже если половину их выбросить статистически картина меняется мало. А вот если выбросить случайную половину событий у случайных пользователей - то характерестики данных могут пострадать.
-
в моем случае можно случайно выбросить
-
Тогда может проще всего выкинуть просто определенный интервал времени? Просто заузить день? Или от каждого часа взять по 10 мин?
-
неправильно выразился
как раз каждое 10 по времени надо оставить например -
Joined.
-
допустим 100000 измерении в минуту
и так 30 дней
можно оставить 100 измерении в минуту но каждую минуту оставить -
извините за двусмысленность
-
А может вам подошел бы GraphiteMergeTree?
-
Оно как раз для похожих задач сделано.
-
Всем привет! Подскажите пожалуйста, а выражение "... not in ( select ... from table)" рабочее? Что-то у меня не получается заставить это работать.
-
Ну вариантов немного на самом деле - или функции высшего порядка или array join. Как вариант - их сочетание.
-
Звучит как костыль, на самом деле многомерная Nested структура бы решила все проблемы, интересно все таки услышать от мейнтейнеров будет ли все таки реализована это фича
-
Привет!
CREATE TABLE test
ENGINE = Log AS
SELECT arrayJoin([1, 2, 3]) AS a
SELECT
b,
b NOT IN
(
SELECT *
FROM test
)
FROM
(
SELECT arrayJoin([1, 2, 3, 4]) AS b
)
┌─b─┬─notIn(b, _subquery1)─┐
│ 1 │ 0 │
│ 2 │ 0 │
│ 3 │ 0 │
│ 4 │ 1 │
└───┴──────────────────────┘ -
Должно быть рабочее. Если какой-то конкретный кейс не работает - покажите запрос. (там относительно недавно допиливали оптимизации, чтобы primary key использовался).
-
Не понимаю в чем проблема :)
-
Спасибо за ответ! Мария, можете уточнить, а как not in использовать в секции where?
-
Также
SELECT b
FROM
(
SELECT arrayJoin([1, 2, 3, 4]) AS b
)
WHERE b NOT IN
(
SELECT *
FROM test
)
┌─b─┐
│ 4 │
└───┘ -
Супер! И последний вопрос, могут ли в массиве быть строки, а не числа?
-
-
Мне не очень нравится привязка данных к позиции, у меня планируется около 70 полей для вложенной структуры, смекаете ?)
-
Сейчас почитаю Спсб
-
CREATE TABLE sessions (
sessionid UInt32,
hits_hitid Array(UInt32),
hits_productids Array(Array(UInt32))
) Engine = MergeTree ORDER BY sessionid;
INSERT INTO sessions VALUES ( 10, [101,102,103], [ [1011,1012,1013,1014], [1021,1022], [] ] );
INSERT INTO sessions VALUES ( 20, [201,202,203], [ [2011,2012,2013,2014], [2021,2022], [] ] );
SELECT sessionid, hitid, productid
FROM
( SELECT sessionid, hitid, productids
FROM sessions
ARRAY JOIN
hits_hitid as hitid,
hits_productids as productids
)
ARRAY JOIN productids as productid; -
вам все равно надо будет разложить их в 70 колонок
-
Это диалог из жанра "ехать или шашечки". :)
-
+1. Чтобы записать Nested-структуру по http, фактически формируется инсерт с несколькими колонками на каждую nested-колонку
-
Мария, вот такой запрос не работает(отрабатывает, но в таблице есть дубликаты), вы не могли бы подсказать что я делаю не правильно: insert into table1
select ...
from table2
where table2.id not in (select id from table1)
group by table2.id -
Кстати, попробуйте выполнить SHOW CREATE TABLE для таблицы содержащей Nested колонку :)
-
Не соглашусь с вами) сейчас у меня вся древовидная структура просто сложена в большую плоскую таблицу, и в принципе меня это устраивает , но меня мучает сомнения что nested структура будет работать быстрее
-
ну залейте так и так и проверьте
-
А как у вас получилось древовидную струкутуру запихать в большую плоскую таблицу? Т.е. в этом примере с сессиями-хитами-продуктами у вас столько строк сколько продуктов во всех хитах каждой сессии? Или как?
-
Все верно
-
А что значит "не работает"? Какой exception отдает БД?
-
Очень интересный момент
-
Никакой. Все вставляет, только в таблице есть дубликаты, а их быть не должно исходя из запроса.
-
Не буду вас пытать, почему для всех полей в Nested структуре у них тип array
-
Тут все зависит от запросов. Если у вас для большинства запросов нужен самый глубокий элемент вашей древовидной структуры (т.е. в том примере - продукты), и база с этим справляется - то ничего менять не нужно. "Работает? - не трогай!".
-
У нас например значительно больше запросов выполняются на более высоких элементах этой структуры, и если бы мы попробовали все сделать плоско - то это требовало бы постоянных GROUP BY, и увеличивало бы количество строк раз в 10. Т.е. было бы больше данных, медленнее процессинг. Для нас такой вариант ну вообще никак не подходит.
-
Это позиция на текущий момент, но с ростом количества данных, думаю не лучший вариант
-
Вы читаете мои мысли) поэтому и пришёл сюда с этим вопросом
-
Потому что Nested - это просто syntax sugar для набора таблиц, размер которых совпадает.
-
На данный момент большинство запросов по хитам, т.е это не самый глубокий уровень, но чем больше период тем тяжелее расчеты
-
Наконец то я понял о чем вы говорите) благодарю )
-
Ну вот на таком уровне где у вас большинство запросов и оставляйте стуктуру плоской. Т.е. просто добавить к хитам sessionid а продукты храните в массиве. И никаких проблем со вложенностью не будет.
-
+1
-
Еще как вариант думаю завести materialized view и вставлять туда только 10% данных.
На размере диска почти не скадется зато можно будет тяжелый запросы для которых точность не критична перенапрявлять туда.
Норм идея? -
Ну или matview в таблицу с GraphiteMergeTree :D
-
GraphiteMergeTree как я понял требует определенной структуры таблицы + материализованное представление мне понятнее и управление тем что туда должно вставляться как то через ДДЛ нагляднее
-
-
Правильно. См. https://github.com/yandex/ClickHouse/issues/2135Support Arrays in External Dictionaries · Issue #2135 · yandex/ClickHouse
I had a conversation with @alexey-milovidov in Telegram today about supporting arrays in external dictionary attributes. A good use case might be something like Stack Overflow where users can updat...
-
-
люди, .NET-овский драйвер падает с ошибкой "Max query size exceeded"
-
где в доках прочитать про ограничение?\
-
Where should I specify max query size? · Issue #2529 · yandex/ClickHouse
Hi, I would like to ask. Where can I increase max_query_size parameter? I tried to create entry in config.xml (<max_query_size>1000000</max_query_size> but it didn&#...
-
-
-
Да, если добавить в команду создания MV слово POPULATE (пока MV будет создаваться, вставляемые в исходную таблицу данные не попадут в MV)
-
О, спасибо!
-
Советую при использовании MV сначала создать обычную таблицу MergeTree со структурой запроса. И прицепить MV к этой таблице
-
Тогда вы сможете например отцепить MV, изменить таблицу и обратно прицепить MV
-
-
-
yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data.
-
-
-
-
-
А скажите пожалуйста почему таймстампы в примерах хрянятся как числа а не как честные datetime. Есть какая-то хитрость?
-
ну таймстемп потому что число
-
А технически в этом есть преимущество какое-то? Просто я только учусь мыслить кликхаусом, у меня сейчас даты честные...
-
Ну таймстемп это число, везде, о каких преимуществах может идти речь?
-
очень удобно и нативно можно даты сортировать и вычитать.
Это unixtime.
И как бы, вы сами спрашиваете о таймстампе, это именно число -
Они и типизированные также сортируются а при вычитании секунды получаются...
-
unixtime можно в любом языке складывать и вычитать и не париться о тонкостях парсинга даты или ещё чему.
Жизнь не только в кликхаусе существует -
кликхаузный datetime всё равно инфу о часовых поясах не хранит, зато вы можете поиметь проблем, о чём в доке написано
То есть, при работе с датой в виде текста (например, при сохранении текстовых дампов), следует иметь ввиду о проблемах с неоднозначностью во время перевода стрелок назад, и о проблемах с соответствием данных, при смене часового пояса. -
Вот с этим ужо воюю, вроде бы победил...
-
я пока на самом деле сам не представляю что делать, если у кого-то из правительства айфон поломается и он снова часы решит подвигать.
Склоняюсь к тому, что всё абсолютно буду хранить в UTC, а костыли уже на стороне приложения иметь -
Вот я тоже все в utc. Только как datetime...
-
Ещё интересные статейки есть? Очень интересный пример, показано чем заменить оконные функции...
- 03 July 2018 (140 messages)
-
-
bar?
https://clickhouse.yandex/docs/ru/functions/other_functions/#bar -
-
-
так и не нашел где выставить max_query_size в настройках. в config.xml доавляю в корневой элемент yandex, рестартую клинхаус и пофиг
-
нашел - надо в users
-
Всем привет! Начала расти память и пул-таски на кластере Кликхауса - вот скрин https://yadi.sk/i/RwkO1fqZ3YhuXg - а после и ноды начали падать совсем, и перестает отвечать БД.
Нагрузка на кластер не выростала извне, количество запросов было такое же, как и примерно последние два месяца. Но вот сегодня что-то случилось непонятное. Может кто-то с таким сталкивался или есть примерные причины происходящего роста графиков и падений нод? -
посмотрите логи и топ на сервере
-
Кстати, а вот чем можно объяснить такое:
-
-
Запросы на узлы раскидываются равномерно, объём места в этих репликах также изменяется синхронно, как и нагрузка на процессор.
-
Да, версия - 1.1.54381
-
После рестарта проблемного узла какое-то время всё нормально, потом снова начинается жор.
-
Регулярно с такой же проблемой сталкиваемся, и решения не нашли.
-
Выжирает память в ноль и падает
-
А какие настройки меняли?
-
-
При попытки использовать DELETE для таблицы MergeTree пишет такую ошибку
Received exception from server (version 1.1.54388):
Code: 48. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Mutations are not supported by storage MergeTree.
Тогда вопрос: а для каких движков поддерживается DELETE? -
-
А почему для MergeTree не поддерживается? Всмысле разве MergeTree и ReplicatedMergeTree не одного семейства?
-
Возможно он сохраняет данные в зукипере
-
-
Лично у меня настройки дефолтные в смысле кешей. То есть, лежит себе config.xml, а что надо - меняю в config.d
Пока понадобилось поменять - listen, логирование, макросы и вообще репликацию и зукипер. Для пользователей поменял лимит по-умолчанию, чтоб запросы влазили в память. -
А что поводу словарей? Может там утечка
-
-
словарей нет
-
зомбей тоже
-
SELECT
name,
value
FROM system.settings
WHERE changed = 1
ORDER BY name ASC
┌─name─────────────────────────────┬─value───────┐
│ background_pool_size │ 48 │
│ connect_timeout_with_failover_ms │ 1000 │
│ insert_distributed_sync │ 1 │
│ load_balancing │ random │
│ max_memory_usage │ 10000000000 │
│ use_uncompressed_cache │ 0 │
└──────────────────────────────────┴─────────────┘ -
┌─name───────────────────┬─value──────┐
│ load_balancing │ random │
│ max_memory_usage │ 4000000000 │
│ use_uncompressed_cache │ 0 │
└────────────────────────┴────────────┘ -
Как-то искуствено выглядит, ведь для друг операций разницы нет между ними
-
-
только буферы
-
+1
-
Общий объём точно меньше, чем сожранное. Где-то раз в 10, если не в 50.
-
народ, добрый день
-
что-то запамятовал
-
как посмотреть запрос у материализованой вьюшки?
-
-
неа
-
показывает только структуру
-
самого запроса не видно...
-
-
как бы ту...
-
-
-
все, нашел
-
спасибо
-
Скоро для нереплицированных MergeTree доделаю поддержку. Там все проще, поэтому сначала сделал сложный кейс.
-
Спасибо, очень жду
-
-
-
при использовании новой функции windowFunnel CH начала падать
`2018.07.03 14:07:55.182888 [ 150 ] <Error> BaseDaemon: (from thread 77) Received signal Segmentation fault (11).
2018.07.03 14:07:55.182892 [ 150 ] <Error> BaseDaemon: Address: NULL pointer.
2018.07.03 14:07:55.182896 [ 150 ] <Error> BaseDaemon: Access: read.
2018.07.03 14:07:55.182899 [ 150 ] <Error> BaseDaemon: Unknown si_code.
2018.07.03 14:07:55.203467 [ 150 ] <Error> BaseDaemon: 0. clickhouse-server(tcmalloc::ThreadCache::ReleaseToCentralCache(tcmalloc::ThreadCache::FreeList*, unsigned long, int)+0x11b) [0x59de79b]
2018.07.03 14:07:55.203478 [ 150 ] <Error> BaseDaemon: 1. clickhouse-server(tcmalloc::ThreadCache::Scavenge()+0x44) [0x59de8c4]` -
есть таблица MergeTree, по ней нужно прогнать несколько тяжелых запросов с агреггацией. Имеет ли смысл пытаться запустить эти запросы параллельно из разных потоков?
-
Обычно нет
-
КХ сам умеет использовать все доступные (указаные в конфиге) ресурсы
-
Изучаю репликацию, создал две реплики (на удалёном сервер и на локальном компе). Пробросил порт zookeer-а с удалёного на комп.
SELECT active_replicas
FROM system.replicas
WHERE table = 'load_stat'
показывает что две активных реплики, но в локальной базе 0 записей. Я так понимаю, чтобы КХ мог передавать данные реплики должны видеть друг друга. Но какой порт он использует для репликации, 9000? -
Подскажите, какой BI умеет стучаться в clickhouse без odbc-драйвера?
-
Я Pentaho использовал, Apache Zeppelin (не совсем BI), redash (какой-то употорый как по мне)
-
Приветствую. Подскажите пожалуйста, хватит ли прав «select» для словаря в MySQL?
-
А как в Pantaho с join`ом CH и Postgres, для примера?
-
метадату достаточно удобно писать.
залил 1 746 951 782 строк - 31Гб места. -
В Пентахо я до join не дошёл, у меня он в течении 10 минут зависал. Скорее всего я не умею java настраивать
-
-
пентахо - это етл, там джойны делаются из серии "загрузим первую таблицу в память и потом джойним вторую"
-
памяти если нет - падает
-
-
это уже более гибкое решение джойна, однако результат это не отменяет
-
-
вам все равно надо держать в памяти один "отсортированный кусок", чтобы джойнить на другой
-
господа а есть ограничение на union_all? сколько запросов можно соединить? 10000 можно?
-
Вообщем пробросил 9000 порт (порт КХ с удалёного сервера виден на локаальной машине), подождал 10 минут и таблица отреплицировалась
-
При написании команду удаления из ReplicatedMergeTree опечатался в WHERE с датой и в логе пишет такое
<Error> ukit.load_stat (StorageReplicatedMergeTree): DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 0, e.displayText() = DB::Exception: String is too long for Date: 20178-06-01, e.what() = DB::Exception, Stack trace:
Оно там циклично появляется. Можно как-то убрать эту команду? В processlist пусто -
Помоги пожалуйста победить проблему
конфигурация:
2 ЦОДа (ДЦ1 и ДЦ2) по - 5 шард по 3 реплики в шарде.
ипользую табличный движок ReplicatedMergeTree
сделал:
1. Сопировал БД ДЦ1 на ДЦ2 через detach/attach по партишенам по одной реплике из каждой шарды
2. Репликация внутри каждой шарды прошла успешно
есть проблема с zookeeper:
2018.07.03 17:00:02.378153 [ 1 ] <Error> Application: DB::Exception: Cannot create table from metadata file /clickhouse/metadata/SOMEDATABASE//SOMETABLE.sql, error: zkutil::KeeperException: Can't get data for node /clickhouse/tables/01/SOMETABLE/metadata: node doesn't exist (no node), stack trace:
На стороне ZK ошибок нет. -
Ощущение что вы метаданные скопировали вместо того чтобы создать таблицу через консоль
-
таблицы создал перед копированием через detach/attach
-
можно ли по существующим данным воссоздать необходимое в zk?
-
ну сперва мне кажется надо вам разобраться куда делись данные из зк , не каждый же раз востанавливать
-
по autopurgeinterval судя по всему.
-
а зачем он нужен?
-
ну а так видимо надо детачнуть все и создать снова таблицы
-
а потом аттачнуть
-
Создал issue по моей проблеме https://github.com/yandex/ClickHouse/issues/2588Зацикливание команды удаления · Issue #2588 · yandex/ClickHouse
Создал реплицируемую таблицу (удалёный сервер) Залил туда данные (из обычной MergeTree через INSERT INTO ... SELECT ... примерно 200кк записей) На ноуте а. пробросил порты для Zookeeper и ClickHous...
-
очевидно да. Спасибо
-
ребят, я тут, что-то в ступор вошел
-
есть таблица с данными
-
допустим таблица А
-
я хочу перенести данные в таблицу Б, но при этому поменяв данные в одно поле
-
допустим, как в постгресе я сделал инсерт селект
-
но как бы не так, селект возвращает 0 строк
-
insert into tableB (field1, field2, field3) select field1, field2, 'sometext' as field3 from tableB
-
что-то не так или КХ так не умеет?
-
-
оечатка - в селекте tableA
-
insert into tableB (field1, field2, field3) select field1, field2, 'sometext' as field3 from tableA where date=today() and field3 = 'othertext'
-
вот так выглядит запрос
-
в чем суть
-
-
-
where полностью или частично - отрабатывает после выборки и так как field3 уже везде = 'sometext'
-
по этому и 0 строк в выборке
-
нет
-
пробовал и так: insert into tableB (field1, field2, field3) select field1, field2, 'sometext' as temp from tableA where date=today() and field3 = 'othertext'
-
получаю ошибку: There is no column with name temp. There are columns: field1, field2, field3
-
@milovidov_an
-
подскажете, что в моем запросе не так?
-
-
попробуйте на живых таблицах
-
-
уже пробую, но не выходит...
-
-
да, так и делал
-
теперь ругается, что кол-во колонок в селекте не соответсвует кол-ву колонок а инсерте
-
хотя все 1 в 1...
-
insert into tableB (field1, field2, field3) select field1, field2, 'sometext' as field3 from (selext field1, field2 from tableA where date=today() and field3 = 'othertext') -
хм, я делал select *, 'sometext' as field3
-
может по этому
-
сейчас пропишу все поля
-
-
DB::Exception: Size of selector doesn't match size of column..
-
бред...
-
нельзя так сделать
-
-
insert into tableB (field1, field2) select field1, field2 from tableA where date=today() and field3 = 'othertext'
-
я говорю про дефолт значение
-
-
в общем, получилось только так:
-
1) создать временную таблицу из селекта
2) интсерт селект из темп таблицы -
-
Joined.
-
Опубликована документация по ALTER TABLE ... DELETE: https://clickhouse.yandex/docs/ru/query_language/queries/#_7
-
В словаре массивы не поддерживаются, только простые типы. Есть запрос на добавление такой функции
-
:( спасибо
-
-
-
Сообщество, а тут есть пользователи phpClickHouse ?
Можете зайти и высказаться за отказ от php 5.6 в пользу 7.2 ))
У меня рука не поднимается выкинуть "эпоху"
спасибо!
https://github.com/smi2/phpClickHouse/issues/69Drop support for legacy PHP versions #69I have mentioned it few times ago, creating this issue just to be notified, when it is dropped so I don't have to come back regularly and read commits :) Current PHP version is 7.2, 7.3 will be released soon. 5.6 is ~4 years old, current...
-
Для простой фильтрации мы делаем так: пишем массив строкой, в виде {,a,b,c,}, в WHERE пишем arr_col like '%,a,%'
-
Ставьте лайк :)
https://github.com/yandex/ClickHouse/issues/1640поддержка массивов в словарях · Issue #1640 · yandex/ClickHouseПриветствую. Массивы в словарях на текущий момент, насколько я мог понять, не поддерживаются. В качестве источника словаря используем PostgreSQL, массивы в которых имеют вид "{el1, el2, .....
-
-
-
great
- 04 July 2018 (233 messages)
-
Всем привет.
Возник вопрос: после заливки данных при запросе поочередно(после 2-3 раз запуска) меняются результаты:
Таблица distributed которая смотрит на replicatedMergeTree(2 шардами: 2 реплики + 1 реплика)
Куда копать?
SELECT
sum(some_field) / 10000,
count()
FROM some_table
┌─divide(sum(some_field), 10000)─┬───count()─┐
│ 7103212.5257 │ 529082508 │
└────────────────────────────────┴───────────┘
----
SELECT
sum(some_field) / 10000,
count()
FROM some_table
┌─divide(sum(some_field), 10000)─┬───count()─┐
│ 7128549.5722 │ 535841204 │
└────────────────────────────────┴───────────┘ -
причем count только 535841204 или 529082508
-
нашел
-
на репликах одной шарды разный count() из relicatedmergeTree
-
вопрос все тот же: куда копать?
-
похоже нашел: напортачил с макросами. в definition таблицы на узлах одного шарда макросы <shard> разные
-
Есть таблица engine= memory столбцов около 2000. По ней надо прогнать 1000 однотипных запросов каждый из запросов обращается к 2 разным столбцам. Один запрос отрабатывает практически мгновенно. 1000 запросов в цикле долговато при этом загрузка ядер на КХ никакая и памяти свободной море... Пробовал склеить 1000 запросов через union all - утилизация ядер улучшилась но всё равно ниже 50%... Долбить 1000 запросов из разных потоков не хочется... Есть идеи?
-
-
Привет всем! Начали внедрять кликхаус для ряда задачек. Ищем простое и рабочее решение для репликации из мускула в кликхаус, пока смотрим на https://github.com/Altinity/clickhouse-mysql-data-reader
Может есть что-то получше ?GitHub - Altinity/clickhouse-mysql-data-reader: utility to read mysql datautility to read mysql data. Contribute to Altinity/clickhouse-mysql-data-reader development by creating an account on GitHub.
-
мы просто через движок MySQL базу в CH подтянули
-
-
-
-
а не подскажите синтаксиси создания такого движка ? Нужно ли создовать все поля в КХ или они динамически подтянутся из msql ?
-
имена полей должны совпадать.
структура - вроде не обязательно. если в CH полей объявлено меньше, чем в MySQL - у нас работает. -
синтаксис - в доке вроде доступно описан.
-
а как решили проблему с джоинами ? если боьшинство таблиц нормализованно, джоины на уровне КХ ?
-
да
-
КХ делает запрос в Мускуль, берет оттуда данные и приджоиневает их к результату
-
Создал реплицируемую таблицу, залил данные через INSERT INTO .. SELECT
Вроде всё нормально, но в логе постоянно пишется такое
2018.07.04 12:19:31.594641 [ 2 ] <Debug> load_stat (ReplicatedMergeTreeQueue): Not executing log entry for part 20180317_20180319_285_290_1 because source parts size (30.02 MiB) is greater than the current maximum (4.45 MiB).
На что это влияет и что можно подкрутить в настройках чтобы такого не писало? -
а нет ли в планах для внешних словарей убрать ограничение в 500к записей?
-
вроде можно собрать самим увеличив лимит
-
было б неплохо, куда тыкать?
-
это точно был параметр MAX_PAGES, надо только вспомнить где)
-
https://github.com/yandex/ClickHouse/blob/master/dbms/src/Dictionaries/FlatDictionary.cpp
static const auto max_array_size = 500000;
...
if (id >= max_array_size)
throw Exception{name + ": identifier should be less than " + toString(max_array_size), ErrorCodes::ARGUMENT_OUT_OF_BOUND};yandex/ClickHouseClickHouse is a free analytic DBMS for big data.
-
не знаю плюсов, но подозреваю, что собрать с другим значением таки сложновато)
-
ну, только подправив сорцы
-
:)
-
у меня был кейс с iptrie
https://github.com/yandex/ClickHouse/blob/master/contrib/libbtrie/include/btrie.hyandex/ClickHouseClickHouse is a free analytic DBMS for big data.
-
размер словаря он же из-за потребления памяти ограничен, кажись
-
вроде проскакивало это где-то
-
-
ясненько, спасибо
-
Вчера на митапе говорили что с Superset заводится без проблем (сам ещё не пробовал).
-
Кстати, со словарями ещё интересная петрушка. Есть легаси бд, в которой 10к записей, но айдишники начинаются они с 500к как раз (не спрашивайте :) ). Мигрануть не представляется возможным :(
Any ideas? -
ЕМНИП ограничение есть только для <flat> словарей. Попробуйте перейти на <hashed>.
-
<hashed> :D
-
-
словари используем в подзапросах, типа того:
select ... from some_table where obj_id in (select id from dict where dict_attr = 'value')
можно ли предположить из слова hash, что поиск по атрибутам словаря, а не по ключам, будет работать так себе? -
хотя ладно, проще проверить самому :)
-
спасибо
-
Поиск по атрибутам словаря для любого способа хранения словаря в памяти - идея "так себе".
-
Словарь он и есть словарь. Это не полнотекстовый поиск с секондари индексами и т.п. :)
-
само-собой
-
но нас устраивает, альтернативы слишком ужасны
-
особенно если учесть, что лежат в RAM)
-
Если нужно по атрибутам искать - то можно ещё один словарь сделать - словарь "наоборот" :)
-
10 атрибутов - 10 словарей?)
-
А по всем 10 нужно искать? :)
-
иначе бы их не было
-
плюс, что делать, если атрибут - массив?)
-
сейчас пишем {,a,b,c,}, ищем через like '%,a,%'
-
:)
-
-
потому что данные в этих таблицах постоянно обновляются
-
replicatedMergeTree не годится
-
или как там его
-
replacingMergeTree
-
Ну самый "книжный" пример использования словаря - это например чтоб не писать в каждой строке полный адрес - вместо них записать почтовый индекс. Словарь при этом почти статический и обратный поиск, если и нужен то например из жанра "а выбери мне все почтовые индексы для города Москва".
-
На самом деле нас всё устраивает. Просто смотрим в будущее - рано или поздно количество записей в каком-нибудь справочнике может превысить лимит
-
эт я знаю
-
И как вы обновляете этот словарь? Полностью перечитываете?
-
Однако есть где-то в документации использование таблиц с engine=dictionary, где описан как раз наш случай. И про то, что "это плохо" ничего не сказано)
-
Угу, а как иначе
-
odbc
-
Звучит как профили пользователей :)
-
и не только они ;)
-
подергал такие два запроса, время выполнения одинаково (~0,01с):
select groupArray(id) from offers where id = 1;
select groupArray(id) from offers where category = 3;
во втором случае - 3200к интов в массиве получилось -
Так что с производительностью, видимо, проблем нет.
-
Мы думали над чем-то подобным, пробовали сделать обертку в виде HTTP-микросервисов. Так чтоб можно было в любом направлении запрашивать словари, и чтоб не нужно было целиком их перечитывать какждый раз (много данных), а только при наличии необходимости в определенных данных. Когда попробовали proof-of-concept оказалось что КХ крайне неэффективно работает с HTTP словарями (в один поток).
-
У вас видимо словари относительно терпимых размеров.
-
>100к пока что нет
-
в большинстве кол-во строк несколько тысяч
-
~50
-
и то, в паре-тройке
-
select groupArray(id) from prelandings where name like '%a%';
...
1 rows in set. Elapsed: 0.198 sec. Processed 33.60 thousand rows, 1.66 MB (169.44 thousand rows/s., 8.39 MB/s.) -
-
Включить 0 или NULL в одну группу?
-
-
GROUP BY assumeNotNull(x)
-
SELECT if(a IS NULL OR a = 0, null, a) AS k1, COUNT(*) FROM (SELECT arrayJoin([null, 1, 0, 10, null]) AS a) GROUP BY k1
-
GROUP BY ifNull(x,0)
-
-
-
Это репликация по этим портам данные гонятет что ли?
-
А почему не хотите сделать таблицы которые будут наполняться новыми данными, а потом два ренейма?
-
Не очень понял смысл этого священнодейства) Есть же уже словари нормально работающие.
-
-
нет, у нас потенциально есть проблема с размером flat-словаря, есть вероятность, что рано или поздно один из них вырастет до 500к записей
-
а какая у вас проблема с массивами?
-
вот
-
а, понял :)
-
Ну если речь про поиск внутри массивов - пока предложенный мной вариант нас устраивает
-
Привет!
Сталкивался ли кто или знаете причину такого?
На всех машинах кластера схема одинаковая.
Делаю запрос SELECT ... FORMAT JSON.Запрос делается в distributed таблицу.
В ответе меня интересует поле rows_before_limit_at_least.
Странность:
Один из серверов отдает 0 в этом поле.
Все остальные сервера отдают одинаковое значение не 0.
Полезные данные - строки результата - совпадают на всех серверах. -
Как оказалось, репликация идёт по отдельному порту 9009. Пробросил его и репликация пошла
-
угу. И там к тому же протокол HTTP. Т.е. он на этом порту запускает HTTP сервер, а в зукипере публикует "адреса" партиций которые оттуда можно (и нужно) скачать.
-
Joined.
-
привет! мы делаем эксперименты в рамках clickhouse базы и разных BI тулзов. сейчас пытаемся подключить BI tool которые умеет работать с MySQL базок к Clickhouse базе. Поставили ProxySQL, который умеет переписывать синтаксис с MySQL на Clickhouse. Пока что оно заводится, держит connection, и в целом работает.
Столкнулись пока что только с одним косяком - запросы типа
SELECT col1
FROM table
GROUP BY 1
не проходят. Rewrite rules в ProxySQL под такое писать не хотелось бы, потому что жесть. Есть ли в обозримом будущем в Clickhouse базе планы на поддержку GROUP BY 1,2 / ORDER BY 1,2 запросов? -
всем привет. Запрос
SELECT * FROM track_log t WHERE (track_id=462739066) AND (date='2018-05-20')
на 1.1.54236-4.el7 работает мгновенно. Переехали на 1.1.54385-1.el7, там этот запрос 8 секунд работает. Что может быть, что посмотреть? Базу переливали Select ... format native | insert into -
-
-
а структура разве разная? show create table — этой командой создал на новом сервере
CREATE TABLE trk.track_log ( date Date DEFAULT toDate(unix_timestamp), unix_timestamp DateTime, track_id Int64, repeat_track_id Int64, campaign_id Int32, split_from_campaign_id Int32, source_id Int32, offer_id Int32, ip String, params String, status Int32, redirect_url String, price_rub Float32, price Float32, currency_id Int32, user_agent String, url String, fraudscore_status String, referrer String, device_locale String) ENGINE = MergeTree(date, (date, track_id), 8192) -
-
-
-
-
ну у вас чтение в 15 раз медленее
-
-
ну что то не так явно с чтением проверьте диск
-
-
-
-
-
-
-
-
-
+1. Явно есть какое-то несоответствие. Сам запрос прям к trk.track_log делается? Случайно не к какой-нибудь Disturbed-таблицы поверх trk.track_log?
-
-
-
Попробуйте перелить через tsv формат, может что-то не так с format native
-
А лучше просто скопируйте партиции
-
-
-
-
-
-
может там рейд ребилдится по этому IO в ноль?
-
-
-
-
Обновите версию на старом просто и сразу будет ясно проблема в версии или сервере
-
-
-
-
Я сталкивался что у него были проблемы с версий какого-то python-модуля, из-за чего при создании конекта к КХ падало (не с этой ошибкой). Покажи настройку подключения к КХ
-
-
Joined.
-
подскажите как мониторить статус репликации кликхауса?
-
все по умолчанию, там нужно что то еще прописывать кроме clickhouse://localhost:8123/ ?
-
По таблице system.replicas можно например
-
вот тоже смотрю. в документации хороший запрос приведен
-
-
Я примерно как-то так и реализововал
-
Только что попробовал создать коннект - такая же ошибка
-
-
-
неа, я уже ловил на разных сборках (периодически обновляю контейнер) самые разные глюки
-
-
А в чем проблема?
-
По дефолту в убунту вроде логротейтятся
-
-
а ну может быть
-
-
-
пока не было замечено. память может тратиться по многим причинам: кеши, словари, мержи. может просто удерживаться аллокатором про запас.
-
вот он после рестарта первое время работал очень быстро, пока памяти много не сожрал. потом сожрал 70гиг и начал тормозить на селектах
-
-
можно
-
-
щас это: https://packagecloud.io/altinity/clickhouse/el/7/$basearch
не самый свежак -
-
Joined.
-
нет, вопрос не снят. пытаюсь поставить из Яндекс-репы yum'ом:
Transaction check error:
файл / из устанавливаемого пакета clickhouse-server-1.1.54388-2.noarch конфликтует с файлом из пакета filesystem-3.2-21.el7.x86_64
файл /lib из устанавливаемого пакета clickhouse-server-1.1.54388-2.noarch конфликтует с файлом из пакета filesystem-3.2-21.el7.x86_64
файл /usr/bin из устанавливаемого пакета clickhouse-server-1.1.54388-2.noarch конфликтует с файлом из пакета filesystem-3.2-21.el7.x86_64
файл /etc/init.d из устанавливаемого пакета clickhouse-server-1.1.54388-2.noarch конфликтует с файлом из пакета chkconfig-1.7.4-1.el7.x86_64 -
-
а при удалении он тебе / удалит, интересно?)
-
max_block_size в 8192 можно выставить или подобрать какой там удобнее для вас
-
-
Там размер максимального куска увеличили с 100 до 150 gb, возможно он у вас мержами был занят и сильно на диск давил
-
вы количество одновременных мержей временно уменьшите, он данные помержит спокойно и все будет ОК
-
А это что такое? Как меняется?
-
-
yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data.
-
-
-
-
-
Tima указание max_block_size/max_insert_block_size перед insert into select лучше взять за привычку, в зависимости от того как вы храните данные и какие они можно сильно уйти по памяти, возможно это нужно сделать в самом КХ или как-то адаптивно просчитывать его и размер мержей при этом @milovidov_an ?
-
-
Спасибо, буду пробовать
-
-
С этим тут проблемы во весь рост: если вы делаете просто insert он отвалиться и все будет ок, т.к. КХ пишет в папку tmp_name_of_block по max_insert_block_size или как вы ему блоки передаете и если все Ок то он просто папку переименует и в ZK статус блока поменяет, но если вы делаете insert select - вы попали, часть данных будет вставлена в таблицу. В ответах exception есть коды, но я не помню есть ли код на out_of_space
-
-
кх отдас т ошибку что места нет
-
Да, похоже что вот эту https://github.com/yandex/ClickHouse/blob/2be2b8520b99043b790eb081264b8429f3a1c105/dbms/src/Common/ErrorCodes.cpp#L250yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data.
-
Спасибо. Думаю то, что надо
-
-
-
там не таблицу, а базу нужно делать
-
-
-
-
-
-
Достаточно просто поменять тип словаря с flat на hashed. Преимущество flat в производительности по сравнению с hashed незначительное и заметно только на простых запросах.
-
Спасибо. Документация ввела в заблуждение :)
-
Да, это обязательно будет. Более того, реализация очень простая и, по большей части, сделана. Сейчас основная проблема - не усложнять достаточно громоздкий код анализа запроса (ExpressionAnalyzer), а вместо этого разделить его на мелкие куски. Поэтому мы пока не спешим добавлять эту функциональность прямо сейчас.
-
А что там вводит в заблуждение? Кстати, прямо на странице документации есть кнопка "карандаш" - можно её самому быстро поправить. (Нужен только аккаунт на Github)
-
Да, logrotate - рабочий вариант, некоторые коллеги используют. В конфиге clickhouse-server для ротации логов можно указать <size>never</size> - тогда он не будет их ротировать и это остаётся на ваше усмотрение.
-
Спасибо большое! Для меня отличный вариант.
-
Там сильно все сложно, я про ProxySQL, нужно делать поддержку какого-то wire протокола MySQL/PostgreSQL в самом КХ, но там сильно много нюансов.
-
слова "Это метод обеспечивает максимальную производительность среди всех доступных способов размещения словаря." :)
-
По нашему опыту проблем с потреблением памяти на версии 54385 не было. Тем не менее, надо изучить причину - попробовать старую версию (для быстрых экспериментов можно просто stop, cp бинарника, start). Потом изучить, что влияет. Могут влиять некоторые виды SELECT-запросов, а могут влиять большие INSERT-ы или наоборот, большое количество мелких INSERT-ов. Для того, чтобы это проверить, отключите часть нагрузки на одном из серверов.
-
Всё так и есть :) Действительно, производительность flat словаря выше. Это будет заметно, когда запрос выполняется со скоростью хотя бы несколько сотен млн. строк в секунду на одно процессорное ядро - то есть, несколько миллиардов строк в секунду.
-
В любом случае в этом направлении нужно идти, как пример в КХ нет подготовленных выражений и это сильно местами афектит, взять хотя бы cached словари которые в ряде случаев просто генерят "портянку" SQL который не пролезает по дефолтовым лимитам. Да и вообще с подготовленными запросами может быть сильно больше оптимизаций (а тут уже вышеупомянутый ExpressionAnalyzer:))
-
Эти rpm пакеты получены путём переупаковки .deb. Их можно установить, но неудобно: надо писать force чего-то там и, возможно, будут проблемы с некоторыми скриптами. Грубо говоря, они подходят, если готовы "допилить напильником".
Есть нормальные пакеты от Altinity. -
Данное сообщение означает одно из двух:
- прямо сейчас уже выполняется много мержей; следующий мерж будет выполнен позже.
- мало свободного места на диске.
В первом случае, данные сообщения не требуют никакого внимания и их наличие - полностью нормально.
Для того, чтобы более детально посмотреть на ситуацию - сделайте, чтобы метрики ClickHouse выгружались в Graphite или куда-нибудь ещё и смотрите на графики Metrics.Merge, Metrics.BackgroundPoolTask, AsynchronousMetrics.MaxPartCountForPartition. -
При INSERT ... SELECT, ClickHouse самостоятельно преобразует блоки в более крупные, при необходимости. См. настройки min_insert_block_size_rows, min_insert_block_size_bytes. По-умолчанию должно быть Ок.
-
Joined.
-
Вот не ОК, у нас просто сильно старая версия
-
Старая версия - в которой даже нет таких настроек?
-
Не думаю что настолько сильно, сейчас нет доступа к серверам, 543* скорее всего, но, мы храним много данных в массивах ***Map и если не выставляться по блокам - мы сильно страдаем при переливе insert select, а такое бывает
-
-
-
system reload dictionary name
-
-
У нас внезапно по уникам в массив прилетело в 1500 раз больше данных, это не сильно проблема КХ, а того как у нас это хранится
-
-
Наверное суть в том, что вам нужно уменьшить размер блока при INSERT SELECT, тогда как есть лишь функциональность - склеивать блоки в более крупные, и она используется по-умолчанию.
-
Я примерно понимаю как оно работает и при самом аккуратном обращении у нас вот так, там 30кк уникальных элементов на одного из клиентов стало прилетать вместо 20к
-
-
-
Да, для больших значений - больших массивов, тяжёлых состояний агрегатных функций, требуются некоторые доработки - это адаптивный выбор index_granularity и max_block_size.
-
К сожаленюю я это тоже знаю и нам вот сильно в этом месте нехватает адаптивного index_granularity, сейчас чтоб сильно не афектить всех он сильно маленький, но он нужен не всем. Еще беда в том что в КХ нет транзакций и мы считаем стату в отдельных таблицах, но когда все это копировалось пришел OOM и все убил - как результыт куда-то что-то приехало, а куда-то нет. Может есть смысл расмотреть транзакции, как в том же посгреме (min/max видимости), но не на уровне строк (в КХ это бесполезно), а блоков ?
-
-
Такие варианты рассматриваются - можно во время транзакции складывать и мержить part-ы в сторонке от основных данных и затем атомарно добавлять их при коммите. Пока не в ближайших планах.
-
Я понял, там просто нужно сильно две вещи: во первых делать это в сторонке, а во вторых не мержить до совершения комита - это сильно не нужно и отъедает ресурсы когда так что-то считается
-
Вот со вторым проблема - добавить к таблице сразу тысячу part-ов - плохо.
-
-
@milovidov_an Еще о "боли" у нас "старенький" КХ и freeze partition не работают по префиксу с кастомными партициями. Но у нас больше чем одна таблица и хотелось бы freeze tables a,b,c partition 201805 или freeze a,b,c 2018 - мы сами можем добавить, нужно только синтаксис утвердить и, наверное, складывать не в increment, а от даты + какой-то постфикс
-
С момента выхода сами собрали и гоняем кластер на этой версии, проблем нет
-
Мы ещё сами не решили, какой лучше синтаксис для FREEZE хотя бы просто многих партиций.
-
Вот у нас сильно время пришло, мне просто не очень охота сидеть на кастомной версии КХ.
- 05 July 2018 (126 messages)
-
Joined.
-
Joined.
-
Оно сейчас достаточно не плохо работает, основная сложность что не все через rewrite rules можно сделать адекватно :)
-
Если будут какие-то вопросы по ProxySQL — пишите в Altinity или напрямую Рене, поддержка clickhouse протокола там была сделана по нашей просьбе, но далека от идеальной.
-
А какие у вас трудности с clickhouse-mysql? Обращайтесь — поможем настроить.
-
-
-
Подскажите, чем можно посмотрить логи запросов в clickhouse?
Интересует какие запросы приходили от клиентов. -
-
Спасибо
-
Joined.
-
-
Всем доброго дня!
хочу использовать в одном SELECT одну и ту же колонку дважды, конечно под разными алиасами, например так:
select a as a1, function(a) as a2 from ....
но не получается, и в a1 и в a2 оказываются результаты выполнения function(a), а как правильно? -
а что вы ожидаете увидеть?
вы же по факту делаете следующее:
:) SELECT 1 as a1, AVG(1) as a2
SELECT
1 AS a1,
AVG(1) AS a2
┌─a1─┬─a2─┐
│ 1 │ 1 │
└────┴────┘ -
ну у меня там строки лога, и во второй колонке будут результаты обработки этой строки... и хотелось видеть и raw-строку, и обработанную
-
SELECT a AS a1, splitByChar('b', a) AS a2 FROM (SELECT 'abc' AS a)
-
select number as n, pow(number, 2) as nn from system.numbers limit 10
дак вроде работает же -
какую функцию вы пытаетесь использовать?
-
самописная, рекурсивная - куча регулярок
-
в смысле через рекурсию разворачивается в вызов многих вложенных replaceRegexpAll
-
ну у меня почему то нет, в случает с текстом
-
сейчас попробую
-
нашел в чем дело, нелья делать alias такой же как исходное название колонки
-
всем спасибо
-
-
ну да, что и получилось
-
кто-нибудь с таким сталкивался?
[63/868] Building CXX object dbms/CMakeFiles/dbms.dir/src/Dictionaries/CacheDictionary.cpp.o
FAILED: dbms/CMakeFiles/dbms.dir/src/Dictionaries/CacheDictionary.cpp.o
/usr/bin/g++-7 <params> -c ../dbms/src/Dictionaries/CacheDictionary.cpp
{standard input}: Assembler messages:
{standard input}:212615: Warning: end of file not at end of a line; newline inserted
{standard input}: Error: open CFI at the end of file; missing .cfi_endproc directive
g++-7: internal compiler error: Killed (program cc1plus) -
-
Подскажите плз - max_bytes_before_external_group_by и max_bytes_before_external_sort работают? Я делаю запрос с жирным groupby, который валится по отсутствию памяти, но выставление max_bytes_before_external_group_by не помогает (и в system.settings я его не вижу)
-
-
в англ чате только что писали о похожем. это настройки MergeTree, а не system
-
Английский чат по КХ есть?
-
-
ну да, вмето ru напиши en
-
Благодарю
-
я на вторую часть ответил. запросить можно через SELECT *
FROM settings
WHERE name = '' -
Да, нашёл, у меня из-за лимита не показывалось
-
господа вопрос а как можно узнать сколько RAM съела engine=Memory()
-
нашёл, не хватало памяти компилятору
-
-
Господа, есть табличка соответствий число-строка. Общее количество порядка 30 штук. Сия табличка будет использоваться в десятке-другом запросов. Как правильнее сделать применение сего соответствия в паре десятков запросов? Таки словарь? Если да, то печально - хотел дать возможность поредактировать табличку человеку с r/o правами.
-
-
r/o - в кликхаусе и других БД.
-
Меняться будет в любом случае не чаще раза в месяц, так что проще попросить перечитать с бОльшими правами.
-
-
Впрочем, увидел https. Вопросы по нему такие:
1) что выразит кликхаус, если будут проблемы с коннектом?
2) что выразит кликхаус, если в конце/начале/середине будут лишние пустые строки?
Остальное - не проблема, товарищ достаточно аккуратен, чтоб написать простой txt (он же csv) -
Joined.
-
В обоих случаях будет ошибка и останется предыдущая версия данных в словаре.
-
Всем привет! Заметил в доках, что в ReplicatedMergeTree, если указан ключ партиционирования Date, то в первичном ключе его указывают последним. Как это работает? Просто необходимо потом делать селекты с условием prewhere date between .... В этом случае необходимо добавить Date в начало кортежа с первичным ключом или все так же в конце?
-
по дате оно и так у вас будет отсортировано, поэтому дату ставят в конец
-
В первичном ключе его вообще можно не указывать, если есть партиционирование по дате
-
спасибо
-
Но если нужно делать выборки по сильно меньшему диапазону, чем партиционирование, то тогда первым, конечно
-
Но всё зависит от ваших данных
-
если у вас есть запрос id = 42 and date between date1 and date2, и при этом партиционирование по месяцам и сортировка по id, date, то данные по диапазону дат окажутся (в каждой партиции) одним куском, а если сортировка по date, id, то данные по каждому дню будут в своем куске, т.е. менее локальны.
-
-
Благодарю. Осталось отловить ошибку.
-
партиционирование по суткам, поэтому думаю можно его вообще убрать
-
Вопрос по регекспам. Читаю https://clickhouse.yandex/docs/ru/functions/string_replace_functions/#replaceregexponehaystack-pattern-replacement
Делаю и получаю:
SELECT replaceRegexpOne('voip.in.123.answered', '(\\d{3})', '\\1') AS num
┌─num──────────────────┐
│ voip.in.123.answered │
└──────────────────────┘ -
Это только у меня так? Или требуется как-то обозначить, что регексп может быть не в начале строки?
-
Просто в документации никак не отражено, что регекспы требуют совпадения всей строки.
-
-
Э... И каким образом тут строка с буквами заматчилась на число?
-
а d3 разве не число ?
-
Тут регексп не сработал и не заменил. Правильный регексп тут .*(\\d{3}).*
-
-
-
-
ну пусть там пустую строку оставит )
-
Не-не-не! Хочу получить из строки цифрами только цифры.
-
Но вообще - понятно.
-
Правда, не из документации.
-
-
Впрочем, мне, видимо, больше подойдёт extract, а не replace
-
У меня вопрос по использованию индексов.
Есть таблица с движком merge tree, каждый день в нее льется порядка миллиарда записей. Есть строковый столбец, выглядящий примерно так: a.b.c.d.{*id*}.e, где в качестве id может быть разношорстная информация, а сам id может располагаться в разных частях строки, но всегда обрамлён и его можно без проблем выкинуть регуляркой. А a.b.c.d. определяют класс принадлежности значений.
Обычно субд не используют индексы, если в левой части условия столбец из индекса каким либо способом преобразуется. Но кх то необычный :)
Поэтому я решил попробовать добавить в индекс столбец с регекспом, который выбросит из него все айдишики (как-то так MergeTree(date_column, (date_column, replaceRegexpAll(str_column, *regexp*, '')))). Ну и в дальнейшем в условиях запроса указывать этот регексп + конкретное условие с id.
Некоторый отчёт по этой таблице за сутки рассчитывается за ~30-40 минут.
После добавления индекса с регэкспом он стал выполняться за 10-20 секунд. Похоже, что индекс таки используется, несмотря на то, что в условии запроса к нему применяется регексп. Ну и собственно вопрос: насколько адекватен такой подход? Какие могут быть подводные камни?
P.S. да, разумно было бы хранить класс где-нибудь рядом, и положить в индекс его, но представим, что мы не можем на это повлиять (: -
O_o
-
-
а сделать вычисляемую колонку (materialized) и ее проиндексировать? заодно тип со String на UInt64 поменять?
-
-
да, совпадают
-
-
тогда всё логично
-
а можно делать индекс по materialized колонке? она ж на лету вроде считается всегда?
-
на лету alias считается.
-
хм, ну если хранится, то индекс по ней будет более подходящим решением. Спасибо :)
-
Меня раздирают противоречия "В таблице типа MergeTree обязательно должен быть отдельный столбец, содержащий дату, здесь это столбец EventDate. Тип столбца с датой — обязательно Date (а не DateTime)." - у меня в любом случае есть колонка DateTime, получается мне этот столбец надо дублировать а потом еще и в WHERE указывать (у меня запрос по диапазону DateTime)... Никак низя чтобы оно "само" без лишних ухищрений?
-
-
После введения кастомового партиционирования - поле типа Date в принципе не обязательно. Но если у вас данные имеют какой-то таймстамп - наличие колонки типа Date очень сильно поможет для партиционирования и для выборки данных за определенный диапазон дат.
-
Даже при том что они будут дублировать "полный" таймстамп.
-
а никак не планируется в будущих версиях КХ пофиксить чтобы можно было вместо чистого date указывать datetime чтобы оно "само" внутри toDate при партиционировании делала и при запросах сама в where "дублировала" ограничения наложенные на datetime?
-
-
еще очень унизительно - нужно буквально пяток "нормальных" табличек небольших и ненагруженных - настроечки там хранить, простейшие справочники итп ради этого мускул рядом подымать... прикрутили бы какой-нить engine=SqlLite()
-
кому быстрее? движок может сам все это сделать и производительность будет идентичная зачем повторять два раза то? Если ему нужно поле типа date пусть создаст невидимое для меня поле и извлекает в него дату из datetime. А при поиске если видит константные ограничения на datetime пусть время отбросит и сам к date применит. зачем мне это дублировать то?
-
-
Я думаю, что может быть с кастомным партиционированием так можно сделать. Т.е. завести primary key на DateTime и партиционирование по toYYYYMM(time) и оно будет работать. Но лучше проверить, конечно.
-
Просто зачастую Date добавляют именно в primary key и тогда она становится нужна. Пример, как у Яндекс.Метрики:
(CounterID, Date, cityHash64(userID)) — и по последнему полю сэмплирование -
Будет работать. Date не является необходимым, как писал выше. Единственная проблема что по полю типа DateTime сканирование - в два раза медленнее, и при отсутствии поля типа Date некоторые вещи могут немного некорректно работать.
-
Ну так я и предлагаю эту date создавать автоматом из datetime чтобы корректно работало
-
Создайте :) Помочь вам написать CREATE TABLE? :)
-
Вам лучше Date Materialized toDate(datetime)
-
EventDate materialized as toDate(EventDateTime) то я смогу ;) вот только в WHERE писать EventDateTime>=toDateTime(...) AND EventDateTime<=toDateTime(...) AND EventDate>=toDate(toDateTime(...)) AND EventDate<=toDate(toDateTime(...)) - вторая часть унизительна
-
Чего-то не прокатило. Спустя пару десятков инсертов начало падать не очень информативное Code: 44, e.displayText() = DB::Exception: Cannot insert column str_column_mask, e.what() = DB::Exception. Этот str_column_mask materialized колонка над str_column. В инсерте ее не указано.
-
Запись через буффер. Может буффер не учитывает, что в родительской таблице есть materialized колонка и явно перечисляет все при вставке?
-
Уважаемые разработчики, а вот скажите x between 10 and 20 это для движка (не логически а именно для движка) тождественно x>=10 and x<=20? Если x проиндексирован никаких хитростей не применяется? Вообще поиск по вхождению в диапазон можно представить на поиск пересечения точки с отрезком - для этого есть очень быстрые spartial-индексы. КХ их часом не поддерживает?
-
between при парсинге разворачивается в >= and <=, на этом при желании можно например экспоненциальную длину ast получить.
-
понятно т.е. это именно синтаксический сахар.
-
-
да. что касается оптимизации попадания в отрезок, обычно у вас один отрезок (запрос) и много точек (строк), два неравенства и без индекса вроде ок.
-
жесть... но вторая часть вопроса была об использовании геометрических индексов для ускорения поиска в диапазоне значений. Особенно при обратном поиске: where 10 between column1 and column2
-
-
подскажите, а словари можно только в памяти хранить, нельзя ли заставить кх держать данные для словаря на диске?
-
Держать словари на диске средствами ClickHouse нет возможности. Можно частично кэшировать из внешнего источника - см. тип словаря cache.
-
Опубликованы материалы с митапа в Берлине:
http://yandex.github.io/clickhouse-presentations/meetup16/introduction.pdf
http://yandex.github.io/clickhouse-presentations/meetup16/spotify.pdf
http://yandex.github.io/clickhouse-presentations/meetup16/internals.pdf -
Это читал, думал есть какая хитрость. Спасибо за ответ.
-
-
Нет - с DeliveryHero.
-
У нас началось согласование митапа в Спб. Предположительное время - середина августа.
-
-
-
-
-
В users.xml, профиль default.
https://www.google.com/search?source=hp&q=background_pool_size+clickhouse -
-
-
-
- 06 July 2018 (173 messages)
-
так если у вас индекс (column1,column2), то он достаточно быстро найти должен
-
Joined.
-
Пишем в Clickhouse маленькие пачки событий, по 1000-2000 строк (плюс мат вью, которые их копируют). Но в течении суток отмечаем, что несколько событий в базу не попадает (из десятков миллионов). Может ли бытьпричина где то в Clickhouse? Куда можно копнуть?
Непонятных ошибок в логах нет. Используется кворумная запись.
Скорее всего причина всё таки не в Clickhouse, но хочется как-то проверить и его. -
Именно несколько, а не 1000..2000 строк?
-
-
-
-
Вряд ли кликхаус. Там в реплицируемых таблицах идентичные блоки выкидываются (но вы говорите что это не ваш случай), если какие-то проблемы с форматом входных данных (например плохой JSON) и включенаа толеранция ошибок - то несколько строк могут пропасть. Ну и если используете движок типа Replacing / Collapsing. Если тем не менее подозреваете кликхаус - то можете например включить query_log и при каждом инсерте записывать количество отправленных в кликхаус строк в какое-нибудь внешнее хранилище (да хоть в логфайл, таймстамп и кол-во отправленных строк). Потом можете сравнить что было выслано, с тем что кликхаус получил согласно query_log.
-
Ага, кстати не знаю как поведет себя кликхаус если при передаче данных произойдет разрыв соединения.
-
-
-
Ага, спасибо! Наметил пути.
"включенаа толеранция ошибок" - каким образом это делается? Не гуглится что-то. -
Точно знаю что кликхаус "на замечает" разрыва соединения если выполняет большой селект. Селект выполнится до конца, даже если результат уже никому не нужен. См. https://github.com/yandex/ClickHouse/issues/1403HTTP interface: kill queries after disconnect. · Issue #1403 · yandex/ClickHouse
If you will just close the HTTP connection with lasting query, the execution of that query is not stopped. May be for DDL queries that bahaviour can be considered as acceptable, but for usual SELEC...
-
Мы вот например пытаемся :) Теоретически да, при соблюдении ряда условий: реплицировать, использовать кворумную запись, использовать sequential select (пока что нельзя, т.к. баги)
-
input_format_allow_errors_num / input_format_allow_errors_ratio
https://github.com/yandex/ClickHouse/blob/7fcf609812325d0addb5b00da8ce19a39870be4e/dbms/src/Interpreters/Settings.h#L168yandex/ClickHouseClickHouse is a free analytic DBMS for big data.
-
-
Кликхаус - инструмент для аналитики, в аналитике важны тенденции и обобщения, тренды, а не конкретные единичные события. Кликхаус не соответствует требованиям ACID - хотя бы по причине отсутствия транзакций. Если вам нужно выполнять аналитику на каких-то очень важных данных, то просто копируйте это данные из вашей любимой базы соответствующей требованиям ACID в кликхаус.
-
В принципе КХ довольно прост и при определенной ловкости обращения с ним можно считать что всё надежно. Тем не менее как главную БД например для финансовых организаций я бы советовал выбрать что-нибудь другое :)
-
-
И в этом кликхаус поможет. Если вам нужна аналитика на суперважных (например финансовых) данных, то пишите ваши важные данные в какой-нибудь MS SQL / Oracle / Postgres / или что вы там любите. Копируйте их в КХ. И делайте аналитические запросы в КХ, а транзакционные запросы в вашу главную БД. Ваша главная база данных будет гарантировать вам атомарность, целостность и остальные ACID требования. При этом аналитические запросы в ней будут работать в сотни раз медленнее чем в КХ, поэтому поставив КХ "рядом" вы освободите вашу главную БД от необходимости выполнять что она делать не умеет и она будет заниматься только тем что она делает хорошо, а КХ - тем что он делает хорошо.
-
Т.е. ваш аналитический отчет по финансовым данным будет выполняться за пару минут вместо десятков часов. Во время его выполнения главная база данных не будет "лежать" из-за блокировок и т.п.
-
Плюсы налицо.
-
-
Если это датчики АЭС, то я бы вам советовал задуматься над тем как это исправить без помощи КХ. :) Если это датчики не с АЭС, то я бы советовал задуматься - так ли важно каждое единичное значение датчика в конкретную секунду.
-
-
А есть штатный механизм, с помощью которого можно узнавать, что при живой сети и живом КХ и без ошибок строки не вставились по какой-нибудь КХ-причине?
-
Ну т.е. жить в ситуации "угадай, сколько строк КХ сохранил" чёт больно. :)
-
Можно ещё сделать так: в течение относительно короткого промежутка времени хранить данные в 2 местах. Потом (в конце дня / недели / месяца) выполнять проверку целостности данных в КХ сравнивая их с данными в другой системе. Если все совпало - то записать бэкап данных на ленты / Glacier / или что вы там любите, и удалить кусок данных из главной БД, оставив данные в КХ.
-
Штатный механизм = если кликхаус вернул статус 200, значит ВСЕ данные вставились. Исключение - если подкручены настройки типа input_format_allow_errors_num (выключенные по умолчанию).
-
О. Этого хватит. Спасибо.
-
Подскажите, почему запрос с GLOBAL IN может выводить данные с одного узла, а не со всех? т.е. запрос:
SELECT *
FROM tbl
preWHERE EntityID GLOBAL IN (
SELECT EntityID
FROM tbl
preWHERE EntityID = 'value'
)
показывает меньше данные чем запрос
SELECT *
FROM tbl
preWHERE EntityID = 'value' -
и ещё: почему запрос:
SELECT *
FROM tbl
WHERE EntityID = 'value'
зависает, а с prewhere отрабатывает, хотя столбец "EntityID" - первый в индексе, и, согласно документации, where и prewhere должны в этом случае отрабатывать одинаково -
Если дело в конфигурации, подскажите какие настройки нужно проверить
-
Случайно не используете поля типа ALIAS в таблице?
-
Это какой-то ссылочный тип? Нет, в таблице только строки, числа и даты
-
Это "вычислимое" поле которое физически в базе не хранится, а вычисляется "на лету".
-
Хм, вроде нет
-
Действительно, у меня разница по скорости вышла в 10 раз, вызвана разным количеством прочитанных данных. Там есть оптимизация optimize_move_to_prewhere, но она не работает с primary key. А где написано что "согласно документации, where и prewhere должны в этом случае отрабатывать одинаково"?
-
Всем привет! Часовой пояс для DateTime можно указывать прямо в фкнции преобразования toDateTime(timestamp, 'UTC'). Но почему то если указываю такое выражение в DEFAULT, то часовой пояс игнорируется. Кто-нибудь сталкивался?
-
┌─toDateTime(1527640610.101, \'UTC\')─┐
│ 2018-05-30 00:36:50 │
└─────────────────────────────────────┘
localhost :) desc test
┌─name───────┬─type─────┬─default_type─┬─default_expression──────────────┐
│ date │ Date │ │ │
│ time_utc │ DateTime │ DEFAULT │ toDateTime(time_epoch, \'UTC\') │
│ time_epoch │ Float64 │ │ │
└────────────┴──────────┴──────────────┴─────────────────────────────────┘
insert into test (date, time_epoch) values (toDate(now()), 1527640610.101)
localhost :) select * from test
┌───────date─┬────────────time_utc─┬─────time_epoch─┐
│ 2018-07-06 │ 2018-05-30 03:36:50 │ 1527640610.101 │ -
а подскажите если запрос в файле на жестком диске - как его выполнить из интерактивного режима clickhouse-client ?
-
как source в mysql?
-
этого я тож не знаю ;( надо чтобы зачитал с винта sql и выполнил
-
cat sql.sql | clickhouse-client работает вроде но хочется из интерактивного режима
-
А в чем разница? Все равно ошибки выползень в аутпут.
А вообще такой команды вроде нет. -
Дело в типе данных. Если тип данных DateTime тогда будет форматировать дату в соотвествии с часовым поясом сервера или клиента. Если нужно чтобы по умолчанию использовалась определенная таймзона - то просто указываете её в типе данных, т.е. в вашем случае CREATE TABLE ... ( time_utc DateTime('UTC') DEFAULT ... )
-
мне не ощибки мне статус с прогресс-баром итд... запрос очень жирный через клипбоард тормозно вставлять
-
clickhouse-client --help
Main options:
...
-t [ --time ] print query execution time to stderr in
non-interactive mode (for benchmarks)
--stacktrace print stack traces of exceptions
--progress print progress even in non-interactive
mode
--echo in batch mode, print query before
execution
... -
Спасибо!
-
А можно ли как-то безболезнено сделать alter поля, которое уже содержит данные, c DateTime на DateTime('UTC')
-
он просто ругается на несоответствие типов
-
-
-
господа я тут бъюсь над одним страшным запросом, может быть есть мысли как можно ускорить? https://pastebin.com/9kDPTXB7
-
упирается с CPU я так понимаю.
-
Joined.
-
Должно быть безболенно, но увы нет. Создал issue: https://github.com/yandex/ClickHouse/issues/2602Type mismatch: Column has type DateTime('UTC'), got type DateTime #2602
Test case: create table x2 ( ts_utc DateTime DEFAULT toDateTime(ts, 'UTC'), ts DateTime )Engine = MergeTree ORDER BY ts; INSERT INTO x2(ts) values ( now() ); alter table x2 modify column ts_utc DateTime('UTC') DEFAULT toDateTime(ts, 'UTC...
-
сделать группировку по sessionid, checkpoint_code и вытащить any(synchronized_event_time) из каждой группы. А потом на результате сделать группировку по sessionid и перенести нужные значение в отдельные колонки.
-
Так будет намного быстрее чем миллион if
-
Как именно перенести результаты в нужную колонку? Я как раз через anyif это делаю
-
Следует иметь ввиду, что указывать в PREWHERE только столбцы, по которым существует индекс, имеет мало смысла, так как при использовании индекса и так читаются лишь блоки данных, соответствующие индексу.
https://clickhouse.yandex/docs/ru/query_language/queries/#prewhere -
Joined.
-
Если нужно обязательно по колонкам разнести (зачем?) то можно потом с помощью if. Разница в том что сейчас на каждой ИСХОДНОЙ строке выполняется миллион if, а тут был бы миллион if на сгруппированных строках, которых я полагаю будет значительно меньше.
-
Господа, не подскажите с одной проблемой. В clickhouse держу базу для графита с движком GraphiteMergeTree, если указываю агрегацию по sum на определенных интервалах, то clickhouse начинает агрегировать какую то дичь. Например для метрик типа counter последнее значение может быть меньше предыдущего.
-
Это в 54388 было исправлено
-
неа, в 99.9999% в рамках одной session_id только одно событие "xxx", сверткой не спасешься... по колонкам разнести - надо считать дельту времени между различными событиями и выявлять нарушение максимально допустимого времени. этих правил (дельт которые надо считать и контролировать) в макете 2000... Думается сначала собрать такую широкую таблицу в memory а потом тейблсканами по ней 2000 запросов...
-
А в таблицу не хотите это сгруппировать?
-
Performance of WHERE vs PREWHERE when selecting by primary key · Issue #2601 · yandex/ClickHouse
According to docs: "Keep in mind that it does not make much sense for PREWHERE to only specify those columns that have an index, because when using an index, only the data blocks that match th...
-
что именно? данные о событиях летят кладутся отдельными записямив КХ.
-
Подскажите, а как сгруппировать данные по 3 месяца?
-
-
Ну можно это в несколько шагов сделать.
1) трансформируйте ваши значения в номера колонок,
типа такого transform( checkpoint_code , [ 'B_rule_1sec_0', 'A_rule_1sec_1', 'B_rule_1sec_1', ... ], [1,2,3, ...], 0) as arr_index,2) погруппируйте данные по session_id, arr_index cобирая попутно synchronized_event_time select session_id, transform( ... ) as arr_index, any(synchronized_event_time) as some_synchronized_event_time group by session_id, arr_index3) поверх всего этого сделайте группировку по session_id и собирая таймстампы в таблицы в нужные позиции с помощью groupArrayInsertAt: select session_id, groupArrayInsertAt( some_synchronized_event_time, arr_index ) from ( ... предыдущий селект ... ) group by session_id4) на выходе получите примерно то на что расчитывали, только не в колонках а в таблице. и должно работать ощутимо быстрее. Таблицы могут не иметь хвостовых элементов, но это ни в чем не мешает.
5) потом по этим таблицам можно ездить аггрегациями c -ForEach или функциями высшего порядка. Или тупо повытаскивать отдельные элементы таблицы в колонки и делать то что вам там нужно. -
Спасибо! А как быть с группировкой по 6 месцев?
-
Привет!
Есть табличка с полем UInt8
При фильтрации типа field = 1 все работает нормально,
но при фильтрации типа field in (1,2) кликхаус ругается на нестыковку типов
Как тут правильно сделать? -
вы нас обманываете... :)
create temporary table www ( w UInt8 );
insert into www values (1),(2),(3);
select * from www where w in (1,2);
┌─w─┐
│ 1 │
│ 2 │
└───┘
2 rows in set. Elapsed: 0.012 sec. -
вот так точно ошибка выглядит:
DB::Exception: Types of column 1 in section IN don't match: Int8 on the right, UInt8 on the left
походу разобрался, читаем из merge-таблицы, в ней Int8, а в нижележащих таблицах UInt8 -
причем ошибка повторяется только в prewhere
-
Привет.
Есть web api, который возвращает данные в формате json. Пример: [{"id": 1, "name":"abc"}].
При подключении api к clickhouse в качестве внешнего словаря, получаю ошибку: Format JSON is not suitable for input.
Существуют ли какие то варианты использования такого формата? -
Только JSONEachRow.
-
Например так: group by intDiv(toRelativeMonthNum(date), 6)
-
Progress: 554.31 million rows, 16.63 GB (9.62 million rows/s., 288.67 MB/s.) 99% дошло до 99% и думает, КХ при этом непонятно чем занимается (ядро даже одно полностью не занято)....
-
Ага. Кликхаус те вещи для которых не может оценить время выполнения на последнем проценте выполняет :) Потерпите :)
-
спасибо
-
а не знаете аналога toStartOfFifteenMinutes в mysql? ну так совершенно случайно:)
-
Супер!!! Спасибо большое!
-
Так и не дождался. Переписал запрос чуток (раскрыл скодбки убрал any вообще) https://pastebin.com/6azBGvVQ → Progress: 19.86 million rows, 595.22 MB (198.30 thousand rows/s., 5.94 MB/s.) 3%Received exception from server (version 1.1.54388):
Code: 1001. DB::Exception: Received from localhost:9000, ::1. DB::Exception: std::bad_alloc.
120.525 -
преобразовать в unix-timestamp (получится чиселко) потом разделить на 900, отбросить дробную часть, умножить на 900 и потом FROM_UNIXTIMESTAMP-получится дата/время
-
Joined.
-
Н-да. Это у вас конспирация такая сильная что все столбцы каждый раз меняются? :)
Что должно означать groupArrayInsertAt(0,4000)? -
просто со строк перешел на числа (ID-ы) - сравнивать проще. groupArrayInsertAt(0,4000) - выделить сразу 4000 элементов, заполнить нулями. Пофиг и с ним и без него падает
-
-
Как-то слишком жирно 4000 элементов на строку, не находите? Зачем столько? По моему опыту с таким порядком цифр вам не к КХ, а куда-то в сторону Hadoop и ему подобных
-
требование заказчика - макет с 10+ кратным запасом по объемам
-
Ну вы там пытаетесь всё это ещё в таблицу с движком Memory запихать.
-
Может memory кончается у вас? :)
-
с groupArrayInsertAt(0,4000) так делать не надо. Хвостовые элементы в таблице низачем не нужны
-
-
ИМХО - больше 100 байт - уже много
-
Array с 4000 тысячами элементов - должно быть терпимо.
-
поменял на Log жду...
-
Терпимо, но зачем так делать? Я пока не очень понимаю какую проблему пытаются решить создавая такой массив
-
сделать PIVOT по 4000 точек
-
сделал engine=Log не взлетело... ← Progress: 20.05 million rows, 601.11 MB (108.74 thousand rows/s., 3.26 MB/s.) 3%Received exception from server (version 1.1.54388):
Code: 1001. DB::Exception: Received from localhost:9000, ::1. DB::Exception: std::bad_alloc.
186.830 -
Попробуйте MergeTree
-
Joined.
-
ест 128 гигов и падает....
-
4000 * 20 млн строк - это довольно много. У вас включена агрегация с использованием диска?
-
нет наверное
-
я счас развернул алгоритм... сначала отбираю в memory table "окно" с событиями. А потом уже "разворачиваю" для каждого правила из 2-х тысяч
-
такое чуство что быстрее
-
окно строилось 16 секунд, 250 правил вычисляются одним запросом за 15 секунд
-
все правила в union all не получается говорит AST Complexitiy Превышен
-
можно кстати как-то его подкрутить?
-
Насколько я знаю - да, сейчас посмотю
-
yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data.
-
max_ast_elements
-
2000 запросов через union all
-
↓ Progress: 12.04 billion rows, 336.98 GB (287.62 million rows/s., 8.05 GB/s.) Received exception from server (version 1.1.54388):
Code: 1001. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Resource temporarily unavailable.
42.069 -
запросики идентичные только цифры меняются
-
select 1705 rule,
ts,
c1,
c2
from
(
select
toStartOfMinute(toDateTime(t1)) ts,
count() c1,
countIf(t1 - t0 > 900) c2
from
(
select
b>0?b:(b+901) t1,
a t0
from
(select sid, anyIf(ts,cc=11078065251486343680) a, anyIf(ts,cc=10964831536725407699) b
from tmp0.`t_2018-07-04 10:00:00_c6eeccb44e75416b8ff51fa8e7b26e52_d`
where ts >= toUInt32(toDateTime('2018-07-04 10:00:00', 'UTC')) -1021
AND ts <= toUInt32(toDateTime('2018-07-04 10:00:00', 'UTC'))
and cc in (11078065251486343680,10964831536725407699)
group by sid)
WHERE
a >= toUInt32( toDateTime('2018-07-04 10:00:00','UTC')) - 1021
)
where
t1 > 0
group by
ts
)
where ts>=toStartOfMinute(toDateTime('2018-07-04 10:00:00','UTC') - 120) -
Создаю таблицу
create table x (a Int64) Engine=MergeTree Partition by tuple() order by tuple()
settings max_bytes_to_merge_at_max_space_in_pool = 214748364800
А как потом поменять max_bytes_to_merge_at_max_space_in_pool?
alter ...
detach поправить x.sql attach
какой легальный путь вообще?
таблица репликейтид -
Joined.
-
-
В будущих версиях это будет, сейчас никак(
-
Посмотрите в сторону redash. Он умеет с кликхаусом работать.
-
-
Вы про redash? Он абсолютно бесплатен хостить у себя. Опенсорсный, есть докер компоуз.
-
-
У меня так и не получилось увеличить встроеный в redash таймаут на 30 секунд. Причем запрос выполняется 1 секунду, а redash тупит 30 секунд и всё
-
Хм, не сталкивался. А у вас точно все нормально поднялось? У редаш там сложная архитектура, постгря, мессадж сервис, экзекьютор... Нужно что бы все друг друга видели. Пробовали свежие версии?
-
Пробовал в докере, пару месяцев назад. Простой запрос типа count проходит, просто в консоле запрос за десятую секунды выполняется. А в редаш полминуты непонятно-что делается
-
Ещё superset слышал что хвалили
-
Zeppelin тоже без особых проблем можно подружить с КХ
-
superset с последней версией КХ не работает https://github.com/cloudflare/sqlalchemy-clickhouse/issues/23Does not work with ClickHouse no more #23
Current version does not work with latest ClickHouse (1.1.54385). Please grab a patch from https://github.com/JustOnce/sqlalchemy-clickhouse, it's fixed there with latest commit.
-
именно на Executing query висит или другое сообщение? пользуемся redash+clickhouse почти два года, такого не замечали. могу посмотреть, если опишете подробнее
-
А что этот патч? Не помогает?
-
еще не пробывал, хочется конечно чтобы все работало из коробки😔
-
+1. Пока табикс стабильнее всего
-
-
А что не нравится? Что не устраевает?
Я сейчас как раз полностью переписываю на 100% весь код -
-
ого
-
-
даже и не знал о таком, в текущей не поправлю - т.к все больше обновлять эту версию не буду ) а в новой может само исправится
-
в edge вообще не должен он работать)
-
я даже и не знал что он в нем работает)
-
То что он лучше всего остального - факт. Но есть проблемы. Баги, неудобный скрол результатов, непонятные подсказки
-
-
Скроллы в новой версии будут другие - т.к компоненты совсем "другие")
а про подсказки заведите issue - обсудим что не нравится -
-
попробуйте chrome/firefox - может лучше будет, под edge честно даже не планировал поддержку (
-
-
о я даже не знал что он есть) жал стрелки
-
-
да есть такое, у меня magicmouse - там это проще
-
поставлю обычную мышку попробую - спасибо за замечание
-
-
да мое упущение -- добавлю в доку хот кеи
-
-
очень не хочется ставить лишнего в систему когда встроенное работает, если новая версия не заведется то тогда уж да, а пока я к этом интерфейсу привык)
-
Присоединяюсь, респект!
-
не понял, можно пример , есть простые переменные, но они криво реализованы в плане ui
-
Нзч)
-
что-то типа такого - иннплейс рефакторинг. Ну, вдруг
https://www.youtube.com/watch?v=RExpDf3xG4YIn-place Rename RefactoringIn PhpStorm when you need to rename a variable, parameter, class, method, constant or goto label, you can do it in-place, right in the editor pane.
-
подумаю - но это не просто реплейс, с "заковыркой")
-
Я начал писать статью, и бросил т.к в том виде табикса больше не будет)
Список хот кеев
https://github.com/tabixio/tabix.docs/blob/master/articles/article01.mdtabixio/tabix.docstabix.io docs & articles. Contribute to tabixio/tabix.docs development by creating an account on GitHub.
-
-
-
Ctrl-H или Command-Option-F
replace -
сейчас очень активно пилится, и появился отдельный dev)
я думаю к "осеннему" митапу будет stable(((
пощупать надеюсь к концу августа((( -
-
-
Пока невозможно сказать, насколько часто они бывают.
Изначально планировали проводить европейские митапы примерно 1-2 раза в год, в разных местах.
Последний митап организовывала компания DeliveryHero: когда есть готовая площадка и организация - то всё упрощается, и можно проводить мероприятия чаще. - 07 July 2018 (9 messages)
-
-
Скинь ссылку на репу, если есть
-
tabixio/tabix
tabix - Tabix.io UI
-
Спасибо
-
Joined.
-
Joined.
-
привет. есть проблема с взрывным ростом потребления памяти, непонятно чем вызванным.
http://joxi.ru/823jnOahJPEl5m
https://pastebin.com/1tmB76Ga в еррор-логе с этого момента, но это наверное следствие, а не причина1530982339813 (31 kb) uploaded July 7, 2018 Joximade using Joxi.net
-
-
- 08 July 2018 (5 messages)
-
Включите query_log, посмотрите - возможно какие запросы съедают память.
-
-
Joined.
-
Joined.
-
Joined.
- 09 July 2018 (97 messages)
-
Подскажите, почему запрос с GLOBAL IN может выводить данные с одного узла, а не со всех? т.е. запрос:
SELECT *
FROM tbl
preWHERE EntityID GLOBAL IN (
SELECT EntityID
FROM tbl
preWHERE EntityID = 'value'
)
показывает меньше данные чем запрос
SELECT *
FROM tbl
preWHERE EntityID = 'value' -
Уточнение по вопросу:
CH развёрнут на 3-х шардах: 1, 2, 3.
На каждой есть копия таблички со своими данными + представление, выводящее данные со всех шард.
Я подключаюсь к шарду 1, выполняю запрос к представлению, и из результатов выпдают данные с шарда 1. Что не так с настройками или запросом? -
Задал вопрос: https://stackoverflow.com/questions/51237599/global-in-dont-return-results-from-all-nodesGLOBAL IN don't return results from all nodes
Why when I use "GLOBAL IN", I do not get results from all nodes? Example 1: SELECT * FROM tbl PREWHERE EntityID GLOBAL IN ( SELECT EntityID FROM tbl PREWHERE EntityID = 'value' ) Exa...
-
Joined.
-
-
дайте CREATE TABLE всех таблиц и представлений, тогда будет понятней
-
-
-
-
-
Мы изначально приняли решение, что все записи идут через кафку с одним универсальным сервисом-консюмером, который пишет в кх, и я с тех пор только радуюсь этому - подобные ситуации вообще не составляют проблемы. Рекомендую
-
В смысле, мы просто останавливаем консюмер, делаем мейнтенанс и дальше продолжаем
-
-
Консюмеры масштабируются горизонтально
-
@milovidov_an а какой юзкейс многоуровневого шардирования?
-
-
у нас так же, но тогда нужен глобальный лок для всех consumer-ов. Так же, views создаются вне consumer-ов, аналитиками
-
@Imaskar имеется в виду сервис как логическая единица. Нет других источников трафика в кх, кроме кафка-консюмеров.
-
@bsideup в смысле лок? Между консюмерами одной группы записи раунд-робинятся
-
Можно аналитикам выдать строго контролируемую кнопку “остановить запись” (со всеми предосторожностями), которая будет их всех останавливать. Хотя, наверное, создание вью - не такая уж и частая операция, можно по договоренности это делать.
-
люди а подскажите оптимальную последовательность полей в индексе. Если было бы строгое равенство при поиске то все понятно но тут и диапазоны итд, нужно минимизировать индекс скан. условие where такое: WHERE event_date IN (constDate1, constDate2) and event_datetime >= constDateTime1 and event_datetime<=constDateTime2 and event_name in (constString1, constString2)
-
по "обычным" реляционкам и если бы не было event_date я бы сделал event_name первым, выполнял бы 2 запроса со строгим равенством event_name и собирал бы их через union all т.е.: where event_name=const1 and eventr_datetime between .... UNION ALL ... where event_name=const2 and eventr_datetime between ....
-
Здесь достаточно хорошо расписана логика работы индексов
https://groups.google.com/forum/#!searchin/clickhouse/%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%7Csort:relevance/clickhouse/eUrsP30VtSU/p4-pxgdXAgAJ -
Всем привет! Кто-нибудь подскажет, почему некорректно totals считаются?
SELECT
uniqExact(visit_id) AS visits,
domain(page)
FROM my_big_table
SAMPLE 100
ARRAY JOIN page
WHERE (project_id = 1337) AND (dt <= toDate('2018-03-31')) AND (dt >= toDate('2018-03-01'))
GROUP BY page
WITH TOTALS
ORDER BY visits DESC
┌─visits─┬─domain(page)────────────┐
│ 2 │ news.yandex.ru │
│ 1 │ music.yandex.ru │
│ 1 │ mail.yandex.ru │
│ 1 │ news.yandex.ru │
│ 1 │ music.yandex.ru │
└────────┴─────────────────────────┘
Totals:
┌─visits─┬─domain(external_links)─┐
│ 4 │ │
└────────┴────────────────────────┘ -
-
-
-
-
-
-
-
Многоуровневое шардирование оправдано использовать при наличии большого количества шардов (примерно больше 20) и одновременно большого количества коротких запросов в единицу времени (примерно больше 100 QPS).
-
по идее это uniqExact(visit_id) AS visits без группировки по page
-
-
этот же селект сделайте без GROUP BY page
-
-
привет. поделитесь плиз ссылкой на инструкцию, как установить кликхаус+графана
-
А зачем их вместе-то устанавливать?
-
Всё ж разные сервисы
-
-
поставил и протестировал, очень похоже, что это как раз то, что я искал
-
Всем привет, возникла проблема при работе с zookeeper. Всего один шард, на локальной машине (таблицы ReplicatedMergeTree). Никогда такого не было, но сейчас очень часто возникает ошибка:
Code: 122. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Table structure in ZooKeeper is too different from local table structure.
Пробовал удалять таблицу через zookeeper-cli, из папки /var/lib. Где zookeeper хранит данные о таблице??? Можно ли как-то удалить данные о всех таблицах из zookeeper? -
На первом x, на втором y :D Обычно Long = X а Lat = Y. Но если сделать наоборот - тоже все будет работать (тсс!..), главное последовательно использовать.
-
Когда сделаете DROP TABLE со всех реплик - само удалится.
-
Спасибо, предполагал, что так, но не был уверен.
-
Путь к параметрам таблицы в зукипере вы задаете при CREATE TABLE.
-
Рад был помочь :)
-
а вручную как-то можно снести все полностью, что он знает о таблицах?
-
а разве за счёт схождения сетки на полюсах там не особые правила расчёта? tile38 говорит об этом явно. тогда если поменять местами, могут быть и расхождения.
-
AFAIK pointInPolygon работает просто на плоскости. Плоскости всё равно где у неё x, а где y, разве нет?
-
Ну если у вас уже нет этих реплик, то можно просто снести соответствующие папки, например с помощью cli-клиета zookeeper: https://www.tutorialspoint.com/zookeeper/zookeeper_cli.htmZookeeper - CLI - Tutorialspoint
Zookeeper - CLI - ZooKeeper Command Line Interface (CLI) is used to interact with the ZooKeeper ensemble for development purpose. It is useful for debugging and working around wi
-
спасибо, но не помогает, уже пробовал это. Он все равно где-то видит старую структуру.....
-
Не может быть :) Может у вас какая-то другая таблица на том же хосте в ту же папку смотрит?
-
Загляните ещё так: SELECT * FROM system.zookeeper WHERE path='/clickhouse/ ... путь к вашей таблице ...'
-
SELECT *
FROM system.zookeeper
WHERE path = '/clickhouse'
┌─name───────┬─value─┬─czxid─┬─mzxid─┬───────────────ctime─┬───────────────mtime─┬─version─┬─cversion─┬─aversion─┬─ephemeralOwner─┬─dataLength─┬─numChildren─┬─pzxid─┬─path────────┐
│ tables │ │ 6 │ 6 │ 2018-07-09 15:40:59 │ 2018-07-09 15:40:59 │ 0 │ 4 │ 0 │ 0 │ 0 │ 0 │ 41 │ /clickhouse │
│ task_queue │ │ 3 │ 3 │ 2018-07-09 15:40:50 │ 2018-07-09 15:40:50 │ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 4 │ /clickhouse │
└────────────┴───────┴───────┴───────┴─────────────────────┴─────────────────────┴─────────┴──────────┴──────────┴────────────────┴────────────┴─────────────┴───────┴─────────────┘
localhost :) select * from system.zookeeper WHERE path='/clickhouse/tables'
Ok.
0 rows in set. Elapsed: 0.005 sec. -
нет ничего)
-
localhost :) show tables
SHOW TABLES
Ok.
0 rows in set. Elapsed: 0.007 sec. -
и таблиц нет
-
причем до сегодняшнего дня все отлично работало)
-
вот я и думаю, что он куда то может скинул данные о моих таблицах, которые были
-
$ cat nginx.sql | clickhouse-client -n -m
Received exception from server (version 1.1.54385):
Code: 122. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Table structure in ZooKeeper is too different from local table structure. -
А базы данных другие есть? SHOW DATABASES?
-
localhost :) show databases
SHOW DATABASES
┌─name────┐
│ default │
│ system │ -
Может вы поудаляли данные из зукипера пока таблицы ещё были? Попробуйте перезапустатить Clickhouse.
-
то же самое...
-
zookeeper можно как-то снести полностью, чтобы он за собой все подчистил свои данные?
-
А что это вообще такое? У вас нет презентаций или видео про это? Я пытаюсь понять, как это работает, по упоминанию в документации и пока не осилил)
-
Можно только руками подчистить базы после удаления.
-
Обычно в /var/lib/zookeeker всё лежит.
-
Если требуется не удалить, а получить свежеустановленный зукипер - достаточно остановить, удалить базы (у меня лежат в /var/lib/zookeeper/version-2) и потом запустить.
-
Это значит - у вас есть очень большой кластер.
Его можно рассматривать и как единое целое - для глобальных запросов, и как совокупность небольших кластеров - для запросов по одному клиенту.
На каждом сервере создано две Distributed таблицы и в конфиге объявлено два кластера - один большой, а другой - маленький, для части данных.
Для примера, у нас всего серверов в одном кластере - 584. Они разбиты на 39 маленьких кластеров, которые мы называем "слои". Данные каждого счётчика Метрики (сайта) располагаются в пределах одного слоя. Каждый слой содержит от 4 до 16 шардов - от 8 до 32 серверов.
Слои можно масштабировать независимо. В рамках слоя схема шардирования - произвольная (random). -
Лично мне это понадобилось только когда у кластера съехала крыша (неправильно расчитал требуемый объём памяти) и его содержимое пришлось восстанавливать из бекапа, выбирая узел с самым последним сбекапленым содержимым и очищая остальные...
-
Joined.
-
-
yandex/ClickHouse was tagged: v1.1.54390-stable
Link: https://github.com/yandex/ClickHouse/releases/tag/v1.1.54390-stable
Release notes:
v1.1.54390-stableClickHouse/ClickHouseClickHouse is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
а где можно список изменений глянуть?
-
yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data.
-
-
Неверно.
-
https://github.com/yandex/ClickHouse/compare/v1.1.54388-stable...v1.1.54390-stable
Вот так правильно.yandex/ClickHouseClickHouse is a free analytic DBMS for big data.
-
так гораздо больше :) но удаления пока нет?
-
ALTER DELETE есть и в предыдущем релизе.
-
👍
-
@milovidov_an а почему alter delete только для реплицируемых таблиц? В чем особенность?
-
Никакой особенности. Сейчас доделывается для нереплицируемых тоже.
-
Просто мне казалось, что в обратном порядке делать проще :) Или вы начали POC делать на примере посложнее обычной таблички на одном сервере?
-
Вся сложность сосредоточена в ReplicatedMergeTree. Было бы бессмысленно делать для MergeTree будучи неуверенным, что на ReplicatedMergeTree выбранный подход будет хорошо работать.
К тому же, нам самим на практике нужно именно для ReplicatedMergeTree (обычные MergeTree почти не используются в продакшене). -
Логично :) Мы оооооочень сильно ждали эту штуку! Спасибо большое! Пошел играться :)
-
Сейчас ещё ожидаются некоторые доработки. Например, в последнем релизе, насколько я знаю, ещё нет отсечения не затронутых партиций. CC @ztlpn
-
У нас просто есть блок работ в котором есть вилка из мигратора данных из партиций с устаревшими данными в новые и потом удаление старых партиций, либо использование функционала удаления. Мы пока доберемся с этим блоком в работу, глядишь вы допилите полноценную поддержку!
-
Мы планируем активно этой штукой пользоваться
-
Отлично, мы тоже :)
-
-
всем привет, запрос возвращает значения колонки
1
2
3
4
можно сделать так, чтобы вернулась одной строкой: 1,2,3,4?
тк нужен по сути хеш последовательности -
Joined.
-
SELECT groupArray(number)
FROM numbers(1, 4)
┌─groupArray(number)─┐
│ [1,2,3,4] │
└────────────────────┘ -
то что надо, спс
- 10 July 2018 (119 messages)
-
/clickhouse
-
Всем привет. Подскажите пожалуйста. У меня есть данные в json по типу
{"number":1,"string":1}
{"string":9,"number":2}.
Мне нужно их разложить в следующем виде:
number,1
string,1
string,9
number,2
Искал в доке функции для работы с json или регулярками, но ничего подходящего не нашел. -
как в селекте из distributed таблы принудительно подставить значение из словаря только когда данные попадут на локальный сервер? только create table as select … ? потом select getDict,* из таблицы?
-
/clickhouse
-
Добрый день!
-
vast_tracking.Distributed.DirectoryMonitor: Code: 209, e.displayText() = DB::NetException: Timeout exceeded while reading from socket (192.168.0.12:9000)
-
имею такую ошибку на кластере
-
на хосте 192,168,0,12 - все в порядке
-
консоль КХ работает
-
хост виден и пингуется:
ING 192.168.0.12 (192.168.0.12) 56(84) bytes of data.
64 bytes from 192.168.0.12: icmp_seq=1 ttl=64 time=12.2 ms
64 bytes from 192.168.0.12: icmp_seq=2 ttl=64 time=12.0 ms -
файрволлом лишнего не прикрыто? В частности, коннект с/на соседний сервер. И на соседнем сервере.
-
нет, внутри сети серверов нет ничего такого
-
вот даже попробовал приконектить консоль к тому серверу:
@s1:/var/log/clickhouse-server# clickhouse-client —host 192.168.0.12 —multiline
ClickHouse client version 1.1.54164.
Connecting to 192.168.0.12:9000.
Connected to ClickHouse server version 1.1.54164.
:) -
однако, дистрибуция данных сбоит...
-
-
я сейчас перезапустил ту ноду
-
посомтрю
-
а так да, лог весь усупан
-
вроде рестарт ноды помог
-
Кто нибудь подскажет почему так рапарсилась CSV строка, проблема возникает именно с полем типа DateTime когда оно имеет пустрое значение
-
но она у вас наверно первичныйключ, и не должно быть пустым?
-
DateTime вставляете как epoch без скобочек по бокам?
-
-
-
Я на то же намекаю.
-
-
Встроенных (и быстрых) способов итерации по ключам JSON в кликхаус, увы, нет. Похожую задачу решал примерно регулярными выражениями, примерно так:
WITH
extractAll(json_field, '[{,]"([^"]*)":') as json_keys,
extractAll(json_field, ':(".*?")[,}]') as json_values
SELECT ...Но по понятным причинам с регулярными выражениями это все мало стабильно, и только один очень жестко определенный формат JSON может прочитать, притом довольно медленно. -
нет, это не первичный ключ
-
проблема именно в строке 33, про нее и спрашиваю
-
Запустил команду удаления на реплицированой таблице, в system.mutations появилась команда, parts_to_do упало до 1568 и дальше не идёт. В логе КХ ничего криминального нет. Что может быть не так? Где-то ещё можно посмотреть что с операцией удаления?
-
вставка работает корректно, если в поля с типом DiteTime вставить дату, с кавычками не работает
-
Простой пример при котором вставка пустой даты не работает, может кто ни будуть подсказать почему так происходит
CREATE TABLE apps (
date Date,
name Nullable(String),
birthday DateTime
) ENGINE MergeTree PARTITION BY (date) ORDER BY (date);
INSERT INTO apps FORMAT CSV 2018-01-01,,; -
в этом примере DateTime не указано как nullable
-
это не влияет, в доке написанно что при отсутсвтие значение у поля DateTime будет использованно дефолтное значание
-
-
-
-
документация говорит следующее
Если выражение для значения по умолчанию не указано, то в качестве значений по умолчанию будут использоваться нули для чисел, пустые строки для строк, пустые массивы для массивов, а также 0000-00-00 для дат и 0000-00-00 00:00:00 для дат с временем. NULL-ы не поддерживаются. -
-
насколько я помню, что бы указать null можно сделать вот так
INSERT INTO apps FORMAT CSV 2018-01-01,,\N; -
и это рабочая схема, но мне не подходит
-
проьлема точно в парсинге, я так понимаю что ожидается именно дата и ни чего другого
-
Всем привет. Подскажите, а можно как-то ускорить запрос OPTIMIZE TABLE table_name PARTITION $date FINAL
Потому-что когда происходит эта операция постоянно валятся <Error> ServerErrorHandler: Poco::Exception. Code: 1000, e.code() = 104, e.displayText() = Connection reset by peer, e.what() = Connection reset by peer -
Коллеги, добрый день! Есть кластер из 3 шардов по 2 реплики + еще одна нода, на которой есть распределенная таблица смотрящая на эти шарды. Подскажите имеет ли смысл настраивать zookeeper на машине с Distributed таблицей? Кроме нее ничего на ноде нет. И как настроить репликацию на уровне шардов,а не только реплик?
-
этот запрос вряд ли получится ускорить, при FINAL он же в любом случае будет все данные в партиции шерстить и пытаться схлпнуть. Диски побыстрее поставить...
-
Для Distributed не нужен zookeeper. А что значит репликация на уровне шардов?
-
-
см. countIf
-
-
Привет! Пытаюсь вставить данные в TSV-формате в ReplicatedMergeTree через консольный клиент, получаю отлуп
Code: 32. DB::Exception: Attempt to read after eof
В логах ошибок ничего нет, в обычном логе есть запись о том, что запрос таки был. Сервер версии 1.1.54327, клиент 1.1.54390
В файле с данными вроде ничего криминального нет. При попытке вставить кусочек данных, откусив его через например head, одни и те же данные то вставляются, а то нет с аналогичной ошибкой. В чем может быть косяк? -
Надо посмотреть part_mutations_in_queue в таблице system.replicas. Если ненулевое, то процесс идёт. Ещё может быть назначено много мержей (столбец merges_in_queue) и они мешают.
-
Все вопрос отпал, спасибо
-
Можете уточнить как эти параметры влияют. Я их меняю, но не вижу разницы, в логе по прежнему сыпится
ReplicatedMergeTreeQueue): Not executing log entry for part 20180119_20180122_0_6_1 because source parts size (43.08 MiB) is greater than the current maximum (4.45 MiB)
И команду удаления не проходят -
коллеги а как то можно дать доступ только к одной БД в КХ ?
-
<allow_databases>
<database>telegraf</database>
</allow_databases> -
Правда, system всё равно доступна, как и список БД.
-
-
спасибо
-
а какой тип у последнего столбца ?
-
И произойдет ли вставка, если запрос сфэйлится по памяти?
-
Непарные кавычки например. Т.е. видит открывающую кавычку и в попытках найти закрывающую "доезжает" до конца файла.
-
String
-
Спасибо, попытаюсь это как-то проверить. Вроде старался экранировать.
-
Добрый день! Такой вопрос, можно ли внутри кластера подключать таблицы между нодами, если они не реплицируемые?
-
допустим, у меня есть нода-Б на ней уникальная таблица, я хочу ее использовать на ноде А
-
ну скопируйте данные ее , но вообще это что то странное
-
не-не
-
копировать нет
-
надо иметь к ней доступ
-
Трехстрочник на питоне, которым помогал кликхаусу понять непонятные ему CSV разновидности: https://gist.github.com/filimonov/57e270104a3e48d7fd6f70a3d4ec2b95
-
-
Спасибо, правильно я понял, что используется так: select .... from remote(....);???
-
Ну ограничение на память касается любого селекта, иначе получите Exception. Т.е. если например будете делать какую-то сложную агрегацию и память закончится так и не успев подготовить результат - то получите исключение и ничего не вставится. Но если это относительно простой селект (типа простая фильтрация исходной таблицы) - то он будет его выполнять в поточном режиме, типа "немного данных прочитал - немного вставил, немного прочитал - немного вставил" и т.д. Для этого памяти нужно немного и всем данным в память помещаться совсем не обязательно.
-
Правильно. Примеры можете в тестах найти: https://github.com/yandex/ClickHouse/search?l=SQL&q=remoteyandex/ClickHouse
ClickHouse is a free analytic DBMS for big data.
-
Спасибо!
-
-
Я пробовал с простой фильтрацией по одному индексному и одному не входящему в индекс полю.
Упало по памяти -
-
Может инсерт был в Temporary / Memory таблицу ?
-
Или селект с сортировкой?
-
А в какую сторону начинать копать, если периодически натыкаемся на "Another quorum insert has been already started"? При этом не системно, выявить закономерность не получается пока.
-
Привет всем.
пытаюсь перемножить попарно элементы 2х массивов, пока ничего другого не придумал:
arrayMap(i -> amount[i + 1] * price[i + 1], range(length(amount)))
Можно как то это по красивше это сделать? и я так понимаю ничего для работы с индексами массивов в лямбдах нет? -
И я правильно догадываюсь, что это может быть следствием попытки записать что-то до того, как подтвердился кворум предыдущей записи?
-
Чуть корректнее ваш вариант:
arrayMap(i -> amount[i] * price[i], arrayEnumerate(amount))Вариант "в лоб"
arrayMap( (a,p) -> a*p, amount, price ) -
arrayEnumerate - как раз для работы с индексами массивов.
-
неа, обычный, из MergeTree в ReplicatedMergeTree
-
Хм, а что лучше? Мап выглядит красивее, почему вы его выделили как "в лоб"?
-
В смысле без ненужных (в этом случае) развлечений с индексами массивов. Вот просто берем 2 массива и поэлементно перемножаем. В лоб и без посредников в виде индексов массивов :)
-
благодарствую
-
Спасибо за разьяснение!
-
Похоже на то.
https://github.com/yandex/ClickHouse/blob/d5f8e4a1a511fd0f55c9db3674056b5878e0e0d3/dbms/src/Storages/MergeTree/ReplicatedMergeTreeBlockOutputStream.cpp#L259
@milovidov_an действительно нельзя >1 кворумного инсерта одновременно?yandex/ClickHouseClickHouse is a free analytic DBMS for big data.
-
Joined.
-
-
-
-
-
Но при этом в доке: As there is no quorum acknowledgment of inserts, just-inserted data might be lost if one node fails.
Вроде бы понятно, но ошибка выше очень смахивает на недо-ack. -
-
Есть. Нужно раскомментировать <https_port> в конфиге и настроить openSSL: https://clickhouse.yandex/docs/en/operations/server_settings/settings/#server_settings-openSSL
Как вариант - есть ещё chproxy: https://github.com/Vertamedia/chproxy -
понял, спасибо
-
Добрый день. Удалось ли решить эту проблему? Возможно ли достать вложенные атрибуты в описании словаря?
-
Joined.
-
Делаю выборку из таблицы, в условии необходимо указать имя и диапазон дат. Первичный ключ состоит из имени, диапазона дат и cityHash. Партиции по суткам. Как я понял для того, чтобы эффективнее найти можно написать условие prewhere log_date='нужный день'. А как быть с условиями остальными? Куда их правильнее поместить в where или prewhere? В документации сказано не указывать в prewhere индексы.
-
диапазон времени*
-
-
можно
-
Покажите запрос создания таблицы и сам запрос
-
Если я правильно все понял, вам вообще не нужно юзать prewhere, все поля из условий есть в индексе, prewhere отсекает данные, по которым нет индекса.
-
-
-
спасибо, про это и хотел узнать, что если поля указаны в первичном ключе, то есть ли смысл их в prewhere писать
-
-
SELECT arrayMap(key -> dictGetString('dict', 'attr', key), arr) - как-то так
-
-
-
Почему 2007? Не было ж стандартов этого года.
-
-
-
create table test.test(a UInt64,b UInt64) Engine=MergeTree partition by a order by tuple ();
insert into test.test select round(number/1000000), throwIf(number=8000000) from numbers(15000000);
select count() from test.test
7340032
drop table test.test;
create table test.test(a UInt64,b UInt64) Engine=MergeTree partition by a order by tuple ();
set max_block_size = 15000000;
set max_insert_block_size = 15000000;
insert into test.test select round(number/1000000), throwIf(number=8000000) from numbers(15000000);
select count() from test.test
0 rows in set.
правда max_block_size наоборот, увеличивает расход памяти. - 11 July 2018 (132 messages)
-
Спасибо вам
-
На самом деле эти параметры позволяют чуть меньше ушатывать сервер при insert select, обычно этого достаточно. Эта запись в логе означает что, условно, сейчас работают несколько тредов на мерж которые суммарно превышают max_bytes_to_merge_at_min_space_in_pool, там немного сложнее, но примерно так. Как только будут ресурсы сервер эти куски помержит. Если критично, можно копаться дальше, если нет то можно понизить уровень логирования с debug на какой-нибудь более приемлемый.
-
-
Таких записей в логе много, и судя по всему из-за этого у меня мутация зависает примерно посередине. Вот и хочу разобраться как делать INSERT INTO чтобы таких больших блоков не появлялось
-
CREATE TABLE log.AggregateEventsLog (
SysRowDate Date,
SysRowKey FixedString(36),
EntityID FixedString(36)
...
) ENGINE = Distributed(central, 'log', 'EventsLog')
CREATE TABLE log.EventsLog (
SysRowDate Date,
SysRowKey FixedString(36),
EntityID FixedString(36),
...
) ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/EventsLog',
'{replica}',
SysRowDate,
(EntityID, SysRowKey),
8192
) -
-
вроде в докее было написано что не могут
-
насколько помню раньше точно не могли
-
и это на мой взгляд правильно
-
Могуг, разные версии КХ совместимы на уровне протокола. В некоторых (очень редких) случаях могут вноситься изменения, нарушающие эту совместимость, информация об этом и инструкции обновления при этом будут появляться в changelog.
-
-
обновляем по очереди проблем нет
-
Алексей говорил, что в яндексе тоже реплики обновляют по очереди.
-
ну реально даже если репликация не работаеет на время обновления данные подтянутся как только оно закончится
-
а это реально быстрый процесс
-
Там вопрос только в том как правильно "инициализировать" данные в матвью. Можно создать матвью без populate, сохранив момент создания матвью (все данные "новее" будут автоматически приезжать в матвью) а потом доинициализировать старшие данные с помощью INSERT ... SELECT ... WHERE timestamp < mat_view_creation_ts.
-
Всем привет, может сталкивался кто-то, добавлял табличку ReplicatedMergeTree на одной из нод, таббикс повис, а после рестарта стали валиться ошибки вида
2018.07.11 09:36:57.253583 [ 1 ] <Warning> ZooKeeper: Error on attempt 0: connection loss. Retry
2018.07.11 09:37:07.254277 [ 1 ] <Warning> ZooKeeper: Error on attempt 1: connection loss. Retry
2018.07.11 09:37:17.257471 [ 1 ] <Warning> ZooKeeper: Error on attempt 2: connection loss. Retry
2018.07.11 09:37:17.259287 [ 1 ] <Error> Application: zkutil::KeeperException: connection loss, path: /clickhouse
После это CH падает. -
Блин, опяь хаки :(
Было бы круто если б можно было параметром взять лок на исходную таблицу -
на всех нодах падает? судя по всему что то сильно сломалось в зукипере, проверьте есть ли там пути кх
-
Другие не трогал пока, одну ноду мучаю
-
ну проверьте с нее коннект до зукипера через телнет
-
Не знаю какой там юзкейс у вас, но если представить себе что таблица имеет размер в несколько терабайт и данные в неё валятся со скоростью сотен тысяч строк в секунду, то идея "лока на запись" в эту таблицу пока инициализируется матвью (а оно при большой исходной таблице может часами инициализироваться) - выглядит так себе. Это можно сделать без локов, но задача не очень простая. Workaround существует и довольно тривиален, поэтому я так понимаю эта задача не приоритетна. Если вы считаете иначе - код Кликхауса открыт, пулл-реквесты принимаются :)
-
-
-
Отличная идея. Можем расчитывать на пулл-реквест? :)
-
У нас как раз юзкейс где можно остановить запись т.к. стримим из кафки, а вот каждому аналитику объяснять как делать заполнение после создания вьюшки - это боль
-
на плюсах не пишу(
хотя возможно стоит начать -
-
"Каждому аналитику". Сорри, но если их много - то правильно ли было бы если бы все они могли менять структуру базы, выполняя DDL, на произвольное количество времени останавливая запись (для всех остальных)?
-
Если остановка записи допустима - то значит допустимо и отсутствие самых свежих данных в матвью. Отсюда вопрос - правда ли в этом кейсе необходим матвью?
-
-
-
-
смотря что вы имеете в виду
-
-
Ну задетектить что нода упала
-
-
-
-
У нас аналитики пишут запросы, а view / matview добавляют программисты. Если какой-то запрос аналитиков оказывается настолько замечательным что захотим его видеть в realtime - тогда и создается mat view. У матвью на самом деле есть немало ограничений, и поэтому далеко не из каждого запроса аналитиков можно сделать matview. Объяснять им какие есть ограничения и что можно считать в realtime, а что нет - в общем вещь не тривиальная. Если ваши аналитики настолько опытны в кликхаус, что понимают ограничения матвью, то и workaround с "ручным" populate для mat view не должен составлять проблемы.
-
Используйте внешние инструменты - nagios / zabbix / Pandora. Для метрик - например Grafana. См.
https://www.altinity.com/blog/2018/4/20/clickhouse-monitoring-with-graphite
https://groups.google.com/forum/#!topic/clickhouse/iwIWWPwneqMClickHouse Monitoring with GraphiteMonitoring is an important part of operating any software in production. The proper monitoring solution needs to store metrics somewhere as well as provide visualization capabilities. ClickHouse does not have such a tool packaged, but there are several 3rd-party monitoring solutions that can be used. In this article, we will describe how to configure Graphite for monitoring ClickHouse metrics.
-
Это на самом деле часть философии UNIX - каждый инструмент должен делать одну вещь, но должен делать её хорошо. Кликхаус - это база данных для аналитики. И делает это хорошо :)
-
-
А для мониторинга есть другие инструменты :)
-
возможно ли для типа float64 в функции toString, например, указать нужное количество цифр после запятой?
-
Joined.
-
можно так
select toString(round(1234.5678, 2)) -
спасибо, но мне нужно нулями заполнить недостающие
-
Поделитесь, пожалуйста, Вашим опытом как правильно поддерживать масштабируемость и расширяемость ClickHouse c точки зрения DevOps.
Мы переезжаем на новое железо - сейчас в CH 4 ноды (2 реплики 2 шарда + куча намешанных решений, большая разрозненность).
Есть желание держать гомогенный кластер: все таблицы distributed, две реплики. Насколько это хорошая идея?
Добавление нового железа в кластер должно быть относительно простым (возможно c апдейтом weights).
Кластер может расти до десятков нод, мой вопрос: как правильно организовать фреймворк конфигов для реплик/шардов - или в любом случае это ручные изменения в .xml ? -
С ручными изменениями - уже на двух серверах начинается боль - типа тут поправили, а там забыли. Почти все можно автоматизровать с помощью соотвествующих инструментов типа puppet / chef / ansible / salt / cfengine
-
Мы ансиблом рулит, он генерит конфиги кх
-
Самописное что-то?
-
нет ансибл не самописный
-
я имею в виду модули конечно же)
-
вроде не использую
-
там же конфиг простой
-
пару циклов и готово
-
ну и в целом у нас по себе кх простой
-
,
-
-
Увы, нельзя. И это засада, если всё строится на обязательной кворумной записи, как у нас, например - больше одного потока записи не пустишь. И воркеры, которые иногда просыпаются чтобы внести корректировки в данные, в результате иногда спотыкаются - приходится это учитывать и повторять операцию.
-
Есть 2 таблички одинаковой структуры с частично дублирующимися записями, как скопировать данные в третью, но что бы все строки были уникальными. Кто знает?
-
-
Например так:
create table_c engine=... as select ... from (select * from table_a union all select * from table_b) group by ... -
-
-
-
-
Или движок Merge https://clickhouse.yandex/docs/en/table_engines/merge/ с последующим GROUP BY.
-
таблички GraphiteMergeTree
Спасибо, буду пробовать. -
Действительно засада. По идее каждый инсерт отдельно и независимо должен ждать кворума. Можно бы как-то сверху ограничить количество одновременно ожидающих кворума инсертов, и после этого переставать принимать новые. Но переставать принимать новые инсерты сразу же, из-за единственного не завершенного инсерта - засада.
-
Возможно так сделано чтобы не было колизий с фоновыми слияниями.
-
"Only UNION ALL is supported. The regular UNION (UNION DISTINCT) is not supported."
-
Поэтому UNION ALL + GROUP BY
-
Спасибо обоим. Ушёл думать о том, как жить дальше.
-
Добрый день! Столкнулась с такой задачей по связи mongobd и внешних словарей. Можно ли как-то описать словарь, чтобы вытащить в атрибут вложенное поле или поле элемента массива? Например есть коллекция со структурой {"name" : "user", "details" : {"sex" : "male", "age" : 20}, "languages" : [{"name" : "java", "lines" : 10000}, {"name" : "c", "lines" : 6000}]}. Во-первых, интересует, как сделать атрибутом словаря, например, пол. Во-вторый, возможно ли сделать словарь из элементов массива languages с соответствующими атрибутами name и lines? В документации подобного не нашла, буду крайне признательна за ответ.
-
Добрый день. Насколько я знаю, нет способа работы с вложенными элементами.
-
-
-
Пока parts_to_do не опуститься до 0 и is_done не станет 1
-
-
а кто нибудь расширял зукипер с 3 нод до 5 ? нет ли каких то проблем?
-
Joined.
-
Есть способ выполнить OPTIMIZE TABLE, который падает по памяти?
Code: 241. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Memory limit (for query) exceeded: would use 12.11 GiB (attempt to allocate chunk of 131072 bytes), maximum: 12.11 GiB: (while reading column originalUrl): (while reading from part /clickHouse/clickhouse/data/default/prodstats/20160715_20160715_61128_61128_0/ from mark 0 with max_rows_to_read = 8192).
Размер указаного парта на диске 2.1 Мб -
Странно. Он вроде во время слияний сильно память не ест. Или у вас какие-то сложные агрегации при слияниях? Да и размер части небольшой...
-
Я на такое поведение натыкался при обычных запросах, что-то типа
SELECT url FROM table WHERE id = 1 LIMIT 1
и такой запрос выедал 10 Гб и падал. Хотя видно что вернуть должно одну запись. И куда делись 10 Гб - не ясно (до сих пор) -
-
-
select sum(cityHash64(originalUrl)) from default.prodstats where _part = '20160715_20160715_61128_61128_0'
-
Тоже об этом подумал, но тогда вроде как должен сильно материться про контрольные суммы, пробовать скачать битый парт с другой ноды и т.п.
-
-
-
Ну сумма и сумма :) главное что прочиталось. А в логах сервера нет чего-то интересного?
-
-
-
-
Таблица prodstats типа ReplacingMergeTree, сегодня перезалили большой кусок данных за несколько месяцев из прошлого, залили не сильно большими кусками и словили ошибку "Too much parts". Стали выполнять ручками OPTIMIZE TABLE и словили указаную выше ошибку
-
У нас нет репликации (похоже это очередной сигнал сделать её)
-
Спасибо, буду пробовать
-
Это больше всего и напрягает. Спасибо
-
Можно включить part_log посмотреть что там происходит.
-
Я уже удалил парт, завтра перезалью и посмотрим что будет
-
-
-
“это фича, не баг” - есть реплицируемая таблица, есть партиции, две реплики, если на одной из реплик сделать alter table … detach partition … запрос реплицируется без проблем, далее alter table … attach partition … - локально отработаеть норм, а на соседней реплике данных так и не будет. Оказывается подобные запросы надо делать на лидере. Вопрос в том, почему detach/attach работают так не предсказуемо (хоть бы ошибку показал)? 🙂
-
-
-
Ну вроде все логично, кх не может знать есть у вас в детаче на реплике данные или нет
-
-
Ну в этом плане они пока что логичные
-
-
А какая разница где сделать детач?
-
-
А какая разница где сделать аттач?
-
Атач разве реплицируется как команда?
-
-
-
Ну я не понял как это может привести к задваиванию данных, а если реплицируется то по идее задваивания данных быть не должно
-
Кх просто увидит что парты такие уже есть и не будет реплицировать
-
-
-
-
В доке есть такое
ALTER TABLE [db.]table DETACH PARTITION 'name'
…
The query is replicated – data will be moved to the 'detached' directory and forgotten on all replicas. The query can only be sent to a leader replica. To find out if a replica is a leader, perform SELECT to the 'system.replicas' system table. Alternatively, it is easier to make a query on all replicas, and all except one will throw an exception.
Но исключения нет ни в каком случае 🙂 похоже таки на баг -
Ну с детачем понятно
-
Проблема же не в нем
-
А в аттаче
-
А они в любом случае появлятся будут, тут можно смотреть либо в сторону увеличения max_bytes_to_merge_at_min_space_in_pool либо уменьшения количества тредов для мержа. По сути это нормально что он откладывает мержи и ждет появления ресурсов. Насчет мутации не совсем понял, почему она должна зависить от insert'a?
-
так себе идея, можно на время отсановить запись и запустить insert into select и включить запись )
-
А вот и я не знаю почему мутация не проходит, если делать её по таблице, заполненой через INSERT INTO
-
Если есть пример для воспроизведения то, я думаю, @ztlpn с удовольствием посмотрит )
-
Попробую сделать
-
Joined.
- 12 July 2018 (251 messages)
-
Joined.
-
Коллеги, привет.
Есть около 1,5ТБ данных, запись и чтение каждую секунду, но небольшими партиями.
Какие будут требования по железу?
Понятно, что никаких HDD, только SSD.
Два CPU, вопрос по объему RAM, читал что CH очень любит память. -
И второй вопрос, по поводу репликации мастер-мастер, насколько повышенные требования к каналу между ДЦ?
-
Никаких
-
Это полностью зависит от вас. Для самого КХ памяти нужно немного. Остальное - память для запросов. Или должно целиком влазить или применять до определенной степени хитрости. С телефона неудобно подсказать, но поищите здесь по сообщениям что-то вроде query limit, будет ссылка на презентацию.
-
У нас такой объем на хдд нормально лежит, память наверно больше зависит не от данных а от запросов
-
У кх только один тип репликации, канал не важен, что не подтянулось сейчас, подтянется потом.
-
По памяти у нас кстати ноды кх по шесть гигов памяти или по семь
-
А я поддерживаю официальные рекомендации
clickhouse.yandex/docs/ru/operations/tips/
Памяти - чем больше, тем лучше. Идеально - если объем данных который необходим для большинства запросов будет помещаться в памяти. Т.е. если у вас 1.5 Тб данных, к примеру за год, а большая часть запросов запрашивают последний месяц и только половину колонок, то хорошо бы было если б у вас было получено крайней мере 1.5тб/12/2 примерно 64 Гб, больше - лучше. Если памяти достаточное количество, то количество обращений к диску минимально, и быстрый диск становится менее важен. -
Доброе утро, в документации CH есть описание конфиг-файла ZK zoo.cfg, но там не прописаны ноды:
#server.1=xxx.xxx.xxx.xxx:2888:3888
#server.2=xxx.xxx.xxx.xxx:2888:3888
Если их не указывать, ZK запускается в режиме standalone. Соответственно где прописывать ноды? Только в конфиге CH? -
можно положить отдельным файликом в config.d
-
А, пардон, вы про сам zookeeper
-
Если нужен кластер - таки надо прописать все ноды в каждом конфиге зукипера
-
Что-то типа такого:
server.1=192.168.110.101:2888:3888
server.2=192.168.110.102:2888:3888
server.3=192.168.110.103:2888:3888 -
Спасибо, проблема в том, что при указании серверов кластера ZK, zk-сервер не стартует...
-
А они друг для друга доступны вообще?
-
-
Ну а накой кластер без кворума?
-
-
кстати, у зукиперов должны быть разные id, иначе таки да, друг друга не признают
-
И 3 для зукипера мало, лучше 5 хотя бы
-
А с чем связано количество?
-
ну с тем что из трех может отвалиться один а из пяти два могут отвалиться и система будет работать , если в кз нет кворума или он упал полностью блокируется записть в кх
-
А... Я почему-то про быстродействие подумал.
-
Быстродействие, наоборот, уменьшается
Но что вам это абстрактное быстродействие?
Главное, на сервера с КХ не кладите зукипер -
-
А можно поподробнее? Собственно так и хотели сделать, на серваках с CH развернули ZK. А как у вас реализовано?
-
-
-
ну или зажмет по памяти и его убьет оомкиллер что полностью парализует кластер
-
Ну это вариант, скорее, из невероятных.
Из опыта, быстрее упадет CH, если не тюнить OOM score -
Т.е. если у меня 6 нод с CH разворачию столько же под ZK?
-
нет
-
кх отдельно зк отдельно
-
-
-
зк должно быть не четное количество
-
или 3
-
или 9
-
-
-
ну при четном будут проблемы с кворумом
-
-
-
ну у меня крутится на одном гиге оперативы и одном ядре
-
но и данных в кх у меня немного
-
сам зк потребляет чуть меньше 200 мб
-
данных всего поллтора тб
-
ну и ложу я их правильно пачками и редко
-
У меня - итого полгига памяти занято на любом узле зукипера + база в 4.6Гб, но я уменьшил количесво логов и интервал сброса. По диску точно не стоит ужиматься хотя бы на первое время.
-
В самом зукипере сейчас порядка 130к записей
-
-
не нужны клиенты зк
-
кх умеет сам в них ходить
-
ммм, понятно
-
а ни у кого не умирал полностью зукипер?, что делать если пришлось его поднять с нуля ? какой лучше сценарий применить для востановления ?
-
восстановить одну ноду из последнего работающего бекапа, у остальных прибить базу.
-
Потом долго и нудно делать attach на сброшенные партиции...
-
Можно подробнее? Я всегда думал что zk нужен Только для репликации, те упал зукипер, нет репликации... И все. Зачем прибивать данные и делать аттач?
-
прибивать данные надо в зк
-
А
-
чтобы не было конфиликта данных
-
Ноду
-
А можно прибить ноду рутовую
-
Оно пересоздать?
-
Пересоздаст?
-
что такое рутовая нода ?
-
речь про фс или про содержимое зк?
-
рутовых нод вроде нет ни у зк ни у хк
-
Zk понятие есть такое
-
Нола
-
Нода
-
Те узел в иерархии
-
/ cliclhouse это в терминологии zk нода
-
Если я ничего не путаю
-
а какой смысл удалять /clickhouse?
-
то есть по сути это уже и так случилось в случае падения зк глобального
-
Чтобы удалить из zk данные
-
Сам же писал
-
Удалять надо БАЗУ зк. Всю.
-
Тогда узел подтянет её оттуда, где данные есть.
-
ну там по сути будут просто пустые зк и на один из них надо положить бекап
-
Удалять файлы базы перед запуском зк-неудачника
-
-
ну там просто на диске он хранит снапшоты
-
снапшотами вирталки
-
тупо копировать их можно
-
Так оказалось проще всего
-
А вот вы про что, а что будет если развалить ЗК кластер, прибить все в ЗК, не восстанавливая бакап стартанутт кластер, поднять ch
-
Ck причем в данными
-
да
-
кх скажет "а у меня партиции зк не соответствуют - сброшу их нафиг"
-
О, весело
-
ну в детач просто ?
-
Те если бакап восстановим
-
То надо будет делать аттач того что не попало в бакап
-
да, но часть партиций таки упадёт и потребуется их зааттачить на одном из узлов.
-
Все понял, надо будет потестить разные ситуации
-
С другой стороны падежка кластер ЗК это надо умудриться, или я не прав?
-
Я не встречался, но и не эксплуатировал его акьивно
-
-
select * from system.functions where name = 'toStartOfFifteenMinutes'
-
-
-
-
Господа подскажите, а можно ли в clickhouse делать алиасы для однотипных конструкций, если да то как =)??
-
-
а можно забиндить/за алиасить visitParamExtractType =) ?
-
-
спасиб
-
подскажите, как очистить таблицу, если партиция не задана?
-
Привет!
Обновил кликхаус с 1.1.54245 до 1.1.54388
Потребление памяти внезапно упало раз в 10, это нормально? -
зависит от абсолютных значений
-
хотя я вру, это только с VIRT так
-
-
-
Еще вопрос, настройки merge_tree
max_parts_to_merge_at_once и max_parts_to_merge_at_once_if_small в новой версии заменены на что-нибудь? -
А как думаете, в какое место в рейтинге КХ можно здесь ввернуть Apache Kudu?
-
-
Apache Kudu - Fast Analytics on Fast Data
A new open source Apache Hadoop ecosystem project, Apache Kudu completes Hadoop's storage layer to enable fast analytics on fast data
-
все тесты врут
-
мы вертику сравнивали и получали гораздо лучшие результаты
-
На русском
https://en.wikipedia.org/wiki/Apache_KuduApache KuduOpen Source Software
-
плюс к этому, в вертике поддерживается полностью sql
-
без костылей :)
-
и масштабируемость более удобная
-
Вертику с чем сравнивали - с КХ или с Куду?
-
с кх
-
куду не щупали
-
Да надо бы. Говорят, они из пару месяцев назад в бету вышли
-
Ябыпосмотрел
-
а нужно ли ? ))
-
Про SQL согласен, а с масштабируемостью то что не так )
-
большинству - постгерса за глаза
-
с кх - так вообще полет в космос
-
у нас прям идеально, кластер из 12 машин стоял
-
завелся без проблем, на протяжении года - 0 проблем
-
зато вот с кх - уже неоднократно слышал о траблах
-
-
сколько нод ?
-
-
неплохо, значит повезло
-
-
минимум от трех человек слышал
-
у нас 15*2ДЦ на кх, полет нормальный
-
поделитесь?
-
-
-
да это бесспорно, фактор кривых рук никто не исключал :)
-
-
может отдельный чат организуете ClickHouse vs Vertica vs KUDU?
-
зачем ? ))
-
еще тогда по куде нужно )
-
именно
-
-
-
-
это да, но тут 99 % уверен далеки от исходников кх :) и вряд ли сами смогут запулреквестить в случае проблем что-нибудь. Надеюсь, что ошибаюсь, и процент таких меньше :)
-
некоторых еще смущает цена
-
даже яндекс смущала )
-
ентерпрайзу понятно что как бы пофиг
-
-
ну там просто такой ценник что за все железо проекта мы отдаем меньше чем за лицензию вертики , а кх это малая часть проекта
-
по чейнджлогу они 2 года и несколько месяцев назад вышли из беты :)
-
Зависит от методики проведения тестов. На плоской таблице без джойнов КХ обычно быстрее Вертики в два раза (при прочих равных, то есть одинаковая сортировка, и нет большого числа колонок, которые можно супер-эффективно заэнкодить на Вертике). С джойнами Вертика может быть быстрее.
-
-
-
в конфиге шард надо прописывать если хотите юзать дистрибьтед таблицы, в вашем случае они не нужныможно и не конфигурить
-
-
а какой смысл в балансере
-
?
-
там идёт соединение кх сразу ко всем узлам из конфига, балансер не нужен, достаточно прописать нужное куда надо
-
ну просто балансер у вас в итоге станет единой точкой отказа
-
какой в этом смысл
-
если у вас много зк в разных дц то может какой то смысл и есть нно опять таки это крайне сложный конфиг
-
-
это не будет влиять
-
вы криво настроили зк
-
либо у вас два узла зк
-
а для зк надо больше половины нод для кворума
-
два двух нод зк это 2
-
то есть надо зк иметь 1 -3 -5 -7 -9 и тд
-
-
-
-
Перед отключением второго дожидаетесь синхронизации зк?
-
на три секунды или что ?
-
или вы одновременно выключаете и включаете ?
-
-
в логах смотреть надо. Правда, что там по этому поводу должно писаться уже ен помню.
-
-
ну это печаль
-
-
ну логика она слава богу общая для всех
-
-
не могу запустить кликхаус из-за ошибок вида "Cannot create table from metadata file /var/lib/clickhouse/metadata/database/table.sql, error: ZooKeeperImpl::Exception: Session expired"
на старой версии вроде работало терпимо
Как с таким бороться? Есть какой-то таймаут зукипера? -
ну он не может видимо подключиться к зк
-
Joined.
-
попробуйте телнетом работает ли коннект ок
-
20+ старых кликхаусов прямо сейчас работают нормально, а новые не хотят стартовать
-
Зк-то работают, проверял
-
-
Тогда тем более, почему оно до сих пор не в сравнении?
-
@milovidov_an
Алексей, не хочешь добавить в бенчмарки Apache Kudu?
https://clickhouse.yandex/benchmark.html -
вроде этот момент поправят в ближайших версиях
-
Joined.
-
Joined.
-
а есть какие-то eta?
-
Что такое ета
-
Тут же опенсоурс как сделают так сделают
-
Удаление вообще обещали в первом квартале а появилась аж в третьем в итоге
-
Всем привет, я немного подзастрял, и буду очень благодарен за пинок в нужном направлении, допустим я пишу в Clickhouse статистику по http кодам, в виде инкрементных каунтеров и хочу посчитать rate при помощи runningDifference() если я беру к примеру и ставлю в where http_code = code и считаю по одному коду, все отлично, но если кодов больше 1 никакой group by не спасает, и функция считает дельту между каунтерами разных кодов.
-
куда смотреть?
-
Была подобная проблема. Вариантов два: писать сырые данные, без инкремента. На каждый код делать отдельный запрос.
-
последнее не вариант, над первым думал
-
В случае с кх правильней будет писать сырые данные
-
не хотелось генерировать лишний трафик, реквестов достаточно много, ладно, в любом случае спасибо, если красивых вариантов нет, может придется писать без инкремента
-
А не прокатит что-то типа runningDifference(if(code = 200, counters, 0) ) as counters_200, runningdifference(if(code = 400,counters,0)) as counters_400,... ?
-
Не в курсе как функция работает:)
-
А почему вы думаете, что будет лишний трафик? Вы же не поштучно инсерты делаете
-
Можно данные паковать перед тем как отправлять на вставку
-
Joined.
-
Подскажите пожалуйста, словарь выдает ошибку
Code: 50, e.displayText() = DB::Exception: Unknown type Array(String) e.what() = DB::Exception
словари не поддерживают массивы?
вроде раньше помню небыло проблем -
Не поддерживают и вроде бы никогда не поддерживали
-
Последние полгода-год так точно :)
-
-
Ну он же опенсоурс можно менять как хочешь
-
к сожалению если это нельзя построить динамически вокруг произвольного количества кодов не прибивая гвоздями ничего, то тоже не вариант
-
спасибо
-
инсерты не поштучно конечно, но точек откуда приходят данные много и они нагружены, собственно для этого и задумывались когда то инкремент каунтеры "на местах", чтобы уменьшить "обьем" передаваемых метрик
-
Подскажите, как пользоваться словарем типа cache.
Пробовал указывать разные значения переменной
<size_in_cells>1000000000</size_in_cells>
но словарь, таки не подгрузился -
-
Joined.
-
Это понятно, но интересует можно ли это сделать через конфиг без пересборки всего сервера :)
-
Кх достаточно много может инсертов принимать. Я когда только начинал использовать КХ, то писал в 100 потоков ) причем инсертил по 2-3 запоса в секунду и КХ сглатывал это все. Писал в одну ноду, но distributed таблицу.
-
Поэтому не бойтесь писать «лишние» метрики и даже если инсертов из двух-трех мест приходит. Я ловил проблемы, когда КХ не успевал мерджить данные и «подвисал», но это было из-за того, что образ диска лежал на shared маунте по nfs...перевезли на локальную машину и вуаля! Проблем не стало.
-
кстати, господа, объясните мне такой вопрос.
Есть тип таблиц Buffer, но кого не почитаешь, все в качестве очереди используют либо каффку, либо тупо в MySQL вставляют, откуда пачками уже отправляют в КХ.
Есть какие-то минусы использования Buffer?
То что хранится в памяти меня устраивает -
Ненадежно :) я просто пишу файлы на диск в формате tsv, а потом через cat в пайплайн заворачиваю и через clickhouse-client вставляю одним блоком
-
Ну и бывали случаи когда буфер лагал по какой-то причине
-
ну, применительно к моему случаю, можно, конечно и так попробовать, 1 поток == 1 файл
-
у меня в рамках потока конкуренции нет
-
Я после записи в файл подписываю его суфиксом -flushed, что значит, что файл можно писать в кх. Раз в минуту собираю эти файлы в кучу, списком и пихаю в кх
-
У нас тоже
-
Joined.
-
у метрики в логс апи нигде нет ключевиков??
-
Кто такие ключевики?
-
которые в другом отчете есть
-
Если таблица назначения является реплицируемой, то при записи в таблицу Buffer будут потеряны некоторые ожидаемые свойства реплицируемых таблиц. Из-за произвольного изменения порядка строк и размеров блоков данных, перестаёт работать дедупликация данных, в результате чего исчезает возможность надёжной exactly once записи в реплицируемые таблицы.
В связи с этими недостатками, таблицы типа Buffer можно рекомендовать к применению лишь в очень редких случаях. -
про ньюансы выше
-
-
В принципе, хочу. Но сейчас добавлять не будем.
Стоит иметь ввиду следующие соображения:
1. Добавление новой системы в этот бенчмарк занимает от нескольких дней до двух недель времени одного разработчика.
2. Этот бенчмарк не очень удобен, потому что основан на закрытых данных (датасет из Яндекс.Метрики). Сейчас лучше приложить усилия, чтобы сделать датасет открытым, вместо того, чтобы просто добавлять больше результатов. Недавно для этой цели была разработана утилита clickhouse obfuscator, которая позволяет анонимизировать данные. Требуются ещё некоторые доработки и согласования, и может быть получится сделать открытый датасет с почти настоящими данными. - 13 July 2018 (127 messages)
-
Joined.
-
SELECT query doesn't have required column
-
Кто-нибудь сталкивался? При джоине.
-
select terminal_id, remote_id, city from a any left join b using terminal_id, remote_id
Запрос выглядит так -
Леша, доброго дня, когда новый митап, канал с фразами простаивает
-
как то в кликхаус застримить ключевые слова с поиска и директа возможно?
-
Joined.
-
seems legit
-
Джентельмены, а есть более быстрый способо смигриовать 1.5ТБ логов с Постгреса на КХ?
-
Желательно, быстрее чем через csv :)
-
Пока нашел только https://habr.com/post/416681/Как из PostgreSQL и ClickHouse в Python много, быстро и сразу в numpy
Разбил много кружек в поисках решения для быстрого получения длинных историй цен для большого количества активов в Python. Ещё имел смелость желать работать с це...
-
возможно есть другие варианты?
-
-
psql -c "COPY ... to stdout" | clickhouse-client ...
-
ну или словарь, угу :)
-
ПРивет!
В логе горы ошибок вида "(StorageReplicatedMergeTree): DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 33, e.displayText() = DB::Exception: Cannot read all data, e.what() = DB::Exception"
что это, и как с этим бороться? -
спасибо, понял.
Печаль, придётся колхозить -
Не понял вот этого:
OPTIMIZE TABLE Turnovers
Received exception from server (version 1.1.54388):
Code: 194. DB::Exception: Received from 127.0.0.1:9003. DB::Exception: Received from .... DB::Exception: Password required for user default.
У юзера default конечно есть пароль, но я его ввел когда залогинился в консоль... -
-
-
-
-
-
-
-
-
-
У вас более одного шарда?
-
-
Вот такая загадка:
Сделал для реплицируемой таблицы ALTER TABLE ... ADD COLUMN AddDate DateTime DEFAULT now(); (replication_alter_partitions_sync = 2)
При попытке посмотреть значение это колонки для старой строки уткнулся в эксепшн: DB::Exception: Not found column AddTime in block.
Как я понял по документации, такого быть не должно, колонка должна догенеряться при селектах, или возвращаться пустой.
WTF? -
Если данные пишутся только на этом сервере - то да.
-
-
Joined.
-
Зависит от движка матвью. Реплицируемый не могу рекомендовать. А так на каждой машине отдельно можн по матвью делать. Инсерты ловят
-
Joined.
-
Везде где пишите
-
-
Господа, никто не сталкивался с задачей добавить колонку и добавить её заодно в первичный ключ? По идее, для этого старые данные перестраивать не нужно, поэтому такое должно быть возможно.
-
Для нереплицируемых таблиц это возможно
-
У нас везде реплицируемые 🙂
-
-
Я уже думал про то, что можно просто .sql-файл с описанием таблицы поправтиь и перезапустить ClickHouse
-
Понятно, спасибо :).
-
Так как можно понять, откуда берется "Cannot read all data"? на старой версии такого не было
-
-
-
походу из-за разных версий.. тогда продолжаю обновлять
-
А можно полную ошибку с трейсом и кусок лога про этот тред ( все вокруг с совпадающей цифрой в квадратных скобках?
Но скорее всего это новая известная бага - потерялось выставление таймаутов - уже починено, будет в следующем релизе -
тут похоже на такое: https://github.com/yandex/ClickHouse/issues/1818Проблемы после обновления на версию 1.1.54342 · Issue #1818 · yandex/ClickHouse
Пытался обновиться с версии 1.1.54327 на 1.1.54342 и получил множество ошибок следующего вида: 2018.01.24 12:24:59.356556 [ 5 ] DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageRe...
-
дообновлю и буду смотреть
-
-
А есть коннекторы ClickHouse к Google Data Studio?
-
Ну или кто может его написать и за сколько? )
-
а все же, можно ли как-нибудь увеличить таймаут для зукипера?
-
тупо не могу запустить сервер из-за "session expired"
-
Ребят, привет! Подскажите, пожалуйста, как можно грузить данные из hive в QH без Spark?
-
к сожалению, напрямую никак
-
если совсем без скриптинга, то совсем никак :)
-
можно посохранять в JSON/TSV, потом каждый файлик пораздельно через CURL засунуть
-
А на чем можно подводить? Есть что-то готовое?
-
Подкодить *
-
-
Подскажите как можно получить заселектить значения в массив, пример того что хочется получить
SELECT
city_id,
array(users)
FROM session GROUP BY city_id; -
-
спасибо
-
-
Joined.
-
-
там ждут ебилдов?
-
-
-
На PyPy можно довольно быстро качать, только главное - батчи в памяти помещать :D
-
давно, еще в 2017
-
-
-
вот это я невнимательно прочитал...
-
-
-
Изменение типа у столбцов, входящих в первичный ключ возможно только в том случае, если это изменение не приводит к изменению данных (например, разрешено добавление значения в Enum или изменение типа с DateTime на UInt32).
-
-
-
Кинь ссылку на Руру . Первый раз слышу
-
Что-то не хватило прописывания логина/пароля в репликах :(
optimize table Turnovers
DB::Exception: Received from ......:9000, 10.100.20.22. DB::Exception: Password required for user default. -
-
-
-
-
Собрать и использовать. основные отличия будут с init скриптами если у вас не systemd
-
подскажите кто с талкивался с переносом больших таблиц
- есть широкая таблица (~140 колонок ) в которой порядка 5 мрд. записей
- было принята решение изменить структуру таблицы ( внедрить Nested структуру для многих из колонок )
- Запрос типа INSERT INTO table_new SELECT table_from даже за месяц падает по памяти
Есть варинанты переноса данных ? -
-
-
на счет месяца, я погарячился, за один день не могу выгрузить
а так схема хорошая -
-
а сколько данных за день в гигах и сколько памяти что не можете выгрузить ?
-
запрос съедает 10Гб
-
чего нет, такого нет
-
ну можно воткнуть больше памяти, а так да есть проблема как гранулировать для переливки данные если небольшой обьем памяти
-
-
понял, спасибо
-
-
Привет!
Есть битовое поле.
Каждому биту соответствует массив чисел.
Хочется каждому экземпляру битового поля ставить в соответствие массив чисел
Например, возьмем число 201326592 = (1 « 26) + (1 « 27)
числу 26 можно поставить в соответствие числа -2, 555
числу 27 можно поставить в соответствие числа -2, 777
хочу получить массив [-2, 555, -2, 777]
Я пытаюсь это делать примерно так
select arrayMap(y -> splitByChar(',',y), arrayMap(xx -> caseWithExpr(xx, 26, '-2,555', 27, '-2,777', '666'), arrayMap(xxx -> log2(xxx), bitmaskToArray(201326592))))
но результат немного не тот
[['-2','555'],['-2','777']]
Есть идеи как это сделать правильно? -
не помогло
-
А какой у вас select? С группировкой и сортировкой?
-
сортировки нет, групировка только по одной колонке, но много функции groupArray()
-
1. нет.
2. это может быть не только таймауты ( они вот тут - https://github.com/yandex/ClickHouse/commit/98f8ae3edb65f237181b4f7aa11e47154db20667).Fixed error with timeouts [#CLICKHOUSE-2837] · yandex/ClickHouse@98f8ae3ClickHouse is a free analytic DBMS for big data.
-
вот такой запрос
INSERT INTO table_new SELECT
session_id,
any(column_2),
...
...
any(column_61),
groupArray(column_62),
...
...
groupArray(column_140),
FROM table_old
WHERE date = '2017-07-10'
GROUP BY session_id; -
мб стОит попробовать вставить в одном запросе одну часть колонок, во втором - вторую часть и т.д.?
-
Ну мы сейчас тестово пробуем заапдейтиться с 245 версии на 388 и видим: https://pastebin.com/ZNwUr1c5
-
а как таблицу то апдейтить ?
-
Joined.
-
А зачем апдейтить? Все равно ведь агрегировать потом при работе с данными.
-
-
Должен
-
А просто Select (без insert) проходит? Внешняя группировка (с использованием диска) включена?
-
Селект не проходит, про использование диска незнаю, а как это можно узнать ?
-
Можно собрать практически под любой linux, по идее даже бинарник должен быть переносим между многими дистрибутивами. Как вариант есть docker, некоторые используют его и в продакшн.
-
Я с телефона, долго искать, настройка называется примерно: max bytes before external group by.
-
Спасибо, попробую
-
ClickHouse Meetup в Санкт-Петербурге: https://events.yandex.ru/events/ClickHouse/16-aug-2018/
Открываем регистрацию.ClickHouse Meetup, 16 августа 2018, Санкт-Петербург — События ЯндексаПриглашаем технических специалистов на ClickHouse Meetup.
-
None
-
-
-
В Бенуа будет?
-
Да (если за месяц ничего не изменится)
-
👍
-
Как именно вы хотите её "апдейтить"?
-
Joined.
- 14 July 2018 (29 messages)
-
кто пробывал запустить pentaho olap server(mondrian) в связке с ClickHouse?
-
Не пробовали, но в планах есть
-
Joined.
-
Делаю запрос "rename table db_name.table_name to db_name.old_table_name".
Получаю ошибку File not found: /var/lib/clickhouse//data/db_name/old_table_name
Как так? Зачем он ищет файл таблицы, которой еще нет? -
-
Joined.
-
Joined.
-
всем привет! подскажите, пожалуйста, насколько clickhouse подходит для хранения метрик IoT устройств во времени? то есть можно ли (есть ли смысл) использовать ее как time-series базу данных? Стоит задача - хранить метрики и делать выборки во времени с возможностью аггрегации данных. Например, выбрать показание температуры за год с определенной дискретностью (шагом) и применением функции усреднения (макс, мин) промежуточных значений
-
Идеально подходит ИМХО.
-
-
нужно сделать выборку типа:
(на примере запроса из Timescale)
SELECT time_bucket('15 minutes', time) AS fifteen_min,
location, COUNT(*),
MAX(temperature) AS max_temp,
MAX(humidity) AS max_hum
FROM conditions
WHERE time > NOW() - interval '3 hours'
GROUP BY fifteen_min, location
ORDER BY fifteen_min DESC, max_temp DESC; -
температурные измерения обычно не предполагают больших объемов данных ))
у вас десятки миллионов? -
Joined.
-
температура, давление, влажность, шум, вибрация...и т.д.
в общем более 1000 метрик в секунду -
в timescale набегает более 1 Gb в день
-
гигабайты тут не канают, если есть куда их сложить 😊
-
Вот то, что 1000 метрик в секунду - может иметь значение. Там потребуется посредник, который их сложит в один батч и будет засовывать в базу большими кусками
-
CH их еще пожмет и может вообще оказаться что в нем это всего лишь 100-200 Mb 🙂
-
сложить как раз не проблема, проблема выбрать данные с какой-то дискретизацией, например, нарисовать изменение какого-то показателя за год. Количество данных по сенсору за год может быть огромное
-
Огромное - это сколько?
-
60*60*24*365=31536000 по каждому сенсору в год
-
Если у вас есть понимание уровней аггрегации. Т.е. например вы 100% уверены что вы при запросе за год, аггрегируете по месяцу/неделе/дню то можно рядышком поставить MAT VIEW с двидком AggregatingMegreTree и тогда у вас будет быстрая таблица с атоаггрегацией и прочими прелестями
-
а что измеряете если не секрет?
-
это система телеметрии с возможностью подключения любых сенсоров. Сенсоры и частота получения данных определяются индивидуально для каждого проекта
-
-
-
Joined.
-
Для описанной задачи кликхаус подходит, более того это именно то для чего он придуман. Запрос с минимальными изменениями будет работать, и почти наверняка будет работать быстрее чем вы можете ожидать :) можете потом какие-то цифры для сравнения скорости кликхауса и таймскалы написать на ваших данных, т.к. вроде пока сравнения никто не делал.
-
30 млн значений в год с сенсора - это для кликхауса не страшные цифры. В Яндексе - сотни тысяч / миллионы событий в секунду. На одном среднем сервере с кликхаусом можно с относительно небольшими задержками (десятки секунд-минуты) делать аналитику для миллиардов записей. Если допустимы задержки в минуты / десятки минут - то можно и десятки миллиардов данных перемалывать на одном сервере. Если ответы на запросы нужны без видимых задержек - то потребуется больше одного сервера (с шардингом), или преагрегация данных. Но для начала - попробуйте на одном сервере.
- 15 July 2018 (1 messages)
-
https://github.com/yandex/ClickHouse/issues/2590
вот сюда посмотрите. там и пример кода есть. фикс уже выкатили рабочий, но надо либо релиза ждать, либо из исходников собиратьStrange behavior of runningDifference if the source column was conditionally modified #2590Suppose, we have this table: CREATE TABLE events ( event_time DateTime, monitor_id Int32, type Int32, event_date Date, status Int32 ) ENGINE = MergeTree(event_date, monitor_id, 8192) And this data (wait a few seconds between queries to h...
- 16 July 2018 (118 messages)
-
А здесь есть кто-нибудь, раскативший ClickHouse на c5-инстансах в AWS? Вам норм живётся, машины не висят?
-
а что с ними должно быть не так ?
-
вообще в амазоне не висят машины
-
Во-первых, у m5 и c5 была (есть?) хитрая бага, которая зимой косила ряды. Там в случае с интенсивной работы i/o машина просто висла. Мы на это напоролись, пошли форумы читать амазоновые, оказались не уникальными. Ровно та же фигня, ровно на m5/c5 у ряда контор выстрелила.
Во-вторых... Скажу словами поддержки Amazon, когда у нас за одну неделю три инстанса ушли в небеса: "железо иногда ломается". -
Т.ч. про "не висят" не надо. :)
-
хз облако как раз ориентировано на то что оно может умереть в любой момент и его надо как то подняться
-
В теории да. На практике "любой момент" не должен означать регулярные частые проблемы. И мой вопрос про актуальный опыт с c5 был именно об этом.
-
Вот мне все интересно, в каких случаях кроме резкого всплеска амазон интересен.
Как мне видится, на Кликхаус идет ровная нагрузка и под него можно планировать железо. Вам амазон был выгоднее железа или просто привычнее? -
Просто мы на нём давно живём.
-
Привет
Сервер упал с таким сообщением в логе:
https://pastebin.com/cbAtw3b1 -
это с чего он так?
-
Облака... белогривые лошадки :) Главная проблема железа - оно медленно прибавляется / убавляется, и железные проблемы (типа упавший диск) становятся проблемами которые нужно решать тебе самостоятельно или в "полуручном" режиме (руками админов ДЦ). В случае AWS об этом голова не будет болеть, зато может болеть о каких-то других (порой странных) вещах - типа cpu throttle, роскомнадзор, какие-то неожиданные для тебя работы в ДЦ с рестартом серверов и т.п.
-
-
Там межзональный дорогой, остальные терпимо. Но зависит от, конечно.
-
-
какая версия? какие были запросы? как часто бывает?
-
да это при запуске один раз повторилось, на всякий случай лог скинул
версия 1.1.54388 -
> В случае AWS об этом голова не будет болеть
вот эта фраза всё таки у меня вызывает легкий скепсис =)
Не, бесспорно пара минут на запуск в амазоне против 3 дней ожидания кастомной конфигурации — это разница.
Но вот сколько будет стоить двухголовый E5 с 8 SSD на 500 Гб в амазоне? Полагаю, что сильно дороже, чем беру я -
-
Сильно это мягко сказано. Один порядок разницы будет точно:)
-
у кого то большая маржа , кому то нужны не такие дикие конфиги, кто то умеет хорошо автоматически расширять и сжимать ресурсы чтобы экономить
-
И Алиса заговорит словами ваших клиентов 🙄
-
ну для облаков типичный подход - вместо одного крутого сервера возьмем 10 средненьких, и все распараллелим. В пиках будем ещё множить серверы, а если тишина - гасить ненужные.
-
Но в кликхаусе на самом деле это сложновато...
-
вот я именно в контексте кликхауса.
Плюс как ни верти, а хочется покупать не только абстрактную бесконечную масштабируемость, а ещё и хорошее время отклика -
Кликхаус не удобен в динамическом расширении и сужении. Много ручной работы требует из-за того что серверы - участиники сети не сами в сети регистрируются, а вручную добавляются в конфиги.
-
Коллеги, подскажите плиз, никак не могу загрузить внешний словарь из pgsql, dsn создан по ману, через isql туда нормально заходит. конфиг сделал с именем xxx_dictionaries.xml, положил в conf.d, при изменении КХ его перечитывает (в логах есть упоминания), ошибок нет, но и в system.dictionaries пусто. Куда посмотреть еще? КХ перезагружать очень уж не хочется
-
А как настроен <dictionaries_config> ?
-
Он по умолчанию не ищет конфиги словарей в conf.d.
-
только на верхнем уровне файлы словарей читает (т.е. если не изменяли <dictionaries_config> то конфиги словарей должны лежать просто в /etc/clickhouse-server/ )
-
И ещё сам файл с конфигурацией словаря - лучше всего обернуть тэгами <yandex>. Типа такого:
<?xml version="1.0"?>
<yandex>
<comment>...</comment>
<dictionary>
<name>...</name>
...
</dictionary>
</yandex> -
аа, вот в чем дело, dictionaries_config дифолтный :) Спасибо
-
https://pastebin.com/7ufK6MNK конфиг, dictionaries_config дефолтный, в лог сыпет <Warning> ExternalDictionaries: /etc/clickhouse-server/dnl_dictionary.xml: unknown node in file: 'listen_host', expected 'dictionary' и тому подобное, как будто структура xml порушена, уже голову сломал - не могу понять где
-
Хм. Хз. Попробуйте <dictionaries_config>dictionaries/*.xml</dictionaries_config> , создать папку /etc/clickhouse-server/dictionaries (обратите внимание на chmod / acl, чтоб кликхаус мог оттуда читать/писать), и переложите туда ваш файл.
-
-
а что у вас вообще прописано в /etc/clickhouse-server/config.xml, в настройке dictionaries_config?
-
Joined.
-
config.xml дифолтный, не трогаю его
-
а, изменение <dictionaries_config> скорее всего требует рестарта
-
Всем добрый день! А кто чем мониторит ch?
-
так я могу положить кофиг словаря наверх, и он его видит - но ошибки пишет
-
icinga - рабочие процессы, память, диски, grafana - уже более детальные данные
-
/me потянулся за бубном.
-
Попробуйте тэги <yandex> в начале и конце заменить на <dictionaries>
-
А что в файле -processed?
-
более детальные - самописные скрипты, которые выдергивают из кх метрики, и рисуем в графане?
-
Коллеги, подскажите пожалуйста
есть кластер кликхауса с 2 шардами и двумя репликами
создана distributed таблица
в случае если один из четырёх инстансов кликхауса недоступен, то запись в distributed таблицу через гошный клиент github.com/kshvakov/clickhouse не работает
в качестве ошибки пишет 'dial tcp 127.0.0.1:9012: connect: connection refused'
при этом в другой инсталяции кликхауса при потере одного инстанса запись продолжается без ошибок
подскажите пожалуйста по какой причине такое может происходить?GitHub - ClickHouse/clickhouse-go: Golang driver for ClickHouseGolang driver for ClickHouse. Contribute to ClickHouse/clickhouse-go development by creating an account on GitHub.
-
В preprocessed помимо нужного еще куча всего дописывается из других вставок из conf.d (конф зукипера и прочее). на вот эти лишние параметры как раз и ругается конфиг-парсер
-
Files used to generate this file:
/etc/clickhouse-server/dnl_dictionary.xml
/etc/clickhouse-server/conf.d/listen_hosts.xml
/etc/clickhouse-server/conf.d/logger.xml
/etc/clickhouse-server/conf.d/memory.xml
/etc/clickhouse-server/conf.d/settings.xml
/etc/clickhouse-server/conf.d/zookeeper.xml
/etc/metrika.xml --> -
<dictionaries_config>*_dictionary.xml</dictionaries_config>
-
-
у вас файлик же называется dnl_dictionary.xml
-
пральна?
-
-
такое ощущение, что у вас симлинк)
-
В alt_hosts пропишите все ваши сервера, и если какой-то из них будет недоступен клиент попытается найти рабочий сервер
-
и симлинк пробовал и файл - без разницы
-
-
самое смешное в том, что они все прописаны
tcp://127.0.0.1:9011?alt_hosts=127.0.0.1:9012,127.0.0.1:9013,127.0.0.1:9014 -
-
-
может ли это быть из-за того что я четыре транзакции одновременно начинаю?
-
ибо судя по всему из-за этого
-
-
что будет если транзакций больше чем открытых соединений?
-
-
На тестовой машине поставил чистый КХ, никакие конфиги не менял, положил в /etc/clickhouse-server/ файлик с конфигом словаря из мануала - получаю 2018.07.16 16:32:45.479147 [ 4 ] <Error> ExternalDictionaries: Cannot create external dictionary 'hosts' from config path /etc/clickhouse-server/dnl_dictionary.xml: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Not found: dictionary.structure.attribute.null_value, e.what() = Not found
-
-
угу, <null_value></null_value> для аттрибутов обязателен
-
<attribute>
<name>str</name>
<type>String</type>
<null_value></null_value>
</attribute> -
👍 завелось
-
есть пару десятков таблиц типа ReplicatedSummingMergeTree и Distributed к ним в кластере
нужно получить выборку вида
table, sum(first_not_primary_key_column) as total
first_not_primary_key_column - первая колонка не входящая в первичный ключ (в каждой таблице может быть своя)
имена всех ReplicatedSummingMergeTree таблиц имеют вид LIKE ag%_local
имена Distributed - LIKE ag% (как ReplicatedSummingMergeTree но без _local)
такое можно сделать одним запросом? -
Придётся сгенерировать запрос из UNION ALL по всем таблицам.
-
Всем привет, у меня вопрос по загрузке данных на python из Pandas.DataFrame в ClickHouse с помощью clickhouse-sqlalchemy.
У меня есть дневные логи в виде CSV-файлов, в которых есть числовые и строковые значения. Я хочу обработать их и загрузить в ClickHouse. Вначале каждый файл я загружаю в DataFrame (средний размер ~ 300к х 50), занимаюсь препроцессингом (генерю новые столбцы, заполняю пропущенные значения и тд), выставляю numpy-типы для каждого столбца и с помощью df.to_sql(table_name, connection, if_exists='append', index=False) хочу закинуть df в ClickHouse. И вот на последнем пункте начинается какая-то магия.
Для некоторых файлов выскакивает Exception следующего вида:
In: df.to_sql(table_name, sqla_engine.connect(), if_exists='append', index=False)
Out: Orig exception: Code: 27, e.displayText() = DB::Exception: Cannot parse input: expected , before: 2, 1521736320, \'176.119.230.53\', \'\', 35366408187, 57, 0, 57, \'131/160/15/0/0/6/2/3/0.1/1\', 131, 160, 15, 0, 0, 6, 2, 3.0, 0.10000000149011612, 1, 2794413, \'http: (at row 280606)
, e.what() = DB::Exception
Но если взять только несколько строк (например, df[280600:280610].to_sql(...)), среди которых будет та, на которую указывает Exception, то все отработает.
Если разбить df на части так, чтобы проблемная строка была не в первой части, то все также сработает.
Данные замечания справедливы для любых проблемных файлов. Но эти все варианты не могут быть приняты как окончательное решение, так как непонятно, как идентифицировать заранее такие проблемные для ClickHouse строки.
Проверял строковые значения на наличие всяких специальных и непечатуемых символов, ничего криминального не нашел.
Пробовал выставлять в настроках сервера input_format_values_interpret_expressions=1 и стало только хуже, начинал ругаться уже на Cannot parse input: expected \' before: на первой строчке.
Собственно, вопрос в том, с чем это может быть связано и как это чинить? -
-
а где можно посмотреть пример получения списка таблиц выбора колонки и использование этого в запросе?
-
у меня примерно такое было, когда не влазило в max_query_size, попробуйте увеличить с запасом
-
В запросе невозможно динамически выбирать столбцы из схемы таблицы.
-
У меня дефолтное значение, оно равно 256 КБ. То есть если у меня df весит 500 МБ, то стоит этот лимит увеличить до условных 16 МБ и грузить df по частям, рассчитав размер этих частей под max_query_size?
-
я поставил <max_query_size>524288000</max_query_size> и горя не знаю
-
-
Понял, спасибо за быстрый ответ)
-
по идее, этот лимит отвечает только за запрос до VALUES, сами данные обрабатываются отдельным потоковым парсером, и не учитываются в этом ограничении. Но у меня примерно такая проблема была на больших дампах, которые обрезались и был Exception с такой ошибкой. Увеличение этого лимита помогло.
-
Да, в доках одно, а по факту всплывают еще особенности) Твой совет помог, сейчас без проблем загрузилось, спасибо еще раз)
-
-
А может быть движок Merge поможет?
-
Если учитывать, что чтение из неё лочит запись, то часто так делать не стоит 🙂
-
оО?
-
-
-
Может быть, я неправильно понял документацию, на самом деле
-
Движок Merge позволяет сделать условия на таблицу (с помощью виртуального столбца _table), но возможности динамически выбирать, какие столбцы использовать - нет.
-
> При добавлении данных в Buffer, один из буферов блокируется. Это приводит к задержкам, если одновременно делается чтение из таблицы.
-
-
Означает ли это, что пока идет чтение, запись в этот кусок невозможна — вопрос открытый
-
-
Тогда как мне достичь скорости, максимально близкой к реал-тайму для этой задачи, не подскажете?
-
В MergeTree можно вставлять до раза в секунду, вам нужно раньше читать данные? А репликацию вы не используете?
-
Репликацию пользуем, но она же тоже не мгновенная
-
Из буферной таблицы можно читать, пока у вас один сервер. Иначе вы будете читать с буферной таблицы случайного сервера
-
-
-
Если пишете мало данных, то можете пару раз в секунду вставлять, но лучше так не делать, конечно.
-
Сейчас пишется в одну, читается из другой
-
Данных много
-
Может, вам log-таблицв помогут
-
высокочастотный трейдинг что ли ?
-
ок, не дочитал вопрос
-
не, апи для реалтайм выгрузок метрик
-
-
-
nagibator1999VGwkFaQuffyl7q2emvld
-
CREATE TABLE test AS test_table
ENGINE = Buffer(database, table, 2, 0.5, 0.5, 1000, 1000, 1000, 1000) -
Вроде создалось с дробным значением для min_time и max_time, так что наверное так можно
-
хммм, надо проверить, спасибо!
-
Всем привет.
А это нормальное поведение?
SELECT
date
FROM
Stats
where
toString(adId) IN ('44')
GROUP BY
date
Code: 49, e.displayText() = DB::Exception: Set for IN is not created yet!, e.what() = DB::Exception
SELECT
date
FROM
Stats
where
toString(adId) IN ('44','bla-bla-bla')
GROUP BY
date
нормальный результат
SELECT
date
FROM
Stats
where
adId IN (44)
GROUP BY
date
нормальный результат -
-
Привет, можно узнать чуть больше подробностей) Какая версия сервера? Какая структура таблицы Stats?
- 17 July 2018 (75 messages)
-
-
насколько substring дорогая операция?
-
Дорагая в чем? Вообще вы скорее всего не почувствуете оверхеда от её работы.
-
дорогая в использовании
-
Что-то подобное правили уже, надо смотреть на версию и если там воспроизводится то можно уже искать что по этому поводу сделали/не сделали.
-
-5% от ЗП за использование.
-
-
-
-
Joined.
-
Привет ! Есть сложный SELECT который очень долго висит, где посмотреть кроме select * from system.processes не залип ли он ?
-
-
Через headers http можно прогресс смотреть
-
ну я методом тыка на паре кластеров посмотрел, и моего запроса нету
не могу понять - значит ли что он отсох или каков его статус -
Коллеги, подскажите пожалуйста
Имеется:
два шарда и две реплики
в каждом инстансе создана таблица ReplicatedMergeTree
в каждом инстансе создана Distributed таблица которая смотрит на таблицы ReplicatedMergeTree выше
internal_replication стоит в значении false
как лучше записывать данные в кликхаус? в distributed таблицу, либо же в локальные таблицы ReplicatedMergeTree? -
как вообще работает ReplicatedMergeTree, если internal_replication выключен? не реплицирует что-ли?
-
Если internal_replication стоит в false (по дефолту) то сервер сам попробует записать во все реплики, если у вас ReplicatedMergeTree то значение нужно выставить в true
-
Если писать в локальные то в этом плюсов сильно больше:
* это быстрее
* можно более гибко контролировать запись в шард
* и т.д. -
а если internal_replication стоит в true, то что реплицирует данные (ведь я так понимаю что этим не сервер уже занимается)? Zookeper?
-
ZooKeeper только хранит метаданные и очередь задач, реплицировать будет сам КХ (ReplicatedMergeTree таблица)
-
Настройка internal_replication влияет только на вставку в Distributed таблицу, саму репликацию она никак не затрагивает
-
-
если происходит инсерт в distributed таблицу при том, что internal replication выключен, то получается происходит запись во все четыре инстанса, а потом ещё сама таблица пытается зареплицировать?
-
ведь получается что distributed таблица сама всё записала везде
-
-
выходит короче так, что distributed во все инстансы записал, потом ещё Replicated по этим новым данным прошёлся и понял что за него работу уже сделали и можно сидеть курить
-
ну и лишние ресурсы по сути потратил на дедупликацию
-
спасибо большое за разъяснение!
-
-
Хороший пароль.
-
Привет. Может сможете подсказать?
Год назад пытались переехать на CH, встретились с отсутствием JOIN'ов, из-за чего все данные уместили в одну таблицу.
Получилось что-то в духе:
Id0, Id1, Id2 ... *какие-то поля, которые известны только при событии-сборке* ... event1, event2 ...
Где eventN это 0 или 1 - произошло событие или нет.
Возможно ли сейчас расскидать это по разным таблицам и Join'ить их по id? И есть ли какие подводные у кликхаусовских джоинов в плане производительности/памяти? -
Для простоты рассматривайте JOIN в КХ просто как подзапрос, который полностью выполняется, его результат помещается в оперативку.
-
-
т.е. это совсем не аналог join из sql?
-
вообще не аналог, это просто подзапрос, и в нем нужно указать все условия в where, которые вам нужны.
-
-
Тогда не совсем понимаю. Если в одном запросе надо получить столбцы из двух таблиц, то это делается не Join?
-
-
просто если у вас есть таблица1, в которой например 100 строк по вашим условиям, и вы заджойните ее на таблицу2 без условий, а в ней например 10000000 строк, то сначала в подзапросе обработается полностью таблица2, ее результат в оперативу, и заджойнится на таблицу1
-
Спасибо за помощь. Попробую
-
-
есть такой глупый вопрос по distributed: допустим, у меня есть 100-200 нод (без реплик), в каждой 100к записей за сутки примерно, и я хочу сделать ко всему этому запрос с group by (в результате выборки будет 100-1000 записей). вопрос заключается в том, как будет расходоваться память на ноде, которая будет делать аггрегацию с этой distributed таблицы
-
Каждая из нод сделает промежуточную агрегацию у себя и передаст сериализованные состояния на ноду, в которую слали запрос.
-
-
и "прожорливость" будет зависеть от того, сколько уникальных ключей агрегации будет, и насколько тяжелые до памяти там агрегатные функции
-
-
например select count() from distributed group by uint8_typed_field до памяти не жручая
-
-
если 1_000_000_000 строк вырождается в 10 строк result-set, то да
-
-
Ребят, подскажите пожалуйста, как транспонировать таблицу?
-
Всем привет, подскажите, что я делаю не так? Хочу получить архив с результатом запроса, а получаю просто результат
-
Вы получаете результат сжатым потоком в http, curl разжимает. Хотите архива - архивируйте самостоятельно.
-
А как я могу проверить, что действительно по сети передаются сжалые данные?
-
опция curl -v
-
Ну или через tcpdump словить
-
Спасибо, попробую из терминала сделать (на скрине постман)
-
Да, в терминал возвращается кракозябра.. Значит это постман сам разжимает. Спасибо!
-
curl -v - отдаст заголовки
-
-
-
-
Запрос болтался в system.process а потом пропал но консольный client который его выполнял не отвалился - куда смотреть что случилось не так ?
-
в system.query_log его нет
-
Всем привет! Есть сложности с подключением Talend Open Studio (Data Integration) к КХ: в error message видно только java.lang.NoSuchMethodError: java.nio. На этом же .jar через jdbc нормально подключается DBeaver. Кто-нибудь сталкивался с таким?
-
Joined.
-
Joined.
-
Joined.
-
-
yandex/ClickHouse was tagged: v1.1.54394-stable
Link: https://github.com/yandex/ClickHouse/releases/tag/v1.1.54394-stable
Release notes:
Auto version update to [54394]yandex/ClickHouseClickHouse is a free analytic DBMS for big data.
-
-
Кинет исключение при обработке запроса. Пользователю вернётся ошибка с описанием.
-
system.query_log по-умолчанию выключен. Включается отдельно - настройкой log_queries уровня пользователя. Эту настройку можно прописать для всех - в users.xml в профиле default.
-
спасибо
-
Joined.
- 18 July 2018 (95 messages)
-
Joined.
-
-
добрый день
Да, можно -
просто вместо регулярки делаете select
-
результатом SELECT должен быть текст регулярного выражения
-
-
match(column, (SELECT ...))
-
-
-
а почему IN требует GLOBAL, если во вложенном запросе выбирать колонку, которая является ключом шардирования?
-
-
все, но логично предположить, что каждый шард можем сам целиком посчитать для себя
-
-
-
Переименуйте в рамках запроса. Вообще вопрос странный, уточните что вас беспокоит? Будет ли быстро работать или что?
-
-
Пробуйте, без дополнительных вводных ничем помочь не сможем
-
Привет!
Хочу соптимизировать подключения к ClickHouse
приложение работает на базе SpringBoot и использует последнюю сборку jdbc драйвера, но на сколько я понимаю - все запросы все равно выполняются по шттп?
думаю как быть с коннекшен пулом. имеет смысл что то химичить или смысла нет -
посмотрите на https://github.com/Vertamedia/chproxyGitHub - Vertamedia/chproxy: ClickHouse http proxy and load balancer
ClickHouse http proxy and load balancer. Contribute to Vertamedia/chproxy development by creating an account on GitHub.
-
-
а к нему самому надо пул соединений держать?
-
Скорее всего нет, КХ "не любит" *
-
Есть таблица a1 в mysql, есть таблица a2 в КХ, которая смотрит на таблицу a1 в mysql. И в a1 есть поле типа Enum, которое может быть Null. При попытки обратиться к таблице a2 пишет ошибку
Unsupported type Enum8('promo' = 1, 'flashPromo' = 2)
Попытался при создании таблицы a2 обернуть поле в Nullable, поиграться со значениями самого enum - не помогает. Есть вариант обойти? -
-
-
-
Code: 223, e.displayText() = DB::Exception: Elements of Enum data type must be of form: 'name' = number, where name is string literal and number is an integer, e.what() = DB::Exception
-
-
-
Unsupported type Enum8('promo' = -1, 'flashPromo' = 2, '' = 3)
-
А как его записать в запрос создания таблицы? Или только через вьюху поверх таблицы?
-
Возможно есть какой-либо способ взять строки только с максимальной версией (отдельное поле) , что-то вроде того: SELECT *
FROM test.transactions AS t1
WHERE version = (
SELECT MAX(version)
FROM test.transactions AS t2
WHERE t1.tran_id = t2.tran_id
) AS tmp -
-
-
Как-то так http://joxi.ru/KAxNRVPtMRpgam1531918258575 (121 kb) uploaded July 18, 2018 Joxi
made using Joxi.net
-
Ого, спасибо, попробую
-
Ругается:
-
Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 533 (line 22, col 7): (
replaceOne(
ifNull(usedPromocodeType, ''),
'null',
''
) as Enum8 ('' = 0, 'promo' = 1, 'flashPromo' = 2)
) as usedPromocodeT. Expected one of: identifier with optional parameters, function, DEFAULT, MATERIALIZED, ALIAS, nested table, identifier with parameters, identifier, e.what() = DB::Exception -
Спасибо за советы, похоже проще отказаться от Enum
-
-
-
Так а если так создавать таблицу (a2), при вставке в исходную (a1) данные в a2 как попадут?
-
-
Коллеги, в документации написано, что в таблицы BUFFER не имеет смысла вставлять по одной строке, производительность не будет оптимальна; а вот к какому размеру вставляемых данных стремиться, не сказано.
Сориентируйте, пожалуйста.
Сейчас у нас по факту вставляется от, скажем, 3 до 300 строк за раз, и таких вставок, наверное, штук 50-60 в секунду (в разные буферные таблицы в сумме).
И ещё интересно - если ничего не менять, с какого количества инсертов в секунду мы упремся в потолок, при текущем размере инсерта?
То есть, насколько мы далеко от проблем) -
Всем привет, а есть ли способ оценить необзходимое значение настройки max_result_bytes, кроме как опытным путём?
-
Упс, то были искаженные данные.
На самом деле от 1 до 50 строк инсерт, инсертов около тысячи в секунду. Но это всё в буферные таблицы. Параметры этих таблиц - по умолчанию. -
А кто формирует блоки "3 до 300 строк"? Может там стоит сделать батчинг до 1к и не использовать Buffer вообще? Я выработал правило для КХ (и не только) - делай как можно проще. Если написано в доке что лучше не использовать Buffer, а батчить на стороне приложения - делаю так
-
Мы сейчас вообще на Раббите сделали цепочку очередей и гоняем данные разных стадий готовности (по одной записи). И только на финальном этапе батчим как нам удобно - шикарно работает
-
-
-
В Docker самое простое
-
Либо ходить по http
-
-
1к для буфера тоже сильно много, попробуйте сделать простой батчер на клиенте
-
-
Еще есть альтернативный клиент https://github.com/hatarist/clickhouse-cli , помимо этого есть и другиеGitHub - hatarist/clickhouse-cli: A third-party client for the Clickhouse DBMS server.
A third-party client for the Clickhouse DBMS server. - GitHub - hatarist/clickhouse-cli: A third-party client for the Clickhouse DBMS server.
-
по 1-й строке и в MergeTree вставлять можно, буфер сильно спасает, но тоже ему сложновато на 1к вставок в секунду
-
ему пофиг - можно на каждый запрос новое соединение открывать, а можно пул держать - скорость работы от этого не изменится. Он сам держит пул соединений к кликхаусу
-
-
-
Вот мы эту статистику собрали, чтобы понять, писать нам нормальный батчинг или нет.
Поняли, что писать, теперь вопрос - по сколько в кучку их собирать.
Что касается вопроса "кто". У нас есть обработчики статистических событий. Они забирают за раз максимум 1000 этих событий, разбивают по типам, обрабатывают кучку каждого типа. Какого-то типа может оказаться из тысячи - три. Вот и вставится три строки в одном инсёрте.
А ещё 1000 событий может и не быть, обработчик заберёт всего 50, ну и инсёрты окажутся ещё мельче.
Полубатчинг, в общем. -
Справедливости для, 1к это на все буферы вместе, которых у нас штук ~7 что ли, лень смотреть.
Так а всё же, по сколько строк за раз имеет смысл вставлять в буфер, чтобы "всё по красоте было"? :) -
По моему опыту, боятся что в КХ вставится меньше 1к - не нужно. Главное чтобы оно старалось вставлять больше 1к (или больше если нужно). В вашем случае можно сделать так: буферизировать каждый тип сообщения в отдельной очереди (хоть Раббит, хоть где), тогда можно гибко указывать с какой частотой выбирать каждый из типов.
Т.е. если "Какого-то типа может оказаться из тысячи - три" тогда делайте батчин из очереди раз в час (или сколько нужно чтобы накопилось примерно 1к) -
Ага, спасибо! Раз в час нам маловато, сделаем что-то типа "сбрасывать данные, если их 1000 строк, или раз в 15 минут")
-
Мы так и делаем
-
-
Для того, чтобы сделать локальный подзапрос в IN, надо внутри него указать в select локальную таблицу.
-
коллеги, а не появилось какого-то способа добавить поля в SummingMergeTree?
-
SELECT a, b, c FROM distrib_tbl WHERE a IN (
SELECT a FROM local_tbl WHERE x = 1 AND y < 123 GROUP BY a HAVING argMax(q, w) = 2 LIMIT 10
)
Code: 10, e.displayText() = DB::Exception: Not found column b in block. There are only columns: a, e.what() = DB::Exception -
это баг или фича?
-
Добавлять поля в ключ таблицы типа SummingMergeTree.
- нет.
Есть секретная возможность это сделать для не реплицированных таблиц. (Возможность секретная, потому что была добавлена для одного use-case внутри и не планируется к развитию.) -
Не могу сказать - выглядит подозрительно. Если есть полный пример (схема кластера, таблиц, и возможно пара строчек с данными) - надо посмотреть.
-
сейчас постараюсь анонимизировать
-
В принципе, есть готовый бинарник для Mac. Если вы не против запускать бинарники от незнакомцев в Telegram, то я скину сюда ссылку.
-
-
-
Да. Сейчас найдём...
-
А верно понимаю, что нативный клиент-серверный протокол публично не документирован и надо смотреть исходники?
-
Да. Впрочем, можно смотреть не исходники ClickHouse, а исходники драйвера на Go, Java, Python, который реализует этот интерфейс (что больше нравится).
-
Понял, спасибо.
-
@milovidov_an ошибка проявляется при загадочных обстоятельствах
-
можно вам в ЛС написать?
-
Привет.
Как можно заставить CH заполнить поля дефолтовыми значениями для старой партиции? Добавили новое поле, его дефолт зависит от существующего. Теперь хочу существующее поле - очистить.
Пример условный - был uuid, добавили uuid_hash default toInt32(uuid), хотим его заполнить для старых партишенов и очистить uuid. почему-то optimize partition, даже final - мгновенно отдает «ОК», и больше ничего не проиходит. ReplicatedMergeTree. -
есть два сервера в кластере, и идет вставка через дистрибьютид таблицу, четные id налево, нечетные направо.
Как застравить запрос
select * from distributed where id in (1,2,3,4)
выполнить
select * from shard where id in (1,3) на первом
select * from shard where id in (2,4) на втором
(без ручного обращения к system.clusters) -
Подскажите, какую настройку крутить, чтобы обойти "DB::Exception: Limit for bytes to send or receive over network exceeded" ?
-
max_network_bandwidth - "The maximum speed of data exchange over the network in bytes per second for a query. Zero means unlimited."
max_network_bytes - "The maximum number of bytes (compressed) to receive or transmit over the network for execution of the query." -
Спасибо!
-
clickhouse-client под Mac
-
clickhouse
View and download from Yandex.Disk
-
Никак (такая возможность не поддерживается).
-
жаль, больно запрос громоздкий получается с ручными условиями, а выигрыш в processed rows в разы.
-
спасибо, Алексей. сбилдить, кстати, так и не удалось, оставили ишью в репозитории
-
-
Joined.
-
- 19 July 2018 (139 messages)
-
-
Joined.
-
Select argMax(column1, version), ..., argMax(columnN, version) from table
? -
Спасибо, действительно должно сработать, но в моем случае выборка столбцов динамическая решил сделать так: SELECT {select_str}
FROM transactions
ANY INNER JOIN (
SELECT tran_id, MAX(version) AS version
FROM transactions
WHERE {where_str}
GROUP BY tran_id
) USING tran_id, version -
Joined.
-
Коллеги из Яндекса, вы здесь?
-
Похоже у вас глобальная проблема с почтой
-
-
Да вроде ходит почта...
-
Нет, но не знаем куда идти вообще. Саппорт молчит
-
На кого можно переадресовать вопрос, не подскажешь?
-
не подскажу, просто проверил на своих ящиках
-
Доброе утро, с почтой все нормально, вроде
-
у меня тоже все нормально с почтой
-
Суть - при отправке с яндекса на наш домен он у себя проверяет наши адреса и как не удивительно НЕ НАХОДИТ
-
Пока пробуем через саппорт
-
Joined.
-
привет всем. возможно ли в set установить значение select'ом? например:
set date = (select ... from ... where ...) -
пробую, ругается на синтаксис
-
значение в запросе одно
-
up! Крайне актуальный вопрос… Не понимаю, как заставить CH сделать merge для старой партиции 🙁
-
Добрый день, скажите на что именно влияют скобки при создании таблицы
ORDER BY (dt,(dev_id, target_id))
или
ORDER BY (dt, dev_id, target_id )
где можно про это почитать?
Спасибо -
попробуйте https://clickhouse.yandex/docs/en/query_language/queries/#optimize
но не факт, что поможет. возможно нужно перед этим как-то настройки партиционировани поменять, чтобы он решил их перестроить -
> почему-то optimize partition, даже final - мгновенно отдает «ОК», и больше ничего не проиходит. ReplicatedMergeTree.
-
-
Joined.
-
Подскажите пожалуйста про движок GraphiteMergeTree: в документации (https://clickhouse.yandex/docs/ru/table_engines/graphitemergetree/#table_engines-graphitemergetree) говорится, что в таблице должны быть следующие поля:
Path - имя метрики (сенсора Graphite).
Time - время измерения.
Value - значение метрики в момент времени Time.
Version - настройка, которая определяет какое значение метрики с одинаковыми Path и Time останется в базе.
У нас структура таблиц немного другая и там вместо поля Version есть поле Timestamp. Если посмотреть в исходники, то можно в файле dbms/src/Storages/MergeTree/registerStorageMergeTree.cpp увидеть, что по умолчанию колонка с версией должна называться Timestamp:
params.version_column_name = config.getString(config_element + ".version_column_name", "Timestamp"); -
Кому верить, и что делать, если схлопывания данных на практике не происходит, хотя на вид всё сконфигурировано правильно?
-
-
Видимо, в документации действительно опечатка
-
-
-
-
Joined.
-
-
А дата есть?
-
-
SELECT ... FROM ... WHERE toYYYYMM(date) = ''
-
toMonth(Date)
-
toMonth для разных годов вернет одинаковое значение, toStartOfMonth более уникален в этом смысле.
-
-
Ребят, всем привет! Подскажите можно ли отключить дедупликацию данных? Есть такой кейс: в кластер из 8 тачек прилетают данные, когда приходит несколько полностью одинаковых строк - они схлопываються в одну! Но такое поведение не нужно, так как таблица SummingMergeTree и эти строки должны быть в итого просуммированы по ключу! А в итоге получаю только одну строку, идет потеря. Спасибо.
-
Похоже на настройку insert_deduplicate , которую вам, вероятно, нужно выставить в 0 (по идее её можно прямо во время INSERT выставить, для HTTP это будет типа POST /?insert_deduplicate=0)
-
Спасибо! Попробую!
-
Похоже на настройку insert_deduplicate , которую вам, вероятно, нужно выставить в 0 (по идее её можно прямо во время INSERT выставить, для HTTP это будет типа POST /?insert_deduplicate=0)
-
Спасибо, сработало на ура :)