数据仓库

OLTP

OLTP是联机事务处理的意思,主要是在业务运行中做的一些保障业务运行的事物处理工作,单个处理的时间比较快,常用在RDBMS也就是关系型数据库中

OLAP

数据仓库就是典型的联机分析系统,是一个面向分析,支持分析的系统

image-20220925185205695

数据仓库(Data Warehouse简称数仓、DW )是一个用于储存、分析、报告的数据系统,目的是构建面向分析的集成化数据环境,分析结果为企业提供给决策支持。

数仓数据由外部来,不生产也不消费数据,数据来源于外部系统,结果开放给外部应用,所以叫数据仓库而不叫数据工厂。

关键特点

  • 面向主题:主题是一个抽象的概念,是较高层次上的数据综合、归类进行分析利用的抽象(其实就是主题域)
  • 集成性:不产生数据、从不同系统中集成来(抽取转换加载)
  • 非易失性:是分析数据的平台,不是创造数据的平台
    • 数据仓库是分析数据,不是创造数据,数据进入数据仓库中稳定且不会改变
    • 数据仓库反应的是相当长一段时间内历史数据的内容,数仓用户对数据的操作大多是数据查询或比较复杂的挖掘
    • 数据仓库中一般有大量的查询操作,但修改和删除操作很少
  • 时变性:数据仓库的数据需要随着时间更新

Hive - 离线数仓

Hive是一款开源的数据仓库系统,由Facebook实现并开源。

一条如下的分析语句

1
SELECT pageid, age, count(1) FROM pv_users GROUP BY pageid, age;

image-20220924124644693

可以转化为MR程序

<2, 25> ,1> ==<2, 25> ,<1,1>>=<2, 25> ,2>

image-20220924172441609

这样一条SQL就被简单的MapReduce计算过程处理好了

在数据仓库中,SQL是最常用的分析工具,这样一条SQL可以通过MapReduce程序实现,那么有没有工具能够自动将SQL生成MapReduce代码呢;这样只要数据分析师输入SQL,就可以自动生成MapReduce可执行的代码,然后提交Hadoop执行。这样一个神奇的工具就是Hadoop大数据仓库Hive。

Hive能直接处理输入的语句,调用MapReduce框架完成数据分析操作

Hive与传统数据库比较

121664206527_.pic

Hadoop和Hive的关系

数据仓库至少要具备储存和分析数据的能力,Hive利用HDFS储存数据,利用MapReduce查询分析数据,用户编写HQL转换为MR程序完成对数据的分析。

关键结构

image-20220925201411955

  1. 用户接口

    包括cli、jdbc、webui

  2. 元数据存储(MetaStore也可以称为元数据服务)

    表和文件之间的映射关系。hive存在derby中,也可以存在mysql中。安装时在配置文件中指定mysql地址;metastore是hive元数据的集中存放地。metastore默认使用内嵌的derby数据库作为存储引擎Derby引擎的缺点:一次只能打开一个会话使用MySQL作为外置存储引擎,可以多用户同时访问

  3. Driver驱动程序

    包括语法解析器,计划编译器,优化器,执行器

  4. 执行引擎

    当下hive支持MapReduce、Tez、Spark 3种引擎

MetaStore安装模式

内嵌模式 本地模式 远程模式
MetaStore单独配置、启动
Metadata储存介质 Derby Mysql Mysql

远程模式部署后的关系图.hive本身是单机,但通过依赖的组件实现了其分布式的能力

image-20220927000527595

Beeline客户端首先会访问HiveServer2服务,所以需要启动Hive Server2

第三方推荐客户端:DataGrip,或者jetbrain自带的其他数据库连接

我们向Hive 提交SQL命令,如果是创建数据表的DDL,Hive就会通过执行引擎Driver将数据表的信息记录在MetaStore中。如果提交是的分析查询语句DQL,Driver就会讲该语句提交给编译器进行语法分析,最后生成一个MR执行计划

Hive建表与分区

1
2
3
create table student(id string,name string) partitioned by(classRoom string) row format delimited fields terminated by ',';

create table student(id string,name string) row format delimited fields terminated by ',';

普通的建表与mysql差不多,多了个 row format delimited fields terminated by

在hive目录中看到的有日期的是分区表如下:

在这里插入图片描述

在这里插入图片描述

查看数据

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

更多分区内容:https://blog.csdn.net/lianghecai52171314/article/details/104671599

hive操作

  1. load hive加载数据:Load可以从本地文件系统加载,也可以从hdfs上加载。从本地系统上加载是复制,从hdfs上是移动。最终到的地点就是表的文件夹下。这就是官方推荐的加载数据的方式,即清洗数据成为结构化文件,再用Load语法加载数据到表中

  2. Insert:在空文件中插入一条数据都需要几十秒,所以insert并不是像普通关系型数据库一样的用法,它用到的场景是insert+select。也就是把查询返回的结果插入到另一张表中insert into table select statement... From table

  3. select 等与mysql类似

  4. ETL就是去掉一些字段,拆分一些字段,生成新的表 create table as select。生成结果表也是这么操作

数仓实战-从原始数据、ETL、数仓、到报表

实时数仓与离线数仓的区别

一、技术栈上,离线一般hive spark hdfs等,实时flink kafka hbase

二、分层上,离线分层更多,实时相对减少

三、实效性上,实时更加实时,延时控制在秒级别

四、运维上,实时相对比较困难,其储存使用kafka ,不可查询,排查问题比较困难

五、业务需求上,离线多于实时。

我们从以下7个方面来对比离线数仓与实时数仓区别:

1.架构选择方面,离线数仓采用传统大数据架构模式搭建,而实时数仓采用Kappa架构方式搭建。

2.建设方法上两者都是采用传统数仓建模方法论。

3.准确性方面,离线数仓准确度高,实时数仓随着技术发展,准确度也比较高。

4.实时性方面:离线数仓统计数据结果一般是T+1,实时数仓统计结果一般是分钟级别、秒级别。

5.稳定性方面:离线数仓稳定性好、方便重算。实时数仓对数据波动比较敏感,数据重新计算时相对麻烦。

6.数据吞吐量方面,离线数仓吞吐量都很高,实时数仓随着实时技术发展吞吐量较高。

7.数据存储方面,离线数仓一般将数据存储在HDFS、Hive中,实时数仓一般将数据存储在Kafka、Hbase、Redis、ClickHouse中。

列式存储数据库

列式数据库和行式数据库只是在存储上有区别,数据展现上都是一样的,都是标准的行列结构。

https://www.jianshu.com/p/d1114dd4f77a

行存储

在行存储下,数据如下:

姓名 身份证号 检测机构 检测时间 结果 价格
彦祖 123512387 北京 2021-12-24 12:12:45 阴性 35
德华 213124157 上海 2021-12-22 12:12:45 阴性 20
路人甲 213123145 河南 2021-12-21 12:12:45 阴性 8
德华 213124157 广州 2021-12-29 12:12:45 阴性 23
彦祖 123512387 上海 2021-12-30 12:12:45 阴性 20

因为数据都是按行方式存储,所以在物理存储中,会以连续空间来存储数据,物理存储中,这些数据存储方式如下:

image-20220929003400653

行存储优缺点总结
  • 通过上面的分析,总结一下行存储的优缺点
  • 优点
1
2
1.连续空间对于插入/更新很方便
2.对于记录查询很方便
  • 缺点
1
1.会查询出来很多不需要的列

列存储

姓名 身份证号 检测机构 检测时间 结果 价格
彦祖 123512387 北京 2021-12-24 12:12:45 阴性 35
德华 213124157 上海 2021-12-22 12:12:45 阴性 20
路人甲 213123145 河南 2021-12-21 12:12:45 阴性 8
德华 213124157 广州 2021-12-29 12:12:45 阴性 23
彦祖 123512387 上海 2021-12-30 12:12:45 阴性 20

同样的数据,物理结构如下:

image-20220929003533463

列存储优缺点总结
  • 通过上面的分析,总结一下列存储的优缺点
  • 优点
1
2
3
1.数据压缩比较有优势
2.任何列都可以做索引
3.查询时只有涉及到的列会被读取
  • `缺点
1
2
1.每次查询时,都需要对查询到的列进行数据重新组装
2.插入/更新操作比较困难

HDFS

​ 和RAID的理念一样,HDFS将数据分片后进行读写以及冗余储存,HDFS是在一个大规模分布式集群上。应为HDFS可以部署在一个比较大的服务器集群上,集群中所有服务器磁盘都可供HDFS使用,所以整个HDFS的储存空间可达到PB级别。

文件系统

​ HDFS的文件系统空间与大多数文件系统(Linux)类似,支持目录和文件的增查删改,支持配置用户访问权限,但不支持软硬连接。NameNode负责执行有关 文件系统命名空间 的操作,例如打开,关闭、重命名文件和目录等。它同时还负责集群元数据的存储,记录着文件中各个数据块的位置信息。

​ 特点,高容错,高吞吐量,大文件支持,简单一致性模型( 更适合于一次写入多次读取 (write-once-read-many) 的访问模型。支持将内容追加到文件末尾,但不支持数据的随机访问,不能从文件任意位置新增数据。)

HDFS块的大小是128M

关键结构:

  • client:客户端:
    1. 文件切分。文件上传HDFS的时候,client将文件切分成一个一个block,然后进行储存
    2. 与NameNode交互,获取文件的位置信息
    3. 与DataNode交互,读取或者写入数据
    4. Client提供一些命令来管理HDFS,比如启动或者关闭HDFS
    5. client可以通过一些命令来访问hdfs
  • NameNode:就是分布式系统中的Master,负责整个分布式文件系统的元数据管理,也就是文件路径名、数据块的ID以及储存为止等信息,相当于操作系统中文件分配表(FAT)的角色。
    1. 管理HDFS的名称空间
    2. 管理数据块映射信息
    3. 配置副本策略
    4. 处理客户端读写请求
  • DataNode:就是Slave,NameNode下达命令后,DataNode执行实际的操作,hdfs将文件分为若干个数据块,每个DataNode储存一部分数据块。
    1. 储存实际的储存块
    2. 执行数据块的读写操作
  • Secondary NameNode:并非NameNode的热备,当NameNode挂掉的时候,并不能马上替换NameNode并提供服务。
    1. 辅助NameNode,分担其工作量
    2. 定期合并Fsimage和Edits,并推送给NameNode。
    3. 紧急情况下,可辅助恢复NameNode

高可用设计:

支持快照

  • 数据储存故障:

    可能一部分存储因老化故障,对于存储在NameNode上的故障,计算并存储校验和,读时候验证,如果不对就跑出异常,到其他DataNode上读取。

  • 磁盘故障容错:

    可能一整块磁盘故障,DataNode检测到某个磁盘损坏后,将磁盘上所有BlockId报告给NameNode,NameNode检查这些数据块的其他备份,并通知DataNode复制到其他磁盘上,以满足备份数符合要求。

  • DataNode故障:

    DataNode通过心跳和NameNode保持通信,如果超时未发送心跳,NameNode就认为这个DataNode已失效,查找储存块并复制转移。

  • NameNode故障:

    NameNode是整个Hdfs的核心,如果NameNode故障则整个集群都不可用,要注意的是Secondary NameNode并不是NameNode的热备。如果NameNode丢失,整个集群所有DataNode存储的数据也就没用了,所以要自己实现主从热备的方式进行高可用

![截屏2022-09-22 00.38.14](http://blog.blingblingbang.com/img/截屏2022-09-22 00.38.14.png)

通过zk进行选主,争夺znode资源,决定谁是主服务器。共享储存系统shared edits来同步文件系统的元数据信息,DataNode会向两个NameNode都发送心跳信息,但只有主NameNode才能向DataNode发送控制信息。

hdfs读写数据流程

写数据
  1. client向NameNode请求上传文件,NameNode检查文件是否存在文件与父目录
  2. NameNode向Client返回是否可以上传,切分文件为block
  3. client请求将第一个block传到哪几个DataNode上
  4. NameNode返回3个DataNode节点,分别为dn1、dn2、dn3
  5. client通过FSDataOutputStream请求上传dn1,dn1调用dn2、dn2调用dn3,通信管道建立完成。Chunk它是client向DataNode,或DataNode的PipLine之间进行数据校验的基本单位,默认512Byte
  6. 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单 位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。一个Packet默认64KB
  7. 当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行 3-7步

建立的这个通路就是pipeline

读数据
  1. client向NameNode请求下载文件,NameNode通过查询元数据,找到Block所在的DataNode地址
  2. 挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
  3. DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
  4. 客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

NameNode和Secondary NameNode工作机制

NameNode结构

![截屏2022-09-22 21.59.30](http://blog.blingblingbang.com/img/截屏2022-09-22 21.59.30.png)

三个重要结构

  • Fsimage:Fsimage文件是HDFS文件系统元数据的一个永久性检查点,其中包含HDFS文件系统的所有目录和文件 inode的序列化信息。
  • Edits文件:存放更新操作的逻辑(类似于redis中的AOF),所有写操作首先会记录到Edits文件中(所以现在知道share edits)是做什么的了吧。如果内存中的元数据也更新Fsimage的话效率很低,edits文件只进行追加操作,所以效率很高。一旦故障,可以通过FsImage和Edits的合并,合成元数据。并且:如果长时间添加数据到Edits中,该文件会数据过大,所以需要定期合并,由NameNode完成又效率过低,所以引入SecondaryNamenode专门用于Fsimage和Edits的合并
  • Seen_txid:文件保存是一个数字,就是最后一个Edits_的数字。

![截屏2022-09-22 23.26.31](http://blog.blingblingbang.com/img/截屏2022-09-22 23.26.31.png)

第一阶段:

NameNode启动

(1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。

(2)客户端对元数据进行增删改的请求。

(3)NameNode记录操作日志,更新滚动日志。

(4)NameNode在内存中对元数据进行增删改。

第二阶段:Secondary NameNode工作

(1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结 果。

(2)Secondary NameNode请求执行CheckPoint。

(3)NameNode滚动正在写的Edits日志。

(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。

(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。

(6)生成新的镜像文件fsimage.chkpoint。

(7)拷贝fsimage.chkpoint到NameNode。

(8)NameNode将fsimage.chkpoint重新命名成fsimage。

HDFS2.0

解决HDFS 1.0中单点故障和内存受限问题。
解决单点故障

  • HDFS HA:通过主备NameNode解决
  • 如果主NameNode发生故障,则切换到备NameNode上

解决内存受限问题

  • HDFS Federation(联邦)
    水平扩展,支持多个NameNode;
    (1)每个NameNode分管一部分目录
    (2)所有NameNode共享所有DataNode存储资源

    (3) 用的比较少,移动大数据集群就没用

HDFS 2.x HA

Hadoop HA主要是解决NameNode单点故障问题,主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换。所有DataNode同时向两个NameNode汇报数据块信息(位置)。并且在Hadoop HA中还含有JouranlNode集群用来存储共享存储状态。处于StandyBy节点的NameNode,主要作用是完成了edits.log文件的合并产生新的image,推送回给Active NameNode。该步骤和SecondaryNameNode的备份功能类似,通过这种方式保证了StandyBy节点的NameNode和Actvie NameNode的fsimage文件一致。edit文件通过JNN集群存储共享存储状态,active namenode处理所有的操作请求(读写),读写入到这个共享状态的集群节点。

关键结构:
  • ZKFC:ZKFC即ZKFailoverController,作为独立进程存在,负责控制NameNode的主备切换,ZKFC会监测 NameNode的健康状况,当发现Active NameNode出现异常时会通过Zookeeper集群进行一次主备选 举,完成Active和Standby状态的切换。

  • HealthMonitor定时调用NameNode的HAServiceProtocol RPC接口(monitorHealth和getServiceStatus),监控 NameNode的健康状态并向ZKFC反馈

  • ActiveStandbyElector接收ZKFC的选举请求,通过Zookeeper自动完成主备选举,选举完成后回调ZKFC的主备切换方法对 NameNode进行Active和Standby状态的切换。

  • JouranlNode****集群

    共享存储系统,负责存储HDFS的元数据,Active NameNode(写入)和Standby NameNode(读取)通过共 享存储系统实现元数据同步,在主备切换过程中,新的Active NameNode必须确保元数据同步完成才能 对外提供服务。

![截屏2022-09-23 00.57.13](http://blog.blingblingbang.com/img/截屏2022-09-23 00.57.13.png)

共享存储(shared edits)

active namenode处理所有的操作请求(读写),standby namenode只同步状态datanode会同时向两个namenode发送block报告和心跳当满足一次checkpoint时,standby namenode进行一次合并操作active NN执行任何命名空间的修改都会持久化到一半以上的journalnodes上而Standby NN负责观察edits log的变化,它能够读取从JNs中读取edits信息,并更新其内部的命名空间一旦Active NN出现故障,Standby NN将会保证从JNs中读出了全部的Edits,然后切换成Active状态一次checkpoint过程

切换
  • 手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
  • 自动切换:基于Zookeeper实现
基于Zookeeper自动切换方案
  • ZooKeeper Failover Controller:监控NameNode健康状态,
  • 当NameNode启动时,会向Zookeeper注册NameNode
  • NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC 锁的NameNode变为active

总览

大数据常说的三架马车分别是分布式存储(gfs、hdfs),mapreduce、以及BigTable。在谷歌的论文中被讨论。诞生背景是为谷歌的搜索服务提供的,谷歌的搜索服务,需要储存整个互联网的内容并在内容上建立倒排索引。

  • 谷歌文件系统:基于大量个人计算机的廉价海量储存,可以轻松的储存整个互联网的内容。
  • MapReduce: 海量数据计算引擎,是谷歌第一代倒排索引基础,可以大规模并行处理整个互联网上所有文档。有天然的缺陷,每次更新索引需要全量更新所有的索引,耗时几天,新的信息更新不及时。
  • BigTable:一个键值储存系统可储存一个主键多个时期不同版的值。使用互联网地址作为某个bigtable的主键,只更新那些已发生变化的互联网地址可实现增量索引。

最后谷歌因为封闭,起个大早赶了个晚集,不得不兼容hadoop。