数据工程生命周期
课程简介
数据产生的源头、传输、接收的完整生命周期。
🎬 本课程视频:Data Engineering — 数据工程基础
数据工程生命周期:从产生到消费的完整链条
一、什么是数据工程?
数据工程师是构建和维护数据基础设施的人。他们的核心职责是:确保数据从产生到消费的整个过程中,数据是可用的、可靠的、及时的。这就像自来水系统——你打开水龙头就有水(数据可用),水质是达标的(数据可靠),水压是稳定的(数据及时)。数据工程师就是那个设计、建造和维护整个供水系统的人。
为了做好这个工作,你需要理解数据的完整生命周期——从数据在某个系统中被创建,到它最终被业务用户或机器学习模型消费,中间经历了采集、传输、存储、转换等环节。理解这个链条,你才能设计出健壮的数据系统。
二、四个核心阶段
第一阶段:数据产生(Source)
数据来源多种多样:
- 应用数据库的事务日志:用户在电商网站下单、转账、修改个人信息时,应用数据库记录了这些操作。数据通常存储在关系型数据库(PostgreSQL、MySQL)的事务表中。
- 用户行为埋点:通过在前端(Web、App)嵌入 SDK,采集用户的浏览、点击、停留、滑动等行为。一个日活百万的应用每天可能产生上亿条行为日志,格式通常是 JSON。
- IoT 设备传感器:物联网设备每秒上报温度、湿度、GPS 位置、运行状态等数据。特点是持续不断、量大、单条数据小。
- 外部 API 数据:从第三方服务获取的天气数据、社交媒体公开数据、市场行情数据,通常通过定时调用的 API 获取。
关键决策是数据格式:JSON 灵活易读但体积大;Avro 和 Protobuf 是二进制格式,体积小、解析快、有 schema 约束,适合高性能场景。
第二阶段:数据传输(Transmission)
数据从源头传输到存储系统。两种方式:批量传输(定时将一批数据复制到目标系统,适合非实时场景)和流式传输(数据产生后立即传输,延迟秒级甚至毫秒级)。
核心工具包括 Apache Kafka(分布式的、持久化的、高吞吐的消息队列,能处理每秒百万条消息)、RabbitMQ(适合中小规模场景)和 AWS Kinesis(云原生方案)。核心权衡:延迟 vs 吞吐量。
第三阶段:数据摄入(Ingestion)
将传输过来的数据写入目标存储系统。模式包括:
- 批量摄入:周期性调度写入,效率高但延迟高,常用 Apache Spark 做批量 ETL。
- 流式摄入:持续写入,适合实时分析,工具包括 Apache Flink、Kafka Streams。
- 变更数据捕获(CDC):监听数据库事务日志(PostgreSQL 的 WAL、MySQL 的 binlog),捕获数据变更事件(INSERT、UPDATE、DELETE)并实时同步。Debezium 是最流行的 CDC 工具。
第四阶段:数据消费(Consumption)
数据被摄入后供下游使用:BI 报表和分析(Tableau、Metabase、Superset)、机器学习训练、数据产品(API 形式提供给其他系统)。
需要保障三个核心指标:可用性(数据已准备好被查询)、一致性(不同报表数据一致)、时效性(在 SLA 规定时间内可用)。
三、典型案例
电商场景:用户在 App 上下单 → 订单数据写入 MySQL 订单表,同时前端 SDK 发送行为埋点事件到日志服务器(JSON 格式)。订单表的 CDC 变更事件通过 Debezium → Kafka 实时同步,行为埋点每 5 分钟批处理上传到 S3。Flink 从 Kafka 读取订单事件写入 ClickHouse 实时分析表,批处理管道每小时将 S3 上的埋点数据加载到 Hive 表中。BI 团队从 ClickHouse 查询实时 GMV,运营团队分析用户行为做用户分群和推送。
四、常见陷阱与最佳实践
- 忽略数据质量:在管道的每个阶段都埋入数据质量检查。不要在消费阶段才发现数据是脏的。
- 过度设计:90% 的场景用 Cron + PostgreSQL 就够了。从简单开始,有痛点再去升级。
- 忽视数据血缘:记录数据从哪里来、经过了哪些转换、被哪些下游消费,出问题时才能快速追溯根因。
五、总结
理解数据从产生到消费的四个阶段——源系统产生、传输到目标系统、摄入到存储、被下游消费——是设计健壮数据系统的前提。关键是根据你的业务需求(延迟要求、数据量、一致性要求)选择合适的技术组合。
六、数据格式的深入对比与选型
数据的产生阶段面临一个关键决策:选择什么数据格式。不同格式在可读性、性能、Schema 支持方面差异显著。
| 格式 | 可读性 | 序列化速度 | 数据体积 | Schema | 生态 |
|---|---|---|---|---|---|
| JSON | 极高 | 中 | 大 | 无(弱) | 极广 |
| CSV | 高 | 快 | 中 | 无 | 广 |
| Avro | 低(二进制) | 快 | 小 | 强(内嵌) | Hadoop 生态 |
| Parquet | 低(列式) | 中 | 很小(列式压缩) | 强 | 分析场景 |
| Protobuf | 低(二进制) | 极快 | 很小 | 强(.proto) | gRPC、微服务 |
选型建议:
- API 数据交换 → JSON(灵活、通用)
- 日志数据 → JSON 或 Avro(平衡可读性和性能)
- 分析型数据存储 → Parquet(列式存储,压缩率高,查询性能好)
- 高性能消息传递 → Protobuf(序列化反序列化快、体积小)
- 批量数据交换 → Avro(有 Schema、压缩好、Hadoop 生态支持)
七、数据管道的反模式
在实际工作中,我发现了一些常见的数据管道反模式:
反模式一:"一次全部"——试图一次性把所有数据都处理完。这导致管道运行时间越来越长,最后不可维护。正确做法是增量处理。
反模式二:"管道黑洞"——管道运行后没人知道它运行得怎么样,没有监控、没有日志、没有报警。
反模式三:"硬编码一切"——源表名、目标路径、数据库连接全部硬编码在脚本里。一旦变了就要改代码。正确做法是用配置驱动。
反模式四:"忽视异常"——即使用 try-except 捕获了异常,也只是打印日志然后继续。错误数据污染了下游。
八、数据生命周期在实际业务中的演变
数据生命周期不是静态的,它会随着业务发展而演变。一个典型的数据系统从简单到复杂的演进路径:
阶段一:简单报表。Cron + Shell 脚本 + PostgreSQL,数据直接从业务数据库拖到报表表。
阶段二:ETL 出现。数据量增大后,需要专门的 ETL 工具。引入 dbt 或 Spark,建立专门的数仓。
阶段三:实时需求。业务要求实时数据,引入 Kafka 和流式处理。
阶段四:数据治理。数据资产多了之后,需要数据目录、血缘追踪、质量监控。
阶段五:智能化。在数据之上构建机器学习管道和 AI 应用。
理解这个演进路径有助于我们做技术选型——不要为阶段一的简单需求选择阶段四的工具。
九、数据容灾与恢复
数据工程不仅关注数据如何流动,还要关注数据如何保护。
容灾策略的三个层次:
1. 备份(Backup):定期将数据复制到独立存储。全量备份(所有数据)+ 增量备份(每日变化)。推荐 3-2-1 规则——3 份拷贝、2 种不同介质、1 份异地存储
-
复制(Replication):实时将数据复制到另一个节点或数据中心。同步复制(写入主节点同时写入从节点,延迟高但保证一致)和异步复制(先写主节点再同步到从节点,延迟低但可能丢数据)
-
归档(Archive):将不再需要实时访问的历史数据转移到低成本存储。归档不是备份——归档是长期保存,备份是应对故障恢复
恢复演练:定期进行灾难恢复演练,验证备份的可恢复性和恢复时间。不做演练的备份形同虚设。
十、数据工程中的 DevOps 实践
数据工程也可以应用 DevOps 理念:
- 基础设施即代码:用 Terraform 或 Pulumi 管理数据基础设施——Kafka 集群、数据库、数据湖存储配置
- CI/CD for Data:数据管道的代码变更经过测试→构建→部署的自动化流程。使用 dbt 的 CI 集成验证 SQL 变更的编译正确性
- 监控与告警:数据管道质量监控、延迟告警、任务失败告警——与基础设施监控统一
- 环境管理:开发、测试、生产环境隔离。使用 Docker Compose 搭建本地开发环境,使用基础设施即代码搭建测试和生产环境
十一、数据工程的职业发展
最后谈谈数据工程师的职业发展路径:
- 初级数据工程师:掌握 SQL、Python、基本的 ETL 流程——能够构建和维护简单的数据管道
- 中级数据工程师:掌握分布式系统(Spark、Kafka)、云平台(AWS/GCP/Azure)、数据建模——能够设计复杂的数据架构
- 高级数据工程师:深入理解数据治理、数据安全、成本优化——能够制定数据战略和推动技术选型
- 数据架构师:全局视角——跨团队协调数据策略、评估和引入新技术、建立数据标准和最佳实践
软技能:数据工程不仅是技术工作,更需要沟通能力(与业务团队理解需求)、架构思维(从整体系统出发做决策)、项目管理能力。
十二、数据工程师的思考框架
数据工程不仅仅是技术工具的使用,更重要的是思考框架。遇到一个数据需求时,按以下框架思考:
- 什么数据?→ 数据源是什么?结构化还是非结构化?数据量多大?更新频率如何?
- 谁用数据?→ 下游消费者是谁?BI 团队?数据科学家?业务用户?他们的延迟需求是什么?
- 怎么用数据?→ 是做实时仪表盘?还是历史分析?还是机器学习训练?
- 多重要?→ 一致性要求高吗(金融对账要求强一致,推荐系统可以接受最终一致)?质量要求呢?
- 多快需要?→ 延迟 SLA 是多少?几秒?几分钟?几小时?
这五个问题的答案决定了技术选型。不要从"我要用 Kafka"开始,要从回答这五个问题开始。
十三、数据可观测性(Data Observability)
数据可观测性是数据工程中一个快速发展的领域。传统的数据监控关注「系统是否在运行」,数据可观测性关注「数据本身是否健康」。
五大支柱:
1. 新鲜度(Freshness):数据是否按时更新?ETL 任务是否在 SLA 时间内完成?延迟多久?
2. 数据量(Volume):今天的数据量和昨天相比是否在合理范围内?异常激增或骤降可能意味着上游问题。
3. 数据分布(Distribution):数值型字段的分布是否发生显著变化?分类字段的唯一值数量是否正常?
4. Schema:表的列结构是否发生变化?新增列、删除列、列类型变更——这些变化是否已沟通?
5. 血缘(Lineage):数据从哪里来?经过哪些转换?被哪些下游消费?出问题时可以快速定位影响范围。
工具生态:
- Monte Carlo / Sifflet / Bigeye:全托管的 SaaS 数据可观测平台
- Great Expectations + DQ 开源组件:自建方案,灵活性更高
- Databand / Airflow 的监控插件:更偏重于管道可观测性
告警策略:不要对所有异常都发告警——那会导致告警疲劳。分层策略:P0(数据停更,立即告警)、P1(数据分布异常,上班时间处理)、P2(轻微波动,记录日志不告警)。
数据合约:数据生产者与消费者之间的正式约定——明确数据的 Schema、质量标准、可用 SLA。数据合约工具如 Data Contracts 可以将这些约定自动化和强制执行。当上游数据变更时,数据合约可以自动通知所有下游消费者,避免断裂的管道。
延伸阅读
- 📺 B 站播放列表:Data Engineering — 数据工程基础
- 📚 更多学习资源,请访问 deeplearning.ai 官网