HBase 物理模型 第一节

做ETL,设计HBase有段时间了,虽然还是很不成熟,但是有点小小经验,做个笔记

HBase暂不谈他负载均衡,容灾性能这堆,只说他在应用上的一些小小经验作为第一节

先谈谈rowkey cf cq的设计

keyvalue的结构是

  -------------------------Key--------------------------------------- 
key lengthvalue lengthrow lengthrow

column

family length

column

family

column

Qualifer

time stampkey typevalue

Hbase的存储数据结构是基于B+Tree的LSM tree

所以设计好rowkey cf cq是提高hbase查询速度的关键,尤其是rowkey,因为如果一次匹配只在rowkey就可以前缀匹配出,则将省略了遍历了巨大的cq。

rowkey

在工作中的物理模型,通常现在考虑建立在哪个维度上,因为通常会对这个维度进行操作,如对信息中人这个维度进行建模,就需要将人的唯一标识放在rowkey中(有时维度的标识不会只有一个名词性属性,如地理位置:经度+维度)。

之后需要考虑对于这个物理模型中的通用属性,如时间戳,数据源类型等这种通用属性,也需要拼接在rowkey中,举个例子人id_Long.Max-time_sourceid这样的一个rowkey,就可以在人这个维度上,找到时间段time上执行数据源sourceid的记录了。

cf

对于hbase的cf,个人不太建议使用,首先hbase的cf不是很成熟,在region split和file split的时候,多个cf的效果都不好;而且在设计上,cf的确在理论上可以在一个表建立多个维度,但是多个cf在实际中的优点暂时没有看出来(可能是因为工作局限性所导致)

cq

对于cq,因为是B+Tree的最后一层,而且hbase这个列式存储不对key进行压缩(很可惜,可能不想违背列式存储数据只在最后数据获取才解压的原则),所以首先不建议把cq设计的过长。cq也是支持前缀匹配的,而且因为hbase是列式存储,非结构化得数据,所以cq上可以有value这样的值,在反向索引中,会经常这样设计。

反向索引

hbase是列式存储,所以没有索引这样的东西。但是要是想通过hbase表中列的值,获得rowkey,那么就需要反向索引了,反向索引一般rowkey就是查询内容如手机号值,或查询类型_查询内容,cq为主表rowkey,value可以设置为一些权重,时间戳等附加信息,或是主表rowkey中一些常用信息,如人的姓名,这样就可以减少一次查询

统计

数据挖掘中,关联和统计恐怕是各占半壁江山,比起关联,统计还是比较简单的。

统计是按照新的维度,对现有的信息进行分类,并获得所要的维度属性,如次数,top等等。

比如,从刚刚那个表   rowkey:人id_long.max-time_sourceid 中,获得每天登陆某某网站次数最多的前100人

设计的物理模型为:rowkey:yyyyMMdd_long.max-count_人id     cq:人属性类型 value:   人属性值

在统计时,只需要对人+天这两个维度做分类,同时需要sourceid为某某网站,做求和计算,就可以得出count值,在最后存储时,保存成物理模型的样子就可以了。

下一节的物理模型想谈谈建模

相关推荐