
Anton
09.01.2017
19:31:09
Нельзя приоритизировать потоки запросов, утилизируя полосу по полной
Не эффективная упаковка данных
Отсутсвие строгой типизации в запросах --> ошибки приведения типов

Виктор
09.01.2017
19:34:52
Прогресс - аргумент.
С потоками аргумент не понял. Оверхед есть, это правда.
Упаковка данных непонятно где страдает, в теле передаются бинарные данные.
Строгая типизация в запросах очевидно есть, это не зависит от протокола.

Google

Igor
09.01.2017
19:36:19
насчет типизации - может имеется в виду отправка данных например в формате json? там нельзя заюзать функции в значениях (toUInt64() какой-нибудь), но оно и не надо в таком случае, КХ сам приводит к нужному формату

Виктор
09.01.2017
19:37:05
json как-то не очень противоречит http.

Igor
09.01.2017
19:38:09
справедливо, извините)

Anton
09.01.2017
19:43:14
1)про потоки:
Я не могу получать результат запроса частями (например, по 100 кортежей) и отдавать их клиенту не вычитав остальные триллионы записей?
Я не могу сделать так, чтобы в рамках одного tcp-соединения мультиплексировались запросы разных клиентов?
2) Про бинарные данные - не понял. С каких пор HTTP 1.1 стал бинарным?
3) строгая типизация есть у парсера запросов, но не у аргументов http-запроса

Igor
09.01.2017
19:44:28
а у clickhouse-client разве строгая типизация есть?
> 2) Про бинарные данные - не понял. С каких пор HTTP 1.1 стал бинарным?
тело ответа запросто может быть бинарным, если например http_compression=1 прокинуть

Anton
09.01.2017
19:44:35
А СН валидирует JSON?

Igor
09.01.2017
19:44:58
канеш, и отказывается принимать запрос целиком если находит ошибку хоть где-то

Anton
09.01.2017
19:46:18
@iamigor компрессия в транспорте != бинарный протокол.

Fike
09.01.2017
19:47:27
Раз уж зашел разговор про это все: если документация не врет и неверный запрос отдает 500, было бы очень круто поправить его на 400. Ну и на случай мажорных обновлений заверсионировать апишку (добавить /v1)

Anton
09.01.2017
19:47:56
Вот, смотрю доку и в упор не вижу json-формата запросов. Ткните пожалуйста на пример.

Igor
09.01.2017
19:48:04
JSONEachRow
если речь про данные для INSERT'а.
https://clickhouse.yandex/reference_ru.html#JSONEachRow
SELECTы можно делать более громоздкими JSON и JSONCompact

Google

Anton
09.01.2017
19:48:49
Это про результат, а я про запрос

Igor
09.01.2017
19:49:08
по-моему, хочется странного :)
что такого ужасного в query string или теле обычного POST-запроса?

Alexey
09.01.2017
19:49:29
JSON запрос - это {"query": "SELECT 1"} или что-то другое?

Anton
09.01.2017
19:52:20

Igor
09.01.2017
19:53:53
так строгая типизация на уровне схемы таблицы же
и это тоже никак не связано с http

Anton
09.01.2017
19:56:36

Igor
09.01.2017
19:56:53
если попытаться insertнуть в таблицу с полем string String JSON формата {"string": 123}, то сервер отдаст ошибку и потребует обернуть 123 в кавычки

Anton
09.01.2017
19:58:21
Ну т.е сначала нужно закачать весь json на сервер, а потом получить отлуп?
А если он большой?
Правильно - сломаться на клиенте.

Igor
09.01.2017
19:58:34
так если речь о запросе, это же зачастую что-то не очень громоздкое, ну 16 КБ текста.
а, я понял

Anton
09.01.2017
20:01:07
Речь о запросе.
(Запросы бывают батчевые и их бывает много)
Ответ - тема отдельного разговора.(там свои приколы с приведением типов обратно в разных ЯП)

Виктор
09.01.2017
20:03:53
1) про потоки: можно получать результат запроса частями. Мы так делаем. Да, поверх http. В рамках одного соединения запросы разных клиентов: нет, и дело не в протоколе.
2) HTTP позволяет передавать в теле любые данные, не вижу тут никакой проблемы. Картинки же как-то передаются по HTTP, правда ведь?
3) строгая типизация есть у парсера запросов, именно так. Если отослать неправильный запрос, не важно, насколько он неправильный. Вы отсылаете много неправильных запросов или что?
В-общем, непонятно.
У нас много запросов и они батчевые
И у нас нет проблем с HTTP
Запрос это в любом случае строка, это SQL
Какая разница как её передавать


Anton
09.01.2017
20:16:37
1)дело не в логическом соединении с БД(там понятно, что дело не в http), а в транспорте.
Я переживаю за сокеты и мне кажется не оптимальным держать большое количество открытых соединений. (Можно написать мультиплексирующий прокси, а можно все убрать в клиента)
2)Бинарные данные по http передаются крайне не оптимальным способом.
Все рано, я не очень понял, как в СН хотят бинарные запросы по http. Ткните в пример, пожалуйста.

Google

Виктор
09.01.2017
20:19:20
json в протобуф: причём тут кликхаус?

Alexey
09.01.2017
20:19:43
Смысл понятен. В конце концов, ClickHouse сам использует бинарный протокол без HTTP для межсерверного взаимодействия и не зря. Наружу доступен простой HTTP интерфейс, который подходит для большинства случаев. Хотя в некоторых случаях он, без сомнения, не оптимален.

Anton
09.01.2017
20:22:40

Виктор
09.01.2017
20:23:34
Ну так не запрашивайте json

Anton
09.01.2017
20:23:44

Igor
09.01.2017
20:25:49
так она открыта, исходники есть же
в формате RowBinary в документации тоже немного написано
а передавать бинарные данные можно, например, так:
❯ echo -ne '\xff\x00\x00\x00\x06foobar' | curl "http://127.0.0.1:8123/?query=INSERT+INTO+test+FORMAT+RowBinary" -i --
в случае, когда таблица имеет структуру CREATE TABLE test (number UInt32, string String) ENGINE = Memory;
на выходе будет number == 255 и string == 'foobar'
но по-моему проще TSV, CSV и прочие JSONы :)

Alexey
09.01.2017
20:30:34

Igor
09.01.2017
20:30:39
кстати, а enable_http_compression=1 работает для данных в INSERT-запросах?
ну, т.е., можно передавать сжатые gzip/defalte данные?

Alexey
09.01.2017
20:31:07
Да. Можно отправлять сжатые данные с заголовком Content-Encoding.

Igor
09.01.2017
20:31:18
ага, спасибо!

Anton
09.01.2017
20:31:21
Ну вот RowBinary возможно и хватит.
Дело не в том, чтобы открыть, а в том чтобы можно быто быть уверенным что API этого протокола не поменяется без изменения мажорной версии, а минорные версии останутся бексовместимыми.
Остальное итак можно взять из исходников.

Igor
09.01.2017
20:32:50
так это.. а ничего, что формат TabSeparated/CSV в моем примере получается компактнее, чем RowBInary? :D
❯ echo -ne '\xff\x00\x00\x00\x06foobar' | wc -c
11
❯ echo -ne '255,foobar' | wc -c
10
это в случае двух полей - UInt32 и String
мне кажется, экономия на спичках может получиться, но я ненастоящий сварщик, заранее извините

Anton
09.01.2017
20:32:54

Alexey
09.01.2017
20:34:58
Сейчас у нас совместимость между версиями в окне времени где-то около пары лет. При апгрейде на новую версию совместимость есть всегда. То есть, мы не выпускаем несовместимые мажорные версии.

Anton
09.01.2017
20:36:42
Ок, тогда покопаем исходники нативного протокола.

f1yegor
09.01.2017
20:39:43
какие-то вы сложные штуки про http и binary говорите. http самый понятный интерфейс, под него сейчас проще всего клиентов на разных языках написать.

Google

f1yegor
09.01.2017
20:40:03
мы вот свой скоро заопенсорсим на scala
опять же, если много надо засылать - проще сжимать данные

Igor
09.01.2017
20:41:26

Alexey
09.01.2017
20:46:45

f1yegor
09.01.2017
20:48:55
я попытался на прошлой неделе использовать CH в качестве бекэнда для другого open-source проекта, который на java. interop scala-java конечно есть, но код на java выглядит страшненьким.

Alexey
09.01.2017
20:51:11
А для Scala разве неудобно пользоваться готовым JDBC драйвером?

f1yegor
09.01.2017
20:51:42
ну решили повелосипедить)
jdbc драйвер я использую в zeppeline, так что тоже хорошо
а внутри jdbc вроде же тот же http клиент с json?

Alexey
09.01.2017
20:57:10
Да. Правда я не помню, там JSONCompact или TSV. Для INSERT вроде бы TSV.

f1yegor
09.01.2017
20:59:09
ага, query += "&query=" + sql + " FORMAT TabSeparated";

Боб
10.01.2017
04:18:46
про неудобство http - мне лично неудобно отсутствие сессий и как следствие - невозможность использования временных таблиц (с их прибиванием со стороны сервера).

Igor
10.01.2017
04:22:56
а Memory или Buffer не подходят?

Боб
10.01.2017
04:25:36
нет, не подходят - они не прибиваются на стороне сервера (т.е. если клиент случайно забыл удалить - память на сервере сожралась навечно).
ну или отдельные процессы-чистильщики нужны, которые раз в минуту будут проходить и прибивать ненужные таблицы.
там тоже проблема с таймаутами - если поставить прибивать таблицы старше 2-3 минут они могут прибиться ее в процессе запроса. Если несколько часов - много памяти занимать.
Кроме того нужно создавать уникальные имена таблиц для каждого процесса. В целом это не сложно, но вместо "CREATE TEMPORARY TABLE tmp ..." нужно писать что-то вроде CREATE TABLE tmp_" + tmpSuffix + " ...". И писать и читать это не очень удобно.
еще как обходной путь - можно попробовать писать дофига подзапросов и всё через них делать, но снова читабельность будет страдать.

Igor
10.01.2017
05:31:40

Google

Боб
10.01.2017
05:40:58
да понятно что через приложение и что можно сделать. Но это всё равно нужно помнить, всё равно имена таблиц генерировать и т.п. с временными было бы гораздо удобнее.

Igor
10.01.2017
05:41:24
окок, извините :(

Боб
10.01.2017
05:42:02
Ну и утечка временных таблиц всё равно будет: таблицу создал, потом забыл удалить, ушел спать. Фигак ночью на сервере память закончилась и всё встало.
потому что память конфилось или место

Виктор
10.01.2017
06:55:54
А сессии как помогут? Они же рваться рандомно могут

Igor
10.01.2017
07:11:52
ни у кого случайно нет хотя бы приблизительного чейнджлога сервера с 1.1.54083 по 1.1.54127 (стабильные)?

Боб
10.01.2017
08:02:33
Игорь, можно по коммитам посмотреть:
https://github.com/yandex/ClickHouse/compare/v1.1.54083-testing...v1.1.54127-stable
там пишут что изменений много, только 250 коммитов показано.
Но можно или локальным клиентом по истории или инкрементально посмотреть.

Igor
10.01.2017
08:03:58
да по коммитам я и сам могу, и посмотрел уже бегло :)

Боб
10.01.2017
08:04:09
Виктор. А сессия это хорошо, потому что соединение установил, таблиц временных понасоздавал для текущих запросов. Потом соединение закрыл, а временные таблицы сами грохнулись.
+ если в двух разных сессиях сделать CREATE TEMPORARY tmp ..., то это будут две разные таблицы tmp, т.е. не надо дополнительных генераторов для имени таблицы придумывать.

Igor
10.01.2017
08:04:57
может имеет смысл хоть wiki включить на гитхабе?
можно будет community-driven changelog сделать :)

Боб
10.01.2017
08:07:21
Мне кажется больше имеет смысла changelog.txt или changelog.md, т.е. файлом.
Сообществом может поддерживаться в виде пул-реквестов и в интерфейсе сразу видно и список изменений сразу правильный внутри версии и вспоминать что там вики есть не надо - изменения сразу в списке файлов видны.

Igor
10.01.2017
08:07:54
fair enough

f1yegor
10.01.2017
11:12:50
у меня вопрос по WITH TOTALS: https://clickhouse.yandex/reference_en.html#WITH TOTALS modifier здесь сказано что аггрегаты будут вычислены для всех строчек
можно ли сделать WITH TOTALS когда у меня есть 2 group by , и мне нужны totals после первого group by?
т.е. TOTALS внутри групп, как у olap-cubes?

Alexey
10.01.2017
11:19:46
всем привет! а в кликхаусе же можно в несколько реплик писать? оно потом разъедется?

f1yegor
10.01.2017
11:20:51
писать можно. отреплицируется достаточно быстро(для нас секунды)

Alexey
10.01.2017
11:21:29
@f1yegor круто, спасибо!

Виктор
10.01.2017
11:49:10
Totals внутри первого group by получить не получится

f1yegor
10.01.2017
11:54:23
а внутри произвольного?