数据治理-Doris-逻辑入湖-达梦(Doris将达梦作为外部表的三种方式)
本文分享了三种在Doris数据仓库中实现达梦数据库逻辑接入的方案: 源码修改方案(官方推荐但复杂) Trino-Connector插件方案(已验证可行) 独立Trino服务方案(通用性最佳) 重点介绍了方案2和3的具体实现步骤: 方案2需要安装达梦Trino-Connector插件,配置Doris服务并重启 方案3需搭建独立Trino服务,通过JDBC连接达梦 两种方案都面临数据类型映射不完善的问
背景
本人近期在做数据治理,使用Doris作为数据仓库。数据治理的重要一步是进行上游业务系统的数据接入,而信创背景下,接入国产达梦数据库的需求变得很常见。
数据接入到数仓一般分逻辑接入和物理接入两种,逻辑接入的本质是视图,数据只有一份;物理接入的本质是数据同步,数据保留两份。因此两者的优劣显而易见,逻辑接入除了读性能较物理接入后的表差一些,其他全是优点(最高及时性、完全一致性、低成本等),建议优先使用逻辑接入。
而Doris虽然提供了jdbc catalog作为逻辑接入外部表的方式,但截止到目前3.1版本,并不包含对国产达梦数据库的直接支持。官方论坛中说商业版支持此功能,无奈公司太小太穷不买单。因此本菜鸟个人探索,整理出三种实现方式,在此分享。
概述
- 方式1:修改Doris源码,扩展达梦数据库的catalog插件(官方推荐,说此方式性能高,但个人精力和能力有限,未做详细探索,官方指引见:https://doris.apache.org/zh-CN/community/how-to-contribute/jdbc-catalog-developer-guide)
优点:最高性能
缺点:
- 修改编译源码比较复杂
- 需要重启原Doris服务才能生效
- 方式2:增加Trino-Connector插件(一组jar包),已验证可行(官方指引见:https://doris.apache.org/zh-CN/community/how-to-contribute/trino-connector-developer-guide)
优点:避免了修改编译Doris源码的复杂
缺点:
- 需要达梦的Trino-Connector插件包(已找到资源,避免自己编译)
- 需要重启原Doris服务才能生效
- 性能比方案1低些
- 要求Doris版本号>=3.0
- 方式3:增加Trino服务,用Trino连接DM数据库,Doris连接Trino服务,已验证可行
优点:
- 不需要对Doris服务做任何改动,不需要重启
- Doris版本号>=2.0即可
缺点:
- 需要达梦的Trino-Connector插件包(已找到资源,避免自己编译)
- 需要增加一个Trino服务,耗费一定的计算资源
- 性能最低,接近方案2
方案2实现
环境依赖
- 已部署好的Doris服务(V3.0+,我的是3.0.7)

- 达梦的Trino-Connector插件包(按官网要求,用trino 435版本的插件)

实现步骤
1、将Trino-Connector插件包上传到FE和BE节点服务器的/path/to/connectors目录下(该目录可根据自己需要修改,若FE和BE在不同的服务器节点上,则需要重复上传多次。注意该目录下还有一层trino-dameng-435目录,再下面一层才是jar包),结果如下:
2、修改Doris的fe.conf文件,增加如下配置后保存trino_connector_plugin_dir=/path/to/connectors
3、修改Doris的be.conf文件,增加相同配置后保存
4、重启doris的fe和be服务,使配置的插件生效
# 重启fe
service doris-fe restart
# 重启be
service doris-be restart
5、重启成功后,针对一个已经存在的达梦数据库服务,创建catalog,示意如下:
-- 创建catalog
create catalog my_dm_catalog properties (
"type"="trino-connector",-- 固定写法,不要改
"trino.connector.name"="dameng",-- 固定写法,不要改
"trino.connection-url"="jdbc:dm://dm_ip:dm_port",-- 修改成你的达梦IP和端口
"trino.connection-user"="SYSDBA",-- 修改成你的达梦用户
"trino.connection-password"="123456",-- 修改成你的达梦密码
"trino.case-insensitive-name-matching"="true"-- 配置成大小写不敏感模式,强烈建议加上
);
执行成功后效果如下:
若需要定期刷新catalog中的元数据,需要再执行以下配置
ALTER CATALOG my_dm_catalog SET PROPERTIES (
"metadata.refresh.interval" = "60s",
"metadata.refresh.enabled" = "true"
);
6、测试用例1-查询catalog下表清单
-- 查看特定catalog.schema下的所有表(需要源DM库实例中有test逻辑库且下面有表)
show tables from my_dm_catalog.test
结果如下:
7、测试用例2-查询单表结构
show create table my_dm_catalog.test.t_person
结果如下:
8、测试用例3-查询单表数据
select * from my_dm_catalog.test.t_person where id=1
结果如下:
9、测试用例4-关联查询
select * from my_dm_catalog.test.t_person t1,my_dm_catalog.test.t_score t2 where t1.id=t2.p_id
结果如下:
限制说明
当前达梦的Trino-Connector插件功能有限,对于特定的达梦数据类型,不能正确映射到Doris中的数据类型,如clob类型按预期应该映射到text类型,但实际没有。此时在Doris中就查不到该列。提供2种解决方案:
1、达梦库中创建视图,将特定列类型转换为常用的列类型,然后在doris中使用该视图读取数据
2、自行编译实现达梦的Trino-Connector插件,在代码中实现其完整类型映射
方案3实现
环境依赖
- 已部署好的Doris服务(V2.0+,我的是3.0.7,2.1版本也试过是可以的)
- JDK 17+(我用的是24)
- Python 2.6+或Python 3+(可能trino的部分安装脚本需要依赖python,猜测不装也可以)
- Trino安装包(不区分CPU架构,仅依赖JDK)
- 达梦的Trino-Connector插件包
- Trino的JDBC驱动
实现步骤
1、在服务器(Doris所在服务器或单独的服务器)上,配置好JDK,并上传Trino安装包,如图所示:
2、安装Trino服务,命令rpm -ivh trino-server-rpm-435.rpm --nodeps
3、安装完成后启动服务,确认安装正常service trino start,启动后可以在/var/log/trino目录下查看启动日志,或者稍等1min,通过service trino status命令查看启动状态,通过netstat -ntlp命令查看默认的8080端口是否已经启动。
4、将Trino插件包放到默认插件目录/usr/lib/trino/plugin,在该目录下创建子目录dameng,并将插件包中所有的jar上传到该目录,如图所示:
5、增加catalog配置,在trino默认配置目录/etc/trino下创建文件夹catalog,并在catalog目录下创建dm_node1.properties配置文件,其中dm_node1是catalog的名称,可根据需要修改,该目录下可以有多个.properties文件,每个都对应一个catalog,如图所示,我配置了一个pg的catalog和一个dm的catalog,dm的catalog也可以有多个,起不同的名字即可:
dm_node1.properties配置文件中,填写对dm数据库的连接信息,示意如下:
# 连接器配置
connector.name=dameng
connection-url=jdbc:dm://192.168.9.101:5236
connection-user=SYSDBA
connection-password=123456
# 大小写不敏感配置
case-insensitive-name-matching=true
6、重启trino,使用命令service trino restart,若重启失败,进入/var/log/trino目录查看报错日志,正常情况会启动成功
7、测试通过trino读达梦数据库。
- 方式1是使用trino-cli客户端,直接上传trino-cli文件后,chmod +755给该文件执行权限,然后通过命令
./trino-cli --server localhost:8080 --catalog dm_node1 --schema test连接到trino服务,并指定是dm_node1这个catalog下的test库。连接上后执行测试sql,可以看到能查出来数据,结果如下:
- 方式2是使用DBeaver,连接trino的配置如下:

然后正常执行sql查询即可
8、在Doris数据库中,通过DBeaver执行sql创建Trino的catalog,sql命令如下:
-- 创建trino catalog, trino连接达梦数据库
CREATE CATALOG trino_catalog PROPERTIES (
"type"="jdbc", -- 固定写法
"user"="hadoop", -- 用户名随便填
"password"="", -- 密码可以不写
"jdbc_url" = "jdbc:trino://192.168.9.103:8080/dm_node1", --指定trino服务的连接地址
"driver_url" = "file:///opt/archi/pkgs/trino-jdbc-477.jar", -- 指定doris连接trino服务时使用的jdbc驱动位置,需要提前将此jar上传到服务器,确保Doris的fe和be节点都能用到。或者将该jar上传到某个http位置,确保fe和be能通过http://xxx/xx.jar的方式访问到即可。
"driver_class" = "io.trino.jdbc.TrinoDriver" -- 固定写法
);
执行成功后,结果如下:
需要说明的是,如果你的doris是2.x版本,因为它依赖的jdk是1.8,需要将trino-jdbc-477.jar替换成低版本的trino-jdbc-389,否则创建catalog会报错
9、测试通过doris读取达梦中的数据,测试正常,示意如下:
额外说明
- 因为配置了连接达梦数据库时,大写小不敏感,因此查询时统一使用小写即可,不用理会达梦数据库中的大小写问题
- 默认对trino的连接没有用户名密码,这在生产环境中并不安全,可以考虑修改trino配置,增加安全认证
- 默认trino没有设置开机自启动,生产环境建议加上
更多推荐
所有评论(0)