Развертывание CedrusData с MinIO и JDBC-каталогом Apache Iceberg#

В данной статье приведена инструкция по развертыванию CedrusData для работы с Apache Iceberg:

  • MinIO в standalone режиме в качестве S3-совместимого хранилища

  • PostgreSQL в качестве JDBC-каталога Apache Iceberg

Особенностью данной конфигурации является то, что для работы не требуется каталог Hive Metastore.

Мы будем использовать Docker Compose. Процесс развертывания занимает порядка 10 минут.

Подготовка стенда#

  1. Убедитесь, что у вас установлен Docker Server и Docker Compose.

  2. Убедитесь, что команда docker не требует sudo.

  3. Убедитесь, что порты 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
    

Запуск контейнеров#

  1. Перейдите в рабочий каталог с файлом compose.yaml. Запустите контейнеры командой docker-compose up

  2. Откройте новое окно терминала и убедитесь что все 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#

  1. Откройте консоль MinIO будет доступна по адресу http://localhost:9001 и выполните вход с именем пользователяminioadmin и паролем minioadmin

  2. Создайте новый бакет с именем mybucket, нажав на панели слева «Buckets» -> «Create Bucket».

Работа с данными Iceberg в CedrusData#

  1. Подключитесь к CedrusData. Вы можете это сделать с помощью JDBC-клиента (например, DBeaver), используя адрес jdbc:trino://localhost:8080 и произвольное имя пользователя. Так же для подключения можно использовать утилиту командной строки trino (<container_name> — это имя Docker-контейнера CedrusData, например cedrus-cedrus-1):

    docker exec -it <container_name> trino
    
  2. Выполните команду SHOW CATALOGS, и убедитесь, что вам доступен каталог iceberg.

  3. Создайте новую схему в каталоге:

    CREATE SCHEMA iceberg.my_schema WITH (location = 's3a://mybucket/my_schema/');
    
  4. Создайте таблицу и заполните ее произвольными данными:

    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).

  5. Получите данные из таблицы:

    SELECT * FROM iceberg.my_schema.example_table
    

Мы также рекомендуем вам ознакомиться с расширенными инструкциями по настройке безопасности MinIO и Trino.