一、HBase存储概述
HBase架构图
zkCli.sh
ls /
ls /ls/hbase
get /ls/hbase/meta-region-server
=================================
user-table
user
regions(startkey,endkey)
user,region-01,regionserver-03
HBase新版本中,有类似于RDBMS中DataBase的概念—————命名空间。
用户自定义的表,默认情况下命名空间为default。
系统自带的元数据表的命名空间为hbase。
list_namespace_tables 'hbase'
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
user-table用户表,表中有很多的region,其中region的信息保存在hbase:meta(RegionServer)中。
客户端不管是读数据,还是写数据,都要首先连接Zookeeper,从Zookeeper上得到hbase:meta表的region所在的RegionServer。
RegionServer是用来管理Region的。
client -> zookeeper -> hbase:meta(RegionServer) -> uesr-table(RegionServer) -> put/get/scan
get /ls/hbase/meta-region-server
===========================================
HMaster也要去连接Zookeeper,它需要知道哪些RegionServer是活着的。
ls /hbase/rs(regionserver)
get /hbase/rs
表中有几个列簇,就有几个Store。
Store中有一个MemStore,有多个StoreFile。
MemStore是对应于内存的
StoreFile是实际的文件,是对HFile的封装,其中H表示HDFS。
==============================================================
二、HBase数据存储
HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,主要包括上述提出的两种文件类型:
* HFile:HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,
实际上StoreFile就是对HFile做了轻量级包装,进行数据的存储。
* HLogFile:HBase中WAL(Write Ahead Log)的存储格式,物理上是Hadoop的Sequence File。
1、HRegion Server
* HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了table中的一个region,
HRegion中由多个HStore组成。每个HStore对应了Table中的一个column family的存储,可以看出每个column family其实就是一个集中的存储单元,因此最好将具备共同特性的column放在一个column family中,这样最高效。
* HStore存储是HBase存储的核心,由两部分组成,一部分是MemStore,一部分是StoreFile。MemStore是Sorted Memory Buffer,用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile)。
2、Memstore & StoreFile
* Client写入->存入MemStore,一直到MemStore满-> Flush成一个StoreFile,直至增长到一定阀值-> 触 发Compact合并操作-> 多个StoreFile Compact后,逐步形成越来越大的StoreFile ->单个StoreFile大小超过一定阀值后,触发Split操作,把当前Region Split成2个Region,当前Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。
* HBase只是增加数据,所有的更新和删除操作,都是在Compact阶段做的,所以,用户写操作只需要进入到内存即可立即返回,从而保证I/O高性能。
3、HLog文件结构
* WAL意为Write ahead log,类似于MySQL中的binlog,用来做灾难恢复。
* Hlog记录数据的所有变更,一旦数据修改,就可以从log中进行恢复。每个HRegionServer维护一个HLog,
而不是每个HRegion一个。
这样不同Region(来自不同table)的日志会混在一起,
这样做的目的是不断追加单个文件,相对于同时写多个文件而言,
可以减少磁盘寻址次数,因此可以提高对table的写性能。
带来的麻烦是,如果一台HRegionServer下线,为了恢复其上的region,
需要将HRegionServer上的log进行拆分,然后分发到其它HRegionServer上进行恢复。