文章目录
4. DataX使用
4.3 同步HDFS数据到MySQL案例
案例要求:同步HDFS上的/base_province目录下的数据到MySQL gmall 数据库下的test_province表。
需求分析:要实现该功能,需选用HDFSReader和MySQLWriter。
4.3.1 编写配置文件
4.3.1.1 创建配置文件test_province.json
[summer@hadoop102 job]$ vim test_province.json
4.3.1.2 配置文件内容如下
{
"job": {
"content": [
{
"reader": {
"name": "hdfsreader",
"parameter": {
"defaultFS": "hdfs://hadoop102:8020",
"path": "/base_province",
"column": [
"*"
],
"fileType": "text",
"compress": "gzip",
"encoding": "UTF-8",
"nullFormat": "\\N",
"fieldDelimiter": "\t",
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"username": "root",
"password": "******",
"connection": [
{
"table": [
"test_province"
],
"jdbcUrl": "jdbc:mysql://hadoop102:3306/gmall?useUnicode=true&characterEncoding=utf-8"
}
],
"column": [
"id",
"name",
"region_id",
"area_code",
"iso_code",
"iso_3166_2"
],
"writeMode": "replace"
}
}
}
],
"setting": {
"speed": {
"channel": 1
}
}
}
}
4.3.2 配置文件说明
4.3.2.1 Reader参数说明
4.3.2.2 Writer参数说明
没有万能的,看具体业务场景,mysql数据为主就用第三个,采集数据为主就用第二个
insert into,如果没有主键,插入两条相同的数据则会保存两条,如果没有主键,插入两条相同的数据则会报错。
replace into,如何存在主键,将整条数据删除,然后再进行插入
ON DUPLICATE KEY UPDATE 不是将整条数据删除,而是哪列的数据改变了就更新哪列的数据。
4.3.3 提交任务
4.3.3.1 在MySQL中创建gmall.test_province表
DROP TABLE IF EXISTS `test_province`;
CREATE TABLE `test_province` (
`id` bigint(20) NOT NULL,
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`region_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`area_code` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`iso_code` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`iso_3166_2` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
4.3.3.2 执行如下命令
[summer@hadoop102 datax]$ python bin/datax.py job/test_province.json
4.3.4 查看结果
4.3.4.1 DataX打印日志
2022-11-01 15:22:03.041 [job-0] INFO JobContainer -
任务启动时刻 : 2022-11-01 15:21:50
任务结束时刻 : 2022-11-01 15:22:03
任务总计耗时 : 12s
任务平均流量 : 200B/s
记录写入速度 : 9rec/s
读出记录总数 : 96
读写失败总数 : 0
因为在base_province目录里有三个文件,他会嵌套循环,将所有文件都遍历一遍,每个文件里面是有32条数据,一共是96条数据。
4.3.4.1 查看MySQL目标表数据
因为使用了replace关键词,所以会去重。
5. DataX优化
5.1 速度控制
DataX3.0提供了包括通道(并发)、记录流、字节流三种流控模式,可以随意控制你的作业速度,让你的作业在数据库可以承受的范围内达到最佳的同步速度。
关键优化参数如下:
参数 | 说明 |
---|---|
job.setting.speed.channel | 并发数 |
job.setting.speed.record | 总record限速 (tps每秒处理的条数) |
job.setting.speed.byte | 总byte限速 (bps每秒处理的字节数) |
core.transport.channel.speed.record | 单个channel的record限速,默认值为10000(10000条/s) |
core.transport.channel.speed.byte | 单个channel的byte限速,默认值1024*1024(1M/s) |
注意事项:
1.若配置了总record限速,则必须配置单个channel的record限速
2.若配置了总byte限速,则必须配置单个channe的byte限速
3.若配置了总record限速和总byte限速,channel并发数参数就会失效。因为配置了总record限速和总byte限速之后,实际channel并发数是通过计算得到的:
计算公式为:
min(总byte限速/单个channel的byte限速,总record限速/单个channel的record限速)
配置示例:
{
"core": {
"transport": {
"channel": {
"speed": {
"byte": 1048576 //单个channel byte限速1M/s
}
}
}
},
"job": {
"setting": {
"speed": {
"byte" : 5242880 //总byte限速5M/s
}
},
...
}
}
5.2 内存调整
当提升DataX Job内Channel并发数时,内存的占用会显著增加,因为DataX作为数据交换通道,在内存中会缓存较多的数据。例如Channel中会有一个Buffer,作为临时的数据交换的缓冲区,而在部分Reader和Writer的中,也会存在一些Buffer,为了防止OOM等错误,需调大JVM的堆内存。
建议将内存设置为4G或者8G,这个也可以根据实际情况来调整。
调整JVM xms xmx参数的两种方式:一种是直接更改datax.py脚本;另一种是在启动的时候,加上对应的参数,如下:
python datax/bin/datax.py --jvm="-Xms8G -Xmx8G" /path/to/your/job.json