增量同步

数栈数据集成模块对增量同步的支持有过滤条件和定点增量标识2种,2种方式的异同:

对比点 过滤条件 定点增量

适用范围

关系型数据库(MySQL、Oracle、SQLServer、PostgreSQL、DB2)

对源表的要求

数据量可大可小,配置简单,有较为可靠的时间戳、自增标识即可

数据量较大,对增量标识字段要求高,要求源表的标识必须为整形或Timestamp类型(Oracle数据库可以为字符串),且要求标识字段保持稳定,不会出现错误值、空值等异常

对目标表的要求

任意目标类型

必须为Hive或HDFS类型

工作流的支持

可以放在工作流中

不能出现在工作流中

补数据的支持

可识别补数据时的业务日期信息

忽略增量标识信息,全量补数据

多表的支持

支持MySQL分库分表

单表

依赖的支持

支持全部依赖方式

必须配置为自依赖模式

出错处理

简单,补数据即可

若任务出错,无需人工处理,下一次同步时会自动从上一次点位开始。若源表的增量标识出错,例如增量标识不稳定,重新从0开始,则人工无法干预,下次同步时,将不读取数据(已保留的标识大于读取的标识,将会被认为没有增量数据)

过滤条件

过滤条件方式实现增量抽取是较为典型的方式,例如MySQL的源表中有数据更新的时间戳,则可以通过填写系统变量的方式实现增量抽取,可参考:增量同步_过滤

定点增量标识

定点增量的本质,是同步任务每次成功的运行结束后,都会记录本次同步的“点位”,下次同步时,会从上次记录的点位继续开始同步,这种方式要求源表具有稳定的增量标识。 系统在同步任务启动时,会先读取源表增量标识的最大值(防止数据重复),之后再从上一次成功结束的点位继续运行,直至刚读取的最大值,若在此期间,源表有新的数据插入,新插入的数据不会被读取。

入口

定点增量功能需要在同步任务创建时指定,已创建的同步任务,也可以将其修改为定点增量模式,操作入口位于:数据开发→新建/编辑同步任务的弹窗→同步模式

初始化

假设待同步的表 t_a ,包含4个字段,其中的 modify_time 是增量标识字段,实际存储了UNIX格式的时间戳

t a表

正常同步过程

正常同步过程

如上图所示:

  • 首次同步

    1. 假设此时源表中包含的数据为P1~P2之间的数据

    2. 首次同步时,增量标识为空,会从第一条数据开始同步(startPoint=P1),并在初始化阶段,在源库执行一次查询,获取最大点位(maxPoint=P2)

    3. 实际同步的数据范围: readRange=[startPoint,maxPoint)=[P1, P2) ,即 P1 ⇐ readRange < P2 ,注意不包括等于P2点位的数据

    4. 成功结束,则更新增量标识(markPoint=P2)

    5. 下一次同步时,startPoint=markPoint=P2

  • 第二次同步

    1. 启动时,startPoint计为上次同步成功终止的点位(P2)开始,即 startPoint=markPoint=P2

    2. 启动时,在源库执行一次查询,获取最大点位(maxPoint=P3)

    3. 在读取的过程中,数据被不断的插入(P4~P5之间的数据)

    4. 由于已获取了P4作为最大点位,所以实际同步的数据范围, readRange=[startPoint,maxPoint)=[P2,P3)

    5. 任务成功结束,更新增量标识(markPoint=P3)

    6. 下一次同步时,startPoint=P3

出错处理

出错处理
  1. 假设首次同步时正常运行,成功结束,读取范围是 readRange=[startPoint,maxPoint)=[P1, P2) ,同时markPoint=P2

  2. 第二次同步,初始化阶段,startPoint=P2,maxPoint=P3

  3. 第二次同步,若在运行过程中任务失败,抛弃P3点位,将markPoint=P2

  4. 下一次同步时,在初始化阶段,依然是startPoint=P2

Hive表的增量同步

不支持对Hive执行一段SQL进行增量抽取,类似的需求,可以将查询出的数据插入新的表,或插入新的分区,再将其写入其他数据库