数据仓库 - 简述

前言

说到数据仓库,在一年前,我的答案是非常模糊的,在两年前,我根本不知道数据仓库的存在。相信大多数的人都是经常接触数据库,上大学的时候学过Oracle,MySQL这两个关系型数据库,操作着各种增删改查,现在人们对这种类型的数据库都称作传统数据库,数据量偏小,每一张表都是为了某一系统功能而设计的。在之后从事大数据行业了,数据仓库这几个字也就总出现在各种博客中,各种技术方案中。现在正在和同事主导公司数据仓库的设计和搭建工作,所以准备把我这段工程经验,拿出来分享一下。

数据库与数据仓库的区别

数据库

这里我们所指的数据库,也就是一系列经典的RDBMS,如Oracle,MySQL,SQL Server等关系型数据库。其中的一些设计过程如 ER图的设计,逻辑模型的设计,物理模型设计,还有规范化设计 如 至少要符合第一范式,尽可量的去符合第二范式,第三范式等设计细节,这里就不赘述了,但是以上所提到的都是关系型数据库的精华。关系型数据库的用途,现在也会被分成两大类
(1)操作型数据库,主要用于业务支撑。一个公司往往会使用并维护若干个数据库,这些数据库保存着公司的日常操作数据,比如商品购买、酒店预订、学生成绩录入等;
(2)分析型数据库,主要用于历史数据分析。这类数据库作为公司的单独数据存储,负责利用历史数据对公司各主题域进行统计分析;

数据仓库

接下来先给大家看百度百科给出的数据仓库概念

数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。 为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。

从上面的定义来看,数据仓库的主要功能是用于做企业各个业务层面的分析,企业层面的数据总集,曾经看过一个博主对数据仓库的定义是“面向分析的存储系统”,这个定义是很接地气的,如果按照这个思路往下去思考,数据仓库存储的数据是很庞大的,不是一个单一的业务数据集,不用精准到每一条数据,例如,淘宝在存储每一条下单记录的时候,在关系型数据库中,这条记录是不会存储到其他业务表里面,只会存储在下单记录表里面,并且下单记录表里面不会存储两条相同的订单数据,这是因为关系型数据库要严格满足完整性/参照性约束以及范式设计要求,但是在数据仓库中,这条订单数据可能会存在用户行为表中,也可能存在下单数据表中。也就是说,数据仓库不应让传统关系数据库来实现,因为关系数据库最少也要求满足第1范式,而数据仓库里的关系表可以不满足第1范式。也就是说,同样的记录在一个关系表里可以出现N次。但由于大多数数据仓库内的表的统计分析还是用SQL,因此很多人把它和关系数据库搞混了。

数据仓库的特点

  1. 面向主题

    面向主题特性是数据仓库和操作型数据库的根本区别。操作型数据库是为了支撑各种业务而建立,而分析型数据库则是为了对从各种繁杂业务中抽象出来的分析主题(如用户、成本、商品等)进行分析而建立;

  2. 集成性

    集成性是指数据仓库会将不同源数据库中的数据汇总到一起;

  3. 企业范围

    数据仓库内的数据是面向公司全局的。比如某个主题域为成本,则全公司和成本有关的信息都会被汇集进来;

  4. 历史性

    较之操作型数据库,数据仓库的时间跨度通常比较长。前者通常保存几个月,后者可能几年甚至几十年;

  5. 时变性

    时变性是指数据仓库包含来自其时间范围不同时间段的数据快照。有了这些数据快照以后,用户便可将其汇总,生成各历史阶段的数据分析报告;

数据仓库组件

数据仓库的核心组件有四个:各源数据库,ETL,数据仓库,前端应用。如下图所示:

  1. 业务系统
    业务系统包含各种源数据库或者网站前端埋点实时数据,数据源可以是离线的,也可以是实时的(时间粒度为小时)。
    比如我们数据仓库中的离线数据来源是公司业务系统的Oracle,这些源数据库既为业务系统提供数据支撑,同时也作为数据仓库的数据源,部分实时数据是通过kafka,flume,NIFI收集来的埋点数据。
  2. ETL
    ETL分别代表:提取extraction、转换transformation、加载load。其中提取过程表示操作型数据库搜集指定数据,转换过程表示将数据转化为指定格式并进行数据清洗保证数据质量,加载过程表示将转换过后满足指定格式的数据加载进数据仓库。数据仓库会周期不断地从源数据库提取清洗好了的数据。(ETL应该是数据工程师必会的技能😂)
  3. 前端应用
    数据仓库的数据,肯定是为了前端应用而准备的,前端应用则是为了使用数据的用户而准备的。目前我搭建的数仓一般不会直接对接前端应用,而是将数仓中的数据,按照用户方需求进行计算聚合到HBase或者ES中。中间加一层API,API可以是Go或者Python开发的,这样前端应用直接调用API,也有一些特殊场景,会直接调用presto来访问Hive

    数据集市

    数据集市是数据仓库下面衍生出来的概念,在这里,我举一个例子来帮助大家理解,我们可以把数据仓库理解成万达购物中心,其中每层都卖着不同种类的商品,其中,一层卖的服装,二层买的家电…这样就可以分成一层是一个服装主题的数据集市,二层是家电主题的数据集市。同时可以理解为是一种”小型数据仓库”,它只包含单个主题,且关注范围也非全局。集市可以分为两种,一种是独立数据集市(independent data mart),这类数据集市有自己的源数据库和ETL架构;另一种是非独立数据集市(dependent data mart),这种数据集市没有自己的源系统,它的数据来自数据仓库。当用户或者应用程序不需要/不必要/不允许用到整个数据仓库的数据时,非独立数据集市就可以简单为用户提供一个数据仓库的”子集”。

    数据仓库搭建流程


    大家先看这个流程图,其中的各个步骤,我都会去介绍,其中着重介绍的会是数据仓库建模和ETL工程,因为,建模是整个数据仓库的核心,ETL工程师整个数据仓库中最耗时耗力的。


    今天呢,先简单介绍一下,铺垫一下