【问题标题】:Accumulo API: When Does a Scanner Initially Communicate With Accumulo?Accumulo API:扫描仪何时开始与 Accumulo 通信?
【发布时间】:2017-05-16 13:08:32
【问题描述】:

当客户端应用程序使用 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 之间的第一次通信是什么时候发生的?

【问题讨论】:

    标签: java accumulo


    【解决方案1】:

    在单步执行代码之后,我相信我已经找到了答案。

    实现 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,一个long。 ScannerImpl 将此参数设置为 org.apache.accumulo.core.Constants.SCANNER_DEFAULT_READAHEAD_THRESHOLD (3)。

    ScannerIterator 构造函数仅在 readAheadThreshold 参数为 0 时进行预读。由于 ScannerImpl 将参数设置为 3,因此构造函数不会预读。因此,ScannerImpl 的 iterator() 方法不与 Accumulo 通信。

    ScannerIterator 的 next() 和 hasNext() 方法仅在“必要”时才使用 Accumulo。对于新构建的 ScannerIterator,在第一次调用 next() 或 hasNext() 时与 Accumulo 通信是“必要的”。

    我希望这对某人有帮助!

    【讨论】:

    • 创建 Accumulo 连接器会对 Accumulo 执行 RPC 以验证您提供的凭据。在您的示例中,在您创建 Scanner 时已经有一个 RPC。
    猜你喜欢
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多