DataX

  • 一、 ETL工具
  • 概述
  • 主流ETL工具
  • 二、Datax概述
  • 亮点一:异构数据源
  • DataX 设计
  • 框架设计
  • 亮点二:稳定高效
  • 运行原理
  • 三、DataX的安装
  • 安装
  • 使用
  • 写json文件
  • 任务提交
  • 传参


一、 ETL工具

概述

ETL工具是将数据从来源端经过抽取、转换、装载至目的端的过程。

主流ETL工具

1、DataPipeline
2、Kettle
3、Talend
4、Informatica
5、Datax
6、Oracle Goldengate
7、sqoop

二、Datax概述

DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。

亮点一:异构数据源

DataX 设计

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

datax writeMode类型 datax file_big data

框架设计

datax writeMode类型 datax file_bc_02

  1. Reader:数据采集模块,负责采集数据源的数据,将数据发送给Framework。
  2. Writer:数据写入模块,负责不断向Framework取数据,并将数据写入到目的端。
  3. Framework:用于连接reader和writer,作为两者的数据传输通道,并处理缓冲, 流控,并发,数据转换等核心技术问题。

简单来说,就是datax在数据库之间充当中介的角色,将各种数据类型先转换为datax内部的数据类型,再转换为目标数据库的数据类型,从而解决异构数据源的难题

亮点二:稳定高效

运行原理

datax writeMode类型 datax file_datax writeMode类型_03


1.Job:单个作业的管理节点,负责数据清理、子任务划分、TaskGroup监控管理。

2.Task:由Job切分而来,是DataX作业的最小单元,每个Task负责一部分数据的同步工作。

3.Schedule:将Task组成TaskGroup,单个TaskGroup的并发数量为5。

4.TaskGroup:负责启动Task。

简单来说就是把一个作业拆分成多个任务,让他们并发执行,从而保证其高效,但相对于sqoop基于mapreduce在多台机器分布式运行的方式,datax的效率还是相对较低的,因为datax只能在一台机器运行,但对于目前的大多数企业已经足够了

三、DataX的安装

安装

官方文档

下载地址:http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 源码地址:https://github.com/alibaba/DataX gitcode地址:https://gitcode.net/mirrors/alibaba/datax?utm_source=csdn_github_accelerator

环境要求
1.Linux
2.JDK(1.8以上,推荐1.8)
3.Python(推荐Python2.6.X)

下载
在linux执行

curl -LO http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz
wget http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz安装
1、将datax解压到指定目录

tar -zxvf datax.tar.gz -C /opt/module/

2、运行自检脚本

cd /opt/module/datax/bin/python datax.py /opt/module/datax/job/job.json

出现如下就代表安装成功

datax writeMode类型 datax file_big data_04

datax小坑1,报错如下

datax writeMode类型 datax file_数据源_05


datax writeMode类型 datax file_big data_06

解决方式:将reader和writer目录下的 ._* 这类隐藏文件删除
rm -rf /opt/bigdata/hadoop/server/datax/plugin/*/._*

使用

写json文件

参考官方文档 https://github.com/alibaba/DataX

datax writeMode类型 datax file_mysql_07


只需要参考官方文档的读写写出对应功能的json文件即可

示例 mysql_to_mysql.json:

{
    "job": {
        "setting": {
            "speed": {
                 "channel":1
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "root",
                        "password": "root",
                        "connection": [
                            {
                                "querySql": [
                                    "select `id`, `name`, `email`, `phone`, `gender`, `password`, `age`, `create_time`, `update_time` from app_user"
                                ],
                                "jdbcUrl": [
                                    "jdbc:mysql://192.168.10.100:3306/test_bai?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"
                                ]
                            }
                        ]
                    }
                },
                "writer": {
                    "name": "mysqlwriter",
                    "parameter": {
                        "writeMode": "insert",
                        "username": "root",
                        "password": "root",
                        "column": [
                            "id", "name", "email", "phone", "gender", "password", "age", "create_time", "update_time"
                        ],
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://192.168.10.100:3306/datax?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true",
                                "table": [
                                    "app_user"
                                ]
                            }
                        ]
                    }
                }
            }
        ]
    }
}

任务提交

1.到达datax下的bin目录

cd /opt/module/datax/bin 2.执行datax命令

datax.py ../job/mysql_to_mysql.json

datax writeMode类型 datax file_bc_08


datax小坑2

datax源码默认的Mysql的jdbc驱动是5.X的,如果使用的是mysql8需要将源码下载下来

1.将驱动信息修改为8.X

找到位于 {DataX_source_code_home}/mysqlreader/ 和 {DataX_source_code_home}/mysqlwriter/ 下的 pom.xml文件,将version的值改为8.0.X(可以直接搜索‘mysql-connector-java’快速定位,X写你自己想要的 版本号)

2.修改zeroDateTimeBehavior的值convertToNull 为 CONVERT_TO_NULL:

编辑{DataX_source_code_home}/plugin-rdbms- util/src/main/java/com/alibaba/datax/plugin/rdbms/util/DataBaseType.java

全文替换 convertToNull 为 CONVERT_TO_NULL;

全文替换"com.mysql.jdbc.Driver"为"com.mysql.cj.jdbc.Driver",

3.使用maven重新打包

mvn -U clean package assembly:assembly -Dmaven.test.skip=true

打好的包位于{DataX_source_code_home}/target/datax/datax/

传参

配置文件base_province.json,内容如下

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "connection": [
                            {
                                "jdbcUrl": [
                                    "jdbc:mysql://hadoop102:3306/gmall"
                                ],
                                "querySql": [
                                    "select id,name,region_id,area_code,iso_code,iso_3166_2 from base_province where id>=3"
                                ]
                            }
                        ],
                        "password": "000000",
                        "username": "root"
                    }
                },
                "writer": {
                    "name": "hdfswriter",
                    "parameter": {
                        "column": [
                            {
                                "name": "id",
                                "type": "bigint"
                            },
                            {
                                "name": "name",
                                "type": "string"
                            },
                            {
                                "name": "region_id",
                                "type": "string"
                            },
                            {
                                "name": "area_code",
                                "type": "string"
                            },
                            {
                                "name": "iso_code",
                                "type": "string"
                            },
                            {
                                "name": "iso_3166_2",
                                "type": "string"
                            }
                        ],
                        "compress": "gzip",
                        "defaultFS": "hdfs://hadoop102:8020",
                        "fieldDelimiter": "\t",
                        "fileName": "base_province",
                        "fileType": "text",
                        "path": "/base_province/${dt}",
                        "writeMode": "append"
                    }
                }
            }
        ],
        "setting": {
            "speed": {
                "channel": 1
            }
        }
    }
}

执行如下命令

[atguigu@hadoop102 datax]$ python bin/datax.py -p"-Ddt=2020-06-14" job/base_province.json