一、ODS层(Operational Data Store)
1.1 数据同步策略
| 同步方式 | 适用场景 | 技术实现 | 延迟 | 数据一致性 |
|---|---|---|---|---|
| 全量同步 | 初始化/历史数据 | DataX全量抽取、Sqoop全表导入 | 小时级 | 强一致 |
| 增量同步 | 每日新增数据 | 时间戳字段过滤(create_time) |
天级 | 最终一致 |
| CDC同步 | 实时数据(订单/交易) | Flink CDC、Canal、Debezium | 秒级 | 强一致 |
| 日志同步 | 用户行为数据 | Kafka日志采集、Flume | 分钟级 | 最终一致 |
1.2 数据保留策略
- 热数据:最近7天(直接查询)
- 温数据:7-30天(压缩存储)
- 冷数据:30-180天(归档存储)
- 历史数据:180天以上(备份到对象存储)
1.3 典型表结构示例
sql
-- 订单表(ods_order)
CREATE TABLE ods_order (
id BIGINT COMMENT '订单ID',
order_no STRING COMMENT '订单号',
user_id BIGINT COMMENT '用户ID',
amount DECIMAL(10,2) COMMENT '订单金额',
create_time TIMESTAMP COMMENT '创建时间',
update_time TIMESTAMP COMMENT '更新时间',
dt STRING COMMENT '分区字段',
op_type STRING COMMENT '操作类型(I/U/D)'
) PARTITIONED BY (dt STRING);
1.4 数据质量监控
- 完整性:记录数波动(±10%告警)
- 准确性:关键字段非空率(如订单ID)
- 一致性:主外键关系(如user_id存在用户表)
- 及时性:数据延迟(超过5分钟告警)
二、DWD层(Data Warehouse Detail)
2.1 数据清洗规则
| 清洗类型 | 规则示例 | 处理方式 | 业务影响 |
|---|---|---|---|
| 空值 | user_id为NULL | 丢弃记录/填充默认值 | 高 |
| 异常值 | 年龄>150或<0 | 丢弃记录/标记异常 | 高 |
| 重复值 | 同一订单多次插入 | 去重(保留最新) | 中 |
| 格式 | 手机号非11位 | 丢弃/标记异常 | 中 |
| 逻辑 | 订单金额<0 | 丢弃/人工审核 | 高 |
2.2 维度建模技术
2.2.1 星型模型
sql
-- 事实表(dwd_order_fact)
CREATE TABLE dwd_order_fact (
order_id BIGINT COMMENT '订单ID',
user_id BIGINT COMMENT '用户ID',
product_id BIGINT COMMENT '商品ID',
order_amount DECIMAL(10,2) COMMENT '订单金额',
order_time TIMESTAMP COMMENT '下单时间',
user_level STRING COMMENT '用户等级(维度退化)',
product_category STRING COMMENT '商品类目(维度退化)'
);
-- 维度表(dim_user)
CREATE TABLE dim_user (
user_id BIGINT COMMENT '用户ID',
user_name STRING COMMENT '用户名',
user_level STRING COMMENT '用户等级',
register_time TIMESTAMP COMMENT '注册时间'
);
2.2.2 拉链表(SCD Type 2)
sql
-- 用户维度拉链表
CREATE TABLE dim_user_zipper (
user_id BIGINT,
user_name STRING,
user_level STRING,
start_date DATE,
end_date DATE,
is_current BOOLEAN
);
2.3 数据标准化规范
- 时间格式 :统一为
YYYY-MM-DD HH:MM:SS - 金额单位:统一为元(保留2位小数)
- 枚举值 :
- 性别:M(男)、F(女)、U(未知)
- 订单状态:1(待支付)、2(已支付)、3(已发货)
- 编码规范 :
- 地区代码:GB/T 2260
- 行业代码:GB/T 4754
2.4 性能优化技术
- 分区:按日期+业务线双重分区
- 分桶:大表按user_id分桶(Join优化)
- 压缩:使用Snappy压缩(Parquet格式)
- 索引:构建Z-Order索引(多维查询优化)
三、DWS层(Data Warehouse Summary)
3.1 指标分层体系
| 层级 | 指标类型 | 示例 | 计算频率 | 使用场景 |
|---|---|---|---|---|
| 原子指标 | 基础指标 | GMV、UV、订单量 | 实时 | 数据建模 |
| 派生指标 | 复合指标 | 客单价(GMV/订单量) | 小时级 | 业务监控 |
| 衍生指标 | 趋势指标 | 同比(GMV/去年同期GMV-1) | 天级 | 经营分析 |
| 计算指标 | 复杂指标 | 复购率(2次购买用户数/总用户) | 周级 | 战略决策 |
3.2 宽表构建模式
3.2.1 用户行为宽表
sql
-- dws_user_behavior_daily
CREATE TABLE dws_user_behavior_daily (
user_id BIGINT,
dt STRING,
pv_count BIGINT COMMENT '页面浏览量',
click_count BIGINT COMMENT '点击量',
order_count BIGINT COMMENT '订单数',
order_amount DECIMAL(10,2) COMMENT '订单金额',
last_visit_time TIMESTAMP COMMENT '最后访问时间'
);
3.2.2 商品分析宽表
sql
-- dws_product_analysis_daily
CREATE TABLE dws_product_analysis_daily (
product_id BIGINT,
dt STRING,
sales_count BIGINT COMMENT '销量',
sales_amount DECIMAL(10,2) COMMENT '销售额',
uv BIGINT COMMENT '商品浏览量',
conversion_rate DECIMAL(5,4) COMMENT '转化率',
avg_price DECIMAL(10,2) COMMENT '平均售价'
);
3.3 数据聚合策略
| 聚合粒度 | 时间维度 | 业务维度 | 用户维度 | 典型表名 |
|---|---|---|---|---|
| 小时级 | 按小时 | 按品类 | 按会员等级 | dws_sales_hourly |
| 日级 | 按天 | 按区域 | 按新老客 | dws_sales_daily |
| 周级 | 按周 | 按渠道 | 按用户分群 | dws_sales_weekly |
| 月级 | 按月 | 按品牌 | 按RFM模型 | dws_sales_monthly |
3.4 性能优化技术
- 预计算:提前计算Top100商品
- 物化视图:建立常用查询的物化视图
- 缓存:Redis缓存高频查询结果
- 分片:大表按时间分片(如按月分表)
四、各层详细对比(扩展版)
| 维度 | ODS层 | DWD层 | DWS层 |
|---|---|---|---|
| 数据量 | 100TB级(原始数据) | 10TB级(清洗后数据) | 1TB级(聚合数据) |
| 存储成本 | 高(原始数据) | 中(列存压缩) | 低(聚合后数据) |
| 查询性能 | 慢(全表扫描) | 中(分区+分桶) | 快(预计算+索引) |
| 数据延迟 | 1-5分钟(CDC) | 1-2小时(批处理) | 1天(日批处理) |
| 数据质量 | 原始质量(可能含脏数据) | 高质量(清洗后) | 业务可用(指标计算) |
| 数据变更 | 高频(实时同步) | 中频(小时级) | 低频(天级) |
| 数据血缘 | 源系统→ODS | ODS→DWD | DWD→DWS |
| 数据治理 | 数据同步监控 | 数据质量监控 | 指标口径管理 |
| 典型工具 | DataX、Flink CDC | Spark SQL、Hive SQL | Presto、ClickHouse |
| 使用场景 | 数据回溯、数据重放 | 数据探索、数据建模 | 业务分析、数据服务 |
| 技术挑战 | 数据一致性、数据延迟 | 数据清洗、维度建模 | 指标计算、查询性能 |
| 团队分工 | 数据工程师 | 数据工程师/数据分析师 | 数据分析师/业务分析师 |
| 数据权限 | 高(敏感数据) | 中(清洗后数据) | 低(聚合数据) |
| 数据生命周期 | 30-180天 | 1-3年 | 1-5年 |
五、高级实践技巧
5.1 ODS层优化
- 数据分片:大表按业务线分片(如订单、用户、商品)
- 数据压缩:使用ZSTD压缩(压缩比30%)
- 数据校验:MD5校验(确保数据一致性)
5.2 DWD层优化
- 动态清洗:根据业务规则动态调整清洗策略
- 数据版本:保留多个版本的数据(支持回溯)
- 数据标注:添加数据质量标签(如"高置信度")
5.3 DWS层优化
- 指标分层:建立指标分层体系(原子→派生→衍生)
- 指标管理:建立指标口径文档(避免口径不一致)
- 数据服务:提供API接口(支持自助查询)
5.4 跨层优化
- 数据血缘:建立完整的数据血缘关系
- 数据地图:构建数据地图(支持数据发现)
- 数据治理:建立数据治理规范(数据质量、数据安全)
六、典型数据流示例
6.1 实时数据流
MySQL → Flink CDC → Kafka → Flink SQL → ODS → Flink SQL → DWD → Flink SQL → DWS
6.2 批处理数据流
MySQL → DataX → HDFS → Spark SQL → ODS → Spark SQL → DWD → Spark SQL → DWS
6.3 混合数据流
MySQL → Flink CDC → Kafka → Flink SQL → ODS → Spark SQL → DWD → Presto → DWS
七、常见问题与解决方案
7.1 ODS层问题
-
问题:数据延迟
- 解决方案:优化CDC配置、增加Kafka分区
-
问题:数据不一致
- 解决方案:增加数据校验、建立重试机制
7.2 DWD层问题
-
问题:数据清洗规则复杂
- 解决方案:建立清洗规则库、使用UDF
-
问题:维度建模困难
- 解决方案:参考Kimball维度建模理论
7.3 DWS层问题
-
问题:指标计算慢
- 解决方案:预计算、物化视图
-
问题:查询性能差
- 解决方案:优化SQL、使用索引