Как записать данные в Clickhouse с помощью Python
- 1 Что такое ClickHouse и какие есть в нем настройки
- 2 Как развернуть быстро Clickhouse с помощью Docker
- 3 Подключаемся к Clickhouse с помощью DBeaver
- 4 Интерфейсы для доступа к Clickhouse
- 5 Как создать database в Clickhouse, таблицу и вставить тестовые данные
-
6 Как подключиться к Clickhouse с помощью Python
- 6.1 Вариант 1 — clickhouse-driver (Python Driver with native interface)
- 6.2 Вариант 2 — sqlalchemy-clickhouse (ClickHouse dialect for SQLAlchemy)
- 6.3 Вариант 3 — pandahouse (Pandas interface for Clickhouse database)
- 6.4 Вариант 4 — aiochclient (http(s) ClickHouse client for python 3.6+)
- 6.5 Вариант 5 — asynch (native TCP interface)
- 7 Как создать таблицу в Clickhouse и записать данные с помощью Python
- 8 Как получить данные из таблицы Clickhouse в Python
1 Что такое ClickHouse и какие есть в нем настройки
ClickHouse — это мощная столбцовая база данных, написанная на C, которая генерирует аналитические и статистические отчеты в режиме реального времени с помощью операторов SQL!
Какие кейсы использования ClickHouse могут быть: сессионная и событийная аналитика, аналитика по бизнес-метрикам, генерация аналитических запросов по структурированным данным c минимальной задержкой, анализ операционных логов, анализ финансовых данных, Data Science, продуктовая аналитика и т.п.
Выполнение запросов в ClickHouse осуществляется значительно быстрее, чем в Big Data системах класса SQL-on-Hadoop (например, такие системы, как Apache Hive, Cloudera Impala, Presto и Spark) или при работе с данными в колоночных форматах, таких как Parquet или Kudu.
1.1 Файлы конфигурации сервера 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 могут быть произвольными, но они применяются в алфавитном порядке.
1.2 Описание общих ключевых моментов по 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 в секунду.
1.3 Ряд описаний по параметрам запуска в Docker
1.3.1 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).
1.4 Основная терминология по 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 и ставит пометку об обновлении.
Схема, поясняющая, что такое шард и реплика:
Репликация и шардирование настраивается на уровне таблиц. Т.е. можно сделать таблицы с разной конфигурацией (какие-то таблицы можно разнести на несколько шард, какие-то оставить на одной, аналогично настраивается реплицирование на уровне каждой отдельной таблицы).
Зачем нужна реплика:
- Отказоустойчивость
- Распараллеливание чтения
Важно: Рекомендуется создавать реплицируемые таблицы на всех хостах кластера, иначе после восстановления кластера из резервной копии может произойти потеря данных.
2 Как развернуть быстро Clickhouse с помощью Docker
2.1 Установка Clickhouse из официального образа с hub.docker.com
Официальная инструкция как задеплоить образ находится здесь https://hub.docker.com/r/clickhouse/clickhouse-server/.
Запускаем команду:
sudo docker pull clickhouse/clickhouse-server
Скачается официальный докер образ (но пока еще не запустится):
Далее необходимо запустить из образа контейнер:
sudo docker run -d --name some-clickhouse-server -p 8123:8123 --ulimit nofile=262144:262144 yandex/clickhouse-server
Чтобы проверить, что у Вас запустился контейнер с Clickhouse — запустите команду:
sudo docker ps
Проверить работу Clickhouse-server можно перейдя по url http://localhost:8123/:
Далее запускаем команду:
sudo docker run -it --rm --link some-clickhouse-server:clickhouse-server yandex/clickhouse-client --host clickhouse-server
С помощью этой команды мы подключимся к Clickhouse через native client:
2.1.1 Клиент командной строки
ClickHouse предоставляет собственный клиент командной строки: clickhouse-client. Клиент поддерживает запуск с аргументами командной строки и с конфигурационными файлами.
Клиент устанавливается пакетом clickhouse-client и запускается командой clickhouse-client.
Установка на Ubuntu:
sudo apt install clickhouse-client
Запуск клиента для подключения к локальной базе ClickHouse (localhost, default port 9000):
$ clickhouse-client ClickHouse client version 20.13.1.5273 (official build). Connecting to localhost:9000 as user default. Connected to ClickHouse server version 20.13.1 revision 54442. :)
Клиенты и серверы различных версий совместимы, однако если клиент старее сервера, то некоторые новые функции могут быть недоступны. Рекомендуется использовать одинаковые версии клиента и сервера.
Подключиться к удаленному серверу ClickHouse можно с помощью команды:
clickhouse-client -h 63.21.103.142 --port 9000 -u datauser --password ovOIhfl73Nfk21Jlv -d default
В результате должны получить ответ:
ClickHouse client version 18.16.1. Connecting to database default at 63.21.103.142:9000 as user datauser. Connected to ClickHouse server version 20.13.1 revision 54442.
2.2 Видео «Установка базы данных ClickHouse в виде контейнера Docker»
2.3 Установка Clickhouse с помощью docker-compose
Источник docker-compose файла: ClickHouse Server in 1 minute with Docker
Создаем директорию:
mkdir clickhouse-dc cd clickhouse-dc
Далее создаем папку db, куда clickhouse будет сохранять файлы:
mkdir db
Далее создаем файл docker-compose.yml
version: '3' services: ch_server: image: yandex/clickhouse-server ports: - "8123:8123" volumes: - ./db:/var/lib/clickhouse networks: - ch_ntw ch_client: image: yandex/clickhouse-client entrypoint: - /bin/sleep command: - infinity networks: - ch_ntw
Далее запускаем установку с помощью docker-compose:
sudo docker-compose up -d
Зайти внутрь клиента кликхауса можно с помощью команды:
sudo docker-compose exec ch_server clickhouse-client
2.3.1 Файлы конфигурации сервера 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 могут быть произвольными, но они применяются в алфавитном порядке.
3 Подключаемся к Clickhouse с помощью DBeaver
Установить dbeaver в Ubuntu можно через Ubuntu Software:
Выбираем коннектор к Clickhouse:
Настройки подключения с дефолтным юзером:
show databases — проверочный запрос к clickhouse:
4 Интерфейсы для доступа к Clickhouse
ClickHouse имеет богатый набор функций для управления сетевыми подключениями для клиентов, а также для других серверов в кластере. Тем не менее, новым пользователям может быть сложно проработать возможные варианты, а опытным пользователям может быть сложно обеспечить полный доступ к развернутым системам для приложений и их надлежащую защиту.
Следующий кусок взят из официальной документации раздела «Интерфейсы»:
ClickHouse предоставляет три сетевых интерфейса (они могут быть обернуты в TLS для дополнительной безопасности):
- HTTP, который задокументирован и прост для использования напрямую;
- Native TCP, который имеет меньше накладных расходов;
- gRPC.
В большинстве случаев рекомендуется использовать подходящий инструмент или библиотеку, а не напрямую взаимодействовать с ClickHouse. Официально поддерживаемые Яндексом:
Существует также широкий спектр сторонних библиотек для работы с ClickHouse:
4.1 Что такое http-интерфейс
HTTP интерфейс позволяет использовать ClickHouse на любой платформе, из любого языка программирования. HTTP интерфейс более ограничен по сравнению с родным интерфейсом, но является более совместимым. По умолчанию clickhouse-server слушает HTTP на порту 8123. Запрос отправляется в виде URL параметра с именем query. Или как тело запроса при использовании метода POST. Или начало запроса в URL параметре query, а продолжение POST-ом. Размер URL ограничен 16KB, это следует учитывать при отправке больших запросов.
Порт 8123 является конечной точкой интерфейса HTTP по умолчанию. Вы будете использовать этот порт, если используете команды curl для отправки запросов серверу. Кроме того, ряд библиотек, таких как JDBC-драйвер Yandex ClickHouse, скрытно используют HTTP-запросы, так что вы можете использовать http-интерфейс, даже не подозревая об этом.
4.2 Что такое Native TCP (Родной интерфейс)
Нативный протокол используется в клиенте командной строки, для взаимодействия между серверами во время обработки распределенных запросов, а также в других программах на C++. К сожалению, у родного протокола ClickHouse пока нет формальной спецификации.
Порт 9000 является конечной точкой Native TCP интерфейса (по-умолчанию). Он широко используется клиентами, как показано на следующих примерах.
- Clickhouse-client, стандартный клиент командной строки для ClickHouse, использует собственный протокол TCP/IP.
- Точно так же механизм ClickHouse Distributed использует собственный протокол TCP/IP для отправки подзапросов в базовые таблицы. В редких случаях он также используется реплицированными таблицами при отправке запросов ведущей реплике.
- Наконец, драйверы, такие как драйвер Python clickhouse или драйвер Golang, общаются с ClickHouse, используя собственный протокол TCP/IP.
4.3 Что такое 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.
4.4 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 |
5. Как создать database в Clickhouse, таблицу и вставить тестовые данные
Идем в dbeaver и запускаем скрипты.
5.1. Создаем базу данных в Clickhouse
CREATE DATABASE db_superset ENGINE = Memory COMMENT 'The temporary database to test Clickhouse and Apache Superset';
5.2. Проверяем, что база данных создалась:
SELECT name, comment FROM system.databases WHERE name = 'db_superset';
5.3. Создаем таблицу в Clickhouse:
CREATE TABLE IF NOT EXISTS db_superset.facts ( id UInt32, product String, datetime DateTime, customer Nullable(String), amount Nullable(Float32) ) ENGINE = Log;
5.4. Вставляем первую строку данных:
INSERT INTO db_superset.facts (*) VALUES (1, 'product 1', '2021-10-01', 'Customer 1', 10);
5.5. Проверяем, что в Clickhouse данные вставились:
SELECT id, product, `datetime`, customer, amount FROM db_superset.facts;
Далее попробуем вставить еще 1 строку с помощью разных вариантов.
6 Как подключиться к Clickhouse с помощью Python
6.1 Вариант 1 — clickhouse-driver (Python Driver with native interface)
- https://github.com/mymarilyn/clickhouse-driver — ClickHouse Python Driver with native interface support
- Подробная документация по clickhouse-driver >>>
Установка:
pip install clickhouse-driver
Краткое описание: clickhouse-driver работает через 9000 порт, поэтому он должен быть открыт и должен быть настроен listener. По умолчанию 9000 порт в образе докера открыт, но может не настроен listener. Делается это через config файл для clickhouse server — по-умолчанию лежит тут etc/clickhouse-server/config.xml.
Пример запроса Show Databases:
from clickhouse_driver import Client client = Client('63.123.91.237') #логин пароль порт по умолчанию, дефолтная БД тоже по умолчанию result = client.execute("SHOW DATABASES") print(result)
Пример Select запроса:
from clickhouse_driver import Client client = Client('63.123.91.237') #логин пароль порт по умолчанию, дефолтная БД тоже по умолчанию result = client.execute("SELECT * FROM db_superset.facts") print(result)
Вставка 1 команды Insert через Execute:
from clickhouse_driver import Client import pandas as pd client = Client('63.123.91.237') client.execute("INSERT INTO db_superset.facts (*) VALUES (1, 'product 1', '2021-10-01', 'Customer 1', 10)")
Вставка dataframe pandas:
Подробности по настройкам можно почитать в документации в разделе NumPy/Pandas support >>>
from clickhouse_driver import Client import pandas as pd client = Client('63.123.91.237', settings={'use_numpy': True}) # Creating Dataframe df = pd.DataFrame([ [152, 'product 152', '2021-10-04', 'Customer 1', 4], [153, 'product 153', '2021-10-06', 'Customer 1', 5], [154, 'product 154', '2021-10-07', 'Customer 1', 7] ], columns =['id', 'product', 'datetime', 'customer', 'amount']) print(df) client.insert_dataframe(f'INSERT INTO db_superset.facts VALUES', df)
6.2 Вариант 2 — sqlalchemy-clickhouse (ClickHouse dialect for SQLAlchemy)
https://github.com/cloudflare/sqlalchemy-clickhouse — этот коннектор рекомендуется для использования в superset. Строка подключения выглядит как:
clickhouse+native://<user>:<password>@<host>:<port>/<database>[?options…]clickhouse://{username}:{password}@{hostname}:{port}/{database}
Установка:
pip install sqlalchemy-clickhouse
Пример Select запроса:
туду
6.3 Вариант 3 — pandahouse (Pandas interface for Clickhouse database)
Github проект Pandahouse — https://github.com/kszucs/pandahouse
Установка:
pip install pandahouse
Пример Select запроса:
туду
6.4 Вариант 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
туду
6.5 Вариант 5 — asynch (native TCP interface)
https://github.com/long2ice/asynch — An asyncio ClickHouse Python Driver with native (TCP) interface support.
туду
7 Как создать таблицу в Clickhouse и записать данные с помощью Python
todo
8 Как получить данные из таблицы Clickhouse в Python
todo
Автор: Иван Шамаев (оригинал статьи)