Datax 数据同步-使用总结(二)

一、前言

这部分主要记录 datax 实现增量同步的方案。

二、核心思路

结合datax 提供的preSql、 postSql以及占位符,外加另外一张表同步日志表来记录相关同步信息。

三、版本迭代

3.1 初版本

sql 复制代码
where tbq.opera_date > cast(date_format(DATE_SUB(NOW(), interval 5 minute), '%Y%m%d%H%i%s000') as unsigned)"

这个版本,是直接以执行时时间为时间戳。

缺点,显而易见。当同步时间比较久的时候,5 分钟就远远不够。

3.2 版本

阅读 datax 的使用说明里,对于 mysql 的写,支持 presql 和 postsql 的方式。

因此考虑新建一个表,

  1. 在同步之前,利用 preSql,往该表中插入一条数据记录,记录同步开始时间。
  2. 同步完成后,利用 postSql 更新当前同步的这条记录,记录同步结束时间
  3. 读取时,从该表中获取上次同步开始时间的数据,作为同步时间戳。
    最终 json 脚本变成如下
json 复制代码
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "column": [
                            xxxx
			],
                        "connection": [
                            {
                                xxxx
                            }
                        ],
			"where":" update_date > (select l.sync_start_date from sys_sync_log l where l.sync_business_type = 'gongdan' and l.sync_result = 1 order by l.sync_start_date desc limit 1)",
                    }
                },
                "writer": {
                    "name": "mysqlwriter",
                    "parameter": {
                        "column": [
                            xxx
			],
                        "connection": [
                          {
                                xxxx
                          }
                        ],
			"preSql":[
				"insert into sys_sync_log(sync_start_date,sync_result) values(now(),2)"
			],
			"postSql":[
				"update sys_sync_log l set l.sync_end_date = now(),l.sync_result = 1 where l.id = ( select t.id from (select l1.id from sys_sync_log l1 where l1.sync_result = 2 order by l1.sync_start_date desc limit 1) t )"
			],
			"writerMode":"replace"
                    }
                }
            }
        ],
        "setting": {
            "speed": {
                "channel": "5"
            }
        }
    }
}

此版本相对于上个版本,时间戳的获取上,比较固定,能避免因为同步代码问题,导致时间戳获取不准。

3.3 版本

上述版本写的相对复杂,需要先查询当前同步记录之后,再更新同步结束时间。无法保证一致性,即preSql 的插入的记录和 postSql 更新记录,可能不是同一个记录。

再结合 datax 的占位符特性,可以将记录的主键由外部传入。

因此 json 脚本变成

json 复制代码
{
	"preSql":[
		"insert into sys_sync_log(id,sync_start_date,sync_result) values('${logId}',now(),2)"
	],
	"postSql":[
		"update sys_sync_log l set l.sync_end_date = now(),l.sync_result = 1 where l.id = '${logId}'"
	],
}

其中 ${logId}为占位符

liunx 中通过 uuidgen 命令可以获取 uuid。

因此执行同步脚本时,参考如下命令执行即可

shell 复制代码
python ../bin/datax.py -p "-DlogId=`uuidgen`" ./ssss.json

其中-p "-DlogId=uuidgen" 为获取 uuid,并传给 sss.json中

这个版本,可以保证 preSql 和 postSql 处理的记录,是同一条。

四、扩展

应该还有更优方案,还需继续研究。

相关推荐
派可数据BI可视化4 小时前
数据指标与标签在数据分析中的关系与应用
大数据·数据仓库·商业智能bi
Kika写代码10 小时前
【大数据技术基础】 课程 第8章 数据仓库Hive的安装和使用 大数据基础编程、实验和案例教程(第2版)
大数据·数据仓库·hive
ProtonBase10 小时前
分布式 Data Warebase - 构筑 AI 时代数据基石
大数据·数据库·数据仓库·人工智能·分布式·数据分析·数据库系统
Francek Chen1 天前
【大数据技术基础 | 实验十二】Hive实验:Hive分区
大数据·数据仓库·hive·hadoop·分布式
青云交1 天前
大数据新视界 -- Hive 数据仓库:构建高效数据存储的基石(下)(2/ 30)
大数据·数据仓库·hive·数据安全·数据分区·数据桶·大数据存储
SelectDB技术团队2 天前
兼顾高性能与低成本,浅析 Apache Doris 异步物化视图原理及典型场景
大数据·数据库·数据仓库·数据分析·doris
soso19682 天前
DataWorks快速入门
大数据·数据仓库·信息可视化
B站计算机毕业设计超人2 天前
计算机毕业设计SparkStreaming+Kafka旅游推荐系统 旅游景点客流量预测 旅游可视化 旅游大数据 Hive数据仓库 机器学习 深度学习
大数据·数据仓库·hadoop·python·kafka·课程设计·数据可视化
Yz98762 天前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发