专业书籍精读 · Fundamentals of Data Engineering · 第 3 章
Fundamentals of Data Engineering · Ch 3 · Designing Good Data Architecture · Reis & Housley · 2022
一家公司的销售、库存、广告、客服数据散落在几十个系统里。老板问「哪个渠道最赚钱」,答案要从这些系统里汇总出来。把数据怎么流、放在哪、谁来管事先规划好,就是数据架构。这一章讲什么样的规划算「好」。
数据架构像给一座会不断扩建的城市做规划。规划者不会一次性把每栋楼都定死,而是先修好路、水、电这些人人要用的基础设施,再让各个街区按需要盖房。好的规划能让城市长大,而不用每扩建一次就把老城推倒重来。
有了这些原则,团队能在不推倒重来的前提下跟着业务一起长大。该怎么选取决于规模:小团队用一套现成的云上方案就够了;部门多到中心团队忙不过来,才值得考虑把数据交还给各部门自己管。一句诚实的代价:越分散越灵活,但大家的口径和规矩也越难统一。
好的数据架构不是一张一次画完的蓝图,而是一套让大多数决定都能退回、各部分松开咬合、能跟着业务不断调整的规划。
想看书里的九条架构原则、单向门与双向门、数据仓库 → 数据湖 → 湖仓的演变、Lambda 与 Kappa 怎么取舍,以及数据网格(data mesh)的四条原则? → 切到精读版
你以为好的数据架构是一张选对了工具的终态蓝图,其实本章给它下的定义是:支撑企业不断演进的数据需求,靠的是在仔细权衡之后做出灵活、可逆的决策。关键词是「可逆」——仓、湖、湖仓、Lambda、数据网格都只是不同场景下的权衡,没有一种是终点。
Part I「基础与构件」第 3 章。第 2 章把数据架构列为生命周期的六条暗流之一,这一章把它单独展开;第 4 章接着讲在这些原则下怎么选具体技术。对应现实里「数据平台该怎么搭、几年后还能不能改」的架构评审。
数据团队最贵的错误往往不是某条管道写错,而是架构把自己锁死:一个花了三年建成的本地数仓,业务换了方向就跟不上;所有原始数据倒进一个湖,三年后没人说得清哪些可用、哪些含个人信息该删;一个中心团队排着几十个部门的需求,新报表要等一个季度。
本章先给数据架构下定义,再给出九条判断「好不好」的原则,然后把业界几种主流架构——数据仓库、数据湖、湖仓、Lambda、Kappa、Dataflow 统一模型、数据网格——放在同一把尺子下比较。作者特别强调:数据工程师未必是架构师,但必须懂架构,能看懂一个决定是可逆还是不可逆。
作者从企业架构(TOGAF、Gartner 等多种定义)出发,归纳出自己的版本:企业架构是为支撑企业变化而做的系统设计,靠在仔细权衡后做出灵活、可逆的决策;数据架构是它在数据这一侧的子集。数据架构又分两层:运营架构(operational architecture)回答「做什么」——要支持哪些业务流程、数据质量要多高、从数据产生到可查询能容忍多少延迟;技术架构(technical architecture)回答「怎么做」——数据怎么采集、存储、转换和服务。比如「每小时把 10 TB 数据从源库搬进数据湖」就是技术架构层面的描述。
「可逆」借用了 Jeff Bezos 的说法:单向门(one-way door)是一旦走过去几乎无法回头的决定,例如卖掉公司、把核心系统写死在某个专有平台上;双向门(two-way door)是随时能退回的决定,例如把对象存储里一批数据换到更便宜的存储层,发现不合适再换回来。双向门应该快做、多做;单向门才值得慢、值得开评审会。好架构的作用,是把尽可能多的决定变成双向门。
作者参考了 AWS Well-Architected Framework 和 Google Cloud 的云原生架构原则,归纳出九条:
书中引用了亚马逊内部那份著名的 API 指令:所有团队只能通过服务接口暴露数据和功能,不允许直接读别人的数据库。它是松耦合最有名的例子——每个团队只对接口负责,内部怎么改都不影响别人。
落到数据系统:单层架构把数据库和应用放在一台机器上,最简单也最脆弱;多层架构把数据层、应用逻辑层、展示层分开。单体(monolith)把一切放在一起,好上手但难改;微服务拆成各自独立的小服务,好改但运维复杂。几个必须考虑的因素:单租户还是多租户(多租户要防「吵闹的邻居」抢资源,更要防数据串到别的客户那里);事件驱动(服务之间靠事件异步通信,生产者和消费者互不等待)。
改造旧系统时,作者推荐绞杀者模式(strangler pattern):不一次性推倒重来,而是让新系统一块一块接管旧系统的功能,直到旧系统可以下线。它本质上是把一次巨大的单向门拆成许多扇双向门。
数据仓库的经典定义来自 Bill Inmon:面向主题、集成的、非易失的、随时间变化的数据集合,用于支持管理决策。传统做法是 ETL——先清洗再进仓。云数仓(Amazon Redshift 开了先河,随后有 Google BigQuery、Snowflake)把计算和存储分开,按需扩缩,ELT 因此流行:先原样载入,再用仓里的算力转换。面向某个部门的精简子集叫数据集市(data mart)。
数据湖随 Hadoop 时代兴起,主张把所有原始数据先倒进廉价存储,结构等用的时候再定。问题很快出现:没有目录和治理,湖变成数据沼泽(data swamp);数据只写不读;更新、删除单条记录极其麻烦,碰上 GDPR 要求删除某个用户的数据时尤其痛苦。
湖仓(data lakehouse)由 Databricks 提出:数据仍然放在对象存储上的开放格式文件里,但在上面加一层表格式,提供 ACID 事务、表结构管理、更新与删除,让湖拥有仓的可靠性。作者观察到,仓和湖正在相互靠拢:云数仓开始能直接查湖里的文件,湖也越来越像仓,两者正在汇成一个「数据平台」。
作者还点名了现代数据栈(modern data stack):用现成的云服务按模块拼装,即插即用、成本可控;其价值在于降低门槛,风险在于模块太多、账单与集成都会膨胀。
批和流要同时满足时怎么办?Lambda 架构(Nathan Marz 提出)让两套系统并行:批处理层定期重算出准确结果,速度层用流处理给出低延迟的近似结果,服务层把两者合并后对外提供查询。它的致命问题是同一套业务逻辑要在两个系统里各写一遍,两边结果对不上时很难排查。
Kappa 架构(Jay Kreps 于 2014 年提出)作为回应:只用一套流处理平台,所有数据都是事件流;需要重算时,从日志开头重放即可。作者的评价是,它在实践中并没有被广泛采用——长期保存并重放海量日志既复杂又昂贵。
Google 的 Dataflow 模型(开源实现为 Apache Beam)走第三条路:把所有数据都视为事件,用不同类型的窗口(window)做聚合;批处理只是「有边界的流」,于是一套代码同时跑批和流。Flink、Spark 也采用了类似的思路。
以上架构大多默认一个中心团队管所有数据。数据网格(data mesh)由 Zhamak Dehghani 提出,反对的正是这种集中:公司大了,中心数据团队会成为瓶颈,而且离业务太远、不懂数据的含义。它有四条原则:
它和第三节的 API 指令是同一个思想:按组织边界做松耦合。书中还提到数据编织(data fabric)、数据中心(data hub)等名词,提醒读者这类标签层出不穷,判断时回到九条原则即可。
表 1 · 仓、湖、湖仓:什么场景选什么
| 架构 | 适合 | 代价 |
|---|---|---|
| 云数据仓库 | 以结构化业务数据为主、分析师用 SQL 的团队;想最快上手 | 半结构化与非结构化数据不友好;数据存在厂商的格式里,换平台接近单向门 |
| 数据湖 | 海量日志、图片、ML 训练原料;探索性分析 | 没有治理就变沼泽;更新与删除难,合规风险高 |
| 湖仓 | 分析与 ML 共用一份数据;想用多个引擎读同一张表 | 表格式、元数据、小文件合并都要自己运维;仍在快速演进 |
判据:数据以规整的业务表为主、团队以 SQL 为主,先上云数仓;ML 与非结构化数据占比高,或者不想被单一厂商锁定,再考虑湖仓。
表 2 · 批流并存的三种做法
| 做法 | 思路 | 代价 |
|---|---|---|
| Lambda | 批层求准、速度层求快,服务层合并 | 两份代码、两套运维,结果对账难 |
| Kappa | 只有流,重算靠重放日志 | 长期保存并重放海量日志贵且复杂;采用不广 |
| Dataflow / Beam | 批是有边界的流,一套代码两种跑法 | 窗口、迟到数据等概念门槛高;依赖执行引擎的支持程度 |
表 3 · 集中式平台 vs 数据网格
| 组织方式 | 适合 | 代价 |
|---|---|---|
| 集中式团队 | 几个到几十人的数据团队、业务域不多 | 规模变大后成为排队瓶颈;离业务远 |
| 数据网格 | 业务域多、各域有能力自己做数据的大组织 | 要求各域都有数据工程能力;口径与治理更难统一;平台投入大 |
这一章的词汇就是数据平台架构评审的通用语言。被问「为什么选湖仓而不是数仓」,好的回答不是报工具名,而是说清:数据里结构化与非结构化各占多少、有没有 ML 场景、哪些决定是单向门、RTO 和 RPO 定多少、成本谁来盯、组织规模是否需要去中心化。云数仓侧对应 Redshift、BigQuery、Snowflake;湖仓侧对应 Delta Lake、Apache Iceberg 这类开放表格式;统一批流对应 Apache Beam、Flink、Spark。
开源实证
① 数据架构 = 支撑不断演进的数据需求,靠仔细权衡后做出灵活、可逆的决策;分运营架构(做什么)与技术架构(怎么做)。
② 单向门慢做、双向门快做;好架构把尽可能多的决定变成双向门。
③ 九条原则:选好公共组件、为失败规划(RTO / RPO)、可扩也可缩、架构即领导力、始终在做架构、松耦合、可逆、安全优先(零信任)、拥抱 FinOps。
④ 松耦合从亚马逊的 API 指令到数据网格一脉相承;改造旧系统用绞杀者模式,把大单向门拆成小双向门。
⑤ 仓先整理再进门、湖先进门再说、湖仓在湖上补回 ACID 与治理;仓与湖正在相互靠拢。
⑥ Lambda 两份代码难对账,Kappa 靠重放但采用不广,Dataflow / Beam 把批看作有边界的流。
⑦ 数据网格四原则:按域拥有、数据即产品、自助平台、联邦治理;先是组织问题,后是技术问题。
⑧ 架构评审的好答案报的是数据形态、单向门、恢复目标、成本与组织规模,而不是工具名。