首页 > 其他分享 >批量数据之DataX数据同步

批量数据之DataX数据同步

时间:2024-01-26 22:12:51浏览次数:23  
标签:1.4 同步 批量 root job DataX MySQL 数据

目录

1 DataX

1.1 引言

有个项目的数据量高达五千万,但是因为报表那块数据不太准确,业务库和报表库又是跨库操作,所以并不能使用 SQL 来进行同步。当时的打算是通过 mysqldump 或者存储的方式来进行同步,但是尝试后发现这些方案都不切实际:

  • mysqldump:不仅备份需要时间,同步也需要时间,而且在备份的过程,可能还会有数据产出(也就是说同步等于没同步)
  • 存储方式:这个效率太慢了,要是数据量少还好,我们使用这个方式的时候,三个小时才同步两千条数据

常见数据异构的几款中间件的区别如下:

Canal Debezium DataX Databus Flinkx Bifrost
实时同步 支持 支持 不支持 支持 支持 支持
增量同步 支持 支持 不支持 支持 支持 支持
写业务逻辑 自己写保存变更数据的代码 自己写保存变更数据的代码 不用写 自己写保存变更数据的代码 自己写保存变更数据的代码 不用写
支持MySQL 支持 支持 支持 支持 支持 支持
活跃度 不高 一般 可以

1.2 DataX 简介

DataX 是阿里云 DataWorks 数据集成 的开源版本,主要就是用于实现数据间的离线同步。 DataX 致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等 各种异构数据源(即不同的数据库) 间稳定高效的数据同步功能。

图片
为了解决异构数据源同步问题,DataX 将复杂的网状同步链路变成了星型数据链路 ,DataX 作为中间传输载体负责连接各种数据源;
当需要接入一个新的数据源时,只需要将此数据源对接到 DataX,便能跟已有的数据源作为无缝数据同步。

1.3 核心

1.3.1 DataX3.0 框架设计

DataX 采用 Framework + Plugin 架构,将数据源读取和写入抽象称为 Reader/Writer 插件,纳入到整个同步框架中。
在这里插入图片描述

角色 作用
Reader(采集模块) 负责采集数据源的数据,将数据发送给 Framework。
Writer(写入模块) 负责不断向 Framework 中取数据,并将数据写入到目的端。
Framework(中间商) 负责连接 Reader 和 Writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。

1.3.2 DataX3.0 核心架构

DataX 完成单个数据同步的作业,我们称为 JobDataX 接收到一个 Job 后,将启动一个进程来完成整个作业同步过程。DataX Job 模块是单个作业的中枢管理节点,承担了数据清理、子任务切分、TaskGroup 管理等功能。
在这里插入图片描述

  • DataX Job 启动后,会根据不同源端的切分策略,将 Job 切分成多个小的 Task (子任务),以便于并发执行。
  • 接着 DataX Job 会调用 Scheduler 模块,根据配置的并发数量,将拆分成的 Task 重新组合,组装成 TaskGroup(任务组)
  • 每一个 Task 都由 TaskGroup 负责启动,Task 启动后,会固定启动 Reader --> Channel --> Writer 线程来完成任务同步工作
  • DataX 作业运行启动后,Job 会对 TaskGroup 进行监控操作,等待所有 TaskGroup 完成后,Job 便会成功退出(异常退出时 值非 0 )

DataX 调度过程:

  • 首先 DataX Job 模块会根据分库分表切分成若干个 Task,然后根据用户配置并发数,来计算需要分配多少个 TaskGroup
  • 计算过程:Task / Channel = TaskGroup,最后由 TaskGroup 根据分配好的并发数来运行 Task(任务)

1.4 使用 DataX 实现数据同步

1.4.1 准备安装

准备工作:

  • JDK(1.8 以上,推荐 1.8)
  • Python(2,3 版本都可以)
  • Apache Maven 3.x(Compile DataX)(手动打包使用,使用 tar 包方式不需要安装)
主机名 操作系统 IP 地址 软件包
MySQL-1 CentOS 7.4 192.168.1.1 jdk-8u181-linux-x64.tar.gz datax.tar.gz
MySQL-2 CentOS 7.4 192.168.1.2

因为 CentOS 7 上自带 Python 2.7 的软件包,所以不需要进行安装。

1.4.2 Linux 上安装 DataX 软件

[root@MySQL-1 ~]# wget http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz
[root@MySQL-1 ~]# tar zxf datax.tar.gz -C /usr/local/
[root@MySQL-1 ~]# rm -rf /usr/local/datax/plugin/*/._*      # 需要删除隐藏文件 (重要)

当未删除时,可能会输出:[/usr/local/datax/plugin/reader/._drdsreader/plugin.json] 不存在. 请检查您的配置文件

验证:

[root@MySQL-1 ~]# cd /usr/local/datax/bin
[root@MySQL-1 ~]# python datax.py ../job/job.json       # 用来验证是否安装成功

输出:

2021-12-13 19:26:28.828 [job-0] INFO  JobContainer - PerfTrace not enable!
2021-12-13 19:26:28.829 [job-0] INFO  StandAloneJobContainerCommunicator - Total 100000 records, 2600000 bytes | Speed 253.91KB/s, 10000 records/s | Error 0 records, 0 bytes |  All Task WaitWriterTime 0.060s |  All Task WaitReaderTime 0.068s | Percentage 100.00%
2021-12-13 19:26:28.829 [job-0] INFO  JobContainer - 
任务启动时刻                    : 2021-12-13 19:26:18
任务结束时刻                    : 2021-12-13 19:26:28
任务总计耗时                    :                 10s
任务平均流量                    :          253.91KB/s
记录写入速度                    :          10000rec/s
读出记录总数                    :              100000
读写失败总数                    :                   0

1.4.3 DataX 基本使用

查看 streamreader --> streamwriter 的模板:

[root@MySQL-1 ~]# python /usr/local/datax/bin/datax.py -r streamreader -w streamwriter
输出:

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


Please refer to the streamreader document:
     https://github.com/alibaba/DataX/blob/master/streamreader/doc/streamreader.md 

Please refer to the streamwriter document:
     https://github.com/alibaba/DataX/blob/master/streamwriter/doc/streamwriter.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": "streamreader", 
                    "parameter": {
                        "column": [], 
                        "sliceRecordCount": ""
                    }
                }, 
                "writer": {
                    "name": "streamwriter", 
                    "parameter": {
                        "encoding": "", 
                        "print": true
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": ""
            }
        }
    }
}

根据模板编写 json 文件

[root@MySQL-1 ~]# cat <<END > test.json
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "streamreader", 
                    "parameter": {
                        "column": [        # 同步的列名 (* 表示所有)
       {
           "type":"string",
    "value":"Hello."
       },
       {
           "type":"string",
    "value":"河北彭于晏"
       },
   ], 
                        "sliceRecordCount": "3"     # 打印数量
                    }
                }, 
                "writer": {
                    "name": "streamwriter", 
                    "parameter": {
                        "encoding": "utf-8",     # 编码
                        "print": true
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": "2"         # 并发 (即 sliceRecordCount * channel = 结果)
            }
        }
    }
}

1.4.4 MySQL 数据库

1.4.4.1 安装

下面是安装mariadb 数据库,点击了解Linux安装MySQL数据库

分别在两台主机上安装:

[root@MySQL-1 ~]# yum -y install mariadb mariadb-server mariadb-libs mariadb-devel   
[root@MySQL-1 ~]# systemctl start mariadb            # 安装 MariaDB 数据库
[root@MySQL-1 ~]# mysql_secure_installation            # 初始化 
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

Enter current password for root (enter for none):       # 直接回车
OK, successfully used password, moving on...
Set root password? [Y/n] y                            # 配置 root 密码
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!
Remove anonymous users? [Y/n] y                     # 移除匿名用户
 ... skipping.
Disallow root login remotely? [Y/n] n                # 允许 root 远程登录
 ... skipping.
Remove test database and access to it? [Y/n] y         # 移除测试数据库
 ... skipping.
Reload privilege tables now? [Y/n] y                    # 重新加载表
 ... Success!

1.4.4.2 准备同步

准备同步数据(要同步的两台主机都要有这个表)

MariaDB [(none)]> create database `course-study`;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create table `course-study`.t_member(ID int,Name varchar(20),Email varchar(30));
Query OK, 0 rows affected (0.00 sec)

因为是使用 DataX 程序进行同步的,所以需要在双方的数据库上开放权限:

grant all privileges on *.* to root@'%' identified by '123123';
flush privileges;

1.4.4.3 创建存储过程:

DELIMITER $$
CREATE PROCEDURE test()
BEGIN
declare A int default 1;
while (A < 3000000)do
insert into `course-study`.t_member values(A,concat("LiSa",A),concat("LiSa",A,"@163.com"));
set A = A + 1;
END while;
END $$
DELIMITER ;

调用存储过程(在数据源配置,验证同步使用):call test();

1.4.5 通过 DataX 实 MySQL 数据同步

1.4.5.1 生成 MySQL 到 MySQL 同步的模板:

[root@MySQL-1 ~]# python /usr/local/datax/bin/datax.py -r mysqlreader -w mysqlwriter
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",       # 读取端
                    "parameter": {
                        "column": [],         # 需要同步的列 (* 表示所有的列)
                        "connection": [
                            {
                                "jdbcUrl": [],       # 连接信息
                                "table": []       # 连接表
                            }
                        ], 
                        "password": "",        # 连接用户
                        "username": "",        # 连接密码
                        "where": ""         # 描述筛选条件
                    }
                }, 
                "writer": {
                    "name": "mysqlwriter",       # 写入端
                    "parameter": {
                        "column": [],         # 需要同步的列
                        "connection": [
                            {
                                "jdbcUrl": "",       # 连接信息
                                "table": []       # 连接表
                            }
                        ], 
                        "password": "",        # 连接密码
                        "preSql": [],         # 同步前. 要做的事
                        "session": [], 
                        "username": "",        # 连接用户 
                        "writeMode": ""        # 操作类型
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": ""          # 指定并发数
            }
        }
    }
}

1.4.5.2 编写 json 文件

[root@MySQL-1 ~]# vim install.json
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader", 
                    "parameter": {
                        "username": "root",
                        "password": "123123",
                        "column": ["*"],
                        "splitPk": "ID",
                        "connection": [
                            {
                                "jdbcUrl": [
                                    "jdbc:mysql://192.168.1.1:3306/course-study?useUnicode=true&characterEncoding=utf8"
                                ], 
                                "table": ["t_member"]
                            }
                        ]
                    }
                }, 
                "writer": {
                    "name": "mysqlwriter", 
                    "parameter": {
                        "column": ["*"], 
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://192.168.1.2:3306/course-study?useUnicode=true&characterEncoding=utf8",
                                "table": ["t_member"]
                            }
                        ], 
                        "password": "123123",
                        "preSql": [
                            "truncate t_member"
                        ], 
                        "session": [
                            "set session sql_mode='ANSI'"
                        ], 
                        "username": "root", 
                        "writeMode": "insert"
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": "5"
            }
        }
    }
}

1.4.5.3 验证

[root@MySQL-1 ~]# python /usr/local/datax/bin/datax.py install.json
输出:

2021-12-15 16:45:15.120 [job-0] INFO  JobContainer - PerfTrace not enable!
2021-12-15 16:45:15.120 [job-0] INFO  StandAloneJobContainerCommunicator - Total 2999999 records, 107666651 bytes | Speed 2.57MB/s, 74999 records/s | Error 0 records, 0 bytes |  All Task WaitWriterTime 82.173s |  All Task WaitReaderTime 75.722s | Percentage 100.00%
2021-12-15 16:45:15.124 [job-0] INFO  JobContainer - 
任务启动时刻                    : 2021-12-15 16:44:32
任务结束时刻                    : 2021-12-15 16:45:15
任务总计耗时                    :                 42s
任务平均流量                    :            2.57MB/s
记录写入速度                    :          74999rec/s
读出记录总数                    :             2999999
读写失败总数                    :                   0

上面的方式相当于是完全同步,但是当数据量较大时,同步的时候被中断,是件很痛苦的事情;
所以在有些情况下,增量同步还是重要的。

1.4.6 使用 DataX 进行增量同步

使用 DataX 进行全量同步和增量同步的唯一区别就是:增量同步需要使用 where 进行条件筛选(即,同步筛选后的 SQL)

1.4.6.1 编写 json 文件

[root@MySQL-1 ~]# vim where.json
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader", 
                    "parameter": {
                        "username": "xxxx",
                        "password": "xxxx",
                        "column": ["*"],
                        "splitPk": "ID",
                        "where": "ID <= 1888",
                        "connection": [
                            {
                                "jdbcUrl": [
                                    "jdbc:mysql://192.168.1.1:3306/course-study?useUnicode=true&characterEncoding=utf8"
                                ], 
                                "table": ["t_member"]
                            }
                        ]
                    }
                }, 
                "writer": {
                    "name": "mysqlwriter", 
                    "parameter": {
                        "column": ["*"], 
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://192.168.1.2:3306/course-study?useUnicode=true&characterEncoding=utf8",
                                "table": ["t_member"]
                            }
                        ], 
                        "password": "xxxx",
                        "preSql": [
                            "truncate t_member"
                        ], 
                        "session": [
                            "set session sql_mode='ANSI'"
                        ], 
                        "username": "xxxx", 
                        "writeMode": "insert"
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": "5"
            }
        }
    }
}

需要注意的部分就是:where(条件筛选) 和 preSql(同步前,要做的事) 参数。

1.4.6.2 验证

[root@MySQL-1 ~]# python /usr/local/data/bin/data.py where.json
输出:

2021-12-16 17:34:38.534 [job-0] INFO  JobContainer - PerfTrace not enable!
2021-12-16 17:34:38.534 [job-0] INFO  StandAloneJobContainerCommunicator - Total 1888 records, 49543 bytes | Speed 1.61KB/s, 62 records/s | Error 0 records, 0 bytes |  All Task WaitWriterTime 0.002s |  All Task WaitReaderTime 100.570s | Percentage 100.00%
2021-12-16 17:34:38.537 [job-0] INFO  JobContainer - 
任务启动时刻                    : 2021-12-16 17:34:06
任务结束时刻                    : 2021-12-16 17:34:38
任务总计耗时                    :                 32s
任务平均流量                    :            1.61KB/s
记录写入速度                    :             62rec/s
读出记录总数                    :                1888
读写失败总数                    :                   0

标签:1.4,同步,批量,root,job,DataX,MySQL,数据
From: https://www.cnblogs.com/jingzh/p/17990832

相关文章

  • getskiplimit 跳过指定条数的数据 ,常用于分页
    //云端代码'usestrict';constdb=uniCloud.database()exports.main=async(event,context)=>{constcollection=db.collection(event.name)constres=awaitcollection.where(event.data).limit(event.limit).get()returnres};//......
  • SpringMVC之域对象共享数据的多种方式
    本次场景演示使用Thymeleaf服务器渲染技术。使用Servlet向域中共享数据@GetMapping("/testServletScope")publicStringtestServlet(HttpServletRequestrequest){request.setAttribute("testServletScope","hello,servlet");return"success&qu......
  • 数据使用二进制数表示的
    对于数据是使用二进制数表示的,我觉得咱们应该是可以达成这个共识的。在这里,想说一下移位运算。移位运算指的就是,将二进制数值的各数位进行左右移位的运算。咱们先来看看左移运算:在十进制的基础上,我们知道,如果一个数向左移动两位,比如1向左移动两位变为100,扩大了10的2次方倍。那么......
  • Oracle 数据库常用操作语句
    一、Oracle数据库操作1、创建数据库   createdatabase databasename2、删除数据库    dropdatabase dbname3、备份数据库完全备份    exp demo/demo@orcl buffer=1024 file=d:\back.dmp full=y   demo:用户名、密码   buffer: 缓存大......
  • 使用debezium-connector-jdbc组件完成数据同步(io.debezium.connector.jdbc.JdbcSinkCo
    1.情景展示在网络上几乎找不到关于debezium-connector-jdbc插件的博客文章,基本上都在吹io.confluent.connect.jdbc.JdbcSinkConnector,由于一开始对数据同步插件并不了解,导致自己走了不少弯路。生产数据组件:debezium-connector-mysql、debezium-connector-oracle等数据库组件,通......
  • C# 动态对象 灵活数据绑定
    //当不想创建类,或者这个类的字段是动态变化的(不确定有多少字段)//可以考虑动态对象,方便好用//此处示例是用DataGrid用的数据源动态绑定ObservableCollection<dynamic>dataSource=newObservableCollection<dynamic>();//创建动态对象dynamicdynamicObject=newExpandoObject(......
  • openGauss学习笔记-208 openGauss 数据库运维-常见故障定位案例-TPCC高并发长稳运行因
    openGauss学习笔记-208openGauss数据库运维-常见故障定位案例-TPCC高并发长稳运行因脏页刷盘效率导致性能下降208.1TPCC高并发长稳运行因脏页刷盘效率导致性能下降208.1.1问题现象TPCC高并发长稳运行因脏页刷盘效率导致性能下降,具体表现为:初始性能较高,随着运行时间增加,数据......
  • 对接 50+ 快递商,快递鸟电子面单 API 助力商家多平台批量打单发货
    随着物流业从数字信息化走向智能化,在发货环节,电子面单已经替换纸质面单成为标配。然而,在实际操作过程中,客户往往希望与多家快递公司合作发货,这时他们就需要自行和各家快递公司一一对接,过程繁琐。此外,有些客户发货量大,快递员贴单效率低,还需要手动回填快递单号到系统,体验不好。快递鸟......
  • MySQL数据库精选(从入门使用到底层结构)
    基本使用MySQL通用语法及分类DDL:数据定义语言,用来定义数据库对象(数据库、表、字段)DML:数据操作语言,用来对数据库表中的数据进行增删改DQL:数据查询语言,用来查询数据库中表的记录DCL:数据控制语言,用来创建数据库用户、控制数据库的控制权限DDL(数据定义语言)数据定义......
  • 数据库恢复技术||故障的种类和恢复的实现技术以及恢复策略
    故障的种类:事务内部的故障:包括预期和非预期的事务内部错误。系统故障:导致系统停止运行的事件,如硬件错误、操作系统故障、DBMS代码错误等。介质故障:外存故障,如磁盘损坏、磁头碰撞等。计算机bing毒:人为制造的程序,可能对数据库造成破坏。恢复的实现技术:数据转储:定期将数据库复制到其他......