Как подключиться к clickhouse из windows

Обновлено: 04.07.2024

Пакеты с клиентом и сервером Clickhouse имеются в официальных репозиториях Debian Buster. Для их установки можно воспользоваться следующей командой: Для работы серверу Clickhouse требуется поддержка дополнительных процессорных инструкций SSE 4.2. Чтобы проверить наличие поддержки этих инструкций и пересобрать Clickhouse, если они не поддерживаются, обратитесь к статье Пересборка Clickhouse для процессоров без поддержки SSE 4.2.

  • display_name - отображаемое в клиенте имя сервера,
  • max_connections - максимальное количество подключений от клиентов,
  • max_concurrent_queries - максимальное количество одновременно обрабатываемых запросов. Т.к. каждый запрос обслуживается конвейером из нескольких потоков, то каждый запрос порождает нагрузку как минимум на одно процессорное ядро. Лучше всего будет выполнять одновременно количество запросов, не превышающее количество процессорных ядер сервера или виртуальной машины.
  • uncompressed_cache_size задаёт размер кэша несжатых данных в байтах. Если предполагается, что на сервере часто будут выполняться короткие запросы, этот кэш поможет снизить нагрузку на дисковую подсистему. Обратите внимание, что в настройках пользователя должно быть разрешено использование кэша несжатых данных в опции use_uncompressed_cache.
  • mark_cache_size - кэш меток. Метки являются своего рода индексами данных. Сервер Clickhouse не хочет запускаться, если значение этой настройки меньше 5 гигабайт. Хорошая новость в том, что память под этот кэш будет выделяться по мере необходимости.
  • path - путь к файлам базы данных,
  • default_database - имя базы данных, с которой будут работать клиенты, не указавшие какую-то определённую базу данных,
  • timezone - часовой пояс сервера.
  • users - пользователи базы данных. Каждый пользователь содержит ссылку на профиль и квоту,
  • profiles - профили содержат настройки пользователей,
  • quotas - квоты содержат ограничения на выполнение запросов от пользователей.
  • max_memory_usage - максимальный объём памяти, который сервер может выделить пользователю для обработки его запросов, в примере настроено ограничение в 2 гигабайта,
  • max_query_size - максимальный размер одного запроса, по умолчанию - 256 килобайт, в примере - 1 мегабайт,
  • max_ast_elements - максимальное количество элементов в дереве синтаксического разбора, по умолчанию - 50 тысяч элементов, в примере - 1 миллион элементов,
  • use_uncompressed_cache - значение этой опции разрешает или запрещает использование кэша несжатых данных, в примере значение 1 разрешает его использование,
  • readonly - значение этой опции разрешает или запрещает запросы на изменение данных, в примере значение 0 разрешает изменение данных.

Включим автозапуск сервера: Запустим сервер:

Решение проблем

This file contains the maximum number of memory map areas a process may have. Memory map areas are used as a side-effect of calling malloc, directly by mmap and mprotect, and also when loading shared libraries.

While most applications need less than a thousand maps, certain programs, particularly malloc debuggers, may consume lots of them, e.g., up to one or two maps per allocation.

The default value is 65536.

Этот файл содержит максимальное количество участков памяти, которое может иметь процесс. Участки памяти косвенно создаются при вызове malloc, а напрямую - при вызове mmap и mprotect, а также при загрузке разделяемых библиотек.

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

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

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

Использование

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

В batch режиме в качестве формата данных по умолчанию используется формат TabSeparated . Формат может быть указан в запросе в секции FORMAT .

По умолчанию в batch режиме вы можете выполнить только один запрос. Чтобы выполнить несколько запросов из «скрипта», используйте параметр –-multiquery . Это работает для всех запросов кроме INSERT . Результаты запросов выводятся подряд без дополнительных разделителей.
Если нужно выполнить много запросов, вы можете запускать clickhouse-client отдельно на каждый запрос. Заметим, что запуск программы clickhouse-client может занимать десятки миллисекунд.

В интерактивном режиме вы получаете командную строку, в которую можно вводить запросы.

Если не указано multiline (по умолчанию):
Чтобы выполнить запрос, нажмите Enter. Точка с запятой на конце запроса необязательна. Чтобы ввести запрос, состоящий из нескольких строк, в конце строки поставьте символ обратного слеша \ , тогда после нажатия Enter вы сможете ввести следующую строку запроса.

Если указан параметр --multiline (многострочный режим):
Чтобы выполнить запрос, завершите его точкой с запятой и нажмите Enter. Если в конце введённой строки не было точки с запятой, то вам предложат ввести следующую строчку запроса.

Исполняется только один запрос, поэтому всё, что введено после точки с запятой, игнорируется.

Вместо или после точки с запятой может быть указано \G . Это обозначает использование формата Vertical. В этом формате каждое значение выводится на отдельной строке, что удобно для широких таблиц. Столь необычная функциональность добавлена для совместимости с MySQL CLI.

Командная строка сделана на основе readline (и history) (или libedit, или без какой-либо библиотеки, в зависимости от сборки) - то есть, в ней работают привычные сочетания клавиш, а также присутствует история.
История пишется в

По умолчанию используется формат вывода PrettyCompact (он поддерживает красивый вывод таблиц). Вы можете изменить формат вывода результатов запроса следующими способами: с помощью секции FORMAT в запросе, указав символ \G в конце запроса, используя аргументы командной строки --format или --vertical или с помощью конфигурационного файла клиента.

Чтобы выйти из клиента, нажмите Ctrl+D или наберите вместо запроса одно из: «exit», «quit», «logout», «учше», «йгше», «дщпщге», «exit;», «quit;», «logout;», «учшеж», «йгшеж», «дщпщгеж», «q», «й», «q», «Q», «:q», «й», «Й», «Жй».

При выполнении запроса клиент показывает:

  1. Прогресс выполнение запроса, который обновляется не чаще, чем 10 раз в секунду (по умолчанию). При быстрых запросах прогресс может не успеть отобразиться.
  2. Отформатированный запрос после его парсинга - для отладки.
  3. Результат в заданном формате.
  4. Количество строк результата, прошедшее время, а также среднюю скорость выполнения запроса.

Вы можете прервать длинный запрос, нажав Ctrl+C. При этом вам всё равно придётся чуть-чуть подождать, пока сервер остановит запрос. На некоторых стадиях выполнения запрос невозможно прервать. Если вы не дождётесь и нажмёте Ctrl+C второй раз, то клиент будет завершён.

Клиент командной строки позволяет передать внешние данные (внешние временные таблицы) для выполнения запроса. Подробнее смотрите раздел «Внешние данные для обработки запроса».

Запросы с параметрами

Вы можете создать запрос с параметрами и передавать в них значения из приложения. Это позволяет избежать форматирования запросов на стороне клиента, если известно, какие из параметров запроса динамически меняются. Например:

Синтаксис запроса

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

  • name — идентификатор подстановки. В консольном клиенте его следует использовать как часть имени параметра --param_<name> = value .
  • data type — тип данных значения. Например, структура данных (integer, ('string', integer)) может иметь тип данных Tuple(UInt8, Tuple(String, UInt8)) (целочисленный тип может быть и другим). В качестве параметра можно передать название столбца, таблицы и базы данных, в этом случае используется тип данных Identifier .

Пример

Конфигурирование

В clickhouse-client можно передавать различные параметры (все параметры имеют значения по умолчанию) с помощью:

Параметры командной строки переопределяют значения по умолчанию и параметры конфигурационных файлов.

Параметры в конфигурационных файлах переопределяют значения по умолчанию.

Параметры командной строки

Начиная с версии 20.5, в clickhouse-client есть автоматическая подсветка синтаксиса (включена всегда).

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

clickhouse—client использует первый существующий файл из:

  • Определенного параметром --config-file .
  • ./clickhouse-client.xml

Пример конфигурационного файла:

Формат ID запроса

В интерактивном режиме clickhouse-client показывает ID для каждого запроса. По умолчанию ID выводится в таком виде:

Произвольный формат ID можно задать в конфигурационном файле внутри тега query_id_formats . ID подставляется вместо в строке формата. В теге может быть перечислено несколько строк формата.
Эта возможность может быть полезна для генерации URL, с помощью которых выполняется профилирование запросов.

Пример

Если применить приведённую выше конфигурацию, то ID запроса будет выводиться в следующем виде:


ClickHouse — это колоночная база данных, разработанная Яндексом для обработки аналитических запросов, которая идеально подходит для решения задач интернет-маркетинга.

Мы подготовили данное руководство, чтобы облегчить начало работы с ClickHouse digital-аналитикам.

Unfortunately, the navigation through the article could not be displayed. Check if JavaScript is enabled in your browser К сожалению, не удалось отобразить навигацию по статье. Проверьте, включен ли в вашем браузере JavaScript

Видеоинструкция

Покупка сервера для установки ClickHouse

Чтобы установить ClickHouse, необходимо купить виртуальную машину, которая работает на операционной системе Ubuntu.

В качестве примера рассмотрим покупку сервера на DigitalOcean.
После регистрации выберите Create Droplets:


После чего откроется страница конфигурации сервера. Выберите следующие настройки:

  1. Операционную систему Ubuntu.
    Версия: 18.04.
  2. Местоположение сервера — Амстердам.
  3. Укажите размер виртуальной машины: 3 GB Memory, 1 vCPU и 60 GB SSD.

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

После создания виртуальной машины на почту приходит письмо с SSH-доступом к серверу.

Установка ClickHouse

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

SSH-клиент — это программа, позволяющая управлять сервером через командную строку.

Подойдет любое приложение, например:

Запустите SSH-клиент.
Для подключения к серверу укажите IP-адрес сервера, логин, а после авторизации задайте пароль.

Далее следуйте инструкции, подготовленной нашей командой.

Для этого копируйте команды из Google Docs или последовательно вставляйте указанные команды ниже в консоль SSH-клиента:

На этом установка завершена. Чтобы убедиться, что она прошла успешно, запустите консольный клиент:

После чего выполните тестовый запрос к ClickHouse:

Если всё в порядке, то в качестве ответа запрос вернет 1 (единицу). Выйдите из клиента и приступайте к завершающему этапу: настройке ClickHouse.

Настройка ClickHouse

Для обеспечения дальнейшей безопасной и комфортной работы ClickHouse нужно настроить:

  • Открыть подключение по IP.
    Непосредственно после установки ClickHouse закрыт для подключения.
  • Установить Tabix.
    Работать с ClickHouse удобнее через графический клиент Tabix, который является редактором select-запросов.
  • Создать учетную запись.
    Необходимо создать учетную запись, под которой будет осуществляться доступ к ClickHouse. По умолчанию в ClickHouse не установлен пароль.

Открыть подключение по IP


Где вместо 0.0.0.0 следует указать IP-адрес вашего сервера. В ClickHouse по умолчанию создана учетная запись с логином default. Воспользуйтесь ею, чтобы войти в Tabix:

Пароль отсутствует. Чтобы поставить ограничение по паролю, следуйте инструкции ниже.

Установка Tabix (графический клиент)


Где вместо 0.0.0.0 следует указать IP-адрес вашего сервера. В ClickHouse по умолчанию создана учетная запись с логином default. Воспользуйтесь ею, чтобы войти в Tabix:

Пароль отсутствует. Чтобы поставить ограничение по паролю, следуйте инструкции ниже.

Создание учетной записи

По умолчанию ClickHouse создает пользователя с логином default без пароля. Пароль можно задать в открытом или закодированном виде (SHA-256).

Не следует рассматривать такие пароли как защиту от потенциального злоумышленника. Скорее, они нужны для защиты от сотрудников.

Сгенерировать пароль можно командой:

Где вместо testPasword укажите необходимый пароль.

После выполнения команды в ответ получим пароль в закодированном виде.
Чтобы указать его в качестве пароля, необходимо отредактировать файл users.xml.

Для этого выполните команду:

Откроется файл с настройками пользователей ClickHouse:


Где укажем для пользователя default сгенерированный пароль:

<password_sha256_hex>f501c3dc6d2bb6949f593a90c93eb9</password_sha256_hex> .

Также можно указать пароль в открытом виде:

Не забудьте сохранить изменения. С этого момента, чтобы подключиться к Tabix, необходимо задать логин и пароль.

Загрузка данных в ClickHouse

Renta позволяет загружать данные в ClickHouse из различных рекламных источников, систем аналитики и баз данных, например, из Google AdWords или Яндекс.Директ.

Полный список коннекторов и процесс настройки описан в документации.

Также доступен стриминг сырых данных Google Analytics c автоматическим объединением данных из рекламных источников, CRM-системы.

Подключение Power BI к ClickHouse

Для этого в Power BI выберите в качестве источника данных Web:

И укажите следующие данные:

  • адрес сервера и порт,
  • доступы к ClickHouse,
  • select-запрос (который вернет необходимые данные),
  • указать формат выгрузки: TSV или CSV.

Например, в Power BI необходимо подтянуть количество сессий по рекламным источникам. Допустим, что запрос к ClickHouse выглядит следующим образом:

Готовим URL, который вернет результат запроса в виде СSV-файла.
Структура URL должна выглядеть следующим образом:

Чтобы перевести запрос в формат URL-a, воспользуйтесь любым decoder-ом.

Настройка обновления в Power BI Online

Power BI Online требует установку gateway для обновления отчетов в облаке. Но это можно обойти, если к серверу, на котором установлен ClickHouse, подвязать домен.

В настройках домена создайте поддомен, а в качестве A-записи укажите IP-адрес сервера.

Настройка происходит на стороне хостинга, к которому подвязан домен.

В результате, в качестве источника данных вместо IP-адреса указывайте домен.

При использовании поддомена установка gateway не требуется.

Остались вопросы?

Если у вас остались вопросы — задавайте их в комментариях.
Мы с удовольствием подготовим на них ответы.

Clickhouse установка и использование / clickhouse-mysql установка

1. Установите среду clickhouse

ClickHouse лучше поддерживает Debian / Ubuntu, но мы обычно используем CentO для сервера во время работы. Сегодня мы используем CentOs7 для установки ClickHouse.
Версия операционной системы: CentOS Linux выпуск 7.5.1804 (Core)

Проверьте, поддерживается ли набор инструкций SSE 4.2:

2. Загрузите установочный пакет

Адрес для скачивания:

Примечание: во время второго шага установки будут возникать ошибки зависимостей, вам нужно скачать зависимости, yum install * ODBC *
Нет проблем снова установить clickhouse-server.
Путь конфигурации после установки: cd / etc / clickhouse-server /

Конфигурация 3.clickhouse

Отпусти удаленного доступа:
vi /etc/clickhouse-server/config.xml
Измените файл конфигурации сервера /etc/clickhouse-server/config.xml, строка 65, просто отпустите комментарий, исправленный контент выглядит следующим образом:

Настройки разрешения памяти:
vi /etc/clickhouse-server/users.xml

4. Локальный клиент использует clickhouse-client

Создать базу данных: (следуйте инструкциям mysql create)

Создайте таблицу данных: (механизм таблицы должен быть добавлен в конце)

Вставить через оператор вставки в: (строки вставляются в одинарные кавычки)

Импорт данных CSV-файла:

mysql импорт данных clickhouse

5. Python соединение с базой данных Clickhouse

Подключитесь к серверу clickhouse:

Операция запроса данных:

Операция вставки данных:

Работа с кейсом (чтение данных из оракула и вставка в clickhouse):

6. Clickhouse-MySQL установка и вставка данных в режиме реального времени

Проверено на CentOS 7

Установите репозитории EPEL (для python3) и MySQL (для libmysqlclient)

Если в вашем репо нет EPEL, пожалуйста, установите его прямо с сайта EPEL

Установите считыватель данных из packagecloud.io

Пакет clickhouse также будет установлен как зависимость.

Подготовьте файл конфигурации, скопируйте файл примера в производственную среду и отредактируйте его.

Мы решили описать простой и проверенный путь для тех, кто хочет внедрить аналитическую СУБД ClickHouse своими силами или просто испробовать ClickHouse на собственных данных. Именно этот путь прошли мы сами в новостном агрегаторе СМИ2 и добились впечатляющих результатов.

Clickhouse-client

В предисловии статьи — небольшой рассказ о наших попытках внедрить Druid и InfluxDB. Почему после успешного запуска ClickHouse мы смогли отказаться от использования InfiniDB и Cassandra.

Основная часть статьи посвящена продуктам-помощникам для работы с ClickHouse, которые мы сами разработали и выпустили в open-source. Кстати, добро пожаловать в pull requests с предложениями и замечаниями.

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

Мы определили для себя следующие критические требования к аналитической СУБД:

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

В качестве предыстории хотелось бы рассказать о том, какой технологический стек мы использовали ранее, от чего пришлось отказаться и как мы пришли к ClickHouse.

Неудачный опыт с Druid и InfluxDB

В этом году мы развернули сборку на основе Druid — Imply Analytics Platform, а также Tranquility, и уже приготовились запускать в продакшн… Но после выхода ClickHouse сразу отказались от Druid, хотя потратили два месяца на его изучение и внедрение.

Из плюсов отметили для себя следующее:

Однако следующие недостатки перевесили чашу весов:

  • Сложность инфраструктуры: требуются отдельные ноды для получения, обработки и хранения данных, для отказоустойчивости необходимо двукратное количество серверов
  • Tranquility, предназначенный для realtime обработки данных, содержит ошибки, приводящие к падению всего Tranquility; версии Tranquility не совместимы между собой; для себя мы оценили Tranquility ка к хороший и интересный продукт, но пока в состоянии Beta

Также у нас был пробный подход к системе InfluxDB (см. статью), которую мы планировали использовать для построения и анализа метрик. Проект мы оценили для себя как глубокую Alfa из-за частых потерь данных и падений системы, поэтому работу в этом направлении мы тоже прекратили. Возможно, сейчас состояние продукта изменилось в лучшую сторону.

Cassandra и InfiniDB продержались у нас два года

Cassandra использовалась у нас в продакшне с 2014 по 2016 год:

  • Работала на 5 серверах
  • Выдерживала нагрузку до 10К событий в секунду на вставку и примерно до 1К событий в секунду на чтение
  • Приблизительно 1 раз в 2 месяца случались рассинхронизации схем данных (возможно, это была проблема версии, которую мы использовали)

В этот же период мы использовали и InfiniDB. Из положительных моментов хотелось бы отметить следующие:

  • Поддержка оконных функций
  • Простота интеграции с существующим MySQL через движок Federated
  • Встроенный движок MyISAM и InnoDB, что позволяло делать выгрузки из движка InfiniDB в движок InnoDB внутри одного сервера
  • Возможность удаления партиций данных по каждому дню, по определенным колонкам

Однако не обошлось и без отрицательных моментов:

  • Отсутствие нормального кластера и репликации данных. Приходилось делать горячую копию данных, т. е. клон сервера
  • Первые версии приходилось регулярно перегружать из-за утечек памяти и зависаний сервиса
  • Зависание процессов на запись или запросов на чтение. Приходилось убивать долгие процессы через event handlers nagios
  • Сложность загрузки данных. Есть только отдельный консольный инструмент cpimport. Пришлось реализовывать обертку, которая разбирает вывод утилиты в stdout на ошибки и статистику результата выполнения вставки
  • Условная однопоточность: или пишем, или читаем. Потребляется большой объем системных ресурсов

И тут «Яндекс» выложил в открытый доступ ClickHouse

Из-за недостатков и проблем с используемыми у нас для аналитики СУБД мы регулярно смотрели по сторонам в поисках альтернатив. В том числе мы обратили внимание на внутреннюю разработку «Яндекса», которая подкупала своим невероятным быстродействием и в целом соответствовала нашим ожиданиям от аналитической СУБД (см. выше).

В настоящий момент на рынке нет бесплатных или недорогих аналитических баз данных для обработки больших данных в режиме реального времени уровня, подобного ClickHouse. Во всяком случае, мы о таких не знаем. Из платных баз данных мы тестировали HP Vertica и Greenplum. Аналитику можно считать и с помощью MapReduce на Hadoop, но не в режиме, близком к реальному времени. Кстати, в самом «Яндексе» есть YT («Ыть», как они сами ее называют) — MapReduce-платформа для работы с большими данными, но она тоже не работает в режиме реального времени, хотя активно используется. То есть для аналитики в режиме реального времени, по нашему мнению, больше всего подходит ClickHouse. Поэтому, когда «Яндекс» опубликовал летом ClickHouse в открытый доступ, мы однозначно решили его попробовать.

Мы можем уверенно утверждать, что процесс запуска ClickHouse прошел у нас быстрее и проще, чем с другими СУБД. Надеемся, что наша статья позволит вам сделать это существенно быстрее :)

Если пропустить историю о том, как мы запускали ClickHouse и в итоге успешно запустили, то стоит отметить следующие результаты запуска ClickHouse.

Выгоды в разработке. В относительно короткий срок нам удалось закрыть 80 % задач, связанных с анализом данных, а этих задач накопилось много. Новые задачи по аналитике стали выполняться гораздо проще и быстрее.

Выгоды в железе. По сравнению с тем же Druid, требования к железу у ClickHouse оказались существенно ниже, поэтому нам удалось сэкономить на железе. Плюс, мы отказались от 5 нод под Cassandra, 4 нод под InfiniDB и 2 нод под MySQL (исторически оставшейся аналитики). Итого мы отказались от 11 серверов, за которыми нужно было постоянно присматривать и не пропускать алерты о проблемах от nagios.

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

Выгоды в скорости. ClickHouse реально быстрый, мы убедились в этом на своих задачах, скорость возросла в несколько раз!

Здесь многие подумают, что неплохо было бы привести для примера бенчмарки… Предлагаем обратиться к бенчмаркам «Яндекса» и посмотреть наши ролики с запросами на реальных наборах данных. Статистика собираемых и анализируемых нами с помощью ClickHouse данных на текущий момент такова:

  • регистрируется до 8 000—12 000 событий в секунду
  • приблизительно 21,5 млрд событий за месяц
  • примерно 10 млрд строк в базе за месяц

Данные хранятся на 6 серверах SX131 от Hetzner с 3 шардами по 2 реплики.

Как у любого продукта для работы с данными, у ClickHouse есть свои особенности. Вот некоторые из них:

  • Отсутствие UPDATE и производных: INSERT UPDATE и DELETE
  • Отсутствие транзакционности
  • Удаление данных по месяцу через удаление партиций

Кроме этого, ClickHouse не умеет строить графики «из коробки», для этого нужны дополнительные инструменты.

Для нас не важна транзакционность и отсутствие UPDATE / DELETE. Мы давно привыкли обходить эти проблемы. Однако нам очень хотелось бы иметь возможность хранить данные только за несколько дней. В планах «Яндекса» — добавить возможность удаления партиций по дням.

В процессе освоения и внедрения ClickHouse мы столкнулись с некоторыми неудобствами и отсутствием нужных нам «плюшек». Поэтому, не став ждать милостей от « Яндекса » природы, мы решили облегчить себе работу сами. Еще одним мотиватором было то, что нам хотелось внести свой вклад в развитие перспективного open-source проекта. Плюс — это был наш первый опыт участия в open-source разработке.

Так родились два наших open-source проекта, которые позволили нам самим существенно ускорить и упростить процесс внедрения ClickHouse и работу с ним:

    для работы с БД для удобной работы с БД, реализующая возможности ClickHouse

Ниже описаны основные возможности каждого проекта.

Наш графический клиент для ClickHouse: возможности и особенности

  • Просмотр списка баз данных и таблиц
  • Просмотр содержимого таблицы
  • Подсветка функций ClickHouse, названий таблиц и полей
  • Автодополнение для названий таблиц, колонок и встроенных функций
  • Выполнение выделенного / текущего / нескольких запросов в редакторе
  • Автоматическое определение типа запроса: CREATE TABLE / INSERT / SELECT
  • Удобная вставка значений словарей
  • Темы оформления для редактора запросов, темы оформления для всего редактора (светлая и темная)
  • Горячие клавиши

Клиент написан полностью на JavaScript, без использования server side.

Вы можете спокойно использовать наш последний опубликованный билд.

Наш PHP-драйвер для ClickHouse: возможности и особенности

  • Отсутствие зависимостей, требуются только модули curl и json
  • Работа с кластером ClickHouse, автоматическое определение необходимых нод при разных конфигурациях
  • Выполнение запроса на каждой ноде в кластере (см. наш отдельный проект, посвященный миграциям на ClickHouse)
  • Асинхронное выполнение запросов на чтение данных и вставку данных
  • Поддержка сжатия на лету при записи данных в ClickHouse из локального файла без создания временных файлов
  • Поддержка запросов на чтение с использованием локального CSV-файла для выполнения запроса вида select * from X where id in (local_csv_file)
  • Работа с партициями таблиц
  • Вставка массива в колонку
  • Запись результата запроса напрямую в файл с поддержкой сжатия без создания временных файлов
  • Получение размера таблицы, базы и списка процессов на каждой ноде
  • Получение статистики выполнения запроса SELECT

Драйвер протестирован на PHP 5.6 и 7, HHVM 3.9.

Хотим сразу предупредить читателей, что драйвер не использует готовые решения вроде Guzzle (и PSR-7 вообще), а реализован через файл include.php . Надеемся, что этот факт не отпугнет вас от дальнейшего чтения.

Рассмотрим на примере, как работать ClickHouse из PHP и с помощью нашего графического клиента.

Считаем, что вы успешно установили ClickHouse из deb-пакета последней версии и ознакомились с Quick start guide.

На каждом сайте совершаются события, связанные со статьями (новостями). Мы будем регистрировать данные о показах статей (views) и кликах по каждой статье (clicks).

По каждому событию мы будем фиксировать несколько атрибутов:

  • IP-адрес пользователя
  • город пользователя
  • referer
  • UTM-метку из referer
  • уникальный ID пользователя

Подключение к серверу ClickHouse, создание БД и таблицы

Для записи данных о событиях создадим на сервере ClickHouse базу данных articles и внутри — нее таблицу events со следующей структурой:

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

Clickhouse GUI example

Поясним некоторые параметры этого запроса:

  • MergeTree — это движок таблицы. Также существуют Log , CollapsingMergeTree , SummingMergeTree , ReplacingMergeTree и другие.
  • Первый параметр event_date указывает на имя столбца типа Date, содержащего дату.
  • (site_id, event_type, article_id) — кортеж, определяющий первичный ключ таблицы (индекс).

В большинстве запросов на чтение планируется указывать, по какому сайту нам нужны данные, поэтому первым в индексе используется site_id .

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

Установку стабильной сборки драйвера можно выполнить через composer :
composer require smi2/phpclickhouse

Более подробная информация по установке драйвера доступна в документации к драйверу, которая также содержит описание функций драйвера и ChangeLog.

После того как драйвер был успешно установлен, выполняем запрос на подключение к серверу, создание БД и таблицы:

Обращаем внимание, что запросы в драйвере разделены на следующие:

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

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

Вставка данных, в том числе из TSV-файла

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

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

Получим результат вставки данных:

Подробнее про чтение данных написано ниже. Для вставки большего количества строк воспользуемся прямой загрузкой TSV-файла, который будет генерироваться при событии. Для этого будем записывать TSV-файл на сервере, где происходят события, и для упрощения отправлять его в ClickHouse.

Допустим, что у нас есть некий класс UserEvent , который позволяет получить все необходимые данные для вставки, данные проверены на валидность внутри класса:

Запись будем производить в файл, ротируемый ежеминутно следующим способом (допускаем все недостатки — ошибки записи, блокировки, и т. д. — строка всегда записывается):

На GitHub для тестов сделан эмулятор класса UserEvent и пример использования этого класса с записью в базу.

Стоит отметить, что работа с CSV-файлами также поддерживается. Для них нужно использовать функцию insertBatchFiles() , аналогичную функции insertBatchTSVFiles() . Однако при использовании TSV-файлов появляется дополнительная возможность вставлять в поле DateTime дату и время в формате unix timestamp. Подробнее о поддержке формата TabSeparated см. в документации ClickHouse.

ClickHouse использует формат CSV, соответствующий RFC 4180. При этом стандартные средства PHP, а именно функция fputcsv() , не полностью соответствует требованиям формата (см. отчет об ошибке).

Для полноценной поддержки форматов TSV и CSV-файлов нами были реализованы преобразователи массива в строку: FormatLine::CSV() и FormatLine::TSV() , которые используют возможность ClickHouse хранить в колонках данные в виде массивов.

При больших объемах вставляемых из файлов данных включаем режим сжатия. В этом случае используется потоковое сжатие без создания временных файлов, что позволяет экономить на сетевых ресурсах сервера, немного увеличивая нагрузку на CPU. Скорость передачи данных возрастает, и суммарное время, затрачиваемое на обработку одного файла, уменьшается в несколько раз.

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

Поле utm будем заполнять из поля referer , если в нем указан utm_campaign, через функцию extractURLParameter(referer,’utm_campaign’) .

Чтение данных

Меньше слов — больше кода. Приведем простой пример, как два запроса выполняются параллельно через драйвер:

Вариант без асинхронности:

Результат запросов — это объект Statement , который умеет делать следующее:

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

Сколько пользователей, которые просматривали статьи, совершили клики:

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

Допустим, что нам нужно посчитать, сколько уникальных пользователей просмотрело за сутки статьи X, где в X перечислено несколько идентификаторов статей. Это можно сделать так:

В данном примере все будет прекрасно работать. Но что делать, если идентификаторов тысячи или десятки тысяч? В этом случае пригодится функционал ClickHouse, который позволяет использовать внешние данные для обработки запроса.

Рассмотрим эту возможность ClickHouse на примере. Создадим CSV-файл '/tmp/articles_list.csv' , в котором перечислим все нужные для запроса article_id , и попросим ClickHouse создать временную таблицу namex , содержащую одну колонку:

Тогда содержимое CSV-файла можно использовать на сервере:

См. этот пример на GitHub.

Также функцией attachFile() поддерживаются файлы в форматах TabSeparated и TabSeparatedWithNames.

На этом мы, пожалуй, завершим первую часть нашего рассказа о ClickHouse.

Много полезной информации о ClickHouse вы можете узнать в Гугл-группе.

Если у вас есть замечания или вы нашли ошибки, опечатки — добро пожаловать в мир open-source, будем ждать ваших pull request по этой статье. Если вы любите анализ данных и вам интересно поработать с данными и ClickHouse — добро пожаловать к нам в команду ;)

Мы планируем сделать цикл материалов, посвященных нашему опыту работы с ClickHouse.
В планах — следующие темы.

Читайте также: