Перейти к основному содержимому
Перейти к основному содержимому

Вставка данных в ClickHouse

Основной пример

Вы можете использовать хорошо знакомую команду INSERT INTO TABLE с ClickHouse. Давайте вставим некоторые данные в таблицу, которую мы создали в начальном руководстве "Создание таблиц в ClickHouse".

Чтобы убедиться, что это сработало, мы выполним следующий запрос SELECT:

Что возвращает:

Вставка в ClickHouse против OLTP баз данных

Как OLAP (Online Analytical Processing) база данных, ClickHouse оптимизирован для высокой производительности и масштабируемости, позволяя потенциально вставлять миллионы строк в секунду. Это достигается за счет сочетания высокопараллелизированной архитектуры и эффективного столбцового сжатия, но с компромиссом на моментальной согласованности. Конкретнее, ClickHouse оптимизирован для операций только добавления и предлагает только гарантии конечной согласованности.

В отличие от этого, OLTP базы данных, такие как Postgres, специально оптимизированы для транзакционных вставок с полной совместимостью ACID, обеспечивая строгие гарантии согласованности и надежности. PostgreSQL использует MVCC (Multi-Version Concurrency Control) для обработки параллельных транзакций, что включает поддержание нескольких версий данных. Эти транзакции могут потенциально затрагивать небольшое количество строк за раз, с значительными накладными расходами из-за гарантий надежности, ограничивающими производительность вставки.

Чтобы добиться высокой производительности вставки при сохранении строгих гарантий согласованности, пользователи должны соблюдать простые правила, описанные ниже, при вставке данных в ClickHouse. Соблюдение этих правил поможет избежать проблем, с которыми пользователи часто сталкиваются в первый раз, используя ClickHouse, и попыток воспроизвести стратегию вставки, которая работает для OLTP баз данных.

Лучшие практики для вставок

Вставляйте большими партиями

По умолчанию каждая вставка, отправленная в ClickHouse, заставляет ClickHouse немедленно создать часть хранилища, содержащую данные из вставки, вместе с другими метаданными, которые должны быть сохранены. Поэтому отправка меньшего количества вставок, каждая из которых содержит больше данных, по сравнению с отправкой большего количества вставок, каждая из которых содержит меньше данных, уменьшит количество необходимых записей. В общем, мы рекомендуем вставлять данные довольно большими партиями, не менее 1,000 строк за раз, а в идеале от 10,000 до 100,000 строк. (Дополнительные детали здесь).

Если большие партии невозможны, используйте асинхронные вставки, описанные ниже.

Обеспечьте согласованные партии для идемпотентных повторов

По умолчанию вставки в ClickHouse являются синхронными и идемпотентными (т.е. выполнение той же операции вставки несколько раз имеет тот же эффект, что и выполнение ее один раз). Для таблиц семейства движка MergeTree ClickHouse, по умолчанию, автоматически дедуплицирует вставки.

Это означает, что вставки остаются устойчивыми в следующих случаях:

    1. Если узел, получающий данные, имеет проблемы, запрос вставки завершится с таймаутом (или выдаст более конкретную ошибку) и не получит подтверждение.
    1. Если данные были записаны узлом, но подтверждение не может быть возвращено отправителю запроса из-за сетевых перебоев, отправитель либо получит таймаут, либо сетевую ошибку.

С точки зрения клиента (i) и (ii) может быть трудно различить. Однако в обоих случаях неподтвержденную вставку можно немедленно повторить. При условии, что повторный запрос вставки содержит те же данные в том же порядке, ClickHouse автоматически проигнорирует повторный запрос вставки, если (неподтвержденная) оригинальная вставка была успешной.

Вставляйте в таблицу MergeTree или распределенную таблицу

Мы рекомендуем вставлять непосредственно в таблицу MergeTree (или Реплицированную таблицу), распределяя запросы между набором узлов, если данные шардированы, и устанавливая internal_replication=true. Это позволит ClickHouse реплицировать данные на любые доступные репликационные шардирования и гарантирует, что данные будут в конечном итоге согласованными.

Если эта балансировка нагрузки со стороны клиента неудобна, пользователи могут вставлять через распределенную таблицу, которая затем распределит записи между узлами. Снова рекомендуется установить internal_replication=true. Однако следует отметить, что этот подход имеет немного меньшую производительность, поскольку записи должны быть выполнены локально на узле с распределенной таблицей, а затем отправлены на шардирования.

Используйте асинхронные вставки для небольших партий

Есть сценарии, когда пакетная обработка на стороне клиента невозможна, например, в случае наблюдения с несколькими сотнями или тысячами одноцелевых агентов, отправляющих логи, метрики, трассировки и т.д. В этом сценарии транспортировка данных в реальном времени имеет ключевое значение для быстрого выявления проблем и аномалий. Более того, существует риск всплесков событий в наблюдаемых системах, которые могут потенциально вызвать крупные всплески памяти и связанные с этим проблемы при попытке буферизовать данные наблюдения на стороне клиента. Если большие партии не могут быть вставлены, пользователи могут делегировать пакетирование ClickHouse, используя асинхронные вставки.

При включенных асинхронных вставках данные сначала вставляются в буфер, а затем записываются в хранилище базы данных позже в 3 этапа, как показано на диаграмме ниже:

С включенными асинхронными вставками ClickHouse:

(1) получает запрос вставки асинхронно. (2) сначала записывает данные запроса в буфер в памяти. (3) сортирует и записывает данные как часть в хранилище базы данных, только когда происходит следующий сброс буфера.

Перед тем как буфер будет сброшен, данные других асинхронных запросов вставки от того же или других клиентов могут быть собраны в буфере. Часть, созданная из сброса буфера, потенциально может содержать данные из нескольких асинхронных запросов вставки. В общем, эти механизмы смещают пакетирование данных с клиентской стороны на серверную (экземпляр ClickHouse).

примечание

Обратите внимание, что данные не могут быть найдены по запросам до их сброса в хранилище базы данных и что сброс буфера настраиваемый.

Полные детали по настройке асинхронных вставок можно найти здесь, с углубленным анализом здесь.

Используйте официальные клиенты ClickHouse

ClickHouse имеет клиентов на самых популярных языках программирования. Они оптимизированы, чтобы гарантировать, что вставки выполняются корректно и нативно поддерживают асинхронные вставки либо напрямую, как например в Go клиентах, либо косвенно, когда это разрешено в настройках запроса, пользователя или соединения.

Смотрите Клиенты и драйверы для получения полного списка доступных клиентов и драйверов ClickHouse.

Предпочитайте нативный формат

ClickHouse поддерживает множество форматов ввода при вставке (и запросе). Это значительное отличие от OLTP баз данных и упрощает загрузку данных из внешних источников - особенно в сочетании с табличными функциями и возможностью загружать данные из файлов на диске. Эти форматы идеальны для выполнения загрузки данных "ad hoc" и для задач по обработке данных.

Для приложений, стремящихся достичь оптимальной производительности вставки, пользователи должны вставлять, используя Нативный формат. Это поддерживается большинством клиентов (таких как Go и Python) и гарантирует, что серверу нужно выполнить минимальное количество работы, поскольку этот формат уже является столбцовым. Таким образом, ответственность за преобразование данных в столбцовый формат ложится на клиентскую сторону. Это важно для эффективного масштабирования вставок.

В качестве альтернативы пользователи могут использовать RowBinary формат (как используется Java клиентом), если предпочтительнее строковый формат - это, как правило, проще записывать, чем нативный формат. Это более эффективно с точки зрения сжатия, сетевых накладных расходов и обработки на сервере, чем альтернативные строковые форматы, такие как JSON. Формат JSONEachRow может быть рассмотрен пользователями с более низкой пропускной способностью записи, стремящимися быстро интегрироваться. Пользователи должны осознавать, что этот формат будет иметь накладные расходы на CPU в ClickHouse для анализа.

Используйте HTTP интерфейс

В отличие от многих традиционных баз данных, ClickHouse поддерживает HTTP интерфейс. Пользователи могут использовать его как для вставки, так и для запроса данных, используя любой из вышеупомянутых форматов. Это часто предпочтительнее протокола ClickHouse, так как позволяет легко переключить трафик с помощью балансировщиков нагрузки. Мы ожидаем небольших различий в производительности вставки с нативным протоколом, который имеет немного меньше накладных расходов. Существующие клиенты используют любой из этих протоколов (в некоторых случаях оба, например, Go клиент). Нативный протокол действительно позволяет легко отслеживать прогресс запроса.

Смотрите HTTP интерфейс для получения дополнительных деталей.

Загрузка данных из Postgres

Для загрузки данных из Postgres пользователи могут использовать:

  • PeerDB by ClickHouse, инструмент ETL, специально разработанный для репликации баз данных PostgreSQL. Это доступно как в:
  • Движок таблиц PostgreSQL для чтения данных напрямую, как показано в предыдущих примерах. Обычно подходит, если пакетная репликация на основе известного временного маркера, например, метки времени, достаточна или если это одноразовая миграция. Этот подход может масштабироваться до десятков миллионов строк. Пользователи, желающие мигрировать большие наборы данных, должны рассмотреть возможность множества запросов, каждый из которых обрабатывает часть данных. Временные таблицы могут использоваться для каждой части перед тем, как их партиции будут перемещены в финальную таблицу. Это позволяет повторно пытаться обработать неудачные запросы. Для получения дополнительных деталей о этой стратегии массовой загрузки смотрите здесь.
  • Данные можно экспортировать из PostgreSQL в формате CSV. Эти данные затем могут быть вставлены в ClickHouse как из локальных файлов, так и через объектное хранилище с помощью табличных функций.
Нужна помощь с вставкой больших наборов данных?

Если вам нужна помощь с вставкой больших наборов данных или вы столкнулись с какими-либо ошибками при импорте данных в ClickHouse Cloud, пожалуйста, свяжитесь с нами по адресу support@clickhouse.com, и мы можем помочь.