HBase是一个查询极其快速的非关系型数据库,它在实时读写和实时访问上有着巨大的优势,并且非常灵活。

先来看下面这幅图:

HBase 数据写成静态的文件 hbase如何存储数据_时间戳

这是一个HBase表的存储结构模型,其中有4个字段。分别为Rowkey(主键)、Time Stamp(时间戳)、CF(列族)、CF:xx(列)。这看上去是一个数据表,但是对于HBase而言,这只是一行数据。看到这大家可能会比较迷惑,这明明就是数据表嘛,我用了这么多年excel,你可别骗我。

为了方便理解,我们先来举个例子,请看下面这幅图:

HBase 数据写成静态的文件 hbase如何存储数据_数据_02

这是一个普通的数据表,名为legens。其中有5列数据,分别为id、名字,出生日期,外号和出生地。有些小伙伴看到表里的内容应该会很熟悉,但是这并不是重点。假如,现在有些人不止1个外号了。有些人有2个甚至3个外号,这时如果要将数据存入数据表,则需要修改表结构,修改结果如下:

HBase 数据写成静态的文件 hbase如何存储数据_HBase 数据写成静态的文件_03

如果接下来还有别的字段要添加,比如性别等。那么这个表结构还需要修改。因此在统计结构不严谨的数据的时候,普通的关系型存储结构并不好用。那么如果使用HBase的话,如何存这些数据呢?请看下图:

HBase 数据写成静态的文件 hbase如何存储数据_时间戳_04

这就代表着一行数据,和普通的数据表类似但又不完全像,接下来小鸟就按照前面的过程来讲解。

首先,rowkey是主键,它决定一行数据。rowkey在生成的时候就会排好序,排序规则按照字典顺序。所谓字典顺序就是ABCD、1234。Rowkey只能存储64k的字节数据,如果太长则影响性能。

Timestamp是时间戳,每插入一次数据都会有一个时间戳,其作用是标识本次加入的数据,起到一个版本的作用,HBase在插入数据的时候默认版本号就是时间戳。这个字段可以自己修改定义,但是一般都采用默认的时间戳。

通常获取数据就是获取时间戳最近的一条数据。假如现在加入一条数据。Cf1:name=劫。那此时如果获取rowkey为1的一行下,cf1为name的数据时,获取到的就是劫而非亚索。

因为此时劫是新加入的,HBase在做数据更新的时候就是利用新数据来覆盖旧数据的。

Cf是列族,全称是Colunm Family。HBase表中的每个列都属于一个列族。列族必须作为表模式事先定义完毕。例如create ‘legens’ ‘cf1’ ‘cf2’ ‘cf3’……。一个列族下的所有数据都存于一个目录下,由几个文件保存。

除此之外,权限控制、存储和调优都是在列族层做处理的,因为表在建模的时候并不会考虑有多少列。

列族一般不轻易修改。

name、born、alias等都是列,列名以列作为前缀。例如cf1:name。一个列族有多个列成员,上述cf1就有name、born、alias1、alias2、alias3。并且列在后续可以按需求增加。加入现在要在cf1中加入height,则直接添加cf1:height=xxx。

确定一个列的某个属性的值需要四个值来确定,分别是rowkey、列族、列名、和timestamp。

最后要说明的是,HBase中存储的数据是没有类型的,全部都是以字节码的形式存储。