HBase數據的讀寫流程

HBase 的核心模塊是 Region 服務器。Region 服務器由多個 Region 塊構成,Region 塊中存儲一系列連續的數據集。Region 服務器主要構成部分是 HLog 和 Region 塊。HLog 記錄該 Region 的操作日誌。


Region 對象由多個 Store 組成,每個 Store 對應當前分區中的一個列族,每個 Store 管理一塊內存,即 MemStoreo 當 MemStore 中的數據達到一定條件時會寫入 StoreFile 文件中,因此每個 Store 包含若干個 StoreFile 文件。StoreFile 文件對應 HDFS 中的 HFile 文件。
HBase 群集數據的構成如圖所示。


HBase數據的讀寫流程

MemStore

當 Region 服務器收到寫請求的時候,Region 服務器會將請求轉至相應的 Region。數據先被寫入 MemStore,當到達一定的閾值時,MemStore 中的數據會被刷新到 HFile 中進行持久化存儲。
HBase 將最近接收到的數據緩存在 MemStore 中,在持久化到 HDFS 之前完成排序,再順序寫入 HDFS,為後續數據的檢索進行優化。因為 MemStore 緩存的是最近增加的數據,所以也提高了對近期數據的操作速度。
在持久化寫入之前,在內存中對行鍵或單元格進行優化。例如,當數據的 version 被設為 1 時,對某些列族中的一些數據,MemStore 緩存單元格的最新數據,在寫入 HFile 時,僅需要保存一個最新的版本。

Store

Store 是 Region 服務器的核心,存儲的是同一個列族下的數據,每個 Store 包含一塊 MemStore 和 StoreFile( 0 個或多個)。StoreFile 是 HBase 中最小的數據存儲單元。
數據寫入 MemStore 緩存,當 MemStore 緩存滿時,內存中的數據會持久化到磁盤中一個 StoreFile 文件中,隨著 StoreFile 文件數量的不斷增加,數量達到一個閾值後,就會促使文件合併成一個大的 StoreFile 文件。
由於 StoreFile 文件的不斷合併,造成 StoreFile 文件的大小超過一定的閾值,因此,會促使文件進行分裂操作。同時,當前的一個父 Region 會被分成兩個子 Region, 父 Region 會下線,新分裂出的兩個子 Region 會被 Master 分配到相應的 Regio n服務器上。


Store 的合併和分裂過程如下圖所示。


HBase數據的讀寫流程

HFile

將 MemStore 內存中的數據寫入 StoreFile 文件中,StoreFile 底層是以 HFile 格式保存的。
HFile 的存儲格式如下圖所示。


HBase數據的讀寫流程

HFile 文件是不定長的,長度固定的只有其中的兩塊:Trailer 和 File Info。Trailer 中有指針指向其他數據塊的起始點,File Info 記錄了文件的一些 Meta 信息。每個 Data 塊的大小可以在創建一個 Table 的時候通過參數指定(默認塊大小為 64KB)。每個 Data 塊除了開頭的 Magic 以外就是由一個鍵值對拼接而成的,Magic 內容是一些隨機數字,用於防止數據損壞。


HFile 裡面的每個鍵值對就是一個簡單的 Byte 數組。但是這個 Byte 數組裡麵包含了很多項, 並且有固定的結構,其具體結構如圖所示。


HBase數據的讀寫流程

鍵值對結構以兩個固定長度的數值開始,分別表示 Key 的長度和 Value 的長度。緊接著是 Key,Key 以 RowLength 開始,是固定長度的數值,表示 RowKey 的長度;接著是 Row,然後是固定長度的數值 ColumnFamilyLength,表示 Family 的長度;之後是 Family 列族,接著是 Qualifier 列標識符,Key 最後以兩個固定長度的數值 Time Stamp 和 Key Type(Put/Delete) 結束。Value部分沒有這麼複雜的結構,就是純粹的二進制數據。

HBase 數據寫入流程

1) 客戶端訪問 ZooKeeper,從 Meta 表得到寫入數據對應的 Region 信息和相應 的Region 服務器。
2) 客戶端訪問相應的 Region 服務器,把數據分別寫入 HLog 和 MemStore。MemStore 數據容量有限,當達到一個閾值後,則把數據寫入磁盤文件 StoreFile 中,在 HLog 文件中寫入一個標記,表示 MemStore 緩存中的數據已被寫入 StoreFile 中。如果 MemStore 中的數據丟失,則可以從 HLog 上恢復。
3) 當多個 StoreFile 文件達到閾值後,會觸發 Store.compact() 將多個 StoreFile 文件合併為一個 大文件。

HBase 數據讀取流程

1) 客戶端先訪問 ZooKeeper,從 Meta 表讀取 Region 信息對應的服務器。
2) 客戶端向對應 Region 服務器發送讀取數據的請求,Region 接收請求後,先從 MemStore 查找數據;如果沒有,再到 StoreFile 上讀取,然後將數據返回給客戶端。


分享到:


相關文章: