背景

在构建数据仓库时,部分业务系统使用达梦数据库存储原始数据,现在需要通过datax把数据同步到云数据库MemFireDb中进行分析。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
Oracle
SQLServer
PostgreSQL
DRDS
通用RDBMS(支持所有关系型数据库)
阿里云数仓数据存储 ODPS
ADS
OSS
OCS
NoSQL数据存储 OTS
Hbase0.94
Hbase1.1
Phoenix4.x
Phoenix5.x
MongoDB
Hive
Cassandra
无结构化数据存储 TxtFile
FTP
HDFS
Elasticsearch
时间序列数据库 OpenTSDB
TSDB

通过命令查看配置模板

通过上表可以看到,无论是达梦数据库,还是作为同步源的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

下图是执行成功的截图

image.png

排错过程

No suitable driver found

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

image.png

写入模式(writeMode)配置有误

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

image.png

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

job.setting.speed.channel] 值非法

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

“exception”:"Value conversion failed

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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐