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 版本对应关系:

​                [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9w306PZE-1675308484908)(0.jpeg)]

  • MySQL 与Doris 的数据类型匹配:

​                [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gceHWWUk-1675308484911)(01.jpeg)]

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数据如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ud2k81vP-1675308484912)(1.jpeg)]

综上,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表同样被映射过来了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ryHZEiu-1675308484913)(2.jpeg)]

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服务「其实这个重启操作并没有起到作用」

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eJxvevX3-1675308484914)(10.jpeg)]

重启之后,如果继续报错,那大概率就是没有符合上述提到的要求:

「所有的 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,查询成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0EQDuNm1-1675308484914)(11.jpeg)]

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中的那条数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QEoKKjj9-1675308484915)(12.jpeg)]

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的这条数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4BW7nkdZ-1675308484915)(13.jpeg)]

综上所述,MySQL和Doris直接通过ODBC外部表的方式可以实现相互映射

结束!

猜你喜欢

转载自blog.csdn.net/m0_52735414/article/details/128847022