hbase初识

HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协调工具。
一、基础知识

主键:主键是用来检索记录的主键,访问hbase table中的行,只有三种方式

1 通过单个row key访问

2 通过row key的range

3 全表扫描

Row key行键 (Row key)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组。

存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)

注意:

字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。

行的一次读写是原子操作 (不论一次读写多少列)。这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。




列族:列族在创建表的时候声明,一个列族可以包含多个列,列中的数据都是以二进制形式存在,没有数据类型。
注:一个表有多个列族,一个列族可以有0-n个列。


timestamp:HBase中通过row和columns确定的为一个存贮单元称为cell。每个 cell都保存着同一份数据的多个版本。版本通过时间戳来索引。

cell:{row key, column( =<family> + <label>), version} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。

以上是常见的hbase shell的小结,另附一张hbase表的逻辑结构图,加深对row key 、列族、列、cell的理解:


二、物理存储

Table在行的方向上分割为多个HRegion,一个region[startkey,endkey)表示,每个HRegion分散在不同的RegionServer中。

注:为什么hbase查找迅速,一方面它有索引,另一方面它按照字典的顺序进行排序。

Table 在行的方向上分割为多个Hregion。


region按大小分割的,每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,Hregion就会等分会两个新的Hregion。当table中的行不断增多,就会有越来越多的Hregion。注:region的切分是由HRegionServer进行切分的,是由HMaster进行转移的。


 Hregion是Hbase中分布式存储和负载均衡的最小单元(并不是存储的最小单元)。最小单元就表示不同的Hregion可以分布在不同的HRegion server上。但一个Hregion是不会拆分到多个server上的。

HRegion虽然是分布式存储的最小单元,但并不是存储的最小单元。事实上,HRegion由一个或者多个Store组成,每个store保存一个columns family。每个Strore又由一个memStore和0至多个StoreFile组成。如图:StoreFile以HFile格式保存在HDFS上。


三、系统架构


对此图的解释说明:在启动hbase之前,先要启动zk,然后启动hmaster和所有的hregionsever。master和hregionsever都会通过心跳机制向zk发送信息。一旦master宕掉之后,zk会将backup的master切换成active。其中,master可以通过zk间接获得region的信息。


Client

1 包含访问hbase的接口,client维护着一些cache来加快对hbase的访问,比如regione的位置信息(说白了,Client就是一一段操作HBase的java代码,运行着一个main函数,它一开始连接zookeeper,得到映射关系)。

 

Zookeeper

1 保证任何时候,集群中只有一个master,(zookeeper选举机制保证)。

2 存贮所有Region的寻址入口。

3 实时监控Region Server的状态(心跳机制),将Region server的上线和下线(宕机)信息实时通知给Master(master间接从zookeeper得到信息)。

4 存储Hbase的schema,包括有哪些table,每个table有哪些column family。

 

Master

1 为Region server分配region(region的切分是由HRegionServer进行切分的,是由HMaster进行转移的)。

2 负责region server的负载均衡(region转移到其它机器上,就是实现负载均衡)。

3 发现失效的region server并重新分配其上的region(高可靠,它将这些数据从hdfs中恢复)。

4 hdfs上的垃圾文件回收(我们删除一个数据时,不是立刻删除,而是内存refresh时,才删除)。

5 处理schema更新请求(ddl操作)。

 

Region Server

1 Region server维护Master分配给它的region,处理对这些region的IO请求。

2 Region server负责切分在运行过程中变得过大的region。

可以看到,client访问hbase上数据的过程并不需要master参与(寻址访问zookeeper和region server,数据读写访问regione server)master仅仅维护者table和region的元数据信息(列族...),负载很低。

四、HBase中有两张特殊的Table,-ROOT-和.META.(旧)

-ROOT-:记录了.META.表的Region信息,-ROOT-只有一个region

.META. :记录了用户创建的表的Region信息,.META.可以有多个regoin

 Zookeeper中记录了-ROOT-表的location

Client访问用户数据之前需要首先访问zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问。


五、hbase读取数据原理


要访问user表,row key:kr999。

1:连接zk,client可以知道-root-表的信息(存放在哪台机器上)。

2:然后访问-root-表所在的region的机器,可知道.meta.的信息。

3:然后访问.meta.表所在的机器,得到.meta.中的各表的映射信息。

4:然后访问user表所在机器,并把查询信息进行缓存到client(如果出新数据更新,regionServer会将数据汇报给zk,客户端会跟zk进行通信,然后会把缓存的信息进行更新)。