HBASE基本概念
Hbase是构建在HDFS上的分布式列存储系统,用于海量结构化数据存储
为什么需要HBASE?我们来了解下HDFS作为基本存储所存在的问题:
- 不支持数据随机查找
- 不适合增量数据处理(新来的一批数据不能单独处理,需要统一跟旧数据再处理一遍)
- 不支持数据更新(更新某行数据,某个字段,只支持整行数据的扫描,文件追加等)
而HBase的基本特点如下
- 规模大:一个表可以有数十亿行,上百万的列
- 无固定模式:每行都有个可按字典排序的主键row key和任意多的列column family。列可以根据需要来动态的增加,同一张表中不同行可以有截然不同的列。
- 面向列:面向列存储和权限控制,每个列作为一个单位进行存储,列独立检索。
- 空间稀疏:某行对应的某个列为空时,不会占用存储空间,因此表格可以设计得很稀疏
- 数据多版本:每个列单元中的数据可以有多个版本,默认下版本号是数据插入单元格的时间戳
- 数据类型单一:hbase中的数据都是字符串,没有多种类型。
因而衍生出了Hbase等列式存储数据库,来应对不同的应用场景。
我们对行存储与列存储做下对比,如下图:
image.png可以看到,列式存储在应对高并发量的简单读写操作时,将会大大节省建立索引或者无索引时的按行查找时间与存储空间。并且数据类型的一致也保证了压缩的有效性
下面,看一下数据在HBASE中的具体存储方式
每一行数据有两个大的单元,一个主键row key一个data,data单元中有若干个列族column families,每个column families有若干个column列字段。可以看到,有些字段懈怠了相同的属性名,因为字段携带了上面所提到的不同版本号——时间戳,代表了该字段不同时间的value。
image.pngHbase基本概念
下面介绍下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适用的一些场景
- 对数据进行随机的读、写操作
- 高并发操作,如每秒PB级别数据的上千次操作
- 读写访问为简单操作
在Facebook中的应用-消息系统
- 聊天系统:一个较小的临时数据集,经常变化
- 邮件系统:一个不断增加的数据集,但旧内容很少访问
总结:HBASE在互联网公司的后台信息存储中应用很多,正是它的出现使得hadoop生态系统服务更加全面,值得笔者继续深入学习。
网友评论