Size: a a a

ClickHouse не тормозит

2020 July 14

IZ

Ildar Zaynullin in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
rollup делается во время мержей. Мержи букают 2 размера суммарного исходных партов.

<function>avg</function> -- считается неправильно, потому что это avg
про avg не понял. Что считается неправильно?
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Ildar Zaynullin
Добрый день! Наблюдаю проблему с тем, что конфигурация rollup в GraphiteMergeTree в какой-то момент перестала выполнять агрегацию. Версия кликхаус ClickHouse server version 19.8.3.8 (official build).

Настройки rollup:
<graphite_rollup>
       <path_column_name>Path</path_column_name>
       <time_column_name>Time</time_column_name>
       <value_column_name>Value</value_column_name>
       <version_column_name>Timestamp</version_column_name>
       <default>
           <function>avg</function>
           <retention>
               <age>0</age>
               <precision>1</precision>
           </retention>
           <retention>
               <age>86400</age>
               <precision>60</precision>
           </retention>
           <retention>
               <age>864000</age>
               <precision>900</precision>
           </retention>
           <retention>
               <age>1728000</age>
               <precision>1800</precision>
           </retention>
       </default>
   </graphite_rollup>


Конфигурация таблицы:
CREATE TABLE graphite (`Path` String, Value Float64, Time DateTime, Date Date, Timestamp UInt32) ENGINE = GraphiteMergeTree('graphite_rollup') PARTITION BY toYYYYMM(Date) ORDER BY (Path, Time) SETTINGS index_granularity = 8192


Запрос метрики за 17.06.2020 (сегодня 14.07.2020) возвращает метрики с интервалом в 1 сек, хотя согласно настройкам метрика должна остаться 1 метрика за 30 мин.
SELECT *
FROM graphite
WHERE (Date = '2020-06-17') AND (Path = 'statsd.numStats')
ORDER BY Timestamp DESC
LIMIT 2

┌─Path────────────┬──────────Value─┬────────────────Time─┬───────Date─┬────Timestamp─┐
│ statsd.numStats │              4 │ 2020-06-17 23:59:59 │ 2020-06-17 │   1592427599 │
│ statsd.numStats │              4 │ 2020-06-17 23:59:58 │ 2020-06-17 │   1592427598 │
└─────────────────┴────────────────┴─────────────────────┴────────────┴──────────────┘

А запрос метрики за 16.06.2020 возвращает метрики с интервалом в 1 минуту, и тоже не подходит не под одно правило
SELECT *
FROM graphite
WHERE (Date = '2020-06-16') AND (Path = 'statsd.numStats')
ORDER BY Timestamp DESC
LIMIT 2

┌─Path────────────┬──────────Value─┬────────────────Time─┬───────Date─┬────Timestamp─┐
│ statsd.numStats │              4 │ 2020-06-16 23:59:00 │ 2020-06-16 │   1592341199 │
│ statsd.numStats │              4 │ 2020-06-16 23:58:00 │ 2020-06-16 │   1592341139 │
└─────────────────┴────────────────┴─────────────────────┴────────────┴──────────────┘

Метрики за 26.06.2020 хранятся по одной секунде, а уже за 27.06.2020 - по одной минуте.
При выполнении OPTIMIZE получаю следующее:
## SET optimize_throw_if_noop = 1
## OPTIMIZE TABLE graphite PARTITION 202007 FINAL
Code: 388. DB::Exception: Received from localhost:6788, 127.0.0.1. DB::Exception: Insufficient available disk space, required 191.81 GB.
## OPTIMIZE TABLE graphite PARTITION 202006 FINAL
Code: 388. DB::Exception: Received from localhost:6788, 127.0.0.1. DB::Exception: Insufficient available disk space, required 124.50 GB.


Сами размеры партиций меньше, чем размер на диске, требуемый для выполнения OPTIMIZE:
SELECT
   table,
   sum(rows),
   partition,
   count() AS number_of_parts,
   formatReadableSize(sum(bytes)) AS sum_size
FROM system.parts
WHERE table = 'graphite'
GROUP BY
   table,
   partition
ORDER BY partition ASC

┌────table─┬──────sum(rows)─┬─partition─┬─number_of_parts─┬─sum_size───┐
│ graphite │     7171581973 │   202006  │               9 │ 57.98 GiB  │
│ graphite │    14093390942 │   202007  │             619 │ 89.65 GiB  │
└──────────┴────────────────┴───────────┴─────────────────┴────────────┘


Правильно ли я понимаю, что rollup не может выполниться из-за нехватки места на диске? если это так, то какие минимальные требования по размеру диска нужно закладывать при проектировании, если в качестве хранилища graphite метрик использовать clickhouse? Записываются ли в логи ошибки слияния партиций, чтобы по ним можно было сразу среагировать на невыполненное слияние?
>Записываются ли в логи ошибки слияния партиций
это не ошибка просто мерж не начнется потому что места нет, в логе об этом будет сообщение
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Ildar Zaynullin
про avg не понял. Что считается неправильно?
не относится к текущему вопросу, но avg считается неверно, потому что avg счиается из усредняемых значений, т.е.
было 1 2 3 4 5, и например сначала помержатся 1 и 2, получится 1.5, потом помержаться например 3 4 5 получится 4, потом 1.5 и 4 получится 2.75
а нормальный avg 3
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Александр Филиппов
Всем привет, есть такая проблема. Примерно 2к селектов в секунду. Сначала всё ок. А потом начинает возвращать ошибку, что вся память закончилось. Не подскажите как решить? Кликхаус не умеет высвобождать память? Или нужно set max_memory_usage перед каждым запросом выставлять?
есть например в 20.3 баг с аккаунтингом использованной памяти при http запросах, а например в 18.6 течет кеш компилированных запросов, а 19.17 .... , а 20.5 ....
источник

A

Andrey in ClickHouse не тормозит
Подскажите не опытному )))
CREATE TABLE example (
 browser_id   UInt16,
 managers   Array(UInt64)
) engine=Memory

Как должен выглядеть запрос на поиск ГДЕ managers содержит в массиве 111122223333 ?
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Andrey
Подскажите не опытному )))
CREATE TABLE example (
 browser_id   UInt16,
 managers   Array(UInt64)
) engine=Memory

Как должен выглядеть запрос на поиск ГДЕ managers содержит в массиве 111122223333 ?
select * from example where has(managers,111122223333)
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Andrey
Коллеги, помогите с таким эксепшном.

На реплике:
2020.07.14 17:58:17.151895 [ 14 ] {} <Error> table: DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Timeout: connect timed out: 10.22.1.24:90090. 0xbc31e1b Poco::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)  in /usr/bin/clickhouse


Беспокоит 10.22.1.24:90090.
IP верный, но порт такой как получился? О_о
надо вам в ЗК смотреть как реплика себя анонсировала, я не понимаю почему там ip а не имя хоста, возможно лишний 0 это просто баг при логировании
источник

A

Andrey in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
надо вам в ЗК смотреть как реплика себя анонсировала, я не понимаю почему там ip а не имя хоста, возможно лишний 0 это просто баг при логировании
В ЗК хостнеймы.

Что примечательно, репликация по этой таблице работает. Но периодически такая ошибка проскакивает. Иногда не получается сделать truncate с ошибкой таймаута, будто бы реплика недоступна, хотя в это же самое время telnet на порт проходит
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Andrey
В ЗК хостнеймы.

Что примечательно, репликация по этой таблице работает. Но периодически такая ошибка проскакивает. Иногда не получается сделать truncate с ошибкой таймаута, будто бы реплика недоступна, хотя в это же самое время telnet на порт проходит
на какой порт? порт репликации 9009
источник

A

Andrey in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
на какой порт? порт репликации 9009
на 9009
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Andrey
на 9009
попробуйте на ВСЕХ хостах

cd /etc/clickhouse-server/
grep -R 90090 *
источник

A

Andrey in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
попробуйте на ВСЕХ хостах

cd /etc/clickhouse-server/
grep -R 90090 *
пусто
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Andrey
пусто
чудеса, попробуйте апгрейд в 20.1.16.120 возможно где-то что-то корраптится, как имена хостов выглядят? там есть минусы, подчеркивания?
источник

A

Andrey in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
select * from example where has(managers,111122223333)
Благодарю. Подскажите пожалуйста если внутри массива до 5 значений. Может быть имеет смысл в следующей структуре таблицы исходя из скорости нахождения manager:  

CREATE TABLE example (
 browser_id   UInt16,
 managers1   UInt64,
 managers2   UInt64,
 managers3   UInt64,
 managers4   UInt64,
 managers5   UInt64
) engine=Memory
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Andrey
Благодарю. Подскажите пожалуйста если внутри массива до 5 значений. Может быть имеет смысл в следующей структуре таблицы исходя из скорости нахождения manager:  

CREATE TABLE example (
 browser_id   UInt16,
 managers1   UInt64,
 managers2   UInt64,
 managers3   UInt64,
 managers4   UInt64,
 managers5   UInt64
) engine=Memory
если искать во всех 5 полях, то не имеет, даже наоборот
источник

A

Andrey in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
если искать во всех 5 полях, то не имеет, даже наоборот
Понял, спасибо.
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Andrey
Благодарю. Подскажите пожалуйста если внутри массива до 5 значений. Может быть имеет смысл в следующей структуре таблицы исходя из скорости нахождения manager:  

CREATE TABLE example (
 browser_id   UInt16,
 managers1   UInt64,
 managers2   UInt64,
 managers3   UInt64,
 managers4   UInt64,
 managers5   UInt64
) engine=Memory
вообще конечно можно таблицу развернуть (столбцы в строки), и сделать manager в индексе или выкинуть нафиг КХ и взять православный PG (там индексировать массивы можно)
источник

Р

Роман in ClickHouse не тормозит
Добрый день! Как найти по этой ссылке актуальный change log  на версию? В репозитории в ветке master в change log нет этой версии
источник

Е

Екатерина in ClickHouse не тормозит
здравствуйте, товарищи! на версии 20.4.5.36 столкнулась с ситуацией, когда при вставке в Distributed таблицу записи через мат. вью должны вставляться в другую таблицу, так вот, если мат. вью при срабатывании выдает ошибку, в частности неправильный формат вставляемого значения, то в Distributed  таблице данные множатся,  и в локальных таблицах, соответственно, тоже, есть догадки, почему такое может происходить? в версии 20.1 такого не наблюдалось
источник

A

Andrey in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
вообще конечно можно таблицу развернуть (столбцы в строки), и сделать manager в индексе или выкинуть нафиг КХ и взять православный PG (там индексировать массивы можно)
Оригинальная табличка:
CREATE TABLE gpslog (
   client_id   UInt64,
   managers_id   Array(UInt64)
 gps_lon Float64
 gps_lan Float64
 time Uint64
) engine=MergeTree

Почему КликХаус
1. Идеологическая
2. Иногда по этой табличке необходимо будет строить аналитические запросы по типу:
select count(1) from gpslog where (pow(gps_lon - 55.135424, 2) +  pow(gps_lat - 25.077005, 2)) < pow(180*300/(6371*1000*pi()), 2)
источник