数据仓库简称数仓,其英文名为 Data Warehouse(简写为 DW 或 DWH)。按照数据仓库系统构造方面的领衔设计师 William H. Inmon 的说法,“数据仓库是个面向主题的、集成的、时变的、非易失的数据集合,支持管理者的决策过程”。这个简短而又全面的定义指出了数据仓库的主要特征。四个关键词,面向主题的、集成的、时变的、非易失的,将数据仓库与其他数据存储系统(如关系数据库系统、事务处理系统和文件系统)相区别。
由于大多数人都熟悉商用关系数据库系统,将数据仓库与之比较,就容易理解什么是数据仓库。
联机操作数据库系统的主要任务是执行联机事务和查询处理,这种系统称做联机事务处理(Online Transaction Processing, OLTP)系统,它们涵盖了企业的大部分日常操作,如购物、库存、制造、银行、工资、注册、记账等。另一方面,数据仓库系统在数据分析和决策方面为用户或数据分析员提供服务,这种系统可以用不同的格式组织和提供数据,以便满足不同用户的形形色色的需求,这种系统称做联机分析处理(Online Analytical Process ing, OLAP)系统。
OLTP 和 OLAP 的主要区别概述如下:
OLTP 和 OLAP 的其他区别包括数据库大小、操作的频繁程度、性能度量等,详见下表。
特征 | OLTP | OLAP |
---|---|---|
特性 | 操作处理 | 信息处理 |
面向 | 事务 | 分析 |
用户 | 办事员、DBA、数据库专业人员 | 知识工人(如经理、主管、分析人员) |
功能 | 日常操作 | 长期信息需求、决策支持 |
数据库设计 | 原始的、高度详细 | 汇总的、统一的 |
数据 | 当前的,保证最新 | 历史的,随时间推移保持准确性 |
视图 | 详细的、一般关系 | 汇总的、多维的 |
工作单元 | 短的、简单事务 | 复杂查询 |
访问 | 读/写 | 大多为读 |
关注 | 数据进人 | 信息输出 |
操作 | 主键上索引/散列 | 大量扫描 |
访问记录数量 | 数十 | 数百万 |
用户数 | 数千 | 数百 |
数据库规模 | ﹤TB | ≧TB |
优先 | 高性能、高可用性 | 高灵活性、终端用户自治 |
度量 | 事务吞吐量 | 查询吞吐量、响应时间 |
数据仓库中的基本概念及其关系如下图所示:
数据仓库分层可以让数据结构更清晰,减少重复开发,并统一口径,一般来说自下而上分为三层:数据引入层(ODS,Operation Data Store)、数据公共层(CDM,Common Data Model)和数据应用层(ADS,Application Data Service)。
各层之间的数据流向如下图所示。其中,DIM 层一般会同步到所有存储系统,ODS 层和 DWD 层通常会放在数据中间件中,供下游订阅使用,而 DWS 层和 ADS 层的数据往往会落地到在线存储系统中,下游通过接口调用来获取。
数据仓库自上世纪九十年代初出现,直到现在,其技术发展一直没有停止。特别是进入二十一世纪以来,随着大数据和云计算技术的兴起,其技术架构经历了几次大的升级,截止到目前仍然处于快速发展中。
这里把上世纪九十年代的数据仓库称为传统数仓,因其年代比较久远,技术架构完全过时,因此这里不再对其技术架构做详细介绍,只大概介绍一下其原理。
传统数仓采用离线批处理方式,定期从业务数据库同步数据,然后按批进行计算,结果存放到关系型数据库里。随着数据量的增长,单节点的关系型数据库难以满足存储和计算需求,因此出现了 MPP(Massively Parallel Processing)架构的数据库,典型的如 Grennplum。MPP 数据库将任务分解到多个节点上并行执行,每个节点使用本地数据来计算,最后将所有节点的结果汇总在一起。
进入二十一世纪以来,随着各行各业数字化改革程度的不断加深,企业产生了越来越多的数据。传统数仓,即便使用了 MPP 数据库,也只能应对 TB 级别的数据,无法处理 PB 级别甚至更高的海量数据。此外,传统数仓只能处理结构化数据,然而企业中还存在大量半结构化和非结构化数据(比如图片、音视频等)需要处理。
随着 Hadoop 大数据技术的出现,鉴于其在处理海量数据方面的能力,大家很自然地会想到用其来构建数仓。Hadoop 生态中提供了众多的数据仓库构建工具,其中尤以顶层的 Hive 最为知名。Hive 最开始是 Facebook 开发出来,用于处理其海量日志数据的,后来 Facebook 将其捐献给了 Apache 软件基金会。经过多年的发展,Hive 已经发展得很成熟,成为企业构建数仓的首选。在没有 Hive 之前,处理数据必须开发复杂的 MapReduce 作业,但有了 Hive,只需要编写简单的 SQL,就可以实现 MapReduce 作业同样的功能。Hive 使用的查询语言为 HiveQL(HQL),跟 SQL 类似,因此只要熟悉 SQL,就能很快上手。基于 Hadoop 生态工具构建的数仓称为大数据数仓,由于 Hive 在其中的重要性,一般也称为 Hive 数仓。
Hive 数仓架构如下:
其中,Pig 是雅虎开发的用于简化 MapReduce 任务编写的工具,与 Hive 用途类似,只不过 Pig 是通过编写脚本而不是编写 SQL,其脚本语言为 Pig Latin。HBase 是一种 NoSQL 数据库,主要是为了弥补 Hive 在随机实时查询方面的性能问题。Hive 适用于批量读取,查询单条只能通过 MapReduce 任务扫表来实现,性能非常差,而 HBase 支持通过主键来快速查询。从图中可以看到,Hive 依赖 HDFS 来存储数据,以及 MapReduce 来处理数据,在某些场景下 Pig 可以作为 Hive 的替代工具,HBase 则用来提供数据实时访问。
Hive 数仓与传统数仓的对比如下:
Hive 数仓 | 传统数仓 | |
---|---|---|
存储 | HDFS,理论上可无限扩展 | 集群存储,存在容量上限。只能适应于数据量比较小的商业应用,对于超大规模、半结构和非结构化数据无能为力 |
执行引擎 | 有 MR/Tez/Spark 多种引擎可供选择 | 可以选择更加高效的算法来执行查询,也可以进行更多的优化措施来提高速度 |
使用方式 | HQL(类似 SQL) | SQL |
灵活性 | 元数据存储独立于数据存储之外,从而解耦元数据和数据 | 低,数据用途单一 |
分析速度 | 计算依赖于集群规模,易扩展,在大数据量情况下,远快于普通数据仓库,但复杂的关联交叉运算其速度很慢,宽表用 Hive 做比较低效 | 复杂查询性能高于 Hive,简单大规模查询性能较 Hive 弱 |
索引 | 低效,目前还不完善 | 高效 |
易用性 | 需要自行开发应用模型,灵活度较高,但易用性低 | 集成一整套成熟的的报表解决方案,可以较为方便的进行数据分析 |
可靠性 | 数据存储在 HDFS,可靠性高,容错性高 | 可靠性较低,一次查询失败需要重新开始。数据容错大部分依赖于硬件 Raid,软件角度不同产品差异较大 |
依赖环境 | 依赖硬件较低,可适应一般的普通机器 | 依赖于高性能的商业服务器,对 X86 服务器的配置统一性要求较高 |
价格 | 开源产品 | 商用比较昂贵 |
前面讨论的传统数仓和大数据数仓,都是通过定时任务按批处理数据,批处理任务调度周期一般为天(快的话可以做到小时级别),有比较大的延时,他们可以统称为离线数仓。在某些业务场景,比如监控报警、大屏显示,延时需要控制在分钟级甚至秒级,这种时候就需要实时数仓了。
实时数仓有两种典型架构,分别是 Lambda 和 Kappa。
Lambda 架构:
Lambda 架构在大数据数仓批处理层的基础上,增加了一个流处理层(也称为速度层)。批处理层处理今天之前的历史数据,延时以天计,但准确性高,计算逻辑和出错处理都比较简单,而流处理层处理当天实时数据,延时为分钟级或秒级,但容易出错,计算逻辑也比较复杂。注意,流处理层处理的当天数据,会在第二天被批处理层重新处理,这样即便流处理层计算有误,也会在批处理层被修正。
Lambda 架构兼顾了离线批处理和在线实时处理两种方式,适合以批处理为主,实时处理为辅的业务场景。这种架构的弊端在于,需要同时实现批处理和流处理两种方式,容易出现两边计算逻辑不一致,并且通常批处理和流处理使用的技术工具不同,在人员和技术上无法实现统一,造成冗余和浪费。
具体来说,Lambda 架构的痛点有:
为了解决 Lambda 架构的问题,出现了批流一体的 Kappa 架构。
Kappa 架构:
Kappa 架构完全废弃了批处理层,即便是批处理也是通过消息队列回溯以流计算的方式来完成,这样就实现了批流一体,从而避免了冗余工作,并简化了技术栈。
但 Kappa 架构并非就是完美的,在实际落地时其痛点有:
前面我们看到 Kappa 架构的痛点主要是因其使用的消息队列(比如 Kafka)在存储功能上的一些限制导致,那么是否存在一种存储技术,能够同时支持高效的数据回溯,数据更新,以及数据批流读写了?答案是数据湖。
什么是数据湖
数据湖是最近几年才兴起的一个概念,其在 Wikipedia 上的描述如下:
数据湖是一类存储数据自然/原始格式的系统或存储,通常是对象块或者文件。数据湖通常是企业中全量数据的单一存储。全量数据包括原始系统所产生的原始数据拷贝,以及为了各类任务而产生的转换数据,包括报表、可视化、高级分析和机器学习等。数据湖中包括结构化数据(通常来自于关系型数据库)、半结构化数据(CSV、日志、XML、JSON 等)、非结构化数据(Email、文档、PDF 等)和二进制数据(图像、音频、视频等)。
上面这段描述侧重于数据湖里存储的内容,站在实时数仓的角度,为了支持上层实时数仓构建,数据湖还需提供以下能力:
目前市面上有三大开源的数据湖方案,分别是 Delta Lake(Databricks 开源)、Apache Hudi(Uber 开源)和 Apache Iceberg(Netflix 开源)。其中 Iceberg 以自身独特的优势被越来越多开发者关注,其特点如下:
什么是湖仓一体
对于企业来说,数据湖和数据仓库不是二选一,而是可以同时选择,数据仓库构建于数据湖之上,实现湖仓一体。湖仓一体架构下数据湖和数据仓库的关系如下:
基于数据湖的数据仓库架构
将前面 Kappa 架构中的 Kafka 消息队列替换成 Iceberg 存储之后,我们得到了新一代的湖仓一体架构:
注意图中批处理和流处理分别使用了 Spark 和 Flink,Spark 和 Flink 是当前批处理和流处理计算引擎的领头羊,虽然它们都在往批流一体化发展,但就目前来说还都不太完善和成熟。如果使用 Spark 或 Flink 之一就能满足企业的批流处理需求,那么完全可以选择其中一种。当然,未来也可能会出现其它更好的批流一体的计算引擎,得益于 Iceberg 的多引擎支持,对于企业来说切换成本会比较低。
具体来说,相比使用消息队列的 Kappa 架构,湖仓一体架构具有如下优点: