Давайте рассмотрим начало работы с ClickHouse на примере "игрушечных" открытых данных - информации об авиаперелётах в США с 1987 по 2015 годы. Это нельзя назвать большими данными (всего 166 млн. строк, 63 GB несжатых данных), зато вы можете быстро скачать их и начать экспериментировать. Ссылка на Яндекс.Диск.
Также вы можете скачать данные из первоисточника. Как это сделать, написано здесь. https://github.com/yandex/ClickHouse/raw/master/doc/example_datasets/1_ontime.txt
Для начала, установим ClickHouse на один сервер. Ниже также будет показано, как установить ClickHouse на кластер с шардированием и репликацией.
На Ubuntu и Debian Linux, вы можете установить ClickHouse из готовых пакетов. На других Linux системах, вы можете собрать ClickHouse из исходников и установить его самостоятельно.
...
...
@@ -102,14 +104,14 @@ Connected to ClickHouse server version 0.0.53720.
Мы создали таблицу типа MergeTree. Таблицы типа MergeTree рекомендуется использовать для любых серьёзных применений. Такие таблицы содержит первичный ключ, по которому данные инкрементально сортируются, что позволяет быстро выполнять запросы по диапазону первичного ключа.
Мы создали таблицу типа MergeTree. Таблицы семейства MergeTree рекомендуется использовать для любых серьёзных применений. Такие таблицы содержит первичный ключ, по которому данные инкрементально сортируются, что позволяет быстро выполнять запросы по диапазону первичного ключа.
Например, если у нас есть рекламная сеть, и нам нужно показывать отчёты для конкретных клиентов - рекламодателей, то первичный ключ в таблице должен начинаться на идентификатор клиента ClientId, чтобы для получения данных для одного клиента, достаточно было только прочитать небольшой диапазон данных.
Например, если у нас есть логи рекламной сети, и нам нужно показывать отчёты для конкретных клиентов - рекламодателей, то первичный ключ в таблице должен начинаться на идентификатор клиента ClientId, чтобы для получения данных для одного клиента, достаточно было только прочитать небольшой диапазон данных.
Загрузим данные в таблицу.
%%
$ xz -v -c -d < ontime.csv.xz | clickhouse-client --query="INSERT INTO ontime FORMAT CSVWithNames"
$ xz -v -c -d < ontime.csv.xz | clickhouse-client --query="INSERT INTO ontime FORMAT CSV"
%%
Запрос INSERT в ClickHouse позволяет загружать данные в любом поддерживаемом формате. При этом, на загрузку данных расходуется O(1) памяти. На вход запроса INSERT можно передать любой объём данных. Вставлять данные всегда следует пачками не слишком маленького размера. При этом, вставка блоков данных размера до max_insert_block_size, 1048576 по-умолчанию, является атомарной: блок данных либо целиком вставится, либо целиком не вставится. В случае разрыва соединения в процессе вставки, вы можете не знать, вставился ли блок данных. Для достижения exactly-once семантики, для реплицированных таблиц, поддерживается идемпотентность: вы можете вставить один и тот же блок данных повторно, возможно, на другую реплику, и он будет вставлен только один раз. В данном примере, мы вставляем данные из localhost, поэтому мы не беспокоимся о формировании пачек и exactly-once семантике.
С точки зрения установленного ПО, кластер ClickHouse является однородным, без выделенных узлов. Вам надо установить ClickHouse на все серверы кластера, затем прописать конфигурацию кластера в конфигурационном файле, создать на каждом сервере локальную таблицу и затем создать Distributed таблицу.
Distributed таблица представляет собой "вид" на кластер ClickHouse. При SELECT-е из распределённой таблицы, запрос будет обработан распределённо, с использованием ресурсов всего кластера. Вы можете объявить конфигурации нескольких разных кластеров и создать несколько Distributed таблиц, которые смотрят на разные кластеры.
Distributed таблица представляет собой "вид" на локальные таблицы на кластере ClickHouse. При SELECT-е из распределённой таблицы, запрос будет обработан распределённо, с использованием ресурсов всех шардов кластера. Вы можете объявить конфигурации нескольких разных кластеров и создать несколько Distributed таблиц, которые смотрят на разные кластеры.
%%
<remote_servers>
...
...
@@ -213,7 +215,7 @@ INSERT INTO ontime_all SELECT * FROM ontime;
Отметим, что для перешардирования больших таблиц, такой способ не подходит, и вместо этого следует воспользоваться встроенной функциональностью перешардирования.
Ожидаемо, большинство запросов из распределённой таблицы на трёх серверах, работают почти в три раза быстрее.
Ожидаемо, большинство запросов из распределённой таблицы на трёх серверах, работают в несколько раз быстрее.
SELECT OriginCityName, count(*) AS flights FROM ontime GROUP BY OriginCityName ORDER BY flights DESC LIMIT 20
...
...
@@ -281,9 +283,11 @@ SELECT OriginCityName, count(*) AS flights FROM ontime GROUP BY OriginCityName O
При создании реплицированной таблицы, если других реплик ещё нет, то создаётся первая реплика, а если есть - создаётся новая реплика и клонирует данные существующих реплик. Вы можете сразу создать все таблицы-реплики и затем загрузить в них данные, либо сначала создать часть реплик, а затем добавить другие, уже после загрузки или во время загрузки данных.
Здесь видно, что мы используем тип таблицы ReplicatedMergeTree, указывая в качестве параметров путь в ZooKeeper, содержащий идентификатор шарда, а также идентификатор реплики.
%%
SET max_threads = 1, max_block_size = 1048576;
INSERT INTO ontime_replica SELECT * FROM ontime;
...
...
@@ -291,4 +295,9 @@ INSERT INTO ontime_replica SELECT * FROM ontime;
Репликация работает в режиме multi-master. Вы можете вставлять данные на любую реплику, и данные автоматически разъезжаются по всем репликам. При этом, репликация асинхронная, и в заданный момент времени, реплики могут содержать не все недавно записанные данные. Для записи данных, достаточно доступности хотя бы одной реплики. Остальные реплики будут скачивать новые данные как только станут активными.
Для просмотра состояния репликации можно использовать системные таблицы: system.replicas и system.replication_queue.
Как я могу повлиять на развитие ClickHouse?
Если у вас возникли вопросы, вы можете задать их на Stackoverflow с тегом "clickhouse", создать тему для обсуждения в группе (ссылка), или написать своё предложение на рассылку clickhouse-feedback@yandex-team.ru.
Вы можете разрабатывать ClickHouse, присоединившись к нашей команде в Яндексе. Для этого достаточно знать C++. Выберите любую вакансию https://yandex.ru/jobs/vacancies/dev/?tags=c%2B%2B из списка и укажите, что хотите попасть в группу разработки ClickHouse. Также у нас открыт приём на стажировку https://yandex.ru/jobs/vacancies/interns/summer.