【三】HBase概述

列式存储。一个表可以有几十亿行,上百万列。

面向列(族)的存储和权限访问,列(族)独立索引。

对于为Null的列不占用存储空间。

数据类型单一,HBase中的数据类型就是字符串类型(string)。

无模式:每行有一个可排序主键和任意多个列,列可以动态添加。同一张表中不同的行可以有截然不同的列。

只有普通的增、删、改、查,没有表之间的关联查询。如果用HBase进行关联查询需要自己写MapReduce,或者用phoenix查询。

HBase的表自带索引,查询效率很高。

术语

主键row key

主要用来检索记录。

访问HBase中的行有三种方式:

1.通过单个row key访问,这样只能查询出一条数据。

2.指定row key的范围来查询,可以查询出多条记录。

3.全表扫描。可以把所有数据都查询出来。

主键为字符串,最大64kb,按字典顺序存储,存储格式为字节数组。

列族column family

列族在创建表的时候声明,一个列族可以包含多个列,一个列只能属于一个列族,列中的数据以二进制形式存在,没有数据类型。

列族就是一些列的集合。

一个列族中所有的列成员有相同的前缀,比如 cf:word,cf:value 都是列族cf下的列。冒号:是列族和列的分隔符。

时间戳和存储单元timestamp and cell

存储单元cell=row+column+version。即是主键、列族、列、时间戳。

每个存储单元都保存着同一个数据的多个版本(修改前、修改后)。

每个cell中,同一个数据的不同版本由时间戳来区别,不同版本的数据按照时间戳倒序存储。

写入数据的时候,时间戳由HBase自动赋值(当前系统时间精确到毫秒的值)。也可以显示赋值。

逻辑模型

【三】HBase概述

物理模型

【三】HBase概述

物理存储

所有表的数据存储在region中。每一个region都由region server管理。

region server维护表和region之间的关系。

每一个列族存储在HDFS上的一个单独的文件夹中。

所以在实际情况下,一个表最好只设计一个列族。跨列族查询数据,会在HDFS中读取两个文件夹下的数据

每个列族会存储它的key和version number。

一张表可以有一个region或者多个region。

最初一张表只有一个region,当region达到一定的大小时会分裂成两个region。分裂的子region会存在父region的引用地址。

每个region包含memstore和storefile。memstore存储在内存中,storefile存储在本地磁盘中。

在region中最开始只有memstore,没有storefile。当memstore达到128兆的时候,就会生成一个storefile文件。

【三】HBase概述

HBase在HDFS上目录介绍

/habse/.tmp 临时目录。当对表进行创建和删除操作的时候,会将表移动到该目录下,然后操作。

/habse/WALs是预写日志文件。region server在处理数据插入和删除的过程中用来记录操作内容的一种日志。

/habse/data 核心目录。存储HBase表的数据。

/habse/data/default 创建表的时候没有指定命名空间,表默认创建在本路下。

/habse/data/habse 系统内部创建的表。里面只有两张表。meta表存储region的详细信息。namespace表存储命名空间。

/hbase/hbase.id 里面存储的是集群的唯一的cluster id。它是由uuid生成的。

/hbase/hbase.version 里面存储的是集群的版本号。

/habse/oldWALs 当WALs中的日志文件没有用之后,会将WALs中的日志文件移动到该目录下。HMaster会进行定期清理。

【三】HBase概述