【HBase】HBase的物理模型及数据存储

1、HBase物理模型

(1)Table在行的方向上分割为多个Region。
(2)Table中的所有行都按照row key的字典序排列,根据rowkey存储在不同的Region上。
(3)Region是按大小分割的,每个表开始只有一个region,随着数据增多,region不断增大,当增大到一个阈值的时候,region就会等分成两个新的region,之后会有越来越多的region。
(4)Region是HBase中分布式存储和负载均衡的最小单元。不同Region分布到不同RegionServer上。移动的时候是移动一个Region,进行不同RegionServer之间的负载均衡。
(5)Region虽然是分布式存储的最小单元,但并不是存储的最小单元,存储的最小单元是Cell。Region由一个或者多个Store组成,每个store保存一个columns family列簇。每个store又由一个memStore和0至多个StoreFile组成。memStore存储在内存中,StoreFile存储在HDFS上。memStore是内存中划分的一个区间,StoreFile是底层存储在HDFS上的文件。
(6)每个column family存储在HDFS上的一个单独文件中。Key和Version number在每个column family中均有一份。空值不会被保存。

2、HBase体系架构

【HBase】HBase的物理模型及数据存储_第1张图片

3、HBase数据存储

(1)HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,主要包括上述提出的两种文件类型:
1)HFile:HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,进行数据的存储。
2)HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File。
(2)HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了table中的一个region,HRegion中由多 个HStore组成。每个HStore对应了Table中的一个column family的存储,可以看出每个columnfamily其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在一个column family中,这样最高效。
(3)HStore存储是HBase存储的核心,由两部分组成,一部分是MemStore,一部分是StoreFile。MemStore是 Sorted Memory Buffer,用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile)。用户可以手动flush,将内存中的数据直接溢写到磁盘上,进行手动干预。
(4)Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 出发Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。
(5)HBase只是增加数据,有所得更新和删除操作,都是在Compact阶段做的,所以,用户写操作只需要进入到内存即可立即返回,从而保证I/O高性能。
(6)WAL意为Write ahead log,类似Mysql中的binlog,用来做灾难恢复。在写数据时会先往Hlog写一份,然后往内存写,以避免内存丢失数据。可以从日志文件中恢复Hlog记录数据的所有变更,一旦数据修改,就可以从log中进行恢复。每个HRegionServer维护一个HLog,而不是每个HRegion一个。这样不同region(来自不同table)的日志会混在一起,这样做的目的是不断追加单个文件相对于同时写多个文件而言,可以减少磁盘寻址次数,因此可以提高对table的写性能。带来的麻烦是,如果一台HRegionServer下线,为了恢复其上的region,需要将HRegionServer上的log进行拆分,然后分发到其它HRegionServer上进行恢复。

4、ZooKeeper中的操作

hbase:namespace表存储hbase中所有namespace的信息,hbase:meta表记录元数据,它的rowkey存储的是hbase中所有表的region名称。

HBase的读数据流程:
(1)Zookeeper中存储meta对应的regionserver和region信息,用户的发送的请求都会先去找到ZooKeeper;
(2)在ZooKeeper上获取meta的元数据信息;
(3)根据元数据记录找到meta表的region被哪个regionserver所管理;
(4)找到meta表所在的region;
(5)找到meta中记录的各个表所在的regionserver;
(6)找到所要查找的表的rowkey在哪个region上;
(7)读取rowkey,找到所要查找的记录。
HBase的写数据流程:
(1)写HLog日志;
(2)写MemStore;
(3)MemStore满后溢写到storefile。

在zookeeper上查看保存region元数据的regionserver:
zookeeper-3.4.5]$ bin/zkServer.sh start
zookeeper-3.4.5]$ bin/zkCli.sh

[zk: localhost:2181(CONNECTED) 0] ls /
[hbase, zookeeper]
[zk: localhost:2181(CONNECTED) 4] get /hbase/meta-region-server
cZxid = 0x60
ctime = Mon Jul 23 17:30:05 CST 2018
mZxid = 0x60
mtime = Mon Jul 23 17:30:05 CST 2018
pZxid = 0x60
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 78
numChildren = 0

5、HBase Shell中的操作

hbase-0.98.6-hadoop2]$ bin/hbase shell
(1)查看hbase中的命名空间。hbase默认有两个命名空间:用户自定义的表默认情况下的命名空间是default,系统自带的元数据表的命名空间为hbase。

hbase(main):001:0> list_namespace
NAMESPACE                                                                                                                             
2018-07-23 17:54:56,778 WARN  [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
default                                                                                                                               
hbase                                                                                                                                 
2 row(s) in 2.5020 seconds

(2)列出命名空间hbase中的表:

hbase(main):002:0> list_namespace_tables 'hbase'
TABLE                                                                                                                                 
meta                                                                                                                                  
namespace                                                                                                                             
2 row(s) in 0.2680 seconds

(3)查看hbase命名空间中的meta表:

hbase(main):003:0> scan 'hbase:meta'

[zk: localhost:2181(CONNECTED) 2] ls /hbase/rs 
[hadoop-senior.ibeifeng.com,60020,1533075373902]

你可能感兴趣的:(BigData,Components,BigData)