一、数据库 (Database)
-
核心定位:面向事务处理(OLTP)。它是业务系统的“地基”,负责高效、可靠地记录每一次业务操作,如用户下单、账户更新等。
-
数据特征:存储结构化数据,有严格的模式(Schema)约束。
-
核心能力:追求高并发、低延迟的读写,并严格保证ACID(原子性、一致性、隔离性、持久性)事务,确保数据绝对准确。
-
典型场景:电商网站的订单系统、银行的交易系统、企业的客户关系管理系统(CRM)和企业资源计划(ERP)系统等。
📖 数据库类型划分
二、数据仓库 (Data Warehouse)
-
核心定位:面向分析处理(OLAP)。它是业务分析的“参谋部”,整合来自多个业务系统数据库的数据,用于支持管理决策。
-
数据特征:主要存储经过清洗、转换、建模(ETL)的结构化数据(强Schema)。
-
核心能力:针对复杂的分析查询进行优化,使用列式存储、预聚合等技术来提升查询速度,保证数据质量高且一致。
-
典型场景:生成企业经营报表(BI报表)、进行销售多维分析、支持高层管理决策等。
💎 数据仓库 技术栈
1. 数据源层 (Data Source Layer)
数据源层是数据仓库的基础,用于存储来自不同业务系统的原始数据。数据源可以是关系数据库、NoSQL 数据库、文本文件、XML 文件等。
| 维度 | 离线数仓 (Batch) | 实时数仓 (Streaming) |
|---|
| 核心痛点 | 捕获一天(T-1)的业务增量。 | 捕获毫秒/秒级的业务变更(CDC 变更数据捕获)。 |
| 技术栈 | 业务库:MySQL / PostgreSQL / Oracle
日志:Nginx日志、App埋点日志 |
完全一致,但实时数仓更依赖 数据库的事件变更日志,比如MySQL 的 Binlog。CDC 工具模拟从库角色订阅这些日志,解析出增删改操作和变更前后数据。并把变化实时抓出来同步给下游。
|
| 关键差异 | 容忍数据延迟,通常使用create_time等字段筛选增量。 | 必须依赖数据库日志捕获工具(如 Canal / Debezium)或消息队列(Kafka)直接接收事件源。 |
2. 数据接入层 (Data Ingestion Layer)
用于从数据源中提取数据并加载到数据仓库中。这是离线与实时分道扬镳的第一道关卡。
| 维度 | 离线数仓 (Batch Ingestion) | 实时数仓 (Streaming Ingestion) |
|---|
| 核心哲学 | “搬”数据:定时、大批量、吞吐优先。 | “流”数据:持续、小批量、低延迟优先。 |
| 主流技术栈 | Sqoop(逐渐淘汰)、DataX(阿里)、Kettle、
Spark Batch(spark.read.jdbc) | Canal / Debezium / Flink CDC(监听Binlog)
Flume / Filebeat(采集日志) |
| 中间缓冲 | 极少,直接读库或读日志文件。 |
必须依赖消息队列:Apache Kafka、Pulsar。
数据先进Kafka,再被下游消费。
|
3. 数据处理层 (Data Processing Layer)
用于对数据进行清洗、转换和整合
| 维度 | 离线数仓 (Batch Processing) | 实时数仓 (Streaming Processing) |
|---|
| 计算模型 | 批计算:有界数据集,一次性处理全部历史数据。 | 流计算:无界数据集,数据永不结束,窗口(Window)驱动。 |
| 核心引擎 |
Hive (MR/Tez)、Spark SQL
| Apache Flink、Spark Streaming |
| 处理逻辑 | 复杂的多维Join、全量去重、Union All。 | 双流Join(Interval Join)、状态管理(State)、时间语义(Event Time vs Processing Time)、Watermark(水位线)。 |
| 调度方式 | Azkaban / DolphinScheduler / Airflow(定时触发,如每天0点跑批)。 | 常驻服务(Long-running Service):Flink Job 提交后持续运行,无定时概念。 |
4. 数据存储层 (Data Storage Layer)
用于存储数据仓库中的数据
| 维度 | 离线数仓 (Batch Storage) | 实时数仓 (Streaming Storage) |
|---|
| ODS/DWD层 | HDFS + Hive/Spark Table(Parquet/ORC列存)。 | 消息队列(Kafka) 作为临时存储;同时下沉至 湖仓一体格式(Iceberg / Hudi / Delta Lake) 做长期持久化。 |
| DWS/ADS层 | HDFS / Hive(宽表存储)。 | 高性能分析型OLAP数据库:ClickHouse、Apache Doris、StarRocks。 |
| 维表/缓存 | 极少,直接查Hive维度表。 | Redis(高性能KV缓存)、HBase(支持随机读写的大维表)。 |
| 关键差异 | 存储介质单一(基本全在HDFS)。 | 分层异构:热数据在Kafka,温数据在Iceberg,冷数据在HDFS,结果数据在ClickHouse。 |
5. 数据分析层 (Data Analysis & Serving Layer)
用于对数据进行分析和挖掘
| 维度 | 离线数仓 (Batch Serving) | 实时数仓 (Streaming Serving) |
|---|
| 查询引擎 | Presto / Trino、Spark SQL(即席查询 Ad-hoc)
Hue / Zeppelin | Doris / StarRocks(自带极速查询)、ClickHouse
Elasticsearch(日志检索场景) |
| BI 工具 | Tableau、Power BI | 对接实时API接口,或FineReport直接连接Doris、ClickHouse做秒级刷新BI |
| 结果时效 | T+1(昨天发生了什么)。 | 秒级/分钟级(1分钟前发生了什么)。 |
| 典型输出 | 日报、月报、历史趋势图。 | 实时大屏(双十一GMV滚动)、实时风控预警、实时推荐特征。 |
注:Ad-hoc Query(即席查询)是指无需预先建模或固化逻辑,由终端用户临时自定义条件、实时执行并获取结果的交互式查询方式。依赖MPP 架构 + 列式存储 + 向量化执行,通过实时扫描计算或预计算 Cube实现秒级响应,无需预先定制报表 。
三、数据湖 (Data Lake)
-
核心定位:面向海量、多样数据的存储与探索。它是一个“数据池”,可以存储任何格式的原始数据,以备未来可能的分析。
-
数据特征:支持多模态数据存储,存储任意类型的数据,包括结构化、半结构化(如JSON)、非结构化(如图片、视频)。
-
核心能力:低成本、高扩展性地存储海量原始数据,采用“读时模式”(Schema-on-Read),即在分析时才定义数据结构,灵活性极高。
-
典型场景:数据科学家进行探索性分析、机器学习模型训练、存储网站点击流日志、IoT设备数据等。
1. 写时模式 (Schema-on-Write) 与 读时模式 (Schema-on-Read)
1.1 Schema-on-Write(写时模式)—— “严进严出”
这是传统数据仓库(RDBMS、Hive内部表)的核心理念。
1.2 Schema-on-Read(读时模式)—— “宽进宽出”
这是数据湖(HDFS、对象存储)的核心理念,也是Spark和Hive外部表擅长的事。
1.3 核心对比一览表
| 对比维度 | 写时模式 (Schema-on-Write) | 读时模式 (Schema-on-Read) |
|---|
| 数据处理哲学 | ETL(先转换,后加载) | ELT(先加载,后转换) |
| 存储成本 | 较高(需额外存储清洗后的副本) | 极低(存储原始冷数据,不占额外空间) |
| 写入吞吐 | 低(受限于计算和校验资源) | 极高(只做IO写入,无计算瓶颈) |
| 查询延迟 | 低(预计算、预索引,读取即用) | 高(每次需解析、投影和类型转换) |
| Schema演化 | 困难(修改需回滚历史数据) | 极易(只需修改读时SQL逻辑) |
| 数据质量 | 极高(入库已清洗) | 无保障(依赖读取侧处理) |
1.4 ETL 与 ELT
四、湖仓一体 (Lakehouse)
-
核心定位:融合数据湖与数据仓库的优势。它旨在提供一个统一平台,既拥有数据湖的低成本与灵活性,又具备数据仓库的高性能与数据管理能力。
-
数据特征:在数据湖的存储之上,引入了数据仓库的管理能力,如表格式(Table Format)、ACID事务、元数据管理等。
-
核心能力:实现 “流批一体” ,同时支持实时和离线分析;存储与计算解耦,可独立扩展;数据具有高可靠性和一致性。
-
典型场景:需要同时进行BI报表和机器学习的企业、希望简化数据架构、降低运维复杂度的组织。
1. 湖仓一体的技术栈
🗄️ 核心存储层 (Core Storage Layer)
这是湖仓一体的物理底座,负责以极低成本存储海量的原始数据。
-
存储介质:主要基于分布式文件系统(如HDFS) 或云对象存储(如Amazon S3、阿里云OSS、Azure Data Lake Storage)。云对象存储因其成本低、容量大、高可用,已成为湖仓存储的事实标准。
-
文件格式:数据在存储层以开放、列式存储的格式保存,以优化分析性能。最主流的选择是Apache Parquet和ORC。
-
核心优势:实现存储与计算分离,你可以独立地扩展存储而不影响计算集群,并能根据数据热度选择不同的存储介质(如热数据用SSD,冷数据用对象存储),从而优化成本。
🧮 计算引擎层 (Compute Engine Layer)
这一层是湖仓一体的“大脑”,负责执行所有数据的读取、写入和计算任务。关键在于多引擎可插拔,即不同的引擎可以共享同一份数据。
-
批处理与ETL:Apache Spark 仍是这一领域的王者。在湖仓架构中,它需要适配读取Iceberg/Hudi等表格式。
-
流处理:Apache Flink 是实现“流批一体”的核心。它可以从Kafka实时消费数据,写入湖仓表格式,实现秒级数据可见。
-
交互式与联邦查询:Presto/Trino 擅长对湖仓数据进行快速、低延迟的SQL查询。Apache Doris 和 StarRocks 等MPP引擎则既能直接查询湖仓数据,也能作为加速层提供高性能分析。
-
核心优势:不同业务场景(如复杂的ETL、实时流计算、交互式BI)可以选用最合适的引擎,且所有引擎都基于同一份数据工作,避免了数据冗余和一致性问题。
📋 表格式层 (Table Format Layer) —— 湖仓一体的核心
这是湖仓一体架构的灵魂所在,它在存储层之上构建了一个类似数据仓库的管理层。它让数据湖拥有了数据仓库才有的ACID事务、时间旅行(Time Travel)、Schema演化等关键能力。
目前主流的开源表格式如下:
1. Apache Iceberg:通用开放的标准制定者
Iceberg的设计目标是成为一个引擎无关的通用表格式标准。它的元数据设计非常优雅,采用多级索引(元数据文件 → Manifest列表 → Manifest文件),这使得它在规划查询时能快速定位所需数据文件,实现高性能的读取。
2. Delta Lake:Spark生态的嫡系部队
Delta Lake由Databricks推出,与Apache Spark生态系统有最深入的集成。它的核心是事务日志(Transaction Log),记录了表的所有变更,以此提供ACID保障。
3. Apache Hudi:数据变更与增量处理的专家
Hudi的名字源于 Hadoop Upserts Deletes and Incrementals,其核心设计就是围绕高效的数据变更(Upsert/Delete)和增量处理展开的。
4. Apache Paimon:为实时流处理而生的新秀
Paimon是最年轻的项目,它从Flink社区走来,设计目标直指“流批一体”的存储。它创新性地将 LSM树(日志结构合并树) 结构引入了数据湖。
🔗 数据集成层 (Data Integration Layer)
这一层负责将各种数据源高效、准确地接入湖仓。
-
批量同步:DataX、SeaTunnel等工具依然用于离线大批量数据导入。
-
实时同步(CDC):这是实时数仓和湖仓的关键技术。Canal、Debezium 等工具可以监控数据库的Binlog,将变更数据实时捕获并发送到Kafka。
-
流处理引擎:Apache Flink 是这一层的核心,它通过 Flink CDC 能力直接读取数据库变更,或消费Kafka数据,进行实时清洗、转换后,写入湖仓表格式。
-
统一接入框架:一些平台提供统一的接入层,如 Databricks Autoloader,可以自动发现和增量处理云存储中的新文件。
🎯 数据治理层 (Data Governance Layer)
当数据规模变大,治理就成为防止“数据沼泽”的关键。
-
元数据管理 (Metadata Management):这是治理的核心,需要一个统一的元数据目录(Catalog),如 Databricks Unity Catalog、阿里云DLF或AWS Glue。它提供统一的视图来管理所有表、字段和权限。
-
数据质量 (Data Quality):通过定义和监控数据质量规则(如完整性、准确性),确保湖仓内数据可信。工具如 Great Expectations、Apache Griffin 等。
-
数据血缘 (Data Lineage):追踪数据从源头到消费的完整链路,对于问题排查和影响分析至关重要。如Apache Atlas、Apache DataHub等。
-
权限与安全 (Security):实现统一的安全模型,对湖仓中的所有数据进行精细化的访问控制。如Apache Ranger等。
💎 总结:一个典型的技术栈组合
一个典型的湖仓一体技术栈可能如下:
-
存储层:AWS S3 / 阿里云OSS,文件格式为 Parquet。
-
表格式层:Apache Iceberg,作为统一的数据管理标准。
-
计算引擎层:
-
批处理/ETL:Apache Spark
-
流处理:Apache Flink
-
交互式分析:StarRocks 或 Trino
-
数据集成层:Flink CDC + Kafka 实现实时入湖。
-
治理层:Unity Catalog (如果使用Databricks) 或 阿里云DLF 等统一元数据服务。
五、核心对比一览
| 特性维度 | 数据库 (Database) | 数据仓库 (Data Warehouse) | 数据湖 (Data Lake) | 湖仓一体 (Lakehouse) |
|---|
| 主要用途 | 业务事务处理 (OLTP) | 商业分析与决策支持 (OLAP) | 数据探索与海量存储 | 统一分析与AI |
| 数据类型 | 结构化数据 | 结构化数据 | 结构化/半结构化/非结构化 | 结构化/半结构化/非结构化 |
| 数据模式 | 写时模式 (Schema-on-Write) | 写时模式 (Schema-on-Write) | 读时模式 (Schema-on-Read) | 读时模式 (Schema-on-Read) |
| 数据质量 | 极高,强一致性 | 高,经过清洗整合 | 原始,质量参差不齐 | 高,兼具治理能力 |
| 核心优势 | 高并发、低延迟、事务性 | 查询快、数据质量高、模型规范 | 存储成本低、格式灵活、扩展性强 | 融合湖、仓优势,成本与性能兼顾 |
| 主要劣势 | 不适合大规模分析 | Schema 固定、变更成本高 | 数据治理难、性能不稳定 | 技术较新,生态仍在发展中 |
六、数据仓库架构的演变
📜 阶段一:传统数仓阶段(基于关系型数据库)
这是数据仓库概念提出后的早期形态,主要服务于企业内部的BI报表和决策支持。
🌊 阶段二:离线大数据架构阶段
伴随互联网爆发,数据量激增至PB级,传统数仓无法承载,Hadoop生态凭借其低成本、高扩展性成为主流。
⚡ 阶段三:Lambda 架构阶段——批流双轨
随着业务对“实时大盘”、“秒级预警”的需求激增,单纯的T+1无法满足,催生了“批流双轨”的运行模式。
🔄 阶段四:Kappa 架构阶段——一切皆流
为解决Lambda架构的代码冗余问题,LinkedIn提出“一切皆流”的理念,旨在简化架构。
🚀 阶段五:流批一体与湖仓一体阶段(当前主流)
这是当前技术演进的核心方向,结合云计算与存算分离,旨在从根本上统一存储、计算和元数据管理。
-
核心特征:
-
技术实现:
-
存储格式:底层不再依赖Hive表,而是采用Apache Iceberg、Hudi、Delta Lake等开放表格式,建立在对象存储(如AWS S3、阿里云OSS)之上。
-
计算引擎:Flink实现流批统一的实时与离线计算;Spark、Trino(Presto) 提供高吞吐量的交互式分析。
-
云原生与CDC:利用K8s等容器化技术实现存算分离,计算资源按需弹性伸缩。在数据摄入端,大量使用Flink CDC技术实时捕获业务数据库(MySQL/PG等)的变更日志,直接实时写入数据湖或OLAP引擎(如ClickHouse、StarRocks)。
-
实时分层:在实时链路中同样构建ODS、DWD、DWS等标准分层,实现实时数仓的“分层建模”。