Linux版本:CentOS-7.5-x86_64-DVD-1804
Doris版本:Doris-1.1.5
MySQL版本:MySQL-5.7
ODBC External Table Of Doris 提供了 Doris 通过数据库访问的标准接口(ODBC)来访问外部表,外部表省去了繁琐的数据导入工作,让 Doris 可以具有了访问各式数据库的能力, 并借助 Doris 本身的OLAP 的能力来解决外部表的数据分析问题:
1)Doris 中创建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");
更推荐使用的方式
)。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 的配置。
安装必要依赖
[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版本信息以及相关文件路即代表安装成功
安装MySQL的ODBC依赖,请在三台节点
「安装了be的节点都需要安装」
都执行安装
两种方式:一是直接通过
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
[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完毕!
查看是否安装成功
[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
字样代表安装成功
分发
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
[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
可以查看到对应的表
[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 -ADatabase 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表集成成功
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)
插入表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表同样被映射过来了
在 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
[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"
);
select * from `test_odbc_5_3_11`;
如果出现如下错误,请尝试重启该节点(node01)的be服务「其实这个重启操作并没有起到作用」
重启之后,如果继续报错,那大概率就是没有符合上述提到的要求:
「所有的 BE 节点都安装上相同的Driver,并且安装路径相同,同时有相同的 ${DORIS_HOME}/be/conf/odbcinst.ini 的配置。」
mysql-connector-odbc-5.3.11-1.el7.x86_64.rpm
并完成各自的文件配置,重新查询表test_odbc_5_3_11,查询成功mysql> insert into test_cdc values(99999, 'zhangdeng_19');
Query OK, 1 row affected (0.00 sec)
再次查询doris中的表,可以查询到刚刚插入到MySQL表test_cdc中的那条数据
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外部表的方式可以实现
相互映射
结束!