当客户端应用程序使用Apache Accumulo通过Scanner对象查询Accumulo时,客户端最初在什么时候与Accumulo进行通信?
查询伪代码示例:
Authorizations authorizations = ...;
Connector connector = ...; // Use authorizations
Scanner scanner = connector.getScanner(..., "theTable", ...);
// Set one or more Ranges
scanner.setRange(new Range(...));
// Add one or more scan iterators
scanner.addScanIterator(...);
// scanner.fetchColumn(...); // Or fetchColumnFamily
// Get iterator
Iterator<Entry<Key, Value>> iterator = scanner.iterator();在上面的伪代码中,我的直觉是客户机代码首先接触到Accumulo,或者(1)当调用Scanner对象的iterator()方法时,或者(2)当在Iterator对象上第一次调用像next()或hasNext()这样的方法时。
在这个场景中,客户端和Accumulo之间的第一次通信发生在什么时候?
发布于 2017-05-17 03:24:57
在逐步完成代码之后,我相信我已经找到了答案。
实现org.apache.accumulo.client.Scanner的“默认”具体类似乎是org.apache.accumulo.core.client.impl.ScannerImpl.(顺便说一下,ScannerImpl的超类是org.apache.accumulo.core.client.impl.ScannerOptions.)
ScannerImpl的迭代器()方法构造并返回一个org.apache.accumulo.core.client.impl.ScannerIterator对象。
ScannerIterator构造函数的一个参数是readAheadThreshold,它是一个长整型变量。ScannerImpl将此参数设置为org.apache.accumulo.core.Constants.SCANNER_DEFAULT_READAHEAD_THRESHOLD (3)。
仅当readAheadThreshold参数为0时,ScannerIterator构造函数才会预读。由于ScannerImpl将参数设置为3,因此构造函数不会进行预读。因此,ScannerImpl的iterator()方法不与Accumulo通信。
ScannerIterator的next()和hasNext()方法只有在“必要”的时候才会调用Accumulo。对于新构造的ScannerIterator,“有必要”在第一次调用next()或hasNext()时与Accumulo通信。
我希望这对某些人有帮助!
https://stackoverflow.com/questions/44002399
复制相似问题