HBase的物理模型及数据存储

1、HBase物理模型

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

2、HBase体系架构

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)。 (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记录数据的所有变更,一旦数据修改,就可以从log中进行恢复。每个HRegionServer维护一个HLog,而不是每个HRegion一个。这样不同region(来自不同table)的日志会混在一起,这样做的目的是不断追加单个文件相对于同时写多个文件而言,可以减少磁盘寻址次数,因此可以提高对table的写性能。带来的麻烦是,如果一台HRegionServer下线,为了恢复其上的region,需要将HRegionServer上的log进行拆分,然后分发到其它HRegionServer上进行恢复。

4、ZooKeeper中的操作

在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]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券