Каталог Iceberg в Trino

Сервис Trino поставляется с преднастроенным каталогом для работы с таблицами Iceberg. Данный каталог использует коннектор Iceberg и "из коробки" готов к работе с Iceberg-таблицами, которые хранятся в вашем ADH-кластере. Встроенный каталог Iceberg использует Hive Metastore в качестве реализации Iceberg-каталога. То есть при выполнении запроса к Iceberg-таблице Trino запрашивает метаданные о таблице из Hive Metastore.

Параметры конфигурации встроенного Iceberg-каталога генерируются автоматически и обеспечивают доступ к Hive Metastore, а также к HDFS-директориям сервиса Hive. Имя встроенного каталога — iceberg-adh. ADH формирует каталог автоматически и генерирует файл iceberg-adh.properties в директории /etc/trino/conf/catalog/, если:

  • В ADH-кластере установлен сервис Hive. Если сервис Hive был установлен после Trino, сервис Trino необходимо перезапустить.

  • Конфигурация Iceberg-каталога активна.

Активация каталога Iceberg

По умолчанию встроенный Iceberg-каталог сервиса Trino отключен. Для его активации используйте ADCM. Для этого включите опцию Iceberg configuration в сервисе Trino (Clusters → <clusterName> → Services → Trino → Configuration), а затем перезапустите сервис.

После активации следует проверить доступность встроенного каталога. Для этого подключитесь к Trino Coordinator (используя Trino CLI или SQL-клиент, например, DBeaver) и выполните команду:

SHOW CATALOGS;

В списке появится встроенный Iceberg-каталог:

Catalog    |
-----------+
iceberg-adh|
system     |
РЕКОМЕНДАЦИЯ
Актуальная JDBC-строка для подключения к сервису Trino доступна на странице конфигурации сервиса в ADCM (Clusters → <clusterName> → Services → Trino → Info).

Поддерживаемые форматы таблиц

Iceberg-коннектор сервиса Trino может работать с таблицами Iceberg в следующих форматах:

  • Parquet

  • ORC

  • Avro

Сопоставление типов данных

При чтении и записи данных в Iceberg-таблицы Trino автоматически преобразует определенные типы данных, чтобы соответствовать спецификации Iceberg и форматам Avro/ORC/Parquet. Правила преобразования могут отличаться в зависимости от направления конверсии.

Информация о преобразовании типов данных Iceberg в форматы Parquet/ORC/Avro доступна в спецификации Iceberg:

Преобразование типов Iceberg в Trino
Тип данных Iceberg Тип данных Trino

BOOLEAN

BOOLEAN

INT

INTEGER

LONG

BIGINT

FLOAT

REAL

DOUBLE

DOUBLE

DECIMAL(p,s)

DECIMAL(p,s)

DATE

DATE

TIME

TIME(6)

TIMESTAMP

TIMESTAMP(6)

TIMESTAMPTZ

TIMESTAMP(6) WITH TIME ZONE

STRING

VARCHAR

UUID

UUID

BINARY

VARBINARY

FIXED (L)

VARBINARY

STRUCT(…​)

ROW(…​)

LIST(e)

ARRAY(e)

MAP(k,v)

MAP(k,v)

Преобразование типов Trino в Iceberg
Тип данных Trino Тип данных Iceberg

BOOLEAN

BOOLEAN

INTEGER

INT

BIGINT

LONG

REAL

FLOAT

DOUBLE

DOUBLE

DECIMAL(p,s)

DECIMAL(p,s)

DATE

DATE

TIME(6)

TIME

TIMESTAMP(6)

TIMESTAMP

TIMESTAMP(6) WITH TIME ZONE

TIMESTAMPTZ

VARCHAR

STRING

UUID

UUID

VARBINARY

BINARY

ROW(…​)

STRUCT(…​)

ARRAY(e)

LIST(e)

MAP(k,v)

MAP(k,v)

Свойства конфигурации каталога Iceberg

Iceberg-каталог сервиса Trino поддерживает множество конфигурационных свойств для тонкой настройки взаимодействия с таблицами Iceberg. Актуальный список параметров доступен в документации Trino. Используя ADCM, можно установить новые или переопределить дефолтные параметры. Для этого используйте раздел настроек Custom Iceberg configuration в ADCM (Clusters → <clusterName> → Services → Trino → Configuration).

Поддержка SQL

ВАЖНО

Чтобы Trino мог записывать данные в Iceberg-таблицы, при подключении к Trino (например, через Trino CLI или DBeaver) необходимо указывать имя пользователя, соответствующее Unix-пользователю на хосте ADH, у которого имеются достаточные права для записи в HDFS-директории хранилища Hive. В противном случае вы можете наблюдать следующую ошибку:

Failed to create external path hdfs://adh/apps/hive/warehouse/trino_demo_schema1.db for database trino_demo_schema1. This may result in access not being allowed if the StorageBasedAuthorizationProvider is enabled: null

Управление схемой

Схемы в Trino используются для группировки нескольких таблиц/представлений и эквивалентны базам данных в Hive. Ниже показаны базовые команды для работы со схемами Trino:

CREATE SCHEMA "iceberg-adh"."trino_demo_schema_iceberg"; (1)
CREATE SCHEMA "iceberg-adh"."trino_demo_schema_iceberg_with_loc"
    WITH (location='/user/hive/warehouse/some_custom_path'); (2)
SHOW SCHEMAS;
USE "iceberg-adh"."trino_demo_schema_iceberg"; (3)
DROP SCHEMA "trino_demo_schema_iceberg"; (4)
1 Создание новой схемы Trino (базы данных Hive). iceberg-adh — имя встроенного Iceberg-каталога Trino. Обратите внимание на двойные кавычки, используемые для обрамления идентификаторов.
2 Создание схемы (базы данных Hive) c указанием директории хранения в HDFS.
3 Выбор схемы для сессии. Все последующие SQL-команды Trino будет выполнять на указанной базе данных Hive в рамках текущей сессии.
4 Удаление непустой схемы запрещено. Чтобы удалить схему, необходимо сначала удалить все вложенные таблицы.

Для выполнения запросов к произвольным таблицам, которые принадлежат разным схемам, можно указать каталог, схему и имя таблицы в SQL-запросе, например:

SELECT * FROM "iceberg-adh"."trino_demo_schema_iceberg"."transactions"
РЕКОМЕНДАЦИЯ
Используя Trino UI, можно просматривать и анализировать SQL-запросы, отправленные в Trino.

Примеры DDL

Trino поддерживает большинство DDL-команд (CREATE, DROP, ALTER и т.д.) для управления таблицами и материализованными представлениями Iceberg. Trino также позволяет устанавливать свойства таблиц Iceberg, которые задают метаданные для таблиц. Эти свойства можно назначить таблице Iceberg, используя предложение WITH, как показано далее в примерах. Ниже представлены примеры DDL-команд с использованием каталога Iceberg.

CREATE TABLE "iceberg-adh"."trino_demo_schema_iceberg"."transactions" ( (1)
    txn_id BIGINT NOT NULL,
    txn_value DOUBLE,
    acc_id BIGINT,
    txn_date DATE,
    comment VARCHAR
);

CREATE TABLE "iceberg-adh"."trino_demo_schema_iceberg"."transactions_pttnd" ( (2)
    txn_id BIGINT,
    txn_value DOUBLE,
    acc_id BIGINT,
    txn_date DATE,
    comment VARCHAR
) WITH (
    format = 'PARQUET',
    partitioning = ARRAY['acc_id']
);

CREATE TABLE "iceberg-adh"."trino_demo_schema_iceberg"."transactions_pttnd_ts" ( (3)
    txn_id BIGINT,
    txn_value DOUBLE,
    acc_id BIGINT,
    txn_date DATE,
    comment VARCHAR
) WITH (
    partitioning = ARRAY['month(txn_date)', 'bucket(acc_id, 5)']
);

CREATE TABLE "iceberg-adh"."trino_demo_schema_iceberg"."transactions_sorted" ( (4)
    txn_id BIGINT,
    txn_value DOUBLE,
    acc_id BIGINT,
    txn_date DATE,
    comment VARCHAR
) WITH (
    sorted_by = ARRAY['txn_value']
);

CREATE TABLE "iceberg-adh"."trino_demo_schema_iceberg"."transactions_orc_as" (5)
WITH (
    format = 'ORC',
    orc_bloom_filter_columns = ARRAY['acc_id','txn_date'],
    orc_bloom_filter_fpp = 0.1
) AS
    SELECT * FROM "iceberg-adh"."trino_demo_schema_iceberg"."transactions"
    WHERE txn_id < 10;

ALTER TABLE "iceberg-adh"."trino_demo_schema_iceberg"."transactions_pttnd" (6)
SET PROPERTIES partitioning = ARRAY['acc_id', 'txn_date'];

ALTER TABLE "iceberg-adh"."trino_demo_schema_iceberg"."transactions" (7)
EXECUTE expire_snapshots(retention_threshold => '1d');


CREATE MATERIALIZED VIEW "iceberg-adh"."trino_demo_schema_iceberg"."transactions_mv"  (8)
WITH (
    partitioning = ARRAY['txn_date']
) AS
1 Создание Iceberg-таблицы (table_type=ICEBERG) в хранилище Hive. Обратите внимание, что Trino принимает запросы в формате ANSI SQL с соответствующими типами данных, в то время как спецификация Iceberg может использовать иные типы данных. Например, при выполнении данного запроса тип VARCHAR будет приведен к STRING.
2 Создание партиционированной Iceberg-таблицы в формате Parquet. Обратите внимание на синтаксис ARRAY['col1', 'col2'] для указания партиций.
3 Создание таблицы, которая будет разбита на партиции по месяцам значения txn_date, а также по хешу значения acc_id (5 партиций).
4 Создание таблицы, данные которой сохраняются в файлы Iceberg отсортироваными по столбцу txn_value. Сортировка данных таблицы может быть выгодна с точки зрения производительности при последующих операциях чтения.
5 Использование синтаксиса CTAS (CREATE TABLE AS) при создании Iceberg-таблицы в формате ORC. Также устанавливаются ORC-параметры для bloom-фильтров.
6 Добавление партиций в таблицу с помощью команды ALTER TABLE SET. Больше информации о свойствах таблиц Iceberg, которые можно указать с помощью ALTER TABLE SET, доступно в документации Trino.
7 Удаление всех снепшотов, метаданных и файлов данных таблицы Iceberg, возраст которых превышает указанное значение (в данном примере — 7 дней). Периодическое выполнение этой команды позволяет очистить ненужные файлы исторических данных и поддерживать компактность метаданных таблицы. Информацию о других функциях Iceberg (remove_orphan_files, drop_extended_stats и так далее), которые можно вызвать с помощью ALTER TABLE EXECUTE, можно найти в разделе документации Trino.
8 Создание материализованного представления на основе выборки SELECT.

Больше информации о DDL-командах, поддерживаемых каталогом Iceberg в Trino, доступно в документации Trino.

Примеры DML

Trino поддерживает большинство DML-команд для Iceberg-таблиц, таких как INSERT, UPDATE, DELETE, MERGE и так далее. Ниже представлены примеры DML-операций c использованием каталога Iceberg.

SELECT * FROM "iceberg-adh"."trino_demo_schema_iceberg"."transactions_pttnd$partitions"; (1)

SELECT * FROM "iceberg-adh"."trino_demo_schema_iceberg"."transactions_pttnd$snapshots"; (2)

SELECT * FROM TABLE( (3)
    system.table_changes(
      schema_name => "trino_demo_schema_iceberg",
      table_name => "transactions",
      start_snapshot_id => 3196536194725230246,
      end_snapshot_id => 248634242462154958
    )
  );

SELECT * FROM "iceberg-adh"."trino_demo_schema_iceberg"."transactions_pttnd"
FOR VERSION AS OF 2602443793554441031; (4)

SELECT * FROM "iceberg-adh"."trino_demo_schema_iceberg"."transactions_pttnd" FOR TIMESTAMP AS OF TIMESTAMP '2025-01-17 01:41:38.000 +0300' (5)

SELECT * FROM "iceberg-adh"."trino_demo_schema_iceberg"."transactions" txns_icb
JOIN "hive-adh"."trino_demo_schema_hive"."transactions" txns_hive
ON txns_icb.txn_id = txns_hive.txn_id; (6)

DELETE FROM "iceberg-adh"."trino_demo_schema_iceberg"."transactions_pttnd"
WHERE acc_id = 1001; (7)
1 Получение подробной информации о партициях Iceberg-таблицы из таблицы метаданных $partitions. Аналогичным образом можно использовать и другие таблицы метаданных, например $manifests, $files, $history и так далее. Больше информации о работе с таблицами метаданных можно найти в документации Trino.
2 Получение подробной информации о снепшотах, доступных для таблицы Iceberg.
3 Получение информации о row-level изменениях в двух версиях Iceberg-таблицы.
4 Time-travel выборка из таблицы Iceberg с указанием ID снепшота. Состояние таблицы, из которого следует считывать данные, определяется конкретным снепшотом. Такой запрос игнорирует все изменения, внесенные в таблицу после указанного снепшота.
5 Time-travel выборка с указанием временной метки. Состояние таблицы, из которого следует считывать данные, определяется снепшотом, ближайшим по времени создания к заданной временной метке. Такой запрос игнорирует все изменения, внесенные в таблицу после указанного времени.
6 Получение данных из двух каталогов Trino: Iceberg-каталога iceberg-adh и Hive-каталога hive-adh. Получив результаты выборки из каждого каталога, Trino применяет операцию JOIN и возвращает клиенту конечный набор результатов. Чтобы данный запрос работал корректно, оба каталога должны быть включены в сервисе Trino.
7 Удаление всей партиции, учитывая, что в предложении WHERE задан фильтр, полностью соответствующий партиции.
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней