DataX3.0介绍

概览

datax是一个异构数据源离线同步工具,主要实现包括关系型数据库(MySQL、Oracle等)、MongoDB、Hive、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。

DataX3.0框架设计

DataX3.0介绍_第1张图片
image

DataX采用Framework + plugin架构构建。将数据源读取和写入抽象成为Reader/Writer插件,Reader从源数据库中读取数据转换成datax内部的数据格式,Writer从datax中把数据读出来并且转换成目的端的数据格式。
Reader:Reader为数据采集模块,负责采集数据源的数据,将数据发送给Framework。
Writer: Writer为数据写入模块,负责不断向Framework取数据,并将数据写入到目的端。
Framework:Framework用于连接reader和writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。

应用场景

通常是在服务暂停的情况下,短时间将一份数据从一个数据库迁移至其他不同类型的数据库。
优点:
1.提供了数据监控
2.丰富的数据转换功能,可以重新定制Reader,Writer插件实现数据脱敏,补全,过滤等数据转换功能
3.可以在配置文件中配置精确的速度控制
4.强劲的同步性能,支持多线程操作,可以快速迁移数据
5.健壮的容错机制,支持线程重试等机制,可以保证迁移过程稳定执行
缺点:
1.数据一致性问题。这个工具强烈建议在服务暂停或者禁止执行写操作的情况下使用。如果在迁移的过程中还有写操作的话,这些增量数据无法实时从源数据库同步到目的数据库,无法保证迁移前后数据一致性。

使用方式

1.安装python环境
2.下载工具包并解压:http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz
3.写好json格式的配置文件
4.进入工具包解压目录下的bin目录,执行命令:python datax.py 你的配置文件

配置文件的实例:

{
    "job": {
        "setting": {
            //设置传输速度,单位为byte/s,DataX运行会尽可能达到该速度但是不超过它
            //channel设置并发程度
            "speed": {
                 "byte": 1048576,
                 "channel":"5",                 
            }
        },
        "content": [
            {
                //Reader配置信息,包括源数据库配置信息,需要迁移的表以及表中相关的列
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "root",
                        "password": "Test12345@",
                        "column": ["*"],
                        "connection": [
                            {
                                "table": ["test_table"],
                                "jdbcUrl": ["jdbc:mysql://192.168.0.115:3306/test"]
                            }
                        ]
                    }
                },
                //writer配置信息,包括目的数据库配置信息,需要写入迁移数据的表,以及表中相关的列
               "writer": {
                    "name": "mysqlwriter",
                    "parameter": {
                        "writeMode": "insert",
                        "username": "test",
                        "password": "123456",
                        "column":["*"],
                        "connection": [
                            {
                                "table": ["test_table"],
                               "jdbcUrl":"jdbc:mysql://192.168.0.110:3306/test?useUnicode=true&characterEncoding=utf8"                                
                            }
                        ]
                    }
                }
            }
        ]
    }
}

1.一个job对应的一个迁移任务,可以理解为一个job就是对一张表的迁移
2.一个job会根据上述配置文件的channel配置切分为多个task去执行迁移操作
3.datax支持分表分库后的数据迁移,上述的jdbcUrl可以配置多个url
4.datax支持大部分数据库的迁移操作,目前支持的reader,writer可以参考:https://github.com/alibaba/DataX/blob/master/introduction.md
5.关系型数据库还支持直接根据sql语句来进行数据迁移同步

插件开发

datax支持writer和reader的定制,实现方法如下(以mysql为例):
1.下载datax项目,新建module子模块
2.编写plugin.json

{
    "name": "mysqlreader",//reader名称
    "class": "com.alibaba.datax.plugin.reader.mysqlreader.MysqlReader",//对应的实现类
    "description": "useScene: prod. mechanism: Jdbc connection using the database, execute select sql, retrieve data from the ResultSet. warn: The more you know about the database, the less problems you encounter.",
    "developer": "alibaba"
}

3.编写实现类,主要是继承抽象类Reader,实现Job、Task两个内部类,Job对应上面配置文件的Job,主要是一些配置信息,数据传输相关操作是实现Task中startRead方法

  public void startRead(Configuration readerSliceConfig,
                              RecordSender recordSender,
                              TaskPluginCollector taskPluginCollector, int fetchSize) {
            String querySql = readerSliceConfig.getString(Key.QUERY_SQL);
            String table = readerSliceConfig.getString(Key.TABLE);
            .....省略部分代码.....
            //获取数据库连接
            Connection conn = DBUtil.getConnection(this.dataBaseType, jdbcUrl,username, password);
            .....省略部分代码.....
            ResultSet rs = null;
            try {
                //根据配置的表名或者sql语句从数据库中读出数据
                rs = DBUtil.query(conn, querySql, fetchSize);
                queryPerfRecord.end();
                ResultSetMetaData metaData = rs.getMetaData();
                columnNumber = metaData.getColumnCount();
                .....省略部分代码.....
                while (rs.next()) {
                    //将结果集中的每一行记录转变为datax内部数据类型(Long,Double,String,Date,Boolean,Bytes),并发送到framework中
                    Record record = buildRecord(recordSender,rs,metaData,columnNumber,mandatoryEncoding,taskPluginCollector); 
                    recordSender.sendToWriter(record);
                }
            }catch (Exception e) {
                throw RdbmsException.asQueryException(this.dataBaseType, e, querySql, table, username);
            } finally {
                DBUtil.closeDBResources(null, conn);
            }
        }

4.将生成的jar包和配置文件放到安装目录下面的plugin目录下即可

你可能感兴趣的:(DataX3.0介绍)