Hbase Rowkey如何设计

介绍

这篇文章给大家分享的是有关Hbase Rowkey如何设计的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

,,,1,表的属性

,,,(1)最大版本数:通常是3,如果对于更新比较频繁的应用完全可以设置为1,能够快速的淘汰无用数据,对于节省存储空间和提高查询速度有效果。不过这类需求在海量数据领域比较小众。

,,,(2)压缩算法:可以尝试一下最新出炉的时髦算法,相对lzo来说,压缩率接近,压缩效率稍高,解压效率高很多。

,,,(3)inmemory:表在内存中存放,一直会被忽略的属性。如果完全将数据存放在内存中,那么hbase和现在流行的内存数据库memorycached和复述性能差距有多少,尚待实测。

,,,(4)bloomfilter:根据应用来定,看需要精确到rowkey还是列。不过这里需要理解一下原理,bloomfilter的作用是对一个地区下查找记录所在的hfile有用。即如果一个地区下的hfile数量很多,bloomfilter的作用越明显。适合那种压实赶不上冲速度的应用。

,,,2,rowkey

2.1排序问题

数字rowkey的从大到小排序:原生hbase只支持从小到大的排序,这样就对于排行榜一类的查询需求很尴尬。那么采用rowkey=Integer.MAX_VALUE-rowkey的方式将rowkey进行转换,最大的变最小,最小的变最大。在应用层再转回来即可完成排序需求。

2.2热点问题
,,,, hbase中的行是按照rowkey的字典顺序排序的,这种设计优化了扫描操作,可以将相关的行以及会被一起读取的行存取在临近位置,便于扫描。然而糟糕的rowkey设计是热点的源头。热点发生在大量的客户端直接访问集群的一个或极少数个节点(访问可能是读、写或者其他操作)。大量访问会使热点区域所在的单个机器超出自身承受能力,引起性能下降甚至地区不可用,这也会影响同一个RegionServer上的其他地区,由于主机无法服务其他地区的请求。设计良好的数据访问模式以使集群被充分,均衡的利用。

,,,,为了避免写热点,设计rowkey使得不同行在同一个地区,但是在更多数据情况下,数据应该被写入集群的多个地区,而不是一个。

下面是一些常见的避免热点的方法以及它们的优缺点:

加盐
,,,,这里所说的加盐不是密码学中的加盐,而是在rowkey的前面增加随机数,具体就是给rowkey分配一个随机前缀以使得它和之前的rowkey的开头不同。分配的前缀种类数量应该和你想使用数据分散到不同的地区的数量一致。加盐之后的rowkey就会根据随机生成的前缀分散到各个地区上,以避免热点。

哈希
,,,,哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用得到操作准确获取某一个行数据

反转
,,,,第三种防止热点的方法时反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。这样可以有效的随机rowkey,但是牺牲了rowkey的有序性。

,,,,反转rowkey的例子以手机号为rowkey,可以将手机号反转后的字符串作为rowkey,这样的就避免了以手机号那样比较固定开头导致热点问题

时间戳反转
,,,,一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题十分有用,可以用长。Max_Value——时间戳追加到关键的末尾,例如[主要][reverse_timestamp],[主要]的最新值可以通过扫描(例子)获得(例子)的第一条记录,因为HBase中rowkey是有序的,第一条记录是最后录入的数据,比如需要保存一个用户的操作记录,按照操作时间倒序排序,在设计rowkey的时候,可以这样设计(userId反转][长。Max_Value——时间戳),在查询用户的所有操作记录数据的时候,直接指定反转后的userId, startRow是[userId反转][000000000000],stopRow是[userId反转][长。Max_Value -时间戳]如果需要查询某段时间的操作记录,startRow是[用户反转][长。Max_Value——起始时间,stopRow是[userId反转][长。Max_Value——结束时间),rowkey是hbase的键值存储中的关键,通常使用用户要查询的字段作为rowkey,查询结果作为价值。可以通过设计满足几种不同的查询需求。

,,,3,columnfamily

,,,columnfamily尽量少,原因是过多的columnfamily之间会互相影响。

,,,4、列

,,,对于列需要扩展的应用,列可以按普通的方式设计,但是对于列相对固定的应用,最好采用将一行记录封装到一个列中的方式,这样能够节省存储空间。封装的方式推荐protocolbuffer。

Hbase Rowkey如何设计