异源数据同步 → 如何获取 DataX 已同步数据量?
开心一刻
今天,表妹问我:哥,我男朋友过两天要生日了,你们男生一般喜欢什么,帮忙推荐个礼物呗
我:预算多少
表妹:预算300
我:20块买条黑丝,剩下280给自己买支口红,你男朋友生日那天你都给自己用上
表妹:秒啊,哥
我:必须的嘛,你要知道男人最懂男人!

前情回顾
关于异源数据同步工具 DataX,我已经写了好几篇文章
异构数据源同步之数据同步 → datax 改造,有点意思
异构数据源同步之数据同步 → datax 再改造,开始触及源码
异构数据源同步之数据同步 → DataX 使用细节
异构数据源数据同步 → 从源码分析 DataX 敏感信息的加解密
异源数据同步 → DataX 为什么要支持 kafka?
推荐大家去看看,可以对 DataX 有个基本的了解,掌握其基本使用;示例代码:qsl-datax
需求背景
假设我们基于 XXL-JOB 实现调度,qsl-datax-hook 作为 XXL-JOB 执行器的同时也充当 DataX 的拉起方,三者调用关系如下

离线同步的数据量往往会很大,少则上万,多则上亿,所以同步过程一般会持续很长时间,如何确认同步仍在进行中呢?我们可以看日志,也可以查目标表的记录数,但都不够直观,好的实现方式应该是有同步任务查看页面,通过该页面可以查看到正在同步中的任务,以及这些任务已同步的数据量,所以问题就来到
如何获取 DataX 已同步数据量?
已同步数据量
换做是你们,你们会如何实现?或者说有什么思路?我提供下我的方案,是不是也是你们所想
DataX 的 Writer 往目标源写数据的时候,一次写多少数据我们就记录多少,然后累加并持久化,是不是就可以实时查看当前的已同步数据量呢?
具体如何实现了,我们可以基于 DataX 的日志来实现;我们在讲 异构数据源同步之数据同步 → datax 再改造,开始触及源码 的时候,对日志进行了调整,qsl-datax-hook 能够获取 DataX 进程的日志输出,所以我们只需要在 DataX 往目标源写入数据完成后往日志中写入一条记录(写入了多少数量),qsl-datax-hook 就能够获取该记录,从而得到写入数据量,然后进行累加操作;我们以 mysqlwriter 为例,来看看通过代码到底如何实现
writer 往日志中写
同步数据量从哪里找切入点,我就不绕弯子了

跟进
startWriteWithConnection,有如下代码
可以看到是批量写入的,继续跟进
doBatchInsert
分两种情况
正常情况,批量插入并 commit 成功
异常情况,先回滚批量插入,然后通过
doOneInsert
逐条插入
所以在哪里写
同步数据量的日志是不是清楚了,有两个地方需要写doBatchInsert批量插入 commit 之后写日志
doOneInsert单条插入后写日志
DataX 就算改造好了,是不是很简单?
qsl-datax-hook 读取 DataX 日志中的
同步数据量并持久化com.qsl.hook.DataXManager#exec适配改造下即可
做持久化的时候一定要采用
update table_name set sync_rows = sync_rows + syncRows;
的方式,利用数据库的锁来避免并发问题,而采用 set 具体的值
update table_name set sync_rows = totalSyncRows;
会有并发覆盖问题,比如第一次将总量更新成 50000,而第二次可能将总量更新成 48000
至此,需求就算基本完成了;其他类型的 DataX writer 可以采用类似的方式来实现,具体就不演示了,你们自行去实现
总结
如果目标源支持事务,那么 已同步数据量 可以实现的很准确,如果目标源不支持事务,那么 已同步数据量 实现的就不会很准确,或者说实现难度非常高;文中讲到的日志方式,只是实现方式之一,还有其他的实现方式,例如
定时读取目标源的数据量
改造DataX,直接持久化
已同步数据量update table_name set sync_rows = sync_rows + syncRows;
各种方式都有其优势,也存在其弊端,需要结合业务选择合适的方式
异源数据同步 → 如何获取 DataX 已同步数据量?的更多相关文章
- MySQL主从复制——主库已有数据的解决方案
在上篇文章中我们介绍了基于Docker的Mysql主从搭建,一主多从的搭建过程就是重复了一主一从的从库配置过程,需要注意的是,要保证主从库my.cnf中server-id的唯一性.搭建完成后,可以在主 ...
- 使用 DataX 增量同步数据(转)
关于 DataX DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hive.ADS.HBase.Tab ...
- 【转】SQL SERVER 主体,已同步
转自郭大侠博客: https://www.cnblogs.com/gered/p/10601202.html 目录 SQL SERVER 基于数据库镜像的主从同步... 1 1.概念... 2 1. ...
- C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]
C#同步SQL Server数据库中的数据 1. 先写个sql处理类: using System; using System.Collections.Generic; using System.Dat ...
- Windows Phone 同步方式获取网络类型
原文:Windows Phone 同步方式获取网络类型 在Windows Phone 开发中有时候需要获取设备当前连接网络的类型,是Wifi,还是2G,3G,或者4G,SDK中提供获取网络类型的API ...
- 如何在silverlight中以同步方式 获取sharepoint2013站点的当前登录账号
最近有个项目用到了silverlight要同步方式获取当前登录账号.异步的方式无法跟其他应用结合.主要先后顺序问题.但是silverlight非常不好获取到当前登录账号.即使获取到了也是异步方式获取. ...
- maven 私服同步无法获取依赖的pom.xml的依赖
项目中引入了依赖: <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hado ...
- 通过FEDERATED存储引擎同步两实例间的表数据
需求情景:实例1中A库中的三个视图是实例2中的B库所依赖的,B需要A库中三个视图的实时数据. 方案:通过FEDERATED来完成跨势力的查询FEDERATED存储引擎表只会创建表结构,不会存储表数据, ...
- 分布式数据库数据从属与client与server的数据同步
老实说,眼下市面上很多产品,的确是不成熟的产品. 用过一些,给人蛋痛的感觉. 导言 分布还是集总 今天我们来探讨一个非常重要的问题. 每一个程序猿都有其思想,我的思想之中的一个,就是分布式. 分布式, ...
- 根据start和limit从已有的数据列表中获取从start开始的limit个数据
代码记录(需求:根据start和limit从已有的数据列表中获取从start开始的limit个数据) 已有的数据列表:这个数据列表是经过处理的,可能是在SQL查询时无法处理的如多条件排序,而排序条件需 ...
随机推荐
- Codeforces Round894.D
题目:D. Ice Cream Balls 题目链接:https://codeforces.com/contest/1862/problem/D 思路:二分找到当所有冰淇淋球类型不同的情况下,假设记位 ...
- games101 作业4及作业5 详解光线追踪框架
games101 作业4及作业5 详解光线追踪框架 作业4 代码分析 作业四的代码整体比较简单 主要流程就是 通过鼠标事件 获取四个控制点的坐标 然后绘制贝塞尔曲线的内容就由我们来完成 理论分析 贝塞 ...
- 100ASK_IMX6ULL arm板子如何显示图片、汉字、划线、背景色
最近在研究基于imx6ull开发板,想让开发板支持显示图片.字符串.背景色的功能. 操作的主要步骤如下: 移植设备树和驱动 移植libjpeg库 编写测试程序 一.移植设备树和驱动 开发板原厂SDK已 ...
- 一键k8s企业级集群部署(以k8s的1.18.0版本为例)
一.下载安装sealos wget https://github.com/fanux/sealos/releases/download/v3.2.0-beta.2/sealos && ...
- Transformer模型:Position Embedding实现
在自然语言处理(NLP)中,Transformer 模型是一个非常重要的里程碑,它通过自注意力(self-attention)机制极大地提高了处理序列数据的能力.在 Transformer 模型中,词 ...
- TwinCAT3 - 实现自己的Dictionary
目录 1,前言 2,C#的字典 3,TwinCAT3的字典 定义功能块 添加方法 4,用起来 1,前言 C#有字典,TwinCAT没字典,咋办,自己写一个咯 2,C#的字典 C#的字典使用很简单,下面 ...
- 使用 updateAppConfig 更新 Nuxt 应用配置
title: 使用 updateAppConfig 更新 Nuxt 应用配置 date: 2024/8/27 updated: 2024/8/27 author: cmdragon excerpt: ...
- Kubernetes-9:Service介绍及演示
Service Kubernetes 的Service定义了这样一种抽象:一个 Pod 的逻辑分组,一种可以访问他们的策略 -- 微服务,这一组Pod能够被Service访问到,通常是通过tabel ...
- html 跳转到新的网址
更新window.location.href后面的值即可 文件名为 index.html <!DOCTYPE html> <html> <head> <met ...
- C语言数据的存储
目录 类型的基本归类 整形在内存中的存储 原码.反码.补码 大小端介绍 练习 浮点型在内存中的存储 浮点数存储的例子 浮点数存储规则 类型的基本归类 整形家族: char unsigned char ...