CnosDB 2.0 Arrow Flight SQL使用指北


隨著新版本的發(fā)布,細(xì)心的小伙伴們想必已經(jīng)發(fā)現(xiàn)CnosDB 2.0已經(jīng)全面支持了Arrow Flight SQL。易用高效,數(shù)據(jù)訪問不再難!Arrow Flight SQL讓CnosDB 2.0 十億行數(shù)據(jù)查詢秒級(jí)響應(yīng)成為可能!本篇文章詳細(xì)介紹了Arrow Flight SQL及使用Arrow Flight SQL的優(yōu)勢(shì)及各種語(yǔ)言的使用方法,方便大家快速上手使用Arrow Flight SQL。
Arrow Flight SQL
Arrow Flight SQL 是一種使用 Arrow 內(nèi)存格式和 Flight RPC 框架與 SQL 數(shù)據(jù)庫(kù)交互的協(xié)議,其結(jié)合Arrow內(nèi)存中的列式格式(Columnar Format)以及Flight RPC框架,來加速SQL數(shù)據(jù)庫(kù)操作。通過使用Arrow Flight SQL,用戶訪問數(shù)據(jù)時(shí),不僅可以使用原生SQL的標(biāo)準(zhǔn)語(yǔ)法,而且可以大幅度地提升數(shù)據(jù)訪問性能,讓十億行數(shù)據(jù)查詢秒級(jí)響應(yīng)成為可能!
目前我們支持Arrow Flight SQL 客戶端的環(huán)境有:
??C++
??Go
??Java
??Rust
??基于Arrow Flight SQL 的JDBC
Arrow Flight SQL 的優(yōu)勢(shì)
Arrow Flight SQL具有的優(yōu)勢(shì):
1. 功能強(qiáng)大:功能與JDBC和ODBC等API類似,包括執(zhí)行查詢,創(chuàng)建準(zhǔn)備好的語(yǔ)句。
2. 安全:使用 Flight,支持開箱即用的加密和身份驗(yàn)證等功能。
3. 性能:與實(shí)現(xiàn)Arrow Flight 的客戶端和服務(wù)端通信,無(wú)需進(jìn)行數(shù)據(jù)轉(zhuǎn)化,同時(shí)允許進(jìn)一步優(yōu)化,如并行數(shù)據(jù)訪問,從而大幅度提升數(shù)據(jù)訪問性能。
Arrow Flight 與 JDBC/ODBC性能的比較:
1. Arrow Flight 在客戶端和服務(wù)端通信傳輸數(shù)據(jù)時(shí),無(wú)需進(jìn)行數(shù)據(jù)轉(zhuǎn)化,而ODBC的實(shí)現(xiàn)通常需要自定義在線二進(jìn)制協(xié)議。
2. Arrow Flight 可以并行傳輸數(shù)據(jù),先獲取數(shù)據(jù)的訪問計(jì)劃,數(shù)據(jù)可以分布在不同的服務(wù)器上,客戶端可以并行從不同服務(wù)器上拉取數(shù)據(jù)。
3. Arrow Flight 采用 Arrow Columnar Format 格式,該格式獲取數(shù)據(jù)的復(fù)雜度是O(1),對(duì)向量化計(jì)算友好。
雖然它可以直接用于數(shù)據(jù)庫(kù)訪問,但它不能直接替代 JDBC/ODBC。 但是,Arrow Flight SQL 可以用作具體的有線協(xié)議/驅(qū)動(dòng)程序?qū)崿F(xiàn),支持 JDBC/ODBC 驅(qū)動(dòng)程序,并減少數(shù)據(jù)庫(kù)的實(shí)現(xiàn)負(fù)擔(dān)。

客戶端使用Arrow Flight SQL與數(shù)據(jù)庫(kù)連接,查詢數(shù)據(jù),執(zhí)行SQL的流程大致如下:
1. 創(chuàng)建Flight SQL客戶端
2. 驗(yàn)證用戶名,密碼
3. 執(zhí)行SQL,獲取FlightInfo結(jié)構(gòu)體
4. 通過FlightInfo結(jié)構(gòu)體中的FlightEndPoint獲取到FlightData數(shù)據(jù)流
FlightInfo中包含有關(guān)數(shù)據(jù)所在位置的詳細(xì)信息,客戶端可以從適當(dāng)?shù)姆?wù)器獲取數(shù)據(jù)。服務(wù)器信息被編碼為 FlightInfo 中的一系列 FlightEndpoint 消息。 每個(gè)Endpoint代表包含響應(yīng)數(shù)據(jù)子集的某個(gè)位置。
一個(gè)FlightEndpoint包含一個(gè)服務(wù)器地址列表,一個(gè)Ticket,一個(gè)服務(wù)器用來識(shí)別請(qǐng)求數(shù)據(jù)的二進(jìn)制Token。FlightEndPoint 沒有定義順序,如果數(shù)據(jù)集是排序的,只會(huì)在一個(gè)FlightEndPoint中返回?cái)?shù)據(jù)。
流程圖如下:

C++
1.安裝Apache Arrow 你可以去官方文檔(
https://arrow.apache.org/install/)找到詳細(xì)的安裝教程。在Mac系統(tǒng)下,使用brew命令就可以簡(jiǎn)單安裝。
2. 配置CMakeLists.txt
3. C++ Arrow庫(kù)的用法arrow的函數(shù)大多數(shù)是返回arrow::Result<T>類型,因此需要把代碼寫在返回值為 arrow::Result<T>的類型的函數(shù)中,如下
ARROW_ASSIGN_OR_RAISE宏的效果是,先對(duì)右邊返回值為arrow::Result<T>類型的表達(dá)式求值,如果出現(xiàn)異常,則提前return,賦上相應(yīng)的Status值
為了方便,示例代碼均寫在lambda函數(shù)中
4. 執(zhí)行身份驗(yàn)證,并創(chuàng)建一個(gè)FlightSqlClient
5. 執(zhí)行SQL取得FlightInfo
6. 通過FlightEndPoint取回?cái)?shù)據(jù)
7.整體代碼
GO
1. 添加依賴
在go.mod中寫入依賴
2. 創(chuàng)建Flight SQL客戶端
3. 設(shè)置連接憑證,并取得已經(jīng)驗(yàn)證的上下文
4. 在已經(jīng)驗(yàn)證的上下文中執(zhí)行SQL,取得FlightInfo
5. 根據(jù)FlightInfo取得數(shù)據(jù)Reader
6. 操作Reader打印數(shù)據(jù)
JAVA
1. 添加依賴
??如果你使用maven構(gòu)建Java項(xiàng)目,在pom.xml中寫入依賴
??再寫入
??添加環(huán)境變量
2. 建FlightSqlClient
3. 配置認(rèn)證
4. 執(zhí)行SQL,取得FlightInfo
5. 取得數(shù)據(jù)
6. 全部代碼
JDBC
1. 添加依賴
添加環(huán)境變量
_JAVA_OPTIONS="--add-opens=java.base/java.nio=ALL-UNNAMED"
2. 設(shè)置屬性并查詢
3.設(shè)置屬性并執(zhí)行SQL
Rust
代碼運(yùn)行在異步環(huán)境下
1. 添加依賴
2. 創(chuàng)建FlightServerClient
3. 進(jìn)行驗(yàn)證
4. 執(zhí)行SQL
5. 取得數(shù)據(jù)并打印
6. 完整代碼
ODBC
目前僅支持x86_64架構(gòu)的系統(tǒng),Linux僅支持CentOS和RedHat系列發(fā)行版。
更多關(guān)于Arrow Flight SQL ODBC的內(nèi)容,請(qǐng)查看Dremio文檔(
https://docs.dremio.com/software/drivers/arrow-flight-sql-odbc-driver/)。
以下步驟基于CentOS 7。
安裝ODBC管理器
在Linux下安裝unixODBC
安裝arrow-flight-odbc驅(qū)動(dòng)
2. 修改配置文件修改位于/etc/odbc.ini的配置文件
其中 UID是用戶名,PWD是密碼
測(cè)試是否連接
如果出現(xiàn)如下內(nèi)容,說明連接成功
下面進(jìn)入代碼測(cè)試
1. 編寫cmak
2. 編寫c語(yǔ)言代碼 main.c
總結(jié)
CnosDB 2.0的原生Arrow架構(gòu),提供了基于Arrow Flight SQL 接口,通過使用Arrow Flight SQL,可以用多種語(yǔ)言連接CnosDB 2.0 時(shí)序數(shù)據(jù)庫(kù),高效地寫入數(shù)據(jù)與查詢數(shù)據(jù),更能支持十億行數(shù)據(jù)查詢秒級(jí)響應(yīng)。
關(guān)于更多的細(xì)節(jié),可以在CnosDB2.0 使用手冊(cè)|連接器(https://docs.cnosdb.com/zh/guide/reference/connector.html)中查看相關(guān)使用方法,如果有需求或者建議,也請(qǐng)?jiān)?strong>GitHub(https://github.com/cnosdb/cnosdb)上給我們提issue。
CnosDB簡(jiǎn)介
CnosDB是一款高性能、高易用性的開源分布式時(shí)序數(shù)據(jù)庫(kù),現(xiàn)已正式發(fā)布及全部開源。
歡迎關(guān)注我們的社區(qū)網(wǎng)站:https://cn.cnosdb.com