专业书籍精读 · Fundamentals of Data Engineering · 第 2 章
Fundamentals of Data Engineering · Ch 2 · The Data Engineering Lifecycle · Reis & Housley · 2022
你打开手机银行,看到「本月餐饮支出 2300 元,比上月多 12%」。这一行字背后,是一笔笔刷卡记录被收集起来、存好、按类别加工、最后算成一个数字送到你眼前。这一章把这条路拆成五站,并告诉你每一站动手前该先问哪几个问题。
把它想成一家餐厅的后厨。菜从农场来(数据在各个业务系统里产生);采购把菜运进门(把数据搬进来);冷库、冰箱、常温架分门别类地放(存储);厨师洗、切、炒(加工成能用的样子);服务员端上桌(送给看报表的人、做预测的模型)。另外还有几件不属于任何一站、却每站都得做的事:卫生、门禁、排班、记账。
有了这张五站地图,团队能先问清「要喂给谁、多新鲜才够」,再去挑工具,而不是反过来。默认先用「每天进一次货」的简单做法,等业务真的说出「晚一分钟就亏钱」,再升级成随叫随送。一句诚实的代价:随叫随送确实更新鲜,但更贵、更难维护、半夜出问题的机会也更多。
数据从产生到被用上要过五站:产生、搬进来、存好、加工、送出去;每站先问清问题再选工具,还要有几件贯穿全程的事托底。
想看每一站书里列出的关键问题、批处理与流处理怎么取舍、推与拉和变更捕获(CDC)的区别、冷热存储,以及六条「暗流」各管什么? → 切到精读版
你以为生命周期是「采集用 A、存储用 B、转换用 C」的一张工具清单,其实本章给的是五组「动手前先问清」的问题:数据从哪来、怎么进来、放哪、怎么加工、给谁用,再加上六条贯穿全程的暗流。这一章最反直觉的一句结论是:批处理仍是默认,实时流要有业务理由才值得付它的代价。
Part I「基础与构件」第 2 章。第 1 章画出生命周期总图,这一章逐站展开、并把六条暗流讲清;第 3 章在此之上谈架构原则,Part II(第 5–9 章)再给生成、存储、采集、转换、服务各写一章。对应现实里「搭一条数据管道前,到底该先想清楚什么」。
工具的名字每年都在变,而数据管道出事的方式几十年没变:上游悄悄改了字段、数据迟到或重复、实时管道是为一张日报建的、看板没人用、有人误删了不该删的数据。这些都不是某个工具的 bug,而是某一站没问对问题,或某条暗流没人管。
本章先区分两个概念:数据生命周期是数据从产生到销毁的完整一生;数据工程生命周期是其中数据工程师负责的那一段。然后给每一站列一份评估清单。作者的经验判断是:源系统和采集是整个生命周期里最大的瓶颈——因为它们在你的控制之外。
源系统(source system)是数据的出生地:业务数据库、App 埋点、第三方 API、IoT 设备。数据工程师通常不拥有它,却要为它的一切变化买单。书里给的评估问题,归纳起来是这几类:
书里的建议是和源系统的主人建立联系:上游的改动最好在发生前就通知到你,而不是在报表坏了以后才倒查。
在书的总图里,存储画在其它几站的下方:采集要落地、转换要读写、服务要查询,每一站都踩在存储上。选存储时要问:读写速度能不能匹配上下游?会不会成为瓶颈?未来数据量涨十倍怎么扩?是只存不算(如对象存储),还是能直接查询(如云数仓)?能不能记录元数据和血缘?
书里一个很实用的划分是按访问频率分「温度」:
温度划分的意义在于成本:同样 1 PB,全放热层和按冷热分层,账单可以差出一个数量级。代价是冷数据取回要等、还另收取回费,所以「以为冷、其实常被查」的数据放错层,反而更贵。
采集(ingestion)把数据从源系统搬进存储。它是生命周期里最脆弱的一环:源系统没响应、数据质量突然变差、上游改了格式,任何一个都会让下游整条线断掉。这一站有两组关键选择。
批 vs 流。书里有一个重要的视角:数据在产生时本质上都是连续的事件流,批处理只是把这条流按大块切开来处理的一种方便做法。流式采集让下游几乎实时拿到数据,但书里反复提醒先问:实时能带来什么批处理给不了的业务价值?要多花多少钱、多少运维时间?基础设施出故障时流管道还靠得住吗?结论是批处理仍是绝大多数场景的合理默认,只有找到能证明这些代价值得的业务用例,才上真正的实时。
推 vs 拉。推(push)是源系统主动把数据写给你;拉(pull)是你按时间表去源系统取。变更数据捕获(CDC,change data capture)两种都有:按时间戳定时查「上次之后改了哪些行」是拉;读数据库自己的变更日志(如 MySQL 的 binlog)、一有提交就转发出去,更接近推。
转换(transformation)是数据开始产生价值的地方。书里列了几层:类型映射(把字符串变日期)、清洗与标准化(去重、统一单位)、建模(整理成分析友好的结构)、业务逻辑(「活跃用户」到底怎么算),以及给机器学习做特征化(featurization),即从原始数据里提炼出模型能用的输入。
书中强调两点。第一,业务逻辑是转换最大的驱动力,也是最容易出错、最该有人负责的部分——同一个「月活」在三张报表里有三种口径,比任何技术故障都伤信任。第二,每个转换都要能说清成本和回报:这一步省了谁的时间、支撑了哪个决策?尽量让转换简单、彼此隔离。
服务(serving)是最后一站。书里有个辛辣的提醒:要警惕数据虚荣项目——大张旗鼓建了湖、建了仓,却没人在用。服务分三类:
暗流(undercurrents)不是生命周期中的某一站,而是每一站都要做的事:
表 1 · 采集与处理的时间粒度:什么场景选什么
| 方式 | 典型延迟 | 适合 | 代价 |
|---|---|---|---|
| 批处理 | 小时到天 | 日报、财务对账、模型每日重训 | 数据不新鲜;一次失败要整批重跑 |
| 微批 | 分钟级 | 近实时看板、准实时数仓 | 调度开销;仍不是真实时 |
| 流处理 | 秒级以内 | 风控拦截、实时推荐、运营告警 | 成本、运维、乱序与重复处理最难;需要有人值守 |
判据:先问「数据晚到 1 小时,业务会损失什么?」答不出具体损失,就用批。
表 2 · 推、拉与日志 CDC
| 方式 | 怎么做 | 优点 | 代价 |
|---|---|---|---|
| 拉:全量快照 | 定时导出整张表 | 最简单,结果完整 | 数据量大时慢且贵;源库压力最大 |
| 拉:增量查询 | 按更新时间戳取「上次之后」的行 | 只取变化部分,实现简单 | 依赖可靠的时间戳列;物理删除看不到 |
| 推:日志 CDC | 读数据库变更日志,逐条转发 | 秒级延迟;能捕获删除;不在业务表上跑大查询 | 需要日志权限与额外组件;schema 变更要单独处理 |
| 推:源系统发事件 | 应用直接把事件写进消息队列 | 语义清晰、最实时 | 要改上游代码;依赖上游团队配合 |
温度分层同样是权衡:热层快但贵,冷层便宜但取回慢、还另收取回费。按访问频率分层,并定期复核「冷数据是不是其实常被查」。
这一章的框架几乎一一对应现代数据栈:生成端是 MySQL / PostgreSQL 等业务库和埋点;采集端是 CDC 工具、托管连接器与 Kafka;存储端是对象存储加云数仓或湖仓;转换端是 SQL 建模与 Spark;服务端是 BI、特征存储和反向 ETL 工具;编排与数据质量工具横跨全程。架构评审里被问「这条管道靠谱吗」,好的回答是逐站报出源头速率、采集方式与延迟、存储分层、转换口径负责人、服务对象,再说明每条暗流由谁兜底。
开源实证
① 数据工程生命周期是数据生命周期的子集:生成 → 采集 → 转换 → 服务,存储托在全程之下。
② 每一站是一组「先问清」的问题,而不是一个工具名。
③ 源系统和采集是最大的瓶颈:你不拥有它,但要读懂它的速率、质量、schema 演变,并与上游主人保持沟通。
④ 存储按访问频率分热、温、冷三层,用延迟换成本。
⑤ 批是流的「切块处理」;批仍是默认,实时要有能证明代价的业务用例。
⑥ 推与拉:增量拉取简单但看不到删除,日志 CDC 延迟低、能捕获删除但运维更重。
⑦ 转换由业务逻辑驱动,每一步要说清成本与回报;服务分分析、ML、反向 ETL,警惕没人用的「虚荣项目」。
⑧ 六条暗流:安全(最小权限,人是最大漏洞)、数据管理(质量、血缘、可删除)、DataOps、架构、编排(不等于 cron)、软件工程。