HBase筆記 儲存結構

2021-08-28 02:26:13 字數 3965 閱讀 3879

從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是寫入時間,equence number的起始值為0,或者是最近一次存入檔案系統中的equence 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(預設是10秒),定期呼叫hlog.sync()。另外,hlog.dowrite()也會根據hbase.regionserver.flushlogentries(預設100秒)定期呼叫hlog.sync()。sync() 本身呼叫hlog.writer.sync(),它由sequencefilelogwriter實現。

logroller

log的大小通過$hbase_home/conf/hbase-site.xml 的hbase.regionserver.logroll.period限制,預設是乙個小時。所以每60分鐘,會開啟乙個新的log檔案。久而久之,會有一大堆的檔案需要維護。首先,logroller呼叫hlog.rollwriter(),定時滾動日誌,之後,利用hlog.cleanoldlogs()可以清除舊的日誌。它首先取得儲存檔案中的最大的sequence number,之後檢查是否存在乙個log所有的條目的「sequence number」均低於這個值,如果存在,將刪除這個log。

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

HBase筆記 儲存結構

從hbase的架構圖上可以看出,hbase中的儲存包括hmaster hregionserver hregion store memstore storefile hfile hlog等,本篇文章統一介紹他們的作用即儲存結構。以下是網路上流傳的hbase儲存架構圖 hbase中的每張表都通過行鍵按照...

Hbase 儲存結構

store region中更小的儲存單元 memstore store中儲存資料的記憶體區域 storefile 每個store中記憶體重新整理出來的檔案就是storefile 2 邏輯結構 3 物理結構 4 儲存架構 整個hbase 中所有的資料都是按照rowkey順序排列的 查詢資料時可以根據r...

HBase學習筆記 hbase集群結構

hbase基本元件說明 client 包含訪問hbase的介面,並維護cache來加快對hbase的訪問,比如region的位置資訊。hmaster 是hbase集群的主節點,可以配置多個,用來實現ha 為regionserver分配region 負責regionserver的負載均衡 發現失效的r...