HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表。
一.HBase基础
1.数据模型相关概念
1.表:由行和列组成,列划分为若干个列族。
2.行:每个HBase表由若干行组成,每个行由行键来标识。
3.列族:基本的访问控制单元,在创建时就定义好,数量不宜太多。
4.列限定符:列族离的数据通过列限定符来定位。
5.单元格:在HBase表中,通过行、列族和列限定符确定一个单元格。每个单元格可以保存一个数据的多个版本,每个版本对应一个不同的时间戳。
6.时间戳:每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引。
2.数据坐标
在图4-2中,由行键"201505003"、列族"info"、列限定符"email"和时间戳"1174184620720"这四个坐标值确定的单元格["201505003","info","email",1174184620720],里面存储的值是"you@163.com"。前者相当于一个键,后者相当于一个值。
3. HBase的实现原理
3.1HBase的功能组件
HBase的实现包括3个主要的功能组件:库函数,链接到每个客户端;一个Master主服务器,许多个Region服务器。Region服务器负责存储和维护分配给自己的Region,处理来自客户端的读写请求。主服务器Master负责管理和维护HBase表的分区信息。
客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据。特别地,HBase客户端并不直接依赖于Master、而是借助于ZooKeeper来获得Region的位置信息的。
3.2 表和Region
当表中的行的数量非常大时,无法存储在一台机器上,需要分布存储到多台机器上。需要根据行键的值对表中的行进行分区,每个行区间构成一个分区,被称为"Region",包含了位于某个值域区间内的所有数据,它是负载均衡和数据分发的基本单位。
Master主服务器会把不同的Region分配到不同的Region服务器上。每个Region服务器负责管理一个Region集合,通常在每个Region服务器上,会放置10~1000个Region。
3.3Region的定位
每个Region标识符,就可以唯一标识每个Region,一个Region标识符就可以表示成"表名+开始主键+RegionId"。
客户端访问用户数据之前,需要首先访问ZooKeeper,获取-ROOT-表的位置信息,然后访问-ROOT-表,获得.META表的信息,接着访问.META.表,找到所需的Region具体位于哪个Region服务器。最后才会到该Region服务器读取数据。
4.HBase运行机制
4.1HBase系统架构
ZooKeeper服务器:每个Region服务器都需要到ZooKeeper中进行注册,ZooKeeper会实时监控每个Region服务器的状态并通知给Master,这样,Master就可以通过ZooKeeper随时感知到各个Region服务器的工作状态。ZooKeeper还会选举一个Master作为集群的总管,并保证在任何时刻总有唯一一个Master在运行,避免单点问题。
Master:主服务器主要进行维护表和Region的元数据信息,负载很低。
4.2 Region服务器的工作原理
Region服务器内部管理了一系列Region对象和一个HLog文件,其中,HLog是磁盘上面的记录文件,它记录着所有的更新操作。每个Region对象又是由多个Store组成的,每个Store对应了表中的一个列族的存储。每个Store又包含了一个MemStore和若干个StoreFile,其中,MemStore是在内存中的缓存,保存最近更新的数据,StoreFile在底层的实现方式就是HDFS文件系统的HFile,HFile的数据块通常采用压缩方式存储,压缩之后可以大大减少网络I/O和磁盘I/O。
4.3 Store工作原理
每个Store对应表中的一个列族的存储。每个Store包含一个MemStore缓存和若干个StoreFile文件。MemStore缓存满时,就会刷新到磁盘中的一个StoreFile文件中。当StoreFile数量达到设定数量就会合并成一个StoreFile文件,当文件大小到达一定阈值就会触发文件分裂。
4.4 HLog的工作原理
如果一个Region服务器发生故障,ZooKeeper会通知Master。Master首先会处理该故障Region服务器上面的遗留的HLog文件,由于一个Region服务器上面可能会维护着多个Region对象。系统会根据每条日志记录所属的Region对象对HLog数据进行拆分,分别方法哦相应Region对象的目录下,然后再将失效的Region重新分配到可用的Region服务器中,并把与该Region对象相关的HLog的HLog日志记录也发送给相应的Region服务器(重新拆分HLog并发送到新的Region服务器)
二.HBase常见的shell指令
1.create:创建表
1.创建表school,创建多个列族
2.创建表class,列族为classinfo,版本为5.
3.创建表 t2,将表依据分割算法HexStringSplit分布在15个Region里。
4. 创建表t1,指定切分点。
2.list:列出HBase中所有表的信息
3.put:向表、行、列指定的单元格添加数据
向表class中添加行u20160101,列classinfo:classname,添加数据class 1,时间戳为1421822284898.
4.get:通过指定表名、行、列、时间戳、时间范围和版本号来获得相应单元格的值
获取表class,行u20160101,列classinfo:classname的值
获取表class,行u20160102,列为classinfo:classname,时间范围在[1544876029000,1544876029900]的数据
5.scan:浏览表的相关信息
可以通过TIMERANGE、FILTER、LIMIT、STARTROW、STOPROW、TIMESTAMP、MAXLENGTH、COLUMNS、CACHE来限定所需要浏览的数据。
6.alter:修改列族模式
向表class添加列族classmanager。并对列族classmanager添加数据
删除表class中的列族classmanager,并用scan命令检查,下图所示,删除命令与添加列族命令相似,只是多了一个METHOD属性,删除之后,通过scan命令可知classmanager列族不存在。
7.count:统计表中的行数
命令:count 表名
8.describe:显示表的信息
describe 表名
9. disable:使表失效 ,失效之后表存在,但是无法对表进行查询 exists:判断表是否存在 enable:使表有效
10.delete:删除单元格数据
11.drop:删除表
注意:删除表之前需要将表失效,否则无法删除