通过DataX导入数据

更新时间:
复制 MD 格式

本文介绍使用DataX Doris Writer同步数据至云数据库 SelectDB 版

概述

DataX是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。您可以通过DataX服务读取上游数据,然后由DataX Doris Writer将数据写入到云数据库 SelectDB 版

前提条件

  • 已安装Maven环境。

  • 已安装Python3.6及以上版本。

使用示例

如下以MySQL数据源为例,介绍在Linux环境下如何通过DataXMySQL数据导入至云数据库 SelectDB 版

步骤一:配置DataX环境

  1. 下载DataX程序包代码,插件代码下载请访问Doris社区

  2. 运行DataX程序包中的init-env.sh脚本,构建DataX开发环境。

    sh init-env.sh
  3. 编译mysqlreaderdoriswriter。

    1. 编译整个DataX项目。

      cd DataX/
      mvn package assembly:assembly -Dmaven.test.skip=true

      编译产出结果在target/datax/datax/.目录下。

      说明

      hdfsreader,hdfswriter,ossreaderosswriter这四个插件需要额外的jar包,如果不需要这些插件,可以在DataX/pom.xml中删除这些插件的模块。

    2. 单独编译mysqlreaderselectdbwriter插件。

      mvn clean install -pl plugin-rdbms-util,mysqlreader,doriswriter -DskipTests

步骤二:构造需要导入的数据

  1. 创建MySQL测试表。

    CREATE TABLE `employees` (
      `emp_no` int NOT NULL,
      `birth_date` date NOT NULL,
      `first_name` varchar(14) NOT NULL,
      `last_name` varchar(16) NOT NULL,
      `gender` enum('M','F') NOT NULL,
      `hire_date` date NOT NULL,
      PRIMARY KEY (`emp_no`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
  2. 使用DMS构建测试数据,详情请参见测试数据构建

步骤三:配置云数据库 SelectDB 版实例。

  1. 通过MySQL协议连接云数据库 SelectDB 版实例,详情请参见连接实例

  2. 创建测试数据库和测试表。

    1. 创建测试数据库。

      CREATE DATABASE test_db;
    2. 创建测试表。

      USE test_db;
      CREATE TABLE employees (
          emp_no       int NOT NULL,
          birth_date   date,
          first_name   varchar(20),
          last_name    varchar(20),
          gender       char(2),
          hire_date    date
      )
      UNIQUE KEY(`emp_no`)
      DISTRIBUTED BY HASH(`emp_no`) BUCKETS 1;

步骤四:通过DataX服务同步MySQL数据到SelectDB

  1. 开通云数据库 SelectDB 版公网地址,详情请参见申请和释放公网地址

  2. DataX主机的公网IP添加到IP白名单中,详情请参见设置白名单

  3. 创建配置文件mysqlToSelectDB.json,配置任务信息。

    {
      "job":{
        "content":[
          {
            "reader":{
                "name": "mysqlreader",
                "parameter": {
                    "column": [
                        "emp_no",
                        "birth_date",
                        "first_name",
                        "last_name",
                        "gender",
                        "hire_date"
                    ],
                    "where": "emp_no>0",
                    "connection": [
                        {
                            "jdbcUrl": [
                                "jdbc:mysql://host:port/test_db?useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=utf-8"
                            ],
                            "table": [
                                "employees"
                            ]
                        }
                    ],
                    "password": "123456",
                    "splitPk": "emp_no",
                    "username": "admin"
                }
            },
            "writer":{
              "name":"doriswriter",
              "parameter":{
                "loadUrl":[
                  "selectdb-cn-xxx-public.selectdbfe.rds.aliyuncs.com:8080"
                ],
                "loadProps":{
                  "format":"json",
                  "strip_outer_array":"true"
                },
                "column":[
                    "emp_no",
                    "birth_date",
                    "first_name",
                    "last_name",
                    "gender",
                    "hire_date"
                ],
                "username":"admin",
                "password":"123456",
                "postSql":[
    
                ],
                "preSql":[
    
                ],
                "connection":[
                  {
                    "jdbcUrl":"jdbc:mysql://selectdb-cn-xxx-public.selectdbfe.rds.aliyuncs.com:9030/test_db",
                    "table":[
                      "employees"
                    ],
                    "selectedDatabase":"test_db"
                  }
                ],
                "maxBatchRows":1000000,
                "batchSize":536870912000
              }
            }
          }
        ],
        "setting":{
          "errorLimit":{
            "percentage":0.02,
            "record":0
          },
          "speed":{
            "channel":5
          }
        }
      }
    }

  4. 参数说明

    参数

    是否必填

    默认值

    描述

    jdbcUrl

    JDBC连接URLjdbc:mysql://<ip>:<port>

    您可以从云数据库 SelectDB 版控制台的实例详情 > 网络信息中获取IP地址和MySQL协议端口。

    IP地址:VPC 地址公网地址

    端口:MySQL 协议端口

    示例:jdbc:mysql://selectdb-cn-4xl3jv1****.selectdbfe.rds.aliyuncs.com:9030

    说明

    如果DataX主机和SelectDB在同一VPC下,即可使用VPC地址。如果不在同一VPC下请使用公网地址。

    loadUrl

    SelectDBHTTP协议访问地址<ip>:<port>

    您可以从云数据库 SelectDB 版控制台的实例详情 > 网络信息中获取IP地址和HTTP协议端口。

    IP地址:VPC 地址公网地址

    端口:HTTP 协议端口

    示例:selectdb-cn-4xl3jv1****.selectdbfe.rds.aliyuncs.com:8080

    说明

    如果DataX主机和SelectDB在同一VPC下,即可使用VPC地址。如果不在同一VPC下请使用公网地址。

    username

    云数据库 SelectDB 版实例的用户名。

    password

    云数据库 SelectDB 版实例对应用户的密码。

    connection.selectedDatabase

    需要写入的云数据库 SelectDB 版数据库名称。

    connection.table

    需要写入的云数据库 SelectDB 版表名称。

    column

    目的表需要写入数据的字段,这些字段将作为生成的JSON数据的字段名。字段之间用英文逗号分隔。示例:"column": ["id","name","age"]

    preSql

    写入数据到目的表前,会先执行这里的标准语句。

    postSql

    写入数据到目的表后,会执行这里的标准语句。

    maxBatchRows

    500000

    每批次导入数据的最大行数。和batchSize共同控制每批次的导入数量。每批次数据达到两个阈值之一,即开始导入这一批次的数据。

    batchSize

    104857600

    每批次导入数据的最大数据量。和maxBatchRows共同控制每批次的导入数量。每批次数据达到两个阈值之一,即开始导入这一批次的数据。默认值为100 M。

    maxRetries

    3

    每批次导入数据失败后的重试次数。

    labelPrefix

    datax_doris_writer_

    每批次上传文件的label前缀。最终的label将由 'labelPrefix + UUID'组成全局唯一的label,确保数据不会重复导入。

    loadProps

    Stream Load的请求参数相同。详情请参见Stream Load参数说明。配置导入数据格式使用参数format,导入数据格式默认使用CSV,支持JSON,详情请参考类型转换

    flushInterval

    30000

    数据写入批次的时间间隔。默认为30000ms

  5. 命令行提交任务。

    cd target/datax/datax/bin
    python datax.py ../mysqlToSelectDB.json

DataX/doriswriter Stream Load 连接超时排障

问题现象

通过 DataWorks 数据集成使用 DataX (doriswriter) 同步数据到 SelectDB 时,任务报 Connection timed out 错误。

原因分析

DataX 通过 doriswriter 写入数据时使用 Stream Load,FE 节点会将写入请求重定向到 BE 节点。因此客户端必须能够直连 BE 节点 IP,仅为 FE 地址配置自定义路由无法完成数据同步。

解决步骤

  1. 通过 MySQL 协议连接 SelectDB 实例,执行以下命令获取所有 BE 节点 IP。

    SHOW BACKENDS;
  2. 在 DataWorks 的自定义路由中,为上一步获取的全部 BE 节点 IP 添加路由规则。

  3. 重新执行同步任务,确认连接正常。

类型转换

默认传入的数据均会被转为字符串,并以\t作为列分隔符,\n作为行分隔符,组成csv文件进行SelectDB导入操作。 默认是csv格式导入,如需更改列分隔符, 则正确配置loadProps即可,示例如下。

"loadProps": {
    "format": "csv",
    "column_separator": "\\x01",
    "line_delimiter": "\\x02"
}

如需更改导入格式为JSON,则正确配置loadProps下的format即可,示例如下。

"loadProps": {
    "format": "json",
    "strip_outer_array": true
}