一个典型的Hbase Table 表以下:html
Row Key
是用来检索记录的主键。想要访问HBase Table中的数据,只有如下三种方式:git
Row Key
进行访问;Row Key
能够是任意字符串,存储时数据按照Row Key
的字典序进行排序。这里须要注意如下两点:github
HBase表中的每一个列,都归属于某个列族。列族是表的Schema的一部分,因此列族须要在建立表时进行定义。列族的全部列都以列族名做为前缀,例如courses:history
,courses:math
都属于courses
这个列族。数据库
列限定符,你能够理解为是具体的列名,例如courses:history
,courses:math
都属于courses
这个列族,它们的列限定符分别是history
和math
。须要注意的是列限定符不是表Schema的一部分,你能够在插入数据的过程当中动态建立列。apache
HBase中的列由列族和列限定符组成,它们由:
(冒号)进行分隔,即一个完整的列名应该表述为列族名 :列限定符
。缓存
Cell
是行,列族和列限定符的组合,并包含值和时间戳。你能够等价理解为关系型数据库中由指定行和指定列肯定的一个单元格,但不一样的是HBase中的一个单元格是由多个版本的数据组成的,每一个版本的数据用时间戳进行区分。服务器
HBase 中经过row key
和column
肯定的为一个存储单元称为Cell
。每一个Cell
都保存着同一份数据的多个版本。版本经过时间戳来索引,时间戳的类型是 64位整型,时间戳能够由HBase在数据写入时自动赋值,也能够由客户显式指定。每一个Cell
中,不一样版本的数据按照时间戳倒序排列,即最新的数据排在最前面。数据结构
HBase Table中的全部行按照Row Key
的字典序排列。HBase Tables 经过行键的范围(row key range)被水平切分红多个Region
, 一个Region
包含了在start key 和 end key之间的全部行。架构
每一个表一开始只有一个Region
,随着数据不断增长,Region
会不断增大,当增大到一个阀值的时候,Region
就会等分为两个新的Region
。当Table中的行不断增多,就会有愈来愈多的Region
。负载均衡
Region
是HBase中分布式存储和负载均衡的最小单元。这意味着不一样的Region
能够分布在不一样的Region Server
上。但一个Region
是不会拆分到多个Server上的。
Region Server
运行在HDFS的DataNode上。它具备如下组件:
最近最少使用原则
清除多余的数据。Region Server存取一个子表时,会建立一个Region对象,而后对表的每一个列族建立一个Store
实例,每一个Store
会有 0 个或多个StoreFile
与之对应,每一个StoreFile
则对应一个HFile
,HFile 就是实际存储在HDFS上的文件。
HBase系统遵循Master/Salve架构,由三种不一样类型的组件组成:
Zookeeper
Master
Region Server
HBase使用ZooKeeper做为分布式协调服务来维护集群中的服务器状态。 Zookeeper负责维护可用服务列表,并提供服务故障通知等服务:
更为详细写入流程能够参考:HBase - 数据写入流程解析
如下是客户端首次读写HBase上数据的流程:
META
表所在的Region Server;META
表所在的Region Server,从META
表中查询到访问行键所在的Region Server,以后客户端将缓存这些信息以及META
表的位置;若是再次读取,客户端将从缓存中获取行键所在的Region Server。这样客户端就不须要再次查询META
表,除非Region移动致使缓存失效,这样的话,则将会从新查询并更新缓存。
注:META
表是HBase中一张特殊的表,它保存了全部Region的位置信息,META表本身的位置信息则存储在ZooKeeper上。
更为详细读取数据流程参考:
本篇文章内容主要参考自官方文档和如下两篇博客,图片也主要引用自如下两篇博客:
官方文档:
更多大数据系列文章能够参见我的 GitHub 开源项目: 大数据入门指南