- 01 August 2017 (127 messages)
-
-
нет, там идея в том что бы вернуть distinct - но после order by
тоесть например уникальные ивенты, и к каждому ивенту дату первого хита -
-
/stat@combot
-
Тогда вам нужен не DISTINCT, а LIMIT N BY
-
-
Joined.
-
Поймали ограничение по памяти при вставке
DB::Exception: Memory limit (for query) exceeded: would use 27.94 GiB (attempt to allocate chunk of 131072 bytes), maximum: 27.94 GiB.
Делаем
INSERT INTO table SELECT field1, ...fieldN FROM table2 WHERE action_date = '2017-08-01' ORDER BY action_at
При этом вставка без сортировки отрабатывает отлично, собственно как и сам запрос
SELECT COUNT() FROM (SELECT field1, ...fieldN FROM WHERE action_date = '2017-08-01' table2 ORDER BY action_at)
настройки
┌─name───────────────────────────────┬─value───────┬─changed─┐
│ max_bytes_before_external_group_by │ 20000000000 │ 1 │
│ max_bytes_before_external_sort │ 20000000000 │ 1 │
└────────────────────────────────────┴─────────────┴─────────┘
max_insert_block_size/max_threads крутили, не помогает
Что можно покрутить ещё ? -
Просто оставлю это здесь: https://db-engines.com/en/rankingDB-Engines Ranking
Popularity ranking of database management systems.
-
"В перспективный стартап ищем SQLite DBA"
-
-
неее, от рейтинга нужен DBA на MS Access
-
На подобии этого
https://clickhouse.yandex/docs/ru/query_language/queries.html#id8
есть внешняя сортировка
max_bytes_before_external_sort -
-
Возможно нужно создать issue чтобы влияло, или можно было повлиять
-
Я на такое наталкивался, пришлось отказаться от прямой вставки. Можно попробовать выгрузить данные в отсортированом виде на диск, а потом с диска их вставить через clickhouse-client
-
-
К сожалению при
INSERT INTO table SELECT * FROM table2
данные видны до окончания выполнения запроса, что иногда не очень удобно. Нет ли ручки которую можно покрутить чтоб исправить такое поведение ? -
Joined.
-
Привет, кто нибудь хранит в кликхаусе деревья и каким шаблоном, таблицей связей?
-
Не поддерживает ли формат (col1, col2, col3) IN ( (1,2,3) ) wildcard, типа (1, 2, *)?
-
наверно можно так IN (SELECT id FROM ids)
-
не так понял вопрос, только так col in () AND col2 IN() ...
-
Попробуйте ещё несколько уменьшить пороги на внешнюю сортировку и агрегацию. Например, в два раза.
-
Может кто подскажет как на 3 серверах сделать распределенную таблицу с репликацией?
Сделал 3 шарды и 2 реплики
создал таблицы на нодах так
1 » shard 1 replica 1, shard 2 replica 1
2 » shard 2 replica 1, shard 1 replica 2
1 » shard 2 replica 2, shard 3 replica 2
Поверх этого сделал Распределенную таблицу с rand() в качестве ключа шардирования
Как теперь проверить что все поднялось каак мне надо? -
В целом нет. Есть некоторые ухищрения, но на них рассчитывать не стоит.
-
Обычно деревья (регионы, товарные категории) хранятся отдельно и подключаются в виде иерархического словаря.
-
Не поддерживает.
-
Посмотрите на тесты в репозитории, там есть пример перекрёстной репликации
-
спсб
-
у меня явно что-то не поднялось :) SELECT * FROM system.clusters
SELECT *
FROM system.clusters
Ok.
0 rows in set. Elapsed: 0.001 sec. -
yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data.
-
спсб, буду разбираться.
вопрос по распределенной таблице
1. Читать можно с любого сервера рандомно или только с того где таблицу распределенную создали?
2. Писать рандомно в низлежащие таблицы? А как оно перешардироваться будет или если в качестве ключа rand() то ляжет как положили? -
а что он должен делать?
-
Joined.
-
привет, как вы с геоданными работаете в кликхаусе? например, у меня есть широта и долгота и нужно в радиусе n всех найти // пока еще не использую кликхаус
-
-
1. Читать нужно из таблицы с движком Distributed. При этом можно создать такую таблицу на каждом сервере (так, чтобы структура кластера совпадала)
2. Писать можно как в Distributed таблицу (тогда нужно указать выражение для шардирования), так и отдельно на каждый шард. Подробнее написано в документации: https://clickhouse.yandex/docs/ru/table_engines/distributed.html -
А создавать распределенную таблицу только на одном сервере и читать только с него
-
или можно на каждом по распределенной таблице создать и читать со всех параллельно?
-
можно на каждом
-
круто
-
спсб
-
не могу понять почему в кластерах пусто
-
cat /etc/clickhouse-server/remote_servers.xml
<yandex>
<remote_servers>
<metrics>
<shard>
<!— Optional. Wheight for writing. Default is 1. —>
<weight>1</weight>
<!— Optional. Write to only 1 replic?. By default, false - write to all replics. —>
<internal_replication>true</internal_replication>
<replica>
<host>10.1.1.251</host>
<port>9000</port>
</replica>
<replica>
<host>10.1.1.86</host>
<port>9000</port>
</replica>
</shard> -
SELECT count(*)
FROM Measures_Distributed
Received exception from server:
Code: 170. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Requested cluster 'metrics' not found.
0 rows in set. Elapsed: 0.020 sec.
:) -
SELECT *
FROM system.clusters
Ok.
0 rows in set. Elapsed: 0.001 sec.
:) -
сервер рестартовал
-
Переместите файл remote_servers.xml в
/etc/clickhouse-server/conf.d/ -
понял, видимо пропустил в документации
-
ура спсб
-
SELECT *
FROM system.clusters
┌─cluster─┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name──┬─host_address─┬─port─┬─is_local─┬─user────┬─default_database─┐
│ metrics │ 1 │ 1 │ 1 │ 10.1.1.251 │ 10.1.1.251 │ 9000 │ 1 │ default │ │
│ metrics │ 1 │ 1 │ 2 │ 10.1.1.86 │ 10.1.1.86 │ 9000 │ 1 │ default │ │
│ metrics │ 2 │ 1 │ 1 │ 10.1.1.251 │ 10.1.1.251 │ 9000 │ 1 │ default │ │
│ metrics │ 2 │ 1 │ 2 │ 10.1.1.145 │ 10.1.1.145 │ 9000 │ 1 │ default │ │
│ metrics │ 3 │ 1 │ 1 │ 10.1.1.86 │ 10.1.1.86 │ 9000 │ 0 │ default │ │
│ metrics │ 3 │ 1 │ 2 │ 10.1.1.145 │ 10.1.1.145 │ 9000 │ 0 │ default │ │
└─────────┴───────────┴──────────────┴─────────────┴────────────┴──────────────┴──────┴──────────┴─────────┴──────────────────┘
6 rows in set. Elapsed: 0.004 sec. -
Спасибо!
-
Подскажите, есть 2 сервера конфигурация 2 шарда и 2 реплики - хочу чтобы чтение было с обоих серверов. В таком конфиге ведь чтение не обязательно будет идти с обоих серверов, как задать и возможно ли чтобы чтение было с двух серверов по возможности ?
<yandex>
<remote_servers>
<graphite>
<shard>
<replica>
<host>node1</host>
<port>9000</port>
</replica>
<replica>
<host>node2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>node1</host>
<port>9000</port>
</replica>
<replica>
<host>node2</host>
<port>9000</port>
</replica>
</shard>
</graphite>
</remote_servers>
</yandex> -
Если читаете из Distributed таблицы, то должно читаться со всех серверов.
-
-
Есть такой движок
-
-
так точно
-
в доке указано что читать будет из любой доступной реплики - и это вполне могут быть реплики на одном сервере
-
-
Всем привет, используем таблицу ReplicatedReplacingMergeTree для схлопывания строк, и вот интересно, может ли она схлопывать записи с одинаковыми версиями? На практике видим, что не схлопывает, так и задумано? Или это будет меняться?
-
а как из одинаковой версии понять, какую запись оставить, а какую выкинуть?
-
Наверно по этому и не нужно вставлять одинковые версии. В доке https://clickhouse.yandex/docs/ru/table_engines/replacingmergetree.html#replacingmergetree описано что можно использовать DateTime
-
ну, да, вопрос-то был про одинаковые версии :)
-
Да, испольузем dateTime - но в одну секунду может быть две записи
-
а как в таком конфиге задатать верные макросы ? делал кто-нибудь ?
-
а миллисекунды?
-
DateTime - unix timestamp
-
нет миллисекунд у КХ :(
-
я имел в виду "записывать ms отдельно"
-
А куда сюда http://joxi.ru/zANGZyRilwRdZr записывать отдельно? Я бы попробовал заменить DateTime на UInt64 и переводить дату вставки в дату в милисекундах1501597757922 (44 kb) uploaded August 1, 2017 Joxi
made using Joxi.net
-
Если только использовать UInt в качестве версии где оно равно timestamp*1000
-
Но опять же, а если эти значения одинаковые, вот вставили мы дубль случайно в терабайты данных?
-
все, группировать по уникальности только?
-
UInt64 может такое хранить https://clickhouse.yandex/docs/ru/data_types/int_uint.html#uint
Т.е. можно конечно попробовать timestamp*1000 + что-то ещё зависящее от времени или версии строки -
Подозреваю это не юзер-кейс ReplaceMergeTree и CH вообще
-
доброго дня, не смог найти самостоятельно, а есть ли в кликхауз аналог уникального автоинкрементируемого поля?
-
Нет такого поля
-
Только если на уровне приложение его генерировать и там же проверять уникальность. Сам CH никак не умеется автоинкреемнтить. Так же не отслеживается уникальность строк по какому-либо полю. Исключение - движки семейства MergeTree - ReplaceMergeTree, CollapsingMergeTree и т.п. Но они не делают в прямом смысле то, что ожидается от уникального поля
-
спасибо за подробный ответ
-
Схлопывает же с одинаковыми версиями. Оставляет последнюю запись (видимо из кусочка с большим номером)
-
Я ловил что не схлопывает только в случае когда в КХ заинсертили всего один раз. Тогда у него всего один чанк, он ничего ни с чем не мерджит, соотвественно и схлопывания одинаковых ключей не происходит
-
Т.е. в одном INSERT были одинаковые значения PKEY?
-
да
-
красиво, спасибо за информацию!
-
Если я правильно понимаю, то нужно указать параметр load_balancing = in_order (в настройках пользователя или через SET) и тогда реплики будут выбираться в порядке перечисления в конфигурационном файле
-
В разных. Просто два раза сделал один и тот запрос и одни и те же данные (в том числе версия тоже)
-
можно выполнить optimize table xxx partition 201708 final;
-
со своим месяцем
-
и положить кластер)
-
replacing схлопывает версии только при мерже кусков. если есть 2 одинаковых куска, то и в select запросе данные бедут дублироваться. при мерже, если версия совпадет, выберется строка с последней версией.
-
Ну вы же хотите убедиться что схлопнет записи с одинаковой версией? Иначе ждите штатного мерджа
-
спасибо, стало понятнее ) осталось понять можно ли создавать конфигурацию с двумя шардами на 1 сервере во всех доках в макросах указывается 1 шард на сервер...
-
Joined.
-
-
Скажите это нормально?
Запросы к 3 локальным таблицам
1 rows in set. Elapsed: 0.381 sec. Processed 3.26 billion rows, 6.51 GB (8.53 billion rows/s., 17.07 GB/s.)
1 rows in set. Elapsed: 0.372 sec. Processed 2.99 billion rows, 5.99 GB (8.05 billion rows/s., 16.11 GB/s.)
1 rows in set. Elapsed: 0.513 sec. Processed 4.18 billion rows, 8.35 GB (8.14 billion rows/s., 16.28 GB/s.)
3.26+2.99+4.18=10.43
Запрос к распределенной
1 rows in set. Elapsed: 1.176 sec. Processed 11.60 billion rows, 23.20 GB (9.86 billion rows/s., 19.73 GB/s.) -
10.43 != 11.60
-
+ Еще один вопрос.
backgroung threads поставил в 16 в настройках потому как сластер начал отваливаться с too many parts
смотрю в system.merges 0-2 записи, в parts 5000 или 7000 и растет а процессор не загружен
почему КХ не мержит в 16 потков в срочном порядке? -
Я, конечно, не знаю, что такое батчи. Можете ткнуть в меня ссылкой. Но таки получается, что если я буду делать живую аналитику на тыкдоме, то приложенько, которое будет у меня вызывать 20к вставок в секунду, просто положит сервер и всё. А обещалось как раз быстро вставлять.
Таки а где ж оптимизатор умный, который будет там складывать, скажем в буфер, а потом вносить данные? -
батчи=пачками по 20000 в вашем случае
и да есть Buffer в КХ, но лучше делать самому подготовку пачки на стороне приложения по краиней мере документация Buffer не рекомендует почему-то -
Ну, скажем, приложенько на пхп так едва ли сможет (готовить пачку). Не все ж могут себе купить чего-нибудь.
-
Чот яндекс опять наврал.
-
Мне кажется надо Buffer.
-
-
-
-
-
-
ну так буфер ж не рекомендован. А я б не стал использовать то, что не рекомендовано производителем.
-
Хотя... Я вообще не знаю, зачем писать о чём-то в доке, если есть предупреждение "не использовать"
-
-
-
-
Буфер живет в памяти и при отключении питания ваши данные тютю. Со всеми вытекающими.
-
Мы из приложеньки на пхп бахаем через эту штуку, которая нам батчует всё - https://github.com/badoo/lsdGitHub - badoo/lsd: Live Streaming Daemon
Live Streaming Daemon. Contribute to badoo/lsd development by creating an account on GitHub.
-
Опять наткнулся на 2017.08.01 20:16:24.814536 [ 189 ] <Error> HTTPHandler: Code: 252, e.displayText() = DB::Exception: Too much parts. Merges are processing significantly slower than inserts., e.what() = DB::Exception, Stack trace:
-
background_pool_size увеличил до безобразия - не помогло
-
сервера ничего не делают, процессоры простиавают и инсерты просели в 5 раз
-
и что с этим делать непонятно
-
интересно что это на кластере из 3 машин, 3 шарды по 2 реплики
-
на одной машине когда поставил background_pool_size = 8 этого хватило чтобы мержи успевали
-
-
На скрине видно как после 8:08 где-то процессинг из Кафки стал рваным (лаг перестал снижатьс быстро) и в это же время КХ сервера начали курить
-
Непорядок какой-то
-
приложение -> очередь -> наблюдатель очереди
-
У нас php успешно пишет в файлы TSV по 10 сек, и потом типа cron грузит в CH... уже год как и не напрягает...
- 02 August 2017 (370 messages)
-
Joined.
-
-
У нас несколько ETL, в самом простом виде пишем в tsv заливаем, без особой проверки - данные не критичные и их потеря допустима.
Другой etl - читает protobuf данные, потом преобразует в RowBinary
У них всех есть очередь в простом варианте две папки - "ожидают" и "обработанные" - перемещение из одной в другую после успешной загрузки, если происходит ошибка то руками можно поправить и перезалить.
Использование формата типа protobuf - решает проблему формата полей и структуры данных, позволяет версионность. -
Вариант 1. Удаление таблицы и заливка данных заново
Вариант 2. Deattach "битых" данных и заливка их заново -
Вопрос скорее был в том, что делать когда данные УЖЕ в CH
-
Позвольте повторить свои вопросы, потому как без ответов я застопорился совсем
-
1 по кластеру.
SELECT *
FROM system.clusters
┌─cluster─┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name──┬─host_address─┬─port─┬─is_local─┬─user────┬─default_database─┐
│ metrics │ 1 │ 1 │ 1 │ 10.1.1.251 │ 10.1.1.251 │ 9000 │ 1 │ default │ │
│ metrics │ 1 │ 1 │ 2 │ 10.1.1.86 │ 10.1.1.86 │ 9000 │ 1 │ default │ │
│ metrics │ 2 │ 1 │ 1 │ 10.1.1.251 │ 10.1.1.251 │ 9000 │ 1 │ default │ │
│ metrics │ 2 │ 1 │ 2 │ 10.1.1.145 │ 10.1.1.145 │ 9000 │ 1 │ default │ │
│ metrics │ 3 │ 1 │ 1 │ 10.1.1.86 │ 10.1.1.86 │ 9000 │ 0 │ default │ │
│ metrics │ 3 │ 1 │ 2 │ 10.1.1.145 │ 10.1.1.145 │ 9000 │ 0 │ default │ │
└─────────┴───────────┴──────────────┴─────────────┴────────────┴──────────────┴──────┴──────────┴─────────┴──────────────────┘
6 rows in set. Elapsed: 0.050 sec.
Тут вроде все ок, 3 шарды по 2 реплики -
а тут пишет что реплика 1
SELECT * FROM system.replicas
FORMAT Vertical
zookeeper_path: /clickhouse/tables/measures/01
replica_name: 1
replica_path: /clickhouse/tables/measures/01/replicas/1
columns_version: 0
queue_size: 3
inserts_in_queue: 0
merges_in_queue: 3
queue_oldest_time: 2017-08-02 07:44:40
inserts_oldest_time: 0000-00-00 00:00:00
merges_oldest_time: 2017-08-02 07:44:40
oldest_part_to_get:
oldest_part_to_merge_to: 20170210_20170216_42373_54709_5421
log_max_index: 914493
log_pointer: 914494
last_queue_update: 2017-08-02 07:44:40
absolute_delay: 0
total_replicas: 1
active_replicas: 1
Так по 2 реплики или все таки по одной ? -
Вопрос номер два:
Локальные запросы с 3 машин
1 rows in set. Elapsed: 1.254 sec. Processed 9.56 billion rows, 19.13 GB (7.63 billion rows/s., 15.25 GB/s.)
1 rows in set. Elapsed: 0.833 sec. Processed 7.38 billion rows, 14.75 GB (8.85 billion rows/s., 17.70 GB/s.)
1 rows in set. Elapsed: 0.810 sec. Processed 6.80 billion rows, 13.59 GB (8.39 billion rows/s., 16.79 GB/s.)
9.56+7.38+6.80=23.74
Распределенный запрос
1 rows in set. Elapsed: 2.310 sec. Processed 25.92 billion rows, 51.85 GB (11.22 billion rows/s., 22.44 GB/s.)
Почему одно не равно другому? -
Вопрос номер три, последнии :)
Что же все таки делать с 2017.08.01 20:16:24.814536 [ 189 ] <Error> HTTPHandler: Code: 252, e.displayText() = DB::Exception: Too much parts. Merges are processing significantly slower than inserts., e.what() = DB::Exception, Stack trace:
Почему кластер перестает грузить машины и писать начинает очень медленно?
Как его заставить мержить используя все ресурсы? -
Картинку повторю
-
-
-
-
2) Так count же, как он так помержил что итоговая сумма разная получилась?
-
3) вставляю пачками по 500000
-
Увеличить до 1000000?
-
-
сам COUNT правильно посчитан ?
-
привет! а что за метрика ClickHouse.ProfileEvents.SelectedRanges ?
-
Уверен что блоком иначе бы оно намного раньше умерло
-
Count правильно? Не уверен что понял вопрос, извини. Ну сложил я 3 числа вроде правильно. А как КХ их посчитал я не уверен
-
-
так это и делал
-
сейчас повторю
-
насчет записи
-
-
вот так начинается
-
2017-08-01 19:55:00,272 INFO [CHRawDataPullerThread_3] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_3: Inserted 500001 docs into store
2017-08-01 19:55:00,904 INFO [CHRawDataPullerThread_7] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_7: Inserted 500003 docs into store
2017-08-01 19:55:01,612 INFO [CHRawDataPullerThread_5] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_5: Inserted 500003 docs into store
2017-08-01 19:55:02,462 INFO [CHRawDataPullerThread_2] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_2: Inserted 500001 docs into store
2017-08-01 19:55:04,705 INFO [CHRawDataPullerThread_1] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_1: Inserted 500001 docs into store
2017-08-01 19:55:05,590 INFO [CHRawDataPullerThread_6] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_6: Inserted 500002 docs into store
2017-08-01 19:55:06,438 INFO [CHRawDataPullerThread_0] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_0: Inserted 500001 docs into store -
вот так потом с затыками
2017-08-01 20:50:31,461 INFO [CHRawDataPullerThread_2] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_2: Inserted 500004 docs into store
2017-08-01 20:50:31,521 INFO [CHRawDataPullerThread_6] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_6: Inserted 500000 docs into store
2017-08-01 20:50:53,914 INFO [CHRawDataPullerThread_6] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_6: Inserted 500006 docs into store
2017-08-01 20:50:53,980 INFO [CHRawDataPullerThread_0] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_0: Inserted 500002 docs into store
2017-08-01 20:50:54,452 INFO [CHRawDataPullerThread_2] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_2: Inserted 500003 docs into store -
и на картинке выше видно что в это время сервера ничего не делают
-
вот повторил
-
1 rows in set. Elapsed: 0.780 sec. Processed 6.86 billion rows, 13.73 GB (8.80 billion rows/s., 17.61 GB/s.)
1 rows in set. Elapsed: 0.851 sec. Processed 7.44 billion rows, 14.89 GB (8.74 billion rows/s., 17.49 GB/s.)
1 rows in set. Elapsed: 1.087 sec. Processed 9.65 billion rows, 19.31 GB (8.88 billion rows/s., 17.77 GB/s.)
6.86+7.44+9.65=23.95
1 rows in set. Elapsed: 2.144 sec. Processed 26.17 billion rows, 52.35 GB (12.21 billion rows/s., 24.42 GB/s.) -
могу скриншотов наделать
-
запросы такие
select count(*) from Measures;
и
select count(*) from Measures_Distributed; -
Идеи? И что блин с этими мержами делать, видимо надо Алексея ждать. Сам не разберусь.
-
сами COUNT тоже не сошлись ? Measures_Distributed точно ходит на те сервера на которых руками запрос к локальным таблицам делали ?
-
Да каунты не сошлись
-
У меня всего 3 сервера сейчас. Выше я выложил как clusters выглядит.
-
Выкладывать как таблицы создавал?
-
Добавил еще 2 распределенные таблицы. Они указывают на те же реплицированные. Вот результаты.
Что-то я в замешательстве все больше
ubuntu@pprod-spm-ch-3:~$ curl 'pprod-spm-ch-3:8123?query=select+count(*)+from+default.Measures_Distributed;'
27006115772
ubuntu@pprod-spm-ch-3:~$ curl 'pprod-spm-ch-4:8123?query=select+count(*)+from+default.Measures_Distributed;'
22433347800
ubuntu@pprod-spm-ch-3:~$ curl 'pprod-spm-ch-5:8123?query=select+count(*)+from+default.Measures_Distributed;'
24140419001 -
Запросы к 3 серверам.
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
27641774875
25349551940
24191925958
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
27062961884 »»»»» УМЕНЬШИЛОСЬ КОЛ-ВО? КАК ТАК?
22478516014
21899703023 -
у тебя точно нет проблем с репликами? например они дико отстают или еще что-то такое?
-
-
-
Как проверить что реплтки не отстают?
-
В system.replicas delay = 0
-
SELECT absolute_delay
FROM system.replicas
FORMAT Vertical
Row 1:
──────
absolute_delay: 0
1 rows in set. Elapsed: 0.001 sec. -
-
где глянуть (извини не знаю)
-
На всех
-
-
select version()
-
-
-
На всех
1.1.54245 -
-
-
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+version();'; done;
1.1.54245
1.1.54245
1.1.54245 -
Да жду их. Без кластера все вроде ок было. А тут началось :)
-
Реально очень похоже что что-то с репликами
-
потому как числа прыгают но вариантов только 2
-
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
27062961884
25349551940
24191925958
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
27641774875
22478516014
21899703023
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
27641774875
25349551940
21899703023
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
27641774875
22478516014
24191925958
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
27641774875
22478516014
21899703023
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
27641774875
22478516014
21899703023 -
Может дело в том что я на каждой машине создавал по 2 таблицы такие?
CREATE TABLE IF NOT EXISTS Measures
(
account UInt32,
id UInt32,
date Date,
timestamp UInt32,
value Float32,
tags Nested (
name UInt32,
value UInt32
)
) Engine = ReplicatedMergeTree('/clickhouse/tables/measures/02', '2',date, (account, id, timestamp), 8192);
CREATE TABLE IF NOT EXISTS Measures
(
account UInt32,
id UInt32,
date Date,
timestamp UInt32,
value Float32,
tags Nested (
name UInt32,
value UInt32
)
) Engine = ReplicatedMergeTree('/clickhouse/tables/measures/03', '2',date, (account, id, timestamp), 8192); -
ну тоесть они шардами и репликми отличались только
-
-
-
может не обе
-
как на 3 сервера раскидать 3 шарда с 2 репликами по другому не придумал
-
Могу все пересоздать если кто подскажет как
-
:)
-
-
-
А как тогда в Распределенной их указать?
-
CREATE TABLE default.Measures_Distributed ( account UInt32, id UInt32, date Date, timestamp UInt32, value Float32, tags.name Array(UInt32), tags.value Array(UInt32)) ENGINE = Distributed(metrics, \'default\', \'Measures\', rand())
-
Как-то странно создаются таблицы. По-логике, 2-я совсем не должна была создаться, так как IF NOT EXISTS, и имя совпадает с первой.
-
Согласен
-
что-то намудрил
-
дайте рецепт как на 3 серверах получить 3 шарды с 2 репликами для каждой
-
Неужели у всех 6 серверов :)
-
можно наверное в разних БД создавать
-
но это изврат наверное какой-то
-
и распределенную не натянуть
-
Точно не уверен, что возможно. Попытаюсь уточнить. В любом случае, создавать надо 1 таблицу, а параметры реплики\шарда указывать в подствновке {shard} и {replica}, иначе что-то странное будет.
-
Спсб
-
Добавлю 4 сервер тогда и пока сделаю 2*2
Но очень хочется читать сразу с 4 а не с 2 как тут получится -
ClickHouse/ClickHouse
ClickHouse is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Все таки с разными бд, я думал это изврат
-
а бд указали в распределенной как '' и оно заработало?
Спсб -
Да, у меня так срабатывало
-
Уря-уря
-
ушел все дропать
-
да, действительно, судя по тесту, я был неправ :)
-
!!! Спсб
-
Alex a вы случаем не знаете что с too many parts делать?
-
батчи до 1M увеличивать?
-
Все таки немног втранно что КХ ничего не делает при этом (при том что parts мержить надо)
-
Помнится была какая-то настроечка которую советовали увеличить в таких случаях.
-
background threads pool?
-
Поставил аж 64 - нифига
-
может магическое число 8192 увеличить
-
Только что ответил внутри, из-за чего может быть ошибка Too much parts. Скопирую сюда:
Может быть несколько причин, почему такое происходит:
1. Данные не успевают мержатся, но всё-таки мержатся. Это будет видно по наличию большого количества одновременных мержей.
Запрос SELECT * FROM system.merges,
метрика ClickHouse.Metrics.Merge в Графите.
В этом случае может помочь увеличение размера пачки.
2. Данные не мержатся из-за того, что превышено некоторое ограничение. В последней версии ограничение на суммарный размер кусков, которые можно мержить - 100 GB. На практике мы убедились, что это плохо - если за месяц больше 10 ТБ данных, то это приводит к тому, что есть несколько сотен кусков, которые не мержатся. Скоро увеличим по-умолчанию, а пока можно увеличить вручную - я скажу, как.
Чтобы проверить - нужно посмотреть на размеры кусков: SELECT * FROM system.parts WHERE active
3. Данные не мержатся из-за бага. Суть в том, что среди реплик выбирается одна реплика-лидер, и именно она решает, какие мержи нужно делать. Раньше было много проблем - например, реплика-лидер могла отставать и не видеть куски для мержей. Или одна реплика могла уступить лидерство, а другая долго не брать его, из-за того, что это требует захвата некоторых блокировок. Все эти проблемы мы исправили и больше не наблюдали :) Но похожие вещи всё-равно могут быть.
Чтобы проверить - надо посмотреть на число одновременных мержей, так же, как написано выше. Если мержей нет - значит подозрение на такую проблему. -
Сейчас есть проблема, что при объёме данных больше 10 ТБ в месяц, куски плохо мержатся, из-за выставленных настроек по-умолчанию. Если это ваш случай, то можно прописать в config.xml в секции merge_tree, max_bytes_to_merge_at_max_space_in_pool побольше (по-умолчанию - 100 ГБ, можно увеличить до 500 ГБ, например).
-
max_bytes_to_merge_at_max_space_in_pool
-
У меня похлже случай что merges пустая
-
и сервер простаивает
-
по крайней мере я много раз делал селект и в 50% случаях ничего не возвращалось
-
увеличу до 500000000000
-
ubuntu@pprod-spm-ch-3:~$ cat /etc/clickhouse-server/conf.d/remote_servers.xml
<remote_servers>
<metrics>
<shard>
<!— Optional. Wheight for writing. Default is 1. —>
<weight>1</weight>
<!— Optional. Write to only 1 replic?. By default, false - write to all replics. —>
<internal_replication>true</internal_replication>
<replica>
<default_database>shard_1</default_database>
<host>10.1.1.251</host>
<port>9000</port>
</replica>
<replica>
<default_database>shard_1</default_database>
<host>10.1.1.86</host>
<port>9000</port>
</replica>
</shard> -
2017.08.02 11:48:11.231828 [ 35 ] <Error> HTTPHandler: Code: 170, e.displayText() = DB::Exception: Requested cluster 'metrics' not found, e.what() = DB::Exception, Stack trace:
-
Это после рестарта
-
я болван, пофиксил
-
Пересоздал как в рецепте на питоне с одтельными бд дла каждой шарды
-
все равно count пляшет
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
30670267
40000954
30670267
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
30670267
35331001
36669049
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
30670267
45999736
26000314
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
30670267
40000954
41339002
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
30670267
30670267
36669049
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
31003969
46332908
41672704 -
Что касается мержей то вот
SELECT count(*)
FROM system.parts
┌─count()─┐
│ 4117 │
└─────────┘
1 rows in set. Elapsed: 0.014 sec. Processed 4.12 thousand rows, 805.87 KB (293.92 thousand rows/s., 57.53 MB/s.)
:) select count(*) from system.merges;
SELECT count(*)
FROM system.merges
┌─count()─┐
│ 0 │
└─────────┘
1 rows in set. Elapsed: 0.001 sec. -
И кол-во частей растет
-
SELECT count(*)
FROM system.parts
WHERE active
┌─count()─┐
│ 2638 │
└─────────┘
1 rows in set. Elapsed: 0.011 sec. Processed 2.64 thousand rows, 517.82 KB (245.53 thousand rows/s., 48.19 MB/s.) -
Размеры кусков (часть небольшая)
│ 238744 │
│ 150295 │
│ 45537 │
│ 1877 │
│ 3497620 │
│ 45097735 │
│ 100445291 │
│ 25183453 │
│ 24205009 │
│ 8025090 │
│ 2813436 │
│ 2776275 │
│ 640824 │
│ 2951712 │
│ 45963162 │
│ 103841374 │
│ 29787212 │
│ 35136577 │
│ 670064 │
│ 661817 │
│ 694306 │
│ 675514 │
│ 675479 │
│ 1969 │
│ 1659 │
│ 1482 │
│ 1385 │
│ 1635 │
│ 1326 │
│ 1641 │ -
SELECT bytes
FROM system.parts
WHERE active
ORDER BY bytes DESC
LIMIT 20
┌─────bytes─┐
│ 103841374 │
│ 100445291 │
│ 45963162 │
│ 45097735 │
│ 35136577 │
│ 29787212 │
│ 27960524 │
│ 25183453 │
│ 24205009 │
│ 21057918 │
│ 18070983 │
│ 10042797 │
│ 6931969 │
│ 3497620 │
│ 3056593 │
│ 2951712 │
│ 2716754 │
│ 757982 │
│ 757828 │
│ 748188 │
└───────────┘ -
Кол-во parts уменьшается, значит мерджы идут
-
cначала они и вчера шли
-
Возможно ваши реплики и шарды с разной скоростью обрабатывают данные - потому и отличия в COUNT
-
а потом через 3-4 часа
-
когда колво достигло около 20000 все заглохло
-
Давайте останавлю вставку и проверим через минуту
-
Значит фоновые мерджи, при ваших настройках, закончились. Это штатное поведение
-
Коллеги, всем привет. Получается, что нельзя использовать условные операторы https://clickhouse.yandex/docs/ru/functions/conditional_functions.html?highlight=%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D1%8B%D0%B9 с NamedParameterJdbcTemplate
я когда написал в запросе (model_id != 0 ? model_id : cluster_id) AS model_id, у меня возникла бага
org.springframework.dao.InvalidDataAccessApiUsageException: Not allowed to mix named and traditional ? placeholders. You have 2 named parameter(s) and 2 traditional placeholder(s) in statement -
штатное поведение когда ничего не вставляет потому как пишет что много частей и при этом процессор ничего не делает (см картинку выше)?
-
Можно писать if(cond, then, else) и тогда такого не будет
-
вот после остановки вставки через минуту примерно
-
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
197847333
265166333
197847333
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
257339801
142501192
209820192
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
197847333
209820192
257339801
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
257339801
257339801
205673865 -
а норм
-
сча напишу
-
По моему опыту, если писать большими пачками, в один поток - всё нормально мерджиться.
Ждать минуту - мало, поскольку примерный интервал старта меджей - 8-10 минут. При этом все не мерджиться. Т.е. процесс мерджей - дело не 1-2 минут -
Особенно если "заливать" все данные заново, мерджи могу и полчаса идти, опять же записит какие батчи и какие данные вставляете
-
тоесть пока идут мержи возвращать неправильные данные это штатное поведение?
-
Я обычно по iotop смотрю что мерджи идут
-
Так мержи это второй вопрос
-
самое главное что count разное возвращает
-
ubuntu@pprod-spm-ch-3:~$ for i in seq 1 5; do curl 'pprod-spm-ch-3:8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
202826595
209820192
143334127
150327724
259506058 -
SELECT count(*)
FROM default.Measures_Distributed
┌───count()─┐
│ 207007187 │
└───────────┘
1 rows in set. Elapsed: 0.073 sec. Processed 207.01 million rows, 414.01 MB (2.84 billion rows/s., 5.67 GB/s.)
:) select count(*) from default.Measures_Distributed;
SELECT count(*)
FROM default.Measures_Distributed
┌───count()─┐
│ 259839933 │
└───────────┘
1 rows in set. Elapsed: 0.333 sec. Processed 259.84 million rows, 519.68 MB (781.28 million rows/s., 1.56 GB/s.)
:) select count(*) from default.Measures_Distributed;
SELECT count(*)
FROM default.Measures_Distributed
┌───count()─┐
│ 200347465 │
└───────────┘
1 rows in set. Elapsed: 0.374 sec. Processed 200.35 million rows, 400.69 MB (536.11 million rows/s., 1.07 GB/s.) -
это как понимать?
-
Пробуйте прям ручками зайти на реплики и шарды и там посчитать
-
-
сек
-
В локальных таблицах все стабильно
-
но по репликам данные не совпадают
-
и вот такое есть
-
SELECT *
FROM system.replicas
FORMAT Vertical
Row 1:
──────
database: shard_1
table: Measures
engine: ReplicatedMergeTree
is_leader: 0
is_readonly: 0
is_session_expired: 0
future_parts: 2
parts_to_check: 0
zookeeper_path: /clickhouse/tables/measures/01
replica_name: 1
replica_path: /clickhouse/tables/measures/01/replicas/1
columns_version: 0
queue_size: 6471
inserts_in_queue: 5087
merges_in_queue: 1384
queue_oldest_time: 2017-08-02 12:04:23
inserts_oldest_time: 2017-08-02 12:04:23
merges_oldest_time: 2017-08-02 12:06:45
oldest_part_to_get: 20161013_20161013_3_3_0
oldest_part_to_merge_to: 20160727_20160727_4_103_1
log_max_index: 9997
log_pointer: 9998
last_queue_update: 2017-08-02 12:26:00
absolute_delay: 1343
total_replicas: 2
active_replicas: 2 -
absolute_delay: 1343 » это в каких единицах?
-
Почему оно после остановки вставки не догоняет если даже и есть рассинхронизация
-
Неужели за 10 мин вставки так расколбасило.
-
absolute_delay: 1554
Увеличивается, хотя я с кластером вообще ничего не делаю сейчас -
SELECT count(*)
FROM system.parts AS active
┌─count()─┐
│ 7816 │
└─────────┘
1 rows in set. Elapsed: 0.033 sec. Processed 7.82 thousand rows, 1.54 MB (237.76 thousand rows/s., 46.76 MB/s.)
:) select * from system.merges;
SELECT *
FROM system.merges
Ok.
0 rows in set. Elapsed: 0.001 sec.
:) -
Мержей нет
-
Parts дофига
-
Приехали...
-
-
-
10 мин
-
то есть за 10 минут было 7816 инсертов (минимум)?
-
-
тут нет описание
https://clickhouse.yandex/docs/ru/system_tables/system.replicas.html
По коду либо милисекунды, либо секунды -
-
Это плохо, CH становиться плохо при таком кол-ве инсертов
-
2017-08-02 12:14:04,683 INFO [CHRawDataPullerThread_0] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_0: Inserted 500005 docs into store
2017-08-02 12:14:04,706 INFO [CHRawDataPullerThread_5] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_5: Inserted 500003 docs into store
2017-08-02 12:14:04,867 INFO [CHRawDataPullerThread_6] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_6: Inserted 500000 docs into store
2017-08-02 12:14:06,182 INFO [CHRawDataPullerThread_2] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_2: Inserted 500007 docs into store
2017-08-02 12:14:07,362 INFO [CHRawDataPullerThread_4] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_4: Inserted 500003 docs into store
2017-08-02 12:14:07,400 INFO [CHRawDataPullerThread_8] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_8: Inserted 500006 docs into store
2017-08-02 12:14:08,967 INFO [CHRawDataPullerThread_7] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_7: Inserted 500000 docs into store
2017-08-02 12:14:10,025 INFO [CHRawDataPullerThread_3] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_3: Inserted 500012 docs into store
2017-08-02 12:14:12,184 INFO [CHRawDataPullerThread_1] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_1: Inserted 500002 docs into store
2017-08-02 12:14:12,699 INFO [CHRawDataPullerThread_5] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_5: Inserted 500000 docs into store
2017-08-02 12:14:12,709 INFO [CHRawDataPullerThread_0] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_0: Inserted 500004 docs into store
2017-08-02 12:14:13,012 INFO [CHRawDataPullerThread_6] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_6: Inserted 500000 docs into store
2017-08-02 12:14:14,096 INFO [CHRawDataPullerThread_2] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_2: Inserted 500003 docs into store
2017-08-02 12:14:14,915 INFO [CHRawDataPullerThread_4] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_4: Inserted 500013 docs into store
2017-08-02 12:14:15,618 INFO [CHRawDataPullerThread_8] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_8: Inserted 500002 docs into store
2017-08-02 12:14:16,807 INFO [CHRawDataPullerThread_7] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_7: Inserted 500004 docs into store
2017-08-02 12:14:18,303 INFO [CHRawDataPullerThread_3] com.sematext.spm.clickhouse.CHRawDataPuller$Companion$PullerThread:123 - CHRawDataPullerThread_3: Inserted 500011 docs into store -
Вот лог встявлятеля
-
вставляет пачки по 500к
-
посмотрел по коду, там секунды
-
вот встявляло
-
не 10 мин, больше
-
По такому логу я бы сказал, что вставка идет в несколько потоком. Попробуйте сделать в один поток, с небольшим таймаутом после каждой вставки
-
-
>По такому логу я бы сказал, что вставка идет в несколько потоком. Попробуйте сделать в один поток, с небольшим таймаутом после каждой вставки
хм
так а если у меня такой поток от пользователей -
тут вопрос что не видно куда упирается КХ
-
Всё равно нужно через некий батчер группировать данные и делать одни запрос
-
Упирает в то, что слишком много одновременных вставок. Так делать не советуют, лучше одну большую, чем несколько маленьких
-
5-6 в секунду не выглядит критическим
-
ок
-
увеличу размер батча до 2 млн
-
Тут люди писали что вливают по 7 милионов строк в секунду - работает
-
вот и я о том же
-
где-то затык и надо понять где
-
Скажите, а какие параметры должны быть по времени и по размеру батча? Я просто сейчас тестирую своё приложение и в кх пропадают записи, этого не может быть из-за частой многопоточной вставки ?
-
и нифига не понятно почему absolute_delay: 2284 растет когда всавки нет
-
Затык в том, что при каждой вставке делается достаточно много действий с данными. Чтобы CH не помирал от большого кол-ва данных - делайте свой батчер или берите готовый и делайте однопоточную вставку
-
и почему КХ не мержит ничего хотя есть что и вставка приосановлена
-
SELECT count(*)
FROM system.parts AS active
┌─count()─┐
│ 7816 │
└─────────┘
1 rows in set. Elapsed: 0.028 sec. Processed 7.82 thousand rows, 1.54 MB (276.94 thousand rows/s., 54.46 MB/s.)
:) select count(*) from system.merges;
SELECT count(*)
FROM system.merges
┌─count()─┐
│ 0 │
└─────────┘
1 rows in set. Elapsed: 0.001 sec. -
Нужно больше данных, что значит пропадают? Измените вставку так, чтобы вставлять не чаще раза в секунду в один поток. Размер батча - не меньше 1 000 строк
-
ну вот должно быть 100 минут
-
"делайте свой батчер"
Я не очень понимаю
Я ж показываю что батчами встявляется по 500к -
-
-
ну так у вас по рассчетам выходит 10+ вставок в секунду
-
-
-
как это?
-
код показать?
-
Этот делай - это какая разница между неким последним инсером и текущем временем (сюдя по коду)
-
Пропадает, значит, что вставляю n, а оказывается в базе n - m. Вставляю Батчами по 2000 штук, в 8 потоков, вставка происходит раз 10 минут, но из-за 8 потоков, вставки могут прилететь одновременно
-
тогда ок c delay понятно
-
ну вот так это
-
-
Кючевое - не делать паралельные вставки
-
-
-
-
-
-
-
-
-
Тот же совет, сделать вставку однопоточной - например в несколько потоко ставлять в buffer таблицы, а потом за раз INSERT .. SELECT
-
Подозрительно мелкий размер частей. Как будто мелкими инсертами сыпят в кх.
-
-
каждая строка это где-то 5-6 int32 и один float 32
-
Понятно, спасибо. Грустно
-
Ну я не знаю. Отсюда вроде понятно что батчи не меньше чем bulkSize
val insertCount = insert(dataRow.row)
count += insertCount
i += insertCount
if (count >= bulkSize) {
flushTo(st)
LOG.info("$name: Inserted $count docs into store")
count = 0
i = 0
st = repo.prepareNewBatchStatement()
} -
Совсем не понимаю почему в много потоков писать нехорошо?
Ну как рекомендация спасибо, но это ненормально как-то -
То есть примерно 14Мб на пачку. Не очень верится что они ужимаются кликхаусом до полутора килобайт.
-
ну я не знаю как вам доказать
-
я готов предоставить все что вас убедит
-
может это поможет решить вопрос
-
-
Я вывел такие правила работы со вставкой в CH:
- однопоточная вставка через некий батчер. Несколько источников логов (приложения, клиенты, логи), один вставщик в CH
- размер вставки от 10к, меньше часто не имеет смысла -
-
метрики не собираю
-
-
сейчас в табличке посмотрю
-
eсть такое
-
│ InsertedRows │ 435003976 │
│ InsertedBytes │ 28657505480 │ -
│ DelayedInserts │ 288 │
│ RejectedInserts │ 43 │ -
│ SelectQuery │ 560 │
│ InsertQuery │ 1300 │ -
-
-
-
сейчас вставку включу
-
пока оно стартует
-
не мержит почему пока есть возможность? :)
-
Мерджит не сразу, стартует примено раз в 8-10 минут. На то они и фоновые мерджи
-
INSERTS=$(curl "localhost:8123?query=select+value+from+system.events+where+event='InsertQuery'" 2>/dev/null); while :; do NEW_INSERTS=$(curl "localhost:8123?query=select+value+from+system.events+where+event='InsertQuery'" 2>/dev/null); DELTA=$((NEW_INSERTS-INSERTS)); echo "${DELTA} inserts/min"; sleep 60; INSERTS=${NEW_INSERTS}; done
-
-
-
-
ubuntu@pprod-spm-ch-3:~$ curl "localhost:8123?query=select+value+from+system.events+where+event='InsertQuery'"; sleep 60; curl "localhost:8123?query=select+value+from+system.events+where+event='InsertQuery'";
1365
1430 -
-
-
откуда такой вывод
-
65 в минуту
-
много?
-
а, ты не дельту показал
-
не, 65 в минуту в целом нормально должно быть
-
так оно и работало на одной машине
-
как 3 поставил так и поломалось
-
-
-
не пробовал.
я ж не могу все варианты перебрать -
ubuntu@pprod-spm-ch-3:~$ INSERTS=$(curl "localhost:8123?query=select+value+from+system.events+where+event='InsertQuery'" 2>/dev/null); while :; do NEW_INSERTS=$(curl "localhost:8123?query=select+value+from+system.events+where+event='InsertQuery'" 2>/dev/null); DELTA=$((INSERTS-NEW_INSERTS)); echo "${DELTA} inserts/min"; sleep 60; INSERTS=${NEW_INSERTS}; done
0 inserts/min
-60 inserts/min
-67 inserts/min -
просто может проблемы с сетью какие-то жестокие?
-
не может быть
-
все в одной стойке на AWS
-
пинги минимальные
-
-
PING 10.1.1.86 (10.1.1.86) 56(84) bytes of data.
64 bytes from 10.1.1.86: icmp_seq=1 ttl=64 time=0.220 ms
64 bytes from 10.1.1.86: icmp_seq=2 ttl=64 time=0.221 ms
64 bytes from 10.1.1.86: icmp_seq=3 ttl=64 time=0.218 ms -
-
ну это отлично что 84 байта передаются 0.2мс
-
-
-
-
-
-
так
-
sudo apt install iperf поставил
-
дальше помедленнее плиз
-
я не совсем с этим всем на ты
-
-
-
-
^Cubuntu@pprod-spm-ch-3:~$ iperf -c 10.1.1.86
—----------------------------------------------------------
Client connecting to 10.1.1.86, TCP port 5001
TCP window size: 325 KByte (default)
—----------------------------------------------------------
[ 3] local 10.1.1.251 port 44254 connected with 10.1.1.86 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 5.81 GBytes 4.99 Gbits/sec -
-
-
ubuntu@pprod-spm-ch-3:~$ iperf -c 10.1.1.86 -R
—----------------------------------------------------------
Client connecting to 10.1.1.86, TCP port 5001
TCP window size: 325 KByte (default)
—----------------------------------------------------------
[ 3] local 10.1.1.251 port 46066 connected with 10.1.1.86 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 5.82 GBytes 4.99 Gbits/sec -
-
-
-
-
не, у меня там ip
-
-
^Cubuntu@pprod-spm-ch-3:~$ iperf -c 10.1.1.86 -d
—----------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
—----------------------------------------------------------
—----------------------------------------------------------
Client connecting to 10.1.1.86, TCP port 5001
TCP window size: 1.17 MByte (default)
—----------------------------------------------------------
[ 5] local 10.1.1.251 port 47844 connected with 10.1.1.86 port 5001
[ 4] local 10.1.1.251 port 5001 connected with 10.1.1.86 port 44896
[ ID] Interval Transfer Bandwidth
[ 5] 0.0-10.0 sec 5.81 GBytes 4.99 Gbits/sec
[ 4] 0.0-10.0 sec 5.81 GBytes 4.99 Gbits/sec -
-
5 мин отойду , невтерпеж :D
-
ZK на тех же 3 машинах
это может не суперправильно но это тест у меня.
ZK пишет в другой диск тоже SSD -
сделал батчи по 1.5M
-
стало писать по 25-30 раз в минуту
-
-26 inserts/min
-25 inserts/min -
Вот это необяснимо, да?
ubuntu@pprod-spm-ch-3:~$ for i in seq 1 5; do curl 'pprod-spm-ch-3:8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
156501169
156501169
227514652
152327963
223507989 -
да, это выглядит как будто он читает из разного набора реплик
-
-
-
у меня на этой цифре зависло
-
SELECT count(*)
FROM system.parts AS active
┌─count()─┐
│ 7982 │
└─────────┘ -
и никуда не двигается
-
из разного набора реплик да, но они должны сходится
-
Можно я выложу как создавал и конфиги свои? может заметно будет где ошибка?
-
Это что значит?
2017.08.02 13:38:46.570499 [ 6589 ] <Error> InterserverIOHTTPHandler: Code: 221, e.displayText() = DB::Exception: No interserver IO endpoint named DataPartsExchange:/clickhouse/tables/measures/02/replicas/2, e.what() = DB::Exception, Stack trace:
2017.08.02 13:38:46.592134 [ 83 ] <Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 33, e.displayText() = DB::Exception: Cannot read all data, e.what() = DB::Exception, Stack trace:
2017.08.02 13:38:46.592190 [ 102 ] <Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 33, e.displayText() = DB::Exception: Cannot read all data, e.what() = DB::Exception, Stack trace:
2017.08.02 13:38:46.610775 [ 125 ] <Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 33, e.displayText() = DB::Exception: Cannot read all data, e.what() = DB::Exception, Stack trace:
2017.08.02 13:38:46.618404 [ 6589 ] <Error> InterserverIOHTTPHandler: Code: 221, e.displayText() = DB::Exception: No interserver IO endpoint named DataPartsExchange:/clickhouse/tables/measures/01/replicas/2, e.what() = DB::Exception, Stack trace:
2017.08.02 13:38:46.626119 [ 6583 ] <Error> InterserverIOHTTPHandler: Code: 221, e.displayText() = DB::Exception: No interserver IO endpoint named DataPartsExchange:/clickhouse/tables/measures/02/replicas/2, e.what() = DB::Exception, Stack trace: -
replica 2 недоступна?
-
В ZK вроде есть такой путь
[zk: localhost:2181(CONNECTED) 8] ls /clickhouse/tables/measures/02/replicas/2
[is_active, columns, max_processed_insert_time, host, parts, flags, log_pointer, min_unprocessed_insert_time, queue] -
Я бы попробовал собрать кластер без шардов, только реплики. А только потом сделать Disturbed
-
Причем на части данных, для скорости
-
тоесть 1 шарду в remote server указать и 2 реплики для нее?
писать в любую 1 локальную таблицу? -
-
Я имею в виду, что может быть сначала разобраться с репликацией? Убедиться, что данные доходят до каждой реплики. А потом уже пилить данные на шарды
-
И разбираться с распределенными запросами
-
Имеет смысл
Не думал что столько глаблей сразу встречу просто. -
В CH репликация и шардирование - это скорее конструктор, чем готовое решение. Такой подход позволяет гибко настроить схему под нужную задачу
-
Просто 2 реплики синхронизируются быстро
-
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 4; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
67500250
67500250
ubuntu@pprod-spm-ch-3:~$
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 4; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
142048934
142048934
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 4; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
142488667
142490947
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 4; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
142500364
142500364
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 4; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
142500364
142500364 -
сейчас верну распределенность
-
Интересно что количество parts не растет и все успевает мержиться
-
Попробуйте залить все данные. Может проблема появиться после некого объема данных
-
давай на ты пожалуйста
-
ок
-
сделаю как ты сказал
-
Вставилось около 300М строк и все было ок. Кол-во parts не превышало 100 мержить успевало
-
Переделал на Distributed и с первых секунд начались проблемы
-
Вот создание таблиц
-
-
Вот remote_servers.xml
-
-
Где-то тут ошибка
-
Опять же, попробуй более простое распределение данных, например на две половинки
-
Сложно сказать, я пока не пробовал реплицировать и шардировать на CH. В твоей схеме три шарда, сделай два
-
Как минимум, почему тут http://joxi.ru/RmzNOePtWVpO8m пусто? Вот что в доке http://joxi.ru/gmvzZ3Pix05Z5m
-
там выше говориличто если тут пусто то берет БД из remote servers
-
вот этот пример кидали
-
yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data.
-
А вставляешь ты в распределенную таблицу или приложением в каждый шард?
-
в распределенную
-
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+shard_1.measures;'; done;
29669439
61325190 -
реплика в случае распределенной очень сильно отстает
-
Я бы даже сказал не отстает а в 2 раза больше результаты показывает одна из реплик
-
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+shard_1.measures;'; done;
40169007
81393576 -
-
в распределенную
-
еще я вижу много такого в логах
но что это и почему не понятно
2017.08.02 15:18:58.384768 [ 4262 ] <Error> InterserverIOHTTPHandler: Code: 221, e.displayText() = DB::Exception: No interserver IO endpoint named DataPartsExchange:/clickhouse/tables/02/measures/replicas/2, e.what() = DB::Exception, Stack trace:
2017.08.02 15:18:58.396931 [ 39 ] <Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 33, e.displayText() = DB::Exception: Cannot read all data, e.what() = DB::Exception, Stack trace:
2017.08.02 15:18:58.519827 [ 4270 ] <Error> InterserverIOHTTPHandler: Code: 221, e.displayText() = DB::Exception: No interserver IO endpoint named DataPartsExchange:/clickhouse/tables/02/measures/replicas/2, e.what() = DB::Exception, Stack trace:
2017.08.02 15:18:58.535047 [ 102 ] <Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 33, e.displayText() = DB::Exception: Cannot read all data, e.what() = DB::Exception, Stack trace:
2017.08.02 15:18:58.542597 [ 4262 ] <Error> InterserverIOHTTPHandler: Code: 221, e.displayText() = DB::Exception: No interserver IO endpoint named DataPartsExchange:/clickhouse/tables/02/measures/replicas/2, e.what() = DB::Exception, Stack trace:
2017.08.02 15:18:58.553679 [ 49 ] <Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 33, e.displayText() = DB::Exception: Cannot read all data, e.what() = DB::Exception, Stack trace: -
Сделал кластер без реплик, теперь распределенная таблица возвращает синхрнизированние данные
-
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
69892767
70000700
70000700
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
70500703
70500703
70500703
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
71491774
71495408
71496055 -
Что мы имеем:
1. Реплицированная таблица работает и реплики не отстают друг от друга. Проблем с мержем нету system.parts всегда маленькое.
2. Распределенная таблицв работает, все 3 распределенные таблицы (на разных серверах) поверх одних и тех же Merge таблиц возвращают одинаковые данные. Появляется проблема с system.parts. Через 10 мин работы видно такое
SELECT count(*)
FROM system.parts
┌─count()─┐
│ 6150 │
└─────────┘
1 rows in set. Elapsed: 0.021 sec. Processed 6.15 thousand rows, 1.21 MB (290.54 thousand rows/s., 57.03 MB/s.)
3. Распределенная таблица поверх реплицированных как по схеме тут (шарды а разных БД чтобы можно было создать таблицы с одинаковыми именами) https://github.com/yandex/ClickHouse/blob/master/dbms/tests/integration/test_cross_replication/test.py
не работает. Есть и проблема с system.parts как в пункте 2, так и данные вазвращаются несогласованные от каждой распределенной таблицы
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
197847333
209820192
257339801
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
257339801
257339801
205673865
Алексей может у Вас есть идеи что в моих руках и голове не так?.yandex/ClickHouseClickHouse is a free analytic DBMS for big data.
-
Привет! А можешь поподробнее рассказать про подкладывание в private? Туда можно положить как-то чтобы оно само в libdbms.a дописалось или нужно другой lib*.a делать?
-
С распределенной таблицей начались проблемы с мержем, кто угадает время по картинке?
-
-
А вот еще интересная статистика system.events показывает
│ InsertedRows │ 4711779888 │
А таблицы показывают
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
3190003655
3190003947
3190004375
Вставку я прекратил 3 мин назад а кол-во строк растет -
Где-то очередь на полтора миллиарда строк?
-
Через 2 мин стабилизировалось на такой цифре
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
3286834653
3286834653
3286834653 -
Почему не бъется с InsertedRows и почему вообще после прекращения вставки количество строк росло 2 мин непонятно. Неужели так забуфферизировало.
Я тут всех запарил чувствую, простите, ответов так и не понаходил -
-
спсб за поддержку, ушел на перекур (не курю :) )
-
-
-
Я чаще чем раз в секунду вставляю и все норм. 6-7 миллионов строк в минуту получается
-
Лью в 100 потоков
-
>Я чаще чем раз в секунду вставляю и все норм. 6-7 миллионов строк в минуту получается
Я тоже чаще в вставлял и вопросов не было. Все началось при репликации + шардирование -
>А ты не пробовал через буфер с num_layers=1 ?
не пробовал. тут вопрос не в том как сделать, а почему оно не мержит само интенсивно когда проессоры простаивают -
Ну и чехарда с count() при репликации и шардировании, и увеличение кол-ва строк после того как инсерты застопились 2 мин назад. Много непонятного какого-то
-
Я вот сейчас до перекура поставил пачки по 3млн и ушел. Стабилизировалось все на таких цифрах
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+system.parts;'; done;
5701
4866
4734 -
Меня устраивает впринципе, гдавное что стабилизировалось и перестало отдавать ошибки
-
Неохота делать 2*2 на 4 серверах. Не могу никак понть почему 3*2 на 3 не работает.
2*2 и серверов больше и читать только с 2 в одном запросе, минусы одни -
Кажется что всё проблемы от вставки через Distributed-таблицу. Насколько я помню, кто-то писал что в Яндекс.Метрике используют вставку напрямую в локальные таблицы. И вставка через Distributed не рекомендуется.
-
А как это согласуется с тем что если Distrinuted поверх нереплицированных таблиц то все более менее ок?
-
Joined.
- 03 August 2017 (109 messages)
-
Joined.
-
-
Всем привет, в документации сказано "We do not recommend storing floating-point numbers in tables.", а какие есть альтернативы?
-
integer
-
а как быть не целой частью числа?
-
хранить в отдельных колонках?)
-
Умножать же. Если 2 знака после запятой - на 100.
-
3 - на 1000 и тд
-
спасибо, действительно
-
Joined.
-
извините, не сразу увидел что используется slf4j
-
А может кто толком объяснить почему int32 пердпочтительнее float 32?
-
-
-
понял
-
IEEE 754
-
спсб
-
-
Привет! Хочу в clickhouse создать табличку типа set, которая содержит информацию об обновлениях в таблицах. Чтобы она содержала 2 столбца: table_name, update_id. То есть чтобы я мог быстро проверить, закачались ли данные в таблицы. Движок SET как я понял, не подойдет, в нем нет возможности проверить вхождение строки в таблицу. Какой движок юзать?
-
Почему именно set?
-
-
А чем обычный поиск с WHERE непоходит?
-
-
Советую прочитать документацию, всю, её там не так много
-
-
-
Конечно. потому что CH - СУБД, заточенная под аналитику, в ней нет обычных таблиц
-
И выборки вида "выбрать список пользователей по списку id-ок" в CH скорее всего будут работать очень медленно
-
Возможно, имеет смысл писать во внешний источник (например, mysql) и подключить его как словарь. Но такое решение может медленно работать.
-
Где тут
https://clickhouse.yandex/docs/ru/table_engines/tinylog.html
это написано? Пробуйте, экспериментируйте -
Всем привет! Кто-то использует лимиты для доступа к КХ? А именно max_memory_usage, max_execution_time, max_concurrent_queries_for_user ?
-
Всем привет.
Я правильно понимаю, что нет возможности добавить новый столбец в таблицу и одновременно добавить его в первичный ключ? В документации написано только про удаление и изменение:
"Отсутствует возможность удалять столбцы, входящие в первичный ключ или ключ для сэмплирования (в общем, входящие в выражение ENGINE). Изменение типа у столбцов, входящих в первичный ключ возможно только в том случае, если это изменение не приводит к изменению данных (например, разрешено добавление значения в Enum или изменение типа с DateTime на UInt32)."
То есть любое изменение первичного ключа требует создания новой таблицы:
"Если возможностей запроса ALTER не хватает для нужного изменения таблицы, вы можете создать новую таблицу, скопировать туда данные с помощью запроса INSERT SELECT, затем поменять таблицы местами с помощью запроса RENAME, и удалить старую таблицу." -
Потребует пересортировки и перезаписи всего существующего на диск КМК поэтому и нету
-
Да, иначе пришлось бы перестраивать индекс.
-
Николай а не смотрели вчера мои конфиги? Может у вас есть идею почему 3 шарды с репликацией на 3 серверах у меня так странно себя ведут?
-
Подскажите, пожалуйста, что можно предпринять - растёт system.replication_queue. При этом CPU на машине - гора, в диск тоже не упирается. background_pool_size выставили в 48
-
-
Конфиги на вид кажутся нормальными. То, что расходятся цифры для Distributed таблицы тоже объяснимо, так как данные сначала пишутся на диск, а потом отдельным потоком передаются на остальные реплики. Вот почему не проходят мержи - пока неясно.
-
Так подождите
-
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
197847333
209820192
257339801
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
257339801
257339801
205673865 -
Вот это объяснимо?
-
Можно попробнее плиз
-
запись сейчас идет или на какое-то время остановлена?
-
сейчас все пересобрано на кластер без реплик
-
и все ок
-
я писал выше
1. 2 реплики - все ок, не рассинхронизируются
2. 3 шарды все ок
3. 3 шарды по 2 реплики - непонятночто
Такое ощущение что оно путает реплики для разных шард
Но никто ошибку в конфигах не нашел -
Сидим ждем Алексей. Ну и сейчас все грохну и соберу 2*2 на 4 машинках и посмотрю
-
+1. Возможно CH нельзя использовать так, как ты хочешь (баг или фича)
-
согласен, но должен быть выход.
-
могу предположить, что в случае 2-х реплик при запросе всегда бралась реплика из локальной машины. а когда появились 3 шарда по 2 реплики, то получался шард, не имеющий локальной реплики, из-за чего ходили на 2 другие машины при разных запросах. но точно сказать не берусь
-
> бралась реплика из локальной машины
я делал 2 распределенные таблици на каждой локальной и сравнивал - все ок, + балансировщик rand опять же, так чт не думаю что в этом дело -
на какие бы машины не ходил скакать на 20% результаты не должны наверное.
я грешу на конфигирацию -
А в колонке exception из system.replication_queue что-нибудь написано? Также интересуют postpone_reason
-
SELECT
count(),
type
FROM system.replication_queue
GROUP BY type
┌─count()─┬─type────────┐
│ 180 │ MERGE_PARTS │
│ 4091 │ GET_PART │
└─────────┴─────────────┘ -
из них с postpone_reason - всего 30
-
Если кому интересно, то поставил кластер 2*2.
Вставляю пачками по 2М (вроде как больше 1М вставлять не имеет смысла потому как КХ побъет все равно, но все же) около 40М в минуту
Все работает ок. Рассинхронизации нет (совсем маленькая из-за реплик) + system.parts более менее стабилизируются на 5000-10000 тысячах (после большого мержа с 10000 падает на 5000 на всех серверах).
Все хорошо короче.
Чисто ради спортивного интереса непонятно что происходит в слечае 3 серверов -
Причины postpone:
Not executing log entry for part 20170730_20170730_851_859_1 because its size (22.21 MiB) is greater than current maximum (4.23 MiB)
Not merging into part 20170730_20170730_775_807_3 because part 20170730_20170730_807_807_0 is not ready yet (log entry for that part is being processed). -
А в поле last_exception есть что-нибудь?
-
интересно, спасибо! попробую разобраться
-
Подскажите, товарищи: в какой-то момент clickhouse-server, работавший в докере перестал отвечать. Совсем. Удалил все контейнеры, образы. Все равно не отвечает.
docker run -it --rm --link some-clickhouse-server:clickhouse-server yandex/clickhouse-client --host clickhouse-server
ClickHouse client version 1.1.54245.
Connecting to clickhouse-server:9000.
Code: 209. DB::NetException: Timeout exceeded while reading from socket (172.17.0.2:9000) -
SELECT *
FROM system.replication_queue
WHERE last_exception != ''
Ok.
0 rows in set. Elapsed: 0.026 sec. Processed 16.43 thousand rows, 3.70 MB (626.63 thousand rows/s., 141.33 MB/s.) -
-
сеть не загружена
-
на обеих репликах одинаковые значения
-
-
-
Joined.
-
Всем привет, вопрос можно ли в кластере описывать приоритет реплик? Есть 3 сервера в кластере (конфиг https://pastebin.com/wLYr0VT2 ), таблица ReplicatedReplacingMergeTree шардирована на 3 части по ним, причем на каждом сервере также есть вторая база, которая хранит еще одну реплику другого шарда (перекрестная репликация). При погашении одного сервера находится сервер с репликой погашенного шарда и все ок, но вот при возвращении погашенного сервера в строй его шард не становтся активным. А хотелось бы (чтобы запросы параллельно считались на трех серверах а не на двух).
-
есть настройка load_balancing: https://clickhouse.yandex/docs/ru/operations/settings/settings.html#load-balancing . возможно, возвращенный шард не выбирается из-за большого числа ошибок
-
https://github.com/yandex/ClickHouse/issues/127
Сейчас нельзя создавать вьюхи с подзапросами
Может кто в курсе, есть ли в планах фикс этой баги?Problem with INSERT if having a VIEW with subqueries & AS keyword #127That's a really strange one! When you create a view (let's call it test_stats) that has a subquery with multiple tables (test1 and test2) combined using UNION ALL clause, and the first tabl...
-
-
Пришел с прогулки, поломалась вставка,через 2 часа куча такого посыпалось
2017.08.03 19:15:38.688909 [ 187 ] <Error> InterserverIOHTTPHandler: Code: 221, e.displayText() = DB::Exception: No interserver IO endpoint named DataPartsExchange:/clickhouse/tables/01/measures/replicas/2, e.what() = DB::Exception, Stack trace:
2017.08.03 19:15:38.702824 [ 340 ] <Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 33, e.displayText() = DB::Exception: Cannot read all data, e.what() = DB::Exception, Stack trace:
2017.08.03 19:15:38.967668 [ 600 ] <Error> InterserverIOHTTPHandler: Code: 221, e.displayText() = DB::Exception: No interserver IO endpoint named DataPartsExchange:/clickhouse/tables/01/measures/replicas/2, e.what() = DB::Exception, Stack trace: -
Данные рассинхронизировались
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
3299260074
3362685583
3381671392 -
И вот
SELECT
count(),
type
FROM system.replication_queue
GROUP BY type
┌─count()─┬─type────────┐
│ 348 │ MERGE_PARTS │
│ 1679 │ GET_PART │
└─────────┴─────────────┘
2 rows in set. Elapsed: 0.010 sec. Processed 2.03 thousand rows, 803.80 KB (200.41 thousand rows/s., 79.47 MB/s.) -
-
-
-
Какие отзывы, кстати? Ну, кроме того, что это очень странно)
-
тут в соседнем канале кто-то жаловался что он не работает адекватно )
-
-
-
ага
-
-
Понятно, спасибо.
Сомневаюсь, чтобы у кого-то zetcd в хайлоаде -
>а глупый вопрос - у тебя же zookeeper в качестве zookeeper'а?
он самый. 3.4.9 -
│ MERGE_PARTS │ Not executing log entry for part 20170210_20170216_12252_12406_4 because another log entry for covering part 20170210_20170216_0_12408_2704 is being processed.
-
│ MERGE_PARTS │ Not executing log entry for part 20170710_20170726_11915_12259_13 because another log entry for covering part 20170710_20170731_4666_12268_74 is being processed.
-
│ MERGE_PARTS │ │
│ MERGE_PARTS │ │
│ MERGE_PARTS │ │
│ GET_PART │ Not executing log entry for part 20170106_20170117_12268_12268_0 because another log entry for covering part 20170106_20170117_0_12358_1190 is being processed. │
│ GET_PART │ Not executing log entry for part 20170106_20170117_12270_12270_0 because another log entry for covering part 20170106_20170117_0_12358_1190 is being processed. │
│ MERGE_PARTS │ Not executing log entry for part 20170210_20170216_0_11893_2692 because another log entry for covering part 20170210_20170216_0_11956_2695 is being processed. │
│ MERGE_PARTS │ │
│ MERGE_PARTS │ Not executing log entry for part 20170620_20170630_0_12107_2959 because another log entry for covering part 20170620_20170630_0_12284_2962 is being processed. │
│ MERGE_PARTS │ Not executing log entry for part 20170620_20170630_12214_12224_1 because another log entry for covering part 20170620_20170630_0_12284_2962 is being processed. -
Сыплет вот этим
2017.08.03 19:26:01.956741 [ 602 ] <Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 33, e.displayText() = DB::Exception: Cannot read all data, e.what() = DB::Exception, Stack trace:
0. clickhouse-server(StackTrace::StackTrace()+0x16) [0x29b2626]
1. clickhouse-server(DB::Exception::Exception(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)+0x1f) [0x10b079f]
2. clickhouse-server(DB::DataPartsExchange::Fetcher::fetchPartImpl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)+0x1cc7) [0x2bb1cb7]
3. clickhouse-server(DB::DataPartsExchange::Fetcher::fetchPart(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool)+0x76) [0x2bb2766]
4. clickhouse-server(DB::StorageReplicatedMergeTree::fetchPart(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, unsigned long)+0x25a) [0x2a98b1a]
5. clickhouse-server(DB::StorageReplicatedMergeTree::executeLogEntry(DB::ReplicatedMergeTreeLogEntry const&)+0x1bcf) [0x2a9b35f]
6. clickhouse-server() [0x2a9d22d]
7. clickhouse-server(DB::ReplicatedMergeTreeQueue::processEntry(std::function<std::shared_ptr<zkutil::ZooKeeper> ()>, std::shared_ptr<DB::ReplicatedMergeTreeLogEntry>&, std::function<bool (std::shared_ptr<DB::ReplicatedMergeTreeLogEntry>&)>)+0x4a) [0x2b263da]
8. clickhouse-server(DB::StorageReplicatedMergeTree::queueTask()+0x150) [0x2a88930]
9. clickhouse-server(DB::BackgroundProcessingPool::threadFunction()+0x3dc) [0x2b74edc]
10. clickhouse-server() [0x36d9f1f]
11. /lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba) [0x7fb04ab606ba]
12. /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7fb04a1813dd] -
-
Вставляли мы вставляли (одна запись в Кафке = 6 записей в КХб тоесть вставляли бодро, по млн в сек). Потом CPU упало и вставлять перестали.
-
Вот это по 1-2 за пару минут сокращается (такими темпами будет сокращаться до завтра)
SELECT
count(),
type
FROM system.replication_queue
GROUP BY type
┌─count()─┬─type────────┐
│ 347 │ MERGE_PARTS │
│ 1666 │ GET_PART │
└─────────┴─────────────┘
2 rows in set. Elapsed: 0.009 sec. Processed 2.01 thousand rows, 842.50 KB (219.60 thousand rows/s., 91.91 MB/s.) -
В ZK куча такого, но ничено с уровнем ERROR
2017-08-03 17:27:57,298 [myid:1] - INFO [ProcessThread(sid:1 cport:-1)::PrepRequestProcessor@596] - Got user-level KeeperException when processing sessionid:0x15da651c5ea0003 type:multi cxid:0x59974cf0 zxid:0x50058052f txntype:-1 reqpath:n/a aborting remaining multi ops. Error Path:/clickhouse/tables/01/measures/blocks/8002449562181767356_7724958680224753627 Error:KeeperErrorCode = NodeExists for /clickhouse/tables/01/measures/blocks/8002449562181767356_7724958680224753627
2017-08-03 19:44:31,096 [myid:1] - INFO [ProcessThread(sid:1 cport:-1)::PrepRequestProcessor@649] - Got user-level KeeperException when processing sessionid:0x15da651c5ea0001 type:setData cxid:0x598ef13a zxid:0x500682323 txntype:-1 reqpath:n/a Error Path:/clickhouse/tables/02/measures/block_numbers/201610/block-0000000702 Error:KeeperErrorCode = NoNode for /clickhouse/tables/02/measures/block_numbers/201610/block-0000000702 -
На вот такое OPTIMIZE TABLE measures PARTITION 201707 FINAL
Выдает
127.0.0.1. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Too much simultaneous queries. Maximum: 100. -
Я проде один запрос отправляю :) Он может размножается внутри
-
Вставку давно отрубил а очередь не двигается на вставку
SELECT *
FROM system.replicas
FORMAT Vertical
Row 1:
──────
database: default
table: measures
engine: ReplicatedMergeTree
is_leader: 0
is_readonly: 0
is_session_expired: 0
future_parts: 0
parts_to_check: 0
zookeeper_path: /clickhouse/tables/01/measures
replica_name: 1
replica_path: /clickhouse/tables/01/measures/replicas/1
columns_version: 0
queue_size: 1995
inserts_in_queue: 1649
merges_in_queue: 346
queue_oldest_time: 2017-08-03 18:49:23
inserts_oldest_time: 2017-08-03 18:49:23
merges_oldest_time: 2017-08-03 18:52:05
oldest_part_to_get: 20170502_20170502_11683_11683_0
oldest_part_to_merge_to: 20170502_20170502_11678_11866_8
log_max_index: 113596
log_pointer: 113597
last_queue_update: 2017-08-03 19:29:24
absolute_delay: 4502
total_replicas: 2
active_replicas: 2
1 rows in set. Elapsed: 0.003 sec. -
-
да
-
SELECT *
FROM system.clusters
┌─cluster─┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name──┬─host_address─┬─port─┬─is_local─┬─user────┬─default_database─┐
│ metrics │ 1 │ 1 │ 1 │ 10.1.1.251 │ 10.1.1.251 │ 9000 │ 1 │ default │ │
│ metrics │ 1 │ 1 │ 2 │ 10.1.1.145 │ 10.1.1.145 │ 9000 │ 1 │ default │ │
│ metrics │ 2 │ 1 │ 1 │ 10.1.1.86 │ 10.1.1.86 │ 9000 │ 0 │ default │ │
│ metrics │ 2 │ 1 │ 2 │ 10.1.1.94 │ 10.1.1.94 │ 9000 │ 0 │ default │ │
└─────────┴───────────┴──────────────┴─────────────┴────────────┴──────────────┴──────┴──────────┴─────────┴──────────────────┘
4 rows in set. Elapsed: 0.001 sec. -
Почему 2 с is_local 1 и 2 с 0? Что это вообще за флаг?
-
Вот нашел про local https://github.com/yandex/ClickHouse/blob/85f85af033e5251fdab7dafe15e91ef7edd71d89/dbms/src/Interpreters/Cluster.cpp#L37
Мне не поможет :)ClickHouse/ClickHouseClickHouse is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Если у шарда стоит is_local=1, то это просто означает, что IP машинки к которой вы сейчас подключились совпадает с одним из IP реплик данного шарда (с поправкой на мое замечание касательно default_database).
-
Есть вообще у кого работает распределенная реплицированная таблица под постоянной нагрузкой (но вставки не чаще раза в секунду)?
Или это только в теории работает и у ребят из Яндекса? -
Может не понял суть вопроса, у нас +- 15krps в кластер 6ти нод в хетзнере - 3реплики 3 шарда - год полет нормальный
-
Схема - как я описывал в статье на хабре
-
15krps мало.
-
хотя может у вас строки большие.
вот у меня не заводится. работает пару часов и дохнет -
Господа разработчики КХ пожалуйста сжальтесь надо мной и давате все пофиксим завтра :)
Спокойной ночи всем. -
че-т load_balancing не помогает при выборе лидирующей реплики при восстановлении упавшего сервера
- 04 August 2017 (316 messages)
-
За ночь ничего не восстановилось/синхронизировалось.
-
Буду сносить, ставить перед 4 серверами балансер и писать в локальные таблицы
-
может это спасет.
-
У меня 4 шарда по 2 реплики и все ок
-
пересоздал таблицы с такими же именами и сейчас в логах такое
2017.08.04 07:15:26.221481 [ 3 ] <Trace> Measures_Distributed.Distributed.DirectoryMonitor: Started processing /mnt/local/clickhouse/data/data/default/Measures_Distributed/default@10%2E1%2E1%2E86:9000,default@10%2E1%2E1%2E94:9000/4000.bin
2017.08.04 07:15:26.576287 [ 3 ] <Trace> Measures_Distributed.Distributed.DirectoryMonitor: Finished processing /mnt/local/clickhouse/data/data/default/Measures_Distributed/default@10%2E1%2E1%2E86:9000,default@10%2E1%2E1%2E94:9000/4000.bin
2017.08.04 07:15:26.576309 [ 3 ] <Trace> Measures_Distributed.Distributed.DirectoryMonitor: Started processing /mnt/local/clickhouse/data/data/default/Measures_Distributed/default@10%2E1%2E1%2E86:9000,default@10%2E1%2E1%2E94:9000/4002.bin
2017.08.04 07:15:26.947365 [ 3 ] <Trace> Measures_Distributed.Distributed.DirectoryMonitor: Finished processing /mnt/local/clickhouse/data/data/default/Measures_Distributed/default@10%2E1%2E1%2E86:9000,default@10%2E1%2E1%2E94:9000/4002.bin
2017.08.04 07:15:26.947388 [ 3 ] <Trace> Measures_Distributed.Distributed.DirectoryMonitor: Started processing /mnt/local/clickhouse/data/data/default/Measures_Distributed/default@10%2E1%2E1%2E86:9000,default@10%2E1%2E1%2E94:9000/4004.bin -
походу очнулось и начало что-то старое процессить
-
>У меня 4 шарда по 2 реплики и все ок
У меня первые 2 часа тоже было все ок под большой нагрузкой
А потом пошло все р разнос.
Расскажите подробнее что и сколько пишите -
На каждом сервере реплицируемая локальная таблица + поверх нее распределенная таблица. Когда потребуется перезаливка данных (такое иногда бывает, да), пишу в 100 потоков, примерно 6-7 млн в минуту (быстрее не получается, т.к. батчи совершенно разных размеров получаются от 10 строк до 1 000 000 строк), пишутся в основном интовые данные + несколько текстовых колонок. Такая нагрузка продолжается примерно в течение 3-4х часов. В это же время (наливки данных в КХ) происходят регулярные запросы на селекты, примерно по 10-15 запросов в секунду.
-
При этом все работает, CPU адекватный, IO тоже, сеть практически не кушается за счет gzip.
-
Было пару кейсов когда КХ жрал просто немеренное кол-во CPU и целая нода виртуализации падала, но это было из-за неверных настроек самой виртуалки.
-
Даже после таких падений в последствии запуска ноды, данные синхронизировались и никакого рассинхрона нет. Версия сервера 1.1.54246 собранная руками.
-
Три инстанса ZK поднято для репликации
-
У меня все очень похоже. 3 зукипера.
4 ноды, пишу 40-50млн в минуту пачками. 2 шарда по 2 реплики
2 часа все писало и было ок
потом что-то слетело, писать перестало и пошло рассинхронизироваться
запись остановил.
за ночь ничего не синхронизировалось. -
Вы пишите в распределенную таблицу?
-
А какими пачками пишите?
-
Да
-
пачки по 2млн
-
где-то 20-25 вставок в мин
-
Должно быть норм. А PK большой?
-
3 колонки
-
дата и 2 интовые
-
А гранулярность большая?
-
8192
-
Или вы не про это?
-
Не, я имел ввиду разброс значений индекса большой?
-
опять не понял
-
Например есть ClientID и их может быть миллион, а может быть 3 )
-
в индексе есть таймстамп
-
Я не так выразился ) Не проснулся
-
Как интовое поле?
-
или я
-
да
-
CREATE TABLE IF NOT EXISTS measures
(
account UInt32,
id UInt32,
date Date,
timestamp UInt32,
value Float32,
tags Nested (
name UInt32,
value UInt32
)
) Engine = ReplicatedMergeTree('/clickhouse/tables/01/measures', '1',date, (account, id, timestamp), 8192); -
Мне кажется лучше сделать DateTime, хотя могу ошибаться
-
но тогда мои запросы медленно пойдут
-
Почему?
-
я ж не зря время добавил
-
Я имею ввиду перевести колонку timestamp в тип DateTime
-
аа
-
А не UInt32 )
-
вы имеете в виду тип поменять?
-
Да
-
думаю ничего не изменится
-
Это чисто предположение
-
а на чем основанное?
-
интуиция?
-
Для КХ мне кажется роднее будет то, что связано как раз таки со временем )
-
Типа того )
-
понял
-
Вам данные нужно сортировать по таймштампу или фильтровать?
-
тут такая штука, мне сегодня или в пон давать ответ пойдет КХ в прод или нет
а тут с кластером повылазило куча всего и ответов нет
поэтому на интуицию не могу полагаться
мне с этим жить потом пару лет минимум -
сортировать и фильтровать
-
Мне кажется лучше так
ReplicatedMergeTree('/clickhouse/tables/01/measures', '1',date, (account, date ), 8192); -
убрать лишнее из ключа
-
так это не лишнее
-
Печально. Я бы на вашем месте все таки поигрался со структурой таблиц и по пробовал бы по разному строить запросы
-
Ребята я ж в ключ id тоже не просто так добавил
-
а мотому как быстрый скан по ключу и времени нужен
-
если я уберу то что эт ополучится
-
составной int ключь + дата ( без времени ) - так пробуйте
-
да и не должна ХЛ БД парать от нагрузки и так непонятно себя везти
-
ок допустим без времени сделал
записалось 2 месяца данных надо выбрать 3 часа
сканить все 2 месяца? -
ClickHouse Primary Keys
Recently I dived deep into ClickHouse. ClickHouse is column-store database by Yandex with great performance for analytical queries. For…
-
Я что то не понимаю или?
-
Так три часа выбрать можно через тот же prewhere
-
А потом уже все остальное выкидывать
-
например по account и timestamp сделать prewhere
-
ну если только там есть другие условия
-
тоесть вы хотите сказать что выкинув время и оставив только дату в PK я получу такую же скорость запросов?
-
Думаю да
-
Я сталкивался с кейсами когда по разному построенный запрос работал тоже по разному
-
но результат был одинаковый
-
причем разница была в десятки, а то и сотни раз )
-
Если вы не использете date - скорость падает в десятки / сотни раз
-
Кстати статья, которую скинули выше даст понимание того как КХ работает с индексом и появится более-менее нормальное представление как запросы строить
-
В статье @f1yegor все расписал
-
Попробовать можно конечно, но согласитесь должно работать и без всего этого и как то стремно брать в прод с таким поведением.
Надо или победить изначальную схему или отказываться. Бог знает на что я еще натолкнусь. -
Ну блин ) Любую БД можно сложить, даже ХЛ, если с ней неправильно обращаться )
-
Тут нужно понять почему это произошло )
-
Значит используйте Vertica )))
-
Igor Str правильно говорит, что отфильтровав данные по дате, которая в PK есть, останется не так много строк для обработки, там уже делайте что хотите )
-
Что значиит сложить?
Я понимаю если бы сторость просела
Но не так же умирать -
Вы заставили базу делать очень много лишних действий с таким ключем
-
Я как то 5 колонок натолкал в пк ) в том числе и таймштамп, потом разобрался с пк и все ок стало
-
Ок давайте попробую по порядку
1. убираем время из ключа
2. добавляем дату
3. переписываем запрос
можно переписать на этом примере?
SELECT (avg(value)), toInt64(timestamp/60)*60 as granularity FROM Measures_Distributed where account=169 and id=109 and timestamp>1501596000 and timestamp<1501740000 and arrayElement(tags.value,indexOf(tags.name,4))=11724 group by granularity order by granularity -
Добавьте в where date=today() - просто дату
-
и взлетит
-
Решение у меня - нужно последние 48 часов
event_date>=today()-2 AND timepoint_hour>=now()-(60*60*48) -
так
CREATE TABLE IF NOT EXISTS measures
(
account UInt32,
id UInt32,
date Date,
timestamp UInt32,
value Float32,
tags Nested (
name UInt32,
value UInt32
)
) Engine = ReplicatedMergeTree('/clickhouse/tables/01/measures', '1',date, (account, id, date), 8192); -
?
-
Да попробуйте так + еще можно попробовать ID выкинуть - зависит что меньше будет сканится
-
(account, date, id)
-
id порядка 2 тысяц
date 5-10 -
data вперед
-
У меня сейчас в пк всего три колонки, дата в самом начале стоит, потом все остальное
-
дата это включая день или только месяц?
-
мне наверное тоже ее логично вначала поставить тк ее вариативность меньше чем у остальных
-
Дата включя день
-
Все таки рекомендую вот эту статью почитать https://groups.google.com/forum/#!topic/clickhouse/eUrsP30VtSU. Алексей тут очень подробно рассказывает как работают ПК в КХ
-
Это даже не статья, а ответ )
-
Спсб попробую сейчас. Но все таки разобраться в тем что у меня было до этого надо.
Иначе никакой гарантии что с новой схемой оно не помрет через какое-то время -
пошел читать, спсб
-
Это как напихать в мускуль 10 индексов и писать туда тонну данных и не понимать почему скорость вставки данных просела )
-
Так понимаете было пы понятно если бы скорость просела
-
меня пугает что оно умерло вовсе
-
вставлять не дает
-
мержи не идут
-
опримизация не помогает
-
что в тако случае на проде делать?
-
Просто получается так, что КХ после вставки нужно отсортировать данные по ПК и разложить в нужные партиции
-
Я даже таблици дропнуть пол часа не мог
-
засыпало лог ошибками
-
ок
-
И из-за того, что там таймштамп и порядка 40 миллионов строк вставляется за минуту, то операция достаточно тяжелая )
-
я все понимаю, но ложиться без возможности восстановления не должно
-
Это безусловно так, да )
-
надеюсь мы поняли друг друга
я возможно неправильно использовал
неправильно сконфигурировал
при всем при этом 1 сервер работал как часы даже с временем в ключе без вопросов неделю
как только сделал кластер все поотваливалось
Так что я пока очень скептически отношусь к дате в ключе
И мне интересно неужели разработчикам КХ не итнересно почему 1 нода работает а 3-4 нет :) -
У многих тут кластера работают на ура
-
"Так что я пока очень скептически отношусь к дате в ключе" - зря, это придумали разработчики CH, а им виднее
-
Это все хорошо но объяснить почему работал 1 а не работают 4 в кластере никто не может
-
Создайте в google group или на гитхабе CH описание проблемы, думаю тогда разработчики пояснят
-
Хорошии совет спасибо
-
интерактивно конечно намного удобнее но видимо не получится
-
А можно как-то производительность синхронизации реплик увеличить?
А то вот это все время растет
queue_size: 1077
inserts_in_queue: 900
merges_in_queue: 177 -
сеть и процессор почти не загружены
-
queue_size: 3228
inserts_in_queue: 2684
merges_in_queue: 544
И все сдохло опять
Сейчас писал не в распределеннют таблицу а в локальные 4 через лоад балансер -
А структура таблицы поменялась?
-
в этом тесте нет
5 мин назад запустил с такой структурой -
CREATE TABLE IF NOT EXISTS measures
(
account UInt32,
id UInt32,
date Date,
timestamp UInt32,
value Float32,
tags Nested (
name UInt32,
value UInt32
)
) Engine = ReplicatedMergeTree('/clickhouse/tables/01/measures', '1',date, (date, account, id), 8192); -
надо подождать теперь часа 2
-
в прошлый раз легло где-то через 2-2.5
-
сейчас вставляю обратно через распределенную таблицу
-
-
так запрос же есть вверху
-
филскана нет вроде как
-
по крайней мере запросы отрабатывают быстро
-
и кол-во обработанных строк говорит что не фулскан
-
-
-
-
а вот без времени в ключе у меня будет все плохо с запросами походу
потому как придется 60 миллиардов строк сканить за день -
мне такие запросы не надо
-
а так да они будут фулскан
-
я на это сознательно иду
-
-
Тем кто советовал убрать время из ключа будет интересно наверное
было
2400 rows in set. Elapsed: 0.043 sec. Processed 3.17 million rows, 170.50 MB (73.01 million rows/s., 3.92 GB/s.)
стало
966 rows in set. Elapsed: 0.642 sec. Processed 16.49 million rows, 823.10 MB (25.67 million rows/s., 1.28 GB/s.)
Видно что просяду я неплохо по производительности, я бы даже сказал неприемлемо (кратно количество строк для сканирования возросло) -
А запрос какой?
-
SELECT (avg(value)), toInt64(timestamp/60)*60 as granularity FROM Measures_Distributed where account=169 and id=109 and arrayElement(tags.value,indexOf(tags.name,4))=11724 and date>'2017-08-01' group by granularity order by granularity
-
+ таймстампы
-
Только сейчас заметил, что в первом случае прочитано меньше строк
-
Попробуйте prewhere date > '2017-08-01'
-
и убрать date из where
-
ок
-
SELECT (avg(value)), toInt64(timestamp/60)*60 as granularity FROM Measures_Distributed where account=169 and id=109 and timestamp>1501664400 and timestamp<1501837200 and arrayElement(tags.value,indexOf(tags.name,4))=11724 and date>'2017-08-01' group by granularity order by granularity
535 rows in set. Elapsed: 0.223 sec. Processed 8.17 million rows, 519.13 MB (36.62 million rows/s., 2.33 GB/s.)
SELECT (avg(value)), toInt64(timestamp/60)*60 as granularity FROM Measures_Distributed prewhere date>'2017-08-01' where account=169 and id=109 and timestamp>1501664400 and timestamp<1501837200 and arrayElement(tags.value,indexOf(tags.name,4))=11724 group by granularity order by granularity
535 rows in set. Elapsed: 0.267 sec. Processed 8.15 million rows, 518.63 MB (30.50 million rows/s., 1.94 GB/s.) -
не помогло
-
Ну как не помогло :) В 2.5 раза быстрее заработало )
-
и на порядок медленней чем было со временем (учитываем что данных сейчас кот наплакал)
-
И не совсем понимаю профита от toInt64(timestamp/60)*60
-
это ни на что не влияет
-
осталось как мусор
-
Оооо, я вижу там timestamp в where
-
Пропустил
-
это плохо?
-
3 мин как остановлена вставка а колво все пляшет
-
ubuntu@pprod-spm-ch-3:/mnt/local$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
805047373
805047373
805047373
ubuntu@pprod-spm-ch-3:/mnt/local$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
805047373
805047373
811021532
ubuntu@pprod-spm-ch-3:/mnt/local$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
805047373
805047373
805047373
ubuntu@pprod-spm-ch-3:/mnt/local$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
811021532
805047373
805047373
ubuntu@pprod-spm-ch-3:/mnt/local$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
805047373
805047373
811021532
ubuntu@pprod-spm-ch-3:/mnt/local$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
805047373
805047373
805047373 -
Ппц, оно сойдетс или нет ваши ставки, ахаха
ubuntu@pprod-spm-ch-3:/mnt/local$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
811021532
805047373
805047373
ubuntu@pprod-spm-ch-3:/mnt/local$ for i in seq 3 5; do curl 'pprod-spm-ch-'$i':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
811021532
805047373
805047373 -
-
Всем привет. Подскажите пожалуйста, в чем причина такой ошибки при установке? (ubuntu16)
-
-
-
-
Спецы по КХ, подскажите пожалуйста. Есть данные, у данных есть два поля, по которым хочется искать независимо друг от друга (иногда по первому полю, иногда по второму), искать хочется очевидно как можно быстрее.
Какую лучше использовать схему в КХ? Составной ключ врядли поможет. Делать 2 таблицы с разными primary keys и в итоге дублировать данные? Еще как-то? -
Поиск по составному все равно быстрее будет чем фуллскан.
-
-
-
сейчас две таблицы, всё летает, но смущает дублирование данных
-
Покажите пример запросов
-
поэтому пока остановились на двух таблицах с разными PK
-
-
SELECT
ftype,
count() AS c
FROM ...
WHERE vexists = 1
GROUP BY ftype
ORDER BY c DESC
такое например -
в where может быть любое из двух интересующих полей
-
+1. Авторы CH советую дублировать данные, если это улучшает производительность
-
Ззначит мы на верном пути :)
-
спасибо
-
-
Так же возможно вам поможет это https://clickhouse.yandex/docs/ru/table_engines/aggregatingmergetree.html
-
спасибо, посмотрю
-
Добрый день , может есть у кого TCP коннектор для php ?
-
На сколько мне известно именно TCP нет. По крайней мере я не встречал
-
А чем вас curl не устраивает ?
-
ограничение по кол-ву передаваемых данных
-
Joined.
-
там, вроде, нет особых ограничений
-
Joined.
-
Добрый день, ребят можете кто-нибудь помочь как можно узнать статистику по таблице? Вроде того какая колонка больше всего занимает или где запрос тормозит
-
-
спасибо больоше :)
-
кто-то сталкивался с проблемой, что нужно сложить стринговые айдишники (цифры и буквы) более компактно?
-
а то уж больно много места отжирают
-
-
Стринговые в плане строка в которой шестнадцатеричные числа
-
ага
-
Для примера: 57cc2540558c52333c563a5c
-
-
-
А не подскажешь пожалйуста чем этот способ лучше?
-
-
А разве есть такой тип? Я вродде только смотрел. Возможно я что-тто упустил
-
-
-
я сейчас поиском по документации прошел и нет такого типа(
-
не задокументировали еще
-
В любом случае спасибо! Будем пробовать)
-
К вопросу что выгоднее int (*1000 например) или float
┌─table────┬─name──┬─type───┬─data_compressed_bytes─┬─data_uncompressed_bytes─┬─marks_bytes─┬──compression_rate─┐
│ measures │ value │ UInt64 │ 929445698 │ 5363178392 │ 1309648 │ 5.770297719964271 │
└──────────────────────┴───────┴────────┴───────────────────────┴─────────────────────────┴─────────────┴───────┘
┌─table────┬─name──┬─type────┬─data_compressed_bytes─┬─data_uncompressed_bytes─┬─marks_bytes─┬──compression_rate─┐
│ measures │ value │ Float32 │ 2518338746 │ 6651819960 │ 3248576 │ 2.641352348076846 │
└──────────┴───────┴─────────┴───────────────────────┴─────────────────────────┴─────────────┴───────────────────┘ -
-
Я бы сказал что компрессия работает отлично и пофиг что использовать или нужно мерять на выших данных.
Но однозначно советовать предостерегся бы -
,3,000-+
-
спасибо! Будем пробовать и эксперементировать, если кому интересны будут результаты то потом опишем :)
-
Данные досинхронизировались или так же пляшут?
-
Плясали час
-
Потом все снес нафиг и в N раз все сначала начал
Единственное что изменил это поменял в конфиге ip на hostname (Александр Ярославцев посоветовал за что ему большое спасибо, объяснить ни он ни я толком не можем, но вроде помогло, тьфутьфутьфу)
3 часа прошло, залило 5 млрд данных
Все синхронно пока, очередь на вставку не растет
Ошибок нет
Parts пляшкт вокруг
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 6; do curl 'pprod-spm-ch-'$i'.us.sematext.com:8123?query=select+count(*)+from+system.parts;'; done;
5843
6111
5713
5910
ЗЫ: Вернул timestamp в первичный ключ (без него тоска по запросам, не вижу преград почему он должен мешать). Пишу опять в распределенную таблицу, 2 шарды 2 реплики 4 сервера -
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 6; do curl 'pprod-spm-ch-'$i.us.sematext.com':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
5339916169
5339916169
5339916169
5339916169 -
-
Растущее потребление процессора при небольшом падении скорости вставки как я понимаю мержи.
И это клево ибо объяснимо -
Слава богу работает :) Возможно где то в кишках самого КХ есть трабл с хостнеймами. Он возможно берет хостнейм самой машины, а в конфиге кластера прописаны айпишники, но при просмотре таблицы clusters если мне не изменяет память показываются локальные хостнеймы...короче каша там какая то :) Так что лучше использовать хостнеймы вместо айпишек
-
У меня были проблемы с репликацией и именно это помогло
-
-
(offtop надо Ленина с пальцем добавить в телеграмм, заморскии этот человек зачем-то тут добавлен)
-
Joined.
-
-
Вопрос по arrayJoin. Есть таблица bar с полем foo типа Array(FixedString(16)).
Селект вида "SELECT notEmpty(foo) ? arrayJoin(foo) : toFixedString('', 16) FROM bar" приводит к "<Error> executeQuery: Code: 368, e.displayText() = DB::Exception: Bad cast from type N2DB12ColumnStringE to N2DB17ColumnFixedStringE" на сервере.
Версия 1.1.54245. Есть какие-либо другие варианты как сделать так, чтобы при использовании arrayJoin() можно было получить хотя бы одну запись в селекте, если массив foo пустой? -
При этом клиент отваливается со своим исключением - Exception on client:
Code: 89. DB::Exception: Unknown compression method: 105: while receiving packet from clickhouse-server:9000, 172.17.0.3 -
Всем привет.
А никто не занимется разработкой модуля clickhouse для rsyslog? -
Появилась мысля, собирать access логи с всех серверов в кликхаус
-
А для чего если. Есть ведь например тот же graylog
-
Наверное лень тратить время на инсталляцию\изучение грейлога. =)
-
-
Ставится докер за "5 минут"
-
Не все любят смузи)
-
Ну блин )
-
мы собираем так логи через rsyslogd. Он пересылает на сервис, который уже пишет логи в КХ
-
ну и таким же способом собираются логи с других приложений
-
Сервис самописный?
-
да, 200 строчек на го
-
Joined.
-
Сейчас прочитал полностью ваши сообщения за сегодня.
"No interserver IO endpoint" - это говорит о том, что соединение идёт не с репликой, а с каким-то другим сервером. Как будто перепутаны адреса. Для разбирательства надо смотреть полную конфигурацию кластера - какие есть серверы, с какими адресами, какие реплики на них созданы. Есть ли на сервере, где выводится такой лог, реплика с именем ноды /clickhouse/tables/01/measures/replicas/2 ? Если нет, то можно ли догадаться, почему на неё идёт запрос?
Реплики анонсируют свои адреса, по которым к ним могут обращаться другие реплики, в ZK в ноде .../host. Туда прописывается FQDN сервера, такой как он сам это определяет (аналогично результату команды hostname -f). Возможно, если что-то не так с конфигурацией сети, это приведёт к подобным эффектам. -
Да, FixedString(16) - лучший вариант. Главное не хранить в обычном String в текстовом виде.
-
Действительно, неверно работает. Надо разбираться.
-
А что в итоге - просто смена ip на host решила вообще всё?
-
И вопрос, замена где именно.
Варианты:
1. В interserver_http_host:
<!-- Hostname that is used by other replicas to request this server.
If not specified, than it is determined analoguous to 'hostname -f' command.
This setting could be used to switch replication to another network interface.
-->
<!--
<interserver_http_host>example.yandex.ru</interserver_http_host>
-->
(обычно его не требуется менять вообще, по-умолчанию берётся FQDN)
2. В конфигурации кластера для Distributed таблиц в секции remote_servers (влияет только на работу Distributed таблиц, но не на процесс репликации).
3. Где-то в системе. -
Вам спасибо, что помогли!
Правда тот же вопрос остаётся - когда у вас что-то не так работало, и вы заменили IP-адреса на имена, то где конкретно потребовалась эта замена, и с какими симптомами не работало? -
У меня не работала репликация впринципе. В логе были ошибки о том, что нода не найдена (не помню только где именно, в зк или кх логах). Кто-то из команды кх ответил мне и мы разобрались в проблеме, решение помогло!
-
Если нужно конкретней, то могу поднять архивы :)
-
Завел issue
-
А есть вариант как это сейчас обойти?
-
Можно преобразовать FixedString в String.
Пример:
CREATE TABLE test.array_fixedstring (x Array(FixedString(16))) ENGINE = Memory
INSERT INTO test.array_fixedstring VALUES (['hello', 'world'])
SELECT notEmpty(x) ? arrayJoin(x) : toFixedString('', 16) FROM test.array_fixedstring
- не работает.
SELECT notEmpty(x) ? arrayJoin(arrayMap(a -> toString(a), x)) : '' FROM test.array_fixedstring
- работает. -
Если нода не найдена - значит всё не работает сразу. А у Владимира кейс, что работало, а потом перестало. Может быть изменилась конфигурация сети?
-
Мы с ним общались днем, на обном сервере все ок работало, потом он поднял кластер и начались проблемы, причем он пытался сделать кросс-репликацию, которая у него не завелась
-
Вобщем после конфигурации кластера с хостнеймами вместо ip адресов проблема вроде решилась. По крайней мере он больше не говорил о проблемах
-
Привет всем.
хотел два вопроса задать
- есть таблица в которой 20 полей поиск идет по одному полю, из этой таблице нужно только 3 поля
будет ли идти поиск быстрее если таблицу сократить до 3 полей, включая поле по которому идет поиск?
я правильно понимаю что чуда не произойдет и скорость поиска будет такой же?
- насколько быстрее будет проходить запрос если данные поместить в РАМ?
Спасибо -
1) если они не выбираются и не читаются, то разницы вообще не должно быть.
-
2) На тяжелых запросах не проверял, но использование uncomressed_cache сокращало время мелких запросов не так сильно как хотелось бы, что-то типа 34ms -> 26ms. Но я думаю тут не только на выборку время потрачено.
-
> - насколько быстрее будет проходить запрос если данные поместить в РАМ?
Как правило, существенно быстрее. В общем случае зависит от сложности запроса и от производительности дисковой подсистемы. Вручную помещать данные в оперативку обычно не требуется, так как используется page cache, что позволяет иметь "горячие" данные в оперативке. -
-
-
С одной стороны надо учитывать, что строки постоянно переупорядочиваются при слияниях. Это ограничивает применимость номера строки, хотя польза всё-равно есть для некоторых приложений.
Также вопрос, нужен ли именно номер, или только некоторое значение, которое соответствует порядку строк. Второе проще.
Совсем простым способом добавить номер строки в MergeTreeReader не получится, но в принципе, добавить не так уж сложно. Нужно всего лишь прокинуть туда минимальный номер строки в каждом part-е, который вычислять из размера меньших по порядку part-ов. -
Было бы полезно получить номер строки именно в выдаче. Например я выбираю строки с сортировкой, агрегацией и пр. и хочу использовать номер строки в результирующем ответе, например 1,2,3,4 для дальнейших манипуляций
-
-
Для манипуляций именно в КХ, не на уроне приложения
-
Это можно получить так:
SELECT rowNumberInAllBlocks(), * FROM (your query) -
Те номер строки в readImpl ? Это именно то что я добиваюсь.
-
оО я думал, что эта функция по другому работает. Результат детерменирован?
-
Я имею ввиду, что при распределенном чтении, номер строки будет всегда одинаковый при одинаковом результате?
-
Да, у меня были кейсы, когда в процессе агрегации мне нужно было использовать номер строки именно в результирующем наборе данных. Не номер строки где то в БД целиком, типа 231, 444, 572, а именно 1,2,3 и т.д.
-
Если в результате будет 100 строк, то нумерация должна быть от 1 до 100
-
-
Я полагаю это можно очень просто добавить, но моих навыков в cpp недостаточно :) Поэтому остается либо ждать, либо все таки начинать разбираться и потом присылать PR
-
Если в подзапросе есть детерминированный ORDER BY, то да.
-
Использовать в процессе агрегации номер строки, который получился бы в результате, нет возможности.
-
Имеется ввиду другое. Например
select avg, rowNumber() from (select avg(value) as avg from table group by column) -
Типа как то так. И на выходе я например получаю
avg rowNumber()
12 1
33 2
23 3
77 4 -
Но я думаю, будет не совсем честно делать такую функцию, которая работает только поверх агрегации
-
Лишний раз заворачивать в подзапрос - не совсем удобно
-
Есть функции rowNumberInBlock, blockNumber, rowNumberInAllBlocks.
Результат работы всех этих функций зависит от того, на какой стадии в конвейере выполнения запроса они выполняются, от разбиения данных на блоки при обработке. А blockNumber, rowNumberInAllBlocks - ещё и от порядка обработки блоков.
rowNumberInBlock даёт номер строки в блоке. Начиная с нуля. Для каждого блока независимо. -
Да, сам в шоке.
-
Опять же, мне кажется, что прокидывать номер строки в readImpl было бы супер, а rowNumber просто возвращала бы это число. Лучше чем виртуальная колонка i кажется. Ну и главное, это шаг в сторону window-join или window-функций.
-
Кстати, как там дела? Данны до сих пор льются без проблем?
-
1 На всех машинках задал hostname
2 Прописал в dns
3 Поменял ip на имена в remote servers
все -
Понять бы что это было, ну или какие признаки, так как не ясна ни проблема ни объяснение решения :)
-
Так да
-
Вопрос открыт
-
Хорошо что заработало но почему непонятно
-
все что делал и тестил писал тут в режиме реального времени и конфиги выкладывал
-
могу history из сервера выложить :)
-
Я думаю есть смысл это оформить в issue с описанием временного решения до тех пор пока не разберутся и не пофиксят, что бы другие в такое не впарывались
-
Сейчас пришел все ок
Влило 9млрд строк и продолжает работать
очередей нет
parts до 1000.
зы конфигурация сети не менялась (чуть что все это запускалось AWS VPN) -
Вот тут видно как мы выгребли интенсивно все из Кафки что там было и пошли выгребать со скоростью вставки
-
Если в SELECT условия с большей гранулярностью, чем дни (например, пол дня), то разумно иметь время в первичном ключе.
При этом в запросах следует писать условия и на время (первичный ключ) и на ключ даты, который обязательный для MergeTree. Ключ даты отвечает за выбор кусков для чтения. Для каждого куска будет просканирован какой-то (хоть минимальный) объём записей, поэтому отсутствие условия на дату негативно влияет на latency.
Если в первичном ключе есть timestamp с точностью до секунд, то указывать в нём что-то после timestamp бесполезно. То есть, первичный ключ будет заканчиваться на timestamp. -
-
> parts до 1000
Имеет смысл смотреть SELECT count() FROM system.parts WHERE active
- условие на active выбирает куски, которые активные для запросов. Остальные куски некоторое время держатся после мержей, а потом удаляются.
Или даже так:
SELECT partition, count() FROM system.parts WHERE active GROUP BY partition ORDER BY partition -
я делал так
SELECT bytes FROM system.parts WHERE active order by bytes desc limit 2000; -
Если в первичном ключе есть timestamp с точностью до секунд, то указывать в нём что-то после timestamp бесполезно. То есть, первичный ключ будет заканчиваться на timestamp.
такое бесполезно?
(zzz, timestamp, ddd, yyy)?
А если дисперсия ddd огромна? -
Может быть полезна в очень редких случаях - если за одну секунду - для конкретного значения zzz, timestamp есть хотя бы миллионы записей. Только тогда условие на ddd позволит эффективно пропускать диапазоны в рамках конкретного zzz, timestamp.
-
Ок, вроде все понятно
Спсб -
Если хотите могу вернуть IP и будет возможность посмотреть что за баг был
Только не сегодня плиз -
У нас была похожая проблема, когда при установке нового сервера была помещена какая-то запись в /etc/hosts, потом она была не нужна, но осталась. И через некоторое время эта запись стала неверной.
-
Пока детально непонятно но рецепт такое
1. Если у вас растет очередь на вставки в реплики ( select * from system.replicas format Vertical » inserts_in_queue: 0)
2. Если у вас растат неконтролируемо количество parts (SELECT partition, count() FROM system.parts WHERE active GROUP BY partition ORDER BY partition)
3. Если у вас куча такого в логах
2017.08.04 10:13:12.511175 [ 39 ] <Debug> default.measures (StorageReplicatedMergeTree): Fetching part 20161202_20161207_104_104_0 from /clickhouse/tables/02/measures/replicas/2
2017.08.04 10:13:12.511362 [ 39 ] <Trace> ReadWriteBufferFromHTTP: Sending request to http://localhost:9009/?endpoint=DataPartsExchange:%2Fclickhouse%2Ftables%2F02%2Fmeasures%2Freplicas%2F2&part=20161202_20161207_104_104_0&shard=&compress=false
2017.08.04 10:13:12.511506 [ 4079 ] <Trace> InterserverIOHTTPHandler-factory: HTTP Request for InterserverIOHTTPHandler-factory. Method: POST, Address: 127.0.0.1:32894, User-Agent: none
2017.08.04 10:13:12.511534 [ 4079 ] <Trace> InterserverIOHTTPHandler: Request URI: ?endpoint=DataPartsExchange:%2Fclickhouse%2Ftables%2F02%2Fmeasures%2Freplicas%2F2&part=20161202_20161207_104_104_0&shard=&compress=false
2017.08.04 10:13:12.519303 [ 4079 ] <Error> InterserverIOHTTPHandler: Code: 221, e.displayText() = DB::Exception: No interserver IO endpoint named DataPartsExchange:/clickhouse/tables/02/measures/replicas/2, e.what() = DB::Exception, Stack trace:
0. clickhouse-server(StackTrace::StackTrace()+0x16) [0x29b2626]
1. clickhouse-server(DB::Exception::Exception(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)+0x1f) [0x10b079f]
2. clickhouse-server(DB::InterserverIOHTTPHandler::processQuery(Poco::Net::HTTPServerRequest&, Poco::Net::HTTPServerResponse&)+0xbc8) [0x10cdd28]
3. clickhouse-server(DB::InterserverIOHTTPHandler::handleRequest(Poco::Net::HTTPServerRequest&, Poco::Net::HTTPServerResponse&)+0x4b) [0x10ce98b]
4. clickhouse-server(Poco::Net::HTTPServerConnection::run()+0x2fe) [0x32bf69e]
5. clickhouse-server(Poco::Net::TCPServerConnection::start()+0xf) [0x32b47af]
6. clickhouse-server(Poco::Net::TCPServerDispatcher::run()+0x13b) [0x32babeb]
7. clickhouse-server(Poco::PooledThread::run()+0xb7) [0x3525be7]
8. clickhouse-server(Poco::ThreadImpl::runnableEntry(void*)+0xa5) [0x34f1c25]
9. /lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba) [0x7f16979386ba]
10. /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7f1696f593dd]
2017.08.04 10:13:12.530746 [ 39 ] <Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 33, e.displayText() = DB::Exception: Cannot read all data, e.what() = DB::Exception, Stack trace: -
Vladimir Tretyakov, [04.08.17 12:13]
0. clickhouse-server(StackTrace::StackTrace()+0x16) [0x29b2626]
1. clickhouse-server(DB::Exception::Exception(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)+0x1f) [0x10b079f]
2. clickhouse-server(DB::DataPartsExchange::Fetcher::fetchPartImpl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)+0x1cc7) [0x2bb1cb7]
3. clickhouse-server(DB::DataPartsExchange::Fetcher::fetchPart(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool)+0x76) [0x2bb2766]
4. clickhouse-server(DB::StorageReplicatedMergeTree::fetchPart(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, unsigned long)+0x25a) [0x2a98b1a]
5. clickhouse-server(DB::StorageReplicatedMergeTree::executeLogEntry(DB::ReplicatedMergeTreeLogEntry const&)+0x1bcf) [0x2a9b35f]
6. clickhouse-server() [0x2a9d22d]
7. clickhouse-server(DB::ReplicatedMergeTreeQueue::processEntry(std::function<std::shared_ptr<zkutil::ZooKeeper> ()>, std::shared_ptr<DB::ReplicatedMergeTreeLogEntry>&, std::function<bool (std::shared_ptr<DB::ReplicatedMergeTreeLogEntry>&)>)+0x4a) [0x2b263da]
8. clickhouse-server(DB::StorageReplicatedMergeTree::queueTask()+0x150) [0x2a88930]
9. clickhouse-server(DB::BackgroundProcessingPool::threadFunction()+0x3dc) [0x2b74edc]
10. clickhouse-server() [0x36d9f1f]
11. /lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba) [0x7f16979386ba]
12. /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7f1696f593dd]
Смотрите что-то с именами или IP серверов
Перепроверьте что ничего подозрительного нет в /etc/hosts что /etc/hostname прописанно правильно и в конфигах CH тоже все имена правильные. -
-
Нет в планах до конца года.
-
-
В этом вроде как update / delete планируется впилить
-
Судя по roadmap
-
Вот это было бы просто неоценимо
-
Тоже очень ждем. Но согласно роадмапу это вроде q1 2018
-
- 05 August 2017 (85 messages)
-
Подождем - увидим. Хотя конечно хотелось бы заранее узнать как оно планируется.
-
Всем привет, не сделал ли случайно кто нибудь уже какую нибудь систему у правления конфигами clickhouse ?
ну вот типовая задача "добавить ноду в кластер"?
там же надо везде прописывать в config.xml <remote_servers>? может это кто-то автоматизировал уже? -
Произвольное партиционирование и update, delete строк и я готов буду поклоняться Алексею и команде )
-
Вот нам бы тоже именно такое. Хотя мы и просто на update/delete согласны. :)
-
У нас просто получается так, что факты мы вычисляем и периодически пишем в мускуль из-за отсутствия собственно обновления и удаления строк. У нас очень хитрая логика вычисления фактов и некоторые агрегации приходится делать в mysql, который к слову не очень хорошо себя ведет в этом направлении
-
Makefile)
-
каждый раз когда русскоязычный программист в русскоязычном чате импульсивно и неконструктивно включает sarcasm mode, в мире появляется еще 100 китайских программистов, которые в итоге таки напишут кривой и косой ИИ, который оставит детей именно этого программиста без средств к существованию, либо именно этого программиста без работы ;)
-
:D :D :D
-
это был не сарказм. Makefile может решить Ваши проблемы без написания дополнительного ПО
-
ну так то и обычный bash все эти проблемы решит, да, я даже знаю как, но знаете, как то за 20 лет устал уже как то дубасить все что вижу вокруг одним и тем же молотком, хочется какой нибудь более специфичный 3Д принтер
-
с другой стороны, если вы пришлете ссылку на github с примером Makefile который хотя бы приблизительно решает задачу "раскидать новый config.xml" на 10-20 хостов полученных из zookeeper, то буду благодарен
-
может тут всеж смотреть на что-то вроде ansible/puppet/chef?
-
мы делаем это с помощью ansible
-
вот прекрасно, это я хотел услышать. а вы случайно не публикуете роли для этого ansible для управления clickhouse ?
-
где нибудь в github?
или там все "проектно-специфическое" оторвать не получится? -
ды... пока не доводилось. не уверен что мои роли прям достойны общественного внимания в виде гитхаб репы
-
но если интерес есть...
-
вообще там никакой особой специфика CH нет
-
Интерес есть
-
и наше внутренней специфики нет
-
и есть еще что улучшать
-
но в общем вполне рабочее
-
сегодня постараюсь выложить тогда и закину сюда ссыль
-
ну почему нет?
ну вот типичная задача "добавить ноду в кластер"
она же требует чего то вроде
1) катим роль на новую ноду, указав ей zookeeper
2) ждем когда CH на новой ноде появится в Zookeper
3) генерим по zookeper новый config.xml в части remote_servers
4) раскатываем этот xml по всем нодам
5) ждем когда CH на всех нодах перечитает конфиг (или шлем sighub ?) -
ты хочешь прям роль по добавлению узла в кластер?
-
почему ты хочешь из зукипера брать конфиг?
-
не очень понимаю
-
почему не из текущего инвентори ansible
-
да, согласен, мысль более правильная юзать inventory ansible
там же не обязательно чтобы в config.xml все хосты были "живыми", надо просто общую конфигурацию кластера генерть -
-
как я понял, это такой вотчдог простой
-
который переподнимает CH если тот упал
-
Добрый день. Помогите, пожалуйста, с импортом.
Импортирую TabSeparated таблицу с городами, выгруженными из MySQL.
Встречаются Null-значения для столбца регионов (UInt32) и столбцов с их именами (String).
В тексте импортируемого файла они как "\N". Как их загрузить?
Может, можно как-то поддержку Null у столбцов указывать? Движок таблицы сейчас Log
Возникает следующая ошибка:
# zcat _cities.txt.gz | clickhouse-client —query="INSERT INTO geodata._cities_log FORMAT TabSeparated"
Code: 27. DB::Exception: Cannot parse input: expected \t before: \\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМо▒: (at row 1)
Row 1:
Column 0, name: city_id, type: UInt32, parsed text: "1"
Column 1, name: country_id, type: UInt32, parsed text: "1"
Column 2, name: important, type: UInt8, parsed text: "1"
Column 3, name: region_id, type: UInt32, ERROR: text "<BACKSLASH>N<TAB>Мос▒" is not like UInt32 -
ClickHouse вообще умеет Null ?
-
Можно, где то в тестах в репозитории кх есть пример с nullable колонками, но они еще в бете (последняя информация была такой). Точно не могу скинуть как сделать nullable, с телефонп не совсем удобно искать
-
Спасибо, Александр, будем посмотреть
-
yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data.
-
Нашел
-
Синтаксис понял, спасибо большое!
-
Я лично нулы не использую, пишу 0 или пустую строку
-
Я явно указываю дефолты: для чисел 0, длядат - 0000-00-00 и т.п
-
Для колонок, где нет значений
-
Прокатило с Nullable(UInt32) и Nullable(String). А что, можно было при импорте указать, какое значение на какое менять?
-
Спасибо!
-
-
кто нибудь работал с этим драйвером
https://github.com/kshvakov/clickhouse
в кластере?
там можно как нибудь сделать запрос на создание локальных таблиц в каждой ноде кластера?GitHub - ClickHouse/clickhouse-go: Golang driver for ClickHouseGolang driver for ClickHouse. Contribute to ClickHouse/clickhouse-go development by creating an account on GitHub.
-
просто драйвер от ROI-stat не умеет авторизацию... а драйвер от Кирила, похоже любой запрос пробрасывает только на одну ноду из кластера?
-
Для UInt - 0
Для Date - 0000-00-00
Для строк - '' -
"а драйвер от Кирила, похоже любой запрос пробрасывает только на одну ноду из кластера" - чтобы запрос задействовал весь кластер, нужно делать его к Disturbed-таблице
-
и какой синтаксис для таких преобразований при импорте? в каком запросе указывается такое соответствие?
-
В коде, который генерирует данные
-
т.е. в коде MySQL ? чё-то не хочется
-
Тогда jdbc-драйвер не будет подставлять \N для пустых колонок
-
Опишите, как данные попадают из MySQL в CH
-
Они выгружаются в файл силами mysqldump с ключом —tab, что означает в ClickHouse TabSeparated values.
Далее гзипуются и передаются на vps. И импортируются так
zcat _cities.txt.gz | clickhouse-client —query="INSERT INTO geodata._cities_log FORMAT TabSeparated"
Задача эта уже решена, если что, правильным созданием таблицы - с полями, позволяющими Null.
Т.е. помощи уже пока не нужно.
Сейчас проблема в том, что оперативки VPS у не хватает, так что буду скриптить разбиение данных на части.
Далее вангуется проблема с переносом из Log в MergeTree, т.к. там не нужное доп.поле EventDate. -
Хорошо. По поводу перехода на MergeTree - вообще нет никакого поля с датой?
-
да, нету. И функцией её не хочет ипортировать.
Тренировался на регионах (их меньше) и такое не прокатило:
INSERT INTO geodata._regions SELECT today() as EventDate, * FROM geodata._regions_log;
таблицы отличаются только движком и отсутствием даты в _regions_log
INSERT INTO geodata._regions SELECT
today() AS EventDate,
*
FROM geodata._regions_log
Ok.
0 rows in set. Elapsed: 0.025 sec. Processed 3.72 thousand rows, 1.48 MB (150.20 thousand rows/s., 59.73 MB/s.)
:) -
при этом селект отдельно от инсерта - работает
-
Может попробовать сделать дефолт для EventDate
https://clickhouse.yandex/docs/ru/query_language/queries.html#id2
Типа такого
CREATE TABLE ...
(
EventDate DEFAULT today()
...
) Engine=MergeTree(...)
?
А при интсерте в запросе с INSERT INTO указать явно все столбцы, без EventDate -
последнее пробовал - результат такой же. А пересоздать таблицу попробую, спасибо
-
Правда могут возникнуть проблемы с партицирование, поскольку при ручной заливке данных у всех строк будет одна и та же дата
-
я ещё не понял, что такое партицирование, поэтому пока не вижу проблем)))
-
Почитайте, зачем нужно поле EventDate
https://clickhouse.yandex/docs/ru/table_engines/mergetree.html
, возможно при небольшом размере данных, один большой "кусочек" не будет проблемой -
Вот ещё на тему партиций
https://clickhouse.yandex/docs/ru/query_language/queries.html?highlight=%D0%BF%D0%B0%D1%80%D1%82%D0%B8%D1%86%D0%B8%D1%8F#id5 -
Спасибо. В первом описании ещё и слово "семплирование" используется, поэтому слово "партицирование" пока для меня недоступно) Я как-то с этими словами в музыке больше знаком. Боюсь, придётся исходники читать.
-
Добрый день. А как так получается, что по айди ищет, а по строке нет ( = и LIKE ) ? Значение строки при этом называет идентификатором. Что я делаю не так?
select city_id, name_ru from _cities_log where city_id=1 limit 1
SELECT
city_id,
name_ru
FROM _cities_log
WHERE city_id = 1
LIMIT 1
┌─city_id─┬─name_ru─┐
│ 1 │ Москва │
└─────────┴─────────┘
1 rows in set. Elapsed: 0.017 sec. Processed 65.54 thousand rows, 2.06 MB (3.77 million rows/s., 118.61 MB/s.)
:) select city_id, name_ru from _cities_log where name_ru="Москва" limit 1
SELECT
city_id,
name_ru
FROM _cities_log
WHERE name_ru = Москва
LIMIT 1
Received exception from server:
Code: 47. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Unknown identifier: Москва.
0 rows in set. Elapsed: 0.031 sec. -
Кавычки должны быть одинарные
select city_id, name_ru from _cities_log where name_ru='Москва' limit 1 -
получилось, спасибо!
-
Create table on cluster
-
Кх добавили ddl
-
Joined.
-
Joined.
-
Всем привет! Столкнулись с проблемой — не можем найти решение. Стал зависать один запрос с FINAL по CollapsingMergeTree, доходит до 9% с хорошей скоростью и всё. KILL QUERY он не убивается, по таймауту не отлетает, так и висит. Спасает только рестарт сервера. В err.log ничего нет, куда копать? Без FINAL он выполняется.
-
Joined.
-
Это интересно. Какая версия сервера?
-
Кстати, final не меняет состояние данных в таблице? Я имею ввиду он не как optimize срабатывает?
-
Не меняет.
-
-
-
-
Да, это проблема той testing версии. Можете обновить на последний testing и проблема исправится.
-
-
-
Насколько я помню, сжимаются блоки с данными Native формата, а всё остальное (всякие номера пакетов и т. п.) передаётся без сжатия.
Сжатые данные устроены так. Они представляют собой набор сжатых фреймов. Каждый фрейм имеет следующий вид: чексумма (16 байт), идентификатор алгоритма сжатия (1 байт), размер сжатых данных (4 байта, little endian, размер не включает в себя чексумму, но включает в себя остальные 9 байт заголовка), размер несжатых данных (4 байта, little endian), затем сжатые данные. Идентификатор алгоритма: 0x82 - lz4, 0x90 - zstd. Чексумма - CityHash128 из CityHash версии 1.0.2, вычисленный от сжатых данных с учётом 9 байт заголовка.
См. CompressedReadBufferBase, CompressedWriteBuffer,
utils/compressor, TCPHandler. -
- 06 August 2017 (34 messages)
-
-
-
А кто подскажет как через insert values записать Nested? Просто как массив передавать?
Типа [[val, val], [val, val]]? -
Разобрался :)
-
Joined.
-
(Оффтоп) А кто-то настраивал интеграцию метрики с КХ? У меня вообще никак не заводится :( Что я могу делать не так? https://github.com/yndx-metrika/logs_api_integration/issues/9Другая ошибка а разборе данных · Issue #9 · yndx-metrika/logs_api_integration
Добрый день, Столкнулись с проблемой: при загрузке КХ не может разобрать входные данные. DB::Exception: Cannot parse input: expected \n before: \tym:s:date\tym:s:dateTime\tym:s:goalsID\tym:s:isNewU...
-
ну только вчера пробовал не было проблем, мб версия кликхауса влияет?
-
-
python 2.7.10
ClickHouse 1.1.54245 -
-
-
-
скачал кусок с метрики запросом wget https://api-metrika.yandex.ru/management/v1/counter/3199561/logrequest/194328/part/1/download?auth_token=xxx -O c1, загружается руками cat c1 | sed "1d" | clickhouse-client --query="insert into qwe1.hits_all FORMAT TabSeparated" :) видимо вопрос к скрипту загрузки
-
При вставке CSV форматом получаю ошибку:
Cannot parse quoted string: expected opening quote: (at row 1)
Row 1:
Column 0, name: EventDate, type: Date, parsed text: "<DOUBLE QUOTE>2017-06-15<DOUBLE QUOTE>"
Column 1, name: EventTime, type: DateTime, parsed text: "<DOUBLE QUOTE>2017-06-15 23:00:30<DOUBLE QUOTE>"
Column 2, name: EventType, type: String, parsed text: "<DOUBLE QUOTE>EntitiesAggregationStarted<DOUBLE QUOTE>"
Column 3, name: Tags.Name, type: Array(String), parsed text: "<DOUBLE QUOTE>[<SINGLE QUOTE>CourseId<SINGLE QUOTE>, <SINGLE QUOTE>Facts<SINGLE QUOTE>]<DOUBLE QUOTE>"
Column 4, name: Tags.Value, type: Array(String), parsed text: <EMPTY>ERROR
Вот собственно строка:
"2017-06-15","2017-06-15 23:00:30","EntitiesAggregationStarted","['CourseId', 'Facts']","['2', ['result','progress']]"
Я правильно понял, что почему то КХ не может спарсить открывающиеся кавычки? Только вопрос почему, если все обернуто кавычками. -
Кавычки двойные нужны а не одинарные
-
Т.е. везде вообще должны быть двойные?
-
У меня одинарные внутри двойных
-
"['2', ['result','progress']]" - вот например
-
Там кавычки не взаимозаменяемые
-
Что-то какой то бред. Если у меня будет там формат колонки String в котором одинарные кавычки, то я их не смогу вписать что ли? )
-
Может заслэшить?
-
['2', ['result','progress']]
- это получается не Array(String), так как в массиве разные типы элементов - сначала идёт строка '2', а потом ещё один массив. -
Блин, вот дурень. Сори за беспокойство! Сейчас поправлю и проверю, спасибо!
-
Joined.
-
Всем привет.
А подскажите, плиз, задача - сделать топ сайтов по посещаемости и узнать позицию нужного сайта в этом топе.
select site,count() as cnt,if(site='aaa.ru',1,0) as outsite from table group by site order by cnt
так получаем топ.
А как можно узнать позицию, допустим сайта aaa.ru?
В голову приходят только варианты с join с system.numbers, но что указать в using не понятно.
Переменные в КХ, вроде как отсутствуют.
Получается единственный вариант - выгрузка всего топа на клиент и там определение позиции? -
О! Нашел rowNumberInAllBlocks, похоже то что нужно
-
о, точняк
-
Теперь интереснее задача.
А как получить не только позицию, а 3 сайты выше в топе и 3 ниже?
Пока только такое в голову приходит...
https://pastebin.com/DBVnQVNZ
Правильно ли я понимаю, что в этом случае нагрузка будет х3, по сравнению, с вариантом выгрузки всего топа на клиент? -
мне кажется, что уже разумно как-то с блоками поиграть
-
т.е. в сторону runningAccumulate?
-
Я бы лучше на стороне клиента сделал простую пост-обработку.
-
топ 3м записей получается, мне кажется по сети будет больно тянуть такой объем
-
Сохраните топ во временную таблицу. А потом уже несложный запрос будет.
-
О! Отличный план. Спасибо!
Что-то был уверен, что в clickhouse еще нет сессий - 07 August 2017 (88 messages)
-
Joined.
-
Привет всем, как вы обходитесь без autoincrement? имеете внешний счетчик? или тупо SELECT MAX(id) from t перед BATCH insert :)
-
В наших таблицах нет колонки id
-
может у других есть?
-
У нас есть столбец с id, но он не autoincrement, а некий идентификатор, генерирующийся снаружи на разных машинах независимо.
-
random int64?)
-
а понял
-
считай просто внешний счетчик..
-
во время ETL думал изменять логику equality сущности
-
и соотвественно в таком случаи я уже не смогу опираться на айди из исходной системы
-
так как CH это не транзакционная БД, то видимо надо писать только с одного потока если использовать workaround SELECT MAX(id) from t?
-
чтобы исключить конфликт по id
-
MAX(id) FROM t будет медленно работать - full scan.
Есть несколько вариантов, как сделать инкрементный идентификатор:
1. Хранить счётчик в отдельной системе (например, в Redis);
2. На разных серверах, которые записывают данные, иметь смещение и множитель, и генерировать идентификаторы с учётом этого; -
А если id - в primary key первый?
-
Не поможет - нет оптимизации для такого случая.
-
-
Спасибо за полезную информацию
-
Да, не смотрит.
-
Там типы полей для версии браузера криво заданы
-
Я из файла вставляю данные
-
в файле версия браузера 21.0 а для нее в python коде например заведен INT
- "ym:s:browserMajorVersion": "UInt16",
- "ym:s:browserMinorVersion": "UInt16",
+ "ym:s:browserMajorVersion": "String",
+ "ym:s:browserMinorVersion": "String", -
ch_types.json
смотрите -
Вы наверное меня с кем то спутали :) Я не использую python и ничего связанного с логами метрики :)
-
Зато у тебя были проблемы с репликацией) как в итоге решил вопрос? Прописал хостнейм вместо айпишников?
-
У меня была проблема с тем, что нода КХ биндилась на локальный хостнейм, а в конфиге были прописаны айпишники и из-за этого какая то фигня была в ЗК и самом КХ.
-
А так, да, прописал хостнеймы и настроил зону просто, что бы серевра друг о друге знали.
-
Да. Вчера с таким же столкнулся.
-
Была подобная проблема у Виталия Третьякова, но у него была проблема накапливания тасков репликации и мерджи проходили очень медленно. Прописывание хостнеймов в конфигах помогло решить проблему.
-
Joined.
-
Спасибо. Почитал.
-
SegFault, здравствуйте! :)
-
2017.08.07 12:20:02.827582 [ 2011721 ] <Error> BaseDaemon: ########################################
2017.08.07 12:20:02.827603 [ 2011721 ] <Error> BaseDaemon: (from thread 57) Received signal Segmentation fault (11).
2017.08.07 12:20:02.827608 [ 2011721 ] <Error> BaseDaemon: Address: NULL pointer.
2017.08.07 12:20:02.835943 [ 2011721 ] <Error> BaseDaemon: 1. clickhouse-server(DB::Context::addExternalTable(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<DB::IStorage>)+0x22e) [0x298bd1e]
2017.08.07 12:20:02.835950 [ 2011721 ] <Error> BaseDaemon: 2. clickhouse-server(DB::TCPHandler::receiveData()+0x3ce) [0x10cb5fe]
2017.08.07 12:20:02.835955 [ 2011721 ] <Error> BaseDaemon: 3. clickhouse-server(DB::TCPHandler::receivePacket()+0x1e1) [0x10cb9f1]
2017.08.07 12:20:02.835961 [ 2011721 ] <Error> BaseDaemon: 4. clickhouse-server(DB::TCPHandler::readData(DB::Settings const&)+0x1a9) [0x10cbd79]
2017.08.07 12:20:02.835966 [ 2011721 ] <Error> BaseDaemon: 5. clickhouse-server(DB::TCPHandler::runImpl()+0x7ea) [0x10cca1a]
2017.08.07 12:20:02.835976 [ 2011721 ] <Error> BaseDaemon: 6. clickhouse-server(DB::TCPHandler::run()+0x2b) [0x10cd45b]
2017.08.07 12:20:02.835981 [ 2011721 ] <Error> BaseDaemon: 7. clickhouse-server(Poco::Net::TCPServerConnection::start()+0xf) [0x32c6a3f]
2017.08.07 12:20:02.835986 [ 2011721 ] <Error> BaseDaemon: 8. clickhouse-server(Poco::Net::TCPServerDispatcher::run()+0x13b) [0x32cce7b]
2017.08.07 12:20:02.835991 [ 2011721 ] <Error> BaseDaemon: 9. clickhouse-server(Poco::PooledThread::run()+0xb7) [0x3537ee7]
2017.08.07 12:20:02.835996 [ 2011721 ] <Error> BaseDaemon: 10. clickhouse-server(Poco::ThreadImpl::runnableEntry(void*)+0xa5) [0x3503f25]
2017.08.07 12:20:02.836001 [ 2011721 ] <Error> BaseDaemon: 11. /lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba) [0x7f40369d46ba] -
Сделал DLL на создание реплицируемой таблицы и на двух нодах вот такая штука вылезла
-
Помог рестарт сервера
-
Причем с этим сегфолтом сервер запущен, но приконнектиться не дает
-
-
Причем у меня 8 серверов и всегда на разных такая фигня
-
Версия 1.1.54246
-
Проблема возможно в том, что таблица уже существует и как то некорректно эксепшен обрабатывается
-
И вот опять такая петрушка :)
CREATE TABLE statements_log ON CLUSTER statements AS r_statements_log ENGINE = Distributed(statements, cursometr, r_statements_log, rand())
И опять ноды отваливаются -
Только теперь ошибка другая
2017.08.07 12:30:55.692625 [ 501 ] <Error> BaseDaemon: ########################################
2017.08.07 12:30:55.692670 [ 501 ] <Error> BaseDaemon: (from thread 434) Received signal Segmentation fault (11).
2017.08.07 12:30:55.692869 [ 501 ] <Error> BaseDaemon: Address: 0x31
2017.08.07 12:30:55.705141 [ 501 ] <Error> BaseDaemon: 1. clickhouse-server(std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<DB::IStorage> >, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<DB::IStorage> > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<DB::IStorage> > > >::_M_get_insert_hint_unique_pos(std::_Rb_tree_const_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<DB::IStorage> > >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)+0xa7) [0x229a6c7]
2017.08.07 12:30:55.705157 [ 501 ] <Error> BaseDaemon: 2. clickhouse-server(DB::ProcessList::addTemporaryTable(DB::ProcessListElement&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<DB::IStorage>)+0x264) [0x2942d74]
2017.08.07 12:30:55.705167 [ 501 ] <Error> BaseDaemon: 3. clickhouse-server(DB::Context::addExternalTable(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<DB::IStorage>)+0x22e) [0x298bd1e]
2017.08.07 12:30:55.705191 [ 501 ] <Error> BaseDaemon: 4. clickhouse-server(DB::TCPHandler::receiveData()+0x3ce) [0x10cb5fe]
2017.08.07 12:30:55.705197 [ 501 ] <Error> BaseDaemon: 5. clickhouse-server(DB::TCPHandler::receivePacket()+0x1e1) [0x10cb9f1]
2017.08.07 12:30:55.705203 [ 501 ] <Error> BaseDaemon: 6. clickhouse-server(DB::TCPHandler::readData(DB::Settings const&)+0x1a9) [0x10cbd79]
2017.08.07 12:30:55.705209 [ 501 ] <Error> BaseDaemon: 7. clickhouse-server(DB::TCPHandler::runImpl()+0x7ea) [0x10cca1a]
2017.08.07 12:30:55.705214 [ 501 ] <Error> BaseDaemon: 8. clickhouse-server(DB::TCPHandler::run()+0x2b) [0x10cd45b]
2017.08.07 12:30:55.705220 [ 501 ] <Error> BaseDaemon: 9. clickhouse-server(Poco::Net::TCPServerConnection::start()+0xf) [0x32c6a3f]
2017.08.07 12:30:55.705225 [ 501 ] <Error> BaseDaemon: 10. clickhouse-server(Poco::Net::TCPServerDispatcher::run()+0x13b) [0x32cce7b]
2017.08.07 12:30:55.705229 [ 501 ] <Error> BaseDaemon: 11. clickhouse-server(Poco::PooledThread::run()+0xb7) [0x3537ee7]
2017.08.07 12:30:55.705236 [ 501 ] <Error> BaseDaemon: 12. clickhouse-server(Poco::ThreadImpl::runnableEntry(void*)+0xa5) [0x3503f25]
2017.08.07 12:30:55.705240 [ 501 ] <Error> BaseDaemon: 13. /lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba) [0x7f6b1fb0a6ba] -
А через apt обновляться безопасно? Вроде бы недавно была какая то проблема со сломанным пакетом
-
Перед выполнением команды, не проверяли, есть ли на всех нодах таблица custometr?
-
Да, это продакшен кластер
-
Везде есть, причем после перезапуска сервера КХ на ноде запрос проходит, но отваливается на других нодах :) Рандомно причем и всегда только на двух нодах из разных шардов
-
-
-
-
Привет, я обычно разбиваю на куски по 10-100К строк и заливаю.
-
-
-
Joined.
-
ни у кого подобного канала по hive нет?)
-
тоже +1 к hive каналу
-
может сделаем его тогда?)
-
Link
Global community around Data / Artificial Intelligence / Machine Learning
-
-
это не то)
-
Ребята, а где можно увидеть что в кликхаусе добавили алиасы? какие-то новости есть где-то?
-
https://clickhouse.yandex/docs/ru/query_language/queries.html?highlight=%D0%B0%D0%BB%D0%B8%D0%B0%D1%81
тут только про столбец почему-то упоминание -
-
select * from table t;
-
clickhouse-scala-client released at sonatype https://oss.sonatype.org/content/repositories/public/com/crobox/
-
Изменения с версии 1.1.54236 до 1.1.54244
Новые возможности:
* Распределённые DDL (например, CREATE TABLE ON CLUSTER)
* Реплицируемый запрос ALTER TABLE CLEAR COLUMN IN PARTITION
* Движок таблиц Dictionary (доступ к данным словаря в виде таблицы)
* Движок баз данных Dictionary (в такой базе автоматически доступны Dictionary-таблицы для всех подключённых внешних словарей)
* Возможность проверки необходимости обновления словаря путём отправки запроса в источник
* Qualified имена столбцов
* Квотирование идентификаторов двойными кавычками
* Сессии в HTTP интерфейсе
* Запрос OPTIMIZE Replicated таблицы теперь можно выполнять не только на лидере -
вот новость
-
-
спасибо
-
-
-
А поверх дикшенари движка можно агрегации проводить? ) пробовал кто?
-
-
А при использовании движка Dictionary в качестве таблицы и последующие выборки данных из этой таблицы производят чтение из внешнего словаря каждый раз при запросе в таблицы? Или данные как то кешируются?
-
Кэшируются во всех случаях.
Для flat, hashed словарей - читаются данные из оперативки.
Для cached словарей - тоже, при чем, читается ровно то, что находится в кэше, а не все данные из источника. -
Супер. Но все равно словарь может работать медленней чем "источник", если рассматривать MySQL в качестве источника.
-
Просто например простой запрос на avg по таблице в MySQL работает в 3 раза быстрее. Это связано с тем, что все таки данные в один поток из кеша читаются?
-
Одной из причин может быть проблема с промахами в кеше. Если кратко, запрос работает в 2 этапа: 1) собирает все ключи в текущем кеше и 2) делает запросы для пачки ключей.
Если между этими этапами некоторые ключи выгрузились из кеша, произойдет повторное обращение м MySQL. -
Не совсем понял про второй запрос. Например я делаю запрос select * from test (где test это словарь) и получается будет запрос в MySQL все равно происходить, что бы проверить все ли ключи на месте?
-
запрос к MySQL будет происходить, если в кеше перестали быть некоторые ключи. Если из кеша ничего не выгрузилось между 1) и 2), то запросов не будет
-
Ааа, так понятней )а чисто теоретически есть смысл использовать такие костыли для агрегации небольших таблиц в которых 2-5 миллионов строк и есть ли возможная деградация скорости выполнения запроса при увеличении размера словаря?
-
Деградация скорости, безусловно, возможна :) Чем больше словарь, тем чаще будут промахи в кеше. В целом, движок Dictionary изначально сделан для отладочных целей.
-
Просто у нас такой кейс, что факты приходится вычислять из сырых данных в силу определенной логики, после вычисления фактов уже делается агрегация по посчитанным фактам (строятся отчеты), а в силу того, что с апдейтами пока проблема в КХ, приходится использовать не совсем подходящие для этого инструменты. Вот я и подумал, смастерить костыль для агрегации внутри КХ, но данные брать из словарей :) Видимо это безсмысленно. Хотя, безусловно, я думаю запросы сложнее чем select avg(attempts) будут в КХ работать быстрее чем в MySQL.
-
Я думаю поиграться с ReplacingMergeTree в качестве таблицы с фактами (конечными) и после пересчета фактов уже записывать новые данные в таблицу. У нас сейчас не так много строк с посчитанными фактами, поэтому я думаю можно использовать FINAL, учитывая, что все таки 8 серверов в кластере.
-
Исходных данных по которым считаются факты порядка миллиарда событий. После поступления новых событий, мы пересчитываем факты (например прогресс изучения дистанционного курса, который считается по дереву и может иметь еще средне взвешенные, или кол-во успешных попыток прохождения теста с учетом начала попытки и времени окончания и это все по разным таблицам лежит, что в конечном счете джоинится и агрегируется)
-
У нас сейчас есть похожая задача - возможность подключения внешних таблиц напрямую (CREATE TABLE ... ENGINE = MySQL или табличная функция: SELECT ... FROM mysql(...)). Эту задачу сейчас делает коллега из другого отдела ради эксперимента.
-
Блин, это было бы просто шикарно! Очень не хватает чего то, что позволило бы обнолять данные, т.к. именно возможности агрегации данных просто...просто нет слов :) И хочется именно КХ использоать для таких нужд.
-
Если все пройдет успешно, то было бы очень кстати иметь такую возможность под рукой :)
-
+1 vote!
-
- 08 August 2017 (100 messages)
-
Обновил Tabix Build 17.08.1 [20170808]
Fix:
- Ошибки ERR_RESPONSE_HEADERS_TOO_BIG
- Мерцание таблицы
- Имя таблицы содержит точку
- Заработал Export to TSV
- Не oтрисовывались графики
- Прочие мелочи -
Доброе утро. При хранении строк очень эффективно иметь словарь и хранить значения в словаре а указатели в таблице КХ.
Может кто объяснить почему так не сделано и может есть планы? -
Это как раз таки есть
-
Интересно
-
Почему тогда при замене строк на целые и внешнем словаре использование диска сокращаетс в разы
-
должно не сильно изменится по идее
-
Здравствуйте. Переносили ZK с одно кластера на другой.
Остановили КХ
Перенесли все данные из ноды /clickhouse c одного ZK на другой
Прописали в настройках КХ новый кластер ZK
Запустили КХ. -
Сейчас при вставке в одну из талиц вот такая ошибка
-
причём вставка удачно проходит, вставляем в дистрибутед таблицу, а вот данные не появляются
-
не подскажете как исправить?
-
Ну прочитать идентификатор все таки дешевле, учитывая, что сжатие работает лучше, а данные словаря закешированы в оперативке
-
Данных нет на реплике или на шарде?
-
Судя по этой ошибке не видно ноду зк из кх, если я правильно понял
-
Проверьте статус ноды зк для начала
-
не очень понял вопроса, но вот я сделал запрос на максимальную дату по всем репликам, в локальные таблицы, она заканчивает ровно в тот момент когда мы стопнули КХ
-
я проверял, там действительно её нет
-
-
в старом кластере это нода была, но КХ писал что типа нода существует. Мы решили грохнуть. Сейчас пишет что нет ноды. В принципе вернуть ноду не проблема, но как восстановить запись?
-
Т.е. по факту данные не пишутся сейчас никуда? Рестартить сервера не пробовали?
-
Очевидно убрать дохлую ноду зк из настроек
-
Если нода не заведена в кластер зк
-
не не, я не про реплику ZK, а ноду в ZK
-
путь /clickhouse/tables/{SHARD}/billy_securitylog/block_numbers/201708/block-*
-
Дак и я про нее. У вас кластер зк и эта нода была не в кластере?
-
cам то ZK в порядке
-
Сама по себе болталась?
-
Попрбуйте все таки убрать из конфига кх старую ноду зк, которая недоступна
-
не, что в старом кластере ZK что в новом было пять серверов ZK. Нода всмысле путь в ZK
-
Ааааа
-
по версии ZK как раз всё в порядке
-
вопрос именно как заставить КХ начать писать в такой ситуации. Причём у нас не одна табличка с репликами в них всё нормально пишется, а вот с этой беда какая то случилась
-
Я с таким не сталкивался ( придется ждать ответа, либо эксперементировать )
-
Подскажите, а что за мониторинг ZK используете?
-
это самописный
-
но вроде в опенсорс скоро выложат
-
отлично бы было
-
короче путём эксперементов решился вопрос
-
вернул взад ноду /clickhouse/tables/{SHARD}/billy_securitylog/block_numbers/201708/
-
КХ стал писать что нода /clickhouse/tables/{SHARD}/billy_securitylog/block_numbers/201708/block- существует
-
грохнул все ноды /clickhouse/tables/{SHARD}/billy_securitylog/block_numbers/201708/block*
-
запись пошла
-
DB::Exception: Size of filter doesn't match size of column..
Кто то знает как побороть такую ошибку
Такой запрос проходит
SELECT * FROM sm.views WHERE create_date=today() and url_domain ='smi2.ru' LIMIT 1
А вот такой падает с ошибкой
SELECT * FROM sm.views WHERE create_date=today() and url_domain ='smi2.net' LIMIT 1
Отличие только в url_domain -
А там не fixed string?
-
Просто такое только в одном месте есть в КХ
https://github.com/yandex/ClickHouse/blob/master/dbms/src/Columns/ColumnFixedString.cppyandex/ClickHouseClickHouse is a free analytic DBMS for big data.
-
Хотя нет, есть и в других колонках
-
А в логах КХ посмотрите трейс, там должно быть написано откуда именно такое валится
-
И будет более понятно
-
попробуйте сделать
SET preferred_max_column_in_block_size_bytes = 0
и перезапустить запрос.
Какая версия ClickHouse? -
Trace
https://gist.github.com/isublimity/7e28cd3f335210a4d3ce56fe2ac4059f
1. clickhouse-server(DB::Exception::Exception(std::string const&, int)+0x1f) [0x1046ebf] -
Формат колонки String
-
Не помогло
-
Разобрался - у нас в таблице FixedString - и в них hex данные - если их не извлекать ошибки нет
-
видимо это
-
Буду разбираться в сырцах и что мы напихали в CH
Спасибо за наводку -
и все-таки какая версия CH?
-
ClickHouse 1.1.54262 testing
-
а можно как-нибудь сконвертить строку в массив символов? типа splitByChar, только без первого аргумента
-
теоретически, обновление до 1.1.54266 должно помочь
-
👏👍 помогло )
-
-
-
а как выглядит рекомендованный способ размазывания данных по кластеру с т.з. clickhouse? Вот, к примеру, у меня есть 4 ноды. Как я понял из документации, по-хорошему, я делаю 2 шарда, у каждого 2 реплики. Но тогда, в общем случае, если я запускаю тажелый запрос, то только 2 из 4х нод будут его процессить, остальные будут стоять и ничего не делать.
-
-
А будут только единичные запросы или какой-то поток?
-
-
а то как я понял из активного гуглежа, такой сетап возможен, но через попу: https://github.com/yandex/ClickHouse/issues/508DB::Exception: Cannot read all data · Issue #508 · yandex/ClickHouse
I cann't read some introduction from https://clickhouse.yandex/reference_en.html# have some document about building a distributed multiple servers environment ?
-
Добрый день! Подскажите, можно как-то в КХ добиться функционала FIRTST/LAST агрегаций?
-
-
Если недетерминированно, то есть any и anyLast.
-
спасибо!
-
А есть докер либо пакетик? Попытался обновить image - up to date. Что я делаю не так?
-
-
-
-
Как обычно, выкачав с репозитория Яндекс
-
yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data. Contribute to yandex/ClickHouse development by creating an account on GitHub.
-
То есть готового пакета как и готового image нет и неизвестно когда будет?
-
http://repo.yandex.ru/clickhouse/xenial/pool/main/c/clickhouse/ вроде там версии более свежие, чем указанная 244
-
-
-
Разве в конфиге не работает?
-
<?xml version="1.0"?>
<yandex>
<logger>
<level>trace</level>
<log>/var/log/clickhouse-server/clickhouse-server.log</log>
<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
<size>1000M</size>
<count>10</count>
</logger>
<timezone>UTC</timezone> -
может не там прописал?
-
Но UTC - это и есть Zulu.
-
Сервер выводит некое каноническое имя, которое для UTC равно Zulu.
-
странно)) спасибо. просто привык UTC
-
-
Самое простое:
CREATE DATABASE dictionaries ENGINE = Dictionary -
-
а посложнее? Просто это отдельная таблица не связанная со словарями или же можно указать словарь из которого она берет значения?
-
Это пример, как создать базу данных, в которой автоматически содержатся таблицы для словарей.
-
Также таблицы для словарей можно создавать и по отдельности.
-
Господа, а есть какойто формат TabSeparatedGziped.
хочу вытащить одну табличку, 18 гигов в кх, а в TabSeparated уже 340 гигов. и судя по бегунку это только 70%. -
-
ну если формата нету то так и придется делать
-
-
-
Формата нет. Формат и сжатие независимы.
-
да. сотворил уже гадость на базе btrfs с онлайн сжатием.
-
спасибо
- 09 August 2017 (68 messages)
-
-
Какой командой заработало?
-
Есть же clickhouse-compressor.
-
Проверил, вот так работает:
$ clickhouse-client --query 'SELECT * FROM test FORMAT Native' | clickhouse-compressor > test.compressed
$ cat test.compressed | clickhouse-compressor -d | clickhouse-client --query 'INSERT INTO test FORMAT Native' -
-
Да в принципе ничего. Разве что сжатие должно получиться ровно такое же как внутри кх. Удобнее ориентироваться какой размер в итоге получится.
-
mkfs.btrfs ;) compression=lzo
-
Кх клиент в докер-компоузе не удобно туда пайпы фигачить.
-
-
да это можно было и в fstab
-
ZK нужен для репликации. Остальное работает без него
-
-
DDL же еще
-
-
-
-
А посоветуйте, пожалуйста, оптимизации для компрессии.
Импортирую данные в CH из ORC. В ORC данные лежат в одной таблице, занимают 10G.
В CH данные лежат в 450 таблицах, занимают 30Gb. Что следует покрутить? Уже очень обидно за такую сильную разницу. -
А почему не хранить так же в одной таблице? Зачем разделать на 450 таблиц? Если потом нужно будет сджоинить данные - скорее всего либо не получиться. либо будет медленно работать
-
Эвенты различаются аттрибутивков
-
*аттрибутивкой
-
в ORC это Map<String,String>
-
в CH - отдельные таблицы и колонки для эвентов
-
В CH есть Nested-колонки
https://clickhouse.yandex/docs/ru/data_types/nested_data_structures/nested.html -
По сути это вложеная таблица
-
Т.е. вы предлагаете под каждый тип эвента завести вложенную структуру?
-
Меня вот это смущает:
Работоспособность запроса ALTER для элементов вложенных структур данных, является сильно ограниченной. -
Т.к. у эвентов иногда происходит добавление/удаление полей
-
А как в ORC это происходит? Разве можно менять колонки в файле?
-
Если их не десятки тысяч - это может быть вариантом
-
В ORC новые аттрибуты конкретных событий появляются в Map<String,String> - т.е. туда можно класть что угодно. Из документации CH не вполне ясно - можно ли безболезненно добавлять/удалять колонки вложенных структур
-
Можете попробовать колонку типа String и писату туда сериализованый json. CH ограничено умеет работать с json-данными
-
Попахивает write-only данными :)
-
-
а массивы нельзя в MergeTree :(
-
всем привет, подскажите как имея таблицу hits_all от logs api с date и datetime у каждого хита посчитать среднюю продолжительность нахождения на сайте? принцип, ссылки, или может запрос есть под рукой - все пригодится
-
-
да) благодарю не углядел что там есть длительность визита
-
Не понял, что имеется ввиду. Конечно массивы можно иметь в таблицах типа MergeTree.
-
Насколько оправдано будет хранить такие данные в колонке в виде сериализованного json?
-
По поводу, почему данные могут занимать меньше в ORC формате. Это может зависить от настроек сжатия. Если при использовании ORC, сжатие более сильное, чем lz4 - займёт меньше. Чтобы включить в ClickHouse более сильное сжатие, можно поменять настройку compression в config,xml, например, так:
<compression>
<case>
<method>zstd</method>
</case>
</compression>
- включит сжатие zstd при всех фоновых мержах. -
Вторая возможная причина - изменение самой структуры данных.
450 таблиц - это плохо.
450 таблиц типа MergeTree будут работать, а при использовании ReplicatedMergeTree, на таком количестве могут постепенно начаться всякие проблемы. Дело в том, что каждая таблица типа ReplicatedMergeTree - довольно тяжёлый объект. -
Полностью динамические свойства можно хранить в Nested(name String, value String). Но если атрибутов всё-таки не слишком много (сотни), то можно держать отдельные столбцы для каждого. Не стоит беспокоиться, если значения будут сильно разреженными.
-
JSON обычно неоправданно, так как неудобно доставать оттуда всякое.
Оправданно в редких случаях - если изначально был JSON и мы совсем не можем заранее разобрать его структуру, и для нас более-менее без разницы, что внутри. -
А есть ли разница в части загрузки КХ и ЗК
1 таблица из 100 реплицируемых шард
или
100 таблиц с одной реплицируемой шардой
? -
Не полностью понял вопрос. Имеется ввиду по одной таблице на каждом сервере, но вопрос в том, делать ли много шардов или много реплик?
-
Вопрос такой что есть 200 серверов.
Я могу сделать 100 таблиц каждая по 2 реплики и 1 шарде
А могу сделать 1 таблицу со 100 шардами и 2 репликами.
(понятно что это просто по 1 локальной таблице в итоге на сервере)
так вот будет ли разной нагрузка на КХ и ЗК или нет -
Тоже не совсем понятно. Дело в том, что нет понятия "шарда для таблицы". Таблицы на разных шардах живут независимо и работают вместе лишь при запросах из Distributed таблицы.
-
понял, значит ответ на мой некорректный вопрос - нагрузка будет одинакова тк физичести это будет все теже 100 таблиц с 2 репликами в обоих случаях
-
Да.
-
-
Засечки в индексе строго возрастают.
Mark представляет собой пару:
- смещение в файле до начала сжатого фрейма, где есть искомые данные;
- смещение в разжатом фрейме до данных. -
-
-
Для разных столбцов в засечках разные смещения.
Если рассматривать один столбец:
- в нём у каждой следующей засечки смещение в сжатом файле больше или равно предыдущему. А пара (смещение в сжатом файле, смещение в разжатом фрейме) лексикографически больше.
Для разных кусков данных (parts) будут разные файлы, и смещения в них никак не связаны.
При параллельной обработке запроса, даже один файл может читаться сразу в разных местах. -
-
Да, [ 13 ] - это номер потока. Он один. В остальном я не понял, что вы вывели.
-
-
-
-
mark.offset_in_uncompressed
- для мелких столбцов часто равен нулю за счёт "выравнивания сжатых блоков по засечкам". В остальном никакого утверждения о монотонности нет.
Пример, что такое засечка.
Все несжатые данные файла:
[-------------------------------]
^ ^
индекс указывает сюда.
Данные сжимаются.
Вот такие получились фреймы для сжатия:
[---------][---------][---------]
^ ^
Они сжались как-то так:
[~~~][~~~~~~][~~]
^ ^
offset_in_compressed_file будет указывать сюда - на начала сжатых фреймов в файле.
[---------]
^
[---------]
^
А offset_in_decompressed_block будет указывать сюда - на позицию данных внутри фрейма. -
-
-
-
Могут. Есть минимальный размер сжатого фрейма - 64 KB и максимальный - 1 MB.
Допустим, столбец имеет тип UInt8, index_granularity = 8192. Тогда в один сжатый фрейм попадут целых 8 засечек. -
-
> Но они будут иметь разный uncompressed.
> А могут ли непоследовательные marks указывать на один in_compressed?
Не совсем корректный вопрос.
Могут ли marks для одного part, для одного столбца быть не монотонными, если рассматривать лексикографическое сравнение - нет.
Попробуйте посмотреть .mrk файлы напрямую. Эти файлы не сжаты. Там подряд уложены пары offset_in_compressed_file, offset_in_decompressed_block. И то, и другое - это UInt64, little endian. -
-
Joined.
- 10 August 2017 (26 messages)
-
Всем привет. Подскажите пожалуйста, в чем причина ошики. Использую библиотеку pandahouse. Работают только запросы show. В бд и sql я совсем новичок, только что установил БД. Спасибо!
-
Уберите из запроса format tsv, надо что бы остался только create database test1
-
Joined.
-
-
Joined.
-
Спасибо за ответ, Алексей! Перечитал доку, там написано про многомерные
-
т.е. вы предлагаете писать в одну таблицу все события, но для каждого типа события завести отдельный столбец под их аттрибутивку?
-
Уже почувствовали :) Zookeeper взлетел только после перевода на SSD, иначе - все IOPS сжирал
-
@FacedSID спасибо
-
-
SELECT arrayJoin(empty(array) ? ['empty'] : array)
-
Можно попробовать так, но в таком случае на пустых массивах будет одна строчка с empty, но на этот случай можно сделать проверку далее в запросе
-
-
-
-
-
-
И что с этим делать?) Алексей где можно посмотреть прочесть более подробно
-
Движок таблиц Dictionary предназначен для интроспекции - чтобы можно было удобно посмотреть содержимое словаря. А также полезен для запросов, где нужно найти что-нибудь в словаре необычным образом.
-
А сам словарь не нужно указывать?
-
-
Таблицы типа Dictionary можно создать двумя способами:
1. По отдельности, с помощью CREATE TABLE ... ENGINE = Dictionary(dict_name).
2. Таблицы для всех словарей сразу. Это работает с помощью создания специальной базы данных. CREATE DATABASE name ENGINE = Dictionary
Это самый простой способ, так как никаких аргументов указывать не нужно. -
Сами словари должны быть заранее объявлены в конфигурационных файлах, как обычно.
-
-
Joined.
-
- 11 August 2017 (83 messages)
-
Всем привет. А кто-то вливал в обычную таблицу с MergeTree через JDBC драйвер больше 2кк строчек в секунду? Я конечно еще не до конца разобрался куда уперся в моем случае, пока гоняю тесты и подкручиваю связку в разных местах, но хочется понять, это потолок, или можно выше прыгнуть?
Лью через RowBinaryStream, косяки с лонгами обошел, сериализацию и отправку стрингов на своей стороне подкрутил, и на первый взгляд проблем больше нет.
Строчки по 66 байт, но на локалхосте результаты примерно такие же, поэтому кажется что это не диск и не сеть, чуть позже проверю точнее. -
-
@neiwick Порядок данных важен? Если нет то пробовал ли ты разбить данные на куски и пихать в несколько потоков? Мы так у себя справились с задержками. В безопасные 190 потоков льем кучу данных
-
-
-
Смотря как делать, по сути ClickHouse просто создаст таблицу с именем (.inner.ваше_вью) и как в таблицу так и во вью можно будет сделать insert и записать туда данные. Когда происходит insert в целевую таблицу, то берется вставляемый блок данных и к нему применяется ваш запрос, поэтому теоретически (и не совсем понятно для чего) можно вставить данные, но, опятьже, там местами всё поломано, например https://github.com/yandex/ClickHouse/issues/127Problem with INSERT if having a VIEW with subqueries & AS keyword #127
That's a really strange one! When you create a view (let's call it test_stats) that has a subquery with multiple tables (test1 and test2) combined using UNION ALL clause, and the first tabl...
-
На самом деле все просто - есть две совершенно тождественные таблицы с данными, просто они посуточно чередуются. И я хотел узнать можно ли над ними создать одну вьюху, которая будет по определенному where читать из двух таблиц и возвращать общий массив результатов
-
-
-
а обычное view вполне себе можно создать
-
ну как устроены вьюхи я представляю, я о другом говорил - как сделать как раз в рамках запроса в одну вьюху результаты из двух таблиц
-
-
Всем привет!
Скажите, кто-то работал с КХ из go?
Наткнулся на вроде как баг, не пойму чей он. Вроде на КХ запросы выполняются, поэтому подозреваю, что это на его стороне.
Пытаюсь сделать мультилайн-инсерт (4 строки по 5 полей).
if transaction, err = db.ClickHouseClient.Begin(); err != nil {
log.Error(fmt.Errorf("Can't start transaction: %v", err))
return
}
if stmt, err = transaction.Prepare(sql); err != nil {
log.Error(fmt.Errorf("Can't prepare statment (%s): %v", sql, err))
transaction.Rollback()
return
}
if _, err = stmt.Exec(data...); err != nil {
log.Error(fmt.Errorf("Can't execute statment (%s) with data (%v): %v", sql, data, err))
transaction.Rollback()
return
}
если data - это []interface{} из 20 элементов, то получаю ответ, что ожидается 5
[clickhouse][begin] tx=false, data=false
[clickhouse][prepare] INSERT INTO events (uid, pid, event, geodata, created_at) FORMAT VALUES (?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?)
[clickhouse][send query] INSERT INTO events (uid, pid, event, geodata, created_at) FORMAT VALUES
[clickhouse][rollback] tx=true, data=true
[clickhouse]-> ping
2017/08/11 12:05:56 [err] Can't execute statment (INSERT INTO events (uid, pid, event, geodata, created_at) FORMAT VALUES (?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?)) with data ([WXOsS2b6HKVar5J3 10 h_view RU74Челябинск 2017-08-11 12:05:44.144234036 +0300 +03 WXOsS2b6HKVar5J3 1 h_view RU74Челябинск 2017-08-11 12:05:45.216646508 +0300 +03 WXOsS2b6HKVar5J3 10 h_view RU74Челябинск 2017-08-11 12:05:46.242552452 +0300 +03 WXOsS2b6HKVar5J3 1 h_view RU74Челябинск 2017-08-11 12:05:47.160877142 +0300 +03]): block: expected 5 arguments (columns: uid, pid, event, geodata, created_at), got 20
[clickhouse][stmt] close
а если передаю не правильное количество аргументов (слайс слайсов интерфейсов 5х4), то он уже ожидает 20, а получил 4
` -
-
Can't execute statment (INSERT INTO events (uid, pid, event, geodata, created_at) FORMAT VALUES (?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?)) with data ([[WXOsS2b6HKVar5J3 1 h_view RU74Челябинск 2017-08-11 11:41:16.08478083 +0300 +03] [WXOsS2b6HKVar5J3 10 h_view RU74Челябинск 2017-08-11 11:41:17.096437511 +0300 +03] [WXOsS2b6HKVar5J3 1 h_view RU74Челябинск 2017-08-11 11:41:17.983410114 +0300 +03] [WXOsS2b6HKVar5J3 10 h_view RU74Челябинск 2017-08-11 11:41:18.864966974 +0300 +03]]): sql: expected 20 arguments, got 4
-
-
Привет! Заметил странное поведение. Когда заливаю данные через Distributed (insert into some_distibuted select * from other_table), одним большим батчем, то происходит OutOfMemory. Distributed связан с SummingMergeTree. Если заливать по частям, то происходит некоректный подсчет Summing поля, если не дождаться пока Distributed не закончит рассылку по всем нодам и начать заливку следующего батча. Из документации не понятно данное поведение (и OutOfMemory и неправильный подсчет Summing поля), поэтому предполагаю что это бага
-
-
Как говорил Джобс: "Вы держите его неправильно"
делайте
INSERT INTO events VALUES (?, ?, ?, ?, ?)
Далее в цикле забиваете данные через execute (у вас получится 4 итерации по 5 значений) и Commit который отошлет блок данных на сервер -
-
-
-
-
-
-
-
-
-
-
-
-
-
Если гошный драйвер используется через стандартный интерфейс Го, то при вызове Begin не создается транзакция, просто соединение закрепляется за стейтментом, при Prepare запрос "обрезается" до VALUES и отправляется на сервер, сервер передает метаинформацию о колонках которые он ожидает, Execute пишет в буферы колонок которые при Commit или при приделе размера блока (в строках) сливаются в один бинарный блок данных и отправляются на сервер, Commit отправляет данные из беферов, если там еще что-то осталось и шлет "пустой" блок данных чтоб сообщить серверу что все данные отправлены
-
-
вот это кстати вынесло мозг при первых попытках вставлять данные в КХ из Го
хотя это конечно скорее минус database/sql, который не предоставляет интерфейса для батчинга - приходится вот такую магию применять -
-
-
Т.е. в моем случае, если я шлю не правильное количество аргументов, то он тупо считает количество знаков вопроса, видит 20 и щлет меня сразу - чувак, мне надо 20 аргументов
А если я шлю 20 аргументов, то локальную проверку я прохожу, затем он шлет запрос на сервер, сервер ему отвечает, что надо 5 полей, и он такой - чувак, мне надо 5.
так получается? -
-
-
-
-
Всем привет!
У нас есть запрос:
SELECT
...
FROM
(
SELECT ... - тут запрос который выдает > RAM
этот запрос никак не получается ограничить, потому что он по сути является большим словарем
с количеством > 10 млрд записей
) AS a
ANY INNER JOIN
(
SELECT ... - тут запрос который выдает не очень много данных
) AS b
USING ключ;
Разумеется, в результате выполнения такого запроса в различных вариациях мы получаем ошибку
с превышением memory limit
И причина тоже нам понятна, CH загружает каждый подзапрос участвующий в JOIN в RAM и сам JOIN выполняет уже в RAM,
и вообще это не та сторона CH, в которой он хорош.
Тем не менее, какими методами можно завести этот запрос, если убрать очевидное решение с созданием
большой денормализованной таблицы? -
-
Joined.
-
-
можно сюда написать https://github.com/kshvakov/clickhouse/issues чтоб я не забыл
-
Всем привет, подскажите как правильно убить мертвую реплику?
Вроде в зукипере прибил, но при этом
🙂 optimize table stats
OPTIMIZE TABLE stats
Received exception from server:
Code: 999. DB::Exception: Received from localhost:9000, 127.0.0.1. zkutil::KeeperException. zkutil::KeeperException: Can't get data for node /clickhouse/tables/0/stats/replicas/2/host: node doesn't exist (no node). -
а при записи выдает 2017.08.11 15:25:33.291647 [ 113 ] <Error> executeQuery: Code: 252, e.displayText() = DB::Exception: Too much parts. Merges are processing significantly slower than inserts., e.what() = DB::Exception
-
кто-нибудь сталкивался?
-
Я не мастер issues писать. Но кое как написал
-
-
-
-
а отдельно первый подзапрос у вас отрабатывает? и правильно я понимаю, что после джойна, у вас агрегации нет?
-
-
-
-
-
-
system.processes, наверное
-
-
-
-
Да. Только проблема в задании query_id. Можно, конечно, отслеживать параметр "query".
-
-
Это да. Я думал, может, есть незадокументированный способ)
-
-
jdbc драйвер
-
-
Подскажите в логах ошибка
<Error> history_ctp_avg.Distributed.DirectoryMonitor: Code: 53, e.displayText() = DB::Exception: Received from 1111.211.211.11:9000. DB::Exception: Type mismatch for column shame_level. Column has type UInt32, got type UInt8. Stack trace:
Как я понял из истории чата ( похожий пример ) - это когда-то я ошибочно вставил в нее данные, сейчас запись я в эту таблицу вообще остановил - ошибки продолжают сыпаться.
Решение: пересоздать таблицу через временную таблицу ? -
Можно удалить лишь некоторые файлы из data-директории таблицы. Посмотрите - там лежат файлы .bin, и по их содержимому, наверное, легко определить, находятся ли там данные с неправильной структурой.
-
Спасибо,попробую
-
-
Агрегация устроена так: идём по строкам и кладём всё в хэш-таблицу. Ключи агрегации - ключ хэш-таблицы, а состояния агрегатных функций - значение хэш-таблицы.
Параллельная агрегация устроена так: в каждом потоке независимо агрегируем разные части данных. Потом мержим вместе все хэш-таблицы с состояниями в одну.
Есть много деталей. -
-
-
В конце из хэш-таблицы создаются блоки результата. В простом случае создаётся один большой блок (когда размер результата маленьких). В остальных случаях создаётся некоторое количество блоков, разбиение на которые определяется хэш-функцией от ключей.
А что и как хотелось бы протащить? У тебя есть исходные номера строк, но после агрегации исходных строк уже нет. Можно считать уже агрегатные функции - min(row_number), max(row_number) и т. п. -
Агрегация - довольно сложный код - много деталей, может быть трудно разобраться.
-
-
-
-
Получается надо в агрегацию включать данные о строках - не очень просто и удобно. Да и вообще кажется что строки после агрегации не нужны же.
- 12 August 2017 (14 messages)
-
После первой же стадии агрегации (когда данные кладутся в хэш-таблицу), порядок блоков теряется. Данные становятся почти случайным образом перемешаны. Из этих данных потом составляются новые блоки, которые по порядку уже никак не соответствуют старым.
Порядок можно было бы сохранять для некоторых частных случаев агрегаций. Например, когда делается агрегация по первичному ключу. Но у нас эти случаи не рассматриваются отдельно. -
-
доброе утро всем
а вот если я создаю Distirubted DDL CREATE TABLE IF NOT EXISTS ... ON CLUSTER
а через неделю подключаю в нее новую ноду в существующий шард, таблица на новой ноде будет создана автоматически? -
Нет, на новой ноде нужно будет вручную добавлять таблицу
-
Можно так же запросом по кластеру
-
спасибо
-
-
-
Из кода:
For columns that are not part of the primary key and which do not have the AggregateFunction type, when merged, the first value is selected. -
-
-
Давно. Если правильно помню - больше года.
-
-
- 13 August 2017 (39 messages)
-
-
Добрый день. А как в CH вытаскивать кол-во строк селекта, несмотря на лимит?
т.е. делать то, что в mysql позволяет постраничную навигацию делать.
Пример на MySQL:
SELECT SQL_CALC_FOUND_ROWS name FROM countries LIMIT 10,20;
а затем для получения кол-ва ещё запрос
SELECT FOUND_ROWS() -
ща придумал count() использовать, но, может, что-то проще есть?
-
я понял, почему такая тишина. Не потому, что воскресенье, а потому что кликхаус так не умеет. На LIMIT 10,20 он мне выдал 20 строк. Поправьте, плиз, меня, если я ошибаюсь
-
Есть такая возможность
-
На счет именно клиента не знаю, но через http интерфейс есть такая возможность
-
Я точно не помню какой параметр в ответе по http, но он там есть 100%
-
На счет jdbc драйвера не могу сказать
-
спасибо, Александр, поищу.
выше я не прав был, если чо) LIMIT OFFSET, SIZE, так что всё ок) 20 строчек и должно было быть -
Всем привет.
Подскажите. плиз, а как работать с temp таблицами, используя http интерфейс? -
что-то в документации ничего похожего не вижу
-
несколько заросов через ; как я понимаю нельзя(ошибка Multi-statements are not allowed)
-
А если подряд выполнять тогда ошибка "There is no session"
-
нужно передвать файл целиком с описанием структуры
-
пример можно посмотреть в http клиенте от the-tinerbox или smi2
-
можно сразу несколько файлов грузить на сервер и использовать в качестве временной таблицы
-
А что значит файл с описанием структуры?
У меня примерно такая задача
create temporary table tmp as select очень большой и сложный селект
а потом сделать из нее несколько селектов -
Через консольный клиент все работает. А через http - не понимаю. как выполнить все запросы в рамках одной сессии
-
В доке smi2 про это ни слова нет.
В доке clickhouse нашел след фразу:
Аналогично можно использовать ClickHouse-сессии в HTTP-протоколе, для этого необходимо указывать HTTP-праметр session_id.
Не уверен, что это оно. Сейчас попробую в него какую-нибудь чушь передать ) -
Не прокатило
Code: 115, e.displayText() = DB::Exception: Unknown setting session_id, e.what() = DB::Exception -
Похоже причина в версии кх. Попробуем завтра обновить
-
После добавление в smi2 конфиг
'settings' => ['session_id' =>Helper::getUuid4()]
Все заработало. Было бы круто, если бы кто-нибудь это добавил в доку(как кликхауса, так и smi2) -
Вопрос, а нужно ли эти сессии как-то убивать? Или они сами через какой-то timeout умрут?
-
Joined.
-
Сами, по-умолчанию таймаут 60 секунд. Таймаут можно изменить параметром session_timeout до некоторого максимального значения, определённого в конфиге.
-
И uuid4 в значении - ок?
-
Да. Можно использовать любую строку.
-
Отлично. Спасибо!
-
Еще вопрос, а функции которая возвращает номер недели как я понимаю нет?
А то получается вот такая странная конструкция:))
case 2: // Month
$whereForTop[] = "toMonth(`date`) = toMonth(now())";
break;
case 3: // Week
$whereForTop[] = "`date` >= toDate(now())-(toDayOfWeek(toDate(now()))-1) "; -
Есть функция toMonday - округлить до понедельника. Она так называется, потому что есть страны, где неделя начинается в другой день.
-
Кстати, а как лучше будет:
toMonth(`date`) = toMonth(now())
или
date >=toStartOfMonth(now())
или оптимизатору все-равно? -
Хотя, первый вариант все-равно косячный. Если года разные.
-
сорри
-
Да, пишите toStartOfMonth.
-
Спасибо. Передаем на toMonday\toStartOfMonth. :)
-
Оптимизатору должно быть всё равно, мы добавляли такую функциональность. Но на всякий случай проверьте, обрабатывают ли оба запроса одинаковое количество строк - это пишет clickhouse-client.
-
WHERE date >= toStartOfMonth(now())
┌──count()─┐
│ 73822851 │
1 rows in set. Elapsed: 0.026 sec. Processed 73.82 million rows, 147.65 MB (2.80 billion rows/s., 5.60 GB/s.)
WHERE toMonth(date) = toMonth(now())
┌──count()─┐
│ 73822851 │
1 rows in set. Elapsed: 0.068 sec. Processed 73.82 million rows, 147.65 MB (1.09 billion rows/s., 2.18 GB/s.)
При повторных запусках, на варианте с WHERE toMonth(date) = toMonth(now())
скорость стабильно ниже. -
Запросы одинаковым образом используют индекс. Но сравнение date с константной проще, чем вычисление месяца.
-
логично. Еще раз спасибо!:)
- 14 August 2017 (76 messages)
-
Joined.
-
-
Алексей, спасибо! Качество компрессии выросло в 2 раза!
-
Подскажите по session_id ( хочу в драйвере прикрутить ) и TEMPORARY TABLE
- Эти таблицы можно удалить через DROP TABLE ? У меня не получается - посылаю запрос на CREATE , потом на DROP с указанием session_id - ошибка
- Из доки : "- временные таблицы исчезают после завершения сессии; в том числе, при обрыве соединения" - получается нельзя использовать несколько соединений подряд с одним session_id , нужно постоянно держать connection ? -
-
Привет. Про LEFT JOIN. Может, кому пригодится.
Вложенные запросы пришлось написать вместо просто таблиц, т.к. алиасы не работают так, как в MySQL.
✅ Так работает (вывожу регионы и страны с айдишниками):
:) SELECT region_id, region_name, country_id, country_name FROM (SELECT region_id, name_ru as region_name, country_id FROM _regions_log WHERE 1=1 LIMIT 0,10) ANY LEFT JOIN (SELECT country_id, name_ru as country_name FROM _countries) USING(country_id) ORDER BY region_name LIMIT 0,10
SELECT
region_id,
region_name,
country_id,
country_name
FROM
(
SELECT
region_id,
name_ru AS region_name,
country_id
FROM _regions_log
WHERE 1 = 1
LIMIT 0, 10
)
ANY LEFT JOIN
(
SELECT
country_id,
name_ru AS country_name
FROM _countries
) USING (country_id)
ORDER BY region_name ASC
LIMIT 0, 10
┌─region_id─┬─region_name────────────┬─country_id─┬─country_name─┐
│ 2763 │ Chongqing Municipality │ 97 │ Китай │
│ 20573 │ Dornod Aymag │ 130 │ Монголия │
│ 875 │ Imo State │ 137 │ Нигерия │
│ 13330 │ Ogun State │ 137 │ Нигерия │
│ 2188 │ Pune │ 80 │ Индия │
│ 1000001 │ Адыгея │ 1 │ Россия │
│ 1000236 │ Архангельская область │ 1 │ Россия │
│ 1004118 │ Астраханская область │ 1 │ Россия │
│ 1004565 │ Башкортостан │ 1 │ Россия │
│ 1009404 │ Белгородская область │ 1 │ Россия │
└───────────┴────────────────────────┴────────────┴──────────────┘
10 rows in set. Elapsed: 0.005 sec. Processed 3.96 thousand rows, 140.74 KB (756.70 thousand rows/s., 26.93 MB/s.)
Кстати, звёздочка во внешнем селекте выводила только столбцы, соответствующие первому вложенному селекту. Перечисление всех - сработало. -
А вот, с чего начал терять время на преобразования:
🚫 Так - не работает (в отличие от MySQL):
:) SELECT r.region_id as region_id, r.name_ru as region_name, r.country_id as country_id, c.name_ru as country_name FROM geodata._regions_log as r LEFT JOIN geodata._countries as c USING(country_id) WHERE 1=1 ORDER BY r.name_ru LIMIT 0,10
SELECT
r.region_id AS region_id,
r.name_ru AS region_name,
r.country_id AS country_id,
c.name_ru AS country_name
FROM geodata._regions_log AS r
LEFT JOIN geodata._countries AS c USING (country_id)
WHERE 1 = 1
ORDER BY r.name_ru ASC
LIMIT 0, 10
Received exception from server:
Code: 60. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Table geodata.geodata._countries doesn't exist..
0 rows in set. Elapsed: 0.034 sec.
🚫 Задвоенная БД? - убираем ваще. Но и так - не работает:
:) SELECT r.region_id as region_id, r.name_ru as region_name, r.country_id as country_id, c.name_ru as country_name FROM _regions_log as r LEFT JOIN _countries as c USING(country_id) WHERE 1=1 ORDER BY r.name_ru LIMIT 0,10
SELECT
r.region_id AS region_id,
r.name_ru AS region_name,
r.country_id AS country_id,
c.name_ru AS country_name
FROM _regions_log AS r
LEFT JOIN _countries AS c USING (country_id)
WHERE 1 = 1
ORDER BY r.name_ru ASC
LIMIT 0, 10
Received exception from server:
Code: 47. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Unknown identifier: c.name_ru.
0 rows in set. Elapsed: 0.021 sec.
Спасибо за внимание -
Добрый день. Подскажите почему не рекомендуется хранить float в таблицах?
-
0.2 + 0.1 = 0.30000000000000004
-
вот поэтому
-
Спасибо
-
Добрый день. Обнаружил интересную особенность поведения внешних словарей CH 1.1.54245
Во всех конфигурационных файлах словарей прописаны значение параметра "Периодичность обновления для полностью загружаемых словарей":
<lifetime>
<min>3000</min>
<max>4200</max>
</lifetime>
<layout>
<hashed/>
</layout>
В основном конфиг файле config.xml СН параметр dictionaries_lazy_load не указан.
Не могли бы подсказать почему внешние словари не обновляются в период, который указан в lifetime?
А обновление всех словарей происходит только тогда, когда производится запрос к одному из словарей.
Ошибок в логах нет.
Словари висят в памяти определенное время, а потом удаляются.
Заранее спасибо -
Здравствуйте. Никто не сталкивался с проблемой на очень маленьких данных (10 мб) — очень большое число parts в partition и следовательно размер partition в несколько раз больше (60 мб) чем данных в ней. Используем granularity 512, но когда закачивали основной сет размером в 6 гб таких проблем не получали.
-
Привет. В драйвер сми2 я прикрутил сессии простым добавлением в конфиг
'settings' => ['session_id' =>Helper::getUuid4()]
Про обрыв соединения, скорее всего имели ввиду при подключении через родной клиент. При работе по http соединение держать не нужно. -
Joined.
-
Привет. Подскажите, как я могу сконкатенировать массивы?
-
Да я уже попробовал, сделал в dev
$client->useSession()
Но вот красиво и правильно unit test написать не получается ) -
TDD? :)
-
добрый день, вопрос актуален
Alexandr Bocharov, [11.08.17 15:37]
при прочих равных - SummingMergeTree vs AggregatingMergeTree
у какого движка будет выше производительность, лучше потребление памяти, другие ньюансы/недостатки использования?
может есть бенчмарки? -
-
-
-
где-нибудь типа RabbitMQ?
-
Возможно ли использование поля из словаря в выражении WHERE?
SELECT * FROM
(
SELECT
foo1, foo2, foo3,
dictGetString('my_dict', 'dict_foo', tuple(toInt32(bar1), bar2))
FROM
my_table
WHERE
date = '2017-05-11'
) AS t1
WHERE dict_foo != 'smth'
LIMIT 10 -
-
Движок buffer
-
Напишу тесты тогда для проверки
-
На сколько я помню из рассказов о том как они кладут данные в метрике, то там был buffer в самом CH через которые эвенты сбрасываются в таблицу
-
Алексей не так давно рассказывал про то как этот буфер устроен и как им пользоваться. Плюсы и минусы. Если постараться, то можно в истории чатика найти )
-
нашел, что A ZooKeeper server will not remove old snapshots and log files when using the default configuration.
сколько посоветуете поставить autopurge.snapRetainCount и autopurge.purgeInterval? ну интервал часик например, а колво snapRetainCount? -
угу он самый
-
-
-
SELECT
[1, 2] AS x,
[3, 4] AS y,
arrayReduce('groupArrayArray', [x, y]) AS xy
┌─x─────┬─y─────┬─xy────────┐
│ [1,2] │ [3,4] │ [1,2,3,4] │
└───────┴───────┴───────────┘ -
Спасибо, а можно ли как-то над каждым элементом одного массива произвести изменение по какой-то функции и получить на выходе масссив: Например, ['x', 'y'] -> ['xx', 'yy'] ?
-
Документация ClickHouse | Документация ClickHouse
ClickHouse-это быстрая система управления базами данных с открытым исходным кодом, ориентированная на столбцы, которая позволяет создавать аналитические отчеты о данных в режиме реального времени с использованием SQL-запросов
-
Спасибо, проглядел!
-
Похожая проблема. Есть у кого то мысли???
-
У столбцов (IColumn) есть метод getDataAt, который позволяет получить ссылку на кусок памяти, где расположено значение. Это работает только для простых типов. Например, для массивов уже нет.
Также есть метод operator[], который позволяет получить значение в виде Field. -
И правда, временные таблицы не удаляются вообще никак. Странно, что только сейчас заметили.
-
Спасибо за примеры! Это старая проблема, нам давно пора это исправить. Постепенно делаем.
-
Подскажите пожалуйста, вижок AggregatingMergeTree как-то сокращает объем таблицы и или нет? Вообще какие могут быть области его применения? Спасибо
-
Никаких особенных проблем с float-ами нет кроме того, что это именно float-ы - то есть, плохо подходят для денег и в тех местах, где нужно хранить десятичные дроби без потери точности. А если нужно обрабатывать данные мониторинга, физические рассчёты, то float-ы будут в самый раз.
-
/stat@combot
-
Я для своих задач делаю через TinyLog, и потом удаляю - а озадачился только из за примера с session_id.
Мне кажется мало кто использует ее в ручном режиме, как в доки и написанно - "В большинстве случаев, временные таблицы создаются не вручную" -
-
-
теперь понятно. спасибо за ответ
-
-
Спасибо. Мне, в принципе, все равно данные форматировать надо, по этому я пытаюсь Воспользоваться WriteBuffer. Постгрес воспринимает данные через их текстовое представление.
-
dictionaries_lazy_load по-умолчанию true. В этом случае, первая загрузка словарей происходит при первом обращении к ним. После этого словари обновляются согласно указанному времени (в вашем случае примерно каждый час с разбросом в +- 10 минут).
Вы говорите, что словари исчезают? Такого поведения конечно быть не должно. Как это видно?
Также отмечу, что словари не перезагружаются, если можно определить, что источник не изменился (не увеличилось время модификации файла, время модификации MyISAM таблицы). -
Когда данные часто мержатся, то остаётся много старых part-ов. Они удаляются через 8 минут после мержа. Посмотреть на старые part-ы можно по значению поля active в таблице system.parts.
-
SummingMergeTree несколько (чуть-чуть) оптимальнее - по скорости мержа, и по скорости выполнения запросов. Если вам нужны только суммы, то он проще в использовании.
-
-
Как ни странно, для основного кластера мы не используем Buffer таблицы. В движок Метрики приходят данные уже в виде пачек, а эти пачки образуются для разных потоков данных одним из двух способов:
- накапливаются в файлах на неких серверах, которые принимают трафик;
- кладутся и вынимаются из Кафки. -
Можно. Для этого, задайте в подзапросе алиас для выражения, которое достаёт данные из словаря. И используйте это имя в условии снаружи.
-
Сейчас наконец-то запланирована задача, где конкатенация массивов делается по-нормальному.
-
AggregatingMergeTree агрегирует данные при мержах. То есть, если было много строк для одного ключа, то после мержа останется одна, агрегированная. Мержи производятся не для всех кусков сразу - данные постоянно держатся несколько недомерженными.
-
Тогда смотрите метод IDataType::serializeTextEscaped и похожие.
-
Да, я так и сделал. Мне по сути нужно из строки char**. Я просто \t заменил на 0 и собрал указатели (через WriteBufferFromOStream+stringstream), но что-то пошло не так, завтра буду разбираться.
-
Это Ок за исключением того, что строки будут лишний раз экранированы.
-
-
-
Много не active партов и они не удаляются уже в течении продолжительного времени...
-
Точнее, видимо, парты постоянно создаются. Их число скачет в районе 90 штук.
-
-
Можно больше
-
-
Чтоб самих инсертов было мало
-
-
а чем буферизируют в golang ? или вручную?
-
Я к примеру просто собираю в слайс, после чего просто проверяю длинну + тикер на каждые две секунды. Т.е. или инсерт идёт при достижении 10к, или каждые две секунды
-
GitHub - nikepan/clickhouse-bulk: Collects many small inserts to ClickHouse and send in big inserts
Collects many small inserts to ClickHouse and send in big inserts - GitHub - nikepan/clickhouse-bulk: Collects many small inserts to ClickHouse and send in big inserts
-
-
там написано что даже в буффер лучше слать пачками
-
- 15 August 2017 (62 messages)
-
-
Привет Всем.
Подскажите такой вопрос
как можно обрывать выполнения запроса в случае если запрос приходит через http но соединение периодически обрывается?
т.е. у нас получается что запрос запустился а сооединение отвалилось а запрос остался выполнятся. фигня в том что кол. данных которые перебирается уже большое и из-за таких обрывов растет загрузка на сервере и соответственно время выполнение запросов. -
Скажите, пожалуйста, а можно как-то повлиять на количество parts, при превышении которого КХ начинает кидаться ошибкой "Code: 252, e.displayText() = DB::Exception: Too much parts. Merges are processing significantly slower than inserts."?
-
медленнее лить.) Это означает что мержи неуспевают за инсертами
-
Проблема в том, что даже если ничего не лить, это количество сейас около 300. OPTIMIZE TABLE с FINAL отрабатывает моментально и ничего не делает. Вероятно это из-за того, что выполняю ее на не ведомой реплике. Но на лидирующей количество в 4 раза меньше. Проверил все варианты о которых писали, откуда такое может идти, ни одно не потвердилось. Мне бы сейчас потушить эту проблему и нормально разбраться.
-
Там есть ограничение по размеру кусков для мержа. Возможно из-за этого не мержит
-
А как этот параметр называется?
-
Joined.
-
-
Подскажите, пожалуйста, с помощью чего просуммировать математически элементы Array(UInt64), sumArray как я поняла, предназначен ля агрегации
-
-
Привет всем!
Кто-нибудь делал импорт в CH из Parquet файлов? -
спасибо большое
-
Ограничение на максимальный размер куска - max_bytes_to_merge_at_max_space_in_pool. Настраивается в config.xml, в секции merge_tree.
Количество кусков, после которого кидается исключение о том, что кусков слишком много - parts_to_throw_insert. Обычно увеличивать не имеет смысла, так как причина часто не в том, что куски не успевают мержатся, а в том, что они не мержатся вообще, из-за каких-либо проблем. -
Спасибо!
-
Надо смотреть более внимательно. Какой делается OPTIMIZE и какие куски в таблице для данной партиции (в system.parts). Как писал в почте, наверное проблема из-за версии 54266, но это пока гипотеза. Мы знаем, что в этой версии есть проблема.
-
Встроенного конвертера из Parquet нет, а очень бы хотелось сделать, только не очень понятно в какой формат делать конвертацию? В Native? это самый "родной" формат для CH и самый дешевый для импорта?
-
Да, Native самый оптимальный. Но его труднее сформировать вручную. Второй по простоте - RowBinary. Хотя сам Parquet больше всего похож на Native, и я думаю, что родную поддержку Parquet рано или поздно придётся сделать.
-
Да, откатили, запустил еще раз OPTIMZIE, лидер нагружен, на проблемной ноде пока все по старому.
-
В каком source файле можно вычитать спецификацию Native?
-
Да, Parquet/ORC было бы очень круто
-
yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data.
-
-
ну понятно что самой спеки нет, я имел ввиду какой-то модуль, типа DAO
-
как раз то что нужно
-
благодарю!
-
Всем привет. В sql я новичок. Помогите пожалуйста отфильтровать URL который оканчивается на ".ru/" или ".by/". Я делаю так WHERE StartURL LIKE '*.??/', но clickhouse так не фильтрует
-
where StartURL like '%.ru'
-
и также через OR
-
Делал, через Apache Spark (точнее pyspark):
1. читаем в DataFrame сам Parquet-файл
df = spark.read.parquet('/mnt/experiment/spark7/')
2. пишем в CH через jdbc-драйвер
df.write.jdbc(url="clickhouse://default:@localhost/log", table="log.log", mode="append")
Запуск питоновского файла:
~/spark-2.1.1-bin-hadoop2.7/bin/spark-submit \
—driver-class-path tmp/clickhouse-jdbc-0.1-25-jar-with-dependencies.jar \
—jars tmp/clickhouse-jdbc-0.1-25-jar-with-dependencies.jar \
script.py -
Спасибо, помогло
-
А скорость как? Устраивает?
И как вы боролись с type cast, не всегда схему паркета можно загнать напрямую в схему CH, float null на nan заменять, int null на какое-то значение -
Я прям напрямую из паркета в CH не делал, у меня исходные данные - файловые json-логи. Но с учётом обработки json-а , на 8 ядрах скорость чтения, обработки и вставки - 30к-40к записей логов в секунду (мне хватает)
-
Так там же можно сделать что-то типа такого
df.rdd.map(...).write.parquet
И уже в map преобразовывать данные как душе угодно -
Очень хороший вариант, согласен, но в нашем случае источник данных лежит в одном ДЦ, а CH на AWS, поэтому ищем способ перенести самую тяжелую часть ETL процесса на свою сторону, и копировать на S3 уже готовые и "дешевые" для импорта в CH данные
-
Тут вариантов может быть много:
1. Поднять в ДЦ реплику и писать в неё - в CH данные отреплицируются в сжатом бинарном виде;
2. в ДЦ через спарк писать сразу сжатый gzip-ом tab-separete файл и уже его переносить и импортировать;
и ещё куча можно придумать.
Мне нравиться первый вариант -
первый вариант 👍
будем думать, спасибо -
Joined.
-
Привет, а есть у кого-нибудь опыт поднятия clickhouse в kubernetes?
-
Всем привет. У меня есть таблица с кликами (600млн, 50Гб) и таблица с действиями по этим кликам (5млн, 100Мб). Я хочу создать представление из двух таблиц, где данные будут браться из действий и дополняться данными из клика. Как мне это сделать правильно в кликхаусе? При тестировании запроса для представления всё падает на Memory limit.
-
Объединение данных идет по hit_id, который прописан в индексах обеих таблиц
-
Обычно оба типа событий кладут в одну таблицу.
-
Joined.
-
есть проблема с использованием сlickhouse (carbonapi + graphite-clickhouse ) в качестве хранения метрик, на запись да все ок (carbon-clickhouse), а на чтение там где (carbonapi + carbonserver go-carbon) на сервере требуют 25% CPU и 30Гб памяти суммарно на весь поток, clickhouse уже на 30% трафика на чтение CPU в 90% и по памяти быстро улетает в оом, некоторые запросы у меня не помещались по элементам увеличивал параметры
<max_query_size>104857600</max_query_size>
<max_ast_elements>100000</max_ast_elements>
<use_uncompressed_cache>1</use_uncompressed_cache>
<max_concurrent_queries>500</max_concurrent_queries>
<uncompressed_cache_size>17179869184</uncompressed_cache_size>
не очень понятно что еще можно подкрутить , сервер 2CPU CPU E5-2620 v3 24 ядра с HT 64Гб памяти + ssd -
схема данных
CREATE TABLE graphite (
Path String,
Value Float64,
Time UInt32,
Date Date,
Timestamp UInt32
)
ENGINE = ReplicatedGraphiteMergeTree(
'/clickhouse/tables/{shard}/graphite',
'{replica}', Date, (Path, Time), 8192, 'graphite_rollup'
);
CREATE TABLE graphite_tree (
Date Date,
Level UInt32,
Path String,
Deleted UInt8,
Version UInt32
)
ENGINE = ReplicatedReplacingMergeTree(
'/clickhouse/tables/{shard}/graphite_tree',
'{replica}', Date, (Level, Path), 8192, Version
);
1 шард 2 реплики -
<max_concurrent_queries>500</max_concurrent_queries>
Увеличивать не имеет смысла, даже по-умолчанию 100 одновременных запросов - очень много. -
Надо взять какой-нибудь достаточно сложный запрос и посмотреть, почему он выполняется долго.
-
-
528412 вроде как раз он и есть
-
Это номер потока, в котором выводится сообщение. Чуть выше будет запрос.
-
2017.08.15 20:25:14.056114 [ 528412 ] <Debug> executeQuery: (from 127.0.0.1:52064) SELECT Path, Time, Value, Timestamp FROM graphite WHERE (Path IN ( 'тут портянка на несколько Мб метрик') , (column 1 in (-inf, 1502830859]), and, (column 1 in [1502744400, +inf)), and, unknown, and, unknown, and
2017.08.15 20:25:14.203261 [ 528412 ] <Debug> default.graphite (SelectExecutor): Date condition: unknown, unknown, and, unknown, and, (column 0 in (-inf, 17394]), and, (column 0 in [17393, +inf)), and
2017.08.15 20:25:14.213445 [ 528412 ] <Debug> default.graphite (SelectExecutor): Selected 12 parts by date, 12 parts by key, 3354 marks to read from 491 ranges
2017.08.15 20:25:14.214105 [ 528412 ] <Trace> default.graphite (SelectExecutor): Reading approx. 27475968 rows
2017.08.15 20:25:14.217015 [ 528412 ] <Trace> InterpreterSelectQuery: FetchColumns -> Complete
2017.08.15 20:25:14.357540 [ 528412 ] <Debug> executeQuery: Query pipeline:
2017.08.15 20:25:23.106839 [ 528412 ] <Trace> UnionBlockInputStream: Waiting for threads to finish
2017.08.15 20:25:23.107887 [ 528412 ] <Trace> UnionBlockInputStream: Waited for threads to finish
2017.08.15 20:25:23.108086 [ 528412 ] <Information> executeQuery: Read 27448731 rows, 3.97 GiB in 9.050 sec., 3032937 rows/sec., 448.74 MiB/sec. -
Дальше можно смотреть, почему этот запрос медленно выполняется.
-
есть какой то профилировщик или в логе дальше должно быть?
-
В логе нет. Встроенного профилировщика тоже нет.
Можно запустить запрос в цикле с помощью:
clickhouse —benchmark < query.tsv
И после этого смотреть на время выполнения и системные ресурсы - диск, CPU.
Если потребляется CPU, то посмотреть perf top. -
Я подозреваю, что можно ускорить этот запрос не более чем в несколько раз, а в остальном проблема в наличии очень большого количества запрашиваемых метрик и того факта, что данные по этим метрикам расположены не рядом (приходится читать 27 448 731 строк).
-
-
А карбон это wso?
-
Не очень понял, wso - что это?
-
-
-
-
Не это другое, я про https://github.com/lomik/carbon-clickhouseGitHub - lomik/carbon-clickhouse: Graphite metrics receiver with ClickHouse as storage
Graphite metrics receiver with ClickHouse as storage - GitHub - lomik/carbon-clickhouse: Graphite metrics receiver with ClickHouse as storage
- 16 August 2017 (34 messages)
-
Добрый день.
У меня есть таблица ReplicatedMergeTree и поверх нее Distributed таблица. Могу ли я добавить одну или несколько колонок в таблицу ReplicatedMergeTree и потом обновить Distributed? И если могу, то как это сделать? -
Добрый день. У кого такие ошибки есть? Что делать?
2017.08.12 14:39:00.597913 [ 21 ] <Error> ZooKeeper: There are 220000 active watches. There must be a leak somewhere.
2017.08.12 14:39:11.587373 [ 19 ] <Error> ZooKeeper: There are 220000 active watches. There must be a leak somewhere.
2017.08.12 14:39:11.630992 [ 19 ] <Error> ZooKeeper: There are 220000 active watches. There must be a leak somewhere.
2017.08.14 06:18:30.123913 [ 19 ] <Error> ZooKeeper: There are 230000 active watches. There must be a leak somewhere.
2017.08.14 06:18:30.239225 [ 19 ] <Error> ZooKeeper: There are 230000 active watches. There must be a leak somewhere.
2017.08.15 14:08:54.880665 [ 21 ] <Error> ZooKeeper: There are 240000 active watches. There must be a leak somewhere.
2017.08.15 18:21:24.945117 [ 21 ] <Error> ZooKeeper: There are 250000 active watches. There must be a leak somewhere. -
Самый простой способ: удалить distributed, добавить колонки через alter table, создать distributed снова
-
спасибо!
-
А вас какая версия? Тут только рестарт поможет.
-
-
Добрый день всем, может быть кто сталкивался с таким?
У нас есть таблица events_distributed с полями a Int32, b Int32, c_xxx String, c_yyy String, c ENGINE Distributed и четыре шарда events_sharded с ENGINE ReplicatedMergeTree на разных машинах.
При вставке в events_distributed в одну из нод видим в логах ошибки вида:
There is no column with name c. There are columns: a, b, c_xxx, e.what() = DB::Exception (from 111.222.33.444:59118) (in query: INSERT INTO events_sharded (a, b, c_xxx, c_yyy) FORMAT RowBinary), Stack trace:
0. clickhouse-server(StackTrace::StackTrace()+0x16) [0x28ae4d6]
1. clickhouse-server(DB::Exception::Exception(std::string const&, int)+0x1f) [0x102a3af]
2. clickhouse-server(DB::ITableDeclaration::check(DB::Block const&, bool) const+0x922) [0x29b3472]
3. clickhouse-server(DB::MergeTreeDataWriter::splitBlockIntoParts(DB::Block const&)+0x35) [0x2a3e845]
4. clickhouse-server(DB::MergeTreeBlockOutputStream::write(DB::Block const&)+0x40) [0x29c1f90]
5. clickhouse-server(DB::PushingToViewsBlockOutputStream::write(DB::Block const&)+0x486) [0x2b38906]
6. clickhouse-server(DB::copyData(DB::IBlockInputStream&, DB::IBlockOutputStream&, std::atomic<bool>*)+0x91) [0x2af5aa1]
7. clickhouse-server(DB::PushingToViewsBlockOutputStream::write(DB::Block const&)+0x41d) [0x2b3889d]
8. clickhouse-server(DB::MaterializingBlockOutputStream::write(DB::Block const&)+0x28) [0x2b27698]
9. clickhouse-server(DB::AddingDefaultBlockOutputStream::write(DB::Block const&)+0x235) [0x2c6f295]
10. clickhouse-server(DB::ProhibitColumnsBlockOutputStream::write(DB::Block const&)+0x4f) [0x2c892af]
11. clickhouse-server(DB::SquashingBlockOutputStream::finalize()+0x455) [0x2c507f5]
12. clickhouse-server(DB::SquashingBlockOutputStream::writeSuffix()+0x11) [0x2c50981]
13. clickhouse-server(DB::TCPHandler::processInsertQuery(DB::Settings const&)+0x2ce) [0x104405e]
14. clickhouse-server(DB::TCPHandler::runImpl()+0x67a) [0x10447aa]
15. clickhouse-server(DB::TCPHandler::run()+0x1c) [0x104540c]
16. clickhouse-server(Poco::Net::TCPServerConnection::start()+0xf) [0x315d0af]
17. clickhouse-server(Poco::Net::TCPServerDispatcher::run()+0x10b) [0x317ac3b]
18. clickhouse-server(Poco::PooledThread::run()+0x87) [0x337b807]
19. clickhouse-server(Poco::ThreadImpl::runnableEntry(void*)+0x96) [0x333d456]
При этом на сам POST запрос ClickHouse возвращает 200 OK.
Проверили схемы на всех машинах — все поля присутствуют и в локальных _sharded, и в _distributed таблицах.
ClickHouse server version 1.1.54245.
Вопросы:
1. Почему в списке There are columns: a, b, c_xxx указаны не все столбцы events_sharded?
2. Почему кликхаус репортит попытку вставить столбец c, если прям там же, в приведённом запросе на вставку в шард, никакой попытки вставить это поле нету? (INSERT INTO events_sharded (a, b, c_xxx, c_yyy) FORMAT RowBinary).
Возможно, он при выводе названия поля съедает всё что после _?
3. Вставка в distributed таблицу это неблокирующая операция? Т.е. даже если клиенту вернулось 200 ОК, то ещё нет гарантии, что данные запишутся во все шарды?
4. Что делать?) Пересоздать все distributed и локальные таблицы?
Спасибо за внимание) -
-
Joined.
-
А вы Replicated-таблицы часто создаете/удаляете?
-
Joined.
-
-
Joined.
-
привет, а есть где-то почитать какие бестпрактики хранения данных для сервисов наподобие яндекс метрики?
-
-
Вы делали ALTER'ы? Distributed-таблицы и удаленные таблицы никак не синхронизируются при Альтерах.
3. Возвращается Ок если данные записались в локальное хранилище Distributed-таблицы. Затем эти данные в фоне вставляются в шарды. Поэтому если вставка в шарды не пройдет, то вы заметите это только по логам. Если вставка в шард завершилась неудачей, то она будет повторена через таймаут.
2. Он репортит, что во время вставки данных из локального хранилища в удаленную таблицу, она ожидает колонку c, а ее нет в вставляемом блоке. Проверьте что к тому моменту времени таблица на 111.222.33.444 имела нужную структуру.
1. Возможно ли так что, вы когда-то вставляли только (a, b, c_xxx)?
4. Зависит от того какая стуктура Distributed таблиц у вас была до этого. -
https://tech.yandex.ru/metrika/doc/api2/logs/clickhouse-integration-docpage/
https://www.youtube.com/watch?v=pOHqwTC--vQAPI Метрики — Подключение Logs API к ClickHouse — Технологии ЯндексаClickHouse позволяет работать с неагрегированными статистическими данными Яндекс.Метрики, полученными с помощью Logs API. Чтобы подключить Logs API к ClickHouse, выполните следующее:
-
-
Подскажите пожалуйста, что значит сообщение в логе зоокипера? Не хочет работать репликация
2017-08-16 20:27:40,719 - INFO [ProcessThread(sid:0 cport:2181)::PrepRequestProcessor@648] - Got user-level KeeperException when processing sessionid:0x15de1b442c90004 type:setData cxid:0x59944a08 zxid:0xad txntype:-1 reqpath:n/a Error Path:/clickhouse/tables/01/hits_r/block_numbers/201708/block-0000000000 Error:KeeperErrorCode = NoNode for /clickhouse/tables/01/hits_r/block_numbers/201708/block-0000000000 -
с точки зрения метрики оптимальнее по ресурсам будет, если вы будете раз в день выгружать за вчера. также во-первых за минуту данные могут еще не доехать, во-вторых могут в будущем еще измениться.
-
Хотят видеть график в графане наиболее приближённый к текущему времени ;) может есть плагин чтобы сразу в метрику по API ходить? Если нет за сколько примерно данные точно доезжают ? 10 минут час или вот прям 1 день?
-
-
-
Это уровень INFO. Ничего критичного не значит. Не обращайте внимания.
-
-
1. вы можете проверсти эксперимент, выгружать один и тот же поминутный график и смотреть через сколько минут от now() точки в прошлом перестают модифицироваться, т.е. чему равно наблюдаемое отставание. предположу что оно может быть больше одной минуты.
2. выгрузки для logsapi это некий фоновый процесс, который по-моему вообще не затрагивает текущую дату, и не расчитан на большое количество маленьких задач.
3. в индексе в метрике есть из времени только дата, т.е. запрос за минутой данных имеет кпд по диску меньше 0.1% , и если вы не упретесь в какие-то квоты апишные сразу, то возможно это случится позже, если нагрузку станет заметно на приборах.
4. в целом метрика во внешнню сторону это не реалтаймовая потоковая история. -
Прежде чем делать что-то самому, пытаюсь собрать максимум информации чтобы потом не переделывать. Предположил что это достаточно частая задача и возможно уже решена. Видимо это не так.
-
Помогите пожалуйста разобраться
сделал реплицируемую таблицу на двух репликах. Зоокипер КХ видит в него данные отправляет, но на другой сервер они не заливаются.
ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/hits', '{replica}'
вот путь который указан, он для таблицы на каждом сервере должен быть одинаковый?
что делаю не так? -
'{replica}' и вот это имя оно для разных серверов должно быть одинаковое или разное?
-
-
yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data.
-
Большое спасибо за ответы!
Да, ALTER был, но мы это сделали на всех узлах.
Получается, вполне возможно, что это "старый" INSERT который всё никак не пройдёт из буфера в шард?
У него есть TTL?) Что с ним можно сделать и как очистить локальное хранилище Distributed-таблицы?) -
TTL нет. Можно зайти в директорию Distributed таблицы и найти там ровно те (первые) файлы, которые с неправильной структурой, и удалить их.
Посмотреть структуру можно по началу файла - там будет приведён INSERT запрос. -
- 17 August 2017 (91 messages)
-
Joined.
-
Joined.
-
Интересная штука https://github.com/jarulraj/sqlcheck от человека из CMU Database Group, для тех кто не в курсе про CMU рекомендую http://db.cs.cmu.edu/ и их видео https://www.youtube.com/channel/UCHnBsf2rH-K7pn09rb3qvkAGitHub - jarulraj/sqlcheck: Automatically identify anti-patterns in SQL queries
Automatically identify anti-patterns in SQL queries - GitHub - jarulraj/sqlcheck: Automatically identify anti-patterns in SQL queries
-
Release notes?
-
-
Может быть тут появится https://www.altinity.com/blog/ClickHouse tips, tricks, best practices, updates — Altinity
ClickHouse best practices to improve your deployments including performance, Grafana, Kafka, Tableau, Kubernetes, and SQL.
-
Joined.
-
Всем привет. помогите пожалуйста разобраться.
Есть кластер кликхауса из 4х машин 2х2. Создана таблица ReplicationMergeTree. Над ней Distibuted таблица. Insert делается в таблицу ReplicationMergeTree. Выборка из Distributed таблицы. Проблема в том, что кол-во записываемых строк не совпадает с тем, что отдает select. Смотрел по логам кликхауса - соощение
"Wrote block with ID .... N Rows". Тут количество сходится с ожидаемым.
Если заменить ReplicationMergeTree на MergeTree, то такой проблемы нет. в чем может быть проблема? где искать?
спасибо -
Коллеги, Добрый день! Не подскажите, есть ли уже готовое решение загрузить много данных из google storage в clickhouse? Раньше данные забирали при помощи spark.
-
Тоже сталкивались с такой проблемой: https://github.com/yandex/ClickHouse/issues/972
В нашем случае решилось после того как стали писать в локальные таблицы вместо Distributed и отказались от MATERIALIZED столбцов.Data duplication · Issue #972 · yandex/ClickHouseWe have a Distributed table with two-node cluster with ReplicatedMergeTree tables. Once in 3 secs we make an insert to the Distributed table and see that some of the data are duplicated. Why and ho...
-
Ну и да, у нас данных становилось больше.
-
Пишем в локальные реплицируемые таблицы. и у нас данных меньше ожидаемого)
-
По-моему меньше может быть из-за того что одинаковые пачки схлапываются при репликации.
-
я так понимаю это происходит для ReplacingMergeTree. или не только?
-
кто может подсказать, почему межсерверные взаимодействия не проходят
2017.08.17 12:34:34.870143 [ 23 ] <Trace> ReadWriteBufferFromHTTP: Sending request to http://mnstat19:9009/?endpoint=DataPartsExchange:%2Fclickhouse%2Ftables%2F01%2Fhits_r%2Freplicas%2F192.168.0.19&part=20170816_20170816_0_0_0&shard=&compress=false
2017.08.17 12:34:34.877346 [ 23 ] <Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused, e.what() = Connection refused -
а проверь открыты ли порты и можешь ли заломиться на них с другого сервера
-
спасибо, вроде стало понятно
кх ходит между машинами по хосту, а хост на другой ip забиндили -
Привет! У меня есть main_table MergeTree и материализованная вьюха agg_table AggregatingMergeTree смотрящая на main_table. Проблема в том что когда делаешь вставку в main_table одним большим батчем, то agg_table получается абсолютно не оптимизированной. Подскажите, пожалуйста, что делать в этом случае?
-
-
https://clickhouse.yandex/docs/ru/single/#table-engines-replication
>Блоки данных дедуплицируются. При многократной записи ... -
хм, спасибо. проверю этот вариант
-
У меня тут ClickHouse на локальной машине обновился и теперь вот так
clickhouse-client --version
terminate called after throwing an instance of 'Poco::SystemException'
what(): System exception
Aborted (core dumped)
clickhouse-server --version
terminate called after throwing an instance of 'Poco::SystemException'
what(): System exception
Aborted (core dumped)
при этом сам cервер работает
[clickhouse]host(s)=127.0.0.1:9000, database=default, username=default
[clickhouse][connect] num=1 -> 127.0.0.1:9000
[clickhouse][hello] -> Golang SQLDriver 1.1.54213
[clickhouse][hello] <- ClickHouse 1.1.54276 (Asia/Nicosia) -
-
А вы обновили оба приложения, клиентское и серверное?
-
-
Joined.
-
спасибо. помогло
-
Прочекали все .bin файлики в директории distributed таблицы на всех нодах: на трёх нодах вообще папки пустые, но на одной скопилось достаточно много .bin файлов (за целую неделю). Я так понимаю, в идеале, они не должны копиться?
Олсо, в наименовании вложенных директорий записан юзер и ip адрес, это адрес источника данных?
Ну и самое главное — ни в одном из файлов не нашли "неподходящих" insert-ов, все указанные в запросе поля есть сейчас в текущих схемах (что в distributed, что в локальных). -
-
-
Aleksey Palazhchenko
Long-term storage for @PrometheusIO 2.0 on top of @ClickHouseDB https://t.co/ZgBqNITbeW #promcon2017
-
Да, не должны накапливаться. Данные остаются на файловой системе только если их не удалось отправить.
Да, в имени директории записывается адрес, куда отправлять. Старые данные также могут остаться, если адрес перестал быть валидным.
> Ну и самое главное — ни в одном из файлов не нашли "неподходящих" insert-ов, все указанные в запросе поля есть сейчас в текущих схемах (что в distributed, что в локальных).
Возможно, что по логу сервера будет понятно, какой файл не удаётся отправить? Если нет, то попробуйте перенести в сторону некоторое количество файлов с начала по порядку их номеров.
> И ещё: если делать SELECT на такой distributed таблице, туда попадают данные из этого буфера?
Нет, не попадают. -
-
По этому поводу есть новость: в последней stable версии, которая вышла вчера, появилась опция insert_distributed_sync. Если её выставить в 1, то данные в Distributed таблицу будут вставляться синхронно. Возможно, даже лучше было бы сделать этот вариант по-умолчанию.
-
-
Интересно! Давно просят такую штуку.
-
-
Вот это очень кстати. А то судя по всему, многие из-за асинхронной distributed вставки предпочитают делать запрос напрямую в локальные таблички.
-
-
Это коррелирует с настройкой internal_replication? Или имеется в виду, "синхронно дожидаться отправки на одну из реплик шарда, куда должна случиться запись" ?
-
В зависимости от internal_replication, вставляет либо на все реплики (если internal_replication = false), либо на любую (если internal_replication = true). Это работает так же, как и при асинхронной записи.
-
У нас делается так: одни лиюди пишут документацию на русском, затем другие переводят. Правда процесс перевода пока ещё не налажен - как раз завтра буду разговаривать с теми, кто за это отвечает.
-
Алексей, а есть changelog к версии вышедшей вчера?
-
-
-
мы постоянно юзаем, колонки две: дата и ДатаИВремя. Дата наверное нужна для партицирования. Очень удобно и быстро работает)
-
-
-
-
-
Ещё нет changelog. И документация тоже обновляется с задержкой.
-
Эти функции весьма дешёвые по вычислению.
Отдельные столбцы оправданы только в случае, если они позволяют считывать существенно меньше данных с диска. Например, если есть столбец DateTime, то имеет смысл держать отдельный столбец Date - он намного легче. И в случае MergeTree это и так форсировано.
В остальном отдельные столбцы с результатами этих функций держать неоправдано. (Единственное, когда может быть существенный выигрыш - если запрос очень лёгкий и почти ничего больше не делает.) -
-
Я тоже за changelog . Выходит много релизов , а что в них - одному Алексею Миловидову известно )) Да и судя по планам которые видел на семинарах по КликХаусу уже давно должен быть update и delete .
-
-
-
-
Help Code: 229, e.displayText() = DB::Exception: Query is too large (263512). max_query_size = 262144, e.what() =
-
Поменял в config.xml
-
не исправилось
-
сервер ребутил
-
Это настройка уровня пользователя, настраивается в users.xml.
Пропишите в profiles/default. -
Changelog в пути :)
-
Ой! Приятно ) Просили передать от коллег большое спасибо ) пол года прода без единой проблемы))
-
Подскажите, произвольное партицирование в ближ время подоспеет ?:)
-
Так на сколько я понимаю, выбор ключа при создании таблицы и есть по сути партиционирование
-
Передал всем, кто сидит рядом, спасибо!
-
Не очень в ближайшее. Скорее в середине осени.
-
Партиции - отдельные части таблицы, которые можно удалять, перемещать вручную, и это сейчас только по месяцам.
-
Ну в середине осени уже неплохо!
-
Тут недолго осталось :)
-
-
Скорейшего решения, для нас прям очень актуально
-
-
Кстати, какой у вас кейс - по какому выражению хотите партиционировать?
-
(сорри что врываюсь в вашу беседу) я помоему кстати про свой кейс рассказывал - хочу чистить данные меньше чем по месяцу - а конкретно у меня есть статистика из графита и стек трейсы, они где-то сжирают 20ГБ места в день на сервере после сжатия кликхаусом (при условии 4х серверов и distributed таблицы). Вот я хочу хранить 45 дней максимум, больше мне надо
-
-
-
-
-
-
-
-
я создавал похожий фиче реквест для alter table * drop key range - https://github.com/yandex/ClickHouse/issues/654 . Партиционирование позволило бы решить эту задачу немного по-другомуFeature request: add ability to drop MergeTree table parts by primary key range · Issue #654 · yandex/ClickHouse
The issue Suppose the following MergeTree table exists with rows sorted by (EventID, EventDate, ClientID). CREATE TABLE a ( EventID UInt8, EventDate Date, ClientID UInt32, Payload S...
-
-
-
Мы продумывали эту задачу в виде ALTER UPDATE/DELETE. Смысл в том, что соответствующий UPDATE/DELETE реализуется путём перезаписи part-ов, подходящих под условие. Проблема в реализации сейчас в том, что это плохо проходит через механизм репликации. В целом решаемо, но пока откладываем.
-
-
Joined.
-
У нас данные растянуты по времени, но привязаны к пользователю. Очень часто получается так, что сотрудника увольняют и его данные не нужны больше в системе и их было бы не плохо удалять. Сейчас это планируем делать в лоб :) Хранить файл с идентификаторами удаленных/уволенных пользователей и отправлять на сервер с исключающим условием, либо подключать словарь и через dictionary движок исключать их из выборки. Конечно, можно удаленных и в сам КХ писать, но это не позволяет бизнес-логика ( Есть некоторые сложности (
-
Так же у нас есть некоторые типы эвентов, которые в дальнейшем не планируется хранить впринципе. Они нужны какой то определенный период времени. В качестве идентификатора типа эвента - строка.
- 18 August 2017 (156 messages)
-
Joined.
-
У нас есть "странный" кейс с партишенами. У нас есть сырые данные и постпроцессинг который агрегирует данные в "отчеты" для пользователей, т.к. вливать данные напрямую долго и пользователи будут видеть разные данные, мы делаем create table tmp_*** as source_table заливаем в нее (или несколько таблиц) данные, делаем DETACH перемещаем файлы и делаем ATTACH в нужной таблице, это не очень удобно т.к. требует чтоб у воркера был доступ к файловой системе, да и вообще тот ещё костыль )
-
Костыль тот еще, но мы подобными костылями страдаем )я имею ввиду пока не удалось избавиться от аггрегации
-
-
-
Доброе утро! Народ, вот хоть убейте! Мы не можим настроить реплицирование с шардированием 2х2.
Схему реплик прописали, зукипер прописали, с макросами не понятно.
На каждой ноде прописали в config.xml
<macros><shard>01</shard><replica>01</replica></macros>
с разными цифрами на каждой ноде. Пытаюсь создать таблицу
..............
) ENGINE = ReplicatedSummingMergeTree('/clickhouse/tables/{shard}/normal_summing_sharded', '{replica}', event_date, (event_date, event_time, body_id), 8192);
Получаю
Received exception from server:
Code: 62. DB::Exception: Received from 10.254.122.232:9000. DB::Exception: No macro shard in config.
Что не так-то??? -
-
Мы батчуем поток эвентов в файлы, потом эти файлы гоним в таблицы. В одну таблицу может быть несколько вставок из одного файла. Чтобы сделать exact-once семантику, хотим делать delete по filename из таблиц при вставке
-
> достаточно, чтобы имя было уникально лишь в пределах каждого шарда.
это соблюдено
второе сейчас админ проверит -
Добрый день. А возможно как-нибудь попросить автора библиотеки
https://bitbucket.com/ppodolsky/clickhouse-python
при наличии желания и возможности, апнуть библиотеку добавлением узнавания всяких Nullable(*) полей или нижеперечисленную парочку ?
На данный момент стали нужны два типа, указанные в соотв. ошибках:
No field class for Nullable(UInt32)
No field class for Nullable(String)
Я конечно ща сам попробую, но там так всё красиво, боюсь испортить)ppodolsky / clickhouse-pythonHg repository hosted by Bitbucket.
-
можете наверное там тикет завести или какой то комментарий
также рекоммендую посмотреть на проект https://github.com/Infinidat/infi.clickhouse_ormGitHub - Infinidat/infi.clickhouse_orm: A Python library for working with the ClickHouse database (https://clickhouse.yandex/)A Python library for working with the ClickHouse database (https://clickhouse.yandex/) - GitHub - Infinidat/infi.clickhouse_orm: A Python library for working with the ClickHouse database (https://c...
-
Спасибо. Этот не смог запустить на python3
-
посмотрите вот этот pr https://github.com/Infinidat/infi.clickhouse_orm/pull/44Fix python3 compatibility by TvoroG · Pull Request #44 · Infinidat/infi.clickhouse_orm
infi.clickhouse_orm - A Python library for working with the ClickHouse database (https://clickhouse.yandex/)
-
Спасибо, посмотрю!
-
-
К слову о партиционировании. Сейчас приплыла задача для анализа видео-контента. Есть видео, есть зритель и нужно понимать какие участки видео самые неинтересные, самые просматриваемые и все такое. Какой процент видео просматривается в среднем и пр. И я так полагаю, что тут партиционирование хорошо сработало бы по идентификатору видео, а не по дате, т.к. по сути с такими эвентами дата и время роли не играет.
-
Привет! Загружаю TSV файл 4GB. max_memory_usage установлен 1GB.
cat /data/transactions | clickhouse-client --query="INSERT INTO stat.xxx FORMAT TabSeparated"
Получаю: Connection reset by peer while writing to socket
В логе: Memory limit (for query) exceeded: would use 1.04 GiB
Что нужно настроить, чтобы это работало?
Clickhouse вообще позволяет загружать файлы большие чем оператива, или их обязательно нужно делить на мелкие? -
вообще говоря, время может быть дополнительной переменной для анализа
с утра, вечером и в разные времена года разные участки одного и того же видео могут быть разные -
Вообще время будет присутствовать отдельной колонкой, но это не приоритет. К тому же, что по одному видео может быть примерно такой объем данных. 1 видео, длительность в 3 минуты (180 строк на одного пользователя), с учетом сиков по видео может быть 200-250 на просмотор, в среднем 5-10 просмотров, есть кейсы когда видео смотрят в течение трех часов и делают конспекты, в таких кейсах может быть по 1000-3000 строк на один просмотр. Кол-во пользователей просматривающих видео от 100 до 40 000, кол-во видео в курсе в среднем 100 штук длительностью от 3 минут до 10 минут, в системе пока 10 курсов, но в ближайшем будущем курсов будет около 200 ) И да, видео контент будет обновляться и старые данные нужно будет выкидывать, т.к. их будет овер дохрена...у нас как бы есть 77 ТБ места, но...даже оно когда то кончится.
-
Поэтому держать данные по видео в одной партиции будет куда рациональней чем размазать данные по времени )
-
-
200 курсов по 100 видео? )))
-
Идея хорошая, но не знаю как это сработает по факту
-
-
-
Нет, длительность видео от трех минут до десяти минут
-
-
-
-
-
Ну я так делал в другом проекте, работает :) Только КХ партиционирует по месяцам
-
Не по дням
-
могу предложить воспользоваться нативным python-драйвером, если не нужно ORM: https://github.com/mymarilyn/clickhouse-driver там есть NullableGitHub - mymarilyn/clickhouse-driver: ClickHouse Python Driver with native interface support
ClickHouse Python Driver with native interface support - GitHub - mymarilyn/clickhouse-driver: ClickHouse Python Driver with native interface support
-
Имеется ввижу возможность сделать MOVE PARTITION между таблицами?
-
спасибо, смотрю.
-
У нас вообще очень остро сейчас стоит вопрос с обновлением данных и удалением. Удаление не так приоритетно пока есть запас места. А обновление да. Есть у нас например пользователь у которого имеется куча фактов. Эти факты аггрегируются из сырых данных каждый раз когда прилетает новая пачка данных по пользователю. Пересчитываются все факты, т.к. они между собой взаимосвязаны, например в MySQL у нас сейчас есть строка пользователя к которой джойнятся нужные факты и пользователи по ним фильтруются, группируются и пр., но MySQL такая тугая штука, что капец просто...рассматриваем сейчас вариант переезда на постгрес, но хотелось бы аггрегированные данные складывать в КХ и там проводить последующую аггрегацию для построения отчетов
-
С партициями ограничение - их не должно быть слишком много. Хотя они легче, чем отдельные таблицы, но если партиций много, то будет просаживаться производительность SELECT-ов, затрагивающих большое количество партиций.
-
Планируется выбирать статистику только по одному видео, т.е. данные по факту берутся только из одной партиции
-
Например запрос возвращает три колонки (одна из них лишняя) работает за 5мс, а тот же самый запрос только с двумя колонками работает уже 2 секунды...MySQL мать его.
-
И таких кейсов пруд пруди блин
-
В конфиге у нас макрос инклюдится из соседнего файла:
<macros incl="macros" />
в итоге в сгенерированном config-preprocessed.xml вижу такое:
<macros>
<shard>01</shard>
<replica>02</replica>
</macros>
вроде как всё на месте, а ошибка всё равно осталась -
10.254.122.232:9000. DB::Exception: No macro shard in config.
-
Даже если у нас будет 2000 партиций где одна партиция - данные по одному конкретному видео, то мы все равно будем работать на один select запрос только с этой партицией, т.е. по сути ничего страшного не будет я полагаю
-
И еще есть вопрос по поводу Nested колонок. Они как то сжимаются? Например нужно собирать статистику по тестированию (вопрос-ответ), у вопроса может быть несколько вариантов ответа и соответсвенно пользователь выбирает 2-3 варианта ответа и я кладу их в nested колоноку, сжатие будет эффективным в таком случае или лучше класть не текстовое представление ответа, а именно идентификатор варианта ответа?
-
Они сжимаются так же, как обычные поля. То есть, текстовые значения будут сжаты. Но идентификаторы или Enum будут сжаты ещё несколько лучше, а также будут существенно более выгодными по CPU.
-
Ну я так и думал, что все таки идентификаторы будут лучше. Enum не получится вкрутить, т.к. идентификаторы не UUID :( Идентификаторы по tincan не предусматриваются для вариантов ответа и приходят в чистом текстовом виде, а мы уже перед записью строки в КХ можем присваивать им идентификаторы
-
Точнее не потому что они не UUID, а список идентификаторов заранее неизвестен )
-
Понятно.
-
да, это было бы удобно
-
Не понимаю, вот я вызвал геофункцию ради теста из примера в доке
SELECT DISTINCT regionToName(regionToArea(toUInt32(number), 'ua'))
FROM system.numbers
LIMIT 15
А мне намекают, Dictionaries was not loaded. You need to check configuration file..
Я так понял, что словари д.б. из Яндекс.Метрики. Они-таки embedded ? следовательно опенсурс? ) Или это нечто экономически сакральное, только для служебного парсинга? -
Это значит, что словарь надо скачать и положить в папочку с конфигом :)
-
Хотя могу ошибаться )
-
а не обязательно сперва проходить собеседование? )
—-
Геобаза загружается из текстовых файлов. Если вы работаете в Яндексе, то для их создания вы можете воспользоваться инструкцией: https://github.yandex-team.ru/raw/Metrika/ClickHouse_private/master/doc/create_embedded_geobase_dictionaries.txt -
Кажется, обязательно
-
печалити
-
Так и зарплату дадут :)
-
-
-
false
-
не хотел задеть (((
-
ничо. Но оффтопик)
-
Joined.
-
'''Доступ к БД не связан с настройкой readonly. Невозможно дать полный доступ к одной БД и readonly к другой.'''
Из документации.
Есть ли изменения в сисетме прав доступа, или пока всё так же? -
А почему не пойдёт просто первичный ключ вида (VideoID, UserID)? Или старые видео хочется удалять потом?
-
заметил такую штуку: если в поля Date или DateTime вставлять unix timestamp, то вставка существенно замедляется. Примерно так: 100к строк вставляется за 0.5 сек, если указаны нормальные даты ('2017-08-18'), и 5 секунд. если timestamp (1503063892). Разница в 10 раз. Это нормально? У нас во всех сислогах timestamp'ы, а сишники не чешутся, мне грустно...
-
проще в скриптах и коде конвертировать
-
-
-
-
кто пишет в базу тот и конвертирует :P
-
-
-
Да, в native дата int16(дни от 1970), дататайм int32, на Go это выглядит так https://github.com/kshvakov/clickhouse/blob/refactoring/lib/column/datetime.go#L30
-
-
Здравствуйте. Есть запрос, который выполняется на distributed таблице.
SELECT
hash1,
hash2,
sum(month = '2017-05-15') AS cnt_1,
sum(month = '2017-06-15') AS cnt_2,
minIf(p, month = '2017-05-15') AS p_1,
minIf(p, month = '2017-06-15') AS p_2,
p_2 - p_1 AS p_diff
FROM table_distributed
WHERE (month IN ('2017-05-15', '2017-06-15')) AND (hash1 = cityHash64('value'))
GROUP BY
hash1,
hash2
HAVING (cnt_1 > 0) AND (cnt_2 > 0) AND (p_diff < 0)
ORDER BY p_diff desc
LIMIT 100
Данных в distributed таблице 25kkk, обрабатываемых данных на этот запрос 250kk, из которых получается 10кк. Если выполнять этот запрос на каждом шарде, он выполняется довольно быстро (данные хорошо размазаны), если выполнять на distributed(ключ hash1), запрос выполняется за время (время выполнения на одном шарде * количество шардов * 1.5). Мы посмотрели, что, похоже, кх отправляет все данные, полученные до выполнения HAVING, для последующей агрегации на сервер, с которого выполняется запрос. Отсюда вопрос: можно ли как-то заставить кх полностью выполнить запросы на шардах (включая having), а на сервере, с которого делается запрос, просто смержить результаты и сделать limit? -
distributed_group_by_no_merge
https://github.com/yandex/ClickHouse/issues/332FR: Add uniq/uniqGlobal functionality · Issue #332 · yandex/ClickHouseClickhouse has an ability to limit scope of IN/JOIN constructions while querying clustered tables: you could either use local tables or pass result set to querying server and do IN/JOIN there depe...
-
Если я правильно понял, то получится партиция на каждый батч, и партиций будет слишком много.
-
5000 в день
-
Спасибо большое, но с LIMIT эта штука работает очень странно. Если оборачивать в селект и его лимитировать, то прироста не наблюдается.
-
Да, это много. Так как куски из разных партиций не будут мержиться, то получится очень много кусков и запросы будут тормозить.
-
Всем привет. Вопрос по ключу семлирования.
У нас есть огромная табличка, в которой хранятся показы, клики и действия.
Сейчас пытаемся решить, как будет правильнее, поставить ключем семплирования хеш от id юзера, хеш от id показа или рандом?
В случае id юзера, будет семпл юзеров с полным набором событий. Соответственно, запросы по типу avgPerUser домножать не нужно будет, а uniqUserId - нужно будет.
В случае id показа - полные цепочки, от показа до лида.
В случае рандома честный семпл, при котором нужно будет домножать все результаты выборок. -
Joined.
-
-
Есть еще вопрос. Подскажите, пожалуйста, если max_concurrent_queries = 5, но приходит одновременно 10 запросов, они становяться в очередь?
-
Все события начинаются от показа, поэтому у всей цепочки показ-клик-действие есть id показа.
У разных пользователей одного id показа быть не может -
Да. Это определяется настройкой queue_max_wait_ms (уровня пользователя), по-умолчанию - 5 секунд.
-
понятно. я бы делал семплирование по юзерам, т.к. с ним сохраняются и пользовательские и показные метрики.
-
А семплирование по рандому - вообще не вариант?
-
-
-
у нас только 5% юзеров делают кроме показа клик. И менее 1% действия.
Запросы в основном такие
select slice(может быть date, geo, browser и еще штук 30), sum(IsShow),sum(isClick),sum(isAction) form table group by slice -
А ClickHouse перезагружали после изменения макросов?
-
но кроме sum иногда интересно посмотреть кол-во уников, кол-во показов на человека и тд
-
Всем добрый день! Кто-нибудь сталкивался с проблемой, что в системе появляются зомби процессы с именем [sh]. Может быть КХ выполняет какой-то скрипт и что-то не отрабатывает? После рестарта сервиса КХ все такие процессы пропадают. Ошибок в логе КХ нет.
-
Такой процесс не один появляется, десяток за сутки
-
У вас словаря из executable источников нет?
-
была аналогичная проблема
-
-
-
-
-
Версия
1.1.54245
да, словари есть /usr/bin/mysql и далее TSV данные через запрос -
-
-
Да, похоже что словари
спасибо большое -
Добавили changelog для недавнего и прошлого релиза https://github.com/yandex/ClickHouse/blob/master/CHANGELOG_RU.md
-
-
-
-
-
Нет никаких CTE.
-
Алексей, а нет никакой информации по исправлению ошибок в оптимизаторе? https://github.com/yandex/ClickHouse/issues/859Wrong query optimisation throws out required columns from subqueries. #859
Query below works fine. SELECT * FROM ( SELECT learnerHash, passed - eventTime AS diff FROM statements GLOBAL ANY INNER JOIN ( SELECT learnerHash...
-
Привет всем. Вопрос про внешние словари. Возможен ли словарь в виде tab separated файла, где значения (атрибуты) имеют тип Array(Array(UInt32))? В моем случае это массив с массивами типа [[0, 1], [2, 1], [5, 2]].
Из документации следует, что возможно, но на деле получаю экспешпн Cannot parse input. -
Ура! Вот за это прям огромное спасибо!
-
Вот теперь совсем другое дело . Чувствуется Ваш профессионализм . И вот если бы вы это взяли за практику каждый раз добавлять - то я стал бы самым счастливым человеком . ))
-
А runningDifference с memory таблицами не работает?
-
Он всегда 0 возвращает (
-
Пока нет информации. Последние несколько недель не разбирались с этой задачей.
-
Спасибо за ответ! Буду с нетерпением ждать :) Я думаю, что не один такой )
-
runningDifference работает в пределах блока. Memory таблица возвращает данные ровно такими блоками, какие были в неё вставлены. Если данные вставлялись по одной строке, то runningDifference всегда будет возвращать ноль.
-
Да, данные вставлялись по одной строке
-
Кстати, хороший хак для разделения данных :)
-
Можно слить в один блок с помощью INSERT SELECT в другую таблицу с ORDER BY.
-
Для атрибутов массивов поддерживаются только числовые типы и строки. То есть, даже обычные массивы - нет.
-
У меня помнится был кейс когда мне надо было в рамках одного запроса делать runningDifference, но если например у строки другой идентификатор объекта, то начинать сначала :) Теперь знаю как это можно обойти )
-
Тут проблема в том, какие геттеры должны быть для таких словарей. Их итак много. Надо придумать какой-нибуль generic вариант.
-
Жаль, что это всего лишь хак. Полноценную реализацию такой функции не так уж сложно сделать, хотя и существенно сложнее, чем runningDifference.
-
Ну да, я уже говорил о такой функции не раз :( Жаль ничем не могу помочь в этом деле
-
Generic вариант с хранением значений в Field - вполне приемлимо.
-
Еще вопросик по первичному ключу. Влияет ли первичный ключ на скорость выполнения sum?
т.е. решаем добавлять ли в первый ключ колонки isShow\isClick для запросов по типу
select eventDate,sum(isShow),sum(isClick) from table group by eventDate
или это поможет только для запросов типа:
select eventDate,Shows,Clicks from (
select eventDate,count() as Shows from table where isShow group by eventDate
) Join (
select eventDate,count() as Clicks from table where isClick group by eventDate
) Using eventDate -
Нет, первичный ключ не влияет на скорость GROUP BY.
(Возможно незначительное косвенное влияние.) -
да, конечно
-
Но на where во втором случае повлияет?(там где where isShow\isClick)
-
Да.
-
Конечно же, при условии, что в where еще будут все колонки, которые перед isShow\isClick в ключе
-
Т.е. имеет смысл внести isShow в первичный ключ(у нас все сильно сложнее, чем я описал, и показы и так подзапросов вытаскиваются )?
-
Да,
"при условии, что в where еще будут все колонки, которые перед isShow\isClick в ключе"
и при условии, что эта фильтрация отфильтровывает достаточно большое количество строк. -
Спасибо за ответ! Жаль, что нельзя массивы использовать для атрибутов словарей. Было бы удобно
-
Спасибо
-
Блин :) Опять с runningDifference влип )
-
Есть таблица, learnerId, video, action, position.
action = play - запуск видео
action = stop - остановка видео
position - место в видео (конкретная секунда)
Например данные.
SELECT *
FROM vid
┌─learnerId─┬─videoId─┬─action─┬─position─┬───────────eventTime─┬──eventDate─┐
│ 1 │ test │ play │ 0 │ 2017-01-01 00:00:00 │ 2017-01-01 │
│ 1 │ test │ stop │ 14 │ 2017-01-01 00:00:14 │ 2017-01-01 │
│ 1 │ test │ stop │ 55 │ 2017-01-01 00:01:05 │ 2017-01-01 │
│ 1 │ test │ play │ 55 │ 2017-01-01 00:01:25 │ 2017-01-01 │
│ 1 │ test │ play │ 20 │ 2017-01-01 00:00:33 │ 2017-01-01 │
│ 1 │ test │ stop │ 60 │ 2017-01-01 00:01:30 │ 2017-01-01 │
└───────────┴─────────┴────────┴──────────┴─────────────────────┴────────────┘
Тут получается, что в целом человек пропустил всего 5 секунд видео (с 15 по 20). Мне нужно в конечном счете получить кол-во уникальных человек просмотревших видео на каждой секунде...
Решил сделать так...
SELECT
uniq(learnerId),
range
FROM
(
SELECT
learnerId,
range
FROM
(
SELECT
learnerId,
action,
runningDifference(position) AS diff,
if(action = 'play', emptyArrayUInt32(), arrayFilter(x -> ((x >= (position - diff)) AND (x <= position)), range(toUInt32(position)))) AS range
FROM
(
SELECT *
FROM vid
ORDER BY eventTime ASC
LIMIT 1 BY position
)
)
ARRAY JOIN range
)
GROUP BY range
ORDER BY range ASC
Получаю что нужно...но если добавляются данные по нескольким пользователям...ну, вы сами поняли что будет :) -
А вот если бы была возможность runningDifference прикончить по определенному правилу, то проблем бы не было :)
-
Может есть вариант создать range без runningDifference? ) Что бы работало аналогично
-
-
Поклон ! ) Спасибо!!!
-
Добрый вечер! Есть сайт на django работает с подсгресом, хочется вместо него попробовать использовать clickhouse
-
Может кто то решал задачу с подключением django к clickhouse?
-
А в чем причина появления желания смены СУБД?
-
Мы протестировали кликхаус и т.к он показал классную производительность, хотели использовать в проде )
-
-
скорее его дефолтные настройки быстрее постгреса в вашем конкретном случае. попробуйте лучше mysql :)
-
у нас клиенты крутят отчеты за большие промежутки времени
-
а у постгреса по дефолту лимит на память которую он может сожрать
-
'''Доступ к БД не связан с настройкой readonly. Невозможно дать полный доступ к одной БД и readonly к другой.'''
Из документации.
Есть ли изменения в сисетме прав доступа, или пока всё так же? -
Если там классическое использование базы данных для хранения и выдергивания сущностей, то идея немного не оправданная
-
Пока всё так же.
- 19 August 2017 (9 messages)
-
да, очень печальная ошибка, раз 10 в неделю на нее натыкаюсь
-
здорово что появился тип для UUID, еще бы для IP был и было бы здорово (пока мы на своей стороне всё в FixedString(16) складываем)
-
-
-
Так возьми тип куда влезет, а в4 конверть в в6 нотацию)
-
а в FixedString(16) влезет?)
-
да, он (ipv6) как раз 16 байт
-
FixedString в ClickHouse это набор байт с фиксированой длиной, очень удобно для хранения кастомных типов которых нет в КХ, но иногда нужно и "глазами" посмотреть, пока небыло встроенного типа UUID это было неочень наглядно и местами просто ломало "консольку" если кто-то его решил через клиент поле выбрать )
-
Та же проблема была fixedString. Пока не было smi2 клиента приходилось очень осторожно выбирать колонки тк бинарные данные моментально ломают форматирование в консоли
- 20 August 2017 (6 messages)
-
А вот у такой ошибки какая причина может быть?
2017.08.20 08:23:11.342928 [ 6 ] executeQuery: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Assertion violation: !_path.empty() in file "/home/robot-metrika-test/jenkins/workspace/clickhouse-packages-build/sources/contrib/libpoco/Foundation/src/File_UNIX.cpp", line 370, e.what() = Assertion violation (from 10.*.*.*:60398) (in query: INSERT INTO table FORMAT CSV) -
2017.08.20 08:23:11.369209 [ 6 ] ServerErrorHandler: Code: 99, e.displayText() = DB::Exception: Unknown packet from client, e.what() = DB::Exception, Stack trace:
0. clickhouse-server(StackTrace::StackTrace()+0x16) [0x2a890e6]
1. clickhouse-server(DB::Exception::Exception(std::__cxx11::basic_string, std::allocator > const&, int)+0x1f) [0x10dea3f]
2. clickhouse-server(DB::TCPHandler::receivePacket()+0x21f) [0x10eb2af]
3. clickhouse-server(DB::TCPHandler::runImpl()+0x55c) [0x10ec91c]
4. clickhouse-server(DB::TCPHandler::run()+0x2b) [0x10ed54b]
5. clickhouse-server(Poco::Net::TCPServerConnection::start()+0xf) [0x3416fff]
6. clickhouse-server(Poco::Net::TCPServerDispatcher::run()+0x13b) [0x341d43b]
7. clickhouse-server(Poco::PooledThread::run()+0xb7) [0x3688287]
8. clickhouse-server(Poco::ThreadImpl::runnableEntry(void*)+0xa5) [0x36542c5]
9. /lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba) [0x7fadc26b76ba]
10. /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7fadc1cd83dd]
Code: 210. DB::NetException: Connection reset by peer while writing to socket (10.*.*.*:9000) -
Всем привет. Поднял на сервере clickhouse-server в докере, порт прокинут наружу, если открыть через браузер, то отображается "Ок.", но при попытке законнектиться удаленно клиентом получаю ошибку "Code: 209. DB::NetException: Timeout exceeded while reading from socket"
При этом если прямо на сервере рядом в докере поднять клиент, то оттуда корректно получается зацепиться.
Подскажите, пожалуйста, с чем может быть связана эта ошибка? То есть он вроде цепляется к серверу, но висит долго, а потом отваливается по таймауту. -
-
Joined.
-
Joined.
- 21 August 2017 (65 messages)
-
А какие вы методы в Яндекс применяете для разграничения прав доступа? Аналитики у Вас не могут создать временную таблицу с аггрегатом? А если могут, то получается они могут дропнуть все данные?
-
подключается довольно просто, но естественно, не как замена бэкенда для моделей джанги
-
Нашел коннектор к алхимии + фласк
-
Joined.
-
Как вариант - отдельный инстанс для аналитиков, на котором созданы Distributed таблицы, смотрящие на основной кластер.
-
Я тоже сначала так подумал, но тогда если делать join, то мы будем тянуть по сети оба селекта(и левый и правый) и только потом джойнить. Больше проблем чем профита
-
Тоже не взлетел) Вообщем сделаю напишу инструкцию )
-
А что именно хотите сделать ?
-
-
-
-
-
-
-
Joined.
-
Joined.
-
-
Привет, max_threads влияет на вставку в таблицу типа insert into ... format TSV при вставке через cat test.tsv | clickhouse-client?
-
Всем привет.
К вопросу о ключе семлирования.
Мы хотим использовать ключем семплирования id пользователя.
ID пользователя у нас это - UUID4.
Вопрос, нужно ли этот ID оборачивать в хеш функцию по типу cityHash64? или в исходном виде пойдет? А хеш актуален только для значений которые что-то значат? -
-
Нет, вставка происходит в один поток (точнее в два - клиент парсит TSV и формирует блоки формате Native, сервер сортирует и записывает результат).
-
Привет. А есть ли какая-нибудь возможность заставить кх выполнять запрос, вида Select FROM Select полностью на шардах?
-
-
Пример запроса:
SELECT
hash1,
hash2,
month,
p,
p - pos_diff AS prev_p,
p_diff
FROM
(
SELECT
hash1,
hash2,
month,
p,
runningDifference(hash1) AS p,
runningDifference(hash2) AS u,
runningDifference(p) AS p_diff
FROM
(
SELECT
hash1,
hash2,
month,
p
FROM distributed_table
WHERE (d = 'value') AND (month IN ('2017-05-15', '2017-06-15')) AND (hash1 = cityHash64('value2'))
ORDER BY
hash1 ASC,
hash2 ASC,
month ASC,
p ASC
LIMIT 1 BY
hash1,
hash2,
month
)
)
WHERE (p = 0) AND (u = 0)
ORDER BY p_diff DESC
LIMIT 10
Сейчас он идет в каждый шард, выполняя запрос
SELECT
hash1,
hash2,
month,
p
FROM distributed_table
WHERE (d = 'value') AND (month IN ('2017-05-15', '2017-06-15')) AND (hash1 = cityHash64('value2'))
ORDER BY
hash1 ASC,
hash2 ASC,
month ASC,
p ASC
LIMIT 1 BY
hash1,
hash2,
month
Дальше смерживает данные на сервере-инициаторе и продолжает выполнение запроса. Можно ли как-нибудь сделать так, чтобы он все выполнил на шардах, результат смержил на сервере-инициаторе, выполнил там же сортировку и limit? -
в конец каждого подзапроса который надо мержить локально надо добавлять "settings distributed_group_by_no_merge = 1"
если я правильно понял что нужно -
но это не работало для ридонли юзеров, вроде
-
Подскажите пожалуйста, есть ли способ при помощи стандартных движков решить следующию задачу:
Есть уникальный ключ (назовем его session_id)
с этим ключем могут появлять события (request_id) c определенным набором полей, но хотелось бы чтобы в итоге все поля получалсь в виде одной записи (сессия и все поля, относящиеся к этой сессии)
Можно ли, какой-то движек использовать, чтобы в рамках session_id в зависимости от request_id подставлялось нужное значение.
Можно было бы писать несколько записей , а потом GROUB BY session_id и anyIf(value1, request_id = 1), anyIf(value_2, request_id = 2)
но возможно можно как-то сократить обьем и ускорить выборки -
Всем привет! до этого не сталкивался c clickhouse, вроде интересно в некоторых моих 'use cases'. Но мучает один вопрос. Допустим изза нештатной траблы, появится необходимость поменять какието данные за определенный период времени... с этим вообще все плохо?
-
а... увидел в Roadmap план "Начальная поддержка UPDATE и DELETE"
-
Выбрать движок ReplacingMergeTree
-
ммм, да удобно. спс, но наверно может создать лишний оверхед, если эта необходимость возникает крайне редко (вроде 2 раза за последние 1-2 года)
-
и еще
В приницпи сейчас у нас и так есть сервера, собирающие реалтайм стату, и раз в какойто период времени скидывающие данные в 'общую' базу (пачками)
но есть сервисы где вся стата сразу отправляется в единую базу (по мере поступления/реалтайм)
вопрос наверно так: на сколько важно даные скидывать пачками - очень важно? желательно? -
-
Сейчас штатный способ поправить данные плохие - заменить партицию с плохими данными с помощью ALTER ... DETACH PARTITION / ATTACH PARTITION. ReplacingMergeTree для этого использовать нежелательно, т.к. действительно будет постоянный оверхед на столбец с версией, чтобы уникально идентифицировать записи, возможно придётся добавлять лишние столбцы в первичный ключ, ну и чтобы заменить данные, всё равно вручную придётся вызывать OPTIMIZE.
-
у меня на тестах получалось 800к вставок в секунду батчами. и 35к вставок если данные приходят как попало. когда по одной строке когда по 5000.
cpu 100% в обоиз случаях.
но при 800к вставок еще и было типа 120 iops а при как попало под 700 iops.
так что критически важны. -
-
-
> с помощью ALTER ... DETACH PARTITION / ATTACH PARTITION
ну для нештатной ситуации выглядит терпимо. спс. значит жить можно :)
> ... так что критически важны.
спасибо :) -
-
-
господа а http://repo.red-soft.biz/ фсё ?
-
да. вся сложность для меня в том, чтобы посчитать количество именно за все предыдущие дни, а не только за текущий
-
-
-
-
-
Для redhat-подобных дистрибутивов есть репозиторий altinity: https://packagecloud.io/altinity/clickhouseAltinity/clickhouse - Packages · packagecloud
Browse packages for the Altinity/clickhouse repository. Host your own repository by creating an account on packagecloud.
-
А, понял. То есть нужна кумулятивная сумма
-
хм. другие репы я слышал имеются да. но ту можно убирать из плейбука ?
-
да
-
@ztlpn судя по сайту altinity это вы, да ?
-
-
ой. я при быстром прочтении ника вас с ним спутал :)
-
извните :)
-
-
Есть способ с помощью недокументированной функции runningAccumulate(). Сейчас постараюсь изобразить...
-
SELECT date, runningAccumulate(countState()) FROM (SELECT date FROM Table WHERE date > '2017-08-10' ORDER BY date) GROUP BY date
как-то так?)
по идее даже подзапрос и ORDER не нужен. Не знаю, бывают ли ситуации, когда данные не отсортированы по date? -
-
а, ну логично, конечно )
-
тут необязательно сортировать до группировки
-
11 вечера 😐
-
-
-
-
Joined.
- 22 August 2017 (167 messages)
-
в CH можно вычислить моду?
-
-
-
-
С помощью GROUP BY + ORDER BY её можно вычислить везде
-
@kshvakov понятно, думал вдруг есть более интереснее решение
-
Это понятно. Вопросы в другом.
1. Как узнать что он применяется? Как это увидеть? Как узнать степень сжатия?
2. Есть ли возможность указать специфический алгоритм? "Любой алгоритм компрессии" будет не так эффективен в этом случае, как специфический на delta encoding. -
-
http://www.vldb.org/pvldb/vol8/p1816-teller.pdf
Эта "поделка" от Facebook'а (авторов zstd, к слову) сжимает timestamp'ы гораздо лучше, и без "гемора". -
-
Ты про гориллу?
-
-
-
-
-
В 3 раза хуже
-
-
dgryski/go-tsz
Time series compression algorithm from Facebook's Gorilla paper - dgryski/go-tsz
-
https://github.com/facebook/zstd – основной коммитер и есть Ян. По всем внешним признакам, это FacebookGitHub - facebook/zstd: Zstandard - Fast real-time compression algorithm
Zstandard - Fast real-time compression algorithm. Contribute to facebook/zstd development by creating an account on GitHub.
-
-
-
-
-
-
-
-
-
Доброе утро! Сколько должно быть в среднем блоков в фоне слияния
-
у меня 74 это нормально?
-
Сжатие будет деградировать, в худшем случаи вроде даже оверхед будет некоторый
-
-
-
-
-
Ребят, по поводу replacing merge tree вопрос. Если делать апдейт по одной строке, то я так полагаю эта операция будет крайне дешевая для КХ т.к. фактически партиция в которой строка лежит не меняется?
-
Просто мне потребуется раз в 10 минут обновлять некоторое количество строк. Инсерты будут делаться по одной строке.
-
Делать инсерт по одной строке крайне нерекомендуется. Минимум по 1к
-
Речь идет не о MergeTree, а именно о ReplacingMergeTree? Или разницы нет? Т.е. даже на апдейт по хорошему собирать например 1к строк и закидывать?
-
Просто не факт, что у меня будет такой поток данных на апдейт, я при всем желании больше 1к строк не выжму )
-
Да и строк у меня там будет не очень много
-
Так это же одно семейство движков. А по поводу вставки по одной строке - пробуйте, экспериментируйте
-
чем больше батч тем проще жить базе