HBase中得資料結構和組織架構

2021-09-17 08:06:52 字數 1945 閱讀 7419

讓我們回顧一下 hbase 資料的組織架構,首先 table 橫向切割為多個 hregion ,按照乙個列族的情況,每乙個 hregion 之中包含乙個 memstore 和多個 hfile 檔案, hfile 檔案設計比較複雜,這裡不詳細展開,使用者需要知道給定乙個 rowkey 可以根據索引結合二分查詢可以迅速定位到對應的資料塊即可。結合這些背景資訊,我們可以把乙個read請求的處理轉化下面的問題:如何從乙個 memstore,多個 hfile 中獲取到使用者需要的正確的資料(預設情況下是最新版本,非刪除,沒有過期的資料。同時使用者可能會設定 filter ,指定返回條數等過濾條件)

在 regionserver 內部,會把讀取可能涉及到的所有元件都初始化為對應的 scanner 物件,針對 region 的讀取,封裝為乙個 regionscanner 物件,而乙個列族對應乙個 store,對應封裝為 storescanner,在 store 內部,memstore 則封裝為 memstorescanner,每乙個 hfile 都會封裝為 storefilescanner 。最後資料的查詢就會落在對 memstorescanner 和 storefilescanner 上的查詢之上。

這些 scanner 首先根據 scan 的 timerange 和 rowkey range 會過濾掉一些,剩下的 scanner 在 regionserver 內部組成乙個最小堆 keyvalueheap,該資料結構核心乙個 priorityqueue 優先順序佇列,佇列裡按照 scanner 指向的 keyvalue 排序。

// 用來組織所有的scanner

protectedpriorityqueueheap =null;

// priorityqueue當前排在最前面的scanner

protectedkeyvaluescanner current =null;

我們知道資料在記憶體以及 hdfs 檔案中儲存著,為了讀取這些資料,regionserver 構造了若干 scanner 並組成了乙個最小堆,那麼如何遍歷這個堆去過濾資料返回使用者想要的值呢。

我們假設 hregion 有4個 hfile,1個 memstore,那麼最小堆內有4個 scanner 物件,我們以 scannera-d 來代替這些 scanner 物件,同時假設我們需要查詢的 rowkey 為 rowa。每乙個 scanner 內部有乙個 current 指標,指向的是當前需要遍歷的 keyvalue,所以這時堆頂部的 scanner 物件的 current 指標指向的就是 rowa(rowa:cf:cola)這條資料。通過觸發 next() 呼叫,移動 current 指標,來遍歷所有 scanner 中的資料。scanner 組織邏輯檢視如下圖所示。

第一次 next 請求,將會返回 scannera中的rowa:cf:cola,而後 scannera 的指標移動到下乙個 keyvalue rowa:cf:colb,堆中的 scanners 排序不變;

第二次 next 請求,返回 scannera 中的 rowa:cf:colb,scannera 的 current 指標移動到下乙個 keyvalue rowb:cf:cola,因為堆按照 keyvalue 排序可知 rowb 小於 rowa, 所以堆內部,scanner 順序發生改變,改變之後如下圖所示:

scanner 內部資料完全檢索之後會 close 掉,或者 rowa 所有資料檢索完畢,則查詢下一條。預設情況下返回的資料需要經過 scanquerymatcher 過濾返回的資料需要滿足下面的條件:

如果 scan 的引數更加複雜,條件也會發生變化,比如指定 scan 返回 raw 資料的時候,打了刪除標記的資料也要被返回,這部分就不再詳細展開,至此讀流程基本解析完成,當然本文介紹的還是很粗略,有興趣的同學可以自己研究這一部分原始碼。

HBase資料結構

與nosql資料庫們一樣,rowkey是用來檢索記錄的主鍵。訪問hbase table中的行,只有三種方式 1.通過單個rowkey訪問 get 2.通過rowkey的range 正則 like 3.全表掃瞄 scan rowkey行鍵 rowkey 可以是任意字串 最大長度是64kb,實際應用中長...

HBase資料結構

先觀察表中資料 hbase中儲存資料時hbase行鍵是網域名稱倒置的命名方式,時間戳則為當前時間,有不用的時間戳,在冒號之前就是列簇的名字,但是並不是每行資料的時間戳是相同的。這裡體現出hbase在儲存資料的時候可以做到不儲存某個屬性的資料 在關係型資料中建立表之後,即使該屬性沒有資料也需要顯示為n...

HBase學習 三 HBase的資料結構

hbase 資料庫中也有乙個表示唯一的鍵,這個唯一的鍵是 rowkey。rowkey 組成 hbase 中 rowkey 由任意字串組成,組成長度不超過 64kb 在實際應用中長度一般為10 100bytes,一般用到70 100bytes就能滿足需求,在hbase內部,rowkey儲存為位元組陣列...