Каталог 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 |
---|---|
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 |
---|---|
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 задан фильтр, полностью соответствующий партиции. |