CnosDB 2.0 Arrow Flight SQL使用指北

CnosDB2.0引入了对ArrowFlightSQL的支持,提供高效的数据访问接口,使得处理十亿行数据查询可在秒级内完成。ArrowFlightSQL结合Arrow内存格式和FlightRPC,加速SQL操作并支持多种编程语言的客户端,如C++、Go、Java和Rust。此外,还介绍了使用这些客户端进行连接、身份验证和执行SQL的基本步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随着新版本的发布,细心的小伙伴们想必已经发现CnosDB 2.0已经全面支持了Arrow Flight SQL。易用高效,数据访问不再难!Arrow Flight SQL让CnosDB 2.0 十亿行数据查询秒级响应成为可能!本篇文章详细介绍了Arrow Flight SQL及使用Arrow Flight SQL的优势及各种语言的使用方法,方便大家快速上手使用Arrow Flight SQL。

Arrow Flight SQL

Arrow Flight SQL 是一种使用 Arrow 内存格式和 Flight RPC 框架与 SQL 数据库交互的协议,其结合Arrow内存中的列式格式(Columnar Format)以及Flight RPC框架,来加速SQL数据库操作。通过使用Arrow Flight SQL,用户访问数据时,不仅可以使用原生SQL的标准语法,而且可以大幅度地提升数据访问性能,让十亿行数据查询秒级响应成为可能!

目前我们支持Arrow Flight SQL 客户端的环境有

• C++

• Go

• Java

• Rust

• 基于Arrow Flight SQL 的JDBC

Arrow Flight SQL 的优势

Arrow Flight SQL具有的优势:

1. 功能强大:功能与JDBC和ODBC等API类似,包括执行查询,创建准备好的语句。

2. 安全:使用 Flight,支持开箱即用的加密和身份验证等功能。

3. 性能:与实现Arrow Flight 的客户端和服务端通信,无需进行数据转化,同时允许进一步优化,如并行数据访问,从而大幅度提升数据访问性能。

Arrow Flight 与 JDBC/ODBC性能的比较:

1. Arrow Flight 在客户端和服务端通信传输数据时,无需进行数据转化,而ODBC的实现通常需要自定义在线二进制协议。

2. Arrow Flight 可以并行传输数据,先获取数据的访问计划,数据可以分布在不同的服务器上,客户端可以并行从不同服务器上拉取数据。

3. Arrow Flight 采用 Arrow Columnar Format 格式,该格式获取数据的复杂度是O(1),对向量化计算友好。

虽然它可以直接用于数据库访问,但它不能直接替代 JDBC/ODBC。 但是,Arrow Flight SQL 可以用作具体的有线协议/驱动程序实现,支持 JDBC/ODBC 驱动程序,并减少数据库的实现负担。

 

客户端使用Arrow Flight SQL与数据库连接,查询数据,执行SQL的流程大致如下:

1. 创建Flight SQL客户端

2. 验证用户名,密码

3. 执行SQL,获取FlightInfo结构体

4. 通过FlightInfo结构体中的FlightEndPoint获取到FlightData数据流

FlightInfo中包含有关数据所在位置的详细信息,客户端可以从适当的服务器获取数据。服务器信息被编码为 FlightInfo 中的一系列 FlightEndpoint 消息。 每个Endpoint代表包含响应数据子集的某个位置。

一个FlightEndpoint包含一个服务器地址列表,一个Ticket,一个服务器用来识别请求数据的二进制Token。FlightEndPoint 没有定义顺序,如果数据集是排序的,只会在一个FlightEndPoint中返回数据。

流程图如下:

 

C++

1.安装Apache Arrow 你可以去官方文档(
https://arrow.apache.org/install/)找到详细的安装教程。在Mac系统下,使用brew命令就可以简单安装。

brew install apache-arrow
brew install apache-arrow-glib

2. 配置CMakeLists.txt

cmake_minimum_required(VERSION 3.24)
project(arrow_flight_cpp)


set(CMAKE_CXX_STANDARD 20)


find_package(Arrow REQUIRED)
find_package(ArrowFlight REQUIRED)
find_package(ArrowFlightSql REQUIRED)


include_directories(${ARROW_INCLUDE_DIR})
add_executable(arrow_flight_cpp main.cpp)
target_link_libraries(arrow_flight_cpp PRIVATE Arrow::arrow_shared)
target_link_libraries(arrow_flight_cpp PRIVATE ArrowFlight::arrow_flight_shared)
target_link_libraries(arrow_flight_cpp PRIVATE ArrowFlightSql::arrow_flight_sql_shared)

3. C++ Arrow库的用法arrow的函数大多数是返回arrow::Result<T>类型,因此需要把代码写在返回值为 arrow::Result<T>的类型的函数中,如下

arrow::Result <std::unique_ptr<FlightClient>> get_location() {
    ARROW_ASSIGN_OR_RAISE(auto location, Location::ForGrpcTcp("localhost", 31004));
    ARROW_ASSIGN_OR_RAISE(auto client, FlightClient::Connect(location))
}

ARROW_ASSIGN_OR_RAISE宏的效果是,先对右边返回值为arrow::Result<T>类型的表达式求值,如果出现异常,则提前return,赋上相应的Status值

为了方便,示例代码均写在lambda函数中

int main() {
 auto fun = []() {
 // code
}
 fun();
 return 0;
}

4. 执行身份验证,并创建一个FlightSqlClient

ARROW_ASSIGN_OR_RAISE(auto location, Location::ForGrpcTcp("localhost", 31004));
ARROW_ASSIGN_OR_RAISE(auto client, FlightClient::Connect(location))
auto user = "root";
auto password = "";
//Base64加密认证
auto auth = client->AuthenticateBasicToken({}, user, password);
auto sql_client = std::make_unique<FlightSqlClient>(std::move(client));


ARROW_RETURN_NOT_OK(auth); // 如果result出现异常,直接return
FlightCallOptions call_options;
call_options.headers.push_back(auth.ValueOrDie()); //把认证放到调用选项中

5. 执行SQL取得FlightInfo

ARROW_ASSIGN_OR_RAISE(auto info, sql_client->Execute(call_options, "SELECT now();"));
const auto endpoints = info->endpoints();

6. 通过FlightEndPoint取回数据

for (auto i = 0; i < endpoints.size(); i++) {
 auto &ticket = endpoints[i].ticket; 
 // stream中包含数据
 ARROW_ASSIGN_OR_RAISE(auto stream, sql_client->DoGet(call_options, ticket));
 // 获取数据的Schema
 auto schema = stream->GetSchema();
 ARROW_RETURN_NOT_OK(schema);
 std::cout << "Schema:" << schema->get()->ToString() << std::endl;
// 取得并打印数据
 while(true) {
   ARROW_ASSIGN_OR_RAISE(FlightStreamChunk chunk, stream->Next());
   if (chunk.data == nullptr) {
     break;
  }
   std::cout << chunk.data->ToString();
}
}

7.整体代码

#include <iostream>
#include <arrow/flight/api.h>
#include <arrow/flight/sql/api.h>
using namespace arrow::flight;
using namespace arrow::flight::sql;
using namespace arrow;


int main() {


 auto fun = []() {
   ARROW_ASSIGN_OR_RAISE(auto location, Location::ForGrpcTcp("localhost", 31004));
   ARROW_ASSIGN_OR_RAISE(auto client, FlightClient::Connect(location))
     std::cout << "location client" << std::endl;
   auto sql_client = std::make_unique<FlightSqlClient>(std::move(client));


   auto user = "root";
   auto password = "";
   auto auth = client->AuthenticateBasicToken({}, user, password);
   ARROW_RETURN_NOT_OK(auth);
   FlightCallOptions call_options;
   call_options.headers.push_back(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CnosDB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值