@clickhouse_ru

Страница 252 из 723
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
array join timeslots()
я боюсь, что никак не могу сообразить

вот у меня есть 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
toUint64 помог, я его и раньше пробовал но не на тот ключ, оказалось что обычное число тоже надо обернуть. например: toUInt64(14)
В доке написано что числа вида 1-9 парсятся сначала в UInt8, а потом уже в UInt16 и так далее

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 словаря посотянно обновляются

papa
05.09.2017
19:15:36
ну все 3 словаря посотянно обновляются
тогда вам видимо нужен словарь, который работает как multimap.

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.

Страница 252 из 723