Подключение из Trino#

Trino — это open-source проект для обработки больших данных из разных источников.

Подключение к CedrusData Catalog из Trino происходит с помощью коннектора Iceberg.

Примечание

Мы рекомендуем использовать CedrusData — высокопроизводительную систему на основе Trino, содержащую важные улучшения безопасности и производительности. CedrusData зарегистрирован в реестре российского ПО. Коммерческие пользователи CedrusData обеспечены профессиональной технической поддержкой и оперативно получают новые улучшения, отсутствующие в Trino.

Инструкции по интеграции CedrusData Catalog и CedrusData приведены в Подключение из CedrusData.

Подготовка#

  1. Убедитесь, что CedrusData Catalog содержит хотя бы один Iceberg каталог

  2. Получите постоянный или временный токен доступа CedrusData Catalog

  3. Если вы планируете использовать имперсонацию пользователей Trino, дополнительно выполните подготовку, описанную в разделе Имперсонация пользователей Trino

Конфигурация Trino#

Базовая конфигурация каталога Iceberg REST Catalog в Trino для подключения к CedrusData Catalog приведена ниже:

iceberg.catalog.type=rest
iceberg.rest-catalog.uri=<адрес_CedrusData_Catalog>
iceberg.rest-catalog.warehouse=<имя_каталога_Iceberg_в_CedrusData_Catalog>
iceberg.rest-catalog.security=oauth2
iceberg.rest-catalog.oauth2.<тип_аутентификации>=<токен_доступа_CedrusData_Catalog>
iceberg.rest-catalog.session=<тип_сессии>

Где:

  • <адрес_CedrusData_Сatalog> — адрес, по которому доступен Iceberg REST Catalog интерфейс CedrusData Catalog (http(s)://host[:port]/catalog/iceberg)

  • <имя_каталога_Iceberg_в_CedrusData_Catalog> — имя объекта Iceberg catalog, зарегистрированного в CedrusData Catalog

  • <тип_аутентификации> — механизм аутентификации в CedrusData Catalog (credential или token)

  • <токен_доступа_CedrusData_Catalog> — токен доступа CedrusData Catalog: постоянный токен доступа для типа аутентификации credential; постоянный иди временный токен доступа для типа аутентификации token

  • <тип_сессии>none, чтобы выполнять команды от системного пользователя; user — чтобы осуществлять имперсонацию пользователей CedrusData в CedrusData Catalog (в этом случае <тип_аутентификации> должен иметь значение credential).

Кроме этого, вы должны задать конфигурацию файловой системы для доступа к файловой системе. В конце документа приведен пример полной конфигурации для доступа к S3-совместимой файловой системе.

Имперсонация пользователей Trino#

По умолчанию (iceberg.rest-catalog.session=none) все операции над каталогом выполняются от имени одного пользователя — владельца токена доступа, заданного в конфигурации. Имена пользователей Trino в CedrusData Catalog при этом не передаются.

Режим iceberg.rest-catalog.session=user включает имперсонацию: Trino передает в CedrusData Catalog имя пользователя, выполняющего запрос, и каталог обслуживает запрос от его имени. Владельцем созданных объектов становится этот пользователь, а проверка прав доступа и аудит выполняются в его контексте.

Требования#

  1. Тип аутентификации — credential. Имперсонация возможна только через OAuth2 client credentials flow. С параметром token режим session=user работать не будет, так как в этом случае каталог не может выпустить временный токен доступа для другого пользователя.

  2. Владелец токена (actor) должен иметь привилегии на имперсонацию. Полное описание и пример настройки приведены в разделе Привилегии actor.

  3. Пользователи должны быть зарегистрированы в CedrusData Catalog. Для каждого пользователя Trino необходимо создать принципал с точно совпадающим именем и выдать ему привилегии на объекты каталога. Если в Trino настроена аутентификация через OAuth 2.0, имя пользователя формируется из claim, заданного в свойстве http-server.authentication.oauth2.principal-field.

Пример конфигурации приведен в разделе Имперсонация пользователей.

Пример#

Инструкции ниже описывают, как интегрировать локальный экземпляр Trino с CedrusData Catalog.

  1. Создайте файловую систему CedrusData Catalog на основе MinIO согласно инструкциям. Не останавливайте Docker-контейнеры.

  2. Создайте Iceberg каталог с именем ice_prod в CedrusData Catalog:

    docker exec -it example-catalog catalog iceberg catalog create \
      --catalog-name ice_prod \
      --file-system-name minio \
      --file-system-location s3://ice-bucket
    
  3. Создайте файл ice.properties, содержащий конфигурацию Iceberg каталога Trino:

    connector.name=iceberg
    iceberg.catalog.type=REST
    iceberg.rest-catalog.uri=http://example-catalog:9080/catalog/iceberg
    iceberg.rest-catalog.warehouse=ice_prod
    iceberg.rest-catalog.security=oauth2
    iceberg.rest-catalog.oauth2.credential=${ENV:CATALOG_ACCESS_TOKEN}
    fs.hadoop.enabled=false
    fs.native-s3.enabled=true
    s3.endpoint=http://example-minio:9000
    s3.region=us-east-1
    s3.path-style-access=true
    s3.aws-access-key=${ENV:MINIO_ACCESS_KEY}
    s3.aws-secret-key=${ENV:MINIO_SECRET_KEY}
    
  4. Запустите Docker-контейнер Trino. Мы передадим ключи MinIO и токен доступа CedrusData Catalog в качестве переменных окружения, чтобы нам не писать их в явном виде в дальнейшем:

    CATALOG_ACCESS_TOKEN=$(docker exec example-catalog cat /data/catalog/catalog-admin-access-token) && \
    docker run -d \
      --name example-trino \
      --network=example-network \
      -e CATALOG_ACCESS_TOKEN=$CATALOG_ACCESS_TOKEN \
      -e MINIO_ACCESS_KEY=accesskey \
      -e MINIO_SECRET_KEY=secretkey \
      -p 8080:8080 \
      -v ${PWD}/ice.properties:/etc/trino/catalog/ice.properties \
      trinodb/trino
    
  5. Запустите CLI утилиту Trino:

    docker exec -it example-trino trino
    
  6. Выполните ряд команд SQL:

    CREATE SCHEMA IF NOT EXISTS ice.hr;
    DROP TABLE IF EXISTS ice.hr.employee;
    CREATE TABLE ice.hr.employee(id BIGINT, name VARCHAR(100));
    INSERT INTO ice.hr.employee VALUES (1, 'John');
    SELECT * FROM ice.hr.employee;
    
  7. Пройдите в консоль MinIO http://localhost:9001 (имя пользователя accesskey, пароль secretkey), и ознакомьтесь с созданными файлам Iceberg в директории ice-bucket/hr/employee.

  8. Получите список таблиц Iceberg через утилиту командной строки CedrusData Catalog:

    docker exec -it example-catalog catalog iceberg object list
    
  9. (при необходимости) Остановите контейнер CedrusData:

    docker rm -f example-trino
    

    Очистите остальные ресурсы, следуя последнему шагу инструкции.

Имперсонация пользователей#

Чтобы операции над каталогом выполнялись от имени пользователей Trino, добавьте в ice.properties параметр iceberg.rest-catalog.session=user и выполните подготовку, описанную в разделе Имперсонация пользователей Trino:

connector.name=iceberg
iceberg.catalog.type=REST
iceberg.rest-catalog.uri=http://example-catalog:9080/catalog/iceberg
iceberg.rest-catalog.warehouse=ice_prod
iceberg.rest-catalog.security=oauth2
iceberg.rest-catalog.oauth2.credential=${ENV:CATALOG_ACCESS_TOKEN}
iceberg.rest-catalog.oauth2.scope=catalog
iceberg.rest-catalog.session=user
fs.hadoop.enabled=false
fs.native-s3.enabled=true
s3.endpoint=http://example-minio:9000
s3.region=us-east-1
s3.path-style-access=true
s3.aws-access-key=${ENV:MINIO_ACCESS_KEY}
s3.aws-secret-key=${ENV:MINIO_SECRET_KEY}