HBase架构与原理

HBASE基本概念

Hbase是构建在HDFS上的分布式列存储系统,用于海量结构化数据存储

为什么需要HBASE?我们来了解下HDFS作为基本存储所存在的问题:

  1. 不支持数据随机查找
  2. 不适合增量数据处理(新来的一批数据不能单独处理,需要统一跟旧数据再处理一遍)
  3. 不支持数据更新(更新某行数据,某个字段,只支持整行数据的扫描,文件追加等)

而HBase的基本特点如下

  • 规模大:一个表可以有数十亿行,上百万的列
  • 无固定模式:每行都有个可按字典排序的主键row key和任意多的列column family。列可以根据需要来动态的增加,同一张表中不同行可以有截然不同的列。
  • 面向列:面向列存储和权限控制,每个列作为一个单位进行存储,列独立检索。
  • 空间稀疏:某行对应的某个列为空时,不会占用存储空间,因此表格可以设计得很稀疏
  • 数据多版本:每个列单元中的数据可以有多个版本,默认下版本号是数据插入单元格的时间戳
  • 数据类型单一:hbase中的数据都是字符串,没有多种类型。

因而衍生出了Hbase等列式存储数据库,来应对不同的应用场景。

我们对行存储与列存储做下对比,如下图:

image.png

可以看到,列式存储在应对高并发量的简单读写操作时,将会大大节省建立索引或者无索引时的按行查找时间与存储空间。并且数据类型的一致也保证了压缩的有效性

下面,看一下数据在HBASE中的具体存储方式

每一行数据有两个大的单元,一个主键row key一个data,data单元中有若干个列族column families,每个column families有若干个column列字段。可以看到,有些字段懈怠了相同的属性名,因为字段携带了上面所提到的不同版本号——时间戳,代表了该字段不同时间的value。

image.png

Hbase基本概念

下面介绍下Hbase的存储字段

  • row key

是表中每条记录的主键,方便快速查找,以byte array的形式存储

  • column family

拥有一个String类型的名称,包含了一个或者多个相关的列

  • column

从属于某一个column family,包含在某一列中。格式为 column familyName:columnName

  • version number

每个rowkey拥有多个version number,默认值为系统的时间戳,类型为long。无需以递增的顺序插入,可由用户提供

  • value

同样以byte array字节数组形式存储

其中,hbase的所有操作是基于rowkey的,支持增删查改操作,如单行的put,get,scan,多行的scan,multiput等。若需要join操作,则需使用MR来解决

HBASE为每个值维护了多级的索引<key,column family,column name,timestamp>。每个column family存储在HDFS上一个单独的文件中,key和version number会冗余地在每个column family中存储一份,其中空值不会被存储。

HBase物理存储

HBase table的行按照row key的字典序排列,在行方向上分割为多个region。region随着数据量增多,达到一个阈值时会切分为两个region。

其中,region是HBASE中分布式存储和负载均衡的最小单元,不同region分配到不同的region Server中,方便进行并行的处理。

虽然region是作为数据切分和迁移时的最小单元,但实际存储数据的最小单元是store。每个region由一个或多个store组成,每个store保存一个columns family。每个store由一个memstore和0至多个storeFile组成,menstore存储在内存中,storeFile存储在HDFS上。当menstore存满时,将数据溢出到storefile中。

image.png

下面,看一下hbase与HDFS结合的一个经典架构图。client可以与regionServer直接进行通信读写,并间接的与master通信。这样保证了master挂掉时,用户仍然可以进行常规的读写操作,但是需要一定时间等待master的恢复,才能够完成如某个region Server挂掉,将数据迁移等切分、负载均衡的操作。同时,失效服务器上“预写”日志(下面提到的write-ahead-log机制)由master进行分割并派送给新的regionserver

HBASE架构

HBASE基本组件

HBase架构中涉及的各个组件与作用如下图:

HBASE基本组件
  • write-ahead-log机制

是一种数据的预写操作。hbase在将数据存入region前,先将数据存入log中,方便在数据写入失败时可以从log进行恢复。

  • region定位

那么,查找数据时是如何定位到不同节点上的region呢?

首先,zookeeper到唯一存储在某个region上的root表查找对应meta表的位置,然后在指定region上找到meta表以及regionserver的服务器地址后,再查找用户数据表的具体region位置。

每次查找访问都会进行如此麻烦的四个步骤吗?为了避免这样低效的操作,第一次查找后会将用户表的地址信息缓存到本地,如同将常用的地址放到Cache中一样,以方便下次的访问。

应用场景

最后,说一下HBase适用的一些场景

  1. 对数据进行随机的读、写操作
  2. 高并发操作,如每秒PB级别数据的上千次操作
  3. 读写访问为简单操作

在Facebook中的应用-消息系统

  1. 聊天系统:一个较小的临时数据集,经常变化
  2. 邮件系统:一个不断增加的数据集,但旧内容很少访问

总结:HBASE在互联网公司的后台信息存储中应用很多,正是它的出现使得hadoop生态系统服务更加全面,值得笔者继续深入学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • HBASE 概述 HBase是什么 HBase是一种构建在HDFS之上的分布式、面向列的存储系统。在需要实时读写、...
    yanzhelee阅读 471评论 0 2
  • 最近在逐步跟进Hbase的相关工作,由于之前对Hbase并不怎么了解,因此系统地学习了下Hbase,为了加深对Hb...
    飞鸿无痕阅读 50,370评论 19 272
  • 1. HBase介绍,Hbase是什么? HBase -- Hadoop Database ,是一个高可靠、高性能...
    奉先阅读 3,803评论 1 36
  • 原创文章,转载请注明原作地址:http://www.jianshu.com/p/0f9578df7fbc 一. 架...
    EchoZhan阅读 15,210评论 4 33
  • HBase那些事 @(大数据工程学院)[HBase, Hadoop, 优化, HadoopChen, hbase]...
    分痴阅读 4,029评论 3 17