DataX使用、同步HDFS数据到MySQL案例、DataX优化

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

猜你喜欢

转载自blog.csdn.net/Redamancy06/article/details/128048258