HBase的rowkey设计原则
(1)HBaser如何设计rowkey
(2)你HBase的rowkey为什么这么设计?有什么优缺点?
(3)HBase rowkey设置讲究
HBase中,表会被划分为1…n个Region,被托管在RegionServer中。Region两个重要的属性,StarKey与EndKey表示这个Region维护的rowkey范围,当我们要读/写数据时,如果rowkey落在某个start-end key范围内,那么就会定位到目标region并且读/写到相关的数据。
那怎么快速精准定位到我们想要操作的数据,就在于我们的rowkey的设计了。
设计原则如下:
1、rowkey长度原则
Rowkey是一个二进制码流,Rowkey的长度被很多开发者建议说设计在10~100个字节,不过建议是越短越好,不要超过16个字节。
原因如下:
1)数据的持久化文件HFile中是按照Key Value存储的,如果Rowkey过长比如100个字节,1000万列数据光Rowkey就要占用100*1000万=10亿个字节,将近1G数据,这会极大影响HFile的存储效率;
2)MemStore将缓存部分数据到内存,如果Rowkey字段过长内存的有效利用率会降低,系统将无法缓存更多的数据,这回降低检索效率。因此Rowkey的字节长度越短越好;
3)目前操作系统都是64位系统,内存8字节对齐。控制在16个字节,8字节的整数倍利用操作系统的最佳特性。
2、rowkey散列原则
如果Rowkey是按时间戳的方式递增,不要将时间放在二进制的前面,建议j将Rowkey的高位作为散列字段,由程序循环生成,低位放时间字段,将会提高数据均衡分布在每个Regionserver实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息将产生所有新数据都在一个RegionServer上堆积的热点现象,这样在做数据检索的时候负载将会集中在个别RegionServer,降低查询效率、
3、rowkey唯一原则
必须在设计上保证其唯一性。rowkey是按照字典顺序存储的,因此,设计rowkey的时候要充分利用这个排序的特点,将经常读取的数据存储到这一块,将最近可能会被访问的数据放到一块。