一句话整体逻辑:ODS 原始落地 → DWD 清洗明细 → DWS 轻度汇总 → ADS 业务报表,一层加工一层,层层依赖,就是你 Azkaban 调度的整套 ETL 链路。
一、层级
1. ODS 层:原始数据层(Operational Data Store)
作用 :原样接入上游业务系统数据,几乎不做清洗,相当于数据的中转站、备份层。 数据源:业务 MySQL binlog、埋点日志、接口推送数据等。 特点:
- 数据结构、内容和上游几乎保持一致,只做落地、分区;
- 不做过滤、不清洗脏数据,保留原始所有记录;
- 主要用途:存档原始数据,一旦后面加工出错,可以重跑,不用再找上游拿数据;
- 缺点:数据杂乱,有脏数据、重复数据、无用字段,不能直接给业务使用。
👉 对应你的调度链路:第一个跑的任务,凌晨最先执行,ODS 跑完,DWD 才会启动
2. DWD 层:明细数据层(Data Warehouse Detail)
作用 :对 ODS 原始数据做清洗,产出干净的明细数据(最核心明细层)。 清洗动作:
- 剔除脏数据(空 user_id、-9999 异常 key、乱码);
- 去重、过滤无效日志;
- 字段标准化、格式统一;
- 关联少量维度表补全信息;
保留每条原始明细记录,不会合并聚合,一条日志还是一条记录。
特点:
- 数据质量高,标准统一;
- 是后续汇总计算的基础;
- 不做大粒度指标汇总。
👉 链路:ODS 成功后,触发 DWD 任务。
3. DWS 层:汇总 / 服务数据层(Data Warehouse Service)
作用 :基于 DWD 明细,按维度做轻度汇总,把明细聚合成常用的统计粒度(用户日、商品日、地区日)。 例子:按用户维度,统计当日访问次数、点击次数、停留时长。 特点:
- 减少数据量:几十万条明细,聚合后变成几万条汇总记录;
- 提前预计算指标,避免 ADS 重复计算,提升报表查询速度;
- 一般是多维度的汇总,支持上层报表复用。
👉 链路:DWD 跑完,再跑 DWS。
4. ADS 层:应用数据层(Application Data Store,报表层)
作用 :面向业务应用、大屏、报表,高度聚合,产出业务最终指标。 基于 DWS 汇总表,按照业务需求,定制计算业务指标。 示例:日活 DAU、GMV、转化率、留存、业务大盘报表。 特点:
- 直接对接业务平台、BI 报表;
- 一张表大多对应一个业务报表;
- 指标完全贴合业务语言,业务人员直接看这层。
👉 链路:DWS 跑完,最后跑 ADS,ADS 产出完成代表整套 T+1 数仓链路全部完成。
二、极简串联例子(用户行为埋点)
- ODS:接收原始埋点日志,原样保存,有大量脏数据、无效点击。
- DWD:清洗埋点,过滤脏数据,保留每条合法用户点击明细。
- DWS:按用户维度汇总:用户今日点击多少次、浏览多少次。
- ADS:计算大盘指标:今日总 DAU、总点击量,给业务 BI 报表展示。
三、精简版
ODS 是原始数据层,原样落地上游数据,作为备份; DWD 是明细层,清洗 ODS 脏数据,保留干净明细; DWS 是汇总层,基于明细做轻度聚合,预计算指标,减少上层计算压力; ADS 是应用报表层,面向业务,产出最终业务指标,供 BI、业务大屏使用。 四层上下游依赖,Azkaban 调度顺序:ODS→DWD→DWS→ADS,逐层串行执行。
四、高频Q&A
Q:DWD 和 DWS 最大区别? A:DWD 是明细 ,一条原始记录一条;DWS 是聚合汇总,多条明细合并成一条统计结果。
Q:能不能直接 ODS→ADS,跳过 DWD、DWS? A:技术上可以,但不推荐。ODS 脏数据多,直接计算报表容易出错;而且多个报表重复写清洗逻辑,代码冗余,不好维护。分层就是为了解耦、复用、方便数据回溯。
Q:DWS 和 ADS 怎么区分? A:DWS 是通用汇总,多个报表可以复用;ADS 是业务定制,一张表大多对应一个业务报表。