HBase概述(概念、数据模型、特点和优势)


HBase是什么?

HBase是一个高可靠性高性能面向列可伸缩的分布式存储系统,目标是存储并处理大型的数据,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
因此我们说HBase是大量廉价的机器解决海量数据的高速存储和读取的分布式数据库解决方案。

  • HBase利用Hadoop HDFS作为其文件存储系统。
  • HBase利用Hadoop MapReduce来处理HBase中的海量数据。
  • HBase利用Zookeeper为其提供稳定服务和Failover机制。

HBase与RDBMS对比

  1. 数据类型:关系数据库采用关系模型,具有丰富的数据类型和存储方式,HBase则采用了更加简单的数据模型,它把数据存储为未经解释的字符串。
  2. 数据操作:关系数据库中包含了丰富的操作,其中会涉及复杂的多表连接。HBase操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等,因为HBase在设计上就避免了复杂的表和表之间的关系。
  3. 存储模式:关系数据库是基于行模式存储的。HBase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的。
  4. 数据索引:关系数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。HBase只有一个索引——行键,通过巧妙的设计,HBase中的所有访问方法,或者通过行键访问,或者通过行键扫描,从而使得整个系统不会慢下来。
  5. 数据维护:在关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在。而在HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留。
  6. 可伸缩性:关系数据库很难实现横向扩展,纵向扩展的空间也比较有限。相反,HBase和BigTable这些分布式数据库就是为了实现灵活的水平扩展而开发的,能够轻易地通过在集群中增加或者减少硬件数量来实现性能的伸缩。

数据模型

HBase的数据模型,分两大类namespace,table,其实就是对应RDBMS中的库和表。其中表的数据模型又包含有row key+columns family+cell+timestamp。下面具体讲解namespace和table的数据模型。

NameSpace

命名空间类似关系数据库系统中的数据库,是表的逻辑分组。通过命名空间我们可以对表分组,对于不同的组我们可以进行不同的环境设定,如配额管理、安全管理等。
创建命名空间

create_namespace 'my_ns'
create_namespace 'my_ns', {'PROPERTY_NAME' => 'PROPERTY_VALUE'}

删除命名空间

drop_namespace 'my_ns'

HBASE自带有两个命名空间:default 、hbase

hbase:系统命名空间,有两个重要的表,meta–>用于存储元数据,namespace–>存储hbase命名空间的表。

list_namespace_tables 'hbase'
TABLE                                                                                                                                                                                                  
meta                                                                                                                                                                                                   
namespace                                                                                                                                                                                              
2 row(s) in 0.1500 seconds

查看meta中存储的元信息:

scan 'hbase:meta'
ROW                                                COLUMN+CELL                                                                                                                                         
 event_logs20151220,,1530701175275.59026af14c40aa5 column=info:regioninfo, timestamp=1530701176568, value={ENCODED => 59026af14c40aa514f9db4b92911e96a, NAME => 'event_logs20151220,,1530701175275.5902
 14f9db4b92911e96a.                                6af14c40aa514f9db4b92911e96a.', STARTKEY => '', ENDKEY => '1450570479953'}                                                                          
 event_logs20151220,,1530701175275.59026af14c40aa5 column=info:seqnumDuringOpen, timestamp=1586011645162, value=\x00\x00\x00\x00\x00\x00\x00\x16                                                       
 14f9db4b92911e96a.                                                                                                                                                                                    
 event_logs20151220,,1530701175275.59026af14c40aa5 column=info:server, timestamp=1586011645162, value=localhost:60020                                                                                  
 14f9db4b92911e96a. 

default – 没有显式指定命名空间的表,将自动落入此命名空间

Table

Row Key

row key是用来检索记录的主键。访问HBASE table中的行,只有三种方式:
1.通过单个row key访问
2.通过row key的range(正则)
3.全表扫描
Row key可以是任意字符串(最大长度 是 64KB,实际应用中长度一般为 10-100bytes),在HBASE内部,row key保存为字节数组。存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分利用排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)。Rowkey对Hbase的性能影响非常大,Rowkey的设计尤为重要。

Columns Family

  • Column Family又叫列族,Hbase通过列族划分数据的存储,列族下面可以包含任意多的列,实现灵活的数据存取。可以类比为家族,一个家族是由于很多个的家庭组成的,同理列族是由很多的列组成。
  • Hbase表的创建的时候就必须定义列族。就像关系型数据库创建的时候必须指定具体的列是一样的。
  • Hbase的列族不是越多越好,官方推荐的是列族最好小于或者等于3。我们使用的场景一般是1个列族。
  • HBase表中的每个列,都归属于某个列族。列名都以列族作为前缀。例如 courses:history,courses:math都属于courses这个列族。新的列族成员(列)可以随后按需、动态加入,Family下面可以有多个Qualifier,所以可以简单的理解为,HBase中的列是二级列,也就是说Family是第一级列,Qualifier是第二级列。两个是父子关系。
  • 权限控制、存储以及调优都是在列族层面进行的。
  • HBase把同一列族里面的数据存储在同一目录下,由几个文件保存。

TimeStamp

每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是64位整型。
时间戳可以由HBase在数据写入时自动赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
TimeStamp对Hbase来说至关重要,因为它是实现Hbase多版本的关键。在Hbase中使用不同的timestame来标识相同rowkey行对应的不同版本的数据。
在Hbase中,相同rowkey的数据按照timestamp倒序排列。默认查询的是最新的版本,用户可同指定timestamp的值来读取旧版本的数据。
为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,HBase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。

Cell

  • 由行和列的坐标交叉决定;
  • 单元格是有版本的(由时间戳来作为版本);
  • 单元格的内容是未解析的字节数组(Byte[]),cell中的数据是没有类型的,全部是字节码形式存贮。
    • 由{row key,column(= +),version}唯一确定的单元。

HBase的特点

HBASE的特点主要为海量存储、稀疏存储、列存储、易扩展。

海量存储
Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据。这与Hbase的极易扩展性息息相关。正式因为Hbase良好的扩展性,才为海量数据的存储提供了便利。

列式存储
Hbase是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定,而列是动态的。

易扩展
Hbase的扩展性主要体现在两个方面,一个是基于上层处理能力(HRegionServer)的扩展,一个是基于存储的扩展(HDFS)

稀疏存储
不同于传统RDBMS,null也占用空间,HBase在列数据为空的情况下,是不会占用存储空间的。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值