天天看點

HBase scan過程簡析

1.核心元件及流程

HBase scan過程簡析
  • scan過程總體上是分層處理的,與存儲上的組織方式一緻,脈絡比較清晰;
  • 具體來說,就是region→store→hfile/memstore,分别都有對應的scanner實作進行資料讀取;
  • scan請求本身設定的條件,以及server和table層面的一些參數限制,會根據需要分布在不同層次的scanner中進行處理;

2.RegionScanner

序列圖:

https://www.processon.com/view/link/5d5cef1de4b0145255c20846
  • RegionScanner的實作類在HRegion内部定義,為RegionScannerImpl;
  • 該類内部主要通過一個優先級隊列(heap)和一個scanner類型的指針(current)進行驅動,不斷的從StoreScanner中擷取資料;

下面分步說明一下資料驅動的過程:

(圖1)

HBase scan過程簡析

(圖2)

HBase scan過程簡析

(圖3)

HBase scan過程簡析

(圖4)

HBase scan過程簡析

假設startrow和stoprow分别為r1和r3。

  • 1:建立指定的各個列族對應的storeScanner,如果未指定則是全部列族;
  • 2:storeScanner建立過程中,會根據startrow參數,seek到對應cell;
  • 3:将這些storeScanner放入一個heap中,heap為優先級隊列,比較器的compare方法中比較的是KeyValueScanner所peek到的cell大小,如圖1;
  • 4:全部放入到heap使其有序,poll方法得到最小的storeScanner,即storeScannerB,将其指派給current,如圖2;
  • 5:調用current的next方法,該方法會擷取一行的全部cell,擷取完後内部已seek到下一行,如圖3;
  • 6:再将current放回到heap中,此時會形成新的順序,如圖4;
  • 7:重複4到6步,直到新的行大于或等于r3;

3.StoreScanner

https://www.processon.com/view/link/5d5f4496e4b04e664f2ee80c
  • StoreScanner的資料驅動方式與RegionScanner類似,也是使用heap和current去進行控制;
  • 除了資料擷取之外,該類比較重要的1個部分是資料的檢查,相關邏輯封裝在ScanQueryMatcher中;
  • ScanQueryMatcher中主要包含2個元件:DeleteTracker和ColumnTracker,前者負責處理delete邏輯,後者負責檢查目前cell的column、version及value等是否符合要求;
  • 另外,在getScanners的過程中會根據keyRange、timeRange、bloomBlock等對storeFile進行過濾,以減少資料的讀取;

matcher傳回的code及含義說明如下:

#丢棄目前cell,繼續處理下個cell
SKIP
 
#丢棄目前cell,并推進到下個column
SEEK_NEXT_COL
 
#丢棄目前cell,并推進到下個row
SEEK_NEXT_ROW
 
#保留目前cell,繼續處理下個cell
INCLUDE
 
#保留目前cell,并推進到下個column
INCLUDE_AND_SEEK_NEXT_COL
 
 #保留目前cell,并推進到下個row
INCLUDE_AND_SEEK_NEXT_ROW
 
#目前row已完成
DONE
 
#整個scan已完成
DONE_SCAN
 
 #丢棄目前cell,并推進到下個指定的cell,由少數filter用到
SEEK_NEXT_USING_HINT           

4.storeFileScanner

https://www.processon.com/view/link/5d638e4fe4b0145255c7c5e4
  • storeFileScanner是真正涉及到hfile資料讀取的地方,會根據rowKey,基于記憶體中indexBlock的資料定位到具體的dataBlock位置,以block為機關進行讀取;
  • 讀取後的block資料在記憶體中以ByteBuffer的形式存在,而blockSeek方法會将這個ByteBuffer的position推動到合适位置的過程;
  • 接下來,會讀取一個cell的資料作為傳回,使上層的storeScanner能夠據此對各個storeFileScanner進行排序;
  • 值得一提的是,實際實作中,還存在lazySeek的優化,大緻原理是根據hfile中存儲的最小time,傳回一個假的cell,如果該cell都不能排在前面,那就不需要關心真實的cell是什麼了,等到該cell能夠排在最前面的時候,再進行realSeek,這個機制對于各個hfile按時間存在明顯分界并且主要讀取近期資料的場景,可以有效減少實際的資料讀取量;