
Alexey
14.06.2017
14:28:30
Вставка в основную таблицу и в mat. view неатомарна. Но если использовать Replicated-таблицы для обеих и повторять вставку после любой ошибки, то данные будут корректно вставлены без дубликатов в оба места.

Alexander
14.06.2017
14:42:54
... удалено. Похоже poco флашит автоматом.

Alexander
14.06.2017
14:59:17
Во всяком случае в рамках одной реплики. Остальные реплики (основая таблица и MV) догоняются полностью независимо

Google

Alexey
14.06.2017
15:04:06
Вставка идёт сначала в MV, потом в основную таблицу. Если ошибка на этапе вставки в MV, то ничего не вставится.

Sergei
14.06.2017
15:08:29
Всем привет!
есть возможность средствами КХ выстраивать запросы в очередь?
есть органичение по кол-во конкурентных запросов. Есть ли у КХ средство из коробки или всегда будет лететь ошибка?

Alexander
14.06.2017
15:15:50
а можно как-то кх ограничить по памяти? а то жрет всю оперативу, выжирает весь своп и сервер вешается так, что даже по ssh не достучаться
шуршит в фоне мержами

Igor
14.06.2017
15:17:01
'max_memory_usage_for_user', 'max_memory_usage_for_all_queries'
+ 'max_memory_usage', 'max_bytes_before_external_group_by'

Alexander
14.06.2017
15:19:11
max_memory_usage выставлено, но чот по ощущениям выжрато весьма больше :)

Igor
14.06.2017
15:19:31
max_memory_usage - это на один запрос

Alexander
14.06.2017
15:19:54
а ну да

Slach
14.06.2017
15:20:08
У меня такая же ошибка тоже на вставках последняя версия выжраламвсю оперативу и сервер крашнулся по oom

Dig
14.06.2017
15:25:57

Alexander
14.06.2017
15:32:27
Коллеги, у меня в запросе есть условие WHERE category_id IN (:categoryIds), использую NamedParameterJdbcTemplate
а можно как-то на уровне SQL переписать это условие, чтобы в случае, если в :categoryIds передавалось NULL, то это условие игнорировалось по сути, и в фильте запроса не было категории? ну то есть чтобы SELECT вывел по всем категориям?

Alexey
14.06.2017
15:48:06

Google

Alexey
14.06.2017
15:48:38

Alexander
14.06.2017
15:48:42
@milovidov_an ну я бы не сказал, что 120gb - это очень маленький объем :)

Alexey
14.06.2017
15:49:29


Alexander
14.06.2017
15:55:59
ох, спасибо. выставлял потому, что именно память зажирает и сервак вешает. почему - пока понять не могу

Alexey
14.06.2017
15:57:06
Решение: выставить также обычный max_memory_usage меньше, чем max_memory_usage_for_all_queries. Уменьшить максимальное количество запросов на пользователя - max_concurrent_queries_for_user. Включить внешнюю агрегацию - см. https://clickhouse.yandex/docs/ru/query_language/queries.html?highlight=max_bytes_before_external_group_by#id8

Pavel
14.06.2017
15:57:10
интересно, а линукс умеет пристрелить отдельный поток, а не приложение целиком при событии OOM?

Alexey
14.06.2017
15:57:54
Пристрелить отдельный поток, для программы на C++, не имеет смысла - кто же будет деструкторы вызывать - разблокировать mutex, освобождать память и т. п.

Pavel
14.06.2017
15:58:16
это да, конечно...

Fike
14.06.2017
15:58:16
Если я правильно понимаю, это освободит только стек потока, что не очень много

Pavel
14.06.2017
15:58:54
в теории ведь можно добавить поток в отдельную cgroup
и наложить на нее ограничения памяти
но как это состыкуется с C++ - оооочень сложный вопрос

Fike
14.06.2017
15:59:54
потоки имеют общее адресное пространство (процесса), сомневаюсь, что это вообще возможно

Sergei
14.06.2017
16:00:10

Pavel
14.06.2017
16:00:11
если бы ОС умела передать инфуормацию об этом в приложении - поидее было бы возможно
в бусте есть т.н. interruption point
когда приложение может прочесть уведомление и например пристрелить поток
и вызвать корректно освобождение занятых ресурсов конкретно этим потоком

Google

Fike
14.06.2017
16:01:42
Because this ability caused certain problems, the ability to independently manipulate the cgroup memberships of the threads in a process has been removed in cgroups v2

Dig
14.06.2017
16:02:45

Pavel
14.06.2017
16:04:05
эх, сколько развлечения удалили :)

Alexey
14.06.2017
16:06:26
Да
В таком случае я затрудняюсь сказать навскидку, какая возможна причина. Можно посмотреть в лог. Для каждого INSERT-а, при записи, пишется сообщения вида:
<Debug> merge..inner.hits_timings2 (Replicated OutputStream): Wrote block 125579 with ID 17833449664338286632_166080607874846114, 116 rows
И посмотреть на соответствия с обычной таблицей и MV.

Dig
14.06.2017
16:11:14
Ок, попробую покопаться

papa
14.06.2017
16:14:22

Alexander
14.06.2017
16:15:29
ну там передается либо список ID шников, либо NULL и если NULL, то это значит вывести все категории

papa
14.06.2017
16:16:20
там - это где
и почему это не означает список из одного id, равного null
по-моему драйвера запросы особенно не парсят и вряд ли что-то в них удаляют.

Tatiana
14.06.2017
16:31:36
Такое как-то можно починить?
Сегодня уже 14 июня, а он все еще надеется...
Part 20170606_20170606_238257_238365_21 is covered by 20170606_20170606_238257_238370_22 but should be merged into 20170606_20170606_238257_238372_22. This shouldn't happen often.
Checking if anyone has part covering 20170606_20170606_238257_238372_22.
Found all blocks for missing part 20170606_20170606_238257_238372_22. Will wait for them to be merged.