Введение
ClickHouse — это аналитическая база данных с открытым исходным кодом, ориентированная на столбцы, созданная Яндексом для OLAP и сценариев использования больших данных. ClickHouse поддерживает обработку запросов в реальном времени, что делает его подходящим для приложений, которым требуются аналитические результаты за одну секунду. ClickHouse Query Language — это диалект SQL, который обеспечивает мощные возможности декларативных запросов, предлагая конечным пользователям знакомство и меньшую кривую обучения.
Базы данных, ориентированные на столбцы, хранят записи в блоках, сгруппированных по столбцам, а не по строкам. Не загружая данные для столбцов, отсутствующих в запросе, базам данных, ориентированным на столбцы, требуется меньше времени для чтения данных во время выполнения запроса. В результате эти базы данных могут вычислять и возвращать результаты намного быстрее, чем традиционные системы на основе строк для определенных рабочих нагрузок, таких как OLAP.
Системы обработки онлайн-анализа (OLAP) позволяют упорядочивать большие объемы данных и выполнять сложные запросы. Я могу обрабатывать петабайты данных и быстро возвращать результаты запросов. Таким образом, OLAP полезен для работы в таких областях, как наука о данных и бизнес-анализ.
В этом руководстве вы установите сервер базы данных и клиент ClickHouse на свой компьютер. Вы будете использовать СУБД для типичных задач и при необходимости включить удаленный доступ с другого сервера, чтобы вы могли подключаться к базе данных с другого компьютера. Затем вы протестируете ClickHouse, моделируя и запрашивая данные о посещении примера веб-сайта.
Предпосылки
- Сервер Ubuntu 18.04 с включенным пользователем sudo без полномочий root.
Если вы хотите установить ClickHouse на удаленный сервер, продолжайте читать, в противном случае пропустите первый абзац «Подключение к серверу» и читайте следующий.
Подключение к серверу
Чтобы получить доступ к серверу, вам нужно знать IP-адрес. Вам также потребуется ваше имя пользователя и пароль для аутентификации. Чтобы подключиться к серверу как root, введите следующую команду:
ssh root@IP_DEL_SERVER
Далее вам нужно будет ввести пароль пользователя root.
Если вы не используете пользователя root, вы можете войти под другим именем пользователя с помощью той же команды, а затем изменить root на свое имя пользователя:
ssh nome_utente@IP_DEL_SERVER
Затем вам будет предложено ввести пароль пользователя.
Стандартный порт для подключения по ssh — 22, если ваш сервер использует другой порт, вам нужно будет указать его с помощью параметра -p, затем введите следующую команду:
ssh nome_utente@IP_DEL_SERVER -p PORTA
Шаг 1: Установите ClickHouse
В этом разделе вы установите сервер ClickHouse и клиентские программы с помощью apt-get
.
Яндекс поддерживает репозиторий APT с последней версией ClickHouse. Добавьте ключ GPG репозитория, чтобы вы могли безопасно загружать проверенные пакеты ClickHouse:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E0C56BD4
Вы увидите вывод, подобный следующему:
Executing: /tmp/apt-key-gpghome.JkkcKnBAFY/gpg.1.sh --keyserver keyserver.ubuntu.com --recv E0C56BD4
gpg: key C8F1E19FE0C56BD4: public key "ClickHouse Repository Key <[email protected]>" imported
gpg: Total number processed: 1
gpg: imported: 1
Вывод подтверждает, что вы успешно проверили и добавили ключ.
Добавьте репозиторий в список репозиториев APT, выполнив:
echo "deb http://repo.yandex.ru/clickhouse/deb/stable/main/" | sudo tee /etc/apt/sources.list.d/clickhouse.list
Теперь введите команду apt-get update
для обновления ваших пакетов:
sudo apt-get update
Теперь clickhouse-server
и clickhouse-client
будут доступны для установки. Установите их с помощью:
sudo apt-get install -y clickhouse-server clickhouse-client
Сервер и клиент ClickHouse успешно установлены. Теперь вы готовы запустить службу базы данных и убедиться, что она работает правильно.
Шаг 2. Запустите службу
Пакет clickhouse-server
, установленный в предыдущем разделе, создает службу systemd
, которая выполняет такие действия, как запуск, остановка и перезапуск сервера базы данных. systemd
— это система инициализации Linux для инициализации и управления службами. В этом разделе вы запустите службу и убедитесь, что она работает правильно.
Запустите clickhouse-server
, выполнив эту команду:
sudo service clickhouse-server start
Приведенная выше команда не будет отображать никаких результатов. Чтобы убедиться, что служба работает правильно, запустите:
sudo service clickhouse-server status
Вы увидите вывод, подобный следующему:
● clickhouse-server.service - ClickHouse Server (analytic DBMS for big data)
Loaded: loaded (/etc/systemd/system/clickhouse-server.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-03-09 20:19:14 CET; 2s ago
Main PID: 2549 (clickhouse-serv)
Tasks: 40 (limit: 2298)
CGroup: /system.slice/clickhouse-server.service
└─2549 /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml --pid-file=/run/clickhouse-server/clickhouse-server.pi
Вывод показывает, что сервер работает.
Сервер ClickHouse успешно запущен, и теперь вы можете использовать CLI-программу clickhouse-client
для подключения к серверу.
Шаг 3: Создайте базы данных и таблицы
В ClickHouse вы можете создавать и удалять базы данных, выполняя операторы SQL непосредственно в интерактивной подсказке базы данных. Инструкции состоят из команд, которые следуют определенному синтаксису и предписывают серверу базы данных выполнить запрошенную операцию вместе со всеми запрошенными данными. Вы можете создавать базы данных, используя синтаксис CREATE DATABASE table_name
. Чтобы создать базу данных, сначала запустите сеанс клиента, выполнив следующую команду, если вы ввели пароль в процессе установки:
clickhouse-client --password
Если вы не ввели пароль, просто введите эту команду:
clickhouse-client
Эта команда получит доступ к приглашению клиента, где вы можете выполнять операторы SQL ClickHouse для выполнения таких действий, как:
- Создание, обновление и удаление баз данных, таблиц, индексов, разделов и представлений.
- Запрос для получения данных, которые могут быть отфильтрованы и сгруппированы с использованием различных условий.
На этом шаге, когда клиент ClickHouse готов к вводу данных, вы создадите базу данных и таблицу. Для целей этого руководства вы создадите базу данных, называемую test
и в ней вы создадите таблицу, называемую visits
, которая отслеживает продолжительность посещений веб-сайта.
Теперь, когда вы находитесь в командной строке ClickHouse, создайте test
базу данных, выполнив:
CREATE DATABASE test;
Вы увидите следующий вывод, показывающий, что вы создали базу данных:
CREATE DATABASE test
Ok.
0 rows in set. Elapsed: 0.003 sec.
Таблица ClickHouse аналогична таблицам в других реляционных базах данных; содержит набор связанных данных в структурированном формате. Вы можете указывать столбцы с их типами, добавлять строки данных и выполнять различные типы запросов к таблицам.
Синтаксис создания таблиц в ClickHouse следует следующей примерной структуре:
CREATE TABLE table_name
(
column_name1 column_type [options],
column_name2 column_type [options],...
) ENGINE = engine
Значения table_name
и column_name
могут быть любым допустимым идентификатором ASCII. ClickHouse поддерживает множество типов столбцов; некоторые из самых популярных:
UInt64
: используется для хранения целочисленных значений от 0 до 18446744073709551615.Float64
: используется для хранения чисел с плавающей запятой, таких как 2039,23, 10,5 и т. д.String
: используется для хранения символов переменной длины. Для него не требуется атрибут максимальной длины, поскольку он может хранить произвольные длины.Date
: используется для хранения дат вYYYY-MM-DD
.DateTime
: используется для хранения дат, связанных со временем, в форматеYYYY-MM-DD HH:MM:SS
.
После определений столбцов вы указываете механизм, используемый для таблицы. В ClickHouse движки определяют физическую структуру базовых данных, возможности запроса таблицы, ее режимы параллельного доступа и поддержку индексов. Различные типы двигателей подходят для различных требований применения. Наиболее часто используемый и широко применимый тип мотора — MergeTree
.
Теперь, когда у вас есть обзор создания таблиц, вы создадите таблицу. Начните с подтверждения базы данных, которую вы будете редактировать:
USE test;
Вы увидите следующий вывод, показывающий, что вы переключились на test
базу данных из базы данных по default
:
USE test
Ok.
0 rows in set. Elapsed: 0.001 sec.
В оставшейся части этого руководства предполагается, что вы выполняете операторы в контексте этой базы данных.
Создайте таблицу visits
, выполнив эту команду:
CREATE TABLE visits (
id UInt64,
duration Float64,
url String,
created DateTime
) ENGINE = MergeTree()
PRIMARY KEY id
ORDER BY id;
Вот разбивка того, что делает команда. Мы создаем таблицу с именем visits
, которая имеет четыре столбца:
id
: столбец первичного ключа. Как и в других системах СУБД, столбец первичного ключа в ClickHouse однозначно идентифицирует строку; каждая строка должна иметь уникальное значение для этого столбца.duration
: столбец с плавающей запятой, используемый для хранения продолжительности каждого посещения в секундах. Столбцы сfloat
запятой могут хранить десятичные значения, такие как 12,50.url
: строковый столбец, в котором хранится посещенный URL-адрес, напримерhttp://example.com
.created
: столбец даты и времени, который отслеживает, когда произошло посещение.
После определения столбцов в качестве механизма хранения для таблицы указывается MergeTree
. Семейство движков MergeTree рекомендуется для рабочих баз данных с оптимизированной поддержкой больших вставок в реальном времени, общей надежностью и поддержкой запросов. Кроме того, механизмы MergeTree поддерживают сортировку строк первичного ключа, секционирование строк, а также репликацию и выборку данных.
Если вы собираетесь использовать ClickHouse для архивирования данных, которые редко запрашиваются, или для архивирования временных данных, вы можете использовать семейство Log Engine для оптимизации для этого варианта использования.
После определений столбцов вы определите другие параметры уровня таблицы. Предложение PRIMARY KEY
устанавливает id
в качестве столбца первичного ключа, а предложение ORDER BY
будет хранить значения, отсортированные по столбцу id
. Первичный ключ однозначно идентифицирует строку и используется для эффективного доступа к отдельной строке и эффективного размещения строки.
Выполнив оператор create, вы увидите следующий вывод:
CREATE TABLE visits
(
id UInt64,
duration Float64,
url String,
created DateTime
)
ENGINE = MergeTree()
PRIMARY KEY id
ORDER BY id
Ok.
0 rows in set. Elapsed: 0.010 sec.
В этом разделе вы создали базу данных и таблицу для отслеживания данных о посещении веб-сайта. На следующем шаге вы вставите данные в таблицу, обновите существующие данные и удалите эти данные.
Шаг 4. Вставьте, обновите и удалите данные и столбцы
На этом этапе вы будете использовать таблицу visits
для вставки, обновления и удаления данных. Следующая команда является примером синтаксиса для вставки строк в таблицу ClickHouse:
INSERT INTO table_name VALUES (column_1_value, column_2_value,....);
Теперь вставьте несколько строк примеров данных о visits
веб-сайта в таблицу посещений, выполнив каждую из следующих инструкций:
INSERT INTO visits VALUES (1, 10.5, 'http://example.com', '2019-01-01 00:01:01');
INSERT INTO visits VALUES (2, 40.2, 'http://example1.com', '2019-01-03 10:01:01');
INSERT INTO visits VALUES (3, 13, 'http://example2.com', '2019-01-03 12:01:01');
INSERT INTO visits VALUES (4, 2, 'http://example3.com', '2019-01-04 02:01:01');
Вы увидите следующий вывод, повторяющийся для каждого оператора вставки.
INSERT INTO visits VALUES
Ok.
1 rows in set. Elapsed: 0.004 sec.
Вывод для каждой строки показывает, что вы правильно ввели ее в таблицу visits
.
Теперь вы добавите дополнительный столбец в таблицу visits
. При добавлении или удалении столбцов из существующих таблиц ClickHouse поддерживает синтаксис ALTER
.
Например, основной синтаксис для добавления столбца в таблицу выглядит следующим образом:
ALTER TABLE table_name ADD COLUMN column_name column_type;
Добавьте столбец с именем location
, в котором будет храниться местоположение посещений веб-сайта, сделав следующее объявление:
ALTER TABLE visits ADD COLUMN location String;
Вы увидите вывод, подобный следующему:
ALTER TABLE visits
ADD COLUMN
location String
Ok.
0 rows in set. Elapsed: 0.014 sec.
Вывод показывает, что вы успешно добавили location
в столбец.
Начиная с версии 19.3.6 ClickHouse не поддерживает обновление и удаление отдельных строк данных из-за ограничений реализации. Однако ClickHouse поддерживает обновления и массовые удаления и имеет отдельный синтаксис SQL для этих операций, чтобы подчеркнуть их нестандартное использование.
Следующий синтаксис является примером массового обновления строк:
ALTER TABLE table_name UPDATE column_1 = value_1, column_2 = value_2... WHERE filter_conditions;
Вы запустите следующий оператор, чтобы обновить столбец url
всех строк, имеющих значение duration
менее 15. Введите его в запросе базы данных для выполнения:
ALTER TABLE visits UPDATE url = 'http://example2.com' WHERE duration < 15;
Вывод оператора массового обновления будет следующим:
ALTER TABLE visits
UPDATE url = 'http://example2.com' WHERE duration < 15
Ok.
0 rows in set. Elapsed: 0.003 sec.
Вывод показывает, что запрос на обновление выполнен успешно. 0 rows in set
выходных данных означает, что запрос не возвратил строк; это будет иметь место с любыми обновлениями и удалениями запроса.
Пример синтаксиса для массового удаления строк аналогичен обновлению строк и имеет следующую структуру:
ALTER TABLE table_name DELETE WHERE filter_conditions;
Чтобы проверить удаление данных, выполните следующую инструкцию, чтобы удалить все строки со значением duration
менее 5:
ALTER TABLE visits DELETE WHERE duration < 5;
Вывод оператора массового удаления будет выглядеть так:
ALTER TABLE visits
DELETE WHERE duration < 5
Ok.
0 rows in set. Elapsed: 0.003 sec.
Вывод подтверждает, что вы удалили строки продолжительностью менее пяти секунд.
Чтобы удалить столбцы из таблицы, синтаксис должен соответствовать следующей примерной структуре:
ALTER TABLE table_name DROP COLUMN column_name;
Удалите столбец location
, который вы добавили ранее, выполнив следующие действия:
ALTER TABLE visits DROP COLUMN location;
Вывод DROP COLUMN
, подтверждающий удаление столбца, будет выглядеть следующим образом:
ALTER TABLE visits
DROP COLUMN
location String
Ok.
0 rows in set. Elapsed: 0.010 sec.
Теперь, когда вы успешно вставили, обновили и удалили строки и столбцы в таблице visits
, вы перейдете к запросу данных на следующем шаге.
Шаг 5. Запросите данные
ClickHouse Query Language — это собственный диалект SQL с расширениями и функциями, подходящими для аналитических рабочих нагрузок. На этом шаге вы будете запускать запросы на выборку и агрегирование для извлечения данных и результатов из таблицы visits
.
Запросы на выборку позволяют извлекать строки и столбцы данных, отфильтрованных на основе заданных условий, а также таких параметров, как количество возвращаемых строк. Вы можете выбирать строки и столбцы данных, используя синтаксис SELECT
. Основной синтаксис запросов SELECT
:
SELECT func_1(column_1), func_2(column_2) FROM table_name WHERE filter_conditions row_options;
Выполните следующую инструкцию, чтобы получить значения url
и duration
для строк, где url
-адрес http://example.com
.
SELECT url, duration FROM visits WHERE url = 'http://example2.com' LIMIT 2;
Вы увидите следующий вывод:
SELECT
url,
duration
FROM visits
WHERE url = 'http://example2.com'
LIMIT 2
┌─url─────────────────┬─duration─┐
│ http://example2.com │ 10.5 │
│ http://example2.com │ 13 │
└─────────────────────┴──────────┘
2 rows in set. Elapsed: 0.003 sec.
На выходе возвращены две строки, соответствующие заданным условиям. Теперь, когда вы выбрали значения, вы можете перейти к выполнению агрегированных запросов.
Совокупные запросы — это запросы, которые работают с набором значений и возвращают отдельные выходные значения. В аналитических базах данных эти запросы выполняются часто и оптимизируются базой данных. Некоторые агрегатные функции, поддерживаемые ClickHouse:
count
: возвращает количество строк, соответствующих заданным условиям.sum
: возвращает сумму значений выбранного столбца.avg
: возвращает среднее значение выбранных значений столбца.
Некоторые специфичные для ClickHouse агрегатные функции включают в себя:
uniq
: возвращает приблизительное количество совпадающих отдельных строк.topK
: возвращает массив наиболее частых значений определенного столбца с использованием алгоритма аппроксимации.
Чтобы продемонстрировать выполнение запросов агрегации, вы рассчитаете общую продолжительность посещений, запустив sum
запроса:
SELECT SUM(duration) FROM visits;
Вы увидите вывод, подобный следующему:
SELECT SUM(duration)
FROM visits
┌─SUM(duration)─┐
│ 76.7 │
└───────────────┘
1 rows in set. Elapsed: 0.005 sec.
Теперь вычислите первые два URL-адреса, запустив:
SELECT topK(2)(url) FROM visits;
Вы увидите вывод, подобный следующему:
SELECT topK(2)(url)
FROM visits
┌─topK(2)(url)──────────────────────────────────┐
│ ['http://example2.com','http://example1.com'] │
└───────────────────────────────────────────────┘
1 rows in set. Elapsed: 0.010 sec.
Теперь, когда вы успешно запросили таблицу visits
, на следующем шаге вы удалите таблицы и базы данных.
Шаг 6. Удаление таблиц и баз данных
В этом разделе вы удалите таблицу visits
и test
базу данных.
Синтаксис удаления таблиц следует этому примеру:
DROP TABLE table_name;
Чтобы удалить таблицу visits
, выполните следующую инструкцию:
DROP TABLE visits;
Вы увидите следующий вывод о том, что вы успешно удалили таблицу:
DROP TABLE visits
Ok.
0 rows in set. Elapsed: 0.005 sec.
Вы можете удалить базы данных, используя синтаксис DROP database table_nametest
. Чтобы удалить базу данных, выполните следующую инструкцию:
DROP DATABASE test;
Полученный вывод показывает, что вы успешно удалили базу данных.
DROP DATABASE test
Ok.
0 rows in set. Elapsed: 0.003 sec.
На этом шаге вы удалили таблицы и базы данных. Теперь, когда вы создали, обновили и удалили базы данных, таблицы и данные в экземпляре ClickHouse, в следующем разделе вы включите удаленный доступ к серверу базы данных.
Шаг 7. Настройте правила брандмауэра (необязательно)
Если вы собираетесь использовать ClickHouse только локально с приложениями, работающими на том же сервере, или на сервере Ubuntu не включен брандмауэр, вам не нужно заполнять этот раздел. Если вместо этого вы подключаетесь к серверу базы данных ClickHouse удаленно, вам следует выполнить этот шаг.
В настоящее время на вашем сервере включен брандмауэр, который запрещает вашему общедоступному IP-адресу доступ ко всем портам. Вы выполните следующие два шага, чтобы разрешить удаленный доступ:
- Измените конфигурацию ClickHouse и разрешите ему слушать на всех интерфейсах.
- Добавьте правило брандмауэра, разрешающее входящие подключения к порту
8123
, который является HTTP-портом, на котором работает сервер ClickHouse.
Если вы находитесь внутри приглашения базы данных, выйдите, набрав CTRL+D
Отредактируйте файл конфигурации, запустив:
sudo nano /etc/clickhouse-server/config.xml
Затем раскомментируйте строку, содержащую <!-- <listen_host>0.0.0.0</listen_host> -->
, как в следующем файле:
...
<interserver_http_host>example.yandex.ru</interserver_http_host>
-->
<!-- Listen specified host. use:: (wildcard IPv6 address), if you want to accept connections both with IPv4 and IPv6 from everywhere. -->
<!-- <listen_host>::</listen_host> -->
<!-- Same for hosts with disabled ipv6: -->
<listen_host>0.0.0.0</listen_host>
<!-- Default values - try listen localhost on ipv4 and ipv6: -->
<!--
<listen_host>::1</listen_host>
<listen_host>127.0.0.1</listen_host>
-->...
Сохраните файл и выйдите из nano
. Чтобы применить новую конфигурацию, перезапустите службу, выполнив:
sudo service clickhouse-server restart
Вы не увидите никакого вывода этой команды. Сервер ClickHouse прослушивает порт 8123
для соединений HTTP и порт 9000
для clickhouse-client
. Разрешите доступ к обоим портам для IP-адреса вашего второго сервера с помощью следующей команды:
sudo ufw allow from second_server_ip/32 to any port 8123
sudo ufw allow from second_server_ip/32 to any port 9000
Вы увидите следующий вывод для обеих команд, показывающий, что вы включили доступ к обоим портам:
Rule added
Теперь ClickHouse будет доступен с добавленного вами IP. Не стесняйтесь добавлять дополнительные IP-адреса, такие как адрес вашего локального компьютера, если это необходимо.
Чтобы убедиться, что вы можете подключиться к серверу ClickHouse с удаленного компьютера, сначала выполните шаги шага 1 этого руководства на втором сервере и убедитесь, что на нем установлена установка clickhouse-client
.
Теперь, когда вы вошли на второй сервер, запустите сеанс клиента, выполнив:
clickhouse-client --host your_server_ip
Вы увидите следующий вывод, показывающий, что вы успешно подключились к серверу:
ClickHouse client version 19.3.6.
Connecting to your_server_ip:9000 as user default.
Connected to ClickHouse server version 19.3.6 revision 54415.
hostname
На этом этапе вы включили удаленный доступ к серверу базы данных ClickHouse, изменив правила брандмауэра.
Вывод
Вы успешно настроили экземпляр базы данных ClickHouse на своем сервере, создали базу данных и таблицу, добавили данные, запросили и удалили базу данных. В документации ClickHouse вы можете прочитать их бенчмарки по сравнению с другими коммерческими базами данных и базами данных с открытым исходным кодом, а также общие справочные документы.