zoukankan      html  css  js  c++  java
  • 数据迁移—datax

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

    toc

    一、基本概念与原理

    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 系统版本 数据库版本 说明
    datax 192.168.0.100 CentOS Linux release 7.6.1810 (Core) - 作为dataX承载系统
    MySQL 192.168.0.150 CentOS release 6.8 (Final) 5.6.21 迁移目标库
    Oracle 192.168.0.50 CentOS 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:
    https://maven.apache.org/download.cgi

    下载dataX:
    dataX存在两种安装方式一种是未编译安装另一种是已编译安装
    这里选择已经编译的安装方法。
    http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz

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

    [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中可以使用的数据源有很多,基本已经包含了常见和应用于大部分生产环境的数据库并且部署较为简单对于数据迁移有很大的提升。





  • 相关阅读:
    翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》 第 6 章:值的不可变性
    翻译 | 带你秒懂内存管理 第一部(共三部)
    基于 Electron 的爬虫框架 Nightmare
    微信小程序教学第三章(含视频):小程序中级实战教程:列表静态页面制作
    翻译 | 使用AFrame打造WebVR版《我的世界》
    微信小程序教学第三章第三节(含视频):小程序中级实战教程:视图与数据关联
    翻译 | 玩转 React 表单 —— 受控组件详解
    翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》 第 5 章:减少副作用
    翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》 第 2 章:函数基础
    一张图告诉你移动Web前端所有技术(工程化、预编译、自动化)
  • 原文地址:https://www.cnblogs.com/plutozzl/p/13366867.html
Copyright © 2011-2022 走看看