起因
事件是这样的,服务商有一批数据,当初的数据量大抵为 2 千万条(单表),每天都会减少数据(减少多少暂不晓得),然而呢给咱们提供的查问不是一张数据表而是一张视图,咱们再依据这个数据对外提供一个查问服务。因为是视图查问的时候就比较慢,咱们也没有权限进行表的优化,所以就须要将数据同步到咱们本地数据库,在本地进行数据表的优化(加索引等等的),然而数据量是 2 千万多,就须要一个工具来把远端数据同步到本地,而后在 github 上发现了 Datax
,就依照文档
依赖关系
- Linux
- JDK(1.8 以上,举荐 1.8)
- Python(2或3都能够)
jdk 装置
JDK1.8 华为镜像下载地址
解压重命名
解压重名为 java1.8
并挪动到 /usr/local
目录下 /usr/local/java1.8
运行环境配置
vim ~/.bashrc# 写入一下内容export JAVA_HOME=/usr/local/java1.8export JRE_HOME=${JAVA_HOME}/jreexport CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/libexport PATH=${JAVA_HOME}/bin:$PATH# 执行 sourcesource ~/.bashrc# 查看版本java -versionjava version "1.8.0_181"Java(TM) SE Runtime Environment (build 1.8.0_181-b13)Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
Python 装置
Python 在 Ubuntu 零碎上曾经默认装置了,能够应用命令 python -V
或 python3 -V
查看以后版本。
能够应用命令 apt install python3
装置 Python3。也能够本人应用编译的形式装置。
datax 装置
DataX Github 地址
Datax 下载地址
能够间接下载工具包,不须要再编译装置,能够间接应用。
验证是否装置胜利
输出
python3 /usr/local/datax/bin/datax.py /usr/local/datax/job/job.json
输入
2022-11-21 14:05:28.828 [job-0] INFO JobContainer - PerfTrace not enable!2022-11-21 14:05:28.829 [job-0] INFO StandAloneJobContainerCommunicator - Total 100000 records, 2600000 bytes | Speed 261.91KB/s, 20000 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.070s | All Task WaitReaderTime 0.068s | Percentage 100.00%2022-11-21 14:05:28.829 [job-0] INFO JobContainer - 工作启动时刻 : 2022-11-21 14:05:18工作完结时刻 : 2022-11-21 14:05:28工作总计耗时 : 10s工作均匀流量 : 253.91KB/s记录写入速度 : 10000rec/s读出记录总数 : 100000读写失败总数 : 0
job.json 文件解析
{ "job": { "content": [ { "reader": { "name": "mysqlreader",# 读端,这个 name 不能 streamreader 会报错的 "parameter": { "username": "",# 用户 "password": "",# 明码 "connection": [ { "jdbcUrl": [],# 连贯信息,貌似能够连贯多个数据库,没有进行测试 "table": []# 数据表 } ], "column": ["*"],# 须要同步的列 (* 示意所有的列) "where": " id >= 500000 and id < 500100 "# 形容筛选条件,多个表时不实用 } }, "writer": { "name": "mysqlwriter",# 写端 "parameter": { "username": "",# 账号 "password": "", # 明码 "writeMode": "insert",# 操作类型,可选:【insert | replace | update】 "connection": [ { "jdbcUrl": "", # 连贯信息,这个连贯信息最好是这样写,否则会出错 "table": []# 数据表 } ], "column": ["*"],# 须要同步的列,要和 reader 中的字段统一 "preSql": [],# 同步前操作,是 sql 语句 "postSql": [],# 同后前操作,是 sql 语句 "session": [] # 设置 session,是 sql 语句 } } } ], "setting": { "speed": { "channel": 1 # 指定并发数,目前不晓得什么作用,有晓得的能够告知下 } } }}
job.json 示例
{ "job": { "content": [ { "reader": { "name": "mysqlreader", "parameter": { "username": "datax2", "password": "datax2", "connection": [ { "jdbcUrl": [ "jdbc:mysql://192.168.0.174:3306/datax2?useUnicode=true&characterEncoding=utf8" ], "table": [ "user" ] } ], "column": [ "*" ] } }, "writer": { "name": "mysqlwriter", "parameter": { "username": "datax", "password": "datax", "writeMode": "insert", "connection": [ { "jdbcUrl": "jdbc:mysql://192.168.0.174:3306/datax?useUnicode=true&characterEncoding=utf8", "table": [ "user" ] } ], "column": [ "*" ] } } } ], "setting": { "speed": { "channel": 2 } } }}
增量同步倡议
对于增量同步数据,倡议每张表有独自的 job.json
配置文件,记录上次同步的最大的 ID,在 reader.where
进行判断 id > last_max_sync_id
。
where 示例,实用于单表的状况:
{ "parameter": { "where": " id > last_max_sync_id " }}
针对失败数据的解决形式
Datax 在同步过程中,失败的数据会写入到 /datax/log/
文件中,并认定为 脏数据
,能够从日志 脏数据
中抽离出失败数据的内容组成 sql
语句,或者找出 主键ID
再去查问同步。
失败数据日志内容如下:
2022-11-22 09:52:50.696 [0-0-0-writer] ERROR StdoutPluginCollector - 脏数据: { "exception":"Incorrect integer value: 'inno' for column 'id' at row 1", "record":[ { "byteSize":8, "index":0, "rawData":"inno", "type":"STRING" }, { "byteSize":32, "index":1, "rawData":"9ddfaac20670c9sda5s1d5a587fc40f104", "type":"STRING" }, { "byteSize":14, "index":2, "rawData":"手持设施调用", "type":"STRING" }, { "byteSize":4, "index":3, "rawData":9243, "type":"LONG" }, { "byteSize":3, "index":4, "rawData":441, "type":"LONG" }, { "byteSize":5, "index":5, "rawData":"admin", "type":"STRING" }, { "byteSize":32, "index":6, "rawData":"49b1d2b5ds1d5a1s1d5a7414890ad2", "type":"STRING" }, { "byteSize":1, "index":7, "rawData":1, "type":"LONG" }, { "byteSize":61, "index":8, "rawData":"[[\"app_id\", \"=\", \"yuan\"], [\"id_name\", \"like\", \"%天华%\"]]", "type":"STRING" }, { "byteSize":127, "index":9, "rawData":"SELECT COUNT(*) AS count FROM `device_request_history` WHERE `app_id` = 'yuan' AND `id_name` LIKE '%天华%' LIMIT 1", "type":"STRING" }, { "byteSize":8, "index":10, "rawData":1668575331000, "type":"DATE" } ], "type":"writer"}
对于读取视图数据到本地的形式
视图读取问题
Datax 能够从 reader 中读取视图数据,然而无奈读取 writer 中的视图数据结构元信息,为了确保数据可能同步胜利,须要先校验数据表构造一致性, Datax 须要判断写入目标表的数据结构是否和读取源数据表的构造统一。
针对视图读取问题解决计划
能够在目标数据库中新建数据表,新建数据表的构造和源数据视图的构造统一,这样 Datax 在校验数据表构造和视图构造一致性时就能够通过。
20000000 条数据实测案例
同步计划
为了不便测试,将 2 千万条数据依照 10 次进行同步(依照本人的理论状况来,能够一次性进行同步)。
计划划分
id > 0 and id <= 2000000id > 2000000 and id <= 4000000id > 4000000 and id <= 6000000id > 6000000 and id <= 8000000id > 8000000 and id <= 10000000id > 10000000 and id <= 12000000id > 12000000 and id <= 14000000id > 14000000 and id <= 16000000id > 16000000 and id <= 18000000id > 18000000 and id <= 20000000
id > 0 and id <= 2000000
这个 id 之间数据有断层。短少 144 条数据。
2022-11-23 14:58:06.418 [job-0] INFO JobContainer -工作启动时刻 : 2022-11-23 14:53:34工作完结时刻 : 2022-11-23 14:58:06工作总计耗时 : 271s工作均匀流量 : 1.28MB/s记录写入速度 : 7406rec/s读出记录总数 : 1999856读写失败总数 : 0
id > 2000000 and id <= 4000000
2022-11-23 15:03:39.879 [job-0] INFO JobContainer -工作启动时刻 : 2022-11-23 14:59:08工作完结时刻 : 2022-11-23 15:03:39工作总计耗时 : 271s工作均匀流量 : 1.28MB/s记录写入速度 : 7407rec/s读出记录总数 : 2000000读写失败总数 : 0
id > 4000000 and id <= 6000000
这个 id 之间数据有断层。短少 13 条数据。
2022-11-23 15:09:38.418 [job-0] INFO JobContainer -工作启动时刻 : 2022-11-23 15:04:56工作完结时刻 : 2022-11-23 15:09:38工作总计耗时 : 282s工作均匀流量 : 1.24MB/s记录写入速度 : 7142rec/s读出记录总数 : 1999987读写失败总数 : 0
id > 6000000 and id <= 8000000
2022-11-23 15:17:05.814 [job-0] INFO JobContainer -工作启动时刻 : 2022-11-23 15:12:14工作完结时刻 : 2022-11-23 15:17:05工作总计耗时 : 291s工作均匀流量 : 1.19MB/s记录写入速度 : 6896rec/s读出记录总数 : 2000000读写失败总数 : 0
id > 8000000 and id <= 10000000
2022-11-23 15:22:41.729 [job-0] INFO JobContainer -工作启动时刻 : 2022-11-23 15:17:30工作完结时刻 : 2022-11-23 15:22:41工作总计耗时 : 311s工作均匀流量 : 1.12MB/s记录写入速度 : 6451rec/s读出记录总数 : 2000000读写失败总数 : 0
id > 10000000 and id <= 12000000
这个 id 之间数据有断层。短少 462 条数据。
2022-11-23 15:29:08.710 [job-0] INFO JobContainer -工作启动时刻 : 2022-11-23 15:23:56工作完结时刻 : 2022-11-23 15:29:08工作总计耗时 : 311s工作均匀流量 : 1.12MB/s记录写入速度 : 6450rec/s读出记录总数 : 1999538读写失败总数 : 0
id > 12000000 and id <= 14000000
2022-11-23 15:34:23.699 [job-0] INFO JobContainer -工作启动时刻 : 2022-11-23 15:29:42工作完结时刻 : 2022-11-23 15:34:23工作总计耗时 : 281s工作均匀流量 : 1.24MB/s记录写入速度 : 7142rec/s读出记录总数 : 2000000读写失败总数 : 0
id > 14000000 and id <= 16000000
2022-11-23 15:39:16.394 [job-0] INFO JobContainer -工作启动时刻 : 2022-11-23 15:34:54工作完结时刻 : 2022-11-23 15:39:16工作总计耗时 : 261s工作均匀流量 : 1.33MB/s记录写入速度 : 7692rec/s读出记录总数 : 2000000读写失败总数 : 0
id > 16000000 and id <= 18000000
2022-11-23 15:45:19.011 [job-0] INFO JobContainer -工作启动时刻 : 2022-11-23 15:40:07工作完结时刻 : 2022-11-23 15:45:19工作总计耗时 : 311s工作均匀流量 : 1.12MB/s记录写入速度 : 6451rec/s读出记录总数 : 2000000读写失败总数 : 0
id > 18000000 and id <= 20000000
2022-11-23 15:51:07.983 [job-0] INFO JobContainer -工作启动时刻 : 2022-11-23 15:45:56工作完结时刻 : 2022-11-23 15:51:07工作总计耗时 : 311s工作均匀流量 : 1.09MB/s记录写入速度 : 6276rec/s读出记录总数 : 1945569读写失败总数 : 0