Hbase儲存格式

fudaliang1999發表於2013-12-18

一、 Hbase儲存框架

 

Hbase儲存格式
 

 

 Hbase儲存架構圖 

 

1、  結構

HBase中的每張表都透過行鍵按照一定的範圍被分割成多個子表(HRegion),預設一個HRegion超過256M就要被分割成兩個,由HRegionServer管理,管理哪些HRegionHMaster分配。

HRegionServer存取一個子表時,會建立一個HRegion物件,然後對錶的每個列族(Column Family)建立一個Store例項,每個Store都會有0個或多個StoreFile與之對應,每個StoreFile都會對應一個HFile HFile就是實際的儲存檔案。因此,一個HRegion有多少個列族就有多少個Store

另外,每個HRegion還擁有一個MemStore例項。

(發現上圖中一個錯誤,一個HRegionServer只對應一個HLog,也就是說同個HRegionServer中的HRegion共享一個HLog

2、  流程

a)        Client發起了一個HTable.put(Put)請求給HRegionServer

b)        HRegionServer會將請求匹配到某個具體的HRegion上面

c)         決定是否寫WAL logWAL log檔案是一個標準的Hadoop SequenceFile,檔案中儲存了HLogKey,這些Keys包含了和實際資料對應的序列號,主要用於崩潰恢復。

d)        Put資料儲存到MemStore中,同時檢查MemStore狀態,如果滿了,則觸發Flush to Disk請求。

e)        HRegionServer處理Flush to Disk的請求,將資料寫成HFile檔案並存到HDFS上,並且儲存最後寫入的資料序列號,這樣就可以知道哪些資料已經存入了永久儲存的HDFS中。

二、 Hbase儲存格式

HBase是基於BigTable的面向列的分散式儲存系統,其儲存設計是基於Memtable / SSTable設計的,主要分為兩部分,一部分為記憶體中的MemStore (Memtable),另外一部分為磁碟(這裡是HDFS)上的HFile (SSTable)。還有就是儲存WALlog,主要實現類為HLog.

MemStore

MemStore原始碼:private final ConcurrentNavigableMap delegatee;  

本質上MemStore就是一個記憶體裡放著一個儲存KEY/VALUEMAP,當MemStore(預設64MB)寫滿之後,會開始刷磁碟操作。

HFile結構

Hbase儲存格式
 

 

2  HFile結構圖 

HFile是基於HADOOP TFile的,如圖2,檔案長度為變長,僅FILE INFO/Trailer定長,Trailer中有指標指向其他資料塊的起始點。Index資料塊記錄了每個Data塊和Meta塊的起始點。Data塊和Meta塊都是可有可無的,但對於大多數HFile,你都可以看到Data塊。

Data塊中,除了頭部的MAGIC之外,就是一對對KEY/VALUE對,結構如下:

Hbase儲存格式
 
 Data KEY/VALUE對結構

關於檔案塊的大小:

預設塊大小64KB,在建立表時可以透過HColumnDescriptor設定每個Family的塊大小。

大資料塊:適合順序查詢,不適合隨機查詢。

小資料塊,適合隨機查詢,需要更多記憶體儲存Data Index,建立檔案慢,更多的flush操作

 Hbase儲存格式

 

 HFile總體結構圖

keyvalue大小超過BLOCK SIZE時,那麼查詢這些value就無法透過索引去快速查詢,而是需要透過遍歷進行。

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

a)        暫用過多記憶體

b)        啟動載入時間緩慢

提出了HFile Version2設計:

https://issues.apache.org/jira/secure/attachment/12478329/hfile_format_v2_design_draft_0.1.pdf

HLog

HLogHBase的日誌類,在寫入時進行write-ahead-log(WAL),主要為資料恢復。每個HRegionServer會對應一個HLog例項,HRegion在初始化的時候HRegionServer會將該HLog的例項作為建構函式傳入其中。HLog的核心函式是其append()函式。

HLog File 是一個Sequence File,只能在檔案的末尾新增內容。除了檔案頭以外,HLog File 由一條條HLog.Entry構成。EntryHLog的基本組成部分,也是Read /Write的基本單位。

 

Entry由兩個部分組成:HLogKeyWALEdit

HLogKey主要包含以下幾個變數:

private byte           [] encodedRegionName;

private byte           [] tablename;

private long           logSeqNum;            // Time at which this edit was written.
private long           writeTime;

private byte           clusterId;

 

logSeqNumHLog 類的一個屬性,AtomicLong型別。每寫一個Entry就自動加1. 由於RSHLog是一一對應的,所以logSeqNum是在RegionServer範圍內的自增量。

WALEdit的主體是一個KeyValueList。在舊的版本中WALEdit只包含一個KeyValue,然而新的版本可以包含多個KeyValue,而且這些KeyValue可以擁有不同的RowKey

 

 Hbase儲存格式

 

5  HLog檔案結構圖

 


 

三、  HBase 預寫日誌 (WAL)

(見下一篇blog)

四、 HBase 索引

目前的HBase新版本沒有實現二級索引,以前hbase的版本有過二級索引,實現時也是寫寫資料再寫索引,索引放到後臺佇列中非同步地寫。實現最終一致。

HBase移走這塊程式碼的一個原因就是索引到底落後資料多少時間是不確定的,特別是在異常的情況下。這樣就導致在清理HLog時無法確定一個HLog是否真正全部寫入資料了。

關於HBase二級索引的一篇討論文章,參考:

 

問題:為什麼一個RegionServer 對應一個HLog,而不是一個region對應於一個log file

BigTable論文答:如果每一個”tablet”(對應於HBaseregion)都提交一個日誌檔案,會需要併發寫入大量的檔案到GFS(對應HDFS),這樣,根據每個GFS server所依賴的檔案系統,寫入不同的日誌檔案會造成大量的磁碟操作。

 

HBase依照這樣的原則。在日誌被回滾和安全刪除之前,將會有大量的檔案。如果改成一個region對應於一個檔案,將會不好擴充套件,會引發問題。


轉載請註明源:

 http://asyty.iteye.com/blog/1250301

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15711267/viewspace-1063571/,如需轉載,請註明出處,否則將追究法律責任。

相關文章