随着 ODS 表数据越来越多,需求越来越复杂,直接关联 ODS 表进行实时数据分析时效性变得越来越差。
本文将分享如何基于 Doris 的 ODS 层来做实时数据分析,其他数仓方法类似。
一、 ROLLUP 和 物化视图
对于 Doris 来说,我们可以使用 ROLLUP 和 物化视图对 ODS 表进行优化,以提高查询效率。
1. Unique 模型
对于 Unique 模型,可以使用 ROLLUP 进行预聚合提高查询效率。但是要求 key 列必须和 Base 表主键字段一致,所以没有太大意义。
2. Aggregate 模型
对于 Aggregate 模型,可以使用 ROLLUP 进行预聚合提高查询效率。聚合方式与 Base 表保持一致,不可修改。
2. Duplicate 模型
使用 ROLLUP
对于 Duplicate 模型, 可以使用 ROLLUP 调整前缀索引,提高查询效率。
使用物化视图
对于 Duplicate 模型,可以使用物化视图进行预聚合提高查询效率。聚合方式可选比较多,比如 SUM、MAX、MIN
二、使用分层理论
直接使用 ODS 表进行关联,数据量大的时候查询会特别慢。
可以使用数仓分层理论,但是分层链路不能过多,否则达不到实时的目的。
1. ODS 层设计
ODS 层分为全量和增量接入,一般都为 Unique Key 模型。
全量接入将保留数据所有的历史数据
增量数据将保留最近N个月的数据,并且使用 binLog 中的 ts 作为分区字段
2. DWD 层设计
一般的小数据量数据分析需求可以直接通过 ODS 层查询得出。
当数据分析 sql 查询数据量比较大时,可以考虑准实时的办法,即在原有 ODS 层基础上建立小时级别的调度任务,生成 DWD 层。
查询时,只需要查询 DWD 层数据即可。
DWD 层一般为 ODS 表 join 形成的宽表,后续查询需求可以直接从 DWD 层出结果。
DWD 层也可以作为一个单表的轻度汇总层,简单的需求可以直接从 DWD 层出结果,复杂的需求可以再抽象出 DWS 层。
3. 增量 ODS 的使用
对于数据量比较大的查询需求,我们可以分为两个阶段完成:
-
初始阶段:
使用全量 ODS 表,手动将历史数据跑出来放到 DWD 表中。
-
每日增量:
建立1小时的调度任务,使用 binLog 时间作为过滤条件,定时从增量 ODS 表抽取宽表到 DWD 表中。
为了解决时间漂移的问题,binLog 时间可以往后冗余15分钟。为了解决乱序的问题,binLog 时间可以往前冗余15分钟。
对于订单状态这种时间跨度比较大的表,可以先和业务确认订单状态变更的最大天数,使用增量表和全量表数据进行合并,从而得出最终的订单状态。
全量表根据实际的业务创建时间(分区字段)来过滤,并且限制天数来避免全表扫描。
4. DWS 层设计
如果 DWD 层数据量也特别大,我们可以:
针对数据量大的 DWD 表做轻度汇总,并且以当天日期作为时间分区
建立小时级别的 DWS 调度任务
对于大部分实时或者准实时需求,ODS 层或者 DWD 层已经完全满足需求了,并且维护起来也比较方便。层数越多,对于后期的维护工作压力也比较大。
分层设计还有一个目的就是通用性,减少重复工作,所以在分层设计时尽量考虑通用性,维护好数仓分层文档。便于后续其他需求或者其他人来使用。
5. 优化
对于建立的 Aggregate 表或者 Duplicate 表都可以根据实际情况建立不同的 ROLLUP 或者物化视图,以提高查询效率。
三、Q & A
1. 主从不同步或者网络故障导致数据不同步怎么办?
当主从同步或网络恢复后,需要手动进行补数操作。根据服务不可用的具体时间来确定需要补数的范围,一般这种问题不会超过一天就会及时发现,只需要手动处理一天的数据即可。
2. 接入任务出错怎么办?
一般接入任务出错会及时告警,需要先停止调度任务。待接入任务恢复后,手动处理一小时的任务即可。
3. 重复消费问题如何解决?
如果 DWD 层建立了 Aggregate 或者 Duplicate 模型的表,任务重启会导致 Aggregate 模型数据重复消费。
这时需要先停止调度任务,删除当天分区的数据,待接入任务恢复后进行补数操作,避免统计误差。
对于建立了物化视图的 Duplicate 模型的表,如果要删除数据,则需要先将物化视图删除,然后方可删除数据。
往期推荐