- 01 January 2021 (11 messages)
-
С новым годом!
-
-
Denny Crane [Junior support specialist at Altinity (NB,Canada)] in ClickHouse не тормозит
вот тут все https://www.youtube.com/watch?v=7pyNmackUTw&t=1s
-
Это старый видос , там нет про mrk2 😞
-
как раз там про mrk2 и рассказывали, весь видос про адаптивную гранулярность
-
в mrk2 лежит 3 штуки uint64 для каждой гранулы, а не 2 как в mrk
-
mrk2 смещение в пожатом | смещение в разжатом | кол-во строк в грануле
mrk смещение в пожатом | смещение в разжатом -
из mrk2 надо читать 24 байта od -l -j 72 -N 24 S.mrk2
https://stackoverflow.com/questions/65198241/whats-the-process-of-clickhouse-primary-indexWhat's the process of ClickHouse primary indexAs mentioned in the title, i am very confused about the ClickHouse primary index. ClickHouse primary index used these files: primary.idx, [primaryField].mrk, [primaryField].bin. Where is MarkRange ...
-
-
Всех с новым годом! Есть метрика ClickHouseProfileEvents_InsertedRows для прометея который открывается в КХ под портом 9363(by default), был бы рад если бы вы разделили метрику на две, которая каждая из метрик отражает записи в "local" таблицы и в "distributed", возможно ли это?
При мониторинге наблюдаю такую картину, самые активные показатели у той, в которую льются записи в дист таблицу -
- 02 January 2021 (81 messages)
-
Joined.
-
Предложения все таки стоит в гитхаб писать, тут оно просто потеряется
-
Привет! Clickhouse не ставиться deb http://repo.yandex.ru/clickhouse/deb/stable/ main/
-
Failed to fetch http://repo.yandex.ru/clickhouse/deb/stable/main/InRelease Cannot initiate the connection to repo.yandex.ru:80 (2a02:6b8::183). - connect (101: Network is unreachable) [IP: 2a02:6b8::183 80]
-
-
нормально пингуеца
-
Да.. похоже что хост поменяли на https://repo.clickhouse.tech
-
-
-
одноклассники!
-
-
-
-
Что подразумевается под рекурсивный?
-
-
-
Там были изменения в 19 версии, если у transfers_to_archive_mv как хранилище используется .inner. таблица то дело в этом
-
-
-
-
Покажите ее ддл
-
Это не относится к этому, нужно смотреть есть ли в ддл TO
-
-
Это другая таблицп
-
-
В общем подозреваю, что вам нужно подписаться будет на harmony_archive.transfers
-
-
С какой версии обновлялись?
-
Ну, суть то в том что поменяли этт
-
-
-
-
Я бы уточнил в ченджлогах, для 19 версии, breaking changes на эту тему
-
Сочувствую
-
-
Это не важно inner или нет. Просто во from теперь не работает mv, там надо испошьзовать то что у той mv сторадж, или inner или имя явной таблицы
-
Спасибо! Это версия подтвердилась.
-
ну это общеизвестная штука, я даже рассказывал https://youtu.be/1LVJ_WcLgF8?t=8878
-
-
-
-
-
-
у запроса есть длинное перечисление в например in (xxxx,xxx,xxx,xxx..... десятки тысяч значений). ?
-
-
-
-
SELECT 0 AS depth,
block, tx_time, currency_id,
tx_id_bin, tx_index,
'' AS transfer_from, address AS transfer_to,
amount,
toDecimal64(0,8) AS tx_value_in, toDecimal64(0,8) AS tx_value_out
FROM bitcoin_flow.tx_balances_by_address
WHERE
address='19zu3f6NL9sSd1QL41u71cFiJ3tM5trHJF' AND direction='output'
AND blockchain_id=2; -
-
-
-
либо вам кажется либо это неизвестный баг
-
-
например у тестового сервера меньше озу и диски загружены, поэтому кажется что проблема в КХ
-
а на самом деле это вытеснение из линукс кеша
-
-
set send_logs_level='debug'
-
-
-
У КХ есть кеш засечек. По дефолту он 5ГБ. Сколько там закешировано видно в системных таблицах. Но скорее всего у вас все засечки < 5ГБ суммарно. Ну и это место не менялось.
-
я бы смотрел sar -d 1 100 в момент запроса, похоже на медленный диск и вытеснение из линукс кеша
-
SELECT *
FROM asynchronous_metrics
WHERE metric LIKE '%Cache%'
┌─metric───────────────────────┬──────value─┐
│ UncompressedCacheBytes │ 0 │
│ MarkCacheBytes │ 5082679824 │
│ UncompressedCacheCells │ 0 │
│ CompiledExpressionCacheCount │ 0 │
│ MarkCacheFiles │ 148 │
└──────────────────────────────┴────────────┘ -
маловероятно. У нас много серверов, у всех nvme и везде одинаковое поведение сразу после 19 -> 20
-
ну это в github, тикет. Структуру таблиц, запросы.
-
можно поотключать все оптимизации по одной
-
-
-
SELECT *
FROM system.settings
WHERE (name LIKE '%optim%') AND (value = '1') -
SELECT *
FROM system.settings
WHERE (name LIKE '%optim%') AND (value = '1')
┌─name───────────────────────────────────────────────────┬─value─┬─changed─┬─description───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─min──┬─max──┬─readonly─┬─type─┐
│ optimize_move_to_prewhere │ 1 │ 0 │ Allows disabling WHERE to PREWHERE optimization in SELECT queries from MergeTree. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ partial_merge_join_optimizations │ 1 │ 0 │ Enable optimizations in partial merge join │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ enable_optimize_predicate_expression │ 1 │ 0 │ If it is set to true, optimize predicates to subqueries. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ enable_optimize_predicate_expression_to_final_subquery │ 1 │ 0 │ Allow push predicate to final subquery. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ optimize_read_in_order │ 1 │ 0 │ Enable ORDER BY optimization for reading data in corresponding order in MergeTree tables. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ enable_scalar_subquery_optimization │ 1 │ 0 │ If it is set to true, prevent scalar subqueries from (de)serializing large scalar values and possibly avoid running the same subquery more than once. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ optimize_trivial_count_query │ 1 │ 0 │ Process trivial 'SELECT count() FROM table' query from metadata. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ optimize_move_functions_out_of_any │ 1 │ 0 │ Move functions out of aggregate functions 'any', 'anyLast'. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ optimize_injective_functions_inside_uniq │ 1 │ 0 │ Delete injective functions of one argument inside uniq*() functions. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ optimize_arithmetic_operations_in_aggregate_functions │ 1 │ 0 │ Move arithmetic operations out of aggregation functions │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ optimize_duplicate_order_by_and_distinct │ 1 │ 0 │ Remove duplicate ORDER BY and DISTINCT if it's possible │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ optimize_redundant_functions_in_order_by │ 1 │ 0 │ Remove functions from ORDER BY if its argument is also in ORDER BY │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ optimize_monotonous_functions_in_order_by │ 1 │ 0 │ Replace monotonous function with its argument in ORDER BY │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ optimize_trivial_insert_select │ 1 │ 0 │ Optimize trivial 'INSERT INTO table SELECT ... FROM TABLES' query │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │ -
│ optimize_aggregators_of_group_by_keys │ 1 │ 0 │ Eliminates min/max/any/anyLast aggregators of GROUP BY keys in SELECT section │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
│ optimize_group_by_function_keys │ 1 │ 0 │ Eliminates functions of other keys in GROUP BY section │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
└────────────────────────────────────────────────────────┴───────┴─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────┴──────┴──────────┴──────┘ -
я предлагю все выключить и чтобы проверить что это не из-за них
-
-
-
в гитхаб, я не представляю как nvme 2 сек. может читать 2 тыщи строк
-
непонятно что писать туда. Запрос ничем не примечательный. Возможно в табюлице очень много index_granularity
-
-
create table напишите от обеих таблиц, сколько строк в них, оба запроса, ТОЧНУЮ версию КХ, наблюдаемое поведение в 19й, в 20й
-
-
и про кеш марков про 15 напиште
сколько кстати в 19й
SELECT *
FROM asynchronous_metrics
WHERE metric LIKE '%Cache%'
кажется это был не жесткий лимит, и поменяли поведение очистки этого кеша, раньше была зависимость от времени еще.
Но с другой стороны даже если марки не в кеше, для nmve это не должно быть проблемой -
это может быть проблемой если их 5G и они чиитаются на каждый запрос
-
не должно в теории.
PK индекс в памяти, дальше читаем только нужные парты и mrk файлы в них, по идее у вас Processed 2.18 thousand rows , это mrk файлов на 50 кб скорее всего - 03 January 2021 (56 messages)
-
hits и misses лежат в system.events
-
-
Denny Crane [Vertica DBA at Revjet(NB,Canada)] in ClickHouse не тормозит
это тогда плохой инсерт. Он не стримабл. надо убрать now из инсерта и написать now где-нибудь в дефолтах таблицы. Плохие инсерты должны влезать в max_query_size он 256кб. Хорошие инсерты обрабатываются стрим парсером и могут быть любого бесконечного размера, если стрим парсер видит функцию -- например now он переключается на ast парсер , ast парсер ждет конца запроса и складывает запрос в буфер. Буфер по умолчанию -- 256kb
-
Там нет expressions. КРоме того <input_format_values_interpret_expressions>0</input_format_values_interpret_expressions>
-
-
ну
а в каком формате вы вставляете?
TSV?
может у вас там где то кавычка открылась и не закрылась.... и какой нибудь multiline ждет когда закроется кавычка переполняя буфер? -
СSV
-
покажите полный стектрейс?
какого размера в строках и байтах CSV падает? -
PeekableReadBuffer: Memory limit exceed when inserting data by HTTP (20.8) · Issue #18690 · ClickHouse/ClickHouse
Error started to appear after migrated 19.9 -> 20.8 Settings <input_format_parallel_parsing>0</input_format_parallel_parsing> and <input_format_values_inte...
-
-
так, а данные вы как передаете?
для INSERT
запрос лучше в http get parameters через ?query=XXX передать
а данные в POST
заголовки и тело HTTP запроса в тикет закиньте -
Да так передаю POST. Попробую данные приделать
-
https://clickhouse.tech/docs/en/interfaces/http/
cat your_data.csv | curl "http://localhost:8123/?query=INSERT+INTO+your_table+FORMAT CSV" --data-binary @-
вот так тоже ошибка по памяти?HTTP Interface | ClickHouse DocumentationHTTP Interface The HTTP interface lets you use ClickHouse on any platform from any programming language. We use it for w
-
DB::InputStreamFromASTInsertQuery::readImpl()
у вас явно парсер в AST режим вместо streaming переключился
скорее всего у вас ошибка в самой SQL query
а не в данных -
разделите query и данные посмотрите изменится ли ошибка
-
они отдельно
-
Joined.
-
привет. помогите плиз сделать правильную структуру, перегоняю данные из mysql в ch для анализа
CREATE TABLE IF NOT EXISTS order_pack (
EventDate Date DEFAULT toDate(1609632000),
id Int32,
order_id Int32,
pack_id Int32,
shipper_id Nullable(Int32),
)
ENGINE = MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (EventDate, id)
при вставке больше 1000 записей ругается типа DB::Exception: Too many partitions for single INSERT block (more than 100)
1609632000 это текущее время на момент создания таблицы -
1609632000 тут ни при чем.
У вас в mysql это поле есть? Там даты за какой период?
Тупо отключите этот лимит
set max_partitions_per_insert_block=0;
это просто ручка безопасности, вам она не нужна раз вы даннные переливаете разово -
в этой таблице нет дат
-
ну и как вы тогда insert делаете?
-
суть в том, что партиция вообще должна быть одна, так как дата разово генерится
EventDate Date DEFAULT toDate(1609632000), -
Это я понял. Извращение конечно. Не проще просто опустить partition by?
-
ща проверю еще раз, но так была тоже ошибка
-
ну и как вы тогда insert делаете?
-
CREATE TABLE IF NOT EXISTS order_pack (
id Int32,
order_id Int32,
pack_id Int32,
)
ENGINE = MergeTree() ORDER BY ( id) -
DB::Exception: Too many partitions for single INSERT block (more than 100).
-
ну и как вы тогда insert делаете?
-
И какая версия кх?
-
упс - оказывается не было дропа до
-
все последнее в докере
-
я написал "конвертер" на laravel - что все таблицы на лету создает и в таблицы что меньше ляма записей вставляет одним инсертом. была проблема на таблицах где нет полей создания записи) теперь вроде все ок. как обычно - задашь вопрос, и сразу его решишь сам - хотя бился до этого пару часов(
-
еще проблема с дабле так и не решена в кх( даже последней версии(
-
https://github.com/ClickHouse/ClickHouse/issues/7690 тут пришлось данные на лету менятьmysql decimal nullable -> DB::Exception: Attempt to read after eof · Issue #7690 · ClickHouse/ClickHouse
Hi, Describe the bug or unexpected behaviour When I try to INSERT SELECT from a remote mysql table it leads to DB::Exception: Attempt to read after eof when a source column is of type decimal(xx,yy...
-
Почему с дабле? Если issue про decimal.
Вы тоже чтоли через engine mysql делаете? -
При чем тут миллион строк тогда.
-
Пипец. Ни черта не понять.
-
Это 2 разные проблемы)) в mysql double может быть null в clickhouse - Nullable тоже, так вот при вставке null падает
HttpCode:500 ; ;Code: 32, e.displayText() = DB::Exception: Attempt to read after eof: while executing 'FUNCTION CAST(_dummy_0 : 0, 'Nullable(Decimal(9, 2))' :: 1) -> CAST(_dummy_0, 'Nullable(Decimal(9, 2))') Nullable(Decimal(9, 2)) : 2' (version 20.12.4.5 (official build))
это вторая проблема - которая решена в лоб заменой Null на 0 -
первая проблема была, я не заметил что drop table не было и изменение таблицы в партициях не применялось)
-
перепробовал кучу вариантов в dev/null
-
почему decimal в кх, а не float64, если в mysql у вас double?
-
потмоу что читал доку кх - где рекомендация юзать decimal для бабла) а не флоат
-
как и везде
-
Чушь. Тем более в mysql у вас уже float
-
с чего вдруг чушь? ) ща покажу пруфы. в мускуле именно double(9,2)
-
https://clickhouse.tech/docs/ru/sql-reference/data-types/float/
Рекомендуется хранить данные в целочисленном виде всегда, когда это возможно. Например, переводите в целочисленные значения числа с фиксированной точностью, такие как денежные суммы или времена загрузки страниц в миллисекундах. -
я даже наврал - не дабле в mysql а тоже decimal
-
price decimal(19,2) DEFAULT NULL,
-
в любом случае - спасибо!)
-
mysql decimal nullable -> DB::Exception: Attempt to read after eof · Issue #7690 · ClickHouse/ClickHouse
Hi, Describe the bug or unexpected behaviour When I try to INSERT SELECT from a remote mysql table it leads to DB::Exception: Attempt to read after eof when a source column is of type decimal(xx,yy...
-
можете тут отписаться что у вас в latest воспроизводится
-
я и отписал - предпоследнее мое
-
mysql decimal nullable -> DB::Exception: Attempt to read after eof · Issue #7690 · ClickHouse/ClickHouse
Hi, Describe the bug or unexpected behaviour When I try to INSERT SELECT from a remote mysql table it leads to DB::Exception: Attempt to read after eof when a source column is of type decimal(xx,yy...
-
коллеги, если я хочу заполнить таблицу с помощьп generateRandom() но у таблицы есть PARTITION BY toYYYYMMDD то в поле даты я не могу генерить случайные даты, желательно было бы заполнить эту колонку случайным денем одного года, это как то возможно сделать?
-
ну можно придумать что нибудь типа
toStartOfYear(now()) + INTERVAL concat(rand() % 365), ' days') -
О! а я уже хотел чтот то с epoch time делать. Спасибо!
- 04 January 2021 (56 messages)
-
Привет всем. Кто-нибудь знает как работает движок MaterializeMysql с транзакциями. Например, я открыл транзакцию в mysql, затем удалил строку с id = 1. Вставил 10 миллионов строк, а затем строку с тем же id = 1. Далее фиксирую транзакцию в mysql. Возможна ли при этом несогласованность данных, когда строка уже удалена в clickhouse, но ещё не вставлена ее новая версия, поскольку между удалением и вставкой есть большое количество других операций в бин логе mysql. Заранее спасибо.
-
если я правильно помню, MaterializedMySQL работает как slave с statement based replication binlog
если я не ошибаюсь то туда попадают только commited транзакции -
по моему операции которые пишуются в redo transaction log и в binlog это разные операции...
но надо проверять -
вообще после слов
"Replication can be easily broken."
я бы вообще такой функционал в ClickHouse не тащил... и не использовал -
а еще непонятно как оно работает с вот такими штуками
https://dev.mysql.com/doc/refman/8.0/en/binary-log-transaction-compression.html -
Жесть)))
-
Ничем не хуже конвертера на питоне)
-
коллеги, вопрос
есть у меня таблица типа create table foo (a1 int32, a2 int32, d datetime, b1 int32)
MergeTree, с partition by d, я хочу заполнить ее всяким сгенериным мусором используя generateRandom, но, число мне надо относительно нормальным, пусть все уложится в один год. Как написать запрос подобного типа
insert into foo select * from ((select * from generateRandom('a1 int32, a2 int32')) (select toStartOfYear(now()) + INTERVAL rand() % 365 DAY as d)) (select * from generateRandom('b1 int32'))) -
это вообще возможно?
-
Вопрос: есть 2 таблицы:
1. отсортированная по DateTime...
2. без сортировки но с партициями по YYYYMMDD
Если сделать запрос по датам с ключом --force_data_skipping_indices, то видим что индекс не используется ни в одном из двух.
Если использовать --force_primary_key, то видно что при партицировании по дням, примари кей то же не заюзан.
Вопрос: если нужен поиск данных по дням (и данные в запросе всегда только внутри дня), то как максимально оптимизировать таблицу?
Даст ли что-то дополнительное создание индекса на DateTime (если данные надо выбирать в интервале 1мин к примеру)? -
сколько данных за день в сжатых байтах на диске получаться будет?
-
Если в целом по всем столбцам, то 1-2гиг в сутки
-
как часто в течении дня данные вставляете?
-
каждую минуту
-
ну тогда у вас будет толпа мелких партов размером от 0.5 до 3 мегабайт
которые clickhouse будет сливать
данные вставляются монотонно или прошлый период тоже возможен?
если EventTime будет в ORDER BY или в PRIMARY KEY
и вставка монотонная (вставляются только данные новых периодов)
то парты будет проще пропускать даже когда у вас партицирование по дням
и сканировать их будет проще потому что в *.mrk файлах засечек EventTime будет -
если савсем грубо
то я так понимаю процесс
PARTITION BY
это логическое разбиение которое позволяет на раннем этапе очень быстро определить какие paratition сканируем
ORDER BY / PRIMARY KEY
если они по возрастанию времени и низко кардинальным колонкам
позволяют быстрее через .mrk* файлы сравнивая значения из mrk с условиями запроса и принимая решешние находить нужные куски в .bin файлах просто делая fopen -> fseek -> fread -> uncompress -> compare -
данные условно монотонные.... т.е. батчи инсерта всегда отсортированы по времени, но учитывая что они поступают с 10ти разных серверов вопзможен вариант когда с одного сервера поступили данные за 20-21ю минуту, а потом с другого пришли данные за 19-20ю...
-
по PARTITION BY в теории да, но на практике почему-то при партиционировании по дням выборка данных внутри дня работала МЕДЛЕНЕЕ чем при партиционировании по месяцу. Логического объяснения этому так и не нашел.
-
ну МЕНЬШЕ партиций
меньше партов внутри партиции
размер парта такой что буфера хорошо пролазят в CPU Cache
логическое объяснение простое, главный паттерн чтобы clickhouse работал быстро ему надо парты среднего размера по 50-100 мегабайт в которых есть PK который есть в запросе... и условия фильтрации которые меньше cpu cache miss порождают =) -
Как можно разбивать данные в таблице по времени? например, есть данные с колонкой timestamp, хочу получить выборку вида count_of_rows, period_start, period_end. Разбивка по периодам на основании времени, например 1 час.
-
Или может есть какой-то способ как найти промежутки в timestamps? Вроде такого - https://stackoverflow.com/questions/25027820/find-a-gap-between-time-stampFind a gap between time stamp
I have many many rows in the table. The table has a Date column (which includes date and time) I want to be able to loop through the table and find any gap between the two rows where the difference
-
возможно такое решение подойдет
SELECT
toStartOfInterval(timestamp, INTERVAL 1 hour) as timestamp_by_hour,
min(timestamp) as min_timestamp,
max(timestamp) as max_timestamp,
count()
FROM
table
GROUP BY
timestamp_by_hour -
получается разбивка периодов по часам, я бы хотел чтобы периоды были любые
-
> INTERVAL 1 hour
Меняется на любой период который хочешь -
Так это понятно, вопрос в том что могут быть периоды в пару лет данных с паузами в 2 часа, вот я и хочу узнать границы этих периодов
-
А сколько записей в таблице ожидается?
-
2.5кк в день, но скорость выполнения не важна, лижбы не падало
-
Судя по моим тестам в КХ попадают только закомиченные данные. Тут основной вопрос в том, как реализовано чтение и фиксация данных из бинлога. Например, записывается ли весь набор строк, измененный транзакцией в буфер, а затем, например, присоединяется как патриция - тогда несогласованности удаленных и вставленных строк не должно быть. Или же операции из лога читаются и выполняются по очереди - тогда несогласованность возможна
-
В целом можно посмотреть в сторону WITH FILL
SELECT
ts,
now()
FROM
(
SELECT
ts,
count() AS cnt
FROM
(
SELECT now() + number AS ts
FROM numbers(1000)
WHERE number != 20
)
GROUP BY ts
ORDER BY ts ASC WITH FILL STEP 5
)
WHERE cnt = 0
@ogavrilov
Что бы получить границы, тут придется скорее всего через массивы делать,
WITH arrayJoin(arraySplit((x, y) -> (y = 0), groupArray(ts), groupArray(cnt))) AS x
SELECT
x[1],
x[length(x)]
FROM
(
SELECT
ts,
count() AS cnt
FROM
(
SELECT now() + number AS ts
FROM numbers(1000)
WHERE number != 20
)
GROUP BY ts
ORDER BY ts ASC WITH FILL STEP 5
) -
с with fill сейчас тоже смотрю, ваши варианты тоже сейчас попробую, спасибо
-
как заставить WITH FILL STEP X начинать считать X от последнего значения, а не от первого в выборке?
-
Сейчас при запросе с STEP 5 выдает
2020-12-25 06:47:36 28
2020-12-25 06:47:42 1
2020-12-25 06:47:53 1
2020-12-25 06:48:05 1
2020-12-25 06:48:16 1
2020-12-25 06:48:22 1
2020-12-25 06:48:34 1
2020-12-25 06:48:36 0
2020-12-25 06:48:45 1
2020-12-25 06:48:57 1
И вот на 36 секунде вставлена записть от WITH FILL, хотя я ожидал что она появится только если с 34 секунды пройдет 5 секунд -
с таким подходом WITH FILL не подойдет для отсчитывания интервалов между данными
-
WITH FILL так работает,
В целом для задачи поиска границ это не должно мешать -
Почему? Если я хочу найти границы периодов с паузой 60 секунд, может получиться что fill появится при меньшей паузе
-
Или это только значение fill считается от первого row, а появляется он только если будет пауза указанная в step?
-
ну так в документации написано все
https://clickhouse.tech/docs/en/engines/database-engines/materialize-mysql/
запросы конвертируются
MaterializedMySQL это по факту ReplacingMergeTree в который INSERT средствами clickhouse делать нельзя
и INSERT -> INSERT
UPDATE -> INSERT _sign=-1 , INSERT _sign=+1
DELETE -> INSERT _sign=-1
смотрите system.parts и system.part_log как оно там создается и мержится в итоге
думаю что не важно насколько "большая транзакция"
она либо в ROW based будет сконвертирована в кучу INSERT либо в Один INSERT Для Statement basedMaterializeMySQL | ClickHouse DocumentationMaterializeMySQL Creates ClickHouse database with all the tables existing in MySQL, and all the data in those tables. Cl
-
С документацией уже ознакомился, спасибо. В system.parts у меня нет таблицы из бд MaterializeMysql. По поводу большой транзакции и кучи инсертов как раз и есть вопрос. Если инсерты делаются последовательно, то в моем примере будет несогласованность данных. Например я в рамках транзакции удалил строку в mysql и затем ее добавил с тем же первичным ключем в той же транзакции. Итого, если я делаю select в CH, который попал на время между воспроизведением операции delete, но до выполнения insert новой версии строки, то этой строки у меня не будет в выборке поскольку она будет вставлена в CH с sign = -1, а новая версия еще не вставлена. В то же время в mysql у меня, очевидно, будет новая версия доступна сразу после подтверждения транзакции. В целом вопрос можно переформулировать.
-
Движок MaterializeMysql воспроизводит операции из binlog mysql по одной или сразу все, измененные в рамках одной транзакции MySql.
-
я думаю там есть какой нибудь батчинг
но стоит задать вопрос автору изменений
@zhang2014
только вопрос на английском надо сделать -
Супер, спасибо большое, обращусь к автору. Функционал очень интересен для таблиц с большим количеством записей. Сильно упростит синхронизацию транзакционного и аналитического хранилища.
-
https://github.com/ClickHouse/ClickHouse/pull/10851/files#diff-104b38efa8a505671a5b2fb9cc577714646907e01863ff593de30dac6746df0eR11
там похоже буффер естьISSUES-4006 support MaterializeMySQL database engine by zhang2014 · Pull Request #10851 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category: New Feature Changelog entry: Support MaterializeMySQL database engine. Implements #40...
-
данные флашатся каждую секунду
-
Joined.
-
Joined.
-
Добрый день! Подскажите, кто-то сталкивался с такой проблемой: при округлении необходимо 1-4 - округлять вниз, а 5-9 -вверх. round использует банковское округление, ceil же вверх округляет любой вариант и тоже не подходит. Грубо говоря из 1,565 при округлении до сотых нужно получить 1,57
-
можете в децимал перевести, либо
https://t.me/clickhouse_ru/146060【D】【J】 in ClickHouse не тормозитможно вроде только комбинацией if + floor/ceil
-
Joined.
-
на счет оптимизации через graphite_rollup, каким образом при оптимизации могли пропасть данные за определенный промежуток, если я потом добавляла куски из середины периода(не хватало места на диске для оптимизации) и в итоге есть разрв в метриках, если даты добавляются из промежутка то они не дозаписываются?
-
варианты действий в следующий раз?
-
>то они не дозаписываются
не играет никакой роли что дописали данные задним числом в середину или в начало.
разрывы по другой причине. -
это не важно как отсортированы данные в источнике. При записи инсерта на диск КХ отсортирует все колонки согласно orderby таблицы
-
просто запрос where неправильно написпн
-
А почему, если до этого разрывов не было?
-
ну вот у вас не хватало места, и что вы сделали? как вы место освободили?
-
Joined.
- 05 January 2021 (60 messages)
-
-
Вопрос всё ещё актуален, может кто что подскажет ещё?
-
group by toHour()
-
Добрый день! Нужна идея. Есть несколько csv которые надо грузить в одну таблицу, сохраняя при этом в дополнительное поле признак, разделяющий данные из файлов. Нечто вида csv_id, data1, data2, data3, где data1-3 данные из csv
-
вообще не то, вопрос про разбиение по периодам если пауза между данными больше часа
-
Посоветуйте варианты работы с ретеншном?
Каждому юзеру увидевшему баннер (AD), присваиваем уникальный id (UID), в течении месяца он может совершить действие (ACTION).
Нюанс что действие (ACTION) совершается в другой системе, от которой мы получаем только id юзера (UID)
Задача найти за месяц баннеры которые были показаны юзерам которые совершили нужное действие.
SELECT ad, uid FROM db WHERE uid IN (SELECT DISTINCT uid FROM db WHERE action='ACTION') работает, но плохо.
В сутки до 50млн хитов, и до 500к хитов с нужными ACTION.
Наверняка у кого-то были схожие задачи. Что можно сделать чтоб избежать фул скан по UID ? -
Не уверен, но можно попробовать что-то типа SummingMergeTree + хранить action в массиве. Надо будет аккуратно настроить primary key + order by чтобы парты были адекватного размера. + Все сильно будет зависить от вставки (инсерт по многим uid породит очень много фоновых мержей). У меня такая система система для нескольких дней работала.
Но в любом случае селект по строке uid - это не к клику. Я бы сделал этот на стороне а в клике оставил только статку CollapsingMergeTree и обновлял ее раз в N времени
P.s. retention был бы проще потому что все action 1 uid хранятся в 1 строке -
SummingMergeTree не поможет, потому что по итогу нужны не только кол-во юзеров увидевших баннер, но и конкретные UID (и к примеру время показа банера/время дествия).
Единственное, думал UID генерить на основе таймстемпа (вместо рандома).., что теоретически даст подсказку о том, в каком временном диапазоне искать инфу о показе банера. Но как это поможет оптимизировать запрос, и как для этого должна быть структурирована база пока не понимаю. -
Ну можно несколько колонок связанных иметь, но это не решает самой проблемы поиска по uid. https://clickhouse.tech/docs/ru/sql-reference/data-types/nested-data-structures/nested/
Плюс можно заполнять время ретеншена для uid из словаря в отдельную колонку, если uid-ов не так много. Но это все велосипедыNested | Документация ClickHouseNested Nested(Name1 Type1, Name2 Type2, …) Вложенная структура данных - это как будто вложенная таблица. Параметры вложе
-
хм, а в чем ошибка? Сейчас примерно так:
CREATE table.... PARTITION BY toYYYYMMDD(time)
SELECT ... WHERE toYYYYMMDD(time)>='20200901' and toYYYYMMDD(time)<'20200902' -
В версиях до 20.10 (примерно) кликхаус хранил не toYYYYMMDD(time) значение а min-max значение что попадается в колонке, те toYYYYMMDD(time)>='20200901' такая штука в условиях потенциально могла сканировать все партиции
-
Те условие на самом деле должно быть
WHERE time>='2020-09-01 00:00:00' and time<'2020-09-03 00:00:00' -
иными словами, как в одном исерте совместить кокнретное число для одного поля и файл для остальных?
-
-
Канонично такое делается через floor(x+eps/2), в случае сотых это floor(x+0.005). Но я не знаю, насколько ето будет еффективно в кх, потому что поставил его примерно вчера :)
-
-
Joined.
-
input function
Insert into t select 55 csvid, ..... from input(...) -
и все еще не хранит. Просто амос научил кх применять функции к minmax значениям партиций и угадывать для более сложных случаев.
-
то есть вот это будет корректно? clickhouse-client --format_csv_delimiter=";" --query="INSERT INTO t (Chanel,Setting,Scale,MesName,Name) FORMAT CSV select 55," < t.txt
-
Подскажите, а insert into … select - данные вставляются потоком или конкретными кусками выгружаются в память и вставляются ? Что будет если в середине инсерта что-то упадет ?
-
если не включен режим игнорирования ошибок, то ничего не вставится
-
можно указать сколько ошибок игнорировать
-
а как это работает ? у меня есть таблица на 20 миллардов, мне нужно заполнить табличку SummingMergeTree, я хочу сделать такой инсерт, данные вставленные через эту конструкцию как-то будут помечаться, мол если что-то отваилтся
-
нет, не будет.
прочитайте доку https://clickhouse.tech/docs/ru/query_language/table_functions/input/input | Документация ClickHouseinput input(structure) - табличная функция, позволяющая эффективно преобразовывать и вставлять отправленные на сервер да
-
кусками. Если упадет будет вставлена часть.
-
можно вставлять во временную таблицу, а потом из нее переатачить/мувнуть партиции в целевую
-
а сколько юзеров?
select groupArray(ad), uid, countIf(action='ACTION') c
group by uid
having c>0 -
не очень понятно с 'test_structure', но разберусь, спасибо!
-
>инсерт по многим uid породит очень много фоновых мержей
нет -
-
нету. Табличная функция под капотом создает временную таблицу с движком JDBC
-
Благодарю.
-
все же test_structure - это имя целевой таблице_structure?
-
да, написано же в доке Если в data.csv лежат данные той же структуры test_structure, что и у таблицы test, то следующие два запроса эквивалентны:
-
в смысле надо перечислить 'col1 String, col2 Date, col3 Int32'
-
написано, что эквивалентно команде без использования input
-
пример input
INSERT INTO example SELECT id, ifNull(num, -1) FROM input('id UInt32, num Nullable(Int32)') format JSONEachRow {"id": 1, "num": null}; -
и написано так, что можно прочесть не как надо перечислить, а как INSERT INTO t SELECT * FROM input('t_structure')
-
всем привет, подскажите пожалуйста, после апдейта с версии 19.17.6.36 на версию 20.3.10.75 стали падать ошибки когда обращаюсь за данными через mysql(..), в чем может быть причина?
c909828dc32e :) SELECT *
:-] FROM mysql(..') limit 10
SELECT *
FROM mysql('..', '..', '..', '..', '..')
LIMIT 10
Received exception from server (version 20.3.10):
Code: 1000. DB::Exception: Received from localhost:9000. DB::Exception: mysqlxx::ConnectionFailed: Unknown SSL error ((nullptr):3306).
На версии 20.8.4.11 получаю аналогичную ошибку -
понятно. спасибо!
-
create table csvtest(csv_id Int64, c1 String, c2 String) Engine=Memory;
INSERT INTO csvtest SELECT 55,c1,c2 FROM input('c1 String, c2 String') format CSV a,b
select * from csvtest
SELECT *
FROM csvtest
Query id: 7f6453eb-59f6-4750-8391-435ff242b426
┌─csv_id─┬─c1─┬─c2─┐
│ 55 │ a │ b │
└────────┴────┴────┘ -
да, я уже сделал инпут под свои нужды. Немного громоздно из-за необходимости перечисления полей с типами, но главное, что работает. Спасибо еще раз!
-
я просто еще и VALUES перечисляю, так как одно поле не вставляю, оно заполняется дефолтом
-
почему такие древние 20.3 и 20.8 ?
почему не 20.8.11.17 ?
сколько ping между CH и mysql ? -
на v.20.8.11.17 каждый 3ий раз падает
-
CH падает?
-
выборка select * from mysql()
-
сколько ping между серверами CH и mysql ?
какая версия mysql ? -
95-98
-
95 чего ? % ? мс? литров?
-
или это версия mysql ?
-
-
что если
set connect_timeout_with_failover_ms=1000, connect_timeout_with_failover_secure_ms=1000;
select * from mysql(); -
а можно как-то сделать odbc таблицу (а ещё лучше динамический запрос без создания таблицы) на базе запроса на удаленной базе а не таблицы/вью?
по типу синтаксиса view() только для odbc...
и если нет то какие мысли по поводу ФР?
а то иногда надо динамически перелить dimension данные из удаленной базы которые генерируются сложным запросом в Х таблицам
select a,b,c from odbc('DSN=postgres_10_10', 'select a.* from a join b ... join c') -
год назад нельзя было, поэтому мы на спарк перешли
-
ок. так и напишем, люди аж на спарк переходят изза отсутствия фичи
-
ну это раньше было, от бедности и безысходности
-
Joined.
-
- 06 January 2021 (54 messages)
-
Joined.
-
Всем привет.
Столкнулся с очень странным поведением кликхауса, возможно кто то это уже проходил.
Есть свежий и чистый кластер на который разворачивается бекап (при помощи утилиты https://github.com/AlexAkulov/clickhouse-backup)
Бекап разворачивается без проблем, реплицируется на все сервера и т.д
И вот тут начинается магия (для меня).
Есть табличка например
CREATE TABLE my_db.table_version (
table_name String,
current UInt32,
new UInt32
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/my_db/{shard}/table_version', '{replica}') ORDER BY table_name SETTINGS index_granularity = 8192
При попытке выполнить в ней запрос
ALTER TABLE my_db.table_version
UPDATE
new = new + 1
WHERE
table_name = 'xxx'
;
На данных которые восстановлены из бекапа - ошибок никаких НО с данными ничего не происходит, хотя в system.mutations я этот запрос вижу
и он отработан как is_done=1
Если в эту же табличку вставить какие то новые данные и выполнить такой же запрос на них, например:
ALTER TABLE my_db.table_version
UPDATE
new = new + 1
WHERE
table_name = 'yyy'
;
где yyy это новые данные которые вставлены после восстановления бекапа - все отрабатывает штатно
При этом если сделать truncate или rename таблички - вск отрабатывает. То есть врят ли проблема где то с правами на файлы. -
Joined.
-
Joined.
-
Добрый день. не помогло, попытки установить значения >1000 не помогли, раз в 3-4 попытки все та же ошибка.
При этом, создал таблицу с движком MySQL, селекты к ней идут без проблем -
последнее число в имени парта это номер мутации.
1. как называются восстановленный парт и новый парт (имя каталога)?
2. какая версия КХ который бекапили и куда восстановили?
3. какие права у файлов new? ls -l парт который не хочет мутировать / new* -
-
вроде нативного коннектора нету, но может работает через odbc или другой протокол
-
пока не нашел рабочего рншения, нужно чтоб из presto запрос уходил в clickhouse
-
mysql какой версии?
-
кх - 20.12.4.5
mysql - 5.7.28-31 -
Есть ли в кх возможность скипать плохие json сообщения при записи в таблицу на движке кафки. Имеется ввиду неправильные не структурно (параметр skip_broken_message не подходит), а когда в жсон приходит какое-нибудь значение при чтении которого Materialized View кидает ошибку что невозможно привести к нужному формату. На данный момент если я намеренно отправляю 1 неверное сообщение и затем отправляю 10 верных сообщений, консьюмер не может записать оффсет и бесконечно пытается обработать этот блок возвращая мне Invalid Offset.
-
можно получать json строкой а потом парсить руками внутри mv
-
Расскажи поподробней пожалуйста или поделисьполезной ссылочкой если имеется
-
типа в kafka таблицу пролезло, а в MV исключение в select? типа деление на 0? Нет нету такого.
надо в MV в select соломку подкладывать, типа toInt32OrNull и т.п. -
вроде JSONStringEachRow формат для движка, а потом через JSONExtract* парсишь
но я не думаю что это решит проблему с типами :) -
В идеале, не надо слать невалидные сообщения :)
-
от гниения бит никто не защищен
-
солнце светит, шлет нейтрино
-
Это понятно, просто столкнулся с проблемой когда консьюмер повис на проде на ночь, и было больно. В итоге проблему и решил прикрутив валидацию данных которы отправляю с бэка. Думал есть какое-то Clickhouse side решение
-
Именно об этом
-
можно попробовать на стороне кафке еще валидацию посмотреть
-
в той же kafka connect куча всяких трансформаций и прочего + не очень сложно свое дописать
-
Ну avro схемы никто еще не отменял 🙂
Просто поставили инвестигейт задачу, разобраться что можно сделать чтобы минимизировать подобные падения штанов в дальнейшем -
Решения в КХ нету.
Можно не использовать kafka engine . Взять какой-нибудь синкер который умеет не останавливать и писать сломанное в спец. топик -
Joined.
-
если данные попали в таблицу с кафка движком - оффсет разве не коммитается ?
-
таблица с движком кафка не имеет стора, туда нельзя ничего сохранить
-
а в какой момент оффсет коммитается ?
-
после удачной записи в MV
-
или после удачного селест из kafka engine в клиента
-
а если у меня к кафке 10 вьюх приатачено. В эти вьюхи по очереди блоки данных попадают. Что будет, если 5 вьюх отработали, а 6ая сломалась ?
-
кстати была настройка чтобы сначала комитить потом записывать в MV, может уже нету
-
>Что будет, если 5 вьюх отработали, а 6ая сломалась
не закомитится оффсет -
но данные, которые обработали 5 первых вьюх попадут куда надо ?
-
да, и будут дубликаты потом
-
понял, спасибо!
-
1. В бекапе лежит парт /srv/backup/test_backup/shadow/my_db/table_version/all_0_0_0_1249
при ресторе он аттачит его под таким же именем
То есть в базе после рестора мы видим /var/lib/clickhouse/data/my_db/table_version/all_0_0_0_1249
Данные в таблице из этого парта есть, и они нормально реплицируются на все ноды CH
2. Бекап был из 20.3.19.4 рестор в 20.3.21.2. Вроде по changelog ничего не должно было сломатся
3. Права на папку drwxr-x--- овнер/группа clickhouse
Права на файлы -rw-r----- овнер/группа clickhouse
Опять таки по правам, если сделать rename table или truncate table то данные на файловой системе он меняет.
Нашли интересный момент, после восстановления из бекапа если сделать запрос
SELECT *
FROM system.zookeeper
WHERE path = '/clickhouse/tables/my_db/1/table_version/blocks'
;
Получаем пусто - никаких записей нет вообще
Еще раз для понимания table_version это таблица чисто восстановленная из бекапа,
руками никаких данных не добавлялось
В то же время если сделать такую же таблицу руками, добавить туда данные руками (через INSERT) то при запросе
SELECT *
FROM system.zookeeper
WHERE path = '/clickhouse/tables/my_db/1/table_version1/blocks'
;
Мы видим записи для блоков. -
blocks -- это хеши инсертов, для дедупликации. То что там пусто это как раз так и должно быть
-
-
да я так и думал , я воспроизвел
-
странно это обсуждали уже, почему это не исправлено
-
all_0_0_0_1249
-
у таблицы в зукипере хранится 0
-
0 < 1249
-
поэтому этот парт не мутирует
-
при том что при атаче номера блоков сбрасываются, а версия мутации почему-то нет
-
А для понимания расшифруете или может где то в документации описано расшифровка имени парта?
И не подскажите как это можно пофиксить? -
где-то описана ищите
all_0_0_2 --- 0 , 0 -- это автоинкремент, начальный блок, конечный , 2 -- level (мержи)
all_0_0_2_4 -- 4 - это версия мутации
>И не подскажите как это можно пофиксить?
фиг знает. Наверное, или поправить руками в имени каталога 1249 в 0
или поправить в ZK 0 в 1300 например
или сделать dummy alter update where 0 ; 1249 раз -
attach part does not reset mutation version on a part. · Issue #18804 · ClickHouse/ClickHouse
Attach part does not reset mutation version on attached parts. So mutations (update/delete) do not work against parts restored from a backup, because their version is bigger than the version stored...
-
Вам огромное спасибо!
Будем пробовать варианты. -
Да, как минимум вариант переименовать парт в бекапе и уже его восстановить фиксит проблему. Еще раз большое спасибо!
-
-
Joined.
- 07 January 2021 (25 messages)
-
Привет! поделитесь, Buffer таблицу кто-нибудь использует в проде? Если буффер стоит перед ReplacingMergeTree, и проходит ALTER на добавление колонки - буффер сам перестроится или его надо пересоздавать?
-
Надо пересоздавать
-
-
WITH result AS
(
SELECT 1
)
SELECT *
FROM result
Query id: b7af6c59-cc6a-41d3-a16a-861434c55bf1
┌─1─┐
│ 1 │
└───┘
таки работает с 20.10 где то -
Блин спасибо у меня 20.8.7.15
-
спасибо
-
-
подскажите, KILL QUERY ввел в Is_cancelled запрос, что с ним в это время происходит?
-
на определенных этапах выполнения запроса, запрос проверит был ли он отменен и тогда закончится
те потенциально он может зависнуть так, что поможет только рестарт кх -
спасибо, понятно
-
Всем привет, кто знает хорошую утилиту для инкрементальных патчей, что то вроде flyway?
-
Может кто-то сталкивался с проблемой репликации Zookepeer: {} <Error> hepic_data.replicated_data_records: DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Poco::Exception. Code: 1000, e.code() = 113, e.displayText() = Net Exception: No route to host, Stack trace (when copying this message, always include the lines below):
-
в конфигах везде IP и они доступны
-
это случается когда пытаешься синхронизировать данные
-
CH сервера анонсируют свои hostname -f в ZK , другие реплики идут по этому имени.
Вы поднимаете КХ. hostname -f = xxx.local . Другая реплика ломится в сеть по адресу xxx.local и получает No route to host . При этом вы думаете что используются какие-то внешние IP.
Есть параметр в config.xml inter server http host туда можно вписать свое собственное имя. Прочитайте описание там. -
великолепно! Спасибо огромное!
-
Yet another ClickHouse support by a-konyaev · Pull Request #2640 · flyway/flyway
Based on #2166 and #1773 This one has some improvements in comparison to previous implementations: more accurate declaration of the schema table's columns (types and default values) &q...
-
Они вроде как не закончили
-
гыгы, они ? Автор тут, он все закончил.
Ментейнеры флайвей не идиоты чтобы что-то незнакомое мержить. Я бы тоже не стал на их месте.
Представьте вы помержили что-то. А дальше приходит юзер с ишью и говорит я вот тут нажал и мне ваша утилита все данные снесла. И вы как дурак смотрите на это и непонятно куда бежать. Вы в КХ ноль, и КХ у вас нет. -
и какая практика поддержания прода и теста в одинаковой структуре?
-
я неправильно выразился может. Проблема не с https://github.com/flyway/flyway/pull/2640 . Там все ОК. Проблема в том что его никогда не вмержат.
-
возможно есть другое решение которое дошло до релиза?
-
Joined.
-
Joined.
-
- 08 January 2021 (106 messages)
-
-
включать так:
<yandex>
<postgresql_port>5432</postgresql_port>
</yandex>
потом подключаться -
-
Добрый день. Вопрос по обновлению.
Сейчас прод на 19.16
Хотим переехать на 20.8.*
Есть смысл сразу переходить или через 20.3.* безопаснее? -
20.3 -> 20.8 требует ручной коррекции ДДЛ (КХ стал нетолерантен к невалидным encodingам и типам)
а так вроде разницы не много... и так и так больно будет по моему... -
ой
-
"(КХ стал нетолерантен к невалидным encodingам и типам" а где про это почитать подробнее?
-
Из нашего опыта переезда 19 -> 20.3 пришлось править JOIN, 20.3 -> 20.8 сейчас по быстрому попробовали, приложение не завелось, тоже надо смотреть код. Так что да, с пол пинка скорее всего не выйдет
-
Я понял, спсб. Будем тест мучать
-
Joined.
-
посмотрел видео Зайцева на ютубе "переезжаем на CH: 3 года спустя" . Когда создаю таблицу с materialized columns, получаю ошибку. может, есть идеи, что я делаю не так?
CREATE TABLE default.transactions4tmp ( id String, transaction String, transaction_time DateTime, metrics Nested( name LowCardinality(String), value String), gateway_mid String MATERIALIZED metrics.value[indexOf(metrics.name, 'gateway_mid')], op_code String MATERIALIZED metrics.value[indexOf(metrics.name, 'op_code')], connector String MATERIALIZED metrics.value[indexOf(metrics.name, 'connector')] ) ENGINE = MergeTree PRIMARY KEY (id) ORDER BY (id) SETTINGS index_granularity = 8192
DB::Exception: Missing columns: 'metrics.name' 'metrics.value' while processing query: 'CAST(metrics.value[indexOf(metrics.name, 'gateway_mid')] AS gateway_mid_tmp_alter12946552051445946325, 'String') AS gateway_mid, gateway_mid_tmp_alter12946552051445946325, CAST(metrics.value[indexOf(metrics.name, 'op_code')] AS op_code_tmp_alter1294071364216470892, 'String') AS op_code, op_code_tmp_alter1294071364216470892, CAST(metrics.value[indexOf(metrics.name, 'connector')] AS connector_tmp_alter8212060507549675347, 'String') AS connector, connector_tmp_alter8212060507549675347', required columns: 'metrics.value' 'metrics.name', source columns: 'connector' 'op_code' 'metrics' 'transaction_time' 'transaction' 'gateway_mid' 'id': default expression and column type are incompatible. (version 20.12.5.14 (official build)) -
А при чем тут Зайцев?
-
сам Зайцев не при чем) Я смотрел https://www.youtube.com/watch?v=k5rw8YPTdRoПереезжаем на ClickHouse: 3 года спустя / Александр Зайцев (Altinity)
Приглашаем на Saint HighLoad ++ 2021 20 и 21 сентября 2021, Санкт-Петербург, DESIGN DISTRICT DAA in SPB Программа, билеты и подробности - https://clck.ru/VmKaW -------- При поддержке AvitoTech мы впервые публикуем все видео с HighLoad++ 2019 в открытый доступ. Учитесь, вдохновляйтесь и перенимайте лучшие практики у спикеров, не выходя из дома. -------- Календарь конференций - https://ontico.ru -------- HighLoad++ 2019 Тезисы и презентация: https://www.highload.ru/moscow/2019/abstracts/5992 3 года назад я рассказывал на HighLoad++, как мы перевели мульти-петабайтовую аналитическую систему на ClickHouse. Это была увлекательная "дорога из желтого кирпича", полная неведомых опасностей. ClickHouse тогда напоминал минное поле, найти безопасный путь в котором было непросто. Прошло три года, что изменилось? ... -------- Нашли ошибку в видео? Пишите нам на support@ontico.ru
-
-
и создать гибридную схему не смог (
-
-
-
-
https://t.me/clickhouse_ru/191887
https://github.com/ClickHouse/ClickHouse/issues/7677
не используйте nested, это просто синтактический сахар для нескольких массивов...Denny Crane [Vertica DBA at Revjet(NB,Canada)] in ClickHouse не тормозитhttps://github.com/ClickHouse/ClickHouse/issues/12586
-
Impossible to alter column type that has skipping index on it (LC(String) to (String)) · Issue #17632 · ClickHouse/ClickHouse
Issue while upgrading from 20.3.11.97 to 20.8.7.15-2 version. service startup failed due to invalid codec errors. Error: SQL Error [36]: ClickHouse exception, code: 36, host: 127.0.0.1, port: 54669...
-
https://t.me/clickhouse_ru/193641
https://t.me/clickhouse_ru/196169
вот вам ещё
короче стелите заранее【D】【J】 in ClickHouse не тормозитДобрый день. после обновления с 20.3 на 20.8 КХ не стартует. Received exception from server (version 20.8.7): Code: 36. DB::Exception: Received from localhost:9000. DB::Exception: Codec Gorilla is not applicable for LowCardinality(String) because the data type is not of fixed size. Кто знает как решить? в новую таблицу данные перелить не вариант, слишком много... ещё была такая проблема но она решилось настройкой allow_suspicious_codecs It does not make sense to have codec NONE along with other compression codecs: NONE, ZSTD(1).
-
Благодарю
-
Joined.
-
Всем привет и счастливого Нового года!)
Возможно кто-то сможет подсказать по поводу функции pandas.read_sql.
Я создал таблицу и заполнил ее:
create table regions
(
date DateTime Default now(),
region String
)
engine = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY tuple()
SETTINGS index_granularity = 8192;
insert into regions (region) values ('Asia'), ('Europe')
Я бы хотел получить ее содержимое функцией pandas.read_sql. Для этого я пишу следующий код:
import pandas as pd
from sqlalchemy import create_engine
uri = 'clickhouse://default:@localhost/default'
engine = create_engine(uri)
query = 'select * from regions'
pd.read_sql(query, engine)
В ответ получаю такое:
Empty DataFrame
Columns: [2021-01-08 09:24:33, Asia]
Index: []
Шляпа.
При этом, если будет указано
clickhouse
+native
://default:@localhost/default
, то ответ будет ожидаемым:
date region
0 2021-01-08 09:24:33 Asia
1 2021-01-08 09:24:33 Europe
Прошу подсказать, как побороть шляпу -
Joined.
-
Всем привет. Я тоже воодушевившись этим видео попробовал вроде даже еще проще сделать табличку, и не получается.
-
CREATE TABLE default.test (
id UInt32,
qty Array(Array(UInt32)),
total_qty UInt32 MATERIALIZED sumArray(flatten(qty))
) ENGINE = MergeTree PARTITION BY id
ORDER BY
id SETTINGS index_granularity = 8192 -
DB::Exception: Aggregate function sumArray(flatten(qty)) is found in wrong place in query: While processing sumArray(flatten(qty)) AS total_qty_tmp_alter185108538576301212:
-
arraySum, а не sumArray
-
it works fine without the "nested sugar"
CREATE TABLE default.transactions6nested ( id String, transaction String, transaction_time DateTime DEFAULT now(), metrics.name Array(LowCardinality(String)), metrics.value Array(String), gateway_mid String MATERIALIZED metrics.value[indexOf(metrics.name, 'gateway_mid')], op_code String MATERIALIZED metrics.value[indexOf(metrics.name, 'op_code')], connector String MATERIALIZED metrics.value[indexOf(metrics.name, 'connector')] ) ENGINE = MergeTree PRIMARY KEY id ORDER BY id SETTINGS index_granularity = 8192
thanks for your attention -
👍
-
-
-
так для него не нужен flatten? он и так сосчитает общую сумму всех массивов?
-
https://t.me/clickhouse_ru/198727 ответил ж【D】【J】 in ClickHouse не тормозит
https://t.me/clickhouse_ru/191887 https://github.com/ClickHouse/ClickHouse/issues/7677 не используйте nested, это просто синтактический сахар для нескольких массивов...
-
не, это по нескольким строкам, не по вложенным массивам (агрегатная функция)
-
Не. без него даже не создается
-
Спасибо!!!
-
-
select negate(44)
-
спасибо)
-
-
-
-
>Если делать запрос по всей таблице
wut? -
-
-
а где супертяжелая колонка pk которую надо прочитать и распаковать в запросе "по всей таблице" ?
-
-
-
ну и вообще ничего не понятно, не складывается. Как запросы могут вернуть одинаковый результат
-
потому что WHERE всегода true
-
т.е. PK низкокардинальное поле?
-
-
-
-
-
если там всего 5 значений , почему тогда оно весит столько 922.97 MiB vs 31.43 GiB ?
-
оно не жмется что-ли?
-
компрессия выключена?
-
-
стат? что?
-
select formatReadableSize(sum(column_data_compressed_bytes) as x) size, formatReadableSize(sum(column_bytes_on_disk)), formatReadableSize(sum(column_data_uncompressed_bytes))
, database,table, column
from system.parts_columns
where active = 1 and table like 't11'
group by database,table, column
order by x desc -
┌─size───────┬─formatReadableSize(sum(column_bytes_on_disk))─┬─formatReadableSize(sum(column_data_uncompressed_bytes))─┬─database─┬─table───────────────────┬─column─────────────────┐
│ 14.87 GiB │ 14.87 GiB │ 14.81 GiB │ ethereum │ transactions_rt_storage │ tx_hash_bin │
│ 14.67 GiB │ 14.67 GiB │ 14.81 GiB │ ethereum │ transactions_rt_storage │ block_hash_bin │
│ 7.52 GiB │ 7.52 GiB │ 9.42 GiB │ ethereum │ transactions_rt_storage │ tx_sender_bin │
│ 6.24 GiB │ 6.24 GiB │ 9.39 GiB │ ethereum │ transactions_rt_storage │ tx_to_bin │
│ 3.01 GiB │ 3.01 GiB │ 17.73 GiB │ ethereum │ transactions_rt_storage │ block_path_string │
│ 2.29 GiB │ 2.29 GiB │ 16.10 GiB │ ethereum │ transactions_rt_storage │ block_path │
│ 2.22 GiB │ 2.23 GiB │ 3.59 GiB │ ethereum │ transactions_rt_storage │ cumulative_gas_used │
│ 1.77 GiB │ 1.77 GiB │ 1.80 GiB │ ethereum │ transactions_rt_storage │ tx_time │
│ 1.76 GiB │ 1.77 GiB │ 3.59 GiB │ ethereum │ transactions_rt_storage │ value │
│ 1.74 GiB │ 1.74 GiB │ 1.80 GiB │ ethereum │ transactions_rt_storage │ block │
│ 1.73 GiB │ 1.73 GiB │ 3.59 GiB │ ethereum │ transactions_rt_storage │ tx_nonce │
│ 1.50 GiB │ 1.50 GiB │ 1.80 GiB │ ethereum │ transactions_rt_storage │ gas_value │
│ 1.30 GiB │ 1.30 GiB │ 1.80 GiB │ ethereum │ transactions_rt_storage │ tx_index │
│ 1.24 GiB │ 1.24 GiB │ 1.80 GiB │ ethereum │ transactions_rt_storage │ gas_price │
│ 1.09 GiB │ 1.09 GiB │ 1.80 GiB │ ethereum │ transactions_rt_storage │ gas_used │
│ 620.69 MiB │ 622.06 MiB │ 919.06 MiB │ ethereum │ transactions_rt_storage │ tx_date │
│ 106.75 MiB │ 108.12 MiB │ 1.80 GiB │ ethereum │ transactions_rt_storage │ success │
│ 62.58 MiB │ 65.32 MiB │ 14.30 GiB │ ethereum │ transactions_rt_storage │ block_path_root │
│ 60.62 MiB │ 61.99 MiB │ 14.28 GiB │ ethereum │ transactions_rt_storage │ block_path_root_string │
│ 53.36 MiB │ 54.74 MiB │ 497.55 MiB │ ethereum │ transactions_rt_storage │ tx_creates_bin │
│ 25.41 MiB │ 26.78 MiB │ 499.96 MiB │ ethereum │ transactions_rt_storage │ error │ -
│ 8.27 MiB │ 9.64 MiB │ 1.80 GiB │ ethereum │ transactions_rt_storage │ currency_id │
│ 8.27 MiB │ 9.64 MiB │ 1.80 GiB │ ethereum │ transactions_rt_storage │ blockchain_id │
│ 8.27 MiB │ 9.64 MiB │ 1.80 GiB │ ethereum │ transactions_rt_storage │ gas_currency_id │
└────────────┴───────────────────────────────────────────────┴─────────────────────────────────────────────────────────┴──────────┴─────────────────────────┴────────────────────────┘ -
-
-
т.е. у вас таблица order by (block_path_root_string) ?
-
-
-
попробуйте LowCardinality(String)
-
-
сколько символов в строке? length(block_path_root_string) ?
-
-
-
-
пробую
-
-
у меня в тесте LC помог и ускорил запрос в 10 раз
-
да с LC стало лучше, но разница все равно есть в 2 раза
-
LC(String) Processed 500.00 million rows, 1.50 GB
String Processed 500.00 million rows, 26.50 GB -
ну 300 млн. сравнений строк нельзя сделать бесплатно, тут индексы не могут помочь. КХ все равно делает unboxing LC и 300*5 млн раз сравнивает строки
-
-
в смысле в колонку не ходить и не делать проверку для каждой строки? потому что уже проверено прунингом?
-
аха, если по всем партициям подходит
-
-
ну конечно есть , сейчас даже where 1 не оптимизируется
-
так clickhouse+native это драйвер https://github.com/mymarilyn/clickhouse-driver
а просто clickhouse это другой, http драйвер, ну кривой он видимо, зачем он вам? -
Joined.
-
Issue с такой же проблемой на github: https://github.com/xzkostyan/clickhouse-sqlalchemy/issues/10. Но вообще вам правильно сказали. Используйте clickhouse+nativeSQL queries with pd.read_sql drop first two records · Issue #10 · xzkostyan/clickhouse-sqlalchemy
For some reason (unknown to me), using pd.read_sql drops the second record and uses the first one as a header. Any idea why is it happening? Here's a sample code used on the Rate example im...
-
господа, а в базе system есть где-то ошибки запросов? если влетели на мемори лимит, то это должно быть видно где-то? вроде в query_log нету
-
-
-
спасибо. Что-то сразу тормознул
-
select top 100 extract(exception, 'Exception: (.*?):') as _exception, *
from system.query_log where exception_code = 241 -
сработало
-
видимо нативный протокол на сервере не открыт. спасибо
-
древний issue. спасибо
-
Joined.
-
а подскажите почему
select sum(users) summa, case when (retention > 180) then '>180d' ELSE '<180d' END AS ret from default.mau group by summa,ret;
говорит мне unknown function sum ? -
хочу получить две суммы - у кого retention больше 180 и у кого меньше
-
Ну а как делать GROUP BY по агрегатной функции.
А почему кстати не воспользоваться sumIf(users,retention > 180) и тд -
а саммультииф есть?)
-
ааа мне просто из group by надо было сумму убрать)
-
Почему не два вложенных запроса ?
-
да все я уже смог, я хотел от груп бай чего-то не того:)
- 09 January 2021 (104 messages)
-
привет всем почему пишет компрессия NaN?
inputFloat Float64 CODEC(LZ4HC)
я создаю таким образом, почему может не отображать табикс? -
Потому что деление на 0
-
а понятно, я думал это булев типа
-
-
табикс показывает (вычисляет) насколько ужато, если в таблице 0 строк, то посчитать невозможно.
используейте describe
desc xx
┌─name───────┬─type────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ A │ Int64 │ │ │ │ │ │
│ inputFloat │ Float64 │ │ │ │ LZ4HC(0) │ │
└────────────┴─────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ -
ну да я понял спасибо, я просто думал показывает зжимаемый столбец или нет
-
tabix вроде не саппортится и сделан еще до того как CODEC появились
-
угу, ну хватает пока его 🙂 спасибо еще раз
-
После некоторого исследования этой проблемы есть такие экспериментальные выводы:
-
-
-
-
-
-
-
если данные не отсортированы, то КХ сам сортирует при вставке по ORDER BY
-
видимо не до конца
-
-
-
-
-
-
-
-
тут видно что с диска больше читает. нужно больше инфы - схема таблицы, сами запросы
-
-
что на серверах? хдд? ссд/нвме?
-
nvme
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
/stat@combot
-
-
Joined.
-
Индекс в кх разреженный, соотвественно одной проверки индекса часто недостаточно. Но конечно можно оптимизировать пропуском проверок на гранулах где и начальная и конечная засечка совпадает (как и с партициями).
-
... можно пропускать его проверку используя where identity(string)="value", тогда индекс не будет использоваться.
-
cool! не знал...
-
Вообще в кх проверка коротких строк (хеши) у нас была не сильно хуже проверки цифр... Там все очень эффективно в этом плане
-
-
-
Да, ну тогда экономить на спичках в виде проверки индекса смысла нет
-
Доброго времени суток, коллеги
Всех с прошедшими и наступающим старым Новым
Обнаружил, что в Clickhouse добавлена поддержка Posrgres Wire prtocol
https://altinity.com/blog/new-year-greetings-and-clickhouse-updates?utm_campaign=Newsletter&utm_medium=email&_hsmi=104857590&_hsenc=p2ANqtz--hhNfovO4dE6MqO3AOCcfndDoF8_POtaeJNuzxJ6Z8CygtQRgxUmSQqN6mW-ufussRf4r91hOZJEi30lXRuNsx9HGHmg&utm_content=104856435&utm_source=hs_email
https://clickhouse.tech/docs/en/whats-new/changelog/#clickhouse-release-v20-5-2-7-stable-2020-07-02
https://github.com/ClickHouse/ClickHouse/pull/10242
Вижу что в бинарниках последней версии clickhouse-server поддерживается конфигурационный тег postgresql_port
Но не вижу в файле конфигурации данного тега
Не нашел ни слова в документации и в поисковиках описание как этим пользоваться
Может кто просвятит?New Year Greetings & ClickHouse Updates | AltinityThe year 2020 in one word: change. We've changed the way people work, communicate and travel. It taught us to care more about family, friends, and colleagues while highlighting our world's fragility. Altinity and ClickHouse were no different, but fortunately, most of these changes were positive.
-
【D】【J】 in ClickHouse не тормозит
включать так: <yandex> <postgresql_port>5432</postgresql_port> </yandex> потом подключаться
-
-
Joined.
-
ты мне 4к? верно понял
-
Есть ли существенная разница в SSD/HDD для активной записи в Clickhouse?
-
-
-
Думаю около 15-20MBPS в пик
-
при больших объемах данных на рейдах из хдд (>1TB полезных данных), при выходе диска из строя - умрете на ребилде =)
-
Смерть данных - не страшно особо
-
Это сжатых или сырых?
-
Сырых
-
-
-
-
можно использовать raid0 и не страдать
-
ну да, только въезжать диски будут все равно - и это в любом случае будет либо долго, либо влиять на производительность. 🙂
-
если нестрашно и 20МБ сырых - то смело ставьте хдд и не парьтесь.
-
так говорите как будто ссд при ребилде не деградируют по скорости)
-
Нечасто увидишь "raid0" и "не страдать" в одном предложении
-
потому что не так распространен raid0, соответственно утверждения встречаются редко :)
-
все деградирует, даже нвме 🙂 тут вопрос, скорее, что когда выбирают хдд - обычно думают только о нормальном режиме работы, про условный дегрейд режим и восстановление после него - не думают, а обычно запаса производительности у хдд уже не хватает. и в итоге у всех шок, что "база будет тормозить еще N дней, потому что меняется диск" 🙂
-
-
Joined.
-
"replication is not backup"...
-
-
Разумный ли подход : хочу обсчитывать данные , которые лежат в кластере CH возвращать в CH. Новую порцию лить в свежую таблицу и подменивать партицию в исходной. Планирую использовать Apache Spark для расчетов . * нет никаких идей как это лучше приготовить?)
-
Делали так раньше. Запускали на airflow pyspark. В clickhouse можно использовать ReplacingMergeTree если подходит
-
-
-
да ладно. Годами все работает на hdd
df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/md0 46T 38T 7.8T 83% / -
Умрете - я не про потерю данных, а про сам синк и перформанс. У меня у самого примерно такие же цифры, достаточно интенсивный регулярный поток без пиков и поэтому замена дисков затягивается :)
-
да постоянно меняем. И скрабинг раз в месяц.
-
Очень хорошо :) мы тоже меняем регулярно. И тоже живём в основном на хдд
-
и нормально ребилдятся 10TB-ые диски
-
mdraid конечно рулит
-
железные рейды в топку
-
Да железные рейды, кажется, только виндовым юзерам уже и нужны :)
-
про raid0, а еще смешно, но у меня вертика работает на raid1 из 2-х nvme. И что самое смешное уже несколько раз спасало.
-
Но под свой кейс я бы при возможности выкинул хдд шки и взял бы нвме сервера с репликой на уровне БД и забил бы на репликацию данных на уровне сервера :)
-
Сдох нвме - перенакатил данные на всем сервере
-
я тоже сразу перейду на NVME когда выйдут 100ТБ NVME ценой по 100баксов
-
нет, это про память. Там колонка 62 MB размером на диске.
-
А какие кстати могут быть подводные камни при раскатке под докер свормом?
-
Когда это случится, в сервера потребуется уже что-то новое, стоящее как подходящие nmve нынче
-
эм, какая разница чем?
ну имена хостов в докере рандомные, но это к сварму не относится. -
а кто вообще свармом пользуется? его уже все похоронили
-
нету. Если сделать 10й рейд из 10ти HDD , будет примерно как NVME, у меня КХ читает и пишет 1.5GB/s на HDD
-
По феншую только кубером раскатывать?
Или кликхаус лучше вообще без прослоек руками настраивать? -
да как хотите, у меня chef и LXC
а так конечно, кубер это новый линукс -
- 10 January 2021 (60 messages)
-
Кубер это supervisord на стероидах
-
-
Для небольших проектов решение swarm имеет очевидные преимущества перед k8
Это, кстати, признают и гуру kubernetes
Так что, не знаю у кого как, у нас swarm живее всех живых -
ну смотря что считать небольшим проектом
и смотря где это все развертывать
скажем AWS EKS vs bare metal docker swarm, я бы выбрал первый вариант =) -
хорошо так говорить, когда деньги инвестора
-
нет, я для себя считал именно с точки зрения того что EKS это наиболее универсальный способ чтобы и autoscaling был
и EBS через PVC подключать... и эксплуатация была дешевле с точки зрения специалиста...
но потом servers.ru выкатил свои managed kubernetes и я решил не лезть в облака -
зачем вам swarm когда есть nomad?
-
Простой как три рубля по сравнению с кубером но за номад спасибо, выглядит интересно
-
Вот и номад простой как три рубля, причем фичастый и не deprecated
-
-
почему пользователь default может перестать видеть записи в своей же таблице? Другой пользователь, которому дан грант с ограничениями записи видит.
-
в КХ нету своих таблиц.
Кажется когда назначаются row-based policy одному пользователю, все остальные пользователи перестают видеть все, у них становится все запрещено -
в смысле default.table
-
да, похоже на это
-
как это починить?
-
выдать права на все строки
-
дефолту?
-
default база никак не связана с default юзером. Это однофамильцы, не родственники
-
default не владелец таблиц
-
да
-
FOR SELECT
USING 1 ? -
странная система
-
Joined.
-
Права складываются. Если сложить все можно читать всем с Васе можно читать чётное, получается Васе можно читать все.
-
Парни, привет, подскажите плиз, ситуация мне непонятная - сервер убунту с апдейченным КХ. Неделю назад запускал мутации на апдейт и какая-то подвисла. Полное ощущение - что работает до сих пор и апдейтит все что падает в таблицу. или просто хз что. Причем в show processlist ничего нет. Но сервер трудится. В каталоге data постоянно мелькает создание-удаление папок tmp_mut_...
select * from system.mutations Limit 10 - тупо виснет
Как бы остановить невидимое? -
Попробовал KILL MUTATION WHERE database =XXX тоже подвисает наглухо
-
рестарт КХ, ребут сервера - не помогают
-
Если не в ту группу пишу, подправьте плиз
-
кстати не все, вставлять строки могут
-
1. replicated таблица?
2. версия КХ -
я же написал: читать
-
:))
-
нет, один сервер, одна таблица все просто. Версия... счас поищу - но сегодня запускал apt-get update & apt-get upgrade
-
таблица summarymergetree
-
я не понимаю в чем удивление такой реализации lable security. оно везде такое
-
в каталоге таблицы есть файлик /daat/db/таблицы/mutations.txt его можно отредактировать или удалить
после этого detach/atach или ребут -
да, много их там
-
Если руками удалить эти txt - сервак не сдохнет?
-
select version()
-
20.12.5.14
-
каких только команд нет ))
-
вы издеваетесь?
-
я написал: его можно отредактировать или удалить
-
можно как-то по другому это прочитать?
-
не сердитесь, сори
-
да, походу остановилось. Теперь tmp_mut не мелькают
-
спасибо
-
но
select * from system.mutations limit 1;
все равно подвисает -
так а второй шаг был? detach/atach или ребут
-
service restart
-
значит еще есть файлы mutations.txt , в других таблицах
-
прошел поудалял. ПРосто стремно так ходить руками по базе... БАкап бакапом, но...
ДА, теперь все гуд -
Спасибо огромное
-
А так, на будущее - есть ли какой аналог show processlist? а то в этой ситуации была не очевидна проблема
-
system.processes табличка
-
мутации видно в system.merges, а не в system.processes
-
Спасибо )
-
Joined.
-
-
- 11 January 2021 (131 messages)
-
Подскажите, может есть возможность при инсерте данных через HTTP клиент автоматически вставлять информацию о том с какого IP был запрос на инсерт?
Т.е. добавить в таблицу что-то типа
remoteServer IPv6 DEFAULT адрес_с_которого_пришел_инсерт ?
p.s. этот IP есть в системных логах initial_address from system.query_log
вопрос как получить её при инсерте в другой таблице -
-
-
Переписать запрос можно и на стороне серверовс которых идет инсерт..., но хочется решить этот момент именно силами кликхауса.
-
всем привет. можете подсказать в чем может быть проблема?
SELECT count() FROM reports.table AS sd WHERE (sd.month = 12) AND (sd.year = 2020) - возвращает больше 2х мрлд
делаю
insert into xxx SELECT * FROM reports.table AS sd WHERE (sd.month = 12) AND (sd.year = 2020)
вставляет каждый раз разное количество, но не больше 1.7 млрд
в логах ничего ошибок нет
ClickHouse server version 20.12.5 revision 54442. -
Похожая задача.
-
Тоже замечал - когда копировал за месяц в друг табл. В итоге пришлось копировать по дням. Тогда 1-в-1. Большой объем почему-то глючил
-
-
а нет способа копировать данные через партиции ? 🧐
-
Joined.
-
нет к сожалению. буду пока частями переносить.
-
как перенести одну таблицу из базы в базу? Простое копирование ее дирректории в /var/lib/clickhouse/data/default не работает
-
я так понимаю речь про большую таблицу. Вот так? - https://ruhighload.com/%D0%91%D0%B5%D0%BA%D0%B0%D0%BF+%D0%B8+%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5+%D0%B2+clickhouseБекап и восстановление в Clickhouse
Как сделать бекап и восстановить данные в Clickhouse
-
только фриз и аттач не партиций а сразу таблицы
-
не, особо большую
-
может попробовать просто папку и метаданные?
-
-
👍
-
можно так, а дальше словарем.
drop table if exists default.testDefaultInsert ;
create table default.testDefaultInsert (A String CODEC(NONE), host String DEFAULT hostName(), fqdn String DEFAULT FQDN()) Engine=MergeTree order by tuple();
insert into default.testDefaultInsert (A) values ('test record');
select * from default.testDefaultInsert ; -
Всем спасибо! Для небольшой таблицы простой перенос ее директории и файла из метаданных работает. Нужно только владельца менять, который теряется при переносе рсинком
-
Добрый день. Есть БД с атомик engine. Дропаю партицию из таблицы. Место не увеличивается . Кликхаус в докере.
https://github.com/ClickHouse/ClickHouse/issues/18123 почитав, понял, что вроде так и должно быть.What's the difference between Atomic and Ordinary database engine · Issue #18123 · ClickHouse/ClickHouseI've searched the official doc and hasn't found anything about this.
-
он вроде ждет пока все запросы не кончатся + таймаут... или он у вас даже через день место жрёт? если так - то наверно баг, лучше завести тикет
-
Насчёт дня не знаю , но пару часов уже точно. Возможно нужно перезагрузить контейнер. меня смущает, что с ординари можно было смело зайти на расширенные папки на хост. При атомике в папке с базой при ls -l уже нельзя пощупать файлы, а присутствуют ссылки на папки внутри контейнера.
-
Здравствуйте, а вы не можете подсказать когда будет обновлена документация CH насчет движков? А то начиная с версии 20.10 по дефолту введен для баз Atomic движок и как бе в доках че-т упоминания не найду кроме как комментариев в altinity blog и issues гита, а хотелось бы более подробнее информацию (или я слепой)
-
Joined.
-
ну так зайдите в шелл контейнера и делайте что хотите..
-
Добрый день, открыл 2 сессии работы в clickhouse, в одной запустил "insert into <table>", в другой (пока insert работал) - "truncate table <table>". Это привело к отказу работы clickhouse (невозможно соединиться через клиент (code 210 connection refused)). Перезапуск сервиса не помог, пришлось переустанавливать. Было у кого-нибудь такое?
-
а до переустановки в /var/log/clickhouse-server/clickhouse-server.err.log что показывало?
-
не заглядывал туда. Но сам сервис при перезапуске ошибок не выдавал. Я думал (судя по ошибке клиента), с конфигами проблема, но они не менялись. После переустановки с такими же конфигами всё завелось.
-
ошибка клиента показывает только что разрыв соединения и ничего больше
процесс ps auxf | grep clickhouse-server при этом что покаывал?
и в логи надо было посмотреть
после переустановки с теми же конфигами той же версией clickhouse-server?
или поновее?
и после этого INSERT INTO + TRUNCATE в другом клиенте не валятся уже? -
Всем добрый день) вопрос по DISTINCT
в документации сказано следующее
DISTINCT не поддерживается, если SELECT имеет по крайней мере один столбец-массив.
http://clickhouse.tech/docs/ru/sql-reference/statements/select/distinct/#limitations
Это значит что distinct вообще не применяется? или применяется каким-то неизвестным способом?
просто заметили что он то работает, то вообще добавляет какие то дубли.
Версия клика ClickHouse server version 19.16.10 revision 54427DISTINCT | Документация ClickHouseСекция DISTINCT Если указан SELECT DISTINCT, то в результате запроса останутся только уникальные строки. Таким образом,
-
ps показывал работающий процесс. Версия та же 20.12.5. Опыт этот пока не повторял. На всякий случай уточню, что запросы были из 2х клиентов (clickhouse-client и clickhouse_driver из python).
-
ну, тогда надо смотреть в логи и попробовать повторить ... если воспроизведется, то делать issue на github
просто потому что как минимум TRUNCATE либо должен был окончания INSERT Ждать либо INSERT должен был отвалиться
какой движок у таблицы? -
MergeTree()
-
похоже что документация в этом месте устарела, но скорее всего DISTINCT просто не применяется для 19.16
для 20.8-lts
CREATE TABLE default.test (a Array(UInt64)) ENGINE MergeTree() ORDER BY a;
INSERT INTO default.test VALUES ([1,2,3]),([1,2,3]), ([3,2,1]);
SELECT DISTINCt a FROM default.test;
SELECT a FROM default.test;
DROP TABLE default.test;
выдает
a
[1,2,3]
[3,2,1]
и
a
[1,2,3]
[1,2,3]
[3,2,1]
соответсвенно -
на 19.16 тоже работает такой скрипт
да и на большой таблице работало, а сейчас вылезли дубли, нашли вот эту фразу в документации -
Всем привет! Пытаюсь проверить на дубли таблицу с количеством строк > 1 млрд.
select
uniqExact(id)
, count(*)
from
vc_games_history_archive
получаю ошибку "Memory limit (for query) exceeded"
Пробовал с параметром set max_threads=1 - результат тот же. Есть какие-либо варианты выполнить этот запрос? -
лучше использовать через GROUP BY id
в таком случае можно и на диске делать его -
в английской версии документации это тоже присутсвует
задайте вопрос на github -
с group by таже самая ошибка
-
GROUP BY | ClickHouse Documentation
GROUP BY Clause GROUP BY clause switches the SELECT query into an aggregation mode, which works as follows: GROUP BY cla
-
-
read_backoff_min_latency_ms=0
-
Это исправлено 4 года назад. Забыли из доки убрать.
-
то есть если у меня появились дубли после дистинкта - проблема в чем то другом?
-
Да
-
-
Да, главное не спамить в чате рекламой
-
-
-
-
-
-
-
-
устанавливается при загрузке КХ
берется из hostname -f , если не задана настройка interserver_http_host
/etc/clickhouse-server/config.xml
<!-- Hostname that is used by other replicas to request this server.
If not specified, than it is determined analogous 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>
--> -
-
-
-
-
badger судя по описанию то что я хотел, спасибо
-
кстати кто не в курсе rocksDB встроен в КХ и можно создавать таблицы с движком Engine=EmbeddedRocksDB
-
а параметры движку всякие как передать?
-
CREATE TABLE test (key String, value UInt32) Engine=EmbeddedRocksDB PRIMARY KEY(key);
-
update там через insert-ы можно делать, про delete не знаю
-
сделал ALTER на колонке, сменил тип с UInt32 -> Int64, теперь при запросе получаю ошибку: “Type mismatch for column color. Column has type Int64, got type UInt32.” почему так? и как исправить?
-
не, я про многочисленные опции при старте движка. конфиг его то бишь
-
пока никак
-
alter вернул управление? закончился?
что в system.mutations ? -
отвалился по таймауту с сообщением что продолжит работу асинхронно
-
в system.mutations этого запроса нет
-
describe на таблице показывает что колонка имеет тип Int64
-
версия КХ ?
-
19.13
-
почему бы было не написать об этом в первом сообщении?
-
значит идет ваш alter, не закончился еще
вот так можно мониторить
select type, count() from system.parts_columns where acitve and table = column = group by type -
часть партом уже будет UInt64, часть UInt32
-
в итоге все части должны стать Int64 я так понимаю?
-
да
-
ясно, спасибо за информацию
-
-
Приветсвую, тоже вопрос - сервер с озу 60 гиг, база около 10-ти. КХ не использует больше 3-х. В конфиге не стоит ограничения - все как было из коробки. Вся большая память не тронутая ничем простаивает. КХ последний 20.12, Убунта
-
память не простаивает, в ней хранится файловый кеш ОС
-
ну htop показывает - занято 3 гига и все
-
-
-
Не понимаю, какой юзкейс у ReplacingMergeTree, который схлопывает по ключу сортировки. Почему не по первичному ключу? Вот, например, мне кажется самый распространенный пример. Таймсайрес данные, которые надо всегда выбирать отсортированными по времени. Поэтому делаем ключ сортировки таймстамп. Но иногда я хочу заменять старые данные, новыми по первичному ключу, например по хосту, в рамках одной партиции типа за месяц. Но движок этого не позволяет. Как быть?
-
union
-
запустил - 3 зянято, 56 свободно
-
2 гига буф-кеш
-
free или available ?
-
total used free shared buff/cache available
Mem: 61852364 3026548 56582084 102584 2243732 58086184 -
free -h
-h -human -
total used free shared buff/cache available
Mem: 58G 1.1G 55G 100M 2.6G 57G
Swap: 0B 0B 0B -
сдвиг на 1 позицию
-
......................total used free shared buff/cache available
Mem: 58G 1.1G 55G 100M 2.6G 57G
Swap: 0B 0B 0B -
три бектика `
total used free shared buff/cache available
Mem: 125Gi 14Gi 8.3Gi 58Mi 102Gi 109Gi
Swap: 0B 0B 0B -
total used free shared buff/cache available
Mem: 125Gi 14Gi 8.3Gi 58Mi 102Gi 109Gi
Swap: 0B 0B 0B -
дерьмо телеграм
-
))
-
пора переходить куда-то
-
ну что есть
-
пойду гитхаб почитаю
-
а я хочу Анжелину Джоли из 1998 года.
-
я к чему - нет ли какого лимита, а то я может душу КХ сам того не зная
-
дефолты адекватные, не напрягайтесь
-
часто видим такое, кто может подсказать кроме места на диске, что ещё используется для подсчёта current maximum?
Not executing log entry MERGE_PARTS for part 20210111-14_396_408_2 because source parts size (23.35 MiB) is greater than the current maximum (4.45 MiB). -
Добрый вечер. Делается вставка в Distributed таблицу, которая смотрит на MergeTree в другом ДЦ. Сеть в какой то момент между ДЦ потерялась, сейчас всё вернулось. Но данные не отправляются. Ошибка Code: 209, e.displayText() = DB::NetException: Timeout exceeded while reading from socket (10.19.0.197:9000): while receiving packet from 10.19.0.197:9000, Stack trace:. есть ещё одна такая же таблица, которая нормально отправляет в другой ДЦ. Рестарт делал не помог. STOP/START DISTRIBUTED SENDS тоже не помог. Что ещё можно посмотреть?
-
сам КХ жрёт память только во время выполнения запроса/мержей
-
Тоже бы не отказался. Но я серьезно, есть ли какие-то варианты или я чего-то не понимаю в бест практис?
-
но селекты то бегают... Ну ок, раз нормально, знач нормально
-
Про первичный ключ долго рассказывать. Лень.
Главный вопрос: А почему КХ ? Почему не victoria metrics? -
-
Да
-
-
-
Не смотрели на нее даже, честно говоря. Базово нужен реалтайм поиск по 400+ колонкам редкие обновления/замена и компрессия на хранение больших объемов. Там есть такое?
-
-
таймсириес и 400колонок? Что-то в консерватории у вас не так.
-
Ну условный таймсайрес очень. Там не большой рпс на запись
-
-
Joined.
-
ok, я эт уже спрашивал и решал же ) гребаная экспонента
max_size = interpolateExponential(
data_settings->max_bytes_to_merge_at_min_space_in_pool,
data_settings->max_bytes_to_merge_at_max_space_in_pool,
static_cast<double>(free_entries) / data_settings->number_of_free_entries_in_pool_to_lower_max_size_of_merge); -
-
Joined.
-
спасибо, помогло!
-
Подскажите, нужно перелить около 7 ТБ данных из ClickHouse в Distributed table ClickHouse. Как это правильней сделать? Тупо переливкой через ClickHouseClient. Или городить скрипт, который будет переливать частями? Бывают проблемы с сетью и не хочется непредвиденного завершения или большого дублирования данных.
-
/report
-
ну clickhouse-copier делает это кусками, по партициям, в паралель, проверяет результат и автоматически ретраит
-
но вообще можно и rsync-м, если не нужен шардинг
-
Спасибо, только что про него прочитал. Ща буду разбираться
- 12 January 2021 (124 messages)
-
У меня одна из задач примерно такая же. Данные льются батчами каждый день. Это новое состояние системы на определенный день. - агрегаты с плавающим окном (-30 дней.) 150 показателей на 50 млн записей. Т.е. дата это партиция , которая адресует расчет на определенное утро.+ ещё хочется индекс что бы быстро искать по такой партиции. Насколько это нормальный кейс для КХ ?
-
ну я ничего не понял. Предыдущий тоже хотел непонятного. Зачем нужна там сортировка по дате, если по сути она ничего вообще не дает.
-
Ну да , для меня это атрибут - признак расчета . Если отстраниться от первичного вопроса , для моего случая как движок таблиц подойдёт ?
-
MergeTree?
-
-
Добрый день, коллеги. С ch работаю недавно, пока не всё знаю.
Ситуация такая: у меня есть json вида [{"name":"aaa","date":"2020-02-01 15:44:33","val":222},{"name":"bbb","date":"2020-03-01 15:44:33","val":333}], хочется его использовать в запросе как то так
select <some> from table1 t join @json j on j.name = t.name where ....
Единственный вариант, который я пока нашел - это создавать таблицу с engine=Memory(), вливать туда данные, использовать и потом грохать. При этом в документации говорится, что именно так ведет себя КХ при обработке IN с большими данными. Вопрос - есть ли какие то другие способы? -
Да, есть вот такой подход с внешними даннымиВнешние данные для обработки запроса | Документация ClickHouse
Внешние данные для обработки запроса ClickHouse позволяет отправить на сервер данные, необходимые для обработки одного з
-
Спасибо, но это мне скорее всего не годится. Я подключаюсь к КХ из c# и мне нужно использовать json как таблицу внутри запроса. Буду использовать CREATE TEMPORARY TABLE, это мне подойдет. Спасибо за ответ.
-
Joined.
-
Привет всем
а есть какой то аналог use_client_time_zone для HTTP интерфейса?
пытался сделать так
curl -vvv "http://127.0.0.1:8123/?query=SELECT+now()&use_client_time_zone=1" -H "X-ClickHouse-Timezone: UTC" -
Нет
-
после миграции MergeTree таблицы на Replicated и аттача партиций через
`clickhouse-client --format=TSVRaw -q"select 'ALTER TABLE ' || database || '.' || table || ' ATTACH PARTITION ID \'' || partition_id || '\';\n' from system.detached_parts group by database, table, partition_id order by database, table, partition_id;" | clickhouse-client -mn
остались detach partisions в состоянии inactive -
-
-
-
Добрый день)
нашел по поиску вот такое сообщение
"я менял на большие значения, чтобы через jdbc посылать SQL с огромным спиcком in
(jdbc не умеет external-data)" -
"миллионы можно, пока в sql размер влезает (256кб по дефолту), но лучше external data. Какой API ? можно через что угодно, даже jdbc"
и вот такое
пытаюсь понять, можно ли через jdbc драйвер послать external data с запросом, или остается вариант только через http интерфейс? -
"шадированных" таблиц не существует
существуют "Distributed"
которые обычно делаются поверх ReplicatedMergeTree (но можно любой движок)
у вас сейчас "не шардированная" таблица какой Engine имеет? -
да, все верное - Distributed
сейчас не шардированная таблица ENGINE = MergeTree -
ну самое простое, но не самое лучшее
ставим новый сервер с нуля
создаем там пустую таблицу с Engine = MergreTree
добавляем оба сервера в
<remote_servers><your_cluster_name>
в разные <shard> теги
создаем новую таблицу ENGINE Distributed(...) на обоих серверах
все новые INSERT делаем в новый сервер в таблицу которая ENGINE MergeTree
ну либо рандомно с весовым коэффициентом скажем (75% в новый сервер, 25% в старый сервер)
все SELECT делаем из ENGINE=Distributed()
тоже можно рандомно какой нибудь chproxy с весами настроить чтобы данные каждый раз не лить с одного сервера на другой... -
второй вариант более правильный и более сложный
ставим Zookeeper
ставим второй clickhouse-server
прописываем на обоих clickhouse серверах <zookeeper> секцию и <remote_servers> в конфиги
конвертируем MergeTree в ReplicatedMergeTree на первом сервере
https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/replication/#converting-from-mergetree-to-replicatedmergetree
получите два сервера с копией данных
дальше делаете Distributed таблицу и читаете из нееData Replication | ClickHouse DocumentationData Replication Replication is only supported for tables in the MergeTree family: ReplicatedMergeTree ReplicatedSumming
-
немного не понял с переносом, сейчас на старом сервере таблица весит 1,7 ТБ, на двух новых серверах диски по 2ТБ, я бы хотел что бы данные со старого сервера при переносе распределились на два новых сервера 50/50 по занимаемому месту
-
облом =) автоматического решардинга нет
и у вас уже нет места для того чтобы сделать
INSERT INTO distributed_table FROM your_merge_tree_table с распределением 50 на 50 -
ну можно попробовать переливать данные частями
сначала INSERT INTO ... SELECT .. WHERE ... а потом ALTER TABLE ... DELETE .. WHERE ...
но это сильно будет диск жрать на ALTER TABLE ... DELETE -
добрый день можно ли как то писать в такие таблицы https://clickhouse.tech/docs/en/engines/table-engines/integrations/rabbitmq/ через вьюшки?RabbitMQ | ClickHouse Documentation
RabbitMQ Engine This engine allows integrating ClickHouse with RabbitMQ. RabbitMQ lets you: Publish or subscribe to data
-
-
Primary key задаётся при создании merge tree таблицы и для таблицы не меняется.
-
Можно добавить вторичный индекс
-
-
Replacing не гарантирует уникальность. Схлопка только при слияниях и внутри патриции.
Можно замутить схему с matView которая будет считать argmax всех столбцов кроме primary key и на неё повесить view -
А можно вызывать select с final
-
-
Joined.
-
Только в виде аггрегата, но может кто ещё что-то посоветует.
-
тогда наверное придется создать на каком-то новом сервере таблицу Distributed, которая будет шардиться локально и на другой новый сервер и в нее заливать потихоньку данные через insert into tables select * from remote where EventDateTime >= 'date' and EventDateTime < 'date'
-
нет нельзя
вьюшка ничем вам не поможет
можете попробовать сделать Pull Request чтобы RabbitMQ Engine мог сообщения в RabbitMQ отсылать -
он может. если сделать инсерт данные упадут в рабит
-
Вам должен помочь clickhouse-copier
https://clickhouse.tech/docs/ru/operations/utilities/clickhouse-copier/clickhouse-copier | Документация ClickHouseclickhouse-copier Копирует данные из таблиц одного кластера в таблицы другого (или этого же) кластера. Можно запустить н
-
Добрый день
Столкнулись с проблемой расхождения ответов
У нас старый формат таблиц (данных много, поэтому сразу не перельешь). Сам движок ReplicatedReplacingMergeTree
Отправляем запрос вида
SELECT column FROM distributed_table WHERE column IN (набор из сотен значений)
получаем разное количество записей
Проблема проявляется первые 2-3 раза, после чего кол-во строк в ответе становится неизменным.
При запросе к одному из шардов, минуя дистрибьютед таблицу, баг не проявляется.
Проблема как минимум с ноября, обновились до 20.12.5.14 - не помогло
Что посоветуете? -
Коллеги, а есть у кого нить может статейка на русском про то, как деплоить кликхаус с использованием clickhouse-operator от altinity?
У них дока конечно исчерпывающая, но на англ в первый раз делать это тяжеловато -
ну у вас реплики отстают друг от друга
и данные выбираются то с одной реплики то с другой -
Это проявляется на старых данных, когда в запросе ограничение по датам за 18-19 год. Все равно может быть дело в репликах? Как проверить отставание, подскажите, пожалуйста?
-
ну лучше сделать по доке которая в github
шаги примерно такие
устанавливаем оператор через web installer
curl -sL https://github.com/Altinity/clickhouse-operator/blob/master/deploy/operator-web-installer/clickhouse-operator-install.sh | bash -x
устанавливаем Zookeeper
https://github.com/Altinity/clickhouse-operator/blob/master/deploy/zookeeper/quick-start-persistent-volume/zookeeper-1-node-create.sh
для первого раза можно 1 нодовую конфигурацию взять
пишем свой yaml манифест определяющий кластер
за основу можно взять
https://github.com/Altinity/clickhouse-operator/blob/master/docs/chi-examples/01-simple-layout-02-1shard-2repl.yaml
просто определите сколько у вас реплик и шардов
и делаете его kubectl apply
дальше смотрите через kubectl describe -n your-ns your-chi на статус как оно там накатывается
ну или через k9s смотрите как оператор ваш chi реконсайлитAltinity/clickhouse-operatorThe ClickHouse Operator creates, configures and manages ClickHouse clusters running on Kubernetes - Altinity/clickhouse-operator
-
а что with?
with T as (select ... )
select join T
или там длинный json ? или вообще не json? -
либо у вас парты пересекались по номерам, поэтому attach приатачил не все
либо вы на обеих репликах положили в detached, то в этом случае надо было делать не так, attach атачит только на одной реплике, где он запущен, остальные реплики фетчат с него. -
конечно jdbc умеет, я неправильно написал (в 2017м или 2018 jdbc не умел)
https://github.com/ClickHouse/ClickHouse/issues/17219#issuecomment-731224167How to upload external Data using jdbc · Issue #17219 · ClickHouse/ClickHouseI have a query which has a large in clause . The query likes "SELECT distinct(id) FROM table WHERE id in ('92f66358058d6bb4','00005053e61ae5b1','92f...
-
точно НЕ второй вариант - аттачил на одной реплике только.
inactive партции когда-нибудь исчезнут? -
в detached ничего само не исчезает. Вы взяли парты с одного шарда? Или с нескольких?
у вас номера блоков пересекались? -
👌пасип, попробую
-
у меня один инстанс вообще был. на него всё писалось. после этого появилось две новые машинки, на них создал replicated таблицы. на той где были данные сделал по инструкции на сайте - переименовал обычную, создал репликейтед и данные из обычной в реплицируемую скопировал на файлухе в detached директорию. дальше тем скриптом из github issue прошёлся чтобы приаттачить
-
видимо это были inactive парты в старой MT
если все данные на месте, то просто удалите все из detached -
будут вопросы, пишите =)
кстати пошарьте свой опыт потом, получилось или нет, это тоже очень интересно -
ок, спасибо!
-
Да у меня больше дум, как это в CI обернуть, и как автоскейл красиво сделать
-
-
нет, вторичных индексов нету, не верьте
-
нету, никак не проверить БЫСТРО что запись уже существует.
-
в CI/CD это так примерно заворачивается
берете токен от вашего кубернетес кластера + endpoint от apiserver
и кладете в ~/.kubeconfig
делаете переменную KUBECONFIG=~/.kubeconfig
и в CI/CD где то вызываете kubectl apply
автоскейл чего? автоскейл kubernetes или автоскейл clickhouse в кубернетес?
автоскейла в кликхаусе нет, но можно мониторинг прикрутить + podAntiAffinity чтобы по одному поду внутри StatefulSet на ноду и прикрутить к этому autoscaling node groups для того провайдера Kubernetes который это поддерживает
у вас какой k8s? облачный? bare-metal? -
ну и вы вперед паровоза бежите
вы сначала научитесь с этим жить хотя бы локально на minikube чтобы понять как оно там устроено... а потом уже про масштабирование думайте -
Понятно, спасибо
-
ну вы попробуйте вставить в какой нибудь Postgres миллиард UUID записей с UNIQE index ;)
вместе поплачем над тем что надо до 9 чтений рандомных на каждую запись сделать -
да, сразу не разобрался и полез в чат)
спасибо большое -
то есть задача проверки "уникальности" для большого набора "произвольных данных", она сама по себе не тривиальна
и в OLTP базах более или менее решена только для случаев монотонно возрастающих числовых значений размерностью до UInt64 ;) -
в OLTP базах в btree индексе random io небольшой из-за того что там логарифм получается с большим основанием, поэтому для млрд. будет 6 рандом чтений, а для 100млрд. будет 7. Даже если не монотонно возрастает. В КХ индекс не btree и еще и разреженный.
И еще внезапно КХ читает все марки в парте, поэтому надо проверить 1 строку, а КХ может 10ГБ одних марков вычитать с диска и еще в памяти это 10ГБ надо разложить. -
Запрос выполняется по PK , выполняется около секунды, при этом с диска ничего не читает.
https://gist.github.com/den-crane/1f3143176c4333530ab6f73c3518adcb -
секунда уходит на чтение из кеша линукса 6ГБ марков и раскладывание их в кеш.
-
спасибо, помогло
-
В след. stable 20.11 и 20.12 уже будет пофикшено, к сожалению такой критичный баг бекпортили 3 недели, могло быть пофикшено 2 версии назад.
-
Joined.
-
Добрый вечер!
При запросе
SELECT
col0,
groupArray(col2) AS col2Arr,
groupArray(col3) AS col3Arr,
groupArray(col4) AS col4Arr
FROM
(
SELECT
col1, col2, col3, col4
FROM tmp_tab
GROUP BY col0, col1
)
GROUP BY col0
гарантируется, что в массивах col2Arr, col3Arr, col4Arr под одинаковыми индексами будут элементы из одной строки подзапроса? Т.е. для одной строки из подзапроса col2 будет под таким же индексом в col2Arr, что и col3 в col3Arr?
Потому что описание из документации можно трактовать двояко: "Values can be added to the array in any (indeterminate) order." -
-
просто в хешфункцию передать два, или 22 аргумента через запятую
-
гарантируется для не Nullable полей.
или можете делать groupArray( (col2,col3,col4) ) AS colsArr, -
Null -ы не попадают в агрегатные функции, поэтому в итоге может оказаться что там тупо разное кол-во элементов в массивах, тупл (col2,col3,col4) решает эту проблему
-
Понял, спасибо
-
-
Добрый день. Создал таблицу Engine = URL
CREATE TABLE dwh.campaign_url_table (
campaign_id String, account_ids Array(Int32), group Int32
) ENGINE=URL('https://staging-stable-dev-backend.str.inc/marketing', JSON);
но любое обращение к таблице приводить к
SELECT *
FROM dwh.campaign_url_table
Received exception from server (version 20.10.3):
Code: 1000. DB::Exception: Received from localhost:9000. DB::Exception: SSL Exception: error:14000438:SSL routines::tlsv1 alert internal error.
спасибо за помощь. -
а какой сертификат https://staging-stable-dev-backend.str.inc ? самоподписанный?
-
Даже без ORDER BY в запросе/подзапросе?
Из доки "In some cases, you can still rely on the order of execution. This applies to cases when SELECT comes from a subquery that uses ORDER BY." Или это вообще про порядок строк в результирующей выборке? -
это порядок элементов в массиве.
в случае подзапросов с order by порядок сохраняется и в массиве элементы будут в порядке order by col1, col2
SELECT
col0,
groupArray(col2) AS col2Arr,
groupArray(col3) AS col3Arr,
groupArray(col4) AS col4Arr
FROM
(
SELECT
col1, col2, col3, col4
FROM GROUP BY col0, col1
order by col1, col2
)
GROUP BY col0 -
спасибо!
-
Joined.
-
вроде бы Lets Encrypt, но не уверен точно
issuer=C = US, O = Let's Encrypt, CN = R3 -
Коллеги, добрый вечер! Подскажите пожалуйста, есть ли инструкция по обновлению КХ с версии 20.4.2.9 до текущего релиза на боевой базе?
-
в CSV в поле с DateTime есть NULL-ы. Как сделать чтобы они не приводили к ошибке?
-
все новые КХ любой версии умеют читать файлы от старых. Апгрейд КХ всегда это замена тупая бинарников и перезапуск сервиса.
Проблема в том что новые версии всегда ломают поведение, некоторые запросы перестают выполняться, некоторые требуют установки параметров, некоторые возвращают другой результат. Я тестирую на стейдже 6 месяцев каждую версию на которую планирую перейти. И тестирую апгрейд и даунгрейд. -
что такое Null в вашем понимании?
у меня есть три варианта
a) ,Null,
b) ,\N,
c) ,,
DateTime или Nullable(DateTime) ? -
-
|NULL| и DateTiem, можно сделать и Nullable(DateTime)
-
ну КХ ожидает \N или ,,
можно через input function перекодировать, я бы sed-м заменил -
хм, в других местах его NULL устраивает
-
попробую от них избавиться
-
да, с ,, и Nullable(DateTime) все ОК, Спасибо!
-
Вставит значение по умолчанию, начало эпохи, например
-
нет NULL не вставлял
-
в CSV нету такого: Null. Как для строки отличить, там Null или строка "Null" ? Поэтому в CSV используется \N
-
в последних КХ можно задать что пустая ячейка ,, воспринимается как default
-
--input_format_defaults_for_omitted_fields arg For input data calculate default expressions for omitted fields (it works for JSONEachRow, CSV and TSV formats).
-
-
Joined.
-
Господа, есть вопрос (возможно даже два):
Основная задача: посчитать количество событий в определенном промежутке с группировкой по дням/часам/etc. и с заполнением нулями промежутков, в которые событий нет.
Я делаю вот так для периодов в день (и это первый вопрос, возможно это неправильно?):
SELECT
count(*) AS cnt,
toStartOfInterval(time, toIntervalDay(1)) AS period
FROM metrics
WHERE (toDate(time) >= '2021-01-11') AND (toDate(time) <= '2021-01-12')
GROUP BY period
ORDER BY period ASC
UNION ALL
SELECT
0 AS cnt,
arrayJoin(timeSlots(toDateTime(toDate('2021-01-11'), 'UTC'), toUInt32(dateDiff('second', toDateTime(toDate('2021-01-11')), toDateTime(toDate('2021-01-12')))), toUInt32(86400))) AS period
GROUP BY period
ORDER BY period ASC
проблема в том, что в ответ я получаю
┌────cnt─┬──────────────period─┐
│ 391722 │ 2021-01-11 00:00:00 │
│ 468620 │ 2021-01-12 00:00:00 │
└────────┴─────────────────────┘
┌─cnt─┬──────────────period─┐
│ 0 │ 2021-01-11 03:00:00 │
│ 0 │ 2021-01-12 03:00:00 │
└─────┴─────────────────────┘
т.е. нулевые почему-то в московской таймзоне
в то же время, если сделать этот подзапрос отдельно то все хорошо:
SELECT timeSlots(toDateTime(toDate('2021-01-11'), 'UTC'), toUInt32(dateDiff('second', toDateTime(toDate('2021-01-11')), toDateTime(toDate('2021-01-12')))), toUInt32(86400)) AS slots
┌─slots─────────────────────────────────────────┐
│ ['2021-01-11 00:00:00','2021-01-12 00:00:00'] │
└───────────────────────────────────────────────┘
wtf? -
TZ свойство типа (свой-во колонки), а не значения. В metrics TZ Moscow
-
order by with fill наверное в этом случае сам заполнит
-
SELECT t
FROM
(
SELECT toDateTime('2016-06-15 23:00:00', 'Asia/Yekaterinburg') AS t
UNION ALL
SELECT toDateTime('2016-06-15 23:00:00', 'UTC') AS t
)
┌───────────────────t─┐
│ 2016-06-15 23:00:00 │
└─────────────────────┘
┌───────────────────t─┐
│ 2016-06-16 04:00:00 │
└─────────────────────┘
SELECT t
FROM
(
SELECT toDateTime('2016-06-15 23:00:00', 'UTC') AS t
UNION ALL
SELECT toDateTime('2016-06-15 23:00:00', 'Asia/Yekaterinburg') AS t
)
┌───────────────────t─┐
│ 2016-06-15 23:00:00 │
└─────────────────────┘
┌───────────────────t─┐
│ 2016-06-15 18:00:00 │
└─────────────────────┘ -
вспомнить бы, почему я не стал использовать fill
-
SELECT
t,
toTypeName(t)
FROM
(
SELECT toDateTime('2016-06-15 23:00:00', 'UTC') AS t
UNION ALL
SELECT toDateTime('2016-06-15 23:00:00', 'Asia/Yekaterinburg') AS t
)
┌───────────────────t─┬─toTypeName(t)───┐
│ 2016-06-15 18:00:00 │ DateTime('UTC') │
└─────────────────────┴─────────────────┘
┌───────────────────t─┬─toTypeName(t)───┐
│ 2016-06-15 23:00:00 │ DateTime('UTC') │
└─────────────────────┴─────────────────┘ -
SELECT
t,
toTypeName(t)
FROM
(
SELECT toDateTime('2016-06-15 23:00:00', 'Asia/Yekaterinburg') AS t
UNION ALL
SELECT toDateTime('2016-06-15 23:00:00', 'UTC') AS t
)
┌───────────────────t─┬─toTypeName(t)──────────────────┐
│ 2016-06-15 23:00:00 │ DateTime('Asia/Yekaterinburg') │
└─────────────────────┴────────────────────────────────┘
┌───────────────────t─┬─toTypeName(t)──────────────────┐
│ 2016-06-16 04:00:00 │ DateTime('Asia/Yekaterinburg') │
└─────────────────────┴────────────────────────────────┘ -
ага. кто первый встал, того и тапки
-
ладно, вроде как FILL меня должен спасти. наверное я его как-то не так готовил, когда пробовал
-
м. я вспомнил, в чем была моя проблема с FILL. если за весь период вообще ничего нет - FILL ничего и не заполнит
-
Ребята, подскажите пожалуйста куда смотреть:
обновили КХ 20.4.3 > 20.12.4, стартанули
ЦПУ выжран (ниже 34% не опускается)
причем на этой машине не вижу ни процессов ни мержей ни мутаций
что я пропускаю?
может там какие-нибудь дефолтные компресии сменились и рул ттл и он в БГ мне сча пытается историю отлопатить? -
и в будущее он тоже не заглянет, хех
-
спайки - от запросов, а чем стабильно треть проца занято не могу разгадать
и в таком стиле 2 кластера по 12 тачек( -
хех, все равно непонятно, как мне тогда сгенерить timeSlots правильно
алсо
SELECT toTypeName(timeSlots(toDateTime(toDate('2021-01-11')), toUInt32(dateDiff('second', toDateTime(toDate('2021-01-11')), toDateTime(toDate('2021-01-12')))), toUInt32(86400))) AS typename
┌─typename─────────────────────────┐
│ Array(DateTime('Europe/Moscow')) │
└──────────────────────────────────┘ -
А можете посоветовать, какой нибудь красивый\удобный вьювер (а может даже и моделер) для clickhouse?
-
dBeaver - будьте как все
-
Да, похоже это то, что искал, спасибо
-
Тогда давайте не останавливаться на достигнутом. Будьте лучше, чем большинство - https://www.jetbrains.com/datagrip/ :)DataGrip: The Cross-Platform IDE for Databases & SQL by JetBrains
A powerful IDE from JetBrains for SQL on macOS, Windows, and Linux.
-
:D
-
А можно ли сделать COMMENT COLUMN при CREATE TABLE?
-
create table XX(A Int64 comment 'xxxxx') Engine=Log
-
Спасибо
-
( A Int64 default 100 comment 'xxxxx' CODEC(Delta,ZSTD) )
-
еще одно странное поведение
(обновили КХ 20.4.3 > 20.12.4)
временные таблицы с engine=Log
созданные и еще не дропнутые с версии 20.4 читаются в несколько тредов (insert-select ~1m rows ~19sec)
а созданная в 20.12 почему-то ломится в 1 тред (и в 2-3 раза дольше обрабатывается)
насильно пытаюсь увеличить (
set max_threads = 6;
set min_insert_block_size_rows=200000;) - не помогает - видимо чего-то не учел? - 13 January 2021 (246 messages)
-
Странно это. А просто селект тоже в 1 поток?
-
как можно узнать row, в котором началась последовательность, удовлетворяющая sequenceMatch ?
-
или можно как-то получить все данные, которые удовлетворяют sequenceMatch, а не просто их количество?
-
-
Когда таблицу log заполняю с min_insert_block_size_rows=200000
То на селекте в формат нулл можно добиться того, чтобы было несколько тредов
Но чтобы и на инсерты позитивно повлияло - не заборол пока -
max_insert_threads
можно попробовать увеличить, если еще не делали
https://github.com/ClickHouse/ClickHouse/search?q=max_insert_threadsSearch · max_insert_threads · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
никто не знает, поддерживает ли CH чз http FORMAT CustomSeparated?
https://github.com/ClickHouse/ClickHouse/issues/12744#issuecomment-663738562
Потому что без него у меня CH выдает ошибку, что не нашёл ,
Row 1:
Column 0, name: datetime, type: String, parsed text: "2021-Jan^d1^d2" ERROR: Line feed found where delimiter (,) is expected. It's like your file has less columns than expected.
And if your file have right number of columns, maybe it have unescaped quotes in value
А
когда делаю запрос с указаниме типа разделителя format_custom_field_delimiter='^', то выдаёт ошибку
Code: 49, e.displayText() = DB::Exception: There is no checkpoint (version 20.1.2.4 (official build))
cам запрос
find . -type f -name 'j.log' | while read f; do
curl "http://localhost:8123
/?query=INSERT%20INTO%20mydb%20FORMAT%20CustomSeparated%20SETTINGS%20format_custom_escaping_rule%3D%27CSV%27%2C%20format_custom_field_delimiter%20%3D%20%27%5E%27" --data-binary "@${f}"
doneHow to import csv file with multiple delimiter character · Issue #12744 · ClickHouse/ClickHouseHow to import csv file with multiple delimiter character, example: name$$city$$age ss$$hangzhou$$28 dd$$shanghai$$30 (base) [admin@datainsight-d-006052 ~]$ clickhouse-client --password ck2020 --for...
-
Так у вас вставка не параллелится? Я думал селекты. По вставке insert_select куча параметров есть которые надо смотреть.
-
В лоб пробовал - не спасло
-
А есть где-то в сконцентрированом виде список? А то разрозненно натыкался на разные, а полной картины не сложил в голове
-
-
-
-
Всем привет. Пытаемся внедрить КХ для хранения cdr (лог звонков с АТС). Партиционирование по timestamp (yyyymm). При вводе в эксплуатацию начала валиться ошибка Too many parts (600). Merges are processing significantly slower than inserts. (version 20.12.5.14 (official build)). Пустил трафик через clickhouse-bulk ( "flush_count": 1000, "flush_interval": 5000 ) — ошибка не ушла. Добавил
<merge_tree>
<parts_to_delay_insert>300</parts_to_delay_insert>
<parts_to_throw_insert>600</parts_to_throw_insert>
<max_delay_to_insert>2</max_delay_to_insert>
<max_suspicious_broken_parts>5</max_suspicious_broken_parts>
</merge_tree>
— всё равно ошибка не ушла. Что я делаю не так? -
-
ммм... flush_count 10000?
-
там больше 80 строк всё равно не накапливается. флашит по таймауту
-
раз в 5 сек?
-
-
а точно кто-то еще не толкает инсерты?
-
Запись раз в 5 сек...
-
а диск в порядке?
-
-
show processlist
-
кажет кучу стоящих инсертов?
-
-
апдейты - могут )) У меня еще и подвисшие были. Пару дней назд тут же и подсказали
-
счас найду...
-
идешь в папку с данными базы
-
/var/lib/clickhouse/data/<db>/<table>
-
если Вам нужны частые апдейты, то КХ лучше не брать.
+ вставки каких данных? У нас была такая ошибка когда вставляли пачки данных сильно разрозненные по ключу сортировки -
-
и там смотрите на mutation_ххххх.txt
-
мне пришлось их все поудалять и сервис рестарт
-
-
root@db-stat-ch:/etc/clickhouse-server# clickhouse-client -d stat
ClickHouse client version 20.12.5.14 (official build).
Connecting to database stat at localhost:9000 as user default.
Code: 210. DB::NetException: Connection refused (localhost:9000)
ещё и сервер пропадает на несколько секунд -
-
кх он да, для другого
-
апдейты можно, но редко
-
может движок сменить на replace-summary-aggreg ?
-
чтоб избежать
-
-
ну как... если можете их как-то веременно приостановить и поможет - то да
-
но по "пракчиески точно" - подождите может еще мнений - я "средненько"
-
update/delete - это операции, которые не должны выполняться постоянно. Только в каких-то экстренных случаях, если надо поправть какой-то косяк в данных или еще что-то.
Можно попробовать ReplacingMergeTree, но он не дает 100% уверенности, что осталась только последняя версия -
с Final-ом то вроде дает? Правда работает медленней обычного селекта
-
Да, но это тоже тяжело. Мы сейчас страдаем от этих Final-ов (много их стало)
-
ugh. время в timeSlots перестает смещаться если принудительно кастовать везде в UTC. но тогда смещаются сами данные
-
что в партициях?
нам однажды с реплицированными таблицами сильно помог запрос select * from system.replication_queue where database='...' and table='...' -
а какого формата апдейты? CDR вроде не апдейтят :)
-
они там какие-то кастомные json-поля апдейтят
-
нет, репликации нет
-
если апдейтов не много, то попробуйте апдейты через инсерт с ReplacingMergeTree. если много, то возможно другую бд...
-
т.е. делаю ReplacingMergeTree с order by uniqueId, и вставляю обновлённую строку с этим же uniqueId, и КХ её заменит?
-
да
-
Когда нибудь, eventually
-
вставлять надо БАТЧЕМ либо по 10 тыс записей (а лучше 100 тыс), либо не чаще 1 раз в секунду
можете еще ENGINE=Buffer таблицу поставить и в нее вливать, но там сохранность данных при рестарте не гарантируетс...
flush_interval оставьте в bulk 5000 а flush_count поднимите до 10000 хотя бы -
там слишком мало строк на вставку, чтобы это было проблемой. в апдейтах беда 99%
-
про datetime64 в доке написано:
CREATE TABLE dt
(
`timestamp` DateTime64(3, 'Europe/Moscow'),
`event_id` UInt8
)
ENGINE = TinyLog
INSERT INTO dt Values (1546300800000, 1), ('2019-01-01 00:00:00', 2)т.е. можно не указывать размерность
у нас datetime64(9)
:) insert into test.test_ip (dt64) values (1610525117709038246) ;
1 rows in set. Elapsed: 0.005 sec.
:) insert into test.test_ip (dt64) values (1610525117.709038246) ;
1 rows in set. Elapsed: 0.006 sec.
:) SELECT dt64 FROM test.test_ip
┌────────────────────dt64─┐
│ 2021-01-13 08:05:17.709 │
└─────────────────────────┘
┌──────────────────dt64─┐
│ 2106-02-07 :30:38.246 │
└───────────────────────┘
ClickHouse server version 20.8.5 revision 54438вставку можно только через указание размерности делать? -
а примерно когда?
-
-
Если не терпится - то добавлешь FINAL в селект. НО работает сразу медленее.
-
понял. а если терпится, то порядок задержки? 5 секунд, 5 минут, полчаса?
-
это у кого как. Закинь да проверь что именно у вас
-
-
Несколько лет использую. Работает и не жужжит
-
-
по доке, при селекте на чистую таблицу кх не гарантирует отсутствие дубликатов. лучше делать с group by, а чтобы по памяти не падало - в конфиге указать, когда с диском начинать работать, если оперативки не хватит.
-
Joined.
-
Joined.
-
Всем привет!
Если есть таблица с колонкой time типа DateTime64(6). По этой колонке есть PARTITION BY и ORDER BY (составной). Будет ли эффективен следующий запрос? То есть не будет же вся колонка сортироваться?
select * from table order by desc(time) limit 10 -
-
нет не лишний
-
-
ну там наверняка PARTITION BY toYYYYMM(datetime_field) ?
-
Ага
-
PARTITION BY (toYYYYMMDD(time), toHour(time))
-
ORDER BY | Документация ClickHouse
Секция ORDER BY Секция ORDER BY содержит список выражений, к каждому из которых также может быть приписано DESC или ASC
-
слишком частые партитции... это плохо
сократите до toYYYYMM(time) -
-
Понятно. Спасибо за совет по партициям! Тогда буду замерять производительность на данных.
-
у меня похожий запрос:
5 rows in set. Elapsed: 0.698 sec. Processed 1.16 million rows, 9.30 MB (1.66 million rows/s., 13.31 MB/s.)хотя если выбирать max( от этого поля), то
1 rows in set. Elapsed: 60.483 sec. Processed 1.69 billion rows, 13.48 GB (27.87 million rows/s., 222.93 MB/s.) -
-
То есть все зависит от конкретного запроса? Скорее всего просто SELECT будет быстрым.
Спасибо за помощь)) -
-
Добрый день!
Подскажите, плз, в чем может быть проблема. Использую nullIf для делителя, но все равно выдает Division by zero. Проверяю отдельно делитель, вижу null (ну то есть пустое поле, nullIf срабатывает). Версия 20.11.5.18.
Спасибо! -
0 != null
Это разные понятия -
Да, поэтому чтобы избежать деления на 0 я подменяю его на null
-
А как конкретно выражение выглядит?
-
Select a / nullIf(b,0) from T
-
WITH
3 AS a,
0 AS b
SELECT a / nullIf(b, 0)
Query id: 9bc4bb40-236f-413d-8313-4d5fcbfe9bb3
┌─divide(a, nullIf(b, 0))─┐
│ ᴺᵁᴸᴸ │
└─────────────────────────┘
clickhouse 20.13
Видимо проблема связана с типом данных
https://github.com/ClickHouse/ClickHouse/issues/7509#issuecomment-731599933Division by zero · Issue #7509 · ClickHouse/ClickHouseDivision by zero Describe the bug or unexpected behaviour error despite the fact that the denominator is converted to null in case of zero value How to reproduce ` drop table if EXISTS test_table; ...
-
У вас Decimal?
-
Да, вижу! Сорри, только сообразила посмотреть
-
Спасибо!
-
Но Decimal в 20.13 точно так же не работает
-
Угу, видимо придется конвертить.. или нашла еще intDivOrZero, попробую
-
Joined.
-
с with не разобрался до конца, пока что обошелся create temporary table / insert / select. Там json, но как написать with чтобы потом можно было использовать в запросе - неясно (мне пока что не ясно, если дадите пример, буду благодарен безмерно)
-
-
-
Условные функции | Документация ClickHouse
Условные функции if Условное выражение. В отличие от большинства систем, ClickHouse всегда считает оба выражения then и
-
multiif не катит
-
хочу конъюнкцию в условие
-
Вообще можно, через and или or
-
всем привет, повторю вопрос, вдруг кто знает - как можно узнать все row, в которых началась последовательность, удовлетворяющая sequenceMatch? таблица на пару десятков миллионов, sequence из двух последовательных элементов, скорость исполнения не очень важна
-
привет. подскажите, пожалуйста, на однонодовом брокере кафки получаем лог
Can't get assignment. It can be caused by some issue with consumer group (not enough partitions?). Will keep trying.
параметр group.initial.rebalance.delay.ms дефолтный, kafka_topic_list, kafka_group_name с разынми именами, версия КХ - 20.11.4.13. в чем может быть причина его появления и как выйти с такой ситуации? -
Joined.
-
Добрый день. Создал таблицу Engine = URL
CREATE TABLE dwh.campaign_url_table (
campaign_id String, account_ids Array(Int32), group Int32
) ENGINE=URL('https://staging-stable-dev-backend.str.inc/marketing', JSON);
но любое обращение к таблице приводить к
Received exception from server (version 20.10.3):
Code: 1000. DB::Exception: Received from localhost:9000. DB::Exception: SSL Exception: error:14000438:SSL routines::tlsv1 alert internal error.
Сертификат Let's Encrypt
спасибо за помощь. -
пример, какой-нить приведи. какая конкретно последовательность, например.
-
Какая ОС у кх?
https://github.com/ClickHouse/ClickHouse/issues/17803Openssl: probe different standard paths for ca. · Issue #17803 · ClickHouse/ClickHouseUsers from os other than ubuntu often complain that secure connections can not be established because of wrong path to ca is used in the openssl bundled in ClickHouse. The solution is to probe comm...
-
Спасибо
Mint , CentOS_7 + docker — в обоих случаях результат одинаковый -
https://github.com/ClickHouse/ClickHouse/issues/18869#issuecomment-757111029
Пробуйте направить это на хранилище сертов для вашей осOpenSSL certificate issue when using S3 https endpoint in AWS China Region · Issue #18869 · ClickHouse/ClickHouseDescribe the bug When using S3 https endpoint in AWS China Region (Beijing and Ningxia), there is a openssl certificate issue reported. How to reproduce Which ClickHouse server version to use: 20.1...
-
Example of sequenceMatch aggregate function usage in ClickHouse.
Example of sequenceMatch aggregate function usage in ClickHouse. - example.txt
-
Повторю и свой вопрос. FILL хоть и может заполнять "в будущее" но, по очевидным причинам, ничего не заполняет, если результатов нет вообще. А timeSlots двигает время, какую бы таймзону я в DateTime старта timeSlots не указал.
-
Скорее всего придется на коленке построить воронку на массивах и ручками сделать
https://altinity.com/blog/harnessing-the-power-of-clickhouse-arrays-part-2
Тк вам нужна именно последовательная комбинация из двух (?1)(?2) событий без каких либо событий между ними.Harnessing the Power of ClickHouse Arrays - Part 2ClickHouse arrays combine neatly with GROUP BY aggregation. We show how arrays track sequences and offer one way to do funnel analysis.
-
никак не могу уяснить, как high order functions пользоваться в ch, тоже уже смотрю этот подход. есть какая-то дока для тупых, где разжёвано как с array* функциями жить?
-
https://habr.com/ru/post/515606/
и чуть чуть
https://altinity.com/blog/harnessing-the-power-of-clickhouse-arrays-part-3
Ну и банально сама дока кхClickhouse — оконные функции, которых нет…Работу с колоночными базами данных я начал с BigQuery. Когда пришлось “переехать” на Clickhouse я был неприятно удивлен фактом отсутствия полноценных оконных фун...
-
спасибо, буду пытаться
-
WITH
groupArray(eventType) AS event_arr,
groupArray(EventTime) AS time_arr
SELECT
userID,
arrayFirst((x, y, z) -> ((y = 'A') AND (z = 'B')), time_arr, event_arr, arrayPushBack(arrayPopFront(event_arr), cast('A', 'Enum8(\'A\' = 1, \'B\' = 2)'))) AS x
FROM
(
SELECT
userID,
eventType,
EventTime
FROM test.funnel
WHERE (Age > 30) AND (eventType IN ('A', 'B'))
ORDER BY
userID ASC,
EventTime ASC
)
GROUP BY userID
Я бы что то такое написал, там правда нужно отфильтровать нули -
Что за магия в arrayFirst?) но спасибо, проверю
-
Если есть вот такой запрос:
SELECT
id,
sumIf(1, event_type="event_1") AS event_1,
sumIf(1, event_type="event_2") AS event_2,
sumIf(1, event_type="event_3") AS event_3,
и т.д.
Это же можно переделать через groupArray? -
Беру три массива
массив таймстампов
массив евентов
массив эвентов с сдвигом на 1 элемент вперед
И достаю первый таймстап который отвечает буквально последовательности из эвентов A и B -
SELECT id, sumForEach([event_type="event_1", event_type="event_2", event_type="event_3"]) в целом можно так
Либо можно через sumMap([event_type],[1]);
Но вообще с -If были небольшие проблемы с перфомансом по сравнению с sum(If)
https://github.com/ClickHouse/ClickHouse/pull/17041Rewrite `sum(if())` and `sumIf` to `countIf` in special cases by ucasFL · Pull Request #17041 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Performance Improvement Changelog entry (a user-readable short descriptio...
-
результат странный, +------+----------+
|userID|x |
+------+----------+
|4 |1970-01-01|
|2 |1970-01-01|
|1 |2001-01-01|
+------+----------+ -
а, нули
-
понял
-
Они самые, ага
-
Joined.
-
ПРивет. вышло решить?
-
show users;
SHOW USERS
┌─name─────┐
│ default │
│ mtest │
│ ptest │
└──────────┘
3 rows in set. Elapsed: 0.002 sec. -
【D】【J】 in ClickHouse не тормозит
show users; SHOW USERS ┌─name ─────┐ │ default │ │ mtest │ │ ptest │ └──────────┘ 3 rows in set. Elapsed: 0.002 sec.
-
-
в той версии не было еще этой команды
-
по дизайну предполается 1-2 апдейта в год. Не шучу
-
если будут идти частые заменяющие инсёрты в ReplacingMergeTree -- оно так же ляжет от мержей?
-
-
нет, ну не все так просто. Вообще КХ просто для иммютебл данных. Вы что пытаетесь проапдейтить? Какой-то атрибут?
-
инсёртится лог звонков. потом в течение часа у строки могут обновиться некоторые поля, выборка по стринг-полю uniqueId
-
ну копите данные в кассандре, обновляйте, а через час заливайте в КХ
-
-
почему 20.1.2.4 ? есть например 20.1.16.120 ?
кавычки там скорее всего не нужны %27
это для баша они нужны -
т.е. разница в том как создается engine=Log , одним блоком или несколькими.
Откуда берутся эти engine=Log ? каким запросом? -
create ttt as prototype_table
engine=Log
потом шелл
zcat file | clickhouse-client -q"insert into ttt format CSV" -
какие есть параметры конфига клиента? столкнулся, что поле datetime64 он сначала выбирает по длине строки (а не по разделителю), потом пытается его парсить по символам разделяющие разряды даты, а только потом берет что написано. у меня это выражается следующим образом: для пустых дат мы пишем 0, если в следующем поле после 0(тип datetime64) стоит отрицательное число, то загрузка падает на парсинге даты. если положительное, то грузится. если вместо 0 писать 0000-00-00 00:00:00.00000, то грузится и с отрицательными числами. это настройками как-нить можно поправить?
-
ну например так --max_insert_block_size=10000 --input_format_parallel_parsing=0
zcat file | clickhouse-client --max_insert_block_size=10000 --input_format_parallel_parsing=0 -q"insert into ttt format CSV" -
спасибо, пробую
на последующий ЕТЛ-ьный запрос к этой таблице насильно какие-то сеттинги надо добавлять? или само должно понять? -
Добрый вечер! Читал документацию, но не нашёл ответ на свой вопрос: можно ли как-то в КХ добавить свой метод сжатия столбцов?
-
не трогая код, нет. Чем же вас текущие не устроили? там комбинаций компрессий с энкодингами выше крыши же
-
Надеюсь что не понадобятся, это ещё будем изучать :) просто заранее пытаюсь выяснить, сложно ли это сделать, потому что есть хороший алгоритм сжатия массивов для нашего случая
-
тредов стадо больше (~6)
но к скорости последующей выборки плюсануло не так сильно, как я надеялся
[hostname] 2021.01.13 15:01:57.683883 [ 2607564 ] {f1e730ce-c8f9-429c-a8b5-d957fdc1f27f} <Information> executeQuery: Read 1624753 rows, 1.35 GiB in 28.547938887 sec., 56913 rows/sec., 48.38 MiB/sec.
[hostname] 2021.01.13 15:01:57.684423 [ 2607564 ] {f1e730ce-c8f9-429c-a8b5-d957fdc1f27f} <Debug> MemoryTracker: Peak memory usage (for query): 3.32 GiB.
получается что-то из дефолтных сеттингов решило вести себя иначе
Спасибо @den_crane -
например какой? я сомневаюсь что можно сжать лучше чем ZSDT3
-
ну сделайте тикет на гитхабе что регресия перфоманса, приложите статистику, было так, стало так
-
Когда-то я внедрял ClickHouse в стартапе, где даже алерты мониторили индийцы — это был Дикий Запад
Однажды я работал дата-инженером в стартапе. Он быстро рос и в какой-то момент решился на покупку одной крупной компании. Там было больше сотни сотрудников — оказалось, почти все из Индии. Пока...
-
Подниму
-
добрый день. подскажите пожалуйста как это реализуется, на каких технологиях.
Есть клиентские приложения которые в случайные промежутки времени отправляют данные( сложный JSON) на сервер.
запросы от клиентов приходят в виде 1 объект в случайный промежуток времени.
момент вставки в БД предполагается определять так: "когда накопилось 10 тыс. объектов - вставь в КХ".
как и с помощью чего реализуют подобную логику ? in-memory БД а-ля Redis? -
-
а этот сложный json вам нужно парсить предварительно?
-
-
так-то в кх есть буфферные таблицы, и там как раз можно настроить флаш в целевую таблицу по условию "накопилось 10к элементов"
-
Очередь, может - ивент стрим (от Кафки до Флинка - смотря какой кейс) - все зависит от объема данных, ресурсов, сценариев предобработки и того, можете ли вы эти данные потерять или нет ( Редис вот не персистентый)
-
нет . можно сформировать на клиенте готовый json для вставки в КХ(там есть какой то упрощенный формат).
буферные таблицы - посмотрю , спасибо.
а на REDIS можно такие условия писать типа "если объектов больше N тогда" - сложи все в БД? -
День добрый, есть таблица
create table copy ( ... ) ENGINE = MergeTree ...
есть материализованная вью
CREATE MATERIALIZED VIEW original TO copy ...
У неё движок не указывается
Я не нахожу описания работы TO (https://clickhouse.tech/docs/en/engines/table-engines/special/materializedview/), в чём отличие от просто материализованной вью без TO, которая не будет никуда копировать (кроме того, что не будет наполняться ещё одна таблица)?MaterializedView | ClickHouse DocumentationMaterializedView Table Engine Used for implementing materialized views (for more information, see CREATE VIEW). For stor
-
с этими технологиями знаком только в общих чертах.
объем в 10000 вставок может накопится в среднем за часов пусть 5-7.
предобработку можно не делать , т.е. настроить на клиенте.
данные терять - нет.
может есть под рукой статья или материал какой то с примером как это реализовано на одной из указанных технологий?
я так понимаю для КХ это типовая довольно задача или у всех данные сперва в OLTP БД падают?) -
ну если так мало вставок, можно сразу в кх вставлять и не мучаться
-
единичными по пару кб и пофиг?)
-
-
-
у нас вообще одно время собирались метрики с софта вебсервисом и писались в json-файлы (немного, по тыще в час от силы), а раз в 10 минут приходил обработчик, парсил, пачкой вставлял в CH и удалял обработанные файлы
-
неа. ну 100 в минуту максимум. время прихода рандомное, варьируется в некоторых пределах.
-
Возьмите clickhouse-bulk
-
И просто вставляйте через него
-
Заранее извиняюсь за тупой вопрос, но может кто подкажет почему не работает задание партиции через выражение? Пытаюсь сделать как в документации - "ALTER TABLE default.t1 DROP PARTITION toYYYYMM(now() - INTERVAL 3 month)" - получаю "Syntax error: failed at position 79 (end of query): Expected one of: LIKE, GLOBAL NOT IN, IS, OR, QuestionMark, BETWEEN, NOT LIKE, AND, IN, ILIKE, NOT ILIKE, NOT, token, NOT IN, GLOBAL IN"
-
-
-
-
так то понятно). а потом что сделали?
-
спасибо, посмотрю
-
перешли на prometheus и графану :)
-
там изменился подход и количество метрик
-
Это 30 инсертов в секунду, мелочь, можете не парится
-
но вышеуказаный подход работал как часы года два
-
Можете взять буффер кх в добавок, если диск такой слабый итд
-
Но я бы даже не парился на счет такой мелочи, как 30 вставок в секунду
-
а как же рекомендации в доке КХ?) я вот начитался теперь тут вроде как дурацкие вопросы задаю..
-
Какие ?
-
вставлять данные большими пачками.
-
1. Это не про вас, у вас таких данных тупо нет
2. Я же написал, если хотите вариант по лучше берете буффер кх -
Но я бы просто забил
-
забить это то могем. спасибо всем за советы.
-
-
Велком, когда данных станет больше, просто буффер цепляете и все, а когда будет не хватать, можете уже аля брокер подцепить типо кафки и читать с нее через кафка энджин
-
Ну тут зависит от требований системы, конечно есть шанс потерять данные, если это баковские данные или баланс то да, буффер не советую
-
Но обычно, раз в год потерять 10 записей, не критично
-
А если критично, берете кафку и вперед
-
-
Отвечаю сам себе. 🙂 Это потому что https://github.com/ClickHouse/ClickHouse/issues/10212 - обернуть все в tuple() помогает.Drop partition with partition expression is broken · Issue #10212 · ClickHouse/ClickHouse
Describe the bug When I use partition expression instead of string I get a syntax error. Since upgrade from version 19.13 to 20.3.5.21. How to reproduce DROP TABLE IF EXISTS test1; CREATE TABLE IF ...
-
Добрый вечер. Есть 2 кластера в разных сетях. В первом случае 6 машин, в другом 5. Так вот, нужно перетащить данные из 1 кластера во второй. Хотел через freeze переносить партиции, но смущает, что количество серверов не сходится во втором случае, и одна окажется лишней ( равномерно не получится перетащить ) . Но выходит, что придется выгружать в файлы и опять потом заносить. Что можете посоветовать ?
-
это ща так спайс рекламируют?)
-
"insert - select" или сети совсем не видят друг друга?
-
1) такую админы поставили. Попробовал локально на сборке из master - таже ошибка.
Логи сервера:
<Fatal> : Logical error: 'There is no checkpoint'.
2) кавычки нужны, без них ошибка
Code: 62. DB::Exception: Syntax error: failed at position 87: CSV, format_custom_field_delimiter = '^'. Expected one of: NULL, number, string literal, literal -
Совсем, через флешку переносить
-
И его в том числе, звоните.
-
-
если таблиц мало, экспортируйте через Format Native дампы и переносите и вставляйте... можно и через фриз - и раскидать 6-й шард раунд робином...
-
Ну да, только вот это на постоянной основе нужно делать 😁. И постоянно заносить последнюю партицию через дистрибьютед не очень получается
-
Тогда лучше дамп через format native и вставка в distributed
-
Благодарю
-
-
Здравствуйте, подскажите, пожалуйста, по структуре БД в кликхаусе - есть достаточно простая структура данных:
{дата}, {строка1}, {строка2}, {…} , {строка 11}
Выборка будет производится в основном с учетом полей «дата», «строка1» и подстроки из «строка2».
Возможны также перекрестные запросы с участием практически всех полей.
Есть ещё один момент – поле «строка1» имеет ограниченное количество вариантов, 15 млн., если точнее. Потом оно повторяется, даты и остальные строки при этом разные.
Насколько правильным будет залить всё это счастье просто в одну таблицу? Или, возможно, есть какие-то другие варианты, более оптимальные? -
vagrant.vm 🙂 select * from devices2;
SELECT *
FROM devices2
Query id: c8f873e5-605b-4d29-b880-3c9bbc590f0d
┌─id─┬─name────┐
│ 1 │ Desktop │
│ 2 │ Phone │
│ 3 │ Tablet │
│ 4 │ TV │
└────┴─────────┘
4 rows in set. Elapsed: 0.002 sec.
vagrant.vm 🙂 select dictHas('devices2' , toUInt64(1));
SELECT dictHas('devices2', toUInt64(1))
Query id: eceaf74c-af32-4c68-a16a-cc03fc89cbaf
Received exception from server (version 20.12.5):
Code: 36. DB::Exception: Received from localhost:9000. DB::Exception: external dictionary 'devices2' not found: While processing dictHas('devices2', toUInt64(1)).
0 rows in set. Elapsed: 0.002 sec.
Подскажите пожалуйста, что я делаю не так. Внешний словарь, с подключеничем через odbc в postgresql, загрузился, выборка по нему работает. А когда я пытаюсь использовать его в запросе, говорит, что его нет.. -
И еще вопрос:
даже если я успокоюсь и буду использовать WITH FILL для заполнения пустот - как заполнять пустоты помесячно? Там во-первых STEP в секундах/днях, а во-вторых вообще какая-то непонятная хрень происходит
SELECT
count(*) AS cnt,
toStartOfInterval(time, toIntervalMonth(1)) AS period
FROM metrics
WHERE (toDateTime(time) >= '2020-09-01 00:00:00') AND (toDateTime(time) <= '2021-02-31 23:59:59') AND (event = 'radio_play')
GROUP BY period
ORDER BY period ASC WITH FILL FROM toDateTime('2020-09-01 00:00:00') TO toDateTime('2021-02-31 23:59:59') STEP 2592000
┌──cnt─┬─────period─┐
│ 1543 │ 2020-12-01 │
│ 3094 │ 2021-01-01 │
└──────┴────────────┘
┌─cnt─┬─────period─┐
│ 0 │ 2040-08-29 │
│ 0 │ 2106-02-07 │
│ 0 │ 2058-11-19 │
│ 0 │ 1978-04-13 │
│ 0 │ 2077-02-08 │
│ 0 │ 1996-07-03 │
│ 0 │ 2095-05-01 │
└─────┴────────────┘ -
имхо, очень правильно будет залить все в одну таблицу, пускай повторяются на здоровье
-
ну это тренировочный пример) я просто пытаюсь разобраться с кх для начала
-
select dictHas('dbname.devices2' , toUInt64(1));
-
🙏
-
Joined.
-
плиз, хелп) только первые шаги делаем в клике, не хотелось бы ступить в самом начале
-
или вот это мне ответили?)
-
да, это было вам, перепутал.
лейте в одну таблицу.
можете даже попробовать lowcardinality на колонке где строки повторяются если они прямо много раз повторяются (15 млн уников на 15 млрд строк например) -
В целом нормально, если есть некая локальность значений можно поле строка1 даже в lowCardinality обернуть
-
-
Добрый вечер, не подскажите возможно ли выделить больше ресурсов на операции Преобразования типов? Ситуация следущая есть объемный топик, на него смотрит mv и соотвественно скидывает в табличку, если в mv не преобразовывать string в datetime например, то лаг не накапливаться, как только прикручиваю преобразования, то начинает копиться лаг :(
-
да ну, не верю. Дело скорее не в этом
и сколько миллиардов записей в секунду? -
500 mbs 310к eps
-
и сколько параметр consumers.. у kafka?
-
24 ноды по 3 консьюмера
-
что? какие ноды? вы о чем вообще?
у kafka engine что в
kafka_num_consumers
kafka_thread_per_consumer -
По пропускной способности, рекомендации с гитхаба, выставлены
-
ну и сколько? что там у вас?
-
вам надо распалеллить обработку
-
72 партиции на топике, считываю 24 нодами(серверами в кластере , по 3 консьюмера на каждой, пихаю в mergetree таблицу без репликации
-
ставьте
kafka_num_consumers=10
kafka_thread_per_consumer=1 -
Thread не пробовал менять, завтра затестирую
-
без него все 10 консьюмеров будут в 1 CPU
-
короче
в профиль пользователя default background_processing_pool_thread=30
в кафка таблицу kafka_num_consumers=10 kafka_thread_per_consumer=1 -
Попробую, background_processing_pool стоит и так уже 32, попробую thread_per_consumer добавить должно помочь
-
при вставке КХ-клиентом очень большого куска (чтоб партов меньше было) с формат TabSeparated КХ сервер отвалился с ошибкой по памяти.
DB::Exception: Memory limit (total) exceeded: would use 57.01 GiB (attempt to allocate chunk of 4295098416 bytes), maximum: 56.92 GiB (version 20.8.9.6 (official build))
кусок весь должен помещаться в память? или это тоже "плохой" инсерт? -
>кусок весь должен помещаться в память
да должен, сортируется в памяти, потом пишется на диск -
ок, спасибо
-
-
нельзя, не реализована такая фича
-
так max( ) не оптимизирован в отличии от order by и не использует индекс/сортировку таблицы
-
теперь надо в tuple обернуть
ALTER TABLE default.t1 DROP PARTITION tuple(toYYYYMM(now() - INTERVAL 3 month)) -
ага, спасибо, разобрался
-
допишу-ка я это в доку
-
- 14 January 2021 (63 messages)
-
Joined.
-
Joined.
-
Joined.
-
Joined.
-
Joined.
-
Hi all
-
How do clickhouse free up Ram for linux when finish a query?
-
спасибо!
-
Подскажите, это баг или фича:
Создаем таблицу Т SummingMergeTree, к ней MATERIALIZED VIEW с селектом из таблицы А.
Создаем таблицу Т2 SummingMergeTree с такимже МВ и селектом из А.
При обращении к таблицам Т и Т2 получаем разные результаты при использовании выборок.
Единственное отличие Т от Т2 — при создании Т в ORDER BY были перечислены все столбцы. В Т2 только основные. -
-
А где задаются значения по умолчанию на всю базу?
-
Case when 'January' then ... ,
Case when 'February' then ...
итд -
-
-
-
-
-
Средствами ch никак:
1. Kafka engine это не знает
2. Mv берет эвенты кусками каждые 7.5 секунд, то есть даже если написать neighbor, в первом эвенте куска поле param2 всегда будет пустое
можно попробовать сделать в схеме target таблицы param2 MATERIALIZED neighbor(param1, -1), но я не уверен, что это будет работать и проблема скорее всего перетечет на границу партов
лучше вообще так не делать в ch, какую проблему решаете? -
Аналитику намного удобнее строить по такой таблице, когда есть состояние параметров на определённый момент времени
-
-
Так у вас не эвенты, а состояния
Мб сделать словарь или вообще делать не на ch, а на oltp?
UPD я имею в виду, что вы хотите состояние, но не передаете его в следующих сообщениях в Kafka -
Добрый день. А подскажите, на что надо ориентироваться при принятии решения, какой ключ партиционирования нужно указывать при создании таблицы
engine = MergeTree PARTITION BY date -- вот тут дата у меня по дням, но например result_type уникальных данных куда меньше. или например q_id уникальный данных тоже меньше чем уникальных date, однако result_type еще меньше.
ORDER BY (date, result_type, q_id, f_id, r_id)
По документации пока трудновато понять, что именно надо использовать. Может как-то тут все проще можно объяснить? -
вот чтобы не делать предпроцессор, который заполняет предыдущие состояния, предположил, что можно сделать средствами ch
-
Joined.
-
Ksql может поможет?
-
Раз уже кафка есть
-
подскажите правильный путь решения
есть исходный постгрес , из которого нужно брать данные для агрегатов и справочники
как правильнее/производительнее/надежней ?
работать с ПГ к которому присоединены таблицы КХ
или
работать с КХ к которому присоединены таблицы ПГ
и каким образом?
из того что нашел это
clickhousedb_fdw и clickhouse-jdbc-bridge
но что-то оба варианта не впечатлили -
-
Коллеги, подскажите, в чем разница при подсчтете уников в MV через
... uniqIfState
... uniqStateIf
какой из вариантов оптимальнее? -
uniqStateIf
Этот, сначала отфильтровываем и только потом считаем стейт -
если вам нужно будет удалять данные со временем по признаку времени, лучше partition by date.
если иначе - много всяких если, нужно больше информации -
Ну скажем так, основная задача этой таблицы, делать запросы в которых всегда будет такой селект Select ..., uniq(result_type), group by q_id
И данных может быть ну например 1ккк+ -
вообще не делайте партиции тогда
-
А ORDER BY - это же посути индекс и его то уж точно надо и поидее в определенном порядке?
-
да, в зависимости от запросов и данных (может хорошо влиять на сжатие)
если только груп бай без where - то он тоже не особо нужен, можно только сжатие улучшить используя хороший order by -
Правильно ли я понимаю, что как раз эта таблица показывает как работает OrDER BY?
-
да
-
Спасибо, а нет ли способов понять, правильно ли я построил индекс для запроса? типа как в постгре explain какой-то сделать
-
-
есть в OLAP понятия размерности(дименшины) и метрики, грубо говоря:
select sum() - метрика
count() - метрика
country - размерность
city - размерность
group by country, city
так вот, все что перечислено в summingMT в order by -- это размерности
все что не перечислено -- это метрики
если у метрики числовой тип, то summingMT их скалдывает
если у метрики нечисловой тип, то summingMT берет любое значение ANY() -
в профиле default
-
-
если вы не знаете какой как партиционировать таблицу, партиционируйте по месяцам. toYYYYMM
-
Joined.
-
Joined.
-
какой индекс? skip ?
-
Привет
ребят, есть такой запрос
SELECT * FROM keyword_statistic WHERE search_date='2020-01-01' ORDER BY search_date LIMIT 1000, 1000
но все время разные отрезки попадают, там на дату 500 тысяч строк инфы..., т/е/ все время результат как будто рандомный возвращает
как сделать чтоб оно всегда срезало мертво как в мускуле? от числа и не было рандомной выборки -
-
WHERE search_date='2020-01-01' ORDER BY search_date
так а секунд нету? -
-
а зачем LIMIT 1000, 1000
лейте в файл без лимита format CSV и потом в mysql загрузите как csv -
благодарю
-
Благодарю, поизучаю
-
подскажите пожалуйста, кто работал с питоновским клиентом для кликхауса, когда в одном приложении делаю запросы в несколько потоков на запись в одну таблицу получаю что то вроде этого
Error on database:9000 ping: Unexpected EOF while reading bytes
Error on database:9000 ping: [Errno 9] Bad file descriptor
Error on database:9000 ping: [Errno 9] Bad file descriptor
EXCEPTION! Code: 100. Unknown packet 4 from server database:9000
clickhouse_driver.errors.UnknownPacketFromServerError: Code: 100. Unknown packet 4 from server database:9000 -
Создайте по клиенту на ядро.
-
Ага. так и подумал. спасибо
-
Это же в user.xml? А где-нибудь есть описание, какие ключи писать?
-
запустите с set send_logs_level='trace' там много полезного. explain подвезли недавно, но он не для новичков
-
Понял, спасибо
-
Добрый день. Может кто сталкивался. Беру файл с 10млн записей в формате ORC. Выполняю запрос insert into <table> select * from file('<filename>', ORC, '<fields>'). Запрос работает очень долго (уже больше часа) и пишет, что вставил 700 млн строк. В самой таблице почти сразу появилось 10 млн и не меняется. В чем может быть проблема?
(точно такой же по составу файл, но parquet, заливает сразу) -
выглядит как повод для issue на github
а если строк меньше чем 10 миллионов? -
Joined.
-
Аналогично.
- 15 January 2021 (71 messages)
-
while connecting tableau with clickhouse we are getting below error
[unixODBC][Driver Manager]Can't open lib '/usr/local/lib/libclickhouseodbc.so' : file not found
Generic ODBC requires additional configuration. The driver and DSN (data source name) must be installed and configured to match the connection.
Unable to connect using the DSN named "ANANTH DB". Check that the DSN exists and is a valid connection. -
Releases · ClickHouse/clickhouse-odbc
ODBC driver for ClickHouse. Contribute to ClickHouse/clickhouse-odbc development by creating an account on GitHub.
-
If you are sure that file exists and configuration is correct, try ldd comand. You can see this message when system can't find one of dependencies of .so file or it has wrong version.
-
ldd comand
-
clickhouse is installed using docker
-
Ребят, привет! Подскажите, пожалуйста, как скорректировать лимит выделенной памяти (10Гб по-умолчанию) на запрос?
-
Как я понял это max_memory_usage
-
Но не понимаю в каком блоке настроек его прописывать. Пробовал в <yandex></yandex> - не взлетело
-
You get error in tableau and install odbc driver on tableau server
-
tableau server
-
<max_server_memory_usage>21474836480</max_server_memory_usage> ставил - тоже не помогает
-
это ведь значение в байтах надо указывать?
-
В users.xml
yandex - profiles - <ваш профиль> -
Спасибо, Антон, сейчас попробую
-
-
Привет, Денис!
можно еще ставить только при выполнении тяжелых запросов:
SET max_memory_usage = 100000000000; -
-
вопрос снимаю, спасибо
-
С пятнице!) И пятничный вопрос )) insert into ssv.r values ('aaa\\\\bbb'), ('ccc\\dddd'), потом select count() from ssv.r where s like '%\\\\%': 2. Тогда. если следовать экранированию match, '%\\\\\\%' выведет 1. Но нет, вывод 0.
-
Что-то запут у меня с экранированием обратного слеша..
-
Как надо-то? ))
-
-
-
-
-
-
да
-
-
-
-
-
-
like '%\\\\\\\\%' вот так... заэкранируй экран и символ слеша))
-
Joined.
-
Всем привет
У меня возникла проблема - есть табличка которая читает из кафки, есть ее копия с MergeTree созданная для матвью, и есть матвью который с простым условием должен складывать данные в табличку.
Все бы хорошо, но некоторые записи начинают дуплицироваться просто так, в чем может быть причина?
Из необычного когда создавался MergeTree то использовался старый синтаксис, а именно так :
...
date Date MATERIALIZED toDate(Timestamp)
) ENGINE = MergeTree(date, date, 8192); -
-
Есть интересная проблема, присуствует в таблице битый парт и кликлаус ругается что не может его смержить, а когда мытаюсь его детачнуть, то говорит что парт участвует в мерже
2021.01.15 12:05:54.200281 [ 1142972 ] {} <Warning> default.events (ReplicatedMergeTreePartCheckThread): Checking data of part 20201130_20201130_499695_499707_2.
2021.01.15 12:05:54.892738 [ 1142967 ] {} <Warning> default.events (ReplicatedMergeTreePartCheckThread): Checking part 20201130_20201130_499695_499707_2
2021.01.15 12:05:54.897808 [ 1143453 ] {} <Error> default.events (8005f254-5c8e-45ed-9a03-8ba6d4b05bce): auto DB::StorageReplicatedMergeTree::processQueueEntry(ReplicatedMergeTreeQueue::SelectedEntryPtr)::(anonymous class)::operator()(DB::StorageReplicatedMergeTree::LogEntryPtr &) const: Code: 33, e.displayText() = DB::Exception: Cannot read all data. Bytes read: 15729662. Bytes expected: 268435455.: (while reading column BillingURL): (while reading from part /var/lib/clickhouse/store/800/8005f254-5c8e-45ed-9a03-8ba6d4b05bce/20201130_20201130_499695_499707_2/ from mark 14 with max_rows_to_read = 8192): While executing MergeTreeSequentialSource: Cannot fetch required block. Stream PipelineExecuting, part 2, Stack trace (when copying this message, always include the lines below):
ALTER TABLE events
DETACH PART '20201130_20201130_499695_499707_2'
Query id: 55348067-6a11-40ea-83ae-235d5ffb4aaf
Received exception from server (version 20.12.5):
Code: 384. DB::Exception: Received from localhost:9000. DB::Exception: Part 20201130_20201130_499695_499707_2 is currently participating in a background operation (mutation/merge), try again later. -
Joined.
-
https://altinity.com/blog/clickhouse-kafka-engine-faq
это уже читали?ClickHouse Kafka Engine FAQKafka is a popular way to stream data into ClickHouse. ClickHouse has a built-in connector for this purpose -- the Kafka engine. This article collects typical questions that we get in our support cases regarding the Kafka engine usage. We hope that our recommendations will help to avoid common problems.
-
Спасибо, Эд)
-
всем привет! подскажите плиз, есть ли какой-то быстрый способ получить последнюю запись с условием?
условно
есть колонка, где есть значение - это значение всегда из определённого массива (допустим колонка color == одно из [red, green, blue])
каким образом оптимально получить последнюю строку со значением в колонке color "red", к примеру? -
Прочитал, спасибо
И получается на некоторых версиях клика, предположительно на "старых" данные могут дублироваться? -
на новых тоже в редких случаях,
at least once пока только поддерживаетс -
У вас кафка брокер стабильно работает? Кх нормально оффсеты коммитит?
-
Не знаю как ответить на вопрос.
Сравниваем клик с куду, там из того же топика льется и дуплицирования нет -
-
может поможет
system stop merges default.events -
Проверю завтра
-
select
where has( color, 'red')
order by time desc
limit 1 -
спасибо большое! а то я тут уже в подзапросы полез - селект в селекте...
-
через аггрегатные функции... натолкнуло - вот это https://altinity.com/blog/2020/4/14/handling-real-time-updates-in-clickhouse
-
про кафку и дубликаты
делаем poll1, poll2, poll3
записываем в КХ,
комитим оффсеты
кафка отвечает, что был ребаланс и партиции эти уже не наши, и комит неудачный.
и даже у нас есть ребаланс листенер, про ребаланс мы можем узнать только в момент poll, и надо успеть и узнать и среагировать за таймаут в 5 сек. , иначе ребаланс пройдет без нас. -
Join(ANY,INNER,
a join t
Либо Join(ALL,INNER,
либо a any join t -
-
прямо вот "посоветовать"
из тех кто clickhouse поддерживает
apache superset
и metabase
из более или менее "BI" -
-
-
Redash ещё есть. Но из этих трёх решений субъективно superset самое нормальное
-
а мы метабейзом очень довольны. пойду погляжу ютуб про суперсет)
-
редаш какая-то поделка с некрасивыми графиками и кривым конструктором)
-
У metabase 2 главные проблемы: написан на Clojure и отвратительная модель прав. Интерфейс у него и правда самый приятный
-
суперсет кажется покруче картинки умеет
-
Добрый день, хочу спросить, как будет оптимальнее делать из Column LowerCase при внесении или при запросе SELECT?
-
Строк 10миллиардов, запросы на SELECT выполняются не во время записи
-
Joined.
-
если вам оригинальные кейс не нужен, то во внесении, во всех базах, файлах и вообще везде, учитывая, что читать больше одного раза
-
Joined.
-
-
ClickHouse/ClickHouse description changed: v20.8.12.2-lts
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v20.8.12.2-lts
Release notes:
ClickHouse lts release v20.8.12.2-ltsRelease v20.8.12.2-lts · ClickHouse/ClickHouseClickHouse lts release v20.8.12.2-lts
-
Вот бывает же.
Беру таблицу , считаю sum(поле) получается 428922784
Переливаю в другую таблицу, менее широкую, c помощью insert ... select .... sum / sum / sum group by по 20 полям.
считаю sum(поле) в новой таблице получается 428922779
через полчаса отладки я догадался сделать set insert_deduplicate = 0 -
- 16 January 2021 (46 messages)
-
Как с языка снял, ну в общем то я в этом чате постоянно с таким выражением сижу
-
О как. Спасибо.
-
не помогло к сожалению, так же ругается что используется парт в мерже
-
Хороших всем выходных. подскажите плз, как проверить актуальное значение max_concurrent_queries? в конфиге поменял, хочу убедиться, что подхватилось. в system.settings нет его
-
Народ, а какие требования к машинам zookeeper для репликации 2 КХ серверов?
-
Вопросик. Экспартируем данные из КХ в native формате в файл. Далее пытаемся сделать инсерт в базу, но в таблице нет одной или несколько колонок. Естественно получаем ошибку. Инсерт делаю так: clickhouse-client -q "INSERT INTO default.event_test FORMAT Native" < file. Пытался указать, какие именно колонки использовать. Не помогло. Есть ли варианты импортировать данные если нет части колонок в конечной базе при существовании этих колонов в исходных данных?
-
Input function
-
https://clickhouse.tech/docs/ru/sql-reference/table-functions/input/ я так понял вы про этоinput | Документация ClickHouse
input input(structure) - табличная функция, позволяющая эффективно преобразовывать и вставлять отправленные на сервер да
-
сюда:
clickhouse/data/preprocessed_configs/config.xml -
запросом из базы не? верно?
-
Нет вроде для этого параметра способа
-
спасибо. уже посмотрел
-
конфиг, как Вы и сказали
-
-
SYSTEM STOP MERGES
-
-
-
Разбивать конечно ничего КХ не будет. Нету такой возможности. Мерж умеет только соединять/слиять.
-
По моему парт и партишн в КХ совсем разные вещи, ну просто таки совершенно.
-
партишн -- виртуальная сущьность. Логически объединяет физические парты.
-
Добрый день, подскажите, как сделать лучше, есть 10000 различных строк, вносится 1миллиард строк, где один колумн, это содержимое одной из этих 10000 строк, лучше вынести их в отдельную таблицу и дать им ID и вносить его или просто вносить их в таблицу и не париться?
-
Длина строк от 40 до 80 символов
-
LowCardinality быть может?
-
есть такая штука -- LowCardinality, примерно для вашего случая
-
Да, я знаю про неё, просто боюсь, что потом 10 000 строк могут превратиться в 100 000
-
Или даже больше
-
словарь в каждом парте свой
-
о, это отличная новость, спасибо!
-
А LowCardinality может быть Nullable?
-
на самом деле решение можно принять только зная запросы которые будут выполняться над этой колонкой.
И например джойн с таблицей на 100к это совсем не сахар. И словарь (ext.dictionary) тоже не сахар. -
да
-
Join'ы делаться не будут, только если на несколько сотен строк
-
вы просто не понимаете что такое джойны.
Вот например вы сохранили в большой таблице id = 777
В маленькой таблице у вас 100к строк, как вы расшифруете 777 в большой таблице?
Вы сделаете джойн. Nested loop в КХ нету, HashJoin перекинет все 100к в память и будет делать это очень долго (100мс) -
Вынесу данные, которые мне нужны в ENGINE = Memory() и там сделаю Join
-
ахаха.
-
)
-
Проблема 100мс. возникает из перекладывания данных в хеш-таблицу, поэтому ENGINE = Memory() ничего не изменит
-
Есть правда Engine=Join который поможет, но с ним другие проблемы
-
Ну когда кол-во строк станет не 100к, возникнут новые трудности типа out of memory
-
Значит хранить строки?))
-
да, одна широкая таблица.
-
У меня в одном проекте после перехода с вертики было штук 20 таких таблиц с которыми джойнили, сейчас через 4 года осталось 2, остальные переместились в широкую, чтобы не делать джойны.
-
и то потому что те 2 надо обновлять после заливки
-
Понял, спасибо
-
Joined.
-
- 17 January 2021 (48 messages)
-
-
-
-
Здравствуйте, начали разрабатывать аналитику.
У нас 2 потребности:
1) Отчёты за определенный период (тут всё понятно)
2) Получать последние данные о пользователе (вплоть до последних 10 секунд) для формирования рекомендаций.
Подходит ли ClickHouse для этой цели?
Также проблема в том, что последние действия пользователя могут быть пару часов/дней назад, а могут быть 10-30 секунд назад, а рекомендации всегда должны быть актуальными. Можете предложить схему для такой задачи? -
-
-
-
да
-
и даже 5 раз в сек
-
для 2 не подходит. Возьмите кассандру / redis / mysql
-
как бы да. Там еще каталог с access_management там xml-и c юзерами, его можно тоже перенести, если хочется.
-
А можно узнать почему? Как я понял постоянно что-то идет в базу. Надо некий селект по данным по юзеру. Что тут не так? Какая разница когда он был - where userId=хх order by desc
-
КХ очень медленный и делает огромный оверхед на таких запросах.
В некоторых ситуациях mysql будет читать 2кб и отвечать за 0.001 сек., а КХ будет читать 6ГБ и отвечать за 3 сек. -
КХ не для точечных запросов когда надо обработать 200 записей и вернуть одну
-
это да. А тут речь про одну-две записи? ТОгда согласен. А так поле с datetime первым в перечне полей сортировки на таблице и должен отфильтровать. Нет?
-
-
>А так поле с datetime первым в перечне полей сортировки на таблице и должен отфильтровать
это большая ошибка для любой базы.
индекс должен быть order by (userId, time), для запроса where userId=хх order by desc -
дада, user, time, вы правы, забыл его
-
Проблема с КХ в том что индекс разреженный и будет прочитано записей больше чем нужно, потому что индекс указывает на гранулу в которой 8192 записей
-
скорее всего будет обработано минимум 2 гранулы
-
другая проблема что файлы .mrk (засечки) будут загружены все из партов, которые запрунены
-
и получается что mysql дает 10krps , и читает 1кб на запрос, а КХ дает 500rps и читает 60кб на запрос
-
-
SETTINGS index_granularity = 64;
Elapsed: 1.655 sec. Processed 1.15 thousand rows, 123.55 KB -
-
пробовать вы конечно можете, но если у вас реальная биг дата, и надо реально много rps, то для таких точечных запросов КХ не подходит.
-
-
ну да, таким гранулятором (64) - это да
-
запустил последний селект на своей базе ради интереса - база 30 гиг, а марков 100Мб
-
хм база 30ГБ ? У меня пользователи лежат в кластере кассандры с 50 нодами и 2 TB диска в каждой ноде.
-
-
да
-
Спасибо за подтверждение, просто засомневался, что не будет потом поломок в данных
-
да, но КХ полностью перезаписывает парт(ы) без удаленных записей, если не повезло и записи с такими значениями парт. ключей будут в партах объемом 1ТБ, то КХ прочитает , распакует, запакует и запишет 1 TБ чтобы удалить 1 запись
-
Мы только начинаем. И у меня сразу запись в суммаримерж
-
ок. Спасибо за пояснение. Поидее у меня удаление будет идти в пределах одного парта (так как бью по месяцам) и нужно удалить 1К-100К записей в пределах одного парта, но по определенному признаку. Такое случается раз в 2-3 месяца, а то и режже.
-
это нормально, только нужно контроливать что мутации завершаются и НЕ застревают навсегда и не запускать одновременно 50тыс. мутаций как делают некоторые.
-
Ок. Спасибо, будем последить
-
Еще вопрос: посмотрел на кафка коннкетор, вроде как в нем починили известную проблему при ребалансировки кафки + у меня и так данные не айс и нужно их группировать, так как дубли уже в искходных данных, потому вроде норм. Тут вопрос: какой размер блока укзаывать оптимальнее? Я предпологал, что около 1М, но где-то видел рекомендацию 65К.
-
>вроде как в нем починили известную проблему при ребалансировки кафки
? это нельзя починить без 2pc транзакций -
>Я предпологал, что около 1М, но где-то видел рекомендацию 65К.
в современном kafka engine это все уже неактуально и там все по другому -
Значит я не так понял. но даже в этом кейсе вроде мы получим дубли данных, что в нашей ситуации соовсем не страшно
-
Можете пожалуйста подсказать, куда смотреть по данному вопросу?
-
если речь про https://github.com/ClickHouse/ClickHouse/issues/18668
то там ничего не вмержено, нашлись баги в librdkafkaUpgrade librdkafka to 1.5.3 or greater to fix duplicate writes with exactly once semantics and compressed messages · Issue #18668 · ClickHouse/ClickHouseWe are experiencing duplicates writes when consuming from Kafka using the Kafka connector while using exactly once semantics with compressed messages. We were able to locate the bug in librdkakfa, ...
-
ок. Спасибо.
-
Better settings for Kafka by filimonov · Pull Request #11388 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the cha...
-
Спасибо!
-
Joined.
- 18 January 2021 (219 messages)
-
Первичный ключ не даёт уникальности?
-
Мне нужно, чтобы нельзя было добавить одинаковые id
-
Сейчас указан ключ сортировки, но как понимаю, он же автоматом и является первичным ключом
-
Нет. Можно взять Replacing движок и он будет в фоне чистить дубли по ключу, но он не дает 100% гарантии, что дублей совсем не будет
-
Joined.
-
Joined.
-
Здравствуйте!
подскажите, в каких случаях может пригодиться LowCardinality ? Как он работает ? Где храняться данные и в каком виде ? Можно ли сальтерить с обычной строки в LowCardinality ?
В доке как-то супер мало информации.
Спасибо -
Joined.
-
Добрый день,
Пытаюсь добавить S3 disk по статьям с Altinity. На тестовой таблице все работает, но когда добавляю S3 disk в существующий storage policy, то получаю в логах
<Error> auto DB::IBackgroundJobExecutor::jobExecutingTask()::(anonymous class)::operator()() const: Poco::Exception. Code: 1000, e.code() = 2, e.displayText() = File not found: /var/lib/clickhouse/data/<database>/<table>, Stack trace (when copying this message, always include the lines below):
Папка /var/lib/clickhouse/data/<database> есть (путь отредактирован), а вот папки с таблицой действительно нет. Что посоветуете? CH 20.12.5.14 -
Всем привет! Ищем нам в команду DBA (ClickHouse). Наша команда занимается разработкой и сопровождением решений для аналитики на базе различного типа хранилищ. На данный момент мы поддерживаем СlickHouse и Cassandra. На очереди Apache Ignite. По ссылке описание вакансии, но я готов ответить на уточняющие вопросы, потому что сам работаю в этой команде :slightly_smiling_face: Ссылка на вакансию: https://spb.hh.ru/vacancy/39575203Вакансия Database Engineer (Data Division) в Санкт-Петербурге, работа в компании Infobip (вакансия в архиве)
Зарплата: не указана. Санкт-Петербург. Требуемый опыт: 3–6 лет. Полная занятость. Дата публикации: 26.05.2021.
-
Joined.
-
-
Всем привет! Есть люди с опытом обработки большого массива данных на кх ? Хотелось бы проконсультироваться в личке, что бы чат не засорять.
-
ачо, нам тоже интересно
-
тут как раз все такие так что пиши ))
-
не все, так что я просто послушаю
-
А есть ли возможность посмотреть статус OPTIMIZE TABLE к ReplicationMergeTree?
-
Joined.
-
Есть самописная DMP для внутренних нужд компании и сейчас стоит задача по формированию аттрибутов профилй. Решили взять кх для сборки и обработки сырых данных ( опыта в этом большого нет). В сырые данные сохраняются title и url запросов и куча других полей. Пока работа идет с title и url полями, по ним формируются правила примера если title содержит "нужный текст" то такой запрос относится к аттрибуту под id 400 ( к примеру). Получается по факту пример запроса такой
select uid, positionCaseInsensitiveUTF8(ref, 'https://example.ru') != 0 OR positionCaseInsensitiveUTF8(title, 'Кулинария') != 0 OR positionCaseInsensitiveUTF8(title, 'Рецепт этого блюда') != 0 OR positionCaseInsensitiveUTF8(title, 'Кулинарный рецепт') != 0 as "440" from raw_data where "440" = 1; -
Там запрос иногда из 20-30 аттрибутов по 50-60 блоков OR каждый), данные в кх обрабатываются за пол года. их там порядка 200-300 миллиардов записей.
-
Здравствуйте!
Создали таблицу с полем типа DateTime без указания timezone; timezone, похоже, выставился автоматически Europe/Moscow. Заполнять это поле начали (по ошибке) датой UTC, то есть получили событие в 13:00 по московскому времени, превратили это время в UTC, то есть 10:00, и записали в поле DateTime. В итоге, как я понял из доки, которая говорит о том, что не важно, какая timezone указана для поля, все равно в недрах всё хранится в UTC (ну и как я вижу исходя из запросов), на самом деле в таблице сохранилось время 07:00 (это наблюдается при запросах, где пытаюсь выгрузить данные за определенные промежутки времени).
Engine таблицы – ReplicatedMergeTree
Каким образом корректно исправить эту проблему? Изменить тип стобца с DateTime('Europe/Moscow') на DateTime('Europe/London'), а затем обновить все значения этого поля, чтобы привести их к корректным? -
Добрый день, а если я хочу потоково читать из двух кафок с разными топиками, можно это как-то сделать?
я пробывал вот так, вбить адреса кафок и задать названия топиков:
create table test_kafka (
id UInt64
) ENGINE = Kafka('kafka-1:9092’, ’kafka-2:9092’ , ‘topic_1, topic_2', 'group1', 'JSONEachRow’);
но так не работает 🙁
Кажется, потому что в kafka-1 нет topic_2 и в kafka-2 нет topic_1
Делаю такой вывод, так как по отдельности все работает:
create table test_kafka (
id UInt64
) ENGINE = Kafka('kafka-1:9092’, ‘topic_1', 'group1', 'JSONEachRow’);
create table test_kafka (
id UInt64
) ENGINE = Kafka(‘kafka-2:9092’, ‘topic_2', 'group1', 'JSONEachRow’); -
я думаю, что нужно создавать две таблицы с разными коннекшенами
так будет более верно на мой взгляд, тк если чето упадет на первой, то весь консюм не стопнется -
В чем вопрос? :) сырые данные лучше нормализовывать (регистр, различные варианты написания URL) или до кх (возможно, кто пишет данные), или через мат.вью. Если набор URL ограничен, то возможно обогащать атрибутом через словарь или через подготовленный join в той же мат.вью.
-
Joined.
-
Проблема в том что набор url не ограничен) И сам вопрос в том что у меня иногда запросы просто не отрабатывают так как не справляются за время. Пока единственный вариант который пришел в голову расширить кластер кх. Но подумал вдруг есть еще какой либо способ или какой либо еще инструмент который можно поковырять)
-
Этот запрос вы из маьвью вытащили или из селекта?
-
из select
-
-
возможно будет лучше создать material column’ы чтобы они считались при вставке на каждый из поисков. чтобы полнотекстовый поиск происходил только раз на одну запись, а не на каждый запрос
-
правила и по title и по url формируются. Их количество не ограничено. Аттрибутов тоже много соответственно правила все разные и комбинации тоже разные внутри.
-
ну вот это можно было попробовать material column’ы
-
Други, помогите плз) Есть таблица с логами заходов пользователей(1 запись = 1 действие). Нужно сгруппировать по дате и посчитать кол-во активных пользователей по датам. Активный - это тот кто заходил хотябы раз за 2 недели, тоесть есть хотя бы одна запись) Как на клике это лучше всего посчитать?
-
ну да, клику не так сильно важно сколько этих колумнов будет. разбить на атомарные признаки и хранить только 0/1 типа совпадает/не совпадает, а потом уже любые запросы можно будет строить
-
-
Хаюшке всем, докинули пару дисков в рейд на пару терабайт, участились мерджи и начали отставать периодически реплики. Я подозреваю что надо просто какие то настройки подтюнить, но не уверен какие конекретно. Сталкивался кто?
-
не уверен, но
select count(active) as alias
…
group by date
having alias > 1
возможно даже в селект не нужно пихать, а сразу в хевинг, но это не точно)
или в подзапрос обернуть, так точно работать будет) -
+ сгрупировать по ид пользователя или какойто признак уникальности
-
точно
-
-
если нужен тотал по всем прям - можно попробовать в группировку докинуть with totals
-
-
написано было что заходил хотябы раз
-
-
-
Joined.
-
Верно, но если ее сегодня нет, а 11 дней назад есть, то и сегодня он дожен поасть в активные)
-
-
-
Не очень тебя понял) В итогде должна быть табличка с 2мя колонками, дата и кол-во активных пользователей.
-
-
-
-
-
но никакой логики в этом нет же?)
-
-
-
-
Здравствуйте, коллеги. Нужна помощь с добавлением индекса.
clh01 :) alter table traffic add index packetDate_ packetDate type minmax granularity 8192
ALTER TABLE traffic
ADD INDEX packetDate_ packetDate TYPE minmax GRANULARITY 8192
Query id: 2e43efe9-d10a-4720-862a-6a529b9ddd53
Ok.
0 rows in set. Elapsed: 0.022 sec.
clh01 :) alter table traffic materialize index packetDate_
ALTER TABLE traffic
MATERIALIZE INDEX packetDate_
Query id: 33c7de4e-b068-4b41-99e2-88afb045d4ca
Ok.
0 rows in set. Elapsed: 0.013 sec.
clh01 :) optimize table traffic final
OPTIMIZE TABLE traffic FINAL
Query id: cf81bec4-650d-4150-801b-cc4f4d306cba
Timeout exceeded while receiving data from server. Waited for 300 seconds, timeout is 300 seconds.
Cancelling query.
Ok.
Query was cancelled.
0 rows in set. Elapsed: 3431.730 sec. -
-
не увидел ответа как двухнедельный онлайн для каждого ид решает этот вопрос. даже наоборот ощущение что значения будут сильно завышены
-
-
Ну типо если он 2 недели не заходил, то наврятли это он писал в поддержку. Короч просто метод узнать тех кто пользуется и щас когда их кол-во как и обращений будет расти, увидеть не полетит ли их отношение. Но это не моя идея, я полностью согласен что варик так себе)
-
Ну выберете всех юзеров начиная now() - interval 2 weeks
-
Может ли при проставленном insert_distributed_sync = 1 вообще существовать отставания реплик? Если во время вставки через clickhouse-client идёт сохранение на все реплики, то данные гарантировано записаны и отставания друг от друга нет. Я прав или я прав?
-
Joined.
-
Привет. Подскажите, как корректно удалить storage policies? Если убрать упоминания из конфига, то они остаются в system.storage_policies
-
full restart сделать и все пройдет
-
Понял, спасибо.
-
Для меня это не очень опция, так как я перевожу сервис с питона на C# и хочу, чтобы два сервиса некоторое время писали в одну таблицу, чтобы не потерять данные
Можно ли как-то так сделать? -
Так они будут продолжать писать в одну таблицу
Вы создадите две Кафка таблицы, потом два MV, которые пишут в нужную таблицу -
Я бы так делал
-
-
выходит так что это самые жирные поля тк значения в них уникальны
-
Привет
Запрос create table on cluster при поломанности каких-то машин выполнится или зафейлится? -
На починенных выполнится, на сломанных нет)
-
Подскажите, что означает TRACKING ONLY и NO LIMITS в выражении для квот? https://clickhouse.tech/docs/ru/sql-reference/statements/create/quota/Квота | Документация ClickHouse
CREATE QUOTA Создает квоту, которая может быть присвоена пользователю или роли. Синтаксис: CREATE QUOTA [IF NOT EXISTS |
-
Функции поиска в строках | Документация ClickHouse
Функции поиска в строках Во всех функциях, поиск регистрозависимый по умолчанию. Существуют варианты функций для регистр
-
вот так попроще. Но конечно лучше сделать материализованные представления и разбирать данные
-
всё-равно разбирать регулярками
-
Joined.
-
ClickHouse/ClickHouse tagged: v21.1.2.15-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.1.2.15-stable
Release notes:
ClickHouse stable release v21.1.2.15-stableRelease v21.1.2.15-stable · ClickHouse/ClickHouseClickHouse stable release v21.1.2.15-stable
-
А как вы его добавляете, как второй диск (cold) или как основной?
Можете, пожалуйста, конфиг до-после показать? -
добавляю как второй холодный
в конфиге ничего особо нет
<tiered>
<move_factor>0.1</move_factor>
<volumes>
<hot>
<disk>hot_ssd_0</disk>
</hot>
<s3>
<disk>s3</disk>
</s3>
</volumes>
</tiered> -
Хм.
А полный стектрейс ошибки можете показать, пожалуйста? -
думаю может надо дать какое-то время чтобы папка создалась
из ошибки сразу удалил s3 из полиси пока -
gist:440cadacf0ca1956c030490cf07ba8c3
GitHub Gist: instantly share code, notes, and snippets.
-
Здравствуйте, коллеги. Нужна помощь с добавлением индекса.
clh01 :) alter table traffic add index packetDate_ packetDate type minmax granularity 8192
ALTER TABLE traffic
ADD INDEX packetDate_ packetDate TYPE minmax GRANULARITY 8192
Query id: 2e43efe9-d10a-4720-862a-6a529b9ddd53
Ok.
0 rows in set. Elapsed: 0.022 sec.
clh01 :) alter table traffic materialize index packetDate_
ALTER TABLE traffic
MATERIALIZE INDEX packetDate_
Query id: 33c7de4e-b068-4b41-99e2-88afb045d4ca
Ok.
0 rows in set. Elapsed: 0.013 sec.
clh01 :) optimize table traffic final
OPTIMIZE TABLE traffic FINAL
Query id: cf81bec4-650d-4150-801b-cc4f4d306cba
Timeout exceeded while receiving data from server. Waited for 300 seconds, timeout is 300 seconds.
Cancelling query.
Ok.
Query was cancelled.
0 rows in set. Elapsed: 3431.730 sec. -
-
А рестарт сервера помогает?
Просто эти папки должны создаваться при старте таблицы, если их нет. -
curl -T ~/Downloads/tablename.csv.gz -X POST -v --progress-bar \
-H "Content-Encoding: gzip" \
-H "Content-type: text/csv" \
-H 'X-ClickHouse-User: default' \
-H 'X-ClickHouse-Key: mySecurePass' \
'https://www.host.com/?query=INSERT%20INTO%20tablename%20FORMAT%20CSVWithNames' -
я не решился проверять
поэтому может быть :) -
Кажется, что рестарт должен помочь.
Добавление "наживую" толком не тестировалось. -
Какое значение по default в кликхаусе max_execution_time ?
-
Спасибо!
-
гайз, а как можно изменить партиционирование без боли ? Было партиционирование по недели, сейчас необходить сделать по месяцу. Ну и что бы помержилось все. Кроме как переливать в другую таблицу есть варики ?
-
Создаешь вторую таблицу, с нужным партиционированием. Объединяешь их с помощью движка Merge. Начинаешь писать в новую таблицу, читать из Merge.
-
из-за слишком большого количества партиций у меня огромное количество партов. Проблема решается альтером партиционирования на месяц.
-
Ребята, а есть ли какие нить альтернативы, как сделать подобный запрос:
Хочется выбрать первые строки по каждому пользователю, из довольно увесистого лога.
select
user,
createdAt,
at as first_log_at,
abs(first_log_at - createdAt) as create_time_lag_sec,
country,
platform,
version as start_version
from isp
where createdAt between toDate('2020-01-01') and today()
order by at
limit 1 by user
Текущий вылетает по памяти:
Code: 241, e.displayText() = DB::Exception: Memory limit (for query) exceeded: would use 9.31 GiB (attempt to allocate chunk of 4195401 bytes), maximum: 9.31 GiB: (avg_value_size_hint = 14.086669921875, avg_chars_size = 7.304003906249999, limit = 8192): (while reading column version): (while reading from part /var/lib/clickhouse/data/raven/log_r/4383f25745ae9ef993e861ad0c5bed11_0_26_48/ from mark 192 with max_rows_to_read = 8192): While executing MergeTreeThread (version 20.11.3.3 (official build))
Вот такой вот запрос работает без проблем: но min(version) != version на первой записи
select user,
country,
platform,
createdAt,
min(version) as start_version,
min(at) as first_log_at,
abs(first_log_at - createdAt) as create_time_lag_sec
from raven.isp
where isp.createdAt > toDate('2020-01-01')
group by user, country, platform, createdAt; -
разрешить клику свопить ответ на диск?
-
вариант... спасибо, попробуем
-
Возможности ClickHouse для продвинутых разработчиков / Алексей Миловидов (Яндекс)
Приглашаем на Saint HighLoad ++ 2021 20 и 21 сентября 2021, Санкт-Петербург, DESIGN DISTRICT DAA in SPB Программа, билеты и подробности - https://clck.ru/VmKaW -------- Backend Conf, РИТ++ 2018 Тезисы: http://backendconf.ru/2018/abstracts/3481 В докладе планируется рассмотреть малоизвестные или недостаточно хорошо освещённые в документации возможности ClickHouse: инкрементальная агрегация и манипуляции с состояниями агрегатных функций, межкластерное копирование, выполнение запросов без использования сервера и т.п. Будут приведены примеры из практики разработки сервисов Яндекса: как выжать из системы максимум возможного. -------- Нашли ошибку в видео? Пишите нам на support@ontico.ru
-
-
-
Есть таблица
user_id | event | time_event
1| start | 2021-01-18 09:20:00
1| ev1 | 2021-01-18 09:37:00
1| ev2 | 2021-01-18 09:58:00
1| exit | 2021-01-18 10:11:00
2| start | 2021-01-18 10:02:00
2| ev1 | 2021-01-18 10:37:00
Как подсчитать, что за определенное время (например, 1 час), пользователь успевает сделать больше 3х событий.
Пытаюсь делать таким запросом
SELECT toStartOfInterval(time_event, INTERVAL 1 HOUR) AS time, user_id, COUNT(*) AS cnt
FROM table
GROUP BY time, user_id
HAVING COUNT(*) > 3
Но в этом случае промежуток времени это час с 00:00 до 00:59, а не от первого события отсчитывается. Может кто сориентирует как правильно сделать? -
-
minmax granularity 8192 --- это ошибка , это кол-во гранул из первичного ключа, у вас получается 8192*8192
minmax granularity 1 or(2) -- ожидается -
Спасибо!
-
https://youtu.be/rqf-ILRgBdY?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ
>Можно ли сальтерить с обычной строки в LowCardinality ?
да можно -
Привет всем. Подскажите, пожалуйста, чем
ALTER TABLE table_name DROP PARTITION partition_expr
принципиально отличается от
ALTER TABLE table_name DROP PART partition_expr
? -
PARTITION состоит из множества PART
а откуда взялось
ALTER TABLE table_name DROP PART partition_expr
я не думаю что это работает -
А как рассчитать количество допустимых партиций на хост?
-
лучше не используйте никогда DROP PART
пока вы не понимаете что он делает -
никак. Если вы не знаете ответа, используйте партиционирование toYYYYMM
-
Это из документации) https://clickhouse.tech/docs/ru/sql-reference/statements/alter/partition/#alter_drop-partition
А можно ли удалять партиции по какому-то общему признаку, используя Like в предикате, или только явно указывая?
Мне необходимо удалить много партиций, все они подходят под условие like '%2021-01-18%' напримерPARTITION | Документация ClickHouseМанипуляции с партициями и кусками Для работы с партициями доступны следующие операции: DETACH PARTITION — перенести пар
-
Ну я сделал партицирование, там максимальное кол-во партиций возможно - 100
-
100 партиций, это много\мало?)
-
это не много
-
>А можно ли удалять партиции по какому-то общему признаку, используя Like в предикате, или только явно указывая?
нельзя.
>Мне необходимо удалить много партиций, все они подходят под условие like '%2021-01-18%' например
можно написать что-то типа
select concat('alter table ',table, ' drop partition id \'', partition_id, '\';')
from system.parts
where active = 1 and table like 'яяя' and partition like '%2020-09%' group by database,table,partition_id
order by database,table,partition_id -
Добрый день, подскажите пожалуйста
делаю джойн
select a.dt, b.val
from (select arrayJoin([toDate('2020-01-01'), toDate('2020-01-01')]) as dt) a
left join (select toDate('2020-01-01') as dt, 100 as val) b
on a.dt = b.dt;
Какую опцию нужно использовать, чтобы результат был примерно таким
dt val
2020-01-01 100
2020-01-01 null
Проще говоря, чтобы джойн происходил для произвольной строки из первой таблицы подходящей по ключу. Пытаюсь использовать any, без особого успеха -
для сервера с X CPU и Y дисков это ок
-
хаха
-
Это чтобы получить селект который потом выполнить нужно на всех серверах?
-
скажем для некоторых таблиц, чтобы работало быстро, я делаю одну партицию в таблице.
-
))
X - 16 ядер AMD Ryzen 9 5950X
Y - 1 HDD Seagate Exos X16 14 TB ST14000NM002G, скорость RW 160MB/S -
да чтобы получить SQL скрипт, который потом выполнить нужно на всех серверах
-
Понял, спасибо
-
Я просто экспериментирую с различными видами данных и их внесением, пытаюсь понять, как лучше)
-
используйте toYYYYMM
-
партиции в первую очередь для управления длительностью хранения, в 10ю очередь для перфоманса
-
Вся проблема в том, что данные вносятся за один день, потом простой, потом опять один день
У данных нету идентификатора, по которому можно было бы их разбить по типу toYYYYMM
Из за этого сделал ID и как партицию сейчас использовал Id % 100
Но это я играюсь и сам ещё не знаю, что из этого выйдет) -
дата внесения? materialize today()
-
Будет ли существенная разница у 1 миллиарда строк при различных партициях?
-
>Из за этого сделал ID и как партицию сейчас использовал Id % 100
и как select-ы выглядят? -
будет
-
SELECT * FROM test_table WHERE str1="test"
-
эээ, а КХ тут зачем? Тут кассандра нужна или монга
-
А, если вы про итоговый селект, то я ещё не начал работать с итоговыми данными, так что не могу точно сказать, сейчас я больше эксперементирую )
-
значит точно
(
X Date materialize today()
...)
partition by toYYYYMM(X) -
А NOW() не подходит?
-
а зачем вам хранить в таблице секунды? колонка место жрет
-
Согласен
-
а зачем materialize ?
-
чтобы не менять insert-ы и не менять поведение select *
-
materialize поля не раскрываются *
-
что значит не раскрываются ?)
-
это значит что select * не выбирает такие поля
-
это что-то типа виртуального поля получится ?
-
нет. Виртуальное это alias
-
в доке все есть
-
поле вполне реально, но надо явно его писать в select
-
Joined.
-
Если есть свободное место на сервере, и увеличить max_bytes_to_merge_at_max_space_in_pool больше чем 150ГБ, к примеру 400ГБ, это как-то может улучшить или ухудшить производительность КХ? чтобы мёрджы(слияния) выполнялись реже
-
эффективны.
>Насколько замедляет выборку(расчет) по этим полям
очень мало влияет
надо проверять CODEC(ZSTD) vs CODEC(DoubleD, ZSTD) -
это серьезно увеличит нагрузку на CPU и диск
>чтобы мёрджы(слияния) выполнялись реже
эээ, так ровно наоборот будет -
Есть вопрос, я использую ReplacingMergeTree
У меня есть Column UInt64 ID - это хэш от колонок (String): str1, str2, str3
Будет лучше поставить ORDER BY (ID) или ORDER BY(str1, str2, str3) -
получается 150ГБ для мёрджей, это оптимальный размер, ок, спасибо
-
Как минимум есть два фактора:
1. Поля, по которым ваши выборки фильтруются и сортируются. Например, при переходе к хешу вы сильно потеряете в скорости выборки, где в фильтре указано поле str1 или str1 или str2.
2. Желательно, чтобы записи с одинаковыми полями лежали рядом - тогда хорошо сработает компрессия данных. Тут уже вам виднее, в каком случае это получится. -
Понял, а на сколько нормально делать в ORDER BY (str1, str2, ifNull(str3, str4))?
-
подскажите - по SummingMergeTree:
Допустим таблица:
create table tr3
(
dt Date,
demand_id UInt32,
imps UInt64
)
engine = SummingMergeTree((imps))
PRIMARY KEY (dt, demand_id)
ORDER BY (dt, demand_id)
Если в нее пихать - то схлопывается и суммируется - все ок
Делаю по ней матвью:
CREATE MATERIALIZED VIEW tv
(
dt Date,
demand_id UInt32,
imps UInt64
)
engine = SummingMergeTree((imps))
PRIMARY KEY (dt, demand_id)
ORDER BY (dt, demand_id)
as Select dt,demand_id, sum(imps) from tr3 group by dt,demand_id; -
и в итоге в матвью идет 0
-
Если без груп бай, то идет, но по том ждать когда оно там решит схлопнуться
-
а тут непонятно - какие-то ограничения чтоли на суммари вью из суммари ендж?
-
Есть ли какие-то рекомендации под ЗК(настройки производительности итд), и использует ли кто-то ЗК как мастер мастер?(если возможно такое) для ускорения обработки транзакций внутри ЗК.
-
всем доброго времени суток. Подскажите, пожалуйста, такой момент:
я создаю индекс для таблицы db.t_oplogs_info (примерно 1,5 миллиарда строк, количество уникальных значений item_id = 50) на движке MergeTree():
alter table db.t_oplogs_info add index t_oplogs_info_item_id_indx (platform_type, item_id) type set(0) granularity 8192;
alter table db.t_oplogs_info materialize index t_oplogs_info_item_id_indx;
дожидаюсь выполнения мутации, после чего при выполнении запроса:
select count(1)
from
db.t_oplogs_info x
where
x.platform_type = 'p'
and
x.item_id = 'a'
я получаю примерно те же значения по времени выполнения запроса по указанной таблице db.t_oplogs_info до создания в ней индекса t_oplogs_info_item_id_indx.
С чем это может быть связано? -
Спасибо, буду пробовать!
-
sum(imps) as imps
имена полей в select и MV должны совпадать -
Охтыж.... поди догадайся... Спасибо
-
ZK по дефолту мастер-мастер, там есть watch ноды , но это отдельная история и с КХ они не нужны.
>ускорения обработки транзакций внутри ЗК
ускорить ZK нельзя. Все ноды ZK делают одно и тоже и весь ZK работает со скоростью самого медленного узла
У вас не должно быть проблем с ZK , 3 нод ZK (один ансамбль) должно хватать на сотню шардов / на 500 нод КХ -
посмотрите мой доклад
https://youtu.be/1LVJ_WcLgF8?t=7596
https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf -
не вопрос, с удовольствием
-
благодарю за развёрнутый ответ, есть ли надобность бэкапить как-то ноды ЗК?
-
бекапить их особого смысла нет. Бекап вряд ли пригодится, нельзя получить последнюю секунду состояния ZK из бекапа.
У вас 3 ноды ZK , они все 3 содержат одинаковые данные / хранят снепшоты + логи.
Любой ноды из 3 достаточно для восстановления ансамбля -
я вот читал, что для оптимальной вставки, нужно использовать большой батч(500к-1млн записей в блоке данных), это правило распространяется на один инстанс КХ? если так, то для нод 30 в кластере, можно будет 15млн на каждый батч?
-
есть условно простое правило - вставки в одну ноду не должны быть чаще чем раз в 1 сек
-
хочу для себя понять, если в пуле скопится большое кол-во строк(в связи с непредвиденными обстоятельствами), на сколько большой блок данных сможет принять кластер
-
-
-
все сильно зависит от ширины строк, от строк кол-ва за день, от требований к надежности / атомарности.
-
Joined.
-
вопрос не имеет смысла. Какую проблему решаете?
-
можно записывать результат в одну таблицу , читать конечно через 2 ENGINE = Kafka(
-
Посмотрел доклад, хорошо. Много знал, но есть и новые фишки. Счас потыкаю базу. Спасибо!
-
Вот кстати вопрос. Что лучше (быстрее-проще-дешевле) Сразу инсертить в суммари таблицу или инсертить в движок нулл, а с него в суммари мат.Вью?
Вроде как через null представляется лучше - сразу пойдет групировка и не надо "схлопывать" потом. Или это увеличивает стоимость инсертов и они у меня в очередь выстроятся из-за группировки? -
Опубликован changelog для релиза 21.1:
https://github.com/ClickHouse/ClickHouse/blob/master/CHANGELOG.mdClickHouse/CHANGELOG.md at master · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
🔥 теперь можно реализовать более эффективные клиенты/адаптеры, используя gRPC
-
Подскажите пожалуйста, про какой докдад речь?
-
Denny Crane [Vertica DBA at Revjet(NB,Canada)] in ClickHouse не тормозит
посмотрите мой доклад https://youtu.be/1LVJ_WcLgF8?t=7596 https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf
-
Спасибо большое
-
ребилд рейда закончился?
-
Закончился. Я ещё пару особенностей заметил в логах, сейчас скину
-
2021.01.18 00:00:00.943698 [ 3531 ] {} <Error> default.visits_local: DB::BackgroundProcessingPoolTaskResult DB::StorageReplicatedMergeTree::queueTask(): std::exception. Code: 1001, type: fmt::v7::format_error, e.what() = argument not found, Stack trace (when copying this message, always include the lines below):
Таких сообщений тьма в логах. При чем появляются как по крону, хотя, конечно, никакого крона или прочих сервисов отродясь не было и нет
sudo cat /opt/clickhouse/log/clickhouse-server.log | grep "BackgroundProcessingPoolTaskResult" | cut -d ' ' -f1-2 | sed 's/:[0-9]*:[0-9]*.[0-9]*$//g' | uniq -c
11054 2021.01.10 00
7809 2021.01.11 00
1817 2021.01.12 00
5097 2021.01.13 00
16041 2021.01.14 00
18263 2021.01.15 00
20 2021.01.15 04
2 2021.01.15 12
781 2021.01.16 00
1376 2021.01.16 04
98 2021.01.16 08
2714 2021.01.17 00
2103 2021.01.17 04
1331 2021.01.17 08
13686 2021.01.18 00
531 2021.01.18 04
262 2021.01.18 08
Ровно в 00 часов, 4'ый час и 8'ой -
это ничего не значит, мелкий баг
https://github.com/ClickHouse/ClickHouse/issues/17613format error, argument not found · Issue #17613 · ClickHouse/ClickHouse(you don't have to strictly follow this form) Describe the bug a lot of background logs of thar error, constantly, on different tables How to reproduce from 20.3 -20.11.4.13 Expected behavi...
-
Отставание стали происходить тоже только ночью в 12 по utc. Но потом спустя пол часика разгребание replicas_queue разгребается и всё становится нормально
-
Одним легче. Но мы всё равно запланировали обновление до 21 завтра
-
какая версия сейчас?
-
жесть, стальные даже алмазные яйцы
-
┌─version()─┐
│ 20.11.3.3 │
└───────────┘ -
Скорее сильное желание чинить кластер ночью
-
ну и обнавляйтсь до 20.11.6.6
-
Оке, в любом случае отпишу помогло или нет, буду копать дальше
-
Denny, так что насчет:
Что лучше (быстрее-проще-дешевле) Сразу инсертить в суммари таблицу или инсертить в движок нулл, а с него в суммари мат.Вью?
Вроде как через null представляется лучше - сразу пойдет групировка и не надо "схлопывать" потом. Или это увеличивает стоимость инсертов и они у меня в очередь выстроятся из-за группировки? -
Обычно <insert> -> null -> mv -> <target> используют для "приведения" данных к должному виду таблицы.
Но нет гарантии, что дубликаты будут в одном инсерте (а ведь он ещё на парты может делиться).
Имхо если вы не протестируете на своих данных, вы так только размажете логику, не получив никаких плюшек. -
ну в этом случае MV+Null
можно и тоже самое сделать через input function, просто в insert -
-
логика - мне не нужны исходные данные, достаточно хранить суммированные
-
вопрос - где делать суммирование - в MV или Summ Eng таблице
-
в MV
-
меньше строк, меньше i/o , все быстрее
-
т.е. insert null -> MV -> dest табл
-
спасибо
-
очень удобен кстати синтаксис МV, который через TO. МНе сейчас просто надо создать нулл табл и перекинуть вставку в существующий Суммари.
-
https://github.com/ClickHouse/ClickHouse/pull/18112
а суть этого только чтобы они не висели в памяти постоянно, а только грузились во время запроса?
или там появился новый хеш которые ест меньше места в памяти?Use IDisk in Set and Join storages by GrigoryPervakov · Pull Request #18112 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the cha...
-
Как я понимаю, что бы можно было указать диск отличный от default
-
а, понятно, те что для чтения при загрузке...
-
-
ОMG... неужто без ЗК можно будет жить?
-
❤️
-
- 19 January 2021 (185 messages)
-
простите, но мы 3 года назад использовали КХ без ЗК :) правда не в кластере
-
Простите, а зачем кх не в кластере зк?
-
бывают случаи когда надежности безкластерного решения достаточно. ну или отказоустойчивость обеспечена другими методами
-
Не об этом вопрос был
-
-
Joined.
-
А подскажите для ручного удаления реплики по прежнему достаточно почистить один путь к ней в зк ?
-
-
uniq?
-
uniq оно как я понимаю просто количество уникальных элементов выдаст, а нужно количество переходов между значениями. Значния могут быть разные, в том числе и дубли могут быть, а нужно посчитать сколько раз они менялись за указанный период
-
c runningDifference можно поиграться
-
да я вас понимаю, и судя по тому что вы гвоорите ваша задача сводится к подсчету уников, разве нет?
-
или вы про переход между 1 0 или 1 2
-
2 перехода верно?
-
через neighbor *но он подглючивает
или в array и колдовать... -
если так то человек выше верно подсказал runningDifference будет рабоатть, но осторожно, работает по блоку данных
-
1-0 это один переход, 0-1 - второй, 1-2 - третий, допустим еще добавился 2-0 - это четвертый переход. И строки заранее отсортированы
-
тада runningDifference вполне подойдет
-
Спасибо! буду разбираться
-
-
пример таблицы пжз
-
1;2020-01-01 00:00:00
2;2020-01-01 01:00:00
1;2020-01-01 02:00:00
2;2020-01-01 03:00:00
1;2020-01-01 04:00:00
1;2020-01-01 04:15:00
2;2020-01-01 06:00:00
ожидаемый результат
1) 4
2) 2 -
-
-
Посоветуйте плз web gui для клика. Tabix уже сильно отстал.
-
-
-
clickhouseip:8123/play
-
There is no handle /play
Use / or /ping for health checks.
Or /replicas_status for more sophisticated health checks. -
хм, значит в какой-то новой версии появилось. у меня 20.11.3.3
-
https://redash.io/help/data-sources/querying здесь нету клика, да.
-
DataGrip мне нрав. Не web правда
-
спрятался навеное
https://redash.io/data-sources/clickhouse -
@glader_ru , кстати, в документации ещё есть подборка
https://clickhouse.tech/docs/ru/interfaces/third-party/gui/Визуальные интерфейсы от сторонних разработчиков | Документация ClickHouseВизуальные интерфейсы от сторонних разработчиков С открытым исходным кодом Tabix Веб-интерфейс для ClickHouse в проекте
-
О, спасибо, слона-то я и не заметил :)
-
-
-
Еще раз спрошу, может кто подскажет. Есть таблица
user_id | event | time_event
1| start | 2021-01-18 09:20:00
1| ev1 | 2021-01-18 09:37:00
1| ev2 | 2021-01-18 09:58:00
1| exit | 2021-01-18 10:11:00
2| start | 2021-01-18 10:02:00
2| ev1 | 2021-01-18 10:37:00
Как подсчитать, что за определенное время (например, 1 час), пользователь успевает сделать больше 3х событий.
Пытаюсь делать таким запросом
SELECT toStartOfInterval(time_event, INTERVAL 1 HOUR) AS time, user_id, COUNT(*) AS cnt
FROM table
GROUP BY time, user_id
HAVING COUNT(*) > 3
Но в этом случае промежуток времени это час с 00:00 до 00:59, а не от первого события отсчитывается. Может кто сориентирует как правильно сделать? -
Я считал через runningDifference. Предварительно отсортировав по дате изменения статуса.
-
на редаше остановился тоже
-
а примерчик какой нить можно?
-
Ну решение такое себе, если честно. С точки зрения статических таблиц ещё ок, ну и внутренних отчетов с натяжкой тоже, но как общее для большой компании, лучше посмотреть что то ещё
-
добрый день, есть ли какое-то поле, отвечающее за последний timestamp чтения из таблицы в КХ?
-
А просили же другое
-
ничего другого адекватного не нашел, аналитики пользуются и не пикают. хотя очень не хватает возможности ограничений доступа не только по датасорцам
-
еще бы по колонкам нагрузку както оценить, есть гдето такие статы?
-
Тут однозначно бобр! Лучшее из того, что находил, любовь почти с первого взгляда
-
нагрузку это... частота обращения? размер?
-
-
частота обращения в первую очередь
-
-
-
Наверно нельзя, другой короткий вопрос, в КХ можно указать строкой таймзону типа Europe/Moscow. D формате 2021-01-19T13:47:00+03:00 кх не читает, а можно как то указать смещением? Или нужно считать вручную прибавляя нужное значение к DateTime?
-
сейчас попробую наклепать.
-
SELECT
s,
d,
runningDifference(d) AS insec
FROM
(
SELECT *
FROM
(
SELECT
s,
d
FROM t
ORDER BY d ASC
)
ORDER BY d ASC
)
┌─s─┬───────────────────d─┬─insec─┐
│ 1 │ 2021-01-19 11:05:13 │ 0 │
│ 2 │ 2021-01-19 11:08:25 │ 192 │
│ 1 │ 2021-01-19 11:08:36 │ 11 │
│ 3 │ 2021-01-19 11:08:46 │ 10 │
└───┴─────────────────────┴───────┘ -
а зачем тут двойная выборка и сортировка одинаковая?
-
-
-
-
-
-
да, конечно еще юзерид будет
-
причем блоки данных видны только в родном клиенте. раньше когда не было попыток учесть все возможные переводы строк - самый лучший вариант был. запросы писал в notepad+, а потом копипастил портянки в клиент.
-
я в vscode пишу, внизу консоль открыта с залогиненым клиентом и по cmd-shift-r выполняю)
-
-
Всем привет!
Не пропустите первый ClickHouse митап в этом году: https://www.eventbrite.com/e/clickhouse-january-virtual-meetup-office-hours-tickets-128555676489
Как обычно, поговорим о всяких новых фичах и планах на год. Если есть желание выступить с коротким докладом — пишите на info@altinity.com или мне в личку.ClickHouse January [Virtual] Meetup - Office HoursJanuary Meetup for the ClickHouse Community
-
None
-
-
-
10 вечера по Москве
-
-
-
Шутки за 100?
-
-
Спасибо)
-
да и даже есть system drop replica
-
да, через ArrayDifference/ArraySplit
-
О гляну завтра, раньше не было. Как всегда больше вам спасибо.
-
через массивы.
давайте create table / insert мне лень вашу табличку оборачивать в insert самому -
что такое "последний timestamp чтения" ?
-
Да, спасибо. С ArrayDifference всё получилось.
-
Является ли результат запроса
SELECT max(elapsed) FROM system.processes
максимальным временем выполнения запроса? -
Имеется в виду, когда в последний раз запрашивали таблицу как объект. Я в принципе пропарсил query log, но может есть более простой способ
-
нету, только query log
-
Спасибо
-
в данный момент.
system.processes -- отражает текущее состояние, иначе см. query_log -
в данный момент и нужно)
спасибо! -
Всем привет! Делаю attach файлов на части партиций вылетает такая ошибка "Attempt to read after eof " версия КХ 20.12.5.14
А вкратце делали detach на одном сервере, переносили файлы на другой и сделали attach. По одной таблице вылетает такая ошибка. 10 таблиц перенеслись без проблем.
Что посоветуете сделать? -
>делали detach на одном сервере
версия КХ у одного сервера? -
нет, версии разные
-
какая версия у исходного?
-
20.11.3.3 с этой переезжали
-
плюс переезжали с виртуального на физический, если это важно
-
в таблице есть поля LowCardinality(Nullable ?
-
да, Nullable поля имеются
-
блин, ну я не это спросил, что за идиотизм кругом, люди, что вы делаете
-
EOF from detectDefaultCompressionCodec start happening between v20.8.2.3 and v20.13.1.1? · Issue #18340 · ClickHouse/ClickHouse
I tried to upgrade ClickHouse from v20.8.2.3 to v20.13.1.1 but there are some errors while reading a merge_tree table.. Error Messages: 2020.12.22 11:19:36.084760 [ 20114 ] {} <Error>...
-
не, таких полей нет
-
а trace из КХ лога покажите
-
Вы правы, это был мой "крик боли". нам нельзя было ЗК а кластер хотелось
-
Всем привет! Кто работал с движком Buffer - как много строк ставили как max_rows ? По опыту в MergeTree 20к строк хорошо пачкой вставляется, из буфера вставлять можно ли тысяч по 100?
-
А данные критичные ?
-
Да
-
терять не хочется
-
Тогда лучше не надо
-
По докам даже на дроп таблицы буфер сбрасывается нормально же
-
Или были случаи с буфером плохие?
-
Буффер хранит данные в оперативке, этого хватит
-
Я для критичных данных вообще буффер не использывал бы
-
ну, при краше сервера потерять секунды 2-3 таких данных не критично
-
главное чтобы они не терялись в процессе нормальной работы)
-
Если конфиги норм, не вижу проблемы
-
Тогда попробуем
-
сейчас просто пишу в редис маленькими пачками и потом пачками побольше в кликхаус, с буфером надеюсь убрать один шаг и писать прямо в него мелкими пачками
-
А какой рпс ?
-
2к
-
то есть по плану буфер на 6 секунд и 24к строк
-
А, ну это совсем не много
-
Ребята
если я вижу в
select * from system.metrics;
ZooKeeperSession = 2
* Number of sessions (connections) to ZooKeeper. Should be no more than one, because using more than one connection to ZooKeeper may lead to bugs due to lack of linearizability (stale reads) that ZooKeeper consistency model allows.
это вообще проблема?
в конфиге вроде ничего сверхъестественного:
<zookeeper>
<node>
<host>10.X.X.2</host>
<port>2181</port>
</node>
<node>
<host>10.X.X.3</host>
<port>2181</port>
</node>
<node>
<host>10.X.X.4</host>
<port>2181</port>
</node>
<node>
<host>10.X.X.5</host>
<port>2181</port>
</node>
<node>
<host>10.X.X.6</host>
<port>2181</port>
</node>
<session_timeout_ms>30000</session_timeout_ms>
</zookeeper> -
-
Вопрос в вакууме, раз такое сделали, логично что для буффера свои кейсы
-
У меня через буффер. 200 серваков льют в него пачечками, он в одну. Про размер правде не скажу. Но тысячи точно. Вроде живет
-
а если альтерить таблицу - убиваете буфер, альтерите, создаете буффер?
-
да
-
это ж быстро
-
и при смерти она сбрасывает буфер ок?
-
Ну тогда прям выглядит как хорошая штука этот буфер
-
Joined.
-
-
До 10-15 к рпс +- норм, дальше думаю уже риск
-
Речь про одну машину
-
Вопрос скорее в том, есть ли там скрытые подводные камни. Понятно что оно должно умещаться в памяти, что-то ещё? Лимит по конкаренси - 10К рпс тянет, а 50-100, например?
-
Ну судя по доке - да
-
остается надеться ))
-
Если мы говорим про 1 машину, потянет столько, сколько хватит скорости оперативки. Явный минус это потеря данных, при краше
-
Вообще лить 50-100 к рпс на одну машинку синхронно проблемно
-
в памяти - да, буыер не на диске - потому и потеря при краше сервера. Но при его краше - обойтись только потерей буфера - это удача )) Не надо чтоб крашился и все
-
Вообще краш в наши дни с норм админами редкость, но не исключено
-
100k tcp запросов ? 100k http ? это проблема для tcp, оверхед на tcp/http
-
Как понимаю, в вопросе уже решена проблема с сетью
-
есть еще кто-то писоал софтинка на go - буферит, а потом на КХ. Забыл название
-
bulk insert
-
у меня вчера в хецнере сервер 7 раз перезагрузился
-
Да, наверное 100к рпс я хватанул:) столько наверное суммарно во все шарды будет
-
Хмм, я думал они надежные
-
просто желзка заглючила
-
Я кх в проде под хайлоад где то больше полу года использую, не разу проблем с железом не было, чтоб сервер упал
-
Посмотрел свои данные - гдето 200-300К строк в минуту. Со всех серверов. Держат буфер, не жужжит
-
Ну это +- 5 к рпс, я тестил с танком 10 к, вроде было норм
-
но да, 3-5 в сек выходит
-
Интересно, а это на одну машину ?
-
это в один КХ со всех отправителей
-
100-200 трудяг льют свои данные
-
Добрый день!
Помогите пж разобраться с применимостью КХ для задачи выборки воронок состояний.
Если упростить, то есть записи (datetime, objectid, status), объемы большие, модели перехода из статуса в статус для разных объектов могут отличаться.
Воронка состояний в данном случае - некий заданный статусный путь из статуса 1 в статус N
Именно ее агрегаты нужно будет показывать в отчетности/BItools.
Выборка идет за период (например, выбранный месяц) относительно статуса1, основной нюанс в том, что просто взять и проагрегировать данные по каждому статусу - некорректно, нужно для каждого objectid смотреть его прохождение по выбранному статусному пути, т.е. фактически получается так (опять же упрощая):
всего было объектов в статусе 1 - из них перешло в статус 2 - из них перешло в статус 3 - ... - из них перешло в статус N
при этом datetime для статус 1 и статус N может отличаться в теории на пару лет, на год точно.
отсюда несколько вопросов:
1. насколько это вообще тема для КХ?
2. если вполне себе, то как быть с индексом? удастся ли обойтись одной таблицей?
3. сама задачка выборки подобной воронки - тоже вопрос. не подзапросами же такое решается)
в голову приходит первым шагом вытащить по datetime и status = статус1 все объекты, а потом уже по самим objectid анализ статусного пути делать. но если таблица одна и индекс один сомнительно что это будет эффективно. а делать например 2 таблицы для одного и того же (но с разными индексами) кажется избыточным. первые мысли такие. -
А не сложно обрабатывать так много данных ? Почему не шарды ? Там же таблицы очень быстро распухнут до огромных размеров
-
нет, там суммари сразу стоит
-
каждый клик не храню
-
партиции по дням, да есть
-
ну ширина строк у всех разная, тут в чатике есть пользователи с триллионами строк в таблицах и миллионами в секунду
-
ну и история не нужна. Деньги на период получены - дроп партишен...
-
Joined.
-
sequenceCount
windowfunnel
https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/parametric-functions/#windowfunnel
массивы (groupArray)
>1. насколько это вообще тема для КХ?
и да и нет, для очень сложных воронок затруднительно
>2. если вполне себе, то как быть с индексом? удастся ли обойтись одной таблицей?
никакие индексы тут не помогут, прямо по таблице ивентов считают.
если воронки (условия переходов) статичные то это надо считать до заливки в КХ или вообще тогда КХ не нужен -
Кстати вот по поводу миллионов - допускаю что сохранить КХ сохранит. А как бегать по этим триллионам собирая отчеты? Или все решается раскладками по суммари таблицам с группировками по Час-День-Месяц..?
-
Можно добавить, что если данных много, то прикольно, если их можно пошардировать и использовать distributed_group_by_no_merge=1.
Индексы тоже могут быть полезны. Но тут зависист от типа воронки.
Например если есть что-то вроде
windowFunnel(10000)(time, eventType=A, eventType=B)
то можно в WHERE добавить eventType IN (A,B) и тогда будет прочитано меньше данных. Но такую оптимизацию можно делать не всегда.
И в погоне за воронками надо не забыть не сломать общую логику индексов в ClickHouse. Например не сделать слишком гранулярный индекс. -
странные вопросы. Не устраивает скорость селектов, шардируйте - оптимизируйте. У меня некоторые запросы выполняются 40 минут. Это устраивает кастомеров, проблемы нет.
Пользователи с триллионами строк не делают селектов. Представьте вы льете 5 тыс метрик с сервера, с 10ти тысяч серверов, ну не надо вам смотреть температуру жесткого диска на всех серверах, только в случае какого-то ресерча, вы смотрите конкретную метрику -
SET allow_introspection_functions = 1
WITH arrayMap(x -> demangle(addressToSymbol(x)), trace) AS all SELECT thread_id, query_id, arrayStringConcat(all, '\n') AS res FROM system.trace_log LIMIT 1
Вы про это имели ввиду? -
clickhouse-server.log или clickhouse-server.err.log
-
-
2021.01.19 17:20:03.309854 [ 12994 ] {63e4ef56-6e6c-47c9-a775-731b4bd6c097} <Error> executeQuery: Code: 32, e.displayText() = DB::Exception: Attempt to read after eof (version 20.12.5.14 (official build)) (
from [::ffff:78.25.99.99]:59151) (in query: ALTER TABLE DataGVSBase ATTACH PARTITION 202002), Stack trace (when copying this message, always include the lines below):
0. DB::throwReadAfterEOF() @ 0x7d9f87d in /usr/bin/clickhouse
1. ? @ 0x7dc0aed in /usr/bin/clickhouse
2. DB::DataTypeString::deserializeBinary(DB::IColumn&, DB::ReadBuffer&) const @ 0xd953e95 in /usr/bin/clickhouse
3. DB::IMergeTreeDataPart::loadIndex() @ 0xe4835bf in /usr/bin/clickhouse
4. DB::IMergeTreeDataPart::loadColumnsChecksumsIndexes(bool, bool) @ 0xe481002 in /usr/bin/clickhouse
5. DB::MergeTreeData::tryLoadPartsToAttach(std::__1::shared_ptr<DB::IAST> const&, bool, DB::Context const&, DB::MergeTreeData::PartsTemporaryRename&) @ 0xe4df16d in /usr/bin/clickhouse
6. DB::StorageMergeTree::attachPartition(std::__1::shared_ptr<DB::IAST> const&, std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, bool, DB::Context const&) @ 0xe2b98f8 in /usr/bin/clickhouse
7. DB::MergeTreeData::alterPartition(std::__1::shared_ptr<DB::StorageInMemoryMetadata const> const&, std::__1::vector<DB::PartitionCommand, std::__1::allocator<DB::PartitionCommand> > const&, DB::Context co
nst&) @ 0xe4d827c in /usr/bin/clickhouse
8. DB::InterpreterAlterQuery::execute() @ 0xdd0901a in /usr/bin/clickhouse
9. ? @ 0xe060347 in /usr/bin/clickhouse
10. DB::executeQuery(DB::ReadBuffer&, DB::WriteBuffer&, bool, DB::Context&, std::__1::function<void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::b
asic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char,
std::__1::char_traits<char>, std::__1::allocator<char> > const&)>) @ 0xe063377 in /usr/bin/clickhouse
11. DB::HTTPHandler::processQuery(DB::Context&, Poco::Net::HTTPServerRequest&, HTMLForm&, Poco::Net::HTTPServerResponse&, DB::HTTPHandler::Output&, std::__1::optional<DB::CurrentThread::QueryScope>&) @ 0xe6
e1148 in /usr/bin/clickhouse
12. DB::HTTPHandler::handleRequest(Poco::Net::HTTPServerRequest&, Poco::Net::HTTPServerResponse&) @ 0xe6e4385 in /usr/bin/clickhouse
13. Poco::Net::HTTPServerConnection::run() @ 0x10eb55f5 in /usr/bin/clickhouse
14. Poco::Net::TCPServerConnection::start() @ 0x10eebb1f in /usr/bin/clickhouse
15. Poco::Net::TCPServerDispatcher::run() @ 0x10eed531 in /usr/bin/clickhouse
16. Poco::PooledThread::run() @ 0x1101ab09 in /usr/bin/clickhouse
17. Poco::ThreadImpl::runnableEntry(void*) @ 0x11016a9a in /usr/bin/clickhouse
18. start_thread @ 0x7fa3 in /usr/lib/x86_64-linux-gnu/libpthread-2.28.so
19. clone @ 0xf94cf in /usr/lib/x86_64-linux-gnu/libc-2.28.so -
так похоже парт битый. Вы с выключенного КХ парт забрали? Или через FREEZE ?
-
делали detach но в КХ не писали новых данных
-
-
может в этот момент merge был конечно
-
в смысле detach table ? тогда мержа не было
-
-
detach партиций по всей таблице
-
и потом из папки detached скопировали?
-
да, копировали на новый сервер и там уже attach
-
может во время копирования побились, rsync-м копировали?
-
да, им
-
но вроде кол-во и размер файлов совпадал
-
а на старом сервере атачится назад?
-
уже нет, тоже эти файлы выдают ошибку
-
Приветствую.
Спасибо за решение @tkostyan.
Пытаюсь использовать это для alembic миграций, но в миграцию не подтягивает значение engine (елси же нужные строки туда дописать руками - сама миграция получается рабочая).
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('another_rate_2',
sa.Column('day', clickhouse_sqlalchemy.types.common.Date(), nullable=False),
sa.Column('value', clickhouse_sqlalchemy.types.common.Int32(), server_default=sa.text('1'), nullable=True),
sa.Column('model', clickhouse_sqlalchemy.types.common.String(), nullable=True),
sa.Column('dt', clickhouse_sqlalchemy.types.common.DateTime(), server_default=sa.text('now()'), nullable=True),
sa.PrimaryKeyConstraint('day')
# engine должен быть где-то здесь : (
)
…
хотя в самой модели engine указан
another_table_2 = Table('another_rate_2', metadata,
Column('day', types.Date, primary_key=True),
Column('value', types.Int32, server_default=literal(1)),
Column('model', types.String),
Column('dt', types.DateTime, server_default=func.now()),
Column('dt3', types.DateTime64(3), server_default=func.now()),
# Column('dt2', types.DateTime64(2), server_default=func.now()),
engines.ReplicatedMergeTree(
'/clickhouse/tables/{layer}-{shard}/another_rate_2', '{replica}',
partition_by=func.toYYYYMM(Column('dt')),
order_by=('value', 'model')
)
)
Если в созданную миграцию его дописать руками, миграция работает.
В alembic env.py использовал такой код для задания диалекта
class CustomDialectImpl(impl.DefaultImpl):
dialect = "clickhouse"
transactional_ddl = False -
Да, engine пока туда не будет подтягиваться. Сейчас это одно из ограничений, которое возможно получится обойти
- 20 January 2021 (202 messages)
-
Есть пример создания индекса уже на готовой таблице?
-
Joined.
-
Как для этой таблицы добавить составной индекс для s_company_id
-
-
Кто-то использовал mongodb engine? Как доставать данные из вложенных документов?
-
Исправить на
Order by id, s_company_id -
Менять ключ нельзя, в кх только кластерный индекс определяющий порядок строк. Скип индекмы есть но это другое
-
I we are trying to connect clickhouse with Tableau Server linux
we are getting below error
——————————————————————————————————————————————————————
while connecting tableau with clickhouse we are getting below error
[unixODBC][Driver Manager]Can't open lib '/usr/local/lib/libclickhouseodbc.so' : file not found
Generic ODBC requires additional configuration. The driver and DSN (data source name) must be installed and configured to match the connection.
Unable to connect using the DSN named "ANANTH DB". Check that the DSN exists and is a valid connection.
—————————————————————————————————————————————————————————————-
https://github.com/ClickHouse/clickhouse-odbc
we installed clickhouse-odbc
Driver = /usr/local/opt/clickhouse-odbc/lib/libclickhouseodbc.so
# Optional settings:
#server = localhost
#password = xxxxxx
#port = 8123
#database = default
#uid = default
#sslmode = requireGitHub - ClickHouse/clickhouse-odbc: ODBC driver for ClickHouseODBC driver for ClickHouse. Contribute to ClickHouse/clickhouse-odbc development by creating an account on GitHub.
-
Добрый день,
подскажите пожалуйтса, как лучше сделать партиционирование. У меня есть данные (список событий), которые хранятся до года, в день записывается порядка миллиона событий, и это количество по чуть-чуть растет. Сначала думал использовал партиционирование по месяцу, но сейчас задумался, не будет ли правильнее делать партиционирование по дню? -
клик ругается когда создаешь более 100 партиций на одну таблицу. у меня около 1500000 в день событий, партиционирование по месяцу - полет нормальный
-
спасибо! читал в документации что до 1000 патриций можно, видимо неправильно посчитал нули 😄
-
-
в документации - вот что:
Не рекомендуется делать слишком гранулированное партиционирование – то есть задавать партиции по столбцу, в котором будет слишком большой разброс значений (речь идет о порядке более тысячи партиций). Это приведет к скоплению большого числа файлов и файловых дескрипторов в системе, что может значительно снизить производительность запросов SELECT. -
у меня просто есть выборки по дням, вот я и задумался
-
-
-
-
-
ок, супер, спасибо
-
Это можено изменять через настройку max_parts_in_total, стандартное значение 100000 (https://github.com/ClickHouse/ClickHouse/blob/2c71b997de3f49de80802ced4dd19787f344486a/src/Storages/MergeTree/MergeTreeSettings.h#L58)ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
спасибо, буду знать. Поэксперементирую на досуге
-
-
Встроенным в ide от jetbrains
-
Пользуюсь dbeaver, он кроссплатформенный
-
notepad++ putty ClickHouse client version 20.8.5.45 (official build).
-
это что за зверь?
-
текстовый редактор + командная строка, большие портянки писать - самое то, другие окна не мешают. + можно на отдельные экраны разнести, когда совсеммного писать
-
Добрый день! Может кто-нибудь подсказать сколько раз будет вычиляться функция arrayFirst(m -> m != '', reverse(groupArray(mailing_result))) в этом запросе?
SELECT arrayFirst(m -> m != '', reverse(groupArray(mailing_result))) as last_mailing_result
FROM log_record
having arrayFirst(m -> m != '', reverse(groupArray(mailing_result))) LIKE 'хорошо'; -
Здравствуйте!
Помогите, пожалуйста, советом
Есть таблица ReplacingMergeTree
CREATE TABLE table_arrays(id UInt32,docs Array(UInt32)) ENGINE ReplacingMergeTree() ORDER BY id;
И я вставляю данные
INSERT INTO table_arrays
VALUES (1000, [1,2,3]), (1001, [3,4,5]);
INSERT INTO table_arrays
VALUES (1000, [1,4]);
Можно ли сделать так, чтобы после схлопывания или во время вставки, массивы объединялись по ключу сортировки (id)
Сейчас
select * from table_arrays;
┌───id─┬─docs────┐
│ 1000 │ [1,2,3] │
│ 1001 │ [3,4,5] │
└──────┴─────────┘
А нужно
┌───id─┬─docs────┐
│ 1000 │ [1,2,3,4] │
│ 1001 │ [3,4,5] │
└──────┴─────────┘ -
Коллеги привет, пробуем обновиться на последний стэйбл - 2021.01.20 12:36:40.356251 [ 74546 ] {} <Error> Application: DB::Exception: No macro 'shard2017' in config while processing substitutions in '/clickhouse/tables/{shard2017}/dnl_int_dnl_log_local' at '20' or macro is not supported here: Cannot attach table dnl_int
-
-
-
1
-
А можно ненмного поподробней? Каким образом это работает или мб в документации это где-то описано?
-
Можно ли добавлять индексы группировки после создания таблицы?
-
Доброго времени суток, обнаружилась проблема с INSERT в ReplicatedSummingMergeTree (1 шард - 2 реплики).
при INSERT с такими же значениями (даже через большой интервал времени в несколько часов) этот INSERT "игнорируется" в сумме, хотя и выполняется без ошибок.
Это так работает удаление дубликатов?
SELECT version()
20.12.5.14 -
-
куда добавлять?
-
может кто сталкивался? (если не любите null, то должны)). https://clickhouse.tech/docs/ru/operations/settings/settings/#settings-input-format-null-as-default работает только при указании, как флага при подключении. если указывать в конфиге (табличка system.settings изменяется), то не работает. :) это так и должно быть?Настройки | Документация ClickHouse
Настройки distributed_product_mode Изменяет поведение распределенных подзапросов. ClickHouse применяет настройку в тех с
-
Создавать для таблицы. Например нужен индекс на (дата, идентификатор компании) потом может понадобиться создать (дата, идентификатор города) или (дата, идентификатор хоста)
-
сначала groupArray - получается одна строка. на ней уже expression
-
там добавлять к индексу поля можно было. а вот менять порядок или изменять точно нет. данные сортированные лежат в файлах и добавление поля к индексу - не сильно сломает. а новый порядок - это полностью перебрать все данные. тоже самое - делайте руками и управляемо
-
-
Joined.
-
Всем привет.
Подскажите, пожалуста, как правильно обновиться с 19 на 20 CH, если он крутится в докере (данные и конфиг, конечно - снаружи контейнера):
- можно просто скачать новый базовый образ и новый контейнер поднять (подмонтировав теже данные и при необходимости подпилить конфиг, если он стал несовместим)?
- или во время обновления что либо еще делается, кроме замены бинарника/либ - с данными/метаданными/системными таблицами? и тогда нужно внутри контейнера запустить апдейт? -
в логах нашли Block with ID 202101_2180591676372156159_10680116372015693460 already exists locally as part 20210119_20210119_89_89_0; ignoring it.
как с этим бороться? -
Добрый день.
Мы апдейтились просто заменой версии контейнера, конкретно на 20.3 версию, фолдеры с данными просто подмонтировали на новый контейнер и все поднялось.
Но тут надо смотреть именно по использованию (changelog глянуть для 20.3 версии) так как там есть изменения по использованию. Конкретно у нас были какие то нюансы с JOIN если я правильно помню -
-
-
-
Для чего вам категории? это справочники?
-
Да, это справочники
-
Есть иеархические словари
-
структуру данных надо делать такую, чтобы удобнее было джойнить на основные данные. кх не предназначен для update - поэтому все update через полное обновление, через insert и группировкой перед join. или внешние справочники, которые или в другой БД, или в файле на диске. внешние справочники подключаются через create dictionary. структуру иерархическую или нет - вы сами должны определить, как вам удобнее (если неудобно, то view написать и словарь на него сделать, если удобно, то есть иерархические словари).
-
-
-
Привет
По использованию цпу ишью все-еще со мной
(КХ апдейт 20.4.3 > 20.12.4)
* у меня есть овер-партицированные по меркам КХ таблицы - как понимаю именно в этом главный импакт на "фон" - с этим буду решать конечно но надеялся отложить на "чуть позже"
** стораж-полисей и пережатия не декларировал и в system.merges / процесслисте / мутациях чисто +- и обычного для ситуации дискового оверхэда не вижу
*** хотелось бы без рестарта понять в том ли направлении копаю
**** кластера без реплик - только шарды
проверяю теорию про бэкграунд-процессы (именно background_schedule_pool смущает): то что алгритм который выбирает/проверяет "нужно ли что-нибудь сделать" отъедает много цпу в моменте именно инициализации - т.е. чекнуть "что делать и есть ли что в принципе"
***** подчистка мусора в таблицах/партишках чуть снизила "фоновую загрузку" цпу, но она на текущий момент все-равно ~33% → ~25%
вопросы:
1 - background_schedule_pool tasks это какие? *у меня все таблицы - простые MergeTree, т.е. в моём случае только рефрэш DNS и rm старых партов?
2 - есть ли какой-то SYSTEM STOP XXX для проверки теории↑ ? Не нашел подходящего на https://clickhouse.tech/docs/en/sql-reference/statements/system/#query-language-system-mergetree но эт ведь не всегда показатель)
2.1 - если я для теста накидывю разных "SYSTEM STOP ... db.table" - где потом я смогу увидеть все текущие (действующие) запреты?
3 - может ли мне тюнинг чего-то из system.merge_tree_settings помочь в сабже (например number_of_free_entries_in_pool_to_lower_max_size_of_merge приопустить)? -
-
-
-
-
с которой у нее селект? Или в которую пишет
-
Из которой селект
-
ПО идее - да. ИНсерта ж нет
-
но для 100% надежности - можно отключить (или детачнуть)
-
Joined.
-
Joined.
-
Вопрос, нашел опечатки в документации (если тупо скопировать код и вставить то КХ не поднимется). Не подскажите куда issue создать?
-
Issues · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Спасибо.
Просто уточнил, так как там есть репозиторий https://github.com/ClickHouse/readthedocs-stub
Сейчас создамClickHouse/readthedocs-stubContribute to ClickHouse/readthedocs-stub development by creating an account on GitHub.
-
А кто то уже пользовался параметром default_replica_path и default_replica_name? Не подскажите с какой версии КХ он работает? В changelog найти не могу инфу...
-
Joined.
-
сам кх стартует то?
> Вот такая ошибка при перехапуске: -
Нет не стартует вообще, ошибка и всё
-
Мутации запускали?
-
смотрите то что ДО этой ошибки
-
Мутации не запускали, умышленно, не Альтерили, может в коде где-то вылез случайно такой запрос
-
а скиньте весь трейс
-
залейте куда нить на hastebin
-
Можете сделать поиск по метадате (по дефолту /var/lib/clickhouse/metadata/) на наличие "click_transaction_id_tmp_alter4665484246427899840"
-
https://github.com/ClickHouse/ClickHouse/blob/00d240853dff16b9ba5499db612054e6fe04225a/src/Functions/FunctionsConversion.h#L197
я вообще не эксперт, но видимо cast(uuid, ‘uuid’) кидает такоеClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
не можем найти
-
вы точно никакой альтер не запускали ? типа с айдишки в юид
-
UUID в ключе, альтер для UUID точно не запускали
-
А что находится в логах до
<Error> Application: DB::Exception: Conversion between numeric types and UUID is not supported: While processing cast(toUUID(0) AS click_transaction_id_tmp_alter4665484246427899840, 'UUID’)..
Может быть в обычных логах, кх должен писать название таблицы которую присоединяет -
Базу указывает, при чем мы пробовали из метадаты папки этой базы пернести на время, не помогало. Такая же ошибка, но для следующей базы по порядку
-
click_transaction_id_tmp_alter - где такой префикс используете?
-
Вот именно, что нигде такого не используем. В коде нет такого
-
Вот это что-то возвращает? sudo find /var/lib/clickhouse/metadata -name "*.sql" | xargs grep click_transaction_id_tmp_alter
-
Ну хорошо, сколько таблиц в первой базе с ошибкой?
ls -d /var/lib/clickhouse/data/*/*/* | grep mutation -
Может есть какой-то игнорировать какие-то базы (мету переместить чтоли), чтобы вообще он запустился
-
можно добавить к .sql файлам .bak
те .sql.bak -
нет ничего
-
очень много, до пары тысяч
-
> validateColumnsDefaultsAndGetSampleBlock
Судя по этому проблема у какого то DEFAULT значение. -
Но тогда по идее по метаданным должно грепаться
-
click_transaction_id_tmp_alter скорее всего кх на лету генерирует при проверке и на самом деле в default такого не написано
-
А что сделать то? Как это игнорировать?
-
Найти таблицу, точно определить в чем проблема.
Сделать так что бы кх игнорировал эту таблицу при старте (допустим дописать .bak)
Запустить кх, потом подправить DDL если это нереплицированая таблица и сделать ATTACH TABLE -
Joined.
-
Посмотрите выхлоп sudo find /var/lib/clickhouse/metadata -name "*.sql" | xargs grep 'UUID DEFAULT'
-
Где-то там должно быть странное дефолтное значение
-
Даже известно какое кстати: '0'
-
Привет! У нас такая же ситуация после обновления на '21.1.2.15'. Удалось выяснить в чем дело?
-
UUID DEFAULT между ними потенциально что то быть(заменить пробел на любой символ?)
-
Можно сначала погрепать UUID а потом DEFAULT
-
Не помогает, деактивируем одну базу, то же самое ругается на следующей базе по порядку, потом на следующей. 3 базы деактивировали, не в базе дело
-
sudo find /var/lib/clickhouse/metadata -name "*.sql" | xargs grep UUID | grep DEFAULT
-
Да, штук 20 записей:
click_transaction_id UUID DEFAULT toUUID(0) COMMENT 'Click Transaction ID for Conversion', -
Ну вот в них и проблема
-
Во
-
таблицы реплицированные?
-
нет
-
Можете руками исправить скрипты и убрать DEFAULT вообще
тк по дефолту там и так будет 0000-00-00... -
Вроде бы помогло для одной базы, меняем для всех 190 (оказалось). Очень странно, раньше работало это
-
а напишие select cast(toUUID(0), ‘UUID’) - будет работать ? просто инттересно
-
Кх перезагружали с момента создания таблицы?
Какая версия кх?
Если относительно современная то пишите баг репорт, что при создании таблицы дает задать такой дефолт а при запуске кх ничего не поднимается -
на современных версиях не работает
-
у меня прост 20.1, не могу проверить
получаеттся кх сам неявно делает каст дефолта в тип колонки ? -
У нас '21.1.2.15’, делаем апдейты регулярно. Базы созданы были за последние 6 мес
-
| cast(toUUID(0), 'UUID') | version()|
|------------------------------------|----------|
|00000000-0000-0000-0000-000000000000|20.8.10.13| -
Да, скорее всего так проще
Допустим такая ситуация:
col_name UInt32 DEFAULT some_uint8 -
Проще всего любые дефолты оборачивать в CAST
-
я так понял это в 21 + версии
-
SELECT
cast(toUUID(0), 'UUID'),
version()
Received exception from server (version 21.1.1):
Code: 48. DB::Exception: Received from localhost:9000. DB::Exception: Conversion between numeric types and UUID is not supported: While processing cast(toUUID(0), 'UUID'), version(). -
https://clickhouse.tech/docs/en/whats-new/changelog/#clickhouse-release-v21-1-2-15-stable-2021-01-182021 | ClickHouse Documentation
ClickHouse release v21.8, 2021-08-12 Upgrade Notes New version is using Map data type for system logs tables (system.que
-
Expression toUUID(N) no longer works. Replace with toUUID('00000000-0000-0000-0000-000000000000'). This change is motivated by non-obvious results of toUUID(N) where N is non zero.
-
Что-то типа этого случилось?
-
Анонсировано почему-то в 21.1.2.15 а сломалось уже в 21.1.1
-
потому что релиз версия была 20.1.2 а у меня напрямую с мастера гитхаба думаю
-
не, ошибка в другом, в том что каст юида в юид не робит, а эта функция преобразования работает
но вообще странная ошибка) мб чем-то мотивировано, конечно -
И issue в анонсе нет...
-
Почему же?
как раз сама функция и не работает, а каст это уже вторичное -
а не, вы правы
-
да, сори)
-
какой же классный чатик! ❤️
-
Вот отсюда ноги растут https://github.com/ClickHouse/ClickHouse/pull/18749Don't allow conversion between UUID and numeric types by alexey-milovidov · Pull Request #18749 · ClickHouse/ClickHouse
Changelog category (leave one): Not for changelog (changelog entry is not required) Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): See https://click...
-
Блин, ребята, запустилось всё, 4 часа правда данные потеряли( но хотя бы запустилось
-
Дима, Саша, спасибо вам от души
-
Ну, могло быть и неприятнее.
Репликация, тесты на стейдже перед выкатом и вставка через Kafka вас ждет :) -
Уже все, по-любому. Знаете же как оно, вот вот сделаем, еще пару фич и будем инфраструктуру строить. И не успели
-
Тесты на стейдже это да. Мне 1 раза хватило чтобы их запилить 😀
-
Привет.
Вопрос - есть поток событий:
(user_id, time, event)
нужно пользователю в UI быстро показывать события user_id=x и нам для аналитики уметь по time фильтровать.
Лучше, чем две отдельных таблицы с разными PK ведь не получится сделать для этого?
(user_id, time)
(time, user_id) -
Ну а сколько юников user_id, какие у вас обычно используются интервалы для фильтра по time
-
сотни тысяч, могут быть и миллионы
-
если бы uniq(user_id) исчислялся десятками можно было бы оставить как есть time, user_id ?
-
Смотря сколько вообще записей в день
А так если десятки то
(user_id, time) -
понял о чем ты, спасибо
-
МНе вот кажется наоброт надо - time, user_id. дата же всегда нужна. Быстро показать события юзеру - ему ж наверняка надо или последние, или за период. За прошлый год ведь явно не надо?
-
Обычно есть партиционирование по месяцу, те уже больше месяца не будет выбрано.
Плюс селективность по user_id будет лучше чем по datetime. -
+
-
для аналитики все равно пользуемся разрешением месяц и больше
-
нам главное чтобы за 5 лет не читал
-
т.е. при наличии партиц по вреени КХ и без индекса справится?
-
Ну партишн прунниг должен отбросить партиции которые за пределом временного интервала, да
-
интересный вариант. Допилили бы уже explain - сколько бы вопросов отпало сразу )))))
-
Так есть же, даже в 20.8
-
Плюс всегда был
set send_logs_level='trace';
там все видно -
Joined.
-
Еще вопрос наверное очевидный - если искать по «вычисляемому» PK полю, то верно ли, что про индекс можно забыть?
Был индекс по user_id, пытаются искать по hash(user_id) = x -
часто видел в запросах условное time поле, которое участвует в PARTITION BY и PK ищут через toStartOfWeek(time) или что-то похожее
-
Охты, давно ж я не читал notes-ы... Спасибо
-
Если ORDER BY user_id то искать по hash(user_id) действительно не выйдет.
Но это странный кейс на самом деле, обычно делают наоборот:
ORDER BY hash(user_id) и ищут по user_id
тогда можно WHERE hash(user_id) = hash('user_id') AND user_id = user_ud
> часто видел в запросах условное time поле, которое участвует в PARTITION BY и PK ищут через toStartOfWeek(time) или что-то похожее
PARTITION BY хранит не само значение функции поля а min-max значения этого поля встреченные в таблице,
именно по этому можно писать в WHERE просто условие на time без преобразований -
Хорошо, спасибо!
-
Из за того, что PARTITION KEY хранит min-max раньше от него не было смысла если в нем использовался модуль (user_id % 100),
Относительно недавно это исправили
https://github.com/ClickHouse/ClickHouse/pull/16253#issue-508046958
По поводу использования toStartOfWeek(time) в WHERE не все так просто (если toStart* используется в ORDER BY в условии нужно писать ровно так же toStart*(column_from_pk) = '....' )
https://github.com/ClickHouse/ClickHouse/issues/15257#issue-708510144Prune partition in verbatim way. by amosbird · Pull Request #16253 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Performance Improvement Changelog entry (a user-readable short descriptio...
-
Коллеги, всем привет. У нас есть задача - подливать в кликхаус инкрементально измерения SCD Type 1 из Postgresql. Мы уже активно используем словари, но появились таблицы побольше и хотим их в коллапсингмерж, решаем как доставлять попроще. Объем - миллионы строк в день. Выбираем между напилить свое решение на триггерах или дозаморочиться с настройкой дебезиум-кафка-КХ. Мб есть какие то другие/готовые велосипеды чтоб поменьше телодвижений?
-
Joined.
-
а чем словари не подходят на большие таблицы? память? просто учитывая их встроенные рефреш удобней вряд ли будет
-
О, привет из чата гринплама))
1. Сотни ГБ синкать долго
2. Словари не сжимаются, память кончается -
аха, салют
№2. cache SSD подойдет имхо в самый раз
>1. Сотни ГБ синкать долго
нужно ли синкать моментально? -
Ага, есть требование в задержке обновлений измерений порядка минут
Ну и вообще как то стремно постоянно пересинкивать всю таблицу. постгрес сам по себе не шибко быстро такие объемы отдает, -
ну, update_field
т.е. в ПГ таблице иметь что то типа LAST_UPDATED, и будут вам инкрементально обновления данных подвозится -
если и это никак - то уже как-то доп логику делать типа триггер в ПГ/вал/писать источником в два места/ писать в кафку и оттуда в два места... вот это все
-
один раз, кстати КХ позволяет алиасы из секции select использовать в where/groupby/order by /having
SELECT arrayFirst(m -> m != '', reverse(groupArray(mailing_result))) as last_mailing_result
FROM log_record
having last_mailing_result LIKE 'хорошо';
это удобно, но создает огромную попаболь из-за несовместимости с ansi sql -
summingMt/AggregatingMT только такое могут через groupUniqArrayArray
-
в кх нет индексов группировки
-
Он позволяет и два раза использовать, но говорят, что даже использовать один раз может быть неэффективно. Из-за этого я и хотел продублировать функцию
SELECT arrayFirst(m -> m != '', reverse(groupArray(mailing_result))) as last_mailing_result
FROM log_record
having last_mailing_result LIKE 'хорошо' AND last_mailing_result LIKE 'хорошо2'; -
insert_dedupicate=0
кх дедуплицирует инсерты, читайте Replication -
вы что-то неправильно поняли.
это выражение конечно вычислять надо один раз. -
Спасибо!
-
пример есть?
-
нельзя добавлять к индексу поля
можно добавлять поля в ключ сортировки
ключ сортировки может , но должен совпадать с индексом -
просто контейнер обновить.
-
на любую вверх, которую вы протестировали на стейдже
-
в mysql
-
-
да
-
нет, только attach partition
-
Так и думал( Спасибо!
-
https://github.com/Altinity/clickhouse-zookeeper-recovery
Но применять на свой страх и риск(автоматизация данного процесса собственно)GitHub - Altinity/clickhouse-zookeeper-recoveryContribute to Altinity/clickhouse-zookeeper-recovery development by creating an account on GitHub.
-
А какие подводные?
-
есть ксатти но не готов https://github.com/ClickHouse/ClickHouse/pull/13652
New option to restore ZooKeeper metadata if it's lost.SYSTEM RESTORE REPLICA replica [ON CLUSTER cluster] by myrrc · Pull Request #13652 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): New Feature Changelog entry (a user-readable short description of the cha...
-
Скрипт написан очень хорошим человеком, успешно восстановил кое где кластер, но это же софт и всегда могут быть какие то накладки.
-
Да, видел этот PR. Было бы хорошо, если бы сбой произошел после его завершения)
-
Понял, спасибо!
-
вы случайно пропгрейдились? это в последней версии убрали
https://github.com/ClickHouse/ClickHouse/blob/master/CHANGELOG.md
Expression toUUID(N) no longer works. Replace with toUUID('00000000-0000-0000-0000-000000000000'). This change is motivated by non-obvious results of toUUID(N) where N is non zero. -
Денис, на "митапе" вы показывали:
alter table update ... и если просто запустить - он что будет лопатить все партишены?
а с новой версии можно добавить partition и тогда только в ней
все так? -
нет, я пытался объяснить, мутируют все парты, но перезаписываются (данные) только партах нужных по where , но метаданные меняются во всех, и хардлинками пересоздаютсся все файлы всех партов
это проблема в больших инсталляциях у кого 10тыс партов и 100ни реплик -
там в ЗК просто взрыв происходит
-
а, ок
-
да, спасибо, так сделали
-
Joined.
- 21 January 2021 (259 messages)
-
Можно из ключа сортировки поле удалять? И добавлять новое
-
ALTER ключа сортировки — лёгкая операция, так как при одновременном добавлении нового столбца в таблицу и ключ сортировки не нужно изменять данные кусков (они остаются упорядоченными и по новому выражению ключа).MergeTree | Документация ClickHouse
MergeTree Движок MergeTree, а также другие движки этого семейства (*MergeTree) — это наиболее функциональные движки табл
-
выше писали только что изменение порядка ключа сортировки - сомнительная затея
-
version()
20.8.5.45
userlogin@host:~$
userlogin@host:~$ clickhouse-client -h host -q "SELECT value FROM system.settings WHERE name LIKE 'input_format_null_as_default'"
1
userlogin@host:~$ clickhouse-client -h host -q "truncate table t"
userlogin@host:~$
userlogin@host:~$ clickhouse-client -h host -q "select * from t"
userlogin@host:~$
userlogin@host:~$ cat qqq
1 \N
2 0000-00-00 00:00:00.000000000
3 \N
4 2010-12-12 12:12:12.123123123
userlogin@host:~$
userlogin@host:~$ cat qqq | clickhouse-client -h host --query="INSERT INTO t (s,dt64) format TSV"
Code: 27, e.displayText() = DB::Exception: Cannot parse input: expected '\n' before: '00:00.000000000\n3\t\\N\n4\t2010-12-12 12:12:12.123123123\n': (at row 1)
Row 1:
Column 0, name: s, type: UInt8, parsed text: "1"
Column 1, name: dt64, type: DateTime64(9), parsed text: "<BACKSLASH>N"ERROR
Code: 117, e.displayText() = DB::Exception: Unexpected NULL value of not Nullable type DateTime64(9) (version 20.8.5.45 (official build))
, Stack trace (when copying this message, always include the lines below):
0. Poco::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x18bb6380 in /usr/bin/clickhouse
1. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0xe60c32d in /usr/bin/clickhouse
2. ? @ 0xe64f5d2 in /usr/bin/clickhouse
3. DB::TabSeparatedRowInputFormat::readRow(std::__1::vector<COW<DB::IColumn>::mutable_ptr<DB::IColumn>, std::__1::allocator<COW<DB::IColumn>::mutable_ptr<DB::IColumn> > >&, DB::RowReadExtension&) @ 0x1644f36b in /usr/bin/clickhouse
4. DB::IRowInputFormat::generate() @ 0x16350d31 in /usr/bin/clickhouse
5. DB::ISource::work() @ 0x162ccbdb in /usr/bin/clickhouse
6. DB::InputStreamFromInputFormat::readImpl() @ 0x1628fe2d in /usr/bin/clickhouse
7. DB::IBlockInputStream::read() @ 0x154668bd in /usr/bin/clickhouse
8. DB::ParallelParsingBlockInputStream::parserThreadFunction(std::__1::shared_ptr<DB::ThreadGroupStatus>, unsigned long) @ 0x16294280 in /usr/bin/clickhouse
9. ? @ 0x16294f04 in /usr/bin/clickhouse
10. ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::__1::__list_iterator<ThreadFromGlobalPool, void*>) @ 0xe63a637 in /usr/bin/clickhouse
11. ThreadFromGlobalPool::ThreadFromGlobalPool<void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()>(void&&, void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()&&...)::'lambda'()::operator()() const @ 0xe63adaa in /usr/bin/clickhouse
12. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0xe639b47 in /usr/bin/clickhouse
13. ? @ 0xe638093 in /usr/bin/clickhouse
14. start_thread @ 0x76ba in /lib/x86_64-linux-gnu/libpthread-2.23.so
15. /build/glibc-LK5gWL/glibc-2.23/misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:111: clone @ 0x10741d in /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.23.so
(version 20.8.5.45 (official build))
Code: 27. DB::Exception: Cannot parse input: expected '\n' before: '00:00.000000000\n3\t\\N\n4\t2010-12-12 12:12:12.123123123\n': (at row 1)
Row 1:
Column 0, name: s, type: UInt8, parsed text: "1"
Column 1, name: dt64, type: DateTime64(9), parsed text: "<BACKSLASH>N"ERROR
Code: 117, e.displayText() = DB::Exception: Unexpected NULL value of not Nullable type DateTime64(9) (version 20.8.5.45 (official build))
userlogin@host:~$
userlogin@host:~$ cat qqq | clickhouse-client -h host --input_format_null_as_default=1 --query="INSERT INTO t (s,dt64) format TSV"
userlogin@host:~$
userlogin@host:~$ clickhouse-client -h host -q "select * from t"
1 2021-01-21 04:40:02 1970-01-01 00:00:00.000000000
2 2021-01-21 04:40:02 1970-01-01 00:00:00.000000000
3 2021-01-21 04:40:02 1970-01-01 00:00:00.000000000
4 2021-01-21 04:40:02 2010-12-12 12:12:12.123123123 -
[ODBC Data Sources]
clickHouse = clickHouse
[clickHouse]
Driver = /opt/clickhouse-odbc-1.1.9-Linux/lib/libclickhouseodbc.so
server = xxxxxxxxxxxxxx
username = ananth
password = xxxxxxxx
port = 8123
database = ananthdm
uid = ananth
# sslmode = allow
trace = 1
tracefile = /opt/clickhouse-odbc.log -
after specifying the specific database name it allowing all database for the users
-
is there any configuration changes in user.xml fil e
-
Joined.
-
Всем добрый день! dBeaver не возвращает результаты explain select в clickhouse. Кто-то знает возможность убедить его возвращать? или может посмотреть результаты где-то в другом клиенте?
-
Всем привет, подскажите как работает внешний справочник? Например я подключил справочник из постгри, там табличка из 1-3кк записей. КХ поидее раз в какое-то время обновляет этот справочник. Получается он каждый раз гоняет вообще все данные из таблицы, вытаскивает и все перезаписывает или как-то работает только с новыми данными и частично удаляет?
-
Полностью гоняет.
-
А то что там 3кк данных, это ниче страшного?
-
-
-
https://clickhouse.tech/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-lifetime/
полностью, но в некоторых случаях только в случае наличия измененийОбновление словарей | Документация ClickHouseОбновление словарей ClickHouse периодически обновляет словари. Интервал обновления для полностью загружаемых словарей и
-
Там обновляется полностью, но только если invalidate query другой ответ вернул. Где-то пролетало, что какой-то движок (конкретная СУБД) может только изменения присылать, но где это видел-слышал - не помню. А может это вообще звон из другой деревни.
-
-
-
-
Я заметил, что когда делаются запросы с пагинацией, то те, у которых OFFSET достаточно большой, что в ответе не будет ни одной строки, выполняются фактически мгновенно (в system.query_log стоят нули и по времени, и по памяти). Но эти запросы подавались параллельно из нескольких потоков! (правда потоки создавались в порядке пагинации). Получается, что у Clickhouse есть какие-то хитрые оптимизации, которые дают такой эффект?
-
Всем привет, написал тестовый сервис, который через jdbc ходит в CH. Сам запрос, с котором он идет, всегда select 1. Упираюсь в 10к qps и никак не могу разогнать выше, при этом сами запросы исполняются < 1-2мс. Кто-нибудь сталкивался с подобными случаями и если да, то как разгоняли qps? Может, есть какие-то магические настройки в самой бд. или что-то подобное?
-
У кликхауса большой оверхед на запросы, он разрабатывался под сотни рпс тяжёлых запросов
-
то есть использовать его как бд, в которую и пишут много много всего и выбирают много много всего, не лучшая идея?
-
-
А вы опишите для начала что выбирают и как пишут
-
-
Коллеги, есть варианты оптимизировать запрос:
SELECT user, countDistinct(article) as count from (SELECT article, arrayJoin(arraySlice(arraySort((x,y)->y, groupArray(user),groupArray(toUnixTimestamp(time))),1,10)) as user from db WHERE status='read' group by article) group by user order by count desc limit 25
То есть, найти юзеров которые прочитали больше всего статей при условии что они были среди последних 10 юзеров прочитавших статью...
Вариант выше кажется неоптимальным, и при некоторых условиях упирается в память -
если вам надо 1000 запросов в секунду на чтение которые каждый должен по миллиарду строк фильтровать, это не лучший кейс =) и все это на одной машине
то машина должна быть очень жирная (много RAM - 256\512 и много CPU 32\64) -
писать надо большими батчами по 10-100 тыс, а лучше миллион записей в чанке, меньше плохая идея =)
узнаете про Buffer \ clickhouse-bulk \ chproxy и т.п. костыли
искать "одну запись" и юзать JOIN с множественными таблицами которые по миллиону записей и не пролазят в память, тоже на CPU и память попадете -
Пишется большими батчами с некоторыми интервалами, с этим проблем нет. А чтение - запросы сами простые, из разряда select count from where или select что-то from where. Все из одной таблицы выбирается. Сейчас тестирую на пустой бд, но планируется, что в ней будет на вскиду, пока что, до 100 миллионов записей.
-
-
50 миллионов записей это маленький объем для clickhouse
=) одной машины хватит... -
У нас похожий кейс.
Используем кластер СН (2 шарда по 2 реплики), читаем около 1к рпс на бекенды (на СН около 3к рпс).
Сервера жирные (48 ядер, 200+Гб оперативки, диски ссд по 1Тб), максимально нагружали сервера на 25% загрузки ЦПУ, дальше бекенды просто не выдерживали.
Таблицы по 500+ млн -
а вы как-то подкручивали сам кх? И чем ходите из бекенда в кх?
-
Пытаюсь найти статью ребят из Altinity team, где они проводили тесты на нагрузку, там давали и настройки некоторые.
Под "чем ходите" Вы подразумеваете язык программирования? 🙂 -
ну, не прям язык, а способ. У меня это через jdbc, он может быть сыроватым еще и, например, на своей стороне не давать разогнать нагрузку
-
По нативному TCP протоколу
-
-
-
-
-
ClickHouse In the Storm. Part 1: Maximum QPS estimation
May 2, 2019ClickHouse is an OLAP database for analytics, so the typical use scenario is processing a relatively small number of requests -- from several per hour to many dozens or even low hundreds per second --affecting huge ranges of data (gigabytes/millions of rows).But how it will behave in other scenarios? Let's try to use a steam-hammer to crack nuts, and check how ClickHouse will deal with thousands of small requests per second. This will help us to understand the range of possible use cases and limitations better.This post has two parts. The first part covers connectivity benchmarks and test setup. The next part covers maximum QPS in scenarios involving actual data.
-
индекс _packetDate смысла не имеет, т.к. у вас и так партиции по дате
-
И можно сам селект сюда - скрин мелкий очень
-
А какой индекс по вашему должен сработать?
-
а, я читал как раз недавно эту статью. Автор в ней пишет, что при select 1 запросе 13к достикает qps. Интересно, а это пик нагрузки? Если я, например, хочу получить хотя бы 30к qps, а лучше и все 50к, то это технически не возможно сделать?
-
Думаю вопрос в железе, ну и плюс если это один сервер, то Вы всё равно упретесь в какой-то предел.
Где-то на хабре ещё читал, что если хотите чтобы СН обрабатывал больше запросов, сделайте кластер и балансируйте нагрузку на реплики. -
Ну и в примере ребята "ходят" по хттп, по факту у меня по хттп перформанс реальных запросов был хуже из-за оверхеда хттп, по этому перешли на ТСР
-
Надо добавить к where packetDate
-
у вас packetDateTime
-
Если не ошибаюсь, то у меня в конечном итоге тоже через http идёт обращение
-
а его в ни в индексе, ни в партиции