Визуализация файлов Parquet с помощью Apache Superset, Trino или PrestoSQL
Мне очень нравится визуализировать содержимое в таких форматах, как parquet, csv, json и т. д. в Apache Superset. В этой статье мы поговорим о настройках, которые позволят нам сделать это.
Технический стек
- Trino (бывший PrestoSQL)
- Minio —.для размещения файла, совместимый с AWS S3.
- Hive Metastore для получения доступа к данным в Trino с помощью коннектора Hive
- Apache superset — для визуализации данных
Все это можно запустить на локальной машине с помощью потока на основе docker. Никаких внешних зависимостей. После настройки я смог добавить различные данные, которые у меня были, и они быстро превратились в продуктивную среду для визуализации различных типов данных в локальной среде.
Мы будем использовать метахранилище `Hive`. В названии статьи упоминается Parquet, но мы можем визуализировать и другие форматы файлов:
- ORC
- Avro
- RCText (RCFile с помощью ColumnarSerDe)
- RCBinary (RCFile с помощью LazyBinaryColumnarSerDe)
- SequenceFile
- JSON (с помощью org.apache.hive.hcatalog.data.JsonSerDe)
- CSV (с помощью org.apache.hadoop.hive.serde2.OpenCSVSerde)
- TextFile
Исходный код
- Весь код доступен по ссылкe.
- Это решение на базе Docker.
Особенности архитектуры
Нам нравится визуализировать форматы файлов данных, такие как Parquet, в Apache Superset. Но, к сожалению, прямого механизма для их интеграции не существует.
Для соединения с различными источниками данных, включая Parquet, csv, json и т. д. используется Trino (бывший `PrestoSQL`). Однако для доступа к файлам самому Trino нужен коннектор Hive.
Hive может получать доступ к объектным хранилищам, таким как `AWS S3`. Для нашей демонстрации мы можем использовать minio.
Собирать эту экосистему вручную слишком сложно, поэтому для упрощения процесса предлагаю использовать экосистему на базе Docker.
Docker-compose.yaml:
version: "3.9"
services:
mariadb:
hostname: mariadb
image: mariadb:10.7.1
container_name: mariadb
ports:
- 3306:3306
volumes:
- ./mariadb-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: admin
MYSQL_USER: admin
MYSQL_PASSWORD: admin
MYSQL_DATABASE: metastore_db
hive-metastore:
hostname: hive-metastore
container_name: hive-metastore
image: 'bitsondatadev/hive-metastore:latest'
ports:
- '9083:9083' # Metastore Thrift
volumes:
- ./hive/conf/metastore-site.xml:/opt/apache-hive-metastore-3.0.0-bin/conf/metastore-site.xml:ro
environment:
METASTORE_DB_HOSTNAME: mariadb
depends_on:
- mariadb
trino-coordinator:
image: "trinodb/trino:367"
container_name: trino
ports:
- '8080:8080'
volumes:
- ./trino/coordinator/etc:/etc/trino:ro
depends_on:
- hive-metastore
minio:
hostname: minio
image: 'minio/minio:RELEASE.2021-12-29T06-49-06Z'
container_name: minio
ports:
- '9595:9000' # API
- '38000:38000' # console
volumes:
- ./minio-data:/data
environment:
MINIO_ROOT_USER: minio_access_key
MINIO_ROOT_PASSWORD: minio_secret_key
command: server /data --console-address ":38000"
superset:
build: ./superset
ports:
- "8088:8088"
volumes:
- ./superset-data:/app/superset_homeМетахранилище Hive
Нам не нужно все приложение Hive. Нам будет вполне достаточно автономного метахранилища Hive.
Конфигурация метахранилища Hive
Вперед!
-
docker-compose up - объемы Docker устанавливаются локально. Это должно помочь в понимании данных различных сервисов
Инициализация схемы Hive
Запустите Trino CLI с помощью docker exec -it trino trino и выполните следующие SQL-команды:
-- Need to manually run each query now.CREATE SCHEMA IF NOT EXISTS hive.iris WITH (location = 's3a://iris/');-- Path s3a://iris/iris_data is the holding directory. We dont give full file path. Only parent directory CREATE TABLE IF NOT EXISTS hive.iris.iris_data ( sepal_length DOUBLE, sepal_width DOUBLE, petal_length DOUBLE, petal_width DOUBLE, class VARCHAR ) WITH ( external_location = 's3a://iris/iris_data', format = 'PARQUET' );
Тестирование Trino с помощью Minio
Давайте выполним SQL-запрос из Trino к файлу Parquet, загруженному в Minio.
trino> SELECT -> sepal_length, -> class -> FROM hive.iris.iris_data -> LIMIT 10; -> sepal_length | class --------------+------------- 5.1 | Iris-setosa 5.0 | Iris-setosa 4.4 | Iris-setosa 4.9 | Iris-setosa 4.6 | Iris-setosa 5.0 | Iris-setosa 5.4 | Iris-setosa 4.6 | Iris-setosa 4.9 | Iris-setosa 4.7 | Iris-setosa (10 rows)Query 20211229_201233_00002_wfmbr, FINISHED, 1 node Splits: 10 total, 10 done (100.00%) 1.14 [15 rows, 8.08KB] [13 rows/s, 7.08KB/s]
Установка Superset
- Pапустите `sh superset_init.sh` в первый раз. Это настроит superset с SQLite DB в качестве хранилища метаданных.
- Добавьте базу данных > trino с URI SqlAlchemy в Superset - `trino://hive@trino-coordinator:8080/hive`.
- Добавьте набор данных в Superset. Теперь мы сможем работать с iris_data как с таблицей.
Заключение
Итак, с помощью алгоритма, описанного выше, мы смогли просмотреть файл parquet в виде таблицы непосредственно в Apache Superset. Его можно использовать для переноса любых форматов файлов в Apache Superset. Как только данные окажутся в Superset, можно будет визуализировать их по своему усмотрению.




