文章目录
- 4. DataX使用
- 4.1 DataX使用概述
- 4.1.1 DataX任务提交命令
- 4.1.2 DataX配置文件格式
- 4.2 同步MySQL数据到HDFS案例
- 4.2.1 MySQLReader之TableMode
- 4.2.1.1 编写配置文件
- 4.2.1.1.1 创建配置文件base_province.json
- 4.2.1.1.2 配置文件内容如下
- 4.2.1.2 配置文件说明
- 4.2.1.2.1 Reader参数说明
- 4.2.1.2.2 Writer参数说明
- 4.2.1.2.3 Setting参数说明
- 4.2.1.3 提交任务
- 4.2.1.3.1 在HDFS创建/base_province目录
- 4.2.1.3.2 执行如下命令
- 4.2.1.4 查看结果
- 4.2.1.4.1 DataX打印日志
- 4.2.1.4.2 查看HDFS文件
- 4.2.2 MySQLReader之QuerySQLMode
- 4.2.2.1 编写配置文件
- 4.2.2.1.1 创建配置文件base_province_sql.json
- 4.2.2.1.2 配置文件内容如下
- 4.2.2.2 配置文件说明
- 4.2.2.2.1 Reader参数说明
- 4.2.2.3 提交任务
- 4.2.2.3.1 执行如下命令
- 4.2.2.4 查看结果
- 4.2.2.4.1 DataX打印日志
- 4.2.2.4.2 查看HDFS文件
- 4.2.3 DataX传参
- 4.2.3.1 编写配置文件
- 4.2.3.1.1 修改配置文件base_province.json
- 4.2.3.1.2 配置文件内容如下
- 4.2.3.2 提交任务
- 4.2.3.2.1 创建目标路径
- 4.2.3.2.2 执行如下命令
- 4.2.3.3 查看结果
- 4.2.3.3.1 DataX打印日志
- 4.2.3.3.2 查看HDFS文件
4. DataX使用
4.1 DataX使用概述
4.1.1 DataX任务提交命令
&emps; DataX的使用十分简单,用户只需根据自己同步数据的数据源和目的地选择相应的Reader和Writer,并将Reader和Writer的信息配置在一个json文件中,然后执行如下命令提交数据同步任务即可。
4.1.2 DataX配置文件格式
可以使用如下命名查看DataX配置文件模板
[summer@hadoop102 datax]$ python bin/datax.py -r mysqlreader -w hdfswriter
配置文件模板如下,json最外层是一个job,job包含setting和content两部分,其中setting用于对整个job进行配置,content用户配置数据源和目的地。
Reader和Writer的具体参数可参考官方文档,地址如下:
https://github.com/alibaba/DataX/blob/master/README.md
4.2 同步MySQL数据到HDFS案例
案例要求:同步gmall数据库中base_province表数据到HDFS的/base_province目录
需求分析:要实现该功能,需选用MySQLReader和HDFSWriter,MySQLReader具有两种模式分别是TableMode和QuerySQLMode,前者使用table,column,where等属性声明需要同步的数据;后者使用一条SQL查询语句声明需要同步的数据。
下面分别使用两种模式进行演示。
4.2.1 MySQLReader之TableMode
4.2.1.1 编写配置文件
4.2.1.1.1 创建配置文件base_province.json
[summer@hadoop102 job]$ vim base_province.json
4.2.1.1.2 配置文件内容如下
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": [
"id",
"name",
"region_id",
"area_code",
"iso_code",
"iso_3166_2"
],
"where": "id>=3",
"connection": [
{
"jdbcUrl": [
"jdbc:mysql://hadoop102:3306/gmall"
],
"table": [
"base_province"
]
}
],
"password": "******",
"splitPk": "",
"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",
"writeMode": "append"
}
}
}
],
"setting": {
"speed": {
"channel": 1
}
}
}
}
4.2.1.2 配置文件说明
4.2.1.2.1 Reader参数说明
4.2.1.2.2 Writer参数说明
注意事项:
HFDS Writer并未提供nullFormat参数:也就是用户并不能自定义null值写到HFDS文件中的存储格式。默认情况下,HFDS Writer会将null值存储为空字符串(‘’),而Hive默认的null值存储格式为\N。所以后期将DataX同步的文件导入Hive表就会出现问题。
解决该问题的方案有两个:
一是修改DataX HDFS Writer的源码,增加自定义null值存储格式的逻辑,可参考https://blog.csdn.net/u010834071/article/details/105506580
二是在Hive中建表时指定null值存储格式为空字符串(‘’),例如:
DROP TABLE IF EXISTS base_province;
CREATE EXTERNAL TABLE base_province
(
`id` STRING COMMENT '编号',
`name` STRING COMMENT '省份名称',
`region_id` STRING COMMENT '地区ID',
`area_code` STRING COMMENT '地区编码',
`iso_code` STRING COMMENT '旧版ISO-3166-2编码,供可视化使用',
`iso_3166_2` STRING COMMENT '新版IOS-3166-2编码,供可视化使用'
) COMMENT '省份表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
NULL DEFINED AS ''
LOCATION '/base_province/';
4.2.1.2.3 Setting参数说明
4.2.1.3 提交任务
4.2.1.3.1 在HDFS创建/base_province目录
使用DataX向HDFS同步数据时,需确保目标路径已存在
[summer@hadoop102 datax]$ hadoop fs -mkdir /base_province
4.2.1.3.2 执行如下命令
[summer@hadoop102 datax]$ python bin/datax.py job/base_province.json
4.2.1.4 查看结果
4.2.1.4.1 DataX打印日志
2022-11-01 10:04:57.049 [job-0] INFO JobContainer -
任务启动时刻 : 2022-11-01 10:04:44
任务结束时刻 : 2022-11-01 10:04:57
任务总计耗时 : 12s
任务平均流量 : 66B/s
记录写入速度 : 3rec/s
读出记录总数 : 32
读写失败总数 : 0
4.2.1.4.2 查看HDFS文件
[summer@hadoop102 datax]$ hadoop fs -cat /base_province/base_province__7bc8739d_ed75_40a6_b2f3_95e1cccf4281.gz | zcat
3 山西 1 140000 CN-14 CN-SX
4 内蒙古 1 150000 CN-15 CN-NM
5 河北 1 130000 CN-13 CN-HE
6 上海 2 310000 CN-31 CN-SH
7 江苏 2 320000 CN-32 CN-JS
8 浙江 2 330000 CN-33 CN-ZJ
9 安徽 2 340000 CN-34 CN-AH
10 福建 2 350000 CN-35 CN-FJ
11 江西 2 360000 CN-36 CN-JX
12 山东 2 370000 CN-37 CN-SD
14 台湾 2 710000 CN-71 CN-TW
15 黑龙江 3 230000 CN-23 CN-HL
16 吉林 3 220000 CN-22 CN-JL
17 辽宁 3 210000 CN-21 CN-LN
18 陕西 7 610000 CN-61 CN-SN
19 甘肃 7 620000 CN-62 CN-GS
20 青海 7 630000 CN-63 CN-QH
21 宁夏 7 640000 CN-64 CN-NX
22 新疆 7 650000 CN-65 CN-XJ
23 河南 4 410000 CN-41 CN-HA
24 湖北 4 420000 CN-42 CN-HB
25 湖南 4 430000 CN-43 CN-HN
26 广东 5 440000 CN-44 CN-GD
27 广西 5 450000 CN-45 CN-GX
28 海南 5 460000 CN-46 CN-HI
29 香港 5 810000 CN-91 CN-HK
30 澳门 5 820000 CN-92 CN-MO
31 四川 6 510000 CN-51 CN-SC
32 贵州 6 520000 CN-52 CN-GZ
33 云南 6 530000 CN-53 CN-YN
13 重庆 6 500000 CN-50 CN-CQ
34 西藏 6 540000 CN-54 CN-XZ
4.2.2 MySQLReader之QuerySQLMode
4.2.2.1 编写配置文件
4.2.2.1.1 创建配置文件base_province_sql.json
4.2.2.1.2 配置文件内容如下
{
"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": "******",
"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",
"writeMode": "append"
}
}
}
],
"setting": {
"speed": {
"channel": 1
}
}
}
}
4.2.2.2 配置文件说明
4.2.2.2.1 Reader参数说明
4.2.2.3 提交任务
4.2.2.3.1 执行如下命令
[summer@hadoop102 datax]$ python bin/datax.py job/base_province_sql.json
4.2.2.4 查看结果
4.2.2.4.1 DataX打印日志
2022-11-01 10:48:46.975 [job-0] INFO JobContainer -
任务启动时刻 : 2022-11-01 10:48:35
任务结束时刻 : 2022-11-01 10:48:46
任务总计耗时 : 11s
任务平均流量 : 66B/s
记录写入速度 : 3rec/s
读出记录总数 : 32
读写失败总数 : 0
4.2.2.4.2 查看HDFS文件
3 山西 1 140000 CN-14 CN-SX
4 内蒙古 1 150000 CN-15 CN-NM
5 河北 1 130000 CN-13 CN-HE
6 上海 2 310000 CN-31 CN-SH
7 江苏 2 320000 CN-32 CN-JS
8 浙江 2 330000 CN-33 CN-ZJ
9 安徽 2 340000 CN-34 CN-AH
10 福建 2 350000 CN-35 CN-FJ
11 江西 2 360000 CN-36 CN-JX
12 山东 2 370000 CN-37 CN-SD
14 台湾 2 710000 CN-71 CN-TW
15 黑龙江 3 230000 CN-23 CN-HL
16 吉林 3 220000 CN-22 CN-JL
17 辽宁 3 210000 CN-21 CN-LN
18 陕西 7 610000 CN-61 CN-SN
19 甘肃 7 620000 CN-62 CN-GS
20 青海 7 630000 CN-63 CN-QH
21 宁夏 7 640000 CN-64 CN-NX
22 新疆 7 650000 CN-65 CN-XJ
23 河南 4 410000 CN-41 CN-HA
24 湖北 4 420000 CN-42 CN-HB
25 湖南 4 430000 CN-43 CN-HN
26 广东 5 440000 CN-44 CN-GD
27 广西 5 450000 CN-45 CN-GX
28 海南 5 460000 CN-46 CN-HI
29 香港 5 810000 CN-91 CN-HK
30 澳门 5 820000 CN-92 CN-MO
31 四川 6 510000 CN-51 CN-SC
32 贵州 6 520000 CN-52 CN-GZ
33 云南 6 530000 CN-53 CN-YN
13 重庆 6 500000 CN-50 CN-CQ
34 西藏 6 540000 CN-54 CN-XZ
4.2.3 DataX传参
通常情况下,离线数据同步任务需要每日定时重复执行,故HDFS上的目标路径通常会包含一层日期,以对每日同步的数据加以区分,也就是说每日同步数据的目标路径不是固定不变的,因此DataX配置文件中HDFS Writer的path参数的值应该是动态的。为实现这一效果,就需要使用DataX传参的功能。
DataX传参的用法如下,在JSON配置文件中使用${param}引用参数,在提交任务时使用-p"-Dparam=value"传入参数值,具体示例如下。
4.2.3.1 编写配置文件
4.2.3.1.1 修改配置文件base_province.json
[summer@hadoop102 job]$ vim base_province.json
4.2.3.1.2 配置文件内容如下
{
"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": "******",
"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
}
}
}
}
主要是修改这个地方
4.2.3.2 提交任务
4.2.3.2.1 创建目标路径
[summer@hadoop102 datax]$ hadoop fs -mkdir /base_province/2020-06-14
4.2.3.2.2 执行如下命令
[summer@hadoop102 datax]$ python bin/datax.py -p"-Ddt=2020-06-14" job/base_province.json
4.2.3.3 查看结果
4.2.3.3.1 DataX打印日志
2022-11-01 11:07:54.556 [job-0] INFO JobContainer -
任务启动时刻 : 2022-11-01 11:07:43
任务结束时刻 : 2022-11-01 11:07:54
任务总计耗时 : 11s
任务平均流量 : 66B/s
记录写入速度 : 3rec/s
读出记录总数 : 32
读写失败总数 : 0
4.2.3.3.2 查看HDFS文件
3 山西 1 140000 CN-14 CN-SX
4 内蒙古 1 150000 CN-15 CN-NM
5 河北 1 130000 CN-13 CN-HE
6 上海 2 310000 CN-31 CN-SH
7 江苏 2 320000 CN-32 CN-JS
8 浙江 2 330000 CN-33 CN-ZJ
9 安徽 2 340000 CN-34 CN-AH
10 福建 2 350000 CN-35 CN-FJ
11 江西 2 360000 CN-36 CN-JX
12 山东 2 370000 CN-37 CN-SD
14 台湾 2 710000 CN-71 CN-TW
15 黑龙江 3 230000 CN-23 CN-HL
16 吉林 3 220000 CN-22 CN-JL
17 辽宁 3 210000 CN-21 CN-LN
18 陕西 7 610000 CN-61 CN-SN
19 甘肃 7 620000 CN-62 CN-GS
20 青海 7 630000 CN-63 CN-QH
21 宁夏 7 640000 CN-64 CN-NX
22 新疆 7 650000 CN-65 CN-XJ
23 河南 4 410000 CN-41 CN-HA
24 湖北 4 420000 CN-42 CN-HB
25 湖南 4 430000 CN-43 CN-HN
26 广东 5 440000 CN-44 CN-GD
27 广西 5 450000 CN-45 CN-GX
28 海南 5 460000 CN-46 CN-HI
29 香港 5 810000 CN-91 CN-HK
30 澳门 5 820000 CN-92 CN-MO
31 四川 6 510000 CN-51 CN-SC
32 贵州 6 520000 CN-52 CN-GZ
33 云南 6 530000 CN-53 CN-YN
13 重庆 6 500000 CN-50 CN-CQ
34 西藏 6 540000 CN-54 CN-XZ