Dynamic Table概述

Hologres推出了声明式数据处理架构Dynamic Table,该架构可以自动处理并存储一个或者多个基表(Base Table)对象的数据聚合结果,内置不同的数据刷新策略,业务可以根据需求设置不同的数据刷新策略,实现数据从基表对象到Dynamic Table的自动流转,满足业务统一开发、数据自动流转、处理时效性等诉求。

背景信息

在实时数仓场景中,通常会涉及到复杂的业务处理,例如多表关联查询、大表聚合查询等,针对不同场景,业务在时效性方面也有不同的需求:

  • 风控、推荐等纯实时场景(实时场景):需要秒级/毫秒级出结果。

  • 实时报表、BI看数等场景(近实时场景):时效性可以允许分钟级延迟。

  • 定期报表、查历史数据等场景(离线场景):查询频率较低,时效性可以允许小时级延迟。

同时业务之间也会有关联查询的诉求,需要严格保证数据口径一致性。

为了满足业务资源成本、开发效率及业务时效性等需求,业界做了比较多的架构研究演进,例如早期的Lambda架构、流批一体架构等,虽然解决了部分业务/开发问题,但还存在以下问题:

  • 架构上:目前市面上的产品通过相互组合的解决方案,来支持不同业务场景不同时效性的业务诉求。不能在一个产品里满足所有业务诉求。

  • 数据加工上(ETL):从明细层到应用层,实时数仓没有明确的方法论,无法做到更低成本的数据自动流动,资源成本高、开发效率低。

基于上述背景,Hologres重磅推出Dynamic Table,支持全量、增量的数据处理模式,实现更高效、更低成本的数据自动流动与分层。通过Dynamic Table,结合Hologres本身特性,能够统一存储层、统一计算层、统一数据服务层,满足开发效率、时效性等需求。

Dynamic Table的优势

  • 简化数仓架构

    Dynamic Table多种刷新模式可实现不同级别的时延,满足业务不同时效性的查询诉求,再基于Hologres的统一存储(存储实时数据、离线数据),直接赋能业务OLAP查询、在线服务、AI与大模型等多个应用场景的查询诉求,有效简化数仓架构,节约开发、运维成本。

  • 自动数仓分层

    Dynamic Table可以自动刷新数据,实现数据从ODS>DWD>DWS>ADS的自动数据流转,提升数仓分层体验。

  • 提升数据处理(ETL)效率

    Dynamic Table支持全量刷新和增量刷新,满足业务的不同时效性处理需求。对于增量刷新,只处理增量数据,减少ETL计算数据量,显著提升数据处理效率。

  • 简化开发维护

    Dynamic Table自动管理刷新任务,以及数据之间的层级和依赖关系,简化繁琐的开发运维流程,提升开发效率。

image

基本概念

  • 基表(Base Table)

    Dynamic Table中数据来源的基表,可以是一张表(内部表或外部表),也可以是多个表关联。不同的刷新模式,支持的基表类型不同。详情请参见Dynamic Table支持范围和限制

  • Query

    创建Dynamic Table时指定的Query,是指对基表数据的处理Query,相当于ETL过程。不同的刷新模式支持的Query类型不同,详情请参见Dynamic Table支持范围和限制

  • 刷新(Refresh)

    当基表中的数据发生变化时,需要通过刷新(Refresh)Dynamic Table以更新数据的变动。Dynamic Table会根据设置的刷新开始时间和刷新间隔,自动在后台运行刷新任务,对刷新任务的观测和运维详情请参见运维Dynamic Table刷新任务

技术原理

基表中的数据根据Dynamic Table中Query定义的数据处理流程,通过刷新的方式写入Dynamic Table。以下将从刷新模式、计算资源、数据存储及表索引四个方面介绍Dynamic Table的部分技术原理。

刷新模式

当前Dynamic Table支持两种刷新模式,即全量刷新(Full)和增量刷新(Incremental),根据设置的刷新模式不同,Dynamic Table的技术原理也有所差异。

全量刷新(Full)

全量刷新是指每次执行刷新时,都以全量的方式进行数据处理,并将基表的聚合结果物化写入Dynamic Table,其技术原理类似于INSERT OVERWRITE的相关原理。

增量刷新(Incremental)

增量刷新模式下,每次刷新时只会读取基表中新增的数据,根据中间聚合状态和增量数据计算最终结果并更新到Dynamic Table中。相比全量刷新,增量刷新每次处理的数据量更少,效率更高,从而可以非常有效地提升刷新任务的时效性,同时降低计算资源的使用。

  • 技术原理

    创建了增量刷新的Dynamic Table后,系统会在底层创建一个列存的状态表(State表),用于存储Query的中间聚合状态,引擎在编码、存储等方面对中间聚合状态进行了优化,可以加快对中间聚合状态的读取和更新。增量数据会以微批次方式做内存态的聚合,再与状态表中的数据进行合并,然后以BulkLoad的方式将最新聚合结果高效地写入Dynamic Table。微批次的增量处理方式减少了单次刷新的数据处理量,显著提升了计算的时效性。

  • 注意事项

    • 增量刷新模式支持的基表存在一定的限制,详情请参见Dynamic Table支持范围和限制

    • 增量刷新需要基表开启Binlog,以此感知基表的数据变化,详情请参见订阅Hologres Binlog

    • 增量刷新内置的状态表会占用一定的存储,系统会设置TTL定期清理数据,您可以使用函数查看状态表的存储大小,详情请参见状态表(State)管理

计算资源

执行刷新任务的计算资源可以是本实例的资源或者Serverless资源:

  • 本实例资源:刷新任务将会使用本实例的资源运行,与实例中的其他任务共享资源,高峰期可能会出现资源争抢现象。

  • Serverless资源(默认):默认会将刷新任务通过Serverless方式执行,如果Query比较复杂,处理的数据量较多,通过Serverless方式可以有效地提升刷新任务的稳定性,避免本实例内多任务间的资源争抢,同时也可以对单个刷新任务修改计算资源,以便更合理地使用Serverless资源。

数据存储

Dynamic Table在数据存储方面与普通表一致,默认使用热存储模式。为了减少存储成本,也可以将查询频率较低的数据设置为冷存储,有效降低成本。

表索引

业务在查询时,可以直接查询Dynamic Table,相当于直接查询聚合结果,这样可以显著提升查询性能。同时,Dynamic Table也如同普通表,支持设置表索引,如行存/列存、Distribution Key、Clustering Key等,通常情况下,引擎会根据Dynamic Table的Query推导出合适的索引,如业务有进一步的调优需求,可以重新为其设置合适的索引,以进一步提升查询性能。image

与物化视图对比

Dynamic Table VS Hologres实时物化视图

Hologres在V1.3版本推出了SQL管理物化视图,但是支持的能力相对较弱,与Dynamic Table的差异如下:

功能分类

Hologres Dynamic Table

Hologres实时物化视图

基表类型

  • 内部表

  • 外部表(MaxCompute、Paimon、OSS)

  • Dynamic Table

  • 视图

单内表

基表操作

  • 写入

  • 更新

  • 删除

仅支持append写入

刷新原理

异步刷新(全量刷新、增量刷新)

同步刷新

刷新时效性

  • 分钟级

  • 小时级

实时

Query类型

  • 单表聚合

  • 多表关联

  • 维表JOIN

  • 复杂OLAP:窗口、CTE、RB等

说明

不同的刷新模式,支持的Query类型不同,详情请参见Dynamic Table支持范围和限制

有限算子支持(AGG、RB函数等)

查询模式

直接查Dynamic Table

  • 直接查物化视图

  • 查询改写

Dynamic Table VS 异步物化视图

当前市面上,与Dynamic Table功能类似的有OLAP产品的异步物化视图、Snowflake的Dynamic Table等,其差别如下:

功能分类

Hologres Dynamic Table

OLAP产品异步物化视图

Snowflake Dynamic Table

基表类型

  • 内部表

  • 外部表(MaxCompute、Paimon、OSS)

  • Dynamic Table

  • 视图

说明

不同的刷新模式,支持的Query类型不同,详情请参见Dynamic Table支持范围和限制

  • 内部表

  • 外部表(Hive、Hudi、Iceberg等)

  • 物化视图

  • 视图

  • 内部表

  • Dynamic Table

  • 视图

刷新模式

  • 全量刷新

  • 增量刷新

  • 全量刷新

  • 指定分区/数据范围刷新

  • 全量刷新

  • 增量刷新

刷新时效性

  • 分钟级

  • 小时级

小时级

  • 小时级

  • 分钟级

Query类型

  • 单表聚合

  • 多表关联

  • 维表JOIN

  • 复杂OLAP:窗口、CTE、RB等

说明

不同的刷新模式,支持的Query类型不同,详情请参见Dynamic Table支持范围和限制

  • 单表聚合

  • 多表关联

  • 维表JOIN

  • 复杂OLAP:窗口、CTE等

  • 单表聚合

  • 多表关联

  • 维表JOIN

  • 复杂OLAP:窗口、CTE等

查询模式

直接查Dynamic Table

  • 直接查物化视图

  • 查询改写

直接查Dynamic Table

观测/运维

  • DataWorks、Holoweb可视化界面

  • 丰富的监控指标

丰富的监控指标

可视化界面

使用场景

Dynamic Table可以自动完成数据加工和存储,通过Dynamic Table,可以加速数据查询,提升业务时效性,推荐您在湖仓加速和数仓分层场景中使用。

湖仓加速

Dynamic Table的基表数据可以来源于Hologres表,也可以来源于数据仓库,例如MaxCompute、数据湖OSS、Paimon等,通过对基表数据的全量/增量刷新,满足不同时效性的数据查询探索需求。推荐的使用场景包括:

  • 定期报表查询

    对于周期性观测的相关场景,例如周期性报表等,如果数据量较少或者Query不复杂,可以使用全量刷新或者增量刷新的模式,周期性地将湖仓数据的聚合分析结果刷新至Dynamic Table,应用侧直接查询Dynamic Table获取分析结果,加速报表查询。

  • 实时大屏/报表

    对于实时大屏和实时报表等场景,数据的时效性要求更高,推荐使用增量刷新的模式,将湖Paimon或者实时数据的聚合分析结果刷新至Dynamic Table,以此来加速对实时数据的处理,应用侧直接查询Dynamic Table获取数据分析结果,达到近实时分析的目的。image

数仓分层

如果基表中有大量数据,需要进行复杂的ETL处理来满足业务的时效性需求,常见的做法就是数仓分层。对于实时数仓,业界在数仓分层上的方案较多,例如使用物化视图、周期性调度等,这些方案虽然能解决一部分问题,但也都存在数据时效性、开发不便捷等问题。而Hologres Dynamic Table本身就具备数据自动处理的能力,因此可以通过Dynamic Table方便地实现数仓分层。

推荐做法如下:

可以在Hologres中通过Dynamic Table构建数仓分层DWD>DWS>ADS:

  • 每一层之间的数据同步使用增量刷新模式,这样可以确保每一层处理的数据量更少,减少不必要的重复计算,提升同步速度。也可以根据业务情况,将刷新任务提交到Serverless Computing执行,进一步提升刷新的时效性和稳定性。

  • 如果要对每一层的数据进行回刷,可以使用全量刷新模式执行一次刷新,以此来保证每一层数据口径的一致性。同样也可以根据业务情况,将刷新任务提交到Serverless Computing执行,进一步提升刷新的时效性和稳定性。

  • 每一层都在Hologres中构建,数仓分层明确,每一层都可以根据业务情况提供查询,保证数据的可见性、复用性。

通过Hologres Dynamic Table方案即可完成数据加工+应用的场景,显著提升数仓开发、运维效率。image