1. OLAP 基础与实时数仓概述

大家好,我是这次课程的主讲。做了十几年大数据架构,从传统数仓一路折腾到实时 OLAP,踩过的坑确实不少。今天咱们先打好地基,聊聊 OLAP 到底是什么,实时数仓又是怎么一步步演变成今天这个样子的。

说白了,OLAP 就是帮企业做「快速分析决策」的那套东西。我刚开始接触这行时,总觉得 OLAP 和 OLTP 差不多,都是查数据库嘛。后来被一个报表需求折磨了三天三夜,才真正明白这两者的区别有多大。

1.1 OLAP 概念与核心特征

OLAP(On-Line Analytical Processing,联机分析处理),核心是「分析」。它的设计目标很明确:让用户能从多个维度、多个层次快速查询和理解数据。

举个例子,一家连锁零售企业想分析「华东区上个月各品类销售额的同比变化」。这个查询涉及时间维度(上个月 vs 去年同期)、地理维度(华东区)、产品维度(品类),还要做聚合计算(销售额同比)。用 OLTP 系统跑这种查询?嗯,我试过,跑了一个多小时还没出结果,业务方直接打电话来骂人了。

OLAP 的核心特征,我总结为四点:

  • 多维分析:支持按时间、地区、产品等多个维度自由组合查询
  • 快速响应:秒级甚至毫秒级返回聚合结果
  • 数据集成:整合来自多个源系统的数据
  • 历史趋势:保留大量历史数据,支持时间序列分析

关键认知:OLAP 不是一种技术,而是一种分析模式。它关注的是「从数据中发现价值」,而不是「记录一笔交易」。

1.2 OLAP vs OLTP:两个世界的碰撞

很多新手容易把 OLAP 和 OLTP 搞混。我见过一个团队用 MySQL 直接跑百亿级数据的聚合查询,结果可想而知——数据库直接挂了。咱们用一张表把它们的核心差异说清楚:

对比维度 OLTP(联机事务处理) OLAP(联机分析处理)
核心目标 高并发、低延迟的事务处理 复杂查询、多维分析
典型操作 增删改查(CRUD) 聚合、分组、排序、窗口函数
数据模型 实体关系模型(3NF) 星型模型、雪花模型
数据量级 GB ~ TB 级别 TB ~ PB 级别
响应时间 毫秒级 秒级到分钟级(可接受)
典型系统 MySQL、PostgreSQL、Oracle ClickHouse、Doris、StarRocks

你想想看,OLTP 就像超市收银台,每笔交易都要快速处理;OLAP 就像总部的年度经营分析会,需要从海量数据中提炼洞察。两者没有谁优谁劣,只是分工不同。

避坑指南:我曾经见过一个项目,直接在 OLTP 库上跑复杂的聚合报表,结果导致线上交易系统响应超时,损失了几十万的订单。记住:OLTP 负责「干活」,OLAP 负责「看路」,别让看路的干扰了干活的。

1.3 实时数仓的演进之路

数仓架构的演进,说白了就是业务对「数据新鲜度」的要求越来越苛刻。我入行时还在做 T+1 的离线数仓,每天凌晨跑批处理,第二天早上看报表。后来业务方说:「能不能看实时的?」于是就有了 Lambda 架构。再后来又说:「Lambda 维护两套代码太累了。」于是 Kappa 架构应运而生。

咱们用一张图来展示这个演进过程:

实时数仓架构演进 离线数仓 T+1 批处理 Lambda 架构 批 + 流 两条链路 Kappa 架构 纯流式处理 演进驱动力: • 业务对数据实时性要求从「天级」→「小时级」→「分钟级」→「秒级」 • 技术从「批处理为主」→「流批一体」→「纯流式」 各阶段核心挑战 • 离线数仓:数据延迟高,无法支持实时决策 • Lambda 架构:维护批和流两套代码,逻辑一致性难保证 • Kappa 架构:对消息队列和流计算引擎的可靠性要求极高

1.4 Lambda 架构详解

Lambda 架构是 Nathan Marz 提出的经典方案。它的核心思想是「批流分离」:

  • 批处理层(Batch Layer):处理全量历史数据,保证数据准确性
  • 流处理层(Speed Layer):处理实时增量数据,保证低延迟
  • 服务层(Serving Layer):合并批和流的结果,对外提供统一查询

我在 2018 年参与过一个电商实时大屏项目,用的就是 Lambda 架构。批处理层用 Spark 跑 T+1 的全量聚合,流处理层用 Flink 处理秒级的实时订单数据。当时觉得这个架构很完美,直到后来发现一个问题:同样的业务逻辑要在批和流里各写一遍,而且经常出现两边计算结果对不上的情况。

个人经验:Lambda 架构的「批流结果不一致」是个老大难问题。我建议在实现时,把核心业务逻辑抽象成公共函数库,批和流都调用同一份代码,能减少很多对账的麻烦。

1.5 Kappa 架构详解

Kappa 架构是 Jay Kreps(Kafka 的作者)提出的。它的理念很激进:只用一套流处理引擎,搞定所有事情。

核心思路是:

  1. 所有数据都进入消息队列(如 Kafka),作为统一的日志存储
  2. 流处理引擎(如 Flink)从 Kafka 消费数据,实时计算
  3. 如果需要重新处理历史数据,只需重置消费偏移量,重新跑一遍流作业

说白了,Kappa 就是把批处理也当成一种特殊的流处理——只不过这个「流」的数据量特别大,但处理逻辑是一样的。

关键区别:Lambda 是「两条腿走路」,Kappa 是「一条腿走到黑」。Kappa 的优点是架构简单、代码统一;缺点是对消息队列的存储能力和流引擎的容错能力要求极高。

1.6 Lambda vs Kappa:如何选择?

很多同学问我:「老师,现在是不是都用 Kappa 了?Lambda 是不是过时了?」

我的回答是:没有银弹。咱们用一张表对比一下:

对比维度 Lambda 架构 Kappa 架构
架构复杂度 较高,需维护两套链路 较低,一套链路搞定
代码维护 批和流逻辑可能不一致 统一逻辑,易于维护
历史数据重算 批处理层天然支持 需重置偏移量重新消费
实时性 流处理层保证秒级 秒级(取决于流引擎)
数据准确性 批处理层保证最终一致 依赖流引擎的 exactly-once 语义
适用场景 对历史数据准确性要求极高 实时性优先,可接受最终一致

我个人习惯这样选型:

  • 如果业务对历史数据的准确性有强要求(比如金融对账),我会选 Lambda,用批处理层兜底
  • 如果业务更看重实时性,且能接受最终一致性(比如实时大屏、推荐系统),Kappa 更合适
  • 如果团队规模小、维护能力有限,优先考虑 Kappa,减少运维负担

我曾经踩过的坑:在一个实时风控项目中,我们选了 Kappa 架构,结果 Kafka 集群挂了半小时,导致大量实时数据丢失。后来我们加了 Kafka MirrorMaker 做跨机房备份,才解决了这个问题。选 Kappa 之前,一定要评估好消息队列的可靠性。

1.7 本章小结

这一章我们聊了 OLAP 的核心概念,对比了 OLAP 和 OLTP 的本质区别,梳理了实时数仓从离线到 Lambda 再到 Kappa 的演进脉络。这些都是后续章节的基础,尤其是后面要讲的 ClickHouse、Doris、StarRocks 等实时 OLAP 引擎,都是在这些架构思想下诞生的。

记住一句话:架构没有好坏,只有合不合适。理解每种架构的优缺点和适用场景,比盲目追求新技术更重要。