Как записать данные в Clickhouse с помощью Python

Contents

Как развернуть быстро Clickhouse с помощью Docker

Как собрать свой образ Clickhouse (docker-compose из оффициальной репы)

В репозитории Github Clickhouse лежит docker-compose.yml файл со следующим содержимым:

Данный файл запускает сборку образов и после сборки запускает контейнеры. Запустится три контейнера:

  • clickhouse_client_1
  • clickhouse_builder_1
  • clickhouse_server_1

Сразу скажу, что не очень подходящий способ для использования Clickhouse, т.к. сборка образов требует много времени и лучше использовать уже сформированный официальный образ от Clickhouse.

Но если вы хотите пойти по пути сборки своих образов, то Вам понадобится запустить следующие команды на сервере:

Если в браузере перейти по url http://localhost:8123/, то отрисуется сообщение OK

Установка Clickhouse из официального образа с hub.docker.com

Официальная инструкция как задеплоить образ находится здесь https://hub.docker.com/r/clickhouse/clickhouse-server/.

Запускаем команду:

Скачается официальный докер образ (но пока еще не запустится):

Далее необходимо запустить из образа контейнер:

Чтобы проверить, что у Вас запустился контейнер с Clickhouse — запустите команду:

Проверить работу Clickhouse-server можно перейдя по url http://localhost:8123/:

Далее запускаем команду:

С помощью этой команды мы подключимся к Clickhouse через native client:

Клиент командной строки

ClickHouse предоставляет собственный клиент командной строки: clickhouse-client. Клиент поддерживает запуск с аргументами командной строки и с конфигурационными файлами.

Клиент устанавливается пакетом clickhouse-client и запускается командой clickhouse-client.

Установка на Ubuntu:

Запуск клиента:

Клиенты и серверы различных версий совместимы, однако если клиент старее сервера, то некоторые новые функции могут быть недоступны. Рекомендуется использовать одинаковые версии клиента и сервера.

Видео «Установка базы данных ClickHouse в виде контейнера Docker»

Установка Clickhouse с помощью docker-compose

Источник docker-compose файла: ClickHouse Server in 1 minute with Docker

Создаем директорию:

Далее создаем папку db, куда clickhouse будет сохранять файлы:

Далее создаем файл docker-compose.yml

Далее запускаем установку с помощью docker-compose:

Зайти внутрь клиента кликхауса можно с помощью команды:

 

Подключаемся к Clickhouse с помощью DBeaver

Установить dbeaver в Ubuntu можно через Ubuntu Software:

Выбираем коннектор к Clickhouse:

Настройки подключения с дефолтным юзером:

show databases — проверочный запрос к clickhouse:

Интерфейсы для доступа к Clickhouse

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

Следующий кусок взят из официальной документации раздела «Интерфейсы»:

ClickHouse предоставляет три сетевых интерфейса (они могут быть обернуты в TLS для дополнительной безопасности):

  • HTTP, который задокументирован и прост для использования напрямую;
  • Native TCP, который имеет меньше накладных расходов;
  • gRPC.

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

Существует также широкий спектр сторонних библиотек для работы с ClickHouse:

Что такое http-интерфейс

HTTP интерфейс позволяет использовать ClickHouse на любой платформе, из любого языка программирования. HTTP интерфейс более ограничен по сравнению с родным интерфейсом, но является более совместимым. По умолчанию clickhouse-server слушает HTTP на порту 8123. Запрос отправляется в виде URL параметра с именем query. Или как тело запроса при использовании метода POST. Или начало запроса в URL параметре query, а продолжение POST-ом. Размер URL ограничен 16KB, это следует учитывать при отправке больших запросов.

Порт 8123 является конечной точкой интерфейса HTTP по умолчанию. Вы будете использовать этот порт, если используете команды curl для отправки запросов серверу. Кроме того, ряд библиотек, таких как JDBC-драйвер Yandex ClickHouse, скрытно используют HTTP-запросы, так что вы можете использовать http-интерфейс, даже не подозревая об этом.

Что такое Native TCP (Родной интерфейс)

Нативный протокол используется в клиенте командной строки, для взаимодействия между серверами во время обработки распределенных запросов, а также в других программах на C++. К сожалению, у родного протокола ClickHouse пока нет формальной спецификации.

Порт 9000 является конечной точкой Native TCP интерфейса (по-умолчанию). Он широко используется клиентами, как показано на следующих примерах.

  • Clickhouse-client, стандартный клиент командной строки для ClickHouse, использует собственный протокол TCP/IP.
  • Точно так же механизм ClickHouse Distributed использует собственный протокол TCP/IP для отправки подзапросов в базовые таблицы. В редких случаях он также используется реплицированными таблицами при отправке запросов ведущей реплике.
  • Наконец, драйверы, такие как драйвер Python clickhouse или драйвер Golang, общаются с ClickHouse, используя собственный протокол TCP/IP.

Что такое gRPC

ClickHouse поддерживает интерфейс gRPC. Это система удаленного вызова процедур с открытым исходным кодом, которая использует HTTP/2 и Protocol Buffers.

gRPC — мощный фреймворк для работы с удаленными вызовами процедур. RPC позволяют писать код так, как если бы он был запущен на локальном компьютере, даже если он может выполняться на другом компьютере.

Как правило, gRPC считается лучшей альтернативой протоколу REST для микросервисной архитектуры. Букву g в gRPC можно отнести к компании Google, которая изначально разработала эту технологию. gRPC создан для преодоления ограничений REST в связи с микросервисами.

gRPC — это новейшая структура, созданная на основе протокола RPC. Он использует свои преимущества и пытается исправить проблемы традиционного RPC. gRPC использует буферы протокола в качестве языка определения интерфейса для сериализации и связи вместо JSON/XML.

Буферы протокола могут описывать структуру данных, и на основе этого описания может быть сгенерирован код для генерации или анализа потока байтов, представляющего структурированные данные. По этой причине gRPC предпочтительнее для многоязычных веб-приложений (реализованных с использованием различных технологий). Формат двоичных данных позволяет облегчить общение. gRPC также можно использовать с другими форматами данных, но предпочтительным является буфер протокола.

Кроме того, gRPC построен на основе HTTP/2, который поддерживает двунаправленную связь наряду с традиционным запросом/ответом. gRPC допускает слабую связь между сервером и клиентом. На практике клиент открывает долговременное соединение с сервером gRPC, и новый поток HTTP/2 открывается для каждого вызова RPC.

В отличие от REST, который использует JSON (в основном), gRPC использует буферы протокола, которые являются лучшим способом кодирования данных. Поскольку JSON — это текстовый формат, он будет намного тяжелее, чем сжатые данные в формате protobuf.

Network Listener Configuration

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

Тег Описание Условное значение
http_port Порт для незашифрованных HTTP-запросов 8123
https_port Порт для зашифрованных запросов HTTPS 8443
interserver_http_port Порт для незашифрованного трафика HTTP-репликации 9009
interserver_https_port Порт для зашифрованного трафика репликации HTTPS  
tcp_port Порт для незашифрованных собственных запросов TCP/IP 9000
tcp_port_secure Порт для зашифрованных TLS собственных запросов TCP/IP 9440

Как создать database в Clickhouse, таблицу и вставить тестовые данные

Идем в dbeaver и запускаем скрипты.

1. Создаем базу данных в Clickhouse

2. Проверяем, что база данных создалась:

3. Создаем таблицу в Clickhouse:

4. Вставляем первую строку данных:

5. Проверяем, что в Clickhouse данные вставились:

Далее попробуем вставить еще 1 строку с помощью разных вариантов.

Как подключиться к Clickhouse с помощью Python

Вариант 1 — clickhouse-driver (Python Driver with native interface)

Установка:

Краткое описание: clickhouse-driver работает через 9000 порт, поэтому он должен быть открыт и должен быть настроен listener. По умолчанию 9000 порт в образе докера открыт, но может не настроен listener. Делается это через config файл для clickhouse server — по-умолчанию лежит тут etc/clickhouse-server/config.xml.

Пример запроса Show Databases:

Пример Select запроса:

Вставка 1 команды Insert через Execute:

Вставка dataframe pandas:

Подробности по настройкам можно почитать в документации в разделе NumPy/Pandas support >>>

 

Вариант 2 — sqlalchemy-clickhouse (ClickHouse dialect for SQLAlchemy)

https://github.com/cloudflare/sqlalchemy-clickhouse — этот коннектор рекомендуется для использования в superset. Строка подключения выглядит как:

Установка:

Пример Select запроса:

туду

Вариант 3 — pandahouse (Pandas interface for Clickhouse database)

Github проект Pandahouse — https://github.com/kszucs/pandahouse

Установка:

Пример Select запроса:

туду

Вариант 4 — aiochclient (http(s) ClickHouse client for python 3.6+)

https://github.com/maximdanilchenko/aiochclient — Lightweight async http(s) ClickHouse client for python 3.6+ with types converting

туду

Вариант 5 — asynch (native TCP interface)

https://github.com/long2ice/asynch — An asyncio ClickHouse Python Driver with native (TCP) interface support.

туду

Как создать таблицу в Clickhouse и записать данные с помощью Python

todo

Как получить данные из таблицы Clickhouse в Python

todo

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x