Перейти к основному содержимому

Kafka routine load Selena с использованием shared-data хранилища

О Routine Load

Routine load — это метод использования Apache Kafka или, в данной лабораторной работе, Redpanda для непрерывной потоковой передачи данных в Selena. Данные передаются в топик Kafka, а задание Routine Load потребляет данные в Selena. Более подробная информация о Routine Load представлена в конце лабораторной работы.

О shared-data

В системах, которые разделяют хранилище и вычисления, данные хранятся в недорогих надежных удаленных системах хранения, таких как Amazon S3, Google Cloud Storage, Azure Blob Storage и других S3-совместимых хранилищах, таких как MinIO. Горячие данные кэшируются локально, и когда кэш попадает в цель, производительность запросов сопоставима с архитектурой связанного хранилища и вычислений. Вычислительные узлы (CN) могут быть добавлены или удалены по требованию в течение секунд. Эта архитектура снижает затраты на хранение, обеспечивает лучшую изоляцию ресурсов и предоставляет эластичность и масштабируемость.

Этот учебник охватывает:

  • Запуск Selena, Redpanda и MinIO с Docker Compose
  • Использование MinIO в качестве уровня хранения Selena
  • Настройка Selena для shared-data
  • Добавление задания Routine Load для потребления данных из Redpanda

Используемые данные являются синтетическими.

В этом документе много информации, и она представлена с пошаговым содержанием в начале и техническими деталями в конце. Это сделано для достижения следующих целей в данном порядке:

  1. Настроить Routine Load.
  2. Позволить читателю загружать данные в развертывание shared-data и анализировать эти данные.
  3. Предоставить детали конфигурации для развертываний shared-data.

Предварительные требования

Docker

  • Docker
  • 4 ГБ ОЗУ, выделенных для Docker
  • 10 ГБ свободного дискового пространства, выделенного для Docker

SQL клиент

Вы можете использовать SQL клиент, предоставленный в среде Docker, или использовать клиент в вашей системе. Многие MySQL-совместимые клиенты будут работать, и это руководство охватывает конфигурацию DBeaver и MySQL Workbench.

curl

curl используется для загрузки файла Compose и скрипта для генерации данных. Проверьте, установлен ли он, запустив curl или curl.exe в командной строке вашей ОС. Если curl не установлен, получите curl здесь.

Python

Требуются Python 3 и Python клиент для Apache Kafka, kafka-python.


Терминология

FE

Frontend узлы отвечают за управление метаданными, управление подключениями клиентов, планирование запросов и планирование запросов. Каждый FE хранит и поддерживает полную копию метаданных в своей памяти, что гарантирует беспристрастные услуги среди FE.

CN

Compute Nodes отвечают за выполнение планов запросов в развертываниях shared-data.

BE

Backend узлы отвечают как за хранение данных, так и за выполнение планов запросов в развертываниях shared-nothing.

примечание

Это руководство не использует BE, эта информация включена здесь, чтобы вы понимали разницу между BE и CN.


Запуск Selena

Для запуска Selena с shared-data с использованием Object Storage вам нужно:

  • Frontend движок (FE)
  • Вычислительный узел (CN)
  • Object Storage

Это руководство использует MinIO, который является S3-совместимым провайдером Object Storage. MinIO предоставляется под лицензией GNU Affero General Public License.

Загрузка файлов лабораторной работы

docker-compose.yml

mkdir routineload
cd routineload
curl -O https://raw.githubusercontent.com/StarRocks/demo/master/documentation-samples/routine-load-shared-data/docker-compose.yml

gen.py

gen.py — это скрипт, который использует Python клиент для Apache Kafka для публикации (производства) данных в топик Kafka. Скрипт был написан с адресом и портом контейнера Redpanda.

curl -O https://raw.githubusercontent.com/StarRocks/demo/master/documentation-samples/routine-load-shared-data/gen.py

Запуск Selena, MinIO и Redpanda

docker compose up --detach --wait --wait-timeout 120

Проверьте прогресс сервисов. Контейнерам потребуется 30 секунд или больше, чтобы стать здоровыми. Контейнер routineload-minio_mc-1 не будет показывать индикатор здоровья и завершится после настройки MinIO с ключом доступа, который будет использовать Selena. Дождитесь, пока routineload-minio_mc-1 завершится с кодом 0, а остальные сервисы станут Healthy.

Запускайте docker compose ps до тех пор, пока сервисы не станут здоровыми:

docker compose ps
WARN[0000] /Users/droscign/routineload/docker-compose.yml: `version` is obsolete
[+] Running 6/7
✔ Network routineload_default Crea... 0.0s
✔ Container minio Healthy 5.6s
✔ Container redpanda Healthy 3.6s
✔ Container redpanda-console Healt... 1.1s
⠧ Container routineload-minio_mc-1 Waiting 23.1s
✔ Container starrocks-fe Healthy 11.1s
✔ Container starrocks-cn Healthy 23.0s
container routineload-minio_mc-1 exited (0)

Изучение учетных данных MinIO

Чтобы использовать MinIO для Object Storage с Selena, Selena нужен ключ доступа MinIO. Ключ доступа был сгенерирован во время запуска сервисов Docker. Чтобы лучше понять, как Selena подключается к MinIO, вы должны убедиться, что ключ существует.

Откройте веб-интерфейс MinIO

Перейдите по адресу http://localhost:9001/access-keys. Имя пользователя и пароль указаны в файле Docker compose и являются miniouser и miniopassword. Вы должны увидеть, что есть один ключ доступа. Ключ — AAAAAAAAAAAAAAAAAAAA, вы не можете увидеть секрет в консоли MinIO, но он находится в файле Docker compose и является BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB:

Просмотр ключа доступа MinIO


SQL клиенты

Эти три клиента протестированы с данным руководством, вам нужен только один:

  • mysql CLI: Вы можете запустить его из среды Docker или с вашей машины.
  • DBeaver доступен в виде community версии и Pro версии.
  • MySQL Workbench

Настройка клиента

Самый простой способ использовать mysql CLI — запустить его из контейнера Selena starrocks-fe:

docker compose exec starrocks-fe \
mysql -P 9030 -h 127.0.0.1 -u root --prompt="StarRocks > "
подсказка

Все команды docker compose должны выполняться из директории, содержащей файл docker-compose.yml.

Если вы хотите установить mysql CLI, разверните установка mysql клиента ниже:

установка mysql клиента
  • macOS: Если вы используете Homebrew и не нуждаетесь в MySQL Server, выполните brew install mysql для установки CLI.
  • Linux: Проверьте вашу систему репозиториев для клиента mysql. Например, yum install mariadb.
  • Microsoft Windows: Установите MySQL Community Server и запустите предоставленный клиент, или запустите mysql из WSL.

Конфигурация Selena для shared-data

На данный момент у вас запущены Selena, Redpanda и MinIO. Ключ доступа MinIO используется для подключения Selena и MinIO. Когда Selena запустилась, она установила соединение с MinIO и создала том хранения по умолчанию в MinIO.

Это конфигурация, используемая для установки тома хранения по умолчанию для использования MinIO (это также находится в файле Docker compose). Конфигурация будет подробно описана в конце этого руководства, пока просто отметьте, что aws_s3_access_key установлен на строку, которую вы видели в консоли MinIO, и что run_mode установлен на shared_data.

# включить shared data, установить тип хранения, установить endpoint
run_mode = shared_data
cloud_native_storage_type = S3
aws_s3_endpoint = minio:9000

# установить путь в MinIO
aws_s3_path = starrocks

# учетные данные для чтения/записи объектов MinIO
aws_s3_access_key = AAAAAAAAAAAAAAAAAAAA
aws_s3_secret_key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
aws_s3_use_instance_profile = false
aws_s3_use_aws_sdk_default_behavior = false

# Установите это в false, если вы не хотите, чтобы хранилище по умолчанию
# создавалось в объектном хранилище, используя
# детали, предоставленные выше
enable_load_volume_from_conf = true
подсказка

Чтобы увидеть полный файл конфигурации, вы можете запустить эту команду:

docker compose exec starrocks-fe cat fe/conf/fe.conf

Запускайте все команды docker compose из каталога, содержащего файл docker-compose.yml.

Подключение к Selena с помощью SQL клиента

подсказка

Запустите эту команду из каталога, содержащего файл docker-compose.yml.

Если вы используете клиент, отличный от mysql CLI, откройте его сейчас.

docker compose exec starrocks-fe \
mysql -P9030 -h127.0.0.1 -uroot --prompt="StarRocks > "

Изучение тома хранения

SHOW STORAGE VOLUMES;
+------------------------+
| Storage Volume |
+------------------------+
| builtin_storage_volume |
+------------------------+
1 row in set (0.00 sec)
DESC STORAGE VOLUME builtin_storage_volume\G
подсказка

Некоторые SQL в этом документе и многих других документах в документации Selena заканчиваются \G вместо точки с запятой. \G заставляет mysql CLI отображать результаты запроса вертикально.

Многие SQL клиенты не интерпретируют вертикальный формат вывода, поэтому вы должны заменить \G на ;.

*************************** 1. row ***************************
Name: builtin_storage_volume
Type: S3
IsDefault: true
Location: s3://starrocks
Params: {"aws.s3.access_key":"******","aws.s3.secret_key":"******","aws.s3.endpoint":"minio:9000","aws.s3.region":"","aws.s3.use_instance_profile":"false","aws.s3.use_aws_sdk_default_behavior":"false"}
Enabled: true
Comment:
1 row in set (0.03 sec)

Убедитесь, что параметры соответствуют конфигурации.

примечание

Папка builtin_storage_volume не будет видна в списке объектов MinIO до тех пор, пока данные не будут записаны в bucket.


Создание таблицы

Эти SQL команды выполняются в вашем SQL клиенте.

CREATE DATABASE quickstart;
USE quickstart;
CREATE TABLE site_clicks (
`uid` bigint NOT NULL COMMENT "uid",
`site` string NOT NULL COMMENT "site url",
`vtime` bigint NOT NULL COMMENT "vtime"
)
DISTRIBUTED BY HASH(`uid`)
PROPERTIES("replication_num"="1");

Откройте консоль Redpanda

Топиков пока не будет, топик будет создан на следующем шаге.

http://localhost:8080/overview

Публикация данных в топик Redpanda

Из командной оболочки в папке routineload/ запустите эту команду для генерации данных:

python gen.py 5
подсказка

В вашей системе вам может потребоваться использовать python3 вместо python в команде.

Если у вас отсутствует kafka-python, попробуйте:

pip install kafka-python

или

pip3 install kafka-python
b'{ "uid": 6926, "site": "https://docs.starrocks.io/", "vtime": 1718034793 } '
b'{ "uid": 3303, "site": "https://www.starrocks.io/product/community", "vtime": 1718034793 } '
b'{ "uid": 227, "site": "https://docs.starrocks.io/", "vtime": 1718034243 } '
b'{ "uid": 7273, "site": "https://docs.starrocks.io/", "vtime": 1718034794 } '
b'{ "uid": 4666, "site": "https://www.starrocks.io/", "vtime": 1718034794 } '

Проверка в консоли Redpanda

Перейдите по адресу http://localhost:8080/topics в консоли Redpanda, и вы увидите один топик с именем test2. Выберите этот топик, затем вкладку Messages, и вы увидите пять сообщений, соответствующих выводу gen.py.

Потребление сообщений

В Selena вы создадите задание Routine Load для:

  1. Потребления сообщений из топика Redpanda test2
  2. Загрузки этих сообщений в таблицу site_clicks

Selena настроена на использование MinIO для хранения, поэтому данные, вставленные в таблицу site_clicks, будут храниться в MinIO.

Создание задания Routine Load

Запустите эту команду в SQL клиенте для создания задания Routine Load, команда будет подробно объяснена в конце лабораторной работы.

CREATE ROUTINE LOAD quickstart.clicks ON site_clicks
PROPERTIES
(
"format" = "JSON",
"jsonpaths" ="[\"$.uid\",\"$.site\",\"$.vtime\"]"
)
FROM KAFKA
(
"kafka_broker_list" = "redpanda:29092",
"kafka_topic" = "test2",
"kafka_partitions" = "0",
"kafka_offsets" = "OFFSET_BEGINNING"
);

Проверка задания Routine Load

SHOW ROUTINE LOAD\G

Проверьте три выделенные строки:

  1. Состояние должно быть RUNNING
  2. Топик должен быть test2, а брокер должен быть redpanda:2092
  3. Статистика должна показывать либо 0, либо 5 загруженных строк в зависимости от того, как быстро вы запустили команду SHOW ROUTINE LOAD. Если загружено 0 строк, запустите ее снова.
*************************** 1. row ***************************
Id: 10078
Name: clicks
CreateTime: 2024-06-12 15:51:12
PauseTime: NULL
EndTime: NULL
DbName: quickstart
TableName: site_clicks
State: RUNNING
DataSourceType: KAFKA
CurrentTaskNum: 1
JobProperties: {"partitions":"*","partial_update":"false","columnToColumnExpr":"*","maxBatchIntervalS":"10","partial_update_mode":"null","whereExpr":"*","dataFormat":"json","timezone":"Etc/UTC","format":"json","log_rejected_record_num":"0","taskTimeoutSecond":"60","json_root":"","maxFilterRatio":"1.0","strict_mode":"false","jsonpaths":"[\"$.uid\",\"$.site\",\"$.vtime\"]","taskConsumeSecond":"15","desireTaskConcurrentNum":"5","maxErrorNum":"0","strip_outer_array":"false","currentTaskConcurrentNum":"1","maxBatchRows":"200000"}
DataSourceProperties: {"topic":"test2","currentKafkaPartitions":"0","brokerList":"redpanda:29092"}
CustomProperties: {"group.id":"clicks_ea38a713-5a0f-4abe-9b11-ff4a241ccbbd"}
Statistic: {"receivedBytes":0,"errorRows":0,"committedTaskNum":0,"loadedRows":0,"loadRowsRate":0,"abortedTaskNum":0,"totalRows":0,"unselectedRows":0,"receivedBytesRate":0,"taskExecuteTimeMs":1}
Progress: {"0":"OFFSET_ZERO"}
TimestampProgress: {}
ReasonOfStateChanged:
ErrorLogUrls:
TrackingSQL:
OtherMsg:
LatestSourcePosition: {}
1 row in set (0.00 sec)
SHOW ROUTINE LOAD\G
*************************** 1. row ***************************
Id: 10076
Name: clicks
CreateTime: 2024-06-12 18:40:53
PauseTime: NULL
EndTime: NULL
DbName: quickstart
TableName: site_clicks
State: RUNNING
DataSourceType: KAFKA
CurrentTaskNum: 1
JobProperties: {"partitions":"*","partial_update":"false","columnToColumnExpr":"*","maxBatchIntervalS":"10","partial_update_mode":"null","whereExpr":"*","dataFormat":"json","timezone":"Etc/UTC","format":"json","log_rejected_record_num":"0","taskTimeoutSecond":"60","json_root":"","maxFilterRatio":"1.0","strict_mode":"false","jsonpaths":"[\"$.uid\",\"$.site\",\"$.vtime\"]","taskConsumeSecond":"15","desireTaskConcurrentNum":"5","maxErrorNum":"0","strip_outer_array":"false","currentTaskConcurrentNum":"1","maxBatchRows":"200000"}
DataSourceProperties: {"topic":"test2","currentKafkaPartitions":"0","brokerList":"redpanda:29092"}
CustomProperties: {"group.id":"clicks_a9426fee-45bb-403a-a1a3-b3bc6c7aa685"}
Statistic: {"receivedBytes":372,"errorRows":0,"committedTaskNum":1,"loadedRows":5,"loadRowsRate":0,"abortedTaskNum":0,"totalRows":5,"unselectedRows":0,"receivedBytesRate":0,"taskExecuteTimeMs":519}
Progress: {"0":"4"}
TimestampProgress: {"0":"1718217035111"}
ReasonOfStateChanged:
ErrorLogUrls:
TrackingSQL:
OtherMsg:
LatestSourcePosition: {"0":"5"}
1 row in set (0.00 sec)

Проверка того, что данные хранятся в MinIO

Откройте MinIO http://localhost:9001/browser/ и убедитесь, что объекты хранятся под starrocks.


Запрос данных из Selena

USE quickstart;
SELECT * FROM site_clicks;
+------+--------------------------------------------+------------+
| uid | site | vtime |
+------+--------------------------------------------+------------+
| 4607 | https://www.starrocks.io/blog | 1718031441 |
| 1575 | https://www.starrocks.io/ | 1718031523 |
| 2398 | https://docs.starrocks.io/ | 1718033630 |
| 3741 | https://www.starrocks.io/product/community | 1718030845 |
| 4792 | https://www.starrocks.io/ | 1718033413 |
+------+--------------------------------------------+------------+
5 rows in set (0.07 sec)

Публикация дополнительных данных

Повторный запуск gen.py опубликует еще пять записей в Redpanda.

python gen.py 5

Проверка того, что данные добавлены

Поскольку задание Routine Load выполняется по расписанию (каждые 10 секунд по умолчанию), данные будут загружены в течение нескольких секунд.

SELECT * FROM site_clicks;
+------+--------------------------------------------+------------+
| uid | site | vtime |
+------+--------------------------------------------+------------+
| 6648 | https://www.starrocks.io/blog | 1718205970 |
| 7914 | https://www.starrocks.io/ | 1718206760 |
| 9854 | https://www.starrocks.io/blog | 1718205676 |
| 1186 | https://www.starrocks.io/ | 1718209083 |
| 3305 | https://docs.starrocks.io/ | 1718209083 |
| 2288 | https://www.starrocks.io/blog | 1718206759 |
| 7879 | https://www.starrocks.io/product/community | 1718204280 |
| 2666 | https://www.starrocks.io/ | 1718208842 |
| 5801 | https://www.starrocks.io/ | 1718208783 |
| 8409 | https://www.starrocks.io/ | 1718206889 |
+------+--------------------------------------------+------------+
10 rows in set (0.02 sec)

Детали конфигурации

Теперь, когда вы получили опыт использования Selena с shared-data, важно понимать конфигурацию.

Конфигурация CN

Конфигурация CN, используемая здесь, является конфигурацией по умолчанию, поскольку CN предназначен для использования shared-data. Конфигурация по умолчанию показана ниже. Вам не нужно вносить никаких изменений.

sys_log_level = INFO

# порты для admin, web, heartbeat service
be_port = 9060
be_http_port = 8040
heartbeat_service_port = 9050
brpc_port = 8060
starlet_port = 9070

Конфигурация FE

Конфигурация FE немного отличается от конфигурации по умолчанию, поскольку FE должен быть настроен на ожидание того, что данные хранятся в Object Storage, а не на локальных дисках на узлах BE.

Файл docker-compose.yml генерирует конфигурацию FE в разделе command сервиса starrocks-fe.

# включить shared data, установить тип хранения, установить endpoint
run_mode = shared_data
cloud_native_storage_type = S3
aws_s3_endpoint = minio:9000

# установить путь в MinIO
aws_s3_path = starrocks

# учетные данные для чтения/записи объектов MinIO
aws_s3_access_key = AAAAAAAAAAAAAAAAAAAA
aws_s3_secret_key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
aws_s3_use_instance_profile = false
aws_s3_use_aws_sdk_default_behavior = false

# Установите это в false, если вы не хотите, чтобы хранилище по умолчанию
# создавалось в объектном хранилище, используя
# детали, предоставленные выше
enable_load_volume_from_conf = true
примечание

Этот файл конфигурации не содержит записей по умолчанию для FE, показана только конфигурация shared-data.

Настройки конфигурации FE, отличные от настроек по умолчанию:

примечание

Многие параметры конфигурации имеют префикс s3_. Этот префикс используется для всех типов хранилища, совместимых с Amazon S3 (например: S3, GCS и MinIO). При использовании Azure Blob Storage префикс — azure_.

run_mode=shared_data

Это включает использование shared-data.

cloud_native_storage_type=S3

Это указывает, используется ли S3-совместимое хранилище или Azure Blob Storage. Для MinIO это всегда S3.

aws_s3_endpoint=minio:9000

Endpoint MinIO, включая номер порта.

aws_s3_path=starrocks

Имя bucket.

aws_s3_access_key=AAAAAAAAAAAAAAAAAAAA

Ключ доступа MinIO.

aws_s3_secret_key=BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

Секрет ключа доступа MinIO.

aws_s3_use_instance_profile=false

При использовании MinIO используется ключ доступа, поэтому профили экземпляров не используются с MinIO.

aws_s3_use_aws_sdk_default_behavior=false

При использовании MinIO этот параметр всегда устанавливается в false.

enable_load_volume_from_conf=true

Когда это true, создается том хранения Selena с именем builtin_storage_volume, использующий объектное хранилище MinIO, и он устанавливается как том хранения по умолчанию для создаваемых вами таблиц.


Примечания к команде Routine Load

Selena Routine Load принимает много аргументов. Здесь описаны только те, которые используются в этом учебнике, остальные будут связаны в разделе дополнительной информации.

CREATE ROUTINE LOAD quickstart.clicks ON site_clicks
PROPERTIES
(
"format" = "JSON",
"jsonpaths" ="[\"$.uid\",\"$.site\",\"$.vtime\"]"
)
FROM KAFKA
(
"kafka_broker_list" = "redpanda:29092",
"kafka_topic" = "test2",
"kafka_partitions" = "0",
"kafka_offsets" = "OFFSET_BEGINNING"
);

Параметры

CREATE ROUTINE LOAD quickstart.clicks ON site_clicks

Параметры для CREATE ROUTINE LOAD ON:

  • database_name.job_name
  • table_name

database_name необязателен. В этой лабораторной работе это quickstart и указан.

job_name обязателен и является clicks

table_name обязателен и является site_clicks

Свойства задания

Свойство format

"format" = "JSON",

В данном случае данные в формате JSON, поэтому свойство установлено в JSON. Другие допустимые форматы: CSV, JSON и Avro. CSV является форматом по умолчанию.

Свойство jsonpaths

"jsonpaths" ="[\"$.uid\",\"$.site\",\"$.vtime\"]"

Имена полей, которые вы хотите загрузить из данных в формате JSON. Значение этого параметра является допустимым выражением JsonPath. Дополнительная информация доступна в конце этой страницы.

Свойства источника данных

kafka_broker_list

"kafka_broker_list" = "redpanda:29092",

Информация о подключении брокера Kafka. Формат: <kafka_broker_name_or_ip>:<broker_ port>. Несколько брокеров разделяются запятыми.

kafka_topic

"kafka_topic" = "test2",

Топик Kafka для потребления.

kafka_partitions и kafka_offsets

"kafka_partitions" = "0",
"kafka_offsets" = "OFFSET_BEGINNING"

Эти свойства представлены вместе, поскольку требуется один kafka_offset для каждой записи kafka_partitions.

kafka_partitions — это список одного или нескольких разделов для потребления. Если это свойство не установлено, то потребляются все разделы.

kafka_offsets — это список смещений, по одному для каждого раздела, указанного в kafka_partitions. В данном случае значение OFFSET_BEGINNING, которое заставляет потреблять все данные. По умолчанию потребляются только новые данные.


Резюме

В этом учебнике вы:

  • Развернули Selena, Redpanda и MinIO в Docker
  • Создали задание Routine Load для потребления данных из топика Kafka
  • Изучили, как настроить Storage Volume Selena, который использует MinIO

Дополнительная информация

Архитектура Selena

Пример, используемый для этой лабораторной работы, очень простой. Routine Load имеет гораздо больше опций и возможностей. узнать больше.

JSONPath