原创

HBase学习—HBase概述

HBase简介

HBase 是 BigTable (2006年google推出的论文,也是google内部在使用的工具)的开源(源码使用 Java 编写)版本。是 Apache Hadoop 的数据库,是建立在 HDFS 之上,被设计用来提供高可靠性、高性能、列存储、可伸缩、多版本的 NoSQL 的分布式数据存储系统,实现对大型数据的实时、随机的读写访问。

  • HBase 依赖于 HDFS 做底层的数据存储,BigTable 依赖 Google GFS 做数据存储
  • HBase 依赖于 MapReduce 做数据计算,BigTable 依赖 Google MapReduce 做数据计算
  • HBase 依赖于 ZooKeeper 做服务协调,BigTable 依赖 Google Chubby 做服务协调

关于google的几篇论文可以仔细阅读,对于分布式系统的开发与理解都会有很大的帮助,分别是《Google File System》《Google MapReduce》《Big Table》《Google Chubby》。

HBase定位

  1. 它介于 NoSQL 和 RDBMS 之间,仅能通过主键(rowkey)和主键的 range (StartRowKey-EndRowKey)来检索数据
  2. HBase 查询数据功能很简单,不支持 join 等复杂操作
  3. 不支持复杂的事务,只支持行级事务(可通过 hive 支持来实现多表 join 等复杂操作)。
  4. HBase 中支持的数据类型:byte[](底层所有数据的存储都是字节数组)
  5. 主要用来存储结构化和半结构化的松散数据。

关于结构化、半结构化和非结构化

  • 结构化:数据结构字段含义确定,清晰,典型的如数据库中的表结构
  • 半结构化:具有一定结构,但语义不够确定,典型的如 HTML 网页,有些字段是确定的(title), 有些不确定(table)
  • 非结构化:杂乱无章的数据,很难按照一个概念去进行抽取,无规律性

与 Hadoop 一样,HBase 目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加 计算和存储能力。

HBase 中的表特点

  1. 大:一个表可以有上十亿行,上百万列
  2. 面向列:面向列(族)的存储和权限控制,列(簇)独立检索。
  3. 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
  4. 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一 张表中不同的行可以有截然不同的列

HBase表结构逻辑视图

初次接触HBase,可能看到以下描述会懵:“基于列存储”,“稀疏MAP”,“RowKey”,“ColumnFamily”。

其实没那么高深,我们需要分两步来理解HBase, 就能够理解为什么HBase能够“快速地”“分布式地”处理“大量数据”了。

  1. 内存结构
  2. 文件存储结构

这也是HBase所基于的LSM树实现的存储引擎所必须的结构,具体内容等到详细分析HBase中是如何使用的LSM实现自己的存储引擎。

名词概念

HBase的表模型如下

IMAGE

Rowkey的概念

Rowkey的概念和mysql中的主键是完全一样的,Hbase使用Rowkey来唯一的区分某一行的数据。

由于Hbase只支持3中查询方式:

  1. 基于Rowkey的单行查询

  2. 基于Rowkey的范围扫描

  3. 全表扫描

因此,Rowkey对Hbase的性能影响非常大,Rowkey的设计就显得尤为的重要。设计的时候要兼顾基于Rowkey的单行查询也要键入Rowkey的范围扫描。具体Rowkey要如何设计后续会整理相关的文章做进一步的描述。这里大家只要有一个概念就是Rowkey的设计极为重要。

rowkey 行键可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),最好是16。在 HBase 内部,rowkey 保存为字节数组。HBase 会对表中的数据按照 rowkey 排序 (字典顺序)

Column的概念

列,与关系型数据库中的不同,Hbase中的column是有ColumnFamily(列族)和qualifier(列)组成,两者使用‘:’相连。

Hbase通过ColumnFamily划分数据的存储,列族下面可以包含任意多的qualifier(列),实现灵活的数据存取。

Hbase表的创建的时候就必须指定列族。就像关系型数据库创建的时候必须指定具体的列是一样的,不能随意增减。

而列不同于列族,一个列族下可以设定多个列,并且这个列是可以动态增加的,理论上可以增加到几百万个列。

TimeStamp的概念

TimeStamp对Hbase来说至关重要,因为它是实现Hbase多版本的关键。在Hbase中使用不同的timestame来标识相同rowkey行对应的不通版本的数据。

HBase 中通过 rowkey 和 columns 确定的为一个存储单元称为 cell。每个 cell 都保存着同一份 数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64 位整型。

戳可以由 hbase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。

戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。

在每个cell中不同版本的数据按照时间倒序排序,即最新的数据排在最前面。

为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase 提供了两种数据版 本回收方式:

  • 保存数据的最后 n 个版本
  • 保存最近一段时间内的版本(设置数据的生命周期 TTL)。
    用户可以针对每个列簇进行设置。

单元格(Cell)

单元格,由五元组构成(row,column,timestamp,type,value)这其中type表示操作类型(Put、GET),timestamp表示版本。

这个结构在HBase中实际是以形式进行存储,

Key=(row,column,timestamp,type)

Value=value

总结

总体来看HBase逻辑结构比较容易理解,只是不同于传统的关系型数据库引入了ColumnFamily(列族)的概念,而引入的目的就是为了提高HBase的动态拓展性。

同时HBase还使用timestamp实现了数据的多版本管理功能。

sev7e0
Write by sev7e0
end
本文目录