Роберт Ходжес

Большие наборы данных имеют решающее значение для всех, кто пробует или тестирует ClickHouse. ClickHouse настолько быстр, что вам обычно требуется не менее 100 миллионов строк, чтобы различать различия при настройке запросов. Кроме того, убийственные функции, такие как материализованные представления, намного интереснее при работе с большими объемами разнообразных данных. Несмотря на важность таких наборов данных для пользователей ClickHouse, существует мало инструментов, позволяющих легко ими управлять.

Напротив, библиотеки Python, такие как scikit-learn, имеют приятную возможность перезагружать данные из стандартных коллекций, таких как знаменитый набор данных Iris. Вдохновившись их примером, мы разработали простой инструмент, который упрощает захват и перезагрузку наборов данных ClickHouse, содержащих миллиарды строк. Наш инструмент называется ad-cli. Он решает сразу две проблемы:

  • Определить переносимый формат для наборов данных
  • Предоставьте инструмент для простого создания и загрузки таких наборов данных.

В следующих разделах представлен ad-cli и описывается, как он работает, а также формат набора данных. Мы закончим кратким изложением дорожной карты. Это только первый шаг к тому, что мы планируем превратить в мощную возможность массовой передачи данных, а также в семейство больших наборов тестовых данных, которые каждый может быстро загрузить.

Установка

Ad-cli написан на Python и работает в системах Linux. Как и ClickHouse, он использует лицензию Apache 2.0. Ad-cli требует для запуска python3, pip3 и clickhouse-client. Вот типичная команда установки для установки последней версии с pypi.org.

sudo apt install clickhouse-client
sudo pip3 install altinity-datasets

Вы также можете установить прямо из исходного кода на Github.

pip3 install git+https://github.com/altinity/altinity-datasets.git

После установки вы можете проверить, работает ли ad-cli, введя «версия ad-cli», что должно привести к следующему результату:

$ ad-cli version
ad-cli 0.1.2, Python 3.7.1

Загрузка набора данных

Ad-cli имеет несколько небольших встроенных наборов данных. Вы можете узнать, что доступно, используя команду поиска набора данных, как показано ниже. Это распечатает список наборов данных в библиотеке.

$ ad-cli dataset search --full=false
name       : iris
title      : Iris Flower Data Set
description: Famous iris plant data set published in Ronald Fisher's 1936 paper "The use of multiple measurements in taxonomic problems." Commonly used to illustrate statistical and machine learning procedures.
size       : 150 rows
sources    : ['https://archive.ics.uci.edu/ml/datasets/iris']
notes      : None
repo       : built-ins
path       : /home/rhodges/git/altinity-datasets/my-env/lib/python3.7/site-packages/altinity_datasets/built-ins/iris
(etc.)

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

$ ad-cli dataset load iris
Creating database if it does not exist: iris
Executing DDL: /home/rhodges/git/altinity-datasets/my-env/lib/python3.7/site-packages/altinity_datasets/built-ins/iris/ddl/iris.sql
Loading data: table=iris, file=iris.csv
Operation summary: succeeded=1, failed=0

Эта команда делает три вещи:

  • Создает базу данных на сервере, если она не существует.
  • Запускает команду SQL для создания базы данных.
  • Загружает данные таблицы из CSV.

Вот и все. ClickHouse теперь имеет базу данных с именем iris. В базе данных есть таблица с именем iris из 150 строк.

Сброс и перезагрузка наборов данных

Ad-cli может создавать наборы данных из существующих таблиц в ClickHouse. Допустим, мы хотим сохранить набор данных радужной оболочки в файлы, чтобы мы могли перезагрузить его где-нибудь еще. Вы можете сделать это с помощью следующей команды:

$ ad-cli dataset dump --repo-path=/tmp --database=iris my-iris
Preparing dataset directory: /tmp/my-iris
Computing data set size
Table: iris Rows: 150
Total rows: 150
Writing manifest: /tmp/my-iris/manifest.yaml
Dumping data: table=iris, partition=Iris-setosa
Dumping data: table=iris, partition=Iris-versicolor
Dumping data: table=iris, partition=Iris-virginica
Operation summary: succeeded=3, failed=0

Давайте посмотрим, что создал ad-cli.

$ find /tmp/my-iris -print
/tmp/my-iris
/tmp/my-iris/ddl
/tmp/my-iris/ddl/iris.sql    <-- Table definition
/tmp/my-iris/manifest.yaml   <-- Description of dataset
/tmp/my-iris/data
/tmp/my-iris/data/iris
/tmp/my-iris/data/iris/data-Iris-versicolor.csv <-- Data in CSV
/tmp/my-iris/data/iris/data-Iris-setosa.csv
/tmp/my-iris/data/iris/data-Iris-virginica.csv

Каталог ddl содержит ноль или более сценариев, которые необходимо запустить перед загрузкой данных. Файл manifest.yaml представляет собой отформатированный файл YAML с описательной информацией о наборе данных. Наконец, каталог данных содержит табличные данные. Каждая таблица имеет свой собственный подкаталог, а файлы данных содержат данные по ключу раздела, что делает загрузку и слияние более эффективными. Вы можете сами разобрать файлы и посмотреть, как они работают — это действительно просто. Более подробная информация доступна в файле README.md.

Мы можем развернуться и перезагрузить новый набор данных в другую базу данных следующим образом:

$ ad-cli dataset load --repo-path=/tmp --database=iris25 my-iris

Вот и все! Вы можете клонировать и перезагружать небольшие наборы данных из оперативных данных за несколько секунд. Мы готовы к чему-то большему.

Обработка больших наборов данных

Ad-cli имеет две функции, которые позволяют ему эффективно работать с большими наборами данных.

  • Параллельные операции — параллельный запуск нескольких процессов clickhouse-client.
  • Сжатие — ad-cli может записывать и читать файлы CSV с помощью gzip.

Давайте теперь захватим что-то большое. Одним из наших любимых наборов данных в Altinity является знаменитый набор данных такси Нью-Йорка. Для дампа данных мы будем запускать до 6 процессов clickhouse-client параллельно и запрашивать сжатие данных. Вот команда:

ad-cli dataset dump nyc_taxi_rides --repo-path=. \
--compress --parallel=6

На Amazon md5.2xlarge с 8 виртуальными ЦП эта команда выполняется за 34,36 минуты и создает на диске набор данных размером 38 ГБ. Параметр —parallel может варьироваться в зависимости от возможностей хоста. В этом случае мы также запускаем процесс clickhouse-server локально. 6 процессов обеспечивают приемлемую производительность и приводят к 100%-ному использованию ЦП при средней нагрузке, близкой к 8, что означает, что процессоры используются полностью без чрезмерного переключения процессов.

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

ad-cli dataset load nyc_taxi_rides --host=other.host.com \
--repo_path=. --compress --parallel=6

Выполнение этой команды на том же хосте, что и раньше, занимает немногим более 11 минут. Одна из основных причин большой разницы между дампом и загрузкой заключается в том, что команды gzip имеют сильно асимметричную производительность при сжатии и распаковке данных. Разница в этом примере составляет примерно 6x, например, ~36 с для сжатия 10 миллионов строк данных CSV по сравнению с ~6 с для распаковки того же объема.

Дополнительные опции

Для простоты мы показали примеры ad-cli, в основном использующие параметры подключения по умолчанию. Ad-cli также поддерживает дополнительные параметры для установки пользователя/пароля, изменения хоста и порта и использования безопасных соединений. Вот пример:

ad-cli dataset load iris -H a.secure.host.com -P 9440 \
-u special -p secret --secure

Для получения дополнительной информации ознакомьтесь с README.md или используйте параметр —help/-h для отдельных команд.

Дорожная карта

Есть ряд функций, которые мы могли бы добавить, чтобы сделать ad-cli более надежным и полезным. Самое главное — поддерживать весь спектр форматов, с которыми может работать ClickHouse. Тем не менее, нашим долгосрочным приоритетом является создание универсальной массовой загрузки со следующими важными функциями:

  • Обеспечьте быструю и гибкую загрузку отдельных таблиц, включая поддержку различных форматов, автоматический повтор при сбое и захват ошибочных строк в отдельном файле для исправления и повторной отправки.
  • Добавьте поддержку дампа и загрузки напрямую через объектное хранилище, такое как Amazon S3.
  • Создайте библиотеку общедоступных наборов данных для ClickHouse, которую можно будет легко найти и загрузить. По этой причине Ad-cli уже вводит концепцию репо.

Вывод

В этой статье представлен ad-cli, простой инструмент для создания дампа и загрузки наборов данных ClickHouse. Он обеспечивает базовый формат для наборов данных. Он также выгружает и загружает наборы данных в этом формате с помощью однострочных команд.

Мы хотели бы пригласить вас попробовать ad-cli и узнать, что вы думаете. Пожалуйста, отправьте отзыв через Github Issues. Если вы исправите ошибку или добавите свои собственные функции, отправьте нам pull request. Мы с радостью принимаем вклады от сообщества. Спасибо и наслаждайтесь!

Первоначально опубликовано на https://www.altinity.com 1 июля 2019 г.