
Alexander
05.09.2017
14:44:25
А при программном переключении, если вдруг один сервер просто упал, также нет смысла?
лучше приобрести еще один сервер и работать с кластером из 3?

Nikolai
05.09.2017
14:45:41
3, разумеется, лучше :)

Alexander
05.09.2017
14:46:20
Понял, спасибо))

Google

Maksim
05.09.2017
15:49:37
подскажите пожалуйста, каким лучше способом пройтись по длинному списку сессий (есть started_at и closed_at) и получить скажем с получасовой точностью количество онлайн сессий?
сделать сначала список из интервалов времени и потом к ним приджойнить список сессий?
или есть что-то поумнее?

papa
05.09.2017
15:50:44
array join timeslots()

Maksim
05.09.2017
15:51:46
хорошо пользоваться тем, что делали люди, которым нужно то же самое

Vladimir
05.09.2017
15:53:37
Коллеги, добрый день. Я собираю данные из метрики в хайве и думаю о переходе на кликхаус. Сейчас простая операция select count(*) from занимает 17 минут (1 миллиард строк). Стоит ли ожидать сильного увеличения производительности?

Roman
05.09.2017
15:55:14
в 4 порядка)

papa
05.09.2017
15:55:30
SELECT count()
FROM hits_all
WHERE EventDate = today()
1 rows in set. Elapsed: 0.359 sec. Processed 11.17 billion rows, 22.34 GB (31.13 billion rows/s., 62.26 GB/s.)

Oleh
05.09.2017
15:56:51
SELECT count()
FROM daily_statistics
┌────count()─┐
│ 4237627779 │
└────────────┘
1 rows in set. Elapsed: 6.660 sec. Processed 4.24 billion rows, 8.48 GB (636.28 million rows/s., 1.27 GB/s.)
это на hdd

Maksim
05.09.2017
16:04:17
вот у меня есть sessions: (id, created_at, closed_at)
select uniq(id) as count, timeSlots(somedate,7200) as period from sessions array join period where created_at < period and deleted_at > period

Google

Maksim
05.09.2017
16:05:33
мне показалось, что нужен такой запрос, но он невалидный

Vladimir
05.09.2017
16:09:35
@orantius @OlehBahinskyi Спасибо!
@OlehBahinskyi а сколько оперативки у вас?

Oleh
05.09.2017
16:14:04
@vladimirmyuge 32, но занято меньше 2х

Vladimir
05.09.2017
16:16:17
Я в какой-то параллельной реальности... можете посоветовать облако, где наиболее просто развернуть это добро, залить гигов 200 и покрутить? навыков линукса у меня почти 0

Oleh
05.09.2017
16:18:30
можешь у себя в докере покрутить на локальной машине

papa
05.09.2017
16:31:19
вот у меня есть sessions: (id, created_at, closed_at)
я имел в виду что-то такое
SELECT
ts,
count()
FROM
(
SELECT
number AS id,
toDateTime('2017-09-05 01:02:03') + (id * 1000) AS begin,
toDateTime('2017-09-05 01:02:03') + (id * 2000) AS end
FROM system.numbers
LIMIT 10
)
ARRAY JOIN timeSlots(begin, toUInt32(end - begin)) AS ts
GROUP BY ts
ORDER BY ts ASC хотя возможно это не совсем то что нужно.
через range + arrayMap можно написать то же самое, эта функция была до появления range()

Maksim
05.09.2017
16:53:37
Насколько я понимаю, надо нагенерить точек раз в полчаса и к ним приджойнить весь список сессий. Верно?

Konstantin
05.09.2017
17:53:02
привет! подскажите, как к словарю complex_key_hashed обратится по 2 ключам одновременно?

Nikolai
05.09.2017
17:55:09
в качестве ключа надо использовать tuple. в словаре 1 ключ, но составной

Konstantin
05.09.2017
17:56:21
понял, сейчас поискал еще в русском мануале - там понятнее написано
When using such dictionary, use a Tuple of field values as a key in dictGet* functions. Example: dictGetString('dict_name', 'attr_name', tuple('field1_value', 123)).
При запросе в функции dictGet* в качестве ключа передаётся кортеж. Пример: dictGetString('dict_name', 'attr_name', tuple('string for field1', num_for_field2)).

Nikolai
05.09.2017
17:56:54
например:
select dictGetString('dict', 'attr', (1, 'abcd'))

Konstantin
05.09.2017
17:57:39
и соотвтетсвенно можно также ссылаться внутри словаря на словарь, так?

Nikolai
05.09.2017
18:02:25
первые 2 аргумента у dictGetT должны быть константными строками. так что не получится, если я правильно понял

Konstantin
05.09.2017
18:07:18
я про кортеж, можно вот так сделать:
select dictGetString('dict', 'attr', tuple(dictGetString('dict2','attr, value), 'abcd')) ?

Nikolai
05.09.2017
18:09:48
да, так должно работать

Konstantin
05.09.2017
18:12:24
DB::Exception: Key type at position 1 does not match, expected UInt64, found UInt8.
такая вот ошибка появляется, хотя у меня ни в одном словаре нет UInt8 =|

Google

Oleh
05.09.2017
18:13:32
сделай toUInt64

papa
05.09.2017
18:13:34
1 имеет тип uint8

Konstantin
05.09.2017
18:27:28
toUint64 помог, я его и раньше пробовал но не на тот ключ, оказалось что обычное число тоже надо обернуть. например: toUInt64(14)

Tima
05.09.2017
18:31:58

Konstantin
05.09.2017
18:33:05

Tima
05.09.2017
18:34:32
Советую прочесть всю документацию, это не долго, интересно и много узнаешь про ClickHouse

Konstantin
05.09.2017
18:37:59
пытаюсь по мере сил
подскажите еще плз, как такую конструкцию перенести в КХ:
Select clip.meganame, mark.name
from clip join clip_mark on clip.id=clip_mark.clip_id
join mark on clip_mark.mark_id=mark.id
where mark.mark_type_id = 14
order by clip.meganame
как не бьюсь со словарям пока не вышло ничего путного =(

Oleh
05.09.2017
18:51:22
наверное почитай доку сначала

Tima
05.09.2017
18:52:11
Уточните структуру талбиц, словарей и пример неработающего запроса

Konstantin
05.09.2017
18:59:32
есть таблица stream, в ней поле resource связана со словарем clip по resource, в словаре clip есть аттрибут clip_id связан со словарем clip_mark, в clip_mark есть аттрибут mark_id связан со словарем mark в котором есть аттрибут name

papa
05.09.2017
18:59:43
в словаре вы можете mark_id в name/type_id расшифровать, но у вас многие ко многим, если считать что mark-clip не меняется, то можно сложить в массив в clip и тогда уже делать запрос.

Konstantin
05.09.2017
19:00:33
на выходе надо получить таблицу вида:
resource | name | count одному resource может соответствовать множество name
пока получилось такое:
SELECT
dictGetString('clip', 'meganame', tuple(resource)) AS film,
tuple(dictGetUInt64('clip_mark', 'mark_id', tuple(dictGetUInt64('clip', 'id', tuple(resource))))) AS Genre
FROM stream_log
WHERE date >= '2017-09-01'
GROUP BY
film,
Genre
LIMIT 50
но он берет для film первое значение Genre а нужно все

papa
05.09.2017
19:03:13
словарь это такой маппинг по ключу в [одно] значение. а вам нужен джойн

Tima
05.09.2017
19:03:49
Создайте БД типа Dirctionary и попробуйте заджойнить словать как таблицу

Konstantin
05.09.2017
19:04:29
т.е. все 3 словаря перенести в таблицы?
просто я от этого и ушел т.к. КХ ругался на неизвестный тип join

Google

papa
05.09.2017
19:06:08
сделайте известный тип
в словари уходят когда нужны апдейты/иерархия итд.
на обычный sql похож all inner join

Konstantin
05.09.2017
19:07:15
ну все 3 словаря посотянно обновляются

Tima
05.09.2017
19:08:10

papa
05.09.2017
19:15:36

Konstantin
06.09.2017
08:41:20
/stat@combot

Combot
06.09.2017
08:41:21
combot.org/chat/-1001080295593

Stepan
06.09.2017
10:53:45
Всем привет!
Столкнулся со странной проблемой, сценарий:
1) есть несколько ReplicatedMergeTree таблиц на кластере из 6 машин,
2) Подключаюсь к одной из тачек
3) Выполняю подряд несколько раз select count(*) из распределенной таблицы
4) Получаю мигающее значение, т.е. если всего, например, 10 записей, то получаю то 10, то 8 записей.
Выяснил, что выпадает одна из тачек, условно с номером 3: один раз я делаю запрос к распределенной таблице и данные с этой 3-ей тачки передаются, другой раз нет.
Причем, если я подключаюсь к этой третьей тачке - значение уже не мигает и все ок.
Я понимаю, что это история про сеть, одна она в принципе стабильна, может какой таймаут увеличить непосредственно в настройках КХ?


Emperor
06.09.2017
11:10:26
Привет!
Столкнулся с неточностью в хелпе. Пришлось по исходникам разбрираться.
"4. Восстановление в случае потери всех данных:
...Создайте в ZooKeeper узел /path_to_table/replica_name/flags/force_restore_data с любым содержимым или выполните команду для восстановления всех реплицируемых таблиц: sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data"
Было бы хорошо уточнить что это надо делать для каждой из replicated таблиц, указанных в metadata, во вторых путь к узлу не совсем такой - а именно между path_to_table и replica_name есть обязательный узел "/replicas/"
в итоге путь: /<path_to_table>/replicas/<replica_name>/flags/
И до копирования metadata пришлось руками вызывать 'create database <db_name>' на все базы, иначе почему-то ничего не виделось.


Virus
06.09.2017
12:34:23
выпал кх с такой ошибкой:
2017.09.06 12:32:34.870000 [ 1 ] <Error> Application: Resource temporarily unavailable
2017.09.06 12:32:34.874625 [ 2152 ] <Error> void DB::ReplicatedMergeTreeRestartingThread::run(): std::exception. Code: 1001, type: std::system_error, e.what() = Resource temporarily unavailable
как понять каких именно ресурсов не хватает?

Maksim
06.09.2017
12:41:46
я нашел чудесный пример, который подходит для учета онлайн сессий
https://gist.github.com/alexey-milovidov/2f2739347818013216139548ec989b20
наверное надо только поменять range на timeSlots
почему-то этот запрос считает явно не то, чего хотелось

papa
06.09.2017
13:12:32
вроде и так нормально.

Maksim
06.09.2017
13:12:59
да, я уже понял

papa
06.09.2017
13:13:13
просто тут разрешение посекундное, а вы хотели полчаса.

Maksim
06.09.2017
13:13:22
нельзя ставить timeSlots, потому что получается нерабочий вывод с сессиями у которых deleted_at - created_at меньше получаса
и в итоге получаются бессмысленные цифры типа 140 тыс онлайн

Google

Maksim
06.09.2017
13:15:05
поэтому надо брать запрос, который выложил Алексей, брать посекундную точность
а потом уже округлять до получаса вторым, внешним запросом
черт
Code: 69, e.displayText() = DB::Exception: A call to function range would produce 235817246 array elements, which is greater than the allowed maximum of 100000000, e.what() = DB::Exception
надо менять подход

Елена
06.09.2017
13:39:21
Можно ли как-то узнать приходили ли новые данные сегодня в таблицу именно со стороны clickhouse ?

Nikolai
06.09.2017
13:45:37
можно посмотреть в табличку system.query_log

Елена
06.09.2017
13:47:55
Это в последней версии clickhouse ?
У меня такая таблица не существует

Nikolai
06.09.2017
13:50:42
ее, оказывается, надо заранее отдельно включить
тогда посмотреть на наличие кусков в system.parts


Денис
06.09.2017
13:52:18
Падает кликхаус в ответ на команду "show tables" :
1) запускаю сервер docker run —rm -d —name my-clickhouse-server —ulimit nofile=262144:262144 yandex/clickhouse-server
2) запускаю клиент sudo docker run -it —rm —link my-clickhouse-server:clickhouse-server yandex/clickhouse-client —host clickhouse-server
3) Получаю:
ClickHouse client version 1.1.54284.
Connecting to clickhouse-server:9000.
Connected to ClickHouse server version 1.1.54284.
:) show tables
SHOW TABLES
Exception on client:
Code: 32. DB::Exception: Attempt to read after eof: while receiving packet from clickhouse-server:9000, 172.17.0.2
Connecting to clickhouse-server:9000.
Code: 210. DB::NetException: Connection refused: (clickhouse-server:9000, 172.17.0.2)
кажется нашел ответ
It means that your CPU doesn't support required instruction set.
For Yandex pre-built packages, minimal instruction set is SSE 4.2.
To show supported instruction sets, run cat /proc/cpuinfo.
You may build ClickHouse by yourself (either on target machine or with explicitly limited instruction set during build) and it will work even on older CPUs.