Doris增加ODBC操作MySQL
知識補充:
Doris ODBC External Table介紹
ODBC External Table Of Doris提供了Doris通過數據庫訪問的標準接口ODBC來訪問外部表,外部表省去了繁瑣的數據導入工作,讓Doris可以具有了訪問各式數據庫的能力,并借助Doris本身的OLAP的能力來解決外部表的數據分析能力
使用Doris的ODBC外表可以實現如下功能:
- 支持各種數據源接入Doris
- 支持Doris與各種數據源中的表聯合查詢,進行更加復雜的分析操作
- 通過insert into將Doris執行的查詢結果寫入外部的數據源
在使用外表的時候,需要注意的地方,通常在外表數據量較小,少于100W條時,可以通過外部表的方式訪問.由于外表無法發揮Doris在存儲引擎部分的能力和會帶來額外的網絡開銷,所以建議根據實際對查詢的訪問時延要求來確定是否通過外部表訪問還是將數據導入Doris之中.
安裝前確認
- 確認安裝機器的版本
cat /proc/version
cat /etc/redhat-release
執行上面兩個哪個命令都可以
顯示如下 可以得知信息為CentOS7 / el7 x86_64
出現
執行
cat /etc/redhat-release
顯示
CentOS Linux release 7.9.2009 (Core)
執行
cat /proc/version
顯示
Linux version 4.18.0-3.0.el7.x86_64
得知我們所安裝的系統是el7
- 如下是connector的下載鏈接,在安裝過程中出現錯誤,可以先核查下doris版本和connector的版本是否沖突,我先安裝了8.0.x的版本,發現有沖突,選擇安裝了低版本的
//dev.mysql.com/downloads/connector/odbc/
MySQL ODBC的rpm包

!!!!寫在前面 這個是一個小問題 但很重要!!!!
第一遍我安裝的8.0.32的的包 到最后發現一直報錯,報錯如下
ERROR 1105 (HY000): errCode = 2, detailMessage = driver connect Error: HY000 [MySQL][ODBC 8.0(w) Driver]SSL connection error: Failed to set ciphers to use (2026)
并且驗證了MySQL ODBC Driver使用的openssl版本
ldd /usr/lib64/libmyodbc8w.so |grep libssl.so
如果輸出包含 libssl.so.10 則使用過程中可能出現問題,
如果包含libssl.so.1.1 則與doris 1.0 兼容
由于我當時安裝的是8.0.32的包,驗證后發現輸出的是libssl.so.10
因此我選擇的是 使用低版本的ODBC Connector來重新安裝
問題產生原因如下:
查看官方文檔看到是由于doris版本在1.0以上并且connector/odbc的版本在8.0.x
/usr/lib64/libmyodbc8w.so依賴的是libssl.so.10和libcrypto.so.10,而doris1.0以后版本中openssl升級到了1.1且內置在doris二進制包中,因此會導致openssl的沖突而出現上面這個錯誤
解決方式:
- 如仍使用8.0.28的包,則在選擇操作系統處選擇Linux-Generic(沒試過,但是也看到有人講這個問題來著)
- 使用低版本ODBC Connector
開始安裝
將下載好的rpm包準備好,上傳至需要安裝的機器
已知Doris有三臺BE節點,需要所有的BE節點都按照MySQL ODBC驅動,上傳需要版本的rpm包到指定機器
- 安裝安裝包
yum localinstall -y mysql-connector-odbc-5.3.14-1.el7.x86_64.rpm
如果安裝的rpm包有問題 需要刪除
rpm -e 包名(mysql-connector-odbc-8.0.32-1.el7.x86_64)
- 配置MySQL ODBC驅動
[PostgreSQL]
Description=ODBC for PostgreSQL
Driver=/usr/lib/psqlodbcw.so
Setup=/usr/lib/libodbcpsqlS.so
Driver64=/usr/lib64/psqlodbcw.so
Setup64=/usr/lib64/libodbcpsqlS.so
FileUsage=1
[MySQL]
Description=ODBC for MySQL
Driver=/usr/lib/libmyodbc5.so
Setup=/usr/lib/libodbcmyS.so
Driver64=/usr/lib64/libmyodbc5.so
Setup64=/usr/lib64/libodbcmyS.so
FileUsage=1
[MySQL ODBC 5.3 Unicode Driver] --請注意這個位置,這個位置需要和odbc.ini中的驅動一致
Driver=/usr/lib64/libmyodbc5w.so
UsageCount=1
[MySQL ODBC 5.3 ANSI Driver]
Driver=/usr/lib64/libmyodbc5a.so
UsageCount=1
- 測試驅動
[mysql] --這個位置相當于一個鏈接 測試odbc鏈接成功的時候輸入的是這個名字
Description = Data source MySQL
Driver = MySQL ODBC 5.3 Unicode Driver --這個位置需要和odbcinst.ini一致
Server = 172.16.xxx.xxx
Host = 172.16.xxx.xxx
Database = bdmp
Port = 50001
User = bdmp
Password = xxxxxxxxxxxxxxxxxxx
charset = utf8
一般是通過uncode 方式連接,Driver則填寫的是MySQL ODBC 5.3 Unicode Driver
- 測試ODBC連接
# isql -v mysql
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select * from man_love;
+------------+-------------------+
| small_kind | count_small_count |
+------------+-------------------+
| 加鈣奶 | 52 |
| 棉裝 | 43 |
| 奶瓶 | 32 |
+------------+-------------------+
可以查到數據! ODBC連接mysql成功
- 其他
odbcinst -j //查看本機安裝odbc驅動版本信息
odbcinst -q -d //查看odbc ini配置文件配置數據庫是否成功
isql -v mysql //驗證odbc鏈接名字為mysql的鏈接是否成功
$ odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/lix_dongyy/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
$ odbcinst -q -d
[PostgreSQL]
[MySQL]
[MySQL ODBC 5.3 Unicode Driver]
[MySQL ODBC 5.3 ANSI Driver]
Doris BE的ODBC配置
Doris要使用ODBC訪問MySQL數據庫,需要在各個BE節點的配置文件中的odbcinst.ini中完成配置。Doris BE的odbcinst.ini配置文件一般在BE的安裝目錄的conf目錄下。 修改并確保該配置文件中關于[MySQL ODBC 8.0 Unicode Driver]的內容與前面安裝ODBC時/etc/odbcinst.ini中[MySQL ODBC 8.0 Unicode Driver]一樣。如果是低版本,也需要一致。
以上完成配置后,需要把Doris集群的各個BE服務都重啟一下。注意,要求在所有的BE節點上都安裝相同版本的ODBC Driver,同時要求conf/odbcinst.ini的配置也要一樣。
默認三臺BE節點已經都安裝了
修改BE節點odbc配置信息
├── bin
│ ├── be.pid
│ ├── start_be.sh
│ └── stop_be.sh
├── conf
│ ├── be.conf
│ └── odbcinst.ini //修改這個文件的配置信息 每一個be節點都需要改動
├── lib
│ ├── meta_tool
│ ├── palo_be
│ ├── small_file
│ ├── udf
│ └── udf-runtime
如果Doris版本和8.0.x不沖突,則這個位置正常來講Doris中就已經有了,但是由于版本沖突,這里使用的是低版本的,在配置文件中增加了如下的配置,三臺BE都需要增加如下配置,并重啟Doris的be
[MySQL ODBC 5.3 Unicode Driver]
Description = ODBC for MySQL
Driver = /usr/lib64/libmyodbc5w.so
FileUsage = 1
Doris外部表
Doris On ODBC實戰
通過ODBC_Resource來創建ODBC外表 (推薦使用的方式)
示例
CREATE EXTERNAL RESOURCE `oracle_odbc`
PROPERTIES (
"type" = "odbc_catalog",
"host" = "192.168.0.1",
"port" = "8086",
"user" = "test",
"password" = "test",
"database" = "test",
"odbc_type" = "oracle",
"driver" = "Oracle 19 ODBC driver"
);
CREATE EXTERNAL TABLE `baseall_oracle` (
`k1` decimal(9, 3) NOT NULL COMMENT "",
`k2` char(10) NOT NULL COMMENT "",
`k3` datetime NOT NULL COMMENT "",
`k5` varchar(20) NOT NULL COMMENT "",
`k6` double NOT NULL COMMENT ""
) ENGINE=ODBC
COMMENT "ODBC"
PROPERTIES (
"odbc_catalog_resource" = "oracle_odbc",
"database" = "test",
"table" = "baseall"
);
實際上我創建的
CREATE EXTERNAL RESOURCE `mysql_odbc`
PROPERTIES (
"type" = "odbc_catalog", --這個位置是說必須填寫這個
"host" = "172.16.xxx.xxx", --mysql所在ip地址
"port" = "50001",
"user" = "bdmp", --用戶
"password" = "xxxxxxxxxxxxxx", --密碼
"database" = "bdmp", --數據庫
"odbc_type" = "mysql",
"driver" = "MySQL ODBC 5.3 Unicode Driver" --需要和Doris中配置文件一致
);
CREATE EXTERNAL TABLE `man_love_mysql` (
small_kind varchar(20) NOT NULL COMMENT "",
count_small_count double NOT NULL COMMENT ""
) ENGINE=ODBC
COMMENT "ODBC" PROPERTIES(
"odbc_catalog_resource" = "mysql_odbc", --與所建資源一致
"database" = "bdmp", --數據庫
"table" = "man_love" --表明
);
CREATE TABLE doris_mysql_tbl (
small_kind varchar(20) NOT NULL COMMENT "",
count_small_count double NOT NULL COMMENT ""
)
COMMENT "Doris Table"
DISTRIBUTED BY HASH(small_kind) BUCKETS 2
PROPERTIES (
"replication_num" = "1"
);
從外部表導入數據到Doris表
INSERT INTO doris_mysql_tbl SELECT small_kind,count_small_count FROM man_love_mysql limit 100;

其他補充
ODBC外表的參數

ODBC相關參數

資源管理主要有三個命令:CREATE RESOURCE,DROP RESOURCE和SHOW RESOURCES,分別為創建、刪除和查看資源。這三個命令的具體語法可以通過MySQL客戶端連接到 Doris 后,執行 HELP cmd 的方式查看幫助。
- CREATE RESOURCE該語句用于創建資源。具體操作可參考 。
- DROP RESOURCE該命令可以刪除一個已存在的資源。具體操作見 。
- SHOW RESOURCES該命令可以查看用戶有使用權限的資源。具體操作見 。