专业书籍精读 · Fundamentals of Data Engineering · 第 9 章
Fundamentals of Data Engineering · Ch 9 · Serving Data for Analytics, Machine Learning, and Reverse ETL · Reis & Housley · 2022
前几章把数据搬进公司的数据仓库、洗干净、加工好。可数据躺在仓库里,谁也没用上,就等于白做。这一章讲最后一步:把加工好的数据「端上桌」——给老板看的报表、给算法用的训练数据,以及送回销售、客服每天用的那些业务软件里。数据工程做得好不好,到这一步才被真正检验。
一个团队花了半年搭好漂亮的数据平台,上线一个月,报表没人打开。原因很简单:有一次报表上的销售额和财务对不上,大家从此不再信它,宁可自己导表格算。数字只要错一次,人就会走;再想请回来,要很久很久。
多数团队的做法是:先按用途给人分类,固定报表、自助分析、对外展示、算法备料各走各的路;关键数字只在一处定义;数据要往回送时,先装上「刹车」。一句诚实的代价:自动送回的数据如果错了,错误会直接传到业务动作里,比报表上的错更快、更贵。
数据的价值在被用上的那一刻:先问清谁用、用来干什么,守住信任,口径只定义一次,送回业务前先装好刹车。
想看信任与数据 SLA、数据产品与自助分析的边界、业务 / 运营 / 嵌入式三类分析、ML 训练数据的时间点正确性、七种服务方式、语义层与反向 ETL 的反馈环,以及 LinkedIn、Feast、dbt 的实证? → 切到精读版
你以为数据管道的终点是「数据进了仓库」,其实终点是有人基于它做出决定或动作。本章要建立三条认知:服务数据的第一原则是信任,错一次就很难挽回;服务前先问谁用、用来做什么,分析、机器学习、反向 ETL 三类用户要的东西完全不同;口径要只定义一次,而把数据写回业务系统,就等于把错误直接送进业务动作,必须有护栏。
Part II「生命周期详解」最后一章。上接第 8 章「查询、建模与转换」(数据已加工好),下启 Part III 的安全与隐私。它对应生命周期的最后一站「服务(serving)」——作者称这是数据工程师大显身手、价值被真正检验的地方。现实里对应 BI 报表、对外数据产品、特征供给与反向 ETL 同步。
设想一家做商家 SaaS 的公司:数仓里几百张已建模的表;管理层每天 8 点看经营日报;二十来个分析师随手查数;产品里给 2 万家商家嵌了一个「我的销售」看板,高峰时上千人同时刷新;风控模型要三年的历史订单做训练;销售团队希望在 CRM 里直接看到每条线索的成交概率。不懂本章的典型后果:
信任是第一位的。作者的判断是:建立数据信任要很久,失去只要一次。手段有二:一是数据校验与可观测性,在用户发现之前先发现问题;二是和使用方约定 SLA,例如「日报数据每天 8 点前就绪、关键指标与财务对账误差为零」,再用 SLO 持续度量是否达标。数据晚了、错了,要主动告知,而不是等人来问。
先问用途和用户。好问题不是「你要什么数据」,而是「拿到数据后你要采取什么行动」。同一份订单数据,给 CEO 的是一张趋势图,给分析师的是可自由切片的明细,给模型的是带标签的历史样本。
数据产品(data product)。作者借用「用户雇佣产品来完成某项任务」的视角:把对外提供的数据集当产品来做,有明确用户、要解决的问题和反馈渠道,而不是一次性的取数需求。
自助分析不是默认答案。让每个人自己拖拽出报表听上去美好,但书里提醒,自助分析在实践中常常落空:高管只想看结论,并不想自己拖表;真正需要自助的是能提出新问题的分析型用户,而且要给他们有边界的自由——干净的模型、清楚的口径、合适的权限。
数据定义与数据逻辑。数据定义是一个词的含义(什么算「客户」);数据逻辑是计算公式(GMV 是否含退款、按下单还是付款时间算)。这些知识常只存在老员工脑子里,作者主张把它们显式写下来、在一处集中维护。数据网格(data mesh)则把「服务」下放:每个业务域把自己的数据当产品,直接对其他域提供。
业务分析用历史与当前数据支持决策,三种形态:仪表盘(几项 KPI 一目了然)、报表(固定格式、定期发出)、即席分析(ad hoc,分析师临时深挖一个问题,结论好用就沉淀成报表)。
运营分析关注此刻,要求实时或近实时:应用监控、库存告警、线上转化率突降。它要的是「现在出了什么事、该立刻做什么」,数据延迟以秒计。
嵌入式分析是面向外部客户的分析,嵌在产品里:智能温控器 App 里的用电曲线、电商后台里的销售看板。作者指出它把要求一下拉高:数据要新、查询要快(用户不会等十几秒)、并发要高(成千上万客户同时查),而且每个客户只能看到自己的数据——多租户隔离要做到行级。这类负载常交给专门的实时 OLAP 引擎(如 Druid、Pinot、ClickHouse),而不是批量数仓。
作者坦言,数据工程与 ML 工程的边界因组织而异:有的团队数据工程师只交付干净的原始数据,有的一路负责到特征计算与供给。无论边界在哪,数据工程师都应懂一些 ML 基础:监督与无监督学习的区别、分类与回归、何时用传统模型何时用深度学习、特征工程、批量训练与在线学习、标注数据从哪来。懂这些,才知道该交付什么样的数据。
其中最容易出事的是时间点正确性(point-in-time correctness):训练样本里的每个特征,只能取「预测那一刻已经知道」的值。比如预测一笔订单会不会退款,若训练时用了订单最终状态里才有的字段,模型等于偷看了答案——离线评估很好,上线就失效。另一个坑是训练与线上不一致:训练用批作业算特征,线上用另一套代码实时算,两套逻辑稍有差异就让模型变差。特征平台(feature store)把同一份特征定义同时供给离线训练与线上推理,正是为此而生。
文件交换:导出 CSV、Excel,或把文件放进共享的对象存储桶交给合作方。最原始也最普遍,但版本、权限与时效难管。数据库:最常见的方式,用户直接查数仓或 OLAP 库;云数仓可给不同团队分配独立的计算资源,避免一个人的大查询拖慢所有人。流式系统:为运营分析提供持续更新的结果。查询联邦:用 Trino 一类引擎同时查多个源,不必先搬数据,适合探索与临时需求,但会把负载压到源系统上。数据共享:云数仓之间直接授权访问同一份数据,不用复制、不用跑管道,Snowflake、BigQuery 等都支持。语义层与指标层:见下一节。Notebook:数据科学家最常用的入口;作者提醒 pandas 会把数据全部读进单机内存,数据一大就要换 Spark、Dask、Ray 或云端托管环境,且数据库凭证不应明文写进 Notebook。
语义层(semantic layer)/ 指标层(metrics layer)把业务指标的定义集中写成代码,例如「GMV = 已付款订单金额之和,扣除当月退款」,由工具编译成针对各数据库的 SQL。所有下游——BI、Notebook、对外看板——都通过它取数,而不是各自写一遍。作者举 Looker 的 LookML 与 dbt 的指标定义为例。好处是「写一次、处处一致」;代价是多了一层要维护、要学习的抽象。
反向 ETL(reverse ETL)把数仓里算好的结果写回业务系统:线索评分写进 Salesforce,用户分群写进营销平台,风险标签写进客服系统。作者不太喜欢这个名字,但认可它的价值:销售不会为了看一个分数去打开 BI,数据得去他们已经在用的地方。市面上有 Hightouch、Census 等专门工具,也可自己写。
书里最值得记住的是它的风险:反馈环(feedback loop)。作者举了广告出价的例子——模型根据数仓数据算出出价,经反向 ETL 写回广告平台;新的投放结果再流回数仓,驱动下一轮出价。一旦逻辑有误,循环会自我放大,出价一路走高,广告费在没人察觉时被大量烧掉。对策是设上限、加监控与人工复核。
服务环节直接面对数据分析师、数据科学家、ML 工程师和业务方。底层关注点里,作者特别点了安全(最小权限、按行与按列控制可见性,对外分享时用视图或脱敏数据)、DataOps(监控数据是否按时到、质量是否异常、查询是否变慢)与编排(服务依赖上游所有步骤按序完成)。服务是用户最先感知故障的地方,所以监控必须盖到这一层。
表 1 · 七种服务方式(外加反向 ETL)
| 方式 | 适合 | 代价 |
|---|---|---|
| 文件交换 | 与外部伙伴一次性交换、对方只认 Excel | 版本混乱、权限难收回、时效差 |
| 数仓 / OLAP 库 | 内部 BI 与即席分析的默认选择 | 高并发对外场景要换实时 OLAP 引擎 |
| 流式系统 | 运营分析、秒级告警 | 运维复杂,历史回看能力弱 |
| 查询联邦 | 探索、跨源临时查询,不想先搬数据 | 压力落到源系统,性能受最慢的源拖累 |
| 数据共享 | 同一云数仓生态内跨团队 / 跨公司分享 | 绑定厂商生态,成本归属要谈清 |
| 语义 / 指标层 | 多工具、多团队要同一套口径 | 多一层抽象要维护与学习 |
| Notebook | 数据科学探索、建模 | 单机内存上限、凭证易泄露、难复现 |
| 反向 ETL | 让结果出现在 CRM、营销等业务系统里 | 错误直接变成业务动作,有反馈环风险 |
表 2 · 三类分析的要求
| 类型 | 用户 | 新鲜度 / 延迟 | 并发 | 典型底座 |
|---|---|---|---|---|
| 业务分析 | 管理层、分析师 | 小时到天;查询数秒可接受 | 几十到几百 | 云数仓 + BI |
| 运营分析 | 运营、值班工程师 | 秒到分钟 | 中等 | 流处理 + 实时库 |
| 嵌入式分析 | 外部客户 | 近实时;查询要亚秒 | 成千上万,需多租户隔离 | Druid / Pinot / ClickHouse 等 |
自助与否同样是权衡:给能提出新问题的分析型用户开放自助,配上干净模型与语义层;给只看结论的人做好固定仪表盘。对 ML 团队,数据工程交付到哪一层(原始数据、清洗表还是现成特征)要事先说定,否则特征逻辑会在两边各写一份。
面试题「给商家后台做一个实时销售看板」的好答案会这样落地:数仓里按订单事实表建模,指标在语义层定义一次;对外看板走实时 OLAP 引擎,从 Kafka 实时摄入、按商家做行级隔离,目标 p99 亚秒;内部日报仍走云数仓,约定 8 点前就绪的 SLA 并监控;风控训练集按时间点正确地生成;成交概率经反向 ETL 写回 CRM,同步时设变化幅度上限与告警。每一步都对应本章一个概念。
大厂 / 开源实证
① 服务是生命周期的最后一站,也是数据工程被检验的地方:数据被用上才有价值。
② 信任第一:建立要很久、失去只要一次;用校验、可观测性和数据 SLA / SLO 守住它。
③ 先问「拿到数据要做什么」,再按用户分类;把数据集当产品做,自助只给分析型用户且有边界。
④ 数据定义(词的含义)与数据逻辑(计算公式)要显式写下、集中维护;数据网格把服务下放到业务域。
⑤ 分析分三类:业务分析看历史、运营分析看此刻、嵌入式分析面向外部客户,要高并发、低延迟、多租户隔离。
⑥ 为 ML 供数要保证时间点正确,避免训练与线上两套逻辑;特征平台为此而生。
⑦ 七种服务方式:文件、数据库、流、联邦、共享、语义层、Notebook,各有适用面与代价。
⑧ 反向 ETL 把结果送回业务系统,价值在「数据去用户已在的地方」,风险是反馈环,必须设上限与监控。