数仓搭建的背景
-
需求调研与分析
- 与业务部门、BI 团队、数据科学团队深度沟通,明确主体业务场景(营销分析、用户画像、财务报表等)。
- 制定关键指标(KPI)、度量口径、维度定义、报表需求和数据更新频率。
-
数据源梳理与评估
- 列举所有来源系统:线上业务库(MySQL、PostgreSQL)、消息队列(Kafka)、日志系统、第三方 API、文件系统(CSV/Parquet)等。
- 评估数据质量(完整性、准确性、延迟)、容量和更新频率。
-
总体架构设计
- 确定数仓部署平台:本地机房 vs 公有云 vs 混合云。
- 选型存储与计算:例如使用 Hadoop + Hive、Spark、Flink;或云厂商的 Data Warehouse 服务(阿里云 MaxCompute、AWS Redshift、ClickHouse 等)。
- 制定数据安全、权限管理、数据标准与元数据管理策略。
-
分层模型规划
- 设计分层(见下一节),将数据抽象成多个逻辑层,逐层清洗、汇总、整合、服务化。
-
ETL/ELT 开发
- 编写数据抽取(Extract)、清洗(Transform)、加载(Load)作业。
- 制定调度策略(Airflow、Oozie、Flink-CDC、Dubbo 任务等),并实现容错、重试、告警。
-
数据建模与存储
- 采用星型模型(Star Schema)或雪花模型(Snowflake Schema)设计事实表和维度表。
- 定义建模规范:主键、外键、字典表、维度缓慢变化(SCD)策略。
-
BI/分析层对接
- 将建好的数据集市(Data Mart)或 OLAP 表暴露给 BI 工具(Tableau、FineBI、Power BI、Superset)。
- 优化查询性能:建立索引、分区、列存储表、聚合物化视图等。
-
监控与运维
- 数据质量监控:行数校验、增量校验、异常数据抓取。
- 作业监控:调度成功率、延迟、资源占用、告警通知。
- 元数据管理:血缘分析、数据目录、血缘图、数据资产管理。
常见的数仓分层模型
为了使 ETL 流程清晰、职责分离,在实践中最常见的分层模型包括:
分层 | 英文 | 作用 | 存储/技术示例 |
---|---|---|---|
ODS | Operational Data Store | 原始数据落地层,按业务系统或数据源维度进行分区存储,保留近实时的原始快照,用于排障与溯源 | Kafka、HDFS、对象存储(S3/GCS/OSS) |
DWD | Data Warehouse Detail Layer | 明细层,对 ODS 数据进行清洗、标准化、字段修正、数据补齐;形成统一的业务主题明细表 | Hive/Impala、ClickHouse、Hudi、Iceberg |
DWS | Data Warehouse Summary Layer | 汇总层,对 DWD 明细按业务维度(时间、地区、产品)进行聚合,生成常用汇总指标 | ClickHouse、Doris、Spark SQL |
DWM | Data Warehouse Wide Table | 宽表层,将汇总后的指标与维度表做宽表拼接(Kafka 可直接推宽表),为 BI 或应用提供扁平化数据接口 | Kafka Topic、ClickHouse |
ADS | Application Data Service | 应用层/分析层,面向具体的 BI 报表或数据产品,可能再做二次聚合、透视表、数据补市场景 | ClickHouse、Doris、Presto、Superset |
备注:有时 DWM(宽表层)和 ADS(分析层)合并为一个层级,也可根据业务复杂度和技术选型灵活调整。
各层职责与示例
1. ODS(原始数据层)
职责:实时或准实时接收各系统的原始数据,保留业务系统事实表的“真相”;不做任何业务逻辑转换。
-
示例:
-- 将 Kafka 中原始 JSON 直接写入 HDFS CREATE TABLE ods_user_behavior ( `dt` Date, `raw_value` String ) ENGINE = Kafka(...);
2. DWD(明细层)
职责:对 ODS 进行清洗、标准化、字段拆分、类型转换、缺失值补齐、维度编码等,使数据符合仓库规范。
-
示例:
INSERT INTO dwd_user_behavior SELECT parseDateTime(raw_value, 'yyyy-MM-dd HH:mm:ss') AS event_time, JSONExtractUInt(raw_value, 'user_id') AS user_id, JSONExtractString(raw_value, 'url') AS url, JSONExtractString(raw_value, 'device') AS device FROM ods_user_behavior WHERE dt = today();
3. DWS(汇总层)
职责:基于 DWD 对明细数据按业务维度(日期、渠道、产品)进行日/时/周/月等粒度的聚合。
-
示例:
INSERT INTO dws_daily_pageview SELECT toDate(event_time) AS date, url, COUNT(*) AS pv, uniqExact(user_id) AS uv FROM dwd_user_behavior WHERE event_time >= yesterday() GROUP BY date, url;
4. DWM(宽表层)
职责:将汇总指标和维度信息做宽表拼接,形成可直接用于 BI 或实时计算的扁平化表。
-
示例:
INSERT INTO dwm_pageview_wide SELECT a.date, a.url, a.pv, a.uv, b.category_name, b.owner FROM dws_daily_pageview AS a LEFT JOIN dim_url_info AS b ON a.url = b.url;
5. ADS(分析层)
职责:面向最终的报表、可视化、数据挖掘、机器学习等场景,对 DWM 层或 DWS 层的数据再进行二次处理。
-
示例:
-- 在 ClickHouse 上创建物化视图,实时计算 Top10 页面 CREATE MATERIALIZED VIEW ads_top10_pages ENGINE = SummingMergeTree() ORDER BY date AS SELECT date, url, sum(pv) AS total_pv FROM dwm_pageview_wide GROUP BY date, url;
对于 BI 场景而言,数据仓库的搭建不仅仅是“把数据放到一个地方”,而是要通过分层模型(ODS → DWD → DWS → DWM → ADS)的体系化设计,提供“标准化数据、快速查询、多维分析、高质量保障、自助化服务”的能力,帮助企业实现“以数据驱动决策”的目标。