![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SO0ATOmBzN3cTZwAzN1czNxkjNlhjY0QmN1YzY5cDZ48CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
HBase中的每張表都通過鍵按照一定的範圍被分割成多個子表(HRegion),預設一個HRegion超過256M就要被分割成兩個,這個過程由HRegionServer管理,而HRegion的配置設定由HMaster管理。
HMaster的作用:
- 為HRegionServer配置設定HRegion
- 負責HRegionServer的負載均衡
- 發現失效的HRegionServer并重新配置設定
- HDFS上的垃圾檔案回收
- 處理Schema更新請求
HRegionServer的作用:
- 維護HMaster配置設定給它的HRegion,處理對這些HRegion的IO請求
- 負責切分正在運作過程中變得過大的HRegion
可以看到,Client通路HBase上的資料并不需要HMaster參與,尋址通路ZooKeeper和HRegionServer,資料讀寫通路HRegionServer, HMaster僅僅維護Table和Region的中繼資料資訊,Table的中繼資料資訊儲存在ZooKeeper上,負載很低。HRegionServer存取一個子表時, 會建立一個HRegion對象,然後對表的每個列簇建立一個Store對象,每個Store都會有一個MemStore和0或多個StoreFile與之對應,每個StoreFile都會對應一個HFile,HFile就是實際的存儲檔案。是以,一個HRegion有多少列簇就有多少個Store。 一個HRegionServer會有多個HRegion和一個HLog。
HRegion
Table在行的方向上分割為多個HRegion,HRegion是HBase中分布式存儲和負載均衡的最小單元,即不同的HRegion可以分别在不同的HRegionServer上,但同一個HRegion是不會拆分到多個HRegionServer上的。HRegion按大小分割,每個表一般隻有一個HRegion,随着資料不斷插入表,HRegion不斷增大,當HRegion的某個列簇達到一個閥值(預設256M)時就會分成兩個新的HRegion。
1、<表名,StartRowKey, 建立時間>
2、由目錄表(-ROOT-和.META.)記錄該Region的EndRowKey
HRegion定位:HRegion被配置設定給哪個HRegionServer是完全動态的,是以需要機制來定位HRegion具體在哪個HRegionServer,HBase使用三層結構來定位HRegion:
1、通過zk裡的檔案/hbase/rs得到-ROOT-表的位置。-ROOT-表隻有一個region。
2、通過-ROOT-表查找.META.表的第一個表中相應的HRegion位置。其實-ROOT-表是.META.表的第一個region; .META.表中的每一個Region在-ROOT-表中都是一行記錄。
3、通過.META.表找到所要的使用者表HRegion的位置。使用者表的每個HRegion在.META.表中都是一行記錄。-ROOT-表永遠不會被分隔為多個HRegion,保證了最多需要三次跳轉,就能定位到任意的region。Client會将查詢的位置資訊儲存緩存起來,緩存不會主動失效, 是以如果Client上的緩存全部失效,則需要進行6次網絡來回,才能定位到正确的HRegion,其中三次用來發現緩存失效,另外三次用來擷取位置資訊。
Store
每一個HRegion由一個或多個Store組成,至少是一個Store,HBase會把一起通路的資料放在一個Store裡面,即為每個ColumnFamily建一個Store, 如果有幾個ColumnFamily,也就有幾個Store。一個Store由一個MemStore和0或者多個StoreFile組成。 HBase以Store的大小來判斷是否需要切分HRegion。
MemStore
MemStore 是放在記憶體裡的,儲存修改的資料即keyValues。當MemStore的大小達到一個閥值(預設64MB)時,MemStore會被Flush到檔案, 即生成一個快照。目前HBase會有一個線程來負責MemStore的Flush操作。
StoreFile
MemStore記憶體中的資料寫到檔案後就是StoreFile,StoreFile底層是以HFile的格式儲存。 HFileHBase中KeyValue資料的存儲格式,是Hadoop的二進制格式檔案。 首先HFile檔案是不定長的,長度固定的隻有其中的兩塊:Trailer和FileInfo。Trailer中有指針指向其他資料塊的起始點,FileInfo記錄了檔案的一些meta資訊。Data Block是HBase IO的基本單元,為了提高效率,HRegionServer中有基于LRU的Block Cache機制。每個Data塊的大小可以在建立一個Table的時候通過參數指定(預設塊大小64KB),大号的Block有利于順序Scan,小号的Block利于随機查詢。每個Data塊除了開頭的Magic以外就是一個個KeyValue對拼接而成,Magic内容就是一些随機數字,目的是防止資料損壞。
HLog :
HLog(WAL log):WAL意為write ahead log,用來做災難恢複使用,HLog記錄資料的所有變更,一旦region server 當機,就可以從log中進行恢複。
LogFlusher :定期的将緩存中資訊寫入到日志檔案中
LogRoller:對日志檔案進行管理維護