Hbase简介

1、HBase是什么?

HBase是一个Hadoop上的数据库。一个分布式,可扩展的大数据存储引擎。HBase有个最明显的特征:

  1. HBase支持非常大的数据集,数十亿行*数百万列。如此庞大的数据量级,足以撑爆我们在J2EE阶段学习过的所有数据存储引擎。
  2. HBase支持大数据量的随机、实时读写操作。在海量数据中,可以实现毫秒级的数据读写。
  3. HBase从一开始就深度集成了Hadoop。HBase基于Hadoop进行文件持久化,还继承了Hadoop带来的强大的可扩展性。Hadoop可以基于廉价PC机组建庞大的应用集群。HBase也深度集成了Hadoop的MapReduce计算框架,并且也正在积极整合Spark。这使得HBase能够很轻松的融入到整个大数据生态圈。
  4. HBase的数据是强一致性的,从CAP理论来看,HBase是属于CP的。这种设计可以让程序员不需要担心脏读、幻读这些事务最终一致性带来的问题。
  5. 最后最重要的还是HBase的框架性能是足够高效的。HBase的开源社区非常活跃,他的性能经过很多大型商业产品的验证。Facebook的整个消息流转的基础设施就构建于HBase之上。

正是Hadoop+HBase一起提供的强悍无敌的性能,支撑起了大数据的整个技术体系。这就好比必须要先有操作系统,能够通过文件、内存来存储资料,后面开发出来的各种应用程序才有用武之地。


2、HBase的数据结构

  1. HBase也可以作为一个数据库使用,但是为了应对海量数据,他存储数据的方式与我们理解的传统关系型数据库有很大的区别。虽然他也有表、列这样的逻辑结构,但是整体上,他是以一种k-v键值对的方式来存储数据的。
  2. HBase中的每张表由Rowkey和若干个列族或者称为列簇组成。其中 Rowkey是每一行数据的唯一标识,在对数据进行管理时,必须自行保证Rowkey的 唯一性。接下来HBase依然会以不同的列来管理数据,但是这些列分别归属于不同 的列簇。在HBase中,同一张表的数据,只需要保证列簇是相同的,而列簇下的 列,可以是不相同的。所以由此可以扩展出非常多的列。在HBase中,对于同一张 表,不建议定义过多的列簇,通常不要超过三个。而更多的数据,可以以列的方式 来扩展。
  3. HBase中的记录,会划分为一个一个的Region,存储在不同的RegionServer上。并且会在不同的RegionServer之前形成备份,以Region为单位提供了故障后自动恢复的机制。
  4. 最后,从整体来看,HBase虽然还是以HDFS作为文件存储,但是他存储的数据不再是简单的文本文件,而是经过HBase优化压缩过的二进制文件,所以他的存储文件通常是不能够直接查看的。

3、HBase的基础架构

  • client客户端包含了访问HBase的接口,另外也维护了对应的缓存来加速对HBase的访问。
  • RegionServer直接对接用户的读写请求,是真正干活的节点。他会将数据以StoreFile的形式存储到不同的HDFS目录中。
  • HMaster主要是维护一些集群的元数据信息,同时监控RegionServer的服务状态,并且通过Zookeeper提供集群服务,向客户端暴露集群的服务端信息。

4、HBase适用场景

Hbase VS Hive来比较一下。

Hive提供了基于SQL的对海量数据进行查询统计的功能,但是Hive不存储数据,所有数据操作都是对HDFS上的文件进行操作,所以他对数据的查询操作能做的优化比较有限。同时Hive也无法直接管理数据,对数据的管理依赖于MapReduce,所以延迟非常高。所以Hive通常只适用于一些OLAP的场景,并且通常是与其他组件结合一起进行使用。而HBase与Hive的区别就非常明显。

HBase基于HDFS来存储数据,但是他存储的数据都是经过自己优化索引后的数据,所以他对数据的存储是非常高效的,比HDFS直接存储文件的性能要高很多,可以作为整个大数据的存储基石。而HBase以类似于Redis的列式存储来管理数据,对数据的增删改都会非常高效,可以达到毫秒级响应。同时,也提供了完善的客户端API,所以他完全可以作为传统意义上的数据库使用,适用于大部分的OLTP的场景。但是他的缺点也比较明显,基于列式存储的数据,天生就不太适合大规模的数据统计,所以在很多OLAP的场景,需要结合其他一些组件如spark、hive等,来提供大规模数据统计的功能。

5、HBase基础操作

5.1 基础指令

基础的表操作

create'user','info'
put 'user','1001','info:name'
get'user','1001','info:name'
  1. HBase查询数据只能依据Rowkey来进行查询,而Rowkey是由客户端直接指定的,所以在使用HBase时,Rowkey如何设计非常重要,要带上重要的业务信息。
  2. scan指令后面的查询条件,STARTROW和STOPROW是必须大写的。查询的结果是左开右闭的。
  3. 其他查询数据的操作可以使用help'get'或者help'scan',来查看更多的查询方式。

5.2 HBase的数据结构

RowKey:

Rowkey是用来检索记录的唯一主键,类似于Redis中的key。访问HBase中的表数据,只能通过Rowkey来查找。访问HBase的数据只有三种方式:

  1. 通过get指令访问单个rowkey对应的数据。
  2. 通过scan指令,默认全表扫描
  3. 通过scan指令,指定rowkey的范围,进行范围查找。

Rowkey可以是任意字符串,最大长度是64KB,实际中通常用不到这么长。在HBase内部,Rowkey保存为字节数组。存储时,会按照Rowkey的字典顺序排序存储。

实际使用时,对Rowkey的设计是很重要的,往往需要将一些经常读取的重要列都包含到Rowkey中。并且要充分考虑到排序存储这个特性,让一些相关的数据尽量放到一起。比如我们创建一个用户表,经常会按用户ID来查询,那Rowkey中一定要包含用户ID字段。而如果把用户ID放在Rowkey的开头,那数据就会按照用户ID排序存储,查询Rowkey时效率就会比较快。

ColumnFamily(列簇)与Column(列):

HBase中的列都是归属于某一个列簇的,HBase在表定义中只有对列簇的定义,没有对列的定义。也就是说,列是可以在列簇下随意扩展的。要访问列,也必须以列簇作为前缀,使用冒号进行连接。列中的数据是没有类型的,全部都是以字节码形式存储。同一个表中,列簇不宜定义过多。

物理上,一个列簇下的所有列都是存储在一起的。由于HBase对于数据的索引和存储都是在列簇级别进行区分的,所以,通常在使用时,建议一个列簇下的所有列都有大致相同的数据结构和数据大小,这样可以提高HBase管理数据的效率。

Versions:

在HBase中,是以一个{row,column,version}这样的数据唯一确定一个存储单元,称为cell。在HBase中,可能存在很多cell有相同的row和column,但是却有不同的版本。多次使用put指令,指定相同的row和column,就会产生同一个数据的多个版本。

默认情况下,HBase是在数据写入时以时间戳作为默认的版本,也就是用scan指令查找数据时看到的timestamp内容。HBase就是以这个时间戳降序排列来存储数据的,所以,HBase去读取数据时,默认就会返回最近写入的数据。客户端也可以指定写入数据的版本,并且这个版本并不要求严格递增。

当一个数据有多个版本时,HBase会保证只有最后一个版本的cell数据是可以查询的,而至于其他的版本,会由HBase提供版本回收机制,在某个时间进行删除。

Namespace 命名空间

在HBase中,每个命名空间会对应HDFS上的/hbase/data目录下的一个文件夹。不同命名空间的表存储是隔离的。

在HDFS上可以看到,HBase默认创建了两个命名空间,一个是hbase,这是系统的命名空间,用来存放HBase的一些内部表。另一个是default,这个是默认的命名空间。不指定命名空间的表都会创建在这个命名空间下。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值