数仓

448 阅读6分钟

一、数仓是什么

根据维基百科的定义,数仓是用于报告和数据分析的系统,是来自一个或多个不同源的集成数据的中央存储库,它将当前和历史数据存储在一起。

数仓具备以下几大特性:

  1. 主题导向:通常需要按业务含义归类至相同的主题区;
  2. 集成性:数据来自企业各OLTP系统,在数仓中是集成且一致的;
  3. 时间差异性:数据的变动,在数仓中是可以被记录及追踪变化的;
  4. 不变性:数据一旦确认写入后是不会被取代或删除的,即使数据是错误的也如此。

以上对数仓的定义和描述较偏学术,在工业界实际业务场景下,各个特性可能会有取舍或折中。可以理解为现实中的数仓就是一个存放数据的大而全的仓库,数据的组织方式较强依赖于业务特点,不同业务领域的数仓结构、组织方式和技术选型存在千差万别。

二、数仓的作用是什么

“数据仓库”与“数据库”

在谈到“数据仓库”的作用时,往往需要和“数据库”做比较。两者名称上只有一字之差,但通常来说两者在业务系统中的定位、作用、要求和实现方式都不一样,其中最主要的区别有:

  1. 数据库用于事务处理,满足线上服务的需求;而数仓用于数据分析,满足线下分析决策的需求;
  2. 数据库服务于线上系统,考虑到性能和稳定性,其查询逻辑相对比较简单;数仓面向业务领域复杂的分析需求,查询逻辑更为复杂。

引入数仓的作用

业务系统通常是先有数据库,再有数仓的。数据库在建设初期承接线上事务的处理,以及少量简单的分析型任务。随着系统的演进,单纯的数据库已经无法支撑越来越复杂的分析需求,这时就需要数仓出场了。引入数仓带来的好处主要有以下几点:

  1. 能够包含多种来源的数据,数据内容丰富,包括:历史的和当前的所有数据、原始的和经过复杂逻辑加工的各类数据等;
  2. 可以统一数据访问入口,无需逐个连接数十个甚至更多的业务系统或微服务,进而可以简化数据分析方式;
  3. 可以隔离线上业务系统和线下分析系统,保障系统稳定和数据安全;
  4. 可以屏蔽系统/服务间的差异,提供数据的标准语义集,为数据质量提供统一的校验机制。

三、数仓架构

数仓的核心能力在于数据的存储和计算,数据计算又分为离线计算(批处理)和实时计算(流式处理)。一个功能完备的数仓应当支持这两种计算能力。为此工业界有两种架构方式:

3.1 Lambda架构

image.png 此架构的思想是将离线计算和实时计算分离,如上图所示,包含三个模块:

  1. Batch Layer(批处理层) :对历史的全量数据进行批处理,准确性高但时效性低(一般有小时级或天级延迟);
  2. Real-time Layer(实时层) :对短期的增量数据进行流式处理或微批处理,实现秒级或分钟级的低延迟,弥补批处理层的滞后性;
  3. Serving Layer(服务层) :汇总以上两层模块的处理结果,暴露给外部服务调用。

业界的大多数数仓采用的是Spark/Hive离线计算引擎 + Storm/Flink实时计算引擎 + OLAP/OLTP存储引擎的组件选型,这本质上就是Lambda架构。

3.2 Kappa架构

image.png

此架构的思想是离线计算和实时计算合二为一,如上图所示,包含两个模块:

  1. Real-time Layer(实时层) :扩展了Lambda架构的实时层,既处理短期增量数据,也处理历史全量数据,兼顾准确性和时效性;
  2. Serving Layer(服务层) :与Lambda架构相同,收集实时层的计算结果并对外提供服务。

Kappa架构适用于侧重实时数据处理的场景,典型的技术选型是Kafka消息中间件 + Flink实时计算引擎,业界也有越来越多的领域开始基于Kappa架构建设数仓。

Lambda与Kappa架构对比

总结来说,Lambda架构是一种传统的、较为稳妥的方式,如果对大量数据的处理有很高的准确性要求,同时又可以容忍较高的延迟,可以选用此架构。Kappa架构更偏重于对实时数据的处理能力,如果追求数据的时效性,可以尝试此架构。

4.数据组织

无论采用Lambda架构还是Kappa架构,最终得到的都是成百上千的数据资产(数据表或数据流),那么如何有条理地组织如此数量庞大的资产。

4.1 分层

首先可以通过数据分层来实现较粗粒度的组织,每层的数据专注于特定的职责。下图所示的「四层模型」,就是一种典型的分层方式:

  1. ODS层:位于最底层,将原始数据(包含业务DB、业务日志、第三方采买等来源)经过清洗和规范化后入仓,在入仓前需要进行去噪、去重、去除脏数据、量纲统一等初步转换;
  2. DW层:它是数仓的主体,围绕业务主题建立各种数据模型(通常是维度模型)。这一层由ODS层数据汇总加工产生,包含历史全量的、明细的数据;
  3. DM层:它对DW层的数据进一步加工,生成轻度汇总的非明细数据。这一层的数据主要面向后续的业务查询、OLAP分析等;
  4. APP层:它基于前面三层的数据,计算出数据产品最终使用的结果数据。这一层是高度汇总的最终产出数据,一般会同步到MySQL、ES、Druid等其他OLTP/OLAP存储引擎中供查询分析使用。

除了四层模型外,还有三层模型等其他划分方式,思想都大同小异,遵循“原始数据 -> 基础明细数据 -> 半成品数据 -> 成品数据”的路径进行层次划分。在实际构建数仓时,也需要结合具体的业务场景,灵活制定分层结构。

分层模型的好处显而易见,主要有以下几点:

  1. 提升可维护性:将复杂的数据生产逻辑拆解成各层的子逻辑,便于维护和定位问题;

  2. 简化血缘关系:只允许上层依赖下层,不允许反向依赖,避免混乱的数据流向;

  3. 减少重复开发:通过主题建模,开发一些通用的中间数据(例如维度表),实现复用;

  4. 屏蔽原始数据:通过设计良好的ODS层,数仓使用方不必了解原始数据的细节和异常即可接入。

    \