开心一刻

今天,表妹问我:哥,我男朋友过两天要生日了,你们男生一般喜欢什么,帮忙推荐个礼物呗
我:预算多少
表妹:预算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 为例,来看看通过代码到底如何实现

  1. writer 往日志中写 同步数据量

    从哪里找切入点,我就不绕弯子了

    跟进 startWriteWithConnection,有如下代码

    可以看到是批量写入的,继续跟进 doBatchInsert

    分两种情况

    1. 正常情况,批量插入并 commit 成功

    2. 异常情况,先回滚批量插入,然后通过 doOneInsert

      逐条插入

    所以在哪里写 同步数据量 的日志是不是清楚了,有两个地方需要写

    1. doBatchInsert 批量插入 commit 之后写日志

    2. doOneInsert 单条插入后写日志

    DataX 就算改造好了,是不是很简单?

  2. 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 可以采用类似的方式来实现,具体就不演示了,你们自行去实现

总结

如果目标源支持事务,那么 已同步数据量 可以实现的很准确,如果目标源不支持事务,那么 已同步数据量 实现的就不会很准确,或者说实现难度非常高;文中讲到的日志方式,只是实现方式之一,还有其他的实现方式,例如

  1. 定时读取目标源的数据量

  2. 改造DataX,直接持久化 已同步数据量

    update table_name set sync_rows = sync_rows + syncRows;

各种方式都有其优势,也存在其弊端,需要结合业务选择合适的方式

异源数据同步 → 如何获取 DataX 已同步数据量?的更多相关文章

  1. MySQL主从复制——主库已有数据的解决方案

    在上篇文章中我们介绍了基于Docker的Mysql主从搭建,一主多从的搭建过程就是重复了一主一从的从库配置过程,需要注意的是,要保证主从库my.cnf中server-id的唯一性.搭建完成后,可以在主 ...

  2. 使用 DataX 增量同步数据(转)

    关于 DataX DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hive.ADS.HBase.Tab ...

  3. 【转】SQL SERVER 主体,已同步

    转自郭大侠博客:  https://www.cnblogs.com/gered/p/10601202.html 目录 SQL SERVER 基于数据库镜像的主从同步... 1 1.概念... 2 1. ...

  4. C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]

    C#同步SQL Server数据库中的数据 1. 先写个sql处理类: using System; using System.Collections.Generic; using System.Dat ...

  5. Windows Phone 同步方式获取网络类型

    原文:Windows Phone 同步方式获取网络类型 在Windows Phone 开发中有时候需要获取设备当前连接网络的类型,是Wifi,还是2G,3G,或者4G,SDK中提供获取网络类型的API ...

  6. 如何在silverlight中以同步方式 获取sharepoint2013站点的当前登录账号

    最近有个项目用到了silverlight要同步方式获取当前登录账号.异步的方式无法跟其他应用结合.主要先后顺序问题.但是silverlight非常不好获取到当前登录账号.即使获取到了也是异步方式获取. ...

  7. maven 私服同步无法获取依赖的pom.xml的依赖

    项目中引入了依赖: <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hado ...

  8. 通过FEDERATED存储引擎同步两实例间的表数据

    需求情景:实例1中A库中的三个视图是实例2中的B库所依赖的,B需要A库中三个视图的实时数据. 方案:通过FEDERATED来完成跨势力的查询FEDERATED存储引擎表只会创建表结构,不会存储表数据, ...

  9. 分布式数据库数据从属与client与server的数据同步

    老实说,眼下市面上很多产品,的确是不成熟的产品. 用过一些,给人蛋痛的感觉. 导言 分布还是集总 今天我们来探讨一个非常重要的问题. 每一个程序猿都有其思想,我的思想之中的一个,就是分布式. 分布式, ...

  10. 根据start和limit从已有的数据列表中获取从start开始的limit个数据

    代码记录(需求:根据start和limit从已有的数据列表中获取从start开始的limit个数据) 已有的数据列表:这个数据列表是经过处理的,可能是在SQL查询时无法处理的如多条件排序,而排序条件需 ...

随机推荐

  1. 【动画进阶】神奇的卡片 Hover 效果与 Blur 的特性探究

    本文,我们将一起探讨探讨,如下所示的一个卡片 Hover 动画,应该如何实现: 这个效果的几个难点: 鼠标移动的过程中,展示当前卡片边缘的 border 以及发光效果: 效果只出现在鼠标附近?这一块的 ...

  2. 屏蔽RaiDrive的广告

    RaiDrive 广告域名:ads.raidrive.com 在 HOSTS 添加 127.0.0.1 ads.raidrive.com 或者在代理中设置为阻止即可. 效果: 补 最新版(2023.9 ...

  3. Java中处理SocketException: Connection reset”异常的方法

    Java中处理SocketException: Connection reset"异常的方法 在Java编程中,有时候我们会遇到java.net.SocketException: Conne ...

  4. k8s单机部署

    一.环境 64位centos 二.安装 (1)关闭防火墙 systemctl stop firewalld systemctl disable firewalld (2)安装etcd与kubernet ...

  5. Go make 介绍

    Go 语言中的 make 函数用于创建和初始化特定类型的对象,主要是用于创建切片(slice).映射(map)和通道(channel).make 函数与 new 函数不同,new 函数是用于分配内存, ...

  6. 【Docker学习教程系列】8-如何将本地的Docker镜像发布到私服?

    通过前面的学习,我们已经知道,怎么将本地自己制作的镜像发布到阿里云远程镜像仓库中去.但是在实际工作开发中,一般,我们都是将公司的镜像发布到公司自己搭建的私服镜像仓库中,那么一个私服的镜像仓库怎么搭建? ...

  7. sql server 将数据库表里面的数据,转为insert语句,方便小批量转移数据

    create proc [dbo].[proc_insert] (@tablename varchar(256)) as begin set nocount on declare @sqlstr va ...

  8. C++性能优化——能用array就不要用unordered_map作为查询表

    unordered_map需要哈希值计算和表查询的开销,当key值为整数且连续,直接用数组作为查询表具有更高的效率. #include <iostream> #include <ch ...

  9. CSS – Display block, inline, inline-block

    前言 之前 W3Schools 学习笔记就有提到了 CSS Layout - The display Property 这篇做更多的解释. 参考: CSS Display FLEX vs Block, ...

  10. Task2 - IDA学习【进度 - 第二课】

    学习目标: - 无名侠的课,看二进制培训(第二集和第三集)(https://space.bilibili.com/7761039/video) - 会反汇编 - 会字符串搜索(f12) - 会简单异或 ...