传统的RDBMS关系型数据库(例如SQL)存储一定量数据时进行数据检索没有问题,可当数据量上升到非常巨大规模的数据(TB或PB)级别时,传统的RDBMS已无法支撑,这时候就需要一种新型的数据库系统更好更快的处理这些数据,我们可以选择HBase。本文我们开始HBase部分的内容,关注专栏《破茧成蝶——大数据篇》,查看更多相关的内容~
目录
一、HBase是什么
HBase(Hadoop Database)是一个开源的、面向列(Column-Oriented)、适合存储海量非结构化数据或半结构化数据的、具备高可靠性、高性能、可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据。
二、HBase的特点
1、海量存储
HBase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据。这与HBase的极易扩展性息息相关。正式因为HBase良好的扩展性,才为海量数据的存储提供了便利。
2、列式存储
这里的列式存储其实说的是列族(ColumnFamily)存储,HBase是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定。
3、极易扩展
HBase的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。通过横向添加RegionSever的机器,进行水平扩展,提升HBase上层的处理能力,提升HBase服务更多Region的能力。RegionServer的作用是管理region、承接业务的访问,这个后面会详细的介绍通过横向添加Datanode的机器,进行存储层扩容,提升HBase的数据存储能力和提升后端存储的读写能力。
4、高并发
由于目前大部分使用HBase的架构,都是采用的廉价PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,HBase的单个IO延迟下降并不多。能获得高并发、低延迟的服务。
5、稀疏
稀疏主要是针对HBase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。
三、HBase的架构
3.1 HBase的基本组件
从上图可以看出HBase是由Client、Zookeeper、HMaster、HRegionServer、HDFS等几个组件组成,下面我们分别来看一下这几个组件。
3.1.1 Client
Client有以下几点作用:
1. 整个HBase集群的访问入口;
2. 使用HBase RPC机制与HMaster和HRegionServer进行通信;
3. 使用HMaster进行通信进行管理类操作;
4. 与HRegionServer进行数据读写类操作;
5. 包含访问HBase的接口,并维护cache来加快对HBase的访问。
3.1.2 HMaster
Master节点的主要职责如下:
1、为RegionServer分配Region。
2、维护整个集群的负载均衡。
3、维护集群的元数据信息。
4、发现失效的Region,并将失效的Region分配到正常的RegionServer上。
5、当RegionSever失效的时候,协调对应Hlog的拆分。
3.1.3 HRegionServer
HRegionServer直接对接用户的读写请求。它的功能概括如下:
1、管理master为其分配的Region。
2、处理来自客户端的读写请求。
3、负责和底层HDFS的交互,存储数据到HDFS。
4、负责Region变大以后的拆分。
5、负责Storefile的合并工作。
3.1.4 Region
HBase表的分片,HBase表会根据RowKey值被切分成不同的Region存储在RegionServer中,在一个RegionServer中可以有多个不同的Region。
3.1.5 Store
HFile存储在Store中,一个Store对应HBase表中的一个列族(列簇, Column Family)。
3.1.6 MemStore
内存存储,位于内存中。用来保存当前的数据操作,所以当数据保存在WAL中之后,RegsionServer会在内存中存储键值对。
3.1.7 HFile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile是以HFile的形式存储在HDFS的。
3.2 HDFS
HDFS为HBase提供最终的底层数据存储服务,同时为HBase提供高可用(Hlog存储在HDFS)的支持,具体功能概括如下:
1、提供元数据和表数据的底层分布式存储服务。
2、数据多副本,保证的高可靠和高可用性。
3.3 Zookeeper
HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。具体工作如下:
1、通过Zoopkeeper来保证集群中只有1个master在运行,如果master异常,会通过竞争机制产生新的master提供服务。
2、通过Zoopkeeper来监控RegionServer的状态,当RegionSevrer有异常的时候,通过回调的形式通知Master RegionServer上下线的信息。
3、通过Zoopkeeper存储元数据的统一入口地址。
3.4 Write-Ahead logs
HBase的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
四、HBase的数据结构
4.1 RowKey
RowKey是用来检索记录的主键。访问HBase table中的行,只有三种方式:
1、通过单个RowKey访问(get);
2、通过RowKey的range(正则)(like);
3、全表扫描(scan)。
RowKey行键可以是任意字符串(最大长度是64KB,实际应用中长度一般为 10-100bytes)。在HBase内部,RowKey保存为字节数组。存储时,数据按照RowKey的字典序(byte order)排序存储。设计RowKey时,要充分考虑排序存储这个特性,将经常一起读取的行存储放到一起。
4.2 Column Family
HBase表中的每个列,都归属于某个列族。列族是表的schema的一部分,而列不是。列族必须在使用表之前定义,列名都以列族作为前缀。
4.3 Cell
由{rowkey, column Family:columu, version} 唯一确定的单元。cell中的数据是没有类型的,全部以字节码形式存贮。
4.4 TimeStamp
HBase中通过rowkey和columns确定的为一个存贮单元称为cell。每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由HBase在数据写入时自动赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理(包括存贮和索引)负担,HBase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天),用户可以针对每个列族进行设置。
4.5 namespace
命名空间中包含了table、RegionServer group、Permission和Quota。
1、Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在default默认的命名空间中。
2、RegionServer group:一个命名空间包含了默认的RegionServer Group。
3、Permission:权限,命名空间能够让我们来定义访问控制列表ACL(Access Control List)。例如,创建表,读取表,删除,更新等等操作。
4、Quota:限额,可以强制一个命名空间可包含的region的数量。
本文主要是对HBase进行的一个简单介绍,包括HBase的特点、架构以及数据结构。你们在此过程中遇到了什么问题,欢迎留言,让我看看你们都遇到了哪些问题~