系統(tǒng)架構(gòu)圖
從HBase的架構(gòu)圖上可以看出,HBase中的組件包括Client、Zookeeper、HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog等,接下來介紹他們的作用
- Client
1、HBase 有兩張?zhí)厥獗恚?/li>
.META.:記錄了用戶所有表拆分出來的的 Region 映射信息,.META.可以有多個 Regoin
-ROOT-:記錄了.META.表的 Region 信息,-ROOT-只有一個 Region,無論如何不會分裂
2、Client 訪問用戶數(shù)據(jù)前需要首先訪問 ZooKeeper,找到-ROOT-表的 Region 所在的位置,然 后訪問-ROOT-表,接著訪問.META.表,最后才能找到用戶數(shù)據(jù)的位置去訪問,中間需要多次 網(wǎng)絡(luò)操作,不過 client 端會做 cache 緩存。
- zookeeper
- ZooKeeper 為 HBase 提供 Failover 機(jī)制,選舉 Master,避免單點(diǎn) Master 單點(diǎn)故障問題
- 存儲所有 Region 的尋址入口:-ROOT-表在哪臺服務(wù)器上。-ROOT-這張表的位置信息
- 實時監(jiān)控 RegionServer 的狀態(tài),將 RegionServer 的上線和下線信息實時通知給 Master
- 存儲 HBase 的 Schema,包括有哪些 Table,每個 Table 有哪些 Column Family
- Master
- 為 RegionServer 分配 Region
- 負(fù)責(zé) RegionServer 的負(fù)載均衡
- 發(fā)現(xiàn)失效的 RegionServer 并重新分配其上的 Region
- HDFS 上的垃圾文件(HBase)回收
- 處理 Schema 更新請求(表的創(chuàng)建,刪除,修改,列簇的增加等等)
- RegionServer
- RegionServer 維護(hù) Master 分配給它的 Region,處理對這些 Region 的 IO 請求
- RegionServer 負(fù)責(zé) Split 在運(yùn)行過程中變得過大的 Region,負(fù)責(zé) Compact 操作
可以看到,client 訪問 HBase 上數(shù)據(jù)的過程并不需要 master 參與(尋址訪問 zookeeper 和 RegioneServer,數(shù)據(jù)讀寫訪問 RegioneServer),Master 僅僅維護(hù)者 Table 和 Region 的元數(shù)據(jù)信息,負(fù)載很低。
.META.存的是所有的 Region 的位置信息,那么 RegioneServer 當(dāng)中 Region 在進(jìn)行分裂之后 的新產(chǎn)生的 Region,是由 Master 來決定發(fā)到哪個 RegioneServer,這就意味著,只有 Master 知道 new Region 的位置信息,所以,由 Master 來管理.META.這個表當(dāng)中的數(shù)據(jù)的 CRUD
所以結(jié)合以上兩點(diǎn)表明,在沒有 Region 分裂的情況,Master 宕機(jī)一段時間是可以忍受的。
- HRegion
table在行的方向上分隔為多個Region。Region是HBase中分布式存儲和負(fù)載均衡的最小單元,即不同的region可以分別在不同的Region Server上,但同一個Region是不會拆分到多個server上。
Region按大小分隔,每個表一般是只有一個region。隨著數(shù)據(jù)不斷插入表,region不斷增大,當(dāng)region的某個列族達(dá)到一個閾值時就會分成兩個新的region。
每個region由以下信息標(biāo)識:< 表名,startRowkey,創(chuàng)建時間>
由目錄表(-ROOT-和.META.)記錄該region的endRowkey - Store
每一個region由一個或多個store組成,至少是一個store,hbase會把一起訪問的數(shù)據(jù)放在一個store里面,即為每個 ColumnFamily建一個store,如果有幾個ColumnFamily,也就有幾個Store。一個Store由一個memStore和0或者 多個StoreFile組成。 HBase以store的大小來判斷是否需要切分region - MemStore
memStore 是放在內(nèi)存里的。保存修改的數(shù)據(jù)即keyValues。當(dāng)memStore的大小達(dá)到一個閥值(默認(rèn)128MB)時,memStore會被flush到文 件,即生成一個快照。目前hbase 會有一個線程來負(fù)責(zé)memStore的flush操作。 - StoreFile
memStore內(nèi)存中的數(shù)據(jù)寫到文件后就是StoreFile,StoreFile底層是以HFile的格式保存。 - HFile
HBase中KeyValue數(shù)據(jù)的存儲格式,HFile是Hadoop的 二進(jìn)制格式文件,實際上StoreFile就是對Hfile做了輕量級包裝,即StoreFile底層就是HFile - HLog
HLog(WAL log):WAL意為write ahead log,用來做災(zāi)難恢復(fù)使用,HLog記錄數(shù)據(jù)的所有變更,一旦region server 宕機(jī),就可以從log中進(jìn)行恢復(fù)。
HLog文件就是一個普通的Hadoop Sequence File, Sequence File的value是key時HLogKey對象,其中記錄了寫入數(shù)據(jù)的歸屬信息,除了table和region名字外,還同時包括sequence number和timestamp,timestamp是寫入時間,sequence number的起始值為0,或者是最近一次存入文件系統(tǒng)中的sequence number。 Sequence File的value是HBase的KeyValue對象,即對應(yīng)HFile中的KeyValue。
讀流程
- 客戶端通過 ZooKeeper 以及-ROOT-表和.META.表找到目標(biāo)數(shù)據(jù)所在的 RegionServer(就是 數(shù)據(jù)所在的 Region 的主機(jī)地址)
- 聯(lián)系 RegionServer 查詢目標(biāo)數(shù)據(jù)
- RegionServer 定位到目標(biāo)數(shù)據(jù)所在的 Region,發(fā)出查詢請求
- Region 先在 Memstore 中查找,命中則返回
- 如果在 Memstore 中找不到,則在 Storefile 中掃描 為了能快速的判斷要查詢的數(shù)據(jù)在不在這個 StoreFile 中,應(yīng)用了 BloomFilte
BloomFilter,布隆過濾器:迅速判斷一個元素是不是在一個龐大的集合內(nèi),但是他有一個 弱點(diǎn):它有一定的誤判率
寫流程
- Client 先根據(jù) RowKey 找到對應(yīng)的 Region 所在的 RegionServer
- Client 向 RegionServer 提交寫請求
- RegionServer 找到目標(biāo) Region
- Region 檢查數(shù)據(jù)是否與 Schema 一致
- 如果客戶端沒有指定版本,則獲取當(dāng)前系統(tǒng)時間作為數(shù)據(jù)版本
- 將更新寫入 WAL Log
- 將更新寫入 Memstore
- 判斷 Memstore 的是否需要 flush 為 StoreFile 文件。
