货拉拉大数据数仓发布准入准出流水线

159 阅读16分钟

作者简介:

  • 王文艳,来自货拉拉/技术中心/质量保障部,测试专家,主要负责货拉拉大数据领域的质量保障和效能建设工作。
  • 窦婷,来自货拉拉/技术中心/质量保障部,资深测试工程师,主要负责货拉拉大数据领域的质量保障和效能建设工作。
  • 董帅,来自货拉拉/技术中心/质量保障部,高级测试工程师,主要负责货拉拉大数据领域的质量保障和效能建设工作。
  • 刘真真,来自货拉拉/技术中心/质量保障部,高级测试工程师,主要负责货拉拉大数据领域的质量保障和效能建设工作。

一、背景与挑战

与传统项目发布不同,货拉拉的大数据离线数仓任务发布主要在大数据离线开发平台项目上进行。然而,目前离线数仓任务发布存在以下问题:

  • 数仓发布流程:

    • 发布流程缺乏严格的控制,导致数仓发布较为随意。
    • 测试人员对发布情况缺乏感知。
    • 缺乏专门的测试用表,导致未上线时测试数据已污染生产数据。
  • 数仓任务现状:

    • 存在大量自测任务,测试人员对此无感知,但这些任务往往容易出现问题。
    • 数仓任务变更频繁,影响范围广,人工自测耗时长,需要提升效率。

针对这些问题,我们需要规范数仓发布流程,将数仓研发流程的标准化管理、工程实践和质量效能工具相结合,形成一套集成方案。我们的主要目标是构建一个更高效、更高质量的持续交付流程,最终实现无人测试的理想状态。

二、方案与目标

针对货拉拉大数据离线数仓发布的痛点和难点,我们联合大数据的离线数据开发平台采取了以下方案:

  • 发布流程规范化:规范数据发布流程,增加发布审批、发布准入准出卡点流程。
  • 测试数据物理隔离:增加灰度空间,测试任务生成的测试数据写入灰度空间,避免测试数据对线上数据造成污染。
  • 准入准出自动化:自动识别处于可测状态的有变更的数仓任务,自动触发准入准出检测,失败结果自动触达,并对准入准出结果不通过的任务进行发布拦截。

最终达到以下目标:

  • 缓解风险,提前得到问题反馈

  • 严格控制数仓发布准入准出标准,制定规范的CI/CD流程

  • 降低团队之间的沟通成本,提高产品交付的效率

为了达成以上目标,我们打造了大数据数仓发布准入准出流水线平台(简称:大数据数仓流水线平台),并联合大数据离线开发平台规范了大数据数仓发布的流程。

三、能力建设

大数据数仓流水线平台基于Spring Boot构建,依赖大数据测试平台提供的任务计算的能力。它提供了数仓任务的准入准出功能,提供了数仓发布的卡点功能。架构主要由四层组成,包括展示层、服务层、存储层和数据层组成。

大数据数仓流水线平台架构图

接下来从平台基础能力、准入准出流程控制、应用实践3个方面来阐述大数据数仓流水线平台的能力。

3.1 平台基础能力

大数据数仓流水线平台的基础能力主要包含流水线的生成及执行、流水线结果触达。平台借助了大数据测试平台的任务模版功能、任务执行功能,大数据数仓流水线平台功能主要集中在数仓任务变更分析、模版的应用、节点组合、结果的触达、可视化展示中。

大数据数仓流水线平台具备一系列强大的基础能力,主要包括流水线的生成与执行,以及结果的高效触达。平台充分利用大数据测试平台的任务模版和执行功能,提供了一整套完善的解决方案。其核心功能集中在以下几个方面:

  • 流水线生成与执行:平台支持自动化创建和管理数据处理流水线。

  • 结果触达:通过多种方式确保数据处理结果能够及时传递给相关用户,支持通知、报告生成和数据可视化等功能。

  • 任务模版应用:利用预定义的任务模版,可以标准化生成测试任务节点,显著提高效率。

  • 数仓任务变更分析:通过分析数仓任务的信息,生成不同的测试任务节点,确保不同的变更类型的数据质量。

  • 节点组合:支持灵活组合不同的准入准出节点,构建复杂的流水线,以满足多样化的数据卡点需求。

  • 可视化展示:提供直观的可视化工具,帮助用户更好地理解和分析准入准出节点流程及其结果。

通过这些功能,大数据数仓流水线平台提供了一个高效、灵活且可靠的数据质量保障及流程控制。

3.1.1 流水线生成及执行

在数仓任务开发完成后,系统会在灰度环境中运行并生成Hive数据。测试数据产出后,数仓流水线会被即时触发。

平台利用大数据测试平台的任务模版基础功能,生成测试任务,大数据数仓流水线平台则会解析数仓任务,获取测试Hive表的信息。从元初平台获取Hive表的所有字段、表类型、主键字段、分区字段等数据。通过预设的准入准出模版,生成测试hive表的测试任务节点。

准入准出测试任务节点生成完成后,平台通过大数据测试平台的任务执行功能,调用任务执行接口主动触发任务的执行。多个测试任务并行执行,执行结束后,平台会根据每个测试任务的结果来计算流水线的最终结果。只有当所有测试任务都成功时,流水线任务结果才被视为成功,否则结果为失败。

流水线的生成及执行功能提供了数仓任务的发布准入准出的基础功能。支持设置不同的模版类型计及数量,生成不同的测试任务,流水线的生成与执行保障了准入准出节点设计的灵活性。

流水线生成及执行核心代码如下【代码已简化,只保留核心逻辑】:

//获取测试hive表的所有字段、表类型、主键字段、分区字段等信息
List<Map<String,String>> hiveTaskParams = getTestHiveParams(bigDataPipeline);

//生成协议名称
String pipeTaskName = generatePipelineTaskName(bigDataPipeline,pipeType);

//调用大数据测试平台的模版功能。生成测试任务
PipelineTask task =  monitorModuleService.createPipelineTask(bigDataPipeline,pipeType,pipeTaskName,hiveTaskParams);


//协议、任务创建成功之后,运行任务
Long runResult = monitorSchedulerService.generateTestScheduler(task.getId());

map.put( "tektonId" , String.valueOf(result_generate));
//将执行结果回调传给流水线
pipelinService.callback(map);

3.1.2 流水线结果触达

流水线任务的测试任务全部完成后,如果流水线状态为成功,则不会向开发团队发送消息。而如果流水线执行失败,系统会自动拉群发送通知给开发团队。消息中将展示流水线执行的结果,开发可以通过点击“结果详情”来查看流水线各节点的执行结果,具体格式如图所示。

流水线失败告警图

同时在流水线详情页面,用户可以查看具体的测试任务及其结果链接。通过查看测试规则配置和执行结果的详细数据,用户可以评估测试的Hive表的数据质量情况。

此外,流水线页面还提供了结果处置选项,例如手动调整测试规则后重新运行测试任务,或手动标注执行结果。这样可以确保数据质量问题得到及时处理和解决。

3.2 准入准出流程控制

通过流水线任务,我们能够有效地管理数仓的任务变更,确保其符合提测准入的标准。同时,流水线任务还用于监控和控制数仓任务变更的准出条件,以确保数仓任务在上线前达到所有必要的质量要求。这一过程不仅提高了数据质量管理的效率,还为线上数据的高质量提供了有力保障。

3.2.1 准入准出流程设计

我们为数据仓库流水线精心设计了准入和准出两个流程。在这些流程中,我们构建了多种测试场景,涵盖了数据测试的基础场景,以确保基本的数据质量。准入和准出的测试节点利用了大数据测试平台的模板功能,通过这些模板生成相应的测试任务。

接下来,我们将详细介绍准入和准出节点的设计。这些设计旨在优化数据质量管理流程,确保产出的数据符合高标准的质量要求。

3.2.1.1 准入流程
3.2.1.1.1 是否有数据

数据仓库测试的核心在于数据本身,因此,测试数据的存在性成为测试准入的必要条件之一。没有数据,测试将无法进行。为此,测试模板的设计应通过自定义方式验证相应测试库表分区的数据存在性。这种设计不仅确保了测试环境的准备就绪,还为测试工作的顺利开展奠定了基础。


SELECT 
    SUM(cnt) AS cnt 
FROM (
    SELECT 
        COUNT(1) AS cnt 
    FROM (
        SELECT * 
        FROM hive_gray_db.hive_table_name_XXX 
        WHERE 1 = 1 
        AND dt = '2025-05-08' 
        LIMIT 1
    ) a
) a;
3.2.1.2 准出流程
3.2.1.2.1 主键唯一

数据的唯一性在确保数据质量方面具有至关重要的意义,尤其是主键的唯一性。因此,验证测试库表的主键唯一性成为数据准出的必要条件之一。

为了实现这一目标,我们可以通过自定义库表和主键信息,利用GROUP BYHAVING关键字来判断是否存在重复的主键数据。这种方法帮助我们识别潜在的数据唯一性问题,从而维护数据的整体质量。

SELECT 
    COUNT(1) AS repeatCnt
FROM (
    SELECT 
        key_fields,
        COUNT(1) AS key_cnt
    FROM 
        hive_gray_db.hive_table_name_XXX
    WHERE 
        1 = 1
        AND dt = '2025-05-08'
    GROUP BY 
        key_fields
    HAVING 
        COUNT(1) > 1
) a;
3.2.1.2.2 数据波动

数据取数逻辑的改动可能会导致数据量级的变化,但这种变化应保持在一个合理的阈值内。数据波动的幅度已成为评估数据质量的重要指标之一。为了确保数据的稳定性和可靠性,我们可以通过操作关联灰度数据与线上表的数据量,进行环比计算验证。这一过程帮助我们识别异常波动,确保数据改动在预期范围内。

SELECT 
    (a.table_cnt - b.table_cnt) / b.table_cnt AS flowRate
FROM (
    SELECT 
        dt,
        COUNT(1) AS table_cnt
    FROM 
        hive_db.hive_table_name_XXX
    WHERE  
        dt BETWEEN '2025-05-08' AND '2025-05-08'
    GROUP BY 
        dt
) a
JOIN (
    SELECT 
        dt,
        COUNT(1) AS table_cnt
    FROM 
        hive_gray_db.hive_table_name_XXX
    WHERE  
        dt BETWEEN '2025-05-08' AND '2025-05-08'
    GROUP BY 
        dt
) b
ON a.dt = b.dt;
3.2.1.2.3 字段回归

在数据库表字段的取数逻辑修改过程中,确保未修改字段的完整性和一致性是关键的一步。若测试库表与正式库表中的未修改字段出现差异,可能预示着数据质量问题。为此,我们通过精确对比测试表与正式表中未修改字段不相等的数量,来评估数据是否符合准出标准。


SELECT 
    COUNT(1) AS diff_cnt
FROM (
    SELECT * 
    FROM hive_db.hive_table_name_XXX
    WHERE dt = '2025-05-08'
) a
LEFT JOIN (
    SELECT *
    FROM  hive_gray_db.hive_table_name_XXX
    WHERE dt = '2025-05-08'
) b
ON a.key_fields = b.key_fields
WHERE a.field1 <> b.field1 or a.field2 <> b.field2;
3.2.1.2.4 字段空值率

数据库表中的每个字段都承载着特定的含义,因此不应出现整个字段为空的情况。空字段不仅会增加沟通成本,还不符合数据质量管理的要求。为了确保数据的完整性,我们使用IS NULL或空字符串""两种方式来判断字段是否空值,从而计算出字段的空值率。

SELECT
    ROUND(
        COUNT(CASE 
                WHEN `field1` IS NULL 
                     OR `field1` = '' 
                THEN 1 
              END) / COUNT(1),
        4
    ) AS field1_rate,
    ROUND(
        COUNT(CASE 
                WHEN `field2` IS NULL 
                     OR `field2` = '' 
                THEN 1 
              END) / COUNT(1),
        4
    ) AS field2_rate
FROM 
    hive_gray_db.hive_table_name_XXX
WHERE 
    dt = '2025-05-08';

3.2.2 准入准出节点组装

数据任务的变更类型主要分为两类:新增Hive表任务和修改Hive表任务。针对不同的任务类型,我们设计了相应的准入和准出节点。

对于新增Hive表任务,准入节点主要关注数据的存在性,即确保新表中是否有数据。准出节点则包括主键唯一性检查和字段空值率检测。由于新增的Hive表是首次创建,无历史数据,因此无需配置数据波动和字段回归节点。

而对于修改Hive表任务,准入和准出节点则涵盖了所有测试任务类型节点。这包括数据一致性、字段回归、数据波动等多方面的验证,确保修改后的表符合预期标准。

3.3 应用实践

数仓流水线准入准出功能在数仓发布中应用的流程主要如下:

数仓准入准出流水线流程图

step1:在数仓开发完成灰度任务并在灰度环境中生成测试数据后,数仓离线发布平台会将数仓任务的信息发送至数仓流水线的准入准出平台。

step2:数仓流水线准入准出平台收到请求之后,会创建流水线任务,生成准入准出节点任务,数仓流水线准入准出平台根据数仓任务类型,调用大数据测试平台的模版生成测试任务的功能,生成不同类型的测试节点

step3:生成完成后,再触发准入准出任务的运行,这里会调用大数据测试平台的任务执行功能,测试任务执行完成之后,写入流水线结果中。

step4:流水线运行完成之后,若流水线运行结果失败,则发送告警消息到开发。

step5:在数仓离线平台中,数据发布上线时,灰度任务的流水线结果会当作发布卡点,若流水线运行结果成功,则可以进行线上发布,若不成功,则不能发布。

流水线任务详情页面图

数仓任务发布流水线成功卡点图

数仓任务发布流水线失败卡点图

从上可以看出,数仓流水线准入准出功能的整个应用过程无需开发手动进行数据测试,跑出测试数据之后,流水线任务则可以自动触发执行,生成的流水线任务的详情页如上所示,自动进行测试表的数据质量进行检查。节省自测时间,提高效率。其中的流水线的运行结果当作发布的卡点功能,数仓发布卡点的详情如上所示,规范了数据发布的流程,提高数据发布的质量。

四、成果

大数据数仓流水线平台的建设在流程规范化、效率提升和质量保障等方面取得了显著成效。这一平台不仅优化了工作流程,还大幅提高了操作效率,同时为数据质量提供了坚实的保障。

4.1 流程规范

  • 发布流程标准化与强制管控

    • 卡点机制落地:在数据仓库任务发布时,大数据离线数据开发平台会主动获取相应的数仓流水线结果。如果检测到准入或准出节点存在失败情况,发布过程将被强制拦截,做到从“无序发布”到“卡点驱动”。
  • 跨团队协作透明化

    • 数仓流水线节点失败自动触发飞书拉群通知,开发可通过此方式实时感知任务流水线结果状态并及时处理。
    • 测试人员可通过流水线看板&任务失败通知群感知数仓的任务变更,并主动关注流水线状态,感知数仓任务的数据质量,掌握数仓任务发布进展。

4.2 效率跃迁

  • 流水线全流程提效

    • 大数据数仓流水线平台实时感知数据任务为可测后,在分析变更,组合节点,生成用例,用例执行,结果触达、失败拦截的整个流程中都实现自动化,做到了全流程自动化,无需人工介入,从而达到效率的提升。
    • 截止到当前,共计覆盖数仓任务数 1000+,需求迭代3900+,累计节约时间 240+ 人日

4.3 质量加固

  • 质量防控升级:从“被动救火”到“主动防御”

    • 覆盖范围扩大:通过数仓流水线平台,扩大了数仓任务的覆盖范围,从原来的开发自测任务无测试手段覆盖,到现在的流水线全面覆盖。
    • 数据质量提升:从原来的开发自测任务发布自测质量不高,到现在的自测任务流水线覆盖,提高了自测任务的数据质量,截止到现在,共有效拦截 200+ 次发布,发现 300+ 问题

五、未来展望

货拉拉大数据数仓发布准入准出的建设,目前已经取得了一定的成效,后续计划从以下几个方面继续丰富货拉拉大数据数仓发布准入准出能力的广度和深度:

  • 智能结果判定:通过AI能力,对执行结果进行智能判定,减少噪音,降低误报率。
  • 更多节点引入:目前已支持准入准出共5个节点,后续计划加入更多的节点,提高准入准出节点测试对任务代码的覆盖率,提前发现更多问题。