欢迎投稿

今日深度:

HBase RowKey,

HBase RowKey,


HBase RowKey

概述

HBase是一个分布式的、面向列的数据库,它和一般关系型数据库的最大区别是:HBase很适合于存储非结构化的数据,还有就是它基于列的而不是基于行的模式。

既然HBase是采用KeyValue的列存储,那Rowkey就是KeyValue的Key了,表示唯一一行。Rowkey也是一段二进制码流,最大长度为64KB,内容可以由使用的用户自定义。数据加载时,一般也是根据Rowkey的二进制序由小到大进行的。

HBase是根据Rowkey来进行检索的,系统通过找到某个Rowkey (或者某个 Rowkey 范围)所在的Region,然后将查询数据的请求路由到该Region获取数据。HBase的检索支持3种方式:

HBASE按单个Rowkey检索的效率是很高的,耗时在1毫秒以下,每秒钟可获取1000~2000条记录,不过非key列的查询很慢。

HBase的RowKey设计

设计原则

Rowkey长度原则

Rowkey是一个二进制码流,Rowkey的长度被很多开发者建议说设计在10~100个字节,不过建议是越短越好,不要超过16个字节。

原因如下:

Rowkey散列原则

如果Rowkey是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将Rowkey的高位作为散列字段,由程序循环生成,低位放时间字段,这样将提高数据均衡分布在每个Regionserver实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息将产生所有新数据都在一个RegionServer上堆积的热点现象,这样在做数据检索的时候负载将会集中在个别RegionServer,降低查询效率。(原因:在一天中的某个时间点只会访问某个或某几个RegionServer)

Rowkey唯一原则

必须在设计上保证其唯一性。

场景应用

比如根据userID以及时间、业务ID、业务类型作为一个RowKey。

设计RowKey的时候,将userID放在前面,依次为时间、业务ID、业务类型。

为什么将userID放前面,是因为散列均匀,不会形成数据热点。时间的话,可以用long.maxValue-time,为什么这样,因为这样可以按时间倒序访问,符合我们的习惯。其他的两个字段是唯一性的需要以精准定位(可以有可以没有,只要能唯一定位既可以)。


参考资料:
网上资源
备注:
转载请注明出处:http://blog.csdn.net/wsyw126/article/details/73002497
作者:WSYW126

www.htsjk.Com true http://www.htsjk.com/hbase/42447.html NewsArticle HBase RowKey, HBase RowKey 概述 HBase是一个分布式的、面向列的数据库,它和一般关系型数据库的最大区别是:HBase很适合于存储非结构化的数据,还有就是它基于列的而不是基于行的模式。...
相关文章
    暂无相关文章
评论暂时关闭