数据仓库
数据仓库诞生的背景:
- 历史数据积存(避免业务冷数据堆积在业务库中,导致性能下降)
- 历史数据分析需要
概念:
数据仓库是一个面向主题的、集成的、非易失的、且随时间变化的数据集合。
对上述特点详说
- 面向主题:根据主题将原始数据集合在一起 形成一张宽表,形成的大宽表方便为数据分析提供服务
- 集成:原始数据来源于不同数据源,要整合成最终数据,需要经过抽取、清洗、转换的过程
- 非易失:保存的数据是业务数据库的历史快照,不允许被修改,只能通过工具进行查询、分析
- 时变性:数仓会定期接受、集成新的数据,从而反映出数据的最新变化
数据 VS 数据库
数据库 | 数据仓库 | |
---|---|---|
面向 | 事务 | 分析 |
数据类型 | 细节、业务 | 综合、清洗过的数据 |
数据特点 | 当前的、最新的 | 历史的、跨时间维护 |
目的 | 日常操作 | 长期信息需求、决策支持 |
设计模型 | 基于ER模型、面型应用 | 星型/雪花模型等、面向主题,反范式设计,为了性能故意引入冗余 |
操作 | 读/写 | 大多数为读 |
数仓技术实现
-
传统数仓建设方案
方案:由单机关系型数据库组成MPP集群;结合分库分表、定时调度等框架,定时从业务库同步数据进入数据库集群
常见产品:- Oracle RAC
- DB2
- Teradata
- Greenplum
优点: - 兼容原有的SQL方案
- 学习成本低廉
缺点: - 扩展性有限
- 热点问题,如果有大量的热点数据被同步到集群中同一台数据库,那么大量的查询热点数据,可能导致该节点宕机成为集群短板
-
大数据数仓建设方案
方案:大数据方案、使用分布式文件系统存储数据、集合大数据计算引擎、分布式SQL引擎完成数仓
常见产品:- Hive
- Spark SQL
- HBase
- Impala
- HAWQ
- TIDB
优点: - 扩展性好
- 数据备份,避免单节点热点数据的查询导致节点拖慢
缺点: - 学习成本高
- SQL兼容性差、需要有单独的组件将标准的SQL转换为大数据数仓能识别的SQL语句
- 分布式架构,对事务支持不完善
数仓架构图
数仓架构图.jpg说明:
数仓的架构因公司需求而异,有的名词说法也不相径庭,但大体思路一致,不必太纠结于细节
下面对上述分层进行简单叙述,下面会专门对每层进行详细描述的;
- ODS层(数据操作层)
ODS层的数据是由ETL技术将各个业务数据库的数据抽离至此,该层主要完成数据积存的功能,原则上,ODS层依然保留业务数据的表格式,不能进行修改操作(但可以为了数据仓库的方便可以进行扩充字段),便于之后的数据回溯,于此同时业务数据库可以删除已经ETL至此的数据,以提升业务数据库的性能。 - CDM层
- DWD(数据明细层)
用于从ODS层将数据进行清洗与数据标准化(字典、单位等),但该层次的数据结构与业务数据的结构基本相似,只是数据经过了清洗与筛选 - DWS(数据汇总层)
DWS层主要面向DWD层进行反范式设计,有意通过字段冗余按照不同主题进行宽表处理,旨在减少表的Join以减慢查询速度,该层次的表结构与业务数据库结构发生了很大的变化。
- DWD(数据明细层)
- ADS层(数据应用层)
ADS层主要针对DWS层进行数据分析之后保存的地方,一般该层会直接对接前端分析展示系统等
分层细说
ETL
E:extract(抽取)
抽取的数据可以分为:结构化数据、非结构化、半结构化数据
抽取结构化数据方法:
- JDBC
优点:采集方便
缺点:需要消耗数据库IO,影响业务,因此该方式经常放在凌晨进行
- 数据库日志方式:监听日志文件并解析日志
优点:节省数据库IO,避免影响业务
缺点:方式复杂,一般需要采用现有工具,CDC
非结构化、半结构化数据抽取方法:
- 监听文件变动
T:transform(交互转换)
结构化数据ETL中,T的部分很少,最多做一下去重就可以了,但是对于结构化、非结构化数据需要进行较为复杂的清洗
L:load(加载)
常见ETL工具
- 结构化数据ETL工具
- Sqoop
- Kettle
- Kafka
- 非|半结构数据ETL工具
- Flume
- Logstash
同步方式: - 全量同步
数据初始化装入一定使用全量同步方式,对于结构化数据可采用JDBC方式同步,但是该方式同步很慢可能长达几个月的时间,甚至IO问题影响到业务,因此可采用CDC方案进行对日志监控解析同步。 - 增量同步
主流大数据平台不支持update操作,可采用全外连接+数据全量覆盖方式,
全外连接:先对数仓中的历史数据先进行join操作,如果join到的数据表示是数仓中以存在,则进行覆盖即可,如果join则说明是业务新增记录,则直接追加即可。
ODS层
ODS主要是做历史数据积存的,但是ODS层有一个难点:对于业务库中更新过的数据该如何处理?
我们可以对ETL到ODS层的数据进行扩充字段:update_type,里面的枚举为Insert、Update用于表示这条进入ODS的记录是新增的还是业务库中更新的。
DWD层
该层主要做了数据标准化处理,并开始进行一部分的维度退化工作(维度表合并工作),但这一层总体还是范式设计
DWS层
该层开始面向主题的进行宽表设计,对DWD层的数据结构进行反范式设计,减少数仓查询的Join操作
ADS层
ADS层也称之为数据集市层,是为了屏蔽业务直接查询数仓从而导致数仓压力增大的问题,所以该层会使用很多组件如Kylin、ES等组件加速数仓查询速度。
OLAP VS OLTP
OLTP
OLTP为在线事务处理系统。主要操作是随机读写,为了保证数据一致性、减少冗余,常使用关系模型,经常使用三范式规则来减少冗余。
OLAP
OLAP为在线联机分析系统,关注数据整合,以及分析、处理性能,OLAP根据存储方式不同分为 ROLAP、MOLAP、HOLAP
三种建模方式
只有ROLAP是依赖模型设计的,MOLAP、HOLAP是依赖数仓产品的底层,并不是依赖于模型设计。
- ROLAP:使用关系模型构建,存储系统一般为RDBMS
- MOLAP:预先聚合计算,使用多为数组的形式保存存储数据结果,加快查询分析时间
- HOLAP:ROLAP和MOLAP的两者集成
建模方法
ROLAP建模
ROLAP建模有如下方法:ER模型、维度模型(常用)、Data Value、Anchor
ER模型、DataValue、Anchor三个模型适合成熟的数据仓库,业务变动很少,而维度模型适用于业务多变的场景,使用较为灵活,因此在ROLAP方式建模中维度模型最为常用,也是当下互联网的主流,因此在ROLAP建模方式中,主要去讲解 维度模型。
维度建模:
维度模型分为:维度表、事实表
- 事实表:
筛选出的一条条记录为 事实。
事实表分类如下:- 事务事实表:
随着业务不断产生的数据,一旦产生不会再变化,如交易流水、操作日志、出库入库记录等 - 周期快照事实表:
随着业务周期的推进变化,完成间隔周期内的度量统计,如年内订单数、年是周期,订单总数是度量。说白点就是要统计年订单数,那我们的数仓业务中可以每天统计一次,那么每次统计出的数据只要追加在最后即可。 - 累积快照事实表:
记录不确定周期的度量统计,完全覆盖一个事实的生命周期,如订单状态表。
通常有多个时间字段,用于记录生命周期中的关键时间点,只有一条记录,针对此记录不断更新,该类型事实表不同于前两种,前两种只需要顺序追加即可,而累积快照事实表涉及到事实修改即数仓数据随机修改,因此实现起来较为复杂。
- 事务事实表:
- 维度表:
维度是对事实的一种组织,划分。根据不同的维度可以筛选出不同的事实记录,如 分类、时间、地域。
维度模型分为:星型模型、雪花模型、星座模型 -
星型模型:
标准的星型模型,维度只有一层,分析性能最优
ROLAP-维度建模方式-星型模型.jpg -
雪花模型:
雪花模型具有多层维度,比较接近三范式设计,较为灵活,与星型模型最大的区别在于星型模型的维度只能为一层而在实际的业务中很少有这种维度只有一层的最优情况。
ROLAP-维度建模方式-雪花模型.jpg -
星座模型:
星座模型基于多个事实表,事实表之间会共享一些维度表,一般与设计无关,与业务增长有关,单存的星型模型或雪花模型在业务增大之后都很有可能成为星座模型。
ROLAP-维度建模方式-星座模型.jpg
MOLAP建模
MOLAP建模方式比较依赖于数仓产品的功能特性,并不需要开发者去手动干预。
MOLAP将数据进行预结算,将聚合结果存储到CUBE模型中,CUBE模型以多为数组的形式存在,物化到存储系统中,加快后续的查询。
常见的MOLAP的产品有:Kylin、Druid
如下图:该多维数组CUBE中,有三个维度,当查询的时候按照group by xxx的时候,可以直接按照相应的xxx维度去查询对应的立方体里的数据。
MOLAP-CUBE.jpg
HOLAP建模
OLAP专业术语
- 钻取
- 上卷
维度由低层向高层的切换 - 下钻
维度由高层向低层的切换
- 上卷
-
切片
按照某个维度镜像分隔成为切片,如下图,就是针对年份维度进行2004年的切割
OLAP专业术语-切片.jpg - 切块
切块的思路与切片一致,只是切块是按照多维度进行切片为切块。举例:对上图针对2004年切片之后,针对得到的数据再针对 野营设备 进行切割,得到的数据就为切块。 - 旋转
对维度方向的互换,表现在SQL中就是group by后面多个条件的位置变化。
任务调度
常见的任务类型:
- Shell
- Java程序
- MapReduce程序(本身就是分布式的)
- SQL脚本
常见产品: - Azkaban
- Oozie
- DolphinScheduler
-
xxl-job
其中Azkaban VS OOzie的对比如下:
AzkabanVSOozie.jpg
其中XXL-JOB VS DolphinScheduler请看我的另一篇博客。
网友评论