Пример 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.