前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >HBase rowkey设计案例

HBase rowkey设计案例

作者头像
程裕强
发布于 2022-05-06 11:34:13
发布于 2022-05-06 11:34:13
36600
代码可运行
举报
运行总次数:0
代码可运行

hbase所谓的三维有序存储的三维是指:rowkey(行主键),column key(columnFamily+qualifier),timestamp(时间戳)三部分组成的三维有序存储。

rowkey是行的主键,而且hbase只能用个rowkey,或者一个rowkey范围即scan来查找数据。所以 rowkey的设计是至关重要的,关系到你应用层的查询效率。

rowkey是以字典顺序排序的,存储的是字节码。

根据rowkey范围查询的时候,一般是知道startRowkey,如果我们通过scan只传startRowKey : d开头的,那么查询的是所有比d大的都查了,而我们只需要d开头的数据,那就要通过endRowKey来限制。我们可以通过设定endRowKey为:d 开头,后面的根据你的rowkey组合来设定,一般是加比startKey大一位。比如说rowkey设计为:用户ID-日期,那么查某个用户某天的数 据,startKEY为3231-20121212,endKey为:3231+201213,那么你查到的就是用户为3231在20121212这一天 的数据。

需要访问的数据rowkey连续的话,scan到的有用数据比较多,利用率高,能够避免或减少反复内存倒换。

rowkey的设计和数据的分布有很大关系,rowkey设计的时候需要保证数据入库时的并发度,但又不能过于分散。

可枚举属性值较少的属性放在rowkey前面 在rowkey中,需要放入多个属性,这多个属性的先后次序和访问的效率有直接的关系。一个普遍的规则是:数量较少,可控的属性放在rowkey前面(如ServiceType,CPID等);反之放在后面(如url,mxid等)。这样做的原因是可控属性放在前面,对各种不同查询需求的平衡性强一些,反之平衡性较差。

案例1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
201010-http-cp001-s-shanghai-xxx-1
201010-http-cp002-s-shenzhen-xxx-2
201010-rtsp-cp001-s-shanghai-xxx-1
201010-rtsp-cp002-s-shenzhen-xxx-2

ServiceType可枚举,并且数量较少,分为http和rtsp两种,放在前面; 而cpid可能会比较多(假设有5个cp),因此放在后面。 这样的设计能够适应如下两种需求,复杂度都比较小: 1) 查询2010年10月所有cp的http数据。这种需求设置scan的startrow=‘201010-http-’,endrow=‘201010-http-z’,即可。 2) 查询2010年10月cp001的所有协议的数据。这种需求下,根据scan rowkey连续的原则,需要将查询划分成两个scan,分别查询http类型cp001的数据和rtsp类型cp001的数据。

但是,如果将cp放在前面,如下所示,适应性就差一些,如下所示案例2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
201010-cp001-http-s-shanghai-xxx-1
201010-cp002-http-s-shenzhen-xxx-2
201010-cp001-rtsp-s-shanghai-xxx-1
201010-cp002-rtsp-s-shenzhen-xxx-2

1) 查询2010年10月cp001的所有协议的数据。 这种需求下,设置scan的startrow=‘201010-cp001-’,endrow=‘201010-cp001-z’,即可。 2) 查询2010年10月,所有cp的http数据。 这种需求下,根据scan的rowkey连续原则,需要将查询分成cp001-http、cp002-http、cp003-http、cp004-http、cp005-http五个查询进行,相对模型一复杂了一些。

业务访问中权重高的key放在前面

例如URLRecords表的主要用途是用来计算当天的URL访问排名。根据业务需求,需要访问某天的所有URL,因此date是主键,权重更高,放在前面,而URL则放在后面。

构造冗余数据 例如,percontent的数据包含了URL Records的数据,URL Records的数据是冗余存储的,区别在于percontent的URL放在date前面,而URL Records表的URL放在date后面。这就是由于URL在满足不同需求的时候,权重不同,由于URL Records需要的数据量不大,因此采用冗余的机制解决该矛盾。 权衡需求的重要性和系统忍受度选择一种方案 当两种需求有矛盾,但其中一方属于次要需求,并且在系统忍受度范围之内的话,可以舍弃一种方案。优先满足需求更强的一方

时间属性在rowkey中的使用 如果需要经常访问特定时间段的数据,将时间属性放在rowkey中是一个较好的选择。 和利用时间戳来访问特定时间段的数据方法相比,将时间属性放在rowkey中具有可控性,容易将能够同时访问的数据相对集中存放的优点。 时间属性放在rowkey中需要注意数据分布和并发度的问题:hbase数据是按照rowkey排序的,时间属性放在rowkey中容易造成数据总是在末尾写入的情况,这种情况下并发度很差。这种情况可以通过在时间属性前面增加prefix和提前预分region的方法解决。

循环key使用 (1)存在问题 如果rowkey中有时间属性,并且随着时间的增加,rowkey会不断的增大下去的话,会造成region数量不断地增加。如果使用TTL来控制数据的生命周期,一些老的数据就会过期,进而导致老的region数据量会逐渐减少甚至成为空的region。这样一方面region总数在不断增加,另外一方面老的region在不断的成为空的region,而空的region不会自动合并,进而造成过多空的region占用负载和内存消耗的情况。 (2)解决办法 这种情况下,可以使用循环key的方法来解决。思路是根据数据的生命周期设定rowkey的循环周期,当一个周期过去以后,通过时间映射的方法,继续使用老的过期数据的rowkey。 例如,key的格式如下: YY-MM-DD-URL。如果数据的生命周期是一年,则可以使用MM-DD-URL的格式。这样当前一年过去以后,数据已经老化,后一年的数据可以继续写入前一年的位置,使用前一年数据的rowkey。这样可以避免空的region占用资源的情况。

根据hbase的原理,key的周期需要至少比TTL大2* hbase.hregion.majorcompaction(默认24小时)的时间,才能够保证过期的数据能够在key循环回来之前得到完全清理。 按照时间周期进行建表的方式也可以解决空region的问题,和循环key方法相比较,循环key的优点如下:

  • 操作简单,不需要重复建表,系统自动处理

同样,循环key具有如下劣势:

  • 需要使用TTL来老化数据,可能会增加compact负担
  • 需要保证查询操作不会查询到过期数据,否则会影响系统性能。

如果在系统压力不是特别大,需要长期运行,能够控制查询不会查询到过期数据的场景下,建议使用TTL+循环key的方式,否则建议使用按照时间周期进行建表的方式。

通过rowkey设计来控制并发度 在相同业务模式下,不同的rowkey设计系统的并发度不一样。和按天建表的思路类似,通过rowkey控制并发度的原则是激活的region总数适中,每个regionserver的激活Region数大于1,小于(写操作内存/flushsize)为宜。

为了实现这一点,可以将可枚举、数量有限的属性放在rowkey的前面,时间放在后面的方式来提高并发度;通过将大粒度的时间属性(如天、小时等)放在rowkey前面,数量很大的可枚举属性(如电话号码、URL等)放在后面的方法来控制激活的region数。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
HBase设计之rowkey设计
HBase应用场景非常广泛;社区前面有一系列文章。大家可以到社区看看看;张少华同学本篇主要讲HBASE最重要的一个基础知识,rowkey的涉及,非常赞!大力推荐! 社区系列文章: 新数仓系列:HBase关键能力和特性梳理 HBase 和 Cassandra的浅谈 新数仓系列:Hbase周边生态梳理(1) HBase由于其存储和读写高性能,在实时查询中越来越发挥重要的作用,但是由于其属于NOSQL数据库类型,对于关系型数据并不适用。HBase查询只能通过其rowkey来查询(我们可以认为是HBa
大数据和云计算技术
2018/03/30
2.4K0
HBase设计之rowkey设计
HBase的 rowkey 设计原则
hbase所谓的三维有序存储的三维是指:rowkey(行主键),column key(columnFamily+qualifier),timestamp(时间戳)三部分组成的三维有序存储。
程序狗
2021/09/06
9750
HBase的 rowkey 设计原则
Hbase常用命令
** 一般操作: ----- ** hbase(main)> status hbase(main)> version 创建命名空间: namespace指的是一个 表的逻辑分组 ,同一组中的表有类似的用途,相当于关系型数据库中的database。 hbase(main):060:0> create_namespace 'test1' drop_namespace 创建该命名空间的表: hbase(main):061:0> create 'test1:test','f1','f2' crea
shengjk1
2018/10/24
4K0
HBase 学习二(最佳实践).
Rowkey 是行的主键,它是以字典顺序排序的。所以 Rowkey 的设计是至关重要的, 关系到你应用层的查询效率。
JMCui
2021/04/09
5920
大白话彻底讲透 HBase Rowkey 设计和实现!
大家都知道 HBase 由于它存储和读写的高性能,在 OLAP 即时分析中发挥着非常重要的作用,而 RowKey 作为 HBase 的核心知识点,其设计势必会影响到数据在 HBase 中的分布,甚至会影响我们查询的效率,可以说 RowKey 的设计质量关乎了 HBase 的质量。
玄姐谈AGI
2021/02/08
1.7K0
优化 HBase - HBase 的预分区及 rowkey 设计原则与方法
之前在《初识 HBase - HBase 基础知识》中提到过,HBase 的数据物理存储格式为多维稀疏排序 Map, 由 key 及 value 组成:
数人之道
2022/01/18
4.1K0
优化 HBase - HBase 的预分区及 rowkey 设计原则与方法
HBase数据结构与基本语法详解
3 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
星哥玩云
2022/08/17
7470
HBase数据结构与基本语法详解
面试,HBase如何设计rowkey
HBase中的rowkey是按字典顺序排序的,通过rowkey查询可以对千万级的数据实现毫秒级响应。然而,如果rowkey设计不合理的话经常会出现一个很普遍的问题----热点。当大量client的请求(读或者写)只指向集群的一个节点,或者很少量的几个节点时,也就代表产生了热点问题。
数据社
2020/11/24
1.1K0
HBase 常用Shell命令 转
进入hbase shell console $HBASE_HOME/bin/hbase shell 如果有kerberos认证,需要事先使用相应的keytab进行一下认证(使用kinit命令),认证成功之后再使用hbase shell进入可以使用whoami命令可查看当前用户 hbase(main)> whoami 表的管理 1)查看有哪些表 hbase(main)> list
双面人
2019/04/10
1.3K0
大数据入门:Hbase Rowkey设计
在Hadoop技术生态体系当中,Hbase作为分布式数据库而存在,也可以说是业界最早最经典的一个分布式数据库。Hbase的原型来自Google的BigTable,各方面性能优异,这其实得益于Hbase的内部设计。今天的大数据入门分享,我们就来具体讲讲,Hbase Rowkey设计。
成都加米谷大数据
2020/12/25
4120
大数据入门:Hbase Rowkey设计
再谈|Rowkey设计_HBase表设计
HBase的rowkey设计可以说是使用HBase最为重要的事情,直接影响到HBase的性能,常见的RowKey的设计问题及对应访问为:
Spark学习技巧
2019/12/15
1.3K0
HBase RowKey 设计与查询实践
HBase 作为一款分布式的NoSQL数据库,数据的分布根据rowKey range方式来划分,每个Region 存储了一定范围rowKey 的数据, 数据的读写通常情况下需要指定rowKey 来定位到具体的Region 与 RegionServer, 如果大量的请求根据rowKey都打到同一个Region或者很少的Region上,那么这些Region就会形成热点, 无法使用集群特性有效负载均衡。因此,RowKey 的设计在实践中至关重要。
Flink实战剖析
2022/06/10
1.2K0
Hbase 基础 Rowkey CF 架构 概述 预分区及Rowkey设计 学习笔记
HBase类似于数据库的存储层,HBase适用于结构化存储,并且为列式分布式数据库。
大鹅
2020/10/29
1.3K0
OpenTSDB 底层 HBase 的 Rowkey 是如何设计的
OpenTSDB 是基于 HBase 的可扩展、开源时间序列数据库(Time Series Database),可以用于存储监控数据、物联网传感器、金融K线等带有时间的数据。它的特点是能够提供最高毫秒级精度的时间序列数据存储,能够长久保存原始数据并且不失精度。它拥有很强的数据写入能力,支持大并发的数据写入,并且拥有可无限水平扩展的存储容量。目前,阿里云 HBase 产品是直接支持 OpenTSDB 组件的。
smartsi
2019/11/27
2.1K0
HBase RowKey 设计
HBase中 RowKey 用来唯一标识一行记录。在 HBase 中检索数据有以下三种方式:
smartsi
2019/11/26
1.8K0
HBase的rowKey设计技巧
HBase是三维有序存储的,通过rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度可以对HBase中的数据进行快速定位。
大数据梦想家
2021/01/26
9360
大数据查询——HBase读写设计与实践
作者 | 汪婷编辑 | Vincent导语:本文介绍的项目主要解决 check 和 opinion2 张历史数据表(历史数据是指当业务发生过程中的完整中间流程和结果数据)的在线查询。原实现基于 Oracle 提供存储查询服务,随着数据量的不断增加,在写入和读取过程中面临性能问题,且历史数据仅供业务查询参考,并不影响实际流程,从系统结构上来说,放在业务链条上游比较重。该项目将其置于下游数据处理 Hadoop 分布式平台来实现此需求。 背景介绍 本项目主要解决 check 和 opinion2 张历史数据表
Spark学习技巧
2018/01/31
1.4K0
大数据查询——HBase读写设计与实践
HBase RowKey与索引设计 |「Hbase2.0常见问题性优化小总结续集」
hbase的内部使用KeyValue的形式存储,其key时rowKey:family:column:logTime,value是其存储的内容。
大数据真好玩
2021/11/05
1.8K0
HBase RowKey与索引设计 |「Hbase2.0常见问题性优化小总结续集」
设计HBase RowKey需要注意的二三事
这对Scan操作非常友好,因为RowKey相近的行总是存储在相近的位置,顺序读的效率比随机读要高。
王知无-import_bigdata
2020/04/01
1.5K0
HBase快速入门系列(9) | HBase优化
  在HBase中Hmaster负责监控RegionServer的生命周期,均衡RegionServer的负载,如果Hmaster挂掉了,那么整个HBase集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。所以HBase支持对Hmaster的高可用配置。
不温卜火
2020/10/28
6990
HBase快速入门系列(9) | HBase优化
相关推荐
HBase设计之rowkey设计
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档