简介

DataX是一个数据同步工具,可以将数据从一个地方读取出来并以极快的速度写入另外一个地方。常见的如将mysql中的数据同步到另外一个mysql中,或者另外一个mongodb中。

工作流程

  • read:设置一个源,DataX从源读取数据
  • write:设置一个目的地,DataX将读取到的数据写入目的地
  • setting:同步设置,如设置并发通道、控制作业速度等
  • Framework:Framework用于连接reader和writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题
  • 多线程:充分利用多线程来处理同步任务

核心架构

核心模块介绍

1:DataX完成单个数据同步的作业,我们称之为Job,DataX接受到一个Job之后,将启动一个进程来完成整个作业同步过程。DataX Job模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子Task)、TaskGroup管理等功能。

2:DataXJob启动后,会根据不同的源端切分策略,将Job切分成多个小的Task(子任务),以便于并发执行。Task便是DataX作业的最小单元,每一个Task都会负责一部分数据的同步工作。

3:切分多个Task之后,DataX Job会调用Scheduler模块,根据配置的并发数据量,将拆分成的Task重新组合,组装成TaskGroup(任务组)。每一个TaskGroup负责以一定的并发运行完毕分配好的所有Task,默认单个任务组的并发数量为5

4:每一个Task都由TaskGroup负责启动,Task启动后,会固定启动Reader—>Channel—>Writer的线程来完成任务同步工作

5:DataX作业运行起来之后, Job监控并等待多个TaskGroup模块任务完成,等待所有TaskGroup任务完成后Job成功退出。否则,异常退出,进程退出值非0

DataX调度流程

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

  • DaXJob根据分库分表切分成了100个Task。

  • 根据20个并发,DataX计算共需要分配4个TaskGroup。

  • 4个TaskGroup平分切分好的100个Task,每一个TaskGroup负责以5个并发共计运行25个Task。

支持的数据

类型 数据源 Reader(读) Writer(写) 文档
RDBMS 关系型数据库 MySQL
Oracle
OceanBase
SQLServer
PostgreSQL
DRDS
达梦
通用RDBMS(支持所有关系型数据库)
阿里云数仓数据存储 ODPS
ADS
OSS
OCS
NoSQL数据存储 OTS
Hbase0.94
Hbase1.1
MongoDB
Hive
无结构化数据存储 TxtFile
FTP
HDFS
Elasticsearch

实践

作为极简教程,本文将从mysql中读取一张表的数据,然后同步到clickhouse中。

下载

打开该项目的Github 首页进行下载:https://github.com/alibaba/DataX

下载链接:https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz

下载下来是一个tar.gz的包,windows下解压命令:


tar -zxvf xxx.tar.gz

程序目录:

  • bin:使用里面的 datax.py 来启动程序
  • job:里面放了一个job.json,用来检查运行环境,一般的建议下载完毕之后执行一次。
  • log:存放执行日志
  • plugin:插件集,插件分为read和write,分别对应datax可支持的数据库
  • 其他目录:......

环境

DataX是基于python和java的,需要机器拥有python和java 的运行环境。

在下载完毕后,通过执行自检脚本,可确认环境是否正确



 python {YOUR_DATAX_HOME}/bin/datax.py {YOUR_DATAX_HOME}/job/job.json

执行流程

编写同步任务配置文件,在job目录中创建 mysql-to-clickhouse.json 文件,并填入如下内容



{
    "job": {
        "setting": {
            "speed": {
                "channel": 3
            },
            "errorLimit": {
                "record": 0,
                "percentage": 0.02
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "xxx",
                        "password": "xxx",
                        "column": [
                            "id",
                            "name"
                        ],
                        "splitPk": "id",
                        "connection": [
                            {
                                "table": [
                                    "table_name"
                                ],
                                "jdbcUrl": [
                                    "jdbc:mysql://192.168.1.xxx:xxx/db_name"
                                ]
                            }
                        ]
                    }
                },
                "writer": {
                    "name": "clickhousewriter",
                    "parameter": {
                        "username": "xxx",
                        "password": "xxx",
                        "column": [
                            "id",
                            "ame"
                        ],
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:clickhouse://192.168.1.xxx:xxx/table_name",
                                "table": [
                                    "table_name"
                                ]
                            }
                        ],
                        "preSql": [],
                        "postSql": [],
                        "batchSize": 65536,
                        "batchByteSize": 134217728,
                        "dryRun": false,
                        "writeMode": "insert"
                    }
                }
            }
        ]
    }
}
  • job:一个job包含两个部分,setting中设置任务的执行速度,错误限制等,content中是任务具体的描述。
  • reader:任务的数据输入源
  • writer:任务的数据输出源

根据任务配置文件启动datax,先cd到datax的根目录


python bin/datax.py job/mysql-to-clickhouse.json

运行上述命令后,任务就开启了。本例从mysql数据库中的一张表中读取了两个字段(id,name),然后同步到clickhouse中,clickhouse中需要先创建同样的库,表和列。

任务执行非常快,140W数据仅用了 18s 就完成了同步。



2024-05-16 16:24:57.312 [job-0] INFO  JobContainer -
任务启动时刻                    : 2024-05-16 16:24:38
任务结束时刻                    : 2024-05-16 16:24:57
任务总计耗时                    :                 18s
任务平均流量                    :            2.21MB/s
记录写入速度                    :         142425rec/s
读出记录总数                    :             1424252
读写失败总数                    :                   0

引用

阿里DataX极简教程的更多相关文章

  1. Typora极简教程

    Typora极简教程 ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转换成有效的 HTML 文档.” ...

  2. CentOS安装使用.netcore极简教程(免费提供学习服务器)

    本文目标是指引从未使用过Linux的.Neter,如何在CentOS7上安装.Net Core环境,以及部署.Net Core应用. 仅针对CentOS,其它Linux系统类似,命令环节稍加调整: 需 ...

  3. Asky极简教程:零基础1小时学编程,已更新前8节

    Asky极简架构 开源Asky极简架构.超轻量级.高并发.水平扩展.微服务架构 <Asky极简教程:零基础1小时学编程>开源教程 零基础入门,从零开始全程演示,如何开发一个大型互联网系统, ...

  4. Python 极简教程(八)字符串 str

    由于字符串过于重要,请认真看完并保证所有代码都至少敲过一遍. 对于字符串,前面在数据类型中已经提到过.但是由于字符串类型太过于常用,Python 中提供了非常多的关于字符串的操作.而我们在实际编码过程 ...

  5. Nginx 极简教程(快速入门)

    作者:dunwu github.com/dunwu/nginx-tutorial 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计模式内容聚合 4.  ...

  6. 【转】Typora极简教程

    Typora极简教程 Typora download ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转 ...

  7. nginx极简教程

    Nginx 极简教程 本项目是一个 Nginx 极简教程,目的在于帮助新手快速入门 Nginx. examples 目录中的示例模拟了工作中的一些常用实战场景,并且都可以通过脚本一键式启动,让您可以快 ...

  8. NodeJS 极简教程 <1> NodeJS 特点 & 使用场景

    NodeJS 极简教程 <1> NodeJS 特点 & 使用场景 田浩 因为看开了所以才去较劲儿.   1. NodeJS是什么 1.1 Node.js is a JavaScri ...

  9. 自制 os 极简教程1:写一个操作系统有多难

    为什么叫极简教程呢?听我慢慢说 不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了 ...

  10. python极简教程04:进程和线程

    测试奇谭,BUG不见. 大家好,我是谭叔. 这一场,主讲python的进程和线程. 目的:掌握初学必须的进程和线程知识. 进程和线程的区别和联系 终于开始加深难度,来到进程和线程的知识点~ 单就这两个 ...

随机推荐

  1. OpenHarmony 3.2 Beta多媒体系列——视频录制

    一.简介 媒体子系统为开发者提供了媒体相关的很多功能,本文针对其中的视频录制功能做个详细的介绍.首先,我将通过媒体子系统提供的视频录制Test代码作为切入点,给大家梳理一下整个录制的流程. 二.目录 ...

  2. 国产化改造就用 Java Solon,v2.7.3 发布

    Java Solon 是什么框架? 是一个可平替 Spring 生态的 Java 应用开发框架.从零开始构建(非 java-ee 架构),有自己的标准规范与开放生态.(历时七年,具备全球第二级别的生态 ...

  3. 格式化字符串走过的坑 pwn109

    格式化字符串走过的坑 pwn109 今天做的一道题有一个坑我调试半天终于打通了,格式化字符串的坑,确实不少,东西也比较多容易忘记,怎么说呢,功夫在平时,经验少了 老规矩先看一下保护 Full RELR ...

  4. 【FAQ】视频编辑服务常见问题及解答

    Q1问题描述 1. 访问贴纸等素材的时候提示"网络异常,请重试"怎么办? 2. 使用AI能力时,提示"errorCode:20124 errorMsg:Method no ...

  5. IDEA快捷键快速补齐类和对象名

    CTRL+ALT+V  ----------快速补齐 类和对象名 如:   new String("123") 光标放到最后 按下快捷键补齐为红色部分  String s = ne ...

  6. MogDB/openGauss如何实现事务的rollback

    MogDB/openGauss 如何实现事务的 rollback 本文出处:https://www.modb.pro/db/113262 数据库最主要的功能就是存储数据,然而我们在进行数据库操作时,却 ...

  7. 全新适配鸿蒙生态,Cocos引擎助力3D应用开发

    原文链接:https://mp.weixin.qq.com/s/rCACesJ4QxRuU2NRjIvbDQ,点击链接查看更多技术内容: 一.适配HarmonyOS背景 HarmonyOS 3.1版本 ...

  8. 如何在HarmonyOS对数据库进行备份,恢复与加密

    数据库备份与恢复 场景介绍 当应用在处理一项重要的操作,显然是不能被打断的.例如:写入多个表关联的事务.此时,每个表的写入都是单独的,但是表与表之间的事务关联性不能被分割. 如果操作的过程中出现问题, ...

  9. 从零开始写 Docker(十一)---实现 mydocker exec 进入容器内部

    本文为从零开始写 Docker 系列第十一篇,实现类似 docker exec 的功能,使得我们能够进入到指定容器内部. 完整代码见:https://github.com/lixd/mydocker ...

  10. 论文研究区域图的制作方法:ArcGIS

      本文介绍基于ArcMap软件,绘制论文中研究区域示意图.概况图等的方法.   最近需要绘制与地学有关论文.文献中的研究区域概况图.对于这一类图片,我个人比较喜欢基于ArcMap与PPT结合的方式来 ...