离线同步任务支持您通过配置类似的数据过滤功能来决定同步全量数据还是增量数据,配置过滤条件时,将只同步满足过滤条件的数据。同时,过滤条件可以结合调度参数使用,实现过滤条件随任务调度时间的动态变化,进而实现增量数据的同步。该内容将向您介绍如何配置增量数据同步任务。
使用说明
部分数据源暂无增量同步方案,例如HBase、OTSStream数据源等。具体数据源是否支持增量同步可以看具体的Reader插件文档。
每个插件实现增量同步的所配置的参数可能不同,具体参数配置可以参考对应的Reader插件文档,详情可参考:支持的数据源与读写插件。例如:
数据库类型
增量同步需配置的参数
支持的语法
where
说明向导模式配置时,需要配置的界面参数名为:数据过滤。
数据库语法
说明可与调度参数结合实现每日读取指定时间区间的数据。
query
说明向导模式配置时,需要配置的界面参数名为:检索查询条件。
基本与数据库一致
说明可与调度参数结合实现每日读取指定时间区间的数据。
Object
指定路径
说明与调度参数结合实现每日读取指定文件数据。
...
...
...
配置增量同步
数据集成离线同步任务中,可以使用调度参数来指定同步源表及目标表的数据路径以及数据范围,调度参数的配置方式与其他类型任务一致,没有特殊限制。
在同步任务运行时,任务中配置的占位符参数都会被替换为调度参数表达式所表达的实际值,然后再执行数据同步。
以同步MySQL数据为例:
当不配置数据过滤时,默认同步全量数据至目标表中。
当配置数据过滤时,将只同步满足过滤条件的数据至目标表中。
目标MaxCompute表分区名称以调度参数的方式指定,$bizdate表示业务日期,定时任务执行时,任务配置的分区表达式会替换为调度参数所表达的业务日期。调度参数表达式的详细配置说明请参考文档:配置并使用调度参数。以离线同步任务为例,需在三处配置 bizdate 参数以实现增量同步:在数据来源的数据过滤中填写 STR_TO_DATE('${bizdate}','%Y%m%d') <= gmt_modify_time AND gmt_modify_time < DATE_ADD(STR_TO_DATE('${bizdate}','%Y%m%d'), interval 1 day),按业务日期筛选当天变更数据;在数据去向的分区信息中填写 pt=${bizdate},将数据写入对应日期分区,并将清理规则设为写入前清理已有数据(Insert Overwrite);在右侧调度配置的参数中填写 bizdate=$bizdate,使调度系统在运行时自动将 ${bizdate} 替换为实际业务日期。配置增量数据同步时:
注意事项
配置增量同步任务时,注意以下事项:
写入前清理已有数据(Insert Overwrite)的安全性:当多个同步任务写入同一 MaxCompute 表的不同分区时,使用写入前清理已有数据策略是安全的。该策略仅清理当前任务指定的分区数据,不会影响表中其他分区的数据,不会造成数据冲突或误删。
分区范围批量覆盖限制:DataWorks 不支持在分区配置中直接设置小时范围值(如
hh=00-23)进行批量覆盖写入。如需实现多小时数据的覆盖写入,需配置多个独立任务分别执行。分区参数目前仅支持单个具体值或通配符*。通配符语法格式:在源端包含小时分区而目标端仅到天分区的场景下,需在小时分区字段填写通配符
*以匹配所有小时数据。输入时直接填写*即可,禁止添加引号(如"*"),否则会导致语法错误。
基于时间戳的高频定时增量同步
DataWorks 支持通过离线同步任务配合周期调度(如每 5 分钟、每小时)实现基于时间戳的定时增量同步,适用于 RDS MySQL 到 SelectDB、StarRocks 等目标端的 T+1 或准实时同步场景。此方式通过 SQL 过滤实现增量,无需使用实时 CDC 任务,可避免持续运行产生的费用。配置要点:
在源端数据过滤的 where 条件中,使用时间戳字段作为变量进行过滤。例如:
gmt_modify_time >= '$[yyyymmddhhmiss-10/mi]' AND gmt_modify_time < '$[yyyymmddhhmiss]'。配置周期调度参数(如
$[yyyymmddhhmiss])动态计算时间范围,确保每次调度仅同步指定时间区间内的增量数据。关于调度参数的详细配置,请参见调度参数在数据集成的应用场景。在目标端字段映射中手动添加常量参数映射到分区字段,实现动态分区写入。
整库离线同步任务的增量配置
除单表同步任务外,也可以通过创建整库离线同步任务实现周期性增量。在创建任务时勾选增量同步,同时在整库同步任务的中配置增量条件,即可实现高效的天级别增量分区同步(如按 create_time 字段过滤)。
此方式适用于希望统一管理多表同步但仅需对特定表做增量处理的场景。关于整库离线同步任务的完整配置流程,请参见整库离线同步任务配置。
场景示例
同步历史数据:如果您需要将历史增量数据同步至目标表对应时间分区,您可以使用运维中心补数据功能。补数据功能使用详情请参见:补数据实例运维。在数据同步节点配置中,数据源选择 MySQL,数据去向选择 MaxCompute(ODPS),表名如
czd。数据过滤条件中通过${bizdate}控制增量范围(例如STR_TO_DATE('${bizdate}','%Y%m%d') <= gmt_modify_time),分区信息设为ds=${bizdate},清理规则选择写入前清理已有数据(Insert Overwrite)。在调度配置的参数区域定义bizdate=$bizdate,该调度参数会在补数据场景下根据业务日期自动替换为具体的日期值。执行补数据时,可设置多段业务日期范围(例如 2022-05-01 至 2022-05-31 和 2022-04-01 至 2022-04-30),勾选立即运行定时时间大于此刻的补数据实例,并选择业务日期正序执行。
常见问题
MaxCompute Reader 分区过滤使用调度参数后,报分区不存在怎么办?
原因:配置的调度参数在运行时未被正确解析为实际分区值,或解析后的值与源表实际分区不匹配。
解决方法:若分区值由上游节点的outputs参数传递,检查数据开发中的参数配置,确保以下几点:
配置的参数名称,是否与输入参数名称一致。
传递的参数值,是否能完全匹配MaxCompute中的实际分区。
DataWorks 离线同步任务默认是全量同步还是增量同步?如何配置无分区字段源表的增量同步?
默认行为
DataWorks 数据集成离线同步任务默认为全量同步,即每次运行同步全部数据。只有在配置了数据过滤条件并结合调度参数时,才能实现增量同步。
无分区字段源表处理
若源端 RDS 等数据库表无时间或分区字段,无法直接通过 where 条件过滤增量数据。建议:在源表中增加时间字段(如 dt、gmt_modify_time 等),作为增量过滤依据。完成字段准备后,参考本文档"配置增量同步"章节配置增量同步逻辑。
splitPk 和 splitFactor 参数的作用是什么?对源端数据库有什么影响?
参数定义
splitPk(切分主键):指定一个主键列,DataWorks 按该字段的值范围将数据切分为多份,实现多线程并发读取。splitFactor(切分因子):控制切分粒度,数值越大切分越细,读取线程越多。
性能影响与建议
开启 splitPk 和 splitFactor 会增加源端数据库压力。如需减轻源端负载,建议:
降低并发度,或将整库离线任务并发度配置为 1。
确保切分列(
splitPk)已建立索引,以提升读取效率。
如何为业务选择合适的同步方案?
同步方案由“执行方式”与“数据范围”两个相互独立的维度组合决定,两个维度可以自由搭配。本文介绍的场景为“离线周期调度 + 增量”。
执行方式选择
默认推荐离线周期调度:任务运行结束即释放资源,按实际运行时长计费。仅在以下两种情形下才需要选择实时同步:
业务要求秒级延迟。
需要同步源端的物理删除(DELETE)操作。
这两种情形需改用实时同步,是因为离线增量同步依赖时间戳等条件过滤数据,源端已被物理删除的记录不会出现在查询结果中,因此不会在目标端同步删除。实时同步在此仅作引导,不展开配置步骤,具体配置请参见单表实时同步任务。
数据范围选择
全量同步适用于源表数据量较小,或历史数据会被原地修改且没有变更时间字段(无法界定变更范围)的场景。
增量同步的前置条件是源表具备可靠的变更时间字段(如
gmt_modify_time)或自增主键,适用于数据量大、每日变更占比小、需要按日期分区保留历史快照(拉链表)的场景。若源表不具备上述字段,请参见本文已有 FAQ:DataWorks 离线同步任务默认是全量同步还是增量同步?如何配置无分区字段源表的增量同步?。
首次初始化与大数据量策略
历史数据建议采用“先全量、再增量”的策略,并将两部分数据写入不同分区。
需要按原始业务日期回填历史分区时,使用补数据功能,具体操作请参见补数据实例运维。
对于 TB 级数据量,可通过提高任务并发数、调整数据集成资源组 CU 来保障同步效率,具体操作请参见使用 Serverless 资源组。提高并发会增加源端数据库压力,相关说明请参见本文已有 FAQ:splitPk 和 splitFactor 参数的作用是什么?对源端数据库有什么影响?。