[数据库] 万字详解:数据库、数据仓库、数据湖、湖仓一体

93 0
Honkers 前天 08:48 来自手机 | 显示全部楼层 |阅读模式

一、数据库 (Database)

  • 核心定位:面向事务处理(OLTP)。它是业务系统的“地基”,负责高效、可靠地记录每一次业务操作,如用户下单、账户更新等。

  • 数据特征:存储结构化数据,有严格的模式(Schema)约束。

  • 核心能力:追求高并发、低延迟的读写,并严格保证ACID(原子性、一致性、隔离性、持久性)事务,确保数据绝对准确。

  • 典型场景:电商网站的订单系统、银行的交易系统、企业的客户关系管理系统(CRM)和企业资源计划(ERP)系统等。

📖 数据库类型划分

  • 关系型数据库 (RDBMS)MySQLPostgreSQLOracleSQL 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 的 BinlogCDC 工具模拟从库角色订阅这些日志,解析出增删改操作和变更前后数据。并把变化实时抓出来同步给下游。

关键差异容忍数据延迟,通常使用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 KafkaPulsar

数据先进Kafka,再被下游消费。


3. 数据处理层 (Data Processing Layer)

用于对数据进行清洗、转换和整合

维度离线数仓 (Batch Processing)实时数仓 (Streaming Processing)
计算模型批计算:有界数据集,一次性处理全部历史数据。流计算:无界数据集,数据永不结束,窗口(Window)驱动。
核心引擎

Hive (MR/Tez)Spark SQL

Apache FlinkSpark 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数据库ClickHouseApache DorisStarRocks
维表/缓存极少,直接查Hive维度表。Redis(高性能KV缓存)、HBase(支持随机读写的大维表)。
关键差异存储介质单一(基本全在HDFS)。分层异构:热数据在Kafka,温数据在Iceberg,冷数据在HDFS,结果数据在ClickHouse。

5. 数据分析层 (Data Analysis & Serving Layer)

用于对数据进行分析和挖掘

维度离线数仓 (Batch Serving)实时数仓 (Streaming Serving)
查询引擎Presto / TrinoSpark SQL(即席查询 Ad-hoc)
Hue / Zeppelin
Doris / StarRocks(自带极速查询)、ClickHouse
Elasticsearch(日志检索场景)
BI 工具TableauPower 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 ParquetORC

  • 核心优势:实现存储与计算分离,你可以独立地扩展存储而不影响计算集群,并能根据数据热度选择不同的存储介质(如热数据用SSD,冷数据用对象存储),从而优化成本。

🧮 计算引擎层 (Compute Engine Layer)

这一层是湖仓一体的“大脑”,负责执行所有数据的读取、写入和计算任务。关键在于多引擎可插拔,即不同的引擎可以共享同一份数据。

  • 批处理与ETLApache 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的名字源于 Hadoop Upserts Deletes and Incrementals,其核心设计就是围绕高效的数据变更(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):这是实时数仓和湖仓的关键技术。CanalDebezium 等工具可以监控数据库的Binlog,将变更数据实时捕获并发送到Kafka。

  • 流处理引擎Apache Flink 是这一层的核心,它通过 Flink CDC 能力直接读取数据库变更,或消费Kafka数据,进行实时清洗、转换后,写入湖仓表格式。

  • 统一接入框架:一些平台提供统一的接入层,如 Databricks Autoloader,可以自动发现和增量处理云存储中的新文件。

🎯 数据治理层 (Data Governance Layer)

当数据规模变大,治理就成为防止“数据沼泽”的关键。

  • 元数据管理 (Metadata Management):这是治理的核心,需要一个统一的元数据目录(Catalog),如 Databricks Unity Catalog阿里云DLFAWS Glue。它提供统一的视图来管理所有表、字段和权限。

  • 数据质量 (Data Quality):通过定义和监控数据质量规则(如完整性、准确性),确保湖仓内数据可信。工具如 Great ExpectationsApache 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 StreamingFlink

    • 异构存储:实时结果通常存入HBaseRedis 或 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等标准分层,实现实时数仓的“分层建模”。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行