前言
前面已经说明全量表适用DataX工具进行同步,因此对DataX进行一个简单的学习
一、DataX简介
1.DataX概述
DataX 是一个离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。
2.DataX支持的数据源
从图上看,数仓用到的数据源基本上都支持。
二、DataX架构原理
1.DataX设计理念
为了解决异构数据源(异构数据源指的是相同的数据在不同的地方存储的结构不同)同步问题,DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传输载体负责连接各种数据源。当需要接入一个新的数据源的时候,只需要将此数据源对接到DataX,便能跟已有的数据源做到无缝数据同步(这里不管是从哪里读的数据,统统转化为DataX规定的结构,再根据要写入的数据源的类型,转化为对应的结构)。
2.DataX框架设计
DataX本身作为离线数据同步框架,采用Framework + plugin架构构建。将数据源读取和写入抽象成为Reader/Writer插件,纳入到整个同步框架中。
FrameWork是整个的核心,不管数据源从哪来,到这里都转化为固定的数据结构
PS:流控:速度的控制
3.DataX运行流程
下图是一个DataX作业生命周期的时序图:
一个Job是一个进程,一个Task是一个线程
4.DataX调度决策思路
举一个例子,用户提交了一个DataX作业(一个Job),并且配置了总的并发度为20,目的是对一个有100张分表(默认1张表为一个Task,实际上一张表可以继续切分为多个Task)的mysql数据源进行同步。DataX的调度决策思路是:
1)DataX Job根据分库分表切分策略,将同步工作分成100个Task。
2)根据配置的总的并发度20(可以同时运行20个Task),以及每个Task Group的并发度5(每个Task Group可以同时运行5个Task),DataX计算共需要分配4个TaskGroup。
3)4个TaskGroup平分100个Task,每一个TaskGroup负责运行25个Task。
5.DataX和Sqoop对比
功能 | DataX | Sqoop |
---|---|---|
运行模式 | 单进程多线程 | MR |
分布式 | 不支持,可以通过调度系统规避 | 支持(MR就是分布式) |
流控 | 有流控功能 | 需要定制 |
统计信息 | 已有一些统计,上报需定制 | 没有,分布式的数据收集不方便 |
数据校验 | 在core部分有校验功能 | 没有,分布式的数据收集不方便 |
监控 | 需要定制 | 需要定制 |
综上,DataX功能更加强大,速度更加快,但是DataX对于数据格式的支持较少(只支持gzip压缩格式,lzo等都不支持)
三、DataX部署
1.下载安装
第一步,先下载,下载地址:http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz
第二步,解压:tar -zxvf datax.tar.gz -C /opt/module/
第三步,自检:python /opt/module/datax/bin/datax.py /opt/module/datax/job/job.json
出现如下内容,则表明安装成功:
四、DataX使用
1.DataX任务提交命令
命令:python bin/datax.py path/to/your/job.json (job.json是自己编写的同步文件)
2.DataX配置文件格式
查看DataX配置文件模板命令:python bin/datax.py -r mysqlreader -w hdfswriter
上面的mysqlreader和hdfswriter可以根据自己的需要修改为对应的输入源和输出源
上图是查询给出的模板,json最外层是一个job,job包含setting和content两部分,setting是对整个job的配置,content是用于配置数据源和数据的目的地。
还可以通过官方文档查看对应的Reader和Writer的具体参数:https://github.com/alibaba/DataX/blob/master/README.md https://gitee.com/mirrors/DataX/blob/master/README.md
点击对应的读、写,可以查看对应的参数
3.DataX传参
通常情况下,离线数据同步任务需要每日定时重复执行,故HDFS上的目标路径通常会包含一层日期,以对每日同步的数据加以区分,也就是说每日同步数据的目标路径不是固定不变的,因此DataX配置文件中HDFS Writer的path参数的值应该是动态的。为实现这一效果,就需要使用DataX传参的功能。
DataX传参的用法如下,在JSON配置文件中使用${param}引用参数,在提交任务时使用-p"-Dparam=value"
传入参数值,具体示例如下:
在需要动态传入参数的地方这样写:
"fileType": "text",
"path": "/base_province/${dt}",
"writeMode": "append"
其中dt就是要传入的参数名
在提交任务时,使用命令:python bin/datax.py -p"-Ddt=2020-06-14" job/base_province.json
五、DataX案例
1.同步MySQL数据到HDFS案例
案例需求:同步gmall数据库中base_province表数据到HDFS的/base_province目录
需求分析:要实现该功能,需选用MySQLReader和HDFSWriter,MySQLReader具有两种模式分别是TableMode和QuerySQLMode,前者使用table,column,where等属性声明需要同步的数据;后者使用一条SQL查询语句声明需要同步的数据。
1)使用TableMode方式实现
首先,创建配置文件:vim /opt/module/datax/job/base_province.json
编写配置文件:
{
"job": {
"setting": {
"speed": {
"channel": 1
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"column": [
"id",
"name",
"region_id",
"area_code",
"iso_code",
"iso_3166_2"
],
"where":"id>=3",
"splitPk": "id",
"connection": [
{
"table": [