逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map (一个key 可以存多个value的版本)。
1.Name Space 命名空间
命名空间,类似于关系型数据库的database概念,每个命名空间下有多个表。HBase两个自带的命名空间,分别是hbase和default,hbase中存放的是HBase内置的表,default表是用户默认使用的命名空间。
一个表可以自由选择是否有命名空间,如果创建表的时候加上了命名空间后,这个表名字以:
2.Table 表
类似于关系型数据库的表概念。不同的是,HBase定义表时只需要声明列族即可(基于列族存储),声明列族的数据属性,比如超时时间(TTL),压缩算法(COMPRESSION)等,都在列族的定义中定义,在建表的时候不需要声明具体的列,列是在插入数据的时候才确定的
这意味着,往HBase写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase能够轻松应对字段变更的场景。
3.Row 行
HBase表中的每行数据都由一个RowKey和多个Column(列)组成。一个行包含了多个列,这些列通过列族来分类,行中的数据所属列族只能从该表所定义的列族中选取,不能定义这个表中不存在的列族,否则报错NoSuchColumnFamilyException。
4.RowKey行键
Rowkey由程序员指定的一串不重复的字符串定义(类似于MySQL的主键),是一行的唯一标识!默认情况下数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索,所以RowKey的设计十分重要。
如果使用了之前已经定义的RowKey,那么会将之前的数据更新掉,比如说你插入了一条数据,RowKey已经存在了,那么新插入的RowKey这行数据会给老的顶掉.
5.Column Family 列族
列族是HBase的最基本的单位
列族是多个列的集合。一个列族可以动态地灵活定义多个列。表的相关属性大部分都定义在列族上,同一个表里的不同列族可以有完全不同的属性配置,但是同一个列族内的所有列都会有相同的属性。
列族存在的意义是HBase会把相同列族的列尽量放在同一台机器上,所以说,如果想让某几个列被放到一起,你就给他们定义相同的列族。
官方建议一张表的列族定义的越少越好,列族太多会极大程度地降低数据库性能,且目前版本Hbase的架构,容易出BUG。
比如说你一个列族下面你可以定义一百万个列,你两个列族一个列族定义50万个列,加起来两个也能定义100万个列.
6.Column Qualifier 列名
列名由两部分组成:
列族名: 列名
比如说 info:name,info:age
info就是列族名字, name 和age 就是列名.
Hbase中的列是可以随意定义的,一个行中的列不限名字、不限数量,只限定列族。因此列必须依赖于列族存在!列的名称前必须带着其所属的列族!
因为HBase中的列全部都是灵活的,可以随便定义的,因此创建表的时候并不需要指定列!列只有在你插入第一条数据的时候才会生成。其他行有没有当前行相同的列是不确定,只有在扫描数据的时候才能得知!
7.TimeStamp 时间戳
用于标识数据的不同版本(version),HBase 会返回你用户版本号最新的那条数据.
时间戳怎么指定?
用户在插入数据的时候,由用户可以自己指定插入的这条数据对应的时间戳,如果没有指定的话,用HBase部署的服务器的当前时间
8.Cell 单元格
一个列中可以存储多个版本的数据。而每个版本就称为一个单元格(Cell)。
Cell由{rowkey, column Family:column Qualifier, time Stamp}确定。
Cell中的数据是没有类型的,全部是字节码形式存贮。
9.Region区域
若干行就可以组成一个区域.Region由一个表的若干行组成!在Region中行的排序按照行键(rowkey)字典排序。
如果你想查询Region A的数据,那么需要给这个Region A区域分配一个RegionSever , 客户端访问RegionSever,RegionSever去查询Region A区域里面的数据.
一个Region只能对应一个Region Server, 一个RegionServer 可以负责N个Region.
Region不能跨RegionSever,且当数据量大的时候,HBase会拆分Region。
Region由RegionServer进程管理。HBase在进行负载均衡的时候,一个Region有可能会从当前RegionServer移动到其他RegionServer上。
Region是基于HDFS的,它的所有数据存取操作都是调用了HDFS的客户端接口来实现的。