结合你的需求,需要支持 历史数据和实时数据的整合 ,并支持按时间粒度查询(如今日、本周、本月),这是一个常见的实时+离线混合处理场景。以下是详细分析和推荐方案,帮助你设计一个高效的 ETL 流程来满足这些需求。
1. 问题分析
-
历史数据处理(T+1 离线计算):
- 历史数据(T+1)是指每晚批量计算前一天的数据,用于更新报表。
- 离线计算适合大规模数据,成本低,但延迟高(一般次日更新)。
-
实时数据处理(今日增量):
- 今日数据需要高实时性,支持实时查询和报表更新。
- 如果今日数据量大,频繁全量计算会造成性能问题。
-
查询需求:
- 今日/昨日:依赖实时数据+离线数据。
- 本周/本月:实时数据需要累加到已有的周/月统计结果。
-
难点:
- 整合 T+1 离线数据与实时增量数据。
- 保证高性能且不重复计算历史数据。
- 在多粒度时间范围(小时、日、周、月)内高效处理。
2. 推荐方案:Lambda 架构
Lambda 架构是一种经典的实时+离线混合计算架构,能够很好地解决你的问题。其核心思想是通过两个计算路径:
- 离线批计算(Batch Layer):用于处理 T+1 的历史数据。
- 实时增量计算(Speed Layer):处理今日的实时数据。
- 查询整合层(Serving Layer):将离线和实时数据整合,提供最终查询结果。
2.1 方案架构
-
离线批计算(Batch Layer):
- 每晚处理前一天的完整数据,更新 DWS 表中的周、月等汇总统计。
- 任务特点:低频、大批量、高吞吐。
-
实时增量计算(Speed Layer):
- 每 5 分钟定时从源表(如 ODS)提取增量数据,根据上次处理的时间点
last_time
。 - 增量数据用于更新今日统计数据,并逐步累加到周、月维度。
- 任务特点:高频、小批量、低延迟。
- 每 5 分钟定时从源表(如 ODS)提取增量数据,根据上次处理的时间点
-
查询整合(Serving Layer):
- 查询时,将离线表(DWS)中的历史数据与实时表中的增量数据进行整合。
- 按需聚合历史+实时数据,保证查询结果实时性和完整性。
2.2 任务调度
采用定时调度增量任务 + 批量离线计算相结合:
-
离线批计算(每日 T+1):
- 每天凌晨(如 2:00 AM)执行批量任务。
- 汇总前一天的完整数据,更新 DWS 表(周表、月表等)。
- 任务例子:
- 将
ODS
数据按时间分区聚合,生成DWD
、DWS
的历史统计表。 - 更新周/月累计统计。
- 将
-
实时增量计算(增量 5 分钟):
- 每 5 分钟定时提取增量数据,根据
last_time
标记记录处理的最新时间。 - 增量数据直接写入实时表,更新今日、本周、本月统计结果。
- 每 5 分钟定时提取增量数据,根据
-
数据整合:
- 将离线表和实时表按查询需求整合。例如:
- 查询 今日数据:从实时表获取今日增量数据。
- 查询 本周数据:从离线表获取历史周数据 + 实时表获取今日增量。
- 将离线表和实时表按查询需求整合。例如:
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 时间粒度更新的策略
-
小时维度:
- 实时任务每 5 分钟增量更新。
- 数据写入
realtime_sales_stats
表,按小时聚合。
-
日维度:
- 实时任务在当天最后 1 分钟执行汇总。
- 离线任务处理 T+1 数据,覆盖昨日的最终结果。
-
周/月维度:
- 实时任务每日更新周累计/月累计数据,离线任务每周/月末校正最终结果。
2.5 数据表设计
结合 Couchbase 的 scopes
和 collections
,推荐以下表设计:
-
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. 总结
- 历史和实时整合:采用 Lambda 架构,将离线批处理与实时增量处理结合。
- 任务调度策略 :
- T+1 历史数据:每天凌晨批量计算。
- 今日实时增量:每 5 分钟增量更新,使用
last_time
控制增量范围。
- 查询整合 :
- 动态组合离线表和实时表,满足历史+实时查询需求。
- 关键指标更新 :
- 根据时间粒度动态调整任务频率,减少重复计算。