源码先锋

源码先锋

面试官:Hbase表是如何存储数据的?

admin 172 128

本文想用最通俗易懂的话来描述一下Hbase的表是如何存储数据的。

Hbase表结构如下图所示:

Hbase涉及的数据模型有7个概念,具体包括:

1、NameSpace

命名空间,类似于mysql等关系型数据库的database的概念,可按需求创建命名空间,每个命名空间下可创建多张表。

Hbase默认有两个命名空间,一个是Hbase,用于存储Hbase内置的表,这点和mysql、ES等一样,数据库自身的信息也是以库表的形式存起来的;

另一个是default,是用户默认使用的命名空间。

2、列簇(ColumenFamily)

Hbase把表中的列又向上抽象出一层,可以把意义或其他特征一致的列划归为一个列簇,比如上图中关于人信息的列name、city和phone是一个列簇,叫personal_info列簇。

把办公室信息相关的列tel与address划归为一个列簇。

之所以这么分,之所以出现列簇这个概念,是因为未来如果这个表可以按照列簇进行存储,不同列簇是可以存在不同的文件,不同的数据库节点上的,这能才能使Hbase的表支持无限多个列。

3、Region

这么设计,使得Hbase可以动态、按需的修改表中的字段,更适合字段频繁变更的业务场景。设计表时,只需要确认好有哪些列簇即可。

Region实际上就是表的横向切片,这个描述非常准确。

Hbase之所以可可支持百亿行x百万列的数据,就是因为当表的记录数变的巨大之后,Hbase会将表进行横向切分,形成新的Region。

4、列(Column)

在mysql中,一个列用这个列的名称就能指定,比如name列,age列。而Hbase的每个列都由列簇和列名称才能共同确定,比如person:name列,person:age列。

5、TimeStamp

用于标识数据的不同版本,每条数据写入时,如果用户不指定时间戳,系统会为其自动加上该字段,值为写入Hbase的时间。

6、Cell

Cell其实就是一条记录中某个字段的值,全部是由字节码形式存储。

那么这个Cell如何确定?

在mysql等关系数据库中,只要知道这个记录的rowkey(记录ID)以及列名(字段名)就可以了。

但在Hbase中,除了需要知道rowkey,列名,还需要知道列簇和时间戳,才能完全确定这个Cell。

比如上图汇总的张三,需要知道主键row_key1,列簇personal_info,列名name,以及时间戳,才能确定。

之所以需要时间戳,是因为Hbase是可以保存字段值的历史记录的,只有字段对应的时间戳值是最新的那条记录,才是这个字段目前真正的值。