
Slach
15.06.2017
16:15:57

Алекс
15.06.2017
16:20:06

Vladimir
15.06.2017
16:20:49

Alex
15.06.2017
16:21:21
именно так :)

Google

evervoid
15.06.2017
18:42:22

Виктор
15.06.2017
18:55:44
Подождите, вроде order by тут ни при чем
Как я понимаю, он не работает
А order by по индексу в большинстве случаев не будет давать ожидаемого профита, как я понимаю. Следствие организации хранения данных в merge tree.
Подумал ещё немного. Будет, но зависит от данных и запроса. Не так как в классических базах с каким-нибудь btree.

Denys
15.06.2017
19:56:33
Ребята, вы можете обновить benchmark? Например, там сравнение с очень старой версией MemSQL. Сейчас 5.8, а начиная с 4.0 columnstore существенно переработан и ускорен

Sergei
15.06.2017
20:10:42

Denys
15.06.2017
20:12:55
Там же написано - benchmark
https://clickhouse.yandex/benchmark.html

Alexey
15.06.2017
20:21:38
Надо обновить. Для MemSQL даже не так сложно, потому что сохранилась пошаговая инструкция. Сделаем, если найдём время.

Vladislav
15.06.2017
21:09:35
Я все вертику жду обновления, уже версия 8.1 в проде бегает ?

Alexander
15.06.2017
21:35:44
С Вертикой не будет принципиальной разницы в зависимости от версий

Google

Oleg
15.06.2017
22:21:08

Alexey
15.06.2017
22:38:39

Oleg
15.06.2017
22:38:48
ок, спс

f1yegor
15.06.2017
22:39:06

Alexey
15.06.2017
22:40:13
Смысл в том, что все системы проходят тесты на одинаковых серверах.
А вообще было бы хорошо. Сейчас для этого не хватает генератора тестовых данных.

Alexander
16.06.2017
06:54:12
Всем привет. Кто-нибудь пробовал использовать odbc драйвер на windows? У вас он хоть с какой-нибудь программой начал отрабатывать?
Мы пробовали spss моделлер, excel 2013, tableau 10.3 - где-то видит только таблицы, где-то еще видны поля. но селект нигде не получилось сделать. эксель просто не подлкючился

Dmitry
16.06.2017
07:24:05


Pavel
16.06.2017
08:38:26
Здравствуйте!
Система генерирует поток событий. У события есть время появления, уникальный идентификатор и текстовое представление события.
Структура таблицы для хранения событий:
CREATE TABLE IF NOT EXISTS test_data (CounterID UInt32, EventDate Date, Payload String) ENGINE = MergeTree(EventDate, (CounterID, EventDate), 8192)
Я хочу использовать кликхаус в качестве хранилища событий с возможностью запуска аналитики и с возможностью последующей выгрузки в другие системы.
Записал в таблицу примерно 0.5*10^9 таких событий и пытаюсь перегружать их по мере пеступления во внешнего клиента таким запросом:
SELECT CounterID,EventDate,Payload FROM test_data WHERE CounterID > 5 ORDER BY CounterID LIMIT 5 FORMAT JSON
Запрос выполняется 50 минут.
Всего строк
COUNT()=623171850
"statistics":
{
"elapsed": 3094.789434725,
"rows_read": 623171850,
"bytes_read": 430075954723
}
Аналогично для запроса
SELECT CounterID,EventDate,Payload FROM test_data WHERE CounterID > 623171000 ORDER BY CounterID LIMIT 5
По какой причине в этом запросе происходит чтение всех строк и не используется индекс?
Есть ли правильный способ перегружать данные из таблицы во внешнюю систему по мере поступления событий или clickhouse в принципе не предназначен для таких задач?
версия clickhouse 1.1.54236


Александр
16.06.2017
08:53:02
Судя по вчерашнему общению на тему order by, то он вроде как не использует индекс
И возможно так долго данные читаются как раз таки из-за order by, но я могу ошибаться ) Лучше дождаться ответа от разработчиков
Хотя...скорее всего у вас слишком большая гранулированность CounterID
И получается так, что особого профита от индекса по этой колонке нет
Получается аналогично фулскану
Можно добавить еще колонку какую то типа eventBatch и класть туда например пометку о каждых 10 миллионах записей
И вместо CounterID включить ее в индекс
Например на батчи в диапозоне 623 170 000 - 623 171 000 значение eventBatch будет 623 170 000
Тогда можно будет делать запрос типа prewhere eventBatch > 623 170 000 where CounterID > 623 171 000
Вот тут есть очень развернутый ответ Алексея на тему того как работает первичный ключ: https://groups.google.com/forum/#!topic/clickhouse/eUrsP30VtSU


Maxim
16.06.2017
09:28:59
А нет ли желания рассказать про ClickHouse на https://smartdataconf.ru/ ?

Google

Pavel
16.06.2017
09:29:27


Alexey
16.06.2017
10:14:41
Про Excel.
В 2016 запрос через odbc - работает. 2013 ещё надо найти.
Здравствуйте!
Система генерирует поток событий. У события есть время появления, уникальный идентификатор и текстовое представление события.
Структура таблицы для хранения событий:
CREATE TABLE IF NOT EXISTS test_data (CounterID UInt32, EventDate Date, Payload String) ENGINE = MergeTree(EventDate, (CounterID, EventDate), 8192)
Я хочу использовать кликхаус в качестве хранилища событий с возможностью запуска аналитики и с возможностью последующей выгрузки в другие системы.
Записал в таблицу примерно 0.5*10^9 таких событий и пытаюсь перегружать их по мере пеступления во внешнего клиента таким запросом:
SELECT CounterID,EventDate,Payload FROM test_data WHERE CounterID > 5 ORDER BY CounterID LIMIT 5 FORMAT JSON
Запрос выполняется 50 минут.
Всего строк
COUNT()=623171850
"statistics":
{
"elapsed": 3094.789434725,
"rows_read": 623171850,
"bytes_read": 430075954723
}
Аналогично для запроса
SELECT CounterID,EventDate,Payload FROM test_data WHERE CounterID > 623171000 ORDER BY CounterID LIMIT 5
По какой причине в этом запросе происходит чтение всех строк и не используется индекс?
Есть ли правильный способ перегружать данные из таблицы во внешнюю систему по мере поступления событий или clickhouse в принципе не предназначен для таких задач?
версия clickhouse 1.1.54236
Если читается много строк - значит получается, что много строк подходят под условие CounterID > 5 или CounterID > 623171000. При этом ORDER BY CounterID LIMIT 5 уже не помогает, так как ORDER BY не использует индекс.
Чтобы было эффективнее, можно поставить условие на CounterID сверху, как-то наугад: CounterID > 5 AND CounterID < 500. Понятное дело, что так не всегда возможно.
ORDER BY не использует индекс. Но это было бы хорошо реализовать. Ещё не реализовано, потому что требуется несколько другой способ распараллеливания запроса (разделения задач по потокам) - более "последовательный", чем когда известно, что мы будем читать весь диапазон. И такая логика просто ещё не разработана.


Maxim
16.06.2017
10:30:56

Pavel
16.06.2017
10:31:28
ну хоть кто-то здесь не ненавидит яву=)

Alexey
16.06.2017
10:42:55
Вспомнил, что у нас уже есть предварительная договорённость о конференции от Jug.ru как раз в это время. Думаю, это она и есть. Значит будем.

Pavel
16.06.2017
10:57:10
про использование order by понял, спасибо

Roman
16.06.2017
11:01:43
Существует ли возможность смерджить одноуровневые массивы? Например, для структуры: Key UInt32 | Value Array(UInt32)
поулчить все уникальные значения элементов массива Value для определенного ключа?

Александр
16.06.2017
11:09:31
Которые по массиву топают

Alexey
16.06.2017
11:16:07

Roman
16.06.2017
11:18:03

N
16.06.2017
11:45:34
Расскажите, пожалуйста, по-подробнее, что такое seek-и. Откуда возникают и что влияет на их количество. Что с их помощью оценить - есть в документации, но не понимаю откуда они.

Pavel
16.06.2017
11:46:07
это из области жесктих дисков, время необходимое на передвижение головки механического диска на другую дорожку
условно, это время задержки межда получением команды "прочти блок Х" и его прочтением с магнитной пластины.

N
16.06.2017
11:48:38
И, если я правильно понимаю, оно будет увеличиваться с количеством данных на диске?

Pavel
16.06.2017
11:48:53
нет :)
это относительно постоянная величина в районе 4-9 мс

Google

Pavel
16.06.2017
11:49:36
она зависит сугубо от расстояния между дорожками (чем дальше - от центра - данные на диск легли - тем дольше)
ну и как следствие, чем больше обращений с паттерном "рандом read / write", когда чтение запись идет не последовательно, а в разные файлы (как следствие размещенные в физически разных местах жесктого диска) идет этот самый seek
чем больше рандомность - тем больше он времени жрет. Идеальный вариант - когда данные пишутся последовательно и очень большими блоками, так будет быстрее всего.
либо выкинуть начерт механические диски и забыть про бурду что я только что рассказал :)

N
16.06.2017
11:54:33
Ясно, спасибо! Смутил тот факт, что при выполнении select event, value from system.events where event == 'Seek' возвращает 1621052. Бывает увеличивается скачками немного, не уменьшается и не понятно в каких попугаях измеряется.

Pavel
16.06.2017
11:55:44
я почти уверен, что - в штуках :)

Alexey
16.06.2017
13:12:31

Maksim
16.06.2017
13:13:08
т.е. это не seek шпинделя?

N
16.06.2017
13:14:41
И смысл такого счётчика тоже, пожалуйста)

Alexey
16.06.2017
13:16:30
С реальным перемещением головок связано косвенно.
Смысл счётчика - количество мест, с которых мы читали файлы.
Например, если после обработки запроса, счётчик увеличился на 10 - значит было 10 разных мест, начиная с которых мы делали чтения файлов.

Pavel
16.06.2017
13:25:17
удобная штука для отладки

Andrey
16.06.2017
13:26:10
Ребят, а есть какие нибудь костыли против broken pipe до релиза новой версии?

Alex
16.06.2017
13:38:40
Можно в каждом шарде задублировать реплику
и не забыть выставить везде internal_replication = true
то есть было так:
<remote_servers>
<test_cluster>
<shard>
<replica>
<host>remote</host>
<port>9000</port>
</replica>
</shard>
</test_cluster>
</remote_servers>
стало так:
<remote_servers>
<test_cluster>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>remote</host>
<port>9000</port>
</replica>
<replica>
<host>remote</host>
<port>9000</port>
</replica>
</shard>
</test_cluster>
</remote_servers>
И так для каждого шарда

Александр
16.06.2017
13:40:47
А если у меня виртуалки? Я могу просто склонировать три шарда и сделать их репликами? Данные будут переналиваться или лучше чистый инстанс кх поднимать?

Alex
16.06.2017
13:40:48
Должно помочь :)

Google

Andrey
16.06.2017
13:41:06

Alex
16.06.2017
13:41:42
По факту сервера остаются теми же, просто их надо внести в конфиг два раза
Чет не совсем понимаю, а как оно поможет?
Если реплик больше одной, используется другой код, в котором проблемы нет. Таким конфигом мы заставляем ClickHouse думать, что их две на шард, хотя на самом деле одна :)
Посколько при internal_replication=true вставка будет производиться только на одну из "реплик", дублирования данных не будет.
При запросе в distributed таблицу запрос тоже направляется только на одну из "реплик" шарда.
То есть всё будет работать как надо

Andrey
16.06.2017
13:49:42
очень интересное решение