命名空间是类似于关系数据库系统中的数据库的概念,他其实是表的逻辑分组。这种抽象为多租户相关功能奠定了基础。
命名空间包含以下四点
(1) 配额管理- 限制命名空间可以使用的资源量(即区域,表)。
(2) 权限管理 - 为租户提供另一级别的安全管理。
(3) RS逻辑组 - 可以将命名空间/表固定到RegionServers的子集上,从而保证粗略的隔离级别
(4) 表 - 命名空间中在模式定义时预先声明表。默认在default空间
命名空间是可以管理维护的,可以创建,删除或更改命名空间。
创建一个命名空间 | create_namespace 'my_ns' |
创建表的时候指定一个命名空间 | create 'my_ns:my_table', 'fam' |
删除一个命名空间 | drop_namespace 'my_ns' |
修改一个命名空间 | alter_namespace 'my_ns', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'} |
HBase有两个特殊预定义的命名空间:
传统数据库一个表的结构如下:
姓名 | 年龄 | 性别 | 成绩 |
---|---|---|---|
liujinghui | 18 | strong man | 100 |
zhangsan | 99 | Niangs | -1 |
转换成HBase数据库的表结构就如下所示
Info | Score | ||||
Row_key | Info:name | Info:age | Info:sex | Score:name | Score:score |
//========创建表和列族========//
2.3.3 :016 > create 'School','Info','Score'
Created table School
Took 0.8136 seconds
//========创建列族中的列和数据======//
2.3.3 :019 > put 'School','001','Info:name','liujinghui'
Took 0.1916 seconds
2.3.3 :020 > put 'School','001','Info:age','18'
Took 0.0048 seconds
2.3.3 :021 > put 'School','001','Info:sex','strong man'
Took 0.0067 seconds
2.3.3 :022 > put 'School','001','Score:name','liujinghui'
Took 0.0057 seconds
2.3.3 :023 > put 'School','001','Score:score','100'
Took 0.0042 seconds
2.3.3 :024 > put 'School','002','Info:name','zhangsan'
Took 0.0111 seconds
2.3.3 :025 > put 'School','002','Info:age','99'
Took 0.0043 seconds
2.3.3 :026 > put 'School','002','Info:sex','Niangs'
Took 0.0058 seconds
2.3.3 :027 > put 'School','002','Score:name','zhangsan'
Took 0.0024 seconds
2.3.3 :028 > put 'School','002','Score:score','-1'
Took 0.0047 seconds
列族:HBASE表中的每个列,都归属于某个列族。列族是表的schema的一部 分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如 courses:history,courses:math都属于courses 这个列族。
RowKey是记录的主键,访问一个行只有三种方式
RowKey行键 (RowKey)可以是任意字符串(最大长度是64KB,实际应用中长度一般为 10-100bytes),在HBASE内部,RowKey保存为字节数组。存储时,数据按照RowKey的字典序(byte order)排序存储。设计RowKey时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)
由 rowkey, column Family:columu, version 他们三个参数确定唯一一个Cell
cell中的数据是没有类型的,全部是字节码形式存贮。
注意score只显示最新的
HBase中的cell 是按版本来存储的,每个cell都有各种版本的数据,所以当update一个cell中的数据的时候,其实是网cell的末尾追加一个版本的数据,而update之前的数据依然是存在的,这和insert一个新的数据没有任何的区别,每个family都可以设置每个cell要保留的版本数量,默认是3,由VERSIONS决定。 当使用get或者scan命令查看数据时候,如果没有指定版本数则默认是只取到每个cell最新的版本的数据,如果指定了VERSIONS则显示其指定的版本数量的数据。
HBASE 中通过rowkey和columns确定的为一个存贮单元称为cell。每个 cell都保存 着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由HBASE(在数据写入时自动 )赋值,此时时间戳是精确到毫秒 的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版 本冲突,就必须自己生成具有唯一性的时间戳。每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,HBASE提供 了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段 时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。