HBase HFile与前缀压缩内部实现全解keyvalue格式

  

1。引子

HFile(基地)是HBase使用的一种文件存储格式的抽象,

目前存在两种版本的HFile: HFileV1和HFileV2

HBase0.92之前的版本仅支持HFileV1,

HBase0.92/0.94同时支持HFileV1和HFileV2。

以下分别是HFileV1/V2的结构图:

HFileV1

HFileV2

图中的数据块(Datablock)正是实际存放应用数据的地方,

每个数据块又由一系列的KeyValue组成,并且这些KeyValue之间是关键升按序排列的,

本文将说明KeyValue到底是什么以及当KeyValue越来越多时出现大量类似的数据有哪些算法能减少重复?

假设需要将用户的基本信息以及正在参与的开源项目的有关信息存入HBase:

Java代码 <李>

用户基本信息参与的开源项目

<李>

- - - - - - - - - - - - - - - - - -

<李>

用户Id职业性别tomcathbase

<李>

- - - - - - - - - - - - - - - - - -

<李>

zhh3009码农男提补丁打酱油提补丁打酱油

<李>

用户Id职业性别tomcatant

<李>

- - - - - - - - - - - - - - - - - -

<李>

jdd1999码神男创始人创始人

<李>

- - - - - - - - - - - - - - - - - - -

<李>

用户基本信息参与的开源项目   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   用户Id职业性别tomcat hbase   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   zhh3009码农男提补丁打酱油提补丁打酱油   用户Id职业性别tomcat ant   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   jdd1999码神男创始人创始人   ---------------------------------------------------------   表1.1

从这个例子来看,用户的基本信息比较好确定,但是参与的开源项目不确定且在开源项目中扮演的角色也不确定,

所以用关系数据库不太好建表,因为不知道具体有多少列,也无法把相关的列归成一个组。

1.1列族

HBase是一种基于列的数据库,相关的列可以归到一个列族(ColumnFamily)

每个列族中具体有哪些列不必事先知道,可以在需要的时候添加,比如在用户基本信息中为zhh3009加入电子邮件这样的列,

上例中“用户基本信息”和“参与的开源项目”可以作为两个列族,

不同的列族在HBase内部通常对应一个目录,这样不同的列值只会放到它所属的列族目录下。

1.2 rowKey

我们希望通过查询某个列就能把同一个列族或多个列族中的信息取出来,用户Id就是这样的列,

比如当我们要查询zhh3009的邮箱和参与的开源项目时,根据用户Id来查就不会查到jdd1999的信息,

在HBase中称这样的列为rowKey。

HBase是如何存放上例中的信息呢?

将用户身份证这一列抽出来作为rowKey,把上面的信息按如下格式扁平化:

Java代码 & lt; rowKey,列族名称,列名=比;列值比;   —————————————————–   & lt; zhh3009用户基本信息,职业=比;码农比;   & lt; zhh3009用户基本信息,性别=比;男比;   & lt; zhh3009参与的开源项目,tomcat=比;提补丁打酱油比;   & lt; zhh3009参与的开源项目,hbase=比;提补丁打酱油比;      & lt; jdd1999用户基本信息,职业=比;码神比;   & lt; jdd1999用户基本信息,性别=比;男比;   & lt; jdd1999参与的开源项目,tomcat=比;创始人比;   & lt; jdd1999参与的开源项目,蚂蚁=比;创始人比;   —————————————————–   表1.2 ,lt; rowKey,列族名称,列名=,gt;列值和gt;   -----------------------------------------------------   ,lt; zhh3009用户基本信息,职业=,gt;码农,gt;   ,lt; zhh3009用户基本信息,性别=,gt;男,gt;   ,lt; zhh3009参与的开源项目,tomcat=, gt;提补丁打酱油和gt;   ,lt; zhh3009参与的开源项目,hbase=, gt;提补丁打酱油和gt;   ,lt; jdd1999用户基本信息,职业=,gt;码神和gt;   ,lt; jdd1999用户基本信息,性别=,gt;男,gt;   ,lt; jdd1999参与的开源项目,tomcat=, gt;创始人,gt;   ,lt; jdd1999参与的开源项目,蚂蚁=,gt;创始人,gt;   -----------------------------------------------------   表1.2

表1.2中的每一行在HBase中对应一个KeyValue,

=祝辞;“左边的是KeyValue中的“关键”,“=祝辞”右边对应KeyValue中的“价值”。

HBase HFile与前缀压缩内部实现全解keyvalue格式