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

面试,HBase如何设计rowkey

作者头像
数据社
发布于 2020-11-24 06:16:12
发布于 2020-11-24 06:16:12
1.1K00
代码可运行
举报
文章被收录于专栏:数据社数据社
运行总次数:0
代码可运行

HBase中的rowkey是按字典顺序排序的,通过rowkey查询可以对千万级的数据实现毫秒级响应。然而,如果rowkey设计不合理的话经常会出现一个很普遍的问题----热点。当大量client的请求(读或者写)只指向集群的一个节点,或者很少量的几个节点时,也就代表产生了热点问题。

避免产生热点的方式也就是尽可能的将rowkey均匀分散到所有的region上,下面介绍了几种rowkey设计常用的方式:

第一:加盐(salting)

加盐是指在rowkey的前缀添加随机数据,使rowkey尽可能的分布到其他regionserver上

假设遇到下面的rowkey,表的预分区设置为每个字母对应一个region。前缀“a”是一个region,前缀“b”是另一个region等等。那么在这个表中,所有以“f”开头的rowkey都将位于同一个region。比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foo0001

foo0002

foo0003

foo0004

那么,如果你想把它们分散到四个不同的region,那么就可以使用四种不同的前缀: a、b、c和d来做加盐。在加盐之后,rowkey也就变成了下面这样。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a-foo0003

b-foo0001

c-foo0004

d-foo0002

(ps:由于现在可以向四个region写数据,理论上,性能比之前向同一个region写吞吐量提升四倍)

并且,如果后续有新的数据写入,rowkey也就会随机的添加前缀,写到不同的region中

缺点:加盐虽然可以很大程度的避免热点问题,提升写入效率,但是由于rowkey被随机的添加了salt值,在读取时候要付出额外的开销。具体怎么读取加盐后的数据,后面再做介绍

第二:哈希(hashing)

哈希的算法有多种,在rowkey设计中用的比较多的大概就是MD5了吧,但是需要注意的是MD5散列还是有碰撞的可能性的,概率很小,但是不是零。

所以一般使用MD5做rowkey散列时候,都会附加一个唯一字段,比如账号字段account,对account做MD5,截取6位左右的md5返回值然后再拼接account字段,也就是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
substr(md5(account))+account

此外,通过md5散列之后的rowkey,在创建表预分区时候,可以使用hbase自带的HexStringSplit方法

第三:反转(Reversing)

如果定义的rowkey字段,前部分数据变化幅度很小,变化很慢,尾部数据变化频率较高,便可以考虑反转字段,尤其对类似时间戳的数据

不管以哪种方式设计rowkey,在查询时候也要做对应的数据处理,比如做hash的,查询时候也需要先把数据hash之后,然后查询rowkey;通过反转方式设计的rowkey同理。

第四:最小化rowkey和列簇长度

rowkey可以是任意的字符串,最大长度64KB,但是建议在设计rowkey时候,尽可能的短,原因:

1.hbase数据存储是以key-value的形式存储的,如果rowkey比较长,比如100字节,那么1000w行数据,光rowkey存储就需要100*1000w=10亿个字节,将近1G的数据。

2.memstore的会缓存数据到内存,如果rowkey比较长,同样会占用更多的空间

3.建议rowkey设计在8字节的整数倍,控制在16个字节,因为目前的操作系统大多都是64位的,整数倍更好了利用了操作系统的特性。

列簇(ColumnFamily)同理,尽可能的短,最好是一个字符,比如 f 或者 d

第五:Byte Patterns

我们知道,long类型是8个字节,并且你可以通过long类型存储一个最大为18,446,744,073,709,551,615的无符号数字,仅仅用8个字节,但是如果以string类型的形式存储这样的数字,那么几乎需要3倍空间的大小(假定每个字符占一个字节)

举个例子验证一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// long
//
long l = 1234567890L;
byte[] lb = Bytes.toBytes(l);
System.out.println("long bytes length: " + lb.length);   // returns 8

String s = String.valueOf(l);
byte[] sb = Bytes.toBytes(s);
System.out.println("long as string length: " + sb.length);    // returns 10

// hash
//
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(Bytes.toBytes(s));
System.out.println("md5 digest bytes length: " + digest.length);    // returns 16

String sDigest = new String(digest);
byte[] sbDigest = Bytes.toBytes(sDigest);
System.out.println("md5 digest as string length: " + sbDigest.length);    // returns 26

但是,也有一个缺点,就是如果使用这种二进制表示的类型时候,在hbase shell界面查数据的时候,可读性比较差,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hbase(main):002:0> get 'table1', 'rowkey1'
COLUMN                                        CELL
 f:q                                          timestamp=1369163040570, value=\x00\x00\x00\x00\x00\x00\x00\x01
1 row(s) in 0.0310 seconds
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据社 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
hbase的预region分区 脚本 经典 转
Region是表获取和分布的基本元素,由每个列族的一个Store组成。对象层级图如下:
stys35
2019/03/05
2K0
HBase的 rowkey 设计原则
hbase所谓的三维有序存储的三维是指:rowkey(行主键),column key(columnFamily+qualifier),timestamp(时间戳)三部分组成的三维有序存储。
程序狗
2021/09/06
9740
HBase的 rowkey 设计原则
Apache Phoenix系列 | 真 · 从入门到精通
文章简介:Phoenix是一个开源的HBASE SQL层。它不仅可以使用标准的JDBC API替代HBASE client API创建表,插入和查询HBASE,也支持二级索引、事物以及多种SQL层优化。
王知无-import_bigdata
2019/09/03
6K0
Apache Phoenix系列 | 真 · 从入门到精通
HBase表设计中的常见陷阱与解决方案
陷阱描述:热区问题指的是在HBase中,某些Region因集中大量的读写操作而成为性能瓶颈。这通常是由于RowKey设计不合理,导致数据分布不均匀,从而造成某些Region负载过重。
数字扫地僧
2024/09/05
1570
HBase表设计中的常见陷阱与解决方案
HBase设计之rowkey设计
HBase应用场景非常广泛;社区前面有一系列文章。大家可以到社区看看看;张少华同学本篇主要讲HBASE最重要的一个基础知识,rowkey的涉及,非常赞!大力推荐! 社区系列文章: 新数仓系列:HBase关键能力和特性梳理 HBase 和 Cassandra的浅谈 新数仓系列:Hbase周边生态梳理(1) HBase由于其存储和读写高性能,在实时查询中越来越发挥重要的作用,但是由于其属于NOSQL数据库类型,对于关系型数据并不适用。HBase查询只能通过其rowkey来查询(我们可以认为是HBa
大数据和云计算技术
2018/03/30
2.4K0
HBase设计之rowkey设计
Hbase 过滤器详解
Hbase 提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predicate push down)。这样可以保证过滤掉的数据不会被传送到客户端,从而减轻网络传输和客户端处理的压力。
每天进步一点点
2022/07/27
1.2K0
Hbase 过滤器详解
Rowkey(行键)设计
HBase 中的行按行键按顺序排序。这种设计优化了扫描(scan),允许您将相关的行或彼此靠近的行一起读取。但是,设计不佳的行键是 hotspotting 的常见来源。当大量客户端通信针对群集中的一个节点或仅少数几个节点时,会发生 Hotspotting。此通信量可能表示读取、写入或其他操作。通信量压倒负责托管该区域的单个机器,从而导致性能下降并可能导致区域不可用性。这也会对由同一台区域服务器托管的其他区域产生不利影响,因为该主机无法为请求的负载提供服务。设计数据访问模式以使群集得到充分和均匀利用非常重要。
Spark学习技巧
2018/10/25
7110
HBase RowKey 设计
HBase中 RowKey 用来唯一标识一行记录。在 HBase 中检索数据有以下三种方式:
smartsi
2019/11/26
1.8K0
再谈|Rowkey设计_HBase表设计
HBase的rowkey设计可以说是使用HBase最为重要的事情,直接影响到HBase的性能,常见的RowKey的设计问题及对应访问为:
Spark学习技巧
2019/12/15
1.3K0
rowkey散列和预分区设计解决hbase热点问题(数据倾斜)
Hbase的表会被划分为1....n个Region,被托管在RegionServer中。Region二个重要的属性:Startkey与EndKey表示这个Region维护的rowkey的范围,当我们要读写数据时,如果rowkey落在某个start-end key范围内,那么就会定位到目标region并且读写到相关的数据。
小勇DW3
2019/07/08
1.9K0
rowkey散列和预分区设计解决hbase热点问题(数据倾斜)
大白话彻底讲透 HBase Rowkey 设计和实现!
大家都知道 HBase 由于它存储和读写的高性能,在 OLAP 即时分析中发挥着非常重要的作用,而 RowKey 作为 HBase 的核心知识点,其设计势必会影响到数据在 HBase 中的分布,甚至会影响我们查询的效率,可以说 RowKey 的设计质量关乎了 HBase 的质量。
玄姐谈AGI
2021/02/08
1.7K0
HBase RowKey与索引设计 |「Hbase2.0常见问题性优化小总结续集」
hbase的内部使用KeyValue的形式存储,其key时rowKey:family:column:logTime,value是其存储的内容。
大数据真好玩
2021/11/05
1.8K0
HBase RowKey与索引设计 |「Hbase2.0常见问题性优化小总结续集」
HBase RowKey 设计与查询实践
HBase 作为一款分布式的NoSQL数据库,数据的分布根据rowKey range方式来划分,每个Region 存储了一定范围rowKey 的数据, 数据的读写通常情况下需要指定rowKey 来定位到具体的Region 与 RegionServer, 如果大量的请求根据rowKey都打到同一个Region或者很少的Region上,那么这些Region就会形成热点, 无法使用集群特性有效负载均衡。因此,RowKey 的设计在实践中至关重要。
Flink实战剖析
2022/06/10
1.2K0
基于Flume+Kafka+Hbase+Flink+FineBI的实时综合案例(三)离线分析
Maynor
2023/10/17
3670
基于Flume+Kafka+Hbase+Flink+FineBI的实时综合案例(三)离线分析
眼见不一定为实:调用链HBase倾斜修复
今天给大家分享一个关于HBase数据倾斜的排查案例,不懂调用链?不懂HBase?没关系,看完包懂~
龟仙老人
2022/04/26
5061
HBase的rowKey设计技巧
HBase是三维有序存储的,通过rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度可以对HBase中的数据进行快速定位。
大数据梦想家
2021/01/26
9310
❤️让人心跳加速的陌陌案例,大数据必需学会的基础案例!❤️ 【推荐收藏】
同样, 对于hbase来讲, 也需要有类似这样功能, 这个时候, hbase推出 名称空间, 可以通过在hbase中构建多个名称空间, 将表放置在不同的名称空间下, 进行分别管理操作
Lansonli
2021/10/11
8170
优化 HBase - HBase 的预分区及 rowkey 设计原则与方法
之前在《初识 HBase - HBase 基础知识》中提到过,HBase 的数据物理存储格式为多维稀疏排序 Map, 由 key 及 value 组成:
数人之道
2022/01/18
4.1K0
优化 HBase - HBase 的预分区及 rowkey 设计原则与方法
HBase快速入门【集群安装配置、读写过程、表模型、命令行、API】
HBase与MySQL、Oralce、DB2、SQLServer等关系型数据库不同,它是一个NoSQL数据库(非关系型数据库)
Java架构师必看
2021/05/14
4980
HBase快速入门【集群安装配置、读写过程、表模型、命令行、API】
Hbase入门(三)——数据模型
Hbase最核心但也是最难理解的就是数据模型,由于与传统的关系型数据库不同,虽然Hbase也有表(Table),也有行(Row)和列(Column),但是与关系型数据库不同的是Hbase有一个列族(Column Family)的概念,它将一列或者多列组织在一起,HBase必须属于某一个列族。
大数据流动
2019/09/30
1.1K0
Hbase入门(三)——数据模型
相关推荐
hbase的预region分区 脚本 经典 转
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文