甲骨文认证体系
Vmware认证体系
AWS亚马逊
阿里云认证体系
红帽认证体系
ZStack云计算认证体系
思科认证体系
华为认证体系
CDA数据分析师认证
达梦认证体系
麒麟
定制化课程
关于HBase
发布日期:2020-03-26 11:38:38阅读次数:

什么是HBase?
HBase是一个分布式的NoSQL数据库,其特点高可靠、高性能、面向列、可伸缩。
HBase适合具有如下需求的应用:
海量数据 (TB、PB) 。
不需要完全拥有传统关系型数据库所具备的ACID特性。
高吞吐量。
需要在海量数据中实现高效的随机读取。
需要很好的性能伸缩能力。
能够同时处理结构化和非结构化的数据。

HBase的系统架构:

1.HBase与RDB的对比:
1.1HBase:
(1)分布式存储,面向列的存储
注意:HBase不适合存储大对象
(2)数据以字节的形式进行存储
(3)支持动态扩展列(表名、列族)
(4)对硬件要求低,扩容成本低
(5)面向业务需求

1.2RDB(关系型数据库):
(1)数据结构固定的,面向行的存储 ==>存储结构化的数据
注意:关系型数据库是基于表的数据库,每行都有固定列数的列组成
(2)基于显示含义建立数据模型,而不是基于应用程序的功能

2.行存储与列存储的对比:
2.1按行存储:–适合整行查询
数据按行存储在底层文件系统。通常,每一行会被分配固定的空间
优点:有利于增加/修改整行记录等操作;有利于整行数据的读取操作
缺点:单列查询时,会读取一些不必要的数据

2.2按列存储:–适合单列查询
数据以列为单位,存储在底层文件系统中
优点:有利于面向单列数据的读取/统计等操作
缺点:整行读取时,可能需要多次I/O操作
注意:数据分析的时候,基本是按照列去分析数据

3.事务的ACID是什么?
ACID原则是数据库事务正常执行的四个特性,分别指原子性、一致性、独立性及持久性。
(1)事务的原子性(Atomicity):指一个事务要么全部执行,要么不执行。也就是说一个事务不可能只执行了一半就停止了。比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱,不可能划了卡,而钱却没出来.这两步必须同时完成,要么就不完成。
(2)事务的一致性(Consistency):指事务的运行并不改变数据库中数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。
(3)独立性(Isolation):事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致。
(4)持久性(Durability):事务的持久性是指事务执行成功以后,该事务所对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚。

注意:
HBase不完全遵循ACID的特性
(1)HBase数据先写入内存中,再写入log ,下盘—> WAL
此时在内存中的数据 用户可以直接看到
(2)MVCC (多版本并发控制)
主要为了提高数据库的并发性能,更好的处理读-写冲突

4.HBase的表结构是什么?

4.1rowkey:
(1)字节数组存在的,行键能否是字符串的格式?
任何字符串都可以作为行键
(2)表中的行会进行排序,根据行键进行排序
(3)数据按照rowkey范围划分子region
(4)所有对表的范围都是需要通过行键(单个(get)、范围、全表)

4.2column family:
(1)列族是region的物理存储单元,同一个region 下面会有多个列族
(2)一个列族会位于不同的region中,一个列族 会位于不同的文件路径下(元数据信息表)
(3)表中能否修改列族的信息?
列族必须定义的时候给出
(4)列族中的列支持动态扩展

4.3key-value:
<K,V> – CF1:C,cell-value
(1)key-value 具有特定的结构。key部分被用来快速的检索一条记录,value部分用来存储实际的用户数据信息
划分为一个个的子区间。每一个子区间都是一个不分布式存储的基本单元
(2)key-value 作为承载用户数据的基本单元,需要保存一些对自身的描述信息
(按一定的排序算法的结果,如按rowkey的字典顺序)
(3)key-value型数据库 数据分区方式–按key值连续范围分区,数据按照rowkey的范围
(4)HBase的底层数据都是以key-value的形式存在的,key-value具有特定的格式。
(5)key-value中拥有时间戳、类型等关键信息
(6)同一个rowkey可以关联多个key-value,每一个key-value都拥有一个qualifier 标识
(7)即使是key值相同,qualifier也相同的多个key-value,也可能有多个,此时,使用时间戳来区分,这就是一条数据记录的多版本

5.上述的结构图中的各组件作用是什么?
5.1master:
HMaster,在HA模式下,包含主用Master和备用Master。
主用Master:负责HBase中RegionServer的管理,包括表的增删改查;RegionServer的负载均衡,Region分布调整;Region分裂以及分裂后的Region分配;RegionServer失效后的Region迁移等。
备用Master:当主用Master故障时,备用Master将取代主用Master对外提供服务。故障恢复后,原主用Master降为备用。

5.2regionServer:
RegionServer负责提供表数据读写等服务,是HBase的数据处理和计算单元。RegionServer一般与HDFS集群的DataNode部署在一起,实现数据的存储功能

5.3region:
每一个HRegion 对于table表中的一个region,store–>表示一个列族的信息
HRegion是HBase中 负载均衡和分布式存储 最小的单元
Region 可以在HRegonServer之间发送转移
META Region:记录每一个region --start、end
用户region:记录数据

5.4store:
store是存储核心。一个region 有一个或多个store组成,每一个store对应表中的一个CF
5.4.1memstore:
客户端向HBase写入数据的时候缓存
等待memstore达到上限的时候后,flush

5.4.2storefile:
memstore满了之后 — flush — storefile(HFile) —HDFS
随着数据的不断写入,storfile数目不断的增多(小文件),当storeFile个数不断增大,文件会进行合并。
小合并(minor): 小范围的压缩
大合并(major): 大范围的压缩
在进行大合并的时候,是否会产生新的Region?
看情况。如果合并值Region> 10G

5.4.3HFile:
HFile 是当前HBASE系统中StorFile的具体实现

5.5HLog:
日志文件:可靠性、不丢失
在一个RegionServer上多个Region共享一个HLog
可以从HLog中恢复数据信息

5.6ZooKeeper:
分布式协作服务:HRegionServer会将自己的心跳信息注册到zookeeper上,让主用HMaster去感知健康状况。
分布式锁机制:保证就存在一个 active状态的 master
事件监听机制:监听主用HMaster状态,出现故障之后,及时通知 备用HMaster
注意:不能抢占
为什么不抢占?
之前是因为出现问题,主用master才不工作
现在恢复了,立刻恢复它的角色

微型数据库角色: -root-表

6.写数据流程是什么?
1)客户端发起一个写请求

2)通过zookeeper会找到 -ROOT-
每个Region的META --> HRegionServer
region start-end HRegion
通过META 查找要写入的Region 所在HRegionServer

3)数据分组
(1)按Region去分组数据
(2)将上述分好的数据,再按 HRegionServer 进行分组

4)将分好组的数据,一起进行发送
客户端发送完写数据请求后,会自动等待请求处理结果。
如果客户端没有捕获到任何的异常,则认为所有数据都已经被写入成功。如果全部写入失败,或者部分写入失败,客户端能够获知详细的失败Key值列表。

5)处理过程 :HRegionServer收到数据之后,按照对于的Region,写入数据
(1)获取Region操作锁:只有当前的操作有写权限
(2)依次获取各行的行锁:在行锁期间,对同一行的数据操作是互斥的–用来保证 更新的原子性
(3)写入到memstore: memstore–>storefile
(4)释放行锁

(5)释放Region操作锁

腾科教育


7.读数据流程是什么?
1)发起请求
客户端发起一个读请求,HBase读流程分为两种:scan和get
scan:范围查找 为了批量扫描限定key值范围内的用户数据
get :精确查找 在提供精确的key值的情形下,读取单行用户数据

scan和get的区别是什么?
如果指定HBase中的行键(rowKey),那就是get请求,是精确查找,get操作是在提供精确的key值的情形下,读取单行用户数据。
如果指定的是编码范围,那就是scan请求,是范围查找,scan操作是为了批量扫描限定key值范围内的用户数据。

首先要解决的问题同写流程,需要查找META表找到对应的HRegionServer和Region
如果提供key值则精确查找,这时候如果是scan就会有一些问题,因为在HFile文件和MemStore中都会存在相应的数据
这时候scan就会启动两个scanner,分别对应MemStore和HFile进行扫描

2)查找META
通过zookeeper寻找到META表所在HRegionServer
(在ZK上存储的内容为某个用户的路由信息<Region里面的信息>在哪张META表的哪个Region上,在哪个HRegionServer上)
通过META表寻找所要读取的Region所在的RegionServer
(META表中记载着各个 User Region信息<rowkey 范围,所在HRegionServer>,存放在HRegionServer上,超过10G也要拆分)
请求发送到该HRegionServer,由其具体处理数据读取

3)查找数据
如果提供key值则精确查找,这时候如果是scan就会有一些问题:
一个Region可能有多个列族,一个列族可能包含有多个HFile文件,同时,还有部分数据存在于memstore中,尚未固化。在寻找到rowkey所对应的HRegionServer中会包含 内存数据Memstore、文件数据HFiles,那么在open scanner的时候就需要分别读取这两块数据,打开对应不同的scanner做查询操作,open scanner的过程会 为memstore,以及各个HFile创建所对应的Scanner
每个Region中有一个RegionScanner,其中包含多个storescanner,每个storeScanner中包含一个memstoreScanner 和 N个 HFileScanner

4)读取数据
每个Scanner都有一个指针,指向接下来要读取的用户数据KeyValue
查找时 首先会定位到HFile或是MemStore,找到get操作的row起始位置
同一级别的Scanner被放在同一个优先级队列中。
通过不断的对比每一个Scanner指针所指向的keyValue,将这些Scanner进行排序
每一次next请求,都是从该优先级队列中选择一个scanner,然后读取该Scanner的当前指针所指向的KeyValue
每读一个Scanner,指针都会往下移一个KeyValue,而后,该Scanner被返还到队列中,如果已经读取完,则直接关闭

5)返回数据
读取数据返回到客户端


腾科教育