离线同步数据质量问题包括同步过程数据量一致性和数据一致性,本文从这两个维度为您说明各因素可能导致的质量问题。

背景信息

离线场景下的数据量一致性问题一般存在以下几种情况:
  • 确认数据量一致性时,数据库读取错误。
  • 同步任务配置导致数据重复或数据缺失。
  • 同步任务冲突导致数据重复或数据缺失。
离线场景下的数据一致性问题一般为同步任务本身存在问题,关于此部分的详情介绍,请参见下文。

数据量一致性

当同步数据量不符合预期时,您可根据以下步骤确认数据量的一致性。

步骤一:确认数据写入的库

数据集成支持数据源开发和生产环境隔离,即同一个任务配置的开发数据源与生产数据源可以不一致,同时,开发环境和生产环境写入的数据库、数据表也可以不一样。因此,在基于当前文档确认同步结果表前,请先确认您查询的库与数据同步任务写入的库是否为同一个库。
  • 确认方式:关系型数据库支持您在Detail log中搜索关键字jdbcUrltable。详情请参见:查看离线同步日志
  • 场景示例:

    标准模式工作空间下,数据同步至工作空间内的odps_first数据源(工作空间绑定MaxCompute引擎时自动创建的数据源)时,开发环境执行同步任务(DataStudio界面或在开发环境运维中心),数据将写入开发数据源,生产环境执行数据将写入生产数据源。

    开发环境的MaxCompute项目名一般为projectname_dev,生产环境的MaxCompute项目名一般为projectname。所以在查询数据时,若您需要在数据开发界面查询生产表,您需要指定表所在项目,即查询projectname.tablename

步骤二:确认同步读取的数据量

确认操作 说明
确认读到的数据量 在离线同步任务日志末尾,通过读出记录总数确认离线同步任务从源端数据库读到的数据量。日志
确认取数SQL 在同步日志Detail log中会打印根据您的任务配置生成的取数SQL,若任务被切分为多个task,日志将打印多个取数SQL。日志
同步结果对比
  • 现象:源端数据库数据与当前同步任务读取到的数据量不一致。
    说明 同步任务将根据您的配置生成对应的取数SQL去数据库取数,您可以在Detail log中获取到数据库执行的SQL详情。
  • 原因:在执行同步任务时间点到当前时间点期间,源端数据库数据发生变化。离线数据同步读取的是任务执行时的数据库快照,由于数据库事务隔离,无法读取到快照查询后的数据。
  • 解决方案:查看源端数据库同步任务执行时间点后的数据库操作日志,评估对数仓分析的影响,MaxCompute数仓分析历史数据是T+1的。也可以尝试重新执行同步任务,一般情况下可以读取到最新的数据。

步骤三:确认同步写入的数据量

您可以在目标端数据库确认同步最终写入的数据量,一般存在两种情况:数据重复或数据缺失,以下为您说明不同业务场景下,造成该问题的可能原因。

场景 现象 可能原因 解决方案
任务配置 数据重复 当任务配置为同步前保留原有数据(insert into),任务重复执行导致数据重复。
  • 建议您根据业务需要合理配置同步写入模式。
  • 若需要保证任务的幂等性,避免在任务出错重跑后,出现大量数据质量问题,建议您合理设置节点的重跑属性。
说明
  • 关于重跑属性配置域相关说明,详情请参见:重跑说明
  • 若您配置了任务不可重跑,但是为保障任务产出的时效性,建议您为该任务设置监控报警,确保在任务异常时可以第一时间收到报警并及时处理异常,设置报警详情请参见:智能监控概述
数据缺失 同步过程产生脏数据。若任务配置容忍脏数据,那么脏数据产生后该数据将会舍弃,但任务不会失败退出。 建议确认脏数据产生原因并处理脏数据,若您任务不允许产生脏数据,您可以在任务配置界面的通道配置处,修改该阈值。
任务冲突 数据重复或缺失 不可并行的任务同时执行。即同一业务场景下,需要顺序执行的任务却同时执行。
  1. 确认是否正确设置节点依赖关系。
  2. 确认节点依赖关系已设置的前提下,节点操作的表分区是否冲突。
场景示例:附:多任务操作同一个分区,导致数据重复
数据缺失 多个任务操作同一个表。即不同业务场景下,任务冲突导致其他节点同时操作该表数据。 与对应节点责任人协调沟通。
说明 如何找到冲突的任务和任务责任人,详情请参见:附:确认是否存在冲突任务和确认任务责任人

数据一致性

如果无上述问题,但同步前后数据仍存在问题,您需要检查任务的配置情况。

现象 可能原因
数据库存在时间类型字段数据 源端与目标端数据库时区不一致。
半结构化数据同步部分字段为空 列解析错位导致两列数据合并为了一列。

建议:确认数据中是否存在列分隔符,可先处理源端数据后再执行同步任务。

附:确认是否存在冲突任务和确认任务责任人

  • 确认是否存在冲突任务

    若写入MaxCompute表,您可以在数据地图表分区操作列,对比分区产生时间与同步任务执行时间是否一致,确认是否有其他任务操作该表。

    定位冲突任务:若通过上述操作确认存在冲突的任务,您可以通过数据开发代码搜索功能定位该冲突任务。代码搜索功能使用详情请参见:代码搜索

  • 确认任务责任人:您可以进入运维中心的周期任务界面,找到对应任务,查看该任务的责任人。

附:多任务操作同一个分区,导致数据重复

以MaxCompute为例,离线同步任务与ODPS SQL任务为小时调度任务,并且操作同一个天级别分区,离线同步任务写入模式为写入前保留已有数据。若某天任务执行延迟导致ODPS SQL任务和其他周期实例的同步任务(操作表A分区T)运行出现交替执行时,将可能导致表A天级别分区T分区数据量翻倍或为空。工作流
说明 建议您将该表配置为二级分区表,每个小时实例数据操作对应的小时分区。