天天看點

HBase基本存儲原理

HBase基本存儲原理:

HMaster

HMaster沒有單點問題,HBase中可以啟動多個HMaster,通過Zookeeper的Master Election機制保證總有一個Master運作,HMaster在功能上主要負責Table和Region的管理工作:

1.管理使用者對Table的增、删、改、查操作

2.管理HRegionServer的負載均衡,調整Region分布

3.在Region Split後,負責新Region的配置設定

4.在HRegionServer停機後,負責失效HRegionServer 上的Regions遷移

HRegionServer

HRegionServer主要負責響應使用者I/O請求,向HDFS檔案系統中讀寫資料,是HBase中最核心的子產品。

HBase基本存儲原理

HRegionServer内部管理了一系列HRegion對象,每個HRegion對應了Table中的一個Region,HRegion中由多個HStore組成。每個HStore對應了Table中的一個Column Family的存儲,可以看出每個Column Family其實就是一個集中的存儲單元,是以最好将具備共同IO特性的column放在一個Column Family中,這樣最高效。

HStore:

HStore存儲是HBase存儲的核心了,其中由兩部分組成,一部分是MemStore,一部分是StoreFiles。MemStore是Sorted Memory Buffer,使用者寫入的資料首先會放入MemStore,當MemStore滿了以後會Flush成一個StoreFile(底層實作是HFile),當StoreFile檔案數量增長到一定門檻值,會觸發Compact合并操作,将多個StoreFiles合并成一個StoreFile,合并過程中會進行版本合并和資料删除,是以可以看出HBase其實隻有增加資料,所有的更新和删除操作都是在後續的compact過程中進行的,這使得使用者的寫操作隻要進入記憶體中就可以立即傳回,保證了HBase I/O的高性能。當StoreFiles Compact後,會逐漸形成越來越大的StoreFile,當單個StoreFile大小超過一定門檻值後,會觸發Split操作,同時把目前Region Split成2個Region,父Region會下線,新Split出的2個孩子Region會被HMaster配置設定到相應的HRegionServer上,使得原先1個Region的壓力得以分流到2個Region上。

HBase基本存儲原理

HLog:

在了解了上述HStore的基本原理後,還必須了解一下HLog的功能,因為上述的HStore在系統正常工作的前提下是沒有問題的,但是在分布式系統環境中,無法避免系統出錯或者當機,是以一旦HRegionServer意外退出,MemStore中的記憶體資料将會丢失,這就需要引入HLog了。每個HRegionServer中都有一個HLog對象,HLog是一個實作Write Ahead Log的類,在每次使用者操作寫入MemStore的同時,也會寫一份資料到HLog檔案中(HLog檔案格式見後續),HLog檔案定期會滾動出新的,并删除舊的檔案(已持久化到StoreFile中的資料)。當HRegionServer意外終止後,HMaster會通過Zookeeper感覺到,HMaster首先會處理遺留的 HLog檔案,将其中不同Region的Log資料進行拆分,分别放到相應region的目錄下,然後再将失效的region重新配置設定,領取 到這些region的HRegionServer在Load Region的過程中,會發現有曆史HLog需要處理,是以會Replay HLog中的資料到MemStore中,然後flush到StoreFiles,完成資料恢複。

HBase存儲格式

HBase中的所有資料檔案都存儲在Hadoop HDFS檔案系統上,主要包括上述提出的兩種檔案類型:

1.HFile, HBase中KeyValue資料的存儲格式,HFile是Hadoop的二進制格式檔案,實際上StoreFile就是對HFile做了輕量級包裝,即StoreFile底層就是HFile

2. HLog File,HBase中WAL(Write Ahead Log) 的存儲格式,實體上是Hadoop的Sequence File

HFile

下圖是HFile的存儲格式:

HBase基本存儲原理
HBase基本存儲原理

首先HFile檔案是不定長的,長度固定的隻有其中的兩塊:Trailer和FileInfo。正如圖中所示的,Trailer中有指針指向其他資料塊的起始點。File Info中記錄了檔案的一些Meta資訊,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。Data Index和Meta Index塊記錄了每個Data塊和Meta塊的起始點。

Data Block是HBase I/O的基本單元,為了提高效率,HRegionServer中有基于LRU的Block Cache機制。每個Data塊的大小可以在建立一個Table的時候通過參數指定,大号的Block有利于順序Scan,小号Block利于随機查詢。每個Data塊除了開頭的Magic以外就是一個個KeyValue對拼接而成, Magic内容就是一些随機數字,目的是防止資料損壞。後面會詳細介紹每個KeyValue對的内部構造。

HFile裡面的每個KeyValue對就是一個簡單的byte數組。但是這個byte數組裡面包含了很多項,并且有固定的結構。我們來看看裡面的具體結構:

HBase基本存儲原理

開始是兩個固定長度的數值,分别表示Key的長度和Value的長度。緊接着是Key,開始是固定長度的數值,表示RowKey的長度,緊接着是RowKey,然後是固定長度的數值,表示Family的長度,然後是Family,接着是Qualifier,然後是兩個固定長度的數值,表示Time Stamp和Key Type(Put/Delete)。Value部分沒有這麼複雜的結構,就是純粹的二進制資料了。

HLogFile

HBase基本存儲原理

上圖中示意了HLog檔案的結構,其實HLog檔案就是一個普通的Hadoop Sequence File,Sequence File 的Key是HLogKey對象,HLogKey中記錄了寫入資料的歸屬資訊,除了table和region名字外,同時還包括 sequence number和timestamp,timestamp是“寫入時間”,sequence number的起始值為0,或者是最近一次存入檔案系統中sequence number。

HBase關鍵算法/流程

region定位

系統如何找到某個row key (或者某個 row key range)所在的region bigtable 使用三層類似B+樹的結構來儲存region位置。

第一層是儲存zookeeper裡面的檔案,它持有root region的位置。

第二層root region是.META.表的第一個region其中儲存了.META.z表其它region的位置。通過root region,我們就可以通路.META.表的資料。

.META.是第三層,它是一個特殊的表,儲存了hbase中所有資料表的region 位置資訊。

HBase基本存儲原理

說明:

1 、root region永遠不會被split,保證了最需要三次跳轉,就能定位到任意region 。

2、META.表每行儲存一個region的位置資訊,row key 采用表名+表的最後一樣編碼而成。

3、為了加快通路,.META.表的全部region都儲存在記憶體中。

假設,.META.表的一行在記憶體中大約占用1KB。并且每個region限制為128MB。

那麼上面的三層結構可以儲存的region數目為:

(128MB/1KB) * (128MB/1KB) = = 2(34)個region

4、client會将查詢過的位置資訊儲存緩存起來,緩存不會主動失效,是以如果client上的緩存全部失效,則需要進行6次網絡來回,才能定位到正确的region(其中三次用來發現緩存失效,另外三次用來擷取位置資訊)。

繼續閱讀