数仓报表需要支持历史数据和实时数据的整合的场景要如何处理

结合你的需求,需要支持 历史数据和实时数据的整合 ,并支持按时间粒度查询(如今日、本周、本月),这是一个常见的实时+离线混合处理场景。以下是详细分析和推荐方案,帮助你设计一个高效的 ETL 流程来满足这些需求。


1. 问题分析

  1. 历史数据处理(T+1 离线计算):

    • 历史数据(T+1)是指每晚批量计算前一天的数据,用于更新报表。
    • 离线计算适合大规模数据,成本低,但延迟高(一般次日更新)。
  2. 实时数据处理(今日增量):

    • 今日数据需要高实时性,支持实时查询和报表更新。
    • 如果今日数据量大,频繁全量计算会造成性能问题。
  3. 查询需求

    • 今日/昨日:依赖实时数据+离线数据。
    • 本周/本月:实时数据需要累加到已有的周/月统计结果。
  4. 难点

    • 整合 T+1 离线数据与实时增量数据
    • 保证高性能且不重复计算历史数据。
    • 在多粒度时间范围(小时、日、周、月)内高效处理。

2. 推荐方案:Lambda 架构

Lambda 架构是一种经典的实时+离线混合计算架构,能够很好地解决你的问题。其核心思想是通过两个计算路径:

  • 离线批计算(Batch Layer):用于处理 T+1 的历史数据。
  • 实时增量计算(Speed Layer):处理今日的实时数据。
  • 查询整合层(Serving Layer):将离线和实时数据整合,提供最终查询结果。

2.1 方案架构

  1. 离线批计算(Batch Layer)

    • 每晚处理前一天的完整数据,更新 DWS 表中的周、月等汇总统计。
    • 任务特点:低频、大批量、高吞吐。
  2. 实时增量计算(Speed Layer)

    • 每 5 分钟定时从源表(如 ODS)提取增量数据,根据上次处理的时间点 last_time
    • 增量数据用于更新今日统计数据,并逐步累加到周、月维度。
    • 任务特点:高频、小批量、低延迟。
  3. 查询整合(Serving Layer)

    • 查询时,将离线表(DWS)中的历史数据与实时表中的增量数据进行整合。
    • 按需聚合历史+实时数据,保证查询结果实时性和完整性。

2.2 任务调度

采用定时调度增量任务 + 批量离线计算相结合:

  1. 离线批计算(每日 T+1)

    • 每天凌晨(如 2:00 AM)执行批量任务。
    • 汇总前一天的完整数据,更新 DWS 表(周表、月表等)。
    • 任务例子:
      • ODS 数据按时间分区聚合,生成 DWDDWS 的历史统计表。
      • 更新周/月累计统计。
  2. 实时增量计算(增量 5 分钟)

    • 每 5 分钟定时提取增量数据,根据 last_time 标记记录处理的最新时间。
    • 增量数据直接写入实时表,更新今日、本周、本月统计结果。
  3. 数据整合

    • 将离线表和实时表按查询需求整合。例如:
      • 查询 今日数据:从实时表获取今日增量数据。
      • 查询 本周数据:从离线表获取历史周数据 + 实时表获取今日增量。

2.3 关键设计细节

1. 增量数据的提取
  • 每次增量任务处理前,记录上次处理时间 last_time
  • 通过时间过滤条件提取新产生的数据。

示例 SQL

sql 复制代码
SELECT * 
FROM ods_order_data 
WHERE created_time > '${last_time}' AND created_time <= NOW();
2. 实时表的更新
  • 每次增量计算后,更新实时表(例如 realtime_sales_stats),按时间维度进行累加。

示例 SQL(按小时粒度更新今日统计):

sql 复制代码
INSERT INTO realtime_sales_stats (date, hour, revenue)
SELECT DATE(NOW()), HOUR(NOW()), SUM(amount)
FROM ods_order_data
WHERE created_time > '${last_time}' AND created_time <= NOW()
ON DUPLICATE KEY UPDATE revenue = revenue + VALUES(revenue);
3. 查询整合
  • 对于报表查询(如本周数据),动态整合离线表和实时表:
    • 离线表(DWS):存储截至昨日的周累计数据。
    • 实时表(Real-time):存储今日增量。

示例 SQL(查询本周营收报表):

sql 复制代码
SELECT 
    SUM(revenue) AS total_revenue
FROM (
    -- 离线部分(历史数据)
    SELECT revenue 
    FROM dws_weekly_sales 
    WHERE week = WEEK(NOW()) - 1

    UNION ALL

    -- 实时部分(今日增量)
    SELECT revenue 
    FROM realtime_sales_stats 
    WHERE date = DATE(NOW())
) AS combined_data;

2.4 时间粒度更新的策略

  1. 小时维度

    • 实时任务每 5 分钟增量更新。
    • 数据写入 realtime_sales_stats 表,按小时聚合。
  2. 日维度

    • 实时任务在当天最后 1 分钟执行汇总。
    • 离线任务处理 T+1 数据,覆盖昨日的最终结果。
  3. 周/月维度

    • 实时任务每日更新周累计/月累计数据,离线任务每周/月末校正最终结果。

2.5 数据表设计

结合 Couchbase 的 scopescollections,推荐以下表设计:

  • ODS(原始数据)

    • scope: ods
    • collection: order_data, payment_data, refund_data
  • DWD(明细表)

    • scope: dwd
    • collection: order_detail, payment_detail, refund_detail
  • DWS(汇总表,离线数据)

    • scope: dws
    • collection: daily_sales, weekly_sales, monthly_sales
  • ADS(报表层,实时数据)

    • scope: ads
    • collection: realtime_sales_stats

3. 总结

  1. 历史和实时整合:采用 Lambda 架构,将离线批处理与实时增量处理结合。
  2. 任务调度策略
    • T+1 历史数据:每天凌晨批量计算。
    • 今日实时增量:每 5 分钟增量更新,使用 last_time 控制增量范围。
  3. 查询整合
    • 动态组合离线表和实时表,满足历史+实时查询需求。
  4. 关键指标更新
    • 根据时间粒度动态调整任务频率,减少重复计算。
相关推荐
AmHardy3 个月前
系统架构设计师 大数据架构篇一
大数据·架构·系统架构·lambda架构
怒码ing3 个月前
数仓架构:离线数仓、实时数仓Lambda和Kappa、湖仓一体数据湖
大数据·数据仓库·实时数仓·lambda架构·kappa架构·离线数仓·数仓架构
字节跳动数据平台4 个月前
ByteHouse高性能向量检索实践——“以图搜图”
大数据·数据库·云原生·数仓·click house
༺心有谦谦结༻7 个月前
淘宝数据分析——Python爬虫模式♥
数据采集·python爬虫·实时数据·电商api·淘宝销量·淘宝店铺·淘宝天猫app
顽石九变8 个月前
【数仓】数仓建模理论及步骤,ER建模,维度建模,星形模型,雪花模型,数据分层
大数据·数仓
华为云开发者联盟8 个月前
详解数仓对象设计中序列SEQUENCE原理与应用
数仓·华为云开发者联盟·华为云gaussdb(dws)
顽石九变9 个月前
【数仓】kafka软件安装及集群配置
大数据·分布式·zookeeper·kafka·数仓
顽石九变9 个月前
【数仓】Hadoop集群配置常用参数说明
大数据·hadoop·分布式·数仓
张飞的猪10 个月前
ClickHouse(24)ClickHouse集成mongodb表引擎详细解析
大数据·数据库·数据仓库·clickhouse·etl·数仓·数据处理·数据开发