[架构]
MPP架构优点
- 传统数仓常见的随机数架构,将单机数据库节点组成集群,提升性能
- 节点间为非共享架构(Share Noting),没个节点都有独立的磁盘存储系统和内存系统
- 每台数据通过专用网络或者商业通用网络互相连接,彼此协同计算,作为整体提供服务
- 设计上优先考虑C 其实A P
![](https://img-blog.csdnimg.cn/113780f4e7044d648dacb5fc005d63e2.png)
MPP架构缺点
- 存储位置不透明,通过hash确定数据所在物理节点,查询任务在所有节点均会执行
- 并行计算式,单节点瓶颈会成为整个系统短板,容错性差
- 分布式事务的实现会导致扩展性降低
分布式架构(Hadoop 架构)
- 各节点实现场地自治(可以单独运行局部应用),数据在及群众全局透明共享
- 每个节点通过局域网连接,节点间的通信开销较大,运算时致力减少数据移动
- 有效考虑分区容错 然后是A C
MPP + 分布式架构
- 数据存储采用分布式架构中的公共存储,提高分区容错
- 上层架构采用MPP,减少运算延迟
通用架构
![](https://img-blog.csdnimg.cn/0f00d56c5fff436b91fc36547d960020.png)
ETL(Extract-Transform-Load)数据同步模块,将业务数据抽酒进行交互转换清洗,标准化。
ODS 存储清洗过后的原始数据(不允许修改,保证数据一致)
CDM
DWD 数据明细
DWS 数据汇总(宽表,提升数据分析)
ADS 数据应用
ETL流程
Extract-Transform-Load
- 将数据从来源段经过抽取,交互转换,加载至目的端的过程
- 构建数据仓库的重要一环,用户从数据源抽取所需的数据,经过数据清洗,最终按照预先定义好的数据仓库模型,将数据加载到数据仓库中。
数据抽取[Extraction]
- 抽取的数据源可分为结构化、非结构化数据、半结构化数据
- 结构化的数据一般采用JDBC、数据库日志的方式,非|半结构化的数据会监听文件变动
抽取方式
- 数据抽取方式有全量同步、增量同步两种方式
- 全量同步会将全部数据进行抽取,一般用于初始化数据装载
- 增量同步方式会检测数据的变动,抽取发生变动的数据,一般用于数据更新
![](https://img-blog.csdnimg.cn/e7293ffd698b480186ff5d2c6f048590.png)
数据转换[Transformation]
- 数据转换姚经理数据清洗和转换两个阶段
- 数据清洗主要是对出现的重复、二义性、不完整、违反业务或者逻辑规则等问题的数据进行统一的处理
- 数据转换主要是对数据进行标准化处理,进行字段、数据类型、数据定义的转换
- 结构化数据在转换过程中的逻辑较为简单,非|半结构化的数据转换较为复杂
数据加载[Loading]
结构化数据ETL工具:Sqoop
Kettle
半|非结构化数据ETL工具:Flume
Logstash
数据积存 ODS
操作数据层[ODS]
- 数据与原业务数据保持一致,可以增加字段用来进行数据管理(扩充集)
- 存储的历史数据是只读的,提供业务系统查询使用
- 业务系统对历史数据完成修改后,将update_type字段更新为UPDATE,追加回ODS中
比如业务系统需要对N年前的数据进行修改,那ODS层提供了查询功能,业务系统修改数据后,发现ODS层数据不能被修改。
所以业务系统只能将查询的出来的数据追加到ODS层将update_type修改为UPDATE,然后将历史数据删除,保证数据仓库最新的时效性
![](https://img-blog.csdnimg.cn/a505e2a03b8a4001b090529d006ebd14.png)
- 在离线数据中,业务数据定期通过ETL流程导入到ODS中,导入的方式也有全量、增量两种
- 全量导入:数据第一次导入时,选择此种方式
- 增量导入:数据非第一次导入是,每次只需要导入新增、修改的数据,建议使用外连接&全覆盖
数据分析 DWD DWS ADS
数据明细层[DWD]
- 数明细层对ODS层的数据进行清洗、标准化、维度退化(时间、分类、地域)
- 数据仍然班组3NF模型,为分析运算做准备
维度退化(多张表合并成一张表)
![](https://img-blog.csdnimg.cn/7cd52e8672e9484ab2de97ef8708fc4e.png)
数据汇总层[DWS]
- 数据汇总层的数据对数据明细层的数据,按照分析主题镜像计算汇总,存放便于分析的宽表
- 存储模型并非3NF,而是注重数据聚合,复杂查询、性能处理更优的数仓模型
![在这里插入图片描述](https://img-blog.csdnimg.cn/136bd8990bb24d9b81490c6e047d9693.png)
DWS层应该包含模型和基于模型汇总的数据
数据应用层[ADS]
- 数据应用层也被称为数据集市
- 存储数据分析结果,为不用业务场景提供接口,减轻数据仓库的负
- 数据仓库擅长数据分析,直接方法业务查询结构,会加重其负担
![在这里插入图片描述](https://img-blog.csdnimg.cn/ec19d78275934cf1ad0b53abb05431a6.png)
[建模]
OLTP,OLAP
OLTP系统建模方法
OLTP(在线事务处理)系统中,主要操作是随机读写
- 为了保证数据一致性、减少冗余,尝试用关系模型
- 在关系模型中,使用三范式规则来减少冗余
OLAP
OLAP系统中,主要操作是复杂分析查询,关注数据整合,以及分析、处理性能。根据存储的方式不同,又可以分为ROLAP,MOLAP和HOLAP
- ROLAP(Relation OLAP,关系型OLAP):使用关系模型构建,存储系统一般为RDBMS
- MOLAP(Multidimensional OLAP,多维度OLAP):预先聚合计算,使用多维度数组的形式保存数据结果,加快查询分析时间
- HOLAP(Hybrid OLAP,混合架构的OLAP):ROLAP和MOLAP两者的继承,如底层是关系型,高层是多维矩阵型;查询高于ROLAP,低于MOLAP
ROLAP,MOLAP建模理论
ROLAP系统建模方法
典型的数仓建方法有ER模型,维度模型,DataValue,Anchor(维度模型适合频繁变动的业务)
![在这里插入图片描述](https://img-blog.csdnimg.cn/71025049edc345978db966b80da277d9.png)
维度模型
- 维度模型中,表被分为维度表、事实表,维度是对事实的一种组织
- 维度一般包含分类、时间、地域
![在这里插入图片描述](https://img-blog.csdnimg.cn/b229d41c9b9d4e089980e43cb8e40bf7.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/fab0230b7eec46218a6b106ba607c974.png)
中间的订单就是事实表,旁边围绕的就是维度表
建立好维度表后,可以根据不同的维度进行分析,比如地区,年份的分析
维度模型分为星型模型、雪花模型、星座模型,模型建立后方便对数据进行多维分析。
星型模型
标准的星型模型,维度只有一层,性能分析最优
![在这里插入图片描述](https://img-blog.csdnimg.cn/deebdebccc254795871bedf1a0518e8a.png)
雪花模型
雪花模型具有多层维度,比较接近3NF,较为灵活
![在这里插入图片描述](https://img-blog.csdnimg.cn/4e04ad43a9d74e2a87cedfcad9a089d5.png)
星座模型
- 星座模型基于多个事实表,事实表之间会共享一些维度表
- 是大型数据仓库中的常态,是业务增长的结果,与模型设计无关
![在这里插入图片描述](https://img-blog.csdnimg.cn/62dd29869efb465d9dfb3536642a5334.png)
宽表模型
- 宽表模型是维度模型的衍生,适合Join性能不佳的数据仓库产品
- 宽表模型将维度冗余到事实表中,形成宽表,以此减少Join操作
MOLAP系统建模方式
- MOLAP将数据进行预结算,并将聚合结果存储到CUBE模型中
- CUBE 模型以多维数组的形式,物化到存储系统中,加快后续的查询
- 生成CUBE需要大量的时间、空间,维度预处理可能为导致数据膨胀
![在这里插入图片描述](https://img-blog.csdnimg.cn/a85265ef3c674108974797e33d7b19e2.png)
常见MOLAP产品:Kylin
,Druid
多维分析
- OLAP主要操作是复杂查询,可以多表关联,使用COUNT,SUM,AVG等聚合函数
- OLAP对复杂查询操作做了直观的定义,包括钻取、切片、切块、旋转。
![在这里插入图片描述](https://img-blog.csdnimg.cn/73e49bb4c69c466ca159a52b63c208f1.png)
[钻取]
- 对维度不同次的分析,通过改变维度的层次来变换分析的粒度
- 钻取包括上卷,下钻
上卷(Roll-up)也称为向上钻取,指从低层次到高层次的切换
下钻(Drill-down),指从高层次到低层次的切换
![在这里插入图片描述](https://img-blog.csdnimg.cn/40d30b19f01d4793a4d8d2fe7507d172.png)
[切片,切块]
选择某个维度进行分割称为切片
按照多维进行的切片称为切块
![在这里插入图片描述](https://img-blog.csdnimg.cn/0a5f8f81157c470f8bd3edb8b7411e1d.png)
[旋转]
对维度方向的转换,类似交换坐标轴上卷
![在这里插入图片描述](https://img-blog.csdnimg.cn/af32254bc744413a856e24c540d25a19.png)
[最佳实践]
数据仓库表类型
维度建模中的表分类
- 事实表
- 维度表
- 事务事实表
- 周期快照事实表
- 累计快照事实表
事实表
一般是指一个现实存在的业务对象,比如用户,商品,商家,销售员等
![在这里插入图片描述](https://img-blog.csdnimg.cn/73f806f189b44104baf22b190b605a8a.png)
维度表
一般是指对应一些业务状态,代码的解释表。通常使用维度对事实表中的数据进行统计,聚合运算
![在这里插入图片描述](https://img-blog.csdnimg.cn/9aeb38083377422b91792bdb292ce723.png)
事务事实表
随着业务不断产生的数据,一旦生产不再会发生变化,比如交易流水,操作日志,出库入库记录
![在这里插入图片描述](https://img-blog.csdnimg.cn/47910569e2954f01a99355e550f42410.png)
周期事实表
- 随着业务周期型的推荐而变化,完成建个周期内的度量统计,如年,季度累计。
- 使用周期+状态度量的组合,如年累计订单数量。
![在这里插入图片描述](https://img-blog.csdnimg.cn/1750424c85744fba845ce4d687f009ae.png)
累计快照事实表
记录不确定周期的度量统计,完全覆盖一个事实的生命周期,如订单状态,通常有多个时间字段记录生命周期的关键时间点,只有一条记录针对此记录不断更新
![在这里插入图片描述](https://img-blog.csdnimg.cn/c48dd9a3619a4a25bcd5ec1ed7756b9f.png)
实现方式一
- 使用日期分区表,全量记录数据,每天的分区存储全量数据与当天增量数据合并的结果
- 数据量大会导致全量表膨胀,存储大量永远不更新的冷数据,对性能影响较大
- 适用于数据量少的情况
实现方式二
- 使用日期分区表,推测数据最长的生命周期,存储周期内数据,周期外的类数据存储到归档表
- 需要保留多天的分区数据,存储消耗依然很大
实现方式三
- 使用日期分区表,以业务实体结束的时间分区,每天分区存放当天结束的数据;设计一个时间非常大的分区
- 已结束的数据存放到相对应的分区,未结束的数据分区,数据量也不会很大,ETL性能好
- 无存储浪费,数据全局唯一
- 业务系统可能无法表示业务实体的结束时间,可以用奇台相关业务系统的结束标志作为此业务系统的结束,业务以使用最长生命周期时间或者前端系统的数据归档时间
拉链表
拉链表记录每条信息的生命周期,用于保存历史数据的所有(变更)状态,拉链表将表数据的随机修改方式变城顺序追加
![在这里插入图片描述](https://img-blog.csdnimg.cn/7fff73ab9de240a4a37aea8d0c106fe7.png)
ETL策略
[全量同步]
数据初始化装在一定使用全量同步的方式,因为业务技术原因,使用全量同步的方式做周期数据更新,直接覆盖原有数据即可。
[增量同步]
传统数据整合方案中,大多采用merge方式,主流大数据平台不支持update操作,可采用全外连接覆盖方式,如果担心数据更新出错,可采用分区方式,每天保证最小的全量版本,保存较短周期。
任务调度
为什么需要任务调度
- 解决任务单元间的依赖关系
- 自动化完成任务的定时执行
常见任务类型
shell, Java程序,MapReduce程序,sql脚本