【数仓系列之二】离线数仓

一、一个离线数仓的架构介绍

通过之前的系列文章的介绍,数仓是面向主题、集成、相对稳定的、反映历史变化的数据集合,通常用于支持管理决策。因此,离线数仓需要实现对数据的汇总、对数据的处理与分析两大部分的工作。这里,通过一个通用的离线数仓的架构,来进一步介绍,离线数仓是如何实现上述的两个大功能模块的。
首先,将架构图奉上。

在一般情况下,业务数据和日志数据是一个公司最重要也是最活跃的两种数据类型。在上述架构图中将数据划分为业务和埋点日志两个部分,均有专门的服务器对其进行管理。业务数据通过业务服务器保存至关系型数据库中,埋点日志数据保存在文件中。

Apache Flume是一个分布式的、可靠的、可用的,从多种不同的源收集、聚集、移动大量日志数据到集中数据存储的系统,说白了就是一个监控器,它的作用是监控日志文件,当日志文件中有新内容产生后,会通过框架,读取新增内容,并通过其内部的处理逻辑,按照既定的规则写入目标系统中。
Apache Kafka是一个消息系统,将上游涌入的数据通过消息队列技术存储至数据管道中,直到下游对其消费完毕,该框架起到了对数据进行削峰的作用。

因此,在架构中,日志文件产生后,Flume会立即监控到,并针对其中的内容进行读取,将数据传输给Kafka。同时监控Kafka的Flume监控到Kafka存在数据后,将会立即读取Kafka的数据并将其数据写入至HDFS中。这里使用Kafka的目的就是为了对数据起到削峰的作用,确保上下游能够协调一致,避免数据洪峰时,下游消费不及时导致数据丢失等情况的发生,至于其中某个框架启动失败会导致什么结果等问题,在接下来会有讨论,这里不展开细讲。

Apache Sqoop是一款用于hadoop和关系型数据库之间数据导入导出的工具。可以通过Sqoop把数据从数据库(比如MySQL, Oracle)导入到HDFS中;也可以把数据从HDFS中导出到关系型数据库中。

在架构中,每天将业务数据通过Sqoop框架定时导入至HDFS中。
两类数据均存储至HDFS中后,Hive将会开始进行数据处理工作,这里就涉及到之前提出的数仓分层的概念,我们来复习一下。

层级名称 解释 要求
ODS(Operation Data Store) 原始数据层 存放原始数据,要求对数据不做任何处理,保持数据原貌。
DWD(Data Warehouse Detail) 明细数据层 对ODS层做数据清洗(去除空值、脏数据等),维度退化、脱敏等。粒度是一行信息代表一次行为,例如一次下单。
DWS(Data Warehouse Service) 服务数据层 以DWD为基础,按天进行轻度汇总。粒度是一行信息代表一天的行为,比如一天内下单的次数。
DWT(Data Warehouse Topic) 数据主题层 以DWS为基础,按主题进行汇总。粒度是一行信息代表累积的行为,例如用户层注册那天开始至今一共下了多少单。
ADS(Application Data Store) 数据应用层 为各种统计报表提供数据。

最后,Sqoop会将ADS层的分析结果数据再导入业务数据库中,并通过SuperSet框架进行可视化展示。
以上就是一个基本的离线数仓框架,但这些还不够。

我们可以发现,除了上面说的这些之外,在架构图的下方,有很多其他的框架对离线数仓的功能进行了补充和完善,其中涉及到即席查询、集群监控、定时调度、权限管理、元数据管理、质量监控等各个方面的内容,在后续会逐个进行讲解,这里将一个离线数仓的架构进行一个引入,在后续的文章中会进行详细的分析。

二、有关数仓的两个问题

1、数仓为什么要分层?
(1)把复杂的问题简单化。在当下,数据呈现的特点是无规律,体量大。因此,为了能够更好地管理以及利用数据创造价值,应根据当下业务需求,将复杂的任务分解成多层完成,每一层仅处理简单的任务,也方便在数据出问题时定位问题。
(2)减少重复开发。规范的数据分层,能够通过中间层的数据,减少极大地重复计算,增加一次计算结果的复用性。
(3)隔离原始数据。不论是数据异常还是数据的敏感性,都使得真实地数据与统计的数据解耦。

2、数据集市是什么?
数据集市,英文是Data Market。它是一种微型的数据仓库,它通常具有更少的数据, 更少的主题区域,以及更少的历史数据,是一种部门级别的数据仓库,一般只为某个局部范围内的管理人员服务。

三、数仓理论

1、范式理论
1.1 范式的概念
(1)定义:范式就是设计一张数据表的结构应符合的标准级别、规范与要求。
(2)优点:降低数据的冗余性;缺点:获取数据时,需要通过join拼接最后的数据。
(3)分类:第一范式、第二范式、第三范式、巴斯-科德范式、第四范式、第五范式

1.2 函数依赖
函数依赖有三种依赖关系,分别是完全函数依赖、部分函数依赖以及传递函数依赖。

  • 完全函数依赖:通过AB能得出C,但AB单独不能得出C,从完全依赖于AB。
  • 部分函数依赖:通过AB能得出C,通过A也能得出C或者通过B也能得出C,C部分依赖于AB。
  • 传递函数依赖:通过A得到B,通过B得到C,但是C得不出A,那么C传递依赖于A。

1.3 三范式区分
(1)第一范式:属性不可分割。

(2)第二范式:不能存在部分函数依赖。

(3)第三范式:不能存在传递函数依赖。

2、关系建模与维度建模
(1)关系建模:点我跳转~
(2)维度建模
维度建模有三种模型:星型模型、雪花模型和星座模型。

3、维度表和事实表【重要】
(1)维度表

  • 定义:一般是对事实的描述性信息,每一张维度表对应现实世界中的一个对象或者概念。例如:用户、商品、日期、地区等。
  • 维度表的特征:维度表范围很宽(具有多个属性、列很多);跟事实表相比,行数相对较小,通常<10w条;内容相对固定:编码表。
  • 例子
    时间维度表
    (2)事实表
  • 定义:事实表中的每行数据代表一个业务事件,例如:下单、支付、退款、评价等。“事实”这个术语表示的是业务事件的度量值(可以统计的次数、个数、金额等)。每个事实表的行包括:具有可加性的数值型的度量值、与维度表相连接的外键、通常具有两个和两个以上的外键、外键之间表示维度表之间多对多的关系。
  • 一个例子:张三在2020年11月11日于京东购买了一台价值1万元的苹果MacBook pro 15.2寸笔记本电脑。维度表:时间、用户、商品、商家。事实表:1万元、1台。
  • 特征:非常大、内容相对较窄,列数少,主要是外键id和度量值、经常发生变化。每天新增很多数据。
  • 类型:事务型事实表、周期型快照事实表、累积型快照事实表
    事务型事实表和周期型快照事实表
    累积型快照事实表
Author: Frederic Niu
Link: https://www.fredericniu.cn/2020/11/15/【数仓系列之二】离线数仓/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号