2023年11月23日发(作者:)

hbaserowkey设计原则及热点问题

1.1 hbase数据库介绍

1、简介

hbase是基于Google BigTable模型开发的,典型的key/value系统。是建⽴在hdfs之上,提供⾼可靠性、⾼性能、列存储、可伸缩、实时

读写nosql的数据库系统。它是Apache Hadoop⽣态系统中的重要⼀员,主要⽤于海量结构化和半结构化数据存储。

它介于nosql和RDBMS之间,仅能通过主键(row key)主键的range来检索数据,仅⽀持单⾏事务(可通过hive⽀持来实现多表join等复杂

操作)。

Hbase查询数据功能很简单,不⽀持join等复杂操作,不⽀持复杂的事务(⾏级的事务)

与hadoop⼀样,Hbase⽬标主要依靠横向扩展,通过不断增加廉价的商⽤服务器,来增加计算和存储能⼒。

HBase中的表⼀般有这样的特点:

:⼀个表可以有上⼗亿⾏,上百万列

⽆模式:每⾏都有⼀个可排序的主键和任意多的列,列可以根据需要动态的增加,同⼀张表中不同的⾏可以有截然不同的列

⾯向列:⾯向列(族)的存储和权限控制,列(族)独⽴检索

稀疏:对于为空(null)的列,并不占⽤存储空间,因此,表可以设计的⾮常稀疏。

数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号⾃动分配,是单元格插⼊时的时间戳

数据类型单⼀:Hbase中的数据都是字节数组 byte[]。

2、表结构逻辑视图

HBase以表的形式存储数据。表有⾏和列组成。列划分为若⼲个列族(column family)

3、Row Key

与nosql数据库们⼀样,row key是⽤来检索记录的主键。访问hbase table中的⾏,只有三种⽅式:

1 通过单个row key访问 (select * from t1 where id=1)

2 通过row key的range (select * from t1 where id<10 and id >1)

3 全表扫描 (select * from t1 )

Row key⾏键 (Row key)可以是任意字符串(最⼤长度是 64KB,实际应⽤中长度⼀般为 10-100bytes),在hbase内部,row key保存为

字节数组。

Hbase会对表中的数据按照rowkey排序(字典顺序)

存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常⼀起读取的⾏存储放到⼀起

(位置相关性)

注意:

字典序对int排序的结果是

1,10,1001,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的⾃然序,⾏键必须⽤0作右填

⾏的⼀次读写是原⼦操作 (不论⼀次读写多少列)。这个设计决策能够使⽤户很容易的理解程序在对同⼀个⾏进⾏并发更新操作时的⾏为。

4、列族

hbase表中的每个列,都归属与某个列族。列族是表的schema的⼀部分(⽽列不是),必须在使⽤表之前定义。

列名都以列族作为前缀。例如courses:history , courses:math 都属于 courses 这个列族。

访问控制、磁盘和内存的使⽤统计都是在列族层⾯进⾏的。

Hbase基本组件说明:

Client:

包含访问Hbase的接⼝,并维护cache来加快对Hbase的访问,⽐如region的

位置信息。

HMaster:

是hbase集群的主节点,可以配置多个,⽤来实现HA

显⽰hbase中的表

alter 'user', NAME => 'f1', METHOD => 'delete' 或 alter 'user', 'delete' =>

'f1'

添加列族f1同时删除列族f2

alter 'user', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}

将user表的f1列族版本号改为5

1. 数据的持久化⽂件HFile中是按照KeyValue存储的,如果rowkey过长,⽐如超过100字节,1000w⾏数据,光rowkey就要占

⽤100*1000w=10亿个字节,将近1G数据,这样会极⼤影响HFile的存储效率;

2. MemStore将缓存部分数据到内存,如果rowkey字段过长,内存的有效利⽤率就会降低,系统不能缓存更多的数据,这样会降低检索

效率。

2.3.2 rowkey散列原则

如果rowkey按照时间戳的⽅式递增,不要将时间放在⼆进制码的前⾯,建议将rowkey的⾼位作为散列字段,由程序随机⽣成,低位放时间

字段,这样将提⾼数据均衡分布在每个RegionServer,以实现负载均衡的⼏率。如果没有散列字段,⾸字段直接是时间信息,所有的数据

都会集中在⼀个RegionServer上,这样在数据检索的时候负载会集中在个别的RegionServer上,造成热点问题,会降低查询效率。

2.3.3 rowkey唯⼀原则

必须在设计上保证其唯⼀性,rowkey是按照字典顺序排序存储的,因此,设计rowkey的时候,要充分利⽤这个排序的特点,将经常读取的

尽量减少⾏键和列族的⼤⼩在HBase中,value永远和它的key⼀起传输的。当具体的值在系统间传输时,它的rowkey,列名,时间戳也会

⼀起传输。如果你的rowkey和列名很⼤,这个时候它们将会占⽤⼤量的存储空间。