【问题标题】:Accumulo table scanner failing silently in JavaAccumulo 表扫描器在 Java 中静默失败
【发布时间】:2015-08-04 17:52:58
【问题描述】:

我正在尝试使用 Java API 扫描整个 Accumulo 表。我已经验证元信息是正确的(凭证、ZooKeeper 服务器、Accumlo 实例 ID、表名)。在这一点上,我处于死胡同,所以任何建议都值得赞赏。

累积版本

1.6.2

代码

借自accumulo read client

// scan the whole table
System.out.println("=== whole table ===");
Scanner tableScanner;
try {
  tableScanner = conn.createScanner("geomesa3_records", new Authorizations());
  // conn is of type Connector
  // Connector and Scanner are implemented in org.apache.accumulo.core.client
  // See links below for additional info
} catch (TableNotFoundException ex) {
  throw new RuntimeException("table not found - was SimpleIngestClient run?");
}
System.out.println("-------------------------------------");

for(Map.Entry<Key, Value> kv : tableScanner) { // seemingly freezes here
  System.out.println("----------------- new row ---------------");
  System.out.println(kv.getKey().getRow() + " "
      + kv.getKey().getColumnFamily() + " "
      + kv.getKey().getColumnQualifier() + ": "
      + new String(kv.getValue().get()));
}
tableScanner.close();
System.out.println("-------------------------------------");
System.out.println("=== end table ===");

预期结果

=== whole table ===
-------------------------------------
----------------- new row ---------------
// table data
----------------- new row ---------------
// table data
----------------- new row ---------------
// table data
-------------------------------------
=== end table ===

实际结果

=== whole table ===
-------------------------------------

相关的 Accumulo 链接

Scanner API

Connector API used for createScanner

Scanner interface

【问题讨论】:

  • 要么你的代码不能编译,要么你应该添加你的类Scanner的实现。
  • @Tom 这是个问题吗?如果是这样,是的,代码编译(并执行)并通过org.apache.accumulo.core.client.Scanner 导入Scanner
  • 不,这是一个声明。如果您的代码编译,那么您没有使用java.util.Scanner,因此应该将Scanner 代码添加到问题中。
  • @Tom 当然,我会把它添加到问题中。
  • 尝试将 log4j 的详细程度提高到 DEBUG 并观察来自 org.apache.accumulo.core.client 下的类的消息。您可以在 shell 中读取数据但不能在客户端中读取数据这一事实令人惊讶。您在这两种情况下都以同一用户身份登录吗?

标签: java accumulo


【解决方案1】:

我认为您可能需要在扫描仪上设置一个范围。要扫描整个表,只需像这样设置范围:

scanner.setRange(new Range());

此范围将匹配所有内容。具体来说,这个范围“从负无穷到正无穷”。基本上它匹配所有可能的键。

我使用类似的策略对我的一个表进行 fetch all 操作。

另外,请注意,这类事情肯定会导致问题。如果表变大,这可能需要很长时间才能运行。就我而言,我从没想过表格会超过几百个逻辑行,所以我认为它是安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多