ODBC и протокол Arrow Flight SQL#
Пользователи могут подключаться к кластеру CedrusData по протоколу Arrow Flight SQL. Данный способ подключения присутствует только в CedrusData, и не поддерживается Trino.
Примечание
Руководство Подключение к Microsoft Power BI описывает, как можно подключиться к CedrusData с помощью ODBC и Arrow Flight SQL на примере Power BI.
О протоколе#
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
Перезапустите координатор после внесения описанных выше изменений.
Параметры конфигурации#
Название |
Описание |
Значение по умолчанию |
---|---|---|
|
Значение |
|
|
Сетевой интерфейс, на котором будет запущен Arrow Flight SQL сервер |
Значение по умолчанию: |
|
Порт Arrow Flight SQL сервера |
8090 |
|
Значение |
|
|
Локальный путь к keystore. Используется только при включенном TLS |
|
|
Пароль keystore. Используется только при включенном TLS |
|
|
Локальный путь к truststore. Используется только при включенном TLS |
|
|
Пароль truststore. Используется только при включенном TLS |
|
|
Максимальный размер сетевого пакета, содержащего часть результата запроса. Если размер результата запроса больше заданной величины, сервер отправит несколько пакетов |
|
|
Максимальное количество пользовательских сессий |
0 (без ограничений) |
|
Время, через которое сессия будет автоматически закрыта при отсутствии пользовательской активности. |
|
|
Значение |
|
|
Idle timeout внутреннего сервера Netty |
Максимальное значение (timeout отключен) |
|
Keep alive ping period внутреннего сервера Netty |
|
|
Keep alive ping timeout внутреннего сервера Netty |
|
|
Максимальный срок жизни соединения внутреннего сервера Netty |
Максимальное значение (timeout отключен) |
|
Connection max termination grace period внутреннего сервера Netty |
Максимальное значение (timeout отключен) |
|
Client max keep alive period внутреннего сервера Netty |
|
|
Максимальный размер входящего сообщения, которое может принять внутренний сервер Netty |
Максимальное значение (может принять сообщение любого размера отключен) |
|
Максимальный размер входящих метаданных, которые может принять внутренний сервер Netty |
|
Пример использования#
Код ниже подключается к 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);
}
}
}
}
}