1、读请求过程:
meta表是hbase系统自带的一个表。里面存储了hbase用户表的元信息。
元信息为meta表内记录一行数据是用户表一个region的start key 到endkey的范围。
meta表存储在regionserver里。 具体存储在哪个regionserver里?zookeeper知道。
过程:
1.客户端到zookeeper询问meta表在哪
2.客户端到meta所在的节点(regionserver)读取meta表的数据
3.客户端找到region 获取region和regionserver的对应关系,直接到regionserver读取region数据
查看meta表信息
hbase(main):011:0> scan ‘hbase:meta’
2、写请求过程:
1.Client先访问zookeeper,找到Meta表,并获取Meta表元数据。确定当前将要写入的数据所对应的HRegion和 HRegionServer服务器。
2.Client向该HRegionServer服务器发起写入数据请求。
3.Client先把数据写入到HLog,以防止数据丢失,然后将数据写入到Memstore。
4.Memstore达到阈值,会把Memstore中的数据flush到Storefile中
5.当Storefile越来越多,达到一定数量时,会触发Compact合并操作,将多个小文件合并成一个大文件。
6.Storefile越来越大,Region也会越来越大,达到阈值后,会触发Split操作,变成两个文件。
== 说明:hbasez 支持数据修改(伪修改),实际上是相同rowkey数据的添加。hbase只显示最后一次的添加==
3、Region管理:
region的分配过程
前提:一个region只能分配给一个region server
1.master记录了当前有哪些可用的region server。以及当前哪些region分配给了哪些region server,哪些region还没有分配。
2.当需要分配的新的region,并且有一个region server上有可用空间时,master就给这个region server发送一个装载请求,把region分配给这个region server。
3.region server得到请求后,就开始对此region提供服务。
region server上线
前提:master使用zookeeper来跟踪region server状态。
1.当某个region server启动时,首先在zookeeper上的/hbase/rs目录下建立代表自己的znode。
2.master订阅了/hbase/rs目录上的变更消息,当/hbase/rs目录下的文件出现新增或删除操作时,master可以得到来自zookeeper的实时通知。因此一旦region server上线,master能马上得到消息
region server下线
前提:master使用zookeeper来跟踪region server状态。
1.当region server下线时,它和zookeeper的会话断开。
2.zookeeper而自动释放代表这台server的文件上的独占锁(znode)
3.zookeeper将变化发送给master
4.master 将挂掉的region server的region分配给其它还活着的regionserver
Hmaster的上线
前提:hbase集群中可以设置多个Hmaster,真正对外提供服务的只有一个
1.从zookeeper上获取唯一 一个代表active master的锁,用来阻止其它master成为真正的master。
2.扫描zookeeper上的/hbase/rs节点,获得当前可用的region server列表。
3.master和每个region server通信,获得当前已分配的region和region server的对应关系。 4.master扫描.META.表,计算得到当前还未分配的region,将他们放入待分配region列表。
Hmaster下线后的影响
master只维护表和region的元数据,不参与表数据IO的过程,所以master下线短时间内对整个hbase集群没有影响。表的数据读写还可以正常进行。
无法创建删除表,无法修改表的schema,无法进行region的负载均衡,无法处理region 上下线,无法进行region的 合并(region的split可以正常进行) 当hmaster下线后,启动Zookeeper的选举机制,选出新的Hmaster,新的Hmaster上线,执行上线流程。
4、HBase三个重要机制
1、flush机制
hbase.regionserver.global.memstore.size: 默认;堆大小的40%
regionServer的全局memstore的大小**(多个region),超过该大小会触发flush到磁盘的操作,flush时会阻塞客户端读写。
hbase主要用于海量数据的快速读写。读写的总内存是堆内存的80%,读占用堆内存的40%,写占用堆内存的40%,想提高哪个业务场景的效率,就提高相应的百分比。
hbase.hregion.memstore.flush.size: 默认:128M(单个region里memstore的缓存大小)
hbase.regionserver.optionalcacheflushinterval :默认:1h
集群调优:
hbase.regionserver.global.memstore.size.lower.limit: 默认0.95
hbase.hregion.preclose.flush.size:5M
hbase.hstore.compactionThreshold:默认: 3个
2、compact机制
当flush文件的数量达到3个,把小的storeFile文件合并成大的Storefile文件
3、split机制
当Region达到阈值(默认10G),会把过大的Region一分为二