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

Contents

Что такое ClickHouse и какие есть в нем настройки

ClickHouse — это мощная столбцовая база данных, написанная на C, которая генерирует аналитические и статистические отчеты в режиме реального времени с помощью операторов SQL!

Какие кейсы использования ClickHouse могут быть: сессионная и событийная аналитика, аналитика по бизнес-метрикам, генерация аналитических запросов по структурированным данным c минимальной задержкой, анализ операционных логов, анализ финансовых данных, Data Science, продуктовая аналитика и т.п.


Выполнение запросов в ClickHouse осуществляется значительно быстрее, чем в Big Data системах класса SQL-on-Hadoop (например, такие системы, как Apache Hive, Cloudera Impala, Presto и Spark) или при работе с данными в колоночных форматах, таких как Parquet или Kudu.

Файлы конфигурации сервера ClickHouse

Конфигурация сервера Clickhouse состоит из двух частей: настроек сервера (config.xml) и настроек пользователей (users.xml).

По умолчанию они хранятся в папке /etc/clickhouse-server/ в двух файлах config.xml и users.xml.

Рекомендуется никогда не изменять файлы vendor config и помещать ваши изменения в отдельные файлы .xml в подпапках. Этот способ проще в обслуживании и упрощает обновление Clickhouse.

  • /etc/clickhouse-server/users.d — подпапка для пользовательских настроек.
  • /etc/clickhouse-server/config.d — подпапка для настроек сервера.
  • /etc/clickhouse-server/conf.d — подпапка для любых (обоих) настроек.

Имена ваших файлов xml могут быть произвольными, но они применяются в алфавитном порядке.

Описание общих ключевых моментов по ClickHouse

Официальная документацияConfiguration Files (En) & Конфигурационные файлы (Ru)

Конфигурационные файлы:

  • Основной файл конфигурации сервера — config.xml (в /etc/clickhouse-server/config.xml ) — все настройки сервера, такие как порт прослушивания,  регистратор, удаленный доступ, настройка кластера (shards и replicas), системные настройки (часовой пояс, umask и др.), мониторинг, журналы запросов, словари, сжатие и так далее.
    Настройки сервера: Server Configuration Parameters -> Server Settings (En)
  • Основной файл конфигурации пользователя — users.xml (в /etc/clickhouse-server/users.xml ), в котором указаны профили, пользователи, пароли, ACL, квоты и т.д. Он также поддерживает конфигурацию пользователя на основе SQL. 
    Доступные настройки и параметры пользователей: User Settings (En)
  • По умолчанию есть пользователь root с правами администратора без пароля, который может подключаться к серверу только с localhost.
  • Не редактируйте основные файлы конфигурации. Некоторые параметры могут быть объявлены устаревшими и удалеными, а измененный файл конфигурации может стать несовместимым с новыми выпусками.
  • Каждый параметр конфигурации можно переопределить с помощью файлов конфигурации в config.d/ (о чем было указано выше).

users.xml — здесь описываются юзеры с паролями, также задается список сетей для пользователей, квоты, описываются профили пользователей. Можно установить на пользователя дефолтный фильтр на конкретную таблицу, задать readonly mode и т.д.


Порты ClickHouse по умолчанию:

  • 8123 — порт HTTP — клиента (8443 — HTTPS). Клиент может подключаться к curl или wget или другим HTTP(S) — клиентам командной строки для управления и вставки данных в базы данных и таблицы.
  • 9000 — это собственный клиентский порт TCP/IP (9440 — это порт с поддержкой TLS для этой службы) для управления и вставки данных в базы данных и таблицы.
  • 9004 — это порт протокола MySQL. ClickHouse поддерживает проводной протокол MySQL.
  • 9009 — это порт, который ClickHouse использует для обмена данными между серверами ClickHouse при использовании настройки кластера и реплик/шардов.

Другие описания:

  • Существует каталог флагов , в котором файлы со специальными именами могут указывать ClickHouse для обработки команд. Например, создание пустого файла с именем: /var/lib/clickhouse/flags/force_restore_data даст указание ClickHouse начать процедуру восстановления сервера.
  • Хорошей практикой является создание резервной копии всего каталога конфигурации, несмотря на то, что основные файлы конфигурации не изменены и находятся в исходном состоянии.
  • Команды SQL, поддерживаемые сервером CickHouse : https://clickhouse.com/docs/en/sql-reference/ и https://clickhouse.com/docs/en/sql-reference/statements/
  • Базовым и фундаментальным типом таблицы является MergeTree , который предназначен для вставки очень большого количества данных в таблицу — https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/
  • Имейте в виду, ClickHouse поддерживает синтаксис SQL и некоторые операторы SQL, но операторы UPDATE и DELETE не поддерживаются, только INSERT !
    Основная идея ClickHouse — не изменять данные, а только добавлять!
  • Пакетные INSERT являются предпочтительным способом вставки данных! На самом деле в руководстве по ClickHouse есть рекомендация 1 INSERT в секунду.

Ряд описаний по параметрам запуска в Docker

Volumes

Как правило, вы можете смонтировать следующие папки внутри вашего контейнера для сохранения постоянства:

  • /var/lib/clickhouse/ — основная папка, в которой ClickHouse хранит данные;
  • /var/log/clickhouse-server/ — logs;
  • /etc/clickhouse-server/config.d/*.xml — файлы с настройками конфигурации сервера;
  • /etc/clickhouse-server/users.d/*.xml — файлы с настройками использования;
  • /docker-entrypoint-initdb.d/ — папка со скриптами инициализации базы данных;
  • /var/lib/clickhouse/user_files/ — файлы со словарями (пользовательские csv files).

Основная терминология по ClickHouse

  • Партиционирование данных — разбивка данных 1 большой таблицы на множество частей по какому-то признаку (например по периоду — по месяцам).
  • Шардирование — это стратегия горизонтального масштабирования кластера, при которой части одной базы данных ClickHouse размещаются на разных шардах. Шард состоит из одного или нескольких хостов-реплик. Запрос на запись или чтение в шард может быть отправлен на любую его реплику, выделенного мастера нет. При вставке данных они будут скопированы с реплики, на которой был выполен INSERT-запрос, на другие реплики шарда в асинхронном режиме.
  • Репликация — синхронизация данных между хостами-репликами в рамках одной шарды (в рамках одного кластера).
  • ClickHouse-кластер (или шард) — это один или несколько хостов базы данных, между которыми настраивается репликация.
  • Apache Zookeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.
  • Материальные вьюхи (Materialized View) — хранят данные, преобразованные соответствующим запросом SELECT. Материализованные представления в ClickHouse больше похожи на after insert триггеры. Если в запросе материализованного представления есть агрегирование, оно применяется только к вставляемому блоку записей. Любые изменения существующих данных исходной таблицы (например обновление, удаление, удаление раздела и т.д.) не изменяют материализованное представление.
  • Внешние словари — Существует возможность подключать собственные словари из различных источников данных. Источником данных для словаря может быть локальный текстовый/исполняемый файл, HTTP(s) ресурс или другая СУБД.
  • Engine — Движок таблицы (тип таблицы) определяет:

    • Как и где хранятся данные, куда их писать и откуда читать.
    • Какие запросы поддерживаются и каким образом.
    • Конкурентный доступ к данным.
    • Использование индексов, если есть.
    • Возможно ли многопоточное выполнение запроса.
    • Параметры репликации данных.

Clickhouse использует последовательные чтение и запись на диск.

Суть шардирования: взяли данные и разделили частями на разные шарды (на разные кластеры/серверы). Это нужно для хранения огромного числа данных. Заправшиваются данные с каждого шарда (запрос sql), затем результаты склеиваются и обрабатываются, после итоговый результат отдается юзеру.

Zookeeper — используется для хранения состояний репликации. В случае сбоя реплика пойдет в Zookeeper, получит инфу о данных, далее пойдет в соседнюю реплику и заберет нужный кусок данных. Потом, после обновления данных, реплика идет в Zookeeper и ставит пометку об обновлении.

Схема, поясняющая, что такое шард и реплика:

Шардирование и репликация данных в ClickHouse - схема

Репликация и шардирование настраивается на уровне таблиц. Т.е. можно сделать таблицы с разной конфигурацией (какие-то таблицы можно разнести на несколько шард, какие-то оставить на одной, аналогично настраивается реплицирование на уровне каждой отдельной таблицы).

Зачем нужна реплика:

  • Отказоустойчивость
  • Распараллеливание чтения

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

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

Установка 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 (localhost, default port 9000):

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

Подключиться к удаленному серверу ClickHouse можно с помощью команды:

В результате должны получить ответ:

 

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

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

Пример установки ClickHouse с помощью Docker Compose #1

Конфигурация ClickHouse в Docker Compose может выглядеть так:

В этом примере мы определяем контейнер ClickHouse, который будет доступен на портах 8123 и 9000 на хостовой машине. Мы также монтируем файл конфигурации config.xml, который может содержать пользовательские настройки и разрешения портов и IP.

Кроме того, мы определяем переменные среды CLICKHOUSE_USER и CLICKHOUSE_PASSWORD для настройки пользователя. Вы можете использовать эти переменные, чтобы задать имя пользователя и пароль для доступа к ClickHouse.

Мы также определяем сеть clickhouse-network, чтобы установить соединение между контейнерами. Как видите, мы указываем подсеть 172.25.0.0/16, которую можно изменить в соответствии с вашими потребностями.

Пример установки ClickHouse с помощью Docker Compose #2

Во втором примере мы определяем контейнер ClickHouse, который будет доступен на портах 8123 и 9000 на хостовой машине. Также я монтирую каталоги config.d и users.d, которые содержат файлы конфигурации и настроек пользователей соответственно:

Пример файла config.d для ClickHouse, который можно использовать в качестве шаблона:

 

Этот файл содержит настройки для ClickHouse, такие как порты для HTTP- и Native-протоколов, максимальное время выполнения запроса, максимальное количество строк в результате запроса и т.д.

Обратите внимание на элементы <compression> и <dictionaries_config>, которые позволяют задать настройки сжатия данных и словарей соответственно. Также в этом примере используется элемент <users_config>, который указывает ClickHouse на путь к файлам с настройками пользователей.

Это только пример файла конфигурации, и вы можете изменить его в соответствии с вашими потребностями и требованиями.


Также вы можете создать файлы настроек пользователей в каталоге users.d. Например, вы можете создать файл myuser.xml с таким содержимым:

Теперь при запуске контейнера ClickHouse будут использоваться настройки из файлов в каталогах config.d и users.d

Подключаемся к 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_connect

Другие примеры в официальном репозитории ClickHouse

https://github.com/ClickHouse/clickhouse-connect/tree/main/examples

 

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

Установка:

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

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

Пример Select запроса к ClickHouse

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

Вставка dataframe pandas в ClickHouse

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

Еще 1 пример вставки данных в ClickHouse с помощью библиотеки clickhouse-driver

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

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

Установка:

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

Пример полного скрипта Python для получения данных из ClickHouse:

Вставка данных в ClickHouse с помощью библиотеки sqlalchemy-clickhouse

Создадим таблицу, если ее еще не существует, используя функцию execute:

Пример полного скрипта Python для вставки данных в ClickHouse:

 

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

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

Установка:

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

Для того чтобы получить данные из ClickHouse с помощью библиотеки pandahouse в Python, необходимо выполнить следующие шаги:

  1. Установить библиотеку pandahouse с помощью pip: pip install pandahouse

  2. Импортировать библиотеку и создать соединение с базой данных ClickHouse:

  1. Выполнить запрос SELECT с помощью функции read_clickhouse и сохранить результат в объект DataFrame:

Пример полного скрипта Python для получения данных из ClickHouse:

Пример вставки данных в ClickHouse с помощью pandahouse

 

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

Условие:

Как создать таблицу в Clickhouse и записать 1 миллион строк данных с помощью Python. Нужно использовать библиотеку Pandas. Данные необходимо отправлять пакетно по 50 тысяч строк.

В этом примере мы создаем клиент для подключения к ClickHouse, определяем схему таблицы и создаем пустой DataFrame для хранения данных. Затем мы генерируем 1 миллион строк данных и добавляем их в DataFrame.

Мы создаем таблицу my_table в ClickHouse и отправляем данные пакетно по 50 тысяч строк с помощью цикла и команды INSERT INTO.

Обратите внимание на использование метода iterrows() для преобразования DataFrame в список кортежей, который может быть отправлен в ClickHouse.

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

Пример скрипта динамической вставки данных в ClickHouse

В этом примере мы загружаем данные из CSV-файла в Pandas, определяем столбцы и их типы в соответствии с DataFrame и создаем таблицу my_table в ClickHouse.

Затем мы отправляем данные пакетно по 100 тысяч строк с помощью цикла и команды INSERT INTO.

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

Пример #1

В этом примере мы создаем клиент для подключения к ClickHouse, выполняем запрос SELECT * FROM my_table и получаем результаты с помощью метода execute() клиента. Затем мы создаем DataFrame из результатов с помощью конструктора pd.DataFrame() и задаем имена столбцов DataFrame с помощью команды DESCRIBE my_table. После этого мы можем использовать полученный DataFrame для дальнейшей обработки данных.

Обратите внимание, что результаты запроса представляют собой список кортежей. Каждый кортеж представляет собой одну строку данных из таблицы ClickHouse. Мы преобразовали этот список в DataFrame с помощью конструктора pd.DataFrame(), передав ему список кортежей и список имен столбцов.

 

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