HBase 的核心模組是 Region 伺服器。Region 伺服器由多個 Region 塊構成,Region 塊中儲存一系列連續的資料集。Region 伺服器主要構成部分是 HLog 和 Region 塊。HLog 記錄該 Region 的操作日誌。
Region 物件由多個 Store 組成,每個 Store 對應當前分割槽中的一個列族,每個 Store 管理一塊記憶體,即 MemStoreo 當 MemStore 中的資料達到一定條件時會寫入 StoreFile 檔案中,因此每個 Store 包含若干個 StoreFile 檔案。StoreFile 檔案對應 HDFS 中的 HFile 檔案。
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 的合併和分裂過程如下圖所示。
HFile
將 MemStore 記憶體中的資料寫入 StoreFile 檔案中,StoreFile 底層是以 HFile 格式儲存的。
HFile 的儲存格式如下圖所示。
HFile 檔案是不定長的,長度固定的只有其中的兩塊:Trailer 和 File Info。Trailer 中有指標指向其他資料塊的起始點,File Info 記錄了檔案的一些 Meta 資訊。每個 Data 塊的大小可以在建立一個 Table 的時候通過引數指定(預設塊大小為 64KB)。每個 Data 塊除了開頭的 Magic 以外就是由一個鍵值對拼接而成的,Magic 內容是一些隨機數字,用於防止資料損壞。
HFile 裡面的每個鍵值對就是一個簡單的 Byte 陣列。但是這個 Byte 陣列裡麵包含了很多項, 並且有固定的結構,其具體結構如圖所示。
鍵值對結構以兩個固定長度的數值開始,分別表示 Key 的長度和 Value 的長度。緊接著是 Key,Key 以 RowLength 開始,是固定長度的數值,表示 RowKey 的長度;接著是 Row,然後是固定長度的數值 ColumnFamilyLength,表示 Family 的長度;之後是 Family 列族,接著是 Qualifier 列識別符號,Key 最後以兩個固定長度的數值 Time Stamp 和 Key Type(Put/Delete) 結束。Value部分沒有這麼複雜的結構,就是純粹的二進位制資料。
HBase 資料寫入流程
-
客戶端訪問 ZooKeeper,從 Meta 表得到寫入資料對應的 Region 資訊和相應 的Region 伺服器。
-
客戶端訪問相應的 Region 伺服器,把資料分別寫入 HLog 和 MemStore。MemStore 資料容量有限,當達到一個閾值後,則把資料寫入磁碟檔案 StoreFile 中,在 HLog 檔案中寫入一個標記,表示 MemStore 快取中的資料已被寫入 StoreFile 中。如果 MemStore 中的資料丟失,則可以從 HLog 上恢復。
-
當多個 StoreFile 檔案達到閾值後,會觸發 Store.compact() 將多個 StoreFile 檔案合併為一個 大檔案。
HBase 資料讀取流程
-
客戶端先訪問 ZooKeeper,從 Meta 表讀取 Region 資訊對應的伺服器。
-
客戶端向對應 Region 伺服器傳送讀取資料的請求,Region 接收請求後,先從 MemStore 查詢資料;如果沒有,再到 StoreFile 上讀取,然後將資料返回給客戶端。
版權宣告:本文為原創文章,轉載請附上原文出處連結及本宣告。下載相關視訊學習資料到尚矽谷官方網站。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27721058/viewspace-2852235/,如需轉載,請註明出處,否則將追究法律責任。