货拉拉离线大数据迁移-验数篇

一、数据验证背景

在前两篇文章中,我们分别从宏观层面梳理了离线大数据迁移的整体流程与关键挑战(《货拉拉离线大数据跨云迁移-综述篇》),并详细介绍了实际数据迁移过程中的策略、步骤与注意事项(《货拉拉离线大数据跨云迁移 - 数据迁移篇》)。然而,云迁移工作并不在"数据搬运完成"这一刻画上句号------迁移后的数据是否完整、准确、一致,直接决定了业务系统能否平稳切换、分析结果能否可靠可信。

迁移 ≠ 成功,数据验证才是闭环。验数是迁移质量的"守门人",也是业务信任的基石

本篇将围绕离线大数据迁移后双跑阶段的数据验证展开,涉及公司近 20 个部门、数万张Hive表的数据,探讨验证的目标与原则、常见的验证方法与工具、不同场景下的验证策略,以及在实际落地中需要关注的性能与成本平衡。通过系统化的数据验证流程,我们不仅能够发现并修正迁移过程中的问题,还能为后续的数据治理与质量管理奠定坚实基础。

二、数据验证挑战

  • 挑战 1:跨云双跑验数难
    • 问题背景:
      • 双跑阶段,源端不封网,每日都有大量的任务SQL变更、Hive上万表新增/修改分区数据。需要对双跑结果进行校验,包括表分区级 COUNT 校验 和 行级明细比对。校验过程需同时从两朵云查询数据,涉及跨云访问。
    • 主要挑战:
      • 网络瓶颈: 跨云链路带宽有限(约 100Gb),直接跨云读取数据会导致高延迟与传输开销。
      • 计算压力: 每日需处理数万张表及行级数据,计算量大,容易占用生产集群资源,影响业务运行。
      • 动态数据干扰多:抽数难对齐,源端写入与目标端双跑并行,数据版本易错乱(如 ETL 逻辑变更)
    • 应对思路:
      • 采用"云内比对 + 分层验证(粗验 / 精验)"策略,构建自动化验数工具,支持多维度比对(行级、字段级、聚合级)
  • 挑战 2:错误归因与修复难
    • 差异可能源于工具、源端/目标端异常或业务变更,排查链路长。
    • 应对思路 :自动化验数报告+闭环跟踪机制。
  • 挑战 3:业务验收协同难
    • 涉及部门多且数据准确性要求多样化,核心表需 100%一致,非核心表允许合理误差。
    • 应对思路 :分级验证(P0/P1)+专家精验,匹配业务优先级,责任到人。

三、验数方案设计

1. 整体方案

存量数据迁移完成后进入链路双跑期,这期间源端集群不封网,每天都有大量的任务代码变更和新数据生成,数据验收通过才能保障业务系统平稳切换。我们主要通过如下步骤做到在业务运行无感的情况下完成稳定、高效的数据验证:

  • 准备链路双跑环境 :准备双跑环境,网络隔离、任务代码自动同步、冻结不可双跑任务,防止双跑链路污染线上数据,搭建了一套隔离、同步、可控的双跑环境
  • 高效数据对比工具 :跨云表数据自动对比,支持表行级和列级的粗验(数据量)和精验(明细,支持设定浮点数精度);自动生成对比报告,记录表和列的数据不一致占比以及不一致的明细数据,大幅提升验数效率
  • 数据验证策略与实施 :按照分层、分级、分阶段、分部门的策略对20万+的Hive表进行验数,归因分析数据不一致原因并修复,协助业务部门完成表数据一致性验收

四、 验数实施

1. 双跑环境准备

在存量数据迁移基本完成后,系统正式进入链路双跑阶段 ------这是数据验证最关键的窗口期。此阶段,源端集群保持完全开放 ,业务任务照常运行,ETL 代码持续迭代,每日仍有 500TB+增量数据写入。为确保验证过程不影响线上稳定性,同时又能真实模拟切换后的运行状态,我们构建了一套隔离、同步、可控的双跑环境。

1.1 网络与资源隔离

  • 物理隔离:目标云环境独立部署 Hive Metastore、YARN 集群、调度系统,与源端无共享存储或元数据服务,避免交叉污染。
  • 网络策略:通过 VPC 对等连接或专线打通跨云通道,限制目标端仅允许 Kirk迁移 工具和双跑任务写入,禁止外部访问 。
  • 资源保障 :为双跑任务分配独立 YARN 队列和计算资源,避免与生产任务争抢资源,确保验证过程不影响核心链路 SLA。

1.2 任务代码自动同步

为确保计算任务代码、数据及元数据在多环境间的高度一致性,数据平台自主研发了自动同步功能。该功能实现了主环境到备环境的实时双向同步,当用户在主环境进行代码修改、数据更新或配置调整时,系统会自动、精准地将变更内容同步至备环境。

1.3 不可双跑任务冻结机制

并非所有任务都适合双跑。例如:

  • 强依赖源端特定组件(如自定义 UDF、本地缓存);
  • 涉及外部系统写入(如 DB、MQ),双跑会导致重复写入;
  • 任务本身具有幂等破坏性(如 delete、drop 操作)。

双跑期间不打开的任务:

  • 一次性任务
  • 所有Doris相关任务,包含Doris SQL、ShellDoris、Hive2doris等类型不打开
  • Hive to Any任务

对此类任务,在双跑启动前会冻结,避免对目标端或外部系统造成干扰。同时,对关键冻结任务提供 Mock 数据或空跑策略,保障下游链路完整性。

通过上述措施,我们构建了一个高保真、低干扰、可回溯 的双跑环境,为后续大规模、自动化数据验证奠定了坚实基础。在整个双跑周期(约 2--3 周)内,系统平稳运行,未发生因验证导致的生产事故,真正实现了"业务运行无感,验证有理有据"。

2. 验数平台

为了保障双跑验数工作高效推进,我们基于 Kirk 系统自研了一套高吞吐、高性能、可扩展的自动化验数平台。平台设计遵循以下核心思路:

  • 平台化与自动化 将繁琐的验数操作(如调度对比任务、收集结果、生成报告)整合为标准化、自动化的平台流程,减少人工干预,提升效率与一致性。
  • 多维度可扩展 支持多种验数策略的选择,如比计数、比关键字段哈希、比全字段等,支持验收阈值配置,还支持高度定制化的验数逻辑,如自定义SQL。
  • 面向业务协同 提供清晰的验数报告,按部门、表重要性分类,输出比对结果,差异率,差异明细等,用户可快速找到不一致的原因,实现责任到人,过程透明。

2.1 跨云数据验证

链路双跑完成之后,待验证数据分别在两朵云,为了避免频繁重复的跨云传输,我们设计了数据集中验证策略------将源端数据预先迁移到目标端,在单一云环境内完成全部验证工作。

2.1.1 数据准备

要把数据迁移到同一朵云上,首先要解决的第一个问题就是数据放哪里怎么放的问题,无论验数结果是否通过,最终都会以源端数据为基准去覆盖目标端的数据,因此在验数的准备过程中,第一步先将目标端待验证的数据移动到比对库中避免被源端覆盖(rename操作,不会产生数据读写),第二步使用Kirk(自研数据迁移工具)把源端数据搬迁到目标端正式目录上,通过这两个步骤,既完成了数据迁移任务,又为云内比对做好了数据准备。 这个过程中需要注意非分区表的特殊处理,通常非分区表的大小都比较小(主要是维表),由于非分区表每天都会自行覆盖,为了实现历史状态的回溯,需要专门针对于非分区表保留历史状态的快照,数据准备过程如下:

2.1.2 比对方案
类型 方法 说明
粗验 对比源端与腾讯云两条链路产出的表行数(COUNT) 快速判断数据完整性,是精验的前提条件
精验 对每张表的每行数据计算 MD5 值,逐行比对一致性 确保内容级 100% 一致,用于核心表验证

2.2 验数平台介绍

2.2.1 创建比对任务

支持单个/批量创建数据比对任务

2.2.2 配置比对逻辑
  1. count验数:对比华为云和腾讯云表count行数
  2. 自定义SQL验数:count,sum,按维度聚合
  3. 明细比对:对比整行数据的差异,可以指定主键和排除字段
  4. 数值差异比对:将数值字段按照 +-*/ 等规则计算差异率,并可单独指定每个字段的差异率阈值
2.2.3 运行比对任务

用户可以根据需求,选择自动执行或者定时执行比对逻辑,功能介绍如下:

对比项 说明
是否count比对 执行行数一致性校验
是否自定义SQL比对 执行用户自定义SQL校验
是否明细比对 执行字段级一致性验证
是否数值差异比对 执行数值字段四则运算一致性验证
是否BI数值差异比对 执行数值波动率一致性验证
BI是否夸天比对 执行数值波动率一致性验证并且可自定义同环比日期
2.2.4 下载比对报告
对比项 说明
全局比对结果 该 task 最终的比对状态,分为:未知(系统比对 SQL 和用户自定义 SQL 运行异常),一致(系统比对 SQL 和用户自定义 SQL 都一致),不一致(系统比对 SQL 或用户自定义 SQL 不一致)
系统比对结果 系统生成的 Count SQL 比对结果是否一致
用户SQL比对结果 用户自定义的 SQL 执行的结果是否一致
源链路count 主链路执行 SQL Count 结果
腾讯云count 腾讯云执行 SQL Count 结果
count差异率 主链路和腾讯云 Count 差异((腾讯云 Count - 主链路 Count)/ 主链路 Count)
系统异常信息 系统的异常日志,有则点击并显示

3. 数据验证策略与实施

面对横跨近20个部门、涵盖数万张Hive表的庞大数据体系,我们构建了一套贯穿双跑周期的系统性验数方案。该方案以"平台化工具自动巡检"与"专家团队精准核验"双轨并进,通过层次化、场景化的验证流程,为核心数据的一致性保驾护航,为业务切换筑牢信任根基。

3.1 核心策略

3.1.1 分层、分级、分阶段

为应对数据规模与复杂性的挑战,我们摒弃了单一维度的验证方式,确立了以下核心策略

  • 分层验证(从数据产生的技术流程和依赖关系入手)从基础数据层(ODS/DWD)到应用数据层(DWS/DM/报表)依次验证,确保验证流程符合数据加工逻辑,系统性阻断底层错误向上蔓延。
  • 分级验证(从数据的重要性和影响面入手),对数据表进行P0(核心)/P1(重要)/P2(一般)分级,实施差异化的验证强度,确保资源精准投放。
  • 分阶段验证(从验证工作的实施步骤和精细度入手)采用"先粗后精"的两阶段流程,先行数快速筛查,再内容深度比对,构建高效的验证流水线。

3.2 方案实施

为确保验证的全面性与深度,我们采用了平台化工具专家精准核验的双轨制策略。

3.2.1 平台验数

为提升验证效率,我们使用了元初平台的验数工具,覆盖基础场景,实现规模化效率

  • Count验数:快速比对源端和腾讯云表或分区的行数,是"分阶段"策略中"粗验"的核心手段,能快速定位宏观差异。
  • 自定义SQL验数
    • 数据流完整性验证:验证从ODS源头到DM应用层的数据加工链是否准确。例如,编写SQL检查DM层的"用户总消费金额"是否等于对DWD层所有相关明细订单金额的汇总。
    • 关键KPI比对:如"当日GTV"、"活跃用户数"、"平均响应时长"等。需要编写承载了完整、一致业务口径的SQL(涉及多表关联、去重、过滤、聚合)
  • 明细比对:基于主键或唯一键的逐行字段级精准比对,是"精验"阶段验证数据明细一致性的关键手段。
  • 数值差异比对:针对数值型字段,设置误差容忍区间,科学地判定在合理波动范围内的数据一致性,有效解决了报表层因微小时间差导致匹配不上的经典难题。
3.2.2 专家验数:攻坚复杂场景,确保业务深度可信

对于元初验数平台无法覆盖的复杂、定制化场景,我们依赖数据开发者的领域知识与经验进行深度验证。

  • 验证范围 :聚焦于核心链路表与各部门认定的重要表。
    • 终端表优先验证:优先验证直接面向业务应用的终端产出表。若终端表数据准确,则其上游数据处理链路在大概率上是正确的,这是一种高效的逆向验证思路。
    • 关键节点表验证:对承上启下的关键宽表、重度聚合表等进行重点核查,确保核心数据加工节点的准确性。
  • 验证方法
    1. 领域专业验证:结合业务语义,对重要维度(如地区、渠道)、关键指标(如GMV、转化率)进行聚合统计与趋势比对,从业务视角判断数据合理性。
    2. 标准逐行比较验证:对于要求绝对一致的核心表,利用我们提供的深度验数工具(支持在腾讯云侧进行数据比对),可对每一行数据的所有字段或部分关键字段计算MD5值,进行无损的精确比对,确保数据100%一致。
3.2.3 标准化运营流程

我们建立了专职的验数小组,驱动验证工作闭环:

  • 顺序推进:严格执行"先基础层,后应用层"的验证顺序。
  • 工具与报告驱动:以元初验数平台为核心调度工具,每日自动产出验数报告,透明化展示验证进度与不一致项。
  • 问题闭环管理:对平台发现及专家识别的不一致问题,执行"定位、解决、跟踪、验证"的全程闭环管理,确保所有问题被根除。

五、总结

离线大数据跨云迁移是一项系统性工程,从前期规划、数据迁移到后期验证,每个环节都环环相扣、缺一不可。数据验证作为迁移闭环的最后一环,不仅是对迁移结果的质量把关,更是对整个迁移体系的信任背书。通过科学的验证目标设定、合理的验证策略设计以及高效的工具与流程落地,我们能够在保障数据完整性、一致性与可用性的同时,平衡性能与成本,确保业务平稳过渡。 在本次迁移与验证过程中,来自多个团队的同事共同参与了验数工作。他们在验证方案设计、工具开发、数据比对、问题定位与修复等环节中密切协作,确保了整个迁移过程的高效与可靠。正是这种跨团队的协同与专业投入,构筑了数据验证工作的坚实底座,也为项目的顺利收官提供了有力保障。 在此,也向所有参与本次迁移与验数工作的团队与同事致以诚挚的感谢------正是大家的专业、耐心与协作,让复杂的跨云迁移项目得以高质量落地。

作者简介:

  1. 杨秋吉:大数据专家,负责大数据离线计算引擎、OLAP引擎的研发与维护
  2. 陆欢典:资深数据仓库工程师,货拉拉公共数据组负责人,致力于公共数据层的顶层设计与统筹建设
  3. 陈铨:高级大数据工程师,专注于大数据存储方向,主要负责大数据离线存储、向量存储的研发和维护
相关推荐
用户6802659051192 小时前
如何利用 Endpoint Central 提高企业终端管理效率
javascript·后端·面试
廋到被风吹走2 小时前
【Spring】Spring Context 详细介绍
java·后端·spring
风之子npu2 小时前
AMBA AXI - transaction order记录
后端·restful
Clarence Liu2 小时前
虚拟机与容器的差异与取舍
linux·后端·容器
幽络源小助理2 小时前
SpringBoot兼职发布平台源码 | JavaWeb项目免费下载 – 幽络源
java·spring boot·后端
co松柏2 小时前
AI+Excalidraw,用自然语言画手绘风格技术图
前端·人工智能·后端
踏浪无痕3 小时前
四个指标,一种哲学:Prometheus 如何用简单模型看透复杂系统
后端·架构·go
Cosolar3 小时前
MySQL EXPLAIN 执行计划分析:能否查看 JOIN 关联顺序
数据库·后端·mysql
TianXinCoord3 小时前
SpringBoot+MyBatis Plus+PostgreSQL整合常用数据类型(json、array)操作
后端