Doris集成其他系统——ODBC外部表
Doris集成其他系统——ODBC外部表
0. 写在前面
- Linux版本:
CentOS-7.5-x86_64-DVD-1804
- Doris版本:
Doris-1.1.5
- MySQL版本:
MySQL-5.7
1. 正文
1.1 ODBC外部表介绍
ODBC External Table Of Doris 提供了 Doris 通过数据库访问的标准接口(ODBC)来访问外部表,外部表省去了繁琐的数据导入工作,让 Doris 可以具有了访问各式数据库的能力, 并借助 Doris 本身的OLAP 的能力来解决外部表的数据分析问题:
- 支持各种数据源接入 Doris
- 支持Doris 与各种数据源中的表联合查询,进行更加复杂的分析操作
- 通过 insert into 将 Doris 执行的查询结果写入外部的数据源
1.2 使用方式
1)Doris 中创建ODBC 的外表
- 方式一:不使用 Resource 创建ODBC 的外表。
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 (
"host" = "192.168.0.1",
"port" = "8086",
"user" = "test", "password" = "test", "database" = "test", "table" = "baseall",
"driver" = "Oracle 19 ODBC driver", "odbc_type" = "oracle"
);
- 方式二:通过 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"
);
- 指定odbc_catalog_resource参数值
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"
);
- 参数说明:
参数 | 说明 |
---|---|
hosts | 外表数据库的 IP 地址 |
driver | ODBC 外表 Driver 名,需要和 ${DORIS_HOME}/be/conf/odbcinst.ini 中的 Driver 名一致。 |
odbc_type | 外表数据库的类型,当前支持 oracle, mysql, postgresql |
user | 外表数据库的用户名 |
password | 对应用户的密码信息 |
2)ODBC Driver 的安装和配置
- 各大主流数据库都会提供 ODBC 的访问 Driver,用户可以执行参照各数据库官方推荐的方式安装对应的ODBC Driver LiB 库。
- 安装完成之后,查找对应的数据库的 Driver Lib 库的路径,并且修改
${DORIS_HOME}/be/conf/odbcinst.ini
的配置
[MySQL Driver]
Description = ODBC for MySQL
Driver = /usr/lib64/libmyodbc8w.so
FileUsage = 1
上述配置[]里的对应的是 Driver 名,在建立外部表时需要保持外部表的 Driver 名和配置文件之中的一致。
Driver=
这个要根据实际 BE 安装 Driver 的路径来填写,本质上就是一个动态库
的路径, 这里需要保证该动态库的前置依赖都被满足。
Note:这里要求所有的 BE 节点都安装上相同的Driver,并且安装路径相同,同时有相同的 ${DORIS_HOME}/be/conf/odbcinst.ini 的配置。
2. 使用 ODBC 的 MySQL 外表
2.1 前置芝士
- CentOS 数据库 ODBC 版本对应关系:
- MySQL 与Doris 的数据类型匹配:
2.2 安装 unixODBC
安装必要依赖
[whybigdata@node01 doris-1.1.5]$ yum install -y unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel
检查依赖是否安装完全
[whybigdata@node01 doris-1.1.5]$ rpm -qa | grep unixODBC
freeradius-unixODBC-3.0.13-15.el7.x86_64
unixODBC-devel-2.3.1-14.el7.x86_64
unixODBC-2.3.1-14.el7.x86_64
[whybigdata@node01 doris-1.1.5]$ rpm -qa | grep unixODBC-devel
unixODBC-devel-2.3.1-14.el7.x86_64
[whybigdata@node01 doris-1.1.5]$ rpm -qa | grep libtool-ltdl
libtool-ltdl-2.4.2-22.el7_3.x86_64
[whybigdata@node01 doris-1.1.5]$ rpm -qa | grep libtool-ltdl-devel
libtool-ltdl-devel-2.4.2-22.el7_3.x86_64
检查ODBC是否安装成功
[whybigdata@node01 doris-1.1.5]$ 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/whybigdata/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
出现unixODBC版本信息以及相关文件路即代表安装成功
2.3 安装MySQL 对应版本的 ODBC
安装MySQL的ODBC依赖,请在三台节点
「安装了be的节点都需要安装」
都执行安装
2.3.1 安装方式
两种方式:一是直接通过
wget
下载,二是通过提前下载好的压缩包然后上传到node01机器上并解压tar.gz包进行安装
- 直接下载安装
wget https://downloads.mysql.com/archives/get/p/10/file/mysql-connector-odbc-5.3.11-1.el7.x86_64.rpm
- tar包进行安装
[whybigdata@node01 software]$ sudo yum install -y mysql-connector-odbc-5.3.11-1.el7.x86_64.rpm
已加载插件:fastestmirror
正在检查 mysql-connector-odbc-5.3.11-1.el7.x86_64.rpm: mysql-connector-odbc-5.3.11-1.el7.x86_64
mysql-connector-odbc-5.3.11-1.el7.x86_64.rpm 将被安装
正在解决依赖关系
--> 正在检查事务
---> 软件包 mysql-connector-odbc.x86_64.0.5.3.11-1.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
=========================================================================================================================
Package 架构 版本 源 大小
=========================================================================================================================
正在安装:
mysql-connector-odbc x86_64 5.3.11-1.el7 /mysql-connector-odbc-5.3.11-1.el7.x86_64 13 M
事务概要
=========================================================================================================================
安装 1 软件包
总计:13 M
安装大小:13 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : mysql-connector-odbc-5.3.11-1.el7.x86_64 1/1
Success: Usage count is 1
Success: Usage count is 1
验证中 : mysql-connector-odbc-5.3.11-1.el7.x86_64 1/1
已安装:
mysql-connector-odbc.x86_64 0:5.3.11-1.el7
完毕!
2.3.2 检查安装结果
查看是否安装成功
[whybigdata@node01 software]$ myodbc-installer -d -l
ODBC Driver 17 for SQL Server
MySQL ODBC 5.3 Unicode Driver
MySQL ODBC 5.3 ANSI Driver
出现
MySQL ODBC 5.3
字样代表安装成功
2.3.3 其他节点的安装及配置
分发
mysql-connector-odbc-5.3.11-1.el7.x86_64.rpm
到其他两台节点上
[whybigdata@node01 software]$ scp /opt/software/mysql-connector-odbc-5.3.11-1.el7.x86_64.rpm whybigdata@node02:/opt/software/
[whybigdata@node01 software]$ scp /opt/software/mysql-connector-odbc-5.3.11-1.el7.x86_64.rpm whybigdata@node03:/opt/software/
mysql-connector-odbc-5.3.11-1.el7.x86_64.rpm 100% 2813KB 52.4MB/s 00:00
查看是否传输成功
[whybigdata@node01 software]$ my_call.sh ls /opt/software/
=================> node01 <=================
mysql-connector-odbc-5.3.11-1.el7.x86_64.rpm
=================> node02 <=================
mysql-connector-odbc-5.3.11-1.el7.x86_64.rpm
=================> node03 <=================
mysql-connector-odbc-5.3.11-1.el7.x86_64.rpm
2.3.4 配置 unixODBC,验证通过ODBC 访问 MySQL
[whybigdata@node01 software]$ sudo vim /etc/odbc.ini
- 添加如下内容
[mysql] Description = Data source MySQL Driver = MySQL ODBC 5.3 Unicode Driver Server = node01 Host = node01 Database = test_doris Port = 3306 User = root Password = 123456
- 测试连接MySQL
可以查看到对应的表
[whybigdata@node01 software]$ isql -v mysql
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> show tables;
+-----------------------------------------------------------------+
| Tables_in_test_doris |
+-----------------------------------------------------------------+
| sensor |
| tbl1 |
+-----------------------------------------------------------------+
SQLRowCount returns 2
2 rows fetched
MySQL中test_doris库下的表情况以及sensor表的数据
mysql> use test_doris;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
mysql> show tables;
+----------------------+
| Tables_in_test_doris |
+----------------------+
| sensor |
| tbl1 |
+----------------------+
2 rows in set (0.00 sec)
mysql>
mysql> select * from sensor;
+-----+------+------+
| id | ts | vc |
+-----+------+------+
| s_2 | 3 | 3 |
| s_9 | 9 | 9 |
+-----+------+------+
2 rows in set (0.01 sec)
ODBC访问方式:表sensor数据如下图所示
综上,ODBC外部表和MySQL表集成成功
2.4 准备一张MySQL新表
2.4.1 在MySQL种建表test_cdc
mysql> CREATE TABLE `test_cdc` (
-> `id` int NOT NULL AUTO_INCREMENT,
-> `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB AUTO_INCREMENT=91234 DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.01 sec)
2.4.2 插入数据
插入表test_cdc的数据SQL语句如下:
INSERT INTO `test_cdc` VALUES (123, 'this is a update');
INSERT INTO `test_cdc` VALUES (1212, '测试 flink CDC');
INSERT INTO `test_cdc` VALUES (1234, '这是测试');
INSERT INTO `test_cdc` VALUES (11233, 'zhangfeng_1');
INSERT INTO `test_cdc` VALUES (21233, 'zhangfeng_2');
INSERT INTO `test_cdc` VALUES (31233, 'zhangfeng_3');
INSERT INTO `test_cdc` VALUES (41233, 'zhangfeng_4');
INSERT INTO `test_cdc` VALUES (51233, 'zhangfeng_5');
INSERT INTO `test_cdc` VALUES (61233, 'zhangfeng_6');
INSERT INTO `test_cdc` VALUES (71233, 'zhangfeng_7');
INSERT INTO `test_cdc` VALUES (81233, 'zhangfeng_8');
INSERT INTO `test_cdc` VALUES (91233, 'zhangfeng_9');
观察ODBC中表的情况:test_cdc表同样被映射过来了
2.4.3 修改 Doris 的配置文件(每个 BE 节点都要,不用重启 BE)
在 BE 节点的
conf/odbcinst.ini
,添加我们的刚才注册的的ODBC 驱动([MySQL ODBC 5.3.11]这部分)。
在文件
odbcinst.ini
末尾新增以下内容:
# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL ODBC 5.3.11]
Description = ODBC for MySQL
Driver= /usr/lib64/libmyodbc5w.so
FileUsage = 1
2.4.4 在Doris中 建Resource
- 以root身份创建
[whybigdata@node01 ~]$ mysql -h node01 -P 9030 -u root -p
通过 ODBC_Resource 来创建 ODBC 外表,这是推荐的方式,这样 resource 可以复用。
use test_db;
CREATE EXTERNAL RESOURCE `mysql_5_3_11` PROPERTIES (
"host" = "hadoop1",
"port" = "3306",
"user" = "root",
"password" = "000000",
"database" = "test",
"table" = "test_cdc",
"driver" = "MySQL ODBC 5.3.11", --名称要和上面[]里的名称一致
"odbc_type" = "mysql",
"type" = "odbc_catalog");
基于 Resource 创建Doris 外表
CREATE EXTERNAL TABLE `test_odbc_5_3_11` (
`id` int NOT NULL ,
`name` varchar(255) null
) ENGINE=ODBC
COMMENT "ODBC"
PROPERTIES (
"odbc_catalog_resource" = "mysql_5_3_11", --名称就是 resource 的名称
"database" = "test_doris",
"table" = "test_cdc"
);
2.4.5 查询Doris 外表
select * from `test_odbc_5_3_11`;
如果出现如下错误,请尝试重启该节点(node01)的be服务「其实这个重启操作并没有起到作用」
重启之后,如果继续报错,那大概率就是没有符合上述提到的要求:
「所有的 BE 节点都安装上相同的Driver,并且安装路径相同,同时有相同的 ${DORIS_HOME}/be/conf/odbcinst.ini 的配置。」
- 其他be所在节点补充安装驱动
mysql-connector-odbc-5.3.11-1.el7.x86_64.rpm
并完成各自的文件配置,重新查询表test_odbc_5_3_11,查询成功
2.5 Doris和MySQL之间的映射案例
2.5.1 MySQL数据映射到Doris
- 再次往MySQL的test_cdc表插入一条数据
mysql> insert into test_cdc values(99999, 'zhangdeng_19');
Query OK, 1 row affected (0.00 sec)
再次查询doris中的表,可以查询到刚刚插入到MySQL表test_cdc中的那条数据
2.5.2 Doris数据映射到MySQL
- 往Doris表插入新数据
mysql> insert into test_odbc_5_3_11 values(88888, 'zhangdeng_19');
Query OK, 0 rows affected (0.04 sec)
结果:同样可以在MySQL中看到键为88888的这条数据
综上所述,MySQL和Doris直接通过ODBC外部表的方式可以实现
相互映射
结束!
- 点赞
- 收藏
- 关注作者
评论(0)