Демонстрация и руководство по интеграции ClickHouse с Redpanda для создания базы данных OLAP.

Это сообщение изначально было опубликовано в блоге Redpanda.

Многие компании, которые ежедневно собирают и анализируют огромные объемы данных, создают еще больше данных, когда сообщают о своих выводах.

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

Реляционные базы данных становятся все более неэффективными для нужд аналитической обработки данных. С другой стороны, базы данных OLAP, которые могут масштабироваться и выполнять высокопроизводительные запросы, с каждым днем ​​становятся все более популярными.

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

Вы можете использовать ClickHouse для ведения журналов вашей платформы или использовать его в качестве хранилища событий для вашего бизнеса с высоким трафиком. Он очень эффективно обрабатывает данные в реальном времени и обеспечивает интеграцию со многими NoSQL или реляционными базами данных и потоковыми платформами, такими как RabbitMQ и Apache Kafka®.

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

Для потоковой передачи и обработки данных в режиме реального времени требуется высокая производительность и низкая задержка. Kafka часто подходит, но этого может быть недостаточно для некоторых случаев использования, в которых требуется высокая производительность и низкое использование ресурсов. Однако Redpanda предоставляет быструю и безопасную по умолчанию систему, API-совместимую с Kafka. Redpanda также потребляет меньше ресурсов, чем Kafka, и имеет один двоичный файл для развертывания без ZooKeeper®.

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

В этой статье вы пройдете пошаговое руководство, которое научит вас делать следующее:

  • Запустите кластер Redpanda в контейнере Docker
  • Создайте тему в Redpanda с помощью rpk CLI
  • Запустите ClickHouse в контейнере Docker
  • Создайте базу данных и таблицу в ClickHouse и настройте ее для кластера Redpanda для приема потока
  • Создавайте данные из CSV-файла в тему Redpanda с помощью rpk CLI и загружайте данные в таблицу ClickHouse.
  • Создание материализованного представления в ClickHouse
  • Запускайте SQL-запросы с помощью пользовательского интерфейса ClickHouse Play.

Если вы хотите продолжить, вы можете получить доступ ко всему коду для этого руководства в этом репозитории.

Предпосылки

Чтобы продолжить, вам потребуются следующие предварительные условия:

  • Среда macOS и Homebrew менеджер пакетов установлены
  • На вашем компьютере установлена ​​последняя версия Docker (в этой статье используется Docker Desktop 4.6.1)

Сценарий использования: Оптимизация отчетов по недвижимости

Давайте установим сцену. В этом примере сценария PandaHouse является агентством недвижимости, работающим по контракту. Агенты по недвижимости еженедельно получают информацию о районе от PandaHouse и ищут объекты недвижимости, выставленные на продажу. Ежедневно агенты завершают свое исследование и отправляют результаты по электронной почте в любом текстовом формате.

PandaHouse хочет изменить этот процесс по следующим причинам:

  1. Слишком много отчетов агентов за день для ввода во внутреннюю систему.
  2. Нет определенного формата, что очень затрудняет чтение и анализ отчетов перед их вводом в систему.
  3. Невозможно проводить анализ в режиме реального времени, поскольку агенты отправляют свои отчеты в конце каждого дня.
  4. Не хватает человеческих ресурсов для обработки растущего числа агентов и поступающих от них отчетов.

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

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

Бегущая Редпанда

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

Для получения дополнительной информации о том, как запустить Redpanda с помощью Docker, пожалуйста, обратитесь к этой документации.

Во-первых, настройте сеть Docker, чтобы убедиться, что ваш кластер Redpanda доступен из других контейнеров. Создайте сеть Docker с именем panda-house с помощью следующей команды:

docker network create panda-house

Создайте папку с именем panda_house в своем домашнем каталоге. Вы будете использовать этот каталог в качестве общего тома для контейнера Redpanda в следующих шагах.

mkdir ~/panda_house

Выполните следующую команду, чтобы запустить контейнер Redpanda, который монтирует папку ~/panda_house, которая будет использоваться как общий том:

docker run -d --pull=always --name=redpanda-1 --rm \
    --network panda-house \
    -v $HOME/panda_house:/tmp/panda_house \
    -p 9092:9092 \
    -p 9644:9644 \
    docker.vectorized.io/vectorized/redpanda:latest \
    redpanda start \
    --advertise-kafka-addr redpanda-1 \
    --overprovisioned \
    --smp 1  \
    --memory 2G \
    --reserve-memory 200M \
    --node-id 0 \
    --check=false

Ваш вывод будет следующим:

Trying to pull docker.vectorized.io/vectorized/redpanda:latest...
Getting image source signatures
Copying blob sha256:245fe2b3f0d6b107b818db25affc44bb96daf57d56d7d90568a1f2f10839ec46
...output omitted...
Copying blob sha256:245fe2b3f0d6b107b818db25affc44bb96daf57d56d7d90568a1f2f10839ec46
Copying config sha256:fdaf68707351dda9ede29650f4df501b78b77a501ef4cfb5e2e9a03208f29068
Writing manifest to image destination
Storing signatures
105c7802c5a46fa691687d9f20c8b42cd461ce38d625f285cec7d6678af90a59

Приведенная выше команда извлекает последний образ Redpanda из репозитория docker.vectorized.io и запускает контейнер с открытыми портами 9092 и 9644. В этом руководстве вы будете использовать порт 9092 для доступа к Redpanda.

Обратите внимание, что у вас есть значение флага --advertise-kafka-addr как redpanda-1. Эта конфигурация устанавливает для объявленных слушателей Redpanda внешний доступ в сети. В данном случае это сеть Docker panda-house.

Проверьте свой контейнер Redpanda, выполнив следующую команду.

docker ps

Вывод должен быть следующим:

CONTAINER ID  IMAGE                                            COMMAND               CREATED        STATUS            PORTS                                           NAMES
105c7802c5a4  docker.vectorized.io/vectorized/redpanda:latest  redpanda start --...  3 seconds ago  Up 3 seconds ago  0.0.0.0:9092->9092/tcp, 0.0.0.0:9644->9644/tcp  redpanda-1

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

docker exec -it redpanda-1 \
    rpk cluster info

Он должен вернуть следующий вывод:

BROKERS
=======
ID    HOST        PORT
0*    redpanda-1  9092

После этого ваш кластер Redpanda готов к использованию.

Запуск ClickHouse

В этом руководстве вы также запускаете ClickHouse как контейнер Docker. Выполните следующую команду, чтобы запустить ClickHouse с портом 18123 для доступа к пользовательскому интерфейсу.

docker run -d --pull=always --name=clickhousedb-1 --rm \
--network panda-house \
-p 18123:8123 \
--ulimit nofile=262144:262144 \
docker.io/clickhouse/clickhouse-server

В браузере перейдите к http://localhost:18123/play, чтобы увидеть Play UI ClickHouse, где вы можете выполнять SQL-запросы к базе данных ClickHouse:

Чтобы протестировать страницу запроса, выполните следующую команду:

show databases;

Вывод должен выглядеть так:

INFORMATION_SCHEMA
default
information_schema
system

Интеграция Redpanda и ClickHouse

Далее вы будете использовать rpk для создания темы в Redpanda, из которой ClickHouse будет получать сообщения.

Выполните следующую команду, чтобы создать тему с именем agent-reports в контейнере Docker:

docker exec -it redpanda-1 \
rpk topic create agent-reports

Убедитесь, что у вас есть созданные темы:

docker exec -it redpanda-1 \
rpk cluster info

Вы должны получить следующий результат:

BROKERS
=======
ID    HOST         PORT
0*    redpanda-1   9092
TOPICS
======
NAME                   PARTITIONS  REPLICAS
agent-reports             1           1

Затем в ClickHouse создайте базу данных с именем panda_house с помощью следующей команды:

CREATE DATABASE panda_house;

Скопируйте эту команду и вставьте ее в интерфейс Play. Затем нажмите кнопку Выполнить. Результат должен быть следующим:

Затем создайте таблицу ClickHouse в только что созданной базе данных panda_house с соответствующими настройками для использования сообщений из темы agent-reports. Скопируйте следующую команду SQL и вставьте ее в пользовательский интерфейс Play, чтобы создать таблицу с именем agent_reports:

CREATE TABLE IF NOT EXISTS panda_house.agent_reports
(
    agent_id UInt64,
    real_estate_map_url String,
    real_estate_type String,
    real_estate_price Float32
) ENGINE = Kafka()
SETTINGS
    kafka_broker_list = 'redpanda-1:9092',
    kafka_topic_list = 'agent-reports',
    kafka_group_name = 'clickhouse-group',
    kafka_format = 'CSV'

Обратите внимание, что фрагмент запроса на создание таблицы содержит поля, необходимые PandaHouse. В части SETTINGS убедитесь, что у вас есть набор конфигураций Kafka:

  • kafka_broker_list имеет значение URL-адреса брокера Redpanda, доступное в сети Docker.
  • kafka_topic_list имеет название темы agent-reports, которое вы создали ранее.
  • Конфигурация kafka_group_name устанавливает идентификатор группы потребителей, который зависит от вашего выбора.
  • Конфигурация kafka_format важна, потому что PandaPost просит вас использовать данные в формате CSV.

Запустите команду, нажав кнопку Выполнить, чтобы создать таблицу agent_reports. Вывод должен быть следующим:

Отправка сообщений в ClickHouse

Теперь у вас есть кластер Redpanda с темой под названием agent-reports, и вы настроили свою таблицу ClickHouse с конфигурацией темы Redpanda.

Затем вы загрузите CSV-файл с данными отчетов агентов по недвижимости в созданную ранее папку panda_house. Вы можете сделать это либо из браузера, либо из терминала.

В браузере откройте данные здесь и выберите Загрузить. Имя файла должно быть agent-reports-data.csv.

Или из терминала:

cd ~/panda_house
curl -LO https://raw.githubusercontent.com/redpanda-data-blog/2022-clickhouse-real-time-OLAP-database/main/resources/data/agent-reports-data.csv?token=GHSAT0AAAAAABWFIO6BI5ZZKX6SFKCVLIFCYWF2SZQ

Выполните следующую команду rpk, чтобы создать сообщения для Redpanda, имитируя поток данных клиента:

docker exec -it redpanda-1 /bin/sh -c \
'rpk topic produce agent-reports < /tmp/panda_house/agent-reports-data.csv'

Предполагая, что вы получили следующий вывод, вы успешно отправили 50000 записей в Redpanda всего за несколько секунд:

...output omitted...
Produced to partition 0 at offset 49994 with timestamp 1651097984435.
Produced to partition 0 at offset 49995 with timestamp 1651097984435.
Produced to partition 0 at offset 49996 with timestamp 1651097984435.
Produced to partition 0 at offset 49997 with timestamp 1651097984436.
Produced to partition 0 at offset 49998 with timestamp 1651097984436.
Produced to partition 0 at offset 49999 with timestamp 1651097984436.

Столько же записей необходимо отправить в ClickHouse. Чтобы убедиться в этом, выполните следующий запрос в пользовательском интерфейсе Play:

SELECT * FROM panda_house.agent_reports;

Вы должны получить сообщение об ошибке, подобное следующему:

Code: 620. DB::Exception: Direct select is not allowed. To enable use setting `stream_like_engine_allow_direct_select`. (QUERY_NOT_ALLOWED) (version 22.4.2.1 (official build))

Это означает, что вы должны использовать параметр stream_like_engine_allow_direct_select, который требуется ClickHouse для запуска запросов select для таблиц, настроенных для потоковой передачи. Однако, поскольку это таблица потоковой передачи, после запуска команды с этим параметром ваш второй запрос будет пустым. Чтобы решить эту проблему, вам нужно создать материализованное представление, которое хранит данные в памяти.

Выполните следующий запрос, чтобы создать материализованное представление для таблицы agent_reports:

CREATE MATERIALIZED VIEW panda_house.agent_reports_view
ENGINE = Memory
AS
SELECT * FROM panda_house.agent_reports
SETTINGS
stream_like_engine_allow_direct_select = 1;

Обратите внимание, что stream_like_engine_allow_direct_select можно запустить один раз.

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

На этот раз запустите запрос для материализованного представления agent_reports_view:

SELECT * FROM panda_house.agent_reports_view;

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

Наконец, предположим, что вы хотите найти средние цены на недвижимость типа flat, которые не превышают 150 000.

SELECT AVG(real_estate_price)
FROM panda_house.agent_reports_view
WHERE real_estate_price<=150000;

Вывод должен быть 124784.96553493802.

Вы можете передавать другие данные в Redpanda, чтобы увидеть, изменится ли это среднее значение. Выполните следующую команду для потоковой передачи недвижимости типа flat по цене 150 000.

docker exec -i redpanda-1 \
rpk topic produce agent-reports <<< "7777,maps.google.com/7777,flat,150000"

Обратите внимание, что среднее значение изменилось на 124786.9952406826.

Очистка

Теперь вы успешно выполнили все шаги в учебнике. Вы можете остановить контейнеры и удалить каталог panda_house:

docker stop clickhousedb-1 && docker stop redpanda-1
rm -r ~/panda_house

Заключение

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

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

Взаимодействуйте с разработчиками Redpanda напрямую в Сообществе Redpanda в Slack или вносите свой вклад в репозиторий Redpanda на GitHub, доступный здесь. Чтобы узнать больше обо всем, что вы можете сделать с Redpanda, ознакомьтесь с нашей документацией здесь.