数据迁移工具—DataX的部署与使用

一、基本概念与原理

1.什么是DataX

  DataX 是阿里开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。是一个单机多任务的ETL工具
  根据官方文档DataX中可以使用的数据源如下:
在这里插入图片描述

基本上已经包含了所有常见的数据库,

2.DataX的原理

  DataX作为中间传输载体负责连接各种数据源。解决异构数据源同步问题,接入一个新的数据源的时候,只需要将此数据源对接到DataX,便能跟已有的数据源做到无缝数据同步。
架构:

在这里插入图片描述

核心模块介绍:

  • DataX完成单个数据同步的作业,我们称之为Job,DataX接受到一个Job之后,将启动一个进程来完成整个作业同步过程。DataX Job模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子Task)、TaskGroup管理等功能。
  • DataXJob启动后,会根据不同的源端切分策略,将Job切分成多个小的Task(子任务),以便于并发执行。Task便是DataX作业的最小单元,每一个Task都会负责一部分数据的同步工作。
  • 切分多个Task之后,DataX Job会调用Scheduler模块,根据配置的并发数据量,将拆分成的Task重新组合,组装成TaskGroup(任务组)。每一个TaskGroup负责以一定的并发运行完毕分配好的所有Task,默认单个任务组的并发数量为5。
  • 每一个Task都由TaskGroup负责启动,Task启动后,会固定启动Reader—>Channel—>Writer的线程来完成任务同步工作。
  • DataX作业运行起来之后, Job监控并等待多个TaskGroup模块任务完成,等待所有TaskGroup任务完成后Job成功退出。否则,异常退出,进程退出值非0

DataX调度流程:

举例来说,用户提交了一个DataX作业,并且配置了20个并发,目的是将一个100张分表的mysql数据同步到odps里面。 DataX的调度决策思路是:

  • DataXJob根据分库分表切分成了100个Task。
  • 根据20个并发,DataX计算共需要分配4个TaskGroup。
  • 4个TaskGroup平分切分好的100个Task,每一个TaskGroup负责以5个并发共计运行25个Task。

以上参考链接:https://www.jianshu.com/p/f5f0dc99d5ab

二、下载与部署

1.环境规划

主机名IP系统版本数据库版本说明
datax192.168.0.100CentOS Linux release 7.6.1810 (Core)-作为dataX承载系统
MySQL192.168.0.150CentOS release 6.8 (Final)5.6.21迁移目标库
Oracle192.168.0.50CentOS release 6.8 (Final)11.2.0迁移源库

2.资源下载

安装条件:

  • JAVA环境:jdk1.8以上(centos7通常会自带1.8.0的jdk)
  • Python:默认2.7.5即可
  • Apache Maven 3.X

下载Maven:
在这里插入图片描述

下载dataX:
dataX存在两种安装方式一种是未编译安装另一种是已编译安装
这里选择已经编译的安装方法。
在这里插入图片描述

以上下载完成后传入服务器

[root@datax ~]# ls
apache-maven-3.6.3-bin.tar.gz  datax.tar.gz

3.开始安装

3.1 Maven部署
#创建maven存放目录
[root@datax ~]# mkdir /root/maven
#解压压缩包
[root@localhost ~]# tar -zxvf apache-maven-3.6.3-bin.tar.gz -C maven/
[root@datax ~]# cd maven/
[root@datax maven]# ls
apache-maven-3.6.3
[root@datax maven]# mv apache-maven-3.6.3/ maven
[root@datax maven]# ls
maven
[root@datax bin]# pwd
/root/maven/maven/bin
[root@datax bin]# ln -s /root/maven/maven/mvn /usr/bin/mvn
#修改配置文件
[root@datax ~]# vim /etc/profile.d/maven.sh
[root@datax ~]# cat /etc/profile.d/maven.sh 
export M2_HOME=/root/maven/maven
export PATH=${M2_HOME}/bin:${PATH}

3.2 dataX部署

首先检测以下当前环境是否符合安装条件
查看当前java环境:

[root@datax ~]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)

查看当前Python环境:

[root@datax ~]# python --version
Python 2.7.5

查看maven环境:

[root@datax ~]# mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /root/maven/maven
Java version: 1.8.0_181, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"

符合要求,部署DataX

[root@datax ~]# tar -zxvf datax.tar.gz
[root@datax ~]# ls datax
bin  conf  job  lib  plugin  script  tmp
[root@datax ~]# cd datax/
[root@datax datax]# ls
bin  conf  job  lib  plugin  script  tmp
#进行测试,这是软件自带的
[root@datax datax]# python bin/datax.py job/job.json
....
2020-07-23 13:59:23.128 [job-0] INFO  JobContainer - 
任务启动时刻                    : 2020-07-23 13:59:13
任务结束时刻                    : 2020-07-23 13:59:23
任务总计耗时                    :                 10s
任务平均流量                    :          253.91KB/s
记录写入速度                    :          10000rec/s
读出记录总数                    :              100000
读写失败总数                    :                   0

部署完成

三、测试

这里采用同步Oracle数据库中的表到MySQL数据库中具体操作如下:
Oracle:
1)启动监听,测试网络连接是否可用

[oracle@Oracle ~]$ lsnrctl start
[oracle@Oracle ~]$ sqlplus sys/123456@192.168.0.50:1521/proe as sysdba

2)登入数据库创建测试表

SYS@proe>create table dataxtest (id int);

Table created.

SYS@proe>insert into dataxtest (select employee_id from hr.employees);

107 rows created.

SYS@proe>select count(*) from dataxtest;

  COUNT(*)
----------
       107

MySQL:

1)创建库以及对应表注意表结构以及字段一致

mysql> create database dataxtest;
Query OK, 1 row affected (0.02 sec)

mysql> use dataxtest;
Database changed
mysql> create table dataxtest (id int);
Query OK, 0 rows affected (0.03 sec)

2)测试网络连接是否可用

[root@MySQL ~]# mysql -u root -h 192.168.0.150 -P 3306 -p dataxtest

dataX:
1)DataX比较重要的就是配置文件的编写,根据配置文件的内容进行数据的同步。比较人性化的地方就是这个软件可以根据你的输入来为你生成相应配置文件模板供你进行改写。
这里我是从oracle中将数据同步到MySQL所以查看相应的配置文件模板如下:

#因为从Oracle读入,所以oraclereader,写入到MySQL为mysqlwriter
[root@datax bin]# python datax.py -r oraclereader -w mysqlwriter
DataX (DATAX-OPENSOURCE-3.0), From Alibaba !
Copyright (C) 2010-2017, Alibaba Group. All Rights Reserved.

Please refer to the oraclereader document:
     https://github.com/alibaba/DataX/blob/master/oraclereader/doc/oraclereader.md #阿里提供相应的使用说明里面包含哪些参数必要,参数含义等信息

Please refer to the mysqlwriter document:
     https://github.com/alibaba/DataX/blob/master/mysqlwriter/doc/mysqlwriter.md #同上
 
Please save the following configuration as a json file and  use
     python {DATAX_HOME}/bin/datax.py {JSON_FILE_NAME}.json 
to run the job.

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

2)配置文件改写:

[root@datax job]# cp job.json job.json.bk
[root@datax bin]# python datax.py -r oraclereader -w mysqlwriter > ./../job/job.json 
[root@datax job]# vim job.json
[root@datax job]# cat job.json
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "oraclereader", 
                    "parameter": {
                        "column": ["id"], 
                        "connection": [
                            {
                                "jdbcUrl": ["jdbc:oracle:thin:@192.168.0.50:1521:proe"], 
                                "table": ["dataxtest"]
                            }
                        ], 
                        "password": "123456", 
                        "username": "sys as sysdba"
                    }
                }, 
                "writer": {
                    "name": "mysqlwriter", 
                    "parameter": {
                        "column": ["id"], 
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://192.168.0.150:3306/dataxtest", 
                                "table": ["dataxtest"]
                            }
                        ], 
                        "password": "1234", 
                        "preSql": [], 
                        "session": [], 
                        "username": "root", 
                        "writeMode": "insert"
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": "5"
            }
        }
    }
}

3)开始同步:

[root@datax datax]# python bin/datax.py job/job.json

DataX (DATAX-OPENSOURCE-3.0), From Alibaba !
Copyright (C) 2010-2017, Alibaba Group. All Rights Reserved.


2020-07-23 14:39:40.237 [main] INFO  VMInfo - VMInfo# operatingSystem class => sun.management.OperatingSystemImpl
2020-07-23 14:39:40.242 [main] INFO  Engine - the machine info  => 

        osInfo: Oracle Corporation 1.8 25.181-b13
        jvmInfo:        Linux amd64 3.10.0-957.el7.x86_64
        cpu num:        4

        totalPhysicalMemory:    -0.00G
        freePhysicalMemory:     -0.00G
        maxFileDescriptorCount: -1
        currentOpenFileDescriptorCount: -1

        GC Names        [PS MarkSweep, PS Scavenge]

        MEMORY_NAME                    | allocation_size                | init_size                      
        PS Eden Space                  | 256.00MB                       | 256.00MB                       
        Code Cache                     | 240.00MB                       | 2.44MB                         
        Compressed Class Space         | 1,024.00MB                     | 0.00MB                         
        PS Survivor Space              | 42.50MB                        | 42.50MB                        
        PS Old Gen                     | 683.00MB                       | 683.00MB                       
        Metaspace                      | -0.00MB                        | 0.00MB                         
...
WaitWriterTime 0.000s |  All Task WaitReaderTime 0.000s | Percentage 100.00%
2020-07-23 14:39:50.900 [job-0] INFO  JobContainer - 
任务启动时刻                    : 2020-07-23 14:39:40
任务结束时刻                    : 2020-07-23 14:39:50
任务总计耗时                    :                 10s
任务平均流量                    :               32B/s
记录写入速度                    :             10rec/s
读出记录总数                    :                 107
读写失败总数                    :                   0

4)同步成功,在MySQL中查看是否已经同步数据

mysql> select count(*) from dataxtest;
+----------+
| count(*) |
+----------+
|      107 |
+----------+
1 row in set (0.01 sec)

测试成功

四、总结

整个过程需要注意网络是否畅通,以及配置文件编写中哪些参数是必要的。datax中可以使用的数据源有很多,基本已经包含了常见和应用于大部分生产环境的数据库并且部署较为简单对于数据迁移有很大的提升。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐