hbase行键概念(hbase中行键的概念)

http://www.itjxue.com  2023-01-25 17:52  来源:未知  点击次数: 

Hbase的特性有哪些

HBase不是一个关系型数据库,它需要不同的方法定义你的数据模型,HBase实际上定义了一个四维数据模型,下面就是每一维度的定义:

行键:每行都有唯一的行键,行键没有数据类型,它内部被认为是一个字节数组。

列簇:数据在行中被组织成列簇,每行有相同的列簇,但是在行之间,相同的列簇不需要有相同的列修饰符。在引擎中,HBase将列簇存储在它自己的数据文件中,所以,它们需要事先被定义,此外,改变列簇并不容易。

列修饰符:列簇定义真实的列,被称之为列修饰符,你可以认为列修饰符就是列本身。

版本:每列都可以有一个可配置的版本数量,你可以通过列修饰符的制定版本获取数据。

hbase的作用

HBase 是典型的 NoSQL 数据库,通常被描述成稀疏的、分布式的、持久化的,由行键、列键和时间戳进行索引的多维有序映射数据库,主要用来存储非结构化和半结构化的数据。因为 HBase 基于 Hadoop 的 HDFS 完成分布式存储,以及 MapReduce 完成分布式并行计算,所以它的一些特点与 Hadoop 相同,依靠横向扩展,通过不断增加性价比高的商业服务器来增加计算和存储能力。

HBase 虽然基于 Bigtable 的开源实现,但它们之间还是有很多差别的,Bigtable 经常被描述成键值数据库,而 HBase 则是面向列存储的分布式数据库。

下面介绍 HBase 具备的显著特性,这些特性让 HBase 成为当前和未来最实用的数据库之一。

容量巨大

HBase 的单表可以有百亿行、百万列,可以在横向和纵向两个维度插入数据,具有很大的弹性。

当关系型数据库的单个表的记录在亿级时,查询和写入的性能都会呈现指数级下降,这种庞大的数据量对传统数据库来说是一种灾难,而 HBase 在限定某个列的情况下对于单表存储百亿甚至更多的数据都没有性能问题。

HBase 采用 LSM 树作为内部数据存储结构,这种结构会周期性地将较小文件合并成大文件,以减少对磁盘的访问。

扩展性强

HBase 工作在 HDFS 之上,理所当然地支持分布式表,也继承了 HDFS 的可扩展性。HBase 的扩展是横向的,横向扩展是指在扩展时不需要提升服务器本身的性能,只需添加服务器到现有集群即可。

HBase 表根据 Region 大小进行分区,分别存在集群中不同的节点上,当添加新的节点时,集群就重新调整,在新的节点启动 HBase 服务器,动态地实现扩展。这里需要指出,HBase 的扩展是热扩展,即在不停止现有服务的前提下,可以随时添加或者减少节点。

高可靠性

HBase 运行在 HDFS 上,HDFS 的多副本存储可以让它在岀现故障时自动恢复,同时 HBase 内部也提供 WAL 和 Replication 机制。

WAL(Write-Ahead-Log)预写日志是在 HBase 服务器处理数据插入和删除的过程中用来记录操作内容的日志,保证了数据写入时不会因集群异常而导致写入数据的丢失;而 Replication 机制是基于日志操作来做数据同步的。

HBase调优:预分区与行键设计

基于此我们可以控制在建表的时候,创建多个空region,并确定每个region的起始和终止rowkey,这样只要我们的rowkey设计能均匀的命中各个region,就不会存在写热点问题。自然split的几率也会大大降低。当然随着数据量的不断增长,该split的还是要进行split。像这样预先创建hbase表分区的方式,称之为预分区。

hash(主键) + 年月日时(2019062315)

这里只取hash(主键)的前6位,使得行键的长度正好是16,也就是8的整数倍,在64位计算机中,效果最好。

列族固定,只有一个,设为f,标签为分钟加上秒数:

分秒(5623)

如果需要精确到毫秒,可以为列族f设置有多个版本或者将标签设计为分秒毫秒(5623142)或者分秒.版本号(5623.1)

一个regionserver可以管理的region数量和列族数量与每个列族缓存的大小有关,计算公式如下:

我这里只分了三个region,用hbase shell命令创建表,设置预分区数量为3

下图中,可以看到,预分区以后,数据的读写访问请求数量均匀分布在3台RegionServer上,避免了热点问题。

hbase列式数据库四维坐标是什么

实际上,HBase是一个列族数据库,而不是真正的列式数据库。

因为允许存放非结构化数据,所以HBase的数据类型只有简单的字符串类型,如果需要细分类型,需要用户自己处理。

HBase的四维模型中每个元素:

(1)行键(Row Key):最大长度为64KB的任意字符串。与关系型数据库一样,行键是行的唯一标志。

(2)列族(Column Family):这是理解列族数据库的关键概念。将数据行中的字段按照某种要求分成数个小组,每个小组包含若干个字段,每个小组就是列族。列族需要预先定义,并且不能随意修改。每行具有相同的列族,但不要求每个列族都存储数据。

(3)列限定符(Qualifier):每个列族包含多个字段,限定符用于区分不同的字段。列限定符不需要预先定义,因此每行可以有不同数量的列限定符,也可以认为列限定符就是字段。

(4)单元(Cell):存储数据的最小单元。单元中存储的是未经解释的字符串,需要通过行键、列族、列限定符、时间戳进行定位。

(5)版本(Version):这是HBase与其他数据库的不同之处。版本是一个64位整型数,可以由系统自动生成,也可以由用户自定义。引入版本后,存储在单元中的值不再只有一个,可以通过不同的时间戳(Timestamp)在同一单元中存入多个版本。

hbase行键怎么设计 越多越好吗

1、列族的数量及列族的势

建议将Hbase列族的数量设置的越少越好。当强,对于两个或两个以上的列族hbase并不能处理的很好。这是由于HBase的Flushing和压缩是基于Region的。当一个列族所存储的数据达到Flushing的阈值时,该表中所有列族将同时进行Flushing操作。这将带来不必要的I/O开销,列族越多,该特性带来的影响越大。

此外,还要考虑到同一个表中不同列族所存储的记录数量的差别,即列族的势(Cardinality)。当两个列族数量差别过大时会使包含记录数量较少列族的数据分散在多个Region上,而Region有可能存储在不同的RegionServer上。这样,当进行查询或scan操作的时候,系统效率将会受到影响。

2、行键(RowKey)的设计

首先应该避免使用时序或单调(递减/递增)行键。因为当数据到来的时候,HBase首先需要根据记录的行键来确定存储的位置,即Region的位置,如果使用时序或单调行键,那么连续到来的数据将被分配到同一个Region中,而此时系统的其他Region/RegionServer处于空闲状态,这是分布式最不希望看到的状态。

3、尽量最小化行键和列族的大小

在HBase中,一个具体的值由存储该值的行键、对应的列(列族:列)以及该值的时间戳决定。HBase中索引是为了加速随即访问的速度,索引的创建是基于“行键+列族:列+时间戳+值”的,如果行键和列族的大小过大,甚至超过值本身的大小,纳闷将会增加索引的大小。并且在HBase中数据记录往往非常之多,重复的行键、列将不但使索引的大小过大,也将加重系统的负担

4、版本的数量

默认情况下为3个,可以通过HColumnDescriptor进行设置,建议不要设置的过大

参考资料:《Hadoop实战》陆嘉恒 著

HBASE名词解析及关系梳理

表 :? hbase 中数据都是以表形式来组织的 , hbase中的表由多个行组成.

row key :? hbase中行由一个row key 和一个或多个列族组成,行在存储时按行键的的字典顺序排序.

column 列 : hbase的列由 列族名+列名组成 例如: C1:User_id , C1:sex.

列族 (column family) : 列族将一组列名及其值组织在一起,表中的每一行列族必须相同,但是列名不一定相同.官方建议尽量保证每一列数据的列名一致,最好能将同一类列名放在一个列族中.

列名(column) : ? 列族中包含一个个的列名,可以根据列名取得对应的值.

单元格(cell) 单元格是由行,列族,列名,值,代表版本的时间戳组成的.

(责任编辑:IT教学网)

更多

推荐ASP教程文章