hbase 的核心模組是 region 伺服器。region 伺服器由多個 region 塊構成,region 塊中儲存一系列連續的資料集。region 伺服器主要構成部分是 hlog 和 region 塊。hlog 記錄該 region 的操作日誌。
region 物件由多個 store 組成,每個 store 對應當前分割槽中的乙個列族,每個 store 管理一塊記憶體,即 memstoreo 當 memstore 中的資料達到一定條件時會寫入 storefile 檔案中,因此每個 store 包含若干個 storefile 檔案。storefile 檔案對應 hdfs 中的 hfile 檔案。
hbase 群集資料的構成如圖所示。
當 region 伺服器收到寫請求的時候,region 伺服器會將請求轉至相應的 region。資料先被寫入 memstore,當到達一定的閾值時,memstore 中的資料會被重新整理到 hfile 中進行持久化儲存。
hbase 將最近接收到的資料快取在 memstore 中,在持久化到 hdfs 之前完成排序,再順序寫入 hdfs,為後續資料的檢索進行優化。因為 memstore 快取的是最近增加的資料,所以也提高了對近期資料的操作速度。
在持久化寫入之前,在記憶體中對行鍵或單元格進行優化。例如,當資料的 version 被設為 1 時,對某些列族中的一些資料,memstore 快取單元格的最新資料,在寫入 hfile 時,僅需要儲存乙個最新的版本。
store 是 region 伺服器的核心,儲存的是同乙個列族下的資料,每個 store 包含一塊 memstore 和 storefile( 0 個或多個)。storefile 是 hbase 中最小的資料儲存單元。
資料寫入 memstore 快取,當 memstore 快取滿時,記憶體中的資料會持久化到磁碟中乙個 storefile 檔案中,隨著 storefile 檔案數量的不斷增加,數量達到乙個閾值後,就會促使檔案合併成乙個大的 storefile 檔案。
由於 storefile 檔案的不斷合併,造成 storefile 檔案的大小超過一定的閾值,因此,會促使檔案進行**操作。同時,當前的乙個父 region 會被分成兩個子 region, 父 region 會下線,新**出的兩個子 region 會被 master 分配到相應的 regio n伺服器上。
store 的合併和**過程如下圖所示。
將 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 上讀取,然後將資料返回給客戶端。
HBase資料的讀寫流程
1 hbase資料寫入流程1 客戶端訪問zookeeeper,從meta表中得到寫入資料對應的region資訊和相應的region伺服器。2 客戶端訪問相應的region伺服器,把資料分別寫入hlog和memstore。memstore資料容量有限,當達到乙個閾值後,則把資料寫入磁碟檔案storef...
HBase讀寫資料流程
hbase的系統表 hbase namespace 儲存了hbase中的所有namespace的資訊 hbase meta 儲存了hbase中所有的region的資訊,包括rowkey範圍,region所在的regionserver的位址。hbase meta 在zookeeper中,進入zooke...
HBase讀寫資料流程
客戶端現在要插入一條資料,rowkey r000001,這條資料應該寫入到table表中的那個region中呢?1 客戶端要連線zookeeper,從zk的 hbase 節點找到 hbase meta 表所在的regionserver host port 2 regionserver 掃瞄 hbas...