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的版本,发现有冲突,选择安装了低版本的
https://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该语句用于创建资源。具体操作可参考 CREATE RESOURCE。
- DROP RESOURCE该命令可以删除一个已存在的资源。具体操作见 DROP RESOURCE 。
- SHOW RESOURCES该命令可以查看用户有使用权限的资源。具体操作见 SHOW RESOURCES。