184 похожих чатов

Недавно обновились до версии 23.7.4.5, до этого сидели на версии

22.10? (не помню точно).
И появилась такая проблема - заливаем данные батчом через distributed таблицу на одной из нод кластера в data таблицы кластера. Данные оперативно передаются на принимающую ноду за 20 минут со скоростью под 10Гбит/с в 200 потоков, а далее начинают распределяться по нодам кластера в data таблицы. Раньше этот процесс распределения занимал около 1-1.5 часов, а после обновления вырос до 7.5-8 часов.
Предполагаю что появился какой-то лимит/настройка, только знать бы какой. Как можно в такой конфигурации ускорить процесс передачи данных по кластеру? Лить данные напрямую в data таблицы пока не планировали, в целом устраивает простота загрузки для etl процесса.

29 ответов

34 просмотра

https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings#background_distributed_schedule_pool_size background_distributed_schedule_pool_size: 256 попробуйте поставить в настройках сервера в config.d

Alexander-Malyuzhenets Автор вопроса
Slach [altinity]
https://clickhouse.com/docs/en/operations/server-c...

Спасибо, попробуем. Также думаю включить отправку файлов батчами (distributed_directory_monitor_batch_inserts) и понаблюдаю за файлами на отправку в директории /var/lib/clickhouse/data/database/table/

Alexander Malyuzhenets
Спасибо, попробуем. Также думаю включить отправку ...

там метрики есть в system.metircs кол-во не отправленных distibuted файлов

Alexander-Malyuzhenets Автор вопроса

подняли background_distributed_schedule_pool_size, но возможно он уперся в background_pool_size и его также нужно поднять. Но проблема в чем-то еще - число BackgroundDistributedSchedulePoolTask при загрузке данных не растет, и даже упало с 3 до 1, а при этом DistributedFilesToInsert выросло значительно. Что может мешать поднимать дополнительные фоновые задачи на раздачу данных по кластеру? metric |value | -------------------------------------|------------| BackgroundDistributedSchedulePoolTask| 1| BackgroundDistributedSchedulePoolSize| 16| DistributedSend | 1| StorageDistributedThreads | 0| StorageDistributedThreadsActive | 0| DistributedInsertThreads | 0| DistributedInsertThreadsActive | 0| DistributedBytesToInsert |167842821978| BrokenDistributedBytesToInsert | 0| DistributedFilesToInsert | 39563| BrokenDistributedFilesToInsert | 0|

Alexander Malyuzhenets
подняли background_distributed_schedule_pool_size,...

SYSTEM START DISTIRBUTED SENDS может остановил кто что...

Alexander-Malyuzhenets Автор вопроса
Slach [altinity]
логи смотрите...

Напишу здесь результаты postmortem, возможно кому-то пригодится ) Процессы-писатели отдавали на принимающую ноду с distributed таблицей порядка 150Гб данных, по времени загрузка шла около 20 минут. Далее distributed таблица раскидывала данные по нодам кластера, включая эту же ноду. Вылетало 2 вида ошибок - wait timeout в 120с для процесса-писателя и too many parts на конечных дата нодах. Полечили повышением таймаута для писателей (подняли до 600 секунд), явным включением async_insert по дата нодам и повышением лимитов по буферу для асинхронной вставки - время ожидания подняли до 60 секунд и размер поставили с запасом в 500Мб. В общем что-то поменялось в версиях клика в 2023 году, и пришлось повозиться с настройками чтобы процессы загрузки отрабатывали как прежде... name |value | -----------------------------|---------| async_insert_deduplicate |1 | async_insert |1 | wait_for_async_insert |1 | wait_for_async_insert_timeout|600 | async_insert_max_data_size |500000000| async_insert_busy_timeout_ms |60000 |

too many parts, на 23.x надо еще умудриться схватить... там костылей вагон для того чтобы это хендлить правильно может оно у вас там именно вставка стала другой? размер батча на вставку банально снизился? а вы clickhouse бросились тюнить... system.part_log есть ? смотрите целевую таблицу на rows и event_type='NewPart' до апдейта и после апдейта...

Alexander-Malyuzhenets Автор вопроса
Slach [altinity]
too many parts, на 23.x надо еще умудриться схвати...

размер исходного батча на вставку был 500К записей, сейчас подняли до 1М в system.part_log для целевой таблицы картина до и после обновления не сильно поменялась - в среднем по 1500 строк на парт, порядка 1.5М записей с типом NewPart до обновления и стало 0.5М-1М записей после обновления (тут сложно вычленять упавшие по внешнему таймауту загрузки)

Alexander Malyuzhenets
размер исходного батча на вставку был 500К записей...

эти 500 к сплитуются по шардам... и в итоговую таблицу будет меньше размер чанка

Alexander Malyuzhenets
размер исходного батча на вставку был 500К записей...

1500 строк на парт, не вяжется с 500к записей на один инсерт в initiator node

Alexander-Malyuzhenets Автор вопроса
Slach [altinity]
эти 500 к сплитуются по шардам... и в итоговую таб...

я привел статистику для MergeTree таблицы на одной дата ноде

Alexander-Malyuzhenets Автор вопроса
Slach [altinity]
1500 строк на парт, не вяжется с 500к записей на о...

согласен, но ведь Distributed каким-то образом делает распределение данных по кластеру на основе функции шардирования

Alexander Malyuzhenets
согласен, но ведь Distributed каким-то образом дел...

ну так если на вход distributed 500к строк... за ОДИН INSERT (размер батча) и у вас допустим 5 шардов... то это никак не может быть тогда в целевой ноде всего 1500 строк на новый парт...

Alexander-Malyuzhenets Автор вопроса

сколько шардов? если 5 шардов. то значит вставляете не по 500к а по 50k на порядок меньше...

Alexander-Malyuzhenets Автор вопроса

4 шарда

Alexander-Malyuzhenets Автор вопроса
Slach [altinity]
сколько шардов? если 5 шардов. то значит вставляе...

в моем понимании distributed движок кэширует входящие данные во временные файлы (DistributedFilesToInsert) и затем из них формирует новые батчи для отправки на шарды, при этом данные группирует согласно функции шардирования

Alexander Malyuzhenets
4 шарда

значит вставляете от 4000 до 10000 в один INSERT SELECT event_date, hostName() h, quantiles(0.5,0.9)(writen_rows) FROM clusterAllReplicas('cluster_name',system.query_log) WHERE is_initial_query AND has(tables,'db.distributed_table') AND event_type='QueryFinish' GROUP BY event_date, h ORDER BY h, event_date written_rows смотрите

Alexander Malyuzhenets
в моем понимании distributed движок кэширует входя...

нет, это не кеширование это сплитование по функции шардирования сразу во время вставки. в .bin файлы формата Native с раскладкой по каталогам и в дальнейшем обычный INSERT INTO ... FORMAT Native на целевой шард, в зависимости от internal_replication на одну реплику или на несколько...

Alexander-Malyuzhenets Автор вопроса
Slach [altinity]
значит вставляете от 4000 до 10000 в один INSERT S...

честно показывает 500К и 500К записей до обновления, и после обновления стало так: [0.0,500000.0] [0.0,2000000.0] 2млн - видимо там коллега поставил 2 а не 1млн

Alexander-Malyuzhenets Автор вопроса
Slach [altinity]
нет, это не кеширование это сплитование по функци...

репликации у нас нет а какой объем он передает на шард? сразу 1 файл отдает или дробит на батчи?

Alexander Malyuzhenets
честно показывает 500К и 500К записей до обновлени...

откуда 0.0 на 50% персентиле? https://fiddle.clickhouse.com/e800e37a-2afc-46b5-97ed-3625b724ea3f WHERE event_type='QueryFinish' забыли?

Alexander Malyuzhenets
репликации у нас нет а какой объем он передает на ...

один файл .bin за один INSERT на целевой шард... но если вы 2 000 000 строк вставляете ... то это по 500 000 строк в одном .bin файле должно быть... а не по 1500 ... где то у вас что-то не сходится...

Alexander-Malyuzhenets Автор вопроса
Slach [altinity]
откуда 0.0 на 50% персентиле? https://fiddle.click...

type='QueryFinish' не забыл, в логе и правда много записей с written_rows=0 возможно это упавшие передачи, которые в итоге ничего не записали?

Alexander Malyuzhenets
type='QueryFinish' не забыл, в логе и правда много...

оно тогда не может быть is_initial_query и QueryFinish если written_rows =0 то что упало оно с другим статусом завершается... ну то есть у вас клиент мог недождаться ответа и отключиться... но тогда все равно ошибка при попытке записать в клиентский сокет результат ответа... и статус не QueryFinish покажите пример из лога с SELECT * FROM system.query_log WHERE ... AND written_rows=0 AND event_date=today() LIMIT 1 FORMAT Vertical

Alexander-Malyuzhenets Автор вопроса
Slach [altinity]
оно тогда не может быть is_initial_query и QueryFi...

нужно было еще условие добавить and query_kind='Insert'

Alexander Malyuzhenets
нужно было еще условие добавить and query_kind='I...

а да, забыл... ну и что с персентилями стало?

Похожие вопросы

Обсуждают сегодня

Ребят в СИ можно реализовать ООП?
Николай
33
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем доброго вечера. Разрабатываю 32 раз. приложение в Delphi. Столкнулся с тем, что стандартный  TFilestream  не работает с большим файлом > 2 ГБайт (после вызова функции see...
Vadim Gl
16
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
добрый день. Подскажите, есть сайт на 1.4.7 и я хочу обновиться, особо ничего не меняя. мне выбирать версию 1.4.35 или третью ветку? и можно ли обновлять "как есть", или нужно...
Digital Cat
12
Кто кодит под Лазарем на винде, у вас аналогично VCL переопределяются CreateWnd и CreateParams для конкретных классов контролов и все заданные флаги влияют?
А Андрей
11
У меня задача: написать брокер сообщений. Очереди и потребители. Очереди поддерживают приоритеты. Очередь отдает сообщения, только обработчикам с соответствующими характеристи...
Aleksandr Filippov
2
народ, плиз хелп, всю голову сломал себе уже... разве может быть так, что GetProcAddress( GetModuleHandle( "kernel32.dll" ), "SetThreadDescription" ) вернёт ненулевое значение...
Iluha Companets
12
А, ты про текущую реализацию? Нет конечно, я бы сделал правильно - сейчас там гавнокод
Александр (Rouse_) Багель
6
Карта сайта