当客户端应用程序使用Apache Accumulo API通过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之间的第一次通信何时发生?
最佳答案
逐步执行代码后,我相信已经找到了答案。
实现org.apache.accumulo.client.Scanner的“默认”具体类似乎是org.apache.accumulo.core.client.impl.ScannerImpl。 (顺便说一句,ScannerImpl的超类是org.apache.accumulo.core.client.impl.ScannerOptions。)
ScannerImpl的iterator()方法构造并返回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通信将是“必需的”。
我希望这可以帮助别人!
关于java - Accumulo API:扫描程序最初何时与Accumulo通信?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44002399/