
Igor
19.12.2016
11:14:00
с некоторых пор есть (не в стабильной версии), но такие себе
там какая-то проблема в jdbc-драйвере вроде была с этим связанная. клиент пихает нуллы, а драйвер пытается их же и пробросить

Alexander
19.12.2016
11:15:14
ок

Alexey
19.12.2016
12:18:10

Alexander
19.12.2016
12:43:34
а ну тогда все проще)

Google

Alexander
19.12.2016
12:43:37
спасибо
и париться не буду

nikoinlove
19.12.2016
13:38:17
а чем вы мониторите кликхаус?

Maxim
19.12.2016
13:56:56
Всем привет! У нас на одном из серверов в логах ошибка:
DistributedSessions.Distributed.DirectoryMonitor: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof, e.what() = DB::Exception, Stack trace:
0. clickhouse-server(StackTrace::StackTrace()+0xe) [0xfd8d0e]
1. clickhouse-server(DB::Exception::Exception(std::string const&, int)+0x1e) [0xf9c69e]
2. clickhouse-server(DB::throwReadAfterEOF()+0x3a) [0xf9c86a]
3. clickhouse-server(DB::StorageDistributed::DirectoryMonitor::processFile(std::string const&)+0x7c9) [0x23f4759]
4. clickhouse-server(DB::StorageDistributed::DirectoryMonitor::run()+0x15d) [0x23f501d]
5. clickhouse-server(execute_native_thread_routine+0x20) [0x32a3300]
6. /lib/x86_64-linux-gnu/libpthread.so.0(+0x8184) [0x7ff7579c6184]
7. /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7ff756fe137d]
На остальных все норм. Как нам побороть эту ошибку?

Alexey
19.12.2016
13:58:01
Заканчивалось место на диске?

nikoinlove
19.12.2016
14:03:56

Alexey
19.12.2016
14:04:34
Для Жаглера спроси у наших, например, у velom@.

Maxim
19.12.2016
14:05:14
Alexey Как определить обрезанный файл?

Alexey
19.12.2016
14:05:46
Это первый по номеру. Все файлы отправляются по порядку.

Google

Vladimir
19.12.2016
14:12:50
А не подскажете, насколько много данных за раз можно слать POST-запросом по HTTP API ClickHouse?

Vladimir
19.12.2016
14:16:12

r
19.12.2016
14:33:08
Раздел руководства "Производительность при вставке данных."
» Данные рекомендуется вставлять пачками не менее 1000 строк или не более одного запроса в секунду.
Подскажите, эти рекомендации относятся к таблице или целиком ко всему инстанцу clh?

Stepan
19.12.2016
14:38:35
Такой вопрос: хочется и чтобы данные реплицировались, и чтобы при вставке одинаковых строк данные не дублировались и оставался один экземпляр. Нет ли какого-нибудь незадокументированного ReplicatedReplacingMergeTree-движка?) И можно ли такого как-нибудь достичь в принципе?

Igor
19.12.2016
14:40:01
ахахах

Stepan
19.12.2016
14:42:46
Рили лол))
Сейчас посмотрю, работает ли :D

Igor
19.12.2016
14:42:51
вообще этого можно достичь еще с помощью временной (промежуточной) таблицы. сначала залить туда данные, потом сделать INSERT INTO table SELECT * FROM temp_table WHERE id NOT IN (SELECT id FROM table)
это будет работать, но если в один момент гарантированно не начнутся из двух мест литься данные
(хотя, в таком случае можно создавать таблицы с рандомными именами)

Stepan
19.12.2016
14:47:54
Работает корректно)
Вот ребята скромные, делают всякие крутости, но не рассказывают об этом на каждом углу)
Следующий вопрос: насколько это стабильно и как скажется на производительности?

Igor
19.12.2016
14:50:34
replcaingmergetree не документирован, насколько я помню, как раз потому что не очень оптимизирован
надо с FINAL делать селекты, а так они становятся в разы медленнее
https://groups.google.com/forum/#!searchin/clickhouse/update|sort:relevance/clickhouse/jYwoyPblsk8/KSE7S8tvAQAJ

Stepan
19.12.2016
14:53:24

Igor
19.12.2016
14:54:57
хм, я могу ошибаться, извините
там данные схлопываются при мерже, а он может происходить не сразу

Andrey
19.12.2016
14:55:34
Да, по-моему так
final просит доделать все мерджи

Stepan
19.12.2016
14:57:18
Спасибо!
Мержи происходят по крону на постоянной основе, поэтому в случае, если вставка нерегулярная, нельзя просто подождать и затем делать обычные запросы, да?

Google

Igor
19.12.2016
14:58:33
эээ
> мержи происходят по крону
вы отдельно из крона дергаете optimize table что ли?
"мержи", которые имеются в виду - это внутренний процесс склейки файлов-блоков

Stepan
19.12.2016
14:59:00
Не не, в принципе же так устроено, нет?
Да, я про них и говорю
Если они происходят только при вставке, а потом никаких склеек нет, то вариант с "подождать" в принципе должен работать нормально

Vladimir
19.12.2016
15:03:12
А этот ReplacingMergeTree не мержится автоматически? Только по FINAL или OPTIMIZE?

Igor
19.12.2016
15:04:05
автоматически мерджится, но по-моему таки не обязательно сразу после вставки

Vladimir
19.12.2016
15:04:41
А разве нельзя, как и с CollapsingMergeTree _сразу_ после вставки делать запросы, используя sign?
Просто не очень понятно, в чём Replacing хуже Collapsing в итоге
Или collapsing всегда мержится перед запросом?
Просто Replacing было бы очень соблазнительно использовать, если я правильно понимаю как он работает. Поскольку для Collapsing желательно использовать отдельный внешний KV storage, а в Replacing получается, что старые строки просто заменяются на новые

Igor
19.12.2016
15:12:23
не заменяются, добавляются новые. просто там либо столбец версии добавляется (аналогично sign в collapsing merge tree), либо берется последняя строка с таким же PK
ну в смысле заменяются, но после мерджа! (так же, как коллапсинг)

Alexander
19.12.2016
15:13:20
Кстати, а при any inner join выбирается последняя версия или произвольная?

Alexey
19.12.2016
15:29:11

Vitaliy
19.12.2016
15:31:32
мне от интересно, возможно ли быстро слить с influxdb в CH данные за год метрик несколько десяток машин (данных там на ~20гб).....

Alexey
19.12.2016
15:31:43

Stepan
19.12.2016
15:33:02
Нет, потому что слияния разных кусков делаются с разной частотой. Так, мелкие куски сливаются вместе часто, большие редко (до времён порядка месяца). Очень большие куски (по-умолчанию, 100 GB) вообще не сливаются. Строки с одним ключом могут оказаться в двух больших кусках.
Блин, жалко, ненадежный вариант, конечно, да... Алексей, я так понимаю, никаких производительных путей обхода кроме варианта, предложенного Игорем, с временной таблицей нет?

Igor
19.12.2016
15:34:47

Vitaliy
19.12.2016
15:35:46

Google

Alexey
19.12.2016
15:38:46

Igor
19.12.2016
15:40:12
ну кстати я избежал full scan'а (если я правильно понял), делая
SELECT min(timestamp), max(timestamp) FROM temp_table
а потом делая
INSERT INTO table SELECT .. FROM temp_table WHERE id NOT IN (SELECT id FROM table WHERE date BETWEEN toDate(<min_timestamp>) AND toDate(<max_timestamp>))
т.е. он не берет id по всей таблице, ибо там за месяцы-года может реально дофига данных накопиться, что в 10 гб не уместится
а по конкретным дате-времени

Stepan
19.12.2016
15:41:51

Igor
19.12.2016
15:41:54
канеш, это не отменяет того, что могут затесаться одинаковые id в случае с разными датами

Stepan
19.12.2016
15:42:30
Таблица большая, 60 млрд. и каждую неделю выгружается по 150-160 млн.

Igor
19.12.2016
15:43:40
а выгружаются по порядку, хронологически?
может прокатить фильтр по дате
и timestamp'у, если он в индексе прям за датой стоит, или близко к ней (но опять же, могу ошибаться)

r
19.12.2016
15:45:00

Igor
19.12.2016
15:45:16
но да, признаю, объемы у меня небольшие, где-то 5-10кк строк в сутки

Alexey
19.12.2016
15:52:44

Alexander
19.12.2016
15:54:26
Мои 5 коп. Если данные грузятся пакетами, а обычно так и бывает, то назначайте идентификатор пакета и проверяйте, что он уже загружен (не id отдельной записи, а id всего пакета). Накладные расходы невелики. Дополнительно можно ограничить по дате. Это подходит для больших таблиц (условно -- фактов). Для небольших, проверка уникальности id недорога, и можно на всякий случай делать иногда optimize, если загрузка может происходить с разных серверов.

Stepan
19.12.2016
15:55:26
После нескольких быстрых мержей, дублей уже будет мало.
Отлично, т.е. при фильтровать я планирую это дело все равно DISTINCT-ом для полного устранения дублей (если из-за этого не будет сильно просидать производительность), а это будет чисто в качестве очистки места.
Алексей, а репликация будет происходит корректно? Я так понимаю, будет все равно некоторое расхождение
Посмотрю, как это отразится на времени выгрузки на нормальных объемах

Alexey
19.12.2016
15:57:43

Stepan
19.12.2016
16:00:05
Что-то меня переклинило, решил, что на оригинале и реплике слияния будут происходить независимо..
Ок, всем спасибо!

Alexey
19.12.2016
16:00:40
Слияния координируются и происходят одинаковым образом. Данные на репликах будут одинаковы побайтово.

Vitaliy
19.12.2016
16:15:04
планирую писать в кластер CH около 20к значений в секунду на 6 серверах (3 шарда 2 реплики в 2 датацентрах)
собственно вопрос - потянет ли http интерфейс такую нагрузку, если писатся будет пачками раз в секунду(константа) на всех нодах?
и потянет ли рост нагрузки в 10х?

Google

Vladimir
19.12.2016
16:22:45

Vladislav
20.12.2016
10:06:13
https://habrahabr.ru/company/smi2/blog/317682/

Igor
20.12.2016
10:07:26
Кстати, с сегодняшнего дня по пятое января в clickhouse-client будет пасхалка :3

Vladislav
20.12.2016
10:09:21
будет не верно считать? чтобы народ отдыхал в НГ? ?

Igor
20.12.2016
10:09:56
тоже хотел пошутить, что она грохнет все ваши продакшн серваки, но я не настолько злой! (как и команда разработчиков)

Igor
20.12.2016
10:12:56

Vladislav
20.12.2016
10:14:19
я пока не готов отвечать, т.к. под мои критерии кликхаус пока не подходит, но я очень надеюсь, что когда-нибудь я смогу им пользоваться в полной мере

Виктор
20.12.2016
10:31:19
Игорь, спасибо за статью!
Не читал, но одобряю :)
Ещё не читал, позже

Alexander
20.12.2016
10:38:49
Игорь, статья хорошая и полезная, хотя тема не полностью раскрыта. В частности, по нашему опыту репликация между датацентрами требует более аккуратного подхода, особенно если пинг между датацентрами не очень хороший. Насчет PHP ничего сказать не могу кроме того, что удивляюсь его долгожительству )
Вообще, я бы эту статью разбил на две, но это уже поздно, наверное. Первая -- про масштабирование и конфигурация, а вторая -- про PHP утилиты

Алексей
20.12.2016
10:44:17
РНР большими буквами вроде как Ремотно Наладочные Работы ?

Igor
20.12.2016
10:49:45

Alexander
20.12.2016
10:57:10
Да я без наезда, полно сайтов на PHP и людей, которые им пользуются, поэтому утилиты, наверняка, полезные.

Igor
20.12.2016
10:57:58