HBase分布式数据库

认识HBase分布式数据库

任务描述:

  1. 与MapReduce的离线批处理计算框架不同,HBase是一个可以随机访问的、用于存储和检索数据的框架,弥补了HDFS不能随机访问数据的缺陷。
  2. HBase适合实时性要求不高的业务场景,HBase中的数据以Byte[]数组的方式存储,不区分数据类型,支持结构化、半结构化、非结构化数据,数据模型动态性强,十分灵活。
  3. 为了使读者对HBase有更加深入的理解,本次的任务是从HBase的起源出发,了解HBase的特点、HBase与传统数据库的区别、系统架构、数据模型及读写流程

什么是HBase?

BigTable是一个分布式存储系统,利用基于C语言的MapReduce分布式计算模型处理少量数据,使用GFS分布式文件系统作为底层数据存储方式,具备广泛应用性、可靠性、高性能和高可用性等特点。
HBase是BigTable的开源实现。

1. HBase的起源:

  • HBase属于Apache旗下的一个顶级开源项目,项目灵感起源于2006年BigTable论文的发表。HBase是对BigTable的开源实现,但两者底层使用的技术还是存在差别,具体如下表所示。
    1
  • HBase是一个基于Java、开源的、高可靠、高性能、面向列、可伸缩的列式非关系型数据库,也可以称为列式分布式数据库,或简称为分布式数据库。
    HBase的目标是存储并处理海量的非结构化和半结构化的松散数据,旨在仅使用普通的硬件配置,即可处理由成千上万的行和列组成的海量数据。
    2. HBase的特点:
  • 海量存储。HBase通过多台廉价的机器实现存储PB级别的海量数据,并且可以在几十毫秒或几百毫秒内返回数据。
  • 面向列。HBase面向列进行存储和权限控制,并支持独立检索。HBase是根据列族存储数据的,一个列族下可以有多列,列族在创建表时必须指定,并且可以单独对列进行各种操作。
  • 多版本。HBase中表的每一个列的数据存储都有多个Version(版本,即同一条数据插入不同的时间戳)。虽然每一列对应着一条数据,但是有的数据会对应多个版本。例如,存储个人信息的HBase表中,如果某个人多次更换过家庭住址,那么记录家庭住址的数据会将有多个版本
  • 稀疏性。HBase的稀疏性主要体现出HBase列的灵活性。在列族中,可以指定任意多个列,在列数据为空的情况下,是不会占用存储空间的。
  • 易扩展性。HBase的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。HBase的底层依赖HDFS,当磁盘空间不足时,可以动态增加机器(即DataNode节点服务)解决,从而避免进行数据的迁移。
  • 高可靠性。由于HBase底层使用的是HDFS,而HDFS的分布式集群具有备份机制,副本(Replication)机制能够保证数据不会发生丢失或损坏。
    3. HBase与传统数据库的区别

(1) 数据类型
关系型数据库采用关系模型,具有丰富的数据类型和存储方式。HBase则采用了更加简单灵活的数据模型,将数据存储为未经解释的字符串,用户可以将不同格式的结构化数据和非结构化数据都序列化成字符串保存至HBase中,用户再需要编写程序将字符串解析成不同的数据类型。
(2) 数据操作
关系型数据库中提供了丰富的操作,如插入、删除、更新、查询等,一些操作会涉及复杂的多表连接,通常需要借助于多个表之间的主外键关联实现。HBase提供的操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等。
(3) 存储模式
关系型数据库是基于行模式存储的,元组或行会被连续地存储在磁盘中。在读取数据时,需要顺序扫描每个元组,再从中筛选查询出所需要的数据。如果每个元组只有少量字段的值且查询操作是有用的,那么基于行模式存储会浪费许多磁盘空间和内存带宽。
HBase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的,优点是可以降低I/O开销,支持大量并发用户查询(因为仅需要处理与查询结果相关的列,而不需要处理与查询无关的大量数据行);同一个列族中的数据会被一起压缩(同一列族内的数据相似度较高,因此可以获得较高的数据压缩比)。
(4)数据索引
关系型数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。与关系型数据库不同的是,HBase只有一个索引——行键。由于HBase位于Hadoop框架之上,所以可以使用Hadoop MapReduce快速、高效地生成索引表。
(5)数据维护
在关系型数据库中,更新操作会用最新的当前值去替换记录中原来的值(旧值),旧值被覆盖后就不会存在。而在HBase中执行更新操作时,并不会删除旧版本的数据,而是生成一个新版本的数据,旧版本的数据仍然保留。
(6) 可伸缩性
关系型数据库很难实现横向扩展,纵向扩展的空间也比较有限。相反,HBase和BigTable分布式数据库是为了实现灵活的横向扩展而开发的,因此能够轻易地通过在集群中增加或减少硬件数量实现性能的伸缩。
但是,相对关系型数据库,HBase也有自身的局限性,如HBase不支持事务,因此无法实现跨行的原子性。


了解HBase系统架构

  • HBase采用Master/Slave架构搭建集群,属于Hadoop生态系统的组件,由Client(客户端)、HMaster、HRegionServer、ZooKeeper等部分组成,并将数据存储于HDFS中。
  • HMaster主要负责利用ZooKeeper为HRegionServer分配HRegion。ZooKeeper是一个高可靠、高可用、持久化的分布式协调系统。
  • 客户端使用HBase的远程过程调用协议(RemoteProcedure Call
    Protocol,RPC)机制与HMaster和HRegionServer进行通信,对于管理类操作,客户端与HMaster进行RPC通信;对于数据读/写类操作,客户端与HRegionServer进行RPC通信。
    HBase架构图如下
    2

1.ZooKeeper

  • ZooKeeper是一个开放源代码的分布式应用程序协调服务,是Hadoop和HBase的重要组件。
  • 分布式HBase依赖于ZooKeeper集群,所有节点和客户端必须能够正常访问ZooKeeper。
  • HBase默认管理一个单点的ZooKeeper集群,HBase可以将ZooKeeper当作自身的一部分启动和关闭进程。
  • HMaster启动时将HBase系统表加载至ZooKeeper,通过ZooKeeper可以获取当前系统表元数据的存储所对应的HRegionServer信息。
    2.HMaster
  • HBase中可以启动多个HMaster,通过ZooKeeper的Master选举机制保证总有一个HMaster运行。
  • HMaster管理HRegionServer的负载均衡,调整HRegion的分布,如在Region分片后,负责将HRegion分配至HRegionserver,在HRegionserver宕机后,HMaster会将HRegionserver内的HRegion迁移至其他HRegionserver上。
    3. HRegionServer
  • HRegionServer主要负责响应用户I/O请求,在HDFS文件系统中读/写数据,是HBase中核心的模块。HRegionServer内部管理了一系列HRegion,HRegion对应了Table中的一个Region,HRegion由多个HStore组成。每个HStore对应了HBase表中的一个Column
    Family的存储,每个Column Family指的是一个集中的存储单元,因此最好将具备共同I/O特性的列放在一个Column
    Family中,查询会更加高效。
  • HStore存储是HBase存储的核心,由两部分组成,一部分是MemStore缓冲区;另一部分是StoreFile文件。用户写入的数据首先会放入MemStore,当MemStore满了以后会刷新成一个StoreFile(底层实现是HFile);当StoreFile文件数量增长到一定阈值时,将触发Compact合并操作,将多个StoreFile合并为一个StoreFile,合并过程中会进行版本合并和数据删除。
  • 因此,可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的Compact过程中进行的,这使得用户的写操作只要进入内存中即可立即返回,保证了HBase I/O的高性能。
  • 当单个StoreFile大小超过一定阈值后,会触发Split分割操作,同时把当前Region分片为两个Region,父Region将下线,新分割出的两个子Region会被HMaster分配到相应的HRegionServer上,使得原先一个Region的压力得以分流至两个Region上。
  • 实际的存储文件功能是由HFile实现的。HFile被专门创建用于有效存储HBase数据,基于Hadoop的TFile类。
    4. HLog
  • Write-Ahead-Log(WAL)是HBase的HRegionServer在处理数据插入和删除的过程中用于记录操作内容的一种日志。客户端初始化一个更改数据的动作,每一种改动都被包装进KeyValue对象使用远程调用发送到ReginoServer对应这次改动的Region中。
  • 数据在HRegionServer中首先被写入WAL,再被写入MemStore,最后当MemStore达到一定的大小或到达指定的时刻之后,数据被异步地持久化到文件系统上,在这之前数据是存储在内存中的,在这段时间里如果HRegionServer崩溃了,那么内存的数据就没有了,在这种情况下如果有WAL,那么即可恢复数据。
  • 每个HRegionServer中都有一个HLog对象,HLog是一个实现WAL的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中,HLog文件定期会滚动出新的文件,并删除旧的文件(已持久化到StoreFile中的数据)。
  • 当HRegionServer意外终止后,HMaster会通过ZooKeeper感知HMaster首先会处理遗留的HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应的Region目录下,再将失效的Region重新分配给HRegionServer。HRegionServer在加载Region的过程中,将发现有历史HLog需要处理,因此会重置HLog中的数据到MemStore中,最后刷新至StoreFile文件中完成数据恢复。

了解HBase数据模型

HBase实际上是一个稀疏、多维、持久化存储的映射表,采用行键(Row Key)、列族(Column Family)、列限定符(Column
Qualifier)和时间戳(Timestamp)进行索引,每个值都是未经解释的字节组成byte[],没有数据类型数据模型,具体如下表所示。

3

  • 用户在表中存储数据,每一行都有一个可排序的行键和任意多的列。列族支持动态扩展,可以很轻松地添加一个列族或列,无须预先定义列的数量以及类型,所有列均以字符串形式存储,用户需要自行进行数据类型转换。由于同一张表里面的每一行数据都可以有截然不同的列,对于整个映射表的每行数据而言,有些列的值可以是空的,因此HBase是稀疏的。
  • 在HBase中执行更新操作时,会生成一个新的版本,旧的版本仍然保留,HBase可以对允许保留的版本的数量进行设置。数据在存储时是按照时间戳排序的,客户端可以选择获取距离某个时间最近的版本,或一次获取所有版本。如果在查询的时候不提供时间戳,那么会返回距离现在最近的一个版本的数据。HBase提供了两种数据版本回收方式,一是保存数据的最后n个版本;二是保存最近一段时间内的版本(如最近7天)。
    1.行键(Row Key)
  • Row Key表示行键,每个HBase表中只能有一个行键,类似于主键。由于Row Key是HBase表的唯一标识,因此Row
    Key的设计非常重要。数据的存储规则是相近的数据存储在一起。
  • 例如,RowKey格式为www.cqyti.com、sxy.cqyti.com、dsj.cqyti.com和zngc.cqyti.com的网站名称时,可以将网站名称进行反转,反转后为com.cqyti.www、com.cqyti.sxy、com.cqyti.dsj和com.cqyti.zngc,再进行存储,所有com.cqyti域名将会存储在一起,避免子域名(即www,sxy、dsj、zngc)分散在各处。
    2.列族(Column Family)
  • 在HBase中,列族由一个或多个列组成。HBase会尽量把同一个列族的列放在同一个服务器上,可以提高读写数据的性能,并且可以批量管理多个有关联的列。HBase中数据的属性均是定义在列族上,同一个列族内的所有列具有相同的属性。在HBase中创建数据表时,定义的是列族,而不是列。在表中,cl、c2、c3均为列族名。
    3. 列名(Column)
  • HBase表的列是由列族名、限定符以及列名组成,如列名c1:col-1,其中,“c1”为列族名,“:”为限定符,“col-1”为列名。创建HBase表不需要指定列,因为列是可变的,非常灵活。
    4.时间戳(Timestamp)
  • 在HBase表中,通过行键、列族和列名确定一个单元格(Cell)。单元格中存储的数据没有数据类型,被视为byte[]字节数组。每个单元格都保存着同一份数据的多个版本,每个版本对应一个不同的时间戳。每次对一个单元格执行操作(新建、修改、删除)时,HBase将隐式地自动生成并存储一个时间戳。
  • 时间戳一般是64位整型数据,可以由用户自己赋值(自己生成唯一时间戳可以避免应用程序中出现数据版本冲突),也可以由HBase在数据写入时自动赋值。一个单元格的不同版本根据时间戳进行降序存储,因此,最新版本的数据可以被优先读取,通常将记录每次操作数据的时间戳记作数据的版本号。

了解HBase读写流程


对HBase进行读写,那么首先需要访问ZooKeeper集群,获得-ROOT-表的Region所在Regionserver地址信息,ROOT表结构和.meta.表类似,如下表所示。
4
1. 写流程

当用户向HRegionServer发起HTable.put请求,即写入数据请求时,会将请求交给对应的HRegion实例处理,具体流程如图所示。
5

  • 根据图可知,客户端访问ZooKeeper集群,查询-ROOT-表Region所在的RegionServer地址信息。如RS1,客户端将连接RS1,访问-ROOT-表,根据写入信息查询.meta.表的Region所在的Regionserver地址信息,将得到的结果返回给客户端。
  • 客户端将连接相应的RS,访问.meta.表,根据写入的NameSpace(命名空间)、表名和RowKey找到对应的Region信息;为了持久化和恢复,将数据先写至HLog中,再将数据写入至MemStore,当MemStore达到预设阈值后,将创建一个新的MemStore,而旧的MemStore就会加入Flush队列,由单独的线程Flush至磁盘上,形成一个StoreFile。
  • 同时,系统将在ZooKeeper集群中记录一个CheckPoint(检查点),表示该时刻前的数据变更已经持久化了,当系统出现意外可能导致MemStore中的数据丢失时,即可通过HLog恢复CheckPoint之后的数据;
    StoreFile文件是只读的,一旦创建后不可修改,因此HBase的更新是不断追加的操作。
    2. 读流程
    当用户向HRegionServer发起读取数据请求时,会将请求交给对应的HRegion实例处理,具体流程如图所示。
    6
  • 客户端访问ZooKeeper集群,查找元数据表在哪个RegionServer上,并访问对应RegionServer上元数据表中的数据,查找要操作RowKey所在表对应Region所在的RegionServer。接着客户端将读取RegionServer上的Region数据。
  • 客户端定位到真正的数据所在的Region时,先从MemStore进行查找,如果MEMstore没有,那么再从块缓存查找;如果块缓存没有,那么再从StoreFile查找数据,查找到数据后同时将数据进行缓存。
    想要了解更多可以点击这里
  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值