Безграничная расширяемость: как экосистема плагинов помогает Trino работать в любом аналитическом ландшафте
«Trino — это PostgreSQL для аналитики» — нескромно охарактеризовали Trino в одном из блогов. Я не люблю кликбейтные заголовки, но эта фраза действительно емко описывает одну из самых сильных сторон Trino — расширяемость.
В этом блоге я расскажу, как устроены плагины Trino — строительные блоки, которые позволяют гибко адаптировать возможности продукта под потребности современных аналитических платформ.
Зачем нужна расширяемость?
Современные аналитические платформы состоят из большого количества продуктов: источники данных, движки, системы безопасности, data governance, и т.д. Кроме этого, пользовательские нагрузки могут использовать нестандартные функции и типы данных, отсутствующие в движках.
Расширяемость — это стратегически важное требование к SQL-движку, которое дает уверенность, что продукт сможет успешно справляться с постоянно изменяющимися потребностями пользователей и команды платформы данных.
Среди всех аналитических движков SQL-движков Trino обладает наиболее обширными возможностями кастомизации, которые по своему масштабу сравнимы разве что с Apache Spark.
Архитектура
Trino состоит из нескольких слоев:
Ядро — отвечает за выполнение запросов
Плагин — реализация одного или нескольких расширений Trino
SPI — набор интерфейсов, которые обеспечивают взаимодействие ядра и плагинов
При запуске Trino определяет список доступных плагинов и запускает каждый из них в независимой песочнице. Это позволяет каждому плагину работать со своими версиями библиотек без возникновения конфликтов между зависимостями.
Плагины реализованы на языке Java, что обеспечивает высокую безопасность и отсутствие риска падения процесса при наличии багов в плагине.
Возможности и сравнение с другими движками
Во многих SQL-движках плагины реализованы по остаточному принципу: сделаем фичу, а потом, быть может, подумаем о расширяемости.
Философия Trino принципиально иная: расширяемость является ключевым функционалом, а сообщество уделяет большое внимание созданию новых точек расширения и их постоянному улучшению.
На данный момент SPI Trino представлен более 500 классами и интерфейсами, которые вы можете использовать для создания новых плагинов.
Каждый плагин Trino предоставляет ядру список своих возможностей через интерфейс Plugin. Например, один плагин может предоставлять доступ к новому типу источника данных, а другой — реализовывать новую стратегию аутентификации. Вы можете создавать:
Интеграции с новыми источниками данных
Собственные типы данных, в том числе составные
Собственные функции и процедуры SQL, в том числе табличные и полиморфные
Новые механизмы аутентификации и авторизации
Новые способы аудита и расчета lineage запросов
Экзотика: собственный shuffle, собственный механизм параллельной выгрузки результатов запросов, и многое другое
Другие SQL-движки обычно предоставляют только малую долю от упомянутых выше возможностей. Например:
Dremio позволяет добавлять новые источники данных, через крайне ограниченный интерфейс ARP.
Возможности legacy-движков экосистемы Hadoop ограничиваются преимущественно UDF (например, Hive, Impala)
Greenplum PXF предоставляет интерфейс подключения к другим источникам данных, но обладает низкой производительностью и фактически не развивается
Рассмотрим популярные типы плагинов Trino.
Коннекторы
Коннектор — это плагин, который реализует доступ к источникам данных. Trino содержит несколько десятков встроенных коннекторов для популярных источников данных. Для российского рынка наиболее актуальными являются коннекторы к PostgreSQL (в т.ч. Greenplum), ClickHouse, Kafka.
Коннектор — это самый сложный и продвинутый тип плагинов. Trino предоставляет разработчикам практически неограниченную гибкость в выборе стратегии работы с источниками данных, см. интерфейс ConnectorMetadata. Например, вы можете:
Управлять уровнем параллелизма чтений и записей и полностью контролировать процесс обработки данных
Реализовывать DDL операции и работу с виртуальными и материализованными представлениями
Выставлять пользователю кастомные процедуры (например, maintenance-процедуры для Apache Iceberg)
Принимать решения об оптимизации тех или иных частей запроса (например, делать ли pushdown вычислений в источник)
Интегрировать в коннектор собственную логику авторизации доступа
В России достаточно большое количество компаний успешно используют собственные коннекторы для оптимизации работы с теми или иными источниками данных. Несколько примеров промышленных коннекторов:
В CedrusData мы реализовали коннектор для Greenplum, который позволяет параллельно читать и писать данные через встроенный сервер GPFDIST
Коллеги из 1C реализовали коннектор к Bitrix!
Важной частью разработки коннекторов является тестирование. Trino предлагает обширный набор классов для упрощения написания тестов. Интеграционное тестирование коннекторов обычно происходит через Docker-образы и библиотеку Testcontainers. Все вместе это позволяет разработчикам удобно тестировать функционал коннектора напрямую из IDE.
Пользовательские функции
Для расширения возможностей SQL Trino позволяет вам определить собственные скалярные, агрегатные или табличные функции.
UDF: для скалярных функций вы получаете на вход набор значений, и выдаете обратно результат
UDAF: для агрегатных функций вы должны реализовать несколько методов, которые аккумулируют значения, а потом выдают финальный результат (reduce)
UDTF: для табличных функций вы получаете набор колонок, и возвращаете другие колонки. Табличные функции поддерживают полиморфизм (тип результата может быть определен в runtime)
Например, коннектор к Iceberg предоставляет агрегатную функцию для расчета NDV (number of distinct values), который Trino потом может использовать для более точной оценки кардинальностей при выборе оптимального порядка Join.
Если ваша UDF требует работы с нестандартными данными, то вы можете определить собственные типы данных. Например, свой тип для работы с geo-данными. При создании типа данных вы можете определить стратегию сериализации и десериализации его значений, а также способ «укладки» типа в колонки. Вы также можете создавать generic-типы.
Про успешный перенос UDF из Vertica в Trino рассказывали коллеги из Avito.
Безопасность
Все действия пользователя в Trino проходят обязательную аутентификацию и авторизацию. Вы можете встроить в Trino свою логику аутентификации и авторизации.
Вы можете написать плагин, который аутентифицирует пользователя по имени пользователя и паролю, HTTP-заголовку, и даже TLS-сертифкату (экзотика, но все же).
Для авторизации вы можете написать свой плагин, который сопоставляет пользователя с группами безопасности, и плагин, который авторизует отдельные действия пользователя или группы.
Менее известный факт — в Trino можно реализовать собственную модель авторизации на основе RBAC, и даже ABAC. Но это предполагает использование некоторых приватных интерфейсов (sic!).
Примеры:
Относительно недавно сообщество Trino добавило плагин для авторизации через Open Policy Agent, а буквально на днях — плагин для Apache Ranger
В CedrusData у нас есть плагин для получения списка групп пользователя из LDAP, а вскоре появится аутентификации и авторизация через CedrusData Catalog, который мы разработали как замену Hive Metastore для Apache Iceberg
Data Governance
В Trino вы также можете создавать так называемые event listener-ы, которые предоставляют механизм получения нотификаций о различных этапах выполнения запросов. Этот функционал может быть использован для различных целей. Наиболее полезные:
Аудит — можно «научить» плагин отправлять события аудита в произвольное место (файл, syslog, Kafka, сторонний сервис, и т.п.)
Lineage — в поставку Trino входит плагин, который передает lineage запросов в сторонний сервис в формате Open Lineage
Заключение
Аналитические платформы российских предприятий состоят из большого количества компонентов (зачастую кастомных), а потребности пользователей постоянно изменяются. Широкие возможности кастомизации Trino позволяют вам использовать его практически в любом окружении, максимально адаптируя движок под задачи вашей компании.
Добавив к этому высокую производительность (см. наши статьи раз, два, три) и широкую поддержку Apache Iceberg и Parquet/ORC, мы получаем отличный универсальный SQL-движок для современных аналитических платформ.
Если вы интересуетесь или используете Trino, будем рады видеть нас в нашем Trino-сообществе.
А если вы уже эксплуатируете Trino или Apache Iceberg, ознакомьтесь с нашими промышленными продуктами:
CedrusData — продвинутая версия Trino с критическими улучшениями производительности и безопасности и технической поддержкой
CedrusData Catalog — высокопроизводительный технический каталог с поддержкой протокола Apache Iceberg REST для замены Hive Metastore