Развертывание CedrusData с MinIO и JDBC-каталогом Apache Iceberg#
В данной статье приведена инструкция по развертыванию CedrusData для работы с Apache Iceberg:
MinIO в standalone режиме в качестве S3-совместимого хранилища
PostgreSQL в качестве JDBC-каталога Apache Iceberg
Особенностью данной конфигурации является то, что для работы не требуется каталог Hive Metastore.
Мы будем использовать Docker Compose. Процесс развертывания занимает порядка 10 минут.
Подготовка стенда#
Убедитесь, что у вас установлен Docker Server и Docker Compose.
Убедитесь, что команда
docker
не требуетsudo
.Убедитесь, что порты
8080
,9000
,9001
,5432
не заняты другими процессами.
Подготовка файлов конфигурации#
Создайте произвольный каталог на вашем компьютере. Внутри него нужно будет разместить файлы со следующим содержимым.
Содержимое файла
iceberg.properties
:connector.name=iceberg iceberg.catalog.type=jdbc iceberg.jdbc-catalog.catalog-name=ice_catalog iceberg.jdbc-catalog.driver-class=org.postgresql.Driver iceberg.jdbc-catalog.connection-url=jdbc:postgresql://pg:5432/ice iceberg.jdbc-catalog.connection-user=ice iceberg.jdbc-catalog.connection-password=ice iceberg.jdbc-catalog.default-warehouse-dir=http://minio:9000/mybucket iceberg.file-format=parquet iceberg.compression-codec=SNAPPY fs.native-s3.enabled=true s3.endpoint=http://minio:9000 s3.region=ru-central1 s3.aws-access-key=minioadmin s3.aws-secret-key=minioadmin s3.path-style-access=true
Содержимое файла
init_pg.sql
:CREATE TABLE iceberg_tables( catalog_name VARCHAR(255) NOT NULL, table_namespace VARCHAR(255) NOT NULL, table_name VARCHAR(255) NOT NULL, metadata_location VARCHAR(1000), previous_metadata_location VARCHAR(1000), iceberg_type VARCHAR(5), PRIMARY KEY (catalog_name, table_namespace, table_name) ); CREATE TABLE iceberg_namespace_properties( catalog_name VARCHAR(255) NOT NULL, namespace VARCHAR(255) NOT NULL, property_key VARCHAR(255), property_value VARCHAR(1000), PRIMARY KEY (catalog_name, namespace, property_key) );
Содержимое файла
compose.yaml
:services: cedrus: image: cr.yandex/crpjtvqf29mpabhmrf1s/cedrus:458-4 ports: - "8080:8080" networks: - demoNet volumes: - $PWD/iceberg.properties:/etc/cedrus/catalog/iceberg.properties depends_on: - pg - minio minio: image: minio/minio ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin networks: - demoNet volumes: - ./s3data:/data command: server /data --address ":9000" --console-address ":9001" pg: image: postgres:16-alpine ports: - "5432:5432" networks: - demoNet environment: POSTGRES_USER: "ice" POSTGRES_PASSWORD: "ice" PGDATA: "/var/lib/postgresql/data/pgdata" volumes: - ./pgdata:/var/lib/postgresql/data - ./init_pg.sql:/docker-entrypoint-initdb.d/init.sql networks: demoNet: name: MyNetwork driver: bridge
Запуск контейнеров#
Перейдите в рабочий каталог с файлом
compose.yaml
. Запустите контейнеры командойdocker-compose up
Откройте новое окно терминала и убедитесь что все 3 контейнера успешно запущены командой
docker ps
:CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f036fd457eab cr.yandex/crpjtvqf29mpabhmrf1s/cedrus:442-1 "/bin/sh -c /usr/lib…" About an hour ago Up 28 seconds 0.0.0.0:8080->8080/tcp cedrus-cedrus-1 e8f79b0fc7d0 minio/minio "/usr/bin/docker-ent…" 2 hours ago Up 29 seconds 0.0.0.0:9000-9001->9000-9001/tcp cedrus-minio-1 22400543808e postgres:16-alpine "docker-entrypoint.s…" 2 hours ago Up 29 seconds 0.0.0.0:5432->5432/tcp cedrus-pg-1
В текущей директории должны появиться 2 директории:
pgdata
(данные postgres) иs3data
(данные MinIO)
Подготовка бакета MinIO#
Откройте консоль MinIO будет доступна по адресу http://localhost:9001 и выполните вход с именем пользователя
minioadmin
и паролемminioadmin
Создайте новый бакет с именем
mybucket
, нажав на панели слева «Buckets» -> «Create Bucket».
Работа с данными Iceberg в CedrusData#
Подключитесь к CedrusData. Вы можете это сделать с помощью JDBC-клиента (например, DBeaver), используя адрес
jdbc:trino://localhost:8080
и произвольное имя пользователя. Так же для подключения можно использовать утилиту командной строкиtrino
(<container_name>
— это имя Docker-контейнера CedrusData, напримерcedrus-cedrus-1
):docker exec -it <container_name> trino
Выполните команду
SHOW CATALOGS
, и убедитесь, что вам доступен каталогiceberg
.Создайте новую схему в каталоге:
CREATE SCHEMA iceberg.my_schema WITH (location = 's3a://mybucket/my_schema/');
Создайте таблицу и заполните ее произвольными данными:
CREATE TABLE iceberg.my_schema.example_table ( c1 INTEGER, c2 DATE, c3 DOUBLE ); INSERT INTO iceberg.my_schema.example_table values (1, CURRENT_DATE, 2.0);
Так же вы можете воспользоваться готовыми наборами данных TPC-DS и TPC-H, находящимися в каталогах
tpcds
иtpch
, соответственно. (см. tpcds и tpch).Получите данные из таблицы:
SELECT * FROM iceberg.my_schema.example_table
Мы также рекомендуем вам ознакомиться с расширенными инструкциями по настройке безопасности MinIO и Trino.