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,便能跟已有的数据源做到无缝数据同步。
框架设计
- Reader:数据采集模块,负责采集数据源的数据,将数据发送给Framework。
- Writer:数据写入模块,负责不断向Framework取数据,并将数据写入到目的端。
- Framework:用于连接reader和writer,作为两者的数据传输通道,并处理缓冲, 流控,并发,数据转换等核心技术问题。
简单来说,就是datax在数据库之间充当中介的角色,将各种数据类型先转换为datax内部的数据类型,再转换为目标数据库的数据类型,从而解决异构数据源的难题
亮点二:稳定高效
运行原理
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小坑1,报错如下
解决方式:将reader和writer目录下的 ._* 这类隐藏文件删除rm -rf /opt/bigdata/hadoop/server/datax/plugin/*/._*
使用
写json文件
参考官方文档 https://github.com/alibaba/DataX
只需要参考官方文档的读写写出对应功能的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小坑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