@InterfaceAudience.Private public class KeyValueHeap extends NonReversedNonLazyKeyValueScanner implements KeyValueScanner, InternalScanner
Implements KeyValueScanner itself.
This class is used at the Region level to merge across Stores and at the Store level to merge across the memstore and StoreFiles.
In the Region case, we also need InternalScanner.next(List), so this class also implements InternalScanner. WARNING: As is, if you try to use this as an InternalScanner at the Store level, you will get runtime exceptions.
| 限定符和类型 | 类和说明 |
|---|---|
protected static class |
KeyValueHeap.KVScannerComparator |
| 限定符和类型 | 字段和说明 |
|---|---|
protected KeyValueHeap.KVScannerComparator |
comparator |
protected KeyValueScanner |
current
The current sub-scanner, i.e. the one that contains the next key/value
to return to the client.
|
protected PriorityQueue<KeyValueScanner> |
heap |
NO_NEXT_INDEXED_KEY| 构造器和说明 |
|---|
KeyValueHeap(List<? extends KeyValueScanner> scanners,
KeyValue.KVComparator comparator)
Constructor.
|
| 限定符和类型 | 方法和说明 |
|---|---|
void |
close()
Close the KeyValue scanner.
|
PriorityQueue<KeyValueScanner> |
getHeap() |
Cell |
getNextIndexedKey() |
long |
getScannerOrder()
Get the order of this KeyValueScanner.
|
Cell |
next()
Return the next Cell in this scanner, iterating the scanner
|
boolean |
next(List<Cell> result)
Gets the next row of keys from the top-most scanner.
|
boolean |
next(List<Cell> result,
ScannerContext scannerContext)
Grab the next row's worth of values.
|
Cell |
peek()
Look at the next Cell in this scanner, but do not iterate scanner.
|
protected KeyValueScanner |
pollRealKV()
Fetches the top sub-scanner from the priority queue, ensuring that a real
seek has been done on it.
|
boolean |
requestSeek(Cell key,
boolean forward,
boolean useBloom)
Similar to
KeyValueScanner.seek(org.apache.hadoop.hbase.Cell) (or KeyValueScanner.reseek(org.apache.hadoop.hbase.Cell) if forward is true) but only
does a seek operation after checking that it is really necessary for the
row/column combination specified by the kv parameter. |
boolean |
reseek(Cell seekKey)
This function is identical to the
seek(Cell) function except
that scanner.seek(seekKey) is changed to scanner.reseek(seekKey). |
boolean |
seek(Cell seekKey)
Seeks all scanners at or below the specified seek key.
|
backwardSeek, seekToLastRow, seekToPreviousRowdoRealSeek, enforceSeek, isFileScanner, realSeekDone, shouldUseScannerclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitbackwardSeek, enforceSeek, isFileScanner, realSeekDone, seekToLastRow, seekToPreviousRow, shouldUseScannerprotected PriorityQueue<KeyValueScanner> heap
protected KeyValueScanner current
heap
(but we frequently add it back to the heap and pull the new winner out).
We maintain an invariant that the current sub-scanner has already done
a real seek, and that current.peek() is always a real key/value (or null)
except for the fake last-key-on-row-column supplied by the multi-column
Bloom filter optimization, which is OK to propagate to StoreScanner. In
order to ensure that, always use pollRealKV() to update current.protected KeyValueHeap.KVScannerComparator comparator
public KeyValueHeap(List<? extends KeyValueScanner> scanners, KeyValue.KVComparator comparator) throws IOException
scanners - comparator - IOExceptionpublic Cell peek()
KeyValueScannerpeek 在接口中 KeyValueScannerpublic Cell next() throws IOException
KeyValueScannernext 在接口中 KeyValueScannerIOExceptionpublic boolean next(List<Cell> result) throws IOException
This method takes care of updating the heap.
This can ONLY be called when you are using Scanners that implement InternalScanner as well as
KeyValueScanner (a StoreScanner).
next 在接口中 InternalScannerresult - IOException - epublic boolean next(List<Cell> result, ScannerContext scannerContext) throws IOException
InternalScannernext 在接口中 InternalScannerresult - return output arrayIOException - epublic void close()
KeyValueScannerclose 在接口中 Closeableclose 在接口中 AutoCloseableclose 在接口中 InternalScannerclose 在接口中 KeyValueScannerpublic boolean seek(Cell seekKey) throws IOException
As individual scanners may run past their ends, those scanners are automatically closed and removed from the heap.
This function (and reseek(Cell)) does not do multi-column
Bloom filter and lazy-seek optimizations. To enable those, call
requestSeek(Cell, boolean, boolean).
seek 在接口中 KeyValueScannerseekKey - KeyValue to seek at or afterIOExceptionpublic boolean reseek(Cell seekKey) throws IOException
seek(Cell) function except
that scanner.seek(seekKey) is changed to scanner.reseek(seekKey).reseek 在接口中 KeyValueScannerseekKey - seek value (should be non-null)IOExceptionpublic boolean requestSeek(Cell key, boolean forward, boolean useBloom) throws IOException
KeyValueScanner.seek(org.apache.hadoop.hbase.Cell) (or KeyValueScanner.reseek(org.apache.hadoop.hbase.Cell) if forward is true) but only
does a seek operation after checking that it is really necessary for the
row/column combination specified by the kv parameter. This function was
added to avoid unnecessary disk seeks by checking row-column Bloom filters
before a seek on multi-column get/scan queries, and to optimize by looking
up more recent files first.requestSeek 在接口中 KeyValueScannerrequestSeek 在类中 NonLazyKeyValueScannerforward - do a forward-only "reseek" instead of a random-access seekuseBloom - whether to enable multi-column Bloom filter optimizationIOExceptionprotected KeyValueScanner pollRealKV() throws IOException
IOExceptionpublic PriorityQueue<KeyValueScanner> getHeap()
public long getScannerOrder()
KeyValueScannergetScannerOrder 在接口中 KeyValueScannerKeyValueScanner.getScannerOrder()public Cell getNextIndexedKey()
getNextIndexedKey 在接口中 KeyValueScannergetNextIndexedKey 在类中 NonLazyKeyValueScannerCopyright © 2007–2021 The Apache Software Foundation. All rights reserved.