【HBase】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]