
artem
21.08.2018
14:09:40
Я вот не понимаю до конца от чего зависит ибо с одного и того же сервера с 2ух компов разная скорость в разы

Denis
21.08.2018
14:11:12
меряйте на клиенте, где-то там проблема скорее всего

Kirill
21.08.2018
14:14:34

Kirill
21.08.2018
14:17:06
ReplicatedMergeTree не поддерживается, почитать можно тут https://github.com/yandex/ClickHouse/search?q=MODIFY+PRIMARY+KEY&unscoped_q=MODIFY+PRIMARY+KEY , но, там нет проверок на то что этот альтер может вам все развалить

Google

Kirill
21.08.2018
14:19:50

Ilyas
21.08.2018
14:25:00
Не знаю куда копать. Запускаю большой запрос и он виснет даже на пустой базе
в логе бесконечно выводится подобное
<Debug> InterpreterSelectQuery: MergeTreeWhereOptimizer: condition dtl >= '2018-08-13' moved to PREWHERE
около 350 раз в секунду %)

Vladislav
21.08.2018
14:28:41

Kirill
21.08.2018
14:31:50

Dasha
21.08.2018
14:48:57
Добрый день, коллеги!
А можете, пожалуйста, подсказать, как сделать в ClickHouse group_concat?

papa
21.08.2018
14:49:54
groupArray

Victor
21.08.2018
14:50:20
пример
SELECT groupArray(number)
FROM
(
SELECT number
FROM system.numbers
LIMIT 5
)
┌─groupArray(number)─┐
│ [0,1,2,3,4] │
└────────────────────┘

Dasha
21.08.2018
14:52:35
Спасибо!

Alexey
21.08.2018
14:56:05

Denis
21.08.2018
15:05:58

Vladislav
21.08.2018
15:16:38

Google

Denis
21.08.2018
15:18:03

Vladislav
21.08.2018
15:19:37

Denis
21.08.2018
15:20:47
зачем 250 гигов, просто нагенерите данных с таким же распределением с помощью numbers % и rand
https://gist.github.com/den-crane/a72614fbe6d23eb9c2f1bce40c66893f

Ilyas
21.08.2018
15:53:36

Pavel
21.08.2018
16:00:05
коллеги, а можно как-то попросить кликхаус не генерировать <>-preprocessed.xml конфиги или указать отличную от оригиналов директорию?

Denis
21.08.2018
16:17:08
в новых версиях уже вроде так https://github.com/yandex/ClickHouse/pull/2443 , не помню с какой
а нет, нифига не так,
для словарей нету -preprocessed, а config-preprocessed.xml и preprocessed.xml все еще есть

prll
21.08.2018
16:42:25
не так, это еще не доделано и не смержено

Pavel
21.08.2018
16:47:23
ясно. решили в итоге индивидуальным маунтом нужных файлов

Vladislav
21.08.2018
16:49:31

Ilyas
21.08.2018
16:50:06
если optimize_move_to_prewhere выставить в нолик, то запрос тоже подвисает, но хотя бы киляется сравнительно быстро.
при том если разобрать запрос на части - они выполняются моментально.
может быть я упускаю какое-то ограничение на сложность запроса? у меня куча join и union в нём
всё что нашёл на мой взгляд подходящее я подкрутил, хотя и дефолтов должно было хватить на сколько я могу понять
<max_query_size>2097152</max_query_size> <!-- 2 MiB-->
<max_subquery_depth>500</max_subquery_depth>
<max_pipeline_depth>5000</max_pipeline_depth>
<max_ast_depth>5000</max_ast_depth>
<max_ast_elements>50000</max_ast_elements>
правда версия довольно старая у меня 1.1.54385


Alexey
21.08.2018
17:47:14
Добрый вечер, какую агрегирующую ф-цию надо использовать чтоб добавлять элемент к массиву (который должен быть выходом агрегирующей ф-ции). Я про AggregatingMergeTree
в финальном запросе я хотел брать последний элемент из массива
как вариант я рассматривал Nested структуру и SummingMergeeTree, в качестве ключа указывать таймстемп

Michal
21.08.2018
18:16:51

Alexey
21.08.2018
18:22:00

Michal
21.08.2018
18:23:25
А нужны ли Вам в таком случае ВСЕ значения? Если вам нужно только последнее по значению таймстампа - то это argMax( value, timestamp)

Alexey
21.08.2018
18:28:34
то есть поле будет the_last_value AggergateFunction(argMax, UInt16, DateTime) ?

Denis
21.08.2018
18:30:01
argMaxState функция, а тип AggregateFunction (MAX,тип)

Google

Timur
21.08.2018
18:30:07
а вообще ODBC вроде же есть

Michal
21.08.2018
18:40:59

Alexey
21.08.2018
18:41:59

Michal
21.08.2018
18:47:54

Alexey
21.08.2018
18:48:26

Michal
21.08.2018
18:50:20
Чтоб потестить лучше наверное что-то типа: INSERT INTO x SELECT argMaxState(number, toDateTime(number)) as last_value FROM numbers(10);
Но и с values по идее должно работать

Alexey
21.08.2018
18:55:42

Michal
21.08.2018
19:11:31
Ну потому что агрегатные функции довольно бессмыслены для единственного значения. Можно сделать на таблицах, если обязательно хочется получить конкретное состояние функции без запросов сторонних таблиц. Примерно так
INSERT INTO x VALUES ( argMaxArrayState( [7, 5, 6], [ now(), now()+1, now()-1 ] ) );

Daniel
21.08.2018
19:15:57
А делиты уже есть в каком-нибудь релизовом и юзабельном виде?


Konstantin
21.08.2018
19:27:57
Привет!
Экспериментирую тут с кастомным PARTITION BY ключом в обычном MergeTree.
Хочу партишнинг по (дата, группа), где группа - это 1000 числовых значений (можно считать, что это client_id mod 1000).
Задача в том, чтобы эффективно использовать 1ТБ диск, удаляя слишком большие группы чаще, чем маленькие. То есть если в группе записей на 1МБ, она может жить и год (365 партиций для неё), а если 300ГБ, то, скажем, один или два дня только.
Данные поступают из 10-15 источников, почти отсортироваными по группам и времени, но в кажом источнике есть почти все группы. Каждый источник вствляет по 50-100МБ за раз раз в 20-30 секунд. Раз в несколько минут бывают маленькие вставки в несколько мегабайт или даже меньше.
Проблема на дефолтном конфиге - Too many parts. Если увеличить max_replicated_merges_in_queue, то всё какое-то время работает, но старые неактивные партиции не успевают удалятся и на файловой системе через какое-то время кончаются inodes. Если взять ФС без inodes, всё равно всё будет плохо ибо новые parts всё равно появляются быстрее, чем удаляются старые (пробовал также разные разные значения *_lifteme). А уж если перезагрузить сервер, кликхаус не запустится примено никогда (Loading parts...).
Буферные таблицы не помогают, хотя сильно с ними не экспериментировал.
Такое ощущение, что нужно разрешить кликхаусу не мёржить parts как можно дольше - типа делать это только раз в час или около того.
Решение, которое сейчас приодит в голову - сделать две таблицы, одну с партицированием только по времени (типа каждый час, без группы), а другую - по дате и группе. Ну, и рукаи брать всё, что из предыдущего часа и раньше, INSERT ... SELECT * FROM partitioned_by_time ORDER BY time, mod_group и предыдущие партиции из такой псевдо-буферной таблицы удалять. Но выглядит как страшный костыль и могу представить слишком много мест, где это может поломаться.
Может есть какие-то ещё параметры, которые стоит попробовать подкрутить под этот юзкейс?


Tima
21.08.2018
19:33:39
Привет!
Экспериментирую тут с кастомным PARTITION BY ключом в обычном MergeTree.
Хочу партишнинг по (дата, группа), где группа - это 1000 числовых значений (можно считать, что это client_id mod 1000).
Задача в том, чтобы эффективно использовать 1ТБ диск, удаляя слишком большие группы чаще, чем маленькие. То есть если в группе записей на 1МБ, она может жить и год (365 партиций для неё), а если 300ГБ, то, скажем, один или два дня только.
Данные поступают из 10-15 источников, почти отсортироваными по группам и времени, но в кажом источнике есть почти все группы. Каждый источник вствляет по 50-100МБ за раз раз в 20-30 секунд. Раз в несколько минут бывают маленькие вставки в несколько мегабайт или даже меньше.
Проблема на дефолтном конфиге - Too many parts. Если увеличить max_replicated_merges_in_queue, то всё какое-то время работает, но старые неактивные партиции не успевают удалятся и на файловой системе через какое-то время кончаются inodes. Если взять ФС без inodes, всё равно всё будет плохо ибо новые parts всё равно появляются быстрее, чем удаляются старые (пробовал также разные разные значения *_lifteme). А уж если перезагрузить сервер, кликхаус не запустится примено никогда (Loading parts...).
Буферные таблицы не помогают, хотя сильно с ними не экспериментировал.
Такое ощущение, что нужно разрешить кликхаусу не мёржить parts как можно дольше - типа делать это только раз в час или около того.
Решение, которое сейчас приодит в голову - сделать две таблицы, одну с партицированием только по времени (типа каждый час, без группы), а другую - по дате и группе. Ну, и рукаи брать всё, что из предыдущего часа и раньше, INSERT ... SELECT * FROM partitioned_by_time ORDER BY time, mod_group и предыдущие партиции из такой псевдо-буферной таблицы удалять. Но выглядит как страшный костыль и могу представить слишком много мест, где это может поломаться.
Может есть какие-то ещё параметры, которые стоит попробовать подкрутить под этот юзкейс?
А опишите ваши вставки не в Мб, а в кол-ве строк


Michal
21.08.2018
19:36:28
Если заранее известно большая группа или маленькая то можно из 1000 номеров групп сделать несколько групп с разными retention policy.
365000 партиций - это много, нужно чтоб было меньше. При большом количестве партиций (или таблиц) у КХ "едет крыша".

Konstantin
21.08.2018
19:39:16

Tima
21.08.2018
19:40:26

Konstantin
21.08.2018
19:40:41
Заранее неизместно. большая группа или маленькая, но если сегодня она большая, то завтра тоже, скорее всего, будет большой и наоборот.

Google

Michal
21.08.2018
19:40:41
Ну и если допустим насколько различный retention policy - то первый вопрос который приходит в голову то почему данные с насколько различными retention policy лежат в одной таблице.
Другими словами если для большой группы допустима быстрая чистка, то почему "быстрая чистка" не допустима для маленькой группы.

Tima
21.08.2018
19:41:55

Konstantin
21.08.2018
19:42:09

Michal
21.08.2018
19:43:09

Konstantin
21.08.2018
19:43:10
Я не знаю заранее большая группа или маленькая. Иногда это всё-таки может меняться, хоть и редко.
В смысле группа не должна часто превращаться из маленькой в большую и наоборот, но может раз в месяц или даже чуть чаще.

Michal
21.08.2018
19:46:41
Попробуйте так - отдельная таблица для свежих данных в которой хранятся несколько последних дней. И MV который перекладывает данные из этой таблицы в таблицу "долгого хранения".
Ну и в ту таблицу "долгого хранения" перекладывайте только то что было не большим.

Konstantin
21.08.2018
19:47:42
MV разве не на каждую вставку будет записывать данные в таблицу "долгого хранения"? Не получится ли та е проблема - вид с боку?
Типа в селекте для MV указать GROUP BY mod_group WHERE count() < .. ?
так вообще можно?

Michal
21.08.2018
19:51:41

Tima
21.08.2018
19:52:01

Michal
21.08.2018
19:52:01
Ну или просто INSERT ... SELECT раз в день запускать

Konstantin
21.08.2018
19:54:22
ну вот я в первом сообщении про INSERT .. SELECT написал, да. Набор "маленьких" редко, но всё-таки меняется.

Michal
21.08.2018
19:57:01
Ну при такой постановке задачи несколько таблиц с разным партиционированием кажется наиболее логичным. И при этом я бы не добавлял номер группы в ключ партиционированная.

Konstantin
21.08.2018
19:58:44
Но тогда я не смогу менять ретеншины же? И по сути это надо для каждой группы отдельную таблицу.
то есть реализовывать партишенинг руками практически

Google

Michal
21.08.2018
19:59:31
Т.е. data_daily из которой данные для не очень больших клиентов через неделю перекладываются в weekly, а оттуда для ещё меньших в monthly.
Данные для больших клиентов будут жить только в daily. Для клиентов поменьше в daily и weekly. Для самых маленьких - в daily weekly и monthly.
Разумеется удобнее было бы делать не monthly а например 4 недельными интервалами.
Костыльно конечно
И момент перекладывания не атомарный.
Но и постановка задачи тоже чудновата.
Поверх этих трех таблиц можно сделать Distributed или Merge.
Ну или тупо UNION ALL.
Если хотите менее костыльно - сделайте наприемер просто недельные партиции и чистите их с помощью ALTER ... DELETE.

Konstantin
21.08.2018
20:07:54
ALTER ... DELETE может быть интересно и типа даже дневные партиции, но насколько оно шустро?

Michal
21.08.2018
20:12:37
Вполне себе шустро.
Кстати что-то там в цифрах ваших не клеится. 100 Мб на инсерт х 3 инсерта в минуту х 15 источников х 60 минут в часе х 24 часа = 6.5 терабайт в день. А вы писали о 1 Тб на год...

Konstantin
21.08.2018
21:15:56
Это пиковые. В день меньше полтерабайта всего. Но некоторые группы за год могут всего 2гб набрать. Плюс, это всё без сжатия, а должно хорошо поджмматься.
Точно нельзя ему как-то сказать "не надо мёржить, если прошло меньше xx минут со вставки"?

Alexey
21.08.2018
21:57:39
Доброй ночи, еще есть вопрос, насколько я понимаю заполнить AggregatingMergeTree можно только с group by но когда я делаю CREATE MATERIALIZED VIEW ...
ENGINE = AggregatingMergeTree(...)
POPULATE
AS SELECT ...
GROUP BY вылетает сообщение о нехватке памяти
- если INSERT будет содержать намного меньше данных, то там подобных проблем с памятью быть не должно?
- ну и как же сделать начальное заполнение MV ?

Denis
21.08.2018
22:10:05
без POPULATE
https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/clickhouse/SJ9arSTPsKk/3c_jh3NLCwAJ

Alexey
22.08.2018
01:08:44

Denis
22.08.2018
01:12:07