大家好,又见面了,我是你们的朋友全栈君。
HBase RowKey
概述
HBase是一个分布式的、面向列的数据库,它和一般关系型数据库的最大区别是:HBase很适合于存储非结构化的数据,还有就是它基于列的而不是基于行的模式。
既然HBase是采用KeyValue的列存储,那Rowkey就是KeyValue的Key了,表示唯一一行。Rowkey也是一段二进制码流,最大长度为64KB,内容可以由使用的用户自定义。数据加载时,一般也是根据Rowkey的二进制序由小到大进行的。
HBase是根据Rowkey来进行检索的,系统通过找到某个Rowkey (或者某个 Rowkey 范围)所在的Region,然后将查询数据的请求路由到该Region获取数据。HBase的检索支持3种方式:
- 通过单个Rowkey访问,即按照某个Rowkey键值进行get操作,这样获取唯一一条记录;
- 通过Rowkey的range进行scan,即通过设置startRowKey和endRowKey,在这个范围内进行扫描。这样可以按指定的条件获取一批记录;
- 全表扫描,即直接扫描整张表中所有行记录。
HBASE按单个Rowkey检索的效率是很高的,耗时在1毫秒以下,每秒钟可获取1000~2000条记录,不过非key列的查询很慢。
HBase的RowKey设计
设计原则
Rowkey长度原则
Rowkey是一个二进制码流,Rowkey的长度被很多开发者建议说设计在10~100个字节,不过建议是越短越好,不要超过16个字节。
原因如下:
- 数据的持久化文件HFile中是按照KeyValue存储的,如果Rowkey过长比如100个字节,1000万列数据光Rowkey就要占用100*1000万=10亿个字节,将近1G数据,这会极大影响HFile的存储效率;
- MemStore将缓存部分数据到内存,如果Rowkey字段过长内存的有效利用率会降低,系统将无法缓存更多的数据,这会降低检索效率。因此Rowkey的字节长度越短越好。
- 目前操作系统是都是64位系统,内存8字节对齐。控制在16个字节,8字节的整数倍利用操作系统的最佳特性。
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
下面说说为什么hbase等Nosql的查询速度那么快呢?
1,hbase的按列存储的,rowkey是有序排列的,按区划分rowkey的
2,有一部分数据是放在memstore内存中的,读取会快点
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/106059.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...