name: 数据管道架构师 description: 设计ETL/ELT数据管道,包括正确的提取、转换和加载模式,以及编排、错误处理和数据质量验证。 license: MIT
数据管道架构师
此技能提供设计稳健、可扩展数据管道的指导,确保数据从源到目的地可靠传输。
核心能力
- ETL vs ELT:传统提取-转换-加载与现代提取-加载-转换模式
- 编排:Airflow、Dagster、Prefect、dbt 用于工作流管理
- 数据质量:验证、监控、血缘追踪
- 可扩展性:批量处理 vs 流处理、分区、并行化
管道设计流程
1. 需求分析
开始管道设计时,收集:
- 源系统和数据格式(API、数据库、文件、流)
- 目标目的地(数据仓库、数据湖、湖仓一体)
- 新鲜度要求(实时、每小时、每天)
- 数据量和速度估计
- 质量和合规要求
2. 架构选择
批量管道 - 用于周期性批量处理:
- 调度驱动(每小时、每天、每周)
- 较高延迟容忍度
- 简单错误恢复(重新运行整个批次)
- 工具:Airflow、dbt、Spark
流处理管道 - 用于实时要求:
- 事件驱动处理
- 亚秒到分钟延迟
- 复杂状态管理
- 工具:Kafka、Flink、Spark Streaming
混合方法 - Lambda 或 Kappa 架构:
- 批量层用于完整性
- 速度层用于低延迟
- 服务层用于查询
3. ETL 与 ELT 决策
ETL(加载前转换):
- 当目标计算资源有限时
- 当转换显著减少数据量时
- 当敏感数据必须在落地前屏蔽时
- 传统数据仓库模式
ELT(加载后转换):
- 现代云仓库计算成本低
- 当需要原始数据保留时
- 当转换频繁更改时
- dbt 风格在仓库内转换
4. 管道组件
提取层:
- 全量提取 vs 增量提取(CDC、基于时间戳)
- API 分页和速率限制
- 连接池和重试逻辑
- 模式检测和漂移处理
转换层:
- 数据清洗和标准化
- 业务逻辑应用
- 聚合和反规范化
- 类型转换和空值处理
加载层:
- Upsert 策略(合并、删除+插入)
- 分区方案(时间、哈希、范围)
- 索引管理
- 事务边界
5. 错误处理模式
┌─────────────────────────────────────────────────────────┐
│ 管道执行 │
├─────────────────────────────────────────────────────────┤
│ ┌─────────┐ ┌───────────┐ ┌──────────┐ │
│ │ 提取 │───▶│ 转换 │───▶│ 加载 │ │
│ └────┬────┘ └─────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌───────────┐ ┌──────────┐ │
│ │ 重试 │ │ 死信队列 │ │ 回滚检查点│ │
│ │ 带退避 │ │ │ │ │ │
│ └─────────┘ └───────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
- 带退避重试:暂时性故障(网络、速率限制)
- 死信队列:无法处理的毒消息
- 检查点:从上次成功点恢复
- 幂等性:安全重新运行无重复
6. 数据质量框架
在每个阶段实施检查:
| 阶段 | 检查类型 | 示例 |
|---|---|---|
| 提取 | 完整性 | 行数与源匹配 |
| 提取 | 新鲜度 | 数据时间戳在SLA内 |
| 转换 | 有效性 | 值在预期范围内 |
| 转换 | 唯一性 | 主键唯一 |
| 加载 | 对账 | 目标匹配源总计 |
| 加载 | 完整性 | 外键有效 |
7. 监控和可观测性
要跟踪的基本指标:
- 管道持续时间和趋势
- 每个阶段的行数
- 错误率和类型
- 数据新鲜度(自上次成功运行时间)
- 资源利用率
告警:
- SLA 违反(数据不新鲜)
- 异常行数(±20% 从基线)
- 源中模式更改
- 重复故障
常见模式
缓慢变化维度(SCD)
- 类型1:覆盖(无历史)
- 类型2:添加带有效日期的行
- 类型3:先前值列
- 类型4:历史表
增量处理
-- 基于时间戳的增量
SELECT * FROM source
WHERE updated_at > {{ last_run_timestamp }}
-- 基于CDC(变更数据捕获)
-- 从事务日志捕获插入、更新、删除
幂等加载
-- 删除 + 插入模式
DELETE FROM target WHERE date_partition = '2024-01-15';
INSERT INTO target SELECT * FROM staging WHERE date_partition = '2024-01-15';
-- 合并/Upsert 模式
MERGE INTO target t
USING staging s ON t.id = s.id
WHEN MATCHED THEN UPDATE SET ...
WHEN NOT MATCHED THEN INSERT ...
参考资料
references/orchestration-patterns.md- Airflow、Dagster、Prefect 模式references/data-quality-checks.md- 验证框架和规则references/pipeline-templates.md- 常见管道架构