Hbase的基本概念及交互过程
Hbas是一个在HDFS上实现的面向列的分布式数据库,非常适合实时地随机读/写超大规模数据集
行,列族,列,主键
Hbase中的行类似于数据库中的行,表中的行根据行的键值(也就是表的主键)进行排序,排序根据字节序进行,所有对表的访问都要通过表的主键
行中的列分成”列族”,所有的列族成员有相同的前缀.如company:name,company:address都是列族company的成员,Hbase中为了方便,使用冒号(:)来分隔列族和列族修饰符.一个表的列族必须作为表模式定义的一部分预先给出,但是新的列族成员可以随后按需加入.例如,目标表中有了列族company,那么客户端可以在更新时提供新的列company:logo,服务端会存储它的值.物理上,所有的列族成员都一起存储在文件系统中,所以说,Hbase是一个面向列族的存储器.由于调优和存储都是在列族这个层次上进行的,所以最好使所有的列族成员都有相同的”访问模式”和大小特征.
简而言之,Hbase表和数据库表类似,行是排序的,只要列族预先定义存在, 客户端随时可以把列添加到列族中去.
区域
Hbase把表水平划成区域,每个区域由表中行的子集构成.一开始,一个表只有一个区域,但是随着表的区域开始变大,,等到开始超过设定的大小阙值,便会在某行的边界上分成两个大小基本相同的新分区.在第一次划分之后,所有加载的数据都放在原始分区所在的那台服务器上,随着表的变大,区域的个数开始增加,有些区域也会被放到集群上的其他节点上.区域是Hbase集群上分布数据的最小单位,每个节点都负责管理表中区域的一个子集,在线的所有区域按次序排列就构成了表的所有内容.
锁
无论对行进行访问的事务涉及多少列,对行的更新都是”原子”的,这使得Hbase锁模型能够尽量简单
Hbase实现
Hbase由一个Master节点负责协调管理一个或多个RegionServer从属机.Master负责启动,把区域分配给注册的RegionServer,恢复RegionServer的故障. Master负载很轻. RegionServer负责零个或多个区域的管理以及响应客户端的读写请求, RegionServer还负责区域的划分,并通知Master有了新的子区域Hbase依赖于Zookeeper.如果区域的分配过程中有服务器崩溃,就通过Zookeeper来协调,分配,在Zookeeper分配事务状态有助于在恢复时可以从崩溃遗留的状态开始继续分配.在启动一个客户端到集群上的连接时,客户端必须至少拿到集群所传递的Zookeeper整体的位置.这样,客户端才能访问Zookeeper的层次,了解集群的属性,如服务器的位置.
运行中Hbase
Hbase中保留着-ROOT-和.META.的特殊目录,它们维护着当前集群上所有区域的列表,状态,位置.ROOT表维护着Meta表的信息,Meta表维护着用户表的信息, Meta表中的项使用区域名作为主键,区域名由所属的表名,区域的起始行,创建的时间戳进行哈希后的结果组成.区域变化时,即分裂,禁用/启用.删除,为负载均衡重新部署机器或由于Regionserver崩溃而重新部署区域时,目录表都会相应进行更新,这样,集群上所以区域的信息都能保持是最新的.
客户端的每一个行操作都要访问三次远程节点:
1. 从Zookeeper获取Master的位置
2. 从Master获取.Meta.表的信息
3. 根据.Meta.表的信息,获取region位置信息
为了减少访问远程节点,Hbase客户端会缓存它们遍历ROOT表时获取的信息和Meta表位置以及用户空间的区域的开始行和结束行,这样不用访问Meta表也能得知区域存放的位置.当客户端碰到错误时会再去查看Meta获取区域的新位置,如果.Meta也移动了,就去查询ROOT表