暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

用阿里datax从达梦同步数据到MemFireDB时踩过的坑

奥思立方 2021-07-19
457

背景

在构建数据仓库时,部分业务系统使用达梦数据库存储原始数据,现在需要通过datax把数据同步到云数据库MemFireDb[1]中进行分析。MemFireDB是一款NewSQL数据库系统的代表,具备高并发和弹性扩展的特点,用来作为数据仓库的存储系统。过程中遇到了不少问题,在此记录一下。

下载datax工具包

wget http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz

下载后解压,进入bin目录

cd opt/datax/bin

复制

执行自检脚本,检查环境配置是否ok

python2.7 datax.py ../job/job.json

复制

如果屏幕打印未有异常,则环境配置正常,否则检查运行环境是否满足下面要求

Linux
JDK(1.8以上,推荐1.8)
Python(推荐Python2.6.X)
Apache Maven 3.x (Compile DataX)


复制

datax支持的数据源类型

来源:https://github.com/alibaba/DataX

类型数据源Reader(读)Writer(写)文档
RDBMS 关系型数据库MySQL[2] 、[3]

Oracle[4] 、[5]

SQLServer[6] 、[7]

PostgreSQL[8] 、[9]

DRDS[10] 、[11]

通用RDBMS(支持所有关系型数据库)[12] 、[13]
阿里云数仓数据存储ODPS[14] 、[15]

ADS
[16]

OSS[17] 、[18]

OCS[19] 、[20]
NoSQL数据存储OTS[21] 、[22]

Hbase0.94[23] 、[24]

Hbase1.1[25] 、[26]

Phoenix4.x[27] 、[28]

Phoenix5.x[29] 、[30]

MongoDB[31] 、[32]

Hive[33] 、[34]

Cassandra[35] 、[36]
无结构化数据存储TxtFile[37] 、[38]

FTP[39] 、[40]

HDFS[41] 、[42]

Elasticsearch
[43]
时间序列数据库OpenTSDB
[44]

TSDB[45] 、[46]

通过命令查看配置模板

通过上表可以看到,无论是达梦数据库,还是作为同步源的MemFireDB数据库都仅支持jdbc,在datax中没有单独的插件来支持同步过程,所以我们只能选择通用RDBMS的方式来进行同步,通过下面的命令查看配置模板

python2.7 datax.py --reader rdbmsreader --writer rdbmswriter

复制

将命令行的输出内容保存到load.json文件中,并结合自己的环境调整参数。

{
"job": {
"content": [
{
"reader": {
"name": "rdbmsreader",
"parameter": {
"column": [],
"connection": [
{
"jdbcUrl": [],
"table": []
}
],
"password": "",
"username": "",
"where": ""
}
},
"writer": {
"name": "rdbmswriter",
"parameter": {
"column": [],
"connection": [
{
"jdbcUrl": "",
"table": []
}
],
"password": "",
"preSql": [],
"session": [],
"username": "",
"writeMode": ""
}
}
}
],
"setting": {
"speed": {
"channel": ""
}
}
}
}


复制

参数的说明可以看 读:https://github.com/alibaba/DataX/blob/master/rdbmsreader/doc/rdbmsreader.md 写:https://github.com/alibaba/DataX/blob/master/rdbmswriter/doc/rdbmswriter.md

配置好load.json文件后,开始执行同步过程

python2.7 datax.py load.json_bak

复制

下图是执行成功的截图

排错过程

No suitable driver found

同步的源的达梦数据库未在datax中注册,需要先注册插件,在文件“../plugin/writer/rdbmswriter/plugin.json”的drivers数组中增加新的驱动类,同时需要将驱动的jar包复制到../lib/目录中。注意这里和官方github的描述不一致,官方github描述的是要将jar包复制到“../plugin/writer/rdbmswriter/libs/”中,如果是拷贝到这个目录中,仍然会有上述错误。通过查看datax.py文件,发现class_path设置的是../lib目录,如下图

写入模式(writeMode)配置有误

在生成的模板中writemode设置为空字符串,但是通用rdbms是判断该变量是否被设置,通过getString是否取到的是空值,代码如下:

所以此处需要将load.json中writemode这一行删掉,解决该问题。

job.setting.speed.channel] 值非法

生成的模板中channel设置为空字符串,而实际需要的是一个数字变量,调整为数字后解决该问题。

"exception":"Value conversion failed

在目的端建表是,错误地将applied字段设置为date类型,而数据源中的applied字段是datetime类型,在运行过程中会抛出转换错误的异常。重新建表后解决该问题。

References

[1]
 MemFireDb: https://memfiredb.com
[2]
 读: https://github.com/alibaba/DataX/blob/master/mysqlreader/doc/mysqlreader.md
[3]
 写: https://github.com/alibaba/DataX/blob/master/mysqlwriter/doc/mysqlwriter.md


文章转载自奥思立方,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论