Hbase rowkey设计原则

櫰木2年前技术文章815

HBase 中的 rowkey 设计需要遵循以下原则:

1 rowkey 唯一原则

若在 HBase 中向同一张表插入相同 rowkey 的记录,如没有设置版本数量,则此 rowkey 原先的数据会被覆盖,且 rowkey 是用来唯一标识一行记录的。所以,在 rowkey 的设计上务必要保证其唯一性。

2 rowkey 排序原则

rowkey 是按照 ASCII 字典排序(byte order)由低到高存储在表中的。设计 rowkey 时,要充分考虑排序存储这个特性,使用前缀将经常一起读取的行存储到一起。但量不能太大,若太大需要拆分到多个节点上。

注意:字典排序对 int 类型排序的结果是 1,10,100,11,12,13,14,15,16,17,18,19,2,20,21 ... 。因此要保持 int 的自然序,rowkey 必须用 0 作左填充。


3 rowkey 散列原则

我们设计的 rowkey 应能均匀地散列分布在各个 HBase 的 RegionServer 节点上。下面用常见的时间戳来举例说明这一原则。

若 rowkey 是按系统时间戳的方式递增,而时间戳又位于 rowkey 的第一部分,则会很容易造成热点现象,即所有的新数据会堆积在同一个 RegionServer 上,导致大量的 client 直接访问集群的一个或极少数个节点(访问可能是读、写或者其他操作)。

这种情况会直接导致热点 Region 所在的单个 RegionServer 机器超出自身负载能力,引起性能的下降甚至 Region 不可用。常见的是发生 jvm full gc 或者显示 region too busy 的异常情况。而且由于主机无法服务其他 Region 的请求,因此这种情况还会影响同一个 RegionServer 上的其他 Region。

散列原则的 rowkey 设计就是要使集群被充分、均衡地利用,避免热点现象的发生。散列设计的 rowkey 可以使得不同行在同一个 Region,同时在更多数据的情况下,数据可以被写入集群的多个 Region,而不是一个。


4 rowkey 长度原则

rowkey 为二进制形式,可以是任意字符串,最大长度为 64kb。而在实际应用中,一般为 10-100bytes,它以 byte[] 形式保存,一般设定为定长格式。

rowkey 的设计建议越短越好,最好不要超过 16 bytes,其原因有三点:

  1. HBase 的持久化文件 HFile 是按照 Key-Value 存储的,rowkey 是 Key 中的一个域,如果 rowkey 过长(比如 rowkey 是 500 bytes,1000 万行数据,那单是 rowkey 的存储就要占用 500*1000万=50 亿 bytes,将近 5G 的容量),会极大地影响 HFile 的存储效率;

  2. HBase 中的 MemStore 和 BlockCache,分别对应 Store 级别的写入缓存,和 RegionServer 级别的读取缓存。如果 rowkey 过长,内存的有效利用率就会降低,这样系统就无法缓存更多的数据,检索的效率就会受到影响;

  3. 目前我们使用的服务器操作系统都是 64 位系统,内存按照 8 字节对齐,因此 rowkey 一般设计成 8 字节的整数倍,这样就能利用操作系统的最佳特性,提高寻址效率。



相关文章

MySQL 8.0 新特性:Instant Add Column

MySQL 8.0 新特性:Instant Add Column

一、前言MySQL 8.0 支持 “快速加列” 功能,既添加字段时可以支持 “INSTANT” 快速完成。通过只修改数据字典的方法来实现大表快速加列,避免之前加列操作必须做的数据拷贝,从而大幅缩小大表...

kubernetes实战详解

kubernetes实战详解

一、k8s是什么?1、Kubernetes 是用于自动部署,扩展和管理容器化应用程序的开源系统2、生产级别的容器编排系统3、PaaS平台二、容器是什么?或者说docker是什么?1、容器就是一个沙箱C...

Yarn调度器对比

1)Hadoop调度器重要分为三类:FIFO 、Capacity Scheduler(容量调度器)和Fair Sceduler(公平调度器)。Apache默认的资源调度器是容量调度器;CDH...

Linux解锁线程基本概念和线程控制,步入多线程学习的大门(2)

Linux解锁线程基本概念和线程控制,步入多线程学习的大门(2)

2.4.线程等待:为什么需要线程等待?已经退出的线程,其空间没有被释放,仍然在进程的地址空间内。不然也会造成内存泄露问题!创建新的线程不会复用刚才退出线程的地址空间。主线程退出 == 进程退出 ==...

InnoDB秘籍:MVCC机制与行锁的深度探索(2)

InnoDB秘籍:MVCC机制与行锁的深度探索(2)

InnodDB 和 ACID 模型事务 ACID 模型是一种数据库设计原则,InnoDB 引擎是 MySQL 默认且支持事务的存储引擎,它严格遵循 ACID 模型,结果也不会因软件崩溃和硬件故障等特殊...

ES运维(八)添加IK分词器

ES运维(八)添加IK分词器

一、概述ES自带standard analyzer、simple analyzer、whitespace analyzer、stop analyzer、language analyzer、patter...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。