HBase是一个基于HDFS构建的分布式数据库系统,具有良好的扩展性、容错性以及易用的API。核心思想是将表中数据按照rowkey排序后,切分成若干region,并存储到多个节点上。HBase采用了经典的主从软件架构,其中主服务被称为HMaster,负责管理从节点、数据负载均衡及容错等,Hmaster是无状态的,所有元信息保存在ZooKeeper中,从服务被称为RegionServer,负责Region的读写,HMaster和RegionServer之间通过ZooKeeper进行服务协调。HBase提供了丰富的访问方式,用户可以通过Hbase shell、Hbase API、数据收集组件、计算引擎等存取HBase上的文件。
逻辑数据模型是用户从数据库所看到的模型,直接与HBase数据建模相关。
类似于数据库中的database和table逻辑概念,HBase称为namespace和table,一个namespace中包含一组table,HBase内置了两个默认的namespace。
HBase表由一系列行构成,每行数据有一个rowkey,以及若干column family构成,每个column family可包含无限列。
从另外一个角度理解HBase的逻辑数据模型:将HBase表看成一个有序多维映射表。
HBase也可以看作一个key/value存储系统,rowkey是key,其他部分是value,也可以将[row key,column family ,column qualifier,timestamp]看做key,Cell中的值对应value,举例如下:
axx,CF1,col A,timestamp1:val
HBase是列式存储引擎,以column family为单位存储数据,每个column family内部数据是以key value格式保存的,key value组成如下:
[row key,column family,column qualifier,timestamp] => value
数据在存储介质中按照下图所示的形式保存:
从保存形式上可以看出,每行数据中不同版本的cell value会重复保存rowkey,column family和column qualifier,因此为了节省存储空间,这几个字段值在保证业务易理解的前提下尽可能短。
在HBase中,同一表中的数据是按照rowkey升序排列的,同一行中的不同列是按照column qualifier升序排列的,同一cell中的数值是按照版本号(时间戳)降序排列的。HBase表从逻辑视图到物理视图的映射。
HBase是列簇式存储引擎,即同一列簇中的数据会单独存储,但列簇内数据是行式存储的。
为了将数据表分布到进群中以提供并行读写服务,HBase按照rowkey将数据划分成多个固定大小的有序分区,每个分区被称为一个"region",这些region会被均衡地存放在不同节点上。HBase是构建在HDFS之上的,所有的region均会以文件的形式保存到HDFS上,以保证这些数据的高可靠存储。
HBase采用了经典的master/slave架构,master与slave不直接互连,而是通过引入ZooKeeper让两类服务解耦,使得HBase master变得完全无状态,进而避免了master宕机导致整个集群不可用。
HMaster可以存在多个,主HMaster由ZooKeeper动态选举产生,当主HMaster出现故障后,系统可由ZooKeeper动态选举出的新HMaster接管。HMaster本身是无状态的(所有状态信息均保存至ZooKeeper中),主HMaster挂掉后,不会影响正常的读写服务。
HMaster主要有以下职责:
Client读写操作过程是不需要与HMaster进行交互的,而是直接与RegionServer通信来完成的。
RegionServer负责单个Region的存储和管理(比如Region切片),并与Client交互处理读写请求。
ZooKeeper内部存储着有关HBase的重要元信息和状态信息,担任着Master与RegionServer之间的服务协调角色,具体职责如下:
Client提供HBase访问接口,与RegionServer交互读写数据,并维护cache加快对HBase的访问速度。
HBase是构建在HDFS之上的,利用HDFS可靠地存储数据文件,其内部则包含Region定位、读写流程管理和文件管理等实现。
HBase支持put、get、delete、scan等基础操作,所有这些操作的基础是region定位。给定一个rowkey或rowkey区间,获取rowkey所在的RegionServer地址如下所示:
1)客户端与ZooKeeper交互,查找hbase:meta系统表所在的RegionServer,hbase:meta表维护了每个用户表中rowkey区间与Region存放位置的映射关系,具体如下:
rowkey:table name,start key,region id
value:RegionServer对象(保存了RegionServer位置信息等)
2)客户端与hbase:meta系统表所在RegionServer交互,获取rowkey所在的RegionServer.
3) 客户端与rowkey所在的RegionServer交互,执行该rowkey相关操作。
注意:客户端首次执行读写操作时才需要定位hbase:meta表的位置,之后会将其缓存到本地,除非因region移动导致缓存失效,客户端才会重新读取hbase:meta表位置,并更新缓存。
(1)写流程
RegionServer将所有收到的写请求暂时写入内存,之后再顺序刷新到磁盘上,进而将随机写转化未顺序写以提升性能。
具体流程如下:
(2)读流程
由于写流程可能使得数据位于内存中或磁盘上,因此读取数据时,需要从多个数据存放位置中寻找数据,包括读缓存BlockCache、写缓存MemStore,以及磁盘上的HFile文件(可能有多个),并将读到的数据合并在一起返回给用户。
具体流程如下:
MemStore负责将最近写入的数据缓存到内存中,是一个有序Key/Value内存存储格式,每个colum family拥有一个MemStore。
MemStore中的数据量达到一定阙值后,会被刷新到HDFS文件中,保存成HFile格式。HFile是Google SSTable(Sorted String Table,Google BigTable中用到的存储格式)的开源实现,是一种有序Key/Value磁盘存储格式,带有多级索引,以方便定位数据,HFile中的多级索引类似于B+树。
HBase提供了多种访问方式,包括HBase shell、HBase API、数据收集组件(Sqoop等)、上层计算框架等。
可以通过"$HBASE_HOME/bin/hbase shell"命令进入交互式命令行。
bin/hbase shell
1)DDL:作用在HBase表(元信息)上的命令,主要包括如下命令:
create 'table name','column family'
create 'employee','personal','office'
注意:创建HBase表需要指定所包含的column family,无需指定具体的列。
2) DML:作用在数据上的命令,主要包括如下命令。
put 'table name','rowkey','column family:column qualifier', ‘value'
get 'table naem','rowkey','column family:column qualifier','timestamp'
delete 'table name','rowkey','column family:column qualifier','timestamp'
delete 'table name','rowkey'
scan 'table name'[,{filter1,filter2,...}]
例如:
scan 'hbase:meta',{COLUMNS => 'info:regioninfo',LIMIT => 10}
count 'table name'
创建表
create 'employee','personal','office'
将下面shell命令写入文本文件add_employee.txt中:
put 'employee','00001','personal:name','鸣人'
put 'employee','00001','personal:gender','man'
put 'employee','00001','office:phone','12345678901'
put 'employee','00001','office:salary','88888'
put 'employee','00002','personal:name','犬夜叉'
put 'employee','00002','personal:gender','man'
put 'employee','00002','personal:address','beijing'
put 'employee','00002','office:salary','99999'
以非交互模式执行add_employee.txt中所有命令:
$HBASE_HOME/bin/hbase shell ./add_employee.txt
使用scan命令查看表中的数据:
scan 'employee'
HBase提供了TableInputFormat和TableOutputFormat两个组件供各类计算引擎并行读取或写入HBase中的数据,TableInputFormat以HBase Region为单位划分数据,每个Region会被映射成一个InputSplit,可被一个任务处理;TableOutputFormat可将数据插入到HBase中。