Size: a a a

ClickHouse не тормозит

2021 February 01

IK

Ivan Kizimenko in ClickHouse не тормозит
Если добавить колонку с MATERIALIZED expr,  то значение будет вычисляться при каждом SELECT ?
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
Ivan Kizimenko
Если добавить колонку с MATERIALIZED expr,  то значение будет вычисляться при каждом SELECT ?
если я правильно всё понял при инсерте будет вычисляться expr и сохраняться.
старые данные будут вычисляться при каждом SELECT пока не произейдет merge этого PART
источник

IK

Ivan Kizimenko in ClickHouse не тормозит
KiLEX 萊赫
если я правильно всё понял при инсерте будет вычисляться expr и сохраняться.
старые данные будут вычисляться при каждом SELECT пока не произейдет merge этого PART
Тогда в чем отличие от DEFAULT, он вроде тоже вычисляется при  INSERT если не указан
источник

IK

Ivan Kizimenko in ClickHouse не тормозит
как лучше сделать?
Пишутся события, домен отдельно не пишется. Фильтр по домену часто используется. Хочу сделать колонку c выражением  domainWithoutWWW(page_url), по логике это должно ускорить запросы.

Идеально конечно при записи сразу слать домен отдельно, но если ограничиться только возможностями CH
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
Ivan Kizimenko
Тогда в чем отличие от DEFAULT, он вроде тоже вычисляется при  INSERT если не указан
выше писали что отличие от дефолт только в том что дефолт выбирается по SELECT * и можно явно вставлять значение
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
в любых ситуациях лучше использовать дефолт
источник

IK

Ivan Kizimenko in ClickHouse не тормозит
KiLEX 萊赫
в любых ситуациях лучше использовать дефолт
Он исторические данные при мердже также дозаполнит?
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
Denny Crane [not a Yandex bot]
смотрите, есть такая штука DEFAULT
она ИНОГДА не удобна что ломает существующие insert-ы (insert into без перечисления полей)
добавили MATERIALIZED чтобы не ломать insert-ы, но все поведение как у DEFAULT
все. конец сказки.

Посмотрите еще ALIAS
вот
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
Ivan Kizimenko
Он исторические данные при мердже также дозаполнит?
если верить @den_crane - то да
источник

K

KiLEX 萊赫 in ClickHouse не тормозит
я не тестил, честно
источник

IK

Ivan Kizimenko in ClickHouse не тормозит
спасибо, вроде все ясно
источник

AS

Alexey Sokolov in ClickHouse не тормозит
Alexey Sokolov
Помогите, пожалуйста, разобраться с ключами партиционирования.

Для теста сделал две таблицы, наполнение одинаковое, различаются только ключом партиционирования.
Первая:
CREATE TABLE TestTable
(
 event_id UUID,
 event_date Date,
 event_type LowCardinality(String),
 event_region LowCardinality(String),
 minValueState AggregationFunction(min, Int8),
 recordsNumState AggregationFunction(count)
)
ENGINE = AggregationMergeTree()
PARTITION BY toYYYYMMDD(event_date)
ORDER BY (event_date, event_type, event_region)
TTL event_date + interval 30 day


Вторая:
PARTITION BY (toYYYYMMDD(event_date), event_type, event_region)


В таблице сейчас всего 2 млрд записей, в день пишется 500 млн, ожидаемый рабочий размер - 15 млрд записей. Все запросы представляют из себя либо выбор event_id по нужным (event_date, event_type, event_region) с заданным значением агрегата min, либо подсчёт выбранных таким образом уников.

Тестовый запрос:
SELECT
 t.event_id
FROM
 TestTable t
WHERE
 t.event_date = '2021-01-25'
 and t.event_type = 'event1'
 and t.event_region = 'Msk'
GROUP BY
 t.event_id
HAVING
 minMerge(t.minValueState) > 0


Результат для первой таблицы:
read_rows = 50.0 млн
memory_usage = 6.23 гб

Результат для второй таблицы:
read_rows = 49.8 млн
memory_usage = 5.71 гб

Правильно понимаю, что в первом варианте КХ ищет по засечкам нужную часть партиции, которая, благодаря ключу сортировки, получается лишь немного больше нужной партиции во втором варианте, и работает только с ней?

Я предполагал, что второй вариант будет сильно быстрее, но такая оптимизация в моём случае практически бесполезна. А в каких случаях разбиение на более мелкие партиции имеет смысл для ускорения запросов? Или я вообще делаю что-то не так?
Помогите, пожалуйста, с этим вопросом.
источник

M

Mishanya in ClickHouse не тормозит
Alexey Sokolov
Помогите, пожалуйста, с этим вопросом.
партиционирвание сделано не для ускорения запросов в первую очередь, а для манипуляций
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
Mike E.
Да, спасибо, уже нашел от куда freeze делается, только вот почему-то места /shadow/занимает прилично
Понять что хардлинки не занимают место нелегко. Надо слелать du -sh на все каталоги кх, du учитывает что этот inode уже был и не включает в сумму второй раз. Ну и парты которые помержены будут занимать место конечно.
источник

IT

Ivan Torgashov in ClickHouse не тормозит
Alexey Sokolov
Помогите, пожалуйста, разобраться с ключами партиционирования.

Для теста сделал две таблицы, наполнение одинаковое, различаются только ключом партиционирования.
Первая:
CREATE TABLE TestTable
(
 event_id UUID,
 event_date Date,
 event_type LowCardinality(String),
 event_region LowCardinality(String),
 minValueState AggregationFunction(min, Int8),
 recordsNumState AggregationFunction(count)
)
ENGINE = AggregationMergeTree()
PARTITION BY toYYYYMMDD(event_date)
ORDER BY (event_date, event_type, event_region)
TTL event_date + interval 30 day


Вторая:
PARTITION BY (toYYYYMMDD(event_date), event_type, event_region)


В таблице сейчас всего 2 млрд записей, в день пишется 500 млн, ожидаемый рабочий размер - 15 млрд записей. Все запросы представляют из себя либо выбор event_id по нужным (event_date, event_type, event_region) с заданным значением агрегата min, либо подсчёт выбранных таким образом уников.

Тестовый запрос:
SELECT
 t.event_id
FROM
 TestTable t
WHERE
 t.event_date = '2021-01-25'
 and t.event_type = 'event1'
 and t.event_region = 'Msk'
GROUP BY
 t.event_id
HAVING
 minMerge(t.minValueState) > 0


Результат для первой таблицы:
read_rows = 50.0 млн
memory_usage = 6.23 гб

Результат для второй таблицы:
read_rows = 49.8 млн
memory_usage = 5.71 гб

Правильно понимаю, что в первом варианте КХ ищет по засечкам нужную часть партиции, которая, благодаря ключу сортировки, получается лишь немного больше нужной партиции во втором варианте, и работает только с ней?

Я предполагал, что второй вариант будет сильно быстрее, но такая оптимизация в моём случае практически бесполезна. А в каких случаях разбиение на более мелкие партиции имеет смысл для ускорения запросов? Или я вообще делаю что-то не так?
Опыты с составными ключами в partition by, подобные
PARTITION BY (toYYYYMMDD(event_date), event_type, event_region)
у меня ни к чему хорошему не привели. Во первых сильно стала проседать скорость, когда обьём данных накопился более-менее приличный, несколько лет. Партиций стало слишком много. И во вторых, пришлось увеличивать max_partitions_per_insert_block со 100 до 1000+, иначе при вставке репликация ставала колом, реплики просто не принимали такие запросы, и пока я не заметил, их в буфере Distributed накопилось уже приличное количество, и они бесконечно пытались раскидаться по шардам.
После увеличения max_partitions_per_insert_block оно, конечно, рассосалось, но деградация скорости стала такой, что просто перелили  с простым партицированием по месяцам.
А дневные юзаются для кеш-таблиц, в которые триггером копируется из основных таблиц. Дневные - чтобы по крону раз в сутки можно было чистить кеш.
Вот такой опыт получился.
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
Alexey Sokolov
Помогите, пожалуйста, разобраться с ключами партиционирования.

Для теста сделал две таблицы, наполнение одинаковое, различаются только ключом партиционирования.
Первая:
CREATE TABLE TestTable
(
 event_id UUID,
 event_date Date,
 event_type LowCardinality(String),
 event_region LowCardinality(String),
 minValueState AggregationFunction(min, Int8),
 recordsNumState AggregationFunction(count)
)
ENGINE = AggregationMergeTree()
PARTITION BY toYYYYMMDD(event_date)
ORDER BY (event_date, event_type, event_region)
TTL event_date + interval 30 day


Вторая:
PARTITION BY (toYYYYMMDD(event_date), event_type, event_region)


В таблице сейчас всего 2 млрд записей, в день пишется 500 млн, ожидаемый рабочий размер - 15 млрд записей. Все запросы представляют из себя либо выбор event_id по нужным (event_date, event_type, event_region) с заданным значением агрегата min, либо подсчёт выбранных таким образом уников.

Тестовый запрос:
SELECT
 t.event_id
FROM
 TestTable t
WHERE
 t.event_date = '2021-01-25'
 and t.event_type = 'event1'
 and t.event_region = 'Msk'
GROUP BY
 t.event_id
HAVING
 minMerge(t.minValueState) > 0


Результат для первой таблицы:
read_rows = 50.0 млн
memory_usage = 6.23 гб

Результат для второй таблицы:
read_rows = 49.8 млн
memory_usage = 5.71 гб

Правильно понимаю, что в первом варианте КХ ищет по засечкам нужную часть партиции, которая, благодаря ключу сортировки, получается лишь немного больше нужной партиции во втором варианте, и работает только с ней?

Я предполагал, что второй вариант будет сильно быстрее, но такая оптимизация в моём случае практически бесполезна. А в каких случаях разбиение на более мелкие партиции имеет смысл для ускорения запросов? Или я вообще делаю что-то не так?
Все правильно вы поняли.
Обычно невозможно напихать столько полей в partition by потому что будет очень много партов и замедляются инсетры. Чаще всего удается добавить в partitiin by какое-то одно низкокардинальное поле которое не хочется класть в order by
источник

ME

Mike E. in ClickHouse не тормозит
Denny Crane [not a Yandex bot]
Понять что хардлинки не занимают место нелегко. Надо слелать du -sh на все каталоги кх, du учитывает что этот inode уже был и не включает в сумму второй раз. Ну и парты которые помержены будут занимать место конечно.
storage-ch]# du -sh clickhouse/
14T     clickhouse/
storage-ch]# du -sh clickhouse/shadow/
3.3T    clickhouse/shadow/
правильно я понимаю, что в shadow что-то потярялось?
источник

AS

Alexey Sokolov in ClickHouse не тормозит
Ivan Torgashov
Опыты с составными ключами в partition by, подобные
PARTITION BY (toYYYYMMDD(event_date), event_type, event_region)
у меня ни к чему хорошему не привели. Во первых сильно стала проседать скорость, когда обьём данных накопился более-менее приличный, несколько лет. Партиций стало слишком много. И во вторых, пришлось увеличивать max_partitions_per_insert_block со 100 до 1000+, иначе при вставке репликация ставала колом, реплики просто не принимали такие запросы, и пока я не заметил, их в буфере Distributed накопилось уже приличное количество, и они бесконечно пытались раскидаться по шардам.
После увеличения max_partitions_per_insert_block оно, конечно, рассосалось, но деградация скорости стала такой, что просто перелили  с простым партицированием по месяцам.
А дневные юзаются для кеш-таблиц, в которые триггером копируется из основных таблиц. Дневные - чтобы по крону раз в сутки можно было чистить кеш.
Вот такой опыт получился.
Спасибо за ваш опыт, учту.

У меня просто есть таблицы, созданные с кривыми ключами сортировки, и там добавление условия по полю из ключа партиционирования ускоряет запросы иногда в десятки раз.
И есть много однотипных таблиц, которые хочу схлопнуть без потери скорости работы с ними.
источник

AS

Alexey Sokolov in ClickHouse не тормозит
Denny Crane [not a Yandex bot]
Все правильно вы поняли.
Обычно невозможно напихать столько полей в partition by потому что будет очень много партов и замедляются инсетры. Чаще всего удается добавить в partitiin by какое-то одно низкокардинальное поле которое не хочется класть в order by
Денис, спасибо.
источник

VB

Vladimir Bunchuk in ClickHouse не тормозит
Anton Kuznetsov
Ребят подскажите, кто нибудь добавлял модели catboost в КХ. Проблоема след плана - выкачиваю прекомпилированные файлик с гита https://github.com/catboost/catboost/releases, и в конфиге КХ указываю путь до него
<catboost_dynamic_library_path>....catboost.so</catboost_dynamic_library_path>
Плюет пошибку -
Code: 375, e.displayText() = DB::Exception: Cannot dlopen: /usr/lib64/python2.7/site-packages/catboost/libcatboostr-linux.so: undefined symbol: R_DimSymbol, e.what() = DB::Exception

Пробовали также устанвоить catboost через pip шибка была другая -
Code: 375, e.displayText() = DB::Exception: Cannot dlopen: /usr/lib64/python2.7/site-packages/catboost/_catboost.so: undefined symbol: PyExc_KeyboardInterrupt

В итоге я выкачал рекомпиленные файлы из докер контейнера из данного туториала https://github.com/yandex/clickhouse-presentations/blob/master/tutorials/catboost_with_clickhouse_ru.md, и все заработало.

Но хотелось бы понять почему КХ не принимал файлы выачанные с гита и через pip
Добрый день!
Удалось разобраться в чем проблема?
Мы как раз сейчас интегрируем catboost и ловим такую ошибку
источник