Hbase中的 “热点”问题

1.热点现象

检索habse的记录首先要通过row key来定位数据行,当大量的client访问hbase集群的一个或少数几个节点,
    造成少数region server的读/写请求过多、负载过大,而其他region server负载却很小,就造成了“热点”现象.

大量访问会使热点region所在的单个主机负载过大,引起性能下降甚至region不可用。

2.产生原因

有大量连续编号的row key  ==>  大量row key相近的记录集中在个别region
==>  client检索记录时,对个别region访问过多  ==>  此region所在的主机过载

==>  热点

3.常见的避免热点的方法

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

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

(3)反转
    第三种防止热点的方法是反转固定长度或者数字格式的rowkey。这样可以使得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数量,例如create 'myspace:mytable’, SPLITS => [01,02,03,,...99]

4.row key的设计原则

(1)rowkey唯一原则

必须在设计上保证其唯一性,rowkey是按照二进制字节数组排序存储的,因此,设计rowkey的时候,要充分利用这个排序的
    特点,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。所以设计rwo key时尽量把体现业务特征的信息、
    业务上有唯一性的信息编进row key。

(2)rowkey长度原则

rowkey是一个二进制码流,可以是任意字符串,最大长度 64kb ,实际应用中一般为10-100byte,以byte[] 形式保存,一般
    设计成定长。建议越短越好,不要超过16个字节,2个原因——

原因1:
    
        数据的持久化文件HFile中是按照(Key,Value)存储的,如果rowkey过长,例如超过100byte,那么1000万行的记录计算,
        仅row key就需占用100*1000万=10亿byte,近1Gb。这样会极大影响HFile的存储效率!

原因2:

MemStore将缓存部分数据到内存,若 rowkey字段过长,内存的有效利用率就会降低,就不能缓存更多的数据,从而降低检索效率。
        目前操作系统都是64位系统,内存8字节对齐,控制在16个字节,8字节的整数倍利用了操作系统的最佳特性。

(3)rowkey散列原则

如果rowkey按照时间戳的方式递增,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,由程序随机生成
    ,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。如果没有散列字段,首字段直
    接是时间信息,所有的数据都会集中在一个RegionServer上,这样在数据检索的时候负载会集中在个别的RegionServer上,
    造成热点问题,会降低查询效率。

HBase热点问题简单总结相关推荐

  1. 最通俗易懂的解释hbase热点问题rowkey设计原则region分区及解决方案

    关于热点问题,我简单陈述容易理解: 我们最开始hbase创建表默认是一个region,而我们所谓的热点问题其实就是对某一个region的过量访问造成的 Hbase当发现一个region存储数据量大于阈 ...

  2. Hbase 热点问题3种解决方案

    Hbase 热点问题3种解决方案 对hbase进行观察总是有个别的regionserver的request个数远大于其他的region server的请求数量,考虑到数据应该由倾斜,查找了一些方案,无 ...

  3. linux里临时设置hbase参数,在centos下配置hbase环境并简单使用hbase shell

    操作系统版本:centos7 jdk版本:jdk-8u151-linux-x64.rpm hbase版本:hbase-1.2.6 以单机模式安装运行 配置centos为静态IP 配置静态ip vi / ...

  4. Hbase热点问题以及避免热点问题的办法

    1.热点现象 检索habse的记录首先要通过row key来定位数据行,当大量的Cient访问Hbase集群的一个或少数几个节点,会造成少数RegionServer的读/写请求过多.负载过大,而其他R ...

  5. hbase热点问题解决(预分区)

    一.出现热点问题原因        1.hbase的中的数据是按照字典序排序的,当大量连续的rowkey集中写在个别的region,各个region之间数据分布不均衡: 2.创建表时没有提前预分区,创 ...

  6. cloudera hbase集群简单思路

    文章copy link:http://cloudera.iteye.com/blog/889468 链接所有者保留所有权! http://www.csdn.net/article/2013-05-10 ...

  7. Hbase单机安装及使用hbase shell进行简单操作

    一,配置环境变量 在etc/prifile中加入java环境变量及hbase环境变量: #set java environment JAVA_HOME=/usr/local/lhc/jdk1.8.0_ ...

  8. Hadoop渐进九:HBase配置及简单应用

    HBase服务器体系架构遵从主从服务器架构:一个HBase Master和若干个HRegion服务器.其中HBase Master服务器负责管理所有的HRegion服务器,而HBase服务器通过Zoo ...

  9. Hbase rowkey设计原则,热点问题

    rowKey的作用 读写数据时通过 RowKey 找到对应的 Region: MemStore 中的数据按 RowKey 字典顺序排序: HFile 中的数据按 RowKey 字典顺序排序. rowk ...

最新文章

  1. 冒泡排序java代码_看动画学算法之:排序冒泡排序
  2. Java中集合删除元素时候关于ConcurrentModificationException的迷惑点
  3. Python学习笔记:进程和线程(起)
  4. 哪种网络访问控制方法最适合?
  5. [记录] --- linux上项目
  6. 【报告分享】2019年用户生命周期运营白皮书(京东尼尔森出品).pdf(附下载链接)
  7. Android之控件与布局,结构知识点,基础完结
  8. 查看表结构索引_索引策略–第1部分–选择正确的表结构
  9. 基于JSP的蛋糕销售系统设计与实现答辩ppt模板
  10. paip.数据库全文检索 attilax总结
  11. ESP32 SIM800L:发送带有传感器读数的文本消息(SMS警报)
  12. 【第三方互联】12、支付宝(Alipay)授权第三方登录
  13. Junit测试多线程与Shutting down ExecutorService ‘applicationTaskExecutor‘
  14. Ubuntu 中文字体美化方案大全 (1): 概述篇
  15. 加油站踩踏式逃亡?电网成大赢家?时代抛弃你的时候,真的一声不吭
  16. idea 上传项目到码云git仓库提交到gitee(完整操作流程)
  17. 单枪匹马的背锅侠,终于不再是一个人的军团了
  18. 月经贴 】 Csharp in depth
  19. 《使用MAVEN+SSM+Ajax+shiro+MySql开发在线商场详解(4)》
  20. 检验科失控原因查找步骤

热门文章

  1. Web API Request Content多次读取
  2. Henry捡钱 Java 动态规划
  3. project子项目之间任务关联_任务关联的类型(Project)
  4. 偏振光相机1——偏振光
  5. Java工程师必备能力有哪些?
  6. 报错与解决 | AttributeError: ‘Series‘ object has no attribute ‘set_value‘
  7. 大厂面试爱问的HashMap死锁问题,看这一篇就够了
  8. Mac环境下百度网盘闪退的解决方法
  9. 深入理解JPEG图像格式Jphide隐写
  10. VirtualBox中安装懒人版macOS Mojave黑苹果系统