datax 使用 DM

1、前言

目前 GitHub 上的 DataX3.0 开源版本,rdbms 里面默认是达梦7的驱动,因此,如果链接达梦8需要替换驱动。

2 驱动替换

  1. 下载 Dm8JdbcDriver18-xxxx.jar,放到libs下面(rdbmsreader和rdbmswriter同理

  2. 修改 maven 依赖,注释dm7的驱动,改成达梦 8 的驱动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <dependency>
    <groupId>com.dameng</groupId>
    <artifactId>Dm8JdbcDriver18</artifactId>
    <version>8.1.1.49</version>
    <scope>system</scope>
    <systemPath>${basedir}/src/main/libs/Dm8JdbcDriver18-8.1.1.49.jar</systemPath>
    </dependency>
    <!-- <dependency>-->
    <!-- <groupId>com.dm</groupId>-->
    <!-- <artifactId>dm</artifactId>-->
    <!-- <scope>system</scope>-->
    <!-- <systemPath>${basedir}/src/main/libs/Dm7JdbcDriver16.jar</systemPath>-->
    <!-- </dependency>-->
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>com.dameng</groupId>
    <artifactId>Dm8JdbcDriver18</artifactId>
    <version>8.1.1.49</version>
    </dependency>
    </dependencies>
    </dependencyManagement>
  3. 重点:同时需要将驱动的jar包复制到 ../lib/ 目录中。注意这里和官方 github 的描述不一致,官方 github 描述的是要将jar包复制到 ../plugin/writer/rdbmswriter/libs/ 中,如果是拷贝到这个目录中,仍然会有上述错误。
    通过查看 datax.py 文件,发现 class_path 设置的是 ../lib 目录,如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    def is_windows():
    """
    @brief : 判断系统是否为win
    Returns:

    """
    return platform.system() == 'Windows'


    DATAX_HOME = os.environ.get('LOCAL_DATAX_HOME', None)
    if not DATAX_HOME:
    DATAX_HOME = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    if is_windows():
    codecs.register(lambda name: name == 'cp65001' and codecs.lookup('utf-8') or None)
    CLASS_PATH = ("%s/lib/*") % (DATAX_HOME)
    else:
    CLASS_PATH = ("%s/lib/*:.") % (DATAX_HOME)

    如果不做这步,会报 No suitable driver found 的错误

  4. 重新打包编译

    1
    mvn -U clean package assembly:assembly -Dmaven.test.skip=true

3、读写达梦8的任务模板json

  1. 从达梦8读取写入到MySQL5.7模板

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    {
    "job": {
    "setting": {
    "speed": {
    "channel": 3
    },
    "errorLimit": {
    "record": 0,
    "percentage": 0.02
    }
    },
    "content": [
    {

    "reader": {
    "name": "rdbmsreader",
    "parameter": {
    "column": ["ID","USERNAME","PASSWORD"],
    "connection": [
    {
    "jdbcUrl": ["jdbc:dm://10.252.xx.xxx:15236?schema=SYSDBA"],
    "table": ["TEST_DATAX"]
    }
    ],
    "password": "",
    "username": "SYSDBA"
    }
    },
    "writer": {
    "name": "mysqlwriter",
    "parameter": {
    "print":true,
    "column": [
    "id",
    "username",
    "password"
    ],
    "connection": [
    {
    "jdbcUrl": "jdbc:mysql://10.252.xxx.xx:30006/test_datax_dm?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai",
    "table": ["test_datax"]
    }
    ],
    "password": "",
    "username": "root"
    }
    }
    }
    ]
    }
    }
  2. 从MySQL5.7读取写入到达梦8模板

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    {
    "job": {
    "setting": {
    "speed": {
    "channel": 3
    },
    "errorLimit": {
    "record": 0,
    "percentage": 0.02
    }
    },
    "content": [
    {

    "reader": {
    "name": "mysqlreader",
    "parameter": {
    "username": "root",
    "password": "",
    "column": [
    "id",
    "username",
    "password"
    ],
    "connection": [
    {
    "table": [
    "test_datax"
    ],
    "jdbcUrl": [
    "jdbc:mysql://10.252.xxx.xx:30006/test_datax_dm?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"
    ]
    }
    ]
    }
    },
    "writer": {
    "name": "rdbmswriter",
    "parameter": {
    "column": ["ID","USERNAME","PASSWORD"],
    "connection": [
    {
    "jdbcUrl": "jdbc:dm://10.252.xx.xxx:15236?schema=SYSDBA",
    "table": ["TEST_DATAX"]
    }
    ],
    "password": "",
    "username": "SYSDBA",
    "preSql": [],
    "session": []
    }
    }
    }
    ]
    }
    }

报错

1
2
3
ERROR RetryUtil - Exception when calling callable, 
异常Msg:Code:[DBUtilErrorCode-10], Description:[连接数据库失败. 请检查您的 账号、密码、数据库名称、IP、Port或者向 DBA 寻求帮助(注意网络环境).].
具体错误信息为:java.sql.SQLException: No suitable driver found for [“jdbc:dm://localhost:3306/dbname”]
  • 报错原因分析:
    1. 用户名密码错误
    2. mysqlwriter 中 jdbc 数据库地址格式应该是 String 类型,不应该定义为 List 类型
    3. "name": "mysqlreader" 。name 要和使用的数据库相对应。程序是读到这个 name 的值,才去 plugin 中找对应的文件夹名字,进而读取数据库驱动。
    4. 未将对应的包放入到 lib 目录。
  • 解决方法:
    1. 检查用户名密码,连接地址是否正确
    2. job.json 的 writer 中的 jdbcUrl 不能使用 [] 扩起来,因为写入的数据库只能有一个

Reference


datax 使用 DM
https://flepeng.github.io/041-国产-DM-达梦数据库-31-开发指南-datax-使用-DM/
作者
Lepeng
发布于
2024年3月6日
许可协议