Подключение dlt к ClickHouse
dlt — это библиотека с открытым исходным кодом, которую можно добавить в Python-скрипты, чтобы загружать данные из различных, часто «грязных» источников в хорошо структурированные, постоянно обновляемые наборы данных.
Установка dlt с ClickHouse
Установите библиотеку dlt с зависимостями для ClickHouse:
Руководство по настройке
Инициализация проекта dlt
Начните с инициализации нового проекта dlt следующим образом:
Эта команда инициализирует ваш конвейер с chess в качестве источника и ClickHouse в качестве назначения.
Приведённая выше команда создаёт несколько файлов и каталогов, включая .dlt/secrets.toml и файл требований для ClickHouse. Вы можете установить необходимые зависимости, указанные в файле требований, выполнив следующую команду:
или с помощью pip install dlt[clickhouse], что устанавливает библиотеку dlt и необходимые зависимости для работы с ClickHouse в качестве назначения.
Настройка базы данных ClickHouse
Для загрузки данных в ClickHouse необходимо создать базу данных ClickHouse. Ниже приведён общий план действий:
-
Вы можете использовать существующую базу данных ClickHouse или создать новую.
-
Для создания новой базы данных подключитесь к серверу ClickHouse с помощью инструмента командной строки
clickhouse-clientили SQL-клиента по вашему выбору. -
Выполните следующие SQL-команды для создания новой базы данных, пользователя и предоставления необходимых разрешений:
Добавление учётных данных
Далее настройте учётные данные ClickHouse в файле .dlt/secrets.toml, как показано ниже:
Параметр http_port указывает номер порта, используемый при подключении к HTTP-интерфейсу сервера ClickHouse. Это отличается от порта по умолчанию 9000, который используется для нативного протокола TCP.
Вы должны установить http_port, если не используете внешнее промежуточное хранилище (т. е. не устанавливаете параметр staging в вашем конвейере). Это связано с тем, что встроенное промежуточное хранилище ClickHouse использует библиотеку clickhouse-connect, которая взаимодействует с ClickHouse по HTTP.
Убедитесь, что ваш сервер ClickHouse настроен на приём HTTP-соединений на порту, указанном в http_port. Например, если вы установили http_port = 8443, то ClickHouse должен прослушивать HTTP-запросы на порту 8443. Если вы используете внешнее промежуточное хранилище, вы можете опустить параметр http_port, поскольку clickhouse-connect не будет использоваться в этом случае.
Вы можете передать строку подключения к базе данных, аналогичную той, что используется библиотекой clickhouse-driver. Приведённые выше учётные данные будут выглядеть следующим образом:
Режим записи
Поддерживаются все режимы записи.
Режимы записи в библиотеке dlt определяют, как следует записывать данные в целевое хранилище. Существует три типа режимов записи:
Replace: Этот режим заменяет данные в целевом хранилище данными из ресурса. Он удаляет все классы и объекты схемы и заново создаёт схему перед загрузкой данных. Подробнее об этом можно узнать здесь.
Merge: Этот режим записи объединяет данные из ресурса с данными в целевом хранилище. Для режима merge необходимо указать primary_key для ресурса. Подробнее об этом можно узнать здесь.
Append: Это режим по умолчанию. Он добавляет данные к существующим данным в целевом хранилище, игнорируя поле primary_key.
Загрузка данных
Данные загружаются в ClickHouse с использованием наиболее эффективного метода в зависимости от источника данных:
- Для локальных файлов используется библиотека
clickhouse-connectдля непосредственной загрузки файлов в таблицы ClickHouse с помощью командыINSERT. - Для файлов в удалённом хранилище, таком как
S3,Google Cloud StorageилиAzure Blob Storage, используются табличные функции ClickHouse, такие как s3, gcs и azureBlobStorage, для чтения файлов и загрузки данных в таблицы.
Наборы данных
Clickhouse не поддерживает несколько наборов данных в одной базе данных, тогда как dlt по ряду причин основывается на концепции наборов данных. Чтобы Clickhouse корректно работал с dlt, имена таблиц, создаваемых dlt в вашей базе данных Clickhouse, будут начинаться с имени набора данных, разделённого настраиваемым dataset_table_separator. Кроме того, будет создана специальная сигнальная таблица, которая не содержит никаких данных и позволяет dlt распознавать, какие виртуальные наборы данных уже существуют в пункте назначения Clickhouse.
Поддерживаемые форматы файлов
- jsonl — предпочтительный формат как для прямой загрузки, так и для промежуточного хранения (staging).
- parquet поддерживается как для прямой загрузки, так и для промежуточного хранения (staging).
Назначение (destination) clickhouse имеет несколько специфических отличий от стандартных SQL-назначений:
- В
ClickHouseесть экспериментальный тип данныхobject, но на практике он ведёт себя несколько непредсказуемо, поэтому назначение dlt clickhouse будет загружать сложный тип данных в текстовый столбец. Если вам нужна эта возможность, присоединяйтесь к нашему сообществу в Slack, и мы рассмотрим её добавление. ClickHouseне поддерживает тип данныхtime. Значения времени будут загружаться в столбец типаtext.ClickHouseне поддерживает тип данныхbinary. Вместо этого двоичные данные будут загружаться в столбец типаtext. При загрузке изjsonlдвоичные данные будут представлять собой строку в формате base64, а при загрузке из parquet объектbinaryбудет преобразован вtext.ClickHouseпозволяет добавлять в уже заполненную таблицу столбцы с ограничениемNOT NULL.ClickHouseпри определённых условиях может давать ошибки округления при использовании типов данных float или double. Если для вас недопустимы ошибки округления, обязательно используйте тип данных decimal. Например, загрузка значения 12.7001 в столбец типа double при формате файлов загрузчика, установленном вjsonl, предсказуемо приведёт к ошибке округления.
Поддерживаемые подсказки для столбцов
ClickHouse поддерживает следующие подсказки для столбцов:
primary_key— помечает столбец как часть первичного ключа. Для создания составного первичного ключа этой подсказкой можно пометить несколько столбцов.
Табличный движок
По умолчанию таблицы создаются с использованием табличного движка ReplicatedMergeTree в ClickHouse. Вы можете указать другой табличный движок с помощью параметра table_engine_type в адаптере ClickHouse:
Поддерживаемые значения:
merge_tree— создаёт таблицы с использованием движкаMergeTreereplicated_merge_tree(по умолчанию) — создаёт таблицы с использованием движкаReplicatedMergeTree
Поддержка промежуточного хранилища
ClickHouse поддерживает Amazon S3, Google Cloud Storage и Azure Blob Storage в качестве целевых промежуточных хранилищ файлов.
dlt будет выгружать файлы Parquet или jsonl в промежуточное хранилище и использовать табличные функции ClickHouse для загрузки данных непосредственно из этих файлов.
Обратитесь к документации по файловой системе, чтобы узнать, как настроить учетные данные для промежуточных хранилищ:
Чтобы запустить конвейер с включённым промежуточным хранилищем:
Использование Google Cloud Storage как промежуточного хранилища
dlt поддерживает использование Google Cloud Storage (GCS) в качестве промежуточного хранилища при загрузке данных в ClickHouse. Это выполняется автоматически с помощью табличной функции GCS ClickHouse, которую dlt использует под капотом.
Табличная функция GCS ClickHouse поддерживает аутентификацию только с использованием ключей Hash-based Message Authentication Code (HMAC). Для этого GCS предоставляет режим совместимости с S3, эмулирующий API Amazon S3. ClickHouse использует это, чтобы получать доступ к бакетам GCS через свою интеграцию с S3.
Чтобы настроить промежуточное хранилище GCS с аутентификацией HMAC в dlt:
-
Создайте HMAC-ключи для вашего сервисного аккаунта GCS, следуя руководству Google Cloud.
-
Укажите HMAC-ключи, а также
client_email,project_idиprivate_keyдля вашего сервисного аккаунта в настройках назначения ClickHouse вашего проекта dlt в файлеconfig.toml:
Примечание: В дополнение к HMAC‑ключам bashgcp_access_key_id и gcp_secret_access_key теперь нужно указать client_email, project_id и private_key для вашей учетной записи службы (service account) в секции [destination.filesystem.credentials]. Это связано с тем, что поддержка промежуточного размещения (staging) в GCS сейчас реализована как временное обходное решение и пока не оптимизирована.
dlt передаст эти учетные данные в ClickHouse, который будет отвечать за аутентификацию и доступ к GCS.
Ведётся активная работа по упрощению и улучшению настройки промежуточного размещения в GCS для назначения (destination) ClickHouse dlt в будущем. Полноценная поддержка GCS staging отслеживается в следующих задачах GitHub:
- Обеспечить работу файлового назначения с GCS в режиме совместимости с S3
- Поддержка области промежуточного размещения Google Cloud Storage
Поддержка dbt
Интеграция с dbt в целом поддерживается через dbt-clickhouse.
Синхронизация состояния dlt
Это назначение полностью поддерживает синхронизацию состояния dlt.