HBase

HBase是在HDFS上开发的面向列的分布式数据库,适合的问题空间:在廉价硬件构成的集群上管理超大规模的稀疏表。

概念

hbase中的表由行和列组成。每一个单元格都是有版本的,即时间戳。单元格的内容是未解释的字节数组。每一个单元格都对应一行和一列。表中的行根据主键进行排序,排序根据字节序进行。行中的列分成列族,列族和列族修饰符中间用冒号(:)隔开,列族必须有可打印的字符组成,列族修饰符则可以是任意字节。一个表的列族必须作为表模式定义的一部分预先给出,但新的列族成员可以随后加入。物理上,所有的列族成员都一起存放在文件系统中。调优和存储都是在列族这个层次上进行的。所以最好使所有的列族成员都有相同的“访问模式”和大小特征。简而言之,HBase表和RDBMS中的表类似,单元格有版本,行是排序的,而只要列族预先存在,客户端可以随时把列添加至列族中。

区域(region)是HBase集群分布数据的最小单元。当一个表的大小超过阈值时,便会在某行的边界上把表分成两个大小基本相同的新分区。主控机把父区域设置为离线,并用子区域替换父区域。

加锁:无论对行进行访问的事务涉及多少列,对行的更新都是原子性的(atomic)。

 实现

通常遵循hadoop模型的一些规则,只有在增加特殊功能时才打破hadoop的规则。支持的文件系统:hdfs、本地文件系统、kfs和Amazon S3。

 HBase内部含有名为-Root-和.META.的特殊目录表。他们维护着当前集群上所有区域的列表、状态和位置。-ROOT-表包含.META.表的区域列表,.META.包含所有用户空间区域的列表。(没太明白)

新连接到zookeeper集群上的客户端首先查找-ROOT-的位置。然后客户端通过-ROOT-获取所请求行所在范围所属.META.区域的位置。客户端接着查找.META.区域来获取用户空间区域所在节点及其位置。接着客户端可以直接和管理哪个区域的Regionserver进行交互。

 每次行操作可能要访问三次远程节点。为了节省这些代价,客户端会缓存他们遍历-ROOT-时获取的信息和.META.位置以及用户空间区域的开始行和结束行。

到达Regionserver的写操作首先追加到“提交日志”,然后加入内存中的memstore。如果memstore满,他的内容会被“刷入”(flush)文件系统。提交日志存放在HDFS中,因此即使一个Regionserver崩溃,提交日志仍然可用。如果发现一个Regionserver不能访问——通常是因为服务器的znode在zookeeper中过期了——主控机会根据区域对死掉的Regionserver的提交日志进行分割。在重新分配后,再打开并使用死掉的Regionserver上的区域之前,这些区域会找到刚分割得到的文件,其中包括还没有持久化存储的更新。这些更新会被“replay”是的区域恢复到服务器失败前夕的状态。

读操作:首先查看区域的memsotre,如果有,直接返回结果。否则,依次按照次序从新到旧检查“刷新文件”,直到找到满足查询的版本,或者所有的刷新文件都处理完为止。

修改表的模式只需要把表设为“离线”即可。 

 客户端

HBase简单增删改查不需要使用Map和Reduce,将其作为一般数据库操作就可以了。如果想高效的处理,就需要使用Mapper和Reducer在Hbase中相关的子类,例如TableMapper。

 

AVro REST 和 Thrift

HBase提供了AVro,REST和Thrift接口,用于Java以外的编程语言和HBase。值得注意的是,由于需要代理这些请求和响应工作,所以,使用这些接口比直接使用java客户端要慢。

 

 

 

PS:

字节序:即字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前。

 

 

待续... ...

posted on 2013-05-23 17:37  _Deron_  阅读(325)  评论(0编辑  收藏  举报

导航