名称: 数据工程师 描述: 当用户需要可扩展的数据管道开发、ETL/ELT实施或数据基础设施设计时使用。
数据工程师
目的
提供专业的数据工程能力,用于构建可扩展的数据管道、ETL/ELT工作流、数据湖和数据仓库。专注于分布式数据处理、流处理、数据质量和现代数据栈技术(Airflow、dbt、Spark、Kafka),并注重可靠性和成本优化。
何时使用
- 设计从源到消费层的端到端数据管道
- 实施具有错误处理和数据质量检查的ETL/ELT工作流
- 构建具有优化存储和查询功能的数据湖或数据仓库
- 设置实时流处理(Kafka、Flink、Kinesis)
- 优化数据基础设施成本(存储分层、计算效率)
- 实施数据治理和合规性(GDPR、数据血缘)
- 将遗留数据系统迁移到现代数据平台
快速开始
在以下情况下调用此技能:
- 设计从源到消费层的端到端数据管道
- 实施具有错误处理和数据质量检查的ETL/ELT工作流
- 构建具有优化存储和查询功能的数据湖或数据仓库
- 设置实时流处理(Kafka、Flink、Kinesis)
- 优化数据基础设施成本(存储分层、计算效率)
- 实施数据治理和合规性(GDPR、数据血缘)
在以下情况下不要调用:
- 仅需要SQL查询优化(使用数据库优化器)
- 机器学习模型开发(使用机器学习工程师或数据科学家)
- 简单的数据分析或可视化(使用数据分析师)
- 数据库管理任务(使用数据库管理员)
- 无需数据转换的API集成(使用后端开发人员)
决策框架
管道架构选择
├─ 批处理?
│ ├─ 每日/每小时调度 → Airflow + dbt
│ │ 优点:成熟的生态系统,基于SQL的转换
│ │ 成本:低-中
│ │
│ ├─ 大规模(TB+) → Spark(EMR/Databricks)
│ │ 优点:分布式处理,处理规模大
│ │ 成本:中-高(计算密集型)
│ │
│ └─ 简单转换 → dbt Cloud 或 Fivetran
│ 优点:托管,维护成本低
│ 成本:中(SaaS定价)
│
├─ 流处理?
│ ├─ 事件流 → Kafka + Flink
│ │ 优点:低延迟,精确一次语义
│ │ 成本:高(始终在线的基础设施)
│ │
│ ├─ AWS原生 → Kinesis + Lambda
│ │ 优点:无服务器,自动扩缩容
│ │ 成本:可变(按使用付费)
│ │
│ └─ 简单CDC → Debezium + Kafka Connect
│ 优点:数据库变更捕获
│ 成本:中
│
└─ 混合(批处理 + 流处理)?
└─ Lambda架构 或 Kappa架构
Lambda:分离批处理/速度层
Kappa:单一的流优先方法
数据存储选择
| 使用场景 | 技术 | 优点 | 缺点 |
|---|---|---|---|
| 结构化分析 | Snowflake/BigQuery | SQL,快速查询 | 规模扩大时成本高 |
| 半结构化 | Delta Lake/Iceberg | ACID,模式演进 | 复杂性 |
| 原始存储 | S3/GCS | 便宜,持久 | 无查询引擎 |
| 实时 | Redis/DynamoDB | 低延迟 | 分析能力有限 |
| 时间序列 | TimescaleDB/InfluxDB | 针对时间数据优化 | 特定使用场景 |
ETL 与 ELT 决策
| 因素 | ETL(先转换) | ELT(先加载) |
|---|---|---|
| 数据量 | 小-中 | 大(TB+) |
| 转换 | 复杂,加载前 | 基于SQL,在仓库内 |
| 延迟 | 较高 | 较低 |
| 成本 | 加载前计算 | 仓库计算 |
| 最适合 | 遗留系统 | 现代云数据仓库 |
核心模式
模式1:幂等分区覆盖
使用场景: 安全地重新运行批处理作业而不产生重复数据。
# PySpark示例:基于执行日期覆盖分区
def write_daily_partition(df, target_table, execution_date):
(df
.write
.mode("overwrite")
.partitionBy("process_date")
.option("partitionOverwriteMode", "dynamic")
.format("parquet")
.saveAsTable(target_table))
模式2:缓慢变化维度类型2(SCD2)
使用场景: 跟踪变更历史而不丢失过去的状态。
-- dbt实现的SCD2
{{ config(materialized='incremental', unique_key='user_id') }}
SELECT
user_id, address, email, status, updated_at,
LEAD(updated_at, 1, '9999-12-31') OVER (
PARTITION BY user_id ORDER BY updated_at
) as valid_to
FROM {{ source('raw', 'users') }}
模式3:流处理的死信队列(DLQ)
使用场景: 处理格式错误的消息而不停止管道。
模式4:数据质量断路器
使用场景: 如果数据质量低于阈值,则停止管道执行。
质量检查清单
数据管道
- [ ] 幂等(可安全重试)
- [ ] 强制执行模式验证
- [ ] 具有重试功能的错误处理
- [ ] 数据质量检查自动化
- [ ] 配置监控和告警
- [ ] 记录数据血缘
性能
- [ ] 管道在SLA内完成(例如,<1小时)
- [ ] 在适用的情况下使用增量加载
- [ ] 分区策略优化
- [ ] 查询性能 <30 秒(P95)
成本优化
- [ ] 实施存储分层(热/温/冷)
- [ ] 配置计算自动扩缩容
- [ ] 查询成本监控激活
- [ ] 启用压缩(Parquet/ORC)
额外资源
- 详细技术参考: 参见 REFERENCE.md
- 代码示例与模式: 参见 EXAMPLES.md