Hbase中的“热点”问题-M

1.现象:检索hbase的记录首先要通过rowkey来定位数据行,当大量的client访问hbase集群的一个或少数几个节点,造成少数region server的读写请求过多、负载过大,而其他region server负载却很小,就造成“热点”现象。
2.危害:大量访问会使热点region所在的单个主机负载过大,引起性能下降甚至region不可用。
3.产生原因:有大量连续编号的row key大量row key相近的记录集中在个别region->client检索记录时,对个别region访问过多->此region所在的主机过载->热点
明白了热点原因就可以从row key着手解决,目的就是尽可能的均衡的把每一条记录分散到不同region里去。

一些常见避免热点的方法及其优缺点:

1.加盐

就是在rowkey的前面增加随机数,具体就是给rowkey分配一个随机前缀以使他和之前的rowkey的开头不同。给多少前缀?这个数量应该和我们想要分散数据到不同的region的数量一致(类似hive里面的分桶)。加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,以避免热点。

2.哈希

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

3.反转

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

反转的例子:以手机号rowkey,可以将手机号反转后的字符串作为rowkey,从而避免诸如139、158之类的固定号码开头导致热点问题。

4.时间戳反转

一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题。可以用Long.Max_Value-timestamp追加到key的末尾,例如[key][reverse_timestamp],[key]的最新值可以通过scan[key]获取[key]的第一条记录,因为HBase中rowkey是有序的,第一个记录是最后录入的数据。

5.尽量减少行和列的大小

在HBase中,value永远和它的key一起传输的。当具体的值在系统间传输时,它的rowkey,列名,时间戳也会一起传输。如果你的rowkey和列名很大,HBase storefiles中索引(有助于随机访问)会占据HBase分配的大量内存,因为具体的值和它的key很大,可以增加block大小使得storefiles索引再更大的时间间隔增加,或者修改表的模式以减少rowkey和列名的大小。压缩也有助于更大的索引。

6.其他办法

列族名的长度尽可能小,最好是只有一个字符,冗长的属性名虽然可读性好,但是更短的属性名存储在HBase中会更好,也可以在建表时预估数据规模,预留region数量,eg:create ‘myspace:mytable’,SPLITS=>[01,02,03,99]

由于HBase依赖Hadoop,它配套发布了一个Hadoop.jar文件在它的lib下。该套装jar仅用于独立模式。在分布式模式下,Hadoop版本必须和HBase版本必须和HBase下的版本一致。用你运行的分布式Hadoop版本jar文件替换HBase lib目录下的Hadoop jar文件,以避免版本不匹配的问题。确认替换了集群中所有HBase下的jar文件。Hadoop版本不匹配问题有不同表现,但看起来都像挂掉了。

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值