【HBase】HBase的RK设计、避免热点

一、HBase的RK设计

HBase读写数据大多数是通过RK,MemStore/HFile存储也是按照字典顺序排列的RK存储,所以要关注RK。

RowKey设计原则:

1)长度原则:

RowKey不应该超过16字节,因为若是过长再以KV形式存储,对于HFile和MemStore来说会极大的占用存储空间。

2)唯一原则:

保证RowKey的唯一性,若向HBase中同一张表插入相同RowKey的数据,则原先存在的数据会被新的数据覆盖

3)排序原则:

RowKey是按照字典序排序的。HBase中的数据永远是根据RowKey的字典排序来排序的。

4)散列原则:

设计的RowKey应均匀的分布在各个HBase节点上。能将 RegionServer的负载均衡,否则容易产生所有新数据都在一个 RegionServer 上堆积的现象。

二、HBase如何避免热点

HBase表的数据是按照RowKey来分散到不同的Region,不合理的RowKey设计会导致热点问题,热点问题是大量的客户端直接访问集群中的一个或极少数的节点,而集群中的其他节点却处于相对空闲的状态,从而影响对HBase的读写性能。

1、加盐

在RK前面加添加固定长度的随机数前缀。可以让数据分散在不同的Regin上。

缺点:增加了读的开销。

2、hash

使用将hash(rk)的全部或者只取hash值的长度前4位+rk组成新的RowKey,这里说的hash包含MD5,sha1,sha256,sha512等算法,并不是仅限于Java的Hash值计算。

缺点:同样不利于读。

3、reverse反转

?

4、时间戳反转

?

字段的选择:

一定取决于你的最大的需求,结合具体的查询条件,高频率的尽可能的放到RK里面,现有如下两列数据以及四种需求,如何设计RowKey?

userid  orderno  skuname skuprice skunum skusum      ordercretime
jepson  0001      西瓜    10       5      50        2019-07-07 12:00:00
jepson  0002      南瓜    10       50     500       2019-07-08 12:00:00

# 需求
1)根据用户查询订单最新记录
where userid=jepson order by ordercretime desc limit 1

2)    
where userid=jepson and (ordercretime>=‘xxx‘ and ordercretime<=‘xxxx‘)

3)根据时间段查询订单记录
where (ordercretime>=‘xxx‘ and ordercretime<=‘xxxx‘)

4)根据用户买了西瓜的订单记录
where userid=jepson and skuname=‘西瓜‘

根据以上原则及其方法和综上所述,RowKey=hash(userid).substring(0, 4)+userid+ (Long.Max_Value - timestamp),但是要注意 (Long.Max_Value - timestamp)要固定长度用0补齐。

例子:

?

最终的rowkey=hash(UserId).substring(0, 4)+UserId+Long.Max_Value - timestamp

调优(region个数):
1个region memstore额外的开销为hbase.hregion.memstore.mslab.chunksize=2m,如果你的一张表有20个region,那么额外开销为40M,一百张表就是100 * 40M = 4G。所以建议小表region个数为1,中表region个数为5,大表为20,1台rs节点的region 是100-200个。

原文地址:https://www.cnblogs.com/huomei/p/12112794.html

时间: 2024-08-01 09:53:32

【HBase】HBase的RK设计、避免热点的相关文章

HBase二级索引的设计

摘要 最近做的一个项目涉及到了多条件的组合查询,数据存储用的是HBase,恰恰HBase对于这种场景的查询特别不给力,一般HBase的查询都是通过RowKey(要把多条件组合查询的字段都拼接在RowKey中显然不太可能),或者全表扫描再结合过滤器筛选出目标数据(太低效),所以通过设计HBase的二级索引来解决这个问题 查询需求 多个查询条件构成多维度的组合查询,需要根据不同组合查询出符合查询条件的数据 HBase的局限性 HBase本身只提供基于行键和全表扫描的查询,而行键索引单一,对于多维度的

(转)HBase 的原理和设计

转自:HBase的原理和设计 HBase架构:

Cassandra与HBase都是被设计用于管理非常大的数据集

在java商城开发中我们都清楚的知道Cassandra与HBase都是NoSQL数据库.总体上看,这意味着用户无法使用SQL数据库.不过,Cassandra使用的是CQL(Cassandra 查询语言),其语法有明显模仿SQL的痕迹.    在jsp商城开发中两者都被设计用于管理非常大的数据集.HBase文件声称一个HBase数据库可以拥有数亿个,甚至是数十亿个行.此外,用户还被建议继续使用关系型数据库.两者都是分布式数据库,不仅仅是在数据的存储方式上,在数据访问方式上亦是如此.客户端可以与集群

HBase应用:Table设计

背景知识 HBase基本类型定义: Table:表 RowKey:行健,主键 Column Family:列族,包含一个或者多个相关列 Column:属于某一个columnfamily,familyName:columnName,每条记录可动态添加 timestamp:每次操作对应的时间戳,支持用户自定义,默认为当前时间的毫秒值 value:值,和timestamp一起支持多version的概念 通过HBase Shell可以拿到一条数据,如下: hbase(main):007:0> scan

奇虎360 HBASE 二级索引的设计与实践

基于RowKey 的索引问题总结 1.索引单一 2.多维度(字段/列)查询困难 多字段分别作为RK,写入多次 组合字段作为RK,设计复杂,不灵活 3.不经过索引的并行scan过滤,大量资源消耗,无时效性可言 总体设计 二级索引构建模式 1)以主数据的列值作为索引数据的RowKey,以主数据的RowKey 作为索引数据的列值,以此来构建指定列作为查询条件的Hbase 二级索引. 2)索引的构建与数据的查询都是分布式.并发式进行的 索引设计 1)索引与主数据存放在同一张表的不同Column Fami

Hbase的存储 Rowkey设计

Hbase在生态系统中的位置 Hbase存储的逻辑视图 Hbase的存储格式 Hbase写数据流程 Hbase快速响应数据 Hbase在生态系统中的位置 HBase位于结构化存储层,Hadoop HDFS为HBase提供了高可靠性的底层存储支持,Hadoop MapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和failover机制. Hbase存储的逻辑视图 1)行键(RowKey) -- 行键是字节数组, 任何字符串都可以作为行键:-- 表中的行

HBase应用开发回顾与总结系列之四:HBase配置管理类接口设计

  利用Eclipse进行HBase应用开发时,至少需要确定三个配置信息,如下表所示: #hbase config #HMaster服务部署主机及端口号 hbase.master=hdp-wuyong:60010 #Zookeeper端口号 hbase.zookeeper.property.clientPort=2181 #Zookeeper服务部署主机信息 hbase.zookeeper.quorum=hdp-songjiang,hdp-lujunyi,hdp-wuyong 我们将以上信息配置

hbase表设计优化原则 ***** 生产环境中使用小结

2019/2/28 星期四 hbase表设计优化原则 https://www.cnblogs.com/qingyunzong/p/8696962.html表设计1.列簇设计 追求的原则是:在合理范围内能尽量少的减少列簇就尽量减少列簇. 最优设计是:将所有相关性很强的 key-value 都放在同一个列簇下,这样既能做到查询效率 最高,也能保持尽可能少的访问不同的磁盘文件. 以用户信息为例,可以将必须的基本信息存放在一个列族,而一些附加的额外信息可以放在 另一列族.2.RowKey 设计 HBas

HBase原理和设计

一篇不错的介绍HBase基本原理的文章,转载自:http://www.sysdb.cn/index.php/2016/01/10/hbase_principle/ ,感谢原作者. 简介 HBase —— Hadoop Database的简称,Google BigTable的另一种开源实现方式,从问世之初,就为了解决用大量廉价的机器高速存取海量数据.实现数据分布式存储提供可靠的方案.从功能上来讲,HBase不折不扣是一个数据库,与我们熟悉的Oracle.MySQL.MSSQL等一样,对外提供数据的