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

Apache Iceberg Lakehouse

Обзор

  • Развертывание Object Storage, Apache Spark, каталога Iceberg и Selena с помощью Docker compose
  • Загрузка данных New York City Green Taxi за май 2023 года в озеро данных Iceberg
  • Настройка Selena для доступа к каталогу Iceberg
  • Запрос данных с помощью Selena там, где данные находятся

DLA

Помимо эффективной аналитики локальных данных, Selena может работать как вычислительный движок для анализа данных, хранящихся в озерах данных, таких как Apache Hudi, Apache Iceberg и Delta Lake. Одной из ключевых особенностей Selena является external catalog, который выступает в качестве связующего звена с внешне поддерживаемым метахранилищем. Эта функциональность предоставляет пользователям возможность беспрепятственно запрашивать внешние источники данных, устраняя необходимость в миграции данных. Таким образом, пользователи могут анализировать данные из различных систем, таких как HDFS и Amazon S3, в различных форматах файлов, таких как Parquet, ORC и CSV и т.д.

Предыдущий рисунок показывает сценарий аналитики озера данных, где Selena отвечает за вычисления и анализ данных, а озеро данных отвечает за хранение, организацию и обслуживание данных. Озера данных позволяют пользователям хранить данные в открытых форматах хранения и использовать гибкие схемы для создания отчетов на основе "единого источника истины" для различных случаев использования BI, AI, ad-hoc и отчетности. Selena полностью использует преимущества своего векторизационного движка и CBO, значительно улучшая производительность аналитики озера данных.

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

Docker

  • Docker
  • 5 ГБ оперативной памяти, выделенной для Docker
  • 20 ГБ свободного дискового пространства, выделенного для Docker

SQL-клиент

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

curl

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


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

FE

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

BE

Backend (BE) узлы отвечают как за хранение данных, так и за выполнение планов запросов в развертываниях shared-nothing. Когда используется external catalog (например, каталог Iceberg, используемый в этом руководстве), BE-узлы могут кэшировать данные из внешнего каталога для ускорения запросов.


Среда

В этом руководстве используется шесть контейнеров (сервисов), и все они развертываются с помощью Docker compose. Сервисы и их обязанности:

СервисОбязанности
starrocks-feУправление метаданными, подключения клиентов, планы запросов и планирование
starrocks-beВыполнение планов запросов
restПредоставление каталога Iceberg (служба метаданных)
spark-icebergСреда Apache Spark для запуска PySpark
mcНастройка MinIO (клиент командной строки MinIO)
minioMinIO Object Storage

Загрузка конфигурации Docker и данных NYC Green Taxi

Чтобы предоставить среду с тремя необходимыми контейнерами, Selena предоставляет файл Docker compose. Загрузите файл compose и набор данных с помощью curl.

Файл Docker compose:

mkdir iceberg
cd iceberg
curl -O https://raw.githubusercontent.com/StarRocks/demo/master/documentation-samples/iceberg/docker-compose.yml

И набор данных:

curl -O https://raw.githubusercontent.com/StarRocks/demo/master/documentation-samples/iceberg/datasets/green_tripdata_2023-05.parquet

Запуск среды в Docker

подсказка

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

docker compose up -d
[+] Building 0.0s (0/0)                     docker:desktop-linux
[+] Running 6/6
✔ Container iceberg-rest Started 0.0s
✔ Container minio Started 0.0s
✔ Container starrocks-fe Started 0.0s
✔ Container mc Started 0.0s
✔ Container spark-iceberg Started 0.0s
✔ Container starrocks-be Started

Проверка состояния среды

Проверьте прогресс сервисов. Для того чтобы FE и BE стали здоровыми, потребуется около 30 секунд.

Выполняйте docker compose ps до тех пор, пока FE и BE не покажут статус healthy. Остальные сервисы не имеют конфигураций проверки работоспособности, но вы будете взаимодействовать с ними и узнаете, работают ли они:

подсказка

Если у вас установлен jq и вы предпочитаете более короткий список из docker compose ps, попробуйте:

docker compose ps --format json | jq '{Service: .Service, State: .State, Status: .Status}'
docker compose ps
SERVICE         CREATED         STATUS                   PORTS
rest 4 minutes ago Up 4 minutes 0.0.0.0:8181->8181/tcp
mc 4 minutes ago Up 4 minutes
minio 4 minutes ago Up 4 minutes 0.0.0.0:9000-9001->9000-9001/tcp
spark-iceberg 4 minutes ago Up 4 minutes 0.0.0.0:8080->8080/tcp, 0.0.0.0:8888->8888/tcp, 0.0.0.0:10000-10001->10000-10001/tcp
starrocks-be 4 minutes ago Up 4 minutes (healthy) 0.0.0.0:8040->8040/tcp
starrocks-fe 4 minutes ago Up 4 minutes (healthy) 0.0.0.0:8030->8030/tcp, 0.0.0.0:9020->9020/tcp, 0.0.0.0:9030->9030/tcp

PySpark

Существует несколько способов взаимодействия с Iceberg, в этом руководстве используется PySpark. Если вы не знакомы с PySpark, документация приведена в разделе "Дополнительная информация", но каждая команда, которую вам нужно выполнить, приведена ниже.

Набор данных Green Taxi

Скопируйте данные в контейнер spark-iceberg. Эта команда скопирует файл набора данных в каталог /opt/spark/ в сервисе spark-iceberg:

docker compose \
cp green_tripdata_2023-05.parquet spark-iceberg:/opt/spark/

Запуск PySpark

Эта команда подключится к сервису spark-iceberg и выполнит команду pyspark:

docker compose exec -it spark-iceberg pyspark
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/__ / .__/\_,_/_/ /_/\_\ version 3.5.0
/_/

Using Python version 3.9.18 (main, Nov 1 2023 11:04:44)
Spark context Web UI available at http://6ad5cb0e6335:4041
Spark context available as 'sc' (master = local[*], app id = local-1701967093057).
SparkSession available as 'spark'.
>>>

Чтение набора данных в dataframe

Dataframe является частью Spark SQL и предоставляет структуру данных, похожую на таблицу базы данных или электронную таблицу.

Данные Green Taxi предоставляются NYC Taxi and Limousine Commission в формате Parquet. Загрузите файл из каталога /opt/spark и изучите первые несколько записей, выбрав первые несколько столбцов первых трех строк данных. Эти команды должны выполняться в сеансе pyspark. Команды:

  • Прочитать файл набора данных с диска в dataframe с именем df
  • Отобразить схему файла Parquet
df = spark.read.parquet("/opt/spark/green_tripdata_2023-05.parquet")
df.printSchema()
root
|-- VendorID: integer (nullable = true)
|-- lpep_pickup_datetime: timestamp_ntz (nullable = true)
|-- lpep_dropoff_datetime: timestamp_ntz (nullable = true)
|-- store_and_fwd_flag: string (nullable = true)
|-- RatecodeID: long (nullable = true)
|-- PULocationID: integer (nullable = true)
|-- DOLocationID: integer (nullable = true)
|-- passenger_count: long (nullable = true)
|-- trip_distance: double (nullable = true)
|-- fare_amount: double (nullable = true)
|-- extra: double (nullable = true)
|-- mta_tax: double (nullable = true)
|-- tip_amount: double (nullable = true)
|-- tolls_amount: double (nullable = true)
|-- ehail_fee: double (nullable = true)
|-- improvement_surcharge: double (nullable = true)
|-- total_amount: double (nullable = true)
|-- payment_type: long (nullable = true)
|-- trip_type: long (nullable = true)
|-- congestion_surcharge: double (nullable = true)

>>>

Изучите первые несколько (семь) столбцов первых нескольких (трех) строк данных:

df.select(df.columns[:7]).show(3)
+--------+--------------------+---------------------+------------------+----------+------------+------------+
|VendorID|lpep_pickup_datetime|lpep_dropoff_datetime|store_and_fwd_flag|RatecodeID|PULocationID|DOLocationID|
+--------+--------------------+---------------------+------------------+----------+------------+------------+
| 2| 2023-05-01 00:52:10| 2023-05-01 01:05:26| N| 1| 244| 213|
| 2| 2023-05-01 00:29:49| 2023-05-01 00:50:11| N| 1| 33| 100|
| 2| 2023-05-01 00:25:19| 2023-05-01 00:32:12| N| 1| 244| 244|
+--------+--------------------+---------------------+------------------+----------+------------+------------+
only showing top 3 rows

Запись в таблицу

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

  • Catalog: demo
  • База данных: nyc
  • Таблица: greentaxis
df.writeTo("demo.nyc.greentaxis").create()

Настройка Selena для доступа к каталогу Iceberg

Теперь вы можете выйти из PySpark или открыть новый терминал для выполнения SQL-команд. Если вы открываете новый терминал, измените каталог на каталог quickstart, содержащий файл docker-compose.yml, прежде чем продолжить.

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

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.

Теперь вы можете выйти из сеанса PySpark и подключиться к Selena.

подсказка

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

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

docker compose exec starrocks-fe \
mysql -P 9030 -h 127.0.0.1 -u root --prompt="StarRocks > "
StarRocks >

Создание external catalog

External catalog — это конфигурация, которая позволяет Selena работать с данными Iceberg так, как если бы они находились в базах данных и таблицах Selena. Отдельные свойства конфигурации будут подробно описаны после команды.

CREATE EXTERNAL CATALOG 'iceberg'
COMMENT "External catalog to Apache Iceberg on MinIO"
PROPERTIES
(
"type"="iceberg",
"iceberg.catalog.type"="rest",
"iceberg.catalog.uri"="http://iceberg-rest:8181",
"iceberg.catalog.warehouse"="warehouse",
"aws.s3.access_key"="admin",
"aws.s3.secret_key"="password",
"aws.s3.endpoint"="http://minio:9000",
"aws.s3.enable_path_style_access"="true",
"client.factory"="com.starrocks.connector.iceberg.IcebergAwsClientFactory"
);

PROPERTIES

СвойствоОписание
typeВ этом примере тип iceberg. Другие варианты включают Hive, Hudi, Delta Lake и JDBC.
iceberg.catalog.typeВ этом примере используется rest. Tabular предоставляет используемый образ Docker, и Tabular использует REST.
iceberg.catalog.uriКонечная точка REST-сервера.
iceberg.catalog.warehouseИдентификатор каталога Iceberg. В данном случае имя warehouse, указанное в файле compose, — warehouse.
aws.s3.access_keyКлюч MinIO. В данном случае ключ и пароль установлены в файле compose как admin
aws.s3.secret_keyи password.
aws.s3.endpointКонечная точка MinIO.
aws.s3.enable_path_style_accessПри использовании MinIO для Object Storage это обязательно. MinIO ожидает этот формат http://host:port/<bucket_name>/<key_name>
client.factoryУстановив это свойство для использования iceberg.IcebergAwsClientFactory, параметры aws.s3.access_key и aws.s3.secret_key используются для аутентификации.
SHOW CATALOGS;
+-----------------+----------+------------------------------------------------------------------+
| Catalog | Type | Comment |
+-----------------+----------+------------------------------------------------------------------+
| default_catalog | Internal | An internal catalog contains this cluster's self-managed tables. |
| iceberg | Iceberg | External catalog to Apache Iceberg on MinIO |
+-----------------+----------+------------------------------------------------------------------+
2 rows in set (0.03 sec)
SET CATALOG iceberg;
SHOW DATABASES;
подсказка

База данных, которую вы видите, была создана в вашем сеансе PySpark. Когда вы добавили CATALOG iceberg, база данных nyc стала видимой в Selena.

+--------------------+
| Database |
+--------------------+
| information_schema |
| nyc |
+--------------------+
2 rows in set (0.07 sec)
USE nyc;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
SHOW TABLES;
+---------------+
| Tables_in_nyc |
+---------------+
| greentaxis |
+---------------+
1 rows in set (0.05 sec)
DESCRIBE greentaxis;
подсказка

Сравните схему, которую использует Selena, с выводом df.printSchema() из предыдущего сеанса PySpark. Типы данных Spark timestamp_ntz представлены как DATETIME в Selena и т.д.

+-----------------------+---------------------+------+-------+---------+-------+---------+
| Field | Type | Null | Key | Default | Extra | Comment |
+-----------------------+---------------------+------+-------+---------+-------+---------+
| VendorID | INT | Yes | false | NULL | | NULL |
| lpep_pickup_datetime | DATETIME | Yes | false | NULL | | NULL |
| lpep_dropoff_datetime | DATETIME | Yes | false | NULL | | NULL |
| store_and_fwd_flag | VARCHAR(1073741824) | Yes | false | NULL | | NULL |
| RatecodeID | BIGINT | Yes | false | NULL | | NULL |
| PULocationID | INT | Yes | false | NULL | | NULL |
| DOLocationID | INT | Yes | false | NULL | | NULL |
| passenger_count | BIGINT | Yes | false | NULL | | NULL |
| trip_distance | DOUBLE | Yes | false | NULL | | NULL |
| fare_amount | DOUBLE | Yes | false | NULL | | NULL |
| extra | DOUBLE | Yes | false | NULL | | NULL |
| mta_tax | DOUBLE | Yes | false | NULL | | NULL |
| tip_amount | DOUBLE | Yes | false | NULL | | NULL |
| tolls_amount | DOUBLE | Yes | false | NULL | | NULL |
| ehail_fee | DOUBLE | Yes | false | NULL | | NULL |
| improvement_surcharge | DOUBLE | Yes | false | NULL | | NULL |
| total_amount | DOUBLE | Yes | false | NULL | | NULL |
| payment_type | BIGINT | Yes | false | NULL | | NULL |
| trip_type | BIGINT | Yes | false | NULL | | NULL |
| congestion_surcharge | DOUBLE | Yes | false | NULL | | NULL |
+-----------------------+---------------------+------+-------+---------+-------+---------+
20 rows in set (0.03 sec)
подсказка

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

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

Запросы с помощью Selena

Проверка формата времени посадки

SELECT lpep_pickup_datetime FROM greentaxis LIMIT 10;
+----------------------+
| lpep_pickup_datetime |
+----------------------+
| 2023-05-01 00:52:10 |
| 2023-05-01 00:29:49 |
| 2023-05-01 00:25:19 |
| 2023-05-01 00:07:06 |
| 2023-05-01 00:43:31 |
| 2023-05-01 00:51:54 |
| 2023-05-01 00:27:46 |
| 2023-05-01 00:27:14 |
| 2023-05-01 00:24:14 |
| 2023-05-01 00:46:55 |
+----------------------+
10 rows in set (0.07 sec)

Поиск часов пик

Этот запрос агрегирует поездки по часам дня и показывает, что самый загруженный час дня — 18:00.

SELECT COUNT(*) AS trips,
hour(lpep_pickup_datetime) AS hour_of_day
FROM greentaxis
GROUP BY hour_of_day
ORDER BY trips DESC;
+-------+-------------+
| trips | hour_of_day |
+-------+-------------+
| 5381 | 18 |
| 5253 | 17 |
| 5091 | 16 |
| 4736 | 15 |
| 4393 | 14 |
| 4275 | 19 |
| 3893 | 12 |
| 3816 | 11 |
| 3685 | 13 |
| 3616 | 9 |
| 3530 | 10 |
| 3361 | 20 |
| 3315 | 8 |
| 2917 | 21 |
| 2680 | 7 |
| 2322 | 22 |
| 1735 | 23 |
| 1202 | 6 |
| 1189 | 0 |
| 806 | 1 |
| 606 | 2 |
| 513 | 3 |
| 451 | 5 |
| 408 | 4 |
+-------+-------------+
24 rows in set (0.08 sec)

Заключение

Это руководство познакомило вас с использованием external catalog Selena, чтобы показать, что вы можете запрашивать данные там, где они находятся, используя каталог Iceberg REST. Многие другие интеграции доступны с использованием каталогов Hive, Hudi, Delta Lake и JDBC.

В этом руководстве вы:

  • Развернули Selena и среду Iceberg/PySpark/MinIO в Docker
  • Настроили external catalog Selena для предоставления доступа к каталогу Iceberg
  • Загрузили данные о такси, предоставленные Нью-Йорком, в озеро данных Iceberg
  • Запросили данные с помощью SQL в Selena без копирования данных из озера данных

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

Каталоги Selena

Документация Apache Iceberg и Быстрый старт (включает PySpark)

Набор данных Green Taxi Trip Records предоставлен Нью-Йорком в соответствии с этими условиями использования и политикой конфиденциальности.