提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
1.Hbase简介
Hbase基于 Google的BigTable论⽂⽽来,是⼀个分布式海量列式⾮关系型数据库系统,可以提供超⼤规模数据集的实时随机读写。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Hbase的特点
海量存储:底层基于HDFS存储海量数据
列示存储:Hbase表的数据是基于列族进行存储的,一个列族包含若干列。
极易扩展:底层依赖HDFS,当磁盘空间不足的时候,动态增加namenode就可以。
高并发:支持高并发的读写请求
稀疏:稀疏主要针对Hbase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,不会占用内存资源。
数据的多版本:Hbase表中的数据可以有多个版本值,默认情况下,根据版本号去区分。
数据类型单一:所有的数据在Hbase中是以字节数组进行存储的。
1.hbase整体架构
Zookeeper
(1)保存了Hbase的元数据信息,是所有Hbase表得寻址入口。
(2)对Hmaster和RegionServer实现了监控
HMaster
(1)为HRegionServer分配Region,维护整个集群的负载均衡。
(2)维护集群的元数据信息
(3)发现失效的Region,并将失效的Region分配到正常的HRegionServer上。
HRegionServer
(1)负责管理Region
(2)接收客户端的读写数据请求
切分运行过程中变大的Region
Region
(1)每个HRegion由多个Store构成
(2)每个Store保存一个列族,表中有几个列族,则有几个Store。
(3)每个Store由一个MemStore和多个StoreFile组成,MemStore是Store在内存中的内容,写到文件后就是StoreFile。
二、Hbase原理深入
1.Hbase读数据
1)首先,从zk找到meta表的region位置,然后读取meta表中的数据,meta表中存储了用户表的region信息。
2)根据要查询的namespace,表名和rowkey信息。找到写入数据对应的region信息。
3)找到这个region对应的regionServer,然后发送请求。
4) 查找对应的region
5) 先从memstore查找数据,如果没有再从BlockCache上读取。
6)如果BlockCache中也没有找到,再到StoreFile上进行读取。需要注意的是从storeFile中读取数据之后,不是直接把结果数据返回给客户端,而是把数据先写入到BlockCache中,目的是为了加快后续的查询,然后再返回给客户端。
2.Hbase写操作
1)首先从zk找到meta表的region位置,然后读取表中的数据,meta表中存储了用户表的region信息。
2)根据namespace,表名和rowkey信息,找到写入数据对应的region信息。
3)找到region对应的regionServer,然后发送请求。
4)把数据分别写到HLog和memstore各一份。
5)memstore达到阙值后把数据刷到磁盘,生成storeFile文件。
6)删除Hlog中的历史数据。
3.Hbase的flush及compact(合并机制)
Flush机制
(1)当memstore的⼤⼩超过这个值的时候,会flush到磁盘,默认为128M
(2)当memstore中的数据时间超过1⼩时,会flush到磁盘
(3)HregionServer的全局memstore的⼤⼩,超过该⼤⼩会触发flush到磁盘的操作,默认是堆⼤⼩的40%
(4)⼿动flush
阻塞机制
Hbase中是周期性的检查是否满⾜以上标准满⾜则进⾏刷写,但是如果在下次检查到来之前,数据疯狂写⼊Memstore中,则会出现阻塞,数据不在写入。
Compact合并机制
(1)minor compact ⼩合并
在将Store中多个HFile(StoreFile)合并为⼀个HFile这个过程中,删除和更新的数据仅仅只是做了标记,并没有物理移除,这种合并的触发频率很⾼。
(2)major compact ⼤合并
合并Store中所有的HFile为⼀个HFile这个过程有删除标记的数据会被真正移除,同时超过单元格maxVersion的版本记录也会被删除。合并频率⽐较低,默认7天执⾏⼀次,并且性能消耗⾮常⼤,建议⽣产关闭(设置为0),在应⽤空闲时间⼿动触发。⼀般可以是⼿动控制进⾏合并,防⽌出现在业务⾼峰期。
Region 拆分机制
Region中存储的是⼤量的rowkey数据 ,当Region中的数据条数过多的时候,直接影响查询效率.当Region过⼤的时候.HBase会拆分Region , 这也是Hbase的⼀个优点 .
当⼀个table刚被创建的时候,Hbase默认的分配⼀个region给table。也就是说这个时候,所有的读写请求都会访问到同⼀个regionServer的同⼀个region中,这个时候就达不到负载均衡的效果了,集群中的其他regionServer就可能会处于⽐较空闲的状态。解决这个问题可以⽤pre-splitting,在创建table的时候就配置好,⽣成多个region。
增加数据读写效率
负载均衡,防⽌数据倾斜
⽅便集群容灾调度region每⼀个region维护着startRow与endRowKey,如果加⼊的数据符合某个region维护的rowKey范围,则该数据交给这个region维护。
region合并机制
通过Merge类冷合并Region
(1)需要先关闭hbase集群
(2)通过org.apache.hadoop.hbase.util.Merge类来实现,不需要进⼊hbase shell,直接执⾏
通过online_merge热合并Region
不需要关闭hbase集群,在线进⾏合并
与冷合并不同的是,online_merge的传参是Region的hash值,⽽Region的hash值就是Region名称的最后那段在两个.之间的字符串部分。