数据仓库进阶

本文主要围绕架构、分层、建模三个方面,进一步加深对数仓的了解。

1 数据仓库的架构

从整体上来看,数据仓库体系架构可分为:数据采集层、数据计算层、数据服务层和数据应用层,如下图。

1. 数据采集层

数据采集层的任务就是把数据从各种数据源中采集和存储到数据库上,期间有可能会做一些 ETL(即抽取、转换、装载)操作。

其中,日志所占份额最大,存储在备份服务器上的业务数据库中,如 Mysql 中的数据。其他数据的话,如 Excel 等需要手工录入的数据。

实时采集不是一条一条采集,而是根据一些限制条件,一般是数据大小限制(如 512KB 写一批)、时间阈值限制(如 30 秒写一批)。

采集的数据需要数据采集系统分发给下游,一般选取 Flume、Sqoop 等。

2. 数据处理层

从数据采集系统出来的数据,分发给下游的数据处理平台,一般有 Hive、MapReduce、Spark Streaming、Storm 以及新兴的 Flink 等,阿里巴巴内部使用的是 StreamCompute。

3. 数据服务层

数据服务层,通过接口服务化方式对外提供数据服务,以保证更好的性能和体验。针对不同的需求和数据应用场景,数据服务层的数据源架构在不同的数据库上,如 Mysql、HBase、MongoDB 等。实时的存储且需要支持高并发的话,就选择 HBase。

数据服务层可以使应用对底层数据存储透明,将海量数据方便高效地开放给各业务使用。

4. 数据应用层

数据已经准备好,需要通过合适的应用提供给用户,让数据最大化地发挥价值。数据应用表现在各个方面,如报表展示、数据分析、数据挖掘、数据可视化等。

2 数据仓库分层

2.1 为啥要分层?

作为一名数据产品经理,我肯定希望自己的数据能够有秩序地流转,数据的整个生命周期能够清晰明确地被设计者和使用者感知到。但是,随着业务的发展,频繁迭代和跨部门的业务变得越来越多。这就容易导致数据仓库出现如下问题:

1. 缺乏统一的业务和技术标准,如:开发规范、指标口径不统一。

2. 缺乏统一数据质量监控,如:字段数据不完整和不准确等。

3. 业务知识体系散乱,导致数据研发人员开发成本增加。

4. 数据架构不合理,数据层之间分工不明显,数据流向混乱。

5. 缺失统一维度和指标管理。

因此,我们需要一套行之有效的方法来让我们的数据仓库更有秩序,这就需要对数据进行分层,如下图。

2.2 数据分层设计

按照数据操作的流程,我们将数据模型分为三层:数据操作层(ODS)、数据仓库层(DW)和数据应用层(APP),如下图。简单来讲,ODS 层存放的是接入的原始数据,DW 层存放的是数据仓库中的数据,APP 层存放的是面向业务定制的应用数据。

1. 数据操作层(ODS)

数据操作层又叫数据运营层,英文:Opertional Data Source。数据操作层是最接近数据源中数据的一层,数据源中的数据,经过 ETL(即抽取、转换、装载),装入本层。本层中的数据,大多是按照源业务系统的分类方式而分类的。

由于该层是最接近数据源的,所以不建议对该层数据做过多的数据清洗工作,原封不动地接入原始数据就行,至于数据的去噪、去重、去异常值等操作可以放在后面的 DWD 层来做。

2. 数据仓库层(DW)

数据仓库层,英文:Data Warehouse,是我们在设计数据仓库时要核心设计的一层。在这里,从 ODS 层获得的数据按照主题建立各种的数据模型。DW 层又要细分为 DWD(Data Warehouse Detail)层、DWM(Data Warehouse Middle)层和 DWS(Data Warehouse Service)层,如下图。

1)数据明细层(DWD)

数据明细层,英文:Data Warehouse Detail,该层和 ODS 层一般保持一样的数据粒度,并且提供一定的数据质量保证。同时,为了提高数据明细层的易用性,该层会采用一些维度退化的方法,将维度退化至事实表,减少事实表和维表的关联。

另外,在该层也会做一部分的数据聚合,将相同主题的数据汇集到一张表中,提高数据的可用性。

2)数据中间层(DWM)

数据中间层,英文:Data Warehouse Middle,该层会在 DWD 层的数据基础上,对数据做轻度的聚合,生成一系列的中间表,提升公共指标的复用性,减少重复加工。直观来讲,就是对通用的核心维度进行聚合操作,算出相应的统计指标。

3)数据服务层(DWS)

数据服务层又叫数据集市或宽表,英文:Data Warehouse Service。按照业务划分,如流量、订单、用户等,生成字段比较多的宽表,用于提供后续的业务查询、OLAP 分析、数据分发等。

一般来讲,该层的数据表会相对比较少,一张表会涵盖比较多的业务内容,由于其字段较多,因此一般也会称为该层的表为宽表

在实际计算中,如果直接从 DWD 或者 ODS 计算出宽表的统计指标,会存在计算量太大并且维度太少的问题,因此一般的做法是,在 DWM 层先计算出多个小的中间表,然后再拼接成一张 DWS 的宽表。由于宽和窄的界限不易界定,也可以去掉 DWM 这一层,只留 DWS 层,将所有的数据放在 DWS 亦可。

3. 数据应用层(APP)

数据应用层,英文:Application,该层主要提供给数据产品和数据分析使用的数据。该层的数据一般会存放在 Redis、PostgreSql 等共线上系统使用的系统,也可能会存放在 Hive、Druid 中供数据分析和数据挖掘使用,比如报表数据就可以存放在 Hive 中。

4. 维度层(DIM)

维度层,英文:Dimension。建立一致数据分析维表,可以降低数据计算口径和算法不统一风险。以维度作为建模驱动,基于每个维度的业务含义,通过定义维度及维度主键,添加维度属性、关联维度等定义计算逻辑和雪花模型,完成属性定义的过程并建立一致的数据分析维表。同时我们可以定义维度主子关系,子维度的属性将合并至主维度使用,进一步保证维度的一致性和便捷使用性。

维度层包含两个部分:

1)高基数维度数据:一般是用户资料表、商品资料表类似的资料表,数据量可以上千万甚至上亿。

2)低基数维度数据:一般是配置表,比如枚举值对应的中文含义,或者日期维度表,数据量大概在几千到几万之间。

3 表命名规范

表名需要见名知意,通过表名就可以知道它是哪个业务域,干啥用的,什么粒度的数据。

1. 常规表

常规表是我们需要固化的表,是正式使用的表,也就是需要投入精力去维护的表。

命名规范:分层前缀[ods|dwd|dws]_业务域_主题域_XXX_粒度。

业务域、主题域我们都可以用词根的方式枚举清楚,不断完善,粒度也是同样的,主要是时间粒度(如日、周、月、年等),使用词根定义好简称。

2. 中间表

中间表一般出现在作业中,它的作用域是当前 Job 执行过程,一旦 Job 执行完毕,该表的使命就完成了。这时,中间表可以删除(根据场景自由选择,一般会保留几天中间表数据,用来排查问题)。

命名规范:mid_table_name_[0~9|dim]。

以 mid 开头,再加上表名,末尾以有意义的名字或者数字结尾。如果遇到需要补全维度的表,可以使用 dim 结尾。如果需要保留历史的中间表,可以加上日期或者时间戳。

3. 临时表

临时表是临时测试的表,是临时使用一次的表,就是暂时保存下数据看看,后续一般不再使用的表,这种表是可以随时删除的。

命名规范:tmp_xx。

只要加上 tmp 开头即可,其他名字随意。

切记:tmp 开头的表不要用来实际使用,仅用于测试验证。

4. 维度表

维度表是基于底层数据,进而抽象出来的描述类的表。维度表可以自动从底层表抽象出来,也可以手工来维护。

命名规范:dim_xx。

以 dim 开头,表名需要与内容有关。

5. 手工表(/明细表)

手工表是手工维护的表,手工初始化一次之后,一般不会自动改变,后期变更,是手工维护的。一般来说,手工的数据粒度是偏细的,所以,暂时我们统一放在 dwd 层,后面如果有目标值或者其他类型的手工数据,再根据实际情况分层。

命名规范:dwd_业务域_manual_xx。

其中,dwd 表示明细层,后接业务域,manual 表示手工维护表,后接表名。

4 数据仓库建模

4.1 数仓建模目标

大数据的数据仓库建模需要通过建模的方法更好地组织、存储数据,以便在性能、成本、效率和数据质量之间找到最佳平衡点。具体的建模目标,如下图。

4.2 数仓建模方法

接下来,就聊聊数据仓库中几种经典的数据模型,如关系建模、维度建模、DataVault模型。在实际工作中,通常会根据业务场景选择一种或几种模型。

4.2.1 关系建模

关系建模,是数据仓库之父 Inmon 推崇的,被称为 “实体-关系” 模型,以一种 “标准化” 的方式存在,强调数据之间非冗余,满足 3NF 。关系建模是站在企业角度面向主题的抽象,而不是针对某个具体业务流程的实体对象关系抽象。它更多用于数据的整合和一致性质量。

4.2.2 维度建模

维度建模,Ralph Kimball 博士最先提出这一概念。其最简单的描述就是,按照事实表、维表来构建数据仓库、数据集市。这种方法很多人称之为星形模型。之所以称为星形模型是因为它的表示方法是以一颗 “星” 为中心,周围围绕着其他数据结构,如下图。

星形模型的中心是一张事实表。事实表是包含大量数据值的一种结构。事实表的周围是维表,用来描述事实表的某个重要方面。维表里的数据量要比事实表里的少。

星形模型之所以广泛被使用,在于针对各个维作了大量的预处理,比如按照维进行了预先的排序、分类、统计等。通过这些预处理,能够极大地提升数据仓库的处理能力。特别是针对 3NF 的建模方法,星形模型在性能上占据明显的优势。因此,星形模型仅适用于小范围数据(如一个部门或甚至一个子部门)。

通常星形模型只包含一张事实表。但是在数据库设计中要创建一种雪花结构的复合结构,需要多张事实表结合。如下图,描绘了一个雪花模型。

在雪花模型中,不同的事实表通过共享一个或多个公共维表连接起来。有时称这些共享的维表为一致维表。

维度建模的最大优点在于访问的高效性。如果设计适当,通过星形连接将数据传递给最终用户是非常高效的。为了提高传递信息的效率,必须收集并吸收最终用户的请求。最终用户使用数据的过程是要定义什么样的多维结构的核心。一旦清楚了最终用户的请求,这些请求就可以用来最终确定星形模型,形成最理想的结构。

因此我认为,维度建模主要适用于数据集市层,它的最大作用其实是为了解决数据仓库建模中的性能问题。维度建模很难提供一个完整地描述真实业务实体之间的复杂关系的抽象方法。

4.3 Data Vault 模型

Data Vault 是另一种数据仓库建模方法,是 Dan Linstedt 在 20 世纪 90 年代提出的,主要用于企业级的数据仓库建模

Data Vault 方法需要跟踪所有数据的来源,因此其中每个数据行都要包含数据来源和装载时间属性,用以审计和跟踪数据值对应的源系统。

Data Vault 不区分数据在业务层面的正确与错误,它保留操作型系统的所有时间的所有数据,装载数据时不做数据验证、清洗等工作,这点明显有别于其他数据仓库建模方法。

Data Vault是对 ER 模型更近一步的规范化,由于对数据的拆解更偏向于基础数据组织,在处理分析类场景时相对复杂,适合数据仓库底层构建,目前实际应用场景较少。

1. Data Vault模型定义

Dan Linstedt 将 Data Vault 模型定义为:Data Vault 是面向细节的,可追踪历史的,一组由连接关系的规范化的表的集合。这些表可以支持一个或多个业务功能。它是一种综合了第三范式和星型模型特点的建模方法。

Data Vault 只按照业务数据的原样保存数据,不做任何解释、过滤、清洗、转换。即使从不同数据源来的数据是自相矛盾的,比如:同一个客户有不同的地址,Data Vault 模型会存储多个不同版本的地址数据。

2. Data Vault 模型的特点

1)所有数据都基于时间来存储,即使数据是低质量的,也不能在 ETL 过程中处理掉。

2)与源系统越独立越好。

3)可以适应源系统中数据的各种变化,并可以灵活的实现模型扩展。

4)数据的来源可以完全追踪,并且数据处理作业可以支持重载。

5)ETL 作业可以重复执行。

3. Data Vault 模型组成

Data Vault 模型由中心表(Hub)、链接表(Link)、附属表(Satellite)三个主要组成部分。其中,中心表是核心,用于存储业务主键,链接表记录业务关系,附属表记录业务描述。

1)中心表

中心表用来存储企业每个业务实体的业务主键,业务主键唯一标识某个业务实体。中心表和源系统是相互独立的,即无论业务主键是否用于多个业务系统,它在 Data Vault 中只保留一份,其他的组件都链接到这一个业务主键上。

出于设计上的考虑,中心表一般由主键、业务主键、装载时间戳、数据来源系统四个字段组成。其中主键是系统生成的代理键,仅供内部使用。

2)链接表

链接表是不同中心表的链接。一个链接表一般在两个或多个中心表之间有关联。一个链接表通常是一个外键,表示一种业务关系,比如:交易表、客户关联账户等。

链接表主要包括主键、外键1、……、外键n、装载时间戳、数据来源系统等字段构成,其中主键对应多个外键的唯一组合,一般是与业务无关的序列数值。

3)附属表

附属表用来保存中心表和链接表的描述属性,包含所有历史变化数据,附属表有且仅有一个唯一外键关联到中心表或链接表。

附属表主要包括主键、外键、属性1、……、属性n、装载时间、失效时间、数据来源系统,主键用于唯一标识附属表中的一行记录,一般是与业务无关的序列数值。

4. Data Vault 模型设计

根据 Data Vault 模型体系构成,Data Vault 模型设计由此也分成三大部分。

1)设计中心表

(1)明确企业数据仓库要涵盖的业务范围。

(2)按业务范围划分为若干原子业务实体,比如客户、产品、品类等。

(3)从各个业务实体中抽象出业务主键,该业务主键要在整个业务的生命周期内不会发生变化。

(4)由该业务主键生成中心表。

2)设计链接表

(1)分析各个中心表代表的业务实体之间的业务关系,并识别对应的中心表,这些业务关系可以是1对1、1对多,或者多对多的。

(2)按业务关系涉及的中心表,提取中心表主键,这些主键将被加入到链接表中,并确定链接表的主键。

在生成链接表的同时,链接表内可以保存交易数据,有两种方法,一是采用加权链接表,二是给链接表加上附属表来处理交易数据。

3)设计附属表

附属表包含了各个业务实体与业务关联的详细的上下文描述信息。主要是从中心表、链接表出发,提取与中心表、链接表相关的上下文描述信息。

由于同一业务实体的各个描述信息不具有稳定性,会经常发生变化,因此需要按变化频率不同的信息分割开来,为一个中心表建立几个附属表,然后提取主键,作为描述该中心表的附属表的主键。

4)设计必要的 PIT 表

为了访问数据的方便,可能就用到 PIT 表,PIT 表不是必须的,但如果一个中心表或者链接表有多个附属表,就有可能用到 PIT 表。PIT 表的主键是由附属表关联的中心表提取出来的,有几个附属表就会有几个字段用于记录附属表的变化时间戳。

参考资料:

《Hadoop构建数据仓库时间》,作者王雪应

《数仓理论知识之数仓命名规范》,作者寒暄,来源:CSDN

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容