Как выполняется вставка данных в ClickHouse, от чего зависит ее скорость и каким образом ее повысить: последовательность операций загрузки и ее оптимизации.
От чего зависит скорость вставки данных в ClickHouse
Поскольку ClickHouse часто используется для построения хранилищ или витрин данных, скорость загрузки данных в эту базу очень важна. Хотя на время вставки данных в ClickHouse влияют множество факторов, включая настройки ETL/ELT-движков, с точки зрения самого колоночного хранилища можно выделить следующие ключевые категории, определяющих скорость загрузки данных:
- аппаратные ресурсы (ЦП, ОЗУ, диски и сеть). ClickHouse эффективно использует многоядерные процессоры. Высокая тактовая частота и количество ядер напрямую влияют на скорость обработки вставок. Для кэширования данных и быстрой обработки запросов необходим достаточный объем оперативной памяти. SSD-диски значительно быстрее HDD, а использование RAID-массивов может повысить производительность операций записи за счет распараллеливания. Поскольку данные вставляются по сети, высокая загруженность сети и/или ее низкая пропускная способность могут замедлить вставку данных.
- конфигурация самой СУБД. Поскольку ClickHouse оптимизирован на пакетную вставку больших объемов данных, размер пакета (batch size) сильно влияет на производительность записи. Слишком маленькие пакеты приводят к большему числу операций записи, а слишком большие могут привести к задержкам. Использование нескольких потоков для параллельной вставки может ускорить процесс, но зависит от возможностей аппаратного обеспечения. Разные движки таблиц и ключи сортировки тоже влияют на скорость вставки. Движки семейства MergeTree периодически выполняют слияние мелких частей данных в более крупные для оптимизации хранения и ускорения запросов. Хотя это слияние является фоновым процессом, оно потребляет ресурсы (ЦП, дисковые I/O-операции), что может конкурировать с процессами вставки данных и снижать их скорость. Настройки сжатия меняют объем данных, которые необходимо записать. Процесс сжатия требует дополнительных вычислительных ресурсов и времени, что снижает скорость вставки, особенно при использовании сложных алгоритмов. Дополнительные механизмы обеспечения надежности могут влиять на производительность вставок. Например, если настроены проверки целостности данных и логирование операций. Репликация (особенно геораспределенная) увеличивает время вставки из-за синхронизации данных между узлами. При использовании ZooKeeper для координации реплик, управления метаданными и синхронизации операций, каждый запрос на вставку требует взаимодействия с этой внешней службой для согласования состояния реплик. Это добавляет накладные расходы и может замедлять процесс вставки, особенно при высоких нагрузках. В этом случае имеет смысл рассмотреть альтернативу ClickHouse Keeper, о котором мы писали здесь.
- формат и структура вставляемых данных. Простые типы данных (числовые, символьные, логические и пр.) вставляются быстрее, чем сложные структуры, такие как массивы, JSON-документы и т.д. ClickHouse поддерживает более 70 форматов, однако, бинарные форматы обрабатываются быстрее текстовых.
- настройки клиента. Конфигурации клиента, т.е. внешнего по отношению к ClickHouse приложению, выполняющего вставку тоже влияют на скорость вставки данных. При синхронных вставках клиент ожидает подтверждения от сервера о завершении операции вставки перед продолжением работы. Синхронные вставки проще реализовать, но могут стать узким местом при высокой нагрузке. Асинхронная вставка позволяет клиенту не блокироваться и продолжать работу, пока сервер обрабатывает данные. Это особенно полезно при высоких нагрузках и необходимости минимизации задержек. Асинхронные вставки повышают производительность и устойчивость, но требуют дополнительной логики для обработки ошибок и подтверждений. Наконец, интерфейс взаимодействия клиента с ClickHouse (нативный или HTTP) тоже влияет на скорость вставки данных. Подробнее об этом поговорим в следующий раз.
Как выполняется вставка данных
Перед фактическим выполнением операции вставки данных в ClickHouse, сперва выполняется ряд действий на стороне клиента:
- Прежде всего, для оптимальной производительности данные должны быть пакетированы. Если пакетирование невозможно, можно использовать асинхронные вставки с использованием промежуточного ПО (брокеры сообщений типа Apache Kafka) или многопоточного/неблокирующего программирования. Асинхронная вставка добавляет буферизацию между распаковкой и анализом данных на стороне ClickHouse.
- Поскольку ClickHouse хранит вставленные данные на диске согласно ключу сортировки, можно предварительно, т.е. на стороне клиента, просортировать данные перед отправкой на сервер.
- Хотя ClickHouse поддерживает более чем 70 форматов данных, некоторые из них обрабатываются быстрее. Поэтому можно заранее, на стороне клиента выбрать наиболее эффективный формат.
- Сжатие данных перед передачей на сервер ClickHouse уменьшает их размер и повышает эффективность утилизации сети, что особенно важно для больших наборов данных. Однако, это переносит накладные расходы на сторону клиента-отправителя данных и приложений, которые будут потреблять данные из колоночного хранилища.
- Наконец, после всех операций предварительной подготовки, данные передаются в ClickHouse через нативный или HTTP-интерфейс.
Прием данных на стороне сервера тоже состоит из ряда действий:
- ClickHouse получает данные;
- после получения данных распаковывает их, если использовалось сжатие;
- анализирует их с учетом изначального формата;
- создает блок в памяти в формате MergeTree;
- сортирует строки по столбцам первичного ключа, если они еще не отсортированы предварительно;
- создает разреженный первичный индекс;
- применяет сжатие по столбцам;
- записывает данные как новую часть данных на диск.
Познакомившись с последовательностью вставки данных в ClickHouse, рассмотрим, как можно повысить производительность приема на стороне сервера, не увеличивая нагрузку на него. Если переложить предварительную работу по оптимизации вставки на клиента, получим следующие рекомендации:
- пакетирование данных для снижения накладных расходов на вставку и повышения эффективности обработки;
- сортировка данных;
- форматирование данных – преобразование в формат, эффективный для обработки сервером;
- сжатие данных, чтобы уменьшить их размер и повысить эффективность сетевой передачи.
Эти оптимизации повышают эффективность и пропускную способность приема данных на стороне сервера, что обычно требует существенных дополнительных ресурсов на стороне клиента. На практике именно формат, алгоритм сжатия и интерфейс передачи данных оказывают наибольшее влияние на операции вставки в ClickHouse. Подробнее об этом читайте в следующей статье.
Освойте ClickHouse на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
Источники