物化表管理

传统数仓架构(如Lambda/Kappa)面临三大核心痛点:流批处理架构的分离导致开发与维护成本的增加,多副本存储造成存储资源的浪费,以及跨层数据口径对齐的复杂性引发一致性风险。为应对这些挑战,引入了物化表(Materialized Table),其基于数据的新鲜度(分钟/天级)和查询语句自动生成表结构(Schema),并建立持续刷新的数据管道。此机制将流批处理逻辑统一为单一路径,不仅消除了冗余存储副本,而且保障了全链路数据口径的一致性,从而显著简化了实时数仓的运维复杂度。

物化表核心概念

数据新鲜度

  • 定义:数据新鲜度是物化表的核心参数,表示物化表数据相对于基础表(源表)更新的最大允许滞后时间。它并非绝对保证,而是Flink尝试达到的目标。数据新鲜度决定了数据刷新的时效性要求,是自动化数据管道管理的关键依据。

  • 作用

    • 决定数据刷新模式(持续模式或全量模式)。

    • 平衡时效性与资源消耗(例如:分钟级新鲜度适用于实时大屏,小时级或天级适用于离线分析)。

刷新模式

物化表支持两种数据刷新模式,根据业务场景灵活选择:

刷新模式

机制描述

可见性

使用场景

持续模式

通过流作业增量更新物化表数据,仅处理变化部分。

下游数据在Checkpoint完成后可见(确保一致性)或立即可见(低延迟场景)。

实时性要求高(如风控、实时推荐)。

全量模式

调度器按固定周期(如每天、每小时)触发批处理作业,全量覆盖物化表数据。若定义分区字段(如时间分区),可仅刷新最新分区,避免全表重写。

全量数据更新后可见。

历史数据修正、定期生成报表等场景。

查询定义

支持所有Flink SQL查询语句,定义物化表的数据来源和计算逻辑。

动态更新

  • 持续模式下,查询结果实时更新至物化表。

  • 全量模式下,每次调度执行查询并覆盖旧数据,确保结果准确性。

Schema管理

物化表的列名、类型会从查询语句自动解析生成,无需手动声明。

扩展能力

  • 支持显式声明主键(如PRIMARY KEY)优化查询性能。

  • 通过分区字段(如时间字段)实现数据分层管理,提升刷新效率。

物化表工作原理

物化表需明确定义两个核心参数:数据新鲜度(FRESHNESS)和查询语句(AS SELECT)。Flink引擎通过查询结果自动推导Schema,并在Catalog中注册物化表结构,同时根据新鲜度配置自动创建流式或批处理作业来维护数据更新。

image

如图所示,当物化表C的新鲜度设置为30分钟时,系统会最大限度地保证该表数据相对于基表(如物化表A)的滞后时间不超过该阈值,且下游表的新鲜度必须为上游的整数倍(如60分钟或90分钟)。通过延长新鲜度参数(最大支持1天),可降低高频更新带来的资源消耗,例如将分钟级更新调整为小时级批量更新。

应用场景

物化表通过流批一体的湖仓范式设计,在以下场景中具有显著的技术与成本优势:

  • 历史数据修正。

    由于数据传输延时等问题可能导致最终数据存在部分失真,因此通常需要离线作业对数据进行修正。物化表的刷新能力允许在任意时间更新数据,同时对下游所有关联的物化表进行统一更新。

  • 数据口径对齐。

    Lambda架构中,离线和实时数据需分别存储于不同的业务系统中,处理逻辑与建表字段难以实现自然对齐。物化表可以确保数据仅存储一份,避免了复杂的拼接计算。这不仅有效节省了存储资源,还显著减少了数据对齐口径问题的。

  • 动态数据大屏实时统计。

    动态数据大屏在不同业务场景下对数据刷新的时间要求存在显著差异。物化表可以通过简单调整数据的新鲜度,实现从天级到分钟级的数据刷新能力,无需单独建立实时链路,从而使实时化过程变得更加便捷。

如何使用物化表

文档

说明

创建及使用物化表

了解如何创建物化表,以及进行历史数据回刷、修改新鲜度、查看物化表的血缘关系。

物化表快速入门(构建流批一体湖仓)

了解如何基于Paimon和物化表,构建流批一体的湖仓分析处理链路,以及通过修改表数据新鲜度,完成由批到流的切换,实现数据实时更新。

基于物化表构建流批一体湖仓演示

视频仅供参考,具体界面及功能以实际控制台为准。

相关文档