Пример HTTP-коннектора#
Пример HTTP-коннектора имеет простую цель: он читает данные, разделенные запятыми, по HTTP. Например, если у вас есть большой объем данных в формате CSV, вы можете указать этому коннектору эти данные и написать запрос для их обработки.
Установка#
Плагин примерного HTTP-коннектора является опциональным и поэтому не включен в стандартный tarball и стандартный Docker image.
Следуйте инструкциям по установке плагина и при желании используйте проект trino-packages или загрузите архив плагина вручную trino-example-http-latest.zip.
Код#
Пример HTTP-коннектора находится в каталоге trino-example-http в дереве исходного кода Trino.
Реализация плагина#
Реализация плагина в примерном HTTP-коннекторе выглядит очень похоже на другие реализации плагинов. Большая часть реализации посвящена обработке опциональной конфигурации, а единственная интересная функция — следующая:
@Override
public Iterable<ConnectorFactory> getConnectorFactories()
{
return ImmutableList.of(new ExampleConnectorFactory());
}
Обратите внимание, что класс ImmutableList — это utility-класс из Guava.
Как и все коннекторы, этот плагин переопределяет метод getConnectorFactories()
и возвращает ExampleConnectorFactory.
Реализация ConnectorFactory#
В Trino основным объектом, который обрабатывает соединение между
Trino и определенным типом источника данных, является объект Connector,
который создается с использованием ConnectorFactory.
Эта реализация доступна в классе ExampleConnectorFactory.
Первое, что делает реализация фабрики коннектора, — задает
имя этого коннектора. Это та же строка, которая используется для ссылки
на этот коннектор в конфигурации Trino.
@Override
public String getName()
{
return "example_http";
}
Реальная работа в фабрике коннектора происходит в методе create().
В классе ExampleConnectorFactory метод create()
настраивает коннектор, а затем просит Guice создать объект.
Вот основная часть метода create() без валидации параметров
и обработки исключений:
// A plugin is not required to use Guice; it is just very convenient
Bootstrap app = new Bootstrap(
new JsonModule(),
new ExampleModule(catalogName));
Injector injector = app
.doNotInitializeLogging()
.setRequiredConfigurationProperties(requiredConfig)
.initialize();
return injector.getInstance(ExampleConnector.class);
Коннектор: ExampleConnector#
Этот класс позволяет Trino получать ссылки на различные сервисы, предоставляемые коннектором.
Метаданные: ExampleMetadata#
Этот класс отвечает за предоставление имен таблиц, метаданных таблиц,
имен столбцов, метаданных столбцов и другой информации о схемах,
которые предоставляются этим коннектором. ConnectorMetadata также
вызывается Trino, чтобы убедиться, что конкретный коннектор может
понимать и обрабатывать заданное имя таблицы.
Реализация ExampleMetadata делегирует многие из этих вызовов
ExampleClient — классу, который реализует значительную часть
базовой функциональности коннектора.
Менеджер сплитов: ExampleSplitManager#
Менеджер сплитов разделяет данные таблицы на отдельные части, которые Trino распределяет по worker-узлам для обработки. В случае примерного HTTP-коннектора каждая таблица содержит один или несколько URI, указывающих на фактические данные. На каждый URI создается один split.
Провайдер record set: ExampleRecordSetProvider#
Провайдер record set создает record set, который в свою очередь создает
record cursor, возвращающий фактические данные в Trino.
ExampleRecordCursor читает данные из URI по HTTP. Каждая строка
соответствует одной строке таблицы. Строки разделяются по запятой на отдельные
значения полей, которые затем возвращаются в Trino.