Протокол Arrow Flight SQL#

Пользователи могут подключаться к кластеру CedrusData по протоколу Arrow Flight SQL. Данный способ подключения присутствует только в CedrusData, и не поддерживается Trino.

Предупреждение

Функционал является экспериментальным. Используйте только для тестирования и разработки. В настоящей версии не происходит очистка сессии пользователя после ее закрытия на клиентской стороне. Недостатки будут устранены в следующей версии продукта.

О протоколе#

Arrow Flight SQL — это бинарный протокол запуска SQL-запросов и обмена данными в колоночном формате между приложениями.

Сервер анонсирует свои метаданные (схема данных, поддерживаемые операции и т.п.). Клиент может прочитать метаданные и запустить SQL запрос. После запуска запроса сервер начинает возвращать данные в колоночном формате Apache Arrow.

Вы можете использовать любые Arrow Flight SQL клиенты для подключения к CedrusData. Например:

Подключение#

Сервер Arrow Flight SQL работает на координаторе на отдельном порту. Для включения Arrow Flight SQL сервера добавьте следующий параметр конфигурации в файл etc/config.properties. Сервер будет запущен по умолчанию на интерфейсе 0.0.0.0 и порту 8090.

cedrusdata.arrow-flight-sql.enabled=true

Apache Arrow использует специальные методы Java, которые недоступны по умолчанию. Добавьте следующую строку в etc/jvm.config, что бы разрешить использование требуемых классов:

--add-opens=java.base/java.nio=ALL-UNNAMED

Перезапустите координатор после внесения описанных выше изменений.

Параметры конфигурации#

Название

Описание

Значение по умолчанию

cedrusdata.arrow-flight-sql.enabled

Значение true включает Arrow Flight SQL сервер

false

cedrusdata.arrow-flight-sql.host

Сетевой интерфейс, на котором будет запущен Arrow Flight SQL сервер

0.0.0.0

cedrusdata.arrow-flight-sql.port

Порт Arrow Flight SQL сервера

8090

cedrusdata.arrow-flight-sql.tls.enabled

Значение true включает TLS

false

cedrusdata.arrow-flight-sql.tls.keystore-path

Локальный путь к keystore. Используется только при включенном TLS

cedrusdata.arrow-flight-sql.tls.keystore-password

Пароль keystore. Используется только при включенном TLS

cedrusdata.arrow-flight-sql.tls.truststore-path

Локальный путь к truststore. Используется только при включенном TLS

cedrusdata.arrow-flight-sql.tls.truststore-password

Пароль truststore. Используется только при включенном TLS

cedrusdata.arrow-flight-sql.response-max-size

Максимальный размер сетевого пакета, содержащего часть результата запроса. Если размер результата запроса больше заданной величины, сервер отправит несколько пакетов

1MB (один мегабайт)

cedrusdata.arrow-flight-sql.session-max-count

Максимальное количество пользовательских сессий

0 (без ограничений)

cedrusdata.arrow-flight-sql.netty.automatic-flow-control-enabled"

Значение true включает автоматический flow-control внутреннего сервера Netty

false

cedrusdata.arrow-flight-sql.netty.connection-idle-timeout

Idle timeout внутреннего сервера Netty

Максимальное значение (timeout отключен)

cedrusdata.arrow-flight-sql.netty.connection-keep-alive-ping-period

Keep alive ping period внутреннего сервера Netty

2h (два часа)

cedrusdata.arrow-flight-sql.netty.connection-keep-alive-ping-timeout

Keep alive ping timeout внутреннего сервера Netty

10s (десять секунд)

cedrusdata.arrow-flight-sql.netty.connection-max-age

Максимальный срок жизни соединения внутреннего сервера Netty

Максимальное значение (timeout отключен)

cedrusdata.arrow-flight-sql.netty.connection-max-termination-grace-period

Connection max termination grace period внутреннего сервера Netty

Максимальное значение (timeout отключен)

cedrusdata.arrow-flight-sql.netty.client-max-keep-alive-period

Client max keep alive period внутреннего сервера Netty

5m (пять минут)

cedrusdata.arrow-flight-sql.netty.inbound-message-max-size

Максимальный размер входящего сообщения, которое может принять внутренний сервер Netty

Максимальное значение (может принять сообщение любого размера отключен)

cedrusdata.arrow-flight-sql.netty.inbound-metadata-max-size

Максимальный размер входящих метаданных, которые может принять внутренний сервер Netty

8KB (восемь килобайт)

Пример использования#

Код ниже подключается к CedrusData из Java приложения, получает список таблиц в схеме tpch.tiny, и запускает SQL-запрос. Для успешного выполнения данного кода, убедитесь, что у вас сконфигурирован каталог коннектора TPCH, добавьте в classpath приложения зависимость Arrow Flight SQL и добавьте параметр JVM --add-opens=java.base/java.nio=ALL-UNNAMED.

public class CedrusDataArrowFlightSqlExample
{
    public static void main(String[] args)
            throws Exception
    {
        Location location = Location.forGrpcInsecure("0.0.0.0", 8090);
        try (BufferAllocator allocator = new RootAllocator();
                FlightClient client = FlightClient.builder().allocator(allocator).location(location).build();
                FlightSqlClient sqlClient = new FlightSqlClient(client)) {
            // Authenticate
            CallOption authOptions = client.authenticateBasicToken("user", "").orElseThrow();

            // List tables in tpch.tiny schema
            List<String> tables = new ArrayList<>();
            FlightInfo tablesInfo = sqlClient.getTables("tpch", "tiny", null, null, false, authOptions);
            Ticket tablesTicket = tablesInfo.getEndpoints().get(0).getTicket();
            try (FlightStream tablesStream = sqlClient.getStream(tablesTicket, authOptions)) {
                while (tablesStream.next()) {
                    VarCharVector catalogVector = (VarCharVector) tablesStream.getRoot().getVector("table_name");
                    for (int i = 0; i < tablesStream.getRoot().getRowCount(); i++) {
                        tables.add(catalogVector.getObject(i).toString());
                    }
                }
            }
            System.out.println("Tables in tpch.tiny: " + tables);

            // Run a query that counts the number of rows in tpch.tiny.nation table
            FlightSqlClient.PreparedStatement prepared = null;
            try {
                prepared = sqlClient.prepare("SELECT count(*) FROM tpch.tiny.nation", authOptions);
                FlightInfo queryInfo = prepared.execute(authOptions);
                Ticket queryTicket = queryInfo.getEndpoints().get(0).getTicket();
                try (FlightStream queryStream = sqlClient.getStream(queryTicket, authOptions)) {
                    queryStream.next();
                    BigIntVector intVector = (BigIntVector) queryStream.getRoot().getVector(0);
                    System.out.println("Rows in tpch.tiny.nation: " + intVector.get(0));
                }
            }
            finally {
                if (prepared != null) {
                    prepared.close(authOptions);
                }
            }
        }
    }
}

См. также#

JDBC драйвер, Trino CLI