
Vladislav
26.03.2017
14:24:40
Добрый день, не подскажете — в Clickhouse xor поддерживается? Вроде указан в руководстве, но база не принимает запросы с ним через jdbc и указывает, что не распознала оператор

Igor
26.03.2017
14:37:11
если через jdbc не абонент, попробуйте через функцию просто вызывать
bitXor(x, y)
ну или xor(x, y), потому что оператора для xor судя по докам действительно нет %)

Google

Vladislav
26.03.2017
14:39:34
Да, действительно проблема в том, что оператора нет :)
Спасибо

nikoinlove
26.03.2017
15:39:13
https://habrahabr.ru/post/324846/
тут какой-то тип собрал бинарную сборку кх под макос
надеюсь это никому не нужно, но все же%)

Igor
26.03.2017
15:43:49
другой тип написал пакет для хомбрю, тоже никому не нужный %)
https://github.com/hatarist/homebrew-clickhouse/, если что. только мне безумно лень автоматизировать проверку сборки, а в основной репозиторий меня не пускают из-за говнокода

Alexey
27.03.2017
06:10:35
Есть тут жители Новосибирска?
Придёте на нашу встречу 3 апреля?
https://events.yandex.ru/events/meetings/3-april-2017/
Для сравнения, в Санкт-Петербурге пришло чуть больше 100 человек.
Любопытно, что будет в Новосибирске. Приглашайте друзей и знакомых. В свою очередь, обещаем устроить интересную встречу!
Кстати, на этот раз встреча без трансляции.

Konstantin
27.03.2017
06:11:30
@milovidov_an ждём подтверждения :)
@milovidov_an а есть вероятность, что не пришлют подтверждение? у меня товарищ зарегился позже и ему всё пришло уже, а мне пока ничего

Alexey
27.03.2017
08:20:28

Nataliya
27.03.2017
10:07:50

Vladislav
27.03.2017
13:40:15
заметил, что CASE с нуллами плохо работает:
SELECT caseWithoutExpr(screen_name = '', NULL, screen_name)
FROM apps_screens LIMIT 1
Received exception from server:
Code: 43. DB::Exception: Received from 88.99.66.175:9000. DB::Exception: Internal logic error.
а вот так нормально:
SELECT caseWithoutExpr(screen_name = '', 'empty', screen_name)
FROM apps_screens LIMIT 1
и даже так нормально:
SELECT caseWithoutExpr(screen_name = '', NULL, 1)
FROM apps_screens LIMIT 1
я так понимаю, что фейлится, когда после else идет строка

Роман
27.03.2017
14:10:59

Google

Alexey
27.03.2017
14:41:22
Напишите Наталье, она не даст пропасть :)

Vladislav
27.03.2017
14:55:18
можете подсказать, что за ошибка такая?
DB::Exception: Table is inconsistent accross shards.
переливаю данные из одного сервера в кластер. залил по месяцу в каждый шард, хочу запустить перешардирование, и получаю такую ошибку. есть nullable и materialized поля.

Dmitriy
27.03.2017
17:55:48
Добрый вечер всем. подскажите как можно избавляться от дублей, но так что бы не делать проверку на них в запросе.?
Вариант с переливанием через запросы, вариант крайне медленный, получается.

Igor
27.03.2017
17:56:44
ReplacingMergeTree?
только могут сразу не удаляться. спустя какое-то время.

Shine
27.03.2017
17:57:54
ага, там же процесс слияния ( а если нужно сразу без дублей, насколько понимаю - никак

Igor
27.03.2017
17:58:04
да, другой СУБД, видимо :)
ну, либо GROUP BY по тем полям, которые нужны дедуплицированными, и any() для всех остальных полей, но это тоже.. такое.. :)

Shine
27.03.2017
17:59:41
ну тоже норм вариант, чо )
на безрыбье как говорится

f1yegor
27.03.2017
18:00:42

Igor
27.03.2017
18:01:12
так он вроде ничем от collapsing в этом плане не отличается

Shine
27.03.2017
18:01:23
а вообще юник констринты были в планах ?
не в курсе ?
констрэинты

f1yegor
27.03.2017
18:03:51
Не замечал чтобы схлопывание работало, у нас на одной таблице дубли могут сутками быть

Shine
27.03.2017
18:06:14
Обратите внимание, что дедупликация данных производится лишь во время слияний. Слияние происходят в фоне, в неизвестный момент времени, на который вы не можете ориентироваться. Некоторая часть данных может так и остаться необработанной. Хотя вы можете вызвать внеочередное слияние с помощью запроса OPTIMIZE, на это не стоит рассчитывать, так как запрос OPTIMIZE приводит к чтению и записи большого объёма данных.
Таким образом, ReplacingMergeTree подходит для фоновой чистки дублирующихся данных в целях экономии места, но не даёт гарантий отсутствия дубликатов.

f1yegor
27.03.2017
18:09:14
Даже такого поведения я не наблюдаю
Должен я включить trace и посмотреть что происходит?

Vladislav
27.03.2017
18:10:31
это же мне вопрос? да, он. )

Google

Vladislav
27.03.2017
18:10:31
ReplacingMergeTree?

Igor
27.03.2017
18:11:03
увы и ах, это было предложение воспользоваться ReplacingMergeTree для дедупилкации
насчет шардинга не подскажу, сорри. может зукипер как-то косячит.

f1yegor
27.03.2017
18:12:17
Ок, поситаю исходники
Кто хочет помочь перевести комменты на англ? Я уже сделал 70%, но силы кончаются

Alexey
27.03.2017
18:20:03
заметил, что CASE с нуллами плохо работает:
SELECT caseWithoutExpr(screen_name = '', NULL, screen_name)
FROM apps_screens LIMIT 1
Received exception from server:
Code: 43. DB::Exception: Received from 88.99.66.175:9000. DB::Exception: Internal logic error.
а вот так нормально:
SELECT caseWithoutExpr(screen_name = '', 'empty', screen_name)
FROM apps_screens LIMIT 1
и даже так нормально:
SELECT caseWithoutExpr(screen_name = '', NULL, 1)
FROM apps_screens LIMIT 1
я так понимаю, что фейлится, когда после else идет строка
Да, эта функциональность недоделана.
Если переписать с использованием обычного if или цепочки if, то будет Ок.
В случае, если один из элементов NULL, можно использовать ifNull, nullIf, coalesce функции. Они были доведены до нормального состояния в последней версии сервера.


Vladislav
27.03.2017
18:21:08
Спасибо. На самом деле мне нужно было вытащить данные из одного сервера и залить в другой. Эту проблему обошел sed-ом.
Да, эта функциональность недоделана.
Если переписать с использованием обычного if или цепочки if, то будет Ок.
В случае, если один из элементов NULL, можно использовать ifNull, nullIf, coalesce функции. Они были доведены до нормального состояния в последней версии сервера.


Alexey
27.03.2017
18:26:22
а вообще юник констринты были в планах ?
Пока не было.
Сложность в том, что их нужно проверять либо сразу при INSERT-е, либо постоянно мержить данные при SELECT-е. Для того, чтобы проверять при INSERT-е, очень желательно держать соответствующий индекс в оперативке. Но типичный сценарий использования ClickHouse предполагает достаточно большой объём данных на одном сервере (по крайней мере десятки миллиардов записей), и реализация такого индекса становится проблематичной
(возможной, например, если держать в оперативке разреженный индекс и bloom фильтр, а другую часть индекса на SSD - мы используем такое в одной из структур данных в Яндекс.Метрике)
Мержить при SELECT-е тоже затруднительно. Это возможно либо с существенным уменьшением производительности SELECT-ов (см. SELECT FINAL), либо требует серьёзной разработки (трудно распараллеливать мерж при SELECT-е), хотя полностью реально.


Vladislav
27.03.2017
18:32:46
Алексей, а в таком случае правильно будет руками переносить, беря модуль от ключа шардирования?
INSERT-SELECT не работает из-за materialized поля в distributed-таблице.

Alexey
27.03.2017
18:36:40

Vladislav
27.03.2017
18:38:00
ок, понял. спасибо, буду завтра пробовать.

Dmitriy
27.03.2017
19:00:10
Можно ли рассчитывать, что когда будет сделано партиционирование до дней, скажем, то OPTIMIZE будет решать вопрос с дедупликацией быстрее\проще\с чтение и записью меньшего кол данных так как партиция один день а не месяц?
Я праильно понимаю что OPTIMIZE для ReplicatedMergeTree удалит дубликаты? или это я только хочу так

Alexey
27.03.2017
20:10:00


Aleksey
27.03.2017
22:00:05
Привет!
Подскажите, пожалуйста, что делать, если на одной из реплик отсутствует кусок (part), и как такое могло получиться?
В логах реплики, в которой куска нет, его имя не фигурирует.
В логах реплики, где кусок есть, упоминание только одно -
<Trace> dbName.tableName (Data): Renaming tmp_20161101_20161130_857_857_0.

Alexey
27.03.2017
22:06:37
Следует обратить внимание - является ли этот кусок активным. В таблице system.parts это поле active. Чтобы посмотреть только активные куски, напишите SELECT * FROM system.parts WHERE active.
Именно активные куски используются в запросах. Остальные куски - это те, которые остались после слияний и будут удалены через небольшое время.
При репликации, данные вставляются (и формируют новый кусок) на одну реплику, а остальные реплики скачивают этот кусок. Но если кусок уже успел помержиться с другими, то реплики будут скачивать уже более крупный - померженный кусок.

Aleksey
27.03.2017
22:27:56
Кусок активен

Google

Aleksey
27.03.2017
22:29:26
Собственно, копать начали потому, что количество записей в репликах разошлось

Alexey
27.03.2017
22:35:06
Посмотрите очередь репликации:
SELECT * FROM system.replication_queue

Aleksey
27.03.2017
22:44:06
пусто

Alexey
27.03.2017
22:46:04
У реплики есть некий эталонный набор кусков, который должен быть на диске. Этот эталонный набор хранится в ZK в /path/to/table/replicas/replica/parts.
Репликация устроена так, что без внешнего вмешательства, после выполнения очереди репликации, все реплики будут иметь один и тот же эталонный набор кусков.
Посмотрите, есть ли там нужный кусок. Совпадает ли набор кусков в ZK у разных реплик?

Aleksey
27.03.2017
22:59:55
Нет, наборы не совпадают - как и в system.parts, у одной реплики на один кусок меньше
(тот же самый кусок)

Alexey
27.03.2017
23:10:01
Если вы добавите туда этот кусок и перезапустите сервер, то он скачает его с реплики.
Как я говорил, без ручных вмешательств и без очереди репликации, набор кусков должен совпадать. У нас на практике случая расхождения реплик не было. Интересуют подробности по каким-нибудь необычным действиям... всякие ATTACH/DETACH/DROP PARTITION, не включали ли insert_quorum, не редактировали ли ZooKeeper, не было ли сбоев в ZK с восстановлением и т. п.
Также посмотрите path/to/table/log
и path/to/table/replicas/replica/log_pointer
- информация о том, докуда реплика скопировала свою очередь из общего лога.


Aleksey
27.03.2017
23:14:43
>Если вы добавите туда этот кусок и перезапустите сервер, то он скачает его с реплики.
Понял, так и сделаем.
> Интересуют подробности по каким-нибудь необычным действиям... всякие ATTACH/DETACH/DROP PARTITION, не включали ли insert_quorum, не редактировали ли ZooKeeper
Вот этого ничего не было.
>не было ли сбоев в ZK с восстановлением и т. п.
А вот у зукипера проблемы были, прилетали сообщения "no zookeeper", "keeper exception"

Alexey
27.03.2017
23:20:51
> А вот у зукипера проблемы были, прилетали сообщения "no zookeeper", "keeper exception"
Keeper Exception - это не проблемы, а временная потеря сессии с ZK, которая восстанавливается автоматически.

Aleksey
27.03.2017
23:30:07

Alexey
27.03.2017
23:32:29
Значит с этим всё как ожидается.

Aleksey
27.03.2017
23:33:44
А вот в /path/to/table/replicas/replica/queue есть один элемент, и в нём упоминается тот самый кусок

Alexey
27.03.2017
23:34:25
А в system.replication_queue при этом пусто?

Aleksey
27.03.2017
23:34:41
да

Alexey
27.03.2017
23:35:57
Это странно (надо посмотреть в коде, как может быть, что реплика не видит свою очередь). Если вы просто перезапустите сервер на этой реплике, то всё будет Ок.

Aleksey
27.03.2017
23:36:54
про перезапуск - хорошая новость
p.s. если что, у нас 1.1.54164


Dzmitry
28.03.2017
13:21:40
Привет
Подскажите, пожалуйста
Периодически разваливается реплика Кликхауса с таким вот сообщением в логе
2017.03.28 12:31:14.818651 [ 3297 ] <Error> HTTPHandler: Code: 999, e.displayText() = zkutil::KeeperException: connection loss, path: /clickhouse/tables/nz/1/zos2/temp/abandonable_lock-, e.what() = zkutil::KeeperException, Stack trace:
0. /usr/bin/clickhouse-server(StackTrace::StackTrace()+0x16) [0x1224296]
1. /usr/bin/clickhouse-server(DB::Exception::Exception(std::string const&, int)+0x1f) [0xf88dbf]
2. /usr/bin/clickhouse-server(zkutil::KeeperException::KeeperException(int, std::string const&)+0x6b) [0x12ea4bb]
3. /usr/bin/clickhouse-server(zkutil::ZooKeeper::tryCreate(std::string const&, std::string const&, int, std::string&)+0x52) [0x2ad5ac2]
4. /usr/bin/clickhouse-server(zkutil::ZooKeeper::create(std::string const&, std::string const&, int)+0x47) [0x2ad5b37]
При этом в логе Zookepeer вот такое
2017-03-28 12:21:29,689 [myid:3] - WARN [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@362] - Exception causing close of session 0x35b0f9728470000 due to java.io.IOException: Len err
or 1097666
2017-03-28 12:21:29,689 [myid:3] - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@1008] - Closed socket connection for client /10.244.2.162:33026 which had sessionid 0x35b0f9728
470000
Помогает только рестарт Зукипера и последующий рестарт Кликхауса
Может кто сталкивался с такой проблемой?


Pavel
28.03.2017
13:22:19
а у кого большой опыт с CH в Графане?

Google

Pavel
28.03.2017
13:22:32
я хочу GROUP BY собрать, но у меня поле это IPV4 как число
не получается на него применить IPv4NumToString:(

Roman
28.03.2017
13:29:01
а почему не получается?

Pavel
28.03.2017
13:29:26
IPv4NumToString почему-то применяется и на поле выборк и на count()
и вылетает с ошибкой "2 аргумента для IPv4NumToString слишком много"
мне фактичсеки надо select IPv4NumToString(my_field), count() group by my_field

Roman
28.03.2017
13:34:22
Вы уверены, что
SELECT
IPv4NumToString(IP) ip,
count(*)
from table
where $timeFilter
GROUP BY ip
не работает ?

Pavel
28.03.2017
13:36:49
оно работает, если вбить в графану руками SQL запрос
а через конструктор запроса - нет :(

Roman
28.03.2017
13:40:03
Хм, я был уверен, что никто не пользуется конструктором запроса и в обновлении совсем его удалил.

Pavel
28.03.2017
13:40:23
:'(
у нас просто много разных баз, tsdb, prometheus, influxdb и там везде по привычки тыкаешь конструктором, оно удобно

Slach
28.03.2017
13:41:47
Явно бага редактора а не clickhouse

Roman
28.03.2017
13:42:40
Это бага редактора, но в обновлении редактор был удален из плагина
вместо него форматирование запросов и хайлайт

Pavel
28.03.2017
13:47:35
он удобный был, мне понравился
в ручном редакторе не понятно как быть с интервалами хотя мб это и имеет смысл

Roman
28.03.2017
13:52:32
На практике, редактор запросов мало подходил при решении задач. Коллеги тоже пришли к этой же мысли. Поэтому вместо редактора просто улучшили поддержку SQL запросов и добавили форматирование

Pavel
28.03.2017
13:52:53
в целом я согласен