Hbase支持兩種讀讀操作,Scan & Get兩種,Get在hbase的內部也是會轉換成startRow == endRow的操作,所以本文就只介紹Get操作。
Scan的實際執行者是RegionScannerImpl ,下面是一張整體ScannerImpl的調用圖

關於Scan的參數:
Get和Scan其實是同一操作,get是startRow==endRow的Scan,不過在判斷stopRow的時候會考慮stop的閉區間。
RegionScannerImpl內部保存所有的StoreScanner也是放在一個KeyValueHeap中,但是由於每個Scanner處於一個family,所以統一rowkey的話,一個StoreScanner中的Cell會一直保持較大/較小的排序,所以在這里可以每次heap.top一個scanner,然后批量取result。
batch,這個表示每次取出的同一rowkey下的Cell數量限制,默認是-1,不限制,取出這個rowkey下的所有Cell(但是family中有個配置可以限制這個的最大值),按照Cell的排序從小到大,知道limit為止,一個family沒取夠,下一個family繼續。所以如果batch較小,可能會在client端一行數據返回兩個Result。
Filter的行過濾、reset在這里體現,若是被過濾掉了且未到stopRow,則繼續讀下一行
Get是一次性的調用一個next(result.limit),scan是調用多次返回多個result返回給client
Scan開始之間會根據定義從region.mvcc中去除readpoint
