一、数据库 (Database)
-
核心定位 :面向事务处理(OLTP)。它是业务系统的"地基",负责高效、可靠地记录每一次业务操作,如用户下单、账户更新等。
-
数据特征 :存储结构化数据,有严格的模式(Schema)约束。
-
核心能力 :追求高并发、低延迟 的读写,并严格保证ACID(原子性、一致性、隔离性、持久性)事务,确保数据绝对准确。
-
典型场景:电商网站的订单系统、银行的交易系统、企业的客户关系管理系统(CRM)和企业资源计划(ERP)系统等。
📖 数据库类型划分
-
关系型数据库 (RDBMS) :MySQL 、PostgreSQL 、Oracle 、SQL Server等。
-
NoSQL 数据库:
-
键值型 :Redis
-
文档型 :MongoDB
-
列族型 :HBase
-
图数据库:Neo4j
-
搜索引擎 :Elasticsearch
-
二、数据仓库 (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内部表)**的核心理念。
-
执行时机 :数据写入磁盘之前。
-
运作流程:必须预先定义好表结构(列名、字段类型、约束条件)。ETL(抽取-转换-加载)工具在写入时对数据进行清洗、类型转换、去重。如果某条数据的字段类型不匹配(比如字符串塞进了Int列),写入操作会直接报错失败。
-
核心优势:
-
查询性能极佳:数据已按最优结构存储(如列式存储Parquet/ORC),且经过压缩,查询时无需解析,直接读取,速度极快。
-
数据质量极高:入库即治理,保证了ACID事务性和一致性,下游消费者拿到数据直接可用,无需担忧脏数据。
-
-
核心劣势:
-
灵活性极差:表结构变更(加字段、改类型)代价极高
-
写入瓶颈:数据必须经过复杂的ETL逻辑才能入库,导致写入延迟较高,无法应对高吞吐的原始数据洪流。
-
1.2 Schema-on-Read(读时模式)------ "宽进宽出"
这是**数据湖(HDFS、对象存储)**的核心理念,也是Spark和Hive外部表擅长的事。
-
执行时机 :数据写入磁盘之后,执行查询语句的那一刻。
-
运作流程 :数据以原始格式(如JSON、CSV、Avro、甚至图片)直接存入存储系统,不校验、不转换 。当分析师运行SQL查询时,计算引擎(如Spark、Presto)在读取文件的同时,动态解析数据,按照查询语句中指定的视图或结构(如
SELECT json.field1)来临时构建"虚拟表"。 -
核心优势:
-
极高的灵活性:存储原始数据,支持未来的未知分析需求。随时可以改变读取逻辑(比如把某个字段解析为String而非Int),无需重写历史数据。
-
写入速度极快:省去了ETL开销,适合实时日志、IoT传感器等海量数据的秒级入湖。
-
-
核心劣势:
-
查询性能相对较差:因为需要在读取时动态解析(如解析JSON嵌套结构),且数据未经严格压缩优化,容易触发全表扫描,延迟较高。
-
数据质量责任下移:如果原始数据有脏值,查询时才会暴露,下游消费者必须自己写逻辑处理异常值或缺失字段(容易引发运行时错误)。
-
1.3 核心对比一览表
| 对比维度 | 写时模式 (Schema-on-Write) | 读时模式 (Schema-on-Read) |
|---|---|---|
| 数据处理哲学 | ETL(先转换,后加载) | ELT(先加载,后转换) |
| 存储成本 | 较高(需额外存储清洗后的副本) | 极低(存储原始冷数据,不占额外空间) |
| 写入吞吐 | 低(受限于计算和校验资源) | 极高(只做IO写入,无计算瓶颈) |
| 查询延迟 | 低(预计算、预索引,读取即用) | 高(每次需解析、投影和类型转换) |
| Schema演化 | 困难(修改需回滚历史数据) | 极易(只需修改读时SQL逻辑) |
| 数据质量 | 极高(入库已清洗) | 无保障(依赖读取侧处理) |
1.4 ETL 与 ELT
-
ETL (Extract-Transform-Load):
-
流程 :从源端抽取数据 → 在外部计算引擎 (如Spark、传统ETL工具)中进行复杂的清洗、转换、去重、关联 → 将干净的数据加载入目标库(如Hive、RDBMS)。
-
核心特征 :数据入仓即"成品"。转换过程发生在数据落地之前。
-
-
ELT (Extract-Load-Transform):
-
流程 :从源端抽取数据 → 直接加载 入目标存储系统(如数据湖S3、HDFS、云数仓Snowflake)→ 利用目标系统的强大算力在内部进行转换。
-
核心特征 :数据入湖即"原材料"。转换过程发生在数据落地之后。
-
四、湖仓一体 (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文件),这使得它在规划查询时能快速定位所需数据文件,实现高性能的读取。
-
核心优势:
-
引擎支持最广:Spark、Flink、Trino、Presto、Hive等均有官方或社区维护的连接器。
-
优秀的架构设计 :支持隐藏分区(Hidden Partitioning) 和分区演化(Partition Evolution),分区变化不影响已有查询。
-
强大的快照隔离 :提供
snapshot isolation,读写互不干扰。
-
-
主要短板:高频更新场景下性能不如Hudi和Paimon。
2. Delta Lake:Spark生态的嫡系部队
Delta Lake由Databricks推出,与Apache Spark生态系统有最深入的集成。它的核心是事务日志(Transaction Log),记录了表的所有变更,以此提供ACID保障。
-
核心优势:
-
Spark原生支持:与Spark Streaming无缝集成,能轻松实现流批一体。
-
功能丰富:在Databricks平台上提供了Z-Order、Auto Optimize等强大优化功能。
-
-
主要短板 :生态绑定风险。许多高级性能特性是Databricks商业版独有,开源版功能有限。对非Spark引擎的支持较弱。
3. Apache Hudi:数据变更与增量处理的专家
Hudi的名字源于 H adoop U pserts D eletes and I ncrementals,其核心设计就是围绕高效的数据变更 (Upsert/Delete)和增量处理展开的。
-
核心技术 :提供Copy-on-Write (COW) 和Merge-on-Read (MOR) 两种表类型。MOR模式通过写入增量日志,在读取时合并,实现了低延迟的写入,非常适合高频更新场景。
-
核心优势:
-
强大的增量消费:可以流式地消费表中的变更记录(Change Stream),便于下游构建实时应用。
-
索引机制:内置多种索引(如Bloom Filter),加速数据更新时的定位。
-
-
主要短板:架构和概念相对复杂,学习曲线较陡。
4. Apache Paimon:为实时流处理而生的新秀
Paimon是最年轻的项目,它从Flink社区走来,设计目标直指**"流批一体"的存储** 。它创新性地将 LSM树(日志结构合并树) 结构引入了数据湖。
-
核心技术 :主键表(Primary Key Table) 是其核心。借助LSM树,Paimon能高效处理基于主键的UPSERT和DELETE操作,并且支持流式读取这些变更日志(Changelog)。
-
核心优势:
-
Flink原生支持:与Flink集成最为紧密,可实现"一键整库入湖"。
-
实时更新能力强:为高频、低延迟的数据摄入和更新而生。
-
-
主要短板 :生态和社区相对年轻,周边工具和成熟度还在快速发展中
🔗 数据集成层 (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报表和决策支持。
-
核心特征 :数据量较小(GB级别),以结构化数据为主,遵循T+1 批量处理模式。架构设计强调数据的规范性与强一致性,构建方法论上主要分为自顶向下 (Inmon的E-R范式建模)和自底向上(Kimball的维度建模)两大流派。
-
技术实现:
- 存储与计算 :基于高性能商用主机(如IBM Power系列)和集中式SAN存储,跑在Oracle、DB2、Teradata等商业关系型数据库上。
-
主要局限:硬件扩展成本极高(Scale-up模式),不具备横向扩展能力;无法处理海量数据(PB级)及日志、JSON等半结构化/非结构化数据。
🌊 阶段二:离线大数据架构阶段
伴随互联网爆发,数据量激增至PB级,传统数仓无法承载,Hadoop生态凭借其低成本、高扩展性成为主流。
-
核心特征 :彻底解决了海量数据的存储与批量计算问题,且天然支持半结构化和非结构化数据。虽然依然保持离线批处理模式,但底层技术栈已完全替换为开源分布式组件。
-
技术实现:
-
存储层 :以HDFS(Hadoop分布式文件系统) 作为底层存储底座。
-
计算层 :早期基于MapReduce ,后因效率问题逐渐被Hive (将SQL转化为MR/Tez作业)和Spark(基于内存计算的通用引擎)取代。
-
查询加速 :引入Presto、Impala等MPP引擎满足即席(Ad-hoc)分析需求。
-
-
分层架构 :正式确立了经典的数仓四层分层规范------ODS(贴源层)→ DWD(明细层)→ DWS(汇总层)→ ADS(应用层)。
⚡ 阶段三:Lambda 架构阶段------批流双轨
随着业务对"实时大盘"、"秒级预警"的需求激增,单纯的T+1无法满足,催生了"批流双轨"的运行模式。
-
核心特征 :在离线大数据架构之上,增加了一条独立的实时计算链路,形成离线批处理层(Batch Layer) 与实时流处理层(Stream Layer) 并存的局面。批处理保障最终数据的准确性和全量历史,流处理层保障低延迟。
-
技术实现:
-
消息队列 :Kafka作为实时数据的统一缓冲通道。
-
实时计算 :早期使用Storm ,后逐渐演进为Spark Streaming 或Flink。
-
异构存储 :实时结果通常存入HBase 、Redis 或 ClickHouse(OLAP);离线结果仍存入Hive/HDFS。前端服务层(Serving Layer)负责合并两者结果。
-
-
核心痛点 :两份代码、两套运维。批处理和流处理逻辑需分别开发,维护成本极高;且因计算引擎和数据口径差异,极易出现实时与离线结果不一致的情况。
🔄 阶段四:Kappa 架构阶段------一切皆流
为解决Lambda架构的代码冗余问题,LinkedIn提出"一切皆流"的理念,旨在简化架构。
-
核心特征 :移除独立的批处理层,只保留流处理层 。其核心假设是:所有数据(包括历史数据)都可以视为流,通过消息队列的重放(Replay) 机制来实现历史数据的重新计算或逻辑变更。
-
技术实现:
-
核心组件 :Kafka (需长期保存全量历史数据)+ Flink(作为统一的流式计算引擎)。
-
重算机制:当业务逻辑变更时,通过重置Kafka消费者的Offset,从头开始消费历史数据,重新生成最新的结果视图。
-
统一存储 :将结果统一写入ClickHouse、Druid等OLAP引擎作为服务层。
-
-
主要局限 :流式重放海量历史数据的吞吐量远低于批处理,资源消耗巨大;且对消息队列(Kafka)的长期存储能力和集群稳定性要求极高,实际落地中往往难以完美替代批处理。
🚀 阶段五:流批一体与湖仓一体阶段(当前主流)
这是当前技术演进的核心方向,结合云计算与存算分离,旨在从根本上统一存储、计算和元数据管理。
-
核心特征:
-
流批一体 :使用同一套引擎(如Flink) 和同一套API处理实时与离线任务,彻底消除代码冗余,保证结果一致性。
-
湖仓一体(Lakehouse) :融合数据湖的低成本、灵活性(存储原始数据)与数据仓库的高性能、管理能力(支持ACID事务、版本控制(Time Travel)和Schema演进)。
-
-
技术实现:
-
存储格式 :底层不再依赖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等标准分层,实现实时数仓的"分层建模"。
-