本页目录 · 5 节
第 19 章 大数据架构设计理论与实践
对应大纲:科目 1-18 大数据架构设计理论与实践|教材 P676–P701|优先级 ★★★★|综合知识估分 2~4 分
读法:本章只有一条主线——批处理与流处理如何拼成一个系统。先把 Lambda 三层背成肌肉记忆,再用五维表把 Kappa 压进去,最后记 6 条选型判据。选择题只考「谁负责什么」,案例题只考「选哪个、为什么」,论文只考「你怎么落地」。
一、知识框架
大数据架构设计理论与实践
├─ 19.1 传统数据处理系统存在的问题
│ ├─ 扩展:纵向扩展有天花板
│ ├─ 数据:只擅长结构化,Schema-on-write
│ ├─ 时效:只能批处理,T+1
│ └─ 成本与容错:高端设备、扩容即停机
├─ 19.2 大数据处理系统架构分析
│ ├─ 5V:Volume|Variety|Velocity|Veracity|Value
│ ├─ 面临挑战:规模|类型|时效|质量|成本
│ └─ 架构特征:分布式、水平扩展、数据不可变、批流并存
├─ 19.3 Lambda 架构
│ ├─ 三层:Batch Layer|Speed Layer|Serving Layer
│ ├─ 两条基石:数据不可变 + 可重算
│ ├─ 实现:HDFS/Spark + Kafka/Flink + HBase/Redis
│ └─ 优缺点与横向对比
├─ 19.4 Kappa 架构
│ ├─ 一条链路:全部数据进 Kafka,只用流处理
│ ├─ 一个动作:重放(replay)代替重算
│ ├─ 实现与常见变形(流批一体、Kappa+)
│ └─ 优缺点
├─ 19.5 Lambda 与 Kappa 的对比和设计选择
│ ├─ 五维对比:实时性|复杂度|运维成本|一致性|场景
│ └─ 六条选型判据
└─ 19.6 案例分析
├─ 案例一:零售全渠道数据平台(选 Lambda)
├─ 案例二:银行实时反欺诈(选 Kappa)
└─ 案例答题四步与论文用法
二、必背要点
19.1 传统数据处理系统存在的问题
传统数据仓库的典型链路:业务库 → ETL → ODS → 数据仓库 → 数据集市 → BI 报表。它建立在关系数据库与小型机之上,设计前提是「数据量可控、结构固定、按天出结果」。数据规模一大,这些前提逐条失效。
| 问题 | 表现 | 根因 |
|---|---|---|
| 不能水平扩展 | 容量到顶只能换更强的主机,成本指数上升 | 架构为纵向扩展(scale up)设计,共享存储与单库 |
| 只能批处理 | 报表 T+1,大屏要等日终跑批 | ETL 按周期调度,无流式通道 |
| Schema-on-write | 新增字段要改表、停服、重跑历史 | 写时模式,模式先于数据确定 |
| 数据类型受限 | 日志、图片、埋点要先清洗成结构化才能入库 | 关系模型只支持结构化数据 |
| 容错与可用性弱 | 单机故障即整体不可用,扩容需停机 | 集中式部署,无副本与分片 |
| 成本高 | 高端存储与商业数据库授权费高 | 依赖垂直整合的商业软硬件 |
一句话总结:传统系统是「先定模式、纵向堆硬件、按天出结果」;大数据系统要「先存原始数据、横向加机器、秒级出结果」。
19.2 大数据处理系统架构分析
5V 特征(4V 为经典四要素,5V 增加真实性)
| 特征 | 含义 | 对架构的要求 |
|---|---|---|
| Volume 体量大 | TB~PB 级,单机存不下 | 分布式存储、分片、多副本 |
| Variety 多样 | 结构化、半结构化、非结构化并存 | Schemaless、多模存储、统一元数据 |
| Velocity 速度快 | 流式数据持续到达,要求低延迟 | 流处理、消息队列、增量计算 |
| Veracity 真实性 | 数据有噪声、缺失、重复 | 数据质量校验、去重、血缘追踪 |
| Value 价值密度低 | 海量数据中只有少量有用 | 分层加工、按需计算、列式存储 |
四类挑战:规模挑战(存储与计算如何扩展)、类型挑战(如何容纳多模数据)、时效挑战(批与流如何共存)、成本与质量挑战(如何在可接受成本下保证可信)。
大数据系统架构的六个特征
| 特征 | 含义 | 落地手段 |
|---|---|---|
| 分布式存储与计算 | 数据与计算都分散在多节点 | HDFS、对象存储、MapReduce/Spark |
| 水平扩展 | 加节点即扩容,近线性提升 | 无共享架构、分片、弹性调度 |
| 数据不可变 | 原始数据只追加、不修改 | 追加写日志、对象存储、版本号 |
| 读时模式 | 先存原始数据,用时再解释结构 | Schema-on-read、数据湖 |
| 批流并存 | 离线全量与实时增量两条通路 | Lambda / Kappa / 流批一体 |
| 移动计算而非移动数据 | 任务调度到数据所在节点 | 数据本地性、就近计算 |
技术栈分层(背这一张就够)
| 层次 | 职责 | 代表技术 |
|---|---|---|
| 数据采集 | 从业务库、日志、埋点、IoT 接入 | Flume、Sqoop、Canal、Kafka |
| 数据存储 | 原始数据与明细数据持久化 | HDFS、对象存储、HBase、Kudu |
| 数据计算 | 批处理、流处理、交互查询 | MapReduce、Spark、Flink、Presto |
| 资源调度 | 分配 CPU、内存、容器 | YARN、Kubernetes |
| 数据服务 | 对外提供低延迟查询 | Redis、ClickHouse、Elasticsearch、HBase |
| 数据治理 | 元数据、血缘、质量、权限 | Atlas、DataHub、质量规则引擎 |
19.3 Lambda 架构
基本理解
Lambda 架构由 Nathan Marz 提出,出发点是一个函数式观点:
查询结果 = 对「全部历史数据」应用「某个函数」
只要原始数据永不修改(只追加),那么任何时候都能用新函数把历史重算一遍,得到正确结果。这一条「数据不可变 + 可重算」是 Lambda 的全部地基,也是它容错能力的来源:程序有 bug 不可怕,改完重算即可。
三层结构
数据源 ──► Batch Layer(HDFS 主数据集 + Spark/MapReduce)
│ └─ 周期性全量重算 ──► Batch View(批视图)
└──► Speed Layer(Kafka + Flink/Storm)
└─ 只算增量 ──► Realtime View(实时视图)
│
Serving Layer ◄┘
(合并批视图 + 实时视图,对外查询)
| 层 | 职责 | 输入 → 输出 | 特性 |
|---|---|---|---|
| Batch Layer 批处理层 | 保存主数据集,周期性全量重算 | 全部历史数据 → 批视图 | 高吞吐、高准确、小时/天级延迟 |
| Speed Layer 加速层 | 只处理上次批处理之后的增量 | 实时数据流 → 实时视图 | 低延迟、近似结果、可能重复 |
| Serving Layer 服务层 | 合并两个视图,响应查询 | 两视图 → 查询结果 | 随机读、低延迟 |
查询合成公式
最终结果 = 批视图(截至上次批处理) + 实时视图(此后的增量)
批视图是「最终正确」的,实时视图是「临时补齐」的。当下一轮批处理完成,实时视图对应区间被批视图覆盖,实时视图即可丢弃重建——这就是 Lambda 的自我修正机制。
实现要点
| 环节 | 常见选型 | 关键设计 |
|---|---|---|
| 主数据集存储 | HDFS、S3/OSS | 只追加、按分区组织、保留原始格式 |
| 批计算 | MapReduce、Spark、Hive | 全量重算、幂等覆盖写 |
| 实时采集 | Kafka、Flume | 分区并行、削峰缓冲 |
| 流计算 | Storm、Spark Streaming、Flink | 增量聚合、幂等写、去重 |
| 服务层 | HBase、Cassandra、Redis、ClickHouse | 按查询维度建表、批量导入 |
优点
- 准确性有兜底:批层全量重算可修正流层近似与错误,结果最终正确。
- 容错强:数据不可变,出错重跑即可,不需要复杂的事务回滚。
- 实时与离线兼得:既满足 T+1 的精确报表,也满足秒级的大屏与告警。
- 技术成熟:每一层都有大量成熟组件,团队易招聘、易运维。
缺点
- 两套代码:同一业务口径要在批、流两个引擎各写一遍,逻辑漂移导致「大屏和报表对不上」。
- 运维复杂:HDFS、Kafka、两套计算引擎、服务层数据库,组件多、链路长。
- 准确性有时延:流层结果在被批层覆盖前只是近似值。
- 资源开销大:周期全量重算消耗大量算力与存储。
19.4 Kappa 架构
基本理解
Kappa 架构由 Jay Kreps(Kafka 作者之一)提出,核心质疑是:既然流处理引擎可以处理无界数据,为什么还要维护一套批处理? 他的答案是——不要批层,只保留一条流处理链路;需要重算时,不重新跑批任务,而是把数据重放一遍。
一条链路
数据源 ──► Kafka(唯一数据源;多分区、多副本、长期保留)
│
├─► 流处理作业(Flink,一套代码)
│ └─► Serving(Redis/ClickHouse/HBase)
│
└─► 需要重算:重置 offset 从头重放
└─► 新结果表 ──► 校验 ──► 切换
Kafka 在 Kappa 中的四个作用(必背)
| 机制 | 作用 | 考点 |
|---|---|---|
| 分区 Partition | 并行度单位,决定消费吞吐 | 顺序只保证分区内,不保证全局有序 |
| 副本 Replica | 多副本冗余,leader/follower + ISR | 副本数决定容错,不是性能 |
| 位点 Offset | 记录每个消费组消费到哪 | 可提交、可重置,是重放的开关 |
| 长期保留 Retention | 原始日志保留数天到永久 | 保留期决定「能回溯多久」 |
重放(Replay)
改完逻辑后:停作业 → 记录当前 offset → 重置到起点(或指定时间点)→ 用新逻辑重跑 → 结果写入新表/新版本 → 与旧结果比对无误 → 切换读流量。要点是旁路重算、验证后切换,不能直接覆盖线上结果。
优点
- 一套代码:批流统一,口径天然一致,不存在「报表与大屏对不上」。
- 架构简单:只有 Kafka + 流引擎 + 服务层,组件少、运维成本低。
- 实时性最好:全链路流式,端到端秒级。
- 可重放:靠 Kafka 保留期实现「重算」,逻辑变更成本低。
缺点
- 强依赖 Kafka 保留期:要能重放历史,就得长期保留原始数据,存储成本高。
- 重放代价大:PB 级历史重放耗时可能超过业务可接受窗口。
- 复杂分析能力弱:大规模多表 join、全量排序、机器学习特征工程仍不如批处理。
- 对流引擎要求高:状态管理、精确一次、反压处理都要靠引擎能力兜底。
常见变形
| 变形 | 做法 | 适用 |
|---|---|---|
| Kappa+ / 混合架构 | 热数据留 Kafka,冷数据归档对象存储,重放时回灌 | 历史长、又要控制成本 |
| 流批一体 | Flink/Spark 一套 API,批模式跑历史、流模式跑增量 | 希望统一代码又保留批能力 |
| 分层 Kappa | ODS 用 Kafka,DWD 流处理,DWS 落 OLAP 供即席查询 | 实时数仓典型形态 |
| Lambda 简化版 | 批层只做归档与冷备,实时链路为主 | 以实时为主、离线仅合规留存 |
19.5 Lambda 与 Kappa 的对比和设计选择
五维对比(必背表)
| 维度 | Lambda | Kappa |
|---|---|---|
| 实时性 | 批层 T+1,实时靠加速层补齐,端到端秒级但结果近似 | 全链路流式,秒级且口径唯一 |
| 复杂度 | 高:两套引擎、两套代码、两套口径 | 低:一条链路、一套代码 |
| 运维成本 | 高:组件多、链路长、对账难 | 低:组件少,但强依赖 Kafka 稳定性 |
| 准确性/一致性 | 批层最终准确,流层近似,需合并去重 | 一套逻辑天然一致,准确性取决于流引擎与重放 |
| 适用场景 | 海量历史 + 复杂离线分析 + 实时看板并存 | 实时为主、逻辑稳定、数据可长期保留 |
六条选型判据(按顺序问自己)
- 要不要大规模历史全量重算? 要,且数据到 PB 级、重放不现实 → Lambda。
- 实时性要求是秒级还是分钟/小时级? 秒级且是主诉求 → Kappa 优先。
- 业务逻辑变更后能否承受全量重放? 能(数据量可控、保留期够)→ Kappa;不能 → Lambda。
- 分析是否以复杂多表关联、全量聚合、特征工程为主? 是 → Lambda 的批层更合适。
- 团队有几个人维护大数据平台? 1~3 人 → Kappa;有专职平台团队 → Lambda。
- 是否有合规要求长期留存原始数据、可回溯审计? 有 → 两者都要做不可变存储,Kappa 需把归档层补齐。
一句话结论:Lambda 用复杂度换准确性与分析能力,Kappa 用存储与重放成本换架构简洁与实时一致性。 新项目若无沉重历史包袱,优先 Kappa 或流批一体;已有成熟离线数仓、又要加实时能力的,优先 Lambda。
19.6 案例分析
案例一:某零售集团全渠道数据平台(选 Lambda)
| 项 | 内容 |
|---|---|
| 背景 | 线上商城 + 3000 家门店,日均订单 600 万,埋点日志 20 亿条/日,总数据量 3 PB |
| 需求 | 经营大屏秒级更新;财务与供应链 T+1 精确报表;支持历史任意时段回溯重算 |
| 选型 | Lambda:历史量大、分析复杂、必须能全量重算 |
| 批层 | HDFS 存原始日志与订单快照,Spark 每日全量重算宽表,写 Hive/ClickHouse |
| 加速层 | Kafka 承接埋点与订单变更,Flink 做 5 分钟窗口聚合,写 Redis |
| 服务层 | 大屏读 ClickHouse 批视图并与 Redis 实时视图合并;报表直读 ClickHouse |
| 效果 | 大屏延迟 3 秒,报表准确率 100%,故障后可重算恢复 |
案例二:某银行实时反欺诈(选 Kappa)
| 项 | 内容 |
|---|---|
| 背景 | 日均 300 万笔交易,要求 200 毫秒内完成风险判定,规则每月迭代 |
| 需求 | 纯实时、规则频繁变更、需回放近 3 个月交易验证新规则 |
| 选型 | Kappa:无离线报表诉求,规则变更靠重放验证 |
| 链路 | 交易 → Kafka(保留 180 天)→ Flink 有状态计算 → Redis 特征 + 决策 |
| 重放 | 新规则上线前,重置 offset 回放历史,影子表对比拦截率与误杀率 |
| 效果 | 判定延迟 80 毫秒,规则上线周期由 2 周缩短到 2 天 |
案例答题四步
- 定性:先判断题目要批流并存(Lambda)还是单一实时链路(Kappa),一句话给结论。
- 画层:按「采集 → 存储 → 计算 → 服务」写出每层组件与职责,Lambda 必须写清三层。
- 说理:用五维表中的 2~3 维给判据,必须扣住题目的数据量、延迟、团队规模。
- 补短板:主动写一条缺点与应对(如「Kappa 历史重放成本高,我们将冷数据归档对象存储」)。
论文可用句式
「平台日均接入埋点 20 亿条,历史数据 3 PB。若采用纯流式架构,一次全量重放需 40 小时,无法满足财务 T+1 出表要求,因此我们选择 Lambda 架构:批处理层用 Spark 每日全量重算保证准确性,加速层用 Flink 计算 5 分钟增量,服务层合并两视图对外提供查询,最终大屏延迟控制在 3 秒、报表准确率达到 100%。」
三、易混淆概念对比
| A | B | 关键区别 |
|---|---|---|
| Lambda | Kappa | Lambda 批 + 流双链路;Kappa 只保留流处理单链路 |
| 批处理层 | 加速层 | 批层全量重算、结果精确、延迟高;加速层只算增量、结果近似、延迟低 |
| 重算 recompute | 重放 replay | 重算在批层重跑全量作业;重放在流层重置 offset 重读日志 |
| 数据不可变 | 数据不更新 | 不可变是只追加、旧版本仍可读;不更新只是不改,未必留历史 |
| Schema-on-write | Schema-on-read | 写时模式先定结构再入库;读时模式先存原始数据、查询时解释 |
| 数据仓库 | 数据湖 | 数仓存加工后的结构化数据;数据湖存原始多模数据 |
| 数据湖 | 湖仓一体 | 湖仓一体在湖上补事务、元数据与 SQL 能力,兼顾两者 |
| 离线数仓 | 实时数仓 | 离线按周期跑批;实时以流处理持续更新 |
| 分区 Partition | 副本 Replica | 分区决定并行与顺序范围;副本决定容错 |
| Offset | Checkpoint | offset 是消费位点,用于重放;checkpoint 是作业状态快照,用于故障恢复 |
| 至少一次 | 精确一次 | 至少一次可能重复需幂等;精确一次靠事务或去重实现 |
| 批处理 | 流处理 | 批处理面向有界全量数据;流处理面向无界持续数据 |
四、常见考法与出题角度
| 题型 | 出题角度 | 典型问法 | 答题要点 |
|---|---|---|---|
| 单选 | 层次职责 | 「Lambda 中负责实时增量计算的是」 | Speed Layer 加速层 |
| 单选 | 唯一数据源 | 「Kappa 架构的唯一数据源是」 | Kafka |
| 单选 | 传统系统缺陷 | 「传统数据仓库难以水平扩展的根本原因」 | 纵向扩展架构、共享存储单库 |
| 单选 | 不可变意义 | 「数据不可变带来的主要好处」 | 可重算、可回溯、容错简单 |
| 单选 | Lambda 缺点 | 「Lambda 架构最主要的缺点」 | 两套代码两套口径,易不一致 |
| 单选 | Kafka 顺序 | 「Kafka 能保证哪种顺序」 | 单分区内有序,全局无序 |
| 单选 | 重放机制 | 「Kappa 中实现重算依靠」 | 重置 offset 重放日志 |
| 简答 | 架构对比 | 「Lambda 与 Kappa 有何不同」 | 从链路数、代码套数、重算方式、适用场景作答 |
| 案例题角度 | 架构选型 | 给业务场景问「选 Lambda 还是 Kappa,说明理由」 | 先结论,再按数据量/延迟/分析复杂度/团队给 3 条判据 |
| 案例题角度 | 补全架构 | 给出残缺架构图要求补层与组件 | 按采集-存储-计算-服务四层补齐,写清每层职责 |
| 论文可用角度 | 正文举例 | 「论文写大数据平台怎么用本章」 | 写清数据量、选型理由、三层落地、量化效果与一条不足 |
五、速记与自测
速记
- 大数据 5V:量、类、速、真、值
- 传统四病:扩不动、只能批、写定模、类型窄
- 架构六特征:分布、横扩、不变、读模、批流、算移
- Lambda 三层:批、速、服(Batch、Speed、Serving)
- Lambda 两基石:不可变、可重算
- Kappa 三件套:Kafka 唯一源、流处理一套码、offset 重放
- Kafka 四机制:分区、副本、位点、保留
- 选型口诀:历史重、分析杂 → Lambda;实时主、逻辑稳 → Kappa
自测
- Lambda 架构的三层分别叫什么?各层的输入与输出是什么?
- 为什么说「数据不可变」是 Lambda 容错能力的基础?
- Kappa 架构如何实现「重算」?它最大的成本在哪里?
- 某系统日均 500 万笔交易、要求 200 毫秒风控、规则每月迭代、无离线报表需求,应选哪种架构?
答案:1. 批处理层(全部历史→批视图)、加速层(增量数据→实时视图)、服务层(两视图→查询结果);2. 原始数据只追加不修改,任何时刻都能用新逻辑重跑全量,出错只需重算而不需回滚;3. 重置 Kafka 消费 offset 从头重放日志;最大成本是长期保留原始数据的存储与重放耗时;4. Kappa,纯实时、逻辑常变、可靠重放验证,无离线分析诉求。