大数据之Hbase:Hbase中的rowkey以及热点问题
Posted 浊酒南街
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据之Hbase:Hbase中的rowkey以及热点问题相关的知识,希望对你有一定的参考价值。
1、Hbase中的 “热点”问题
我们知道,检索habse的记录首先要通过row key来定位数据行。当大量的client访问hbase集群的一个或少数几个节点,造成少数region server的读/写请求过多、负载过大,而其他region server负载却很小,就造成了“热点”现象。
2、热点产生原因:
有大量连续编号的row key ==> 大量row key相近的记录集中在个别region ==> client检索记录时,对个别region访问过多 ==> 此region所在的主机过载 ==> 热点
3、常见的避免热点的方法:
加盐:
加盐指的是在rowkey的前面增加随机数,具体就是给rowkey分配一个随机前缀以使得它和之前的rowkey的开头不同。给多少个前缀?这个数量应该和我们想要分散数据到不同的region的数量一致(类似hive里面的分桶)。加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,以避免热点。
哈希
哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据。
字符串反转
第三种防止热点的方法是反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。这样可以有效的随机rowkey,但是牺牲了rowkey的有序性。
反转rowkey的例子:以手机号为rowkey,可以将手机号反转后的字符串作为rowkey,从而避免诸如139、158之类的固定号码开头导致的热点问题。
时间戳反转
一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题十分有用,可以用Long.Max_Value - timestamp追加到key的末尾,例如[key][reverse_timestamp] ,[key] 的最新值可以通过scan [key]获得[key]的第一条记录,因为HBase中rowkey是有序的,第一条记录是最后录入的数据。
尽量减少行和列的大小
在HBase中,value永远和它的key一起传输的。当具体的值在系统间传输时,它的rowkey,列名,时间戳也会一起传输。如果你的rowkey和列名很大,HBase storefiles中的索引(有助于随机访问)会占据HBase分配的大量内存,因为具体的值和它的key很大。可以增加block大小使得storefiles索引再更大的时间间隔增加,或者修改表的模式以减小rowkey和列名的大小。压缩也有助于更大的索引。
其他办法
列族名的长度尽可能小,最好是只有一个字符。冗长的属性名虽然可读性好,但是更短的属性名存储在HBase中会更好。也可以在建表时预估数据规模,预留region数量,例如create 'myspace:mytable’, SPLITS => [01,02,03,…99]
4、其他知识补充
1、HBase是采用Key-Value格式来存储数据;
2、hbase的中的rowkey是按照字典序排序的;
3、hbase是通过3个维度来对记录进行快速定位:行健 + (列族+列名) + 时间戳,
即: row key + (column family + qualifier) + timestamp
4、Row key的最大长度为64KB,它是一段二进制码流(byte[ ]),建议控制在16个字节;
5、通过get方式,指定rowkey获取唯一一条记录;
6、通过scan方式,设置起始行和结束行参数进行范围匹配;
7、列族column family,它是column的集合,在创建表的时候就指定,列族的数量越少越好,生产环境中的列族一般是一个到两个;
8、row key的设计原则应当遵循的原则:唯一原则,长度原则,散列原则,
简单理解为rowkey为主键,唯一且不能重复;长度原则最大长度为64KB,建议控制在16个字节,减少内存压力(MemStore将缓存部分数据到内存),降低磁盘压力,提高存储效率(HFile中是按照(Key,Value)存储的);散列原则,如果rowkey按照时间戳的方式递增,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。
以上是关于大数据之Hbase:Hbase中的rowkey以及热点问题的主要内容,如果未能解决你的问题,请参考以下文章