文章目录
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-0110:48:46.975[job-0]INFO JobContainer -任务启动时刻:2022-11-0110:48:35任务结束时刻:2022-11-0110:48:46任务总计耗时: 11s
任务平均流量: 66B/s
记录写入速度: 3rec/s
读出记录总数:32读写失败总数:0
4.2.2.4.2 查看HDFS文件
3 山西 1140000CN-14CN-SX4 内蒙古 1150000CN-15CN-NM5 河北 1130000CN-13CN-HE6 上海 2310000CN-31CN-SH7 江苏 2320000CN-32CN-JS8 浙江 2330000CN-33CN-ZJ9 安徽 2340000CN-34CN-AH10 福建 2350000CN-35CN-FJ11 江西 2360000CN-36CN-JX12 山东 2370000CN-37CN-SD14 台湾 2710000CN-71CN-TW15 黑龙江 3230000CN-23CN-HL16 吉林 3220000CN-22CN-JL17 辽宁 3210000CN-21CN-LN18 陕西 7610000CN-61CN-SN19 甘肃 7620000CN-62CN-GS20 青海 7630000CN-63CN-QH21 宁夏 7640000CN-64CN-NX22 新疆 7650000CN-65CN-XJ23 河南 4410000CN-41CN-HA24 湖北 4420000CN-42CN-HB25 湖南 4430000CN-43CN-HN26 广东 5440000CN-44CN-GD27 广西 5450000CN-45CN-GX28 海南 5460000CN-46CN-HI29 香港 5810000CN-91CN-HK30 澳门 5820000CN-92CN-MO31 四川 6510000CN-51CN-SC32 贵州 6520000CN-52CN-GZ33 云南 6530000CN-53CN-YN13 重庆 6500000CN-50CN-CQ34 西藏 6540000CN-54CN-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
版权归原作者 Redamancy_06 所有, 如有侵权,请联系我们删除。