DataX部署
1.DataX简介
1-1.项目地址
项目地址:GitHub - alibaba/DataX: DataX是阿里云DataWorks数据集成的开源版本。
官方文档:https://github.com/alibaba/DataX/blob/master/introduction.md
1-2.DataX概述
DataX 是阿里云 DataWorks数据集成 的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS, databend 等各种异构数据源之间高效的数据同步功能
DataX本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的Reader插件,以及向目标端写入数据的Writer插件,理论上DataX框架可以支持任意数据源类型的数据同步工作。同时DataX插件体系作为一套生态系统, 每接入一套新数据源该新加入的数据源即可实现和现有的数据源互通
1-3.DataX支持的数据源
DataX目前已经有了比较全面的插件体系,主流的RDBMS数据库、NOSQL、大数据计算系统都已经接入
类型 | 数据源 | Reader(读) | Writer(写) | 文档 |
RDBMS 关系型数据库 | MySQL | √ | √ | |
Oracle | √ | √ | ||
OceanBase | √ | √ | ||
SQLServer | √ | √ | ||
PostgreSQL | √ | √ | ||
DRDS | √ | √ | ||
Kingbase | √ | √ | ||
阿里云数仓数据存储 | ODPS | √ | √ | |
ADB | √ | |||
ADS | √ | |||
OSS | √ | √ | ||
OCS | √ | |||
Hologres | √ | |||
AnalyticDB For PostgreSQL | √ | 写 | ||
阿里云中间件 | datahub | √ | √ | 读 、写 |
SLS | √ | √ | 读 、写 | |
阿里云图数据库 | GDB | √ | √ | |
NoSQL数据存储 | OTS | √ | √ | |
Hbase0.94 | √ | √ | ||
Hbase1.1 | √ | √ | ||
Phoenix4.x | √ | √ | ||
Phoenix5.x | √ | √ | ||
MongoDB | √ | √ | ||
数仓数据存储 | StarRocks | √ | √ | 读 、写 |
ApacheDoris | √ | |||
ClickHouse | √ | 写 | ||
Databend | √ | |||
Hive | √ | √ | ||
kudu | √ | |||
无结构化数据存储 | TxtFile | √ | √ | |
FTP | √ | √ | ||
HDFS | √ | √ | ||
Elasticsearch | √ | |||
时间序列数据库 | OpenTSDB | √ | ||
TSDB | √ | √ | ||
TDengine | √ | √ |
1-4.DataX特点
- 可靠的数据质量监控
- 丰富的数据转换功能
- 精准的速度控制
- 强劲的同步性能
- 健壮的容错机制
- 极简的使用体验
2.DataX原理
2-1.DataX设计理念
异构数据源同步问题,就是不同框架之间同步数据时,相同的数据在不同框架中具有不同的数据结构。
DataX的设计理念:
DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传输载体负责连接数据各种数据源。
当需要接入一个新的数据源的时候,只需要将此数据源对接到DataX,便能跟已有的数据源做到无缝数据同步。
2-2.DataX框架设计
DataX本身作为离线数据同步框架,采用Framework+plugin架构构建。将数据源读取和写入抽象成为Reader/Writer插件,纳入到整个同步框架中
- Reader
- 数据采集模块,负责采集数据源的数据,将数据发送给Framework
- Writer
- 数据写入模块,负责不断从Framework取数据,并将数据写出到目的端。
- Framework
- 主题框架,用于连接Reader和Writer,作为两者的数据传输通道,并处理缓冲、流控、并发、数据转换等核心技术问题
Framework的几大功能
- 缓冲
Reader 和 Writer 可能会有读写速度不一致
的情况,所以中间需要一个组件作为缓冲
- 流控
控制数据传输的速度,DataX 可以随意根据需求调整
数据传输速度
- 并发
并发的同步或写入数据
- 数据转换
既然是异构,那么说明读 Reader 的数据源与 写 Writer 的数据源 数据结构可能不同,数据结构不同的话,需要做数据转换操作,转换也在 Framework 中完成
2-3.DataX运行流程
DataX支持单机多线程模式完成同步作业,下面用一个DataX作业生命周期的时序图,用以说明DataX的运行流程、核心概念以及每个概念的关系
- 核心模块介绍:
- DataX完成单个数据同步的作业,我们称之为Job,DataX接受到一个Job之后,将启动一个进程来完成整个作业同步过程。DataX Job模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子Task)、TaskGroup管理等功能。
- DataXJob启动后,会根据不同的源端切分策略,将Job切分成多个小的Task(子任务),以便于并发执行。Task便是DataX作业的最小单元,每一个Task都会负责一部分数据的同步工作。
- 切分多个Task之后,DataX Job会调用Scheduler模块,根据配置的并发数据量,将拆分成的Task重新组合,组装成TaskGroup(任务组)。每一个TaskGroup负责以一定的并发运行完毕分配好的所有Task,默认单个任务组的并发数量为5。
- 每一个Task都由TaskGroup负责启动,Task启动后,会固定启动Reader—>Channel—>Writer的线程来完成任务同步工作。
- DataX作业运行起来之后, Job监控并等待多个TaskGroup模块任务完成,等待所有TaskGroup任务完成后Job成功退出。否则,异常退出,进程退出值非0
2-4.DataX调度策略
举例来说,用户提交了一个DataX作业,并且配置了20个并发,目的是将一个100张分表的mysql数据同步到odps里面。 DataX的调度决策思路是:
- DataXJob根据分库分表切分成了100个Task。
- 根据20个并发,DataX计算共需要分配4个TaskGroup。
- 4个TaskGroup平分切分好的100个Task,每一个TaskGroup负责以5个并发共计运行25个Task。
3.DataX安装部署
#下载安装包
[root@slave1 ~]# cd soft/
[root@slave1 soft]# wget https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202210/datax.tar.gz
# 解压安装包
[root@slave1 soft]# tar zxvf datax.tar.gz -C /opt
[root@slave1 soft]# cd /opt/datax/
# DataX自检任务
[root@slave1 datax]# python bin/datax.py job/job.json
2023-11-16 08:50:46.089 [job-0] INFO JobContainer -
任务启动时刻 : 2023-11-16 08:50:36
任务结束时刻 : 2023-11-16 08:50:46
任务总计耗时 : 10s
任务平均流量 : 253.91KB/s
记录写入速度 : 10000rec/s
读出记录总数 : 100000
读写失败总数 : 0
4.DataX使用介绍
4-1.同步MySQl全量数据到HDFS案例
将MySQL的全量数据,利用DataX工具同步至HDFS
1.查看MySQL被迁移的数据情况
2.根据需求确定reader为mysqlreader,writer为hdfswriter
查看reader和writer模板的方式(-r 读模板; -w 写模板):
[root@slave1 datax]# python bin/datax.py -r mysqlreader -w hdfswriter
3.编写同步json脚本
4.确定HDFS上目标路径是否存在
5.通过datax.py指定json任务运行同步数据
6.数据验证,查看HDFS上是否已经有MySQL对应表中的所有数据
这里先跑通一个实验案例,再根据操作来总结
- MySQL数据:
[root@slave1 datax]# mysql -uroot -p
Enter password:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test |
+----------------+
1 row in set (0.00 sec)
mysql> select * from test;
+----+---------+
| id | name |
+----+---------+
| 1 | test111 |
| 2 | test222 |
| 3 | test333 |
+----+---------+
3 rows in set (0.00 sec)
- 同步任务定义:
[root@slave1 datax]# vim job/mysql2hdfs.json
mysql2hdfs.json内容:
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": ["id","name"],
"connection": [
{
"jdbcUrl": ["jdbc:mysql://10.10.1.111:3306/test"],
"table": ["test"]
}
],
"password": "123456",
"username": "root",
"splitPk": ""
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"column": [
{"name": "id","type": "bigint"},
{"name": "name","type": "string"}
],
"compress": "gzip",
"defaultFS": "hdfs://10.10.1.110:9000",
"fieldDelimiter": "\t",
"fileName": "test",
"fileType": "text",
"path": "/test",
"writeMode": "append"
}
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}
[root@slave1 datax]# hdfs dfs -mkdir /test
[root@slave1 datax]# python bin/datax.py job/mysql2hdfs.json
...
...
2023-11-16 09:23:15.977 [job-0] INFO JobContainer -
[total cpu info] =>
averageCpu | maxDeltaCpu | minDeltaCpu
-1.00% | -1.00% | -1.00%
[total gc info] =>
NAME | totalGCCount | maxDeltaGCCount | minDeltaGCCount | totalGCTime | maxDeltaGCTime | minDeltaGCTime
PS MarkSweep | 1 | 1 | 1 | 0.039s | 0.039s | 0.039s
PS Scavenge | 1 | 1 | 1 | 0.022s | 0.022s | 0.022s
2023-11-16 09:23:15.977 [job-0] INFO JobContainer - PerfTrace not enable!
2023-11-16 09:23:15.978 [job-0] INFO StandAloneJobContainerCommunicator - Total 3 records, 24 bytes | Speed 2B/s, 0 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.000s | All Task WaitReaderTime 0.000s | Percentage 100.00%
2023-11-16 09:23:15.980 [job-0] INFO JobContainer -
任务启动时刻 : 2023-11-16 09:23:03
任务结束时刻 : 2023-11-16 09:23:15
任务总计耗时 : 12s
任务平均流量 : 2B/s
记录写入速度 : 0rec/s
读出记录总数 : 3
读写失败总数 : 0
- 验证
[root@slave1 datax]# hdfs dfs -ls /test
Found 1 items
-rw-r--r-- 3 root supergroup 43 2023-11-16 09:23 /test/test__dfeac742_8cfb_482f_9282_f458b32e2eac.gz
[root@slave1 datax]# hdfs dfs -get /test/test__dfeac742_8cfb_482f_9282_f458b32e2eac.gz ~
[root@slave1 ~]# gunzip test__dfeac742_8cfb_482f_9282_f458b32e2eac.gz
[root@slave1 ~]# cat test__dfeac742_8cfb_482f_9282_f458b32e2eac
1 test111
2 test222
3 test333
截至到这里,可以看到最终数据文件的内容和原MySQL数据匹配的上
总结:
MysqlReader插件介绍:实现了从Mysql读取数据。在底层实现上,MysqlReader通过JDBC连接远程Mysql数据库,并执行相应的SQL语句将数据从mysql库中select出来。
MysqlReader插件原理:MysqlReader通过JDBC连接器连接到远程的Mysql数据库,并根据用户配置的信息生成查询语句,然后发送到远程Mysql数据库,并将该SQL执行返回结果使用DataX自定义的数据类型拼装为抽象的数据集,并传递给下游Writer处理。
HdfsWriter插件介绍:提供项HDFS文件系统指定路径中写入TextTile和OrcFile类型的文件,文件内容可与Hive表相关联。
HdfsWriter:插件实现过程:首先根据用户指定的path,创建一个hdfs文件系统上的不存在的临时目录,创建规则是:path_随机;然后将读取的文件写入到这个临时目录中;待到全部写入后,再将这个临时目录下的文件移动到用户所指定的目录下,(在创建文件时保证文件名不重复);最后删除临时目录。如果在中间过程中发生网络中断等情况,造成无法与hdfs建立连接,需要用户手动删除已经写入的文件和临时目录
4-2.同步MySQl需求数据到HDFS案例(where)
相对上个案例的变化:
1.增加了where
关键词,过滤同步的数据范围
2.去除了压缩格式:"compress": "gzip"
3.更换了分隔符,由原\t
变成不可见分隔字符\u0001
[root@slave1 datax]# vim job/mysql2hdfs_2.json
mysql2hdfs_2.json脚本内容:
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": ["id","name"],
"connection": [
{
"jdbcUrl": ["jdbc:mysql://10.10.1.110:3306/test"],
"table": ["test"]
}
],
"password": "123456",
"username": "root",
"where": "id>=2",
"splitPk": ""
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"column": [
{"name": "id","type": "bigint"},
{"name": "name","type": "string"}
],
"defaultFS": "hdfs://10.10.1.110:9000",
"fieldDelimiter": "\u0001",
"fileName": "test",
"fileType": "text",
"path": "/test",
"writeMode": "append"
}
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}
[root@slave1 datax]# python bin/datax.py job/mysql2hdfs_2.json
2023-11-16 10:46:20.712 [job-0] INFO JobContainer - PerfTrace not enable!
2023-11-16 10:46:20.713 [job-0] INFO StandAloneJobContainerCommunicator - Total 2 records, 12 bytes | Speed 1B/s, 0 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.000s | All Task WaitReaderTime 0.000s | Percentage 100.00%
2023-11-16 10:46:20.715 [job-0] INFO JobContainer -
任务启动时刻 : 2023-11-16 10:46:09
任务结束时刻 : 2023-11-16 10:46:20
任务总计耗时 : 11s
任务平均流量 : 1B/s
记录写入速度 : 0rec/s
读出记录总数 : 2
读写失败总数 : 0
验证:
[root@slave1 datax]# hdfs dfs -ls /test
Found 2 items
-rw-r--r-- 3 root supergroup 16 2023-11-16 10:46 /test/test__b2ca8d77_bc26_454e_8bce_44fba919eb49
-rw-r--r-- 3 root supergroup 43 2023-11-16 09:23 /test/test__dfeac742_8cfb_482f_9282_f458b32e2eac.gz
[root@slave1 datax]# hdfs dfs -cat /test/test__b2ca8d77_bc26_454e_8bce_44fba919eb49
2test2
3test3
可以看到只有满足id>=2
的2条数据被写入到了HDFS,直接看似乎没有分隔符,字符相连了,把文件下载到本地再次验证
[root@slave1 datax]# hdfs dfs -get /test/test__b2ca8d77_bc26_454e_8bce_44fba919eb49 ~
[root@slave1 ~]# cat test__b2ca8d77_bc26_454e_8bce_44fba919eb49
2test2
3test3
注意,
cat
文件是看不到特殊分隔符的
4-3.同步MySQl需求数据到HDFS案例(传条件参数)
在生产环境中,离线数据同步任务需要在任务调度平台每日定时重复执行去拉取某个时间窗口的数据,例如每日同步T-1的数据到HDFS,但脚本中如果写了固定日期,每日任务都需要修改日期条件,显然不合理。因此为实现这个业务需求,需要使用DataX的传参功能。
创建测试表:
[root@slave1 ~]# mysql -uroot -p123456
mysql> use test;
mysql> create table test_2(id int(11),name varchar(20),updated datetime);
insert into test_2 value(1,"test111","2023-11-14 15:13:42");
insert into test_2 value(2,"test222","2023-11-18 21:22:12");
insert into test_2 value(3,"test333","2023-11-17 09:15:04");
insert into test_2 value(4,"test444","2023-11-17 18:00:32");
insert into test_2 value(5,"test555","2023-11-15 13:44:30");
insert into test_2 value(6,"test666","2023-11-15 22:13:41");
insert into test_2 value(7,"test777","2023-11-16 12:22:30");
insert into test_2 value(8,"test888","2023-11-16 23:14:52");
mysql> select * from test_2;
+------+---------+---------------------+
| id | name | updated |
+------+---------+---------------------+
| 1 | test111 | 2023-11-14 15:13:42 |
| 2 | test222 | 2023-11-18 21:22:12 |
| 3 | test333 | 2023-11-17 09:15:04 |
| 4 | test444 | 2023-11-17 18:00:32 |
| 5 | test555 | 2023-11-15 13:44:30 |
| 6 | test666 | 2023-11-15 22:13:41 |
| 7 | test777 | 2023-11-16 12:22:30 |
| 8 | test888 | 2023-11-16 23:14:52 |
+------+---------+---------------------+
8 rows in set (0.00 sec)
当前时间为20231116,
拟定2个变量:
START_FLAG=date -d"1 day ago" +%Y%m%d
END_FLAG=date +%Y%m%d
[root@slave1 ~]# date -d"1 day ago" +%Y%m%d
20231115
[root@slave1 ~]# date +%Y%m%d
20231116
mysql2hdfs_3.json脚本任务内容:
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": ["id","name","updated"],
"connection": [
{
"jdbcUrl": ["jdbc:mysql://10.10.1.111:3306/test"],
"table": ["test_2"]
}
],
"password": "123456",
"username": "root",
"where": "updated>=${START_FLAG} AND updated<${END_FLAG}",
"splitPk": ""
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"column": [
{"name": "id","type": "bigint"},
{"name": "name","type": "string"}
{"name": "updated","type": "string"}
],
"defaultFS": "hdfs://10.10.1.110:9000",
"fieldDelimiter": "\t",
"fileName": "test",
"fileType": "text",
"path": "/test",
"writeMode": "append"
}
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}
"where": "updated>=${START_FLAG} AND updated<${END_FLAG}"
相当于updated大于等于2023-02-15 00:00:00,小于2023-02-16 00:00:00的数据
当前日期为2月16日,则意为着数据是前一天日内的全量数据
执行任务:
[root@slave1 datax]# python bin/datax.py -p "-DSTART_FLAG=`date -d"1 day ago" +%Y%m%d` -DEND_FLAG=`date +%Y%m%d`" job/mysql2hdfs_3.json
2023-11-16 11:10:38.719 [job-0] INFO JobContainer - PerfTrace not enable!
2023-11-16 11:10:38.720 [job-0] INFO StandAloneJobContainerCommunicator - Total 2 records, 32 bytes | Speed 3B/s, 0 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.000s | All Task WaitReaderTime 0.000s | Percentage 100.00%
2023-11-16 11:10:38.722 [job-0] INFO JobContainer -
任务启动时刻 : 2023-11-16 11:10:26
任务结束时刻 : 2023-11-16 11:10:38
任务总计耗时 : 11s
任务平均流量 : 3B/s
记录写入速度 : 0rec/s
读出记录总数 : 2
读写失败总数 : 0
#验证步骤同上,此处省略
4-4.同步HDFS数据到MySQL案例
准备HDFS文件目录
[root@slave1 ~]# mysql -uroot -p123456
mysql> create table test_666 like test_2;
Query OK, 0 rows affected (0.01 sec)
mysql> desc test_666;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| updated | datetime | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> select * from test_666;
Empty set (0.00 sec)
[root@slave1 datax]# vim job/hdfs2mysql.json
hdfs2mysql.json任务内容:
{
"job": {
"setting": {
"speed": {
"channel": 1
}
},
"content": [
{
"reader": {
"name": "hdfsreader",
"parameter": {
"path": "/test",
"defaultFS": "hdfs://10.10.1.110:9000",
"column": [
{"index":0,"type":"string"},
{"index":1,"type":"string"},
{"index":2,"type":"string"}
],
"fileType": "text",
"encoding": "UTF-8",
"nullFormat": "\\N",
"fieldDelimiter": "\t"
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "replace",
"username": "root",
"password": "123456",
"column": [
"id",
"name",
"updated"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://10.10.1.111:3306/test?useUnicode=true&characterEncoding=utf-8",
"table": [
"test_666"
]
}
]
}
}
}
]
}
}
执行任务:
[root@slave1 datax]# python bin/datax.py job/hdfs2mysql.json
2023-11-16 11:17:33.063 [job-0] INFO JobContainer - PerfTrace not enable!
2023-11-16 11:17:33.064 [job-0] INFO StandAloneJobContainerCommunicator - Total 13 records, 345 bytes | Speed 21B/s, 0 records/s | Error 5 records, 129 bytes | All Task WaitWriterTime 0.000s | All Task WaitReaderTime 0.000s | Percentage 100.00%
2023-11-16 11:17:33.064 [job-0] INFO JobContainer -
任务启动时刻 : 2023-11-16 11:17:20
任务结束时刻 : 2023-11-16 11:17:33
任务总计耗时 : 12s
任务平均流量 : 21B/s
记录写入速度 : 0rec/s
读出记录总数 : 13
读写失败总数 : 5
验证查看MySQL
4-5.同步CSV文件数据倒MySQL案例
- 准备一个csv文件用于同步数据
[root@slave1 ~]# vim prefecture_level_city_quarter.csv
"dbcode","code","cname","ayearmon","regcode","regname","cunit",data,"updatetime"
"djsjd","A0302","社会消费品零售总额_累计增长","2021D","511000","内江市","%",18.2,"2022-02-20 09:29:00"
"djsjd","A0302","社会消费品零售总额_累计增长","2021C","511000","内江市","%",21.1,"2021-11-08 08:14:05"
"djsjd","A0302","社会消费品零售总额_累计增长","2021B","511000","内江市","%",25.1,"2021-07-29 07:23:33"
"djsjd","A0302","社会消费品零售总额_累计增长","2021A","511000","内江市","%",29.9,"2021-07-29 07:23:30"
"djsjd","A0302","社会消费品零售总额_累计增长","2020D","511000","内江市","%",-3.2,"2021-08-02 11:42:00"
"djsjd","A0302","社会消费品零售总额_累计增长","2020B","511000","内江市","%",-7.9,"2021-08-02 11:41:56"
"djsjd","A0302","社会消费品零售总额_累计增长","2020A","511000","内江市","%",-11.9,"2021-08-02 11:41:55"
"djsjd","A0301","社会消费品零售总额_累计值","2021C","511000","内江市","亿元",446.38,"2021-11-08 08:14:05"
"djsjd","A0301","社会消费品零售总额_累计值","2020B","511000","内江市","亿元",232.43,"2021-08-02 11:41:56"
"djsjd","A0301","社会消费品零售总额_累计值","2020A","511000","内江市","亿元",106.81,"2021-08-02 11:41:55"
"djsjd","A0202","城镇常住居民人均可支配收入_累计增长","2016D","511000","内江市","%",8.53,"2018-12-13 05:21:45"
"djsjd","A0202","城镇常住居民人均可支配收入_累计增长","2022A","511000","内江市","%",6.4,"2022-05-11 02:11:47"
"djsjd","A0202","城镇常住居民人均可支配收入_累计增长","2021D","511000","内江市","%",8.9,"2022-05-27 02:14:21"
"djsjd","A0202","城镇常住居民人均可支配收入_累计增长","2021D","511000","内江市","%",8.9,"2022-02-23 08:23:30"
"djsjd","A0202","城镇常住居民人均可支配收入_累计增长","2021C","511000","内江市","%",9.8,"2022-02-23 09:49:27"
这里只提供部分样例数据用于调试
- 创建MySQL库表用于写入数据
-- 创建db
CREATE DATABASE `huatongdata`;
use huatongdata;
-- 创建地级市季度表
create table prefecture_level_city_quarter(
dbcode varchar(50) comment "维度码",
code varchar(200) comment "指标编码",
cname varchar(200) comment "指标名称",
ayearmon varchar(50) comment "时间期",
regcode varchar(50) comment "地区编码",
regname varchar(200) comment "地区名称",
cunit varchar(80) comment "计量单位",
`data` decimal(38,8) comment "数值",
updatetime datetime comment "更新时间"
) comment "地级市季度表";
-- 刚创建的表目前为空
mysql> select * from prefecture_level_city_quarter;
Empty set (0.00 sec)
- 编写任务脚本
[root@slave1 datax]# vim job/csv2mysql.json
{
"job": {
"content": [
{
"reader": {
"name": "txtfilereader",
"parameter": {
"path": ["/root/prefecture_level_city_quarter.csv"],
"encoding":"utf-8",
"column": [
{
"index": 0,
"type": "string"
},
{
"index": 1,
"type": "string"
},
{
"index": 2,
"type": "string"
},
{
"index": 3,
"type": "string"
},
{
"index": 4,
"type": "string"
},
{
"index": 5,
"type": "string"
},
{
"index": 6,
"type": "string"
},
{
"index": 7,
"type": "string"
},
{
"index": 8,
"type": "string"
}
],
"skipHeader": "true"
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"column": [
"dbcode",
"code",
"cname",
"ayearmon",
"regcode",
"regname",
"cunit",
"data",
"updatetime"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://10.10.1.111:3306/huatongdata?useUnicode=true&characterEncoding=utf8",
"table": ["prefecture_level_city_quarter"]
}
],
"password": "123456",
"username": "root",
"preSql":[""],
"session":["set session sql_mode='ANSI'"],
"writeMode":"insert"
}
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}
- 执行同步任务
[root@slave1 datax]# python bin/datax.py job/csv2mysql.json
...
...
2023-11-16 11:31:25.558 [job-0] INFO JobContainer - PerfTrace not enable!
2023-11-16 11:31:25.558 [job-0] INFO StandAloneJobContainerCommunicator - Total 15 records, 953 bytes | Speed 95B/s, 1 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.000s | All Task WaitReaderTime 0.000s | Percentage 100.00%
2023-11-16 11:31:25.559 [job-0] INFO JobContainer -
任务启动时刻 : 2023-11-16 11:31:14
任务结束时刻 : 2023-11-16 11:31:25
任务总计耗时 : 10s
任务平均流量 : 95B/s
记录写入速度 : 1rec/s
读出记录总数 : 15
读写失败总数 : 0
读出记录总数 : 15
说明本次任务同步到MySQL涉及到15行
- 验证
和datax记录总数可以对上,说明CSV文件全部都同步到MySQL
5.DataX常见的参数设置
5-1.加速相关配置
参数 | 说明 | 注意事项 |
job.setting.speed.channel | 设置并发数 | |
job.setting.speed.record | 总record限速 | 配置此参数,则必须配置单个channel的record限速参数 |
job.setting.speed.byte | 总byte限速 | 配置此参数,则必须配置单个channel的byte限速参数 |
core.transport.channel.speed.record | 单个channel的record限速,默认10000条/s |
【注意】:如果配置了总record限速和总byte限速,channel并发数就会失效。因为配置了这两个参数后,实际的channel并发数是通过计算得到的
5-2.运行内存调整
当提升DataX Job内的Channel并发数时,内存的占用会明显增加,因为DataX作为数据交换通道,在内存中会缓存较多的数据。
例如:channel中会有一个Buffer,作为临时的数据交换缓冲区,而在Reader和Write中,也会有一些buffer,为了防止OOM等错误,需要适当调大JVM堆内存
- 永久修改
修改datax.py
# 找到DEFAULT_JVM相关内容更改:-Xms1g -Xmx1g
DEFAULT_JVM = "-Xms1g -Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%s/log" % (DATAX_HOME)
- 当前任务修改
启动时使用参数:python bin/datax.py --jvm = "-Xms8G -Xmx8G” job.json
DataX—Web 部署使用
Datax 的使用过程中,我们会发现,不管是利用 java 调用以及 python 命令启动的方式,我们都无法进行任务的管理,并且每次执行任务前,我们 都需要编辑 Json 配置文件,这是比较繁琐的,随着业务的增加,配置文件 不方便管理和迁移并且每次执行都需要记录命令。 同时目前 DataX 只支持 单机版,无法调用远程的 datax,并且多节点之间的协作不能控制。
因此,开发一款支持远程分布式调用 Datax 的可视化管理工具非常有必要,Datax-Web 就是这样的一款工具。
DataX Web是在DataX之上开发的分布式数据同步工具,提供简单易用的 操作界面,降低用户使用DataX的学习成本,缩短任务配置时间,避免配置过程中出错。用户可通过页面选择数据源即可创建数据同步任务,支持RDBMS、Hive、HBase、ClickHouse、MongoDB等数据源,RDBMS数据源可批量创建数据同步任务,支持实时查看数据同步进度及日志并提供终止同步功能,集成并二次开发xxl-job可根据时间、自增主键增量同步数据。
任务"执行器"支持集群部署,支持执行器多节点路由策略选择,支持超时控制、失败重试、失败告警、任务依赖,执行器CPU.内存.负载的监控等等。后续还将提供更多的数据源支持、数据转换UDF、表结构同步、数据同步血缘等更为复杂的业务场景。
环境要求
- MySQL (5.5+) 必选,对应客户端可以选装, Linux服务上若安装mysql的客户端可以通过部署脚本快速初始化数据库
- JDK (1.8.0_xxx) 必选
- Maven (3.6.1+) 必选
- DataX 必选
- Python (2.x) (支持Python3需要修改替换datax/bin下面的三个python文件,替换文件在doc/datax-web/datax-python3下) 必选,主要用于调度执行底层DataX的启动脚本,默认的方式是以Java子进程方式执行DataX,用户可以选择以Python方式来做自定义的改造
获取安装包
- 下载官方提供的版本tar版本包
点击下载 提取码:cpsk
- 编译打包(官方提供的tar包跳过)
直接从Git上面获得源代码
在项目的根目录下执行如下命令
mvn clean install
执行成功的话可以看到下面的输出
注意如果你的java版本太高可能会有下面的报错,所以建议使用1.8
执行成功后将会在工程的build目录下生成安装包
build/datax-web-{VERSION}.tar.gz
此时的目录结构如下
部署
3-1解压安装包
将压缩包放在选定的安装目录,解压安装包
tar xzvf datax-web-2.1.2.tar.gz
3-2执行安装脚本
进入解压后的目录,找到bin目录下面的install.sh文件,如果选择交互式的安装,则直接执行
./bin/install.sh
#在交互模式下,对各个模块的package压缩包的解压以及configure配置脚本的调用,都会请求用户确认,可根据提示查看是否安装成功,如果没有安装成功,可以重复尝试; 如果不想使用交互模式,跳过确认过程,则执行以下命令安装
./bin/install.sh --force
3-3 数据库初始化
如果你的服务上安装有mysql命令,在执行安装脚本的过程中则会出现
以下提醒:
Scan out mysql command, so begin to initalize the database
Do you want to initalize database with sql: [{INSTALL_PATH}/bin/db/datax-web.sql]? (Y/N)y
Please input the db host(default: 127.0.0.1):
Please input the db port(default: 3306):
Please input the db username(default: root):
Please input the db password(default: ):
Please input the db name(default: exchangis)
按照提示输入数据库地址,端口号,用户名,密码以及数据库名称,大部分情况下即可快速完成初始化。 如果服务上并没有安装mysql命令,则可以取用目录下/bin/db/datax-web.sql脚本去手动执行,完成后修改相关配置文件:
vi ./modules/datax-admin/conf/bootstrap.properties
按照具体情况配置对应的值即可
配置
安装完成之后,
在项目目录:/modules/datax-admin/bin/env.properties 配置邮件服务(可跳过)
MAIL_USERNAME=""
MAIL_PASSWORD=""
此文件中包括一些默认配置参数,例如:server.port,具体请查看文件。在项目目录下/modules/datax-execute/bin/env.properties指定PYTHON_PATH的路径
vi ./modules/{module_name}/bin/env.properties
### 执行datax的python脚本地址
PYTHON_PATH=
### 保持和datax-admin服务的端口一致;默认是9527,如果没改datax-admin的端口,可以忽略
DATAX_ADMIN_PORT=
此文件中包括一些默认配置参数,例如:executor.port,json.path,data.path等,具体请查看文件。
启动服务
5-1 一键启动所有服务
中途可能发生部分模块启动失败或者卡住,可以退出重复执行,如果需要改变某一模块服务端口号,则:
vi ./modules/{module_name}/bin/env.properties
找到SERVER_PORT配置项,改变它的值即可。 当然也可以单一地启动某一模块服务:
./bin/start.sh -m {module_name}
一键取消所有服务
./bin/stop-all.sh
当然也可以单一地停止某一模块服务:
./bin/stop.sh -m {module_name}
查看服务
在Linux环境下使用JPS命令,查看是否出现DataXAdminApplication和DataXExecutorApplication进程,如果存在这表示项目运行成功 如果项目启动失败,请检查启动日志:modules/datax-admin/bin/console.out或者modules/datax-executor/bin/console.out
Tips: 脚本使用的都是bash指令集,如若使用sh调用脚本,可能会有未知的错误
运行
部署完成后,在浏览器中输入 http://ip:port/index.html 就可以访问对应的主界面(ip为datax-admin部署所在服务器ip,port为为datax-admin 指定的运行端口)
输入用户名 admin 密码 123456 就可以直接访问系统
运行日志
部署完成之后,在modules/对应的项目/data/applogs下(用户也可以自己指定日志,修改application.yml中 的logpath地址即可),用户可以根据此日志跟踪项目实际启动情况。如果执行器启动比admin快,执行器会连接失败,日志报"拒绝连接"的错误,一般是先启动admin,再启动executor,30秒之后会重连,如果成功请忽略这个异常。