HBase儲存架構

2022-05-04 01:36:06 字數 3503 閱讀 3963

以下的介紹是基於apache hbase 0.94版本:

從hbase的架構圖上可以看出,hbase中的儲存包括hmaster、hregionserver、hregion、store、memstore、storefile、hfile、hlog等,本篇文章統一介紹他們的作用即儲存結構。

以下是hbase儲存架構圖:

hbase中的每張表都通過行鍵按照一定的範圍被分割成多個子表(hregion),預設乙個hregion超過256m就要被分割成兩個,這個過程由hregionserver管理,而hregion的分配由hmaster管理。

可以看到,client訪問hbase上的資料並不需要master參與(定址訪問zookeeper和region server,資料讀寫訪問region server),master僅僅維護table和region的元資料資訊(table的元資料資訊儲存在zookeeper上),負載很低。

hregionserver訪問乙個子表時,會建立乙個hregion物件,然後對錶的每個列族建立乙個store例項,每個store都會有乙個memstore和0個或多個storefile與之對應,每個storefile都會對應乙個hfile, hfile就是實際的儲存檔案。因此,乙個hregion有多少個列族就有多少個store。

乙個hregionserver會有多個hregion和乙個hlog。

table在行的方向上分隔為多個region。region是hbase中分布式儲存和負載均衡的最小單元,即不同的region可以分別在不同的region server上,但同乙個region是不會拆分到多個server上。

region按大小分隔,每個表一行是只有乙個region。隨著資料不斷插入表,region不斷增大,當region的某個列族達到乙個閾值(預設256m)時就會分成兩個新的region。

每個region由以下資訊標識:

hregion定位:

region被分配給哪個region server是完全動態的,所以需要機制來定位region具體在哪個region server。

hbase使用三層結構來定位region:

-root-表永遠不會被分隔為多個region,保證了最多需要三次跳轉,就能定位到任意的region。client會將查詢的位置資訊儲存快取起來,快取不會主動失效,因此如果client上的快取全部失效,則需要進行6次網路來回,才能定位到正確的region,其中三次用來發現快取失效,另外三次用來獲取位置資訊。

每乙個region有乙個或多個store組成,至少是乙個store,hbase會把一起訪問的資料放在乙個store裡面,即為每個columnfamily建乙個store,如果有幾個columnfamily,也就有幾個store。乙個store由乙個memstore和0或者多個storefile組成。

hbase以store的大小來判斷是否需要切分region。

memstore 是放在記憶體裡的。儲存修改的資料即keyvalues。當memstore的大小達到乙個閥值(預設64mb)時,memstore會被flush到檔案,即生成乙個快照。目前hbase 會有乙個執行緒來負責memstore的flush操作。

memstore記憶體中的資料寫到檔案後就是storefile,storefile底層是以hfile的格式儲存。

hbase中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內容就是一些隨機數字,目的是煩著資料損壞,結構如下。

hfile結構圖如下:

data block段用來儲存表中的資料,這部分可以被壓縮。

meta block段(可選的)用來儲存使用者自定義的kv段,可以被壓縮。

fileinfo段用來儲存hfile的元資訊,本能被壓縮,使用者也可以在這一部分新增自己的元資訊。

data block index段(可選的)用來儲存meta blcok的索引。

trailer這一段是定長的。儲存了每一段的偏移量,讀取乙個hfile時,會首先讀取trailer,trailer儲存了每個段的起始位置(段的magic number用來做安全check),然後,datablock index會被讀取到記憶體中,這樣,當檢索某個key時,不需要掃瞄整個hfile,而只需從記憶體中找到key所在的block,通過一次磁碟io將整個 block讀取到記憶體中,再找到需要的key。datablock index採用lru機制淘汰。

hfile的data block,meta block通常採用壓縮方式儲存,壓縮之後可以大大減少網路io和磁碟io,隨之而來的開銷當然是需要花費cpu進行壓縮和解壓縮。目標hfile的壓縮支援兩種方式:gzip、lzo。

另外,針對目前針對現有hfile的兩個主要缺陷:

提出了hfile version2設計:

其實hlog檔案就是乙個普通的hadoop sequence file, sequence file的value是key時hlogkey物件,其中記錄了寫入資料的歸屬資訊,除了table和region名字外,還同時包括sequence number和timestamp,timestamp是寫入時間,sequence number的起始值為0,或者是最近一次存入檔案系統中的sequence number。

sequence file的value是hbase的keyvalue物件,即對應hfile中的keyvalue。

hlog(wal log):wal意為write ahead log,用來做災難恢復使用,hlog記錄資料的所有變更,一旦region server 宕機,就可以從log中進行恢復。

logflusher

前面提到,資料以keyvalue形式到達hregionserver,將寫入wal,之後,寫入乙個sequencefile。看過去沒問題,但是因為資料流在寫入檔案系統時,經常會快取以提高效能。這樣,有些本以為在日誌檔案中的資料實際在記憶體中。這裡,我們提供了乙個logflusher的類。它呼叫hlog.optionalsync(),後者根據hbase.regionserver.optionallogflushinterval

logroller

每個region server維護乙個hlog,而不是每乙個region乙個,這樣不同region(來自不同的table)的日誌會混在一起,這樣做的目的是不斷追加單個檔案相對於同時寫多個檔案而言,可以減少磁碟定址次數,因此可以提高table的寫效能。帶來麻煩的時,如果乙個region server下線,為了恢復其上的region,需要講region server上的log進行拆分,然後分發到其他region server上進行恢復。

HBase權威指南,架構 儲存

hbase 主要處理兩種檔案 一種是預寫日誌 write ahead log,wal 另一種是實際的資料檔案。這兩種檔案主要由 hregionserver 管理。乙個基本的流程是客戶端首先聯絡 zookeeper 子集群 quorum 查詢行鍵,通過 zookeeper 獲取含有 root 的 re...

HBASE部分 HBASE的架構

hbase的架構 包含訪問hbase的介面並維護cache來加快對hbase的訪問 zookeeper 保證任何時候,集群中只有乙個master 存貯所有region的定址入口。實時監控region server的上線和下線資訊。並實時通知master 儲存hbase的schema和table元資料...

HBase 架構組成

主要負責hregionserver的協調管理及table的ddl操作 新增 更新和刪除 hregionserver的管理包含兩方面 監控hregionserver的執行狀態 從zk接受通知 region的分配 hregionserver擴容 宕機及負載均衡等情況 hmaster的ha解決方案 主備切...