
f1yegor
13.03.2017
17:51:36
т.е. за прокси с относительным путем /frontend/ фронтэнд запрашивает из корня. это должно работать?

Геннадий
13.03.2017
17:55:01

prll
13.03.2017
18:37:34
<base href="http://guiclickhouse.smi2.ru/">

Google

Dmitry
13.03.2017
22:04:14
в кх есть where, а есть prewhere
При этом оптимизатор может решить перенести where в prewhere, но если есть понимание, что после where данных будет мало, лучше явно prewhere задать

Dmitriy
14.03.2017
05:18:58

Shine
14.03.2017
09:01:25
Ребят, а тут некоторые писали, что с кафкой есть опыт
может кто отозваться, есть пара вопросов

Alexey
14.03.2017
09:10:25
Используем, но пока не с CH. Но работаем над тем чтоб flink докрутить до правильной загрузки в CH.
В чем вопрос?

Aleksey
14.03.2017
09:26:26
Добрый !
подскажите как лучше организовать данные в КХ. есть товары и есть их категории, каждый товар может относится сразу к нескольким категориям. Под категориями понимаются как нормальные иерархические категории (типа мобильный телефон ) так и некоторые специфические (например, "распродажа июля" и т.п.)
есть 2 идеи:
1.сделать в таблице поля
goods + category[], где последнее поле это массив
2. сделать несколько записей для каждого товара
т.е. goods + category, и для каждого товара делать столько строк в скольких категориях он состоит...
запросу будут потом стандартные типа вывести список товаров входящих в ту или иную категорию и т.п.

Fike
14.03.2017
09:41:51
На всякий спрошу: вы не собираетесь часом использовать КХ в качестве основного хранилища?

Aleksey
14.03.2017
09:42:51

Alexander
14.03.2017
09:43:02
можно ".сделать в таблице поля
goods + category[], где последнее поле это массив"
А если надо развернуть с строки типо "товар, категория", то для этого потом сделать Array Join

Aleksey
14.03.2017
09:47:54
будет ли это не хуже чем ручное развертывание перед записью в базу? просто мне кажется что массив будет не очень эффективно храниться...

Google

Dmitry
14.03.2017
09:49:10
Массив будет хорошо работать. Но хранить лучше только категории в которых непосредственно лежит товар
Родительские категории лучше хранить в иерархическом словаре

Aleksey
14.03.2017
09:56:54

Dmitry
14.03.2017
09:58:25
Лучше чтобы был массив интов конечно
А зачем для категорий строки?
Но в любом случае массив будет лучше, чем множить записи


Ruslan
14.03.2017
10:10:00
Здравствуйте, может кто пожалуйста подсказать как в clickhouse jdbc делать пакетное выполнение запросов (batch)?
делаю как в других выдает java.sql.SQLFeatureNotSupportedException
DataSource ds = new ClickHouseDataSource("jdbc:clickhouse://localhost:8123/default");
Connection dbConnection = ds.getConnection("default", "");
String insertTableSQL = "INSERT INTO Measure"
+ "(Id_Measure, value, date_metric, id_meter,user_id, resource) " + "VALUES"
+ "(?,?,?,?,?,?)";
PreparedStatement pstmt = dbConnection.prepareStatement(insertTableSQL);
Random random = new Random();
int currentBatch = 0;
int batchSize = 5000;
for (Integer i = 10; i < 100000; i++) {
pstmt.setObject(1, i.toString());
pstmt.setObject(2, random.nextDouble());
Integer i1 = random.nextInt(5) + 1;
pstmt.setObject(3, new Date(1994,12,12));
pstmt.setObject(4, i1.toString());
Integer i2 = random.nextInt(4) + 1;
pstmt.setObject(5, i2.toString());
pstmt.setObject(6, i2.toString());
currentBatch++;
if (currentBatch <= batchSize) {
pstmt.addBatch();
} else {
pstmt.executeBatch();
currentBatch = 0;
}
}
if (currentBatch != 0) {
pstmt.executeBatch();
}
dbConnection.close();


Andrey
14.03.2017
10:28:04

Aleksey
14.03.2017
10:32:23
А зачем для категорий строки?
ну это я так на перспективу спросил....
т.е. массивы будут лучше чем несколько строк? странно а я думал наоброт...она же колонки быстрее должна тащить... или массивы то же как то магически хранятся (со сжатием и всем таким)?


Andrey
14.03.2017
10:43:36
DataSource ds = new ClickHouseDataSource("jdbc:clickhouse://localhost:8123/default");
Connection dbConnection = ds.getConnection("default", "");
String insertTableSQL = "INSERT INTO Measure"
+ "(Id_Measure, value, date_metric, id_meter,user_id, resource) " + "VALUES"
+ "(?,?,?,?,?,?)";
PreparedStatement pstmt = dbConnection.prepareStatement(insertTableSQL);
Random random = new Random();
int currentBatch = 0;
int batchSize = 5000;
for (Integer i = 10; i < 100000; i++) {
pstmt.setObject(1, i.toString());
pstmt.setObject(2, random.nextDouble());
Integer i1 = random.nextInt(5) + 1;
pstmt.setObject(3, new Date(1994,12,12));
pstmt.setObject(4, i1.toString());
Integer i2 = random.nextInt(4) + 1;
pstmt.setObject(5, i2.toString());
pstmt.setObject(6, i2.toString());
currentBatch++;
if (currentBatch <= batchSize) {
pstmt.addBatch();
} else {
pstmt.executeBatch();
currentBatch = 0;
}
}
if (currentBatch != 0) {
pstmt.executeBatch();
}
dbConnection.close();
Я бы начал проверять по порядку:
0. По умолчанию в датасорсе стоит очень маленький таймаут на соединение (вроде 50 мс). Если проблема в нём (можно понять по внимательному изучению cause исключения), то лечится так:
ClickHouseProperties properties = new ClickHouseProperties();
properties.setConnectionTimeout(10 * 1000);
return new ClickHouseDataSource("jdbc:clickhouse://localhost:8123/default", properties);
1. Есть ли какие-то подробности в cause бросаемого исключения? На какой строчке происходит исключение? Какой его стэк трейс?
2. Есть ли таблица Measure в базе default
3. Совпадает ли схема таблицы по типа с тем, что мы в неё заливаем.
4. Ещё подозрительно использование setObject в вашем случае, когда вам известен тип вставляемых значений.


Ruslan
14.03.2017
10:45:06
Exception в pstmt.addBatch() возникает
Все работает, если не использовать batch, т.е. По одному инсерту
Setobject это я эксперементировал, так там типы явно указать можно конечно
Сейчас попробую, то что вы посоветовали

Andrey
14.03.2017
10:47:35

Ruslan
14.03.2017
10:48:16
java.sql.SQLFeatureNotSupportedException
Exception in thread "main" java.sql.SQLFeatureNotSupportedException
at ru.yandex.clickhouse.ClickHousePreparedStatementImpl.addBatch(ClickHousePreparedStatementImpl.java:260)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at ru.yandex.clickhouse.util.LogProxy.invoke(LogProxy.java:42)
at com.sun.proxy.$Proxy3.addBatch(Unknown Source)
at com.mycompany.javaapplication1.Test.main(Test.java:51)

Andrey
14.03.2017
10:51:40
java.sql.SQLFeatureNotSupportedException
Попробуйте его отловить в коде, встать на дебаге, и посмотреть e.getMessage() и e.getCause(). Вообще, стоит пройтись по стек трейсу до точки, где оно непосредственно выбрасывается. Код JDBC драйвера довольно простой у ClickHouse

Google

Andrey
14.03.2017
10:52:37
Сразу станет ясно, какая валидация не прошла при выполнении addBatch

Виктор
14.03.2017
11:03:14
Да просто не реализовано
Что там ловить

Ruslan
14.03.2017
11:05:47
Не реализовано пакетное выполнение запросов в jdbc clickhouse?

Виктор
14.03.2017
11:07:12
https://github.com/yandex/clickhouse-jdbc/blob/master/src/main/java/ru/yandex/clickhouse/ClickHousePreparedStatementImpl.java#L320
Вообще, реализовано
Возможно, старая версия?

Ruslan
14.03.2017
11:13:34
Вообще не старая, но изменил версию и заработало, спасибо)

Alexander
14.03.2017
12:52:05
Всем привет, подскажите, пожалуйста, как правильно записывать данные в кликхауз:
У меня есть таблица, которая хранит информацию пользователя о переходах по страницам сайта и дополнительные параметры
Должен ли я предварительно записывать данные в промежуточное хранилище, или сразу записывать данные в таблицу кликхауза с типом buffer?

Pavel
14.03.2017
12:58:40
Зависит от числа событий.
Чем больше вы можете сделать батч для вставки
Тем лучше

Alexander
14.03.2017
13:06:10
Т.е. если событий много, то лучше сразу одним батчем писать в кликхауз, а при небольшом количестве событий - использовать промежуточное хранилище?

Pavel
14.03.2017
13:09:51
не, смотрите
если у вас данные итак уже где-то имеются, а не поступают равномерном поштучно, условно
то просто собирайте их по 100-1000 штук и вставляйте в CH
буфер таблица в этом случае совершено не нужна
буфер удобна, когда у вас данные поступают непредсказуемо и нет возможности их собирать в батчи предварительно.
но буфер таблица - тоже своеобразная штука, CH не особо быстр, если в него вваливать сотни тысяч/миллионы записей в секунду в эту таблциу

Alexander
14.03.2017
13:14:04
Спасибо большое, вы очень помогли! :)

Google

Vladimir
14.03.2017
13:15:25
Добрый день! А какой алгоритм сжатия использует КХ для хранения таблиц на диске (*MergeTree) и можно ли как-то настройками потюнить коэффициент сжатия? В доке не нашел ничего по этому поводу, только размер блока несжатых данных (по-умолчанию, 1MiB)

Vitaliy
14.03.2017
13:23:30

Vladimir
14.03.2017
13:25:22
Спасибо большое! А compression rate можно настраивать?

Pavel
14.03.2017
13:25:57
а есть сравнения эффективности?

Vladimir
14.03.2017
13:26:07
Вот да
https://fastcompression.blogspot.ru/2015/01/zstd-stronger-compression-algorithm.html Пока нашел вот, zstd рвет по скорости (компрессии)
Но в остальном сомнительно, что он круче lz4

Pavel
14.03.2017
13:29:00
я боюсь это шибко зависит от проца
рантайм диспатчинг оптимизированной версии и выбор варианта сжатия при запуске - был бы моей мечтой
если тянет zstd и не проваливается по скорости - вперед с песней :)

Vladimir
14.03.2017
13:35:22
Но у zstd, как я понял, скорость декомпрессии раза в 3 ниже, чем lz4
А это скажется на скорости запросов

Alexander
14.03.2017
14:33:00
При одинаковом compression ratio zstd лучше, чем lz4 по всем параметрам. Но обычно им все же пытаются пожать получше, и тогда выигрыш или неочевиден, или его нет. Какие настройки в ClickHouse -- это вопрос к Яндексу, но думаю, что там нет особого проигрыша
Кстати, было бы неплохо поддержать еще и brotli -- колонки со строками и всяким json должен жать значительно лучше и быстрее (правда, скорее всего только английскими)

Shine
14.03.2017
14:56:52
бротли Алексей вроде на митапе предлагал
подняло руки за него примерно 0 человек )

Vladimir
14.03.2017
14:57:46
Я что-то нигде не нашёл, где zstd обыгрывает lz4 при схожем compression ratio по скорости
Скорее, выходит наоборот
Кажется, что наоборот. Судя по этой статье, с учётом времени на передачу, zstd выгоднее при данных размером примерно до 32 MiB, а выше — уже lz4 https://fastcompression.blogspot.ru/2015/01/zstd-stronger-compression-algorithm.html
По скорости компресии и декомпресии выигрывает lz4, при том коэффициент сжатия почти не отличается (2.7-2.8)

Google

Alexander
14.03.2017
15:01:56
Статья древняя. Померяйте -- увидите. За бротли никто не поднял, видимо, потому что о нем мало знают

Vladimir
14.03.2017
15:05:24
Возможно. Кстати, сам фейсбук показывает, что lz4 по скорости раза в 3 быстрее zstd, правда там и ratio чуть хуже получается https://github.com/facebook/zstd
Правда, там же пишут, что можно играться с настройками и повышать скорость zstd за счет ratio

Alexey
14.03.2017
16:06:14
zstd у нас используется с level = 1

Vladimir
14.03.2017
17:08:56
А lz4?

Alexey
14.03.2017
17:10:00
Там нет привычных уровней. Есть lz4 и lz4hc. Плюс некоторые уровни для ускорения сжатия. Мы используем обычный lz4.

Andrey
14.03.2017
17:14:33
@milovidov_an скажи, а не расследовали причины "bad size of marks file"? Просто последнее время часто что-то в чатах начала всплывать такая ошибка у людей

Alexey
14.03.2017
17:16:31
Мы ещё не нашли причину. Есть два сообщения, но пока непонятны условия, при которых это проявляется. В одном случае подозрение на ALTER Enum в Nested. В другом - не так (обычный String столбец). Сами с таким не сталкивались.

Vladimir
14.03.2017
17:21:58

f1yegor
14.03.2017
20:23:09
сейчас еще подумаю как нормально докер-файл написать чтобы из ENV брать эту настройку

Andrei [LaFut]
14.03.2017
21:46:03
В каком нить пхп getenv() в других языках тоже аналоги думаю есть

Иван
14.03.2017
23:35:32
Пытался воспользоваться настройками input_format_allow_errors_num и input_format_allow_errors_ratio, чтобы пропускать при вставке битые строчки. Прописал в файле users.xml в блоке default эти параметры со значениями 1 и 0.1 соответственно. При запуске сервера настройки подхватились, но при выполнении внешнего запроса на вставку из файла CH все равно ругается на неправильную строчку. Что не так делаю, подскажите пожалуйста?

Alexey
14.03.2017
23:37:52
Отправляете с помощью clickhouse-client или по HTTP?
Если первое - надо указать эти настройки параметрами командной строки для клиента.
PS. Вы прописали, что максимально можно пропустить одну строку с ошибкой или 0.1 долю от ранее прочитанных строк.

Иван
14.03.2017
23:41:25

Andrew
15.03.2017
06:39:03