Каталог Hive в Trino

Сервис Trino поставляется с преднастроенным каталогом для работы с Hive. Данный каталог использует коннектор Hive и "из коробки" готов к работе с сервисом Hive, развернутым в ADH-кластере.

Архитектура Trino-коннектора для Hive отличается от СУБД-ориентированных и других типов коннекторов. Основное отличие состоит в том, что Trino не задействует движок Hive для операций чтения/записи. То есть при выполнении запросов с помощью коннектора Hive Trino не вызывает никаких функций движка Hive. Вместо этого Trino напрямую обращается к Hive Metastore и задействует HDFS-клиент для выполнения операций над "сырыми" файлами Hive в HDFS. Из этого вытекает необходимость наличия компонента HDFS Сlient на каждом хосте, где установлен компонент Trino Worker.

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

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

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

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

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

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

SHOW CATALOGS;

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

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

Поддерживаемые форматы Hive

Hive-каталог сервиса Trino поддерживает следующие форматы таблиц Hive:

  • ORC

  • Parquet

  • Avro

Также поддерживаются следующие SerDe-форматы:

  • TextFile

  • CSV с использованием org.apache.hadoop.hive.serde2.OpenCSVSerde

  • JSON с использованием org.apache.hive.hcatalog.data.JsonSerDe

  • RCFile с использованием ColumnarSerDe

  • RCFile с использованием LazyBinaryColumnarSerDe

  • SequenceFile

Параметры конфигурации Hive-каталога

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

Поддержка SQL

ВАЖНО

Чтобы Trino мог записывать данные в таблицы Hive, при подключении к 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. Ниже показаны базовые команды для работы со схемами:

CREATE SCHEMA "hive-adh"."trino_demo_schema_hive"; (1)
USE "hive-adh"."trino_demo_schema_hive"; (2)
SHOW SCHEMAS;
DROP "hive-adh"."trino_demo_schema_hive"; (3)
1 Создание новой схемы Trino (базы данных Hive). hive-adh — имя встроенного каталога Hive. Обратите внимание на двойные кавычки, используемые для обрамления идентификаторов.
2 Выбор схемы для сессии. Все последующие SQL-команды Trino будет выполнять в указанной базе данных Hive в рамках текущей сессии.
3 Удаление схемы, в которой имеются таблицы, запрещено. Чтобы удалить схему, необходимо сначала удалить все вложенные таблицы.

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

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

Примеры DDL

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

CREATE TABLE "hive-adh"."trino_demo_schema_hive"."transactions" (id BIGINT, value VARCHAR); (1)

CREATE TABLE "hive-adh"."trino_demo_schema_hive"."transactions_with" (id BIGINT, value VARCHAR) (2)
WITH (
    format = 'ORC',
    transactional=true
);

CREATE TABLE "hive-adh"."trino_demo_schema_hive"."transactions_pttnd" ( (3)
    txn_id BIGINT,
    txn_amount DOUBLE,
    acc_id BIGINT
 ) WITH (
    partitioned_by=ARRAY['acc_id']
);

CREATE TABLE "hive-adh"."trino_demo_schema_hive"."transactions_bckttd" ( (4)
    txn_id BIGINT,
    txn_amount DOUBLE,
    acc_id BIGINT
 ) WITH (
    bucketed_by=ARRAY['acc_id'],
    bucket_count=20
);

CREATE TABLE "hive-adh"."trino_demo_schema_hive"."transactions_ext" (
  	id BIGINT,
  	payload VARCHAR,
	request_time TIMESTAMP
) WITH (
  format = 'TEXTFILE',
  external_location = 'hdfs://adh/apps/hive/ext/test_ext_table' (5)
);

SET SESSION "hive-adh".non_transactional_optimize_enabled=true; (6)
ALTER TABLE "hive-adh"."trino_demo_schema_hive"."transactions_pttnd"
EXECUTE optimize (file_size_threshold => '128MB'); (7)

ANALYZE "hive-adh"."trino_demo_schema_hive"."transactions_pttnd"; (8)

CALL system.create_empty_partition( (9)
    schema_name => "hive-adh",
    table_name => "trino_demo_schema_hive",
    partition_columns => ARRAY['acc_id'],
    partition_values => ARRAY['1005']
);
1 Создание базовой таблицы Hive. Обратите внимание, что Trino использует ANSI SQL, в то время как Hive использует HiveQL, который имеет некоторые отличия, включая разницу в типах данных. Например, при выполнении этого запроса тип данных VARCHAR будет приведен к типу данных Hive STRING.
2 Создание транзакционной таблицы в формате ORC. Для создания транзакционных таблиц через Trino необходимо использовать формат ORC. Если формат таблицы не указан явно, Trino создаст нетранзакционную таблицу, используя формат, указанный в конфигурационном свойстве каталога hive.storage-format.
3 Создание партиционированной таблицы Hive. Обратите внимание на синтаксис ARRAY['col1', 'col2'] для указания партиций.
4 Создание таблицы с определенным количеством бакетов.
5 Создание external-таблицы с указанием кастомной директории в HDFS.
6 Установка свойства сессии (session property). В данном примере установка non_transactional_optimize_enabled=true необходима для выполнения команды OPTIMIZE.
7 Запуск команды OPTIMIZE, которая переписывает содержимое таблицы, объединяя множество мелких файлов в файлы большего размера.
8 Сбор статистики таблицы. Trino не поддерживает сбор статистики для транзакционных таблиц Hive.
9 Вызов системной процедуры для создания пустой партиции. Эта команда создает пустую директорию в хранилище HDFS, например, /apps/hive/warehouse/trino_demo_schema.db/transactions_pttnd/acc=1005. Больше подробной информации о процедурах, поддерживаемых каталогом Hive, можно найти в документации Trino.

Примеры DML

Trino поддерживает большинство DML-операций Hive, например INSERT, UPDATE, DELETE, MERGE и так далее. Фактическое поведение этих команд зависит от формата таблиц и используемого хранилища метаданных (Metastore). Ниже приведены некоторые ограничения и особенности выполнения CRUD-операций над таблицами Hive с помощью Trino:

  • Операции UPDATE поддерживаются только для транзакционных таблиц. Необходимо, чтобы целевая таблица была транзакционной, ACID и имела формат ORC.

  • Команда DELETE, применяемая к нетранзакционным таблицам, поддерживается только в случае, если таблица разбита на партиции, а фильтр предложения WHERE строго соответствует партиции. Для транзакционных таблиц Hive в формате ORC поддерживается построчное удаление, а предложение WHERE может быть произвольным.

  • Операция MERGE поддерживается только для ACID-таблиц.

  • Создание ACID-таблиц с помощью Hive Streaming Ingest не поддерживается.

  • Сбор статистики с помощью ANALYZE не поддерживается для транзакционных таблиц Hive.

  • Операция TRUNCATE не поддерживается каталогом Hive.

Больше подробной информации о лучших практиках и ограничениях работы с каталогом Hive доступно в документации Trino. Ниже представлены примеры DML-операций c использованием Trino-каталога Hive.

INSERT INTO "hive-adh"."trino_demo_schema_hive"."transactions_pttnd"
    VALUES (1, 15, 1001),
    (2, 100, 1002),
    (3, 75, 1001);

SELECT * FROM "hive-adh"."trino_demo_schema_hive"."transactions_pttnd"; (1)

SELECT * FROM "hive-adh"."trino_demo_schema_hive"."transactions_pttnd$properties"; (2)

SELECT * FROM "hive-adh"."trino_demo_schema_hive"."transactions_pttnd$partitions"; (3)

SELECT *, "$path", "$file_size", "$partition" FROM "hive-adh"."trino_demo_schema_hive"."transactions_pttnd"; (4)

SELECT *, "$path", "$file_size" FROM "hive-adh"."trino_demo_schema_hive"."transactions_pttnd"
WHERE "$partition" = 'acc_id=1001'; (5)

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

DELETE FROM "hive-adh"."trino_demo_schema_hive"."transactions_pttnd" (7)
WHERE txn_id = 2;
1 ANSI SELECT для выборки из базы данных Hive.
2 Получение метаданных из скрытой таблицы $properties.
3 Получение списка всех доступных партиций в партиционированной таблице.
4 Получение метаданных из таблицы метаданных для столбцов.
5 Получение информации о файлах таблицы и размере файлов для всех записей, принадлежащих определенной партиции (acc_id=1001).
6 Получение данных из двух каталогов Trino: Hive-каталога hive-adh и Iceberg-каталога iceberg-adh. Получив результаты выборки из каждого каталога, Trino применяет операцию JOIN и возвращает клиенту конечный набор результатов. Чтобы данный запрос работал корректно, оба каталога должны быть включены в сервисе Trino.
7 Удаление строки. Целевая таблица должна быть транзакционной, иначе Trino выдаст ошибку.

Больше информации о DML-командах, поддерживаемых Trino коннектором для Hive, можно найти в документации Trino.

Оптимизация производительности

Trino по умолчанию использует некоторые методы оптимизаций для ускорения работы с таблицами Hive. К ним относятся:

  • Сбор статистики таблицы. Коннектор Hive использует статистику таблиц (для транзакционных таблиц) для повышения производительности обработки запросов.

  • Динамическая фильтрация. Обеспечивает прирост скорости выполнения запросов с выборочными операциями JOIN. Позволяет избежать чтения "ненужных" данных, которые отфильтровываются условием JOIN.

  • Кеширование файловой системы. Кеширует фрагменты данных, которые часто считываются из HDFS и к которым обращаются Trino Workers при выполнении cхожих запросов.

  • Перенаправление таблиц. Метод, позволяющий перенаправлять CRUD-операции в другой каталог.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней